From dce145b7b1b684e0df7adbb03c00464010e8cf26 Mon Sep 17 00:00:00 2001 From: Julia Bardi <90178898+juliaElastic@users.noreply.github.com> Date: Thu, 24 Feb 2022 13:46:33 +0100 Subject: [PATCH 001/102] hide policy created message on clicking create policy link (#126321) --- .../agent_enrollment_flyout/agent_policy_select_create.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/agent_policy_select_create.tsx b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/agent_policy_select_create.tsx index a8354237bbcb7..655875d044893 100644 --- a/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/agent_policy_select_create.tsx +++ b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/agent_policy_select_create.tsx @@ -70,6 +70,11 @@ export const SelectCreateAgentPolicy: React.FC = ({ [onAgentPolicyChange] ); + const onClickCreatePolicy = () => { + setCreateState({ status: CREATE_STATUS.INITIAL }); + setShowCreatePolicy(true); + }; + return ( <> {showCreatePolicy ? ( @@ -86,7 +91,7 @@ export const SelectCreateAgentPolicy: React.FC = ({ onKeyChange={onKeyChange} onAgentPolicyChange={onAgentPolicyChange} excludeFleetServer={excludeFleetServer} - onClickCreatePolicy={() => setShowCreatePolicy(true)} + onClickCreatePolicy={onClickCreatePolicy} selectedAgentPolicy={selectedAgentPolicy} isFleetServerPolicy={isFleetServerPolicy} /> From b2475b95b817426eaf87e468217247df4f201666 Mon Sep 17 00:00:00 2001 From: James Rodewig Date: Thu, 24 Feb 2022 08:14:01 -0500 Subject: [PATCH 002/102] Update doc links for Ingest Pipelines UI (#125456) https://github.com/elastic/kibana/pull/101216 adds a new ECS mapper feature to the Ingest Pipelines UI. This makes some related changes: * Updates the doc link anchor text for the **Create pipeline from CSV** page to "CSV to pipeline docs". * Updates the doc link for the **Create pipeline from CSV** page to link to a related tutorial. * Updates the doc link for the **Create pipeline** page to link to the ingest pipeline docs. Previously, this linked to the create pipeline API docs, which aren't particularly relevant. --- packages/kbn-doc-links/src/get_doc_links.ts | 1 + .../ingest_pipelines_create_from_csv.test.tsx | 2 +- .../sections/pipelines_create/pipelines_create.tsx | 2 +- .../sections/pipelines_create_from_csv/main.tsx | 6 +++--- .../sections/pipelines_edit/pipelines_edit.tsx | 2 +- .../public/application/services/documentation.ts | 14 ++++++++++---- 6 files changed, 17 insertions(+), 10 deletions(-) diff --git a/packages/kbn-doc-links/src/get_doc_links.ts b/packages/kbn-doc-links/src/get_doc_links.ts index 5f4c07ee6067c..d73760b280d49 100644 --- a/packages/kbn-doc-links/src/get_doc_links.ts +++ b/packages/kbn-doc-links/src/get_doc_links.ts @@ -544,6 +544,7 @@ export const getDocLinks = ({ kibanaBranch }: GetDocLinkOptions): DocLinks => { lowercase: `${ELASTICSEARCH_DOCS}lowercase-processor.html`, pipeline: `${ELASTICSEARCH_DOCS}pipeline-processor.html`, pipelines: `${ELASTICSEARCH_DOCS}ingest.html`, + csvPipelines: `${ELASTIC_WEBSITE_URL}guide/en/ecs/${DOC_LINK_VERSION}/ecs-converting.html`, pipelineFailure: `${ELASTICSEARCH_DOCS}ingest.html#handling-pipeline-failures`, processors: `${ELASTICSEARCH_DOCS}processors.html`, remove: `${ELASTICSEARCH_DOCS}remove-processor.html`, diff --git a/x-pack/plugins/ingest_pipelines/__jest__/client_integration/ingest_pipelines_create_from_csv.test.tsx b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/ingest_pipelines_create_from_csv.test.tsx index 5f1230f004684..d6a5b4e01a9b7 100644 --- a/x-pack/plugins/ingest_pipelines/__jest__/client_integration/ingest_pipelines_create_from_csv.test.tsx +++ b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/ingest_pipelines_create_from_csv.test.tsx @@ -66,7 +66,7 @@ describe('', () => { expect(find('pageTitle').text()).toEqual('Create pipeline from CSV'); expect(exists('documentationLink')).toBe(true); - expect(find('documentationLink').text()).toBe('Create pipeline docs'); + expect(find('documentationLink').text()).toBe('CSV to pipeline docs'); }); describe('form validation', () => { diff --git a/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_create/pipelines_create.tsx b/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_create/pipelines_create.tsx index 097ec3d98e162..a7fbf6afaebf8 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_create/pipelines_create.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_create/pipelines_create.tsx @@ -85,7 +85,7 @@ export const PipelinesCreate: React.FunctionComponent , ]} diff --git a/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_edit/pipelines_edit.tsx b/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_edit/pipelines_edit.tsx index a902f4a34af29..c927a324b0774 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_edit/pipelines_edit.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_edit/pipelines_edit.tsx @@ -134,7 +134,7 @@ export const PipelinesEdit: React.FunctionComponent Date: Thu, 24 Feb 2022 06:26:26 -0700 Subject: [PATCH 003/102] [Reporting] Fix reference to job output metrics for logging (#126305) --- x-pack/plugins/reporting/server/lib/tasks/execute_report.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/reporting/server/lib/tasks/execute_report.ts b/x-pack/plugins/reporting/server/lib/tasks/execute_report.ts index aeeb79a85ce98..019f128e5f07d 100644 --- a/x-pack/plugins/reporting/server/lib/tasks/execute_report.ts +++ b/x-pack/plugins/reporting/server/lib/tasks/execute_report.ts @@ -369,7 +369,7 @@ export class ExecuteReportTask implements ReportingTask { report._primary_term = stream.getPrimaryTerm()!; eventLog.logExecutionComplete({ - ...(report.metrics ?? {}), + ...(output.metrics ?? {}), byteSize: stream.bytesWritten, }); From d89249852ba9925d06816af92a3e91475eb59d83 Mon Sep 17 00:00:00 2001 From: Matthew Kime Date: Thu, 24 Feb 2022 07:31:37 -0600 Subject: [PATCH 004/102] [data view management] Make data views sharable (#123991) Make data views sharable --- .../kbn_client/kbn_client_saved_objects.ts | 4 +- src/plugins/data_view_management/kibana.json | 1 + .../__snapshots__/utils.test.ts.snap | 2 + .../edit_index_pattern/edit_index_pattern.tsx | 30 ++++- .../index_pattern_table.tsx | 125 +++++++++++------- .../index_pattern_table/spaces_list.tsx | 65 +++++++++ .../public/components/types.ts | 3 +- .../public/components/utils.ts | 10 +- .../mount_management_section.tsx | 3 +- .../data_view_management/public/plugin.ts | 2 + .../data_view_management/public/types.ts | 2 + .../data_view_management/tsconfig.json | 1 + .../__snapshots__/data_views.test.ts.snap | 1 + .../data_views/common/data_views/data_view.ts | 2 + .../common/data_views/data_views.ts | 4 + src/plugins/data_views/common/types.ts | 1 + src/plugins/data_views/public/index.ts | 8 +- .../public/saved_objects_client_wrapper.ts | 2 +- .../server/saved_objects/data_views.ts | 2 +- .../server/saved_objects_client_wrapper.ts | 2 +- ...ver_index_pattern_management.test.tsx.snap | 1 + .../public/services/column_service.test.ts | 4 +- .../public/services/column_service.ts | 4 +- .../apis/saved_objects_management/find.ts | 2 +- .../saved_objects_management/relationships.ts | 4 +- .../_index_pattern_create_delete.js | 2 +- .../pages/link_to/redirect_to_node_logs.tsx | 2 +- .../metric_threshold/lib/evaluate_rule.ts | 2 +- .../feature_controls/index.ts | 4 +- .../feature_controls/security.ts} | 8 +- .../feature_controls/spaces.ts} | 4 +- .../{index_patterns => data_views}/index.ts | 3 +- .../apps/data_views/spaces/index.ts | 55 ++++++++ x-pack/test/functional/config.js | 2 +- 34 files changed, 280 insertions(+), 87 deletions(-) create mode 100644 src/plugins/data_view_management/public/components/index_pattern_table/spaces_list.tsx rename x-pack/test/functional/apps/{index_patterns => data_views}/feature_controls/index.ts (78%) rename x-pack/test/functional/apps/{index_patterns/feature_controls/index_patterns_security.ts => data_views/feature_controls/security.ts} (96%) rename x-pack/test/functional/apps/{index_patterns/feature_controls/index_patterns_spaces.ts => data_views/feature_controls/spaces.ts} (96%) rename x-pack/test/functional/apps/{index_patterns => data_views}/index.ts (82%) create mode 100644 x-pack/test/functional/apps/data_views/spaces/index.ts diff --git a/packages/kbn-test/src/kbn_client/kbn_client_saved_objects.ts b/packages/kbn-test/src/kbn_client/kbn_client_saved_objects.ts index f70123029e6c4..717f214211d95 100644 --- a/packages/kbn-test/src/kbn_client/kbn_client_saved_objects.ts +++ b/packages/kbn-test/src/kbn_client/kbn_client_saved_objects.ts @@ -228,8 +228,8 @@ export class KbnClientSavedObjects { await this.requester.request({ method: 'DELETE', path: options.space - ? uriencode`/s/${options.space}/api/saved_objects/${obj.type}/${obj.id}` - : uriencode`/api/saved_objects/${obj.type}/${obj.id}`, + ? uriencode`/s/${options.space}/api/saved_objects/${obj.type}/${obj.id}?force=true` + : uriencode`/api/saved_objects/${obj.type}/${obj.id}?force=true`, }); deleted++; } catch (error) { diff --git a/src/plugins/data_view_management/kibana.json b/src/plugins/data_view_management/kibana.json index 29f305d0ad17a..a8a0f694bd179 100644 --- a/src/plugins/data_view_management/kibana.json +++ b/src/plugins/data_view_management/kibana.json @@ -5,6 +5,7 @@ "ui": true, "requiredPlugins": ["management", "data", "urlForwarding", "dataViewFieldEditor", "dataViewEditor", "dataViews", "fieldFormats"], "requiredBundles": ["kibanaReact", "kibanaUtils"], + "optionalPlugins": ["spaces"], "owner": { "name": "App Services", "githubTeam": "kibana-app-services" diff --git a/src/plugins/data_view_management/public/components/__snapshots__/utils.test.ts.snap b/src/plugins/data_view_management/public/components/__snapshots__/utils.test.ts.snap index 3a25a78472b50..dece379001643 100644 --- a/src/plugins/data_view_management/public/components/__snapshots__/utils.test.ts.snap +++ b/src/plugins/data_view_management/public/components/__snapshots__/utils.test.ts.snap @@ -5,6 +5,7 @@ Array [ Object { "default": true, "id": "test", + "namespaces": undefined, "sort": "0test name", "tags": Array [ Object { @@ -17,6 +18,7 @@ Array [ Object { "default": false, "id": "test1", + "namespaces": undefined, "sort": "1test name 1", "tags": Array [], "title": "test name 1", diff --git a/src/plugins/data_view_management/public/components/edit_index_pattern/edit_index_pattern.tsx b/src/plugins/data_view_management/public/components/edit_index_pattern/edit_index_pattern.tsx index 5d5ef260a088c..86193f50b2fe2 100644 --- a/src/plugins/data_view_management/public/components/edit_index_pattern/edit_index_pattern.tsx +++ b/src/plugins/data_view_management/public/components/edit_index_pattern/edit_index_pattern.tsx @@ -17,11 +17,12 @@ import { EuiText, EuiLink, EuiCallOut, + EuiCode, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; import { DataView, DataViewField } from '../../../../../plugins/data_views/public'; -import { useKibana } from '../../../../../plugins/kibana_react/public'; +import { useKibana, toMountPoint } from '../../../../../plugins/kibana_react/public'; import { IndexPatternManagmentContext } from '../../types'; import { Tabs } from './tabs'; import { IndexHeader } from './index_header'; @@ -50,7 +51,7 @@ const confirmModalOptionsDelete = { defaultMessage: 'Delete', }), title: i18n.translate('indexPatternManagement.editDataView.deleteHeader', { - defaultMessage: 'Delete data view?', + defaultMessage: 'Delete data view', }), }; @@ -110,11 +111,26 @@ export const EditIndexPattern = withRouter( } } - overlays.openConfirm('', confirmModalOptionsDelete).then((isConfirmed) => { - if (isConfirmed) { - doRemove(); - } - }); + const warning = + indexPattern.namespaces.length > 1 ? ( + {indexPattern.title}, + }} + /> + ) : ( + '' + ); + + overlays + .openConfirm(toMountPoint(
{warning}
), confirmModalOptionsDelete) + .then((isConfirmed) => { + if (isConfirmed) { + doRemove(); + } + }); }; const timeFilterHeader = i18n.translate( diff --git a/src/plugins/data_view_management/public/components/index_pattern_table/index_pattern_table.tsx b/src/plugins/data_view_management/public/components/index_pattern_table/index_pattern_table.tsx index 965fcdb6d8818..583a8255c02ab 100644 --- a/src/plugins/data_view_management/public/components/index_pattern_table/index_pattern_table.tsx +++ b/src/plugins/data_view_management/public/components/index_pattern_table/index_pattern_table.tsx @@ -18,13 +18,15 @@ import { } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import { RouteComponentProps, withRouter, useLocation } from 'react-router-dom'; -import React, { useEffect, useState } from 'react'; +import React, { useEffect, useState, useCallback, useMemo } from 'react'; import { i18n } from '@kbn/i18n'; import { reactRouterNavigate, useKibana } from '../../../../../plugins/kibana_react/public'; import { IndexPatternManagmentContext } from '../../types'; import { IndexPatternTableItem } from '../types'; import { getIndexPatterns } from '../utils'; import { getListBreadcrumbs } from '../breadcrumbs'; +import { SpacesList } from './spaces_list'; +import type { SpacesContextProps } from '../../../../../../x-pack/plugins/spaces/public'; const pagination = { initialPageSize: 10, @@ -38,15 +40,6 @@ const sorting = { }, }; -const search = { - box: { - incremental: true, - schema: { - fields: { title: { type: 'string' } }, - }, - }, -}; - const title = i18n.translate('indexPatternManagement.dataViewTable.title', { defaultMessage: 'Data Views', }); @@ -69,6 +62,8 @@ interface Props extends RouteComponentProps { showCreateDialog?: boolean; } +const getEmptyFunctionComponent: React.FC = ({ children }) => <>{children}; + export const IndexPatternTable = ({ history, canSave, @@ -81,20 +76,45 @@ export const IndexPatternTable = ({ chrome, dataViews, IndexPatternEditor, + spaces, } = useKibana().services; + const [query, setQuery] = useState(''); const [indexPatterns, setIndexPatterns] = useState([]); const [isLoadingIndexPatterns, setIsLoadingIndexPatterns] = useState(true); const [showCreateDialog, setShowCreateDialog] = useState(showCreateDialogProp); + const handleOnChange = ({ queryText, error }: { queryText: string; error: unknown }) => { + if (!error) { + setQuery(queryText); + } + }; + + const search = { + query, + onChange: handleOnChange, + box: { + incremental: true, + schema: { + fields: { title: { type: 'string' } }, + }, + }, + }; + + const loadDataViews = useCallback(async () => { + setIsLoadingIndexPatterns(true); + const gettedIndexPatterns: IndexPatternTableItem[] = await getIndexPatterns( + uiSettings.get('defaultIndex'), + dataViews + ); + setIndexPatterns(gettedIndexPatterns); + setIsLoadingIndexPatterns(false); + return gettedIndexPatterns; + }, [dataViews, uiSettings]); + setBreadcrumbs(getListBreadcrumbs()); useEffect(() => { (async function () { - const gettedIndexPatterns: IndexPatternTableItem[] = await getIndexPatterns( - uiSettings.get('defaultIndex'), - dataViews - ); - setIndexPatterns(gettedIndexPatterns); - setIsLoadingIndexPatterns(false); + const gettedIndexPatterns = await loadDataViews(); if ( gettedIndexPatterns.length === 0 || !(await dataViews.hasUserDataView().catch(() => false)) @@ -102,52 +122,64 @@ export const IndexPatternTable = ({ setShowCreateDialog(true); } })(); - }, [indexPatternManagementStart, uiSettings, dataViews]); + }, [indexPatternManagementStart, uiSettings, dataViews, loadDataViews]); chrome.docTitle.change(title); const isRollup = new URLSearchParams(useLocation().search).get('type') === 'rollup'; + const ContextWrapper = useMemo( + () => (spaces ? spaces.ui.components.getSpacesContextProvider : getEmptyFunctionComponent), + [spaces] + ); + const columns = [ { field: 'title', name: i18n.translate('indexPatternManagement.dataViewTable.nameColumn', { defaultMessage: 'Name', }), - render: ( - name: string, - index: { - id: string; - tags?: Array<{ - key: string; - name: string; - }>; - } - ) => ( + render: (name: string, dataView: IndexPatternTableItem) => ( <> - + {name} - {index.id && index.id.indexOf(securitySolution) === 0 && ( + {dataView?.id?.indexOf(securitySolution) === 0 && ( {securityDataView} )} - {index.tags && - index.tags.map(({ key: tagKey, name: tagName }) => ( - - {tagName} - - ))} + {dataView?.tags?.map(({ key: tagKey, name: tagName }) => ( + + {tagName} + + ))} ), dataType: 'string' as const, sortable: ({ sort }: { sort: string }) => sort, }, + { + field: 'namespaces', + name: 'spaces', + render: (name: string, dataView: IndexPatternTableItem) => { + return spaces ? ( + + ) : ( + <> + ); + }, + }, ]; const createButton = canSave ? ( @@ -197,17 +229,18 @@ export const IndexPatternTable = ({ /> - - + + + {displayIndexPatternEditor} ); diff --git a/src/plugins/data_view_management/public/components/index_pattern_table/spaces_list.tsx b/src/plugins/data_view_management/public/components/index_pattern_table/spaces_list.tsx new file mode 100644 index 0000000000000..c17e174ef1dda --- /dev/null +++ b/src/plugins/data_view_management/public/components/index_pattern_table/spaces_list.tsx @@ -0,0 +1,65 @@ +/* + * 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 React, { FC, useState } from 'react'; + +import { EuiButtonEmpty } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import type { + SpacesPluginStart, + ShareToSpaceFlyoutProps, +} from '../../../../../../x-pack/plugins/spaces/public'; +import { DATA_VIEW_SAVED_OBJECT_TYPE } from '../../../../data_views/public'; + +interface Props { + spacesApi: SpacesPluginStart; + spaceIds: string[]; + id: string; + title: string; + refresh(): void; +} + +const noun = i18n.translate('indexPatternManagement.indexPatternTable.savedObjectName', { + defaultMessage: 'data view', +}); + +export const SpacesList: FC = ({ spacesApi, spaceIds, id, title, refresh }) => { + const [showFlyout, setShowFlyout] = useState(false); + + function onClose() { + setShowFlyout(false); + refresh(); + } + + const LazySpaceList = spacesApi.ui.components.getSpaceList; + const LazyShareToSpaceFlyout = spacesApi.ui.components.getShareToSpaceFlyout; + + const shareToSpaceFlyoutProps: ShareToSpaceFlyoutProps = { + savedObjectTarget: { + type: DATA_VIEW_SAVED_OBJECT_TYPE, + namespaces: spaceIds, + id, + title, + noun, + }, + onClose, + }; + + return ( + <> + setShowFlyout(true)} + style={{ height: 'auto' }} + data-test-subj="manageSpacesButton" + > + + + {showFlyout && } + + ); +}; diff --git a/src/plugins/data_view_management/public/components/types.ts b/src/plugins/data_view_management/public/components/types.ts index 3ead700732b91..07ff0c7c16052 100644 --- a/src/plugins/data_view_management/public/components/types.ts +++ b/src/plugins/data_view_management/public/components/types.ts @@ -16,6 +16,7 @@ export interface IndexPatternTableItem { id: string; title: string; default: boolean; - tag?: string[]; + tags?: Array<{ key: string; name: string }>; sort: string; + namespaces?: string[]; } diff --git a/src/plugins/data_view_management/public/components/utils.ts b/src/plugins/data_view_management/public/components/utils.ts index 3024c172ac441..1fccc8c694e31 100644 --- a/src/plugins/data_view_management/public/components/utils.ts +++ b/src/plugins/data_view_management/public/components/utils.ts @@ -32,18 +32,16 @@ const isRollup = (indexPatternType: string = '') => { return indexPatternType === 'rollup'; }; -export async function getIndexPatterns( - defaultIndex: string, - indexPatternsService: DataViewsContract -) { - const existingIndexPatterns = await indexPatternsService.getIdsWithTitle(true); +export async function getIndexPatterns(defaultIndex: string, dataViewsService: DataViewsContract) { + const existingIndexPatterns = await dataViewsService.getIdsWithTitle(true); const indexPatternsListItems = existingIndexPatterns.map((idxPattern) => { - const { id, title } = idxPattern; + const { id, title, namespaces } = idxPattern; const isDefault = defaultIndex === id; const tags = getTags(idxPattern, isDefault); return { id, + namespaces, title, default: isDefault, tags, diff --git a/src/plugins/data_view_management/public/management_app/mount_management_section.tsx b/src/plugins/data_view_management/public/management_app/mount_management_section.tsx index e4978acbc9d17..1b5ae606bb19b 100644 --- a/src/plugins/data_view_management/public/management_app/mount_management_section.tsx +++ b/src/plugins/data_view_management/public/management_app/mount_management_section.tsx @@ -40,7 +40,7 @@ export async function mountManagementSection( ) { const [ { chrome, uiSettings, notifications, overlays, http, docLinks, theme }, - { data, dataViewFieldEditor, dataViewEditor, dataViews, fieldFormats }, + { data, dataViewFieldEditor, dataViewEditor, dataViews, fieldFormats, spaces }, indexPatternManagementStart, ] = await getStartServices(); const canSave = dataViews.getCanSaveSync(); @@ -64,6 +64,7 @@ export async function mountManagementSection( fieldFormatEditors: dataViewFieldEditor.fieldFormatEditors, IndexPatternEditor: dataViewEditor.IndexPatternEditorComponent, fieldFormats, + spaces, }; ReactDOM.render( diff --git a/src/plugins/data_view_management/public/plugin.ts b/src/plugins/data_view_management/public/plugin.ts index a0c25479ce3e2..84686dd666f9a 100644 --- a/src/plugins/data_view_management/public/plugin.ts +++ b/src/plugins/data_view_management/public/plugin.ts @@ -16,6 +16,7 @@ import { ManagementSetup } from '../../management/public'; import { IndexPatternFieldEditorStart } from '../../data_view_field_editor/public'; import { DataViewEditorStart } from '../../data_view_editor/public'; import { DataViewsPublicPluginStart } from '../../data_views/public'; +import { SpacesPluginStart } from '../../../../x-pack/plugins/spaces/public'; export interface IndexPatternManagementSetupDependencies { management: ManagementSetup; @@ -28,6 +29,7 @@ export interface IndexPatternManagementStartDependencies { dataViewEditor: DataViewEditorStart; dataViews: DataViewsPublicPluginStart; fieldFormats: FieldFormatsStart; + spaces?: SpacesPluginStart; } // eslint-disable-next-line @typescript-eslint/no-empty-interface diff --git a/src/plugins/data_view_management/public/types.ts b/src/plugins/data_view_management/public/types.ts index f0a79416892ef..257d07cd478db 100644 --- a/src/plugins/data_view_management/public/types.ts +++ b/src/plugins/data_view_management/public/types.ts @@ -22,6 +22,7 @@ import { IndexPatternFieldEditorStart } from '../../data_view_field_editor/publi import { DataViewEditorStart } from '../../data_view_editor/public'; import { DataViewsPublicPluginStart } from '../../data_views/public'; import { FieldFormatsStart } from '../../field_formats/public'; +import { SpacesPluginStart } from '../../../../x-pack/plugins/spaces/public'; export interface IndexPatternManagmentContext { chrome: ChromeStart; @@ -38,6 +39,7 @@ export interface IndexPatternManagmentContext { fieldFormatEditors: IndexPatternFieldEditorStart['fieldFormatEditors']; IndexPatternEditor: DataViewEditorStart['IndexPatternEditorComponent']; fieldFormats: FieldFormatsStart; + spaces?: SpacesPluginStart; } export type IndexPatternManagmentContextValue = diff --git a/src/plugins/data_view_management/tsconfig.json b/src/plugins/data_view_management/tsconfig.json index bde927aaf732b..9710111bcfde2 100644 --- a/src/plugins/data_view_management/tsconfig.json +++ b/src/plugins/data_view_management/tsconfig.json @@ -20,5 +20,6 @@ { "path": "../es_ui_shared/tsconfig.json" }, { "path": "../data_view_field_editor/tsconfig.json" }, { "path": "../data_view_editor/tsconfig.json" }, + { "path": "../../../x-pack/plugins/spaces/tsconfig.json" } ] } diff --git a/src/plugins/data_views/common/data_views/__snapshots__/data_views.test.ts.snap b/src/plugins/data_views/common/data_views/__snapshots__/data_views.test.ts.snap index 50bc27b15922a..09784f9de6a37 100644 --- a/src/plugins/data_views/common/data_views/__snapshots__/data_views.test.ts.snap +++ b/src/plugins/data_views/common/data_views/__snapshots__/data_views.test.ts.snap @@ -40,6 +40,7 @@ Object { }, "fields": Object {}, "id": "id", + "namespaces": undefined, "runtimeFieldMap": Object { "aRuntimeField": Object { "script": Object { diff --git a/src/plugins/data_views/common/data_views/data_view.ts b/src/plugins/data_views/common/data_views/data_view.ts index 5f3ee24109027..4349fc11bced5 100644 --- a/src/plugins/data_views/common/data_views/data_view.ts +++ b/src/plugins/data_views/common/data_views/data_view.ts @@ -76,6 +76,7 @@ export class DataView implements IIndexPattern { */ public version: string | undefined; public sourceFilters?: SourceFilter[]; + public namespaces: string[]; private originalSavedObjectBody: SavedObjectBody = {}; private shortDotsEnable: boolean = false; private fieldFormats: FieldFormatsStartCommon; @@ -113,6 +114,7 @@ export class DataView implements IIndexPattern { this.fieldAttrs = spec.fieldAttrs || {}; this.allowNoIndex = spec.allowNoIndex || false; this.runtimeFieldMap = spec.runtimeFieldMap || {}; + this.namespaces = spec.namespaces || []; } /** diff --git a/src/plugins/data_views/common/data_views/data_views.ts b/src/plugins/data_views/common/data_views/data_views.ts index e93673bfa3ec5..2e31ed793c3db 100644 --- a/src/plugins/data_views/common/data_views/data_views.ts +++ b/src/plugins/data_views/common/data_views/data_views.ts @@ -48,6 +48,7 @@ export type IndexPatternListSavedObjectAttrs = Pick< export interface DataViewListItem { id: string; + namespaces?: string[]; title: string; type?: string; typeMeta?: TypeMeta; @@ -176,6 +177,7 @@ export class DataViewsService { } return this.savedObjectsCache.map((obj) => ({ id: obj?.id, + namespaces: obj?.namespaces, title: obj?.attributes?.title, type: obj?.attributes?.type, typeMeta: obj?.attributes?.typeMeta && JSON.parse(obj?.attributes?.typeMeta), @@ -374,6 +376,7 @@ export class DataViewsService { const { id, version, + namespaces, attributes: { title, timeFieldName, @@ -400,6 +403,7 @@ export class DataViewsService { return { id, version, + namespaces, title, timeFieldName, sourceFilters: parsedSourceFilters, diff --git a/src/plugins/data_views/common/types.ts b/src/plugins/data_views/common/types.ts index cd0fad414813e..8a1f7265296ff 100644 --- a/src/plugins/data_views/common/types.ts +++ b/src/plugins/data_views/common/types.ts @@ -283,6 +283,7 @@ export interface DataViewSpec { runtimeFieldMap?: Record; fieldAttrs?: FieldAttrs; allowNoIndex?: boolean; + namespaces?: string[]; } export interface SourceFilter { diff --git a/src/plugins/data_views/public/index.ts b/src/plugins/data_views/public/index.ts index fb926fe5f6316..2a9f1201cc854 100644 --- a/src/plugins/data_views/public/index.ts +++ b/src/plugins/data_views/public/index.ts @@ -17,7 +17,13 @@ export { onRedirectNoIndexPattern } from './data_views'; export type { IIndexPatternFieldList, TypeMeta, RuntimeType } from '../common'; export type { DataViewSpec } from '../common'; -export { IndexPatternField, DataViewField, DataViewType, META_FIELDS } from '../common'; +export { + IndexPatternField, + DataViewField, + DataViewType, + META_FIELDS, + DATA_VIEW_SAVED_OBJECT_TYPE, +} from '../common'; export type { IndexPatternsContract } from './data_views'; export type { DataViewListItem } from './data_views'; diff --git a/src/plugins/data_views/public/saved_objects_client_wrapper.ts b/src/plugins/data_views/public/saved_objects_client_wrapper.ts index beaae6ac3fc21..a5bc83546e3bb 100644 --- a/src/plugins/data_views/public/saved_objects_client_wrapper.ts +++ b/src/plugins/data_views/public/saved_objects_client_wrapper.ts @@ -54,6 +54,6 @@ export class SavedObjectsClientPublicToCommon implements SavedObjectsClientCommo return simpleSavedObjectToSavedObject(response); } delete(type: string, id: string) { - return this.savedObjectClient.delete(type, id); + return this.savedObjectClient.delete(type, id, { force: true }); } } diff --git a/src/plugins/data_views/server/saved_objects/data_views.ts b/src/plugins/data_views/server/saved_objects/data_views.ts index ca7592732c3ee..972b8f5d6752a 100644 --- a/src/plugins/data_views/server/saved_objects/data_views.ts +++ b/src/plugins/data_views/server/saved_objects/data_views.ts @@ -13,7 +13,7 @@ import { DATA_VIEW_SAVED_OBJECT_TYPE } from '../../common'; export const dataViewSavedObjectType: SavedObjectsType = { name: DATA_VIEW_SAVED_OBJECT_TYPE, hidden: false, - namespaceType: 'multiple-isolated', + namespaceType: 'multiple', convertToMultiNamespaceTypeVersion: '8.0.0', management: { displayName: 'Data view', diff --git a/src/plugins/data_views/server/saved_objects_client_wrapper.ts b/src/plugins/data_views/server/saved_objects_client_wrapper.ts index dc7163c405d4f..e00eb9e3375a8 100644 --- a/src/plugins/data_views/server/saved_objects_client_wrapper.ts +++ b/src/plugins/data_views/server/saved_objects_client_wrapper.ts @@ -42,6 +42,6 @@ export class SavedObjectsClientServerToCommon implements SavedObjectsClientCommo return await this.savedObjectClient.create(type, attributes, options); } delete(type: string, id: string) { - return this.savedObjectClient.delete(type, id); + return this.savedObjectClient.delete(type, id, { force: true }); } } diff --git a/src/plugins/discover/public/application/main/components/sidebar/__snapshots__/discover_index_pattern_management.test.tsx.snap b/src/plugins/discover/public/application/main/components/sidebar/__snapshots__/discover_index_pattern_management.test.tsx.snap index 059c247c38c2e..a08b8f4022745 100644 --- a/src/plugins/discover/public/application/main/components/sidebar/__snapshots__/discover_index_pattern_management.test.tsx.snap +++ b/src/plugins/discover/public/application/main/components/sidebar/__snapshots__/discover_index_pattern_management.test.tsx.snap @@ -654,6 +654,7 @@ exports[`Discover DataView Management renders correctly 1`] = ` "_type", "_source", ], + "namespaces": Array [], "originalSavedObjectBody": Object {}, "resetOriginalSavedObjectBody": [Function], "runtimeFieldMap": Object {}, diff --git a/src/plugins/saved_objects_management/public/services/column_service.test.ts b/src/plugins/saved_objects_management/public/services/column_service.test.ts index 581a55fa0066d..5676cfaa81285 100644 --- a/src/plugins/saved_objects_management/public/services/column_service.test.ts +++ b/src/plugins/saved_objects_management/public/services/column_service.test.ts @@ -7,7 +7,7 @@ */ import { spacesPluginMock } from '../../../../../x-pack/plugins/spaces/public/mocks'; -// import { ShareToSpaceSavedObjectsManagementColumn } from './columns'; +import { ShareToSpaceSavedObjectsManagementColumn } from './columns'; import { SavedObjectsManagementColumnService, SavedObjectsManagementColumnServiceSetup, @@ -45,7 +45,7 @@ describe('SavedObjectsManagementColumnRegistry', () => { const start = service.start(spacesPluginMock.createStartContract()); expect(start.getAll()).toEqual([ column, - // expect.any(ShareToSpaceSavedObjectsManagementColumn), + expect.any(ShareToSpaceSavedObjectsManagementColumn), ]); }); 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 74c06a3d33218..8189fc7d07f83 100644 --- a/src/plugins/saved_objects_management/public/services/column_service.ts +++ b/src/plugins/saved_objects_management/public/services/column_service.ts @@ -7,7 +7,7 @@ */ import type { SpacesApi } from '../../../../../x-pack/plugins/spaces/public'; -// import { ShareToSpaceSavedObjectsManagementColumn } from './columns'; +import { ShareToSpaceSavedObjectsManagementColumn } from './columns'; import { SavedObjectsManagementColumn } from './types'; export interface SavedObjectsManagementColumnServiceSetup { @@ -53,5 +53,5 @@ function registerSpacesApiColumns( spacesApi: SpacesApi ) { // Note: this column is hidden for now because no saved objects are shareable. It should be uncommented when at least one saved object type is multi-namespace. - // service.setup().register(new ShareToSpaceSavedObjectsManagementColumn(spacesApi.ui)); + service.setup().register(new ShareToSpaceSavedObjectsManagementColumn(spacesApi.ui)); } diff --git a/test/api_integration/apis/saved_objects_management/find.ts b/test/api_integration/apis/saved_objects_management/find.ts index d877a62eedc82..1f73fcc34d97d 100644 --- a/test/api_integration/apis/saved_objects_management/find.ts +++ b/test/api_integration/apis/saved_objects_management/find.ts @@ -249,7 +249,7 @@ export default function ({ getService }: FtrProviderContext) { path: '/app/management/kibana/dataViews/dataView/8963ca30-3224-11e8-a572-ffca06da1357', uiCapabilitiesPath: 'management.kibana.indexPatterns', }, - namespaceType: 'multiple-isolated', + namespaceType: 'multiple', }); })); }); diff --git a/test/api_integration/apis/saved_objects_management/relationships.ts b/test/api_integration/apis/saved_objects_management/relationships.ts index cc14ce0c76068..d609938a0d50f 100644 --- a/test/api_integration/apis/saved_objects_management/relationships.ts +++ b/test/api_integration/apis/saved_objects_management/relationships.ts @@ -91,7 +91,7 @@ export default function ({ getService }: FtrProviderContext) { path: '/app/management/kibana/dataViews/dataView/8963ca30-3224-11e8-a572-ffca06da1357', uiCapabilitiesPath: 'management.kibana.indexPatterns', }, - namespaceType: 'multiple-isolated', + namespaceType: 'multiple', hiddenType: false, }, }, @@ -132,7 +132,7 @@ export default function ({ getService }: FtrProviderContext) { path: '/app/management/kibana/dataViews/dataView/8963ca30-3224-11e8-a572-ffca06da1357', uiCapabilitiesPath: 'management.kibana.indexPatterns', }, - namespaceType: 'multiple-isolated', + namespaceType: 'multiple', hiddenType: false, }, relationship: 'child', diff --git a/test/functional/apps/management/_index_pattern_create_delete.js b/test/functional/apps/management/_index_pattern_create_delete.js index a07141a073d64..4c9f5a5210ac6 100644 --- a/test/functional/apps/management/_index_pattern_create_delete.js +++ b/test/functional/apps/management/_index_pattern_create_delete.js @@ -118,7 +118,7 @@ export default function ({ getService, getPageObjects }) { describe('index pattern deletion', function indexDelete() { before(function () { - const expectedAlertText = 'Delete data view?'; + const expectedAlertText = 'Delete data view'; return PageObjects.settings.removeIndexPattern().then(function (alertText) { expect(alertText).to.be(expectedAlertText); }); diff --git a/x-pack/plugins/infra/public/pages/link_to/redirect_to_node_logs.tsx b/x-pack/plugins/infra/public/pages/link_to/redirect_to_node_logs.tsx index 66abef53f021e..8aaac2f1b9a46 100644 --- a/x-pack/plugins/infra/public/pages/link_to/redirect_to_node_logs.tsx +++ b/x-pack/plugins/infra/public/pages/link_to/redirect_to_node_logs.tsx @@ -6,10 +6,10 @@ */ import { i18n } from '@kbn/i18n'; -import { flowRight } from 'lodash'; import React from 'react'; import { Redirect, RouteComponentProps } from 'react-router-dom'; import useMount from 'react-use/lib/useMount'; +import { flowRight } from 'lodash'; import { findInventoryFields } from '../../../common/inventory_models'; import { InventoryItemType } from '../../../common/inventory_models/types'; import { LoadingPage } from '../../components/loading_page'; diff --git a/x-pack/plugins/infra/server/lib/alerting/metric_threshold/lib/evaluate_rule.ts b/x-pack/plugins/infra/server/lib/alerting/metric_threshold/lib/evaluate_rule.ts index 744fd80134aec..81c714b30cb0d 100644 --- a/x-pack/plugins/infra/server/lib/alerting/metric_threshold/lib/evaluate_rule.ts +++ b/x-pack/plugins/infra/server/lib/alerting/metric_threshold/lib/evaluate_rule.ts @@ -6,8 +6,8 @@ */ import { ElasticsearchClient } from 'kibana/server'; -import { difference, first, has, isNaN, isNumber, isObject, last, mapValues } from 'lodash'; import moment from 'moment'; +import { difference, first, has, isNaN, isNumber, isObject, last, mapValues } from 'lodash'; import { Aggregators, Comparator, diff --git a/x-pack/test/functional/apps/index_patterns/feature_controls/index.ts b/x-pack/test/functional/apps/data_views/feature_controls/index.ts similarity index 78% rename from x-pack/test/functional/apps/index_patterns/feature_controls/index.ts rename to x-pack/test/functional/apps/data_views/feature_controls/index.ts index 8eca3e20cd0d1..17a8da9af0d6b 100644 --- a/x-pack/test/functional/apps/index_patterns/feature_controls/index.ts +++ b/x-pack/test/functional/apps/data_views/feature_controls/index.ts @@ -10,7 +10,7 @@ import { FtrProviderContext } from '../../../ftr_provider_context'; export default function ({ loadTestFile }: FtrProviderContext) { describe('feature controls', function () { this.tags('skipFirefox'); - loadTestFile(require.resolve('./index_patterns_security')); - loadTestFile(require.resolve('./index_patterns_spaces')); + loadTestFile(require.resolve('./security')); + loadTestFile(require.resolve('./spaces')); }); } diff --git a/x-pack/test/functional/apps/index_patterns/feature_controls/index_patterns_security.ts b/x-pack/test/functional/apps/data_views/feature_controls/security.ts similarity index 96% rename from x-pack/test/functional/apps/index_patterns/feature_controls/index_patterns_security.ts rename to x-pack/test/functional/apps/data_views/feature_controls/security.ts index 20dd08fab1496..96682302b5713 100644 --- a/x-pack/test/functional/apps/index_patterns/feature_controls/index_patterns_security.ts +++ b/x-pack/test/functional/apps/data_views/feature_controls/security.ts @@ -27,7 +27,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await esArchiver.unload('x-pack/test/functional/es_archives/empty_kibana'); }); - describe('global index_patterns all privileges', () => { + describe('global data views all privileges', () => { before(async () => { await security.role.create('global_index_patterns_all_role', { elasticsearch: { @@ -87,7 +87,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { }); }); - describe('global index_patterns read-only privileges', () => { + describe('global data views read-only privileges', () => { before(async () => { await security.role.create('global_index_patterns_read_role', { elasticsearch: { @@ -142,7 +142,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { }); }); - describe('no index_patterns privileges', () => { + describe('no data views privileges', () => { before(async () => { await security.role.create('no_index_patterns_privileges_role', { elasticsearch: { @@ -183,7 +183,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { expect(navLinks).to.eql(['Discover']); }); - it(`doesn't show Index Patterns in management side-nav`, async () => { + it(`doesn't show Data Views in management side-nav`, async () => { await PageObjects.common.navigateToActualUrl('management', '', { ensureCurrentUrl: false, shouldLoginIfPrompted: false, diff --git a/x-pack/test/functional/apps/index_patterns/feature_controls/index_patterns_spaces.ts b/x-pack/test/functional/apps/data_views/feature_controls/spaces.ts similarity index 96% rename from x-pack/test/functional/apps/index_patterns/feature_controls/index_patterns_spaces.ts rename to x-pack/test/functional/apps/data_views/feature_controls/spaces.ts index 10a25da4ef0fa..9b6105b21eecf 100644 --- a/x-pack/test/functional/apps/index_patterns/feature_controls/index_patterns_spaces.ts +++ b/x-pack/test/functional/apps/data_views/feature_controls/spaces.ts @@ -47,14 +47,14 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { expect(navLinks).to.contain('Stack Management'); }); - it(`index pattern listing shows create button`, async () => { + it(`data views listing shows create button`, async () => { await PageObjects.settings.navigateTo(); await PageObjects.settings.clickKibanaIndexPatterns(); await testSubjects.existOrFail('createIndexPatternButton'); }); }); - describe('space with Index Patterns disabled', () => { + describe('space with Data Views disabled', () => { before(async () => { // we need to load the following in every situation as deleting // a space deletes all of the associated saved objects diff --git a/x-pack/test/functional/apps/index_patterns/index.ts b/x-pack/test/functional/apps/data_views/index.ts similarity index 82% rename from x-pack/test/functional/apps/index_patterns/index.ts rename to x-pack/test/functional/apps/data_views/index.ts index bf9acf29cc2c1..3b3f7b3608113 100644 --- a/x-pack/test/functional/apps/index_patterns/index.ts +++ b/x-pack/test/functional/apps/data_views/index.ts @@ -8,8 +8,9 @@ import { FtrProviderContext } from '../../ftr_provider_context'; export default function advancedSettingsApp({ loadTestFile }: FtrProviderContext) { - describe('Index Patterns', function indexPatternsTestSuite() { + describe('Data Views', function indexPatternsTestSuite() { this.tags('ciGroup2'); loadTestFile(require.resolve('./feature_controls')); + loadTestFile(require.resolve('./spaces')); }); } diff --git a/x-pack/test/functional/apps/data_views/spaces/index.ts b/x-pack/test/functional/apps/data_views/spaces/index.ts new file mode 100644 index 0000000000000..0d5bccd156b0e --- /dev/null +++ b/x-pack/test/functional/apps/data_views/spaces/index.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 { FtrProviderContext } from '../../../ftr_provider_context'; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const PageObjects = getPageObjects([ + 'common', + 'spaceSelector', + 'home', + 'header', + 'security', + 'settings', + ]); + const spacesService = getService('spaces'); + const esArchiver = getService('esArchiver'); + const testSubjects = getService('testSubjects'); + + describe('spaces', function () { + this.tags('skipFirefox'); + + before(async () => { + await esArchiver.load('x-pack/test/functional/es_archives/empty_kibana'); + await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/logstash_functional'); + }); + + it('it can add a space', async () => { + await spacesService.create({ + id: 'custom_space', + name: 'custom_space', + disabledFeatures: [], + }); + + await PageObjects.settings.navigateTo(); + await PageObjects.settings.clickKibanaIndexPatterns(); + await PageObjects.settings.createIndexPattern('log*'); + + await PageObjects.settings.clickKibanaIndexPatterns(); + + // click manage spaces on first entry + await (await testSubjects.findAll('manageSpacesButton', 10000))[0].click(); + + // select custom space + await testSubjects.click('sts-space-selector-row-custom_space'); + await testSubjects.click('sts-save-button'); + + // verify custom space has been added to list + await testSubjects.existOrFail('space-avatar-custom_space'); + }); + }); +} diff --git a/x-pack/test/functional/config.js b/x-pack/test/functional/config.js index 9e70c8d4ed7fd..2d26bc6391d9d 100644 --- a/x-pack/test/functional/config.js +++ b/x-pack/test/functional/config.js @@ -53,7 +53,7 @@ export default async function ({ readConfigFile }) { resolve(__dirname, './apps/dev_tools'), resolve(__dirname, './apps/apm'), resolve(__dirname, './apps/api_keys'), - resolve(__dirname, './apps/index_patterns'), + resolve(__dirname, './apps/data_views'), resolve(__dirname, './apps/index_management'), resolve(__dirname, './apps/index_lifecycle_management'), resolve(__dirname, './apps/ingest_pipelines'), From e53267adc1671db2e975026e12cb9cec0426b947 Mon Sep 17 00:00:00 2001 From: Nick Peihl Date: Thu, 24 Feb 2022 06:05:03 -0800 Subject: [PATCH 005/102] [Maps] Safety check for field meta categories (#126206) * Safety check for field meta categories * Fix styling regression * Review feedback --- .../maps/public/classes/styles/vector/style_meta.ts | 4 +++- .../public/classes/styles/vector/vector_style.tsx | 12 ++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/x-pack/plugins/maps/public/classes/styles/vector/style_meta.ts b/x-pack/plugins/maps/public/classes/styles/vector/style_meta.ts index 5177cdb814833..a9edef4cd15d8 100644 --- a/x-pack/plugins/maps/public/classes/styles/vector/style_meta.ts +++ b/x-pack/plugins/maps/public/classes/styles/vector/style_meta.ts @@ -20,7 +20,9 @@ export class StyleMeta { } getCategoryFieldMetaDescriptor(fieldName: string): Category[] { - return this._descriptor.fieldMeta[fieldName].categories; + return this._descriptor.fieldMeta[fieldName] + ? this._descriptor.fieldMeta[fieldName].categories + : []; } isPointsOnly(): boolean { diff --git a/x-pack/plugins/maps/public/classes/styles/vector/vector_style.tsx b/x-pack/plugins/maps/public/classes/styles/vector/vector_style.tsx index f031b3cd22105..0e87651e234bc 100644 --- a/x-pack/plugins/maps/public/classes/styles/vector/vector_style.tsx +++ b/x-pack/plugins/maps/public/classes/styles/vector/vector_style.tsx @@ -521,9 +521,11 @@ export class VectorStyle implements IVectorStyle { if (!styleMeta.fieldMeta[name]) { styleMeta.fieldMeta[name] = { categories: [] }; } - styleMeta.fieldMeta[name].categories = + const categories = dynamicProperty.pluckCategoricalStyleMetaFromTileMetaFeatures(metaFeatures); - + if (categories.length) { + styleMeta.fieldMeta[name].categories = categories; + } const ordinalStyleMeta = dynamicProperty.pluckOrdinalStyleMetaFromTileMetaFeatures(metaFeatures); if (ordinalStyleMeta) { @@ -601,8 +603,10 @@ export class VectorStyle implements IVectorStyle { if (!styleMeta.fieldMeta[name]) { styleMeta.fieldMeta[name] = { categories: [] }; } - styleMeta.fieldMeta[name].categories = - dynamicProperty.pluckCategoricalStyleMetaFromFeatures(features); + const categories = dynamicProperty.pluckCategoricalStyleMetaFromFeatures(features); + if (categories.length) { + styleMeta.fieldMeta[name].categories = categories; + } const ordinalStyleMeta = dynamicProperty.pluckOrdinalStyleMetaFromFeatures(features); if (ordinalStyleMeta) { styleMeta.fieldMeta[name].range = ordinalStyleMeta; From 408969601d92780a2acfdba5c2aa5ee2f3ba342b Mon Sep 17 00:00:00 2001 From: Xavier Mouligneau Date: Thu, 24 Feb 2022 09:30:30 -0500 Subject: [PATCH 006/102] [RAM] Rename alerts to rules in triggers_actions_ui plugin (#125591) * initial work to have rules in triggers actions ui * fix functional testing * fix unit test * fix uptime type * fix scss import due to name changed * fix lint * fix monitoring jest test * fix import * fix translations * fix functional testing * fix functional testing II * fix functional testing III * fix functional testing IV * fix check type * review I * fix check types Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../alerting/alerting_flyout/index.tsx | 2 +- .../inventory/components/alert_flyout.tsx | 2 +- .../log_threshold/components/alert_flyout.tsx | 2 +- .../components/alert_flyout.tsx | 2 +- .../components/alert_flyout.tsx | 2 +- .../ml/public/alerting/ml_alerting_flyout.tsx | 13 +- .../public/alerts/alert_form.test.tsx | 14 +- .../public/alerts/configuration.tsx | 5 +- .../containers/alerts_page/alerts_page.tsx | 11 +- .../rules/step_rule_actions/schema.tsx | 6 +- .../rules/step_rule_actions/utils.ts | 8 +- .../detection_engine/rules/details/index.tsx | 4 +- .../alerting/transform_alerting_flyout.tsx | 7 +- .../translations/translations/ja-JP.json | 298 +++++------ .../translations/translations/zh-CN.json | 301 +++++------ .../public/application/app.tsx | 6 +- .../es_index/es_index_params.tsx | 2 +- .../application/components/health_check.tsx | 8 +- .../components/prompts/empty_prompt.tsx | 4 +- .../public/application/home.tsx | 4 +- .../public/application/lib/alert_api/index.ts | 25 - .../public/application/lib/breadcrumb.test.ts | 6 +- .../public/application/lib/breadcrumb.ts | 2 +- .../public/application/lib/capabilities.ts | 10 +- ...t.tsx => check_rule_type_enabled.test.tsx} | 16 +- ...nabled.tsx => check_rule_type_enabled.tsx} | 12 +- .../{alert_api => rule_api}/aggregate.test.ts | 24 +- .../lib/{alert_api => rule_api}/aggregate.ts | 20 +- .../common_transformations.ts | 14 +- .../{alert_api => rule_api}/create.test.ts | 16 +- .../lib/{alert_api => rule_api}/create.ts | 24 +- .../{alert_api => rule_api}/delete.test.ts | 6 +- .../lib/{alert_api => rule_api}/delete.ts | 2 +- .../{alert_api => rule_api}/disable.test.ts | 14 +- .../enable.ts => rule_api/disable.ts} | 8 +- .../{alert_api => rule_api}/enable.test.ts | 14 +- .../disable.ts => rule_api/enable.ts} | 8 +- .../{alert_api => rule_api}/get_rule.test.ts | 14 +- .../lib/{alert_api => rule_api}/get_rule.ts | 12 +- .../{alert_api => rule_api}/health.test.ts | 0 .../lib/{alert_api => rule_api}/health.ts | 0 .../public/application/lib/rule_api/index.ts | 25 + .../map_filters_to_kql.test.ts | 8 +- .../map_filters_to_kql.ts | 8 +- .../lib/{alert_api => rule_api}/mute.test.ts | 10 +- .../lib/{alert_api => rule_api}/mute.ts | 6 +- .../mute_alert.test.ts | 0 .../lib/{alert_api => rule_api}/mute_alert.ts | 0 .../resolve_rule.test.ts | 2 +- .../{alert_api => rule_api}/resolve_rule.ts | 0 .../rule_summary.test.ts} | 12 +- .../rule_summary.ts} | 10 +- .../rule_types.test.ts | 6 +- .../lib/{alert_api => rule_api}/rule_types.ts | 2 +- .../lib/{alert_api => rule_api}/rules.test.ts | 16 +- .../lib/{alert_api => rule_api}/rules.ts | 12 +- .../lib/{alert_api => rule_api}/state.test.ts | 24 +- .../lib/{alert_api => rule_api}/state.ts | 10 +- .../{alert_api => rule_api}/unmute.test.ts | 14 +- .../lib/{alert_api => rule_api}/unmute.ts | 6 +- .../unmute_alert.test.ts | 0 .../{alert_api => rule_api}/unmute_alert.ts | 0 .../{alert_api => rule_api}/update.test.ts | 19 +- .../lib/{alert_api => rule_api}/update.ts | 22 +- ...pare.test.ts => rule_type_compare.test.ts} | 60 +-- ...t_type_compare.ts => rule_type_compare.ts} | 30 +- .../application/lib/value_validators.test.ts | 70 +-- .../application/lib/value_validators.ts | 16 +- .../action_form.test.tsx | 6 +- .../action_connector_form/action_form.tsx | 18 +- .../action_type_form.test.tsx | 4 +- .../action_type_form.tsx | 4 +- .../connector_add_inline.tsx | 6 +- .../connectors_selection.tsx | 4 +- .../sections/alert_form/alert_add.tsx | 304 ----------- .../sections/alert_form/alert_reducer.test.ts | 189 ------- .../sections/alert_form/alert_reducer.ts | 203 -------- .../alert_form/has_alert_changed.test.ts | 165 ------ .../components/bulk_operation_popover.tsx | 2 +- ...tons.scss => rule_quick_edit_buttons.scss} | 0 ...uttons.tsx => rule_quick_edit_buttons.tsx} | 124 ++--- .../with_bulk_alert_api_operations.test.tsx | 277 ---------- .../with_bulk_alert_api_operations.tsx | 151 ------ .../with_bulk_rule_api_operations.test.tsx | 277 ++++++++++ .../with_bulk_rule_api_operations.tsx | 151 ++++++ .../application/sections/common/connectors.ts | 4 +- .../public/application/sections/index.tsx | 13 +- .../components/alert_muted_switch.tsx} | 4 +- .../components/rule.scss} | 4 +- .../components/rule.test.tsx} | 99 ++-- .../components/rule.tsx} | 69 ++- .../components/rule_details.test.tsx} | 345 ++++++------ .../components/rule_details.tsx} | 194 +++---- .../components/rule_details_route.test.tsx} | 123 +++-- .../components/rule_details_route.tsx} | 80 +-- .../components/rule_route.test.tsx} | 50 +- .../components/rule_route.tsx} | 60 +-- .../components/view_in_app.test.tsx | 22 +- .../components/view_in_app.tsx | 56 +- .../confirm_rule_close.tsx} | 12 +- .../confirm_rule_save.tsx} | 12 +- .../rule_form/has_rule_changed.test.ts | 165 ++++++ .../has_rule_changed.ts} | 12 +- .../{alert_form => rule_form}/index.tsx | 4 +- .../rule_add.test.tsx} | 78 +-- .../sections/rule_form/rule_add.tsx | 303 +++++++++++ .../rule_add_footer.tsx} | 16 +- .../rule_conditions.test.tsx} | 29 +- .../rule_conditions.tsx} | 16 +- .../rule_conditions_group.test.tsx} | 16 +- .../rule_conditions_group.tsx} | 14 +- .../rule_edit.test.tsx} | 78 +-- .../rule_edit.tsx} | 144 +++-- .../rule_errors.test.tsx} | 106 ++-- .../rule_errors.ts} | 70 +-- .../rule_form.scss} | 2 +- .../rule_form.test.tsx} | 170 +++--- .../rule_form.tsx} | 382 +++++++------- .../rule_notify_when.test.tsx} | 12 +- .../rule_notify_when.tsx} | 76 +-- .../sections/rule_form/rule_reducer.test.ts | 189 +++++++ .../sections/rule_form/rule_reducer.ts | 206 ++++++++ .../solution_filter.tsx | 2 +- .../components/action_type_filter.tsx | 2 +- .../components/collapsed_item_actions.scss | 2 +- .../collapsed_item_actions.test.tsx | 110 ++-- .../components/collapsed_item_actions.tsx | 70 +-- .../components/manage_license_modal.tsx | 8 +- .../percentile_selectable_popover.tsx | 2 +- .../components/rule_duration_format.tsx | 0 .../components/rule_enabled_switch.test.tsx | 24 +- .../components/rule_enabled_switch.tsx | 22 +- .../components/rule_status_filter.tsx} | 18 +- .../components/rules_list.scss} | 12 +- .../components/rules_list.test.tsx} | 318 ++++++------ .../components/rules_list.tsx} | 491 +++++++++--------- .../components/type_filter.tsx | 8 +- .../translations.ts | 30 +- .../public/common/get_add_alert_flyout.tsx | 6 +- .../public/common/get_edit_alert_flyout.tsx | 6 +- .../public/common/index_controls/index.ts | 2 +- .../public/common/lib/health_api.ts | 24 +- .../triggers_actions_ui/public/index.ts | 6 +- .../triggers_actions_ui/public/mocks.ts | 10 +- .../triggers_actions_ui/public/plugin.ts | 18 +- .../triggers_actions_ui/public/types.ts | 58 ++- .../status_alert_flyouts_in_alerting_app.ts | 4 +- .../tls_alert_flyouts_in_alerting_app.ts | 2 +- .../monitor_details/monitor_alerts.journey.ts | 4 +- .../e2e/page_objects/monitor_details.tsx | 2 +- .../alerts/uptime_edit_alert_flyout.tsx | 7 +- .../alerts/uptime_alerts_flyout_wrapper.tsx | 2 +- .../public/lib/alert_types/alert_messages.tsx | 6 +- .../uptime/public/state/actions/types.ts | 4 +- .../uptime/public/state/alerts/alerts.ts | 21 +- .../uptime/public/state/api/alert_actions.ts | 4 +- .../plugins/uptime/public/state/api/alerts.ts | 31 +- .../test/functional/services/ml/navigation.ts | 2 +- .../test/functional/services/uptime/alerts.ts | 10 +- .../alert_create_flyout.ts | 58 +-- .../apps/triggers_actions_ui/alerts_list.ts | 36 +- .../apps/triggers_actions_ui/details.ts | 42 +- .../apps/triggers_actions_ui/home_page.ts | 4 +- .../apps/uptime/alert_flyout.ts | 4 +- .../page_objects/rule_details.ts | 10 +- .../page_objects/triggers_actions_ui_page.ts | 42 +- 166 files changed, 3974 insertions(+), 4026 deletions(-) delete mode 100644 x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/index.ts rename x-pack/plugins/triggers_actions_ui/public/application/lib/{check_alert_type_enabled.test.tsx => check_rule_type_enabled.test.tsx} (75%) rename x-pack/plugins/triggers_actions_ui/public/application/lib/{check_alert_type_enabled.tsx => check_rule_type_enabled.tsx} (64%) rename x-pack/plugins/triggers_actions_ui/public/application/lib/{alert_api => rule_api}/aggregate.test.ts (90%) rename x-pack/plugins/triggers_actions_ui/public/application/lib/{alert_api => rule_api}/aggregate.ts (74%) rename x-pack/plugins/triggers_actions_ui/public/application/lib/{alert_api => rule_api}/common_transformations.ts (82%) rename x-pack/plugins/triggers_actions_ui/public/application/lib/{alert_api => rule_api}/create.test.ts (92%) rename x-pack/plugins/triggers_actions_ui/public/application/lib/{alert_api => rule_api}/create.ts (66%) rename x-pack/plugins/triggers_actions_ui/public/application/lib/{alert_api => rule_api}/delete.test.ts (86%) rename x-pack/plugins/triggers_actions_ui/public/application/lib/{alert_api => rule_api}/delete.ts (95%) rename x-pack/plugins/triggers_actions_ui/public/application/lib/{alert_api => rule_api}/disable.test.ts (74%) rename x-pack/plugins/triggers_actions_ui/public/application/lib/{alert_api/enable.ts => rule_api/disable.ts} (73%) rename x-pack/plugins/triggers_actions_ui/public/application/lib/{alert_api => rule_api}/enable.test.ts (74%) rename x-pack/plugins/triggers_actions_ui/public/application/lib/{alert_api/disable.ts => rule_api/enable.ts} (68%) rename x-pack/plugins/triggers_actions_ui/public/application/lib/{alert_api => rule_api}/get_rule.test.ts (90%) rename x-pack/plugins/triggers_actions_ui/public/application/lib/{alert_api => rule_api}/get_rule.ts (79%) rename x-pack/plugins/triggers_actions_ui/public/application/lib/{alert_api => rule_api}/health.test.ts (100%) rename x-pack/plugins/triggers_actions_ui/public/application/lib/{alert_api => rule_api}/health.ts (100%) create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/index.ts rename x-pack/plugins/triggers_actions_ui/public/application/lib/{alert_api => rule_api}/map_filters_to_kql.test.ts (88%) rename x-pack/plugins/triggers_actions_ui/public/application/lib/{alert_api => rule_api}/map_filters_to_kql.ts (79%) rename x-pack/plugins/triggers_actions_ui/public/application/lib/{alert_api => rule_api}/mute.test.ts (83%) rename x-pack/plugins/triggers_actions_ui/public/application/lib/{alert_api => rule_api}/mute.ts (63%) rename x-pack/plugins/triggers_actions_ui/public/application/lib/{alert_api => rule_api}/mute_alert.test.ts (100%) rename x-pack/plugins/triggers_actions_ui/public/application/lib/{alert_api => rule_api}/mute_alert.ts (100%) rename x-pack/plugins/triggers_actions_ui/public/application/lib/{alert_api => rule_api}/resolve_rule.test.ts (98%) rename x-pack/plugins/triggers_actions_ui/public/application/lib/{alert_api => rule_api}/resolve_rule.ts (100%) rename x-pack/plugins/triggers_actions_ui/public/application/lib/{alert_api/alert_summary.test.ts => rule_api/rule_summary.test.ts} (84%) rename x-pack/plugins/triggers_actions_ui/public/application/lib/{alert_api/alert_summary.ts => rule_api/rule_summary.ts} (84%) rename x-pack/plugins/triggers_actions_ui/public/application/lib/{alert_api => rule_api}/rule_types.test.ts (91%) rename x-pack/plugins/triggers_actions_ui/public/application/lib/{alert_api => rule_api}/rule_types.ts (94%) rename x-pack/plugins/triggers_actions_ui/public/application/lib/{alert_api => rule_api}/rules.test.ts (93%) rename x-pack/plugins/triggers_actions_ui/public/application/lib/{alert_api => rule_api}/rules.ts (88%) rename x-pack/plugins/triggers_actions_ui/public/application/lib/{alert_api => rule_api}/state.test.ts (81%) rename x-pack/plugins/triggers_actions_ui/public/application/lib/{alert_api => rule_api}/state.ts (87%) rename x-pack/plugins/triggers_actions_ui/public/application/lib/{alert_api => rule_api}/unmute.test.ts (74%) rename x-pack/plugins/triggers_actions_ui/public/application/lib/{alert_api => rule_api}/unmute.ts (72%) rename x-pack/plugins/triggers_actions_ui/public/application/lib/{alert_api => rule_api}/unmute_alert.test.ts (100%) rename x-pack/plugins/triggers_actions_ui/public/application/lib/{alert_api => rule_api}/unmute_alert.ts (100%) rename x-pack/plugins/triggers_actions_ui/public/application/lib/{alert_api => rule_api}/update.test.ts (76%) rename x-pack/plugins/triggers_actions_ui/public/application/lib/{alert_api => rule_api}/update.ts (71%) rename x-pack/plugins/triggers_actions_ui/public/application/lib/{alert_type_compare.test.ts => rule_type_compare.test.ts} (74%) rename x-pack/plugins/triggers_actions_ui/public/application/lib/{alert_type_compare.ts => rule_type_compare.ts} (63%) delete mode 100644 x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_add.tsx delete mode 100644 x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_reducer.test.ts delete mode 100644 x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_reducer.ts delete mode 100644 x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/has_alert_changed.test.ts rename x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/{alert_quick_edit_buttons.scss => rule_quick_edit_buttons.scss} (100%) rename x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/{alert_quick_edit_buttons.tsx => rule_quick_edit_buttons.tsx} (58%) delete mode 100644 x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/with_bulk_alert_api_operations.test.tsx delete mode 100644 x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/with_bulk_alert_api_operations.tsx create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/with_bulk_rule_api_operations.test.tsx create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/with_bulk_rule_api_operations.tsx rename x-pack/plugins/triggers_actions_ui/public/application/sections/{alert_details/components/rule_muted_switch.tsx => rule_details/components/alert_muted_switch.tsx} (90%) rename x-pack/plugins/triggers_actions_ui/public/application/sections/{alert_details/components/alerts.scss => rule_details/components/rule.scss} (90%) rename x-pack/plugins/triggers_actions_ui/public/application/sections/{alert_details/components/alerts.test.tsx => rule_details/components/rule.test.tsx} (84%) rename x-pack/plugins/triggers_actions_ui/public/application/sections/{alert_details/components/alerts.tsx => rule_details/components/rule.tsx} (82%) rename x-pack/plugins/triggers_actions_ui/public/application/sections/{alert_details/components/alert_details.test.tsx => rule_details/components/rule_details.test.tsx} (72%) rename x-pack/plugins/triggers_actions_ui/public/application/sections/{alert_details/components/alert_details.tsx => rule_details/components/rule_details.tsx} (70%) rename x-pack/plugins/triggers_actions_ui/public/application/sections/{alert_details/components/alert_details_route.test.tsx => rule_details/components/rule_details_route.test.tsx} (79%) rename x-pack/plugins/triggers_actions_ui/public/application/sections/{alert_details/components/alert_details_route.tsx => rule_details/components/rule_details_route.tsx} (66%) rename x-pack/plugins/triggers_actions_ui/public/application/sections/{alert_details/components/alerts_route.test.tsx => rule_details/components/rule_route.test.tsx} (71%) rename x-pack/plugins/triggers_actions_ui/public/application/sections/{alert_details/components/alerts_route.tsx => rule_details/components/rule_route.tsx} (56%) rename x-pack/plugins/triggers_actions_ui/public/application/sections/{alert_details => rule_details}/components/view_in_app.test.tsx (79%) rename x-pack/plugins/triggers_actions_ui/public/application/sections/{alert_details => rule_details}/components/view_in_app.tsx (53%) rename x-pack/plugins/triggers_actions_ui/public/application/sections/{alert_form/confirm_alert_close.tsx => rule_form/confirm_rule_close.tsx} (69%) rename x-pack/plugins/triggers_actions_ui/public/application/sections/{alert_form/confirm_alert_save.tsx => rule_form/confirm_rule_save.tsx} (68%) create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/has_rule_changed.test.ts rename x-pack/plugins/triggers_actions_ui/public/application/sections/{alert_form/has_alert_changed.ts => rule_form/has_rule_changed.ts} (72%) rename x-pack/plugins/triggers_actions_ui/public/application/sections/{alert_form => rule_form}/index.tsx (67%) rename x-pack/plugins/triggers_actions_ui/public/application/sections/{alert_form/alert_add.test.tsx => rule_form/rule_add.test.tsx} (76%) create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_add.tsx rename x-pack/plugins/triggers_actions_ui/public/application/sections/{alert_form/alert_add_footer.tsx => rule_form/rule_add_footer.tsx} (79%) rename x-pack/plugins/triggers_actions_ui/public/application/sections/{alert_form/alert_conditions.test.tsx => rule_form/rule_conditions.test.tsx} (93%) rename x-pack/plugins/triggers_actions_ui/public/application/sections/{alert_form/alert_conditions.tsx => rule_form/rule_conditions.tsx} (87%) rename x-pack/plugins/triggers_actions_ui/public/application/sections/{alert_form/alert_conditions_group.test.tsx => rule_form/rule_conditions_group.test.tsx} (90%) rename x-pack/plugins/triggers_actions_ui/public/application/sections/{alert_form/alert_conditions_group.tsx => rule_form/rule_conditions_group.tsx} (74%) rename x-pack/plugins/triggers_actions_ui/public/application/sections/{alert_form/alert_edit.test.tsx => rule_form/rule_edit.test.tsx} (75%) rename x-pack/plugins/triggers_actions_ui/public/application/sections/{alert_form/alert_edit.tsx => rule_form/rule_edit.tsx} (59%) rename x-pack/plugins/triggers_actions_ui/public/application/sections/{alert_form/alert_errors.test.tsx => rule_form/rule_errors.test.tsx} (74%) rename x-pack/plugins/triggers_actions_ui/public/application/sections/{alert_form/alert_errors.ts => rule_form/rule_errors.ts} (61%) rename x-pack/plugins/triggers_actions_ui/public/application/sections/{alert_form/alert_form.scss => rule_form/rule_form.scss} (56%) rename x-pack/plugins/triggers_actions_ui/public/application/sections/{alert_form/alert_form.test.tsx => rule_form/rule_form.test.tsx} (67%) rename x-pack/plugins/triggers_actions_ui/public/application/sections/{alert_form/alert_form.tsx => rule_form/rule_form.tsx} (63%) rename x-pack/plugins/triggers_actions_ui/public/application/sections/{alert_form/alert_notify_when.test.tsx => rule_form/rule_notify_when.test.tsx} (96%) rename x-pack/plugins/triggers_actions_ui/public/application/sections/{alert_form/alert_notify_when.tsx => rule_form/rule_notify_when.tsx} (69%) create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_reducer.test.ts create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_reducer.ts rename x-pack/plugins/triggers_actions_ui/public/application/sections/{alert_form => rule_form}/solution_filter.tsx (96%) rename x-pack/plugins/triggers_actions_ui/public/application/sections/{alerts_list => rules_list}/components/action_type_filter.tsx (96%) rename x-pack/plugins/triggers_actions_ui/public/application/sections/{alerts_list => rules_list}/components/collapsed_item_actions.scss (75%) rename x-pack/plugins/triggers_actions_ui/public/application/sections/{alerts_list => rules_list}/components/collapsed_item_actions.test.tsx (76%) rename x-pack/plugins/triggers_actions_ui/public/application/sections/{alerts_list => rules_list}/components/collapsed_item_actions.tsx (68%) rename x-pack/plugins/triggers_actions_ui/public/application/sections/{alerts_list => rules_list}/components/manage_license_modal.tsx (86%) rename x-pack/plugins/triggers_actions_ui/public/application/sections/{alerts_list => rules_list}/components/percentile_selectable_popover.tsx (96%) rename x-pack/plugins/triggers_actions_ui/public/application/sections/{alerts_list => rules_list}/components/rule_duration_format.tsx (100%) rename x-pack/plugins/triggers_actions_ui/public/application/sections/{alerts_list => rules_list}/components/rule_enabled_switch.test.tsx (85%) rename x-pack/plugins/triggers_actions_ui/public/application/sections/{alerts_list => rules_list}/components/rule_enabled_switch.tsx (76%) rename x-pack/plugins/triggers_actions_ui/public/application/sections/{alerts_list/components/alert_status_filter.tsx => rules_list/components/rule_status_filter.tsx} (82%) rename x-pack/plugins/triggers_actions_ui/public/application/sections/{alerts_list/components/alerts_list.scss => rules_list/components/rules_list.scss} (79%) rename x-pack/plugins/triggers_actions_ui/public/application/sections/{alerts_list/components/alerts_list.test.tsx => rules_list/components/rules_list.test.tsx} (70%) rename x-pack/plugins/triggers_actions_ui/public/application/sections/{alerts_list/components/alerts_list.tsx => rules_list/components/rules_list.tsx} (65%) rename x-pack/plugins/triggers_actions_ui/public/application/sections/{alerts_list => rules_list}/components/type_filter.tsx (90%) rename x-pack/plugins/triggers_actions_ui/public/application/sections/{alerts_list => rules_list}/translations.ts (68%) diff --git a/x-pack/plugins/apm/public/components/alerting/alerting_flyout/index.tsx b/x-pack/plugins/apm/public/components/alerting/alerting_flyout/index.tsx index 36f96f901f1ff..84a5eeccd3228 100644 --- a/x-pack/plugins/apm/public/components/alerting/alerting_flyout/index.tsx +++ b/x-pack/plugins/apm/public/components/alerting/alerting_flyout/index.tsx @@ -55,7 +55,7 @@ export function AlertingFlyout(props: Props) { services.triggersActionsUi.getAddAlertFlyout({ consumer: APM_SERVER_FEATURE_ID, onClose: onCloseAddFlyout, - alertTypeId: alertType, + ruleTypeId: alertType, canChangeTrigger: false, initialValues, metadata: { diff --git a/x-pack/plugins/infra/public/alerting/inventory/components/alert_flyout.tsx b/x-pack/plugins/infra/public/alerting/inventory/components/alert_flyout.tsx index 33fe3c7af30c7..c0a475ea8029b 100644 --- a/x-pack/plugins/infra/public/alerting/inventory/components/alert_flyout.tsx +++ b/x-pack/plugins/infra/public/alerting/inventory/components/alert_flyout.tsx @@ -34,7 +34,7 @@ export const AlertFlyout = ({ options, nodeType, filter, visible, setVisible }: consumer: 'infrastructure', onClose: onCloseFlyout, canChangeTrigger: false, - alertTypeId: METRIC_INVENTORY_THRESHOLD_ALERT_TYPE_ID, + ruleTypeId: METRIC_INVENTORY_THRESHOLD_ALERT_TYPE_ID, metadata: { options, nodeType, diff --git a/x-pack/plugins/infra/public/alerting/log_threshold/components/alert_flyout.tsx b/x-pack/plugins/infra/public/alerting/log_threshold/components/alert_flyout.tsx index bee7f93a538be..d7270aa0ef0e5 100644 --- a/x-pack/plugins/infra/public/alerting/log_threshold/components/alert_flyout.tsx +++ b/x-pack/plugins/infra/public/alerting/log_threshold/components/alert_flyout.tsx @@ -25,7 +25,7 @@ export const AlertFlyout = (props: Props) => { consumer: 'logs', onClose: onCloseFlyout, canChangeTrigger: false, - alertTypeId: LOG_DOCUMENT_COUNT_RULE_TYPE_ID, + ruleTypeId: LOG_DOCUMENT_COUNT_RULE_TYPE_ID, metadata: { isInternal: true, }, diff --git a/x-pack/plugins/infra/public/alerting/metric_anomaly/components/alert_flyout.tsx b/x-pack/plugins/infra/public/alerting/metric_anomaly/components/alert_flyout.tsx index 9d467e1df7e36..e0e9946b1c789 100644 --- a/x-pack/plugins/infra/public/alerting/metric_anomaly/components/alert_flyout.tsx +++ b/x-pack/plugins/infra/public/alerting/metric_anomaly/components/alert_flyout.tsx @@ -32,7 +32,7 @@ export const AlertFlyout = ({ metric, nodeType, visible, setVisible }: Props) => consumer: 'infrastructure', onClose: onCloseFlyout, canChangeTrigger: false, - alertTypeId: METRIC_ANOMALY_ALERT_TYPE_ID, + ruleTypeId: METRIC_ANOMALY_ALERT_TYPE_ID, metadata: { metric, nodeType, diff --git a/x-pack/plugins/infra/public/alerting/metric_threshold/components/alert_flyout.tsx b/x-pack/plugins/infra/public/alerting/metric_threshold/components/alert_flyout.tsx index e7e4ade5257fc..642b7dbf079c0 100644 --- a/x-pack/plugins/infra/public/alerting/metric_threshold/components/alert_flyout.tsx +++ b/x-pack/plugins/infra/public/alerting/metric_threshold/components/alert_flyout.tsx @@ -30,7 +30,7 @@ export const AlertFlyout = (props: Props) => { consumer: 'infrastructure', onClose: onCloseFlyout, canChangeTrigger: false, - alertTypeId: METRIC_THRESHOLD_ALERT_TYPE_ID, + ruleTypeId: METRIC_THRESHOLD_ALERT_TYPE_ID, metadata: { currentOptions: props.options, series: props.series, diff --git a/x-pack/plugins/ml/public/alerting/ml_alerting_flyout.tsx b/x-pack/plugins/ml/public/alerting/ml_alerting_flyout.tsx index b87a447bd4b15..d06cbbc02f6ed 100644 --- a/x-pack/plugins/ml/public/alerting/ml_alerting_flyout.tsx +++ b/x-pack/plugins/ml/public/alerting/ml_alerting_flyout.tsx @@ -7,6 +7,8 @@ import React, { FC, useCallback, useEffect, useMemo, useState } from 'react'; import { EuiButtonEmpty } from '@elastic/eui'; + +import { Rule } from '../../../triggers_actions_ui/public'; import { JobId } from '../../common/types/anomaly_detection_jobs'; import { useMlKibana } from '../application/contexts/kibana'; import { ML_ALERT_TYPES } from '../../common/constants/alerts'; @@ -14,7 +16,7 @@ import { PLUGIN_ID } from '../../common/constants/app'; import { MlAnomalyDetectionAlertRule } from '../../common/types/alerts'; interface MlAnomalyAlertFlyoutProps { - initialAlert?: MlAnomalyDetectionAlertRule; + initialAlert?: MlAnomalyDetectionAlertRule & Rule; jobIds?: JobId[]; onSave?: () => void; onCloseFlyout: () => void; @@ -55,7 +57,10 @@ export const MlAnomalyAlertFlyout: FC = ({ if (initialAlert) { return triggersActionsUi.getEditAlertFlyout({ ...commonProps, - initialAlert, + initialRule: { + ...initialAlert, + ruleTypeId: initialAlert.ruleTypeId ?? initialAlert.alertTypeId, + }, }); } @@ -63,7 +68,7 @@ export const MlAnomalyAlertFlyout: FC = ({ ...commonProps, consumer: PLUGIN_ID, canChangeTrigger: false, - alertTypeId: ML_ALERT_TYPES.ANOMALY_DETECTION, + ruleTypeId: ML_ALERT_TYPES.ANOMALY_DETECTION, metadata: {}, initialValues: { params: { @@ -124,7 +129,7 @@ export const JobListMlAnomalyAlertFlyout: FC = }; interface EditRuleFlyoutProps { - initialAlert: MlAnomalyDetectionAlertRule; + initialAlert: MlAnomalyDetectionAlertRule & Rule; onSave: () => void; } diff --git a/x-pack/plugins/monitoring/public/alerts/alert_form.test.tsx b/x-pack/plugins/monitoring/public/alerts/alert_form.test.tsx index ff58887c88c12..9f06b452b9a18 100644 --- a/x-pack/plugins/monitoring/public/alerts/alert_form.test.tsx +++ b/x-pack/plugins/monitoring/public/alerts/alert_form.test.tsx @@ -23,7 +23,7 @@ import { GenericValidationResult, RuleTypeModel, } from '../../../triggers_actions_ui/public/types'; -import { AlertForm } from '../../../triggers_actions_ui/public/application/sections/alert_form/alert_form'; +import { RuleForm } from '../../../triggers_actions_ui/public/application/sections/rule_form/rule_form'; import ActionForm from '../../../triggers_actions_ui/public/application/sections/action_connector_form/action_form'; import { Legacy } from '../legacy_shims'; import { I18nProvider } from '@kbn/i18n-react'; @@ -41,7 +41,7 @@ jest.mock('../../../triggers_actions_ui/public/application/lib/action_connector_ loadActionTypes: jest.fn(), })); -jest.mock('../../../triggers_actions_ui/public/application/lib/alert_api', () => ({ +jest.mock('../../../triggers_actions_ui/public/application/lib/rule_api', () => ({ loadAlertTypes: jest.fn(), })); @@ -117,7 +117,7 @@ describe('alert_form', () => { const initialAlert = { name: 'test', - alertTypeId: ruleType.id, + ruleTypeId: ruleType.id, params: {}, consumer: ALERTS_FEATURE_ID, schedule: { @@ -133,8 +133,8 @@ describe('alert_form', () => { wrapper = mountWithIntl( - {}} errors={{ name: [], interval: [] }} operation="create" @@ -152,13 +152,13 @@ describe('alert_form', () => { }); it('renders alert name', async () => { - const alertNameField = wrapper.find('[data-test-subj="alertNameInput"]'); + const alertNameField = wrapper.find('[data-test-subj="ruleNameInput"]'); expect(alertNameField.exists()).toBeTruthy(); expect(alertNameField.first().prop('value')).toBe('test'); }); it('renders registered selected alert type', async () => { - const alertTypeSelectOptions = wrapper.find('[data-test-subj="selectedAlertTypeTitle"]'); + const alertTypeSelectOptions = wrapper.find('[data-test-subj="selectedRuleTypeTitle"]'); expect(alertTypeSelectOptions.exists()).toBeTruthy(); }); diff --git a/x-pack/plugins/monitoring/public/alerts/configuration.tsx b/x-pack/plugins/monitoring/public/alerts/configuration.tsx index 5c5ce8c167341..6dd62a9a1dae6 100644 --- a/x-pack/plugins/monitoring/public/alerts/configuration.tsx +++ b/x-pack/plugins/monitoring/public/alerts/configuration.tsx @@ -86,7 +86,10 @@ export const AlertConfiguration: React.FC = (props: Props) => { () => showFlyout && Legacy.shims.triggersActionsUi.getEditAlertFlyout({ - initialAlert: alert, + initialRule: { + ...alert, + ruleTypeId: alert.alertTypeId, + }, onClose: () => { setShowFlyout(false); showBottomBar(); diff --git a/x-pack/plugins/observability/public/pages/alerts/containers/alerts_page/alerts_page.tsx b/x-pack/plugins/observability/public/pages/alerts/containers/alerts_page/alerts_page.tsx index 82a0313ac711a..89e5c937bacb6 100644 --- a/x-pack/plugins/observability/public/pages/alerts/containers/alerts_page/alerts_page.tsx +++ b/x-pack/plugins/observability/public/pages/alerts/containers/alerts_page/alerts_page.tsx @@ -17,7 +17,7 @@ import { observabilityFeatureId } from '../../../../../common'; import { useGetUserCasesPermissions } from '../../../../hooks/use_get_user_cases_permissions'; import { euiStyled } from '../../../../../../../../src/plugins/kibana_react/common'; import { useKibana } from '../../../../../../../../src/plugins/kibana_react/public'; -import { loadAlertAggregations as loadRuleAggregations } from '../../../../../../../plugins/triggers_actions_ui/public'; +import { loadRuleAggregations } from '../../../../../../../plugins/triggers_actions_ui/public'; import { AlertStatusFilterButton } from '../../../../../common/typings'; import { ParsedTechnicalFields } from '../../../../../../rule_registry/common/parse_technical_fields'; import { ParsedExperimentalFields } from '../../../../../../rule_registry/common/parse_experimental_fields'; @@ -107,13 +107,12 @@ function AlertsPage() { const response = await loadRuleAggregations({ http, }); - // Note that the API uses the semantics of 'alerts' instead of 'rules' - const { alertExecutionStatus, ruleMutedStatus, ruleEnabledStatus } = response; - if (alertExecutionStatus && ruleMutedStatus && ruleEnabledStatus) { - const total = Object.values(alertExecutionStatus).reduce((acc, value) => acc + value, 0); + const { ruleExecutionStatus, ruleMutedStatus, ruleEnabledStatus } = response; + if (ruleExecutionStatus && ruleMutedStatus && ruleEnabledStatus) { + const total = Object.values(ruleExecutionStatus).reduce((acc, value) => acc + value, 0); const { disabled } = ruleEnabledStatus; const { muted } = ruleMutedStatus; - const { error } = alertExecutionStatus; + const { error } = ruleExecutionStatus; setRuleStats({ ...ruleStats, total, diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/step_rule_actions/schema.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/step_rule_actions/schema.tsx index 955c357673689..936dd283793cb 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/step_rule_actions/schema.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/step_rule_actions/schema.tsx @@ -10,7 +10,7 @@ import { i18n } from '@kbn/i18n'; import { - AlertAction, + RuleAction, ActionTypeRegistryContract, } from '../../../../../../triggers_actions_ui/public'; import { @@ -23,7 +23,7 @@ import { ActionsStepRule } from '../../../pages/detection_engine/rules/types'; import { getActionTypeName, validateMustache, validateActionParams } from './utils'; export const validateSingleAction = async ( - actionItem: AlertAction, + actionItem: RuleAction, actionTypeRegistry: ActionTypeRegistryContract ): Promise => { const actionParamsErrors = await validateActionParams(actionItem, actionTypeRegistry); @@ -37,7 +37,7 @@ export const validateRuleActionsField = async ( ...data: Parameters ): Promise | void | undefined> => { - const [{ value, path }] = data as [{ value: AlertAction[]; path: string }]; + const [{ value, path }] = data as [{ value: RuleAction[]; path: string }]; const errors = []; for (const actionItem of value) { diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/step_rule_actions/utils.ts b/x-pack/plugins/security_solution/public/detections/components/rules/step_rule_actions/utils.ts index fc9562af83525..4826a10e978bd 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/step_rule_actions/utils.ts +++ b/x-pack/plugins/security_solution/public/detections/components/rules/step_rule_actions/utils.ts @@ -9,12 +9,12 @@ import mustache from 'mustache'; import { uniq, startCase, flattenDeep, isArray, isString } from 'lodash/fp'; import { - AlertAction, + RuleAction, ActionTypeRegistryContract, } from '../../../../../../triggers_actions_ui/public'; import * as I18n from './translations'; -export const getActionTypeName = (actionTypeId: AlertAction['actionTypeId']) => { +export const getActionTypeName = (actionTypeId: RuleAction['actionTypeId']) => { if (!actionTypeId) return ''; const actionType = actionTypeId.split('.')[1]; @@ -23,7 +23,7 @@ export const getActionTypeName = (actionTypeId: AlertAction['actionTypeId']) => return startCase(actionType); }; -export const validateMustache = (params: AlertAction['params']) => { +export const validateMustache = (params: RuleAction['params']) => { const errors: string[] = []; Object.entries(params).forEach(([paramKey, paramValue]) => { if (!isString(paramValue)) return; @@ -38,7 +38,7 @@ export const validateMustache = (params: AlertAction['params']) => { }; export const validateActionParams = async ( - actionItem: AlertAction, + actionItem: RuleAction, actionTypeRegistry: ActionTypeRegistryContract ): Promise => { const actionErrors = await actionTypeRegistry diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/details/index.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/details/index.tsx index c3f3131e65519..29df35290a445 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/details/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/details/index.tsx @@ -274,7 +274,7 @@ const RuleDetailsPageComponent: React.FC = ({ spacesApi.ui.redirectLegacyUrl( path, i18nTranslate.translate( - 'xpack.triggersActionsUI.sections.alertDetails.redirectObjectNoun', + 'xpack.triggersActionsUI.sections.ruleDetails.redirectObjectNoun', { defaultMessage: 'rule', } @@ -295,7 +295,7 @@ const RuleDetailsPageComponent: React.FC = ({ {spacesApi.ui.components.getLegacyUrlConflict({ objectNoun: i18nTranslate.translate( - 'xpack.triggersActionsUI.sections.alertDetails.redirectObjectNoun', + 'xpack.triggersActionsUI.sections.ruleDetails.redirectObjectNoun', { defaultMessage: 'rule', } diff --git a/x-pack/plugins/transform/public/alerting/transform_alerting_flyout.tsx b/x-pack/plugins/transform/public/alerting/transform_alerting_flyout.tsx index 63d00f280f3f3..259bd917b5cea 100644 --- a/x-pack/plugins/transform/public/alerting/transform_alerting_flyout.tsx +++ b/x-pack/plugins/transform/public/alerting/transform_alerting_flyout.tsx @@ -46,7 +46,10 @@ export const TransformAlertFlyout: FC = ({ if (initialAlert) { return triggersActionsUi.getEditAlertFlyout({ ...commonProps, - initialAlert, + initialRule: { + ...initialAlert, + ruleTypeId: initialAlert.alertTypeId, + }, }); } @@ -54,7 +57,7 @@ export const TransformAlertFlyout: FC = ({ ...commonProps, consumer: 'stackAlerts', canChangeTrigger: false, - alertTypeId: TRANSFORM_RULE_TYPE.TRANSFORM_HEALTH, + ruleTypeId: TRANSFORM_RULE_TYPE.TRANSFORM_HEALTH, metadata: {}, initialValues: { params: ruleParams!, diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 94cf3008d4719..bf120f49965c9 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -27598,7 +27598,7 @@ "xpack.triggersActionsUI.cases.configureCases.mappingFieldSummary": "まとめ", "xpack.triggersActionsUI.checkActionTypeEnabled.actionTypeDisabledByConfigMessage": "このコネクターは Kibana の構成で無効になっています。", "xpack.triggersActionsUI.checkActionTypeEnabled.actionTypeDisabledByLicenseMessage": "このコネクターには {minimumLicenseRequired} ライセンスが必要です。", - "xpack.triggersActionsUI.checkAlertTypeEnabled.ruleTypeDisabledByLicenseMessage": "このルールタイプには{minimumLicenseRequired}ライセンスが必要です。", + "xpack.triggersActionsUI.checkRuleTypeEnabled.ruleTypeDisabledByLicenseMessage": "このルールタイプには{minimumLicenseRequired}ライセンスが必要です。", "xpack.triggersActionsUI.common.constants.comparators.groupByTypes.allDocumentsLabel": "すべてのドキュメント", "xpack.triggersActionsUI.common.constants.comparators.groupByTypes.topLabel": "トップ", "xpack.triggersActionsUI.common.constants.comparators.isAboveLabel": "より大:", @@ -28046,152 +28046,136 @@ "xpack.triggersActionsUI.sections.addModalConnectorForm.flyoutTitle": "{actionTypeName}コネクター", "xpack.triggersActionsUI.sections.addModalConnectorForm.saveButtonLabel": "保存", "xpack.triggersActionsUI.sections.addModalConnectorForm.updateSuccessNotificationText": "「{connectorName}」を作成しました", - "xpack.triggersActionsUI.sections.alertAdd.flyoutTitle": "ルールを作成", - "xpack.triggersActionsUI.sections.alertAdd.indexControls.timeFieldOptionLabel": "フィールドを選択", - "xpack.triggersActionsUI.sections.alertAdd.operationName": "作成", - "xpack.triggersActionsUI.sections.alertAdd.saveErrorNotificationText": "ルールを作成できません。", - "xpack.triggersActionsUI.sections.alertAdd.saveSuccessNotificationText": "ルール\"{ruleName}\"を作成しました", - "xpack.triggersActionsUI.sections.alertAddFooter.cancelButtonLabel": "キャンセル", - "xpack.triggersActionsUI.sections.alertAddFooter.saveButtonLabel": "保存", - "xpack.triggersActionsUI.sections.alertDetails.actionWithBrokenConnectorWarningBannerEditText": "ルールを編集", - "xpack.triggersActionsUI.sections.alertDetails.actionWithBrokenConnectorWarningBannerTitle": "このルールに関連付けられたコネクターの1つで問題が発生しています。", - "xpack.triggersActionsUI.sections.alertDetails.alertDetailsTitle": "{alertName}", - "xpack.triggersActionsUI.sections.alertDetails.alertInstances.disabledRule": "このルールは無効になっていて再表示できません。", - "xpack.triggersActionsUI.sections.alertDetails.alerts.disabledRuleTitle": "無効なルール", - "xpack.triggersActionsUI.sections.alertDetails.alertsList.avgDurationDescription": "平均時間", - "xpack.triggersActionsUI.sections.alertDetails.alertsList.columns.alert": "アラート", - "xpack.triggersActionsUI.sections.alertDetails.alertsList.columns.duration": "期間", - "xpack.triggersActionsUI.sections.alertDetails.alertsList.columns.mute": "ミュート", - "xpack.triggersActionsUI.sections.alertDetails.alertsList.columns.start": "開始", - "xpack.triggersActionsUI.sections.alertDetails.alertsList.columns.status": "ステータス", - "xpack.triggersActionsUI.sections.alertDetails.alertsList.ruleLastExecutionDescription": "前回の応答", - "xpack.triggersActionsUI.sections.alertDetails.alertsList.ruleTypeExcessDurationMessage": "期間がルールの想定実行時間を超えています。", - "xpack.triggersActionsUI.sections.alertDetails.alertsList.status.active": "アクティブ", - "xpack.triggersActionsUI.sections.alertDetails.alertsList.status.inactive": "回復済み", - "xpack.triggersActionsUI.sections.alertDetails.collapsedItemActons.enableLoadingTitle": "有効にする", - "xpack.triggersActionsUI.sections.alertDetails.collapsedItemActons.enableTitle": "有効にする", - "xpack.triggersActionsUI.sections.alertDetails.collapsedItemActons.muteLoadingTitle": "ミュート", - "xpack.triggersActionsUI.sections.alertDetails.collapsedItemActons.muteTitle": "ミュート", - "xpack.triggersActionsUI.sections.alertDetails.dismissButtonTitle": "閉じる", - "xpack.triggersActionsUI.sections.alertDetails.editAlertButtonLabel": "編集", - "xpack.triggersActionsUI.sections.alertDetails.manageLicensePlanBannerLinkTitle": "ライセンスの管理", - "xpack.triggersActionsUI.sections.alertDetails.redirectObjectNoun": "ルール", - "xpack.triggersActionsUI.sections.alertDetails.unableToLoadAlertMessage": "ルールを読み込めません:{message}", - "xpack.triggersActionsUI.sections.alertDetails.unableToLoadAlertsMessage": "アラートを読み込めません:{message}", - "xpack.triggersActionsUI.sections.alertDetails.viewAlertInAppButtonLabel": "アプリで表示", - "xpack.triggersActionsUI.sections.alertEdit.cancelButtonLabel": "キャンセル", - "xpack.triggersActionsUI.sections.alertEdit.disabledActionsWarningTitle": "このアラートには無効なアクションがあります", - "xpack.triggersActionsUI.sections.alertEdit.flyoutTitle": "ルールを編集", - "xpack.triggersActionsUI.sections.alertEdit.saveButtonLabel": "保存", - "xpack.triggersActionsUI.sections.alertEdit.saveErrorNotificationText": "ルールを更新できません", - "xpack.triggersActionsUI.sections.alertEdit.saveSuccessNotificationText": "'{ruleName}'を更新しました", - "xpack.triggersActionsUI.sections.alertForm.alertNameLabel": "名前", - "xpack.triggersActionsUI.sections.alertForm.alertNotifyWhen.label": "毎", - "xpack.triggersActionsUI.sections.alertForm.alertNotifyWhen.onActionGroupChange.description": "アラートステータスが変更されるときにアクションを実行します。", - "xpack.triggersActionsUI.sections.alertForm.alertNotifyWhen.onActionGroupChange.display": "ステータス変更時のみ", - "xpack.triggersActionsUI.sections.alertForm.alertNotifyWhen.onActionGroupChange.label": "ステータス変更時のみ", - "xpack.triggersActionsUI.sections.alertForm.alertNotifyWhen.onActiveAlert.description": "アラートがアクティブなときは、ルール間隔でアクションが繰り返されます。", - "xpack.triggersActionsUI.sections.alertForm.alertNotifyWhen.onActiveAlert.display": "アラートがアクティブになるたびに実行", - "xpack.triggersActionsUI.sections.alertForm.alertNotifyWhen.onActiveAlert.label": "アラートがアクティブになるたびに実行", - "xpack.triggersActionsUI.sections.alertForm.alertNotifyWhen.onThrottleInterval.description": "設定した間隔を使用してアクションを実行します。", - "xpack.triggersActionsUI.sections.alertForm.alertNotifyWhen.onThrottleInterval.display": "カスタムアクション間隔", - "xpack.triggersActionsUI.sections.alertForm.alertNotifyWhen.onThrottleInterval.label": "カスタムアクション間隔", - "xpack.triggersActionsUI.sections.alertForm.changeAlertTypeAriaLabel": "削除", - "xpack.triggersActionsUI.sections.alertForm.checkFieldLabel": "確認間隔", - "xpack.triggersActionsUI.sections.alertForm.checkWithTooltip": "条件を評価する頻度を定義します。チェックはキューに登録されています。可能なかぎり定義された値に近づくように実行されます。", - "xpack.triggersActionsUI.sections.alertForm.conditions.addConditionLabel": "追加:", - "xpack.triggersActionsUI.sections.alertForm.conditions.removeConditionLabel": "削除", - "xpack.triggersActionsUI.sections.alertForm.conditions.title": "条件:", - "xpack.triggersActionsUI.sections.alertForm.documentationLabel": "ドキュメント", - "xpack.triggersActionsUI.sections.alertForm.error.belowMinimumText": "間隔はこのルールタイプの最小値({minimum})未満です", - "xpack.triggersActionsUI.sections.alertForm.error.noAuthorizedRuleTypes": "ルールを{operation}するには、適切な権限が付与されている必要があります。", - "xpack.triggersActionsUI.sections.alertForm.error.noAuthorizedRuleTypesTitle": "ルールタイプを{operation}する権限がありません。", - "xpack.triggersActionsUI.sections.alertForm.error.requiredActionConnector": "{actionTypeId}コネクターのアクションが必要です。", - "xpack.triggersActionsUI.sections.alertForm.error.requiredIntervalText": "確認間隔が必要です。", - "xpack.triggersActionsUI.sections.alertForm.error.requiredNameText": "名前が必要です。", - "xpack.triggersActionsUI.sections.alertForm.error.requiredRuleTypeIdText": "ルールタイプは必須です。", - "xpack.triggersActionsUI.sections.alertForm.loadingRuleTypeParamsDescription": "ルールタイプパラメーターを読み込んでいます…", - "xpack.triggersActionsUI.sections.alertForm.loadingRuleTypesDescription": "ルールタイプを読み込んでいます…", - "xpack.triggersActionsUI.sections.alertForm.renotifyFieldLabel": "通知", - "xpack.triggersActionsUI.sections.alertForm.renotifyWithTooltip": "ルールがアクティブな間にアクションを繰り返す頻度を定義します。", - "xpack.triggersActionsUI.sections.alertForm.ruleTypeSelectLabel": "ルールタイプを選択", - "xpack.triggersActionsUI.sections.alertForm.searchPlaceholderTitle": "検索", - "xpack.triggersActionsUI.sections.alertForm.solutionFilterLabel": "ユースケースでフィルタリング", - "xpack.triggersActionsUI.sections.alertForm.tagsFieldLabel": "タグ(任意)", - "xpack.triggersActionsUI.sections.alertForm.unableToLoadRuleTypesMessage": "ルールタイプを読み込めません", - "xpack.triggersActionsUI.sections.alertsList.actionTypeFilterLabel": "アクションタイプ", - "xpack.triggersActionsUI.sections.alertsList.addRuleButtonLabel": "ルールを作成", - "xpack.triggersActionsUI.sections.alertsList.alertErrorReasonDecrypting": "ルールの復号中にエラーが発生しました。", - "xpack.triggersActionsUI.sections.alertsList.alertErrorReasonDisabled": "ルールを実行できませんでした。ルールは無効化された後に実行されました。", - "xpack.triggersActionsUI.sections.alertsList.alertErrorReasonLicense": "ルールを実行できません", - "xpack.triggersActionsUI.sections.alertsList.alertErrorReasonReading": "ルールの読み取り中にエラーが発生しました。", - "xpack.triggersActionsUI.sections.alertsList.alertErrorReasonRunning": "ルールの実行中にエラーが発生しました。", - "xpack.triggersActionsUI.sections.alertsList.alertErrorReasonTimeout": "タイムアウトのためルール実行がキャンセルされました。", - "xpack.triggersActionsUI.sections.alertsList.alertErrorReasonUnknown": "不明な理由でエラーが発生しました。", - "xpack.triggersActionsUI.sections.alertsList.alertsListTable.columns.actionsTex": "アクション", - "xpack.triggersActionsUI.sections.alertsList.alertsListTable.columns.actionsWarningTooltip": "このルールに関連付けられたコネクターの1つを読み込めません。ルールを編集して、新しいコネクターを選択します。", - "xpack.triggersActionsUI.sections.alertsList.alertsListTable.columns.alertTypeTitle": "型", - "xpack.triggersActionsUI.sections.alertsList.alertsListTable.columns.deleteAriaLabel": "削除", - "xpack.triggersActionsUI.sections.alertsList.alertsListTable.columns.deleteButtonTooltip": "削除", - "xpack.triggersActionsUI.sections.alertsList.alertsListTable.columns.durationTitle": "ルールを実行するのにかかる時間。", - "xpack.triggersActionsUI.sections.alertsList.alertsListTable.columns.editAriaLabel": "編集", - "xpack.triggersActionsUI.sections.alertsList.alertsListTable.columns.editButtonTooltip": "編集", - "xpack.triggersActionsUI.sections.alertsList.alertsListTable.columns.enabledTitle": "有効", - "xpack.triggersActionsUI.sections.alertsList.alertsListTable.columns.lastExecutionDateTitle": "前回の実行の開始時間。", - "xpack.triggersActionsUI.sections.alertsList.alertsListTable.columns.mutedBadge": "ミュート", - "xpack.triggersActionsUI.sections.alertsList.alertsListTable.columns.nameTitle": "名前", - "xpack.triggersActionsUI.sections.alertsList.alertsListTable.columns.ruleExecutionPercentileSelectButton": "パーセンタイルを選択", - "xpack.triggersActionsUI.sections.alertsList.alertsListTable.columns.ruleExecutionPercentileTooltip": "このルールの過去{sampleLimit}実行期間の{percentileOrdinal}パーセンタイル", - "xpack.triggersActionsUI.sections.alertsList.alertsListTable.columns.scheduleTitle": "間隔", - "xpack.triggersActionsUI.sections.alertsList.alertsListTable.columns.statusTitle": "ステータス", - "xpack.triggersActionsUI.sections.alertsList.alertsListTable.columns.successRatioTitle": "このルールが正常に実行される頻度", - "xpack.triggersActionsUI.sections.alertsList.alertStatusActive": "アクティブ", - "xpack.triggersActionsUI.sections.alertsList.alertStatusError": "エラー", - "xpack.triggersActionsUI.sections.alertsList.alertStatusFilterLabel": "ステータス", - "xpack.triggersActionsUI.sections.alertsList.alertStatusLicenseError": "ライセンスエラー", - "xpack.triggersActionsUI.sections.alertsList.alertStatusOk": "OK", - "xpack.triggersActionsUI.sections.alertsList.alertStatusPending": "保留中", - "xpack.triggersActionsUI.sections.alertsList.alertStatusUnknown": "不明", - "xpack.triggersActionsUI.sections.alertsList.attentionBannerTitle": "{totalStatusesError, plural, other {# 件のルール}}でエラーが見つかりました。", - "xpack.triggersActionsUI.sections.alertsList.bulkActionPopover.buttonTitle": "ルールの管理", - "xpack.triggersActionsUI.sections.alertsList.bulkActionPopover.deleteAllTitle": "削除", - "xpack.triggersActionsUI.sections.alertsList.bulkActionPopover.disableAllTitle": "無効にする", - "xpack.triggersActionsUI.sections.alertsList.bulkActionPopover.enableAllTitle": "有効にする", - "xpack.triggersActionsUI.sections.alertsList.bulkActionPopover.failedToDeleteRulesMessage": "ルールを削除できませんでした", - "xpack.triggersActionsUI.sections.alertsList.bulkActionPopover.failedToDisableRulesMessage": "ルールを無効にできませんでした", - "xpack.triggersActionsUI.sections.alertsList.bulkActionPopover.failedToEnableRulesMessage": "ルールを有効にできませんでした", - "xpack.triggersActionsUI.sections.alertsList.bulkActionPopover.failedToMuteRulesMessage": "ルールをミュートできませんでした", - "xpack.triggersActionsUI.sections.alertsList.bulkActionPopover.failedToUnmuteRulesMessage": "ルールをミュート解除できませんでした", - "xpack.triggersActionsUI.sections.alertsList.bulkActionPopover.muteAllTitle": "ミュート", - "xpack.triggersActionsUI.sections.alertsList.bulkActionPopover.unmuteAllTitle": "ミュート解除", - "xpack.triggersActionsUI.sections.alertsList.collapsedItemActons.deleteRuleTitle": "ルールの削除", - "xpack.triggersActionsUI.sections.alertsList.collapsedItemActons.disableTitle": "無効にする", - "xpack.triggersActionsUI.sections.alertsList.collapsedItemActons.editTitle": "ルールを編集", - "xpack.triggersActionsUI.sections.alertsList.collapsedItemActons.enableTitle": "有効にする", - "xpack.triggersActionsUI.sections.alertsList.collapsedItemActons.muteTitle": "ミュート", - "xpack.triggersActionsUI.sections.alertsList.collapsedItemActons.popoverButtonTitle": "アクション", - "xpack.triggersActionsUI.sections.alertsList.collapsedItemActons.unmuteTitle": "ミュート解除", - "xpack.triggersActionsUI.sections.alertsList.dismissBunnerButtonLabel": "閉じる", - "xpack.triggersActionsUI.sections.alertsList.fixLicenseLink": "修正", - "xpack.triggersActionsUI.sections.alertsList.multipleTitle": "ルール", - "xpack.triggersActionsUI.sections.alertsList.noPermissionToCreateDescription": "システム管理者にお問い合わせください。", - "xpack.triggersActionsUI.sections.alertsList.noPermissionToCreateTitle": "ルールを作成する権限がありません", - "xpack.triggersActionsUI.sections.alertsList.refreshAlertsButtonLabel": "更新", - "xpack.triggersActionsUI.sections.alertsList.resetDefaultIndexLabel": "デフォルトのインデックスをリセット", - "xpack.triggersActionsUI.sections.alertsList.ruleTypeExcessDurationMessage": "期間がルールの想定実行時間を超えています。", - "xpack.triggersActionsUI.sections.alertsList.searchPlaceholderTitle": "検索", - "xpack.triggersActionsUI.sections.alertsList.singleTitle": "ルール", - "xpack.triggersActionsUI.sections.alertsList.totalItemsCountDescription": "{pageSize}/{totalItemCount}件のルールを表示しています。", - "xpack.triggersActionsUI.sections.alertsList.totalStatusesActiveDescription": "アクティブ:{totalStatusesActive}", - "xpack.triggersActionsUI.sections.alertsList.totalStatusesErrorDescription": "エラー:{totalStatusesError}", - "xpack.triggersActionsUI.sections.alertsList.totalStatusesOkDescription": "Ok:{totalStatusesOk}", - "xpack.triggersActionsUI.sections.alertsList.totalStatusesPendingDescription": "保留:{totalStatusesPending}", - "xpack.triggersActionsUI.sections.alertsList.typeFilterLabel": "型", - "xpack.triggersActionsUI.sections.alertsList.unableToLoadConnectorTypesMessage": "コネクタータイプを読み込めません", - "xpack.triggersActionsUI.sections.alertsList.unableToLoadRulesMessage": "ルールを読み込めません", - "xpack.triggersActionsUI.sections.alertsList.unableToLoadRuleStatusInfoMessage": "ルールステータス情報を読み込めません", - "xpack.triggersActionsUI.sections.alertsList.unableToLoadRuleTypesMessage": "ルールタイプを読み込めません", - "xpack.triggersActionsUI.sections.alertsList.viewBunnerButtonLabel": "表示", + "xpack.triggersActionsUI.sections.ruleAdd.flyoutTitle": "ルールを作成", + "xpack.triggersActionsUI.sections.ruleAdd.indexControls.timeFieldOptionLabel": "フィールドを選択", + "xpack.triggersActionsUI.sections.ruleAdd.operationName": "作成", + "xpack.triggersActionsUI.sections.ruleAdd.saveErrorNotificationText": "ルールを作成できません。", + "xpack.triggersActionsUI.sections.ruleAdd.saveSuccessNotificationText": "ルール\"{ruleName}\"を作成しました", + "xpack.triggersActionsUI.sections.ruleAddFooter.cancelButtonLabel": "キャンセル", + "xpack.triggersActionsUI.sections.ruleAddFooter.saveButtonLabel": "保存", + "xpack.triggersActionsUI.sections.ruleDetails.actionWithBrokenConnectorWarningBannerEditText": "ルールを編集", + "xpack.triggersActionsUI.sections.ruleDetails.actionWithBrokenConnectorWarningBannerTitle": "このルールに関連付けられたコネクターの1つで問題が発生しています。", + "xpack.triggersActionsUI.sections.ruleDetails.ruleDetailsTitle": "{ruleName}", + "xpack.triggersActionsUI.sections.ruleDetails.alertInstances.disabledRule": "このルールは無効になっていて再表示できません。", + "xpack.triggersActionsUI.sections.ruleDetails.alertInstances.disabledRuleTitle": "無効なルール", + "xpack.triggersActionsUI.sections.ruleDetails.collapsedItemActons.enableLoadingTitle": "有効にする", + "xpack.triggersActionsUI.sections.ruleDetails.collapsedItemActons.enableTitle": "有効にする", + "xpack.triggersActionsUI.sections.ruleDetails.collapsedItemActons.muteLoadingTitle": "ミュート", + "xpack.triggersActionsUI.sections.ruleDetails.collapsedItemActons.muteTitle": "ミュート", + "xpack.triggersActionsUI.sections.ruleDetails.dismissButtonTitle": "閉じる", + "xpack.triggersActionsUI.sections.ruleDetails.editRuleButtonLabel": "編集", + "xpack.triggersActionsUI.sections.ruleDetails.manageLicensePlanBannerLinkTitle": "ライセンスの管理", + "xpack.triggersActionsUI.sections.ruleDetails.redirectObjectNoun": "ルール", + "xpack.triggersActionsUI.sections.ruleDetails.unableToLoadRuleMessage": "ルールを読み込めません:{message}", + "xpack.triggersActionsUI.sections.ruleDetails.unableToLoadRulesMessage": "アラートを読み込めません:{message}", + "xpack.triggersActionsUI.sections.ruleDetails.viewRuleInAppButtonLabel": "アプリで表示", + "xpack.triggersActionsUI.sections.ruleEdit.cancelButtonLabel": "キャンセル", + "xpack.triggersActionsUI.sections.ruleEdit.disabledActionsWarningTitle": "このアラートには無効なアクションがあります", + "xpack.triggersActionsUI.sections.ruleEdit.flyoutTitle": "ルールを編集", + "xpack.triggersActionsUI.sections.ruleEdit.saveButtonLabel": "保存", + "xpack.triggersActionsUI.sections.ruleEdit.saveErrorNotificationText": "ルールを更新できません", + "xpack.triggersActionsUI.sections.ruleEdit.saveSuccessNotificationText": "'{ruleName}'を更新しました", + "xpack.triggersActionsUI.sections.ruleForm.ruleNameLabel": "名前", + "xpack.triggersActionsUI.sections.ruleForm.ruleNotifyWhen.label": "毎", + "xpack.triggersActionsUI.sections.ruleForm.ruleNotifyWhen.onActionGroupChange.description": "アラートステータスが変更されるときにアクションを実行します。", + "xpack.triggersActionsUI.sections.ruleForm.ruleNotifyWhen.onActionGroupChange.display": "ステータス変更時のみ", + "xpack.triggersActionsUI.sections.ruleForm.ruleNotifyWhen.onActionGroupChange.label": "ステータス変更時のみ", + "xpack.triggersActionsUI.sections.ruleForm.ruleNotifyWhen.onActiveAlert.description": "アラートがアクティブなときは、ルール間隔でアクションが繰り返されます。", + "xpack.triggersActionsUI.sections.ruleForm.ruleNotifyWhen.onActiveAlert.display": "アラートがアクティブになるたびに実行", + "xpack.triggersActionsUI.sections.ruleForm.ruleNotifyWhen.onActiveAlert.label": "アラートがアクティブになるたびに実行", + "xpack.triggersActionsUI.sections.ruleForm.ruleNotifyWhen.onThrottleInterval.description": "設定した間隔を使用してアクションを実行します。", + "xpack.triggersActionsUI.sections.ruleForm.ruleNotifyWhen.onThrottleInterval.display": "カスタムアクション間隔", + "xpack.triggersActionsUI.sections.ruleForm.ruleNotifyWhen.onThrottleInterval.label": "カスタムアクション間隔", + "xpack.triggersActionsUI.sections.ruleForm.changeRuleTypeAriaLabel": "削除", + "xpack.triggersActionsUI.sections.ruleForm.checkFieldLabel": "確認間隔", + "xpack.triggersActionsUI.sections.ruleForm.checkWithTooltip": "条件を評価する頻度を定義します。", + "xpack.triggersActionsUI.sections.ruleForm.conditions.addConditionLabel": "追加:", + "xpack.triggersActionsUI.sections.ruleForm.conditions.removeConditionLabel": "削除", + "xpack.triggersActionsUI.sections.ruleForm.conditions.title": "条件:", + "xpack.triggersActionsUI.sections.ruleForm.documentationLabel": "ドキュメント", + "xpack.triggersActionsUI.sections.ruleForm.error.belowMinimumText": "間隔はこのルールタイプの最小値({minimum})未満です", + "xpack.triggersActionsUI.sections.ruleForm.error.noAuthorizedRuleTypes": "ルールを{operation}するには、適切な権限が付与されている必要があります。", + "xpack.triggersActionsUI.sections.ruleForm.error.noAuthorizedRuleTypesTitle": "ルールタイプを{operation}する権限がありません。", + "xpack.triggersActionsUI.sections.ruleForm.error.requiredActionConnector": "{actionTypeId}コネクターのアクションが必要です。", + "xpack.triggersActionsUI.sections.ruleForm.error.requiredIntervalText": "確認間隔が必要です。", + "xpack.triggersActionsUI.sections.ruleForm.error.requiredNameText": "名前が必要です。", + "xpack.triggersActionsUI.sections.ruleForm.error.requiredRuleTypeIdText": "ルールタイプは必須です。", + "xpack.triggersActionsUI.sections.ruleForm.loadingRuleTypeParamsDescription": "ルールタイプパラメーターを読み込んでいます…", + "xpack.triggersActionsUI.sections.ruleForm.loadingRuleTypesDescription": "ルールタイプを読み込んでいます…", + "xpack.triggersActionsUI.sections.ruleForm.renotifyFieldLabel": "通知", + "xpack.triggersActionsUI.sections.ruleForm.renotifyWithTooltip": "ルールがアクティブな間にアクションを繰り返す頻度を定義します。", + "xpack.triggersActionsUI.sections.ruleForm.ruleTypeSelectLabel": "ルールタイプを選択", + "xpack.triggersActionsUI.sections.ruleForm.searchPlaceholderTitle": "検索", + "xpack.triggersActionsUI.sections.ruleForm.solutionFilterLabel": "ユースケースでフィルタリング", + "xpack.triggersActionsUI.sections.ruleForm.tagsFieldLabel": "タグ(任意)", + "xpack.triggersActionsUI.sections.ruleForm.unableToLoadRuleTypesMessage": "ルールタイプを読み込めません", + "xpack.triggersActionsUI.sections.rulesList.actionTypeFilterLabel": "アクションタイプ", + "xpack.triggersActionsUI.sections.rulesList.addRuleButtonLabel": "ルールを作成", + "xpack.triggersActionsUI.sections.rulesList.ruleErrorReasonDecrypting": "ルールの復号中にエラーが発生しました。", + "xpack.triggersActionsUI.sections.rulesList.ruleErrorReasonLicense": "ルールを実行できません", + "xpack.triggersActionsUI.sections.rulesList.ruleErrorReasonReading": "ルールの読み取り中にエラーが発生しました。", + "xpack.triggersActionsUI.sections.rulesList.ruleErrorReasonRunning": "ルールの実行中にエラーが発生しました。", + "xpack.triggersActionsUI.sections.rulesList.ruleErrorReasonUnknown": "不明な理由でエラーが発生しました。", + "xpack.triggersActionsUI.sections.rulesList.rulesListTable.columns.actionsTex": "アクション", + "xpack.triggersActionsUI.sections.rulesList.rulesListTable.columns.actionsWarningTooltip": "このルールに関連付けられたコネクターの1つを読み込めません。ルールを編集して、新しいコネクターを選択します。", + "xpack.triggersActionsUI.sections.rulesList.rulesListTable.columns.ruleTypeTitle": "型", + "xpack.triggersActionsUI.sections.rulesList.rulesListTable.columns.deleteAriaLabel": "削除", + "xpack.triggersActionsUI.sections.rulesList.rulesListTable.columns.deleteButtonTooltip": "削除", + "xpack.triggersActionsUI.sections.rulesList.rulesListTable.columns.durationTitle": "ルールを実行するのにかかる時間。", + "xpack.triggersActionsUI.sections.rulesList.rulesListTable.columns.editAriaLabel": "編集", + "xpack.triggersActionsUI.sections.rulesList.rulesListTable.columns.editButtonTooltip": "編集", + "xpack.triggersActionsUI.sections.rulesList.rulesListTable.columns.enabledTitle": "有効", + "xpack.triggersActionsUI.sections.rulesList.rulesListTable.columns.lastExecutionDateTitle": "前回の実行の開始時間。", + "xpack.triggersActionsUI.sections.rulesList.rulesListTable.columns.mutedBadge": "ミュート", + "xpack.triggersActionsUI.sections.rulesList.rulesListTable.columns.nameTitle": "名前", + "xpack.triggersActionsUI.sections.rulesList.rulesListTable.columns.scheduleTitle": "間隔", + "xpack.triggersActionsUI.sections.rulesList.rulesListTable.columns.statusTitle": "ステータス", + "xpack.triggersActionsUI.sections.rulesList.ruleStatusActive": "アクティブ", + "xpack.triggersActionsUI.sections.rulesList.ruleStatusError": "エラー", + "xpack.triggersActionsUI.sections.rulesList.ruleStatusFilterLabel": "ステータス", + "xpack.triggersActionsUI.sections.rulesList.ruleStatusLicenseError": "ライセンスエラー", + "xpack.triggersActionsUI.sections.rulesList.ruleStatusOk": "OK", + "xpack.triggersActionsUI.sections.rulesList.ruleStatusPending": "保留中", + "xpack.triggersActionsUI.sections.rulesList.ruleStatusUnknown": "不明", + "xpack.triggersActionsUI.sections.rulesList.bulkActionPopover.buttonTitle": "ルールの管理", + "xpack.triggersActionsUI.sections.rulesList.bulkActionPopover.deleteAllTitle": "削除", + "xpack.triggersActionsUI.sections.rulesList.bulkActionPopover.disableAllTitle": "無効にする", + "xpack.triggersActionsUI.sections.rulesList.bulkActionPopover.enableAllTitle": "有効にする", + "xpack.triggersActionsUI.sections.rulesList.bulkActionPopover.failedToDeleteRulesMessage": "ルールを削除できませんでした", + "xpack.triggersActionsUI.sections.rulesList.bulkActionPopover.failedToDisableRulesMessage": "ルールを無効にできませんでした", + "xpack.triggersActionsUI.sections.rulesList.bulkActionPopover.failedToEnableRulesMessage": "ルールを有効にできませんでした", + "xpack.triggersActionsUI.sections.rulesList.bulkActionPopover.failedToMuteRulesMessage": "ルールをミュートできませんでした", + "xpack.triggersActionsUI.sections.rulesList.bulkActionPopover.failedToUnmuteRulesMessage": "ルールをミュート解除できませんでした", + "xpack.triggersActionsUI.sections.rulesList.bulkActionPopover.muteAllTitle": "ミュート", + "xpack.triggersActionsUI.sections.rulesList.bulkActionPopover.unmuteAllTitle": "ミュート解除", + "xpack.triggersActionsUI.sections.rulesList.collapsedItemActons.deleteRuleTitle": "ルールの削除", + "xpack.triggersActionsUI.sections.rulesList.collapsedItemActons.disableTitle": "無効にする", + "xpack.triggersActionsUI.sections.rulesList.collapsedItemActons.editTitle": "ルールを編集", + "xpack.triggersActionsUI.sections.rulesList.collapsedItemActons.enableTitle": "有効にする", + "xpack.triggersActionsUI.sections.rulesList.collapsedItemActons.muteTitle": "ミュート", + "xpack.triggersActionsUI.sections.rulesList.collapsedItemActons.popoverButtonTitle": "アクション", + "xpack.triggersActionsUI.sections.rulesList.collapsedItemActons.unmuteTitle": "ミュート解除", + "xpack.triggersActionsUI.sections.rulesList.dismissBunnerButtonLabel": "閉じる", + "xpack.triggersActionsUI.sections.rulesList.fixLicenseLink": "修正", + "xpack.triggersActionsUI.sections.rulesList.multipleTitle": "ルール", + "xpack.triggersActionsUI.sections.rulesList.noPermissionToCreateDescription": "システム管理者にお問い合わせください。", + "xpack.triggersActionsUI.sections.rulesList.noPermissionToCreateTitle": "ルールを作成する権限がありません", + "xpack.triggersActionsUI.sections.rulesList.refreshRulesButtonLabel": "更新", + "xpack.triggersActionsUI.sections.rulesList.resetDefaultIndexLabel": "デフォルトのインデックスをリセット", + "xpack.triggersActionsUI.sections.rulesList.ruleTypeExcessDurationMessage": "期間がルールの想定実行時間を超えています。", + "xpack.triggersActionsUI.sections.rulesList.searchPlaceholderTitle": "検索", + "xpack.triggersActionsUI.sections.rulesList.singleTitle": "ルール", + "xpack.triggersActionsUI.sections.rulesList.totalItemsCountDescription": "{pageSize}/{totalItemCount}件のルールを表示しています。", + "xpack.triggersActionsUI.sections.rulesList.totalStatusesActiveDescription": "アクティブ:{totalStatusesActive}", + "xpack.triggersActionsUI.sections.rulesList.totalStatusesErrorDescription": "エラー:{totalStatusesError}", + "xpack.triggersActionsUI.sections.rulesList.totalStatusesOkDescription": "Ok:{totalStatusesOk}", + "xpack.triggersActionsUI.sections.rulesList.totalStatusesPendingDescription": "保留:{totalStatusesPending}", + "xpack.triggersActionsUI.sections.rulesList.typeFilterLabel": "型", + "xpack.triggersActionsUI.sections.rulesList.unableToLoadConnectorTypesMessage": "コネクタータイプを読み込めません", + "xpack.triggersActionsUI.sections.rulesList.unableToLoadRulesMessage": "ルールを読み込めません", + "xpack.triggersActionsUI.sections.rulesList.unableToLoadRuleStatusInfoMessage": "ルールステータス情報を読み込めません", + "xpack.triggersActionsUI.sections.rulesList.unableToLoadRuleTypesMessage": "ルールタイプを読み込めません", + "xpack.triggersActionsUI.sections.rulesList.viewBunnerButtonLabel": "表示", "xpack.triggersActionsUI.sections.builtinActionTypes.emailAction.addBccButton": "Bcc", "xpack.triggersActionsUI.sections.builtinActionTypes.emailAction.addCcButton": "Cc", "xpack.triggersActionsUI.sections.builtinActionTypes.emailAction.authenticationLabel": "認証", @@ -28211,20 +28195,20 @@ "xpack.triggersActionsUI.sections.builtinActionTypes.emailAction.subjectTextFieldLabel": "件名", "xpack.triggersActionsUI.sections.builtinActionTypes.emailAction.tenantIdFieldLabel": "テナントID", "xpack.triggersActionsUI.sections.builtinActionTypes.emailAction.userTextFieldLabel": "ユーザー名", - "xpack.triggersActionsUI.sections.confirmAlertClose.confirmAlertCloseCancelButtonText": "キャンセル", - "xpack.triggersActionsUI.sections.confirmAlertClose.confirmAlertCloseConfirmButtonText": "変更を破棄", - "xpack.triggersActionsUI.sections.confirmAlertClose.confirmAlertCloseMessage": "保存されていない変更は回復できません。", - "xpack.triggersActionsUI.sections.confirmAlertClose.confirmAlertCloseTitle": "ルールの保存されていない変更を破棄しますか?", - "xpack.triggersActionsUI.sections.confirmAlertSave.confirmAlertSaveCancelButtonText": "キャンセル", - "xpack.triggersActionsUI.sections.confirmAlertSave.confirmAlertSaveConfirmButtonText": "ルールを保存", - "xpack.triggersActionsUI.sections.confirmAlertSave.confirmAlertSaveTitle": "アクションがないルールを保存しますか?", - "xpack.triggersActionsUI.sections.confirmAlertSave.confirmAlertSaveWithoutActionsMessage": "いつでもアクションを追加できます。", + "xpack.triggersActionsUI.sections.confirmRuleClose.confirmRuleCloseCancelButtonText": "キャンセル", + "xpack.triggersActionsUI.sections.confirmRuleClose.confirmRuleCloseConfirmButtonText": "変更を破棄", + "xpack.triggersActionsUI.sections.confirmRuleClose.confirmRuleCloseMessage": "保存されていない変更は回復できません。", + "xpack.triggersActionsUI.sections.confirmRuleClose.confirmRuleCloseTitle": "ルールの保存されていない変更を破棄しますか?", + "xpack.triggersActionsUI.sections.confirmRuleSave.confirmRuleSaveCancelButtonText": "キャンセル", + "xpack.triggersActionsUI.sections.confirmRuleSave.confirmRuleSaveConfirmButtonText": "ルールを保存", + "xpack.triggersActionsUI.sections.confirmRuleSave.confirmRuleSaveTitle": "アクションがないルールを保存しますか?", + "xpack.triggersActionsUI.sections.confirmRuleSave.confirmRuleSaveWithoutActionsMessage": "いつでもアクションを追加できます。", "xpack.triggersActionsUI.sections.connectorAddInline.accordion.deleteIconAriaLabel": "削除", "xpack.triggersActionsUI.sections.connectorAddInline.addConnectorButtonLabel": "コネクターを作成する", "xpack.triggersActionsUI.sections.connectorAddInline.connectorAddInline.actionIdLabel": "別の{connectorInstance}コネクターを使用", "xpack.triggersActionsUI.sections.connectorAddInline.connectorAddInline.addNewConnectorEmptyButton": "コネクターの追加", "xpack.triggersActionsUI.sections.connectorAddInline.emptyConnectorsLabel": "{actionTypeName}コネクターがありません", - "xpack.triggersActionsUI.sections.connectorAddInline.newAlertActionTypeEditTitle": "{actionConnectorName}", + "xpack.triggersActionsUI.sections.connectorAddInline.newRuleActionTypeEditTitle": "{actionConnectorName}", "xpack.triggersActionsUI.sections.connectorAddInline.unableToLoadConnectorTitle": "コネクターを読み込めません", "xpack.triggersActionsUI.sections.connectorAddInline.unableToLoadConnectorTitle'": "コネクターを読み込めません", "xpack.triggersActionsUI.sections.connectorAddInline.unauthorizedToCreateForEmptyConnectors": "許可されたユーザーのみがコネクターを構成できます。管理者にお問い合わせください。", @@ -28248,7 +28232,7 @@ "xpack.triggersActionsUI.sections.isDeprecatedDescription": "このコネクターは廃止予定です。更新するか新しく作成してください。", "xpack.triggersActionsUI.sections.manageLicense.manageLicenseCancelButtonText": "キャンセル", "xpack.triggersActionsUI.sections.manageLicense.manageLicenseConfirmButtonText": "ライセンスの管理", - "xpack.triggersActionsUI.sections.manageLicense.manageLicenseMessage": "ルールタイプ{alertTypeId}は無効です。{licenseRequired}ライセンスが必要です。アップグレードオプションを表示するには、[ライセンス管理]に移動してください。", + "xpack.triggersActionsUI.sections.manageLicense.manageLicenseMessage": "ルールタイプ{ruleTypeId}は無効です。{licenseRequired}ライセンスが必要です。アップグレードオプションを表示するには、[ライセンス管理]に移動してください。", "xpack.triggersActionsUI.sections.manageLicense.manageLicenseTitle": "{licenseRequired}ライセンスが必要です", "xpack.triggersActionsUI.sections.preconfiguredConnectorForm.flyoutTitle": "{connectorName}", "xpack.triggersActionsUI.sections.preconfiguredConnectorForm.tooltipContent": "このコネクターはあらかじめ構成されているため、編集できません。", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 8efa16af5e1c3..afdf5b7561bc4 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -27631,7 +27631,7 @@ "xpack.triggersActionsUI.cases.configureCases.mappingFieldSummary": "摘要", "xpack.triggersActionsUI.checkActionTypeEnabled.actionTypeDisabledByConfigMessage": "连接器已由 Kibana 配置禁用。", "xpack.triggersActionsUI.checkActionTypeEnabled.actionTypeDisabledByLicenseMessage": "此连接器需要{minimumLicenseRequired}许可证。", - "xpack.triggersActionsUI.checkAlertTypeEnabled.ruleTypeDisabledByLicenseMessage": "此规则类型需要{minimumLicenseRequired}许可证。", + "xpack.triggersActionsUI.checkRuleTypeEnabled.ruleTypeDisabledByLicenseMessage": "此规则类型需要{minimumLicenseRequired}许可证。", "xpack.triggersActionsUI.common.constants.comparators.groupByTypes.allDocumentsLabel": "所有文档", "xpack.triggersActionsUI.common.constants.comparators.groupByTypes.topLabel": "排名前", "xpack.triggersActionsUI.common.constants.comparators.isAboveLabel": "高于", @@ -28078,153 +28078,138 @@ "xpack.triggersActionsUI.sections.addModalConnectorForm.flyoutTitle": "{actionTypeName} 连接器", "xpack.triggersActionsUI.sections.addModalConnectorForm.saveButtonLabel": "保存", "xpack.triggersActionsUI.sections.addModalConnectorForm.updateSuccessNotificationText": "已创建“{connectorName}”", - "xpack.triggersActionsUI.sections.alertAdd.flyoutTitle": "创建规则", - "xpack.triggersActionsUI.sections.alertAdd.indexControls.timeFieldOptionLabel": "选择字段", - "xpack.triggersActionsUI.sections.alertAdd.operationName": "创建", - "xpack.triggersActionsUI.sections.alertAdd.saveErrorNotificationText": "无法创建规则。", - "xpack.triggersActionsUI.sections.alertAdd.saveSuccessNotificationText": "已创建规则“{ruleName}”", - "xpack.triggersActionsUI.sections.alertAddFooter.cancelButtonLabel": "取消", - "xpack.triggersActionsUI.sections.alertAddFooter.saveButtonLabel": "保存", - "xpack.triggersActionsUI.sections.alertDetails.actionWithBrokenConnectorWarningBannerEditText": "编辑规则", - "xpack.triggersActionsUI.sections.alertDetails.actionWithBrokenConnectorWarningBannerTitle": "与此规则关联的连接器之一出现问题。", - "xpack.triggersActionsUI.sections.alertDetails.alertDetailsTitle": "{alertName}", - "xpack.triggersActionsUI.sections.alertDetails.alertInstances.disabledRule": "此规则已禁用,无法显示。", - "xpack.triggersActionsUI.sections.alertDetails.alerts.disabledRuleTitle": "已禁用规则", - "xpack.triggersActionsUI.sections.alertDetails.alertsList.avgDurationDescription": "平均持续时间", - "xpack.triggersActionsUI.sections.alertDetails.alertsList.columns.alert": "告警", - "xpack.triggersActionsUI.sections.alertDetails.alertsList.columns.duration": "持续时间", - "xpack.triggersActionsUI.sections.alertDetails.alertsList.columns.mute": "静音", - "xpack.triggersActionsUI.sections.alertDetails.alertsList.columns.start": "启动", - "xpack.triggersActionsUI.sections.alertDetails.alertsList.columns.status": "状态", - "xpack.triggersActionsUI.sections.alertDetails.alertsList.ruleLastExecutionDescription": "上次响应", - "xpack.triggersActionsUI.sections.alertDetails.alertsList.ruleTypeExcessDurationMessage": "持续时间超出了规则的预期运行时间。", - "xpack.triggersActionsUI.sections.alertDetails.alertsList.status.active": "活动", - "xpack.triggersActionsUI.sections.alertDetails.alertsList.status.inactive": "已恢复", - "xpack.triggersActionsUI.sections.alertDetails.collapsedItemActons.enableLoadingTitle": "启用", - "xpack.triggersActionsUI.sections.alertDetails.collapsedItemActons.enableTitle": "启用", - "xpack.triggersActionsUI.sections.alertDetails.collapsedItemActons.muteLoadingTitle": "静音", - "xpack.triggersActionsUI.sections.alertDetails.collapsedItemActons.muteTitle": "静音", - "xpack.triggersActionsUI.sections.alertDetails.dismissButtonTitle": "关闭", - "xpack.triggersActionsUI.sections.alertDetails.editAlertButtonLabel": "编辑", - "xpack.triggersActionsUI.sections.alertDetails.manageLicensePlanBannerLinkTitle": "管理许可证", - "xpack.triggersActionsUI.sections.alertDetails.redirectObjectNoun": "规则", - "xpack.triggersActionsUI.sections.alertDetails.unableToLoadAlertMessage": "无法加载规则:{message}", - "xpack.triggersActionsUI.sections.alertDetails.unableToLoadAlertsMessage": "无法加载告警:{message}", - "xpack.triggersActionsUI.sections.alertDetails.viewAlertInAppButtonLabel": "在应用中查看", - "xpack.triggersActionsUI.sections.alertEdit.cancelButtonLabel": "取消", - "xpack.triggersActionsUI.sections.alertEdit.disabledActionsWarningTitle": "此规则具有已禁用的操作", - "xpack.triggersActionsUI.sections.alertEdit.flyoutTitle": "编辑规则", - "xpack.triggersActionsUI.sections.alertEdit.saveButtonLabel": "保存", - "xpack.triggersActionsUI.sections.alertEdit.saveErrorNotificationText": "无法更新规则。", - "xpack.triggersActionsUI.sections.alertEdit.saveSuccessNotificationText": "已更新“{ruleName}”", - "xpack.triggersActionsUI.sections.alertForm.alertNameLabel": "名称", - "xpack.triggersActionsUI.sections.alertForm.alertNotifyWhen.label": "每", - "xpack.triggersActionsUI.sections.alertForm.alertNotifyWhen.onActionGroupChange.description": "操作在告警状态更改时运行。", - "xpack.triggersActionsUI.sections.alertForm.alertNotifyWhen.onActionGroupChange.display": "仅在状态更改时", - "xpack.triggersActionsUI.sections.alertForm.alertNotifyWhen.onActionGroupChange.label": "仅在状态更改时", - "xpack.triggersActionsUI.sections.alertForm.alertNotifyWhen.onActiveAlert.description": "告警活动时,操作按规则时间间隔重复。", - "xpack.triggersActionsUI.sections.alertForm.alertNotifyWhen.onActiveAlert.display": "每次告警处于活动状态时", - "xpack.triggersActionsUI.sections.alertForm.alertNotifyWhen.onActiveAlert.label": "每次告警处于活动状态时", - "xpack.triggersActionsUI.sections.alertForm.alertNotifyWhen.onThrottleInterval.description": "操作按照您设置的时间间隔运行。", - "xpack.triggersActionsUI.sections.alertForm.alertNotifyWhen.onThrottleInterval.display": "按定制操作时间间隔", - "xpack.triggersActionsUI.sections.alertForm.alertNotifyWhen.onThrottleInterval.label": "按定制操作时间间隔", - "xpack.triggersActionsUI.sections.alertForm.changeAlertTypeAriaLabel": "删除", - "xpack.triggersActionsUI.sections.alertForm.checkFieldLabel": "检查频率", - "xpack.triggersActionsUI.sections.alertForm.checkWithTooltip": "定义评估条件的频率。检查已排队;它们的运行接近于容量允许的定义值。", - "xpack.triggersActionsUI.sections.alertForm.conditions.addConditionLabel": "添加:", - "xpack.triggersActionsUI.sections.alertForm.conditions.removeConditionLabel": "移除", - "xpack.triggersActionsUI.sections.alertForm.conditions.title": "条件:", - "xpack.triggersActionsUI.sections.alertForm.documentationLabel": "文档", - "xpack.triggersActionsUI.sections.alertForm.error.belowMinimumText": "时间间隔小于此规则类型的最小值 ({minimum})", - "xpack.triggersActionsUI.sections.alertForm.error.noAuthorizedRuleTypes": "为了{operation}规则,您需要获得相应的权限。", - "xpack.triggersActionsUI.sections.alertForm.error.noAuthorizedRuleTypesTitle": "您尚无权{operation}任何规则类型", - "xpack.triggersActionsUI.sections.alertForm.error.requiredActionConnector": "“{actionTypeId} 连接器的操作”必填。", - "xpack.triggersActionsUI.sections.alertForm.error.requiredIntervalText": "“检查时间间隔”必填。", - "xpack.triggersActionsUI.sections.alertForm.error.requiredNameText": "“名称”必填。", - "xpack.triggersActionsUI.sections.alertForm.error.requiredRuleTypeIdText": "“规则类型”必填。", - "xpack.triggersActionsUI.sections.alertForm.loadingRuleTypeParamsDescription": "正在加载规则类型参数……", - "xpack.triggersActionsUI.sections.alertForm.loadingRuleTypesDescription": "正在加载规则类型……", - "xpack.triggersActionsUI.sections.alertForm.renotifyFieldLabel": "通知", - "xpack.triggersActionsUI.sections.alertForm.renotifyWithTooltip": "定义规则处于活动状态时重复操作的频率。", - "xpack.triggersActionsUI.sections.alertForm.ruleTypeSelectLabel": "选择规则类型", - "xpack.triggersActionsUI.sections.alertForm.searchPlaceholderTitle": "搜索", - "xpack.triggersActionsUI.sections.alertForm.solutionFilterLabel": "按用例筛选", - "xpack.triggersActionsUI.sections.alertForm.tagsFieldLabel": "标签(可选)", - "xpack.triggersActionsUI.sections.alertForm.unableToLoadRuleTypesMessage": "无法加载规则类型", - "xpack.triggersActionsUI.sections.alertsList.actionTypeFilterLabel": "操作类型", - "xpack.triggersActionsUI.sections.alertsList.addRuleButtonLabel": "创建规则", - "xpack.triggersActionsUI.sections.alertsList.alertErrorReasonDecrypting": "解密规则时发生错误。", - "xpack.triggersActionsUI.sections.alertsList.alertErrorReasonDisabled": "无法执行规则,因为在规则禁用之后已运行。", - "xpack.triggersActionsUI.sections.alertsList.alertErrorReasonLicense": "无法运行规则", - "xpack.triggersActionsUI.sections.alertsList.alertErrorReasonReading": "读取规则时发生错误。", - "xpack.triggersActionsUI.sections.alertsList.alertErrorReasonRunning": "运行规则时发生错误。", - "xpack.triggersActionsUI.sections.alertsList.alertErrorReasonTimeout": "由于超时,规则执行已取消。", - "xpack.triggersActionsUI.sections.alertsList.alertErrorReasonUnknown": "由于未知原因发生错误。", - "xpack.triggersActionsUI.sections.alertsList.alertsListTable.columns.actionsTex": "操作", - "xpack.triggersActionsUI.sections.alertsList.alertsListTable.columns.actionsWarningTooltip": "无法加载与此规则关联的连接器之一。请编辑该规则以选择新连接器。", - "xpack.triggersActionsUI.sections.alertsList.alertsListTable.columns.alertTypeTitle": "类型", - "xpack.triggersActionsUI.sections.alertsList.alertsListTable.columns.deleteAriaLabel": "删除", - "xpack.triggersActionsUI.sections.alertsList.alertsListTable.columns.deleteButtonTooltip": "删除", - "xpack.triggersActionsUI.sections.alertsList.alertsListTable.columns.durationTitle": "运行规则所需的时间长度。", - "xpack.triggersActionsUI.sections.alertsList.alertsListTable.columns.editAriaLabel": "编辑", - "xpack.triggersActionsUI.sections.alertsList.alertsListTable.columns.editButtonTooltip": "编辑", - "xpack.triggersActionsUI.sections.alertsList.alertsListTable.columns.enabledTitle": "已启用", - "xpack.triggersActionsUI.sections.alertsList.alertsListTable.columns.lastExecutionDateTitle": "上次执行的开始时间。", - "xpack.triggersActionsUI.sections.alertsList.alertsListTable.columns.mutedBadge": "已静音", - "xpack.triggersActionsUI.sections.alertsList.alertsListTable.columns.nameTitle": "名称", - "xpack.triggersActionsUI.sections.alertsList.alertsListTable.columns.ruleExecutionPercentileSelectButton": "选择百分位数", - "xpack.triggersActionsUI.sections.alertsList.alertsListTable.columns.ruleExecutionPercentileTooltip": "此规则过去的 {sampleLimit} 执行持续时间的第 {percentileOrdinal} 个百分位", - "xpack.triggersActionsUI.sections.alertsList.alertsListTable.columns.scheduleTitle": "时间间隔", - "xpack.triggersActionsUI.sections.alertsList.alertsListTable.columns.statusTitle": "状态", - "xpack.triggersActionsUI.sections.alertsList.alertsListTable.columns.successRatioTitle": "成功执行此规则的频率", - "xpack.triggersActionsUI.sections.alertsList.alertStatusActive": "活动", - "xpack.triggersActionsUI.sections.alertsList.alertStatusError": "错误", - "xpack.triggersActionsUI.sections.alertsList.alertStatusFilterLabel": "状态", - "xpack.triggersActionsUI.sections.alertsList.alertStatusLicenseError": "许可证错误", - "xpack.triggersActionsUI.sections.alertsList.alertStatusOk": "确定", - "xpack.triggersActionsUI.sections.alertsList.alertStatusPending": "待处理", - "xpack.triggersActionsUI.sections.alertsList.alertStatusUnknown": "未知", - "xpack.triggersActionsUI.sections.alertsList.attentionBannerTitle": "{totalStatusesError, plural, other {# 个规则}}中出现错误。", - "xpack.triggersActionsUI.sections.alertsList.bulkActionPopover.buttonTitle": "管理规则", - "xpack.triggersActionsUI.sections.alertsList.bulkActionPopover.deleteAllTitle": "删除", - "xpack.triggersActionsUI.sections.alertsList.bulkActionPopover.disableAllTitle": "禁用", - "xpack.triggersActionsUI.sections.alertsList.bulkActionPopover.enableAllTitle": "启用", - "xpack.triggersActionsUI.sections.alertsList.bulkActionPopover.failedToDeleteRulesMessage": "无法删除规则", - "xpack.triggersActionsUI.sections.alertsList.bulkActionPopover.failedToDisableRulesMessage": "无法禁用规则", - "xpack.triggersActionsUI.sections.alertsList.bulkActionPopover.failedToEnableRulesMessage": "无法启用规则", - "xpack.triggersActionsUI.sections.alertsList.bulkActionPopover.failedToMuteRulesMessage": "无法静音规则", - "xpack.triggersActionsUI.sections.alertsList.bulkActionPopover.failedToUnmuteRulesMessage": "无法取消静音规则", - "xpack.triggersActionsUI.sections.alertsList.bulkActionPopover.muteAllTitle": "静音", - "xpack.triggersActionsUI.sections.alertsList.bulkActionPopover.unmuteAllTitle": "取消静音", - "xpack.triggersActionsUI.sections.alertsList.collapsedItemActons.deleteRuleTitle": "删除规则", - "xpack.triggersActionsUI.sections.alertsList.collapsedItemActons.disableTitle": "禁用", - "xpack.triggersActionsUI.sections.alertsList.collapsedItemActons.editTitle": "编辑规则", - "xpack.triggersActionsUI.sections.alertsList.collapsedItemActons.enableTitle": "启用", - "xpack.triggersActionsUI.sections.alertsList.collapsedItemActons.muteTitle": "静音", - "xpack.triggersActionsUI.sections.alertsList.collapsedItemActons.popoverButtonTitle": "操作", - "xpack.triggersActionsUI.sections.alertsList.collapsedItemActons.unmuteTitle": "取消静音", - "xpack.triggersActionsUI.sections.alertsList.dismissBunnerButtonLabel": "关闭", - "xpack.triggersActionsUI.sections.alertsList.fixLicenseLink": "修复", - "xpack.triggersActionsUI.sections.alertsList.multipleTitle": "规则", - "xpack.triggersActionsUI.sections.alertsList.noPermissionToCreateDescription": "请联系您的系统管理员。", - "xpack.triggersActionsUI.sections.alertsList.noPermissionToCreateTitle": "没有创建规则的权限", - "xpack.triggersActionsUI.sections.alertsList.refreshAlertsButtonLabel": "刷新", - "xpack.triggersActionsUI.sections.alertsList.resetDefaultIndexLabel": "重置默认索引", - "xpack.triggersActionsUI.sections.alertsList.ruleTypeExcessDurationMessage": "持续时间超出了规则的预期运行时间。", - "xpack.triggersActionsUI.sections.alertsList.searchPlaceholderTitle": "搜索", - "xpack.triggersActionsUI.sections.alertsList.singleTitle": "规则", - "xpack.triggersActionsUI.sections.alertsList.totalItemsCountDescription": "正在显示:{pageSize} 个规则(共 {totalItemCount} 个)。", - "xpack.triggersActionsUI.sections.alertsList.totalStatusesActiveDescription": "活动:{totalStatusesActive}", - "xpack.triggersActionsUI.sections.alertsList.totalStatusesErrorDescription": "错误:{totalStatusesError}", - "xpack.triggersActionsUI.sections.alertsList.totalStatusesOkDescription": "确定:{totalStatusesOk}", - "xpack.triggersActionsUI.sections.alertsList.totalStatusesPendingDescription": "待处理:{totalStatusesPending}", - "xpack.triggersActionsUI.sections.alertsList.totalStatusesUnknownDescription": "未知:{totalStatusesUnknown}", - "xpack.triggersActionsUI.sections.alertsList.typeFilterLabel": "类型", - "xpack.triggersActionsUI.sections.alertsList.unableToLoadConnectorTypesMessage": "无法加载连接器类型", - "xpack.triggersActionsUI.sections.alertsList.unableToLoadRulesMessage": "无法加载规则", - "xpack.triggersActionsUI.sections.alertsList.unableToLoadRuleStatusInfoMessage": "无法加载规则状态信息", - "xpack.triggersActionsUI.sections.alertsList.unableToLoadRuleTypesMessage": "无法加载规则类型", - "xpack.triggersActionsUI.sections.alertsList.viewBunnerButtonLabel": "查看", + "xpack.triggersActionsUI.sections.ruleAdd.flyoutTitle": "创建规则", + "xpack.triggersActionsUI.sections.ruleAdd.indexControls.timeFieldOptionLabel": "选择字段", + "xpack.triggersActionsUI.sections.ruleAdd.operationName": "创建", + "xpack.triggersActionsUI.sections.ruleAdd.saveErrorNotificationText": "无法创建规则。", + "xpack.triggersActionsUI.sections.ruleAdd.saveSuccessNotificationText": "已创建规则“{ruleName}”", + "xpack.triggersActionsUI.sections.ruleAddFooter.cancelButtonLabel": "取消", + "xpack.triggersActionsUI.sections.ruleAddFooter.saveButtonLabel": "保存", + "xpack.triggersActionsUI.sections.ruleDetails.actionWithBrokenConnectorWarningBannerEditText": "编辑规则", + "xpack.triggersActionsUI.sections.ruleDetails.actionWithBrokenConnectorWarningBannerTitle": "与此规则关联的连接器之一出现问题。", + "xpack.triggersActionsUI.sections.ruleDetails.ruleDetailsTitle": "{ruleName}", + "xpack.triggersActionsUI.sections.ruleDetails.alertInstances.disabledRule": "此规则已禁用,无法显示。", + "xpack.triggersActionsUI.sections.ruleDetails.alertInstances.disabledRuleTitle": "已禁用规则", + "xpack.triggersActionsUI.sections.ruleDetails.collapsedItemActons.enableLoadingTitle": "启用", + "xpack.triggersActionsUI.sections.ruleDetails.collapsedItemActons.enableTitle": "启用", + "xpack.triggersActionsUI.sections.ruleDetails.collapsedItemActons.muteLoadingTitle": "静音", + "xpack.triggersActionsUI.sections.ruleDetails.collapsedItemActons.muteTitle": "静音", + "xpack.triggersActionsUI.sections.ruleDetails.dismissButtonTitle": "关闭", + "xpack.triggersActionsUI.sections.ruleDetails.editRuleButtonLabel": "编辑", + "xpack.triggersActionsUI.sections.ruleDetails.manageLicensePlanBannerLinkTitle": "管理许可证", + "xpack.triggersActionsUI.sections.ruleDetails.redirectObjectNoun": "规则", + "xpack.triggersActionsUI.sections.ruleDetails.unableToLoadRuleMessage": "无法加载规则:{message}", + "xpack.triggersActionsUI.sections.ruleDetails.unableToLoadRulesMessage": "无法加载告警:{message}", + "xpack.triggersActionsUI.sections.ruleDetails.viewRuleInAppButtonLabel": "在应用中查看", + "xpack.triggersActionsUI.sections.ruleEdit.cancelButtonLabel": "取消", + "xpack.triggersActionsUI.sections.ruleEdit.disabledActionsWarningTitle": "此规则具有已禁用的操作", + "xpack.triggersActionsUI.sections.ruleEdit.flyoutTitle": "编辑规则", + "xpack.triggersActionsUI.sections.ruleEdit.saveButtonLabel": "保存", + "xpack.triggersActionsUI.sections.ruleEdit.saveErrorNotificationText": "无法更新规则。", + "xpack.triggersActionsUI.sections.ruleEdit.saveSuccessNotificationText": "已更新“{ruleName}”", + "xpack.triggersActionsUI.sections.ruleForm.ruleNameLabel": "名称", + "xpack.triggersActionsUI.sections.ruleForm.ruleNotifyWhen.label": "每", + "xpack.triggersActionsUI.sections.ruleForm.ruleNotifyWhen.onActionGroupChange.description": "操作在告警状态更改时运行。", + "xpack.triggersActionsUI.sections.ruleForm.ruleNotifyWhen.onActionGroupChange.display": "仅在状态更改时", + "xpack.triggersActionsUI.sections.ruleForm.ruleNotifyWhen.onActionGroupChange.label": "仅在状态更改时", + "xpack.triggersActionsUI.sections.ruleForm.ruleNotifyWhen.onActiveAlert.description": "告警活动时,操作按规则时间间隔重复。", + "xpack.triggersActionsUI.sections.ruleForm.ruleNotifyWhen.onActiveAlert.display": "每次告警处于活动状态时", + "xpack.triggersActionsUI.sections.ruleForm.ruleNotifyWhen.onActiveAlert.label": "每次告警处于活动状态时", + "xpack.triggersActionsUI.sections.ruleForm.ruleNotifyWhen.onThrottleInterval.description": "操作按照您设置的时间间隔运行。", + "xpack.triggersActionsUI.sections.ruleForm.ruleNotifyWhen.onThrottleInterval.display": "按定制操作时间间隔", + "xpack.triggersActionsUI.sections.ruleForm.ruleNotifyWhen.onThrottleInterval.label": "按定制操作时间间隔", + "xpack.triggersActionsUI.sections.ruleForm.changeRuleTypeAriaLabel": "删除", + "xpack.triggersActionsUI.sections.ruleForm.checkFieldLabel": "检查频率", + "xpack.triggersActionsUI.sections.ruleForm.checkWithTooltip": "定义评估条件的频率。", + "xpack.triggersActionsUI.sections.ruleForm.conditions.addConditionLabel": "添加:", + "xpack.triggersActionsUI.sections.ruleForm.conditions.removeConditionLabel": "移除", + "xpack.triggersActionsUI.sections.ruleForm.conditions.title": "条件:", + "xpack.triggersActionsUI.sections.ruleForm.documentationLabel": "文档", + "xpack.triggersActionsUI.sections.ruleForm.error.belowMinimumText": "时间间隔小于此规则类型的最小值 ({minimum})", + "xpack.triggersActionsUI.sections.ruleForm.error.noAuthorizedRuleTypes": "为了{operation}规则,您需要获得相应的权限。", + "xpack.triggersActionsUI.sections.ruleForm.error.noAuthorizedRuleTypesTitle": "您尚无权{operation}任何规则类型", + "xpack.triggersActionsUI.sections.ruleForm.error.requiredActionConnector": "“{actionTypeId} 连接器的操作”必填。", + "xpack.triggersActionsUI.sections.ruleForm.error.requiredIntervalText": "“检查时间间隔”必填。", + "xpack.triggersActionsUI.sections.ruleForm.error.requiredNameText": "“名称”必填。", + "xpack.triggersActionsUI.sections.ruleForm.error.requiredRuleTypeIdText": "“规则类型”必填。", + "xpack.triggersActionsUI.sections.ruleForm.loadingRuleTypeParamsDescription": "正在加载规则类型参数……", + "xpack.triggersActionsUI.sections.ruleForm.loadingRuleTypesDescription": "正在加载规则类型……", + "xpack.triggersActionsUI.sections.ruleForm.renotifyFieldLabel": "通知", + "xpack.triggersActionsUI.sections.ruleForm.renotifyWithTooltip": "定义规则处于活动状态时重复操作的频率。", + "xpack.triggersActionsUI.sections.ruleForm.ruleTypeSelectLabel": "选择规则类型", + "xpack.triggersActionsUI.sections.ruleForm.searchPlaceholderTitle": "搜索", + "xpack.triggersActionsUI.sections.ruleForm.solutionFilterLabel": "按用例筛选", + "xpack.triggersActionsUI.sections.ruleForm.tagsFieldLabel": "标签(可选)", + "xpack.triggersActionsUI.sections.ruleForm.unableToLoadRuleTypesMessage": "无法加载规则类型", + "xpack.triggersActionsUI.sections.rulesList.actionTypeFilterLabel": "操作类型", + "xpack.triggersActionsUI.sections.rulesList.addRuleButtonLabel": "创建规则", + "xpack.triggersActionsUI.sections.rulesList.ruleErrorReasonDecrypting": "解密规则时发生错误。", + "xpack.triggersActionsUI.sections.rulesList.ruleErrorReasonLicense": "无法运行规则", + "xpack.triggersActionsUI.sections.rulesList.ruleErrorReasonReading": "读取规则时发生错误。", + "xpack.triggersActionsUI.sections.rulesList.ruleErrorReasonRunning": "运行规则时发生错误。", + "xpack.triggersActionsUI.sections.rulesList.ruleErrorReasonUnknown": "由于未知原因发生错误。", + "xpack.triggersActionsUI.sections.rulesList.rulesListTable.columns.actionsTex": "操作", + "xpack.triggersActionsUI.sections.rulesList.rulesListTable.columns.actionsWarningTooltip": "无法加载与此规则关联的连接器之一。请编辑该规则以选择新连接器。", + "xpack.triggersActionsUI.sections.rulesList.rulesListTable.columns.ruleTypeTitle": "类型", + "xpack.triggersActionsUI.sections.rulesList.rulesListTable.columns.deleteAriaLabel": "删除", + "xpack.triggersActionsUI.sections.rulesList.rulesListTable.columns.deleteButtonTooltip": "删除", + "xpack.triggersActionsUI.sections.rulesList.rulesListTable.columns.durationTitle": "运行规则所需的时间长度。", + "xpack.triggersActionsUI.sections.rulesList.rulesListTable.columns.editAriaLabel": "编辑", + "xpack.triggersActionsUI.sections.rulesList.rulesListTable.columns.editButtonTooltip": "编辑", + "xpack.triggersActionsUI.sections.rulesList.rulesListTable.columns.enabledTitle": "已启用", + "xpack.triggersActionsUI.sections.rulesList.rulesListTable.columns.lastExecutionDateTitle": "上次执行的开始时间。", + "xpack.triggersActionsUI.sections.rulesList.rulesListTable.columns.mutedBadge": "已静音", + "xpack.triggersActionsUI.sections.rulesList.rulesListTable.columns.nameTitle": "名称", + "xpack.triggersActionsUI.sections.rulesList.rulesListTable.columns.scheduleTitle": "时间间隔", + "xpack.triggersActionsUI.sections.rulesList.rulesListTable.columns.statusTitle": "状态", + "xpack.triggersActionsUI.sections.rulesList.ruleStatusActive": "活动", + "xpack.triggersActionsUI.sections.rulesList.ruleStatusError": "错误", + "xpack.triggersActionsUI.sections.rulesList.ruleStatusFilterLabel": "状态", + "xpack.triggersActionsUI.sections.rulesList.ruleStatusLicenseError": "许可证错误", + "xpack.triggersActionsUI.sections.rulesList.ruleStatusOk": "确定", + "xpack.triggersActionsUI.sections.rulesList.ruleStatusPending": "待处理", + "xpack.triggersActionsUI.sections.rulesList.ruleStatusUnknown": "未知", + "xpack.triggersActionsUI.sections.rulesList.attentionBannerTitle": "{totalStatusesError, plural, other {# 个规则}}中出现错误。", + "xpack.triggersActionsUI.sections.rulesList.bulkActionPopover.buttonTitle": "管理规则", + "xpack.triggersActionsUI.sections.rulesList.bulkActionPopover.deleteAllTitle": "删除", + "xpack.triggersActionsUI.sections.rulesList.bulkActionPopover.disableAllTitle": "禁用", + "xpack.triggersActionsUI.sections.rulesList.bulkActionPopover.enableAllTitle": "启用", + "xpack.triggersActionsUI.sections.rulesList.bulkActionPopover.failedToDeleteRulesMessage": "无法删除规则", + "xpack.triggersActionsUI.sections.rulesList.bulkActionPopover.failedToDisableRulesMessage": "无法禁用规则", + "xpack.triggersActionsUI.sections.rulesList.bulkActionPopover.failedToEnableRulesMessage": "无法启用规则", + "xpack.triggersActionsUI.sections.rulesList.bulkActionPopover.failedToMuteRulesMessage": "无法静音规则", + "xpack.triggersActionsUI.sections.rulesList.bulkActionPopover.failedToUnmuteRulesMessage": "无法取消静音规则", + "xpack.triggersActionsUI.sections.rulesList.bulkActionPopover.muteAllTitle": "静音", + "xpack.triggersActionsUI.sections.rulesList.bulkActionPopover.unmuteAllTitle": "取消静音", + "xpack.triggersActionsUI.sections.rulesList.collapsedItemActons.deleteRuleTitle": "删除规则", + "xpack.triggersActionsUI.sections.rulesList.collapsedItemActons.disableTitle": "禁用", + "xpack.triggersActionsUI.sections.rulesList.collapsedItemActons.editTitle": "编辑规则", + "xpack.triggersActionsUI.sections.rulesList.collapsedItemActons.enableTitle": "启用", + "xpack.triggersActionsUI.sections.rulesList.collapsedItemActons.muteTitle": "静音", + "xpack.triggersActionsUI.sections.rulesList.collapsedItemActons.popoverButtonTitle": "操作", + "xpack.triggersActionsUI.sections.rulesList.collapsedItemActons.unmuteTitle": "取消静音", + "xpack.triggersActionsUI.sections.rulesList.dismissBunnerButtonLabel": "关闭", + "xpack.triggersActionsUI.sections.rulesList.fixLicenseLink": "修复", + "xpack.triggersActionsUI.sections.rulesList.multipleTitle": "规则", + "xpack.triggersActionsUI.sections.rulesList.noPermissionToCreateDescription": "请联系您的系统管理员。", + "xpack.triggersActionsUI.sections.rulesList.noPermissionToCreateTitle": "没有创建规则的权限", + "xpack.triggersActionsUI.sections.rulesList.refreshRulesButtonLabel": "刷新", + "xpack.triggersActionsUI.sections.rulesList.resetDefaultIndexLabel": "重置默认索引", + "xpack.triggersActionsUI.sections.rulesList.ruleTypeExcessDurationMessage": "持续时间超出了规则的预期运行时间。", + "xpack.triggersActionsUI.sections.rulesList.searchPlaceholderTitle": "搜索", + "xpack.triggersActionsUI.sections.rulesList.singleTitle": "规则", + "xpack.triggersActionsUI.sections.rulesList.totalItemsCountDescription": "正在显示:{pageSize} 个规则(共 {totalItemCount} 个)。", + "xpack.triggersActionsUI.sections.rulesList.totalStatusesActiveDescription": "活动:{totalStatusesActive}", + "xpack.triggersActionsUI.sections.rulesList.totalStatusesErrorDescription": "错误:{totalStatusesError}", + "xpack.triggersActionsUI.sections.rulesList.totalStatusesOkDescription": "确定:{totalStatusesOk}", + "xpack.triggersActionsUI.sections.rulesList.totalStatusesPendingDescription": "待处理:{totalStatusesPending}", + "xpack.triggersActionsUI.sections.rulesList.totalStatusesUnknownDescription": "未知:{totalStatusesUnknown}", + "xpack.triggersActionsUI.sections.rulesList.typeFilterLabel": "类型", + "xpack.triggersActionsUI.sections.rulesList.unableToLoadConnectorTypesMessage": "无法加载连接器类型", + "xpack.triggersActionsUI.sections.rulesList.unableToLoadRulesMessage": "无法加载规则", + "xpack.triggersActionsUI.sections.rulesList.unableToLoadRuleStatusInfoMessage": "无法加载规则状态信息", + "xpack.triggersActionsUI.sections.rulesList.unableToLoadRuleTypesMessage": "无法加载规则类型", + "xpack.triggersActionsUI.sections.rulesList.viewBunnerButtonLabel": "查看", "xpack.triggersActionsUI.sections.builtinActionTypes.emailAction.addBccButton": "密送", "xpack.triggersActionsUI.sections.builtinActionTypes.emailAction.addCcButton": "抄送", "xpack.triggersActionsUI.sections.builtinActionTypes.emailAction.authenticationLabel": "身份验证", @@ -28244,20 +28229,20 @@ "xpack.triggersActionsUI.sections.builtinActionTypes.emailAction.subjectTextFieldLabel": "主题", "xpack.triggersActionsUI.sections.builtinActionTypes.emailAction.tenantIdFieldLabel": "租户 ID", "xpack.triggersActionsUI.sections.builtinActionTypes.emailAction.userTextFieldLabel": "用户名", - "xpack.triggersActionsUI.sections.confirmAlertClose.confirmAlertCloseCancelButtonText": "取消", - "xpack.triggersActionsUI.sections.confirmAlertClose.confirmAlertCloseConfirmButtonText": "放弃更改", - "xpack.triggersActionsUI.sections.confirmAlertClose.confirmAlertCloseMessage": "您无法恢复未保存更改。", - "xpack.triggersActionsUI.sections.confirmAlertClose.confirmAlertCloseTitle": "丢弃规则的未保存更改?", - "xpack.triggersActionsUI.sections.confirmAlertSave.confirmAlertSaveCancelButtonText": "取消", - "xpack.triggersActionsUI.sections.confirmAlertSave.confirmAlertSaveConfirmButtonText": "保存规则", - "xpack.triggersActionsUI.sections.confirmAlertSave.confirmAlertSaveTitle": "保存规则,而不执行任何操作?", - "xpack.triggersActionsUI.sections.confirmAlertSave.confirmAlertSaveWithoutActionsMessage": "您可以随时添加操作。", + "xpack.triggersActionsUI.sections.confirmRuleClose.confirmRuleCloseCancelButtonText": "取消", + "xpack.triggersActionsUI.sections.confirmRuleClose.confirmRuleCloseConfirmButtonText": "放弃更改", + "xpack.triggersActionsUI.sections.confirmRuleClose.confirmRuleCloseMessage": "您无法恢复未保存更改。", + "xpack.triggersActionsUI.sections.confirmRuleClose.confirmRuleCloseTitle": "丢弃规则的未保存更改?", + "xpack.triggersActionsUI.sections.confirmRuleSave.confirmRuleSaveCancelButtonText": "取消", + "xpack.triggersActionsUI.sections.confirmRuleSave.confirmRuleSaveConfirmButtonText": "保存规则", + "xpack.triggersActionsUI.sections.confirmRuleSave.confirmRuleSaveTitle": "保存规则,而不执行任何操作?", + "xpack.triggersActionsUI.sections.confirmRuleSave.confirmRuleSaveWithoutActionsMessage": "您可以随时添加操作。", "xpack.triggersActionsUI.sections.connectorAddInline.accordion.deleteIconAriaLabel": "删除", "xpack.triggersActionsUI.sections.connectorAddInline.addConnectorButtonLabel": "创建连接器", "xpack.triggersActionsUI.sections.connectorAddInline.connectorAddInline.actionIdLabel": "使用其他 {connectorInstance} 连接器", "xpack.triggersActionsUI.sections.connectorAddInline.connectorAddInline.addNewConnectorEmptyButton": "添加连接器", "xpack.triggersActionsUI.sections.connectorAddInline.emptyConnectorsLabel": "无 {actionTypeName} 连接器", - "xpack.triggersActionsUI.sections.connectorAddInline.newAlertActionTypeEditTitle": "{actionConnectorName}", + "xpack.triggersActionsUI.sections.connectorAddInline.newRuleActionTypeEditTitle": "{actionConnectorName}", "xpack.triggersActionsUI.sections.connectorAddInline.unableToLoadConnectorTitle": "无法加载连接器", "xpack.triggersActionsUI.sections.connectorAddInline.unableToLoadConnectorTitle'": "无法加载连接器", "xpack.triggersActionsUI.sections.connectorAddInline.unauthorizedToCreateForEmptyConnectors": "只有获得授权的用户才能配置连接器。请联系您的管理员。", @@ -28281,7 +28266,7 @@ "xpack.triggersActionsUI.sections.isDeprecatedDescription": "此连接器已过时。请进行更新,或创建新连接器。", "xpack.triggersActionsUI.sections.manageLicense.manageLicenseCancelButtonText": "取消", "xpack.triggersActionsUI.sections.manageLicense.manageLicenseConfirmButtonText": "管理许可证", - "xpack.triggersActionsUI.sections.manageLicense.manageLicenseMessage": "规则类型 {alertTypeId} 已禁用,因为它需要{licenseRequired}许可证。继续前往“许可证管理”查看升级选项。", + "xpack.triggersActionsUI.sections.manageLicense.manageLicenseMessage": "规则类型 {ruleTypeId} 已禁用,因为它需要{licenseRequired}许可证。继续前往“许可证管理”查看升级选项。", "xpack.triggersActionsUI.sections.manageLicense.manageLicenseTitle": "需要{licenseRequired}许可证", "xpack.triggersActionsUI.sections.preconfiguredConnectorForm.flyoutTitle": "{connectorName}", "xpack.triggersActionsUI.sections.preconfiguredConnectorForm.tooltipContent": "这是预配置连接器,无法编辑", diff --git a/x-pack/plugins/triggers_actions_ui/public/application/app.tsx b/x-pack/plugins/triggers_actions_ui/public/application/app.tsx index 504f9256d0283..b2c350a4f1f29 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/app.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/app.tsx @@ -29,8 +29,8 @@ import { setSavedObjectsClient } from '../common/lib/data_apis'; import { KibanaContextProvider } from '../common/lib/kibana'; const TriggersActionsUIHome = lazy(() => import('./home')); -const AlertDetailsRoute = lazy( - () => import('./sections/alert_details/components/alert_details_route') +const RuleDetailsRoute = lazy( + () => import('./sections/rule_details/components/rule_details_route') ); export interface TriggersAndActionsUiServices extends CoreStart { @@ -88,7 +88,7 @@ export const AppWithoutRouter = ({ sectionsRegex }: { sectionsRegex: string }) = /> diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/health_check.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/health_check.tsx index c2946d0d5fb15..a488086032f07 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/health_check.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/health_check.tsx @@ -20,7 +20,7 @@ import { useHealthContext } from '../context/health_context'; import { useKibana } from '../../common/lib/kibana'; import { CenterJustifiedSpinner } from './center_justified_spinner'; import { triggersActionsUiHealth } from '../../common/lib/health_api'; -import { alertingFrameworkHealth } from '../lib/alert_api'; +import { alertingFrameworkHealth } from '../lib/rule_api'; interface Props { inFlyout?: boolean; @@ -28,7 +28,7 @@ interface Props { } interface HealthStatus { - isAlertsAvailable: boolean; + isRulesAvailable: boolean; isSufficientlySecure: boolean; hasPermanentEncryptionKey: boolean; } @@ -51,7 +51,7 @@ export const HealthCheck: React.FunctionComponent = ({ isSufficientlySecure: false, hasPermanentEncryptionKey: false, }; - if (healthStatus.isAlertsAvailable) { + if (healthStatus.isRulesAvailable) { const alertingHealthResult = await alertingFrameworkHealth({ http }); healthStatus.isSufficientlySecure = alertingHealthResult.isSufficientlySecure; healthStatus.hasPermanentEncryptionKey = alertingHealthResult.hasPermanentEncryptionKey; @@ -79,7 +79,7 @@ export const HealthCheck: React.FunctionComponent = ({ (healthCheck) => { return healthCheck?.isSufficientlySecure && healthCheck?.hasPermanentEncryptionKey ? ( <>{children} - ) : !healthCheck.isAlertsAvailable ? ( + ) : !healthCheck.isRulesAvailable ? ( ) : !healthCheck.isSufficientlySecure && !healthCheck.hasPermanentEncryptionKey ? ( diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/prompts/empty_prompt.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/prompts/empty_prompt.tsx index aef842c9baccb..c9f010b2d6a7e 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/prompts/empty_prompt.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/prompts/empty_prompt.tsx @@ -12,7 +12,7 @@ import { EuiButton, EuiEmptyPrompt } from '@elastic/eui'; export const EmptyPrompt = ({ onCTAClicked }: { onCTAClicked: () => void }) => ( void }) => ( } actions={ import('./sections/actions_connectors_list/components/actions_connectors_list') ); -const AlertsList = lazy(() => import('./sections/alerts_list/components/alerts_list')); +const RulesList = lazy(() => import('./sections/rules_list/components/rules_list')); export interface MatchParams { section: Section; @@ -132,7 +132,7 @@ export const TriggersActionsUIHome: React.FunctionComponent diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/index.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/index.ts deleted file mode 100644 index ea4f146cb6acb..0000000000000 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/index.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. - */ - -export { alertingFrameworkHealth } from './health'; -export { mapFiltersToKql } from './map_filters_to_kql'; -export { loadAlertAggregations } from './aggregate'; -export { createAlert } from './create'; -export { deleteAlerts } from './delete'; -export { disableAlert, disableAlerts } from './disable'; -export { enableAlert, enableAlerts } from './enable'; -export { loadAlert } from './get_rule'; -export { loadAlertSummary } from './alert_summary'; -export { muteAlertInstance } from './mute_alert'; -export { muteAlert, muteAlerts } from './mute'; -export { loadAlertTypes } from './rule_types'; -export { loadAlerts } from './rules'; -export { loadAlertState } from './state'; -export { unmuteAlertInstance } from './unmute_alert'; -export { unmuteAlert, unmuteAlerts } from './unmute'; -export { updateAlert } from './update'; -export { resolveRule } from './resolve_rule'; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/breadcrumb.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/breadcrumb.test.ts index 4dbda8f5d9614..26a69093ae48d 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/breadcrumb.test.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/breadcrumb.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { getAlertingSectionBreadcrumb, getAlertDetailsBreadcrumb } from './breadcrumb'; +import { getAlertingSectionBreadcrumb, getRuleDetailsBreadcrumb } from './breadcrumb'; import { i18n } from '@kbn/i18n'; import { routeToConnectors, routeToRules, routeToHome } from '../constants'; @@ -32,9 +32,9 @@ describe('getAlertingSectionBreadcrumb', () => { }); }); -describe('getAlertDetailsBreadcrumb', () => { +describe('getRuleDetailsBreadcrumb', () => { test('if select an alert should return proper breadcrumb title with alert name ', async () => { - expect(getAlertDetailsBreadcrumb('testId', 'testName')).toMatchObject({ + expect(getRuleDetailsBreadcrumb('testId', 'testName')).toMatchObject({ text: i18n.translate('xpack.triggersActionsUI.alertDetails.breadcrumbTitle', { defaultMessage: 'testName', }), diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/breadcrumb.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/breadcrumb.ts index b98aac8719d32..d26cdbcb3d174 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/breadcrumb.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/breadcrumb.ts @@ -35,7 +35,7 @@ export const getAlertingSectionBreadcrumb = (type: string): { text: string; href } }; -export const getAlertDetailsBreadcrumb = ( +export const getRuleDetailsBreadcrumb = ( id: string, name: string ): { text: string; href: string } => { diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/capabilities.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/capabilities.ts index 0cde499de8042..74b8243519428 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/capabilities.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/capabilities.ts @@ -6,7 +6,7 @@ */ import { RuleType } from '../../types'; -import { InitialAlert } from '../sections/alert_form/alert_reducer'; +import { InitialRule } from '../sections/rule_form/rule_reducer'; /** * NOTE: Applications that want to show the alerting UIs will need to add @@ -23,9 +23,9 @@ export const hasExecuteActionsCapability = (capabilities: Capabilities) => export const hasDeleteActionsCapability = (capabilities: Capabilities) => capabilities?.actions?.delete; -export function hasAllPrivilege(alert: InitialAlert, alertType?: RuleType): boolean { - return alertType?.authorizedConsumers[alert.consumer]?.all ?? false; +export function hasAllPrivilege(rule: InitialRule, ruleType?: RuleType): boolean { + return ruleType?.authorizedConsumers[rule.consumer]?.all ?? false; } -export function hasReadPrivilege(alert: InitialAlert, alertType?: RuleType): boolean { - return alertType?.authorizedConsumers[alert.consumer]?.read ?? false; +export function hasReadPrivilege(rule: InitialRule, ruleType?: RuleType): boolean { + return ruleType?.authorizedConsumers[rule.consumer]?.read ?? false; } diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/check_alert_type_enabled.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/lib/check_rule_type_enabled.test.tsx similarity index 75% rename from x-pack/plugins/triggers_actions_ui/public/application/lib/check_alert_type_enabled.test.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/lib/check_rule_type_enabled.test.tsx index ebdea0c3e5878..0668fb56c4ef1 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/check_alert_type_enabled.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/check_rule_type_enabled.test.tsx @@ -6,18 +6,18 @@ */ import { RuleType } from '../../types'; -import { checkAlertTypeEnabled } from './check_alert_type_enabled'; +import { checkRuleTypeEnabled } from './check_rule_type_enabled'; -describe('checkAlertTypeEnabled', () => { - test(`returns isEnabled:true when alert type isn't provided`, async () => { - expect(checkAlertTypeEnabled()).toMatchInlineSnapshot(` +describe('checkRuleTypeEnabled', () => { + test(`returns isEnabled:true when rule type isn't provided`, async () => { + expect(checkRuleTypeEnabled()).toMatchInlineSnapshot(` Object { "isEnabled": true, } `); }); - test('returns isEnabled:true when alert type is enabled', async () => { + test('returns isEnabled:true when rule type is enabled', async () => { const alertType: RuleType = { id: 'test', name: 'Test', @@ -34,14 +34,14 @@ describe('checkAlertTypeEnabled', () => { minimumLicenseRequired: 'basic', enabledInLicense: true, }; - expect(checkAlertTypeEnabled(alertType)).toMatchInlineSnapshot(` + expect(checkRuleTypeEnabled(alertType)).toMatchInlineSnapshot(` Object { "isEnabled": true, } `); }); - test('returns isEnabled:false when alert type is disabled by license', async () => { + test('returns isEnabled:false when rule type is disabled by license', async () => { const alertType: RuleType = { id: 'test', name: 'Test', @@ -58,7 +58,7 @@ describe('checkAlertTypeEnabled', () => { minimumLicenseRequired: 'gold', enabledInLicense: false, }; - expect(checkAlertTypeEnabled(alertType)).toMatchInlineSnapshot(` + expect(checkRuleTypeEnabled(alertType)).toMatchInlineSnapshot(` Object { "isEnabled": false, "message": "This rule type requires a Gold license.", diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/check_alert_type_enabled.tsx b/x-pack/plugins/triggers_actions_ui/public/application/lib/check_rule_type_enabled.tsx similarity index 64% rename from x-pack/plugins/triggers_actions_ui/public/application/lib/check_alert_type_enabled.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/lib/check_rule_type_enabled.tsx index 3b53e8f9a6c33..b1127c0b90eed 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/check_alert_type_enabled.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/check_rule_type_enabled.tsx @@ -17,24 +17,24 @@ export interface IsDisabledResult { message: string; } -const getLicenseCheckResult = (alertType: RuleType) => { +const getLicenseCheckResult = (ruleType: RuleType) => { return { isEnabled: false, message: i18n.translate( - 'xpack.triggersActionsUI.checkAlertTypeEnabled.ruleTypeDisabledByLicenseMessage', + 'xpack.triggersActionsUI.checkRuleTypeEnabled.ruleTypeDisabledByLicenseMessage', { defaultMessage: 'This rule type requires a {minimumLicenseRequired} license.', values: { - minimumLicenseRequired: upperFirst(alertType.minimumLicenseRequired), + minimumLicenseRequired: upperFirst(ruleType.minimumLicenseRequired), }, } ), }; }; -export function checkAlertTypeEnabled(alertType?: RuleType): IsEnabledResult | IsDisabledResult { - if (alertType?.enabledInLicense === false) { - return getLicenseCheckResult(alertType); +export function checkRuleTypeEnabled(ruleType?: RuleType): IsEnabledResult | IsDisabledResult { + if (ruleType?.enabledInLicense === false) { + return getLicenseCheckResult(ruleType); } return { isEnabled: true }; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/aggregate.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/aggregate.test.ts similarity index 90% rename from x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/aggregate.test.ts rename to x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/aggregate.test.ts index 57feb1e7abae9..53378d1af572d 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/aggregate.test.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/aggregate.test.ts @@ -6,11 +6,11 @@ */ import { httpServiceMock } from '../../../../../../../src/core/public/mocks'; -import { loadAlertAggregations } from './aggregate'; +import { loadRuleAggregations } from './aggregate'; const http = httpServiceMock.createStartContract(); -describe('loadAlertAggregations', () => { +describe('loadRuleAggregations', () => { beforeEach(() => jest.resetAllMocks()); test('should call aggregate API with base parameters', async () => { @@ -25,9 +25,9 @@ describe('loadAlertAggregations', () => { }; http.get.mockResolvedValueOnce(resolvedValue); - const result = await loadAlertAggregations({ http }); + const result = await loadRuleAggregations({ http }); expect(result).toEqual({ - alertExecutionStatus: { + ruleExecutionStatus: { ok: 4, active: 2, error: 1, @@ -62,9 +62,9 @@ describe('loadAlertAggregations', () => { }; http.get.mockResolvedValueOnce(resolvedValue); - const result = await loadAlertAggregations({ http, searchText: 'apples' }); + const result = await loadRuleAggregations({ http, searchText: 'apples' }); expect(result).toEqual({ - alertExecutionStatus: { + ruleExecutionStatus: { ok: 4, active: 2, error: 1, @@ -99,13 +99,13 @@ describe('loadAlertAggregations', () => { }; http.get.mockResolvedValueOnce(resolvedValue); - const result = await loadAlertAggregations({ + const result = await loadRuleAggregations({ http, searchText: 'foo', actionTypesFilter: ['action', 'type'], }); expect(result).toEqual({ - alertExecutionStatus: { + ruleExecutionStatus: { ok: 4, active: 2, error: 1, @@ -140,12 +140,12 @@ describe('loadAlertAggregations', () => { }; http.get.mockResolvedValueOnce(resolvedValue); - const result = await loadAlertAggregations({ + const result = await loadRuleAggregations({ http, typesFilter: ['foo', 'bar'], }); expect(result).toEqual({ - alertExecutionStatus: { + ruleExecutionStatus: { ok: 4, active: 2, error: 1, @@ -180,14 +180,14 @@ describe('loadAlertAggregations', () => { }; http.get.mockResolvedValueOnce(resolvedValue); - const result = await loadAlertAggregations({ + const result = await loadRuleAggregations({ http, searchText: 'baz', actionTypesFilter: ['action', 'type'], typesFilter: ['foo', 'bar'], }); expect(result).toEqual({ - alertExecutionStatus: { + ruleExecutionStatus: { ok: 4, active: 2, error: 1, diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/aggregate.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/aggregate.ts similarity index 74% rename from x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/aggregate.ts rename to x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/aggregate.ts index 60482b26b7f25..b2556900e763a 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/aggregate.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/aggregate.ts @@ -5,38 +5,38 @@ * 2.0. */ import { HttpSetup } from 'kibana/public'; -import { AlertAggregations } from '../../../types'; +import { RuleAggregations } from '../../../types'; import { INTERNAL_BASE_ALERTING_API_PATH } from '../../constants'; import { mapFiltersToKql } from './map_filters_to_kql'; import { AsApiContract, RewriteRequestCase } from '../../../../../actions/common'; -const rewriteBodyRes: RewriteRequestCase = ({ - rule_execution_status: alertExecutionStatus, +const rewriteBodyRes: RewriteRequestCase = ({ + rule_execution_status: ruleExecutionStatus, rule_enabled_status: ruleEnabledStatus, rule_muted_status: ruleMutedStatus, ...rest }: any) => ({ ...rest, - alertExecutionStatus, + ruleExecutionStatus, ruleEnabledStatus, ruleMutedStatus, }); -export async function loadAlertAggregations({ +export async function loadRuleAggregations({ http, searchText, typesFilter, actionTypesFilter, - alertStatusesFilter, + ruleStatusesFilter, }: { http: HttpSetup; searchText?: string; typesFilter?: string[]; actionTypesFilter?: string[]; - alertStatusesFilter?: string[]; -}): Promise { - const filters = mapFiltersToKql({ typesFilter, actionTypesFilter, alertStatusesFilter }); - const res = await http.get>( + ruleStatusesFilter?: string[]; +}): Promise { + const filters = mapFiltersToKql({ typesFilter, actionTypesFilter, ruleStatusesFilter }); + const res = await http.get>( `${INTERNAL_BASE_ALERTING_API_PATH}/rules/_aggregate`, { query: { diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/common_transformations.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/common_transformations.ts similarity index 82% rename from x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/common_transformations.ts rename to x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/common_transformations.ts index d380665658a81..bf2a0662490ae 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/common_transformations.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/common_transformations.ts @@ -6,9 +6,9 @@ */ import { AlertExecutionStatus } from '../../../../../alerting/common'; import { AsApiContract, RewriteRequestCase } from '../../../../../actions/common'; -import { Rule, AlertAction, ResolvedRule } from '../../../types'; +import { Rule, RuleAction, ResolvedRule } from '../../../types'; -const transformAction: RewriteRequestCase = ({ +const transformAction: RewriteRequestCase = ({ group, id, connector_type_id: actionTypeId, @@ -30,8 +30,8 @@ const transformExecutionStatus: RewriteRequestCase = ({ ...rest, }); -export const transformAlert: RewriteRequestCase = ({ - rule_type_id: alertTypeId, +export const transformRule: RewriteRequestCase = ({ + rule_type_id: ruleTypeId, created_by: createdBy, updated_by: updatedBy, created_at: createdAt, @@ -45,7 +45,7 @@ export const transformAlert: RewriteRequestCase = ({ actions: actions, ...rest }: any) => ({ - alertTypeId, + ruleTypeId, createdBy, updatedBy, createdAt, @@ -56,7 +56,7 @@ export const transformAlert: RewriteRequestCase = ({ mutedInstanceIds, executionStatus: executionStatus ? transformExecutionStatus(executionStatus) : undefined, actions: actions - ? actions.map((action: AsApiContract) => transformAction(action)) + ? actions.map((action: AsApiContract) => transformAction(action)) : [], scheduledTaskId, ...rest, @@ -69,7 +69,7 @@ export const transformResolvedRule: RewriteRequestCase = ({ ...rest }: any) => { return { - ...transformAlert(rest), + ...transformRule(rest), alias_target_id, outcome, }; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/create.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/create.test.ts similarity index 92% rename from x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/create.test.ts rename to x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/create.test.ts index 8d1ec57a4e63e..acba66c83a735 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/create.test.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/create.test.ts @@ -6,12 +6,12 @@ */ import { httpServiceMock } from '../../../../../../../src/core/public/mocks'; -import { AlertUpdates } from '../../../types'; -import { createAlert } from './create'; +import { RuleUpdates } from '../../../types'; +import { createRule } from './create'; const http = httpServiceMock.createStartContract(); -describe('createAlert', () => { +describe('createRule', () => { beforeEach(() => jest.resetAllMocks()); test('should call create alert API', async () => { @@ -49,8 +49,8 @@ describe('createAlert', () => { create_at: '2021-04-01T21:33:13.247Z', updated_at: '2021-04-01T21:33:13.247Z', }; - const alertToCreate: Omit< - AlertUpdates, + const ruleToCreate: Omit< + RuleUpdates, 'createdBy' | 'updatedBy' | 'muteAll' | 'mutedInstanceIds' | 'executionStatus' > = { params: { @@ -70,7 +70,7 @@ describe('createAlert', () => { name: 'test', enabled: true, throttle: null, - alertTypeId: '.index-threshold', + ruleTypeId: '.index-threshold', notifyWhen: 'onActionGroupChange', actions: [ { @@ -90,7 +90,7 @@ describe('createAlert', () => { }; http.post.mockResolvedValueOnce(resolvedValue); - const result = await createAlert({ http, alert: alertToCreate }); + const result = await createRule({ http, rule: ruleToCreate }); expect(result).toEqual({ actions: [ { @@ -103,7 +103,7 @@ describe('createAlert', () => { }, }, ], - alertTypeId: '.index-threshold', + ruleTypeId: '.index-threshold', apiKeyOwner: undefined, consumer: 'alerts', create_at: '2021-04-01T21:33:13.247Z', diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/create.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/create.ts similarity index 66% rename from x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/create.ts rename to x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/create.ts index d07d99eb8e8c8..26b6cf6a9628c 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/create.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/create.ts @@ -6,22 +6,22 @@ */ import { HttpSetup } from 'kibana/public'; import { AsApiContract, RewriteResponseCase } from '../../../../../actions/common'; -import { Rule, AlertUpdates } from '../../../types'; +import { Rule, RuleUpdates } from '../../../types'; import { BASE_ALERTING_API_PATH } from '../../constants'; -import { transformAlert } from './common_transformations'; +import { transformRule } from './common_transformations'; -type AlertCreateBody = Omit< - AlertUpdates, +type RuleCreateBody = Omit< + RuleUpdates, 'createdBy' | 'updatedBy' | 'muteAll' | 'mutedInstanceIds' | 'executionStatus' >; -const rewriteBodyRequest: RewriteResponseCase = ({ - alertTypeId, +const rewriteBodyRequest: RewriteResponseCase = ({ + ruleTypeId, notifyWhen, actions, ...res }): any => ({ ...res, - rule_type_id: alertTypeId, + rule_type_id: ruleTypeId, notify_when: notifyWhen, actions: actions.map(({ group, id, params }) => ({ group, @@ -30,15 +30,15 @@ const rewriteBodyRequest: RewriteResponseCase = ({ })), }); -export async function createAlert({ +export async function createRule({ http, - alert, + rule, }: { http: HttpSetup; - alert: AlertCreateBody; + rule: RuleCreateBody; }): Promise { const res = await http.post>(`${BASE_ALERTING_API_PATH}/rule`, { - body: JSON.stringify(rewriteBodyRequest(alert)), + body: JSON.stringify(rewriteBodyRequest(rule)), }); - return transformAlert(res); + return transformRule(res); } diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/delete.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/delete.test.ts similarity index 86% rename from x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/delete.test.ts rename to x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/delete.test.ts index 11e5f4763e775..95e48cf6e1734 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/delete.test.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/delete.test.ts @@ -6,14 +6,14 @@ */ import { httpServiceMock } from '../../../../../../../src/core/public/mocks'; -import { deleteAlerts } from './delete'; +import { deleteRules } from './delete'; const http = httpServiceMock.createStartContract(); -describe('deleteAlerts', () => { +describe('deleteRules', () => { test('should call delete API for each alert', async () => { const ids = ['1', '2', '/']; - const result = await deleteAlerts({ http, ids }); + const result = await deleteRules({ http, ids }); expect(result).toEqual({ errors: [], successes: [undefined, undefined, undefined] }); expect(http.delete.mock.calls).toMatchInlineSnapshot(` Array [ diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/delete.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/delete.ts similarity index 95% rename from x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/delete.ts rename to x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/delete.ts index d223dd08ca29a..053f5d68cdb69 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/delete.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/delete.ts @@ -7,7 +7,7 @@ import { HttpSetup } from 'kibana/public'; import { BASE_ALERTING_API_PATH } from '../../constants'; -export async function deleteAlerts({ +export async function deleteRules({ ids, http, }: { diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/disable.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/disable.test.ts similarity index 74% rename from x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/disable.test.ts rename to x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/disable.test.ts index 4323816221c6e..582fb3b59f86f 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/disable.test.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/disable.test.ts @@ -6,14 +6,14 @@ */ import { httpServiceMock } from '../../../../../../../src/core/public/mocks'; -import { disableAlert, disableAlerts } from './disable'; +import { disableRule, disableRules } from './disable'; const http = httpServiceMock.createStartContract(); beforeEach(() => jest.resetAllMocks()); -describe('disableAlert', () => { - test('should call disable alert API', async () => { - const result = await disableAlert({ http, id: '1/' }); +describe('disableRule', () => { + test('should call disable rule API', async () => { + const result = await disableRule({ http, id: '1/' }); expect(result).toEqual(undefined); expect(http.post.mock.calls).toMatchInlineSnapshot(` Array [ @@ -25,10 +25,10 @@ describe('disableAlert', () => { }); }); -describe('disableAlerts', () => { - test('should call disable alert API per alert', async () => { +describe('disableRules', () => { + test('should call disable rule API per rule', async () => { const ids = ['1', '2', '/']; - const result = await disableAlerts({ http, ids }); + const result = await disableRules({ http, ids }); expect(result).toEqual(undefined); expect(http.post.mock.calls).toMatchInlineSnapshot(` Array [ diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/enable.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/disable.ts similarity index 73% rename from x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/enable.ts rename to x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/disable.ts index 4bb3e3d45fcae..5b1e0452f51c1 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/enable.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/disable.ts @@ -7,16 +7,16 @@ import { HttpSetup } from 'kibana/public'; import { BASE_ALERTING_API_PATH } from '../../constants'; -export async function enableAlert({ id, http }: { id: string; http: HttpSetup }): Promise { - await http.post(`${BASE_ALERTING_API_PATH}/rule/${encodeURIComponent(id)}/_enable`); +export async function disableRule({ id, http }: { id: string; http: HttpSetup }): Promise { + await http.post(`${BASE_ALERTING_API_PATH}/rule/${encodeURIComponent(id)}/_disable`); } -export async function enableAlerts({ +export async function disableRules({ ids, http, }: { ids: string[]; http: HttpSetup; }): Promise { - await Promise.all(ids.map((id) => enableAlert({ id, http }))); + await Promise.all(ids.map((id) => disableRule({ id, http }))); } diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/enable.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/enable.test.ts similarity index 74% rename from x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/enable.test.ts rename to x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/enable.test.ts index 3a54a0772664b..993ae31f28832 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/enable.test.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/enable.test.ts @@ -6,14 +6,14 @@ */ import { httpServiceMock } from '../../../../../../../src/core/public/mocks'; -import { enableAlert, enableAlerts } from './enable'; +import { enableRule, enableRules } from './enable'; const http = httpServiceMock.createStartContract(); beforeEach(() => jest.resetAllMocks()); -describe('enableAlert', () => { - test('should call enable alert API', async () => { - const result = await enableAlert({ http, id: '1/' }); +describe('enableRule', () => { + test('should call enable rule API', async () => { + const result = await enableRule({ http, id: '1/' }); expect(result).toEqual(undefined); expect(http.post.mock.calls).toMatchInlineSnapshot(` Array [ @@ -25,10 +25,10 @@ describe('enableAlert', () => { }); }); -describe('enableAlerts', () => { - test('should call enable alert API per alert', async () => { +describe('enableRules', () => { + test('should call enable rule API per rule', async () => { const ids = ['1', '2', '/']; - const result = await enableAlerts({ http, ids }); + const result = await enableRules({ http, ids }); expect(result).toEqual(undefined); expect(http.post.mock.calls).toMatchInlineSnapshot(` Array [ diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/disable.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/enable.ts similarity index 68% rename from x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/disable.ts rename to x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/enable.ts index 758e66644b34e..fa4a462956663 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/disable.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/enable.ts @@ -7,16 +7,16 @@ import { HttpSetup } from 'kibana/public'; import { BASE_ALERTING_API_PATH } from '../../constants'; -export async function disableAlert({ id, http }: { id: string; http: HttpSetup }): Promise { - await http.post(`${BASE_ALERTING_API_PATH}/rule/${encodeURIComponent(id)}/_disable`); +export async function enableRule({ id, http }: { id: string; http: HttpSetup }): Promise { + await http.post(`${BASE_ALERTING_API_PATH}/rule/${encodeURIComponent(id)}/_enable`); } -export async function disableAlerts({ +export async function enableRules({ ids, http, }: { ids: string[]; http: HttpSetup; }): Promise { - await Promise.all(ids.map((id) => disableAlert({ id, http }))); + await Promise.all(ids.map((id) => enableRule({ id, http }))); } diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/get_rule.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/get_rule.test.ts similarity index 90% rename from x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/get_rule.test.ts rename to x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/get_rule.test.ts index 4708772f4ec35..9d7a3c5d5e6f5 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/get_rule.test.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/get_rule.test.ts @@ -6,15 +6,15 @@ */ import { httpServiceMock } from '../../../../../../../src/core/public/mocks'; -import { loadAlert } from './get_rule'; +import { loadRule } from './get_rule'; import uuid from 'uuid'; const http = httpServiceMock.createStartContract(); -describe('loadAlert', () => { +describe('loadRule', () => { test('should call get API with base parameters', async () => { - const alertId = `${uuid.v4()}/`; - const alertIdEncoded = encodeURIComponent(alertId); + const ruleId = `${uuid.v4()}/`; + const ruleIdEncoded = encodeURIComponent(ruleId); const resolvedValue = { id: '1/', params: { @@ -56,7 +56,7 @@ describe('loadAlert', () => { }; http.get.mockResolvedValueOnce(resolvedValue); - expect(await loadAlert({ http, alertId })).toEqual({ + expect(await loadRule({ http, ruleId })).toEqual({ id: '1/', params: { aggType: 'count', @@ -75,7 +75,6 @@ describe('loadAlert', () => { name: 'dfsdfdsf', enabled: true, throttle: '1h', - alertTypeId: '.index-threshold', createdBy: 'elastic', updatedBy: 'elastic', createdAt: '2021-04-01T20:29:18.652Z', @@ -84,6 +83,7 @@ describe('loadAlert', () => { notifyWhen: 'onThrottleInterval', muteAll: false, mutedInstanceIds: [], + ruleTypeId: '.index-threshold', scheduledTaskId: '1', executionStatus: { status: 'ok', lastExecutionDate: '2021-04-01T21:16:46.709Z' }, actions: [ @@ -95,6 +95,6 @@ describe('loadAlert', () => { }, ], }); - expect(http.get).toHaveBeenCalledWith(`/internal/alerting/rule/${alertIdEncoded}`); + expect(http.get).toHaveBeenCalledWith(`/internal/alerting/rule/${ruleIdEncoded}`); }); }); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/get_rule.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/get_rule.ts similarity index 79% rename from x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/get_rule.ts rename to x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/get_rule.ts index c89fd9f90e0a3..8604de3cc8bcf 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/get_rule.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/get_rule.ts @@ -8,17 +8,17 @@ import { HttpSetup } from 'kibana/public'; import { AsApiContract } from '../../../../../actions/common'; import { Rule } from '../../../types'; import { INTERNAL_BASE_ALERTING_API_PATH } from '../../constants'; -import { transformAlert } from './common_transformations'; +import { transformRule } from './common_transformations'; -export async function loadAlert({ +export async function loadRule({ http, - alertId, + ruleId, }: { http: HttpSetup; - alertId: string; + ruleId: string; }): Promise { const res = await http.get>( - `${INTERNAL_BASE_ALERTING_API_PATH}/rule/${encodeURIComponent(alertId)}` + `${INTERNAL_BASE_ALERTING_API_PATH}/rule/${encodeURIComponent(ruleId)}` ); - return transformAlert(res); + return transformRule(res); } diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/health.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/health.test.ts similarity index 100% rename from x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/health.test.ts rename to x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/health.test.ts diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/health.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/health.ts similarity index 100% rename from x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/health.ts rename to x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/health.ts diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/index.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/index.ts new file mode 100644 index 0000000000000..fff1cef678b02 --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/index.ts @@ -0,0 +1,25 @@ +/* + * 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. + */ + +export { alertingFrameworkHealth } from './health'; +export { mapFiltersToKql } from './map_filters_to_kql'; +export { loadRuleAggregations } from './aggregate'; +export { createRule } from './create'; +export { deleteRules } from './delete'; +export { disableRule, disableRules } from './disable'; +export { enableRule, enableRules } from './enable'; +export { loadRule } from './get_rule'; +export { loadRuleSummary } from './rule_summary'; +export { muteAlertInstance } from './mute_alert'; +export { muteRule, muteRules } from './mute'; +export { loadRuleTypes } from './rule_types'; +export { loadRules } from './rules'; +export { loadRuleState } from './state'; +export { unmuteAlertInstance } from './unmute_alert'; +export { unmuteRule, unmuteRules } from './unmute'; +export { updateRule } from './update'; +export { resolveRule } from './resolve_rule'; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/map_filters_to_kql.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/map_filters_to_kql.test.ts similarity index 88% rename from x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/map_filters_to_kql.test.ts rename to x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/map_filters_to_kql.test.ts index 4e5e2a412dad6..e1dd14a7a9fde 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/map_filters_to_kql.test.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/map_filters_to_kql.test.ts @@ -32,10 +32,10 @@ describe('mapFiltersToKql', () => { ]); }); - test('should handle alertStatusesFilter', () => { + test('should handle ruleStatusesFilter', () => { expect( mapFiltersToKql({ - alertStatusesFilter: ['alert', 'statuses', 'filter'], + ruleStatusesFilter: ['alert', 'statuses', 'filter'], }) ).toEqual(['alert.attributes.executionStatus.status:(alert or statuses or filter)']); }); @@ -52,12 +52,12 @@ describe('mapFiltersToKql', () => { ]); }); - test('should handle typesFilter, actionTypesFilter and alertStatusesFilter', () => { + test('should handle typesFilter, actionTypesFilter and ruleStatusesFilter', () => { expect( mapFiltersToKql({ typesFilter: ['type', 'filter'], actionTypesFilter: ['action', 'types', 'filter'], - alertStatusesFilter: ['alert', 'statuses', 'filter'], + ruleStatusesFilter: ['alert', 'statuses', 'filter'], }) ).toEqual([ 'alert.attributes.alertTypeId:(type or filter)', diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/map_filters_to_kql.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/map_filters_to_kql.ts similarity index 79% rename from x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/map_filters_to_kql.ts rename to x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/map_filters_to_kql.ts index 4c30e960034bf..d7b22a7a4aee4 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/map_filters_to_kql.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/map_filters_to_kql.ts @@ -8,11 +8,11 @@ export const mapFiltersToKql = ({ typesFilter, actionTypesFilter, - alertStatusesFilter, + ruleStatusesFilter, }: { typesFilter?: string[]; actionTypesFilter?: string[]; - alertStatusesFilter?: string[]; + ruleStatusesFilter?: string[]; }): string[] => { const filters = []; if (typesFilter && typesFilter.length) { @@ -29,8 +29,8 @@ export const mapFiltersToKql = ({ ].join('') ); } - if (alertStatusesFilter && alertStatusesFilter.length) { - filters.push(`alert.attributes.executionStatus.status:(${alertStatusesFilter.join(' or ')})`); + if (ruleStatusesFilter && ruleStatusesFilter.length) { + filters.push(`alert.attributes.executionStatus.status:(${ruleStatusesFilter.join(' or ')})`); } return filters; }; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/mute.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/mute.test.ts similarity index 83% rename from x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/mute.test.ts rename to x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/mute.test.ts index 804096dbafac8..f89dfdd41ebe6 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/mute.test.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/mute.test.ts @@ -6,14 +6,14 @@ */ import { httpServiceMock } from '../../../../../../../src/core/public/mocks'; -import { muteAlert, muteAlerts } from './mute'; +import { muteRule, muteRules } from './mute'; const http = httpServiceMock.createStartContract(); beforeEach(() => jest.resetAllMocks()); -describe('muteAlert', () => { +describe('muteRule', () => { test('should call mute alert API', async () => { - const result = await muteAlert({ http, id: '1/' }); + const result = await muteRule({ http, id: '1/' }); expect(result).toEqual(undefined); expect(http.post.mock.calls).toMatchInlineSnapshot(` Array [ @@ -25,10 +25,10 @@ describe('muteAlert', () => { }); }); -describe('muteAlerts', () => { +describe('muteRules', () => { test('should call mute alert API per alert', async () => { const ids = ['1', '2', '/']; - const result = await muteAlerts({ http, ids }); + const result = await muteRules({ http, ids }); expect(result).toEqual(undefined); expect(http.post.mock.calls).toMatchInlineSnapshot(` Array [ diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/mute.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/mute.ts similarity index 63% rename from x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/mute.ts rename to x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/mute.ts index 888cdfa92c8f5..81bbcf2e2b270 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/mute.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/mute.ts @@ -7,10 +7,10 @@ import { HttpSetup } from 'kibana/public'; import { BASE_ALERTING_API_PATH } from '../../constants'; -export async function muteAlert({ id, http }: { id: string; http: HttpSetup }): Promise { +export async function muteRule({ id, http }: { id: string; http: HttpSetup }): Promise { await http.post(`${BASE_ALERTING_API_PATH}/rule/${encodeURIComponent(id)}/_mute_all`); } -export async function muteAlerts({ ids, http }: { ids: string[]; http: HttpSetup }): Promise { - await Promise.all(ids.map((id) => muteAlert({ http, id }))); +export async function muteRules({ ids, http }: { ids: string[]; http: HttpSetup }): Promise { + await Promise.all(ids.map((id) => muteRule({ http, id }))); } diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/mute_alert.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/mute_alert.test.ts similarity index 100% rename from x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/mute_alert.test.ts rename to x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/mute_alert.test.ts diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/mute_alert.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/mute_alert.ts similarity index 100% rename from x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/mute_alert.ts rename to x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/mute_alert.ts diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/resolve_rule.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/resolve_rule.test.ts similarity index 98% rename from x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/resolve_rule.test.ts rename to x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/resolve_rule.test.ts index 14b64f56f31ff..fe9ce240b50e5 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/resolve_rule.test.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/resolve_rule.test.ts @@ -77,7 +77,6 @@ describe('resolveRule', () => { name: 'dfsdfdsf', enabled: true, throttle: '1h', - alertTypeId: '.index-threshold', createdBy: 'elastic', updatedBy: 'elastic', createdAt: '2021-04-01T20:29:18.652Z', @@ -86,6 +85,7 @@ describe('resolveRule', () => { notifyWhen: 'onThrottleInterval', muteAll: false, mutedInstanceIds: [], + ruleTypeId: '.index-threshold', scheduledTaskId: '1', executionStatus: { status: 'ok', lastExecutionDate: '2021-04-01T21:16:46.709Z' }, actions: [ diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/resolve_rule.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/resolve_rule.ts similarity index 100% rename from x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/resolve_rule.ts rename to x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/resolve_rule.ts diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/alert_summary.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/rule_summary.test.ts similarity index 84% rename from x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/alert_summary.test.ts rename to x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/rule_summary.test.ts index 7a1fdbe53c7c5..ed81bae9777b6 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/alert_summary.test.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/rule_summary.test.ts @@ -6,14 +6,14 @@ */ import { httpServiceMock } from '../../../../../../../src/core/public/mocks'; -import { AlertSummary } from '../../../../../alerting/common'; -import { loadAlertSummary } from './alert_summary'; +import { RuleSummary } from '../../../types'; +import { loadRuleSummary } from './rule_summary'; const http = httpServiceMock.createStartContract(); -describe('loadAlertSummary', () => { - test('should call alert summary API', async () => { - const resolvedValue: AlertSummary = { +describe('loadRuleSummary', () => { + test('should call rule summary API', async () => { + const resolvedValue: RuleSummary = { alerts: {}, consumer: 'alerts', enabled: true, @@ -55,7 +55,7 @@ describe('loadAlertSummary', () => { }, }); - const result = await loadAlertSummary({ http, ruleId: 'te/st' }); + const result = await loadRuleSummary({ http, ruleId: 'te/st' }); expect(result).toEqual(resolvedValue); expect(http.get.mock.calls[0]).toMatchInlineSnapshot(` Array [ diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/alert_summary.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/rule_summary.ts similarity index 84% rename from x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/alert_summary.ts rename to x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/rule_summary.ts index 55ba674dbd7f5..0ddc58602bd5e 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/alert_summary.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/rule_summary.ts @@ -6,7 +6,7 @@ */ import { HttpSetup } from 'kibana/public'; import { INTERNAL_BASE_ALERTING_API_PATH } from '../../constants'; -import { AlertSummary, ExecutionDuration } from '../../../types'; +import { RuleSummary, ExecutionDuration } from '../../../types'; import { RewriteRequestCase, AsApiContract } from '../../../../../actions/common'; const transformExecutionDuration: RewriteRequestCase = ({ @@ -17,7 +17,7 @@ const transformExecutionDuration: RewriteRequestCase = ({ ...rest, }); -const rewriteBodyRes: RewriteRequestCase = ({ +const rewriteBodyRes: RewriteRequestCase = ({ rule_type_id: ruleTypeId, mute_all: muteAll, status_start_date: statusStartDate, @@ -37,7 +37,7 @@ const rewriteBodyRes: RewriteRequestCase = ({ executionDuration: executionDuration ? transformExecutionDuration(executionDuration) : undefined, }); -export async function loadAlertSummary({ +export async function loadRuleSummary({ http, ruleId, numberOfExecutions, @@ -45,8 +45,8 @@ export async function loadAlertSummary({ http: HttpSetup; ruleId: string; numberOfExecutions?: number; -}): Promise { - const res = await http.get>( +}): Promise { + const res = await http.get>( `${INTERNAL_BASE_ALERTING_API_PATH}/rule/${encodeURIComponent(ruleId)}/_alert_summary`, { query: { number_of_executions: numberOfExecutions }, diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/rule_types.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/rule_types.test.ts similarity index 91% rename from x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/rule_types.test.ts rename to x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/rule_types.test.ts index 49f50858b6983..cd14c9f707960 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/rule_types.test.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/rule_types.test.ts @@ -7,12 +7,12 @@ import { RuleType } from '../../../types'; import { httpServiceMock } from '../../../../../../../src/core/public/mocks'; -import { loadAlertTypes } from './rule_types'; +import { loadRuleTypes } from './rule_types'; import { ALERTS_FEATURE_ID } from '../../../../../alerting/common'; const http = httpServiceMock.createStartContract(); -describe('loadAlertTypes', () => { +describe('loadRuleTypes', () => { test('should call get alert types API', async () => { const resolvedValue: RuleType[] = [ { @@ -34,7 +34,7 @@ describe('loadAlertTypes', () => { ]; http.get.mockResolvedValueOnce(resolvedValue); - const result = await loadAlertTypes({ http }); + const result = await loadRuleTypes({ http }); expect(result).toEqual(resolvedValue); expect(http.get.mock.calls[0]).toMatchInlineSnapshot(` Array [ diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/rule_types.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/rule_types.ts similarity index 94% rename from x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/rule_types.ts rename to x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/rule_types.ts index 63207dd35dfac..2b96deaa0dfb1 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/rule_types.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/rule_types.ts @@ -37,7 +37,7 @@ const rewriteBodyReq: RewriteRequestCase = ({ ...rest, }); -export async function loadAlertTypes({ http }: { http: HttpSetup }): Promise { +export async function loadRuleTypes({ http }: { http: HttpSetup }): Promise { const res = await http.get>>>( `${BASE_ALERTING_API_PATH}/rule_types` ); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/rules.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/rules.test.ts similarity index 93% rename from x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/rules.test.ts rename to x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/rules.test.ts index 6453876938b4e..2b70955ded4c3 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/rules.test.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/rules.test.ts @@ -5,11 +5,11 @@ * 2.0. */ import { httpServiceMock } from '../../../../../../../src/core/public/mocks'; -import { loadAlerts } from './rules'; +import { loadRules } from './rules'; const http = httpServiceMock.createStartContract(); -describe('loadAlerts', () => { +describe('loadRules', () => { beforeEach(() => jest.resetAllMocks()); test('should call find API with base parameters', async () => { @@ -21,7 +21,7 @@ describe('loadAlerts', () => { }; http.get.mockResolvedValueOnce(resolvedValue); - const result = await loadAlerts({ http, page: { index: 0, size: 10 } }); + const result = await loadRules({ http, page: { index: 0, size: 10 } }); expect(result).toEqual({ page: 1, perPage: 10, @@ -56,7 +56,7 @@ describe('loadAlerts', () => { }; http.get.mockResolvedValueOnce(resolvedValue); - const result = await loadAlerts({ http, searchText: 'apples', page: { index: 0, size: 10 } }); + const result = await loadRules({ http, searchText: 'apples', page: { index: 0, size: 10 } }); expect(result).toEqual({ page: 1, perPage: 10, @@ -91,7 +91,7 @@ describe('loadAlerts', () => { }; http.get.mockResolvedValueOnce(resolvedValue); - const result = await loadAlerts({ + const result = await loadRules({ http, searchText: 'foo', page: { index: 0, size: 10 }, @@ -130,7 +130,7 @@ describe('loadAlerts', () => { }; http.get.mockResolvedValueOnce(resolvedValue); - const result = await loadAlerts({ + const result = await loadRules({ http, typesFilter: ['foo', 'bar'], page: { index: 0, size: 10 }, @@ -169,7 +169,7 @@ describe('loadAlerts', () => { }; http.get.mockResolvedValueOnce(resolvedValue); - const result = await loadAlerts({ + const result = await loadRules({ http, searchText: 'baz', typesFilter: ['foo', 'bar'], @@ -209,7 +209,7 @@ describe('loadAlerts', () => { }; http.get.mockResolvedValueOnce(resolvedValue); - const result = await loadAlerts({ + const result = await loadRules({ http, searchText: 'apples, foo, baz', typesFilter: ['foo', 'bar'], diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/rules.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/rules.ts similarity index 88% rename from x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/rules.ts rename to x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/rules.ts index 2f75ca2bbd0ba..97c432a480355 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/rules.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/rules.ts @@ -9,19 +9,19 @@ import { INTERNAL_BASE_ALERTING_API_PATH } from '../../constants'; import { Rule, Pagination, Sorting } from '../../../types'; import { AsApiContract } from '../../../../../actions/common'; import { mapFiltersToKql } from './map_filters_to_kql'; -import { transformAlert } from './common_transformations'; +import { transformRule } from './common_transformations'; const rewriteResponseRes = (results: Array>): Rule[] => { - return results.map((item) => transformAlert(item)); + return results.map((item) => transformRule(item)); }; -export async function loadAlerts({ +export async function loadRules({ http, page, searchText, typesFilter, actionTypesFilter, - alertStatusesFilter, + ruleStatusesFilter, sort = { field: 'name', direction: 'asc' }, }: { http: HttpSetup; @@ -29,7 +29,7 @@ export async function loadAlerts({ searchText?: string; typesFilter?: string[]; actionTypesFilter?: string[]; - alertStatusesFilter?: string[]; + ruleStatusesFilter?: string[]; sort?: Sorting; }): Promise<{ page: number; @@ -37,7 +37,7 @@ export async function loadAlerts({ total: number; data: Rule[]; }> { - const filters = mapFiltersToKql({ typesFilter, actionTypesFilter, alertStatusesFilter }); + const filters = mapFiltersToKql({ typesFilter, actionTypesFilter, ruleStatusesFilter }); const res = await http.get< AsApiContract<{ page: number; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/state.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/state.test.ts similarity index 81% rename from x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/state.test.ts rename to x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/state.test.ts index ae27352be0b90..db22fa4d2d896 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/state.test.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/state.test.ts @@ -6,16 +6,16 @@ */ import { httpServiceMock } from '../../../../../../../src/core/public/mocks'; -import { loadAlertState } from './state'; +import { loadRuleState } from './state'; import uuid from 'uuid'; const http = httpServiceMock.createStartContract(); -describe('loadAlertState', () => { +describe('loadRuleState', () => { beforeEach(() => jest.resetAllMocks()); test('should call get API with base parameters', async () => { - const alertId = uuid.v4(); + const ruleId = uuid.v4(); const resolvedValue = { alertTypeState: { some: 'value', @@ -35,12 +35,12 @@ describe('loadAlertState', () => { }, }); - expect(await loadAlertState({ http, alertId })).toEqual(resolvedValue); - expect(http.get).toHaveBeenCalledWith(`/internal/alerting/rule/${alertId}/state`); + expect(await loadRuleState({ http, ruleId })).toEqual(resolvedValue); + expect(http.get).toHaveBeenCalledWith(`/internal/alerting/rule/${ruleId}/state`); }); - test('should parse AlertInstances', async () => { - const alertId = uuid.v4(); + test('should parse RuleInstances', async () => { + const ruleId = uuid.v4(); const resolvedValue = { alertTypeState: { some: 'value', @@ -74,7 +74,7 @@ describe('loadAlertState', () => { }, }); - expect(await loadAlertState({ http, alertId })).toEqual({ + expect(await loadRuleState({ http, ruleId })).toEqual({ ...resolvedValue, alertInstances: { first_instance: { @@ -88,14 +88,14 @@ describe('loadAlertState', () => { }, }, }); - expect(http.get).toHaveBeenCalledWith(`/internal/alerting/rule/${alertId}/state`); + expect(http.get).toHaveBeenCalledWith(`/internal/alerting/rule/${ruleId}/state`); }); test('should handle empty response from api', async () => { - const alertId = uuid.v4(); + const ruleId = uuid.v4(); http.get.mockResolvedValueOnce(''); - expect(await loadAlertState({ http, alertId })).toEqual({}); - expect(http.get).toHaveBeenCalledWith(`/internal/alerting/rule/${alertId}/state`); + expect(await loadRuleState({ http, ruleId })).toEqual({}); + expect(http.get).toHaveBeenCalledWith(`/internal/alerting/rule/${ruleId}/state`); }); }); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/state.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/state.ts similarity index 87% rename from x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/state.ts rename to x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/state.ts index b0b321159bf1c..35fd63d92d25b 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/state.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/state.ts @@ -26,23 +26,23 @@ const rewriteBodyRes: RewriteRequestCase = ({ }); type EmptyHttpResponse = ''; -export async function loadAlertState({ +export async function loadRuleState({ http, - alertId, + ruleId, }: { http: HttpSetup; - alertId: string; + ruleId: string; }): Promise { return await http .get | EmptyHttpResponse>( - `${INTERNAL_BASE_ALERTING_API_PATH}/rule/${alertId}/state` + `${INTERNAL_BASE_ALERTING_API_PATH}/rule/${ruleId}/state` ) .then((state) => (state ? rewriteBodyRes(state) : {})) .then((state: RuleTaskState) => { return pipe( ruleStateSchema.decode(state), fold((e: Errors) => { - throw new Error(`Rule "${alertId}" has invalid state`); + throw new Error(`Rule "${ruleId}" has invalid state`); }, identity) ); }); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/unmute.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/unmute.test.ts similarity index 74% rename from x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/unmute.test.ts rename to x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/unmute.test.ts index dfaceffcf8f00..fe55c2e2656fb 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/unmute.test.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/unmute.test.ts @@ -6,15 +6,15 @@ */ import { httpServiceMock } from '../../../../../../../src/core/public/mocks'; -import { unmuteAlert, unmuteAlerts } from './unmute'; +import { unmuteRule, unmuteRules } from './unmute'; const http = httpServiceMock.createStartContract(); beforeEach(() => jest.resetAllMocks()); -describe('unmuteAlerts', () => { - test('should call unmute alert API per alert', async () => { +describe('unmuteRules', () => { + test('should call unmute rule API per rule', async () => { const ids = ['1', '2', '/']; - const result = await unmuteAlerts({ http, ids }); + const result = await unmuteRules({ http, ids }); expect(result).toEqual(undefined); expect(http.post.mock.calls).toMatchInlineSnapshot(` Array [ @@ -32,9 +32,9 @@ describe('unmuteAlerts', () => { }); }); -describe('unmuteAlert', () => { - test('should call unmute alert API', async () => { - const result = await unmuteAlert({ http, id: '1/' }); +describe('unmuteRule', () => { + test('should call unmute rule API', async () => { + const result = await unmuteRule({ http, id: '1/' }); expect(result).toEqual(undefined); expect(http.post.mock.calls).toMatchInlineSnapshot(` Array [ diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/unmute.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/unmute.ts similarity index 72% rename from x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/unmute.ts rename to x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/unmute.ts index bd2139f052645..951038159ca81 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/unmute.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/unmute.ts @@ -7,16 +7,16 @@ import { HttpSetup } from 'kibana/public'; import { BASE_ALERTING_API_PATH } from '../../constants'; -export async function unmuteAlert({ id, http }: { id: string; http: HttpSetup }): Promise { +export async function unmuteRule({ id, http }: { id: string; http: HttpSetup }): Promise { await http.post(`${BASE_ALERTING_API_PATH}/rule/${encodeURIComponent(id)}/_unmute_all`); } -export async function unmuteAlerts({ +export async function unmuteRules({ ids, http, }: { ids: string[]; http: HttpSetup; }): Promise { - await Promise.all(ids.map((id) => unmuteAlert({ id, http }))); + await Promise.all(ids.map((id) => unmuteRule({ id, http }))); } diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/unmute_alert.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/unmute_alert.test.ts similarity index 100% rename from x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/unmute_alert.test.ts rename to x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/unmute_alert.test.ts diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/unmute_alert.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/unmute_alert.ts similarity index 100% rename from x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/unmute_alert.ts rename to x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/unmute_alert.ts diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/update.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/update.test.ts similarity index 76% rename from x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/update.test.ts rename to x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/update.test.ts index bc6e7aedd122b..911245de63f67 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/update.test.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/update.test.ts @@ -5,16 +5,15 @@ * 2.0. */ -import { Rule } from '../../../types'; +import { Rule, RuleNotifyWhenType } from '../../../types'; import { httpServiceMock } from '../../../../../../../src/core/public/mocks'; -import { updateAlert } from './update'; -import { AlertNotifyWhenType } from '../../../../../alerting/common'; +import { updateRule } from './update'; const http = httpServiceMock.createStartContract(); -describe('updateAlert', () => { - test('should call alert update API', async () => { - const alertToUpdate = { +describe('updateRule', () => { + test('should call rule update API', async () => { + const ruleToUpdate = { throttle: '1m', consumer: 'alerts', name: 'test', @@ -28,13 +27,13 @@ describe('updateAlert', () => { updatedAt: new Date('1970-01-01T00:00:00.000Z'), apiKey: null, apiKeyOwner: null, - notifyWhen: 'onThrottleInterval' as AlertNotifyWhenType, + notifyWhen: 'onThrottleInterval' as RuleNotifyWhenType, }; const resolvedValue: Rule = { - ...alertToUpdate, + ...ruleToUpdate, id: '12/3', enabled: true, - alertTypeId: 'test', + ruleTypeId: 'test', createdBy: null, updatedBy: null, muteAll: false, @@ -46,7 +45,7 @@ describe('updateAlert', () => { }; http.put.mockResolvedValueOnce(resolvedValue); - const result = await updateAlert({ http, id: '12/3', alert: alertToUpdate }); + const result = await updateRule({ http, id: '12/3', rule: ruleToUpdate }); expect(result).toEqual(resolvedValue); expect(http.put.mock.calls[0]).toMatchInlineSnapshot(` Array [ diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/update.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/update.ts similarity index 71% rename from x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/update.ts rename to x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/update.ts index 4867d33ab2dd1..a3b9d081c20d3 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/update.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/update.ts @@ -7,15 +7,15 @@ import { HttpSetup } from 'kibana/public'; import { pick } from 'lodash'; import { BASE_ALERTING_API_PATH } from '../../constants'; -import { Rule, AlertUpdates } from '../../../types'; +import { Rule, RuleUpdates } from '../../../types'; import { RewriteResponseCase, AsApiContract } from '../../../../../actions/common'; -import { transformAlert } from './common_transformations'; +import { transformRule } from './common_transformations'; -type AlertUpdatesBody = Pick< - AlertUpdates, +type RuleUpdatesBody = Pick< + RuleUpdates, 'name' | 'tags' | 'schedule' | 'actions' | 'params' | 'throttle' | 'notifyWhen' >; -const rewriteBodyRequest: RewriteResponseCase = ({ +const rewriteBodyRequest: RewriteResponseCase = ({ notifyWhen, actions, ...res @@ -29,14 +29,14 @@ const rewriteBodyRequest: RewriteResponseCase = ({ })), }); -export async function updateAlert({ +export async function updateRule({ http, - alert, + rule, id, }: { http: HttpSetup; - alert: Pick< - AlertUpdates, + rule: Pick< + RuleUpdates, 'throttle' | 'name' | 'tags' | 'schedule' | 'params' | 'actions' | 'notifyWhen' >; id: string; @@ -46,10 +46,10 @@ export async function updateAlert({ { body: JSON.stringify( rewriteBodyRequest( - pick(alert, ['throttle', 'name', 'tags', 'schedule', 'params', 'actions', 'notifyWhen']) + pick(rule, ['throttle', 'name', 'tags', 'schedule', 'params', 'actions', 'notifyWhen']) ) ), } ); - return transformAlert(res); + return transformRule(res); } diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_type_compare.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_type_compare.test.ts similarity index 74% rename from x-pack/plugins/triggers_actions_ui/public/application/lib/alert_type_compare.test.ts rename to x-pack/plugins/triggers_actions_ui/public/application/lib/rule_type_compare.test.ts index faa32204ba66e..e9ec012707c7b 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_type_compare.test.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_type_compare.test.ts @@ -6,18 +6,18 @@ */ import { RuleTypeModel } from '../../types'; -import { alertTypeGroupCompare, alertTypeCompare } from './alert_type_compare'; -import { IsEnabledResult, IsDisabledResult } from './check_alert_type_enabled'; +import { ruleTypeGroupCompare, ruleTypeCompare } from './rule_type_compare'; +import { IsEnabledResult, IsDisabledResult } from './check_rule_type_enabled'; -test('should sort groups by containing enabled alert types first and then by name', async () => { - const alertTypes: Array< +test('should sort groups by containing enabled rule types first and then by name', async () => { + const ruleTypes: Array< [ string, Array<{ id: string; name: string; checkEnabledResult: IsEnabledResult | IsDisabledResult; - alertTypeItem: RuleTypeModel; + ruleTypeItem: RuleTypeModel; }> ] > = [ @@ -28,8 +28,8 @@ test('should sort groups by containing enabled alert types first and then by nam id: '1', name: 'test2', checkEnabledResult: { isEnabled: false, message: 'gold license' }, - alertTypeItem: { - id: 'my-alert-type', + ruleTypeItem: { + id: 'my-rule-type', iconClass: 'test', description: 'Alert when testing', documentationUrl: 'https://localhost.local/docs', @@ -49,8 +49,8 @@ test('should sort groups by containing enabled alert types first and then by nam id: '2', name: 'abc', checkEnabledResult: { isEnabled: false, message: 'platinum license' }, - alertTypeItem: { - id: 'my-alert-type', + ruleTypeItem: { + id: 'my-rule-type', iconClass: 'test', description: 'Alert when testing', documentationUrl: 'https://localhost.local/docs', @@ -65,8 +65,8 @@ test('should sort groups by containing enabled alert types first and then by nam id: '3', name: 'cdf', checkEnabledResult: { isEnabled: true }, - alertTypeItem: { - id: 'disabled-alert-type', + ruleTypeItem: { + id: 'disabled-rule-type', iconClass: 'test', description: 'Alert when testing', documentationUrl: 'https://localhost.local/docs', @@ -86,8 +86,8 @@ test('should sort groups by containing enabled alert types first and then by nam id: '4', name: 'cde', checkEnabledResult: { isEnabled: true }, - alertTypeItem: { - id: 'my-alert-type', + ruleTypeItem: { + id: 'my-rule-type', iconClass: 'test', description: 'Alert when testing', documentationUrl: 'https://localhost.local/docs', @@ -107,25 +107,25 @@ test('should sort groups by containing enabled alert types first and then by nam groups.set('bcd', 'BCD'); groups.set('cde', 'CDE'); - const result = [...alertTypes].sort((right, left) => alertTypeGroupCompare(right, left, groups)); - expect(result[0]).toEqual(alertTypes[1]); - expect(result[1]).toEqual(alertTypes[2]); - expect(result[2]).toEqual(alertTypes[0]); + const result = [...ruleTypes].sort((right, left) => ruleTypeGroupCompare(right, left, groups)); + expect(result[0]).toEqual(ruleTypes[1]); + expect(result[1]).toEqual(ruleTypes[2]); + expect(result[2]).toEqual(ruleTypes[0]); }); -test('should sort alert types by enabled first and then by name', async () => { - const alertTypes: Array<{ +test('should sort rule types by enabled first and then by name', async () => { + const ruleTypes: Array<{ id: string; name: string; checkEnabledResult: IsEnabledResult | IsDisabledResult; - alertTypeItem: RuleTypeModel; + ruleTypeItem: RuleTypeModel; }> = [ { id: '1', name: 'bcd', checkEnabledResult: { isEnabled: false, message: 'gold license' }, - alertTypeItem: { - id: 'my-alert-type', + ruleTypeItem: { + id: 'my-rule-type', iconClass: 'test', description: 'Alert when testing', documentationUrl: 'https://localhost.local/docs', @@ -140,8 +140,8 @@ test('should sort alert types by enabled first and then by name', async () => { id: '2', name: 'abc', checkEnabledResult: { isEnabled: false, message: 'platinum license' }, - alertTypeItem: { - id: 'my-alert-type', + ruleTypeItem: { + id: 'my-rule-type', iconClass: 'test', description: 'Alert when testing', documentationUrl: 'https://localhost.local/docs', @@ -156,8 +156,8 @@ test('should sort alert types by enabled first and then by name', async () => { id: '3', name: 'cdf', checkEnabledResult: { isEnabled: true }, - alertTypeItem: { - id: 'disabled-alert-type', + ruleTypeItem: { + id: 'disabled-rule-type', iconClass: 'test', description: 'Alert when testing', documentationUrl: 'https://localhost.local/docs', @@ -169,8 +169,8 @@ test('should sort alert types by enabled first and then by name', async () => { }, }, ]; - const result = [...alertTypes].sort(alertTypeCompare); - expect(result[0]).toEqual(alertTypes[2]); - expect(result[1]).toEqual(alertTypes[1]); - expect(result[2]).toEqual(alertTypes[0]); + const result = [...ruleTypes].sort(ruleTypeCompare); + expect(result[0]).toEqual(ruleTypes[2]); + expect(result[1]).toEqual(ruleTypes[1]); + expect(result[2]).toEqual(ruleTypes[0]); }); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_type_compare.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_type_compare.ts similarity index 63% rename from x-pack/plugins/triggers_actions_ui/public/application/lib/alert_type_compare.ts rename to x-pack/plugins/triggers_actions_ui/public/application/lib/rule_type_compare.ts index d05fb400b5e56..c04574f7961e0 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_type_compare.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_type_compare.ts @@ -6,16 +6,16 @@ */ import { RuleTypeModel } from '../../types'; -import { IsEnabledResult, IsDisabledResult } from './check_alert_type_enabled'; +import { IsEnabledResult, IsDisabledResult } from './check_rule_type_enabled'; -export function alertTypeGroupCompare( +export function ruleTypeGroupCompare( left: [ string, Array<{ id: string; name: string; checkEnabledResult: IsEnabledResult | IsDisabledResult; - alertTypeItem: RuleTypeModel; + ruleTypeItem: RuleTypeModel; }> ], right: [ @@ -24,28 +24,28 @@ export function alertTypeGroupCompare( id: string; name: string; checkEnabledResult: IsEnabledResult | IsDisabledResult; - alertTypeItem: RuleTypeModel; + ruleTypeItem: RuleTypeModel; }> ], groupNames: Map | undefined ) { const groupNameA = left[0]; const groupNameB = right[0]; - const leftAlertTypesList = left[1]; - const rightAlertTypesList = right[1]; + const leftRuleTypesList = left[1]; + const rightRuleTypesList = right[1]; - const hasEnabledAlertTypeInListLeft = - leftAlertTypesList.find((alertTypeItem) => alertTypeItem.checkEnabledResult.isEnabled) !== + const hasEnabledRuleTypeInListLeft = + leftRuleTypesList.find((ruleTypeItem) => ruleTypeItem.checkEnabledResult.isEnabled) !== undefined; - const hasEnabledAlertTypeInListRight = - rightAlertTypesList.find((alertTypeItem) => alertTypeItem.checkEnabledResult.isEnabled) !== + const hasEnabledRuleTypeInListRight = + rightRuleTypesList.find((ruleTypeItem) => ruleTypeItem.checkEnabledResult.isEnabled) !== undefined; - if (hasEnabledAlertTypeInListLeft && !hasEnabledAlertTypeInListRight) { + if (hasEnabledRuleTypeInListLeft && !hasEnabledRuleTypeInListRight) { return -1; } - if (!hasEnabledAlertTypeInListLeft && hasEnabledAlertTypeInListRight) { + if (!hasEnabledRuleTypeInListLeft && hasEnabledRuleTypeInListRight) { return 1; } @@ -54,18 +54,18 @@ export function alertTypeGroupCompare( : groupNameA.localeCompare(groupNameB); } -export function alertTypeCompare( +export function ruleTypeCompare( a: { id: string; name: string; checkEnabledResult: IsEnabledResult | IsDisabledResult; - alertTypeItem: RuleTypeModel; + ruleTypeItem: RuleTypeModel; }, b: { id: string; name: string; checkEnabledResult: IsEnabledResult | IsDisabledResult; - alertTypeItem: RuleTypeModel; + ruleTypeItem: RuleTypeModel; } ) { if (a.checkEnabledResult.isEnabled === true && b.checkEnabledResult.isEnabled === false) { diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/value_validators.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/value_validators.test.ts index c6524c9d05d56..2e8c8b00ced42 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/value_validators.test.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/value_validators.test.ts @@ -10,7 +10,7 @@ import { throwIfIsntContained, isValidUrl, getConnectorWithInvalidatedFields, - getAlertWithInvalidatedFields, + getRuleWithInvalidatedFields, } from './value_validators'; import uuid from 'uuid'; import { Rule, IErrorObject, UserConfiguredActionConnector } from '../../types'; @@ -155,9 +155,9 @@ describe('getConnectorWithInvalidatedFields', () => { }); }); -describe('getAlertWithInvalidatedFields', () => { - test('sets to null all fields that are required but undefined in alert', () => { - const alert: Rule = { +describe('getRuleWithInvalidatedFields', () => { + test('sets to null all fields that are required but undefined in rule', () => { + const rule: Rule = { params: {}, consumer: 'test', schedule: { @@ -171,17 +171,17 @@ describe('getAlertWithInvalidatedFields', () => { } as any; const baseAlertErrors = { name: ['Name is required.'], - alertTypeId: ['Rule type is required.'], + ruleTypeId: ['Rule type is required.'], }; const actionsErrors: IErrorObject[] = []; const paramsErrors = {}; - getAlertWithInvalidatedFields(alert, paramsErrors, baseAlertErrors, actionsErrors); - expect(alert.name).toBeNull(); - expect(alert.alertTypeId).toBeNull(); + getRuleWithInvalidatedFields(rule, paramsErrors, baseAlertErrors, actionsErrors); + expect(rule.name).toBeNull(); + expect(rule.ruleTypeId).toBeNull(); }); - test('does not set to null any fields that are required and defined but invalid in alert', () => { - const alert: Rule = { + test('does not set to null any fields that are required and defined but invalid in rule', () => { + const rule: Rule = { name: 'test', id: '123', params: {}, @@ -198,14 +198,14 @@ describe('getAlertWithInvalidatedFields', () => { const baseAlertErrors = { consumer: ['Consumer is invalid.'] }; const actionsErrors: IErrorObject[] = []; const paramsErrors = {}; - getAlertWithInvalidatedFields(alert, paramsErrors, baseAlertErrors, actionsErrors); - expect(alert.consumer).toEqual('@@@@'); + getRuleWithInvalidatedFields(rule, paramsErrors, baseAlertErrors, actionsErrors); + expect(rule.consumer).toEqual('@@@@'); }); - test('set to null all fields that are required but undefined in alert params', () => { - const alert: Rule = { + test('set to null all fields that are required but undefined in rule params', () => { + const rule: Rule = { name: 'test', - alertTypeId: '.threshold', + ruleTypeId: '.threshold', id: '123', params: {}, consumer: 'test', @@ -232,15 +232,15 @@ describe('getAlertWithInvalidatedFields', () => { const baseAlertErrors = {}; const actionsErrors: IErrorObject[] = []; const paramsErrors = { index: ['Index is required.'], timeField: ['Time field is required.'] }; - getAlertWithInvalidatedFields(alert, paramsErrors, baseAlertErrors, actionsErrors); - expect(alert.params.index).toBeNull(); - expect(alert.params.timeField).toBeNull(); + getRuleWithInvalidatedFields(rule, paramsErrors, baseAlertErrors, actionsErrors); + expect(rule.params.index).toBeNull(); + expect(rule.params.timeField).toBeNull(); }); - test('does not set to null any fields that are required and defined but invalid in alert params', () => { - const alert: Rule = { + test('does not set to null any fields that are required and defined but invalid in rule params', () => { + const rule: Rule = { name: 'test', - alertTypeId: '.threshold', + ruleTypeId: '.threshold', id: '123', params: { aggField: 'foo', @@ -273,15 +273,15 @@ describe('getAlertWithInvalidatedFields', () => { aggField: ['Aggregation field is invalid.'], termSize: ['Term size is invalid.'], }; - getAlertWithInvalidatedFields(alert, paramsErrors, baseAlertErrors, actionsErrors); - expect(alert.params.aggField).toEqual('foo'); - expect(alert.params.termSize).toEqual('big'); + getRuleWithInvalidatedFields(rule, paramsErrors, baseAlertErrors, actionsErrors); + expect(rule.params.aggField).toEqual('foo'); + expect(rule.params.termSize).toEqual('big'); }); - test('set to null all fields that are required but undefined in alert actions', () => { - const alert: Rule = { + test('set to null all fields that are required but undefined in rule actions', () => { + const rule: Rule = { name: 'test', - alertTypeId: '.threshold', + ruleTypeId: '.threshold', id: '123', params: {}, consumer: 'test', @@ -319,14 +319,14 @@ describe('getAlertWithInvalidatedFields', () => { const baseAlertErrors = {}; const actionsErrors = [{ 'incident.field.name': ['Name is required.'] }]; const paramsErrors = {}; - getAlertWithInvalidatedFields(alert, paramsErrors, baseAlertErrors, actionsErrors); - expect((alert.actions[0].params as any).incident.field.name).toBeNull(); + getRuleWithInvalidatedFields(rule, paramsErrors, baseAlertErrors, actionsErrors); + expect((rule.actions[0].params as any).incident.field.name).toBeNull(); }); - test('validates multiple alert actions with the same connector id', () => { - const alert: Rule = { + test('validates multiple rule actions with the same connector id', () => { + const rule: Rule = { name: 'test', - alertTypeId: '.threshold', + ruleTypeId: '.threshold', id: '123', params: {}, consumer: 'test', @@ -379,8 +379,8 @@ describe('getAlertWithInvalidatedFields', () => { { 'incident.field.name': ['Name is invalid.'] }, ]; const paramsErrors = {}; - getAlertWithInvalidatedFields(alert, paramsErrors, baseAlertErrors, actionsErrors); - expect((alert.actions[0].params as any).incident.field.name).toBeNull(); - expect((alert.actions[1].params as any).incident.field.name).toEqual('myIncident'); + getRuleWithInvalidatedFields(rule, paramsErrors, baseAlertErrors, actionsErrors); + expect((rule.actions[0].params as any).incident.field.name).toBeNull(); + expect((rule.actions[1].params as any).incident.field.name).toEqual('myIncident'); }); }); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/value_validators.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/value_validators.ts index 161776dfe0a3e..e4e27291f972a 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/value_validators.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/value_validators.ts @@ -70,24 +70,24 @@ export function getConnectorWithInvalidatedFields( return connector; } -export function getAlertWithInvalidatedFields( - alert: Rule, +export function getRuleWithInvalidatedFields( + rule: Rule, paramsErrors: IErrorObject, baseAlertErrors: IErrorObject, actionsErrors: IErrorObject[] ) { Object.keys(paramsErrors).forEach((errorKey) => { - if (paramsErrors[errorKey].length >= 1 && get(alert.params, errorKey) === undefined) { - set(alert.params, errorKey, null); + if (paramsErrors[errorKey].length >= 1 && get(rule.params, errorKey) === undefined) { + set(rule.params, errorKey, null); } }); Object.keys(baseAlertErrors).forEach((errorKey) => { - if (baseAlertErrors[errorKey].length >= 1 && get(alert, errorKey) === undefined) { - set(alert, errorKey, null); + if (baseAlertErrors[errorKey].length >= 1 && get(rule, errorKey) === undefined) { + set(rule, errorKey, null); } }); actionsErrors.forEach((error: IErrorObject, index: number) => { - const actionToValidate = alert.actions.length > index ? alert.actions[index] : null; + const actionToValidate = rule.actions.length > index ? rule.actions[index] : null; if (actionToValidate) { Object.keys(error).forEach((errorKey) => { if (error[errorKey].length >= 1 && get(actionToValidate!.params, errorKey) === undefined) { @@ -96,5 +96,5 @@ export function getAlertWithInvalidatedFields( }); } }); - return alert; + return rule; } diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_form.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_form.test.tsx index ace563aa96b9e..97945fd8752c1 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_form.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_form.test.tsx @@ -14,7 +14,7 @@ import { actionTypeRegistryMock } from '../../action_type_registry.mock'; import { ValidationResult, Rule, - AlertAction, + RuleAction, ConnectorValidationResult, GenericValidationResult, } from '../../../types'; @@ -193,7 +193,7 @@ describe('action_form', () => { const useKibanaMock = useKibana as jest.Mocked; describe('action_form in alert', () => { - async function setup(customActions?: AlertAction[], customRecoveredActionGroup?: string) { + async function setup(customActions?: RuleAction[], customRecoveredActionGroup?: string) { const actionTypeRegistry = actionTypeRegistryMock.create(); const { loadAllActions } = jest.requireMock('../../lib/action_connector_api'); @@ -283,7 +283,7 @@ describe('action_form', () => { setActionGroupIdByIndex={(group: string, index: number) => { initialAlert.actions[index].group = group; }} - setActions={(_updatedActions: AlertAction[]) => {}} + setActions={(_updatedActions: RuleAction[]) => {}} setActionParamsProperty={(key: string, value: any, index: number) => (initialAlert.actions[index] = { ...initialAlert.actions[index], [key]: value }) } diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_form.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_form.tsx index f25827fb4ba99..7c1af79c05626 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_form.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_form.tsx @@ -22,7 +22,7 @@ import { import { loadActionTypes, loadAllActions as loadConnectors } from '../../lib/action_connector_api'; import { ActionTypeModel, - AlertAction, + RuleAction, ActionTypeIndex, ActionConnector, ActionType, @@ -48,13 +48,13 @@ export interface ActionGroupWithMessageVariables extends ActionGroup { } export interface ActionAccordionFormProps { - actions: AlertAction[]; + actions: RuleAction[]; defaultActionGroupId: string; actionGroups?: ActionGroupWithMessageVariables[]; defaultActionMessage?: string; setActionIdByIndex: (id: string, index: number) => void; setActionGroupIdByIndex?: (group: string, index: number) => void; - setActions: (actions: AlertAction[]) => void; + setActions: (actions: RuleAction[]) => void; setActionParamsProperty: (key: string, value: AlertActionParam, index: number) => void; actionTypes?: ActionType[]; messageVariables?: ActionVariables; @@ -307,7 +307,7 @@ export const ActionForm = ({ {actionTypesIndex && - actions.map((actionItem: AlertAction, index: number) => { + actions.map((actionItem: RuleAction, index: number) => { const actionConnector = connectors.find((field) => field.id === actionItem.id); // connectors doesn't exists if (!actionConnector) { @@ -322,11 +322,11 @@ export const ActionForm = ({ connectors={connectors} onDeleteConnector={() => { const updatedActions = actions.filter( - (_item: AlertAction, i: number) => i !== index + (_item: RuleAction, i: number) => i !== index ); setActions(updatedActions); setIsAddActionPanelOpen( - updatedActions.filter((item: AlertAction) => item.id !== actionItem.id) + updatedActions.filter((item: RuleAction) => item.id !== actionItem.id) .length === 0 ); setActiveActionItem(undefined); @@ -335,7 +335,7 @@ export const ActionForm = ({ setActiveActionItem({ actionTypeId: actionItem.actionTypeId, indices: actions - .map((item: AlertAction, idx: number) => + .map((item: RuleAction, idx: number) => item.id === actionItem.id ? idx : -1 ) .filter((idx: number) => idx >= 0), @@ -375,11 +375,11 @@ export const ActionForm = ({ actionTypeRegistry={actionTypeRegistry} onDeleteAction={() => { const updatedActions = actions.filter( - (_item: AlertAction, i: number) => i !== index + (_item: RuleAction, i: number) => i !== index ); setActions(updatedActions); setIsAddActionPanelOpen( - updatedActions.filter((item: AlertAction) => item.id !== actionItem.id).length === + updatedActions.filter((item: RuleAction) => item.id !== actionItem.id).length === 0 ); setActiveActionItem(undefined); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_type_form.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_type_form.test.tsx index e04b96b6839cf..484f6698a8b29 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_type_form.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_type_form.test.tsx @@ -11,7 +11,7 @@ import { actionTypeRegistryMock } from '../../action_type_registry.mock'; import { ActionConnector, ActionType, - AlertAction, + RuleAction, ConnectorValidationResult, GenericValidationResult, } from '../../../types'; @@ -138,7 +138,7 @@ describe('action_type_form', () => { function getActionTypeForm( index?: number, actionConnector?: ActionConnector, Record>, - actionItem?: AlertAction, + actionItem?: RuleAction, defaultActionGroupId?: string, connectors?: Array, Record>>, actionTypeIndex?: Record, diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_type_form.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_type_form.tsx index 4a27c4c1e6fef..c817f5895a816 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_type_form.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_type_form.tsx @@ -28,7 +28,7 @@ import { partition } from 'lodash'; import { ActionVariable, AlertActionParam } from '../../../../../alerting/common'; import { IErrorObject, - AlertAction, + RuleAction, ActionTypeIndex, ActionConnector, ActionVariables, @@ -43,7 +43,7 @@ import { DefaultActionParams } from '../../lib/get_defaults_for_action_params'; import { ConnectorsSelection } from './connectors_selection'; export type ActionTypeFormProps = { - actionItem: AlertAction; + actionItem: RuleAction; actionConnector: ActionConnector; index: number; onAddConnector: () => void; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_add_inline.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_add_inline.tsx index cd274c542c9d5..558ae873892da 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_add_inline.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_add_inline.tsx @@ -23,7 +23,7 @@ import { EuiButtonEmpty, EuiIconTip, } from '@elastic/eui'; -import { AlertAction, ActionTypeIndex, ActionConnector } from '../../../types'; +import { RuleAction, ActionTypeIndex, ActionConnector } from '../../../types'; import { hasSaveActionsCapability } from '../../lib/capabilities'; import { ActionAccordionFormProps } from './action_form'; import { useKibana } from '../../../common/lib/kibana'; @@ -32,7 +32,7 @@ import { ConnectorsSelection } from './connectors_selection'; type AddConnectorInFormProps = { actionTypesIndex: ActionTypeIndex; - actionItem: AlertAction; + actionItem: RuleAction; connectors: ActionConnector[]; index: number; onAddConnector: () => void; @@ -155,7 +155,7 @@ export const AddConnectorInline = ({
{ - const onSaveHandler = onSave ?? reloadAlerts; - - const initialAlert: InitialAlert = useMemo(() => { - return { - params: {}, - consumer, - alertTypeId, - schedule: { - interval: DEFAULT_ALERT_INTERVAL, - }, - actions: [], - tags: [], - notifyWhen: 'onActionGroupChange', - ...(initialValues ? initialValues : {}), - }; - }, [alertTypeId, consumer, initialValues]); - - const [{ alert }, dispatch] = useReducer(alertReducer as InitialAlertReducer, { - alert: initialAlert, - }); - const [initialAlertParams, setInitialAlertParams] = useState({}); - const [isSaving, setIsSaving] = useState(false); - const [isConfirmAlertSaveModalOpen, setIsConfirmAlertSaveModalOpen] = useState(false); - const [isConfirmAlertCloseModalOpen, setIsConfirmAlertCloseModalOpen] = useState(false); - const [ruleTypeIndex, setRuleTypeIndex] = useState( - props.ruleTypeIndex - ); - const [changedFromDefaultInterval, setChangedFromDefaultInterval] = useState(false); - - const setAlert = (value: InitialAlert) => { - dispatch({ command: { type: 'setAlert' }, payload: { key: 'alert', value } }); - }; - - const setRuleProperty = (key: Key, value: Rule[Key] | null) => { - dispatch({ command: { type: 'setProperty' }, payload: { key, value } }); - }; - - const { - http, - notifications: { toasts }, - application: { capabilities }, - } = useKibana().services; - - const canShowActions = hasShowActionsCapability(capabilities); - - useEffect(() => { - if (alertTypeId) { - setRuleProperty('alertTypeId', alertTypeId); - } - }, [alertTypeId]); - - useEffect(() => { - if (!props.ruleTypeIndex) { - (async () => { - const alertTypes = await loadAlertTypes({ http }); - const index: RuleTypeIndex = new Map(); - for (const alertType of alertTypes) { - index.set(alertType.id, alertType); - } - setRuleTypeIndex(index); - })(); - } - }, [props.ruleTypeIndex, http]); - - useEffect(() => { - if (isEmpty(alert.params) && !isEmpty(initialAlertParams)) { - // alert params are explicitly cleared when the alert type is cleared. - // clear the "initial" params in order to capture the - // default when a new alert type is selected - setInitialAlertParams({}); - } else if (isEmpty(initialAlertParams)) { - // captures the first change to the alert params, - // when consumers set a default value for the alert params - setInitialAlertParams(alert.params); - } - }, [alert.params, initialAlertParams, setInitialAlertParams]); - - const [alertActionsErrors, setAlertActionsErrors] = useState([]); - const [isLoading, setIsLoading] = useState(false); - - useEffect(() => { - (async () => { - setIsLoading(true); - const res = await getAlertActionErrors(alert as Rule, actionTypeRegistry); - setIsLoading(false); - setAlertActionsErrors([...res]); - })(); - }, [alert, actionTypeRegistry]); - - useEffect(() => { - if (alert.alertTypeId && ruleTypeIndex) { - const type = ruleTypeIndex.get(alert.alertTypeId); - if (type?.defaultScheduleInterval && !changedFromDefaultInterval) { - setRuleProperty('schedule', { interval: type.defaultScheduleInterval }); - } - } - }, [alert.alertTypeId, ruleTypeIndex, alert.schedule.interval, changedFromDefaultInterval]); - - useEffect(() => { - if (alert.schedule.interval !== DEFAULT_ALERT_INTERVAL && !changedFromDefaultInterval) { - setChangedFromDefaultInterval(true); - } - }, [alert.schedule.interval, changedFromDefaultInterval]); - - const checkForChangesAndCloseFlyout = () => { - if ( - hasAlertChanged(alert, initialAlert, false) || - haveAlertParamsChanged(alert.params, initialAlertParams) - ) { - setIsConfirmAlertCloseModalOpen(true); - } else { - onClose(AlertFlyoutCloseReason.CANCELED); - } - }; - - const saveAlertAndCloseFlyout = async () => { - const savedAlert = await onSaveAlert(); - setIsSaving(false); - if (savedAlert) { - onClose(AlertFlyoutCloseReason.SAVED); - if (onSaveHandler) { - onSaveHandler(); - } - } - }; - - const alertType = alert.alertTypeId ? ruleTypeRegistry.get(alert.alertTypeId) : null; - - const { alertBaseErrors, alertErrors, alertParamsErrors } = getAlertErrors( - alert as Rule, - alertType, - alert.alertTypeId ? ruleTypeIndex?.get(alert.alertTypeId) : undefined - ); - - // Confirm before saving if user is able to add actions but hasn't added any to this alert - const shouldConfirmSave = canShowActions && alert.actions?.length === 0; - - async function onSaveAlert(): Promise { - try { - const newAlert = await createAlert({ http, alert: alert as AlertUpdates }); - toasts.addSuccess( - i18n.translate('xpack.triggersActionsUI.sections.alertAdd.saveSuccessNotificationText', { - defaultMessage: 'Created rule "{ruleName}"', - values: { - ruleName: newAlert.name, - }, - }) - ); - return newAlert; - } catch (errorRes) { - toasts.addDanger( - errorRes.body?.message ?? - i18n.translate('xpack.triggersActionsUI.sections.alertAdd.saveErrorNotificationText', { - defaultMessage: 'Cannot create rule.', - }) - ); - } - } - - return ( - - - - -

- -

-
-
- - - - - - { - setIsSaving(true); - if (isLoading || !isValidAlert(alert, alertErrors, alertActionsErrors)) { - setAlert( - getAlertWithInvalidatedFields( - alert as Rule, - alertParamsErrors, - alertBaseErrors, - alertActionsErrors - ) - ); - setIsSaving(false); - return; - } - if (shouldConfirmSave) { - setIsConfirmAlertSaveModalOpen(true); - } else { - await saveAlertAndCloseFlyout(); - } - }} - onCancel={checkForChangesAndCloseFlyout} - /> - - - {isConfirmAlertSaveModalOpen && ( - { - setIsConfirmAlertSaveModalOpen(false); - await saveAlertAndCloseFlyout(); - }} - onCancel={() => { - setIsSaving(false); - setIsConfirmAlertSaveModalOpen(false); - }} - /> - )} - {isConfirmAlertCloseModalOpen && ( - { - setIsConfirmAlertCloseModalOpen(false); - onClose(AlertFlyoutCloseReason.CANCELED); - }} - onCancel={() => { - setIsConfirmAlertCloseModalOpen(false); - }} - /> - )} -
-
- ); -}; - -// eslint-disable-next-line import/no-default-export -export { AlertAdd as default }; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_reducer.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_reducer.test.ts deleted file mode 100644 index a581e702b9a47..0000000000000 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_reducer.test.ts +++ /dev/null @@ -1,189 +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 { alertReducer } from './alert_reducer'; -import { Rule } from '../../../types'; - -describe('alert reducer', () => { - let initialAlert: Rule; - beforeAll(() => { - initialAlert = { - params: {}, - consumer: 'alerts', - alertTypeId: null, - schedule: { - interval: '1m', - }, - actions: [], - tags: [], - notifyWhen: 'onActionGroupChange', - } as unknown as Rule; - }); - - // setAlert - test('if modified alert was reset to initial', () => { - const alert = alertReducer( - { alert: initialAlert }, - { - command: { type: 'setProperty' }, - payload: { - key: 'name', - value: 'new name', - }, - } - ); - expect(alert.alert.name).toBe('new name'); - - const updatedAlert = alertReducer( - { alert: initialAlert }, - { - command: { type: 'setAlert' }, - payload: { - key: 'alert', - value: initialAlert, - }, - } - ); - expect(updatedAlert.alert.name).toBeUndefined(); - }); - - test('if property name was changed', () => { - const updatedAlert = alertReducer( - { alert: initialAlert }, - { - command: { type: 'setProperty' }, - payload: { - key: 'name', - value: 'new name', - }, - } - ); - expect(updatedAlert.alert.name).toBe('new name'); - }); - - test('if initial schedule property was updated', () => { - const updatedAlert = alertReducer( - { alert: initialAlert }, - { - command: { type: 'setScheduleProperty' }, - payload: { - key: 'interval', - value: '10s', - }, - } - ); - expect(updatedAlert.alert.schedule.interval).toBe('10s'); - }); - - test('if alert params property was added and updated', () => { - const updatedAlert = alertReducer( - { alert: initialAlert }, - { - command: { type: 'setRuleParams' }, - payload: { - key: 'testParam', - value: 'new test params property', - }, - } - ); - expect(updatedAlert.alert.params.testParam).toBe('new test params property'); - - const updatedAlertParamsProperty = alertReducer( - { alert: updatedAlert.alert }, - { - command: { type: 'setRuleParams' }, - payload: { - key: 'testParam', - value: 'test params property updated', - }, - } - ); - expect(updatedAlertParamsProperty.alert.params.testParam).toBe('test params property updated'); - }); - - test('if alert action params property was added and updated', () => { - initialAlert.actions.push({ - id: '', - actionTypeId: 'testId', - group: 'Alert', - params: {}, - }); - const updatedAlert = alertReducer( - { alert: initialAlert }, - { - command: { type: 'setAlertActionParams' }, - payload: { - key: 'testActionParam', - value: 'new test action params property', - index: 0, - }, - } - ); - expect(updatedAlert.alert.actions[0].params.testActionParam).toBe( - 'new test action params property' - ); - - const updatedAlertActionParamsProperty = alertReducer( - { alert: updatedAlert.alert }, - { - command: { type: 'setAlertActionParams' }, - payload: { - key: 'testActionParam', - value: 'test action params property updated', - index: 0, - }, - } - ); - expect(updatedAlertActionParamsProperty.alert.actions[0].params.testActionParam).toBe( - 'test action params property updated' - ); - }); - - test('if the existing alert action params property was set to undefined (when other connector was selected)', () => { - initialAlert.actions.push({ - id: '', - actionTypeId: 'testId', - group: 'Alert', - params: { - testActionParam: 'some value', - }, - }); - const updatedAlert = alertReducer( - { alert: initialAlert }, - { - command: { type: 'setAlertActionParams' }, - payload: { - key: 'testActionParam', - value: undefined, - index: 0, - }, - } - ); - expect(updatedAlert.alert.actions[0].params.testActionParam).toBe(undefined); - }); - - test('if alert action property was updated', () => { - initialAlert.actions.push({ - id: '', - actionTypeId: 'testId', - group: 'Alert', - params: {}, - }); - const updatedAlert = alertReducer( - { alert: initialAlert }, - { - command: { type: 'setAlertActionProperty' }, - payload: { - key: 'group', - value: 'Warning', - index: 0, - }, - } - ); - expect(updatedAlert.alert.actions[0].group).toBe('Warning'); - }); -}); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_reducer.ts b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_reducer.ts deleted file mode 100644 index 5099fa61bdb38..0000000000000 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_reducer.ts +++ /dev/null @@ -1,203 +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 { SavedObjectAttribute } from 'kibana/public'; -import { isEqual } from 'lodash'; -import { Reducer } from 'react'; -import { AlertActionParam, IntervalSchedule } from '../../../../../alerting/common'; -import { Rule, AlertAction } from '../../../types'; - -export type InitialAlert = Partial & - Pick; - -interface CommandType< - T extends - | 'setAlert' - | 'setProperty' - | 'setScheduleProperty' - | 'setRuleParams' - | 'setAlertActionParams' - | 'setAlertActionProperty' -> { - type: T; -} - -export interface AlertState { - alert: InitialAlert; -} - -interface Payload { - key: Keys; - value: Value; - index?: number; -} - -interface AlertPayload { - key: Key; - value: Rule[Key] | null; - index?: number; -} - -interface AlertActionPayload { - key: Key; - value: AlertAction[Key] | null; - index?: number; -} - -interface AlertSchedulePayload { - key: Key; - value: IntervalSchedule[Key]; - index?: number; -} - -export type AlertReducerAction = - | { - command: CommandType<'setAlert'>; - payload: Payload<'alert', InitialAlert>; - } - | { - command: CommandType<'setProperty'>; - payload: AlertPayload; - } - | { - command: CommandType<'setScheduleProperty'>; - payload: AlertSchedulePayload; - } - | { - command: CommandType<'setRuleParams'>; - payload: Payload; - } - | { - command: CommandType<'setAlertActionParams'>; - payload: Payload; - } - | { - command: CommandType<'setAlertActionProperty'>; - payload: AlertActionPayload; - }; - -export type InitialAlertReducer = Reducer<{ alert: InitialAlert }, AlertReducerAction>; -export type ConcreteAlertReducer = Reducer<{ alert: Rule }, AlertReducerAction>; - -export const alertReducer = ( - state: { alert: AlertPhase }, - action: AlertReducerAction -) => { - const { alert } = state; - - switch (action.command.type) { - case 'setAlert': { - const { key, value } = action.payload as Payload<'alert', AlertPhase>; - if (key === 'alert') { - return { - ...state, - alert: value, - }; - } else { - return state; - } - } - case 'setProperty': { - const { key, value } = action.payload as AlertPayload; - if (isEqual(alert[key], value)) { - return state; - } else { - return { - ...state, - alert: { - ...alert, - [key]: value, - }, - }; - } - } - case 'setScheduleProperty': { - const { key, value } = action.payload as AlertSchedulePayload; - if (alert.schedule && isEqual(alert.schedule[key], value)) { - return state; - } else { - return { - ...state, - alert: { - ...alert, - schedule: { - ...alert.schedule, - [key]: value, - }, - }, - }; - } - } - case 'setRuleParams': { - const { key, value } = action.payload as Payload>; - if (isEqual(alert.params[key], value)) { - return state; - } else { - return { - ...state, - alert: { - ...alert, - params: { - ...alert.params, - [key]: value, - }, - }, - }; - } - } - case 'setAlertActionParams': { - const { key, value, index } = action.payload as Payload< - keyof AlertAction, - SavedObjectAttribute - >; - if ( - index === undefined || - alert.actions[index] == null || - (!!alert.actions[index][key] && isEqual(alert.actions[index][key], value)) - ) { - return state; - } else { - const oldAction = alert.actions.splice(index, 1)[0]; - const updatedAction = { - ...oldAction, - params: { - ...oldAction.params, - [key]: value, - }, - }; - alert.actions.splice(index, 0, updatedAction); - return { - ...state, - alert: { - ...alert, - actions: [...alert.actions], - }, - }; - } - } - case 'setAlertActionProperty': { - const { key, value, index } = action.payload as AlertActionPayload; - if (index === undefined || isEqual(alert.actions[index][key], value)) { - return state; - } else { - const oldAction = alert.actions.splice(index, 1)[0]; - const updatedAction = { - ...oldAction, - [key]: value, - }; - alert.actions.splice(index, 0, updatedAction); - return { - ...state, - alert: { - ...alert, - actions: [...alert.actions], - }, - }; - } - } - } -}; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/has_alert_changed.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/has_alert_changed.test.ts deleted file mode 100644 index 580c8914c97b3..0000000000000 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/has_alert_changed.test.ts +++ /dev/null @@ -1,165 +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 { InitialAlert } from './alert_reducer'; -import { hasAlertChanged } from './has_alert_changed'; - -function createAlert(overrides = {}): InitialAlert { - return { - params: {}, - consumer: 'test', - alertTypeId: 'test', - schedule: { - interval: '1m', - }, - actions: [], - tags: [], - notifyWhen: 'onActionGroupChange', - ...overrides, - }; -} - -test('should return false for same alert', () => { - const a = createAlert(); - expect(hasAlertChanged(a, a, true)).toEqual(false); -}); - -test('should return true for different alert', () => { - const a = createAlert(); - const b = createAlert({ alertTypeId: 'differentTest' }); - expect(hasAlertChanged(a, b, true)).toEqual(true); -}); - -test('should correctly compare name field', () => { - // name field doesn't exist initially - const a = createAlert(); - // set name to actual value - const b = createAlert({ name: 'myAlert' }); - // set name to different value - const c = createAlert({ name: 'anotherAlert' }); - // set name to various empty/null/undefined states - const d = createAlert({ name: '' }); - const e = createAlert({ name: undefined }); - const f = createAlert({ name: null }); - - expect(hasAlertChanged(a, b, true)).toEqual(true); - expect(hasAlertChanged(a, c, true)).toEqual(true); - expect(hasAlertChanged(a, d, true)).toEqual(false); - expect(hasAlertChanged(a, e, true)).toEqual(false); - expect(hasAlertChanged(a, f, true)).toEqual(false); - - expect(hasAlertChanged(b, c, true)).toEqual(true); - expect(hasAlertChanged(b, d, true)).toEqual(true); - expect(hasAlertChanged(b, e, true)).toEqual(true); - expect(hasAlertChanged(b, f, true)).toEqual(true); - - expect(hasAlertChanged(c, d, true)).toEqual(true); - expect(hasAlertChanged(c, e, true)).toEqual(true); - expect(hasAlertChanged(c, f, true)).toEqual(true); - - expect(hasAlertChanged(d, e, true)).toEqual(false); - expect(hasAlertChanged(d, f, true)).toEqual(false); -}); - -test('should correctly compare alertTypeId field', () => { - const a = createAlert(); - - // set alertTypeId to different value - const b = createAlert({ alertTypeId: 'myAlertId' }); - // set alertTypeId to various empty/null/undefined states - const c = createAlert({ alertTypeId: '' }); - const d = createAlert({ alertTypeId: undefined }); - const e = createAlert({ alertTypeId: null }); - - expect(hasAlertChanged(a, b, true)).toEqual(true); - expect(hasAlertChanged(a, c, true)).toEqual(true); - expect(hasAlertChanged(a, d, true)).toEqual(true); - expect(hasAlertChanged(a, e, true)).toEqual(true); - - expect(hasAlertChanged(b, c, true)).toEqual(true); - expect(hasAlertChanged(b, d, true)).toEqual(true); - expect(hasAlertChanged(b, e, true)).toEqual(true); - - expect(hasAlertChanged(c, d, true)).toEqual(false); - expect(hasAlertChanged(c, e, true)).toEqual(false); - expect(hasAlertChanged(d, e, true)).toEqual(false); -}); - -test('should correctly compare throttle field', () => { - // throttle field doesn't exist initially - const a = createAlert(); - // set throttle to actual value - const b = createAlert({ throttle: '1m' }); - // set throttle to different value - const c = createAlert({ throttle: '1h' }); - // set throttle to various empty/null/undefined states - const d = createAlert({ throttle: '' }); - const e = createAlert({ throttle: undefined }); - const f = createAlert({ throttle: null }); - - expect(hasAlertChanged(a, b, true)).toEqual(true); - expect(hasAlertChanged(a, c, true)).toEqual(true); - expect(hasAlertChanged(a, d, true)).toEqual(false); - expect(hasAlertChanged(a, e, true)).toEqual(false); - expect(hasAlertChanged(a, f, true)).toEqual(false); - - expect(hasAlertChanged(b, c, true)).toEqual(true); - expect(hasAlertChanged(b, d, true)).toEqual(true); - expect(hasAlertChanged(b, e, true)).toEqual(true); - expect(hasAlertChanged(b, f, true)).toEqual(true); - - expect(hasAlertChanged(c, d, true)).toEqual(true); - expect(hasAlertChanged(c, e, true)).toEqual(true); - expect(hasAlertChanged(c, f, true)).toEqual(true); - - expect(hasAlertChanged(d, e, true)).toEqual(false); - expect(hasAlertChanged(d, f, true)).toEqual(false); -}); - -test('should correctly compare tags field', () => { - const a = createAlert(); - const b = createAlert({ tags: ['first'] }); - - expect(hasAlertChanged(a, b, true)).toEqual(true); -}); - -test('should correctly compare schedule field', () => { - const a = createAlert(); - const b = createAlert({ schedule: { interval: '3h' } }); - - expect(hasAlertChanged(a, b, true)).toEqual(true); -}); - -test('should correctly compare actions field', () => { - const a = createAlert(); - const b = createAlert({ - actions: [{ actionTypeId: 'action', group: 'group', id: 'actionId', params: {} }], - }); - - expect(hasAlertChanged(a, b, true)).toEqual(true); -}); - -test('should skip comparing params field if compareParams=false', () => { - const a = createAlert(); - const b = createAlert({ params: { newParam: 'value' } }); - - expect(hasAlertChanged(a, b, false)).toEqual(false); -}); - -test('should correctly compare params field if compareParams=true', () => { - const a = createAlert(); - const b = createAlert({ params: { newParam: 'value' } }); - - expect(hasAlertChanged(a, b, true)).toEqual(true); -}); - -test('should correctly compare notifyWhen field', () => { - const a = createAlert(); - const b = createAlert({ notifyWhen: 'onActiveAlert' }); - - expect(hasAlertChanged(a, b, true)).toEqual(true); -}); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/bulk_operation_popover.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/bulk_operation_popover.tsx index f4edf0ad1a9b8..fe8382e224ffd 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/bulk_operation_popover.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/bulk_operation_popover.tsx @@ -25,7 +25,7 @@ export const BulkOperationPopover: React.FunctionComponent = ({ children }) => { onClick={() => setIsPopoverOpen(!isPopoverOpen)} > diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/alert_quick_edit_buttons.scss b/x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/rule_quick_edit_buttons.scss similarity index 100% rename from x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/alert_quick_edit_buttons.scss rename to x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/rule_quick_edit_buttons.scss diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/alert_quick_edit_buttons.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/rule_quick_edit_buttons.tsx similarity index 58% rename from x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/alert_quick_edit_buttons.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/rule_quick_edit_buttons.tsx index 347ebb227e445..208fbcde88143 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/alert_quick_edit_buttons.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/rule_quick_edit_buttons.tsx @@ -10,207 +10,207 @@ import React, { useState } from 'react'; import { FormattedMessage } from '@kbn/i18n-react'; import { EuiButtonEmpty, EuiFlexItem, EuiFlexGroup } from '@elastic/eui'; -import { AlertTableItem } from '../../../../types'; +import { RuleTableItem } from '../../../../types'; import { - withBulkAlertOperations, + withBulkRuleOperations, ComponentOpts as BulkOperationsComponentOpts, -} from './with_bulk_alert_api_operations'; -import './alert_quick_edit_buttons.scss'; +} from './with_bulk_rule_api_operations'; +import './rule_quick_edit_buttons.scss'; import { useKibana } from '../../../../common/lib/kibana'; export type ComponentOpts = { - selectedItems: AlertTableItem[]; + selectedItems: RuleTableItem[]; onPerformingAction?: () => void; onActionPerformed?: () => void; - setAlertsToDelete: React.Dispatch>; + setRulesToDelete: React.Dispatch>; } & BulkOperationsComponentOpts; -export const AlertQuickEditButtons: React.FunctionComponent = ({ +export const RuleQuickEditButtons: React.FunctionComponent = ({ selectedItems, onPerformingAction = noop, onActionPerformed = noop, - muteAlerts, - unmuteAlerts, - enableAlerts, - disableAlerts, - setAlertsToDelete, + muteRules, + unmuteRules, + enableRules, + disableRules, + setRulesToDelete, }: ComponentOpts) => { const { notifications: { toasts }, } = useKibana().services; - const [isMutingAlerts, setIsMutingAlerts] = useState(false); - const [isUnmutingAlerts, setIsUnmutingAlerts] = useState(false); - const [isEnablingAlerts, setIsEnablingAlerts] = useState(false); - const [isDisablingAlerts, setIsDisablingAlerts] = useState(false); - const [isDeletingAlerts, setIsDeletingAlerts] = useState(false); + const [isMutingRules, setIsMutingRules] = useState(false); + const [isUnmutingRules, setIsUnmutingRules] = useState(false); + const [isEnablingRules, setIsEnablingRules] = useState(false); + const [isDisablingRules, setIsDisablingRules] = useState(false); + const [isDeletingRules, setIsDeletingRules] = useState(false); - const allAlertsMuted = selectedItems.every(isAlertMuted); - const allAlertsDisabled = selectedItems.every(isAlertDisabled); + const allRulesMuted = selectedItems.every(isRuleMuted); + const allRulesDisabled = selectedItems.every(isRuleDisabled); const isPerformingAction = - isMutingAlerts || isUnmutingAlerts || isEnablingAlerts || isDisablingAlerts || isDeletingAlerts; + isMutingRules || isUnmutingRules || isEnablingRules || isDisablingRules || isDeletingRules; - const hasDisabledByLicenseAlertTypes = !!selectedItems.find( + const hasDisabledByLicenseRuleTypes = !!selectedItems.find( (alertItem) => !alertItem.enabledInLicense ); async function onmMuteAllClick() { onPerformingAction(); - setIsMutingAlerts(true); + setIsMutingRules(true); try { - await muteAlerts(selectedItems); + await muteRules(selectedItems); } catch (e) { toasts.addDanger({ title: i18n.translate( - 'xpack.triggersActionsUI.sections.alertsList.bulkActionPopover.failedToMuteRulesMessage', + 'xpack.triggersActionsUI.sections.rulesList.bulkActionPopover.failedToMuteRulesMessage', { defaultMessage: 'Failed to mute rule(s)', } ), }); } finally { - setIsMutingAlerts(false); + setIsMutingRules(false); onActionPerformed(); } } async function onUnmuteAllClick() { onPerformingAction(); - setIsUnmutingAlerts(true); + setIsUnmutingRules(true); try { - await unmuteAlerts(selectedItems); + await unmuteRules(selectedItems); } catch (e) { toasts.addDanger({ title: i18n.translate( - 'xpack.triggersActionsUI.sections.alertsList.bulkActionPopover.failedToUnmuteRulesMessage', + 'xpack.triggersActionsUI.sections.rulesList.bulkActionPopover.failedToUnmuteRulesMessage', { defaultMessage: 'Failed to unmute rule(s)', } ), }); } finally { - setIsUnmutingAlerts(false); + setIsUnmutingRules(false); onActionPerformed(); } } async function onEnableAllClick() { onPerformingAction(); - setIsEnablingAlerts(true); + setIsEnablingRules(true); try { - await enableAlerts(selectedItems); + await enableRules(selectedItems); } catch (e) { toasts.addDanger({ title: i18n.translate( - 'xpack.triggersActionsUI.sections.alertsList.bulkActionPopover.failedToEnableRulesMessage', + 'xpack.triggersActionsUI.sections.rulesList.bulkActionPopover.failedToEnableRulesMessage', { defaultMessage: 'Failed to enable rule(s)', } ), }); } finally { - setIsEnablingAlerts(false); + setIsEnablingRules(false); onActionPerformed(); } } async function onDisableAllClick() { onPerformingAction(); - setIsDisablingAlerts(true); + setIsDisablingRules(true); try { - await disableAlerts(selectedItems); + await disableRules(selectedItems); } catch (e) { toasts.addDanger({ title: i18n.translate( - 'xpack.triggersActionsUI.sections.alertsList.bulkActionPopover.failedToDisableRulesMessage', + 'xpack.triggersActionsUI.sections.rulesList.bulkActionPopover.failedToDisableRulesMessage', { defaultMessage: 'Failed to disable rule(s)', } ), }); } finally { - setIsDisablingAlerts(false); + setIsDisablingRules(false); onActionPerformed(); } } async function deleteSelectedItems() { onPerformingAction(); - setIsDeletingAlerts(true); + setIsDeletingRules(true); try { - setAlertsToDelete(selectedItems.map((selected: any) => selected.id)); + setRulesToDelete(selectedItems.map((selected: any) => selected.id)); } catch (e) { toasts.addDanger({ title: i18n.translate( - 'xpack.triggersActionsUI.sections.alertsList.bulkActionPopover.failedToDeleteRulesMessage', + 'xpack.triggersActionsUI.sections.rulesList.bulkActionPopover.failedToDeleteRulesMessage', { defaultMessage: 'Failed to delete rule(s)', } ), }); } finally { - setIsDeletingAlerts(false); + setIsDeletingRules(false); onActionPerformed(); } } return ( - {!allAlertsMuted && ( + {!allRulesMuted && ( )} - {allAlertsMuted && ( + {allRulesMuted && ( )} - {allAlertsDisabled && ( + {allRulesDisabled && ( )} - {!allAlertsDisabled && ( + {!allRulesDisabled && ( @@ -219,7 +219,7 @@ export const AlertQuickEditButtons: React.FunctionComponent = ({ = ({ className="actBulkActionPopover__deleteAll" > @@ -236,13 +236,13 @@ export const AlertQuickEditButtons: React.FunctionComponent = ({ ); }; -export const AlertQuickEditButtonsWithApi = withBulkAlertOperations(AlertQuickEditButtons); +export const RuleQuickEditButtonsWithApi = withBulkRuleOperations(RuleQuickEditButtons); -function isAlertDisabled(alert: AlertTableItem) { +function isRuleDisabled(alert: RuleTableItem) { return alert.enabled === false; } -function isAlertMuted(alert: AlertTableItem) { +function isRuleMuted(alert: RuleTableItem) { return alert.muteAll === true; } diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/with_bulk_alert_api_operations.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/with_bulk_alert_api_operations.test.tsx deleted file mode 100644 index d2194d2246944..0000000000000 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/with_bulk_alert_api_operations.test.tsx +++ /dev/null @@ -1,277 +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 React from 'react'; -import { shallow, mount } from 'enzyme'; -import uuid from 'uuid'; -import { withBulkAlertOperations, ComponentOpts } from './with_bulk_alert_api_operations'; -import * as alertApi from '../../../lib/alert_api'; -import { Rule } from '../../../../types'; -import { useKibana } from '../../../../common/lib/kibana'; -jest.mock('../../../../common/lib/kibana'); - -jest.mock('../../../lib/alert_api'); -const useKibanaMock = useKibana as jest.Mocked; - -describe('with_bulk_alert_api_operations', () => { - beforeEach(() => { - jest.clearAllMocks(); - }); - - it('extends any component with AlertApi methods', () => { - const ComponentToExtend = (props: ComponentOpts) => { - expect(typeof props.muteAlerts).toEqual('function'); - expect(typeof props.unmuteAlerts).toEqual('function'); - expect(typeof props.enableAlerts).toEqual('function'); - expect(typeof props.disableAlerts).toEqual('function'); - expect(typeof props.deleteAlerts).toEqual('function'); - expect(typeof props.muteAlert).toEqual('function'); - expect(typeof props.unmuteAlert).toEqual('function'); - expect(typeof props.enableAlert).toEqual('function'); - expect(typeof props.disableAlert).toEqual('function'); - expect(typeof props.deleteAlert).toEqual('function'); - expect(typeof props.loadAlert).toEqual('function'); - expect(typeof props.loadAlertTypes).toEqual('function'); - expect(typeof props.resolveRule).toEqual('function'); - return
; - }; - - const ExtendedComponent = withBulkAlertOperations(ComponentToExtend); - expect(shallow().type()).toEqual(ComponentToExtend); - }); - - // single alert - it('muteAlert calls the muteAlert api', () => { - const { http } = useKibanaMock().services; - const ComponentToExtend = ({ muteAlert, alert }: ComponentOpts & { alert: Rule }) => { - return ; - }; - - const ExtendedComponent = withBulkAlertOperations(ComponentToExtend); - const alert = mockAlert(); - const component = mount(); - component.find('button').simulate('click'); - - expect(alertApi.muteAlert).toHaveBeenCalledTimes(1); - expect(alertApi.muteAlert).toHaveBeenCalledWith({ id: alert.id, http }); - }); - - it('unmuteAlert calls the unmuteAlert api', () => { - const { http } = useKibanaMock().services; - const ComponentToExtend = ({ unmuteAlert, alert }: ComponentOpts & { alert: Rule }) => { - return ; - }; - - const ExtendedComponent = withBulkAlertOperations(ComponentToExtend); - const alert = mockAlert({ muteAll: true }); - const component = mount(); - component.find('button').simulate('click'); - - expect(alertApi.unmuteAlert).toHaveBeenCalledTimes(1); - expect(alertApi.unmuteAlert).toHaveBeenCalledWith({ id: alert.id, http }); - }); - - it('enableAlert calls the muteAlerts api', () => { - const { http } = useKibanaMock().services; - const ComponentToExtend = ({ enableAlert, alert }: ComponentOpts & { alert: Rule }) => { - return ; - }; - - const ExtendedComponent = withBulkAlertOperations(ComponentToExtend); - const alert = mockAlert({ enabled: false }); - const component = mount(); - component.find('button').simulate('click'); - - expect(alertApi.enableAlert).toHaveBeenCalledTimes(1); - expect(alertApi.enableAlert).toHaveBeenCalledWith({ id: alert.id, http }); - }); - - it('disableAlert calls the disableAlert api', () => { - const { http } = useKibanaMock().services; - const ComponentToExtend = ({ disableAlert, alert }: ComponentOpts & { alert: Rule }) => { - return ; - }; - - const ExtendedComponent = withBulkAlertOperations(ComponentToExtend); - const alert = mockAlert(); - const component = mount(); - component.find('button').simulate('click'); - - expect(alertApi.disableAlert).toHaveBeenCalledTimes(1); - expect(alertApi.disableAlert).toHaveBeenCalledWith({ id: alert.id, http }); - }); - - it('deleteAlert calls the deleteAlert api', () => { - const { http } = useKibanaMock().services; - const ComponentToExtend = ({ deleteAlert, alert }: ComponentOpts & { alert: Rule }) => { - return ; - }; - - const ExtendedComponent = withBulkAlertOperations(ComponentToExtend); - const alert = mockAlert(); - const component = mount(); - component.find('button').simulate('click'); - - expect(alertApi.deleteAlerts).toHaveBeenCalledTimes(1); - expect(alertApi.deleteAlerts).toHaveBeenCalledWith({ ids: [alert.id], http }); - }); - - // bulk alerts - it('muteAlerts calls the muteAlerts api', () => { - const { http } = useKibanaMock().services; - const ComponentToExtend = ({ muteAlerts, alerts }: ComponentOpts & { alerts: Rule[] }) => { - return ; - }; - - const ExtendedComponent = withBulkAlertOperations(ComponentToExtend); - const alerts = [mockAlert(), mockAlert()]; - const component = mount(); - component.find('button').simulate('click'); - - expect(alertApi.muteAlerts).toHaveBeenCalledTimes(1); - expect(alertApi.muteAlerts).toHaveBeenCalledWith({ ids: [alerts[0].id, alerts[1].id], http }); - }); - - it('unmuteAlerts calls the unmuteAlerts api', () => { - const { http } = useKibanaMock().services; - const ComponentToExtend = ({ unmuteAlerts, alerts }: ComponentOpts & { alerts: Rule[] }) => { - return ; - }; - - const ExtendedComponent = withBulkAlertOperations(ComponentToExtend); - const alerts = [mockAlert({ muteAll: true }), mockAlert({ muteAll: true })]; - const component = mount(); - component.find('button').simulate('click'); - - expect(alertApi.unmuteAlerts).toHaveBeenCalledTimes(1); - expect(alertApi.unmuteAlerts).toHaveBeenCalledWith({ ids: [alerts[0].id, alerts[1].id], http }); - }); - - it('enableAlerts calls the muteAlertss api', () => { - const { http } = useKibanaMock().services; - const ComponentToExtend = ({ enableAlerts, alerts }: ComponentOpts & { alerts: Rule[] }) => { - return ; - }; - - const ExtendedComponent = withBulkAlertOperations(ComponentToExtend); - const alerts = [ - mockAlert({ enabled: false }), - mockAlert({ enabled: true }), - mockAlert({ enabled: false }), - ]; - const component = mount(); - component.find('button').simulate('click'); - - expect(alertApi.enableAlerts).toHaveBeenCalledTimes(1); - expect(alertApi.enableAlerts).toHaveBeenCalledWith({ ids: [alerts[0].id, alerts[2].id], http }); - }); - - it('disableAlerts calls the disableAlerts api', () => { - const { http } = useKibanaMock().services; - const ComponentToExtend = ({ disableAlerts, alerts }: ComponentOpts & { alerts: Rule[] }) => { - return ; - }; - - const ExtendedComponent = withBulkAlertOperations(ComponentToExtend); - const alerts = [mockAlert(), mockAlert()]; - const component = mount(); - component.find('button').simulate('click'); - - expect(alertApi.disableAlerts).toHaveBeenCalledTimes(1); - expect(alertApi.disableAlerts).toHaveBeenCalledWith({ - ids: [alerts[0].id, alerts[1].id], - http, - }); - }); - - it('deleteAlerts calls the deleteAlerts api', () => { - const { http } = useKibanaMock().services; - const ComponentToExtend = ({ deleteAlerts, alerts }: ComponentOpts & { alerts: Rule[] }) => { - return ; - }; - - const ExtendedComponent = withBulkAlertOperations(ComponentToExtend); - const alerts = [mockAlert(), mockAlert()]; - const component = mount(); - component.find('button').simulate('click'); - - expect(alertApi.deleteAlerts).toHaveBeenCalledTimes(1); - expect(alertApi.deleteAlerts).toHaveBeenCalledWith({ ids: [alerts[0].id, alerts[1].id], http }); - }); - - it('loadAlert calls the loadAlert api', () => { - const { http } = useKibanaMock().services; - const ComponentToExtend = ({ loadAlert, alertId }: ComponentOpts & { alertId: Rule['id'] }) => { - return ; - }; - - const ExtendedComponent = withBulkAlertOperations(ComponentToExtend); - const alertId = uuid.v4(); - const component = mount(); - component.find('button').simulate('click'); - - expect(alertApi.loadAlert).toHaveBeenCalledTimes(1); - expect(alertApi.loadAlert).toHaveBeenCalledWith({ alertId, http }); - }); - - it('resolveRule calls the resolveRule api', () => { - const { http } = useKibanaMock().services; - const ComponentToExtend = ({ resolveRule, ruleId }: ComponentOpts & { ruleId: Rule['id'] }) => { - return ; - }; - - const ExtendedComponent = withBulkAlertOperations(ComponentToExtend); - const ruleId = uuid.v4(); - const component = mount(); - component.find('button').simulate('click'); - - expect(alertApi.resolveRule).toHaveBeenCalledTimes(1); - expect(alertApi.resolveRule).toHaveBeenCalledWith({ ruleId, http }); - }); - - it('loadAlertTypes calls the loadAlertTypes api', () => { - const { http } = useKibanaMock().services; - const ComponentToExtend = ({ loadAlertTypes }: ComponentOpts) => { - return ; - }; - - const ExtendedComponent = withBulkAlertOperations(ComponentToExtend); - const component = mount(); - component.find('button').simulate('click'); - - expect(alertApi.loadAlertTypes).toHaveBeenCalledTimes(1); - expect(alertApi.loadAlertTypes).toHaveBeenCalledWith({ http }); - }); -}); - -function mockAlert(overloads: Partial = {}): Rule { - return { - id: uuid.v4(), - enabled: true, - name: `alert-${uuid.v4()}`, - tags: [], - alertTypeId: '.noop', - consumer: 'consumer', - schedule: { interval: '1m' }, - actions: [], - params: {}, - createdBy: null, - updatedBy: null, - createdAt: new Date(), - updatedAt: new Date(), - apiKeyOwner: null, - throttle: null, - notifyWhen: null, - muteAll: false, - mutedInstanceIds: [], - executionStatus: { - status: 'unknown', - lastExecutionDate: new Date('2020-08-20T19:23:38Z'), - }, - ...overloads, - }; -} diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/with_bulk_alert_api_operations.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/with_bulk_alert_api_operations.tsx deleted file mode 100644 index 0308e17ac342c..0000000000000 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/with_bulk_alert_api_operations.tsx +++ /dev/null @@ -1,151 +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 { - Rule, - RuleType, - RuleTaskState, - AlertSummary, - AlertingFrameworkHealth, - ResolvedRule, -} from '../../../../types'; -import { - deleteAlerts, - disableAlerts, - enableAlerts, - muteAlerts, - unmuteAlerts, - disableAlert, - enableAlert, - muteAlert, - unmuteAlert, - muteAlertInstance, - unmuteAlertInstance, - loadAlert, - loadAlertState, - loadAlertSummary, - loadAlertTypes, - alertingFrameworkHealth, - resolveRule, -} from '../../../lib/alert_api'; -import { useKibana } from '../../../../common/lib/kibana'; - -export interface ComponentOpts { - muteAlerts: (alerts: Rule[]) => Promise; - unmuteAlerts: (alerts: Rule[]) => Promise; - enableAlerts: (alerts: Rule[]) => Promise; - disableAlerts: (alerts: Rule[]) => Promise; - deleteAlerts: (alerts: Rule[]) => Promise<{ - successes: string[]; - errors: string[]; - }>; - muteAlert: (alert: Rule) => Promise; - unmuteAlert: (alert: Rule) => Promise; - muteAlertInstance: (alert: Rule, alertInstanceId: string) => Promise; - unmuteAlertInstance: (alert: Rule, alertInstanceId: string) => Promise; - enableAlert: (alert: Rule) => Promise; - disableAlert: (alert: Rule) => Promise; - deleteAlert: (alert: Rule) => Promise<{ - successes: string[]; - errors: string[]; - }>; - loadAlert: (id: Rule['id']) => Promise; - loadAlertState: (id: Rule['id']) => Promise; - loadAlertSummary: (id: Rule['id'], numberOfExecutions?: number) => Promise; - loadAlertTypes: () => Promise; - getHealth: () => Promise; - resolveRule: (id: Rule['id']) => Promise; -} - -export type PropsWithOptionalApiHandlers = Omit & Partial; - -export function withBulkAlertOperations( - WrappedComponent: React.ComponentType -): React.FunctionComponent> { - return (props: PropsWithOptionalApiHandlers) => { - const { http } = useKibana().services; - return ( - - muteAlerts({ - http, - ids: items.filter((item) => !isAlertMuted(item)).map((item) => item.id), - }) - } - unmuteAlerts={async (items: Rule[]) => - unmuteAlerts({ http, ids: items.filter(isAlertMuted).map((item) => item.id) }) - } - enableAlerts={async (items: Rule[]) => - enableAlerts({ http, ids: items.filter(isAlertDisabled).map((item) => item.id) }) - } - disableAlerts={async (items: Rule[]) => - disableAlerts({ - http, - ids: items.filter((item) => !isAlertDisabled(item)).map((item) => item.id), - }) - } - deleteAlerts={async (items: Rule[]) => - deleteAlerts({ http, ids: items.map((item) => item.id) }) - } - muteAlert={async (alert: Rule) => { - if (!isAlertMuted(alert)) { - return await muteAlert({ http, id: alert.id }); - } - }} - unmuteAlert={async (alert: Rule) => { - if (isAlertMuted(alert)) { - return await unmuteAlert({ http, id: alert.id }); - } - }} - muteAlertInstance={async (alert: Rule, instanceId: string) => { - if (!isAlertInstanceMuted(alert, instanceId)) { - return muteAlertInstance({ http, id: alert.id, instanceId }); - } - }} - unmuteAlertInstance={async (alert: Rule, instanceId: string) => { - if (isAlertInstanceMuted(alert, instanceId)) { - return unmuteAlertInstance({ http, id: alert.id, instanceId }); - } - }} - enableAlert={async (alert: Rule) => { - if (isAlertDisabled(alert)) { - return await enableAlert({ http, id: alert.id }); - } - }} - disableAlert={async (alert: Rule) => { - if (!isAlertDisabled(alert)) { - return await disableAlert({ http, id: alert.id }); - } - }} - deleteAlert={async (alert: Rule) => deleteAlerts({ http, ids: [alert.id] })} - loadAlert={async (alertId: Rule['id']) => loadAlert({ http, alertId })} - loadAlertState={async (alertId: Rule['id']) => loadAlertState({ http, alertId })} - loadAlertSummary={async (ruleId: Rule['id'], numberOfExecutions?: number) => - loadAlertSummary({ http, ruleId, numberOfExecutions }) - } - loadAlertTypes={async () => loadAlertTypes({ http })} - resolveRule={async (ruleId: Rule['id']) => resolveRule({ http, ruleId })} - getHealth={async () => alertingFrameworkHealth({ http })} - /> - ); - }; -} - -function isAlertDisabled(alert: Rule) { - return alert.enabled === false; -} - -function isAlertMuted(alert: Rule) { - return alert.muteAll === true; -} - -function isAlertInstanceMuted(alert: Rule, instanceId: string) { - return alert.mutedInstanceIds.findIndex((muted) => muted === instanceId) >= 0; -} diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/with_bulk_rule_api_operations.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/with_bulk_rule_api_operations.test.tsx new file mode 100644 index 0000000000000..d0950c0c75fc2 --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/with_bulk_rule_api_operations.test.tsx @@ -0,0 +1,277 @@ +/* + * 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 React from 'react'; +import { shallow, mount } from 'enzyme'; +import uuid from 'uuid'; +import { withBulkRuleOperations, ComponentOpts } from './with_bulk_rule_api_operations'; +import * as ruleApi from '../../../lib/rule_api'; +import { Rule } from '../../../../types'; +import { useKibana } from '../../../../common/lib/kibana'; +jest.mock('../../../../common/lib/kibana'); + +jest.mock('../../../lib/rule_api'); +const useKibanaMock = useKibana as jest.Mocked; + +describe('with_bulk_rule_api_operations', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('extends any component with RuleApi methods', () => { + const ComponentToExtend = (props: ComponentOpts) => { + expect(typeof props.muteRules).toEqual('function'); + expect(typeof props.unmuteRules).toEqual('function'); + expect(typeof props.enableRules).toEqual('function'); + expect(typeof props.disableRules).toEqual('function'); + expect(typeof props.deleteRules).toEqual('function'); + expect(typeof props.muteRule).toEqual('function'); + expect(typeof props.unmuteRule).toEqual('function'); + expect(typeof props.enableRule).toEqual('function'); + expect(typeof props.disableRule).toEqual('function'); + expect(typeof props.deleteRule).toEqual('function'); + expect(typeof props.loadRule).toEqual('function'); + expect(typeof props.loadRuleTypes).toEqual('function'); + expect(typeof props.resolveRule).toEqual('function'); + return
; + }; + + const ExtendedComponent = withBulkRuleOperations(ComponentToExtend); + expect(shallow().type()).toEqual(ComponentToExtend); + }); + + // single rule + it('muteRule calls the muteRule api', () => { + const { http } = useKibanaMock().services; + const ComponentToExtend = ({ muteRule, rule }: ComponentOpts & { rule: Rule }) => { + return ; + }; + + const ExtendedComponent = withBulkRuleOperations(ComponentToExtend); + const rule = mockRule(); + const component = mount(); + component.find('button').simulate('click'); + + expect(ruleApi.muteRule).toHaveBeenCalledTimes(1); + expect(ruleApi.muteRule).toHaveBeenCalledWith({ id: rule.id, http }); + }); + + it('unmuteRule calls the unmuteRule api', () => { + const { http } = useKibanaMock().services; + const ComponentToExtend = ({ unmuteRule, rule }: ComponentOpts & { rule: Rule }) => { + return ; + }; + + const ExtendedComponent = withBulkRuleOperations(ComponentToExtend); + const rule = mockRule({ muteAll: true }); + const component = mount(); + component.find('button').simulate('click'); + + expect(ruleApi.unmuteRule).toHaveBeenCalledTimes(1); + expect(ruleApi.unmuteRule).toHaveBeenCalledWith({ id: rule.id, http }); + }); + + it('enableRule calls the muteRules api', () => { + const { http } = useKibanaMock().services; + const ComponentToExtend = ({ enableRule, rule }: ComponentOpts & { rule: Rule }) => { + return ; + }; + + const ExtendedComponent = withBulkRuleOperations(ComponentToExtend); + const rule = mockRule({ enabled: false }); + const component = mount(); + component.find('button').simulate('click'); + + expect(ruleApi.enableRule).toHaveBeenCalledTimes(1); + expect(ruleApi.enableRule).toHaveBeenCalledWith({ id: rule.id, http }); + }); + + it('disableRule calls the disableRule api', () => { + const { http } = useKibanaMock().services; + const ComponentToExtend = ({ disableRule, rule }: ComponentOpts & { rule: Rule }) => { + return ; + }; + + const ExtendedComponent = withBulkRuleOperations(ComponentToExtend); + const rule = mockRule(); + const component = mount(); + component.find('button').simulate('click'); + + expect(ruleApi.disableRule).toHaveBeenCalledTimes(1); + expect(ruleApi.disableRule).toHaveBeenCalledWith({ id: rule.id, http }); + }); + + it('deleteRule calls the deleteRule api', () => { + const { http } = useKibanaMock().services; + const ComponentToExtend = ({ deleteRule, rule }: ComponentOpts & { rule: Rule }) => { + return ; + }; + + const ExtendedComponent = withBulkRuleOperations(ComponentToExtend); + const rule = mockRule(); + const component = mount(); + component.find('button').simulate('click'); + + expect(ruleApi.deleteRules).toHaveBeenCalledTimes(1); + expect(ruleApi.deleteRules).toHaveBeenCalledWith({ ids: [rule.id], http }); + }); + + // bulk rules + it('muteRules calls the muteRules api', () => { + const { http } = useKibanaMock().services; + const ComponentToExtend = ({ muteRules, rules }: ComponentOpts & { rules: Rule[] }) => { + return ; + }; + + const ExtendedComponent = withBulkRuleOperations(ComponentToExtend); + const rules = [mockRule(), mockRule()]; + const component = mount(); + component.find('button').simulate('click'); + + expect(ruleApi.muteRules).toHaveBeenCalledTimes(1); + expect(ruleApi.muteRules).toHaveBeenCalledWith({ ids: [rules[0].id, rules[1].id], http }); + }); + + it('unmuteRules calls the unmuteRules api', () => { + const { http } = useKibanaMock().services; + const ComponentToExtend = ({ unmuteRules, rules }: ComponentOpts & { rules: Rule[] }) => { + return ; + }; + + const ExtendedComponent = withBulkRuleOperations(ComponentToExtend); + const rules = [mockRule({ muteAll: true }), mockRule({ muteAll: true })]; + const component = mount(); + component.find('button').simulate('click'); + + expect(ruleApi.unmuteRules).toHaveBeenCalledTimes(1); + expect(ruleApi.unmuteRules).toHaveBeenCalledWith({ ids: [rules[0].id, rules[1].id], http }); + }); + + it('enableRules calls the muteRuless api', () => { + const { http } = useKibanaMock().services; + const ComponentToExtend = ({ enableRules, rules }: ComponentOpts & { rules: Rule[] }) => { + return ; + }; + + const ExtendedComponent = withBulkRuleOperations(ComponentToExtend); + const rules = [ + mockRule({ enabled: false }), + mockRule({ enabled: true }), + mockRule({ enabled: false }), + ]; + const component = mount(); + component.find('button').simulate('click'); + + expect(ruleApi.enableRules).toHaveBeenCalledTimes(1); + expect(ruleApi.enableRules).toHaveBeenCalledWith({ ids: [rules[0].id, rules[2].id], http }); + }); + + it('disableRules calls the disableRules api', () => { + const { http } = useKibanaMock().services; + const ComponentToExtend = ({ disableRules, rules }: ComponentOpts & { rules: Rule[] }) => { + return ; + }; + + const ExtendedComponent = withBulkRuleOperations(ComponentToExtend); + const rules = [mockRule(), mockRule()]; + const component = mount(); + component.find('button').simulate('click'); + + expect(ruleApi.disableRules).toHaveBeenCalledTimes(1); + expect(ruleApi.disableRules).toHaveBeenCalledWith({ + ids: [rules[0].id, rules[1].id], + http, + }); + }); + + it('deleteRules calls the deleteRules api', () => { + const { http } = useKibanaMock().services; + const ComponentToExtend = ({ deleteRules, rules }: ComponentOpts & { rules: Rule[] }) => { + return ; + }; + + const ExtendedComponent = withBulkRuleOperations(ComponentToExtend); + const rules = [mockRule(), mockRule()]; + const component = mount(); + component.find('button').simulate('click'); + + expect(ruleApi.deleteRules).toHaveBeenCalledTimes(1); + expect(ruleApi.deleteRules).toHaveBeenCalledWith({ ids: [rules[0].id, rules[1].id], http }); + }); + + it('loadRule calls the loadRule api', () => { + const { http } = useKibanaMock().services; + const ComponentToExtend = ({ loadRule, ruleId }: ComponentOpts & { ruleId: Rule['id'] }) => { + return ; + }; + + const ExtendedComponent = withBulkRuleOperations(ComponentToExtend); + const ruleId = uuid.v4(); + const component = mount(); + component.find('button').simulate('click'); + + expect(ruleApi.loadRule).toHaveBeenCalledTimes(1); + expect(ruleApi.loadRule).toHaveBeenCalledWith({ ruleId, http }); + }); + + it('resolveRule calls the resolveRule api', () => { + const { http } = useKibanaMock().services; + const ComponentToExtend = ({ resolveRule, ruleId }: ComponentOpts & { ruleId: Rule['id'] }) => { + return ; + }; + + const ExtendedComponent = withBulkRuleOperations(ComponentToExtend); + const ruleId = uuid.v4(); + const component = mount(); + component.find('button').simulate('click'); + + expect(ruleApi.resolveRule).toHaveBeenCalledTimes(1); + expect(ruleApi.resolveRule).toHaveBeenCalledWith({ ruleId, http }); + }); + + it('loadRuleTypes calls the loadRuleTypes api', () => { + const { http } = useKibanaMock().services; + const ComponentToExtend = ({ loadRuleTypes }: ComponentOpts) => { + return ; + }; + + const ExtendedComponent = withBulkRuleOperations(ComponentToExtend); + const component = mount(); + component.find('button').simulate('click'); + + expect(ruleApi.loadRuleTypes).toHaveBeenCalledTimes(1); + expect(ruleApi.loadRuleTypes).toHaveBeenCalledWith({ http }); + }); +}); + +function mockRule(overloads: Partial = {}): Rule { + return { + id: uuid.v4(), + enabled: true, + name: `rule-${uuid.v4()}`, + tags: [], + ruleTypeId: '.noop', + consumer: 'consumer', + schedule: { interval: '1m' }, + actions: [], + params: {}, + createdBy: null, + updatedBy: null, + createdAt: new Date(), + updatedAt: new Date(), + apiKeyOwner: null, + throttle: null, + notifyWhen: null, + muteAll: false, + mutedInstanceIds: [], + executionStatus: { + status: 'unknown', + lastExecutionDate: new Date('2020-08-20T19:23:38Z'), + }, + ...overloads, + }; +} diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/with_bulk_rule_api_operations.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/with_bulk_rule_api_operations.tsx new file mode 100644 index 0000000000000..d9bafe5816d69 --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/with_bulk_rule_api_operations.tsx @@ -0,0 +1,151 @@ +/* + * 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 { + Rule, + RuleType, + RuleTaskState, + RuleSummary, + AlertingFrameworkHealth, + ResolvedRule, +} from '../../../../types'; +import { + deleteRules, + disableRules, + enableRules, + muteRules, + unmuteRules, + disableRule, + enableRule, + muteRule, + unmuteRule, + muteAlertInstance, + unmuteAlertInstance, + loadRule, + loadRuleState, + loadRuleSummary, + loadRuleTypes, + alertingFrameworkHealth, + resolveRule, +} from '../../../lib/rule_api'; +import { useKibana } from '../../../../common/lib/kibana'; + +export interface ComponentOpts { + muteRules: (rules: Rule[]) => Promise; + unmuteRules: (rules: Rule[]) => Promise; + enableRules: (rules: Rule[]) => Promise; + disableRules: (rules: Rule[]) => Promise; + deleteRules: (rules: Rule[]) => Promise<{ + successes: string[]; + errors: string[]; + }>; + muteRule: (rule: Rule) => Promise; + unmuteRule: (rule: Rule) => Promise; + muteAlertInstance: (rule: Rule, alertInstanceId: string) => Promise; + unmuteAlertInstance: (rule: Rule, alertInstanceId: string) => Promise; + enableRule: (rule: Rule) => Promise; + disableRule: (rule: Rule) => Promise; + deleteRule: (rule: Rule) => Promise<{ + successes: string[]; + errors: string[]; + }>; + loadRule: (id: Rule['id']) => Promise; + loadRuleState: (id: Rule['id']) => Promise; + loadRuleSummary: (id: Rule['id'], numberOfExecutions?: number) => Promise; + loadRuleTypes: () => Promise; + getHealth: () => Promise; + resolveRule: (id: Rule['id']) => Promise; +} + +export type PropsWithOptionalApiHandlers = Omit & Partial; + +export function withBulkRuleOperations( + WrappedComponent: React.ComponentType +): React.FunctionComponent> { + return (props: PropsWithOptionalApiHandlers) => { + const { http } = useKibana().services; + return ( + + muteRules({ + http, + ids: items.filter((item) => !isRuleMuted(item)).map((item) => item.id), + }) + } + unmuteRules={async (items: Rule[]) => + unmuteRules({ http, ids: items.filter(isRuleMuted).map((item) => item.id) }) + } + enableRules={async (items: Rule[]) => + enableRules({ http, ids: items.filter(isRuleDisabled).map((item) => item.id) }) + } + disableRules={async (items: Rule[]) => + disableRules({ + http, + ids: items.filter((item) => !isRuleDisabled(item)).map((item) => item.id), + }) + } + deleteRules={async (items: Rule[]) => + deleteRules({ http, ids: items.map((item) => item.id) }) + } + muteRule={async (rule: Rule) => { + if (!isRuleMuted(rule)) { + return await muteRule({ http, id: rule.id }); + } + }} + unmuteRule={async (rule: Rule) => { + if (isRuleMuted(rule)) { + return await unmuteRule({ http, id: rule.id }); + } + }} + muteAlertInstance={async (rule: Rule, instanceId: string) => { + if (!isAlertInstanceMuted(rule, instanceId)) { + return muteAlertInstance({ http, id: rule.id, instanceId }); + } + }} + unmuteAlertInstance={async (rule: Rule, instanceId: string) => { + if (isAlertInstanceMuted(rule, instanceId)) { + return unmuteAlertInstance({ http, id: rule.id, instanceId }); + } + }} + enableRule={async (rule: Rule) => { + if (isRuleDisabled(rule)) { + return await enableRule({ http, id: rule.id }); + } + }} + disableRule={async (rule: Rule) => { + if (!isRuleDisabled(rule)) { + return await disableRule({ http, id: rule.id }); + } + }} + deleteRule={async (rule: Rule) => deleteRules({ http, ids: [rule.id] })} + loadRule={async (ruleId: Rule['id']) => loadRule({ http, ruleId })} + loadRuleState={async (ruleId: Rule['id']) => loadRuleState({ http, ruleId })} + loadRuleSummary={async (ruleId: Rule['id'], numberOfExecutions?: number) => + loadRuleSummary({ http, ruleId, numberOfExecutions }) + } + loadRuleTypes={async () => loadRuleTypes({ http })} + resolveRule={async (ruleId: Rule['id']) => resolveRule({ http, ruleId })} + getHealth={async () => alertingFrameworkHealth({ http })} + /> + ); + }; +} + +function isRuleDisabled(rule: Rule) { + return rule.enabled === false; +} + +function isRuleMuted(rule: Rule) { + return rule.muteAll === true; +} + +function isAlertInstanceMuted(rule: Rule, instanceId: string) { + return rule.mutedInstanceIds.findIndex((muted) => muted === instanceId) >= 0; +} diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/common/connectors.ts b/x-pack/plugins/triggers_actions_ui/public/application/sections/common/connectors.ts index 4bf7f036ba10a..6543d74ecd7a2 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/common/connectors.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/common/connectors.ts @@ -5,11 +5,11 @@ * 2.0. */ -import { ActionConnector, ActionTypeIndex, AlertAction } from '../../../types'; +import { ActionConnector, ActionTypeIndex, RuleAction } from '../../../types'; export const getValidConnectors = ( connectors: ActionConnector[], - actionItem: AlertAction, + actionItem: RuleAction, actionTypesIndex: ActionTypeIndex ): ActionConnector[] => { const actionType = actionTypesIndex[actionItem.actionTypeId]; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/index.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/index.tsx index c3dd76094b5a9..5b8a6ea569344 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/index.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/index.tsx @@ -8,13 +8,16 @@ import { lazy } from 'react'; import { suspendedComponentWithProps } from '../lib/suspended_component_with_props'; -export type { ActionGroupWithCondition, AlertConditionsProps } from './alert_form/alert_conditions'; +export type { + ActionGroupWithCondition, + RuleConditionsProps as AlertConditionsProps, +} from './rule_form/rule_conditions'; -export const AlertConditions = lazy(() => import('./alert_form/alert_conditions')); -export const AlertConditionsGroup = lazy(() => import('./alert_form/alert_conditions_group')); +export const AlertConditions = lazy(() => import('./rule_form/rule_conditions')); +export const AlertConditionsGroup = lazy(() => import('./rule_form/rule_conditions_group')); -export const AlertAdd = suspendedComponentWithProps(lazy(() => import('./alert_form/alert_add'))); -export const AlertEdit = suspendedComponentWithProps(lazy(() => import('./alert_form/alert_edit'))); +export const AlertAdd = suspendedComponentWithProps(lazy(() => import('./rule_form/rule_add'))); +export const AlertEdit = suspendedComponentWithProps(lazy(() => import('./rule_form/rule_edit'))); export const ConnectorAddFlyout = suspendedComponentWithProps( lazy(() => import('./action_connector_form/connector_add_flyout')) diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/rule_muted_switch.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/alert_muted_switch.tsx similarity index 90% rename from x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/rule_muted_switch.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/alert_muted_switch.tsx index ce550243bcc37..3f236ea25a19b 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/rule_muted_switch.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/alert_muted_switch.tsx @@ -8,7 +8,7 @@ import React, { useState } from 'react'; import { EuiSwitch, EuiLoadingSpinner } from '@elastic/eui'; -import { AlertListItem } from './alerts'; +import { AlertListItem } from './rule'; interface ComponentOpts { alert: AlertListItem; @@ -16,7 +16,7 @@ interface ComponentOpts { disabled: boolean; } -export const RuleMutedSwitch: React.FunctionComponent = ({ +export const AlertMutedSwitch: React.FunctionComponent = ({ alert, onMuteAction, disabled, diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alerts.scss b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule.scss similarity index 90% rename from x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alerts.scss rename to x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule.scss index 243ba5bc9c52c..c4d2bf1bbb2d6 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alerts.scss +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule.scss @@ -1,6 +1,6 @@ // Add truncation to heath status -.alertsList__health { +.rulesList__health { width: 100%; .euiFlexItem:last-of-type { @@ -13,4 +13,4 @@ .ruleDurationWarningIcon { bottom: $euiSizeXS; position: relative; -} \ No newline at end of file +} diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alerts.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule.test.tsx similarity index 84% rename from x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alerts.test.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule.test.tsx index 909a562224ef7..ac103f113a8f1 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alerts.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule.test.tsx @@ -10,8 +10,8 @@ import uuid from 'uuid'; import { shallow } from 'enzyme'; import { mountWithIntl, nextTick } from '@kbn/test-jest-helpers'; import { act } from 'react-dom/test-utils'; -import { Alerts, AlertListItem, alertToListItem } from './alerts'; -import { Rule, AlertSummary, AlertStatus, RuleType } from '../../../../types'; +import { RuleComponent, AlertListItem, alertToListItem } from './rule'; +import { Rule, RuleSummary, AlertStatus, RuleType } from '../../../../types'; import { EuiBasicTable } from '@elastic/eui'; import { ExecutionDurationChart } from '../../common/components/execution_duration_chart'; @@ -33,18 +33,18 @@ beforeAll(() => { global.Date.now = jest.fn(() => fakeNow.getTime()); }); -describe('alerts', () => { - it('render a list of alerts', () => { +describe('rules', () => { + it('render a list of rules', () => { const rule = mockRule(); const ruleType = mockRuleType(); - const alertSummary = mockAlertSummary({ + const ruleSummary = mockRuleSummary({ alerts: { - first_alert: { + first_rule: { status: 'OK', muted: false, actionGroupId: 'default', }, - second_alert: { + second_rule: { status: 'Active', muted: false, actionGroupId: 'action group id unknown', @@ -52,47 +52,42 @@ describe('alerts', () => { }, }); - const alerts: AlertListItem[] = [ + const rules: AlertListItem[] = [ // active first - alertToListItem( - fakeNow.getTime(), - ruleType, - 'second_alert', - alertSummary.alerts.second_alert - ), + alertToListItem(fakeNow.getTime(), ruleType, 'second_rule', ruleSummary.alerts.second_rule), // ok second - alertToListItem(fakeNow.getTime(), ruleType, 'first_alert', alertSummary.alerts.first_alert), + alertToListItem(fakeNow.getTime(), ruleType, 'first_rule', ruleSummary.alerts.first_rule), ]; expect( shallow( - ) .find(EuiBasicTable) .prop('items') - ).toEqual(alerts); + ).toEqual(rules); }); it('render a hidden field with duration epoch', () => { const rule = mockRule(); const ruleType = mockRuleType(); - const alertSummary = mockAlertSummary(); + const ruleSummary = mockRuleSummary(); expect( shallow( - ) .find('[name="alertsDurationEpoch"]') @@ -100,7 +95,7 @@ describe('alerts', () => { ).toEqual(fake2MinutesAgo.getTime()); }); - it('render all active alerts', () => { + it('render all active rules', () => { const rule = mockRule(); const ruleType = mockRuleType(); const alerts: Record = { @@ -115,12 +110,12 @@ describe('alerts', () => { }; expect( shallow( - @@ -133,22 +128,22 @@ describe('alerts', () => { ]); }); - it('render all inactive alerts', () => { + it('render all inactive rules', () => { const rule = mockRule({ mutedInstanceIds: ['us-west', 'us-east'], }); const ruleType = mockRuleType(); - const alertUsWest: AlertStatus = { status: 'OK', muted: false }; - const alertUsEast: AlertStatus = { status: 'OK', muted: false }; + const ruleUsWest: AlertStatus = { status: 'OK', muted: false }; + const ruleUsEast: AlertStatus = { status: 'OK', muted: false }; expect( shallow( - { .find(EuiBasicTable) .prop('items') ).toEqual([ - alertToListItem(fakeNow.getTime(), ruleType, 'us-west', alertUsWest), - alertToListItem(fakeNow.getTime(), ruleType, 'us-east', alertUsEast), + alertToListItem(fakeNow.getTime(), ruleType, 'us-west', ruleUsWest), + alertToListItem(fakeNow.getTime(), ruleType, 'us-east', ruleUsEast), ]); }); }); describe('alertToListItem', () => { - it('handles active alerts', () => { + it('handles active rules', () => { const ruleType = mockRuleType({ actionGroups: [ { id: 'default', name: 'Default Action Group' }, @@ -197,7 +192,7 @@ describe('alertToListItem', () => { }); }); - it('handles active alerts with no action group id', () => { + it('handles active rules with no action group id', () => { const ruleType = mockRuleType(); const start = fake2MinutesAgo; const alert: AlertStatus = { @@ -216,7 +211,7 @@ describe('alertToListItem', () => { }); }); - it('handles active muted alerts', () => { + it('handles active muted rules', () => { const ruleType = mockRuleType(); const start = fake2MinutesAgo; const alert: AlertStatus = { @@ -236,7 +231,7 @@ describe('alertToListItem', () => { }); }); - it('handles active alerts with start date', () => { + it('handles active rules with start date', () => { const ruleType = mockRuleType(); const alert: AlertStatus = { status: 'Active', @@ -254,7 +249,7 @@ describe('alertToListItem', () => { }); }); - it('handles muted inactive alerts', () => { + it('handles muted inactive rules', () => { const ruleType = mockRuleType(); const alert: AlertStatus = { status: 'OK', @@ -278,15 +273,15 @@ describe('execution duration overview', () => { executionStatus: { status: 'ok', lastExecutionDate: new Date('2020-08-20T19:23:38Z') }, }); const ruleType = mockRuleType(); - const alertSummary = mockAlertSummary(); + const ruleSummary = mockRuleSummary(); const wrapper = mountWithIntl( - ); @@ -304,17 +299,17 @@ describe('execution duration overview', () => { it('renders average execution duration', async () => { const rule = mockRule(); const ruleType = mockRuleType({ ruleTaskTimeout: '10m' }); - const alertSummary = mockAlertSummary({ + const ruleSummary = mockRuleSummary({ executionDuration: { average: 60284, valuesWithTimestamp: {} }, }); const wrapper = mountWithIntl( - ); @@ -335,17 +330,17 @@ describe('execution duration overview', () => { it('renders warning when average execution duration exceeds rule timeout', async () => { const rule = mockRule(); const ruleType = mockRuleType({ ruleTaskTimeout: '10m' }); - const alertSummary = mockAlertSummary({ + const ruleSummary = mockRuleSummary({ executionDuration: { average: 60284345, valuesWithTimestamp: {} }, }); const wrapper = mountWithIntl( - ); @@ -366,15 +361,15 @@ describe('execution duration overview', () => { it('renders execution duration chart', () => { const rule = mockRule(); const ruleType = mockRuleType(); - const alertSummary = mockAlertSummary(); + const ruleSummary = mockRuleSummary(); expect( shallow( - ) @@ -390,7 +385,7 @@ function mockRule(overloads: Partial = {}): Rule { enabled: true, name: `rule-${uuid.v4()}`, tags: [], - alertTypeId: '.noop', + ruleTypeId: '.noop', consumer: 'consumer', schedule: { interval: '1m' }, actions: [], @@ -425,15 +420,15 @@ function mockRuleType(overloads: Partial = {}): RuleType { defaultActionGroupId: 'default', recoveryActionGroup: { id: 'recovered', name: 'Recovered' }, authorizedConsumers: {}, - producer: 'alerts', + producer: 'rules', minimumLicenseRequired: 'basic', enabledInLicense: true, ...overloads, }; } -function mockAlertSummary(overloads: Partial = {}): AlertSummary { - const summary: AlertSummary = { +function mockRuleSummary(overloads: Partial = {}): RuleSummary { + const summary: RuleSummary = { id: 'rule-id', name: 'rule-name', tags: ['tag-1', 'tag-2'], diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alerts.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule.tsx similarity index 82% rename from x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alerts.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule.tsx index 9d4ef14dec64a..1a08f12c11743 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alerts.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule.tsx @@ -28,36 +28,36 @@ import { AlertExecutionStatusErrorReasons, AlertStatusValues, } from '../../../../../../alerting/common'; -import { Rule, AlertSummary, AlertStatus, RuleType, Pagination } from '../../../../types'; +import { Rule, RuleSummary, AlertStatus, RuleType, Pagination } from '../../../../types'; import { - ComponentOpts as AlertApis, - withBulkAlertOperations, -} from '../../common/components/with_bulk_alert_api_operations'; + ComponentOpts as RuleApis, + withBulkRuleOperations, +} from '../../common/components/with_bulk_rule_api_operations'; import { DEFAULT_SEARCH_PAGE_SIZE } from '../../../constants'; -import './alerts.scss'; -import { RuleMutedSwitch } from './rule_muted_switch'; -import { getHealthColor } from '../../alerts_list/components/alert_status_filter'; +import './rule.scss'; +import { AlertMutedSwitch } from './alert_muted_switch'; +import { getHealthColor } from '../../rules_list/components/rule_status_filter'; import { - alertsStatusesTranslationsMapping, + rulesStatusesTranslationsMapping, ALERT_STATUS_LICENSE_ERROR, -} from '../../alerts_list/translations'; +} from '../../rules_list/translations'; import { formatMillisForDisplay, shouldShowDurationWarning, } from '../../../lib/execution_duration_utils'; import { ExecutionDurationChart } from '../../common/components/execution_duration_chart'; -type AlertsProps = { +type RuleProps = { rule: Rule; ruleType: RuleType; readOnly: boolean; - alertSummary: AlertSummary; + ruleSummary: RuleSummary; requestRefresh: () => Promise; numberOfExecutions: number; onChangeDuration: (length: number) => void; durationEpoch?: number; isLoadingChart?: boolean; -} & Pick; +} & Pick; export const alertsTableColumns = ( onMuteAction: (alert: AlertListItem) => Promise, @@ -65,7 +65,7 @@ export const alertsTableColumns = ( ) => [ { field: 'alert', - name: i18n.translate('xpack.triggersActionsUI.sections.alertDetails.alertsList.columns.alert', { + name: i18n.translate('xpack.triggersActionsUI.sections.ruleDetails.alertsList.columns.Alert', { defaultMessage: 'Alert', }), sortable: false, @@ -82,10 +82,9 @@ export const alertsTableColumns = ( }, { field: 'status', - name: i18n.translate( - 'xpack.triggersActionsUI.sections.alertDetails.alertsList.columns.status', - { defaultMessage: 'Status' } - ), + name: i18n.translate('xpack.triggersActionsUI.sections.ruleDetails.alertsList.columns.status', { + defaultMessage: 'Status', + }), width: '15%', render: (value: AlertListItemStatus) => { return ( @@ -104,7 +103,7 @@ export const alertsTableColumns = ( render: (value: Date | undefined) => { return value ? moment(value).format('D MMM YYYY @ HH:mm:ss') : ''; }, - name: i18n.translate('xpack.triggersActionsUI.sections.alertDetails.alertsList.columns.start', { + name: i18n.translate('xpack.triggersActionsUI.sections.ruleDetails.alertsList.columns.start', { defaultMessage: 'Start', }), sortable: false, @@ -116,7 +115,7 @@ export const alertsTableColumns = ( return value ? durationAsString(moment.duration(value)) : ''; }, name: i18n.translate( - 'xpack.triggersActionsUI.sections.alertDetails.alertsList.columns.duration', + 'xpack.triggersActionsUI.sections.ruleDetails.alertsList.columns.duration', { defaultMessage: 'Duration' } ), sortable: false, @@ -127,12 +126,12 @@ export const alertsTableColumns = ( field: '', align: RIGHT_ALIGNMENT, width: '60px', - name: i18n.translate('xpack.triggersActionsUI.sections.alertDetails.alertsList.columns.mute', { + name: i18n.translate('xpack.triggersActionsUI.sections.ruleDetails.alertsList.columns.mute', { defaultMessage: 'Mute', }), render: (alert: AlertListItem) => { return ( - await onMuteAction(alert)} alert={alert} @@ -150,11 +149,11 @@ function durationAsString(duration: Duration): string { .join(':'); } -export function Alerts({ +export function RuleComponent({ rule, ruleType, readOnly, - alertSummary, + ruleSummary, muteAlertInstance, unmuteAlertInstance, requestRefresh, @@ -162,13 +161,13 @@ export function Alerts({ onChangeDuration, durationEpoch = Date.now(), isLoadingChart, -}: AlertsProps) { +}: RuleProps) { const [pagination, setPagination] = useState({ index: 0, size: DEFAULT_SEARCH_PAGE_SIZE, }); - const alerts = Object.entries(alertSummary.alerts) + const alerts = Object.entries(ruleSummary.alerts) .map(([alertId, alert]) => alertToListItem(durationEpoch, ruleType, alertId, alert)) .sort((leftAlert, rightAlert) => leftAlert.sortPriority - rightAlert.sortPriority); @@ -183,7 +182,7 @@ export function Alerts({ const showDurationWarning = shouldShowDurationWarning( ruleType, - alertSummary.executionDuration.average + ruleSummary.executionDuration.average ); const healthColor = getHealthColor(rule.executionStatus.status); @@ -191,7 +190,7 @@ export function Alerts({ rule.executionStatus.error?.reason === AlertExecutionStatusErrorReasons.License; const statusMessage = isLicenseError ? ALERT_STATUS_LICENSE_ERROR - : alertsStatusesTranslationsMapping[rule.executionStatus.status]; + : rulesStatusesTranslationsMapping[rule.executionStatus.status]; return ( <> @@ -212,7 +211,7 @@ export function Alerts({ } description={i18n.translate( - 'xpack.triggersActionsUI.sections.alertDetails.alertsList.ruleLastExecutionDescription', + 'xpack.triggersActionsUI.sections.ruleDetails.rulesList.ruleLastExecutionDescription', { defaultMessage: `Last response`, } @@ -239,7 +238,7 @@ export function Alerts({ type="alert" color="warning" content={i18n.translate( - 'xpack.triggersActionsUI.sections.alertDetails.alertsList.ruleTypeExcessDurationMessage', + 'xpack.triggersActionsUI.sections.ruleDetails.alertsList.ruleTypeExcessDurationMessage', { defaultMessage: `Duration exceeds the rule's expected run time.`, } @@ -249,12 +248,12 @@ export function Alerts({ )} - {formatMillisForDisplay(alertSummary.executionDuration.average)} + {formatMillisForDisplay(ruleSummary.executionDuration.average)} } description={i18n.translate( - 'xpack.triggersActionsUI.sections.alertDetails.alertsList.avgDurationDescription', + 'xpack.triggersActionsUI.sections.ruleDetails.alertsList.avgDurationDescription', { defaultMessage: `Average duration`, } @@ -264,7 +263,7 @@ export function Alerts({ ); } -export const AlertsWithApi = withBulkAlertOperations(Alerts); +export const RuleWithApi = withBulkRuleOperations(RuleComponent); function getPage(items: any[], pagination: Pagination) { return chunk(items, pagination.size)[pagination.index] || []; @@ -323,12 +322,12 @@ export interface AlertListItem { } const ACTIVE_LABEL = i18n.translate( - 'xpack.triggersActionsUI.sections.alertDetails.alertsList.status.active', + 'xpack.triggersActionsUI.sections.ruleDetails.rulesList.status.active', { defaultMessage: 'Active' } ); const INACTIVE_LABEL = i18n.translate( - 'xpack.triggersActionsUI.sections.alertDetails.alertsList.status.inactive', + 'xpack.triggersActionsUI.sections.ruleDetails.rulesList.status.inactive', { defaultMessage: 'Recovered' } ); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_details.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_details.test.tsx similarity index 72% rename from x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_details.test.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_details.test.tsx index e12322c3b84ad..4af24e9a44602 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_details.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_details.test.tsx @@ -10,7 +10,7 @@ import uuid from 'uuid'; import { shallow } from 'enzyme'; import { mountWithIntl, nextTick } from '@kbn/test-jest-helpers'; import { act } from '@testing-library/react'; -import { AlertDetails } from './alert_details'; +import { RuleDetails } from './rule_details'; import { Rule, ActionType, RuleTypeModel, RuleType } from '../../../../types'; import { EuiBadge, @@ -35,7 +35,7 @@ jest.mock('react-router-dom', () => ({ push: jest.fn(), }), useLocation: () => ({ - pathname: '/triggersActions/alerts/', + pathname: '/triggersActions/rules/', }), })); @@ -45,17 +45,17 @@ jest.mock('../../../lib/action_connector_api', () => ({ jest.mock('../../../lib/capabilities', () => ({ hasAllPrivilege: jest.fn(() => true), - hasSaveAlertsCapability: jest.fn(() => true), + hasSaveRulesCapability: jest.fn(() => true), hasExecuteActionsCapability: jest.fn(() => true), })); const useKibanaMock = useKibana as jest.Mocked; const ruleTypeRegistry = ruleTypeRegistryMock.create(); -const mockAlertApis = { - muteAlert: jest.fn(), - unmuteAlert: jest.fn(), - enableAlert: jest.fn(), - disableAlert: jest.fn(), +const mockRuleApis = { + muteRule: jest.fn(), + unmuteRule: jest.fn(), + enableRule: jest.fn(), + disableRule: jest.fn(), requestRefresh: jest.fn(), refreshToken: Date.now(), }; @@ -65,7 +65,7 @@ const authorizedConsumers = { }; const recoveryActionGroup: ActionGroup<'recovered'> = { id: 'recovered', name: 'Recovered' }; -const alertType: RuleType = { +const ruleType: RuleType = { id: '.noop', name: 'No Op', actionGroups: [{ id: 'default', name: 'Default' }], @@ -78,27 +78,27 @@ const alertType: RuleType = { enabledInLicense: true, }; -describe('alert_details', () => { - it('renders the alert name as a title', () => { - const alert = mockAlert(); +describe('rule_details', () => { + it('renders the rule name as a title', () => { + const rule = mockRule(); expect( shallow( - + ).find('EuiPageHeader') ).toBeTruthy(); }); - it('renders the alert type badge', () => { - const alert = mockAlert(); + it('renders the rule type badge', () => { + const rule = mockRule(); expect( shallow( - - ).find({alertType.name}) + + ).find({ruleType.name}) ).toBeTruthy(); }); - it('renders the alert error banner with error message, when alert status is an error', () => { - const alert = mockAlert({ + it('renders the rule error banner with error message, when rule status is an error', () => { + const rule = mockRule({ executionStatus: { status: 'error', lastExecutionDate: new Date('2020-08-20T19:23:38Z'), @@ -110,9 +110,9 @@ describe('alert_details', () => { }); expect( shallow( - + ).containsMatchingElement( - + {'test'} ) @@ -120,8 +120,8 @@ describe('alert_details', () => { }); describe('actions', () => { - it('renders an alert action', () => { - const alert = mockAlert({ + it('renders an rule action', () => { + const rule = mockRule({ actions: [ { group: 'default', @@ -145,11 +145,11 @@ describe('alert_details', () => { expect( shallow( - ).containsMatchingElement( @@ -159,8 +159,8 @@ describe('alert_details', () => { ).toBeTruthy(); }); - it('renders a counter for multiple alert action', () => { - const alert = mockAlert({ + it('renders a counter for multiple rule action', () => { + const rule = mockRule({ actions: [ { group: 'default', @@ -196,12 +196,7 @@ describe('alert_details', () => { ]; const details = shallow( - + ); expect( @@ -223,19 +218,19 @@ describe('alert_details', () => { }); describe('links', () => { - it('links to the app that created the alert', () => { - const alert = mockAlert(); + it('links to the app that created the rule', () => { + const rule = mockRule(); expect( shallow( - + ).find('ViewInApp') ).toBeTruthy(); }); it('links to the Edit flyout', () => { - const alert = mockAlert(); + const rule = mockRule(); const pageHeaderProps = shallow( - + ) .find('EuiPageHeader') .props() as EuiPageHeaderProps; @@ -243,7 +238,7 @@ describe('alert_details', () => { expect(!!rightSideItems && rightSideItems[2]!).toMatchInlineSnapshot(` { > @@ -262,12 +257,12 @@ describe('alert_details', () => { }); describe('disable button', () => { - it('should render a disable button when alert is enabled', () => { - const alert = mockAlert({ + it('should render a disable button when rule is enabled', () => { + const rule = mockRule({ enabled: true, }); const enableButton = shallow( - + ) .find(EuiSwitch) .find('[name="enable"]') @@ -279,12 +274,12 @@ describe('disable button', () => { }); }); - it('should render a enable button and empty state when alert is disabled', async () => { - const alert = mockAlert({ + it('should render a enable button and empty state when rule is disabled', async () => { + const rule = mockRule({ enabled: false, }); const wrapper = mountWithIntl( - + ); await act(async () => { @@ -309,21 +304,21 @@ describe('disable button', () => { wrapper.update(); }); - expect(mockAlertApis.enableAlert).toHaveBeenCalledTimes(1); + expect(mockRuleApis.enableRule).toHaveBeenCalledTimes(1); }); - it('should disable the alert when alert is enabled and button is clicked', () => { - const alert = mockAlert({ + it('should disable the rule when rule is enabled and button is clicked', () => { + const rule = mockRule({ enabled: true, }); - const disableAlert = jest.fn(); + const disableRule = jest.fn(); const enableButton = shallow( - ) .find(EuiSwitch) @@ -333,23 +328,23 @@ describe('disable button', () => { enableButton.simulate('click'); const handler = enableButton.prop('onChange'); expect(typeof handler).toEqual('function'); - expect(disableAlert).toHaveBeenCalledTimes(0); + expect(disableRule).toHaveBeenCalledTimes(0); handler!({} as React.FormEvent); - expect(disableAlert).toHaveBeenCalledTimes(1); + expect(disableRule).toHaveBeenCalledTimes(1); }); - it('should enable the alert when alert is disabled and button is clicked', () => { - const alert = mockAlert({ + it('should enable the rule when rule is disabled and button is clicked', () => { + const rule = mockRule({ enabled: false, }); - const enableAlert = jest.fn(); + const enableRule = jest.fn(); const enableButton = shallow( - ) .find(EuiSwitch) @@ -359,13 +354,13 @@ describe('disable button', () => { enableButton.simulate('click'); const handler = enableButton.prop('onChange'); expect(typeof handler).toEqual('function'); - expect(enableAlert).toHaveBeenCalledTimes(0); + expect(enableRule).toHaveBeenCalledTimes(0); handler!({} as React.FormEvent); - expect(enableAlert).toHaveBeenCalledTimes(1); + expect(enableRule).toHaveBeenCalledTimes(1); }); - it('should reset error banner dismissal after re-enabling the alert', async () => { - const alert = mockAlert({ + it('should reset error banner dismissal after re-enabling the rule', async () => { + const rule = mockRule({ enabled: true, executionStatus: { status: 'error', @@ -377,16 +372,16 @@ describe('disable button', () => { }, }); - const disableAlert = jest.fn(); - const enableAlert = jest.fn(); + const disableRule = jest.fn(); + const enableRule = jest.fn(); const wrapper = mountWithIntl( - ); @@ -401,31 +396,31 @@ describe('disable button', () => { await nextTick(); }); - // Disable the alert + // Disable the rule await act(async () => { wrapper.find('[data-test-subj="enableSwitch"] .euiSwitch__button').first().simulate('click'); await nextTick(); }); - expect(disableAlert).toHaveBeenCalled(); + expect(disableRule).toHaveBeenCalled(); await act(async () => { await nextTick(); wrapper.update(); }); - // Enable the alert + // Enable the rule await act(async () => { wrapper.find('[data-test-subj="enableSwitch"] .euiSwitch__button').first().simulate('click'); await nextTick(); }); - expect(enableAlert).toHaveBeenCalled(); + expect(enableRule).toHaveBeenCalled(); // Ensure error banner is back expect(wrapper.find('[data-test-subj="dismiss-execution-error"]').length).toBeGreaterThan(0); }); it('should show the loading spinner when the rule enabled switch was clicked and the server responded with some delay', async () => { - const alert = mockAlert({ + const rule = mockRule({ enabled: true, executionStatus: { status: 'error', @@ -437,18 +432,18 @@ describe('disable button', () => { }, }); - const disableAlert = jest.fn(async () => { + const disableRule = jest.fn(async () => { await new Promise((resolve) => setTimeout(resolve, 6000)); }); - const enableAlert = jest.fn(); + const enableRule = jest.fn(); const wrapper = mountWithIntl( - ); @@ -463,19 +458,19 @@ describe('disable button', () => { await nextTick(); }); - // Disable the alert + // Disable the rule await act(async () => { wrapper.find('[data-test-subj="enableSwitch"] .euiSwitch__button').first().simulate('click'); await nextTick(); }); - expect(disableAlert).toHaveBeenCalled(); + expect(disableRule).toHaveBeenCalled(); await act(async () => { await nextTick(); wrapper.update(); }); - // Enable the alert + // Enable the rule await act(async () => { expect(wrapper.find('[data-test-subj="enableSpinner"]').length).toBeGreaterThan(0); await nextTick(); @@ -484,13 +479,13 @@ describe('disable button', () => { }); describe('mute button', () => { - it('should render an mute button when alert is enabled', () => { - const alert = mockAlert({ + it('should render an mute button when rule is enabled', () => { + const rule = mockRule({ enabled: true, muteAll: false, }); const enableButton = shallow( - + ) .find(EuiSwitch) .find('[name="mute"]') @@ -501,13 +496,13 @@ describe('mute button', () => { }); }); - it('should render an muted button when alert is muted', () => { - const alert = mockAlert({ + it('should render an muted button when rule is muted', () => { + const rule = mockRule({ enabled: true, muteAll: true, }); const enableButton = shallow( - + ) .find(EuiSwitch) .find('[name="mute"]') @@ -518,19 +513,19 @@ describe('mute button', () => { }); }); - it('should mute the alert when alert is unmuted and button is clicked', () => { - const alert = mockAlert({ + it('should mute the rule when rule is unmuted and button is clicked', () => { + const rule = mockRule({ enabled: true, muteAll: false, }); - const muteAlert = jest.fn(); + const muteRule = jest.fn(); const enableButton = shallow( - ) .find(EuiSwitch) @@ -539,24 +534,24 @@ describe('mute button', () => { enableButton.simulate('click'); const handler = enableButton.prop('onChange'); expect(typeof handler).toEqual('function'); - expect(muteAlert).toHaveBeenCalledTimes(0); + expect(muteRule).toHaveBeenCalledTimes(0); handler!({} as React.FormEvent); - expect(muteAlert).toHaveBeenCalledTimes(1); + expect(muteRule).toHaveBeenCalledTimes(1); }); - it('should unmute the alert when alert is muted and button is clicked', () => { - const alert = mockAlert({ + it('should unmute the rule when rule is muted and button is clicked', () => { + const rule = mockRule({ enabled: true, muteAll: true, }); - const unmuteAlert = jest.fn(); + const unmuteRule = jest.fn(); const enableButton = shallow( - ) .find(EuiSwitch) @@ -565,18 +560,18 @@ describe('mute button', () => { enableButton.simulate('click'); const handler = enableButton.prop('onChange'); expect(typeof handler).toEqual('function'); - expect(unmuteAlert).toHaveBeenCalledTimes(0); + expect(unmuteRule).toHaveBeenCalledTimes(0); handler!({} as React.FormEvent); - expect(unmuteAlert).toHaveBeenCalledTimes(1); + expect(unmuteRule).toHaveBeenCalledTimes(1); }); - it('should disabled mute button when alert is disabled', () => { - const alert = mockAlert({ + it('should disabled mute button when rule is disabled', () => { + const rule = mockRule({ enabled: false, muteAll: false, }); const enableButton = shallow( - + ) .find(EuiSwitch) .find('[name="mute"]') @@ -600,10 +595,10 @@ describe('edit button', () => { }, ]; ruleTypeRegistry.has.mockReturnValue(true); - const alertTypeR: RuleTypeModel = { - id: 'my-alert-type', + const ruleTypeR: RuleTypeModel = { + id: 'my-rule-type', iconClass: 'test', - description: 'Alert when testing', + description: 'Rule when testing', documentationUrl: 'https://localhost.local/docs', validate: () => { return { errors: {} }; @@ -611,11 +606,11 @@ describe('edit button', () => { ruleParamsExpression: jest.fn(), requiresAppContext: false, }; - ruleTypeRegistry.get.mockReturnValue(alertTypeR); + ruleTypeRegistry.get.mockReturnValue(ruleTypeR); useKibanaMock().services.ruleTypeRegistry = ruleTypeRegistry; - it('should render an edit button when alert and actions are editable', () => { - const alert = mockAlert({ + it('should render an edit button when rule and actions are editable', () => { + const rule = mockRule({ enabled: true, muteAll: false, actions: [ @@ -628,12 +623,7 @@ describe('edit button', () => { ], }); const pageHeaderProps = shallow( - + ) .find('EuiPageHeader') .props() as EuiPageHeaderProps; @@ -641,7 +631,7 @@ describe('edit button', () => { expect(!!rightSideItems && rightSideItems[2]!).toMatchInlineSnapshot(` { > @@ -657,10 +647,10 @@ describe('edit button', () => { `); }); - it('should not render an edit button when alert editable but actions arent', () => { + it('should not render an edit button when rule editable but actions arent', () => { const { hasExecuteActionsCapability } = jest.requireMock('../../../lib/capabilities'); hasExecuteActionsCapability.mockReturnValueOnce(false); - const alert = mockAlert({ + const rule = mockRule({ enabled: true, muteAll: false, actions: [ @@ -674,12 +664,7 @@ describe('edit button', () => { }); expect( shallow( - + ) .find(EuiButtonEmpty) .find('[name="edit"]') @@ -688,21 +673,16 @@ describe('edit button', () => { ).toBeFalsy(); }); - it('should render an edit button when alert editable but actions arent when there are no actions on the alert', async () => { + it('should render an edit button when rule editable but actions arent when there are no actions on the rule', async () => { const { hasExecuteActionsCapability } = jest.requireMock('../../../lib/capabilities'); hasExecuteActionsCapability.mockReturnValueOnce(false); - const alert = mockAlert({ + const rule = mockRule({ enabled: true, muteAll: false, actions: [], }); const pageHeaderProps = shallow( - + ) .find('EuiPageHeader') .props() as EuiPageHeaderProps; @@ -710,7 +690,7 @@ describe('edit button', () => { expect(!!rightSideItems && rightSideItems[2]!).toMatchInlineSnapshot(` { > @@ -739,10 +719,10 @@ describe('broken connector indicator', () => { }, ]; ruleTypeRegistry.has.mockReturnValue(true); - const alertTypeR: RuleTypeModel = { - id: 'my-alert-type', + const ruleTypeR: RuleTypeModel = { + id: 'my-rule-type', iconClass: 'test', - description: 'Alert when testing', + description: 'Rule when testing', documentationUrl: 'https://localhost.local/docs', validate: () => { return { errors: {} }; @@ -750,7 +730,7 @@ describe('broken connector indicator', () => { ruleParamsExpression: jest.fn(), requiresAppContext: false, }; - ruleTypeRegistry.get.mockReturnValue(alertTypeR); + ruleTypeRegistry.get.mockReturnValue(ruleTypeR); useKibanaMock().services.ruleTypeRegistry = ruleTypeRegistry; const { loadAllActions } = jest.requireMock('../../../lib/action_connector_api'); loadAllActions.mockResolvedValue([ @@ -775,7 +755,7 @@ describe('broken connector indicator', () => { ]); it('should not render broken connector indicator or warning if all rule actions connectors exist', async () => { - const alert = mockAlert({ + const rule = mockRule({ enabled: true, muteAll: false, actions: [ @@ -794,12 +774,7 @@ describe('broken connector indicator', () => { ], }); const wrapper = mountWithIntl( - + ); await act(async () => { await nextTick(); @@ -816,7 +791,7 @@ describe('broken connector indicator', () => { }); it('should render broken connector indicator and warning if any rule actions connector does not exist', async () => { - const alert = mockAlert({ + const rule = mockRule({ enabled: true, muteAll: false, actions: [ @@ -841,12 +816,7 @@ describe('broken connector indicator', () => { ], }); const wrapper = mountWithIntl( - + ); await act(async () => { await nextTick(); @@ -867,7 +837,7 @@ describe('broken connector indicator', () => { }); it('should render broken connector indicator and warning with no edit button if any rule actions connector does not exist and user has no edit access', async () => { - const alert = mockAlert({ + const rule = mockRule({ enabled: true, muteAll: false, actions: [ @@ -894,12 +864,7 @@ describe('broken connector indicator', () => { const { hasExecuteActionsCapability } = jest.requireMock('../../../lib/capabilities'); hasExecuteActionsCapability.mockReturnValue(false); const wrapper = mountWithIntl( - + ); await act(async () => { await nextTick(); @@ -922,14 +887,14 @@ describe('broken connector indicator', () => { describe('refresh button', () => { it('should call requestRefresh when clicked', async () => { - const alert = mockAlert(); + const rule = mockRule(); const requestRefresh = jest.fn(); const wrapper = mountWithIntl( - ); @@ -938,7 +903,7 @@ describe('refresh button', () => { await nextTick(); wrapper.update(); }); - const refreshButton = wrapper.find('[data-test-subj="refreshAlertsButton"]').first(); + const refreshButton = wrapper.find('[data-test-subj="refreshRulesButton"]').first(); expect(refreshButton.exists()).toBeTruthy(); refreshButton.simulate('click'); @@ -946,13 +911,13 @@ describe('refresh button', () => { }); }); -function mockAlert(overloads: Partial = {}): Rule { +function mockRule(overloads: Partial = {}): Rule { return { id: uuid.v4(), enabled: true, - name: `alert-${uuid.v4()}`, + name: `rule-${uuid.v4()}`, tags: [], - alertTypeId: '.noop', + ruleTypeId: '.noop', consumer: ALERTS_FEATURE_ID, schedule: { interval: '1m' }, actions: [], diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_details.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_details.tsx similarity index 70% rename from x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_details.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_details.tsx index 1bb979ee86052..becf1376c8900 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_details.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_details.tsx @@ -29,38 +29,38 @@ import { import { FormattedMessage } from '@kbn/i18n-react'; import { AlertExecutionStatusErrorReasons } from '../../../../../../alerting/common'; import { hasAllPrivilege, hasExecuteActionsCapability } from '../../../lib/capabilities'; -import { getAlertingSectionBreadcrumb, getAlertDetailsBreadcrumb } from '../../../lib/breadcrumb'; +import { getAlertingSectionBreadcrumb, getRuleDetailsBreadcrumb } from '../../../lib/breadcrumb'; import { getCurrentDocTitle } from '../../../lib/doc_title'; import { Rule, RuleType, ActionType, ActionConnector } from '../../../../types'; import { ComponentOpts as BulkOperationsComponentOpts, - withBulkAlertOperations, -} from '../../common/components/with_bulk_alert_api_operations'; -import { AlertsRouteWithApi } from './alerts_route'; + withBulkRuleOperations, +} from '../../common/components/with_bulk_rule_api_operations'; +import { RuleRouteWithApi } from './rule_route'; import { ViewInApp } from './view_in_app'; -import { AlertEdit } from '../../alert_form'; +import { RuleEdit } from '../../rule_form'; import { routeToRuleDetails } from '../../../constants'; -import { alertsErrorReasonTranslationsMapping } from '../../alerts_list/translations'; +import { rulesErrorReasonTranslationsMapping } from '../../rules_list/translations'; import { useKibana } from '../../../../common/lib/kibana'; -import { alertReducer } from '../../alert_form/alert_reducer'; +import { ruleReducer } from '../../rule_form/rule_reducer'; import { loadAllActions as loadConnectors } from '../../../lib/action_connector_api'; -export type AlertDetailsProps = { - alert: Rule; - alertType: RuleType; +export type RuleDetailsProps = { + rule: Rule; + ruleType: RuleType; actionTypes: ActionType[]; requestRefresh: () => Promise; refreshToken?: number; -} & Pick; +} & Pick; -export const AlertDetails: React.FunctionComponent = ({ - alert, - alertType, +export const RuleDetails: React.FunctionComponent = ({ + rule, + ruleType, actionTypes, - disableAlert, - enableAlert, - unmuteAlert, - muteAlert, + disableRule, + enableRule, + unmuteRule, + muteRule, requestRefresh, refreshToken, }) => { @@ -73,9 +73,9 @@ export const AlertDetails: React.FunctionComponent = ({ chrome, http, } = useKibana().services; - const [{}, dispatch] = useReducer(alertReducer, { alert }); - const setInitialAlert = (value: Rule) => { - dispatch({ command: { type: 'setAlert' }, payload: { key: 'alert', value } }); + const [{}, dispatch] = useReducer(ruleReducer, { rule }); + const setInitialRule = (value: Rule) => { + dispatch({ command: { type: 'setRule' }, payload: { key: 'rule', value } }); }; const [hasActionsWithBrokenConnector, setHasActionsWithBrokenConnector] = @@ -84,10 +84,10 @@ export const AlertDetails: React.FunctionComponent = ({ // Set breadcrumb and page title useEffect(() => { setBreadcrumbs([ - getAlertingSectionBreadcrumb('alerts'), - getAlertDetailsBreadcrumb(alert.id, alert.name), + getAlertingSectionBreadcrumb('rules'), + getRuleDetailsBreadcrumb(rule.id, rule.name), ]); - chrome.docTitle.change(getCurrentDocTitle('alerts')); + chrome.docTitle.change(getCurrentDocTitle('rules')); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); @@ -102,7 +102,7 @@ export const AlertDetails: React.FunctionComponent = ({ } if (loadedConnectors.length > 0) { - const hasActionWithBrokenConnector = alert.actions.some( + const hasActionWithBrokenConnector = rule.actions.some( (action) => !loadedConnectors.find((connector) => connector.id === action.id) ); if (setHasActionsWithBrokenConnector) { @@ -114,38 +114,38 @@ export const AlertDetails: React.FunctionComponent = ({ }, []); const canExecuteActions = hasExecuteActionsCapability(capabilities); - const canSaveAlert = - hasAllPrivilege(alert, alertType) && - // if the alert has actions, can the user save the alert's action params - (canExecuteActions || (!canExecuteActions && alert.actions.length === 0)); + const canSaveRule = + hasAllPrivilege(rule, ruleType) && + // if the rule has actions, can the user save the rule's action params + (canExecuteActions || (!canExecuteActions && rule.actions.length === 0)); const actionTypesByTypeId = keyBy(actionTypes, 'id'); const hasEditButton = - // can the user save the alert - canSaveAlert && - // is this alert type editable from within Alerts Management - (ruleTypeRegistry.has(alert.alertTypeId) - ? !ruleTypeRegistry.get(alert.alertTypeId).requiresAppContext + // can the user save the rule + canSaveRule && + // is this rule type editable from within Rules Management + (ruleTypeRegistry.has(rule.ruleTypeId) + ? !ruleTypeRegistry.get(rule.ruleTypeId).requiresAppContext : false); - const alertActions = alert.actions; - const uniqueActions = Array.from(new Set(alertActions.map((item: any) => item.actionTypeId))); - const [isEnabled, setIsEnabled] = useState(alert.enabled); + const ruleActions = rule.actions; + const uniqueActions = Array.from(new Set(ruleActions.map((item: any) => item.actionTypeId))); + const [isEnabled, setIsEnabled] = useState(rule.enabled); const [isEnabledUpdating, setIsEnabledUpdating] = useState(false); const [isMutedUpdating, setIsMutedUpdating] = useState(false); - const [isMuted, setIsMuted] = useState(alert.muteAll); + const [isMuted, setIsMuted] = useState(rule.muteAll); const [editFlyoutVisible, setEditFlyoutVisibility] = useState(false); - const [dissmissAlertErrors, setDissmissAlertErrors] = useState(false); + const [dissmissRuleErrors, setDissmissRuleErrors] = useState(false); - const setAlert = async () => { - history.push(routeToRuleDetails.replace(`:ruleId`, alert.id)); + const setRule = async () => { + history.push(routeToRuleDetails.replace(`:ruleId`, rule.id)); }; - const getAlertStatusErrorReasonText = () => { - if (alert.executionStatus.error && alert.executionStatus.error.reason) { - return alertsErrorReasonTranslationsMapping[alert.executionStatus.error.reason]; + const getRuleStatusErrorReasonText = () => { + if (rule.executionStatus.error && rule.executionStatus.error.reason) { + return rulesErrorReasonTranslationsMapping[rule.executionStatus.error.reason]; } else { - return alertsErrorReasonTranslationsMapping.unknown; + return rulesErrorReasonTranslationsMapping.unknown; } }; @@ -153,28 +153,28 @@ export const AlertDetails: React.FunctionComponent = ({ ? [ <> setEditFlyoutVisibility(true)} name="edit" - disabled={!alertType.enabledInLicense} + disabled={!ruleType.enabledInLicense} > {editFlyoutVisible && ( - { - setInitialAlert(alert); + setInitialRule(rule); setEditFlyoutVisibility(false); }} actionTypeRegistry={actionTypeRegistry} ruleTypeRegistry={ruleTypeRegistry} - ruleType={alertType} - onSave={setAlert} + ruleType={ruleType} + onSave={setRule} /> )} , @@ -184,26 +184,26 @@ export const AlertDetails: React.FunctionComponent = ({ return ( <> } rightSideItems={[ - , + , , @@ -217,29 +217,29 @@ export const AlertDetails: React.FunctionComponent = ({

- {alertType.name} + {ruleType.name}
{uniqueActions && uniqueActions.length ? ( <> {' '} {hasActionsWithBrokenConnector && ( = ({ @@ -285,26 +285,26 @@ export const AlertDetails: React.FunctionComponent = ({ ) : ( { setIsEnabledUpdating(true); if (isEnabled) { setIsEnabled(false); - await disableAlert(alert); + await disableRule(rule); // Reset dismiss if previously clicked - setDissmissAlertErrors(false); + setDissmissRuleErrors(false); } else { setIsEnabled(true); - await enableAlert(alert); + await enableRule(rule); } requestRefresh(); setIsEnabledUpdating(false); }} label={ } @@ -321,7 +321,7 @@ export const AlertDetails: React.FunctionComponent = ({ @@ -331,23 +331,23 @@ export const AlertDetails: React.FunctionComponent = ({ { setIsMutedUpdating(true); if (isMuted) { setIsMuted(false); - await unmuteAlert(alert); + await unmuteRule(rule); } else { setIsMuted(true); - await muteAlert(alert); + await muteRule(rule); } requestRefresh(); setIsMutedUpdating(false); }} label={ } @@ -357,18 +357,18 @@ export const AlertDetails: React.FunctionComponent = ({ - {alert.enabled && !dissmissAlertErrors && alert.executionStatus.status === 'error' ? ( + {rule.enabled && !dissmissRuleErrors && rule.executionStatus.status === 'error' ? ( - - {alert.executionStatus.error?.message} + + {rule.executionStatus.error?.message} @@ -376,15 +376,15 @@ export const AlertDetails: React.FunctionComponent = ({ setDissmissAlertErrors(true)} + onClick={() => setDissmissRuleErrors(true)} > - {alert.executionStatus.error?.reason === + {rule.executionStatus.error?.reason === AlertExecutionStatusErrorReasons.License && ( = ({ target="_blank" > @@ -413,7 +413,7 @@ export const AlertDetails: React.FunctionComponent = ({ data-test-subj="actionWithBrokenConnectorWarningBanner" size="s" title={i18n.translate( - 'xpack.triggersActionsUI.sections.alertDetails.actionWithBrokenConnectorWarningBannerTitle', + 'xpack.triggersActionsUI.sections.ruleDetails.actionWithBrokenConnectorWarningBannerTitle', { defaultMessage: 'There is an issue with one of the connectors associated with this rule.', @@ -429,7 +429,7 @@ export const AlertDetails: React.FunctionComponent = ({ onClick={() => setEditFlyoutVisibility(true)} > @@ -442,13 +442,13 @@ export const AlertDetails: React.FunctionComponent = ({ )} - {alert.enabled ? ( - ) : ( <> @@ -459,7 +459,7 @@ export const AlertDetails: React.FunctionComponent = ({ title={

@@ -468,7 +468,7 @@ export const AlertDetails: React.FunctionComponent = ({ <>

@@ -483,7 +483,7 @@ export const AlertDetails: React.FunctionComponent = ({ onClick={async () => { setIsEnabledUpdating(true); setIsEnabled(true); - await enableAlert(alert); + await enableRule(rule); requestRefresh(); setIsEnabledUpdating(false); }} @@ -502,4 +502,4 @@ export const AlertDetails: React.FunctionComponent = ({ ); }; -export const AlertDetailsWithApi = withBulkAlertOperations(AlertDetails); +export const RuleDetailsWithApi = withBulkRuleOperations(RuleDetails); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_details_route.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_details_route.test.tsx similarity index 79% rename from x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_details_route.test.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_details_route.test.tsx index 9bfb8f20744de..796b2e107a6fe 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_details_route.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_details_route.test.tsx @@ -12,14 +12,14 @@ import { mountWithIntl, nextTick } from '@kbn/test-jest-helpers'; import { act } from 'react-dom/test-utils'; import { createMemoryHistory, createLocation } from 'history'; import { ToastsApi } from 'kibana/public'; -import { AlertDetailsRoute, getRuleData } from './alert_details_route'; +import { RuleDetailsRoute, getRuleData } from './rule_details_route'; import { Rule } from '../../../../types'; import { CenterJustifiedSpinner } from '../../../components/center_justified_spinner'; import { spacesPluginMock } from '../../../../../../spaces/public/mocks'; import { useKibana } from '../../../../common/lib/kibana'; jest.mock('../../../../common/lib/kibana'); -describe('alert_details_route', () => { +describe('rule_details_route', () => { beforeEach(() => { jest.clearAllMocks(); }); @@ -36,7 +36,7 @@ describe('alert_details_route', () => { expect( shallow( - + ).containsMatchingElement() ).toBeTruthy(); }); @@ -53,13 +53,12 @@ describe('alert_details_route', () => { alias_target_id: rule.id, })); const wrapper = mountWithIntl( - + ); await act(async () => { await nextTick(); wrapper.update(); }); - expect(resolveRule).toHaveBeenCalledWith(rule.id); expect((spacesMock as any).ui.redirectLegacyUrl).toHaveBeenCalledWith( `insightsAndAlerting/triggersActions/rule/new_id`, @@ -71,13 +70,13 @@ describe('alert_details_route', () => { await setup(); const rule = mockRule(); const ruleType = { - id: rule.alertTypeId, + id: rule.ruleTypeId, name: 'type name', authorizedConsumers: ['consumer'], }; - const { loadAlertTypes, loadActionTypes, resolveRule } = mockApis(); + const { loadRuleTypes, loadActionTypes, resolveRule } = mockApis(); - loadAlertTypes.mockImplementationOnce(async () => [ruleType]); + loadRuleTypes.mockImplementationOnce(async () => [ruleType]); loadActionTypes.mockImplementation(async () => []); resolveRule.mockImplementationOnce(async () => ({ ...rule, @@ -86,9 +85,9 @@ describe('alert_details_route', () => { alias_target_id: rule.id, })); const wrapper = mountWithIntl( - ); await act(async () => { @@ -113,8 +112,8 @@ describe('getRuleData useEffect handler', () => { it('fetches rule', async () => { const rule = mockRule(); - const { loadAlertTypes, loadActionTypes, resolveRule } = mockApis(); - const { setAlert, setAlertType, setActionTypes } = mockStateSetter(); + const { loadRuleTypes, loadActionTypes, resolveRule } = mockApis(); + const { setRule, setRuleType, setActionTypes } = mockStateSetter(); resolveRule.mockImplementationOnce(async () => rule); @@ -124,17 +123,17 @@ describe('getRuleData useEffect handler', () => { await getRuleData( rule.id, - loadAlertTypes, + loadRuleTypes, resolveRule, loadActionTypes, - setAlert, - setAlertType, + setRule, + setRuleType, setActionTypes, toastNotifications ); expect(resolveRule).toHaveBeenCalledWith(rule.id); - expect(setAlert).toHaveBeenCalledWith(rule); + expect(setRule).toHaveBeenCalledWith(rule); }); it('fetches rule and connector types', async () => { @@ -154,14 +153,14 @@ describe('getRuleData useEffect handler', () => { ], }); const ruleType = { - id: rule.alertTypeId, + id: rule.ruleTypeId, name: 'type name', }; - const { loadAlertTypes, loadActionTypes, resolveRule } = mockApis(); - const { setAlert, setAlertType, setActionTypes } = mockStateSetter(); + const { loadRuleTypes, loadActionTypes, resolveRule } = mockApis(); + const { setRule, setRuleType, setActionTypes } = mockStateSetter(); resolveRule.mockImplementation(async () => rule); - loadAlertTypes.mockImplementation(async () => [ruleType]); + loadRuleTypes.mockImplementation(async () => [ruleType]); loadActionTypes.mockImplementation(async () => [connectorType]); const toastNotifications = { @@ -170,21 +169,21 @@ describe('getRuleData useEffect handler', () => { await getRuleData( rule.id, - loadAlertTypes, + loadRuleTypes, resolveRule, loadActionTypes, - setAlert, - setAlertType, + setRule, + setRuleType, setActionTypes, toastNotifications ); - expect(loadAlertTypes).toHaveBeenCalledTimes(1); + expect(loadRuleTypes).toHaveBeenCalledTimes(1); expect(loadActionTypes).toHaveBeenCalledTimes(1); expect(resolveRule).toHaveBeenCalled(); - expect(setAlert).toHaveBeenCalledWith(rule); - expect(setAlertType).toHaveBeenCalledWith(ruleType); + expect(setRule).toHaveBeenCalledWith(rule); + expect(setRuleType).toHaveBeenCalledWith(ruleType); expect(setActionTypes).toHaveBeenCalledWith([connectorType]); }); @@ -205,8 +204,8 @@ describe('getRuleData useEffect handler', () => { ], }); - const { loadAlertTypes, loadActionTypes, resolveRule } = mockApis(); - const { setAlert, setAlertType, setActionTypes } = mockStateSetter(); + const { loadRuleTypes, loadActionTypes, resolveRule } = mockApis(); + const { setRule, setRuleType, setActionTypes } = mockStateSetter(); resolveRule.mockImplementation(async () => { throw new Error('OMG'); @@ -217,11 +216,11 @@ describe('getRuleData useEffect handler', () => { } as unknown as ToastsApi; await getRuleData( rule.id, - loadAlertTypes, + loadRuleTypes, resolveRule, loadActionTypes, - setAlert, - setAlertType, + setRule, + setRuleType, setActionTypes, toastNotifications ); @@ -248,12 +247,12 @@ describe('getRuleData useEffect handler', () => { ], }); - const { loadAlertTypes, loadActionTypes, resolveRule } = mockApis(); - const { setAlert, setAlertType, setActionTypes } = mockStateSetter(); + const { loadRuleTypes, loadActionTypes, resolveRule } = mockApis(); + const { setRule, setRuleType, setActionTypes } = mockStateSetter(); resolveRule.mockImplementation(async () => rule); - loadAlertTypes.mockImplementation(async () => { + loadRuleTypes.mockImplementation(async () => { throw new Error('OMG no rule type'); }); loadActionTypes.mockImplementation(async () => [connectorType]); @@ -263,11 +262,11 @@ describe('getRuleData useEffect handler', () => { } as unknown as ToastsApi; await getRuleData( rule.id, - loadAlertTypes, + loadRuleTypes, resolveRule, loadActionTypes, - setAlert, - setAlertType, + setRule, + setRuleType, setActionTypes, toastNotifications ); @@ -294,16 +293,16 @@ describe('getRuleData useEffect handler', () => { ], }); const ruleType = { - id: rule.alertTypeId, + id: rule.ruleTypeId, name: 'type name', }; - const { loadAlertTypes, loadActionTypes, resolveRule } = mockApis(); - const { setAlert, setAlertType, setActionTypes } = mockStateSetter(); + const { loadRuleTypes, loadActionTypes, resolveRule } = mockApis(); + const { setRule, setRuleType, setActionTypes } = mockStateSetter(); resolveRule.mockImplementation(async () => rule); - loadAlertTypes.mockImplementation(async () => [ruleType]); + loadRuleTypes.mockImplementation(async () => [ruleType]); loadActionTypes.mockImplementation(async () => { throw new Error('OMG no connector type'); }); @@ -313,11 +312,11 @@ describe('getRuleData useEffect handler', () => { } as unknown as ToastsApi; await getRuleData( rule.id, - loadAlertTypes, + loadRuleTypes, resolveRule, loadActionTypes, - setAlert, - setAlertType, + setRule, + setRuleType, setActionTypes, toastNotifications ); @@ -349,11 +348,11 @@ describe('getRuleData useEffect handler', () => { name: 'type name', }; - const { loadAlertTypes, loadActionTypes, resolveRule } = mockApis(); - const { setAlert, setAlertType, setActionTypes } = mockStateSetter(); + const { loadRuleTypes, loadActionTypes, resolveRule } = mockApis(); + const { setRule, setRuleType, setActionTypes } = mockStateSetter(); resolveRule.mockImplementation(async () => rule); - loadAlertTypes.mockImplementation(async () => [ruleType]); + loadRuleTypes.mockImplementation(async () => [ruleType]); loadActionTypes.mockImplementation(async () => [connectorType]); const toastNotifications = { @@ -361,17 +360,17 @@ describe('getRuleData useEffect handler', () => { } as unknown as ToastsApi; await getRuleData( rule.id, - loadAlertTypes, + loadRuleTypes, resolveRule, loadActionTypes, - setAlert, - setAlertType, + setRule, + setRuleType, setActionTypes, toastNotifications ); expect(toastNotifications.addDanger).toHaveBeenCalledTimes(1); expect(toastNotifications.addDanger).toHaveBeenCalledWith({ - title: `Unable to load rule: Invalid Rule Type: ${rule.alertTypeId}`, + title: `Unable to load rule: Invalid Rule Type: ${rule.ruleTypeId}`, }); }); @@ -408,11 +407,11 @@ describe('getRuleData useEffect handler', () => { name: 'type name', }; - const { loadAlertTypes, loadActionTypes, resolveRule } = mockApis(); - const { setAlert, setAlertType, setActionTypes } = mockStateSetter(); + const { loadRuleTypes, loadActionTypes, resolveRule } = mockApis(); + const { setRule, setRuleType, setActionTypes } = mockStateSetter(); resolveRule.mockImplementation(async () => rule); - loadAlertTypes.mockImplementation(async () => [ruleType]); + loadRuleTypes.mockImplementation(async () => [ruleType]); loadActionTypes.mockImplementation(async () => [availableConnectorType]); const toastNotifications = { @@ -420,11 +419,11 @@ describe('getRuleData useEffect handler', () => { } as unknown as ToastsApi; await getRuleData( rule.id, - loadAlertTypes, + loadRuleTypes, resolveRule, loadActionTypes, - setAlert, - setAlertType, + setRule, + setRuleType, setActionTypes, toastNotifications ); @@ -437,8 +436,8 @@ describe('getRuleData useEffect handler', () => { function mockApis() { return { - loadAlert: jest.fn(), - loadAlertTypes: jest.fn(), + loadRule: jest.fn(), + loadRuleTypes: jest.fn(), loadActionTypes: jest.fn(), resolveRule: jest.fn(), }; @@ -446,8 +445,8 @@ function mockApis() { function mockStateSetter() { return { - setAlert: jest.fn(), - setAlertType: jest.fn(), + setRule: jest.fn(), + setRuleType: jest.fn(), setActionTypes: jest.fn(), }; } @@ -470,7 +469,7 @@ function mockRule(overloads: Partial = {}): Rule { enabled: true, name: `rule-${uuid.v4()}`, tags: [], - alertTypeId: '.noop', + ruleTypeId: '.noop', consumer: 'consumer', schedule: { interval: '1m' }, actions: [], diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_details_route.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_details_route.tsx similarity index 66% rename from x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_details_route.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_details_route.tsx index 2177275a0fb2f..c5cdff71506f3 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_details_route.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_details_route.tsx @@ -11,12 +11,12 @@ import { RouteComponentProps } from 'react-router-dom'; import { ToastsApi } from 'kibana/public'; import { EuiSpacer } from '@elastic/eui'; import { RuleType, ActionType, ResolvedRule } from '../../../../types'; -import { AlertDetailsWithApi as AlertDetails } from './alert_details'; +import { RuleDetailsWithApi as RuleDetails } from './rule_details'; import { throwIfAbsent, throwIfIsntContained } from '../../../lib/value_validators'; import { - ComponentOpts as AlertApis, - withBulkAlertOperations, -} from '../../common/components/with_bulk_alert_api_operations'; + ComponentOpts as RuleApis, + withBulkRuleOperations, +} from '../../common/components/with_bulk_rule_api_operations'; import { ComponentOpts as ActionApis, withActionOperations, @@ -24,17 +24,17 @@ import { import { useKibana } from '../../../../common/lib/kibana'; import { CenterJustifiedSpinner } from '../../../components/center_justified_spinner'; -type AlertDetailsRouteProps = RouteComponentProps<{ +type RuleDetailsRouteProps = RouteComponentProps<{ ruleId: string; }> & Pick & - Pick; + Pick; -export const AlertDetailsRoute: React.FunctionComponent = ({ +export const RuleDetailsRoute: React.FunctionComponent = ({ match: { params: { ruleId }, }, - loadAlertTypes, + loadRuleTypes, loadActionTypes, resolveRule, }) => { @@ -46,44 +46,44 @@ export const AlertDetailsRoute: React.FunctionComponent const { basePath } = http; - const [alert, setAlert] = useState(null); - const [alertType, setAlertType] = useState(null); + const [rule, setRule] = useState(null); + const [ruleType, setRuleType] = useState(null); const [actionTypes, setActionTypes] = useState(null); const [refreshToken, requestRefresh] = React.useState(); useEffect(() => { getRuleData( ruleId, - loadAlertTypes, + loadRuleTypes, resolveRule, loadActionTypes, - setAlert, - setAlertType, + setRule, + setRuleType, setActionTypes, toasts ); - }, [ruleId, http, loadActionTypes, loadAlertTypes, resolveRule, toasts, refreshToken]); + }, [ruleId, http, loadActionTypes, loadRuleTypes, resolveRule, toasts, refreshToken]); useEffect(() => { - if (alert) { - const outcome = (alert as ResolvedRule).outcome; + if (rule) { + const outcome = (rule as ResolvedRule).outcome; if (spacesApi && outcome === 'aliasMatch') { // This rule has been resolved from a legacy URL - redirect the user to the new URL and display a toast. - const path = basePath.prepend(`insightsAndAlerting/triggersActions/rule/${alert.id}`); + const path = basePath.prepend(`insightsAndAlerting/triggersActions/rule/${rule.id}`); spacesApi.ui.redirectLegacyUrl( path, - i18n.translate('xpack.triggersActionsUI.sections.alertDetails.redirectObjectNoun', { + i18n.translate('xpack.triggersActionsUI.sections.ruleDetails.redirectObjectNoun', { defaultMessage: 'rule', }) ); } } // eslint-disable-next-line react-hooks/exhaustive-deps - }, [alert]); + }, [rule]); const getLegacyUrlConflictCallout = () => { - const outcome = (alert as ResolvedRule).outcome; + const outcome = (rule as ResolvedRule).outcome; if (spacesApi && outcome === 'conflict') { - const aliasTargetId = (alert as ResolvedRule).alias_target_id!; // This is always defined if outcome === 'conflict' + const aliasTargetId = (rule as ResolvedRule).alias_target_id!; // This is always defined if outcome === 'conflict' // We have resolved to one rule, but there is another one with a legacy URL associated with this page. Display a // callout with a warning for the user, and provide a way for them to navigate to the other rule. const otherRulePath = basePath.prepend( @@ -94,12 +94,12 @@ export const AlertDetailsRoute: React.FunctionComponent {spacesApi.ui.components.getLegacyUrlConflict({ objectNoun: i18n.translate( - 'xpack.triggersActionsUI.sections.alertDetails.redirectObjectNoun', + 'xpack.triggersActionsUI.sections.ruleDetails.redirectObjectNoun', { defaultMessage: 'rule', } ), - currentObjectId: alert?.id!, + currentObjectId: rule?.id!, otherObjectId: aliasTargetId, otherObjectPath: otherRulePath, })} @@ -109,12 +109,12 @@ export const AlertDetailsRoute: React.FunctionComponent return null; }; - return alert && alertType && actionTypes ? ( + return rule && ruleType && actionTypes ? ( <> {getLegacyUrlConflictCallout()} - requestRefresh(Date.now())} refreshToken={refreshToken} @@ -127,22 +127,22 @@ export const AlertDetailsRoute: React.FunctionComponent export async function getRuleData( ruleId: string, - loadAlertTypes: AlertApis['loadAlertTypes'], - resolveRule: AlertApis['resolveRule'], + loadRuleTypes: RuleApis['loadRuleTypes'], + resolveRule: RuleApis['resolveRule'], loadActionTypes: ActionApis['loadActionTypes'], - setAlert: React.Dispatch>, - setAlertType: React.Dispatch>, + setRule: React.Dispatch>, + setRuleType: React.Dispatch>, setActionTypes: React.Dispatch>, toasts: Pick ) { try { const loadedRule: ResolvedRule = await resolveRule(ruleId); - setAlert(loadedRule); + setRule(loadedRule); - const [loadedAlertType, loadedActionTypes] = await Promise.all([ - loadAlertTypes() - .then((types) => types.find((type) => type.id === loadedRule.alertTypeId)) - .then(throwIfAbsent(`Invalid Rule Type: ${loadedRule.alertTypeId}`)), + const [loadedRuleType, loadedActionTypes] = await Promise.all([ + loadRuleTypes() + .then((types) => types.find((type) => type.id === loadedRule.ruleTypeId)) + .then(throwIfAbsent(`Invalid Rule Type: ${loadedRule.ruleTypeId}`)), loadActionTypes().then( throwIfIsntContained( new Set(loadedRule.actions.map((action) => action.actionTypeId)), @@ -152,12 +152,12 @@ export async function getRuleData( ), ]); - setAlertType(loadedAlertType); + setRuleType(loadedRuleType); setActionTypes(loadedActionTypes); } catch (e) { toasts.addDanger({ title: i18n.translate( - 'xpack.triggersActionsUI.sections.alertDetails.unableToLoadAlertMessage', + 'xpack.triggersActionsUI.sections.ruleDetails.unableToLoadRuleMessage', { defaultMessage: 'Unable to load rule: {message}', values: { @@ -169,6 +169,6 @@ export async function getRuleData( } } -const AlertDetailsRouteWithApi = withActionOperations(withBulkAlertOperations(AlertDetailsRoute)); +const RuleDetailsRouteWithApi = withActionOperations(withBulkRuleOperations(RuleDetailsRoute)); // eslint-disable-next-line import/no-default-export -export { AlertDetailsRouteWithApi as default }; +export { RuleDetailsRouteWithApi as default }; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alerts_route.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_route.test.tsx similarity index 71% rename from x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alerts_route.test.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_route.test.tsx index e0b2ac6c2e6c8..d27522e74b6fb 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alerts_route.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_route.test.tsx @@ -9,51 +9,51 @@ import * as React from 'react'; import uuid from 'uuid'; import { shallow } from 'enzyme'; import { ToastsApi } from 'kibana/public'; -import { AlertsRoute, getAlertSummary } from './alerts_route'; -import { Rule, AlertSummary, RuleType } from '../../../../types'; +import { RuleRoute, getRuleSummary } from './rule_route'; +import { Rule, RuleSummary, RuleType } from '../../../../types'; import { CenterJustifiedSpinner } from '../../../components/center_justified_spinner'; jest.mock('../../../../common/lib/kibana'); const fakeNow = new Date('2020-02-09T23:15:41.941Z'); const fake2MinutesAgo = new Date('2020-02-09T23:13:41.941Z'); -describe('alerts_summary_route', () => { +describe('rules_summary_route', () => { it('render a loader while fetching data', () => { const rule = mockRule(); const ruleType = mockRuleType(); expect( shallow( - + ).containsMatchingElement() ).toBeTruthy(); }); }); -describe('getAlertState useEffect handler', () => { +describe('getRuleState useEffect handler', () => { beforeEach(() => { jest.clearAllMocks(); }); - it('fetches alert summary', async () => { + it('fetches rule summary', async () => { const rule = mockRule(); - const alertSummary = mockAlertSummary(); - const { loadAlertSummary } = mockApis(); - const { setAlertSummary } = mockStateSetter(); + const ruleSummary = mockRuleSummary(); + const { loadRuleSummary } = mockApis(); + const { setRuleSummary } = mockStateSetter(); - loadAlertSummary.mockImplementationOnce(async () => alertSummary); + loadRuleSummary.mockImplementationOnce(async () => ruleSummary); const toastNotifications = { addDanger: jest.fn(), } as unknown as ToastsApi; - await getAlertSummary(rule.id, loadAlertSummary, setAlertSummary, toastNotifications); + await getRuleSummary(rule.id, loadRuleSummary, setRuleSummary, toastNotifications); - expect(loadAlertSummary).toHaveBeenCalledWith(rule.id, undefined); - expect(setAlertSummary).toHaveBeenCalledWith(alertSummary); + expect(loadRuleSummary).toHaveBeenCalledWith(rule.id, undefined); + expect(setRuleSummary).toHaveBeenCalledWith(ruleSummary); }); - it('displays an error if the alert summary isnt found', async () => { + it('displays an error if the rule summary isnt found', async () => { const connectorType = { id: '.server-log', name: 'Server log', @@ -70,34 +70,34 @@ describe('getAlertState useEffect handler', () => { ], }); - const { loadAlertSummary } = mockApis(); - const { setAlertSummary } = mockStateSetter(); + const { loadRuleSummary } = mockApis(); + const { setRuleSummary } = mockStateSetter(); - loadAlertSummary.mockImplementation(async () => { + loadRuleSummary.mockImplementation(async () => { throw new Error('OMG'); }); const toastNotifications = { addDanger: jest.fn(), } as unknown as ToastsApi; - await getAlertSummary(rule.id, loadAlertSummary, setAlertSummary, toastNotifications); + await getRuleSummary(rule.id, loadRuleSummary, setRuleSummary, toastNotifications); expect(toastNotifications.addDanger).toHaveBeenCalledTimes(1); expect(toastNotifications.addDanger).toHaveBeenCalledWith({ - title: 'Unable to load alerts: OMG', + title: 'Unable to load rules: OMG', }); }); }); function mockApis() { return { - loadAlertSummary: jest.fn(), + loadRuleSummary: jest.fn(), requestRefresh: jest.fn(), }; } function mockStateSetter() { return { - setAlertSummary: jest.fn(), + setRuleSummary: jest.fn(), }; } @@ -107,7 +107,7 @@ function mockRule(overloads: Partial = {}): Rule { enabled: true, name: `rule-${uuid.v4()}`, tags: [], - alertTypeId: '.noop', + ruleTypeId: '.noop', consumer: 'consumer', schedule: { interval: '1m' }, actions: [], @@ -142,15 +142,15 @@ function mockRuleType(overloads: Partial = {}): RuleType { defaultActionGroupId: 'default', recoveryActionGroup: { id: 'recovered', name: 'Recovered' }, authorizedConsumers: {}, - producer: 'alerts', + producer: 'rules', minimumLicenseRequired: 'basic', enabledInLicense: true, ...overloads, }; } -function mockAlertSummary(overloads: Partial = {}): any { - const summary: AlertSummary = { +function mockRuleSummary(overloads: Partial = {}): any { + const summary: RuleSummary = { id: 'rule-id', name: 'rule-name', tags: ['tag-1', 'tag-2'], diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alerts_route.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_route.tsx similarity index 56% rename from x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alerts_route.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_route.tsx index 07e45c8d2b2d0..393cdc404db9e 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alerts_route.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_route.tsx @@ -8,79 +8,79 @@ import { i18n } from '@kbn/i18n'; import { ToastsApi } from 'kibana/public'; import React, { useState, useEffect, useRef, useCallback } from 'react'; -import { Rule, AlertSummary, RuleType } from '../../../../types'; +import { Rule, RuleSummary, RuleType } from '../../../../types'; import { - ComponentOpts as AlertApis, - withBulkAlertOperations, -} from '../../common/components/with_bulk_alert_api_operations'; -import { AlertsWithApi as Alerts } from './alerts'; + ComponentOpts as RuleApis, + withBulkRuleOperations, +} from '../../common/components/with_bulk_rule_api_operations'; +import { RuleWithApi as Rules } from './rule'; import { useKibana } from '../../../../common/lib/kibana'; import { CenterJustifiedSpinner } from '../../../components/center_justified_spinner'; -type WithAlertSummaryProps = { +type WithRuleSummaryProps = { rule: Rule; ruleType: RuleType; readOnly: boolean; requestRefresh: () => Promise; refreshToken?: number; -} & Pick; +} & Pick; -export const AlertsRoute: React.FunctionComponent = ({ +export const RuleRoute: React.FunctionComponent = ({ rule, ruleType, readOnly, requestRefresh, - loadAlertSummary: loadAlertSummary, + loadRuleSummary: loadRuleSummary, refreshToken, }) => { const { notifications: { toasts }, } = useKibana().services; - const [alertSummary, setAlertSummary] = useState(null); + const [ruleSummary, setRuleSummary] = useState(null); const [numberOfExecutions, setNumberOfExecutions] = useState(60); const [isLoadingChart, setIsLoadingChart] = useState(true); const ruleID = useRef(null); const refreshTokenRef = useRef(refreshToken); - const getAlertSummaryWithLoadingState = useCallback( + const getRuleSummaryWithLoadingState = useCallback( async (executions: number = numberOfExecutions) => { setIsLoadingChart(true); - await getAlertSummary(ruleID.current!, loadAlertSummary, setAlertSummary, toasts, executions); + await getRuleSummary(ruleID.current!, loadRuleSummary, setRuleSummary, toasts, executions); setIsLoadingChart(false); }, - [setIsLoadingChart, ruleID, loadAlertSummary, setAlertSummary, toasts, numberOfExecutions] + [setIsLoadingChart, ruleID, loadRuleSummary, setRuleSummary, toasts, numberOfExecutions] ); useEffect(() => { if (ruleID.current !== rule.id) { ruleID.current = rule.id; - getAlertSummaryWithLoadingState(); + getRuleSummaryWithLoadingState(); } - }, [rule, ruleID, getAlertSummaryWithLoadingState]); + }, [rule, ruleID, getRuleSummaryWithLoadingState]); useEffect(() => { if (refreshTokenRef.current !== refreshToken) { refreshTokenRef.current = refreshToken; - getAlertSummaryWithLoadingState(); + getRuleSummaryWithLoadingState(); } - }, [refreshToken, refreshTokenRef, getAlertSummaryWithLoadingState]); + }, [refreshToken, refreshTokenRef, getRuleSummaryWithLoadingState]); const onChangeDuration = useCallback( (executions: number) => { setNumberOfExecutions(executions); - getAlertSummaryWithLoadingState(executions); + getRuleSummaryWithLoadingState(executions); }, - [getAlertSummaryWithLoadingState] + [getRuleSummaryWithLoadingState] ); - return alertSummary ? ( - = ({ ); }; -export async function getAlertSummary( +export async function getRuleSummary( ruleId: string, - loadAlertSummary: AlertApis['loadAlertSummary'], - setAlertSummary: React.Dispatch>, + loadRuleSummary: RuleApis['loadRuleSummary'], + setRuleSummary: React.Dispatch>, toasts: Pick, executionDuration?: number ) { try { - const loadedSummary = await loadAlertSummary(ruleId, executionDuration); - setAlertSummary(loadedSummary); + const loadedSummary = await loadRuleSummary(ruleId, executionDuration); + setRuleSummary(loadedSummary); } catch (e) { toasts.addDanger({ title: i18n.translate( - 'xpack.triggersActionsUI.sections.alertDetails.unableToLoadAlertsMessage', + 'xpack.triggersActionsUI.sections.ruleDetails.unableToLoadRulesMessage', { - defaultMessage: 'Unable to load alerts: {message}', + defaultMessage: 'Unable to load rules: {message}', values: { message: e.message, }, @@ -115,4 +115,4 @@ export async function getAlertSummary( } } -export const AlertsRouteWithApi = withBulkAlertOperations(AlertsRoute); +export const RuleRouteWithApi = withBulkRuleOperations(RuleRoute); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/view_in_app.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/view_in_app.test.tsx similarity index 79% rename from x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/view_in_app.test.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/view_in_app.test.tsx index d177e94b8fd74..ee29facf60579 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/view_in_app.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/view_in_app.test.tsx @@ -16,30 +16,30 @@ import { useKibana } from '../../../../common/lib/kibana'; jest.mock('../../../../common/lib/kibana'); jest.mock('../../../lib/capabilities', () => ({ - hasSaveAlertsCapability: jest.fn(() => true), + hasSaveRulesCapability: jest.fn(() => true), })); describe('view in app', () => { - describe('link to the app that created the alert', () => { + describe('link to the app that created the rule', () => { it('is disabled when there is no navigation', async () => { - const alert = mockAlert(); + const rule = mockRule(); const { alerting } = useKibana().services; let component: ReactWrapper; await act(async () => { // use mount as we need useEffect to run - component = mount(); + component = mount(); await waitForUseEffect(); expect(component!.find('button').prop('disabled')).toBe(true); expect(component!.text()).toBe('View in app'); - expect(alerting!.getNavigation).toBeCalledWith(alert.id); + expect(alerting!.getNavigation).toBeCalledWith(rule.id); }); }); it('enabled when there is navigation', async () => { - const alert = mockAlert({ id: 'alert-with-nav', consumer: 'siem' }); + const rule = mockRule({ id: 'rule-with-nav', consumer: 'siem' }); const { application: { navigateToApp }, } = useKibana().services; @@ -47,7 +47,7 @@ describe('view in app', () => { let component: ReactWrapper; act(async () => { // use mount as we need useEffect to run - component = mount(); + component = mount(); await waitForUseEffect(); @@ -57,7 +57,7 @@ describe('view in app', () => { currentTarget: {}, } as React.MouseEvent<{}, MouseEvent>); - expect(navigateToApp).toBeCalledWith('siem', '/alert'); + expect(navigateToApp).toBeCalledWith('siem', '/rule'); }); }); }); @@ -69,13 +69,13 @@ function waitForUseEffect() { }); } -function mockAlert(overloads: Partial = {}): Rule { +function mockRule(overloads: Partial = {}): Rule { return { id: uuid.v4(), enabled: true, - name: `alert-${uuid.v4()}`, + name: `rule-${uuid.v4()}`, tags: [], - alertTypeId: '.noop', + ruleTypeId: '.noop', consumer: 'consumer', schedule: { interval: '1m' }, actions: [], diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/view_in_app.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/view_in_app.tsx similarity index 53% rename from x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/view_in_app.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/view_in_app.tsx index df80be989aaa7..85b9bcd79806f 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/view_in_app.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/view_in_app.tsx @@ -13,59 +13,59 @@ import { fromNullable, fold } from 'fp-ts/lib/Option'; import { pipe } from 'fp-ts/lib/pipeable'; import { - AlertNavigation, - AlertStateNavigation, - AlertUrlNavigation, + AlertNavigation as RuleNavigation, + AlertStateNavigation as RuleStateNavigation, + AlertUrlNavigation as RuleUrlNavigation, } from '../../../../../../alerting/common'; import { Rule } from '../../../../types'; import { useKibana } from '../../../../common/lib/kibana'; export interface ViewInAppProps { - alert: Rule; + rule: Rule; } const NO_NAVIGATION = false; -type AlertNavigationLoadingState = AlertNavigation | false | null; +type RuleNavigationLoadingState = RuleNavigation | false | null; -export const ViewInApp: React.FunctionComponent = ({ alert }) => { +export const ViewInApp: React.FunctionComponent = ({ rule }) => { const { application: { navigateToApp }, alerting: maybeAlerting, } = useKibana().services; - const [alertNavigation, setAlertNavigation] = useState(null); + const [ruleNavigation, setRuleNavigation] = useState(null); useEffect(() => { pipe( fromNullable(maybeAlerting), fold( /** - * If the alerting plugin is disabled, + * If the ruleing plugin is disabled, * navigation isn't supported */ - () => setAlertNavigation(NO_NAVIGATION), - (alerting) => { - return alerting - .getNavigation(alert.id) - .then((nav) => (nav ? setAlertNavigation(nav) : setAlertNavigation(NO_NAVIGATION))) + () => setRuleNavigation(NO_NAVIGATION), + (ruleing) => { + return ruleing + .getNavigation(rule.id) + .then((nav) => (nav ? setRuleNavigation(nav) : setRuleNavigation(NO_NAVIGATION))) .catch(() => { - setAlertNavigation(NO_NAVIGATION); + setRuleNavigation(NO_NAVIGATION); }); } ) ); - }, [alert.id, maybeAlerting]); + }, [rule.id, maybeAlerting]); return ( @@ -73,22 +73,22 @@ export const ViewInApp: React.FunctionComponent = ({ alert }) => }; function hasNavigation( - alertNavigation: AlertNavigationLoadingState -): alertNavigation is AlertStateNavigation | AlertUrlNavigation { - return alertNavigation - ? alertNavigation.hasOwnProperty('state') || alertNavigation.hasOwnProperty('path') + ruleNavigation: RuleNavigationLoadingState +): ruleNavigation is RuleStateNavigation | RuleUrlNavigation { + return ruleNavigation + ? ruleNavigation.hasOwnProperty('state') || ruleNavigation.hasOwnProperty('path') : NO_NAVIGATION; } function getNavigationHandler( - alertNavigation: AlertNavigationLoadingState, - alert: Rule, + ruleNavigation: RuleNavigationLoadingState, + rule: Rule, navigateToApp: CoreStart['application']['navigateToApp'] ): object { - return hasNavigation(alertNavigation) + return hasNavigation(ruleNavigation) ? { onClick: () => { - navigateToApp(alert.consumer, alertNavigation); + navigateToApp(rule.consumer, ruleNavigation); }, } : {}; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/confirm_alert_close.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/confirm_rule_close.tsx similarity index 69% rename from x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/confirm_alert_close.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/confirm_rule_close.tsx index e3de4804dc08f..1b3ad3473b7ec 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/confirm_alert_close.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/confirm_rule_close.tsx @@ -15,11 +15,11 @@ interface Props { onCancel: () => void; } -export const ConfirmAlertClose: React.FC = ({ onConfirm, onCancel }) => { +export const ConfirmRuleClose: React.FC = ({ onConfirm, onCancel }) => { return ( = ({ onConfirm, onCancel }) => { onCancel={onCancel} onConfirm={onConfirm} confirmButtonText={i18n.translate( - 'xpack.triggersActionsUI.sections.confirmAlertClose.confirmAlertCloseConfirmButtonText', + 'xpack.triggersActionsUI.sections.confirmRuleClose.confirmRuleCloseConfirmButtonText', { defaultMessage: 'Discard changes', } )} cancelButtonText={i18n.translate( - 'xpack.triggersActionsUI.sections.confirmAlertClose.confirmAlertCloseCancelButtonText', + 'xpack.triggersActionsUI.sections.confirmRuleClose.confirmRuleCloseCancelButtonText', { defaultMessage: 'Cancel', } )} defaultFocusedButton="confirm" - data-test-subj="confirmAlertCloseModal" + data-test-subj="confirmRuleCloseModal" >

diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/confirm_alert_save.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/confirm_rule_save.tsx similarity index 68% rename from x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/confirm_alert_save.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/confirm_rule_save.tsx index ebc2407774bda..a3359374f2d10 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/confirm_alert_save.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/confirm_rule_save.tsx @@ -15,11 +15,11 @@ interface Props { onCancel: () => void; } -export const ConfirmAlertSave: React.FC = ({ onConfirm, onCancel }) => { +export const ConfirmRuleSave: React.FC = ({ onConfirm, onCancel }) => { return ( = ({ onConfirm, onCancel }) => { onCancel={onCancel} onConfirm={onConfirm} confirmButtonText={i18n.translate( - 'xpack.triggersActionsUI.sections.confirmAlertSave.confirmAlertSaveConfirmButtonText', + 'xpack.triggersActionsUI.sections.confirmRuleSave.confirmRuleSaveConfirmButtonText', { defaultMessage: 'Save rule', } )} cancelButtonText={i18n.translate( - 'xpack.triggersActionsUI.sections.confirmAlertSave.confirmAlertSaveCancelButtonText', + 'xpack.triggersActionsUI.sections.confirmRuleSave.confirmRuleSaveCancelButtonText', { defaultMessage: 'Cancel', } )} defaultFocusedButton="confirm" - data-test-subj="confirmAlertSaveModal" + data-test-subj="confirmRuleSaveModal" >

diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/has_rule_changed.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/has_rule_changed.test.ts new file mode 100644 index 0000000000000..17f54d297b9be --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/has_rule_changed.test.ts @@ -0,0 +1,165 @@ +/* + * 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 { InitialRule } from './rule_reducer'; +import { hasRuleChanged } from './has_rule_changed'; + +function createRule(overrides = {}): InitialRule { + return { + params: {}, + consumer: 'test', + ruleTypeId: 'test', + schedule: { + interval: '1m', + }, + actions: [], + tags: [], + notifyWhen: 'onActionGroupChange', + ...overrides, + }; +} + +test('should return false for same rule', () => { + const a = createRule(); + expect(hasRuleChanged(a, a, true)).toEqual(false); +}); + +test('should return true for different rule', () => { + const a = createRule(); + const b = createRule({ ruleTypeId: 'differentTest' }); + expect(hasRuleChanged(a, b, true)).toEqual(true); +}); + +test('should correctly compare name field', () => { + // name field doesn't exist initially + const a = createRule(); + // set name to actual value + const b = createRule({ name: 'myRule' }); + // set name to different value + const c = createRule({ name: 'anotherRule' }); + // set name to various empty/null/undefined states + const d = createRule({ name: '' }); + const e = createRule({ name: undefined }); + const f = createRule({ name: null }); + + expect(hasRuleChanged(a, b, true)).toEqual(true); + expect(hasRuleChanged(a, c, true)).toEqual(true); + expect(hasRuleChanged(a, d, true)).toEqual(false); + expect(hasRuleChanged(a, e, true)).toEqual(false); + expect(hasRuleChanged(a, f, true)).toEqual(false); + + expect(hasRuleChanged(b, c, true)).toEqual(true); + expect(hasRuleChanged(b, d, true)).toEqual(true); + expect(hasRuleChanged(b, e, true)).toEqual(true); + expect(hasRuleChanged(b, f, true)).toEqual(true); + + expect(hasRuleChanged(c, d, true)).toEqual(true); + expect(hasRuleChanged(c, e, true)).toEqual(true); + expect(hasRuleChanged(c, f, true)).toEqual(true); + + expect(hasRuleChanged(d, e, true)).toEqual(false); + expect(hasRuleChanged(d, f, true)).toEqual(false); +}); + +test('should correctly compare ruleTypeId field', () => { + const a = createRule(); + + // set ruleTypeId to different value + const b = createRule({ ruleTypeId: 'myRuleId' }); + // set ruleTypeId to various empty/null/undefined states + const c = createRule({ ruleTypeId: '' }); + const d = createRule({ ruleTypeId: undefined }); + const e = createRule({ ruleTypeId: null }); + + expect(hasRuleChanged(a, b, true)).toEqual(true); + expect(hasRuleChanged(a, c, true)).toEqual(true); + expect(hasRuleChanged(a, d, true)).toEqual(true); + expect(hasRuleChanged(a, e, true)).toEqual(true); + + expect(hasRuleChanged(b, c, true)).toEqual(true); + expect(hasRuleChanged(b, d, true)).toEqual(true); + expect(hasRuleChanged(b, e, true)).toEqual(true); + + expect(hasRuleChanged(c, d, true)).toEqual(false); + expect(hasRuleChanged(c, e, true)).toEqual(false); + expect(hasRuleChanged(d, e, true)).toEqual(false); +}); + +test('should correctly compare throttle field', () => { + // throttle field doesn't exist initially + const a = createRule(); + // set throttle to actual value + const b = createRule({ throttle: '1m' }); + // set throttle to different value + const c = createRule({ throttle: '1h' }); + // set throttle to various empty/null/undefined states + const d = createRule({ throttle: '' }); + const e = createRule({ throttle: undefined }); + const f = createRule({ throttle: null }); + + expect(hasRuleChanged(a, b, true)).toEqual(true); + expect(hasRuleChanged(a, c, true)).toEqual(true); + expect(hasRuleChanged(a, d, true)).toEqual(false); + expect(hasRuleChanged(a, e, true)).toEqual(false); + expect(hasRuleChanged(a, f, true)).toEqual(false); + + expect(hasRuleChanged(b, c, true)).toEqual(true); + expect(hasRuleChanged(b, d, true)).toEqual(true); + expect(hasRuleChanged(b, e, true)).toEqual(true); + expect(hasRuleChanged(b, f, true)).toEqual(true); + + expect(hasRuleChanged(c, d, true)).toEqual(true); + expect(hasRuleChanged(c, e, true)).toEqual(true); + expect(hasRuleChanged(c, f, true)).toEqual(true); + + expect(hasRuleChanged(d, e, true)).toEqual(false); + expect(hasRuleChanged(d, f, true)).toEqual(false); +}); + +test('should correctly compare tags field', () => { + const a = createRule(); + const b = createRule({ tags: ['first'] }); + + expect(hasRuleChanged(a, b, true)).toEqual(true); +}); + +test('should correctly compare schedule field', () => { + const a = createRule(); + const b = createRule({ schedule: { interval: '3h' } }); + + expect(hasRuleChanged(a, b, true)).toEqual(true); +}); + +test('should correctly compare actions field', () => { + const a = createRule(); + const b = createRule({ + actions: [{ actionTypeId: 'action', group: 'group', id: 'actionId', params: {} }], + }); + + expect(hasRuleChanged(a, b, true)).toEqual(true); +}); + +test('should skip comparing params field if compareParams=false', () => { + const a = createRule(); + const b = createRule({ params: { newParam: 'value' } }); + + expect(hasRuleChanged(a, b, false)).toEqual(false); +}); + +test('should correctly compare params field if compareParams=true', () => { + const a = createRule(); + const b = createRule({ params: { newParam: 'value' } }); + + expect(hasRuleChanged(a, b, true)).toEqual(true); +}); + +test('should correctly compare notifyWhen field', () => { + const a = createRule(); + const b = createRule({ notifyWhen: 'onActiveAlert' }); + + expect(hasRuleChanged(a, b, true)).toEqual(true); +}); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/has_alert_changed.ts b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/has_rule_changed.ts similarity index 72% rename from x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/has_alert_changed.ts rename to x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/has_rule_changed.ts index bcf34f6d4ad0f..a79e820e2cfd8 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/has_alert_changed.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/has_rule_changed.ts @@ -8,20 +8,20 @@ import deepEqual from 'fast-deep-equal'; import { pick } from 'lodash'; import { RuleTypeParams } from '../../../types'; -import { InitialAlert } from './alert_reducer'; +import { InitialRule } from './rule_reducer'; const DEEP_COMPARE_FIELDS = ['tags', 'schedule', 'actions', 'notifyWhen']; -function getNonNullCompareFields(alert: InitialAlert) { - const { name, alertTypeId, throttle } = alert; +function getNonNullCompareFields(rule: InitialRule) { + const { name, ruleTypeId, throttle } = rule; return { ...(!!(name && name.length > 0) ? { name } : {}), - ...(!!(alertTypeId && alertTypeId.length > 0) ? { alertTypeId } : {}), + ...(!!(ruleTypeId && ruleTypeId.length > 0) ? { ruleTypeId } : {}), ...(!!(throttle && throttle.length > 0) ? { throttle } : {}), }; } -export function hasAlertChanged(a: InitialAlert, b: InitialAlert, compareParams: boolean) { +export function hasRuleChanged(a: InitialRule, b: InitialRule, compareParams: boolean) { // Deep compare these fields let objectsAreEqual = deepEqual(pick(a, DEEP_COMPARE_FIELDS), pick(b, DEEP_COMPARE_FIELDS)); if (compareParams) { @@ -36,6 +36,6 @@ export function hasAlertChanged(a: InitialAlert, b: InitialAlert, compareParams: return !objectsAreEqual || !nonNullCompareFieldsAreEqual; } -export function haveAlertParamsChanged(a: RuleTypeParams, b: RuleTypeParams) { +export function haveRuleParamsChanged(a: RuleTypeParams, b: RuleTypeParams) { return !deepEqual(a, b); } diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/index.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/index.tsx similarity index 67% rename from x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/index.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/index.tsx index ac2648eea3e89..dfab594febf10 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/index.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/index.tsx @@ -8,5 +8,5 @@ import { lazy } from 'react'; import { suspendedComponentWithProps } from '../../lib/suspended_component_with_props'; -export const AlertAdd = suspendedComponentWithProps(lazy(() => import('./alert_add'))); -export const AlertEdit = suspendedComponentWithProps(lazy(() => import('./alert_edit'))); +export const RuleAdd = suspendedComponentWithProps(lazy(() => import('./rule_add'))); +export const RuleEdit = suspendedComponentWithProps(lazy(() => import('./rule_edit'))); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_add.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_add.test.tsx similarity index 76% rename from x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_add.test.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_add.test.tsx index 7e45dd8ac636a..01e459011f26b 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_add.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_add.test.tsx @@ -12,13 +12,13 @@ import { act } from 'react-dom/test-utils'; import { FormattedMessage } from '@kbn/i18n-react'; import { EuiFormLabel } from '@elastic/eui'; import { coreMock } from '../../../../../../../src/core/public/mocks'; -import AlertAdd from './alert_add'; -import { createAlert } from '../../lib/alert_api'; +import RuleAdd from './rule_add'; +import { createRule } from '../../lib/rule_api'; import { actionTypeRegistryMock } from '../../action_type_registry.mock'; import { Rule, - AlertAddProps, - AlertFlyoutCloseReason, + RuleAddProps, + RuleFlyoutCloseReason, ConnectorValidationResult, GenericValidationResult, ValidationResult, @@ -30,9 +30,9 @@ import { useKibana } from '../../../common/lib/kibana'; jest.mock('../../../common/lib/kibana'); -jest.mock('../../lib/alert_api', () => ({ - loadAlertTypes: jest.fn(), - createAlert: jest.fn(), +jest.mock('../../lib/rule_api', () => ({ + loadRuleTypes: jest.fn(), + createRule: jest.fn(), alertingFrameworkHealth: jest.fn(() => ({ isSufficientlySecure: true, hasPermanentEncryptionKey: true, @@ -40,7 +40,7 @@ jest.mock('../../lib/alert_api', () => ({ })); jest.mock('../../../common/lib/health_api', () => ({ - triggersActionsUiHealth: jest.fn(() => ({ isAlertsAvailable: true })), + triggersActionsUiHealth: jest.fn(() => ({ isRulesAvailable: true })), })); const actionTypeRegistry = actionTypeRegistryMock.create(); @@ -52,26 +52,26 @@ export const TestExpression: FunctionComponent = () => { ); }; -describe('alert_add', () => { +describe('rule_add', () => { let wrapper: ReactWrapper; async function setup( initialValues?: Partial, - onClose: AlertAddProps['onClose'] = jest.fn(), + onClose: RuleAddProps['onClose'] = jest.fn(), defaultScheduleInterval?: string ) { const mocks = coreMock.createSetup(); - const { loadAlertTypes } = jest.requireMock('../../lib/alert_api'); - const alertTypes = [ + const { loadRuleTypes } = jest.requireMock('../../lib/rule_api'); + const ruleTypes = [ { - id: 'my-alert-type', + id: 'my-rule-type', name: 'Test', actionGroups: [ { @@ -95,7 +95,7 @@ describe('alert_add', () => { }, }, ]; - loadAlertTypes.mockResolvedValue(alertTypes); + loadRuleTypes.mockResolvedValue(ruleTypes); const [ { application: { capabilities }, @@ -104,7 +104,7 @@ describe('alert_add', () => { // eslint-disable-next-line react-hooks/rules-of-hooks useKibanaMock().services.application.capabilities = { ...capabilities, - alerts: { + rules: { show: true, save: true, delete: true, @@ -117,7 +117,7 @@ describe('alert_add', () => { }); const ruleType = { - id: 'my-alert-type', + id: 'my-rule-type', iconClass: 'test', description: 'test', documentationUrl: null, @@ -150,7 +150,7 @@ describe('alert_add', () => { actionTypeRegistry.has.mockReturnValue(true); wrapper = mountWithIntl( - { }); } - it('renders alert add flyout', async () => { + it('renders rule add flyout', async () => { const onClose = jest.fn(); await setup({}, onClose); - expect(wrapper.find('[data-test-subj="addAlertFlyoutTitle"]').exists()).toBeTruthy(); - expect(wrapper.find('[data-test-subj="saveAlertButton"]').exists()).toBeTruthy(); + expect(wrapper.find('[data-test-subj="addRuleFlyoutTitle"]').exists()).toBeTruthy(); + expect(wrapper.find('[data-test-subj="saveRuleButton"]').exists()).toBeTruthy(); - wrapper.find('[data-test-subj="my-alert-type-SelectOption"]').first().simulate('click'); + wrapper.find('[data-test-subj="my-rule-type-SelectOption"]').first().simulate('click'); - expect(wrapper.find('input#alertName').props().value).toBe(''); + expect(wrapper.find('input#ruleName').props().value).toBe(''); expect(wrapper.find('[data-test-subj="tagsComboBox"]').first().text()).toBe(''); expect(wrapper.find('.euiSelect').first().props().value).toBe('m'); - wrapper.find('[data-test-subj="cancelSaveAlertButton"]').first().simulate('click'); - expect(onClose).toHaveBeenCalledWith(AlertFlyoutCloseReason.CANCELED); + wrapper.find('[data-test-subj="cancelSaveRuleButton"]').first().simulate('click'); + expect(onClose).toHaveBeenCalledWith(RuleFlyoutCloseReason.CANCELED); }); - it('renders alert add flyout with initial values', async () => { + it('renders rule add flyout with initial values', async () => { const onClose = jest.fn(); await setup( { - name: 'Simple status alert', + name: 'Simple status rule', tags: ['uptime', 'logs'], schedule: { interval: '1h', @@ -202,23 +202,23 @@ describe('alert_add', () => { onClose ); - expect(wrapper.find('input#alertName').props().value).toBe('Simple status alert'); + expect(wrapper.find('input#ruleName').props().value).toBe('Simple status rule'); expect(wrapper.find('[data-test-subj="tagsComboBox"]').first().text()).toBe('uptimelogs'); expect(wrapper.find('.euiSelect').first().props().value).toBe('h'); }); - it('emit an onClose event when the alert is saved', async () => { + it('emit an onClose event when the rule is saved', async () => { const onClose = jest.fn(); - const alert = mockAlert(); + const rule = mockRule(); - (createAlert as jest.MockedFunction).mockResolvedValue(alert); + (createRule as jest.MockedFunction).mockResolvedValue(rule); await setup( { - name: 'Simple status alert', - alertTypeId: 'my-alert-type', + name: 'Simple status rule', + ruleTypeId: 'my-rule-type', tags: ['uptime', 'logs'], schedule: { interval: '1h', @@ -227,7 +227,7 @@ describe('alert_add', () => { onClose ); - wrapper.find('[data-test-subj="saveAlertButton"]').first().simulate('click'); + wrapper.find('[data-test-subj="saveRuleButton"]').first().simulate('click'); // Wait for handlers to fire await act(async () => { @@ -235,11 +235,11 @@ describe('alert_add', () => { wrapper.update(); }); - expect(onClose).toHaveBeenCalledWith(AlertFlyoutCloseReason.SAVED); + expect(onClose).toHaveBeenCalledWith(RuleFlyoutCloseReason.SAVED); }); it('should enforce any default inteval', async () => { - await setup({ alertTypeId: 'my-alert-type' }, jest.fn(), '3h'); + await setup({ ruleTypeId: 'my-rule-type' }, jest.fn(), '3h'); // Wait for handlers to fire await act(async () => { @@ -258,13 +258,13 @@ describe('alert_add', () => { }); }); -function mockAlert(overloads: Partial = {}): Rule { +function mockRule(overloads: Partial = {}): Rule { return { id: uuid.v4(), enabled: true, - name: `alert-${uuid.v4()}`, + name: `rule-${uuid.v4()}`, tags: [], - alertTypeId: '.noop', + ruleTypeId: '.noop', consumer: 'consumer', schedule: { interval: '1m' }, actions: [], diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_add.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_add.tsx new file mode 100644 index 0000000000000..98b7bfd36452c --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_add.tsx @@ -0,0 +1,303 @@ +/* + * 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, { useReducer, useMemo, useState, useEffect } from 'react'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { EuiTitle, EuiFlyoutHeader, EuiFlyout, EuiFlyoutBody, EuiPortal } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { isEmpty } from 'lodash'; +import { + Rule, + RuleTypeParams, + RuleUpdates, + RuleFlyoutCloseReason, + IErrorObject, + RuleAddProps, + RuleTypeIndex, +} from '../../../types'; +import { RuleForm } from './rule_form'; +import { getRuleActionErrors, getRuleErrors, isValidRule } from './rule_errors'; +import { ruleReducer, InitialRule, InitialRuleReducer } from './rule_reducer'; +import { createRule, loadRuleTypes } from '../../lib/rule_api'; +import { HealthCheck } from '../../components/health_check'; +import { ConfirmRuleSave } from './confirm_rule_save'; +import { ConfirmRuleClose } from './confirm_rule_close'; +import { hasShowActionsCapability } from '../../lib/capabilities'; +import RuleAddFooter from './rule_add_footer'; +import { HealthContextProvider } from '../../context/health_context'; +import { useKibana } from '../../../common/lib/kibana'; +import { hasRuleChanged, haveRuleParamsChanged } from './has_rule_changed'; +import { getRuleWithInvalidatedFields } from '../../lib/value_validators'; +import { DEFAULT_ALERT_INTERVAL } from '../../constants'; + +const RuleAdd = ({ + consumer, + ruleTypeRegistry, + actionTypeRegistry, + onClose, + canChangeTrigger, + ruleTypeId, + initialValues, + reloadRules, + onSave, + metadata, + ...props +}: RuleAddProps) => { + const onSaveHandler = onSave ?? reloadRules; + + const initialRule: InitialRule = useMemo(() => { + return { + params: {}, + consumer, + ruleTypeId, + schedule: { + interval: DEFAULT_ALERT_INTERVAL, + }, + actions: [], + tags: [], + notifyWhen: 'onActionGroupChange', + ...(initialValues ? initialValues : {}), + }; + }, [ruleTypeId, consumer, initialValues]); + + const [{ rule }, dispatch] = useReducer(ruleReducer as InitialRuleReducer, { + rule: initialRule, + }); + const [initialRuleParams, setInitialRuleParams] = useState({}); + const [isSaving, setIsSaving] = useState(false); + const [isConfirmRuleSaveModalOpen, setIsConfirmRuleSaveModalOpen] = useState(false); + const [isConfirmRuleCloseModalOpen, setIsConfirmRuleCloseModalOpen] = useState(false); + const [ruleTypeIndex, setRuleTypeIndex] = useState( + props.ruleTypeIndex + ); + const [changedFromDefaultInterval, setChangedFromDefaultInterval] = useState(false); + + const setRule = (value: InitialRule) => { + dispatch({ command: { type: 'setRule' }, payload: { key: 'rule', value } }); + }; + + const setRuleProperty = (key: Key, value: Rule[Key] | null) => { + dispatch({ command: { type: 'setProperty' }, payload: { key, value } }); + }; + + const { + http, + notifications: { toasts }, + application: { capabilities }, + } = useKibana().services; + + const canShowActions = hasShowActionsCapability(capabilities); + + useEffect(() => { + if (ruleTypeId) { + setRuleProperty('ruleTypeId', ruleTypeId); + } + }, [ruleTypeId]); + + useEffect(() => { + if (!props.ruleTypeIndex) { + (async () => { + const ruleTypes = await loadRuleTypes({ http }); + const index: RuleTypeIndex = new Map(); + for (const ruleType of ruleTypes) { + index.set(ruleType.id, ruleType); + } + setRuleTypeIndex(index); + })(); + } + }, [props.ruleTypeIndex, http]); + + useEffect(() => { + if (isEmpty(rule.params) && !isEmpty(initialRuleParams)) { + // rule params are explicitly cleared when the rule type is cleared. + // clear the "initial" params in order to capture the + // default when a new rule type is selected + setInitialRuleParams({}); + } else if (isEmpty(initialRuleParams)) { + // captures the first change to the rule params, + // when consumers set a default value for the rule params + setInitialRuleParams(rule.params); + } + }, [rule.params, initialRuleParams]); + + const [ruleActionsErrors, setRuleActionsErrors] = useState([]); + const [isLoading, setIsLoading] = useState(false); + + useEffect(() => { + (async () => { + setIsLoading(true); + const res = await getRuleActionErrors(rule as Rule, actionTypeRegistry); + setIsLoading(false); + setRuleActionsErrors([...res]); + })(); + }, [rule, actionTypeRegistry]); + + useEffect(() => { + if (rule.ruleTypeId && ruleTypeIndex) { + const type = ruleTypeIndex.get(rule.ruleTypeId); + if (type?.defaultScheduleInterval && !changedFromDefaultInterval) { + setRuleProperty('schedule', { interval: type.defaultScheduleInterval }); + } + } + }, [rule.ruleTypeId, ruleTypeIndex, rule.schedule.interval, changedFromDefaultInterval]); + + useEffect(() => { + if (rule.schedule.interval !== DEFAULT_ALERT_INTERVAL && !changedFromDefaultInterval) { + setChangedFromDefaultInterval(true); + } + }, [rule.schedule.interval, changedFromDefaultInterval]); + + const checkForChangesAndCloseFlyout = () => { + if ( + hasRuleChanged(rule, initialRule, false) || + haveRuleParamsChanged(rule.params, initialRuleParams) + ) { + setIsConfirmRuleCloseModalOpen(true); + } else { + onClose(RuleFlyoutCloseReason.CANCELED); + } + }; + + const saveRuleAndCloseFlyout = async () => { + const savedRule = await onSaveRule(); + setIsSaving(false); + if (savedRule) { + onClose(RuleFlyoutCloseReason.SAVED); + if (onSaveHandler) { + onSaveHandler(); + } + } + }; + + const ruleType = rule.ruleTypeId ? ruleTypeRegistry.get(rule.ruleTypeId) : null; + + const { ruleBaseErrors, ruleErrors, ruleParamsErrors } = getRuleErrors( + rule as Rule, + ruleType, + rule.ruleTypeId ? ruleTypeIndex?.get(rule.ruleTypeId) : undefined + ); + + // Confirm before saving if user is able to add actions but hasn't added any to this rule + const shouldConfirmSave = canShowActions && rule.actions?.length === 0; + + async function onSaveRule(): Promise { + try { + const newRule = await createRule({ http, rule: rule as RuleUpdates }); + toasts.addSuccess( + i18n.translate('xpack.triggersActionsUI.sections.ruleAdd.saveSuccessNotificationText', { + defaultMessage: 'Created rule "{ruleName}"', + values: { + ruleName: newRule.name, + }, + }) + ); + return newRule; + } catch (errorRes) { + toasts.addDanger( + errorRes.body?.message ?? + i18n.translate('xpack.triggersActionsUI.sections.ruleAdd.saveErrorNotificationText', { + defaultMessage: 'Cannot create rule.', + }) + ); + } + } + + return ( + + + + +

+ +

+
+
+ + + + + + { + setIsSaving(true); + if (isLoading || !isValidRule(rule, ruleErrors, ruleActionsErrors)) { + setRule( + getRuleWithInvalidatedFields( + rule as Rule, + ruleParamsErrors, + ruleBaseErrors, + ruleActionsErrors + ) + ); + setIsSaving(false); + return; + } + if (shouldConfirmSave) { + setIsConfirmRuleSaveModalOpen(true); + } else { + await saveRuleAndCloseFlyout(); + } + }} + onCancel={checkForChangesAndCloseFlyout} + /> + + + {isConfirmRuleSaveModalOpen && ( + { + setIsConfirmRuleSaveModalOpen(false); + await saveRuleAndCloseFlyout(); + }} + onCancel={() => { + setIsSaving(false); + setIsConfirmRuleSaveModalOpen(false); + }} + /> + )} + {isConfirmRuleCloseModalOpen && ( + { + setIsConfirmRuleCloseModalOpen(false); + onClose(RuleFlyoutCloseReason.CANCELED); + }} + onCancel={() => { + setIsConfirmRuleCloseModalOpen(false); + }} + /> + )} +
+
+ ); +}; + +// eslint-disable-next-line import/no-default-export +export { RuleAdd as default }; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_add_footer.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_add_footer.tsx similarity index 79% rename from x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_add_footer.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_add_footer.tsx index a0f0ec66d2346..f2d035b2112aa 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_add_footer.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_add_footer.tsx @@ -19,27 +19,27 @@ import { import { i18n } from '@kbn/i18n'; import { useHealthContext } from '../../context/health_context'; -interface AlertAddFooterProps { +interface RuleAddFooterProps { isSaving: boolean; isFormLoading: boolean; onSave: () => void; onCancel: () => void; } -export const AlertAddFooter = ({ +export const RuleAddFooter = ({ isSaving, onSave, onCancel, isFormLoading, -}: AlertAddFooterProps) => { +}: RuleAddFooterProps) => { const { loadingHealthCheck } = useHealthContext(); return ( - - {i18n.translate('xpack.triggersActionsUI.sections.alertAddFooter.cancelButtonLabel', { + + {i18n.translate('xpack.triggersActionsUI.sections.ruleAddFooter.cancelButtonLabel', { defaultMessage: 'Cancel', })} @@ -56,7 +56,7 @@ export const AlertAddFooter = ({ @@ -75,4 +75,4 @@ export const AlertAddFooter = ({ }; // eslint-disable-next-line import/no-default-export -export { AlertAddFooter as default }; +export { RuleAddFooter as default }; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_conditions.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_conditions.test.tsx similarity index 93% rename from x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_conditions.test.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_conditions.test.tsx index 07f7b1475b92f..bde4596a518fb 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_conditions.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_conditions.test.tsx @@ -9,7 +9,7 @@ import * as React from 'react'; import { mountWithIntl, nextTick } from '@kbn/test-jest-helpers'; import { act } from 'react-dom/test-utils'; import { ReactWrapper } from 'enzyme'; -import { AlertConditions, ActionGroupWithCondition } from './alert_conditions'; +import { RuleConditions, ActionGroupWithCondition } from './rule_conditions'; import { FormattedMessage } from '@kbn/i18n-react'; import { EuiTitle, @@ -19,7 +19,7 @@ import { EuiButtonEmpty, } from '@elastic/eui'; -describe('alert_conditions', () => { +describe('rule_conditions', () => { async function setup(element: React.ReactElement): Promise> { const wrapper = mountWithIntl(element); @@ -34,24 +34,23 @@ describe('alert_conditions', () => { it('renders with custom headline', async () => { const wrapper = await setup( - ); expect(wrapper.find(EuiTitle).find(FormattedMessage).prop('id')).toMatchInlineSnapshot( - `"xpack.triggersActionsUI.sections.alertForm.conditions.title"` + `"xpack.triggersActionsUI.sections.ruleForm.conditions.title"` ); expect( wrapper.find(EuiTitle).find(FormattedMessage).prop('defaultMessage') ).toMatchInlineSnapshot(`"Conditions:"`); - expect(wrapper.find('[data-test-subj="alertConditionsHeadline"]').get(0)) - .toMatchInlineSnapshot(` + expect(wrapper.find('[data-test-subj="ruleConditionsHeadline"]').get(0)).toMatchInlineSnapshot(` Set different threshold with their own status @@ -80,13 +79,13 @@ describe('alert_conditions', () => { }; const wrapper = await setup( - - + ); expect(wrapper.find(EuiDescriptionList).find(EuiDescriptionListDescription).get(0)) @@ -126,7 +125,7 @@ describe('alert_conditions', () => { }; const wrapper = await setup( - { ]} > - + ); expect(wrapper.find(EuiDescriptionList).find(EuiDescriptionListDescription).get(0)) @@ -178,7 +177,7 @@ describe('alert_conditions', () => { }; const wrapper = await setup( - { onInitializeConditionsFor={onInitializeConditionsFor} > - + ); expect(wrapper.find(EuiButtonEmpty).get(0)).toMatchInlineSnapshot(` @@ -246,13 +245,13 @@ describe('alert_conditions', () => { }; await setup( - - + ); expect(callbackProp).toHaveBeenCalledWith({ diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_conditions.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_conditions.tsx similarity index 87% rename from x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_conditions.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_conditions.tsx index 217f99c62a4f9..94acf30ece4ea 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_conditions.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_conditions.tsx @@ -30,7 +30,7 @@ export type ActionGroupWithCondition< } ); -export interface AlertConditionsProps { +export interface RuleConditionsProps { headline?: string; actionGroups: Array>; onInitializeConditionsFor?: ( @@ -42,14 +42,14 @@ export interface AlertConditionsProps({ +export const RuleConditions = ({ headline, actionGroups, onInitializeConditionsFor, onResetConditionsFor, includeBuiltInActionGroups = false, children, -}: PropsWithChildren>) => { +}: PropsWithChildren>) => { const [withConditions, withoutConditions] = partition( includeBuiltInActionGroups ? actionGroups @@ -63,16 +63,16 @@ export const AlertConditions = -
+
{headline && ( - + {headline} @@ -101,7 +101,7 @@ export const AlertConditions = @@ -126,4 +126,4 @@ export const AlertConditions = { +describe('rule_conditions_group', () => { async function setup(element: React.ReactElement): Promise> { const wrapper = mountWithIntl(element); @@ -28,14 +28,14 @@ describe('alert_conditions_group', () => { it('renders with actionGroup name as label', async () => { const InnerComponent = () =>
{'inner component'}
; const wrapper = await setup( - - + ); expect(wrapper.find(EuiFormRow).prop('label')).toMatchInlineSnapshot(` @@ -58,7 +58,7 @@ describe('alert_conditions_group', () => { it('renders a reset button when onResetConditionsFor is specified', async () => { const onResetConditionsFor = jest.fn(); const wrapper = await setup( - { onResetConditionsFor={onResetConditionsFor} >
{'inner component'}
-
+ ); expect(wrapper.find(EuiButtonIcon).prop('aria-label')).toMatchInlineSnapshot(`"Remove"`); @@ -82,7 +82,7 @@ describe('alert_conditions_group', () => { it('shouldnt render a reset button when isRequired is true', async () => { const onResetConditionsFor = jest.fn(); const wrapper = await setup( - { onResetConditionsFor={onResetConditionsFor} >
{'inner component'}
-
+ ); expect(wrapper.find(EuiButtonIcon).length).toEqual(0); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_conditions_group.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_conditions_group.tsx similarity index 74% rename from x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_conditions_group.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_conditions_group.tsx index dd0a7df38eb62..0b2d4d5fd26ce 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_conditions_group.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_conditions_group.tsx @@ -8,18 +8,18 @@ import React, { PropsWithChildren } from 'react'; import { i18n } from '@kbn/i18n'; import { EuiFormRow, EuiButtonIcon, EuiTitle } from '@elastic/eui'; -import { AlertConditionsProps, ActionGroupWithCondition } from './alert_conditions'; +import { RuleConditionsProps, ActionGroupWithCondition } from './rule_conditions'; -export type AlertConditionsGroupProps = { +export type RuleConditionsGroupProps = { actionGroup?: ActionGroupWithCondition; -} & Pick, 'onResetConditionsFor'>; +} & Pick, 'onResetConditionsFor'>; -export const AlertConditionsGroup = ({ +export const RuleConditionsGroup = ({ actionGroup, onResetConditionsFor, children, ...otherProps -}: PropsWithChildren>) => { +}: PropsWithChildren>) => { if (!actionGroup) { return null; } @@ -39,7 +39,7 @@ export const AlertConditionsGroup = ({ iconType="minusInCircle" color="danger" aria-label={i18n.translate( - 'xpack.triggersActionsUI.sections.alertForm.conditions.removeConditionLabel', + 'xpack.triggersActionsUI.sections.ruleForm.conditions.removeConditionLabel', { defaultMessage: 'Remove', } @@ -62,4 +62,4 @@ export const AlertConditionsGroup = ({ }; // eslint-disable-next-line import/no-default-export -export { AlertConditionsGroup as default }; +export { RuleConditionsGroup as default }; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_edit.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_edit.test.tsx similarity index 75% rename from x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_edit.test.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_edit.test.tsx index ec33756cfec4a..bdefb730fa716 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_edit.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_edit.test.tsx @@ -18,7 +18,7 @@ import { } from '../../../types'; import { ruleTypeRegistryMock } from '../../rule_type_registry.mock'; import { ReactWrapper } from 'enzyme'; -import AlertEdit from './alert_edit'; +import RuleEdit from './rule_edit'; import { useKibana } from '../../../common/lib/kibana'; import { ALERTS_FEATURE_ID } from '../../../../../alerting/common'; jest.mock('../../../common/lib/kibana'); @@ -26,37 +26,37 @@ const actionTypeRegistry = actionTypeRegistryMock.create(); const ruleTypeRegistry = ruleTypeRegistryMock.create(); const useKibanaMock = useKibana as jest.Mocked; -jest.mock('../../lib/alert_api', () => ({ - loadAlertTypes: jest.fn(), - updateAlert: jest.fn().mockRejectedValue({ body: { message: 'Fail message' } }), +jest.mock('../../lib/rule_api', () => ({ + loadRuleTypes: jest.fn(), + updateRule: jest.fn().mockRejectedValue({ body: { message: 'Fail message' } }), alertingFrameworkHealth: jest.fn(() => ({ isSufficientlySecure: true, hasPermanentEncryptionKey: true, })), })); -jest.mock('./alert_errors', () => ({ - getAlertActionErrors: jest.fn().mockImplementation(() => { +jest.mock('./rule_errors', () => ({ + getRuleActionErrors: jest.fn().mockImplementation(() => { return []; }), - getAlertErrors: jest.fn().mockImplementation(() => ({ - alertParamsErrors: {}, - alertBaseErrors: {}, - alertErrors: { + getRuleErrors: jest.fn().mockImplementation(() => ({ + ruleParamsErrors: {}, + ruleBaseErrors: {}, + ruleErrors: { name: new Array(), interval: new Array(), - alertTypeId: new Array(), + ruleTypeId: new Array(), actionConnectors: new Array(), }, })), - isValidAlert: jest.fn(), + isValidRule: jest.fn(), })); jest.mock('../../../common/lib/health_api', () => ({ - triggersActionsUiHealth: jest.fn(() => ({ isAlertsAvailable: true })), + triggersActionsUiHealth: jest.fn(() => ({ isRulesAvailable: true })), })); -describe('alert_edit', () => { +describe('rule_edit', () => { let wrapper: ReactWrapper; let mockedCoreSetup: ReturnType; @@ -64,7 +64,7 @@ describe('alert_edit', () => { mockedCoreSetup = coreMock.createSetup(); }); - async function setup(initialAlertFields = {}) { + async function setup(initialRuleFields = {}) { const [ { application: { capabilities }, @@ -73,7 +73,7 @@ describe('alert_edit', () => { // eslint-disable-next-line react-hooks/rules-of-hooks useKibanaMock().services.application.capabilities = { ...capabilities, - alerts: { + rules: { show: true, save: true, delete: true, @@ -81,10 +81,10 @@ describe('alert_edit', () => { }, }; - const { loadAlertTypes } = jest.requireMock('../../lib/alert_api'); - const alertTypes = [ + const { loadRuleTypes } = jest.requireMock('../../lib/rule_api'); + const ruleTypes = [ { - id: 'my-alert-type', + id: 'my-rule-type', name: 'Test', actionGroups: [ { @@ -108,7 +108,7 @@ describe('alert_edit', () => { }, ]; const ruleType = { - id: 'my-alert-type', + id: 'my-rule-type', iconClass: 'test', description: 'test', documentationUrl: null, @@ -132,8 +132,8 @@ describe('alert_edit', () => { }, actionConnectorFields: null, }); - loadAlertTypes.mockResolvedValue(alertTypes); - const alert: Rule = { + loadRuleTypes.mockResolvedValue(ruleTypes); + const rule: Rule = { id: 'ab5661e0-197e-45ee-b477-302d89193b5e', params: { aggType: 'average', @@ -144,20 +144,20 @@ describe('alert_edit', () => { window: '1s', comparator: 'between', }, - consumer: 'alerts', - alertTypeId: 'my-alert-type', + consumer: 'rules', + ruleTypeId: 'my-rule-type', enabled: false, schedule: { interval: '1m' }, actions: [ { actionTypeId: 'my-action-type', group: 'threshold met', - params: { message: 'Alert [{{ctx.metadata.name}}] has exceeded the threshold' }, + params: { message: 'Rule [{{ctx.metadata.name}}] has exceeded the threshold' }, id: '917f5d41-fbc4-4056-a8ad-ac592f7dcee2', }, ], tags: [], - name: 'test alert', + name: 'test rule', throttle: null, notifyWhen: null, apiKeyOwner: null, @@ -171,7 +171,7 @@ describe('alert_edit', () => { status: 'unknown', lastExecutionDate: new Date('2020-08-20T19:23:38Z'), }, - ...initialAlertFields, + ...initialRuleFields, }; actionTypeRegistry.get.mockReturnValueOnce(actionTypeModel); actionTypeRegistry.has.mockReturnValue(true); @@ -182,9 +182,9 @@ describe('alert_edit', () => { actionTypeRegistry.has.mockReturnValue(true); wrapper = mountWithIntl( - {}} - initialAlert={alert} + initialRule={rule} onSave={() => { return new Promise(() => {}); }} @@ -199,32 +199,32 @@ describe('alert_edit', () => { }); } - it('renders alert edit flyout', async () => { + it('renders rule edit flyout', async () => { await setup(); - expect(wrapper.find('[data-test-subj="editAlertFlyoutTitle"]').exists()).toBeTruthy(); - expect(wrapper.find('[data-test-subj="saveEditedAlertButton"]').exists()).toBeTruthy(); + expect(wrapper.find('[data-test-subj="editRuleFlyoutTitle"]').exists()).toBeTruthy(); + expect(wrapper.find('[data-test-subj="saveEditedRuleButton"]').exists()).toBeTruthy(); }); it('displays a toast message on save for server errors', async () => { - const { isValidAlert } = jest.requireMock('./alert_errors'); - (isValidAlert as jest.Mock).mockImplementation(() => { + const { isValidRule } = jest.requireMock('./rule_errors'); + (isValidRule as jest.Mock).mockImplementation(() => { return true; }); await setup({ name: undefined }); await act(async () => { - wrapper.find('[data-test-subj="saveEditedAlertButton"]').first().simulate('click'); + wrapper.find('[data-test-subj="saveEditedRuleButton"]').first().simulate('click'); }); expect(useKibanaMock().services.notifications.toasts.addDanger).toHaveBeenCalledWith( 'Fail message' ); }); - it('should pass in the server alert type into `getAlertErrors`', async () => { - const { getAlertErrors } = jest.requireMock('./alert_errors'); + it('should pass in the server rule type into `getRuleErrors`', async () => { + const { getRuleErrors } = jest.requireMock('./rule_errors'); await setup(); - const lastCall = getAlertErrors.mock.calls[getAlertErrors.mock.calls.length - 1]; + const lastCall = getRuleErrors.mock.calls[getRuleErrors.mock.calls.length - 1]; expect(lastCall[2]).toBeDefined(); - expect(lastCall[2].id).toBe('my-alert-type'); + expect(lastCall[2].id).toBe('my-rule-type'); }); }); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_edit.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_edit.tsx similarity index 59% rename from x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_edit.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_edit.tsx index fc8f919f37901..e2aaa21d5ba68 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_edit.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_edit.tsx @@ -24,44 +24,38 @@ import { } from '@elastic/eui'; import { cloneDeep } from 'lodash'; import { i18n } from '@kbn/i18n'; -import { - Rule, - AlertFlyoutCloseReason, - AlertEditProps, - IErrorObject, - RuleType, -} from '../../../types'; -import { AlertForm } from './alert_form'; -import { getAlertActionErrors, getAlertErrors, isValidAlert } from './alert_errors'; -import { alertReducer, ConcreteAlertReducer } from './alert_reducer'; -import { updateAlert, loadAlertTypes } from '../../lib/alert_api'; +import { Rule, RuleFlyoutCloseReason, RuleEditProps, IErrorObject, RuleType } from '../../../types'; +import { RuleForm } from './rule_form'; +import { getRuleActionErrors, getRuleErrors, isValidRule } from './rule_errors'; +import { ruleReducer, ConcreteRuleReducer } from './rule_reducer'; +import { updateRule, loadRuleTypes } from '../../lib/rule_api'; import { HealthCheck } from '../../components/health_check'; import { HealthContextProvider } from '../../context/health_context'; import { useKibana } from '../../../common/lib/kibana'; -import { ConfirmAlertClose } from './confirm_alert_close'; -import { hasAlertChanged } from './has_alert_changed'; -import { getAlertWithInvalidatedFields } from '../../lib/value_validators'; +import { ConfirmRuleClose } from './confirm_rule_close'; +import { hasRuleChanged } from './has_rule_changed'; +import { getRuleWithInvalidatedFields } from '../../lib/value_validators'; -export const AlertEdit = ({ - initialAlert, +export const RuleEdit = ({ + initialRule, onClose, - reloadAlerts, + reloadRules, onSave, ruleTypeRegistry, actionTypeRegistry, metadata, ...props -}: AlertEditProps) => { - const onSaveHandler = onSave ?? reloadAlerts; - const [{ alert }, dispatch] = useReducer(alertReducer as ConcreteAlertReducer, { - alert: cloneDeep(initialAlert), +}: RuleEditProps) => { + const onSaveHandler = onSave ?? reloadRules; + const [{ rule }, dispatch] = useReducer(ruleReducer as ConcreteRuleReducer, { + rule: cloneDeep(initialRule), }); const [isSaving, setIsSaving] = useState(false); const [hasActionsDisabled, setHasActionsDisabled] = useState(false); const [hasActionsWithBrokenConnector, setHasActionsWithBrokenConnector] = useState(false); - const [isConfirmAlertCloseModalOpen, setIsConfirmAlertCloseModalOpen] = useState(false); - const [alertActionsErrors, setAlertActionsErrors] = useState([]); + const [isConfirmRuleCloseModalOpen, setIsConfirmRuleCloseModalOpen] = useState(false); + const [ruleActionsErrors, setRuleActionsErrors] = useState([]); const [isLoading, setIsLoading] = useState(false); const [serverRuleType, setServerRuleType] = useState | undefined>( props.ruleType @@ -71,79 +65,74 @@ export const AlertEdit = ({ http, notifications: { toasts }, } = useKibana().services; - const setAlert = (value: Rule) => { - dispatch({ command: { type: 'setAlert' }, payload: { key: 'alert', value } }); + const setRule = (value: Rule) => { + dispatch({ command: { type: 'setRule' }, payload: { key: 'rule', value } }); }; - const alertType = ruleTypeRegistry.get(alert.alertTypeId); + const ruleType = ruleTypeRegistry.get(rule.ruleTypeId); useEffect(() => { (async () => { setIsLoading(true); - const res = await getAlertActionErrors(alert as Rule, actionTypeRegistry); - setAlertActionsErrors([...res]); + const res = await getRuleActionErrors(rule as Rule, actionTypeRegistry); + setRuleActionsErrors([...res]); setIsLoading(false); })(); - }, [alert, actionTypeRegistry]); + }, [rule, actionTypeRegistry]); useEffect(() => { if (!props.ruleType && !serverRuleType) { (async () => { - const serverRuleTypes = await loadAlertTypes({ http }); + const serverRuleTypes = await loadRuleTypes({ http }); for (const _serverRuleType of serverRuleTypes) { - if (alertType.id === _serverRuleType.id) { + if (ruleType.id === _serverRuleType.id) { setServerRuleType(_serverRuleType); } } })(); } - }, [props.ruleType, alertType.id, serverRuleType, http]); + }, [props.ruleType, ruleType.id, serverRuleType, http]); - const { alertBaseErrors, alertErrors, alertParamsErrors } = getAlertErrors( - alert as Rule, - alertType, + const { ruleBaseErrors, ruleErrors, ruleParamsErrors } = getRuleErrors( + rule as Rule, + ruleType, serverRuleType ); const checkForChangesAndCloseFlyout = () => { - if (hasAlertChanged(alert, initialAlert, true)) { - setIsConfirmAlertCloseModalOpen(true); + if (hasRuleChanged(rule, initialRule, true)) { + setIsConfirmRuleCloseModalOpen(true); } else { - onClose(AlertFlyoutCloseReason.CANCELED); + onClose(RuleFlyoutCloseReason.CANCELED); } }; - async function onSaveAlert(): Promise { + async function onSaveRule(): Promise { try { if ( !isLoading && - isValidAlert(alert, alertErrors, alertActionsErrors) && + isValidRule(rule, ruleErrors, ruleActionsErrors) && !hasActionsWithBrokenConnector ) { - const newAlert = await updateAlert({ http, alert, id: alert.id }); + const newRule = await updateRule({ http, rule, id: rule.id }); toasts.addSuccess( - i18n.translate('xpack.triggersActionsUI.sections.alertEdit.saveSuccessNotificationText', { + i18n.translate('xpack.triggersActionsUI.sections.ruleEdit.saveSuccessNotificationText', { defaultMessage: "Updated '{ruleName}'", values: { - ruleName: newAlert.name, + ruleName: newRule.name, }, }) ); - return newAlert; + return newRule; } else { - setAlert( - getAlertWithInvalidatedFields( - alert as Rule, - alertParamsErrors, - alertBaseErrors, - alertActionsErrors - ) + setRule( + getRuleWithInvalidatedFields(rule, ruleParamsErrors, ruleBaseErrors, ruleActionsErrors) ); } } catch (errorRes) { toasts.addDanger( errorRes.body?.message ?? - i18n.translate('xpack.triggersActionsUI.sections.alertEdit.saveErrorNotificationText', { + i18n.translate('xpack.triggersActionsUI.sections.ruleEdit.saveErrorNotificationText', { defaultMessage: 'Cannot update rule.', }) ); @@ -154,17 +143,17 @@ export const AlertEdit = ({ - +

@@ -177,26 +166,26 @@ export const AlertEdit = ({ )} - checkForChangesAndCloseFlyout()} > - {i18n.translate( - 'xpack.triggersActionsUI.sections.alertEdit.cancelButtonLabel', - { - defaultMessage: 'Cancel', - } - )} + {i18n.translate('xpack.triggersActionsUI.sections.ruleEdit.cancelButtonLabel', { + defaultMessage: 'Cancel', + })} {isLoading ? ( @@ -229,16 +215,16 @@ export const AlertEdit = ({ { setIsSaving(true); - const savedAlert = await onSaveAlert(); + const savedRule = await onSaveRule(); setIsSaving(false); - if (savedAlert) { - onClose(AlertFlyoutCloseReason.SAVED); + if (savedRule) { + onClose(RuleFlyoutCloseReason.SAVED); if (onSaveHandler) { onSaveHandler(); } @@ -246,7 +232,7 @@ export const AlertEdit = ({ }} > @@ -255,14 +241,14 @@ export const AlertEdit = ({
- {isConfirmAlertCloseModalOpen && ( - { - setIsConfirmAlertCloseModalOpen(false); - onClose(AlertFlyoutCloseReason.CANCELED); + setIsConfirmRuleCloseModalOpen(false); + onClose(RuleFlyoutCloseReason.CANCELED); }} onCancel={() => { - setIsConfirmAlertCloseModalOpen(false); + setIsConfirmRuleCloseModalOpen(false); }} /> )} @@ -272,4 +258,4 @@ export const AlertEdit = ({ }; // eslint-disable-next-line import/no-default-export -export { AlertEdit as default }; +export { RuleEdit as default }; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_errors.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_errors.test.tsx similarity index 74% rename from x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_errors.test.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_errors.test.tsx index 03e98b83615f2..d6232680b04ce 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_errors.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_errors.test.tsx @@ -9,70 +9,70 @@ import uuid from 'uuid'; import React, { Fragment } from 'react'; import { validateBaseProperties, - getAlertErrors, - getAlertActionErrors, + getRuleErrors, + getRuleActionErrors, hasObjectErrors, - isValidAlert, -} from './alert_errors'; + isValidRule, +} from './rule_errors'; import { Rule, RuleType, RuleTypeModel } from '../../../types'; import { actionTypeRegistryMock } from '../../action_type_registry.mock'; -describe('alert_errors', () => { +describe('rule_errors', () => { describe('validateBaseProperties()', () => { it('should validate the name', () => { - const alert = mockAlert(); - alert.name = ''; - const result = validateBaseProperties(alert); + const rule = mockRule(); + rule.name = ''; + const result = validateBaseProperties(rule); expect(result.errors).toStrictEqual({ name: ['Name is required.'], interval: [], - alertTypeId: [], + ruleTypeId: [], actionConnectors: [], }); }); it('should validate the interval', () => { - const alert = mockAlert(); - alert.schedule.interval = ''; - const result = validateBaseProperties(alert); + const rule = mockRule(); + rule.schedule.interval = ''; + const result = validateBaseProperties(rule); expect(result.errors).toStrictEqual({ name: [], interval: ['Check interval is required.'], - alertTypeId: [], + ruleTypeId: [], actionConnectors: [], }); }); it('should validate the minimumScheduleInterval', () => { - const alert = mockAlert(); - alert.schedule.interval = '2m'; + const rule = mockRule(); + rule.schedule.interval = '2m'; const result = validateBaseProperties( - alert, + rule, mockserverRuleType({ minimumScheduleInterval: '5m' }) ); expect(result.errors).toStrictEqual({ name: [], interval: ['Interval is below minimum (5m) for this rule type'], - alertTypeId: [], + ruleTypeId: [], actionConnectors: [], }); }); - it('should validate the alertTypeId', () => { - const alert = mockAlert(); - alert.alertTypeId = ''; - const result = validateBaseProperties(alert); + it('should validate the ruleTypeId', () => { + const rule = mockRule(); + rule.ruleTypeId = ''; + const result = validateBaseProperties(rule); expect(result.errors).toStrictEqual({ name: [], interval: [], - alertTypeId: ['Rule type is required.'], + ruleTypeId: ['Rule type is required.'], actionConnectors: [], }); }); it('should validate the connectors', () => { - const alert = mockAlert(); - alert.actions = [ + const rule = mockRule(); + rule.actions = [ { id: '1234', actionTypeId: 'myActionType', @@ -82,23 +82,23 @@ describe('alert_errors', () => { }, }, ]; - const result = validateBaseProperties(alert); + const result = validateBaseProperties(rule); expect(result.errors).toStrictEqual({ name: [], interval: [], - alertTypeId: [], + ruleTypeId: [], actionConnectors: ['Action for myActionType connector is required.'], }); }); }); - describe('getAlertErrors()', () => { + describe('getRuleErrors()', () => { it('should return all errors', () => { - const result = getAlertErrors( - mockAlert({ + const result = getRuleErrors( + mockRule({ name: '', }), - mockAlertTypeModel({ + mockRuleTypeModel({ validate: () => ({ errors: { field: ['This is wrong'], @@ -108,25 +108,25 @@ describe('alert_errors', () => { mockserverRuleType() ); expect(result).toStrictEqual({ - alertParamsErrors: { field: ['This is wrong'] }, - alertBaseErrors: { + ruleParamsErrors: { field: ['This is wrong'] }, + ruleBaseErrors: { name: ['Name is required.'], interval: [], - alertTypeId: [], + ruleTypeId: [], actionConnectors: [], }, - alertErrors: { + ruleErrors: { name: ['Name is required.'], field: ['This is wrong'], interval: [], - alertTypeId: [], + ruleTypeId: [], actionConnectors: [], }, }); }); }); - describe('getAlertActionErrors()', () => { + describe('getRuleActionErrors()', () => { it('should return an array of errors', async () => { const actionTypeRegistry = actionTypeRegistryMock.create(); actionTypeRegistry.get.mockImplementation((actionTypeId: string) => ({ @@ -137,8 +137,8 @@ describe('alert_errors', () => { }, })), })); - const result = await getAlertActionErrors( - mockAlert({ + const result = await getRuleActionErrors( + mockRule({ actions: [ { id: '1234', @@ -191,15 +191,15 @@ describe('alert_errors', () => { }); }); - describe('isValidAlert()', () => { - it('should return true for a valid alert', () => { - const result = isValidAlert(mockAlert(), {}, []); + describe('isValidRule()', () => { + it('should return true for a valid rule', () => { + const result = isValidRule(mockRule(), {}, []); expect(result).toBe(true); }); - it('should return false for an invalid alert', () => { + it('should return false for an invalid rule', () => { expect( - isValidAlert( - mockAlert(), + isValidRule( + mockRule(), { name: ['This is wrong'], }, @@ -207,7 +207,7 @@ describe('alert_errors', () => { ) ).toBe(false); expect( - isValidAlert(mockAlert(), {}, [ + isValidRule(mockRule(), {}, [ { name: ['This is wrong'], }, @@ -228,8 +228,8 @@ function mockserverRuleType( id: 'recovery', name: 'doRecovery', }, - id: 'myAppAlertType', - name: 'myAppAlertType', + id: 'myAppRuleType', + name: 'myAppRuleType', producer: 'myApp', authorizedConsumers: {}, enabledInLicense: true, @@ -242,10 +242,10 @@ function mockserverRuleType( }; } -function mockAlertTypeModel(overloads: Partial = {}): RuleTypeModel { +function mockRuleTypeModel(overloads: Partial = {}): RuleTypeModel { return { - id: 'alertTypeModel', - description: 'some alert', + id: 'ruleTypeModel', + description: 'some rule', iconClass: 'something', documentationUrl: null, validate: () => ({ errors: {} }), @@ -255,13 +255,13 @@ function mockAlertTypeModel(overloads: Partial = {}): RuleTypeMod }; } -function mockAlert(overloads: Partial = {}): Rule { +function mockRule(overloads: Partial = {}): Rule { return { id: uuid.v4(), enabled: true, - name: `alert-${uuid.v4()}`, + name: `rule-${uuid.v4()}`, tags: [], - alertTypeId: '.noop', + ruleTypeId: '.noop', consumer: 'consumer', schedule: { interval: '1m' }, actions: [], diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_errors.ts b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_errors.ts similarity index 61% rename from x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_errors.ts rename to x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_errors.ts index d3e0f93d1d0b6..86a6b025941f5 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_errors.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_errors.ts @@ -11,44 +11,44 @@ import { RuleTypeModel, Rule, IErrorObject, - AlertAction, + RuleAction, RuleType, ValidationResult, ActionTypeRegistryContract, } from '../../../types'; -import { InitialAlert } from './alert_reducer'; +import { InitialRule } from './rule_reducer'; export function validateBaseProperties( - alertObject: InitialAlert, + ruleObject: InitialRule, serverRuleType?: RuleType ): ValidationResult { const validationResult = { errors: {} }; const errors = { name: new Array(), interval: new Array(), - alertTypeId: new Array(), + ruleTypeId: new Array(), actionConnectors: new Array(), }; validationResult.errors = errors; - if (!alertObject.name) { + if (!ruleObject.name) { errors.name.push( - i18n.translate('xpack.triggersActionsUI.sections.alertForm.error.requiredNameText', { + i18n.translate('xpack.triggersActionsUI.sections.ruleForm.error.requiredNameText', { defaultMessage: 'Name is required.', }) ); } - if (alertObject.schedule.interval.length < 2) { + if (ruleObject.schedule.interval.length < 2) { errors.interval.push( - i18n.translate('xpack.triggersActionsUI.sections.alertForm.error.requiredIntervalText', { + i18n.translate('xpack.triggersActionsUI.sections.ruleForm.error.requiredIntervalText', { defaultMessage: 'Check interval is required.', }) ); } else if (serverRuleType?.minimumScheduleInterval) { - const duration = parseDuration(alertObject.schedule.interval); + const duration = parseDuration(ruleObject.schedule.interval); const minimumDuration = parseDuration(serverRuleType.minimumScheduleInterval); if (duration < minimumDuration) { errors.interval.push( - i18n.translate('xpack.triggersActionsUI.sections.alertForm.error.belowMinimumText', { + i18n.translate('xpack.triggersActionsUI.sections.ruleForm.error.belowMinimumText', { defaultMessage: 'Interval is below minimum ({minimum}) for this rule type', values: { minimum: serverRuleType.minimumScheduleInterval, @@ -58,19 +58,19 @@ export function validateBaseProperties( } } - if (!alertObject.alertTypeId) { - errors.alertTypeId.push( - i18n.translate('xpack.triggersActionsUI.sections.alertForm.error.requiredRuleTypeIdText', { + if (!ruleObject.ruleTypeId) { + errors.ruleTypeId.push( + i18n.translate('xpack.triggersActionsUI.sections.ruleForm.error.requiredRuleTypeIdText', { defaultMessage: 'Rule type is required.', }) ); } - const emptyConnectorActions = alertObject.actions.find( + const emptyConnectorActions = ruleObject.actions.find( (actionItem) => /^\d+$/.test(actionItem.id) && Object.keys(actionItem.params).length > 0 ); if (emptyConnectorActions !== undefined) { errors.actionConnectors.push( - i18n.translate('xpack.triggersActionsUI.sections.alertForm.error.requiredActionConnector', { + i18n.translate('xpack.triggersActionsUI.sections.ruleForm.error.requiredActionConnector', { defaultMessage: 'Action for {actionTypeId} connector is required.', values: { actionTypeId: emptyConnectorActions.actionTypeId }, }) @@ -79,36 +79,36 @@ export function validateBaseProperties( return validationResult; } -export function getAlertErrors( - alert: Rule, - alertTypeModel: RuleTypeModel | null, +export function getRuleErrors( + rule: Rule, + ruleTypeModel: RuleTypeModel | null, serverRuleType?: RuleType ) { - const alertParamsErrors: IErrorObject = alertTypeModel - ? alertTypeModel.validate(alert.params).errors + const ruleParamsErrors: IErrorObject = ruleTypeModel + ? ruleTypeModel.validate(rule.params).errors : []; - const alertBaseErrors = validateBaseProperties(alert, serverRuleType).errors as IErrorObject; - const alertErrors = { - ...alertParamsErrors, - ...alertBaseErrors, + const ruleBaseErrors = validateBaseProperties(rule, serverRuleType).errors as IErrorObject; + const ruleErrors = { + ...ruleParamsErrors, + ...ruleBaseErrors, } as IErrorObject; return { - alertParamsErrors, - alertBaseErrors, - alertErrors, + ruleParamsErrors, + ruleBaseErrors, + ruleErrors, }; } -export async function getAlertActionErrors( - alert: Rule, +export async function getRuleActionErrors( + rule: Rule, actionTypeRegistry: ActionTypeRegistryContract ): Promise { return await Promise.all( - alert.actions.map( - async (alertAction: AlertAction) => + rule.actions.map( + async (ruleAction: RuleAction) => ( - await actionTypeRegistry.get(alertAction.actionTypeId)?.validateParams(alertAction.params) + await actionTypeRegistry.get(ruleAction.actionTypeId)?.validateParams(ruleAction.params) ).errors ) ); @@ -120,11 +120,11 @@ export const hasObjectErrors: (errors: IErrorObject) => boolean = (errors) => return errorList.length >= 1; }); -export function isValidAlert( - alertObject: InitialAlert | Rule, +export function isValidRule( + ruleObject: InitialRule | Rule, validationResult: IErrorObject, actionsErrors: IErrorObject[] -): alertObject is Rule { +): ruleObject is Rule { return ( !hasObjectErrors(validationResult) && actionsErrors.every((error: IErrorObject) => !hasObjectErrors(error)) diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_form.scss b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_form.scss similarity index 56% rename from x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_form.scss rename to x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_form.scss index 5d6ac684002fb..d80a80faac0a5 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_form.scss +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_form.scss @@ -1,4 +1,4 @@ -.triggersActionsUI__alertTypeNodeHeading { +.triggersActionsUI__ruleTypeNodeHeading { margin-left: $euiSizeS; margin-right: $euiSizeS; } diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_form.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_form.test.tsx similarity index 67% rename from x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_form.test.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_form.test.tsx index 49803c0cc419d..bda5d27ed54ad 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_form.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_form.test.tsx @@ -18,23 +18,23 @@ import { ConnectorValidationResult, GenericValidationResult, } from '../../../types'; -import { AlertForm } from './alert_form'; +import { RuleForm } from './rule_form'; import { coreMock } from 'src/core/public/mocks'; import { ALERTS_FEATURE_ID, RecoveredActionGroup } from '../../../../../alerting/common'; import { useKibana } from '../../../common/lib/kibana'; const actionTypeRegistry = actionTypeRegistryMock.create(); const ruleTypeRegistry = ruleTypeRegistryMock.create(); -jest.mock('../../lib/alert_api', () => ({ - loadAlertTypes: jest.fn(), +jest.mock('../../lib/rule_api', () => ({ + loadRuleTypes: jest.fn(), })); jest.mock('../../../common/lib/kibana'); -describe('alert_form', () => { +describe('rule_form', () => { const ruleType = { - id: 'my-alert-type', + id: 'my-rule-type', iconClass: 'test', - description: 'Alert when testing', + description: 'Rule when testing', documentationUrl: 'https://localhost.local/docs', validate: (): ValidationResult => { return { errors: {} }; @@ -65,7 +65,7 @@ describe('alert_form', () => { }); const ruleTypeNonEditable = { - id: 'non-edit-alert-type', + id: 'non-edit-rule-type', iconClass: 'test', description: 'test', documentationUrl: null, @@ -79,7 +79,7 @@ describe('alert_form', () => { const disabledByLicenseRuleType = { id: 'disabled-by-license', iconClass: 'test', - description: 'Alert when testing', + description: 'Rule when testing', documentationUrl: 'https://localhost.local/docs', validate: (): ValidationResult => { return { errors: {} }; @@ -90,15 +90,15 @@ describe('alert_form', () => { const useKibanaMock = useKibana as jest.Mocked; - describe('alert_form create alert', () => { + describe('rule_form create rule', () => { let wrapper: ReactWrapper; async function setup() { const mocks = coreMock.createSetup(); - const { loadAlertTypes } = jest.requireMock('../../lib/alert_api'); - const alertTypes: RuleType[] = [ + const { loadRuleTypes } = jest.requireMock('../../lib/rule_api'); + const ruleTypes: RuleType[] = [ { - id: 'my-alert-type', + id: 'my-rule-type', name: 'Test', actionGroups: [ { @@ -144,7 +144,7 @@ describe('alert_form', () => { enabledInLicense: false, }, ]; - loadAlertTypes.mockResolvedValue(alertTypes); + loadRuleTypes.mockResolvedValue(ruleTypes); const [ { application: { capabilities }, @@ -153,7 +153,7 @@ describe('alert_form', () => { // eslint-disable-next-line react-hooks/rules-of-hooks useKibanaMock().services.application.capabilities = { ...capabilities, - alerts: { + rules: { show: true, save: true, delete: true, @@ -168,7 +168,7 @@ describe('alert_form', () => { actionTypeRegistry.list.mockReturnValue([actionType]); actionTypeRegistry.has.mockReturnValue(true); actionTypeRegistry.get.mockReturnValue(actionType); - const initialAlert = { + const initialRule = { name: 'test', params: {}, consumer: ALERTS_FEATURE_ID, @@ -183,10 +183,10 @@ describe('alert_form', () => { } as unknown as Rule; wrapper = mountWithIntl( - {}} - errors={{ name: [], interval: [], alertTypeId: [] }} + errors={{ name: [], interval: [], ruleTypeId: [] }} operation="create" actionTypeRegistry={actionTypeRegistry} ruleTypeRegistry={ruleTypeRegistry} @@ -199,52 +199,52 @@ describe('alert_form', () => { }); } - it('renders alert name', async () => { + it('renders rule name', async () => { await setup(); - const alertNameField = wrapper.find('[data-test-subj="alertNameInput"]'); - expect(alertNameField.exists()).toBeTruthy(); - expect(alertNameField.first().prop('value')).toBe('test'); + const ruleNameField = wrapper.find('[data-test-subj="ruleNameInput"]'); + expect(ruleNameField.exists()).toBeTruthy(); + expect(ruleNameField.first().prop('value')).toBe('test'); }); - it('renders registered selected alert type', async () => { + it('renders registered selected rule type', async () => { await setup(); - const alertTypeSelectOptions = wrapper.find('[data-test-subj="my-alert-type-SelectOption"]'); - expect(alertTypeSelectOptions.exists()).toBeTruthy(); + const ruleTypeSelectOptions = wrapper.find('[data-test-subj="my-rule-type-SelectOption"]'); + expect(ruleTypeSelectOptions.exists()).toBeTruthy(); }); - it('does not render registered alert type which non editable', async () => { + it('does not render registered rule type which non editable', async () => { await setup(); - const alertTypeSelectOptions = wrapper.find( - '[data-test-subj="non-edit-alert-type-SelectOption"]' + const ruleTypeSelectOptions = wrapper.find( + '[data-test-subj="non-edit-rule-type-SelectOption"]' ); - expect(alertTypeSelectOptions.exists()).toBeFalsy(); + expect(ruleTypeSelectOptions.exists()).toBeFalsy(); }); it('renders registered action types', async () => { await setup(); - const alertTypeSelectOptions = wrapper.find( + const ruleTypeSelectOptions = wrapper.find( '[data-test-subj=".server-log-ActionTypeSelectOption"]' ); - expect(alertTypeSelectOptions.exists()).toBeFalsy(); + expect(ruleTypeSelectOptions.exists()).toBeFalsy(); }); - it('renders alert type description', async () => { + it('renders rule type description', async () => { await setup(); - wrapper.find('button[data-test-subj="my-alert-type-SelectOption"]').first().simulate('click'); - const alertDescription = wrapper.find('[data-test-subj="alertDescription"]'); - expect(alertDescription.exists()).toBeTruthy(); - expect(alertDescription.first().text()).toContain('Alert when testing'); + wrapper.find('button[data-test-subj="my-rule-type-SelectOption"]').first().simulate('click'); + const ruleDescription = wrapper.find('[data-test-subj="ruleDescription"]'); + expect(ruleDescription.exists()).toBeTruthy(); + expect(ruleDescription.first().text()).toContain('Rule when testing'); }); - it('renders alert type documentation link', async () => { + it('renders rule type documentation link', async () => { await setup(); - wrapper.find('button[data-test-subj="my-alert-type-SelectOption"]').first().simulate('click'); - const alertDocumentationLink = wrapper.find('[data-test-subj="alertDocumentationLink"]'); - expect(alertDocumentationLink.exists()).toBeTruthy(); - expect(alertDocumentationLink.first().prop('href')).toBe('https://localhost.local/docs'); + wrapper.find('button[data-test-subj="my-rule-type-SelectOption"]').first().simulate('click'); + const ruleDocumentationLink = wrapper.find('[data-test-subj="ruleDocumentationLink"]'); + expect(ruleDocumentationLink.exists()).toBeTruthy(); + expect(ruleDocumentationLink.first().prop('href')).toBe('https://localhost.local/docs'); }); - it('renders alert types disabled by license', async () => { + it('renders rule types disabled by license', async () => { await setup(); const actionOption = wrapper.find(`[data-test-subj="disabled-by-license-SelectOption"]`); expect(actionOption.exists()).toBeTruthy(); @@ -254,15 +254,15 @@ describe('alert_form', () => { }); }); - describe('alert_form create alert non alerting consumer and producer', () => { + describe('rule_form create rule non ruleing consumer and producer', () => { let wrapper: ReactWrapper; async function setup() { - const { loadAlertTypes } = jest.requireMock('../../lib/alert_api'); + const { loadRuleTypes } = jest.requireMock('../../lib/rule_api'); - loadAlertTypes.mockResolvedValue([ + loadRuleTypes.mockResolvedValue([ { - id: 'other-consumer-producer-alert-type', + id: 'other-consumer-producer-rule-type', name: 'Test', actionGroups: [ { @@ -280,7 +280,7 @@ describe('alert_form', () => { }, }, { - id: 'same-consumer-producer-alert-type', + id: 'same-consumer-producer-rule-type', name: 'Test', actionGroups: [ { @@ -307,7 +307,7 @@ describe('alert_form', () => { // eslint-disable-next-line react-hooks/rules-of-hooks useKibanaMock().services.application.capabilities = { ...capabilities, - alerts: { + rules: { show: true, save: true, delete: true, @@ -315,7 +315,7 @@ describe('alert_form', () => { }; ruleTypeRegistry.list.mockReturnValue([ { - id: 'same-consumer-producer-alert-type', + id: 'same-consumer-producer-rule-type', iconClass: 'test', description: 'test', documentationUrl: null, @@ -326,7 +326,7 @@ describe('alert_form', () => { requiresAppContext: true, }, { - id: 'other-consumer-producer-alert-type', + id: 'other-consumer-producer-rule-type', iconClass: 'test', description: 'test', documentationUrl: null, @@ -340,8 +340,8 @@ describe('alert_form', () => { ruleTypeRegistry.has.mockReturnValue(true); actionTypeRegistry.get.mockReturnValue(actionType); - const initialAlert = { - name: 'non alerting consumer test', + const initialRule = { + name: 'non ruleing consumer test', params: {}, consumer: 'test', schedule: { @@ -355,10 +355,10 @@ describe('alert_form', () => { } as unknown as Rule; wrapper = mountWithIntl( - {}} - errors={{ name: [], interval: [], alertTypeId: [] }} + errors={{ name: [], interval: [], ruleTypeId: [] }} operation="create" actionTypeRegistry={actionTypeRegistry} ruleTypeRegistry={ruleTypeRegistry} @@ -370,27 +370,27 @@ describe('alert_form', () => { wrapper.update(); }); - expect(loadAlertTypes).toHaveBeenCalled(); + expect(loadRuleTypes).toHaveBeenCalled(); } - it('renders alert type options which producer correspond to the alert consumer', async () => { + it('renders rule type options which producer correspond to the rule consumer', async () => { await setup(); - const alertTypeSelectOptions = wrapper.find( - '[data-test-subj="same-consumer-producer-alert-type-SelectOption"]' + const ruleTypeSelectOptions = wrapper.find( + '[data-test-subj="same-consumer-producer-rule-type-SelectOption"]' ); - expect(alertTypeSelectOptions.exists()).toBeTruthy(); + expect(ruleTypeSelectOptions.exists()).toBeTruthy(); }); - it('does not render alert type options which producer does not correspond to the alert consumer', async () => { + it('does not render rule type options which producer does not correspond to the rule consumer', async () => { await setup(); - const alertTypeSelectOptions = wrapper.find( - '[data-test-subj="other-consumer-producer-alert-type-SelectOption"]' + const ruleTypeSelectOptions = wrapper.find( + '[data-test-subj="other-consumer-producer-rule-type-SelectOption"]' ); - expect(alertTypeSelectOptions.exists()).toBeFalsy(); + expect(ruleTypeSelectOptions.exists()).toBeFalsy(); }); }); - describe('alert_form edit alert', () => { + describe('rule_form edit rule', () => { let wrapper: ReactWrapper; async function setup() { @@ -401,9 +401,9 @@ describe('alert_form', () => { actionTypeRegistry.has.mockReturnValue(true); actionTypeRegistry.get.mockReturnValue(actionType); - const initialAlert = { + const initialRule = { name: 'test', - alertTypeId: ruleType.id, + ruleTypeId: ruleType.id, params: {}, consumer: ALERTS_FEATURE_ID, schedule: { @@ -417,10 +417,10 @@ describe('alert_form', () => { } as unknown as Rule; wrapper = mountWithIntl( - {}} - errors={{ name: [], interval: [], alertTypeId: [] }} + errors={{ name: [], interval: [], ruleTypeId: [] }} operation="create" actionTypeRegistry={actionTypeRegistry} ruleTypeRegistry={ruleTypeRegistry} @@ -433,31 +433,31 @@ describe('alert_form', () => { }); } - it('renders alert name', async () => { + it('renders rule name', async () => { await setup(); - const alertNameField = wrapper.find('[data-test-subj="alertNameInput"]'); - expect(alertNameField.exists()).toBeTruthy(); - expect(alertNameField.first().prop('value')).toBe('test'); + const ruleNameField = wrapper.find('[data-test-subj="ruleNameInput"]'); + expect(ruleNameField.exists()).toBeTruthy(); + expect(ruleNameField.first().prop('value')).toBe('test'); }); - it('renders registered selected alert type', async () => { + it('renders registered selected rule type', async () => { await setup(); - const alertTypeSelectOptions = wrapper.find('[data-test-subj="selectedAlertTypeTitle"]'); - expect(alertTypeSelectOptions.exists()).toBeTruthy(); + const ruleTypeSelectOptions = wrapper.find('[data-test-subj="selectedRuleTypeTitle"]'); + expect(ruleTypeSelectOptions.exists()).toBeTruthy(); }); - it('renders alert type description', async () => { + it('renders rule type description', async () => { await setup(); - const alertDescription = wrapper.find('[data-test-subj="alertDescription"]'); - expect(alertDescription.exists()).toBeTruthy(); - expect(alertDescription.first().text()).toContain('Alert when testing'); + const ruleDescription = wrapper.find('[data-test-subj="ruleDescription"]'); + expect(ruleDescription.exists()).toBeTruthy(); + expect(ruleDescription.first().text()).toContain('Rule when testing'); }); - it('renders alert type documentation link', async () => { + it('renders rule type documentation link', async () => { await setup(); - const alertDocumentationLink = wrapper.find('[data-test-subj="alertDocumentationLink"]'); - expect(alertDocumentationLink.exists()).toBeTruthy(); - expect(alertDocumentationLink.first().prop('href')).toBe('https://localhost.local/docs'); + const ruleDocumentationLink = wrapper.find('[data-test-subj="ruleDocumentationLink"]'); + expect(ruleDocumentationLink.exists()).toBeTruthy(); + expect(ruleDocumentationLink.first().prop('href')).toBe('https://localhost.local/docs'); }); }); }); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_form.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_form.tsx similarity index 63% rename from x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_form.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_form.tsx index fa226c4a74cdd..c7a87aa1fec11 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_form.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_form.tsx @@ -41,13 +41,13 @@ import { getDurationNumberInItsUnit, getDurationUnitValue, } from '../../../../../alerting/common/parse_duration'; -import { loadAlertTypes } from '../../lib/alert_api'; -import { AlertReducerAction, InitialAlert } from './alert_reducer'; +import { loadRuleTypes } from '../../lib/rule_api'; +import { RuleReducerAction, InitialRule } from './rule_reducer'; import { RuleTypeModel, Rule, IErrorObject, - AlertAction, + RuleAction, RuleTypeIndex, RuleType, RuleTypeRegistryContract, @@ -56,21 +56,21 @@ import { import { getTimeOptions } from '../../../common/lib/get_time_options'; import { ActionForm } from '../action_connector_form'; import { - AlertActionParam, + AlertActionParam as RuleActionParam, ALERTS_FEATURE_ID, RecoveredActionGroup, isActionGroupDisabledForActionTypeId, } from '../../../../../alerting/common'; import { hasAllPrivilege, hasShowActionsCapability } from '../../lib/capabilities'; import { SolutionFilter } from './solution_filter'; -import './alert_form.scss'; +import './rule_form.scss'; import { useKibana } from '../../../common/lib/kibana'; import { recoveredActionGroupMessage } from '../../constants'; import { getDefaultsForActionParams } from '../../lib/get_defaults_for_action_params'; -import { IsEnabledResult, IsDisabledResult } from '../../lib/check_alert_type_enabled'; -import { AlertNotifyWhen } from './alert_notify_when'; -import { checkAlertTypeEnabled } from '../../lib/check_alert_type_enabled'; -import { alertTypeCompare, alertTypeGroupCompare } from '../../lib/alert_type_compare'; +import { IsEnabledResult, IsDisabledResult } from '../../lib/check_rule_type_enabled'; +import { RuleNotifyWhen } from './rule_notify_when'; +import { checkRuleTypeEnabled } from '../../lib/check_rule_type_enabled'; +import { ruleTypeCompare, ruleTypeGroupCompare } from '../../lib/rule_type_compare'; import { VIEW_LICENSE_OPTIONS_LINK } from '../../../common/constants'; import { SectionLoading } from '../../components/section_loading'; import { DEFAULT_ALERT_INTERVAL } from '../../constants'; @@ -81,9 +81,9 @@ function getProducerFeatureName(producer: string, kibanaFeatures: KibanaFeature[ return kibanaFeatures.find((featureItem) => featureItem.id === producer)?.name; } -interface AlertFormProps> { - alert: InitialAlert; - dispatch: React.Dispatch; +interface RuleFormProps> { + rule: InitialRule; + dispatch: React.Dispatch; errors: IErrorObject; ruleTypeRegistry: RuleTypeRegistryContract; actionTypeRegistry: ActionTypeRegistryContract; @@ -97,8 +97,8 @@ interface AlertFormProps> { const defaultScheduleInterval = getDurationNumberInItsUnit(DEFAULT_ALERT_INTERVAL); const defaultScheduleIntervalUnit = getDurationUnitValue(DEFAULT_ALERT_INTERVAL); -export const AlertForm = ({ - alert, +export const RuleForm = ({ + rule, canChangeTrigger = true, dispatch, errors, @@ -108,7 +108,7 @@ export const AlertForm = ({ ruleTypeRegistry, actionTypeRegistry, metadata, -}: AlertFormProps) => { +}: RuleFormProps) => { const { http, notifications: { toasts }, @@ -120,65 +120,65 @@ export const AlertForm = ({ } = useKibana().services; const canShowActions = hasShowActionsCapability(capabilities); - const [alertTypeModel, setAlertTypeModel] = useState(null); + const [ruleTypeModel, setRuleTypeModel] = useState(null); - const [alertInterval, setAlertInterval] = useState( - alert.schedule.interval - ? getDurationNumberInItsUnit(alert.schedule.interval) + const [ruleInterval, setRuleInterval] = useState( + rule.schedule.interval + ? getDurationNumberInItsUnit(rule.schedule.interval) : defaultScheduleInterval ); - const [alertIntervalUnit, setAlertIntervalUnit] = useState( - alert.schedule.interval - ? getDurationUnitValue(alert.schedule.interval) + const [ruleIntervalUnit, setRuleIntervalUnit] = useState( + rule.schedule.interval + ? getDurationUnitValue(rule.schedule.interval) : defaultScheduleIntervalUnit ); - const [alertThrottle, setAlertThrottle] = useState( - alert.throttle ? getDurationNumberInItsUnit(alert.throttle) : null + const [ruleThrottle, setRuleThrottle] = useState( + rule.throttle ? getDurationNumberInItsUnit(rule.throttle) : null ); - const [alertThrottleUnit, setAlertThrottleUnit] = useState( - alert.throttle ? getDurationUnitValue(alert.throttle) : 'h' + const [ruleThrottleUnit, setRuleThrottleUnit] = useState( + rule.throttle ? getDurationUnitValue(rule.throttle) : 'h' ); const [defaultActionGroupId, setDefaultActionGroupId] = useState(undefined); const [ruleTypeIndex, setRuleTypeIndex] = useState(null); - const [availableAlertTypes, setAvailableAlertTypes] = useState< - Array<{ alertTypeModel: RuleTypeModel; alertType: RuleType }> + const [availableRuleTypes, setAvailableRuleTypes] = useState< + Array<{ ruleTypeModel: RuleTypeModel; ruleType: RuleType }> >([]); - const [filteredAlertTypes, setFilteredAlertTypes] = useState< - Array<{ alertTypeModel: RuleTypeModel; alertType: RuleType }> + const [filteredRuleTypes, setFilteredRuleTypes] = useState< + Array<{ ruleTypeModel: RuleTypeModel; ruleType: RuleType }> >([]); const [searchText, setSearchText] = useState(); const [inputText, setInputText] = useState(); const [solutions, setSolutions] = useState | undefined>(undefined); const [solutionsFilter, setSolutionFilter] = useState([]); - let hasDisabledByLicenseAlertTypes: boolean = false; + let hasDisabledByLicenseRuleTypes: boolean = false; - // load alert types + // load rule types useEffect(() => { (async () => { try { - const alertTypesResult = await loadAlertTypes({ http }); + const ruleTypesResult = await loadRuleTypes({ http }); const index: RuleTypeIndex = new Map(); - for (const alertTypeItem of alertTypesResult) { - index.set(alertTypeItem.id, alertTypeItem); + for (const ruleTypeItem of ruleTypesResult) { + index.set(ruleTypeItem.id, ruleTypeItem); } - if (alert.alertTypeId && index.has(alert.alertTypeId)) { - setDefaultActionGroupId(index.get(alert.alertTypeId)!.defaultActionGroupId); + if (rule.ruleTypeId && index.has(rule.ruleTypeId)) { + setDefaultActionGroupId(index.get(rule.ruleTypeId)!.defaultActionGroupId); } setRuleTypeIndex(index); - const availableAlertTypesResult = getAvailableAlertTypes(alertTypesResult); - setAvailableAlertTypes(availableAlertTypesResult); + const availableRuleTypesResult = getAvailableRuleTypes(ruleTypesResult); + setAvailableRuleTypes(availableRuleTypesResult); - const solutionsResult = availableAlertTypesResult.reduce( - (result: Map, alertTypeItem) => { - if (!result.has(alertTypeItem.alertType.producer)) { + const solutionsResult = availableRuleTypesResult.reduce( + (result: Map, ruleTypeItem) => { + if (!result.has(ruleTypeItem.ruleType.producer)) { result.set( - alertTypeItem.alertType.producer, + ruleTypeItem.ruleType.producer, (kibanaFeatures - ? getProducerFeatureName(alertTypeItem.alertType.producer, kibanaFeatures) - : capitalize(alertTypeItem.alertType.producer)) ?? - capitalize(alertTypeItem.alertType.producer) + ? getProducerFeatureName(ruleTypeItem.ruleType.producer, kibanaFeatures) + : capitalize(ruleTypeItem.ruleType.producer)) ?? + capitalize(ruleTypeItem.ruleType.producer) ); } return result; @@ -191,7 +191,7 @@ export const AlertForm = ({ } catch (e) { toasts.addDanger({ title: i18n.translate( - 'xpack.triggersActionsUI.sections.alertForm.unableToLoadRuleTypesMessage', + 'xpack.triggersActionsUI.sections.ruleForm.unableToLoadRuleTypesMessage', { defaultMessage: 'Unable to load rule types' } ), }); @@ -201,25 +201,25 @@ export const AlertForm = ({ }, []); useEffect(() => { - setAlertTypeModel(alert.alertTypeId ? ruleTypeRegistry.get(alert.alertTypeId) : null); - if (alert.alertTypeId && ruleTypeIndex && ruleTypeIndex.has(alert.alertTypeId)) { - setDefaultActionGroupId(ruleTypeIndex.get(alert.alertTypeId)!.defaultActionGroupId); + setRuleTypeModel(rule.ruleTypeId ? ruleTypeRegistry.get(rule.ruleTypeId) : null); + if (rule.ruleTypeId && ruleTypeIndex && ruleTypeIndex.has(rule.ruleTypeId)) { + setDefaultActionGroupId(ruleTypeIndex.get(rule.ruleTypeId)!.defaultActionGroupId); } - }, [alert, alert.alertTypeId, ruleTypeIndex, ruleTypeRegistry]); + }, [rule, rule.ruleTypeId, ruleTypeIndex, ruleTypeRegistry]); useEffect(() => { - if (alert.schedule.interval) { - const interval = getDurationNumberInItsUnit(alert.schedule.interval); - const intervalUnit = getDurationUnitValue(alert.schedule.interval); + if (rule.schedule.interval) { + const interval = getDurationNumberInItsUnit(rule.schedule.interval); + const intervalUnit = getDurationUnitValue(rule.schedule.interval); if (interval !== defaultScheduleInterval) { - setAlertInterval(interval); + setRuleInterval(interval); } if (intervalUnit !== defaultScheduleIntervalUnit) { - setAlertIntervalUnit(intervalUnit); + setRuleIntervalUnit(intervalUnit); } } - }, [alert.schedule.interval]); + }, [rule.schedule.interval]); const setRuleProperty = useCallback( (key: Key, value: Rule[Key] | null) => { @@ -229,7 +229,7 @@ export const AlertForm = ({ ); const setActions = useCallback( - (updatedActions: AlertAction[]) => setRuleProperty('actions', updatedActions), + (updatedActions: RuleAction[]) => setRuleProperty('actions', updatedActions), [setRuleProperty] ); @@ -241,70 +241,70 @@ export const AlertForm = ({ dispatch({ command: { type: 'setScheduleProperty' }, payload: { key, value } }); }; - const setActionProperty = ( + const setActionProperty = ( key: Key, - value: AlertAction[Key] | null, + value: RuleAction[Key] | null, index: number ) => { - dispatch({ command: { type: 'setAlertActionProperty' }, payload: { key, value, index } }); + dispatch({ command: { type: 'setRuleActionProperty' }, payload: { key, value, index } }); }; const setActionParamsProperty = useCallback( - (key: string, value: AlertActionParam, index: number) => { - dispatch({ command: { type: 'setAlertActionParams' }, payload: { key, value, index } }); + (key: string, value: RuleActionParam, index: number) => { + dispatch({ command: { type: 'setRuleActionParams' }, payload: { key, value, index } }); }, [dispatch] ); useEffect(() => { const searchValue = searchText ? searchText.trim().toLocaleLowerCase() : null; - setFilteredAlertTypes( - availableAlertTypes - .filter((alertTypeItem) => + setFilteredRuleTypes( + availableRuleTypes + .filter((ruleTypeItem) => solutionsFilter.length > 0 - ? solutionsFilter.find((item) => alertTypeItem.alertType!.producer === item) - : alertTypeItem + ? solutionsFilter.find((item) => ruleTypeItem.ruleType!.producer === item) + : ruleTypeItem ) - .filter((alertTypeItem) => + .filter((ruleTypeItem) => searchValue - ? alertTypeItem.alertType.name.toString().toLocaleLowerCase().includes(searchValue) || - alertTypeItem.alertType!.producer.toLocaleLowerCase().includes(searchValue) || - alertTypeItem.alertTypeModel.description.toLocaleLowerCase().includes(searchValue) - : alertTypeItem + ? ruleTypeItem.ruleType.name.toString().toLocaleLowerCase().includes(searchValue) || + ruleTypeItem.ruleType!.producer.toLocaleLowerCase().includes(searchValue) || + ruleTypeItem.ruleTypeModel.description.toLocaleLowerCase().includes(searchValue) + : ruleTypeItem ) ); // eslint-disable-next-line react-hooks/exhaustive-deps - }, [ruleTypeRegistry, availableAlertTypes, searchText, JSON.stringify(solutionsFilter)]); + }, [ruleTypeRegistry, availableRuleTypes, searchText, JSON.stringify(solutionsFilter)]); - const getAvailableAlertTypes = (alertTypesResult: RuleType[]) => + const getAvailableRuleTypes = (ruleTypesResult: RuleType[]) => ruleTypeRegistry .list() .reduce( ( - arr: Array<{ alertType: RuleType; alertTypeModel: RuleTypeModel }>, + arr: Array<{ ruleType: RuleType; ruleTypeModel: RuleTypeModel }>, ruleTypeRegistryItem: RuleTypeModel ) => { - const alertType = alertTypesResult.find((item) => ruleTypeRegistryItem.id === item.id); - if (alertType) { + const ruleType = ruleTypesResult.find((item) => ruleTypeRegistryItem.id === item.id); + if (ruleType) { arr.push({ - alertType, - alertTypeModel: ruleTypeRegistryItem, + ruleType, + ruleTypeModel: ruleTypeRegistryItem, }); } return arr; }, [] ) - .filter((item) => item.alertType && hasAllPrivilege(alert, item.alertType)) + .filter((item) => item.ruleType && hasAllPrivilege(rule, item.ruleType)) .filter((item) => - alert.consumer === ALERTS_FEATURE_ID - ? !item.alertTypeModel.requiresAppContext - : item.alertType!.producer === alert.consumer + rule.consumer === ALERTS_FEATURE_ID + ? !item.ruleTypeModel.requiresAppContext + : item.ruleType!.producer === rule.consumer ); - const selectedAlertType = alert?.alertTypeId ? ruleTypeIndex?.get(alert?.alertTypeId) : undefined; - const recoveryActionGroup = selectedAlertType?.recoveryActionGroup?.id; + const selectedRuleType = rule?.ruleTypeId ? ruleTypeIndex?.get(rule?.ruleTypeId) : undefined; + const recoveryActionGroup = selectedRuleType?.recoveryActionGroup?.id; const getDefaultActionParams = useCallback( - (actionTypeId: string, actionGroupId: string): Record | undefined => + (actionTypeId: string, actionGroupId: string): Record | undefined => getDefaultsForActionParams( actionTypeId, actionGroupId, @@ -313,12 +313,12 @@ export const AlertForm = ({ [recoveryActionGroup] ); - const tagsOptions = alert.tags ? alert.tags.map((label: string) => ({ label })) : []; + const tagsOptions = rule.tags ? rule.tags.map((label: string) => ({ label })) : []; const isActionGroupDisabledForActionType = useCallback( - (alertType: RuleType, actionGroupId: string, actionTypeId: string): boolean => { + (ruleType: RuleType, actionGroupId: string, actionTypeId: string): boolean => { return isActionGroupDisabledForActionTypeId( - actionGroupId === alertType?.recoveryActionGroup?.id + actionGroupId === ruleType?.recoveryActionGroup?.id ? RecoveredActionGroup.id : actionGroupId, actionTypeId @@ -327,11 +327,9 @@ export const AlertForm = ({ [] ); - const AlertParamsExpressionComponent = alertTypeModel - ? alertTypeModel.ruleParamsExpression - : null; + const RuleParamsExpressionComponent = ruleTypeModel ? ruleTypeModel.ruleParamsExpression : null; - const alertTypesByProducer = filteredAlertTypes.reduce( + const ruleTypesByProducer = filteredRuleTypes.reduce( ( result: Record< string, @@ -339,22 +337,22 @@ export const AlertForm = ({ id: string; name: string; checkEnabledResult: IsEnabledResult | IsDisabledResult; - alertTypeItem: RuleTypeModel; + ruleTypeItem: RuleTypeModel; }> >, - alertTypeValue + ruleTypeValue ) => { - const producer = alertTypeValue.alertType.producer; + const producer = ruleTypeValue.ruleType.producer; if (producer) { - const checkEnabledResult = checkAlertTypeEnabled(alertTypeValue.alertType); + const checkEnabledResult = checkRuleTypeEnabled(ruleTypeValue.ruleType); if (!checkEnabledResult.isEnabled) { - hasDisabledByLicenseAlertTypes = true; + hasDisabledByLicenseRuleTypes = true; } (result[producer] = result[producer] || []).push({ - name: alertTypeValue.alertType.name, - id: alertTypeValue.alertTypeModel.id, + name: ruleTypeValue.ruleType.name, + id: ruleTypeValue.ruleTypeModel.id, checkEnabledResult, - alertTypeItem: alertTypeValue.alertTypeModel, + ruleTypeItem: ruleTypeValue.ruleTypeModel, }); } return result; @@ -362,18 +360,18 @@ export const AlertForm = ({ {} ); - const alertTypeNodes = Object.entries(alertTypesByProducer) - .sort((a, b) => alertTypeGroupCompare(a, b, solutions)) + const ruleTypeNodes = Object.entries(ruleTypesByProducer) + .sort((a, b) => ruleTypeGroupCompare(a, b, solutions)) .map(([solution, items], groupIndex) => ( @@ -391,13 +389,13 @@ export const AlertForm = ({ {items - .sort((a, b) => alertTypeCompare(a, b)) + .sort((a, b) => ruleTypeCompare(a, b)) .map((item, index) => { - const alertTypeListItemHtml = ( + const ruleTypeListItemHtml = ( {item.name} -

{item.alertTypeItem.description}

+

{item.ruleTypeItem.description}

); @@ -409,22 +407,22 @@ export const AlertForm = ({ color="primary" label={ item.checkEnabledResult.isEnabled ? ( - alertTypeListItemHtml + ruleTypeListItemHtml ) : ( - {alertTypeListItemHtml} + {ruleTypeListItemHtml} ) } isDisabled={!item.checkEnabledResult.isEnabled} onClick={() => { - setRuleProperty('alertTypeId', item.id); + setRuleProperty('ruleTypeId', item.id); setActions([]); - setAlertTypeModel(item.alertTypeItem); + setRuleTypeModel(item.ruleTypeItem); setRuleProperty('params', {}); if (ruleTypeIndex && ruleTypeIndex.has(item.id)) { setDefaultActionGroupId(ruleTypeIndex.get(item.id)!.defaultActionGroupId); @@ -438,15 +436,15 @@ export const AlertForm = ({
)); - const alertTypeDetails = ( + const ruleTypeDetails = ( <> - -
- {alert.alertTypeId && ruleTypeIndex && ruleTypeIndex.has(alert.alertTypeId) - ? ruleTypeIndex.get(alert.alertTypeId)!.name + +
+ {rule.ruleTypeId && ruleTypeIndex && ruleTypeIndex.has(rule.ruleTypeId) + ? ruleTypeIndex.get(rule.ruleTypeId)!.name : ''}
@@ -457,38 +455,38 @@ export const AlertForm = ({ iconType="cross" color="danger" aria-label={i18n.translate( - 'xpack.triggersActionsUI.sections.alertForm.changeAlertTypeAriaLabel', + 'xpack.triggersActionsUI.sections.ruleForm.changeRuleTypeAriaLabel', { defaultMessage: 'Delete', } )} onClick={() => { - setRuleProperty('alertTypeId', null); - setAlertTypeModel(null); + setRuleProperty('ruleTypeId', null); + setRuleTypeModel(null); setRuleProperty('params', {}); }} /> ) : null} - {alertTypeModel?.description && ( + {ruleTypeModel?.description && ( - - {alertTypeModel.description}  - {alertTypeModel?.documentationUrl && ( + + {ruleTypeModel.description}  + {ruleTypeModel?.documentationUrl && ( @@ -498,31 +496,31 @@ export const AlertForm = ({ )} - {AlertParamsExpressionComponent && + {RuleParamsExpressionComponent && defaultActionGroupId && - alert.alertTypeId && - selectedAlertType ? ( + rule.ruleTypeId && + selectedRuleType ? ( } > - {errors.actionConnectors.length >= 1 ? ( <> @@ -544,24 +542,24 @@ export const AlertForm = ({ ) : null} - isActionGroupDisabledForActionType(selectedAlertType, actionGroupId, actionTypeId) + isActionGroupDisabledForActionType(selectedRuleType, actionGroupId, actionTypeId) } - actionGroups={selectedAlertType.actionGroups.map((actionGroup) => - actionGroup.id === selectedAlertType.recoveryActionGroup.id + actionGroups={selectedRuleType.actionGroups.map((actionGroup) => + actionGroup.id === selectedRuleType.recoveryActionGroup.id ? { ...actionGroup, - omitMessageVariables: selectedAlertType.doesSetRecoveryContext + omitMessageVariables: selectedRuleType.doesSetRecoveryContext ? 'keepContext' : 'all', defaultActionMessage: recoveredActionGroupMessage, } - : { ...actionGroup, defaultActionMessage: alertTypeModel?.defaultActionMessage } + : { ...actionGroup, defaultActionMessage: ruleTypeModel?.defaultActionMessage } )} getDefaultActionParams={getDefaultActionParams} setActionIdByIndex={(id: string, index: number) => setActionProperty('id', id, index)} @@ -577,16 +575,16 @@ export const AlertForm = ({ ); - const labelForAlertChecked = ( + const labelForRuleChecked = ( <> {' '} } - isInvalid={errors.name.length > 0 && alert.name !== undefined} + isInvalid={errors.name.length > 0 && rule.name !== undefined} error={errors.name} > 0 && alert.name !== undefined} + isInvalid={errors.name.length > 0 && rule.name !== undefined} name="name" - data-test-subj="alertNameInput" - value={alert.name || ''} + data-test-subj="ruleNameInput" + value={rule.name || ''} onChange={(e) => { setRuleProperty('name', e.target.value); }} onBlur={() => { - if (!alert.name) { + if (!rule.name) { setRuleProperty('name', ''); } }} @@ -631,7 +629,7 @@ export const AlertForm = ({ @@ -654,7 +652,7 @@ export const AlertForm = ({ ); }} onBlur={() => { - if (!alert.tags) { + if (!rule.tags) { setRuleProperty('tags', []); } }} @@ -668,7 +666,7 @@ export const AlertForm = ({ 0} error={errors.interval} > @@ -678,25 +676,25 @@ export const AlertForm = ({ fullWidth min={1} isInvalid={errors.interval.length > 0} - value={alertInterval || ''} + value={ruleInterval || ''} name="interval" data-test-subj="intervalInput" onChange={(e) => { const interval = e.target.value !== '' ? parseInt(e.target.value, 10) : undefined; - setAlertInterval(interval); - setScheduleProperty('interval', `${e.target.value}${alertIntervalUnit}`); + setRuleInterval(interval); + setScheduleProperty('interval', `${e.target.value}${ruleIntervalUnit}`); }} /> { - setAlertIntervalUnit(e.target.value); - setScheduleProperty('interval', `${alertInterval}${e.target.value}`); + setRuleIntervalUnit(e.target.value); + setScheduleProperty('interval', `${ruleInterval}${e.target.value}`); }} data-test-subj="intervalInputUnit" /> @@ -705,10 +703,10 @@ export const AlertForm = ({ - { setRuleProperty('notifyWhen', notifyWhen); @@ -717,8 +715,8 @@ export const AlertForm = ({ )} onThrottleChange={useCallback( (throttle: number | null, throttleUnit: string) => { - setAlertThrottle(throttle); - setAlertThrottleUnit(throttleUnit); + setRuleThrottle(throttle); + setRuleThrottleUnit(throttleUnit); setRuleProperty('throttle', throttle ? `${throttle}${throttleUnit}` : null); }, [setRuleProperty] @@ -727,15 +725,15 @@ export const AlertForm = ({ - {alertTypeModel ? ( - <>{alertTypeDetails} - ) : availableAlertTypes.length ? ( + {ruleTypeModel ? ( + <>{ruleTypeDetails} + ) : availableRuleTypes.length ? ( <>
@@ -766,7 +764,7 @@ export const AlertForm = ({ { setInputText(e.target.value); if (e.target.value === '') { @@ -779,7 +777,7 @@ export const AlertForm = ({ } }} placeholder={i18n.translate( - 'xpack.triggersActionsUI.sections.alertForm.searchPlaceholderTitle', + 'xpack.triggersActionsUI.sections.ruleForm.searchPlaceholderTitle', { defaultMessage: 'Search' } )} /> @@ -796,21 +794,21 @@ export const AlertForm = ({
- {errors.alertTypeId.length >= 1 && alert.alertTypeId !== undefined ? ( + {errors.ruleTypeId.length >= 1 && rule.ruleTypeId !== undefined ? ( <> - + ) : null} - {alertTypeNodes} + {ruleTypeNodes} ) : ruleTypeIndex ? ( - + ) : ( @@ -819,15 +817,15 @@ export const AlertForm = ({ ); }; -const NoAuthorizedAlertTypes = ({ operation }: { operation: string }) => ( +const NoAuthorizedRuleTypes = ({ operation }: { operation: string }) => ( @@ -837,7 +835,7 @@ const NoAuthorizedAlertTypes = ({ operation }: { operation: string }) => (

diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_notify_when.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_notify_when.test.tsx similarity index 96% rename from x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_notify_when.test.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_notify_when.test.tsx index c15f249fd7688..4098614c1a906 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_notify_when.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_notify_when.test.tsx @@ -11,9 +11,9 @@ import { ReactWrapper } from 'enzyme'; import { act } from 'react-dom/test-utils'; import { Rule } from '../../../types'; import { ALERTS_FEATURE_ID } from '../../../../../alerting/common'; -import { AlertNotifyWhen } from './alert_notify_when'; +import { RuleNotifyWhen } from './rule_notify_when'; -describe('alert_notify_when', () => { +describe('rule_notify_when', () => { beforeEach(() => { jest.resetAllMocks(); }); @@ -21,11 +21,11 @@ describe('alert_notify_when', () => { const onNotifyWhenChange = jest.fn(); const onThrottleChange = jest.fn(); - describe('action_frequency_form new alert', () => { + describe('action_frequency_form new rule', () => { let wrapper: ReactWrapper; async function setup(overrides = {}) { - const initialAlert = { + const initialRule = { name: 'test', params: {}, consumer: ALERTS_FEATURE_ID, @@ -42,8 +42,8 @@ describe('alert_notify_when', () => { } as unknown as Rule; wrapper = mountWithIntl( - > = [ +const NOTIFY_WHEN_OPTIONS: Array> = [ { value: 'onActionGroupChange', inputDisplay: i18n.translate( - 'xpack.triggersActionsUI.sections.alertForm.alertNotifyWhen.onActionGroupChange.display', + 'xpack.triggersActionsUI.sections.ruleForm.ruleNotifyWhen.onActionGroupChange.display', { defaultMessage: 'Only on status change', } @@ -43,14 +43,14 @@ const NOTIFY_WHEN_OPTIONS: Array> = [

@@ -60,9 +60,9 @@ const NOTIFY_WHEN_OPTIONS: Array> = [ { value: 'onActiveAlert', inputDisplay: i18n.translate( - 'xpack.triggersActionsUI.sections.alertForm.alertNotifyWhen.onActiveAlert.display', + 'xpack.triggersActionsUI.sections.ruleForm.ruleNotifyWhen.onActiveAlert.display', { - defaultMessage: 'Every time alert is active', + defaultMessage: 'Every time rule is active', } ), 'data-test-subj': 'onActiveAlert', @@ -70,15 +70,15 @@ const NOTIFY_WHEN_OPTIONS: Array> = [ <>

@@ -88,7 +88,7 @@ const NOTIFY_WHEN_OPTIONS: Array> = [ { value: 'onThrottleInterval', inputDisplay: i18n.translate( - 'xpack.triggersActionsUI.sections.alertForm.alertNotifyWhen.onThrottleInterval.display', + 'xpack.triggersActionsUI.sections.ruleForm.ruleNotifyWhen.onThrottleInterval.display', { defaultMessage: 'On a custom action interval', } @@ -99,14 +99,14 @@ const NOTIFY_WHEN_OPTIONS: Array> = [

@@ -115,56 +115,56 @@ const NOTIFY_WHEN_OPTIONS: Array> = [ }, ]; -interface AlertNotifyWhenProps { - alert: InitialAlert; +interface RuleNotifyWhenProps { + rule: InitialRule; throttle: number | null; throttleUnit: string; - onNotifyWhenChange: (notifyWhen: AlertNotifyWhenType) => void; + onNotifyWhenChange: (notifyWhen: RuleNotifyWhenType) => void; onThrottleChange: (throttle: number | null, throttleUnit: string) => void; } -export const AlertNotifyWhen = ({ - alert, +export const RuleNotifyWhen = ({ + rule, throttle, throttleUnit, onNotifyWhenChange, onThrottleChange, -}: AlertNotifyWhenProps) => { - const [alertThrottle, setAlertThrottle] = useState(throttle || 1); +}: RuleNotifyWhenProps) => { + const [ruleThrottle, setRuleThrottle] = useState(throttle || 1); const [showCustomThrottleOpts, setShowCustomThrottleOpts] = useState(false); const [notifyWhenValue, setNotifyWhenValue] = - useState(DEFAULT_NOTIFY_WHEN_VALUE); + useState(DEFAULT_NOTIFY_WHEN_VALUE); useEffect(() => { - if (alert.notifyWhen) { - setNotifyWhenValue(alert.notifyWhen); + if (rule.notifyWhen) { + setNotifyWhenValue(rule.notifyWhen); } else { // If 'notifyWhen' is not set, derive value from existence of throttle value - setNotifyWhenValue(alert.throttle ? 'onThrottleInterval' : 'onActiveAlert'); + setNotifyWhenValue(rule.throttle ? 'onThrottleInterval' : 'onActiveAlert'); } - }, [alert]); + }, [rule]); useEffect(() => { setShowCustomThrottleOpts(notifyWhenValue === 'onThrottleInterval'); }, [notifyWhenValue]); - const onNotifyWhenValueChange = useCallback((newValue: AlertNotifyWhenType) => { - onThrottleChange(newValue === 'onThrottleInterval' ? alertThrottle : null, throttleUnit); + const onNotifyWhenValueChange = useCallback((newValue: RuleNotifyWhenType) => { + onThrottleChange(newValue === 'onThrottleInterval' ? ruleThrottle : null, throttleUnit); onNotifyWhenChange(newValue); setNotifyWhenValue(newValue); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); - const labelForAlertRenotify = ( + const labelForRuleRenotify = ( <> {' '} @@ -173,7 +173,7 @@ export const AlertNotifyWhen = ({ return ( <> - + parseInt(value, 10)), filter((value) => !isNaN(value)), map((value) => { - setAlertThrottle(value); + setRuleThrottle(value); onThrottleChange(value, throttleUnit); }) ); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_reducer.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_reducer.test.ts new file mode 100644 index 0000000000000..259cb5ed3ecea --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_reducer.test.ts @@ -0,0 +1,189 @@ +/* + * 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 { ruleReducer } from './rule_reducer'; +import { Rule } from '../../../types'; + +describe('rule reducer', () => { + let initialRule: Rule; + beforeAll(() => { + initialRule = { + params: {}, + consumer: 'rules', + ruleTypeId: null, + schedule: { + interval: '1m', + }, + actions: [], + tags: [], + notifyWhen: 'onActionGroupChange', + } as unknown as Rule; + }); + + // setRule + test('if modified rule was reset to initial', () => { + const rule = ruleReducer( + { rule: initialRule }, + { + command: { type: 'setProperty' }, + payload: { + key: 'name', + value: 'new name', + }, + } + ); + expect(rule.rule.name).toBe('new name'); + + const updatedRule = ruleReducer( + { rule: initialRule }, + { + command: { type: 'setRule' }, + payload: { + key: 'rule', + value: initialRule, + }, + } + ); + expect(updatedRule.rule.name).toBeUndefined(); + }); + + test('if property name was changed', () => { + const updatedRule = ruleReducer( + { rule: initialRule }, + { + command: { type: 'setProperty' }, + payload: { + key: 'name', + value: 'new name', + }, + } + ); + expect(updatedRule.rule.name).toBe('new name'); + }); + + test('if initial schedule property was updated', () => { + const updatedRule = ruleReducer( + { rule: initialRule }, + { + command: { type: 'setScheduleProperty' }, + payload: { + key: 'interval', + value: '10s', + }, + } + ); + expect(updatedRule.rule.schedule.interval).toBe('10s'); + }); + + test('if rule params property was added and updated', () => { + const updatedRule = ruleReducer( + { rule: initialRule }, + { + command: { type: 'setRuleParams' }, + payload: { + key: 'testParam', + value: 'new test params property', + }, + } + ); + expect(updatedRule.rule.params.testParam).toBe('new test params property'); + + const updatedRuleParamsProperty = ruleReducer( + { rule: updatedRule.rule }, + { + command: { type: 'setRuleParams' }, + payload: { + key: 'testParam', + value: 'test params property updated', + }, + } + ); + expect(updatedRuleParamsProperty.rule.params.testParam).toBe('test params property updated'); + }); + + test('if rule action params property was added and updated', () => { + initialRule.actions.push({ + id: '', + actionTypeId: 'testId', + group: 'Rule', + params: {}, + }); + const updatedRule = ruleReducer( + { rule: initialRule }, + { + command: { type: 'setRuleActionParams' }, + payload: { + key: 'testActionParam', + value: 'new test action params property', + index: 0, + }, + } + ); + expect(updatedRule.rule.actions[0].params.testActionParam).toBe( + 'new test action params property' + ); + + const updatedRuleActionParamsProperty = ruleReducer( + { rule: updatedRule.rule }, + { + command: { type: 'setRuleActionParams' }, + payload: { + key: 'testActionParam', + value: 'test action params property updated', + index: 0, + }, + } + ); + expect(updatedRuleActionParamsProperty.rule.actions[0].params.testActionParam).toBe( + 'test action params property updated' + ); + }); + + test('if the existing rule action params property was set to undefined (when other connector was selected)', () => { + initialRule.actions.push({ + id: '', + actionTypeId: 'testId', + group: 'Rule', + params: { + testActionParam: 'some value', + }, + }); + const updatedRule = ruleReducer( + { rule: initialRule }, + { + command: { type: 'setRuleActionParams' }, + payload: { + key: 'testActionParam', + value: undefined, + index: 0, + }, + } + ); + expect(updatedRule.rule.actions[0].params.testActionParam).toBe(undefined); + }); + + test('if rule action property was updated', () => { + initialRule.actions.push({ + id: '', + actionTypeId: 'testId', + group: 'Rule', + params: {}, + }); + const updatedRule = ruleReducer( + { rule: initialRule }, + { + command: { type: 'setRuleActionProperty' }, + payload: { + key: 'group', + value: 'Warning', + index: 0, + }, + } + ); + expect(updatedRule.rule.actions[0].group).toBe('Warning'); + }); +}); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_reducer.ts b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_reducer.ts new file mode 100644 index 0000000000000..c9186ca1d01c8 --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_reducer.ts @@ -0,0 +1,206 @@ +/* + * 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 { SavedObjectAttribute } from 'kibana/public'; +import { isEqual } from 'lodash'; +import { Reducer } from 'react'; +import { + AlertActionParam as RuleActionParam, + IntervalSchedule, +} from '../../../../../alerting/common'; +import { Rule, RuleAction } from '../../../types'; + +export type InitialRule = Partial & + Pick; + +interface CommandType< + T extends + | 'setRule' + | 'setProperty' + | 'setScheduleProperty' + | 'setRuleParams' + | 'setRuleActionParams' + | 'setRuleActionProperty' +> { + type: T; +} + +export interface RuleState { + rule: InitialRule; +} + +interface Payload { + key: Keys; + value: Value; + index?: number; +} + +interface RulePayload { + key: Key; + value: Rule[Key] | null; + index?: number; +} + +interface RuleActionPayload { + key: Key; + value: RuleAction[Key] | null; + index?: number; +} + +interface RuleSchedulePayload { + key: Key; + value: IntervalSchedule[Key]; + index?: number; +} + +export type RuleReducerAction = + | { + command: CommandType<'setRule'>; + payload: Payload<'rule', InitialRule>; + } + | { + command: CommandType<'setProperty'>; + payload: RulePayload; + } + | { + command: CommandType<'setScheduleProperty'>; + payload: RuleSchedulePayload; + } + | { + command: CommandType<'setRuleParams'>; + payload: Payload; + } + | { + command: CommandType<'setRuleActionParams'>; + payload: Payload; + } + | { + command: CommandType<'setRuleActionProperty'>; + payload: RuleActionPayload; + }; + +export type InitialRuleReducer = Reducer<{ rule: InitialRule }, RuleReducerAction>; +export type ConcreteRuleReducer = Reducer<{ rule: Rule }, RuleReducerAction>; + +export const ruleReducer = ( + state: { rule: RulePhase }, + action: RuleReducerAction +) => { + const { rule } = state; + + switch (action.command.type) { + case 'setRule': { + const { key, value } = action.payload as Payload<'rule', RulePhase>; + if (key === 'rule') { + return { + ...state, + rule: value, + }; + } else { + return state; + } + } + case 'setProperty': { + const { key, value } = action.payload as RulePayload; + if (isEqual(rule[key], value)) { + return state; + } else { + return { + ...state, + rule: { + ...rule, + [key]: value, + }, + }; + } + } + case 'setScheduleProperty': { + const { key, value } = action.payload as RuleSchedulePayload; + if (rule.schedule && isEqual(rule.schedule[key], value)) { + return state; + } else { + return { + ...state, + rule: { + ...rule, + schedule: { + ...rule.schedule, + [key]: value, + }, + }, + }; + } + } + case 'setRuleParams': { + const { key, value } = action.payload as Payload>; + if (isEqual(rule.params[key], value)) { + return state; + } else { + return { + ...state, + rule: { + ...rule, + params: { + ...rule.params, + [key]: value, + }, + }, + }; + } + } + case 'setRuleActionParams': { + const { key, value, index } = action.payload as Payload< + keyof RuleAction, + SavedObjectAttribute + >; + if ( + index === undefined || + rule.actions[index] == null || + (!!rule.actions[index][key] && isEqual(rule.actions[index][key], value)) + ) { + return state; + } else { + const oldAction = rule.actions.splice(index, 1)[0]; + const updatedAction = { + ...oldAction, + params: { + ...oldAction.params, + [key]: value, + }, + }; + rule.actions.splice(index, 0, updatedAction); + return { + ...state, + rule: { + ...rule, + actions: [...rule.actions], + }, + }; + } + } + case 'setRuleActionProperty': { + const { key, value, index } = action.payload as RuleActionPayload; + if (index === undefined || isEqual(rule.actions[index][key], value)) { + return state; + } else { + const oldAction = rule.actions.splice(index, 1)[0]; + const updatedAction = { + ...oldAction, + [key]: value, + }; + rule.actions.splice(index, 0, updatedAction); + return { + ...state, + rule: { + ...rule, + actions: [...rule.actions], + }, + }; + } + } + } +}; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/solution_filter.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/solution_filter.tsx similarity index 96% rename from x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/solution_filter.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/solution_filter.tsx index f46ec441227bf..c3a7510ee0a0c 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/solution_filter.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/solution_filter.tsx @@ -43,7 +43,7 @@ export const SolutionFilter: React.FunctionComponent = ({ data-test-subj="solutionsFilterButton" > diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/action_type_filter.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/action_type_filter.tsx similarity index 96% rename from x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/action_type_filter.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/action_type_filter.tsx index 531b06364fee0..a136413d53e42 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/action_type_filter.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/action_type_filter.tsx @@ -44,7 +44,7 @@ export const ActionTypeFilter: React.FunctionComponent = data-test-subj="actionTypeFilterButton" > diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/collapsed_item_actions.scss b/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/collapsed_item_actions.scss similarity index 75% rename from x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/collapsed_item_actions.scss rename to x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/collapsed_item_actions.scss index 9ebd43e107e27..ffe000073aa75 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/collapsed_item_actions.scss +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/collapsed_item_actions.scss @@ -4,6 +4,6 @@ } } -button[data-test-subj='deleteAlert'] { +button[data-test-subj='deleteRule'] { color: $euiColorDanger; } diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/collapsed_item_actions.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/collapsed_item_actions.test.tsx similarity index 76% rename from x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/collapsed_item_actions.test.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/collapsed_item_actions.test.tsx index a036feea0fbcb..8ce6736aee8ad 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/collapsed_item_actions.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/collapsed_item_actions.test.tsx @@ -10,17 +10,17 @@ import { mountWithIntl, nextTick } from '@kbn/test-jest-helpers'; import { CollapsedItemActions } from './collapsed_item_actions'; import { act } from 'react-dom/test-utils'; import { ruleTypeRegistryMock } from '../../../rule_type_registry.mock'; -import { AlertTableItem, RuleTypeModel } from '../../../../types'; +import { RuleTableItem, RuleTypeModel } from '../../../../types'; import { useKibana } from '../../../../common/lib/kibana'; jest.mock('../../../../common/lib/kibana'); -const onAlertChanged = jest.fn(); -const onEditAlert = jest.fn(); -const setAlertsToDelete = jest.fn(); -const disableAlert = jest.fn(); -const enableAlert = jest.fn(); -const unmuteAlert = jest.fn(); -const muteAlert = jest.fn(); +const onRuleChanged = jest.fn(); +const onEditRule = jest.fn(); +const setRulesToDelete = jest.fn(); +const disableRule = jest.fn(); +const enableRule = jest.fn(); +const unmuteRule = jest.fn(); +const muteRule = jest.fn(); export const tick = (ms = 0) => new Promise((resolve) => { @@ -31,10 +31,10 @@ describe('CollapsedItemActions', () => { async function setup(editable: boolean = true) { const ruleTypeRegistry = ruleTypeRegistryMock.create(); ruleTypeRegistry.has.mockReturnValue(true); - const alertTypeR: RuleTypeModel = { - id: 'my-alert-type', + const ruleTypeR: RuleTypeModel = { + id: 'my-rule-type', iconClass: 'test', - description: 'Alert when testing', + description: 'Rule when testing', documentationUrl: 'https://localhost.local/docs', validate: () => { return { errors: {} }; @@ -42,20 +42,20 @@ describe('CollapsedItemActions', () => { ruleParamsExpression: jest.fn(), requiresAppContext: !editable, }; - ruleTypeRegistry.get.mockReturnValue(alertTypeR); + ruleTypeRegistry.get.mockReturnValue(ruleTypeR); const useKibanaMock = useKibana as jest.Mocked; // eslint-disable-next-line react-hooks/rules-of-hooks useKibanaMock().services.ruleTypeRegistry = ruleTypeRegistry; } const getPropsWithRule = (overrides = {}, editable = false) => { - const rule: AlertTableItem = { + const rule: RuleTableItem = { id: '1', enabled: true, name: 'test rule', tags: ['tag1'], - alertTypeId: 'test_rule_type', - consumer: 'alerts', + ruleTypeId: 'test_rule_type', + consumer: 'rules', schedule: { interval: '5d' }, actions: [ { id: 'test', actionTypeId: 'the_connector', group: 'rule', params: { message: 'test' } }, @@ -76,7 +76,7 @@ describe('CollapsedItemActions', () => { }, actionsCount: 1, index: 0, - alertType: 'Test Alert Type', + ruleType: 'Test Rule Type', isEditable: true, enabledInLicense: true, ...overrides, @@ -84,13 +84,13 @@ describe('CollapsedItemActions', () => { return { item: rule, - onAlertChanged, - onEditAlert, - setAlertsToDelete, - disableAlert, - enableAlert, - unmuteAlert, - muteAlert, + onRuleChanged, + onEditRule, + setRulesToDelete, + disableRule, + enableRule, + unmuteRule, + muteRule, }; }; @@ -116,8 +116,8 @@ describe('CollapsedItemActions', () => { expect(wrapper.find('[data-test-subj="collapsedActionPanel"]').exists()).toBeFalsy(); expect(wrapper.find('[data-test-subj="muteButton"]').exists()).toBeFalsy(); expect(wrapper.find('[data-test-subj="disableButton"]').exists()).toBeFalsy(); - expect(wrapper.find('[data-test-subj="editAlert"]').exists()).toBeFalsy(); - expect(wrapper.find('[data-test-subj="deleteAlert"]').exists()).toBeFalsy(); + expect(wrapper.find('[data-test-subj="editRule"]').exists()).toBeFalsy(); + expect(wrapper.find('[data-test-subj="deleteRule"]').exists()).toBeFalsy(); wrapper.find('[data-test-subj="selectActionButton"]').first().simulate('click'); await act(async () => { @@ -128,8 +128,8 @@ describe('CollapsedItemActions', () => { expect(wrapper.find('[data-test-subj="collapsedActionPanel"]').exists()).toBeTruthy(); expect(wrapper.find('[data-test-subj="muteButton"]').exists()).toBeTruthy(); expect(wrapper.find('[data-test-subj="disableButton"]').exists()).toBeTruthy(); - expect(wrapper.find('[data-test-subj="editAlert"]').exists()).toBeTruthy(); - expect(wrapper.find('[data-test-subj="deleteAlert"]').exists()).toBeTruthy(); + expect(wrapper.find('[data-test-subj="editRule"]').exists()).toBeTruthy(); + expect(wrapper.find('[data-test-subj="deleteRule"]').exists()).toBeTruthy(); expect( wrapper.find('[data-test-subj="selectActionButton"]').first().props().disabled @@ -139,10 +139,10 @@ describe('CollapsedItemActions', () => { expect(wrapper.find(`[data-test-subj="muteButton"] button`).text()).toEqual('Mute'); expect(wrapper.find(`[data-test-subj="disableButton"] button`).prop('disabled')).toBeFalsy(); expect(wrapper.find(`[data-test-subj="disableButton"] button`).text()).toEqual('Disable'); - expect(wrapper.find(`[data-test-subj="editAlert"] button`).prop('disabled')).toBeFalsy(); - expect(wrapper.find(`[data-test-subj="editAlert"] button`).text()).toEqual('Edit rule'); - expect(wrapper.find(`[data-test-subj="deleteAlert"] button`).prop('disabled')).toBeFalsy(); - expect(wrapper.find(`[data-test-subj="deleteAlert"] button`).text()).toEqual('Delete rule'); + expect(wrapper.find(`[data-test-subj="editRule"] button`).prop('disabled')).toBeFalsy(); + expect(wrapper.find(`[data-test-subj="editRule"] button`).text()).toEqual('Edit rule'); + expect(wrapper.find(`[data-test-subj="deleteRule"] button`).prop('disabled')).toBeFalsy(); + expect(wrapper.find(`[data-test-subj="deleteRule"] button`).text()).toEqual('Delete rule'); }); test('handles case when rule is unmuted and enabled and mute is clicked', async () => { @@ -158,7 +158,7 @@ describe('CollapsedItemActions', () => { await tick(10); wrapper.update(); }); - expect(muteAlert).toHaveBeenCalled(); + expect(muteRule).toHaveBeenCalled(); }); test('handles case when rule is unmuted and enabled and disable is clicked', async () => { @@ -174,7 +174,7 @@ describe('CollapsedItemActions', () => { await tick(10); wrapper.update(); }); - expect(disableAlert).toHaveBeenCalled(); + expect(disableRule).toHaveBeenCalled(); }); test('handles case when rule is muted and enabled and unmute is clicked', async () => { @@ -192,7 +192,7 @@ describe('CollapsedItemActions', () => { await tick(10); wrapper.update(); }); - expect(unmuteAlert).toHaveBeenCalled(); + expect(unmuteRule).toHaveBeenCalled(); }); test('handles case when rule is unmuted and disabled and enable is clicked', async () => { @@ -210,7 +210,7 @@ describe('CollapsedItemActions', () => { await tick(10); wrapper.update(); }); - expect(enableAlert).toHaveBeenCalled(); + expect(enableRule).toHaveBeenCalled(); }); test('handles case when edit rule is clicked', async () => { @@ -221,12 +221,12 @@ describe('CollapsedItemActions', () => { await nextTick(); wrapper.update(); }); - wrapper.find('button[data-test-subj="editAlert"]').simulate('click'); + wrapper.find('button[data-test-subj="editRule"]').simulate('click'); await act(async () => { await nextTick(); wrapper.update(); }); - expect(onEditAlert).toHaveBeenCalled(); + expect(onEditRule).toHaveBeenCalled(); }); test('handles case when delete rule is clicked', async () => { @@ -237,12 +237,12 @@ describe('CollapsedItemActions', () => { await nextTick(); wrapper.update(); }); - wrapper.find('button[data-test-subj="deleteAlert"]').simulate('click'); + wrapper.find('button[data-test-subj="deleteRule"]').simulate('click'); await act(async () => { await nextTick(); wrapper.update(); }); - expect(setAlertsToDelete).toHaveBeenCalled(); + expect(setRulesToDelete).toHaveBeenCalled(); }); test('renders actions correctly when rule is disabled', async () => { @@ -260,10 +260,10 @@ describe('CollapsedItemActions', () => { expect(wrapper.find(`[data-test-subj="muteButton"] button`).text()).toEqual('Mute'); expect(wrapper.find(`[data-test-subj="disableButton"] button`).prop('disabled')).toBeFalsy(); expect(wrapper.find(`[data-test-subj="disableButton"] button`).text()).toEqual('Enable'); - expect(wrapper.find(`[data-test-subj="editAlert"] button`).prop('disabled')).toBeFalsy(); - expect(wrapper.find(`[data-test-subj="editAlert"] button`).text()).toEqual('Edit rule'); - expect(wrapper.find(`[data-test-subj="deleteAlert"] button`).prop('disabled')).toBeFalsy(); - expect(wrapper.find(`[data-test-subj="deleteAlert"] button`).text()).toEqual('Delete rule'); + expect(wrapper.find(`[data-test-subj="editRule"] button`).prop('disabled')).toBeFalsy(); + expect(wrapper.find(`[data-test-subj="editRule"] button`).text()).toEqual('Edit rule'); + expect(wrapper.find(`[data-test-subj="deleteRule"] button`).prop('disabled')).toBeFalsy(); + expect(wrapper.find(`[data-test-subj="deleteRule"] button`).text()).toEqual('Delete rule'); }); test('renders actions correctly when rule is not editable', async () => { @@ -297,10 +297,10 @@ describe('CollapsedItemActions', () => { expect(wrapper.find(`[data-test-subj="muteButton"] button`).text()).toEqual('Mute'); expect(wrapper.find(`[data-test-subj="disableButton"] button`).prop('disabled')).toBeTruthy(); expect(wrapper.find(`[data-test-subj="disableButton"] button`).text()).toEqual('Disable'); - expect(wrapper.find(`[data-test-subj="editAlert"] button`).prop('disabled')).toBeFalsy(); - expect(wrapper.find(`[data-test-subj="editAlert"] button`).text()).toEqual('Edit rule'); - expect(wrapper.find(`[data-test-subj="deleteAlert"] button`).prop('disabled')).toBeFalsy(); - expect(wrapper.find(`[data-test-subj="deleteAlert"] button`).text()).toEqual('Delete rule'); + expect(wrapper.find(`[data-test-subj="editRule"] button`).prop('disabled')).toBeFalsy(); + expect(wrapper.find(`[data-test-subj="editRule"] button`).text()).toEqual('Edit rule'); + expect(wrapper.find(`[data-test-subj="deleteRule"] button`).prop('disabled')).toBeFalsy(); + expect(wrapper.find(`[data-test-subj="deleteRule"] button`).text()).toEqual('Delete rule'); }); test('renders actions correctly when rule is muted', async () => { @@ -318,10 +318,10 @@ describe('CollapsedItemActions', () => { expect(wrapper.find(`[data-test-subj="muteButton"] button`).text()).toEqual('Unmute'); expect(wrapper.find(`[data-test-subj="disableButton"] button`).prop('disabled')).toBeFalsy(); expect(wrapper.find(`[data-test-subj="disableButton"] button`).text()).toEqual('Disable'); - expect(wrapper.find(`[data-test-subj="editAlert"] button`).prop('disabled')).toBeFalsy(); - expect(wrapper.find(`[data-test-subj="editAlert"] button`).text()).toEqual('Edit rule'); - expect(wrapper.find(`[data-test-subj="deleteAlert"] button`).prop('disabled')).toBeFalsy(); - expect(wrapper.find(`[data-test-subj="deleteAlert"] button`).text()).toEqual('Delete rule'); + expect(wrapper.find(`[data-test-subj="editRule"] button`).prop('disabled')).toBeFalsy(); + expect(wrapper.find(`[data-test-subj="editRule"] button`).text()).toEqual('Edit rule'); + expect(wrapper.find(`[data-test-subj="deleteRule"] button`).prop('disabled')).toBeFalsy(); + expect(wrapper.find(`[data-test-subj="deleteRule"] button`).text()).toEqual('Delete rule'); }); test('renders actions correctly when rule type is not editable in this context', async () => { @@ -337,9 +337,9 @@ describe('CollapsedItemActions', () => { expect(wrapper.find(`[data-test-subj="muteButton"] button`).text()).toEqual('Mute'); expect(wrapper.find(`[data-test-subj="disableButton"] button`).prop('disabled')).toBeFalsy(); expect(wrapper.find(`[data-test-subj="disableButton"] button`).text()).toEqual('Disable'); - expect(wrapper.find(`[data-test-subj="editAlert"] button`).prop('disabled')).toBeTruthy(); - expect(wrapper.find(`[data-test-subj="editAlert"] button`).text()).toEqual('Edit rule'); - expect(wrapper.find(`[data-test-subj="deleteAlert"] button`).prop('disabled')).toBeFalsy(); - expect(wrapper.find(`[data-test-subj="deleteAlert"] button`).text()).toEqual('Delete rule'); + expect(wrapper.find(`[data-test-subj="editRule"] button`).prop('disabled')).toBeTruthy(); + expect(wrapper.find(`[data-test-subj="editRule"] button`).text()).toEqual('Edit rule'); + expect(wrapper.find(`[data-test-subj="deleteRule"] button`).prop('disabled')).toBeFalsy(); + expect(wrapper.find(`[data-test-subj="deleteRule"] button`).text()).toEqual('Delete rule'); }); }); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/collapsed_item_actions.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/collapsed_item_actions.tsx similarity index 68% rename from x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/collapsed_item_actions.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/collapsed_item_actions.tsx index e2870e8097946..4fcecc3410f17 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/collapsed_item_actions.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/collapsed_item_actions.tsx @@ -11,29 +11,29 @@ import React, { useEffect, useState } from 'react'; import { EuiButtonIcon, EuiPopover, EuiContextMenu } from '@elastic/eui'; import { useKibana } from '../../../../common/lib/kibana'; -import { AlertTableItem } from '../../../../types'; +import { RuleTableItem } from '../../../../types'; import { ComponentOpts as BulkOperationsComponentOpts, - withBulkAlertOperations, -} from '../../common/components/with_bulk_alert_api_operations'; + withBulkRuleOperations, +} from '../../common/components/with_bulk_rule_api_operations'; import './collapsed_item_actions.scss'; export type ComponentOpts = { - item: AlertTableItem; - onAlertChanged: () => void; - setAlertsToDelete: React.Dispatch>; - onEditAlert: (item: AlertTableItem) => void; -} & Pick; + item: RuleTableItem; + onRuleChanged: () => void; + setRulesToDelete: React.Dispatch>; + onEditRule: (item: RuleTableItem) => void; +} & Pick; export const CollapsedItemActions: React.FunctionComponent = ({ item, - onAlertChanged, - disableAlert, - enableAlert, - unmuteAlert, - muteAlert, - setAlertsToDelete, - onEditAlert, + onRuleChanged, + disableRule, + enableRule, + unmuteRule, + muteRule, + setRulesToDelete, + onEditRule, }: ComponentOpts) => { const { ruleTypeRegistry } = useKibana().services; @@ -45,8 +45,8 @@ export const CollapsedItemActions: React.FunctionComponent = ({ setIsMuted(item.muteAll); }, [item.enabled, item.muteAll]); - const isRuleTypeEditableInContext = ruleTypeRegistry.has(item.alertTypeId) - ? !ruleTypeRegistry.get(item.alertTypeId).requiresAppContext + const isRuleTypeEditableInContext = ruleTypeRegistry.has(item.ruleTypeId) + ? !ruleTypeRegistry.get(item.ruleTypeId).requiresAppContext : false; const button = ( @@ -56,7 +56,7 @@ export const CollapsedItemActions: React.FunctionComponent = ({ iconType="boxesHorizontal" onClick={() => setIsPopoverOpen(!isPopoverOpen)} aria-label={i18n.translate( - 'xpack.triggersActionsUI.sections.alertsList.collapsedItemActons.popoverButtonTitle', + 'xpack.triggersActionsUI.sections.rulesList.collapsedItemActons.popoverButtonTitle', { defaultMessage: 'Actions' } )} /> @@ -74,22 +74,22 @@ export const CollapsedItemActions: React.FunctionComponent = ({ const muteAll = isMuted; asyncScheduler.schedule(async () => { if (muteAll) { - await unmuteAlert({ ...item, muteAll }); + await unmuteRule({ ...item, muteAll }); } else { - await muteAlert({ ...item, muteAll }); + await muteRule({ ...item, muteAll }); } - onAlertChanged(); + onRuleChanged(); }, 10); setIsMuted(!isMuted); setIsPopoverOpen(!isPopoverOpen); }, name: isMuted ? i18n.translate( - 'xpack.triggersActionsUI.sections.alertsList.collapsedItemActons.unmuteTitle', + 'xpack.triggersActionsUI.sections.rulesList.collapsedItemActons.unmuteTitle', { defaultMessage: 'Unmute' } ) : i18n.translate( - 'xpack.triggersActionsUI.sections.alertsList.collapsedItemActons.muteTitle', + 'xpack.triggersActionsUI.sections.rulesList.collapsedItemActons.muteTitle', { defaultMessage: 'Mute' } ), }, @@ -100,46 +100,46 @@ export const CollapsedItemActions: React.FunctionComponent = ({ const enabled = !isDisabled; asyncScheduler.schedule(async () => { if (enabled) { - await disableAlert({ ...item, enabled }); + await disableRule({ ...item, enabled }); } else { - await enableAlert({ ...item, enabled }); + await enableRule({ ...item, enabled }); } - onAlertChanged(); + onRuleChanged(); }, 10); setIsDisabled(!isDisabled); setIsPopoverOpen(!isPopoverOpen); }, name: isDisabled ? i18n.translate( - 'xpack.triggersActionsUI.sections.alertsList.collapsedItemActons.enableTitle', + 'xpack.triggersActionsUI.sections.rulesList.collapsedItemActons.enableTitle', { defaultMessage: 'Enable' } ) : i18n.translate( - 'xpack.triggersActionsUI.sections.alertsList.collapsedItemActons.disableTitle', + 'xpack.triggersActionsUI.sections.rulesList.collapsedItemActons.disableTitle', { defaultMessage: 'Disable' } ), }, { disabled: !item.isEditable || !isRuleTypeEditableInContext, - 'data-test-subj': 'editAlert', + 'data-test-subj': 'editRule', onClick: () => { setIsPopoverOpen(!isPopoverOpen); - onEditAlert(item); + onEditRule(item); }, name: i18n.translate( - 'xpack.triggersActionsUI.sections.alertsList.collapsedItemActons.editTitle', + 'xpack.triggersActionsUI.sections.rulesList.collapsedItemActons.editTitle', { defaultMessage: 'Edit rule' } ), }, { disabled: !item.isEditable, - 'data-test-subj': 'deleteAlert', + 'data-test-subj': 'deleteRule', onClick: () => { setIsPopoverOpen(!isPopoverOpen); - setAlertsToDelete([item.id]); + setRulesToDelete([item.id]); }, name: i18n.translate( - 'xpack.triggersActionsUI.sections.alertsList.collapsedItemActons.deleteRuleTitle', + 'xpack.triggersActionsUI.sections.rulesList.collapsedItemActons.deleteRuleTitle', { defaultMessage: 'Delete rule' } ), }, @@ -166,4 +166,4 @@ export const CollapsedItemActions: React.FunctionComponent = ({ ); }; -export const CollapsedItemActionsWithApi = withBulkAlertOperations(CollapsedItemActions); +export const CollapsedItemActionsWithApi = withBulkRuleOperations(CollapsedItemActions); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/manage_license_modal.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/manage_license_modal.tsx similarity index 86% rename from x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/manage_license_modal.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/manage_license_modal.tsx index 77cca21ad33cf..eb7a616359bcd 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/manage_license_modal.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/manage_license_modal.tsx @@ -13,14 +13,14 @@ import { capitalize } from 'lodash'; interface Props { licenseType: string; - alertTypeId: string; + ruleTypeId: string; onConfirm: () => void; onCancel: () => void; } export const ManageLicenseModal: React.FC = ({ licenseType, - alertTypeId, + ruleTypeId, onConfirm, onCancel, }) => { @@ -51,8 +51,8 @@ export const ManageLicenseModal: React.FC = ({

diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/percentile_selectable_popover.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/percentile_selectable_popover.tsx similarity index 96% rename from x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/percentile_selectable_popover.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/percentile_selectable_popover.tsx index 807258522f385..0d3f98cee5cd8 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/percentile_selectable_popover.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/percentile_selectable_popover.tsx @@ -10,7 +10,7 @@ import { i18n } from '@kbn/i18n'; import { EuiPopover, EuiButtonIcon, EuiSelectable, EuiSelectableOption } from '@elastic/eui'; const iconButtonTitle = i18n.translate( - 'xpack.triggersActionsUI.sections.alertsList.alertsListTable.columns.ruleExecutionPercentileSelectButton', + 'xpack.triggersActionsUI.sections.rulesList.rulesListTable.columns.ruleExecutionPercentileSelectButton', { defaultMessage: 'select percentile' } ); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/rule_duration_format.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/rule_duration_format.tsx similarity index 100% rename from x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/rule_duration_format.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/rule_duration_format.tsx diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/rule_enabled_switch.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/rule_enabled_switch.test.tsx similarity index 85% rename from x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/rule_enabled_switch.test.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/rule_enabled_switch.test.tsx index 0773d6c9c5ed0..418b6931ca1a3 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/rule_enabled_switch.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/rule_enabled_switch.test.tsx @@ -10,19 +10,19 @@ import { mountWithIntl } from '@kbn/test-jest-helpers'; import { RuleEnabledSwitch, ComponentOpts } from './rule_enabled_switch'; describe('RuleEnabledSwitch', () => { - const enableAlert = jest.fn(); + const enableRule = jest.fn(); const props: ComponentOpts = { - disableAlert: jest.fn(), - enableAlert, + disableRule: jest.fn(), + enableRule, item: { id: '1', - name: 'test alert', + name: 'test rule', tags: ['tag1'], enabled: true, - alertTypeId: 'test_alert_type', + ruleTypeId: 'test_rule_type', schedule: { interval: '5d' }, actions: [], - params: { name: 'test alert type name' }, + params: { name: 'test rule type name' }, createdBy: null, updatedBy: null, apiKeyOwner: null, @@ -35,7 +35,7 @@ describe('RuleEnabledSwitch', () => { }, consumer: 'test', actionsCount: 0, - alertType: 'test_alert_type', + ruleType: 'test_rule_type', createdAt: new Date('2020-08-20T19:23:38Z'), enabledInLicense: true, isEditable: false, @@ -43,7 +43,7 @@ describe('RuleEnabledSwitch', () => { index: 0, updatedAt: new Date('2020-08-20T19:23:38Z'), }, - onAlertChanged: jest.fn(), + onRuleChanged: jest.fn(), }; beforeEach(() => jest.resetAllMocks()); @@ -60,13 +60,13 @@ describe('RuleEnabledSwitch', () => { ...props, item: { id: '1', - name: 'test alert', + name: 'test rule', tags: ['tag1'], enabled: false, - alertTypeId: 'test_alert_type', + ruleTypeId: 'test_rule_type', schedule: { interval: '5d' }, actions: [], - params: { name: 'test alert type name' }, + params: { name: 'test rule type name' }, createdBy: null, updatedBy: null, apiKeyOwner: null, @@ -79,7 +79,7 @@ describe('RuleEnabledSwitch', () => { }, consumer: 'test', actionsCount: 0, - alertType: 'test_alert_type', + ruleType: 'test_rule_type', createdAt: new Date('2020-08-20T19:23:38Z'), enabledInLicense: true, isEditable: true, diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/rule_enabled_switch.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/rule_enabled_switch.tsx similarity index 76% rename from x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/rule_enabled_switch.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/rule_enabled_switch.tsx index 036bfa68b8dbd..5b612833ba937 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/rule_enabled_switch.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/rule_enabled_switch.tsx @@ -8,20 +8,20 @@ import React, { useState, useEffect } from 'react'; import { EuiSwitch, EuiLoadingSpinner } from '@elastic/eui'; -import { Rule, AlertTableItem } from '../../../../types'; +import { Rule, RuleTableItem } from '../../../../types'; export interface ComponentOpts { - item: AlertTableItem; - onAlertChanged: () => void; - enableAlert: (alert: Rule) => Promise; - disableAlert: (alert: Rule) => Promise; + item: RuleTableItem; + onRuleChanged: () => void; + enableRule: (rule: Rule) => Promise; + disableRule: (rule: Rule) => Promise; } export const RuleEnabledSwitch: React.FunctionComponent = ({ item, - onAlertChanged, - disableAlert, - enableAlert, + onRuleChanged, + disableRule, + enableRule, }: ComponentOpts) => { const [isEnabled, setIsEnabled] = useState(!item.enabled); useEffect(() => { @@ -42,13 +42,13 @@ export const RuleEnabledSwitch: React.FunctionComponent = ({ setIsUpdating(true); const enabled = item.enabled; if (enabled) { - await disableAlert({ ...item, enabled }); + await disableRule({ ...item, enabled }); } else { - await enableAlert({ ...item, enabled }); + await enableRule({ ...item, enabled }); } setIsEnabled(!isEnabled); setIsUpdating(false); - onAlertChanged(); + onRuleChanged(); }} label="" /> diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/alert_status_filter.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/rule_status_filter.tsx similarity index 82% rename from x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/alert_status_filter.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/rule_status_filter.tsx index fb6580e576ce3..2f2b1914bef09 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/alert_status_filter.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/rule_status_filter.tsx @@ -18,17 +18,17 @@ import { AlertExecutionStatuses, AlertExecutionStatusValues, } from '../../../../../../alerting/common'; -import { alertsStatusesTranslationsMapping } from '../translations'; +import { rulesStatusesTranslationsMapping } from '../translations'; -interface AlertStatusFilterProps { +interface RuleStatusFilterProps { selectedStatuses: string[]; - onChange?: (selectedAlertStatusesIds: string[]) => void; + onChange?: (selectedRuleStatusesIds: string[]) => void; } -export const AlertStatusFilter: React.FunctionComponent = ({ +export const RuleStatusFilter: React.FunctionComponent = ({ selectedStatuses, onChange, -}: AlertStatusFilterProps) => { +}: RuleStatusFilterProps) => { const [selectedValues, setSelectedValues] = useState(selectedStatuses); const [isPopoverOpen, setIsPopoverOpen] = useState(false); @@ -55,10 +55,10 @@ export const AlertStatusFilter: React.FunctionComponent numActiveFilters={selectedValues.length} numFilters={selectedValues.length} onClick={() => setIsPopoverOpen(!isPopoverOpen)} - data-test-subj="alertStatusFilterButton" + data-test-subj="ruleStatusFilterButton" > @@ -80,9 +80,9 @@ export const AlertStatusFilter: React.FunctionComponent } }} checked={selectedValues.includes(item) ? 'on' : undefined} - data-test-subj={`alertStatus${item}FilerOption`} + data-test-subj={`ruleStatus${item}FilerOption`} > - {alertsStatusesTranslationsMapping[item]} + {rulesStatusesTranslationsMapping[item]} ); })} diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/alerts_list.scss b/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/rules_list.scss similarity index 79% rename from x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/alerts_list.scss rename to x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/rules_list.scss index 138605421f202..28db982b826bd 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/alerts_list.scss +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/rules_list.scss @@ -1,7 +1,7 @@ -.actAlertsList__tableRowDisabled { +.actRulesList__tableRowDisabled { background-color: $euiColorLightestShade; - .actAlertsList__tableCellDisabled { + .actRulesList__tableCellDisabled { color: $euiColorDarkShade; } } @@ -10,7 +10,7 @@ &:hover, &:focus-within, &[class*='-isActive'] { - .alertSidebarItem__action { + .ruleSidebarItem__action { opacity: 1; } } @@ -20,10 +20,10 @@ * 1. Only visually hide the action, so that it's still accessible to screen readers. * 2. When tabbed to, this element needs to be visible for keyboard accessibility. */ -.alertSidebarItem__action { +.ruleSidebarItem__action { opacity: 0; /* 1 */ - &.alertSidebarItem__mobile { + &.ruleSidebarItem__mobile { opacity: 1; } @@ -41,4 +41,4 @@ bottom: $euiSizeXS; margin-left: $euiSizeXS; position: relative; -} \ No newline at end of file +} diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/alerts_list.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/rules_list.test.tsx similarity index 70% rename from x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/alerts_list.test.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/rules_list.test.tsx index 28aa0b2097aba..adee7bd7a3c35 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/alerts_list.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/rules_list.test.tsx @@ -11,7 +11,7 @@ import { ReactWrapper } from 'enzyme'; import { act } from 'react-dom/test-utils'; import { actionTypeRegistryMock } from '../../../action_type_registry.mock'; import { ruleTypeRegistryMock } from '../../../rule_type_registry.mock'; -import { AlertsList, percentileFields } from './alerts_list'; +import { RulesList, percentileFields } from './rules_list'; import { RuleTypeModel, ValidationResult, Percentiles } from '../../../../types'; import { AlertExecutionStatusErrorReasons, @@ -27,38 +27,38 @@ jest.mock('../../../lib/action_connector_api', () => ({ loadActionTypes: jest.fn(), loadAllActions: jest.fn(), })); -jest.mock('../../../lib/alert_api', () => ({ - loadAlerts: jest.fn(), - loadAlertTypes: jest.fn(), +jest.mock('../../../lib/rule_api', () => ({ + loadRules: jest.fn(), + loadRuleTypes: jest.fn(), alertingFrameworkHealth: jest.fn(() => ({ isSufficientlySecure: true, hasPermanentEncryptionKey: true, })), })); jest.mock('../../../../common/lib/health_api', () => ({ - triggersActionsUiHealth: jest.fn(() => ({ isAlertsAvailable: true })), + triggersActionsUiHealth: jest.fn(() => ({ isRulesAvailable: true })), })); jest.mock('react-router-dom', () => ({ useHistory: () => ({ push: jest.fn(), }), useLocation: () => ({ - pathname: '/triggersActions/alerts/', + pathname: '/triggersActions/rules/', }), })); jest.mock('../../../lib/capabilities', () => ({ hasAllPrivilege: jest.fn(() => true), - hasSaveAlertsCapability: jest.fn(() => true), + hasSaveRulesCapability: jest.fn(() => true), hasShowActionsCapability: jest.fn(() => true), hasExecuteActionsCapability: jest.fn(() => true), })); -const { loadAlerts, loadAlertTypes } = jest.requireMock('../../../lib/alert_api'); +const { loadRules, loadRuleTypes } = jest.requireMock('../../../lib/rule_api'); const { loadActionTypes, loadAllActions } = jest.requireMock('../../../lib/action_connector_api'); const actionTypeRegistry = actionTypeRegistryMock.create(); const ruleTypeRegistry = ruleTypeRegistryMock.create(); const ruleType = { - id: 'test_alert_type', + id: 'test_rule_type', description: 'test', iconClass: 'test', documentationUrl: null, @@ -68,9 +68,9 @@ const ruleType = { ruleParamsExpression: () => null, requiresAppContext: false, }; -const alertTypeFromApi = { - id: 'test_alert_type', - name: 'some alert type', +const ruleTypeFromApi = { + id: 'test_rule_type', + name: 'some rule type', actionGroups: [{ id: 'default', name: 'Default' }], recoveryActionGroup: { id: 'recovered', name: 'Recovered' }, actionVariables: { context: [], state: [] }, @@ -87,10 +87,10 @@ ruleTypeRegistry.list.mockReturnValue([ruleType]); actionTypeRegistry.list.mockReturnValue([]); const useKibanaMock = useKibana as jest.Mocked; -describe('alerts_list component empty', () => { +describe('rules_list component empty', () => { let wrapper: ReactWrapper; async function setup() { - loadAlerts.mockResolvedValue({ + loadRules.mockResolvedValue({ page: 1, perPage: 10000, total: 0, @@ -106,7 +106,7 @@ describe('alerts_list component empty', () => { name: 'Test2', }, ]); - loadAlertTypes.mockResolvedValue([alertTypeFromApi]); + loadRuleTypes.mockResolvedValue([ruleTypeFromApi]); loadAllActions.mockResolvedValue([]); // eslint-disable-next-line react-hooks/rules-of-hooks @@ -115,7 +115,7 @@ describe('alerts_list component empty', () => { // eslint-disable-next-line react-hooks/rules-of-hooks useKibanaMock().services.actionTypeRegistry = actionTypeRegistry; - wrapper = mountWithIntl(); + wrapper = mountWithIntl(); await act(async () => { await nextTick(); @@ -125,20 +125,20 @@ describe('alerts_list component empty', () => { it('renders empty list', async () => { await setup(); - expect(wrapper.find('[data-test-subj="createFirstAlertEmptyPrompt"]').exists()).toBeTruthy(); + expect(wrapper.find('[data-test-subj="createFirstRuleEmptyPrompt"]').exists()).toBeTruthy(); }); - it('renders Create alert button', async () => { + it('renders Create rule button', async () => { await setup(); - expect( - wrapper.find('[data-test-subj="createFirstAlertButton"]').find('EuiButton') - ).toHaveLength(1); - expect(wrapper.find('AlertAdd').exists()).toBeFalsy(); + expect(wrapper.find('[data-test-subj="createFirstRuleButton"]').find('EuiButton')).toHaveLength( + 1 + ); + expect(wrapper.find('RuleAdd').exists()).toBeFalsy(); - wrapper.find('button[data-test-subj="createFirstAlertButton"]').simulate('click'); + wrapper.find('button[data-test-subj="createFirstRuleButton"]').simulate('click'); await act(async () => { - // When the AlertAdd component is rendered, it waits for the healthcheck to resolve + // When the RuleAdd component is rendered, it waits for the healthcheck to resolve await new Promise((resolve) => { setTimeout(resolve, 1000); }); @@ -147,23 +147,23 @@ describe('alerts_list component empty', () => { wrapper.update(); }); - expect(wrapper.find('AlertAdd').exists()).toEqual(true); + expect(wrapper.find('RuleAdd').exists()).toEqual(true); }); }); -describe('alerts_list component with items', () => { +describe('rules_list component with items', () => { let wrapper: ReactWrapper; - const mockedAlertsData = [ + const mockedRulesData = [ { id: '1', - name: 'test alert', + name: 'test rule', tags: ['tag1'], enabled: true, - alertTypeId: 'test_alert_type', + ruleTypeId: 'test_rule_type', schedule: { interval: '5d' }, actions: [], - params: { name: 'test alert type name' }, + params: { name: 'test rule type name' }, scheduledTaskId: null, createdBy: null, updatedBy: null, @@ -204,13 +204,13 @@ describe('alerts_list component with items', () => { }, { id: '2', - name: 'test alert ok', + name: 'test rule ok', tags: ['tag1'], enabled: true, - alertTypeId: 'test_alert_type', + ruleTypeId: 'test_rule_type', schedule: { interval: '5d' }, actions: [], - params: { name: 'test alert type name' }, + params: { name: 'test rule type name' }, scheduledTaskId: null, createdBy: null, updatedBy: null, @@ -247,13 +247,13 @@ describe('alerts_list component with items', () => { }, { id: '3', - name: 'test alert pending', + name: 'test rule pending', tags: ['tag1'], enabled: true, - alertTypeId: 'test_alert_type', + ruleTypeId: 'test_rule_type', schedule: { interval: '5d' }, actions: [], - params: { name: 'test alert type name' }, + params: { name: 'test rule type name' }, scheduledTaskId: null, createdBy: null, updatedBy: null, @@ -278,13 +278,13 @@ describe('alerts_list component with items', () => { }, { id: '4', - name: 'test alert error', + name: 'test rule error', tags: ['tag1'], enabled: true, - alertTypeId: 'test_alert_type', + ruleTypeId: 'test_rule_type', schedule: { interval: '5d' }, - actions: [{ id: 'test', group: 'alert', params: { message: 'test' } }], - params: { name: 'test alert type name' }, + actions: [{ id: 'test', group: 'rule', params: { message: 'test' } }], + params: { name: 'test rule type name' }, scheduledTaskId: null, createdBy: null, updatedBy: null, @@ -304,13 +304,13 @@ describe('alerts_list component with items', () => { }, { id: '5', - name: 'test alert license error', + name: 'test rule license error', tags: [], enabled: true, - alertTypeId: 'test_alert_type', + ruleTypeId: 'test_rule_type', schedule: { interval: '5d' }, - actions: [{ id: 'test', group: 'alert', params: { message: 'test' } }], - params: { name: 'test alert type name' }, + actions: [{ id: 'test', group: 'rule', params: { message: 'test' } }], + params: { name: 'test rule type name' }, scheduledTaskId: null, createdBy: null, updatedBy: null, @@ -331,11 +331,11 @@ describe('alerts_list component with items', () => { ]; async function setup(editable: boolean = true) { - loadAlerts.mockResolvedValue({ + loadRules.mockResolvedValue({ page: 1, perPage: 10000, total: 4, - data: mockedAlertsData, + data: mockedRulesData, }); loadActionTypes.mockResolvedValue([ { @@ -347,13 +347,13 @@ describe('alerts_list component with items', () => { name: 'Test2', }, ]); - loadAlertTypes.mockResolvedValue([alertTypeFromApi]); + loadRuleTypes.mockResolvedValue([ruleTypeFromApi]); loadAllActions.mockResolvedValue([]); const ruleTypeMock: RuleTypeModel = { - id: 'test_alert_type', + id: 'test_rule_type', iconClass: 'test', - description: 'Alert when testing', + description: 'Rule when testing', documentationUrl: 'https://localhost.local/docs', validate: () => { return { errors: {} }; @@ -369,54 +369,54 @@ describe('alerts_list component with items', () => { // eslint-disable-next-line react-hooks/rules-of-hooks useKibanaMock().services.actionTypeRegistry = actionTypeRegistry; - wrapper = mountWithIntl(); + wrapper = mountWithIntl(); await act(async () => { await nextTick(); wrapper.update(); }); - expect(loadAlerts).toHaveBeenCalled(); + expect(loadRules).toHaveBeenCalled(); expect(loadActionTypes).toHaveBeenCalled(); } - it('renders table of alerts', async () => { + it('renders table of rules', async () => { // Use fake timers so we don't have to wait for the EuiToolTip timeout jest.useFakeTimers(); await setup(); expect(wrapper.find('EuiBasicTable')).toHaveLength(1); - expect(wrapper.find('EuiTableRow')).toHaveLength(mockedAlertsData.length); + expect(wrapper.find('EuiTableRow')).toHaveLength(mockedRulesData.length); // Enabled switch column - expect( - wrapper.find('EuiTableRowCell[data-test-subj="alertsTableCell-enabled"]').length - ).toEqual(mockedAlertsData.length); + expect(wrapper.find('EuiTableRowCell[data-test-subj="rulesTableCell-enabled"]').length).toEqual( + mockedRulesData.length + ); // Name and rule type column - const ruleNameColumns = wrapper.find('EuiTableRowCell[data-test-subj="alertsTableCell-name"]'); - expect(ruleNameColumns.length).toEqual(mockedAlertsData.length); - mockedAlertsData.forEach((rule, index) => { - expect(ruleNameColumns.at(index).text()).toEqual(`Name${rule.name}${alertTypeFromApi.name}`); + const ruleNameColumns = wrapper.find('EuiTableRowCell[data-test-subj="rulesTableCell-name"]'); + expect(ruleNameColumns.length).toEqual(mockedRulesData.length); + mockedRulesData.forEach((rule, index) => { + expect(ruleNameColumns.at(index).text()).toEqual(`Name${rule.name}${ruleTypeFromApi.name}`); }); // Tags column expect( - wrapper.find('EuiTableRowCell[data-test-subj="alertsTableCell-tagsPopover"]').length - ).toEqual(mockedAlertsData.length); + wrapper.find('EuiTableRowCell[data-test-subj="rulesTableCell-tagsPopover"]').length + ).toEqual(mockedRulesData.length); // only show tags popover if tags exist on rule const tagsBadges = wrapper.find('EuiBadge[data-test-subj="ruleTagsBadge"]'); expect(tagsBadges.length).toEqual( - mockedAlertsData.filter((data) => data.tags.length > 0).length + mockedRulesData.filter((data) => data.tags.length > 0).length ); // Last run column expect( - wrapper.find('EuiTableRowCell[data-test-subj="alertsTableCell-lastExecutionDate"]').length - ).toEqual(mockedAlertsData.length); + wrapper.find('EuiTableRowCell[data-test-subj="rulesTableCell-lastExecutionDate"]').length + ).toEqual(mockedRulesData.length); // Last run tooltip wrapper - .find('[data-test-subj="alertsTableCell-lastExecutionDateTooltip"]') + .find('[data-test-subj="rulesTableCell-lastExecutionDateTooltip"]') .first() .simulate('mouseOver'); @@ -427,33 +427,29 @@ describe('alerts_list component with items', () => { expect(wrapper.find('.euiToolTipPopover').text()).toBe('Start time of the last execution.'); wrapper - .find('[data-test-subj="alertsTableCell-lastExecutionDateTooltip"]') + .find('[data-test-subj="rulesTableCell-lastExecutionDateTooltip"]') .first() .simulate('mouseOut'); // Schedule interval column expect( - wrapper.find('EuiTableRowCell[data-test-subj="alertsTableCell-interval"]').length - ).toEqual(mockedAlertsData.length); + wrapper.find('EuiTableRowCell[data-test-subj="rulesTableCell-interval"]').length + ).toEqual(mockedRulesData.length); // Duration column expect( - wrapper.find('EuiTableRowCell[data-test-subj="alertsTableCell-duration"]').length - ).toEqual(mockedAlertsData.length); + wrapper.find('EuiTableRowCell[data-test-subj="rulesTableCell-duration"]').length + ).toEqual(mockedRulesData.length); // show warning if duration is long const durationWarningIcon = wrapper.find('EuiIconTip[data-test-subj="ruleDurationWarning"]'); expect(durationWarningIcon.length).toEqual( - mockedAlertsData.filter( - (data) => - data.executionStatus.lastDuration > parseDuration(alertTypeFromApi.ruleTaskTimeout) + mockedRulesData.filter( + (data) => data.executionStatus.lastDuration > parseDuration(ruleTypeFromApi.ruleTaskTimeout) ).length ); // Duration tooltip - wrapper - .find('[data-test-subj="alertsTableCell-durationTooltip"]') - .first() - .simulate('mouseOver'); + wrapper.find('[data-test-subj="rulesTableCell-durationTooltip"]').first().simulate('mouseOver'); // Run the timers so the EuiTooltip will be visible jest.runAllTimers(); @@ -464,37 +460,37 @@ describe('alerts_list component with items', () => { ); // Status column - expect(wrapper.find('EuiTableRowCell[data-test-subj="alertsTableCell-status"]').length).toEqual( - mockedAlertsData.length + expect(wrapper.find('EuiTableRowCell[data-test-subj="rulesTableCell-status"]').length).toEqual( + mockedRulesData.length ); - expect(wrapper.find('EuiHealth[data-test-subj="alertStatus-active"]').length).toEqual(1); - expect(wrapper.find('EuiHealth[data-test-subj="alertStatus-ok"]').length).toEqual(1); - expect(wrapper.find('EuiHealth[data-test-subj="alertStatus-pending"]').length).toEqual(1); - expect(wrapper.find('EuiHealth[data-test-subj="alertStatus-unknown"]').length).toEqual(0); - expect(wrapper.find('EuiHealth[data-test-subj="alertStatus-error"]').length).toEqual(2); - expect(wrapper.find('[data-test-subj="alertStatus-error-tooltip"]').length).toEqual(2); + expect(wrapper.find('EuiHealth[data-test-subj="ruleStatus-active"]').length).toEqual(1); + expect(wrapper.find('EuiHealth[data-test-subj="ruleStatus-ok"]').length).toEqual(1); + expect(wrapper.find('EuiHealth[data-test-subj="ruleStatus-pending"]').length).toEqual(1); + expect(wrapper.find('EuiHealth[data-test-subj="ruleStatus-unknown"]').length).toEqual(0); + expect(wrapper.find('EuiHealth[data-test-subj="ruleStatus-error"]').length).toEqual(2); + expect(wrapper.find('[data-test-subj="ruleStatus-error-tooltip"]').length).toEqual(2); expect( - wrapper.find('EuiButtonEmpty[data-test-subj="alertStatus-error-license-fix"]').length + wrapper.find('EuiButtonEmpty[data-test-subj="ruleStatus-error-license-fix"]').length ).toEqual(1); - expect(wrapper.find('[data-test-subj="refreshAlertsButton"]').exists()).toBeTruthy(); + expect(wrapper.find('[data-test-subj="refreshRulesButton"]').exists()).toBeTruthy(); - expect(wrapper.find('EuiHealth[data-test-subj="alertStatus-error"]').first().text()).toEqual( + expect(wrapper.find('EuiHealth[data-test-subj="ruleStatus-error"]').first().text()).toEqual( 'Error' ); - expect(wrapper.find('EuiHealth[data-test-subj="alertStatus-error"]').last().text()).toEqual( + expect(wrapper.find('EuiHealth[data-test-subj="ruleStatus-error"]').last().text()).toEqual( 'License Error' ); // Monitoring column expect( - wrapper.find('EuiTableRowCell[data-test-subj="alertsTableCell-successRatio"]').length - ).toEqual(mockedAlertsData.length); + wrapper.find('EuiTableRowCell[data-test-subj="rulesTableCell-successRatio"]').length + ).toEqual(mockedRulesData.length); const ratios = wrapper.find( - 'EuiTableRowCell[data-test-subj="alertsTableCell-successRatio"] span[data-test-subj="successRatio"]' + 'EuiTableRowCell[data-test-subj="rulesTableCell-successRatio"] span[data-test-subj="successRatio"]' ); - mockedAlertsData.forEach((rule, index) => { + mockedRulesData.forEach((rule, index) => { if (rule.monitoring) { expect(ratios.at(index).text()).toEqual( `${rule.monitoring.execution.calculated_metrics.success_ratio * 100}%` @@ -506,14 +502,14 @@ describe('alerts_list component with items', () => { // P50 column is rendered initially expect( - wrapper.find(`[data-test-subj="alertsTable-${Percentiles.P50}ColumnName"]`).exists() + wrapper.find(`[data-test-subj="rulesTable-${Percentiles.P50}ColumnName"]`).exists() ).toBeTruthy(); let percentiles = wrapper.find( - `EuiTableRowCell[data-test-subj="alertsTableCell-ruleExecutionPercentile"] span[data-test-subj="rule-duration-format-value"]` + `EuiTableRowCell[data-test-subj="rulesTableCell-ruleExecutionPercentile"] span[data-test-subj="rule-duration-format-value"]` ); - mockedAlertsData.forEach((rule, index) => { + mockedRulesData.forEach((rule, index) => { if (typeof rule.monitoring?.execution.calculated_metrics.p50 === 'number') { // Ensure the table cells are getting the correct values expect(percentiles.at(index).text()).toEqual( @@ -523,7 +519,7 @@ describe('alerts_list component with items', () => { expect( wrapper .find( - 'EuiTableRowCell[data-test-subj="alertsTableCell-ruleExecutionPercentile"] [data-test-subj="rule-duration-format-tooltip"]' + 'EuiTableRowCell[data-test-subj="rulesTableCell-ruleExecutionPercentile"] [data-test-subj="rule-duration-format-tooltip"]' ) .at(index) .props().content @@ -535,11 +531,11 @@ describe('alerts_list component with items', () => { // Click column to sort by P50 wrapper - .find(`[data-test-subj="alertsTable-${Percentiles.P50}ColumnName"]`) + .find(`[data-test-subj="rulesTable-${Percentiles.P50}ColumnName"]`) .first() .simulate('click'); - expect(loadAlerts).toHaveBeenCalledWith( + expect(loadRules).toHaveBeenCalledWith( expect.objectContaining({ sort: { field: percentileFields[Percentiles.P50], @@ -550,11 +546,11 @@ describe('alerts_list component with items', () => { // Click column again to reverse sort by P50 wrapper - .find(`[data-test-subj="alertsTable-${Percentiles.P50}ColumnName"]`) + .find(`[data-test-subj="rulesTable-${Percentiles.P50}ColumnName"]`) .first() .simulate('click'); - expect(loadAlerts).toHaveBeenCalledWith( + expect(loadRules).toHaveBeenCalledWith( expect.objectContaining({ sort: { field: percentileFields[Percentiles.P50], @@ -589,14 +585,14 @@ describe('alerts_list component with items', () => { wrapper.update(); expect( - wrapper.find(`[data-test-subj="alertsTable-${Percentiles.P95}ColumnName"]`).exists() + wrapper.find(`[data-test-subj="rulesTable-${Percentiles.P95}ColumnName"]`).exists() ).toBeTruthy(); percentiles = wrapper.find( - `EuiTableRowCell[data-test-subj="alertsTableCell-ruleExecutionPercentile"] span[data-test-subj="rule-duration-format-value"]` + `EuiTableRowCell[data-test-subj="rulesTableCell-ruleExecutionPercentile"] span[data-test-subj="rule-duration-format-value"]` ); - mockedAlertsData.forEach((rule, index) => { + mockedRulesData.forEach((rule, index) => { if (typeof rule.monitoring?.execution.calculated_metrics.p95 === 'number') { expect(percentiles.at(index).text()).toEqual( getFormattedDuration(rule.monitoring.execution.calculated_metrics.p95) @@ -608,11 +604,11 @@ describe('alerts_list component with items', () => { // Click column to sort by P95 wrapper - .find(`[data-test-subj="alertsTable-${Percentiles.P95}ColumnName"]`) + .find(`[data-test-subj="rulesTable-${Percentiles.P95}ColumnName"]`) .first() .simulate('click'); - expect(loadAlerts).toHaveBeenCalledWith( + expect(loadRules).toHaveBeenCalledWith( expect.objectContaining({ sort: { field: percentileFields[Percentiles.P95], @@ -623,11 +619,11 @@ describe('alerts_list component with items', () => { // Click column again to reverse sort by P95 wrapper - .find(`[data-test-subj="alertsTable-${Percentiles.P95}ColumnName"]`) + .find(`[data-test-subj="rulesTable-${Percentiles.P95}ColumnName"]`) .first() .simulate('click'); - expect(loadAlerts).toHaveBeenCalledWith( + expect(loadRules).toHaveBeenCalledWith( expect.objectContaining({ sort: { field: percentileFields[Percentiles.P95], @@ -640,16 +636,16 @@ describe('alerts_list component with items', () => { jest.clearAllMocks(); }); - it('loads alerts when refresh button is clicked', async () => { + it('loads rules when refresh button is clicked', async () => { await setup(); - wrapper.find('[data-test-subj="refreshAlertsButton"]').first().simulate('click'); + wrapper.find('[data-test-subj="refreshRulesButton"]').first().simulate('click'); await act(async () => { await nextTick(); wrapper.update(); }); - expect(loadAlerts).toHaveBeenCalled(); + expect(loadRules).toHaveBeenCalled(); }); it('renders license errors and manage license modal on click', async () => { @@ -657,11 +653,9 @@ describe('alerts_list component with items', () => { await setup(); expect(wrapper.find('ManageLicenseModal').exists()).toBeFalsy(); expect( - wrapper.find('EuiButtonEmpty[data-test-subj="alertStatus-error-license-fix"]').length + wrapper.find('EuiButtonEmpty[data-test-subj="ruleStatus-error-license-fix"]').length ).toEqual(1); - wrapper - .find('EuiButtonEmpty[data-test-subj="alertStatus-error-license-fix"]') - .simulate('click'); + wrapper.find('EuiButtonEmpty[data-test-subj="ruleStatus-error-license-fix"]').simulate('click'); await act(async () => { await nextTick(); @@ -676,7 +670,7 @@ describe('alerts_list component with items', () => { expect(global.open).toHaveBeenCalled(); }); - it('sorts alerts when clicking the name column', async () => { + it('sorts rules when clicking the name column', async () => { await setup(); wrapper .find('[data-test-subj="tableHeaderCell_name_1"] .euiTableHeaderButton') @@ -688,7 +682,7 @@ describe('alerts_list component with items', () => { wrapper.update(); }); - expect(loadAlerts).toHaveBeenCalledWith( + expect(loadRules).toHaveBeenCalledWith( expect.objectContaining({ sort: { field: 'name', @@ -698,7 +692,7 @@ describe('alerts_list component with items', () => { ); }); - it('sorts alerts when clicking the enabled column', async () => { + it('sorts rules when clicking the enabled column', async () => { await setup(); wrapper .find('[data-test-subj="tableHeaderCell_enabled_0"] .euiTableHeaderButton') @@ -710,7 +704,7 @@ describe('alerts_list component with items', () => { wrapper.update(); }); - expect(loadAlerts).toHaveBeenLastCalledWith( + expect(loadRules).toHaveBeenLastCalledWith( expect.objectContaining({ sort: { field: 'enabled', @@ -722,22 +716,22 @@ describe('alerts_list component with items', () => { it('renders edit and delete buttons when user can manage rules', async () => { await setup(); - expect(wrapper.find('[data-test-subj="alertSidebarEditAction"]').exists()).toBeTruthy(); - expect(wrapper.find('[data-test-subj="alertSidebarDeleteAction"]').exists()).toBeTruthy(); + expect(wrapper.find('[data-test-subj="ruleSidebarEditAction"]').exists()).toBeTruthy(); + expect(wrapper.find('[data-test-subj="ruleSidebarDeleteAction"]').exists()).toBeTruthy(); }); it('does not render edit and delete button when rule type does not allow editing in rules management', async () => { await setup(false); - expect(wrapper.find('[data-test-subj="alertSidebarEditAction"]').exists()).toBeFalsy(); - expect(wrapper.find('[data-test-subj="alertSidebarDeleteAction"]').exists()).toBeTruthy(); + expect(wrapper.find('[data-test-subj="ruleSidebarEditAction"]').exists()).toBeFalsy(); + expect(wrapper.find('[data-test-subj="ruleSidebarDeleteAction"]').exists()).toBeTruthy(); }); }); -describe('alerts_list component empty with show only capability', () => { +describe('rules_list component empty with show only capability', () => { let wrapper: ReactWrapper; async function setup() { - loadAlerts.mockResolvedValue({ + loadRules.mockResolvedValue({ page: 1, perPage: 10000, total: 0, @@ -753,8 +747,8 @@ describe('alerts_list component empty with show only capability', () => { name: 'Test2', }, ]); - loadAlertTypes.mockResolvedValue([ - { id: 'test_alert_type', name: 'some alert type', authorizedConsumers: {} }, + loadRuleTypes.mockResolvedValue([ + { id: 'test_rule_type', name: 'some rule type', authorizedConsumers: {} }, ]); loadAllActions.mockResolvedValue([]); // eslint-disable-next-line react-hooks/rules-of-hooks @@ -762,7 +756,7 @@ describe('alerts_list component empty with show only capability', () => { // eslint-disable-next-line react-hooks/rules-of-hooks useKibanaMock().services.actionTypeRegistry = actionTypeRegistry; - wrapper = mountWithIntl(); + wrapper = mountWithIntl(); await act(async () => { await nextTick(); @@ -770,30 +764,30 @@ describe('alerts_list component empty with show only capability', () => { }); } - it('not renders create alert button', async () => { + it('not renders create rule button', async () => { await setup(); - expect(wrapper.find('[data-test-subj="createAlertButton"]')).toHaveLength(0); + expect(wrapper.find('[data-test-subj="createRuleButton"]')).toHaveLength(0); }); }); -describe('alerts_list with show only capability', () => { +describe('rules_list with show only capability', () => { let wrapper: ReactWrapper; async function setup(editable: boolean = true) { - loadAlerts.mockResolvedValue({ + loadRules.mockResolvedValue({ page: 1, perPage: 10000, total: 2, data: [ { id: '1', - name: 'test alert', + name: 'test rule', tags: ['tag1'], enabled: true, - alertTypeId: 'test_alert_type', + ruleTypeId: 'test_rule_type', schedule: { interval: '5d' }, actions: [], - params: { name: 'test alert type name' }, + params: { name: 'test rule type name' }, scheduledTaskId: null, createdBy: null, updatedBy: null, @@ -809,13 +803,13 @@ describe('alerts_list with show only capability', () => { }, { id: '2', - name: 'test alert 2', + name: 'test rule 2', tags: ['tag1'], enabled: true, - alertTypeId: 'test_alert_type', + ruleTypeId: 'test_rule_type', schedule: { interval: '5d' }, - actions: [{ id: 'test', group: 'alert', params: { message: 'test' } }], - params: { name: 'test alert type name' }, + actions: [{ id: 'test', group: 'rule', params: { message: 'test' } }], + params: { name: 'test rule type name' }, scheduledTaskId: null, createdBy: null, updatedBy: null, @@ -842,13 +836,13 @@ describe('alerts_list with show only capability', () => { }, ]); - loadAlertTypes.mockResolvedValue([alertTypeFromApi]); + loadRuleTypes.mockResolvedValue([ruleTypeFromApi]); loadAllActions.mockResolvedValue([]); const ruleTypeMock: RuleTypeModel = { - id: 'test_alert_type', + id: 'test_rule_type', iconClass: 'test', - description: 'Alert when testing', + description: 'Rule when testing', documentationUrl: 'https://localhost.local/docs', validate: () => { return { errors: {} }; @@ -864,7 +858,7 @@ describe('alerts_list with show only capability', () => { // eslint-disable-next-line react-hooks/rules-of-hooks useKibanaMock().services.actionTypeRegistry = actionTypeRegistry; - wrapper = mountWithIntl(); + wrapper = mountWithIntl(); await act(async () => { await nextTick(); @@ -872,14 +866,14 @@ describe('alerts_list with show only capability', () => { }); } - it('renders table of alerts with edit button disabled', async () => { + it('renders table of rules with edit button disabled', async () => { await setup(false); expect(wrapper.find('EuiBasicTable')).toHaveLength(1); expect(wrapper.find('EuiTableRow')).toHaveLength(2); expect(wrapper.find('[data-test-subj="editActionHoverButton"]')).toHaveLength(0); }); - it('renders table of alerts with delete button disabled', async () => { + it('renders table of rules with delete button disabled', async () => { const { hasAllPrivilege } = jest.requireMock('../../../lib/capabilities'); hasAllPrivilege.mockReturnValue(false); await setup(false); @@ -888,7 +882,7 @@ describe('alerts_list with show only capability', () => { expect(wrapper.find('[data-test-subj="deleteActionHoverButton"]')).toHaveLength(0); }); - it('renders table of alerts with actions menu collapsedItemActions', async () => { + it('renders table of rules with actions menu collapsedItemActions', async () => { await setup(false); expect(wrapper.find('EuiBasicTable')).toHaveLength(1); expect(wrapper.find('EuiTableRow')).toHaveLength(2); @@ -896,24 +890,24 @@ describe('alerts_list with show only capability', () => { }); }); -describe('alerts_list with disabled itmes', () => { +describe('rules_list with disabled itmes', () => { let wrapper: ReactWrapper; async function setup() { - loadAlerts.mockResolvedValue({ + loadRules.mockResolvedValue({ page: 1, perPage: 10000, total: 2, data: [ { id: '1', - name: 'test alert', + name: 'test rule', tags: ['tag1'], enabled: true, - alertTypeId: 'test_alert_type', + ruleTypeId: 'test_rule_type', schedule: { interval: '5d' }, actions: [], - params: { name: 'test alert type name' }, + params: { name: 'test rule type name' }, scheduledTaskId: null, createdBy: null, updatedBy: null, @@ -929,13 +923,13 @@ describe('alerts_list with disabled itmes', () => { }, { id: '2', - name: 'test alert 2', + name: 'test rule 2', tags: ['tag1'], enabled: true, - alertTypeId: 'test_alert_type_disabled_by_license', + ruleTypeId: 'test_rule_type_disabled_by_license', schedule: { interval: '5d' }, - actions: [{ id: 'test', group: 'alert', params: { message: 'test' } }], - params: { name: 'test alert type name' }, + actions: [{ id: 'test', group: 'rule', params: { message: 'test' } }], + params: { name: 'test rule type name' }, scheduledTaskId: null, createdBy: null, updatedBy: null, @@ -962,11 +956,11 @@ describe('alerts_list with disabled itmes', () => { }, ]); - loadAlertTypes.mockResolvedValue([ - alertTypeFromApi, + loadRuleTypes.mockResolvedValue([ + ruleTypeFromApi, { - id: 'test_alert_type_disabled_by_license', - name: 'some alert type that is not allowed', + id: 'test_rule_type_disabled_by_license', + name: 'some rule type that is not allowed', actionGroups: [{ id: 'default', name: 'Default' }], recoveryActionGroup: { id: 'recovered', name: 'Recovered' }, actionVariables: { context: [], state: [] }, @@ -987,7 +981,7 @@ describe('alerts_list with disabled itmes', () => { // eslint-disable-next-line react-hooks/rules-of-hooks useKibanaMock().services.actionTypeRegistry = actionTypeRegistry; - wrapper = mountWithIntl(); + wrapper = mountWithIntl(); await act(async () => { await nextTick(); @@ -1001,7 +995,7 @@ describe('alerts_list with disabled itmes', () => { expect(wrapper.find('EuiTableRow')).toHaveLength(2); expect(wrapper.find('EuiTableRow').at(0).prop('className')).toEqual(''); expect(wrapper.find('EuiTableRow').at(1).prop('className')).toEqual( - 'actAlertsList__tableRowDisabled' + 'actRulesList__tableRowDisabled' ); expect(wrapper.find('EuiIconTip[data-test-subj="ruleDisabledByLicenseTooltip"]').length).toBe( 1 diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/alerts_list.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/rules_list.tsx similarity index 65% rename from x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/alerts_list.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/rules_list.tsx index 72228c285238d..4aa98895d5d97 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/alerts_list.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/rules_list.tsx @@ -43,27 +43,27 @@ import { isEmpty } from 'lodash'; import { ActionType, Rule, - AlertTableItem, + RuleTableItem, RuleType, RuleTypeIndex, Pagination, Percentiles, } from '../../../../types'; -import { AlertAdd, AlertEdit } from '../../alert_form'; +import { RuleAdd, RuleEdit } from '../../rule_form'; import { BulkOperationPopover } from '../../common/components/bulk_operation_popover'; -import { AlertQuickEditButtonsWithApi as AlertQuickEditButtons } from '../../common/components/alert_quick_edit_buttons'; +import { RuleQuickEditButtonsWithApi as RuleQuickEditButtons } from '../../common/components/rule_quick_edit_buttons'; import { CollapsedItemActionsWithApi as CollapsedItemActions } from './collapsed_item_actions'; import { TypeFilter } from './type_filter'; import { ActionTypeFilter } from './action_type_filter'; -import { AlertStatusFilter, getHealthColor } from './alert_status_filter'; +import { RuleStatusFilter, getHealthColor } from './rule_status_filter'; import { - loadAlerts, - loadAlertAggregations, - loadAlertTypes, - disableAlert, - enableAlert, - deleteAlerts, -} from '../../../lib/alert_api'; + loadRules, + loadRuleAggregations, + loadRuleTypes, + disableRule, + enableRule, + deleteRules, +} from '../../../lib/rule_api'; import { loadActionTypes } from '../../../lib/action_connector_api'; import { hasAllPrivilege, hasExecuteActionsCapability } from '../../../lib/capabilities'; import { routeToRuleDetails, DEFAULT_SEARCH_PAGE_SIZE } from '../../../constants'; @@ -77,13 +77,13 @@ import { formatDuration, MONITORING_HISTORY_LIMIT, } from '../../../../../../alerting/common'; -import { alertsStatusesTranslationsMapping, ALERT_STATUS_LICENSE_ERROR } from '../translations'; +import { rulesStatusesTranslationsMapping, ALERT_STATUS_LICENSE_ERROR } from '../translations'; import { useKibana } from '../../../../common/lib/kibana'; import { DEFAULT_HIDDEN_ACTION_TYPES } from '../../../../common/constants'; -import './alerts_list.scss'; +import './rules_list.scss'; import { CenterJustifiedSpinner } from '../../../components/center_justified_spinner'; import { ManageLicenseModal } from './manage_license_modal'; -import { checkAlertTypeEnabled } from '../../../lib/check_alert_type_enabled'; +import { checkRuleTypeEnabled } from '../../../lib/check_rule_type_enabled'; import { RuleEnabledSwitch } from './rule_enabled_switch'; import { PercentileSelectablePopover } from './percentile_selectable_popover'; import { RuleDurationFormat } from './rule_duration_format'; @@ -92,12 +92,12 @@ import { getFormattedSuccessRatio } from '../../../lib/monitoring_utils'; const ENTER_KEY = 13; -interface AlertTypeState { +interface RuleTypeState { isLoading: boolean; isInitialized: boolean; data: RuleTypeIndex; } -interface AlertState { +interface RuleState { isLoading: boolean; data: Rule[]; totalItemCount: number; @@ -121,7 +121,7 @@ const initialPercentileOptions = Object.values(Percentiles).map((percentile) => key: percentile, })); -export const AlertsList: React.FunctionComponent = () => { +export const RulesList: React.FunctionComponent = () => { const history = useHistory(); const { http, @@ -143,11 +143,11 @@ export const AlertsList: React.FunctionComponent = () => { const [inputText, setInputText] = useState(); const [typesFilter, setTypesFilter] = useState([]); const [actionTypesFilter, setActionTypesFilter] = useState([]); - const [alertStatusesFilter, setAlertStatusesFilter] = useState([]); - const [alertFlyoutVisible, setAlertFlyoutVisibility] = useState(false); - const [dismissAlertErrors, setDismissAlertErrors] = useState(false); + const [ruleStatusesFilter, setRuleStatusesFilter] = useState([]); + const [ruleFlyoutVisible, setRuleFlyoutVisibility] = useState(false); + const [dismissRuleErrors, setDismissRuleErrors] = useState(false); const [editFlyoutVisible, setEditFlyoutVisibility] = useState(false); - const [currentRuleToEdit, setCurrentRuleToEdit] = useState(null); + const [currentRuleToEdit, setCurrentRuleToEdit] = useState(null); const [tagPopoverOpenIndex, setTagPopoverOpenIndex] = useState(-1); const [percentileOptions, setPercentileOptions] = @@ -160,15 +160,15 @@ export const AlertsList: React.FunctionComponent = () => { } }, [percentileOptions]); - const [sort, setSort] = useState['sort']>({ + const [sort, setSort] = useState['sort']>({ field: 'name', direction: 'asc', }); const [manageLicenseModalOpts, setManageLicenseModalOpts] = useState<{ licenseType: string; - alertTypeId: string; + ruleTypeId: string; } | null>(null); - const [alertsStatusesTotal, setAlertsStatusesTotal] = useState>( + const [rulesStatusesTotal, setRulesStatusesTotal] = useState>( AlertExecutionStatusValues.reduce( (prev: Record, status: string) => ({ @@ -178,18 +178,18 @@ export const AlertsList: React.FunctionComponent = () => { {} ) ); - const [alertTypesState, setAlertTypesState] = useState({ + const [ruleTypesState, setRuleTypesState] = useState({ isLoading: false, isInitialized: false, data: new Map(), }); - const [alertsState, setAlertsState] = useState({ + const [rulesState, setRulesState] = useState({ isLoading: false, data: [], totalItemCount: 0, }); - const [alertsToDelete, setAlertsToDelete] = useState([]); - const onRuleEdit = (ruleItem: AlertTableItem) => { + const [rulesToDelete, setRulesToDelete] = useState([]); + const onRuleEdit = (ruleItem: RuleTableItem) => { setEditFlyoutVisibility(true); setCurrentRuleToEdit(ruleItem); }; @@ -198,35 +198,35 @@ export const AlertsList: React.FunctionComponent = () => { ruleTypeRegistry.has(ruleTypeId) ? !ruleTypeRegistry.get(ruleTypeId).requiresAppContext : false; useEffect(() => { - loadAlertsData(); + loadRulesData(); }, [ - alertTypesState, + ruleTypesState, page, searchText, percentileOptions, JSON.stringify(typesFilter), JSON.stringify(actionTypesFilter), - JSON.stringify(alertStatusesFilter), + JSON.stringify(ruleStatusesFilter), ]); useEffect(() => { (async () => { try { - setAlertTypesState({ ...alertTypesState, isLoading: true }); - const alertTypes = await loadAlertTypes({ http }); + setRuleTypesState({ ...ruleTypesState, isLoading: true }); + const ruleTypes = await loadRuleTypes({ http }); const index: RuleTypeIndex = new Map(); - for (const alertType of alertTypes) { - index.set(alertType.id, alertType); + for (const ruleType of ruleTypes) { + index.set(ruleType.id, ruleType); } - setAlertTypesState({ isLoading: false, data: index, isInitialized: true }); + setRuleTypesState({ isLoading: false, data: index, isInitialized: true }); } catch (e) { toasts.addDanger({ title: i18n.translate( - 'xpack.triggersActionsUI.sections.alertsList.unableToLoadRuleTypesMessage', + 'xpack.triggersActionsUI.sections.rulesList.unableToLoadRuleTypesMessage', { defaultMessage: 'Unable to load rule types' } ), }); - setAlertTypesState({ ...alertTypesState, isLoading: false }); + setRuleTypesState({ ...ruleTypesState, isLoading: false }); } })(); }, []); @@ -246,7 +246,7 @@ export const AlertsList: React.FunctionComponent = () => { } catch (e) { toasts.addDanger({ title: i18n.translate( - 'xpack.triggersActionsUI.sections.alertsList.unableToLoadConnectorTypesMessage', + 'xpack.triggersActionsUI.sections.rulesList.unableToLoadConnectorTypesMessage', { defaultMessage: 'Unable to load connector types' } ), }); @@ -254,29 +254,28 @@ export const AlertsList: React.FunctionComponent = () => { })(); }, []); - async function loadAlertsData() { - const hasAnyAuthorizedAlertType = - alertTypesState.isInitialized && alertTypesState.data.size > 0; - if (hasAnyAuthorizedAlertType) { - setAlertsState({ ...alertsState, isLoading: true }); + async function loadRulesData() { + const hasAnyAuthorizedRuleType = ruleTypesState.isInitialized && ruleTypesState.data.size > 0; + if (hasAnyAuthorizedRuleType) { + setRulesState({ ...rulesState, isLoading: true }); try { - const alertsResponse = await loadAlerts({ + const rulesResponse = await loadRules({ http, page, searchText, typesFilter, actionTypesFilter, - alertStatusesFilter, + ruleStatusesFilter, sort, }); - await loadAlertAggs(); - setAlertsState({ + await loadRuleAggs(); + setRulesState({ isLoading: false, - data: alertsResponse.data, - totalItemCount: alertsResponse.total, + data: rulesResponse.data, + totalItemCount: rulesResponse.total, }); - if (!alertsResponse.data?.length && page.index > 0) { + if (!rulesResponse.data?.length && page.index > 0) { setPage({ ...page, index: 0 }); } @@ -284,41 +283,41 @@ export const AlertsList: React.FunctionComponent = () => { isEmpty(searchText) && isEmpty(typesFilter) && isEmpty(actionTypesFilter) && - isEmpty(alertStatusesFilter) + isEmpty(ruleStatusesFilter) ); - setNoData(alertsResponse.data.length === 0 && !isFilterApplied); + setNoData(rulesResponse.data.length === 0 && !isFilterApplied); } catch (e) { toasts.addDanger({ title: i18n.translate( - 'xpack.triggersActionsUI.sections.alertsList.unableToLoadRulesMessage', + 'xpack.triggersActionsUI.sections.rulesList.unableToLoadRulesMessage', { defaultMessage: 'Unable to load rules', } ), }); - setAlertsState({ ...alertsState, isLoading: false }); + setRulesState({ ...rulesState, isLoading: false }); } setInitialLoad(false); } } - async function loadAlertAggs() { + async function loadRuleAggs() { try { - const alertsAggs = await loadAlertAggregations({ + const rulesAggs = await loadRuleAggregations({ http, searchText, typesFilter, actionTypesFilter, - alertStatusesFilter, + ruleStatusesFilter, }); - if (alertsAggs?.alertExecutionStatus) { - setAlertsStatusesTotal(alertsAggs.alertExecutionStatus); + if (rulesAggs?.ruleExecutionStatus) { + setRulesStatusesTotal(rulesAggs.ruleExecutionStatus); } } catch (e) { toasts.addDanger({ title: i18n.translate( - 'xpack.triggersActionsUI.sections.alertsList.unableToLoadRuleStatusInfoMessage', + 'xpack.triggersActionsUI.sections.rulesList.unableToLoadRuleStatusInfoMessage', { defaultMessage: 'Unable to load rule status info', } @@ -329,7 +328,7 @@ export const AlertsList: React.FunctionComponent = () => { const renderAlertExecutionStatus = ( executionStatus: AlertExecutionStatus, - item: AlertTableItem + item: RuleTableItem ) => { const healthColor = getHealthColor(executionStatus.status); const tooltipMessage = @@ -338,20 +337,16 @@ export const AlertsList: React.FunctionComponent = () => { executionStatus.error?.reason === AlertExecutionStatusErrorReasons.License; const statusMessage = isLicenseError ? ALERT_STATUS_LICENSE_ERROR - : alertsStatusesTranslationsMapping[executionStatus.status]; + : rulesStatusesTranslationsMapping[executionStatus.status]; const health = ( - + {statusMessage} ); const healthWithTooltip = tooltipMessage ? ( - + {health} ) : ( @@ -365,16 +360,16 @@ export const AlertsList: React.FunctionComponent = () => { setManageLicenseModalOpts({ - licenseType: alertTypesState.data.get(item.alertTypeId)?.minimumLicenseRequired!, - alertTypeId: item.alertTypeId, + licenseType: ruleTypesState.data.get(item.ruleTypeId)?.minimumLicenseRequired!, + ruleTypeId: item.ruleTypeId, }) } > @@ -386,10 +381,10 @@ export const AlertsList: React.FunctionComponent = () => { const renderPercentileColumnName = () => { return ( - + { field: percentileFields[selectedPercentile!], width: '16%', name: renderPercentileColumnName(), - 'data-test-subj': 'alertsTableCell-ruleExecutionPercentile', + 'data-test-subj': 'rulesTableCell-ruleExecutionPercentile', sortable: true, truncateText: false, render: renderPercentileCellValue, }; }; - const getAlertsTableColumns = () => { + const getRulesTableColumns = () => { return [ { field: 'enabled', name: i18n.translate( - 'xpack.triggersActionsUI.sections.alertsList.alertsListTable.columns.enabledTitle', + 'xpack.triggersActionsUI.sections.rulesList.rulesListTable.columns.enabledTitle', { defaultMessage: 'Enabled' } ), width: '50px', - render(_enabled: boolean | undefined, item: AlertTableItem) { + render(_enabled: boolean | undefined, item: RuleTableItem) { return ( await disableAlert({ http, id: item.id })} - enableAlert={async () => await enableAlert({ http, id: item.id })} + disableRule={async () => await disableRule({ http, id: item.id })} + enableRule={async () => await enableRule({ http, id: item.id })} item={item} - onAlertChanged={() => loadAlertsData()} + onRuleChanged={() => loadRulesData()} /> ); }, sortable: true, - 'data-test-subj': 'alertsTableCell-enabled', + 'data-test-subj': 'rulesTableCell-enabled', }, { field: 'name', name: i18n.translate( - 'xpack.triggersActionsUI.sections.alertsList.alertsListTable.columns.nameTitle', + 'xpack.triggersActionsUI.sections.rulesList.rulesListTable.columns.nameTitle', { defaultMessage: 'Name' } ), sortable: true, truncateText: true, width: '30%', - 'data-test-subj': 'alertsTableCell-name', - render: (name: string, alert: AlertTableItem) => { - const ruleType = alertTypesState.data.get(alert.alertTypeId); - const checkEnabledResult = checkAlertTypeEnabled(ruleType); + 'data-test-subj': 'rulesTableCell-name', + render: (name: string, rule: RuleTableItem) => { + const ruleType = ruleTypesState.data.get(rule.ruleTypeId); + const checkEnabledResult = checkRuleTypeEnabled(ruleType); const link = ( <> @@ -477,7 +472,7 @@ export const AlertsList: React.FunctionComponent = () => { { - history.push(routeToRuleDetails.replace(`:ruleId`, alert.id)); + history.push(routeToRuleDetails.replace(`:ruleId`, rule.id)); }} > {name} @@ -498,7 +493,7 @@ export const AlertsList: React.FunctionComponent = () => { - {alert.alertType} + {rule.ruleType}
@@ -507,10 +502,10 @@ export const AlertsList: React.FunctionComponent = () => { return ( <> {link} - {alert.enabled && alert.muteAll && ( + {rule.enabled && rule.muteAll && ( @@ -524,8 +519,8 @@ export const AlertsList: React.FunctionComponent = () => { name: '', sortable: false, width: '50px', - 'data-test-subj': 'alertsTableCell-tagsPopover', - render: (tags: string[], item: AlertTableItem) => { + 'data-test-subj': 'rulesTableCell-tagsPopover', + render: (tags: string[], item: RuleTableItem) => { return tags.length > 0 ? ( { field: 'executionStatus.lastExecutionDate', name: ( { ), sortable: true, width: '15%', - 'data-test-subj': 'alertsTableCell-lastExecutionDate', + 'data-test-subj': 'rulesTableCell-lastExecutionDate', render: (date: Date) => { if (date) { return ( @@ -608,12 +603,12 @@ export const AlertsList: React.FunctionComponent = () => { field: 'schedule.interval', width: '6%', name: i18n.translate( - 'xpack.triggersActionsUI.sections.alertsList.alertsListTable.columns.scheduleTitle', + 'xpack.triggersActionsUI.sections.rulesList.rulesListTable.columns.scheduleTitle', { defaultMessage: 'Interval' } ), sortable: false, truncateText: false, - 'data-test-subj': 'alertsTableCell-interval', + 'data-test-subj': 'rulesTableCell-interval', render: (interval: string) => formatDuration(interval), }, { @@ -621,9 +616,9 @@ export const AlertsList: React.FunctionComponent = () => { width: '12%', name: ( { ), sortable: true, truncateText: false, - 'data-test-subj': 'alertsTableCell-duration', - render: (value: number, item: AlertTableItem) => { + 'data-test-subj': 'rulesTableCell-duration', + render: (value: number, item: RuleTableItem) => { const showDurationWarning = shouldShowDurationWarning( - alertTypesState.data.get(item.alertTypeId), + ruleTypesState.data.get(item.ruleTypeId), value ); @@ -651,10 +646,10 @@ export const AlertsList: React.FunctionComponent = () => { { width: '12%', name: ( { ), sortable: true, truncateText: false, - 'data-test-subj': 'alertsTableCell-successRatio', + 'data-test-subj': 'rulesTableCell-successRatio', render: (value: number) => { return ( @@ -700,58 +695,58 @@ export const AlertsList: React.FunctionComponent = () => { { field: 'executionStatus.status', name: i18n.translate( - 'xpack.triggersActionsUI.sections.alertsList.alertsListTable.columns.statusTitle', + 'xpack.triggersActionsUI.sections.rulesList.rulesListTable.columns.statusTitle', { defaultMessage: 'Status' } ), sortable: true, truncateText: false, width: '120px', - 'data-test-subj': 'alertsTableCell-status', - render: (_executionStatus: AlertExecutionStatus, item: AlertTableItem) => { + 'data-test-subj': 'rulesTableCell-status', + render: (_executionStatus: AlertExecutionStatus, item: RuleTableItem) => { return renderAlertExecutionStatus(item.executionStatus, item); }, }, { name: '', width: '10%', - render(item: AlertTableItem) { + render(item: RuleTableItem) { return ( - + - {item.isEditable && isRuleTypeEditableInContext(item.alertTypeId) ? ( - + {item.isEditable && isRuleTypeEditableInContext(item.ruleTypeId) ? ( + onRuleEdit(item)} iconType={'pencil'} aria-label={i18n.translate( - 'xpack.triggersActionsUI.sections.alertsList.alertsListTable.columns.editAriaLabel', + 'xpack.triggersActionsUI.sections.rulesList.rulesListTable.columns.editAriaLabel', { defaultMessage: 'Edit' } )} /> ) : null} {item.isEditable ? ( - + setAlertsToDelete([item.id])} + onClick={() => setRulesToDelete([item.id])} iconType={'trash'} aria-label={i18n.translate( - 'xpack.triggersActionsUI.sections.alertsList.alertsListTable.columns.deleteAriaLabel', + 'xpack.triggersActionsUI.sections.rulesList.rulesListTable.columns.deleteAriaLabel', { defaultMessage: 'Delete' } )} /> @@ -763,9 +758,9 @@ export const AlertsList: React.FunctionComponent = () => { loadAlertsData()} - setAlertsToDelete={setAlertsToDelete} - onEditAlert={() => onRuleEdit(item)} + onRuleChanged={() => loadRulesData()} + setRulesToDelete={setRulesToDelete} + onEditRule={() => onRuleEdit(item)} /> @@ -775,17 +770,17 @@ export const AlertsList: React.FunctionComponent = () => { ]; }; - const authorizedAlertTypes = [...alertTypesState.data.values()]; - const authorizedToCreateAnyAlerts = authorizedAlertTypes.some( - (alertType) => alertType.authorizedConsumers[ALERTS_FEATURE_ID]?.all + const authorizedRuleTypes = [...ruleTypesState.data.values()]; + const authorizedToCreateAnyRules = authorizedRuleTypes.some( + (ruleType) => ruleType.authorizedConsumers[ALERTS_FEATURE_ID]?.all ); const getProducerFeatureName = (producer: string) => { return kibanaFeatures?.find((featureItem) => featureItem.id === producer)?.name; }; - const groupAlertTypesByProducer = () => { - return authorizedAlertTypes.reduce( + const groupRuleTypesByProducer = () => { + return authorizedRuleTypes.reduce( ( result: Record< string, @@ -794,12 +789,12 @@ export const AlertsList: React.FunctionComponent = () => { name: string; }> >, - alertType + ruleType ) => { - const producer = alertType.producer; + const producer = ruleType.producer; (result[producer] = result[producer] || []).push({ - value: alertType.id, - name: alertType.name, + value: ruleType.id, + name: ruleType.name, }); return result; }, @@ -811,10 +806,10 @@ export const AlertsList: React.FunctionComponent = () => { setTypesFilter(types)} - options={sortBy(Object.entries(groupAlertTypesByProducer())).map( - ([groupName, alertTypesOptions]) => ({ + options={sortBy(Object.entries(groupRuleTypesByProducer())).map( + ([groupName, ruleTypesOptions]) => ({ groupName: getProducerFeatureName(groupName) ?? capitalize(groupName), - subOptions: alertTypesOptions.sort((a, b) => a.name.localeCompare(b.name)), + subOptions: ruleTypesOptions.sort((a, b) => a.name.localeCompare(b.name)), }) )} />, @@ -823,63 +818,63 @@ export const AlertsList: React.FunctionComponent = () => { actionTypes={actionTypes} onChange={(ids: string[]) => setActionTypesFilter(ids)} />, - setAlertStatusesFilter(ids)} + setRuleStatusesFilter(ids)} />, , ]; - const authorizedToModifySelectedAlerts = selectedIds.length - ? filterAlertsById(alertsState.data, selectedIds).every((selectedAlert) => - hasAllPrivilege(selectedAlert, alertTypesState.data.get(selectedAlert.alertTypeId)) + const authorizedToModifySelectedRules = selectedIds.length + ? filterRulesById(rulesState.data, selectedIds).every((selectedRule) => + hasAllPrivilege(selectedRule, ruleTypesState.data.get(selectedRule.ruleTypeId)) ) : false; const table = ( <> - {selectedIds.length > 0 && authorizedToModifySelectedAlerts && ( + {selectedIds.length > 0 && authorizedToModifySelectedRules && ( - setIsPerformingAction(true)} onActionPerformed={() => { - loadAlertsData(); + loadRulesData(); setIsPerformingAction(false); }} - setAlertsToDelete={setAlertsToDelete} + setRulesToDelete={setRulesToDelete} /> )} - {authorizedToCreateAnyAlerts ? ( + {authorizedToCreateAnyRules ? ( setAlertFlyoutVisibility(true)} + onClick={() => setRuleFlyoutVisibility(true)} > @@ -889,7 +884,7 @@ export const AlertsList: React.FunctionComponent = () => { { setInputText(e.target.value); if (e.target.value === '') { @@ -902,7 +897,7 @@ export const AlertsList: React.FunctionComponent = () => { } }} placeholder={i18n.translate( - 'xpack.triggersActionsUI.sections.alertsList.searchPlaceholderTitle', + 'xpack.triggersActionsUI.sections.rulesList.searchPlaceholderTitle', { defaultMessage: 'Search' } )} /> @@ -918,7 +913,7 @@ export const AlertsList: React.FunctionComponent = () => { - {!dismissAlertErrors && alertsStatusesTotal.error > 0 ? ( + {!dismissRuleErrors && rulesStatusesTotal.error > 0 ? ( { size="s" title={ } - iconType="alert" - data-test-subj="alertsErrorBanner" + iconType="rule" + data-test-subj="rulesErrorBanner" > setAlertStatusesFilter(['error'])} + onClick={() => setRuleStatusesFilter(['error'])} > - setDismissAlertErrors(true)}> + setDismissRuleErrors(true)}> @@ -960,64 +955,64 @@ export const AlertsList: React.FunctionComponent = () => { - + - + - + - + - + - + @@ -1026,38 +1021,38 @@ export const AlertsList: React.FunctionComponent = () => { ({ - 'data-test-subj': 'alert-row', - className: !alertTypesState.data.get(item.alertTypeId)?.enabledInLicense - ? 'actAlertsList__tableRowDisabled' + rowProps={(item: RuleTableItem) => ({ + 'data-test-subj': 'rule-row', + className: !ruleTypesState.data.get(item.ruleTypeId)?.enabledInLicense + ? 'actRulesList__tableRowDisabled' : '', })} - cellProps={(item: AlertTableItem) => ({ + cellProps={(item: RuleTableItem) => ({ 'data-test-subj': 'cell', - className: !alertTypesState.data.get(item.alertTypeId)?.enabledInLicense - ? 'actAlertsList__tableCellDisabled' + className: !ruleTypesState.data.get(item.ruleTypeId)?.enabledInLicense + ? 'actRulesList__tableCellDisabled' : '', })} - data-test-subj="alertsList" + data-test-subj="rulesList" pagination={{ pageIndex: page.index, pageSize: page.size, - /* Don't display alert count until we have the alert types initialized */ - totalItemCount: alertTypesState.isInitialized === false ? 0 : alertsState.totalItemCount, + /* Don't display rule count until we have the rule types initialized */ + totalItemCount: ruleTypesState.isInitialized === false ? 0 : rulesState.totalItemCount, }} selection={{ - selectable: (alert: AlertTableItem) => alert.isEditable, - onSelectionChange(updatedSelectedItemsList: AlertTableItem[]) { + selectable: (rule: RuleTableItem) => rule.isEditable, + onSelectionChange(updatedSelectedItemsList: RuleTableItem[]) { setSelectedIds(updatedSelectedItemsList.map((item) => item.id)); }, }} @@ -1066,7 +1061,7 @@ export const AlertsList: React.FunctionComponent = () => { sort: changedSort, }: { page?: Pagination; - sort?: EuiTableSortingType['sort']; + sort?: EuiTableSortingType['sort']; }) => { if (changedPage) { setPage(changedPage); @@ -1079,7 +1074,7 @@ export const AlertsList: React.FunctionComponent = () => { {manageLicenseModalOpts && ( { window.open(`${http.basePath.get()}/app/management/stack/license_management`, '_blank'); setManageLicenseModalOpts(null); @@ -1092,9 +1087,9 @@ export const AlertsList: React.FunctionComponent = () => { // if initial load, show spinner const getRulesList = () => { - if (noData && !alertsState.isLoading && !alertTypesState.isLoading) { - return authorizedToCreateAnyAlerts ? ( - setAlertFlyoutVisibility(true)} /> + if (noData && !rulesState.isLoading && !ruleTypesState.isLoading) { + return authorizedToCreateAnyRules ? ( + setRuleFlyoutVisibility(true)} /> ) : ( noPermissionPrompt ); @@ -1108,59 +1103,59 @@ export const AlertsList: React.FunctionComponent = () => { }; return ( -
+
{ - setAlertsToDelete([]); + setRulesToDelete([]); setSelectedIds([]); - await loadAlertsData(); + await loadRulesData(); }} onErrors={async () => { - // Refresh the alerts from the server, some alerts may have beend deleted - await loadAlertsData(); - setAlertsToDelete([]); + // Refresh the rules from the server, some rules may have beend deleted + await loadRulesData(); + setRulesToDelete([]); }} onCancel={() => { - setAlertsToDelete([]); + setRulesToDelete([]); }} - apiDeleteCall={deleteAlerts} - idsToDelete={alertsToDelete} - singleTitle={i18n.translate('xpack.triggersActionsUI.sections.alertsList.singleTitle', { + apiDeleteCall={deleteRules} + idsToDelete={rulesToDelete} + singleTitle={i18n.translate('xpack.triggersActionsUI.sections.rulesList.singleTitle', { defaultMessage: 'rule', })} - multipleTitle={i18n.translate('xpack.triggersActionsUI.sections.alertsList.multipleTitle', { + multipleTitle={i18n.translate('xpack.triggersActionsUI.sections.rulesList.multipleTitle', { defaultMessage: 'rules', })} setIsLoadingState={(isLoading: boolean) => { - setAlertsState({ ...alertsState, isLoading }); + setRulesState({ ...rulesState, isLoading }); }} /> {getRulesList()} - {alertFlyoutVisible && ( - { - setAlertFlyoutVisibility(false); + setRuleFlyoutVisibility(false); }} actionTypeRegistry={actionTypeRegistry} ruleTypeRegistry={ruleTypeRegistry} - ruleTypeIndex={alertTypesState.data} - onSave={loadAlertsData} + ruleTypeIndex={ruleTypesState.data} + onSave={loadRulesData} /> )} {editFlyoutVisible && currentRuleToEdit && ( - { setEditFlyoutVisibility(false); }} actionTypeRegistry={actionTypeRegistry} ruleTypeRegistry={ruleTypeRegistry} ruleType={ - alertTypesState.data.get(currentRuleToEdit.alertTypeId) as RuleType + ruleTypesState.data.get(currentRuleToEdit.ruleTypeId) as RuleType } - onSave={loadAlertsData} + onSave={loadRulesData} /> )}
@@ -1168,7 +1163,7 @@ export const AlertsList: React.FunctionComponent = () => { }; // eslint-disable-next-line import/no-default-export -export { AlertsList as default }; +export { RulesList as default }; const noPermissionPrompt = (
@@ -1184,7 +1179,7 @@ const noPermissionPrompt = ( body={

@@ -1192,23 +1187,23 @@ const noPermissionPrompt = ( /> ); -function filterAlertsById(alerts: Rule[], ids: string[]): Rule[] { - return alerts.filter((alert) => ids.includes(alert.id)); +function filterRulesById(rules: Rule[], ids: string[]): Rule[] { + return rules.filter((rule) => ids.includes(rule.id)); } -function convertAlertsToTableItems( - alerts: Rule[], +function convertRulesToTableItems( + rules: Rule[], ruleTypeIndex: RuleTypeIndex, canExecuteActions: boolean ) { - return alerts.map((alert, index: number) => ({ - ...alert, + return rules.map((rule, index: number) => ({ + ...rule, index, - actionsCount: alert.actions.length, - alertType: ruleTypeIndex.get(alert.alertTypeId)?.name ?? alert.alertTypeId, + actionsCount: rule.actions.length, + ruleType: ruleTypeIndex.get(rule.ruleTypeId)?.name ?? rule.ruleTypeId, isEditable: - hasAllPrivilege(alert, ruleTypeIndex.get(alert.alertTypeId)) && - (canExecuteActions || (!canExecuteActions && !alert.actions.length)), - enabledInLicense: !!ruleTypeIndex.get(alert.alertTypeId)?.enabledInLicense, + hasAllPrivilege(rule, ruleTypeIndex.get(rule.ruleTypeId)) && + (canExecuteActions || (!canExecuteActions && !rule.actions.length)), + enabledInLicense: !!ruleTypeIndex.get(rule.ruleTypeId)?.enabledInLicense, })); } diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/type_filter.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/type_filter.tsx similarity index 90% rename from x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/type_filter.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/type_filter.tsx index 3351e903f7bcd..6ce697f65f898 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/type_filter.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/type_filter.tsx @@ -52,10 +52,10 @@ export const TypeFilter: React.FunctionComponent = ({ numActiveFilters={selectedValues.length} numFilters={selectedValues.length} onClick={() => setIsPopoverOpen(!isPopoverOpen)} - data-test-subj="alertTypeFilterButton" + data-test-subj="ruleTypeFilterButton" > @@ -64,7 +64,7 @@ export const TypeFilter: React.FunctionComponent = ({
{options.map((groupItem, groupIndex) => ( - +

{groupItem.groupName}

{groupItem.subOptions.map((item, index) => ( @@ -79,7 +79,7 @@ export const TypeFilter: React.FunctionComponent = ({ } }} checked={selectedValues.includes(item.value) ? 'on' : undefined} - data-test-subj={`alertType${item.value}FilterOption`} + data-test-subj={`ruleType${item.value}FilterOption`} > {item.name} diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/translations.ts b/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/translations.ts similarity index 68% rename from x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/translations.ts rename to x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/translations.ts index 293a5e79e29b2..cccfe6074b7c1 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/translations.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/translations.ts @@ -8,48 +8,48 @@ import { i18n } from '@kbn/i18n'; export const ALERT_STATUS_OK = i18n.translate( - 'xpack.triggersActionsUI.sections.alertsList.alertStatusOk', + 'xpack.triggersActionsUI.sections.rulesList.ruleStatusOk', { defaultMessage: 'Ok', } ); export const ALERT_STATUS_ACTIVE = i18n.translate( - 'xpack.triggersActionsUI.sections.alertsList.alertStatusActive', + 'xpack.triggersActionsUI.sections.rulesList.ruleStatusActive', { defaultMessage: 'Active', } ); export const ALERT_STATUS_ERROR = i18n.translate( - 'xpack.triggersActionsUI.sections.alertsList.alertStatusError', + 'xpack.triggersActionsUI.sections.rulesList.ruleStatusError', { defaultMessage: 'Error', } ); export const ALERT_STATUS_LICENSE_ERROR = i18n.translate( - 'xpack.triggersActionsUI.sections.alertsList.alertStatusLicenseError', + 'xpack.triggersActionsUI.sections.rulesList.ruleStatusLicenseError', { defaultMessage: 'License Error', } ); export const ALERT_STATUS_PENDING = i18n.translate( - 'xpack.triggersActionsUI.sections.alertsList.alertStatusPending', + 'xpack.triggersActionsUI.sections.rulesList.ruleStatusPending', { defaultMessage: 'Pending', } ); export const ALERT_STATUS_UNKNOWN = i18n.translate( - 'xpack.triggersActionsUI.sections.alertsList.alertStatusUnknown', + 'xpack.triggersActionsUI.sections.rulesList.ruleStatusUnknown', { defaultMessage: 'Unknown', } ); -export const alertsStatusesTranslationsMapping = { +export const rulesStatusesTranslationsMapping = { ok: ALERT_STATUS_OK, active: ALERT_STATUS_ACTIVE, error: ALERT_STATUS_ERROR, @@ -58,55 +58,55 @@ export const alertsStatusesTranslationsMapping = { }; export const ALERT_ERROR_UNKNOWN_REASON = i18n.translate( - 'xpack.triggersActionsUI.sections.alertsList.alertErrorReasonUnknown', + 'xpack.triggersActionsUI.sections.rulesList.ruleErrorReasonUnknown', { defaultMessage: 'An error occurred for unknown reasons.', } ); export const ALERT_ERROR_READING_REASON = i18n.translate( - 'xpack.triggersActionsUI.sections.alertsList.alertErrorReasonReading', + 'xpack.triggersActionsUI.sections.rulesList.ruleErrorReasonReading', { defaultMessage: 'An error occurred when reading the rule.', } ); export const ALERT_ERROR_DECRYPTING_REASON = i18n.translate( - 'xpack.triggersActionsUI.sections.alertsList.alertErrorReasonDecrypting', + 'xpack.triggersActionsUI.sections.rulesList.ruleErrorReasonDecrypting', { defaultMessage: 'An error occurred when decrypting the rule.', } ); export const ALERT_ERROR_EXECUTION_REASON = i18n.translate( - 'xpack.triggersActionsUI.sections.alertsList.alertErrorReasonRunning', + 'xpack.triggersActionsUI.sections.rulesList.ruleErrorReasonRunning', { defaultMessage: 'An error occurred when running the rule.', } ); export const ALERT_ERROR_LICENSE_REASON = i18n.translate( - 'xpack.triggersActionsUI.sections.alertsList.alertErrorReasonLicense', + 'xpack.triggersActionsUI.sections.rulesList.ruleErrorReasonLicense', { defaultMessage: 'Cannot run rule', } ); export const ALERT_ERROR_TIMEOUT_REASON = i18n.translate( - 'xpack.triggersActionsUI.sections.alertsList.alertErrorReasonTimeout', + 'xpack.triggersActionsUI.sections.rulesList.ruleErrorReasonTimeout', { defaultMessage: 'Rule execution cancelled due to timeout.', } ); export const ALERT_ERROR_DISABLED_REASON = i18n.translate( - 'xpack.triggersActionsUI.sections.alertsList.alertErrorReasonDisabled', + 'xpack.triggersActionsUI.sections.rulesList.ruleErrorReasonDisabled', { defaultMessage: 'Rule failed to execute because rule ran after it was disabled.', } ); -export const alertsErrorReasonTranslationsMapping = { +export const rulesErrorReasonTranslationsMapping = { read: ALERT_ERROR_READING_REASON, decrypt: ALERT_ERROR_DECRYPTING_REASON, execute: ALERT_ERROR_EXECUTION_REASON, diff --git a/x-pack/plugins/triggers_actions_ui/public/common/get_add_alert_flyout.tsx b/x-pack/plugins/triggers_actions_ui/public/common/get_add_alert_flyout.tsx index 2698f4ee2e428..85735a7854d3f 100644 --- a/x-pack/plugins/triggers_actions_ui/public/common/get_add_alert_flyout.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/common/get_add_alert_flyout.tsx @@ -6,9 +6,9 @@ */ import React from 'react'; -import { AlertAdd } from '../application/sections/alert_form'; -import type { AlertAddProps } from '../types'; +import { RuleAdd } from '../application/sections/rule_form'; +import type { RuleAddProps as AlertAddProps } from '../types'; export const getAddAlertFlyoutLazy = (props: AlertAddProps) => { - return ; + return ; }; diff --git a/x-pack/plugins/triggers_actions_ui/public/common/get_edit_alert_flyout.tsx b/x-pack/plugins/triggers_actions_ui/public/common/get_edit_alert_flyout.tsx index 26cc1159e5afd..58bdc43e15377 100644 --- a/x-pack/plugins/triggers_actions_ui/public/common/get_edit_alert_flyout.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/common/get_edit_alert_flyout.tsx @@ -6,9 +6,9 @@ */ import React from 'react'; -import { AlertEdit } from '../application/sections/alert_form'; -import type { AlertEditProps } from '../types'; +import { RuleEdit } from '../application/sections/rule_form'; +import type { RuleEditProps as AlertEditProps } from '../types'; export const getEditAlertFlyoutLazy = (props: AlertEditProps) => { - return ; + return ; }; diff --git a/x-pack/plugins/triggers_actions_ui/public/common/index_controls/index.ts b/x-pack/plugins/triggers_actions_ui/public/common/index_controls/index.ts index e9f6a2a38b513..072684de68b3e 100644 --- a/x-pack/plugins/triggers_actions_ui/public/common/index_controls/index.ts +++ b/x-pack/plugins/triggers_actions_ui/public/common/index_controls/index.ts @@ -91,7 +91,7 @@ export const getFields = async (http: HttpSetup, indexes: string[]) => { export const firstFieldOption = { text: i18n.translate( - 'xpack.triggersActionsUI.sections.alertAdd.indexControls.timeFieldOptionLabel', + 'xpack.triggersActionsUI.sections.ruleAdd.indexControls.timeFieldOptionLabel', { defaultMessage: 'Select a field', } diff --git a/x-pack/plugins/triggers_actions_ui/public/common/lib/health_api.ts b/x-pack/plugins/triggers_actions_ui/public/common/lib/health_api.ts index 74c6fe76ba289..247ac03cd9149 100644 --- a/x-pack/plugins/triggers_actions_ui/public/common/lib/health_api.ts +++ b/x-pack/plugins/triggers_actions_ui/public/common/lib/health_api.ts @@ -9,6 +9,26 @@ import { HttpSetup } from 'kibana/public'; const TRIGGERS_ACTIONS_UI_API_ROOT = '/api/triggers_actions_ui'; -export async function triggersActionsUiHealth({ http }: { http: HttpSetup }): Promise { - return await http.get(`${TRIGGERS_ACTIONS_UI_API_ROOT}/_health`); +interface TriggersActionsUiHealth { + isRulesAvailable: boolean; +} + +interface TriggersActionsServerHealth { + isAlertsAvailable: boolean; +} + +export async function triggersActionsUiHealth({ + http, +}: { + http: HttpSetup; +}): Promise { + const result = await http.get( + `${TRIGGERS_ACTIONS_UI_API_ROOT}/_health` + ); + if (result) { + return { + isRulesAvailable: result.isAlertsAvailable, + }; + } + return result; } diff --git a/x-pack/plugins/triggers_actions_ui/public/index.ts b/x-pack/plugins/triggers_actions_ui/public/index.ts index 67b1518a4b8e2..36ac247cf5c7e 100644 --- a/x-pack/plugins/triggers_actions_ui/public/index.ts +++ b/x-pack/plugins/triggers_actions_ui/public/index.ts @@ -11,7 +11,7 @@ import { Plugin } from './plugin'; export type { - AlertAction, + RuleAction, Rule, RuleTypeModel, ActionType, @@ -22,7 +22,7 @@ export type { ActionVariables, ActionConnector, IErrorObject, - AlertFlyoutCloseReason, + RuleFlyoutCloseReason, RuleTypeParams, AsApiContract, } from './types'; @@ -45,7 +45,7 @@ export function plugin() { export { Plugin }; export * from './plugin'; -export { loadAlertAggregations } from './application/lib/alert_api/aggregate'; +export { loadRuleAggregations } from './application/lib/rule_api/aggregate'; export { loadActionTypes } from './application/lib/action_connector_api/connector_types'; diff --git a/x-pack/plugins/triggers_actions_ui/public/mocks.ts b/x-pack/plugins/triggers_actions_ui/public/mocks.ts index 0ef528ed921a3..7a0420594118b 100644 --- a/x-pack/plugins/triggers_actions_ui/public/mocks.ts +++ b/x-pack/plugins/triggers_actions_ui/public/mocks.ts @@ -15,8 +15,8 @@ import { getEditAlertFlyoutLazy } from './common/get_edit_alert_flyout'; import { TypeRegistry } from './application/type_registry'; import { ActionTypeModel, - AlertAddProps, - AlertEditProps, + RuleAddProps, + RuleEditProps, RuleTypeModel, ConnectorAddFlyoutProps, ConnectorEditFlyoutProps, @@ -37,16 +37,14 @@ function createStartMock(): TriggersAndActionsUIPublicPluginStart { actionTypeRegistry, }); }, - getAddAlertFlyout: (props: Omit) => { + getAddAlertFlyout: (props: Omit) => { return getAddAlertFlyoutLazy({ ...props, actionTypeRegistry, ruleTypeRegistry, }); }, - getEditAlertFlyout: ( - props: Omit - ) => { + getEditAlertFlyout: (props: Omit) => { return getEditAlertFlyoutLazy({ ...props, actionTypeRegistry, diff --git a/x-pack/plugins/triggers_actions_ui/public/plugin.ts b/x-pack/plugins/triggers_actions_ui/public/plugin.ts index 12ea42b6c6bf0..e11a1d7e61a1d 100644 --- a/x-pack/plugins/triggers_actions_ui/public/plugin.ts +++ b/x-pack/plugins/triggers_actions_ui/public/plugin.ts @@ -34,8 +34,8 @@ import { getEditAlertFlyoutLazy } from './common/get_edit_alert_flyout'; import type { ActionTypeModel, - AlertAddProps, - AlertEditProps, + RuleAddProps, + RuleEditProps, RuleTypeModel, ConnectorAddFlyoutProps, ConnectorEditFlyoutProps, @@ -56,11 +56,11 @@ export interface TriggersAndActionsUIPublicPluginStart { props: Omit ) => ReactElement; getAddAlertFlyout: ( - props: Omit - ) => ReactElement; + props: Omit + ) => ReactElement; getEditAlertFlyout: ( - props: Omit - ) => ReactElement; + props: Omit + ) => ReactElement; } interface PluginsSetup { @@ -186,9 +186,7 @@ export class Plugin actionTypeRegistry: this.actionTypeRegistry, }); }, - getAddAlertFlyout: ( - props: Omit - ) => { + getAddAlertFlyout: (props: Omit) => { return getAddAlertFlyoutLazy({ ...props, actionTypeRegistry: this.actionTypeRegistry, @@ -196,7 +194,7 @@ export class Plugin }); }, getEditAlertFlyout: ( - props: Omit + props: Omit ) => { return getEditAlertFlyoutLazy({ ...props, diff --git a/x-pack/plugins/triggers_actions_ui/public/types.ts b/x-pack/plugins/triggers_actions_ui/public/types.ts index 67c2da627bf39..ef2f02411de38 100644 --- a/x-pack/plugins/triggers_actions_ui/public/types.ts +++ b/x-pack/plugins/triggers_actions_ui/public/types.ts @@ -23,17 +23,17 @@ import { TypeRegistry } from './application/type_registry'; import { ActionGroup, AlertActionParam, - SanitizedAlert as SanitizedRule, + SanitizedAlert, ResolvedSanitizedRule, - AlertAction, + AlertAction as RuleAction, AlertAggregations, RuleTaskState, - AlertSummary, + AlertSummary as RuleSummary, ExecutionDuration, AlertStatus, RawAlertInstance, AlertingFrameworkHealth, - AlertNotifyWhenType, + AlertNotifyWhenType as RuleNotifyWhenType, AlertTypeParams as RuleTypeParams, ActionVariable, RuleType as CommonRuleType, @@ -41,22 +41,34 @@ import { // In Triggers and Actions we treat all `Alert`s as `SanitizedRule` // so the `Params` is a black-box of Record -type Rule = SanitizedRule; -type ResolvedRule = ResolvedSanitizedRule; +type SanitizedRule = Omit< + SanitizedAlert, + 'alertTypeId' +> & { + ruleTypeId: SanitizedAlert['alertTypeId']; +}; +type Rule = SanitizedRule; +type ResolvedRule = Omit, 'alertTypeId'> & { + ruleTypeId: ResolvedSanitizedRule['alertTypeId']; +}; +type RuleAggregations = Omit & { + ruleExecutionStatus: AlertAggregations['alertExecutionStatus']; +}; export type { Rule, - AlertAction, - AlertAggregations, + RuleAction, + RuleAggregations, RuleTaskState, - AlertSummary, + RuleSummary, ExecutionDuration, AlertStatus, RawAlertInstance, AlertingFrameworkHealth, - AlertNotifyWhenType, + RuleNotifyWhenType, RuleTypeParams, ResolvedRule, + SanitizedRule, }; export type { ActionType, AsApiContract }; export { @@ -93,7 +105,7 @@ export interface ActionConnectorFieldsProps { isEdit: boolean; } -export enum AlertFlyoutCloseReason { +export enum RuleFlyoutCloseReason { SAVED, CANCELED, } @@ -232,10 +244,10 @@ export interface RuleType< export type SanitizedRuleType = Omit; -export type AlertUpdates = Omit; +export type RuleUpdates = Omit; -export interface AlertTableItem extends Rule { - alertType: RuleType['name']; +export interface RuleTableItem extends Rule { + ruleType: RuleType['name']; index: number; actionsCount: number; isEditable: boolean; @@ -250,7 +262,7 @@ export interface RuleTypeParamsExpressionProps< ruleParams: Params; ruleInterval: string; ruleThrottle: string; - alertNotifyWhen: AlertNotifyWhenType; + alertNotifyWhen: RuleNotifyWhenType; setRuleParams: (property: Key, value: Params[Key] | undefined) => void; setRuleProperty: ( key: Prop, @@ -303,28 +315,28 @@ export interface ConnectorEditFlyoutProps { actionTypeRegistry: ActionTypeRegistryContract; } -export interface AlertEditProps> { - initialAlert: Rule; +export interface RuleEditProps> { + initialRule: Rule; ruleTypeRegistry: RuleTypeRegistryContract; actionTypeRegistry: ActionTypeRegistryContract; - onClose: (reason: AlertFlyoutCloseReason) => void; + onClose: (reason: RuleFlyoutCloseReason) => void; /** @deprecated use `onSave` as a callback after an alert is saved*/ - reloadAlerts?: () => Promise; + reloadRules?: () => Promise; onSave?: () => Promise; metadata?: MetaData; ruleType?: RuleType; } -export interface AlertAddProps> { +export interface RuleAddProps> { consumer: string; ruleTypeRegistry: RuleTypeRegistryContract; actionTypeRegistry: ActionTypeRegistryContract; - onClose: (reason: AlertFlyoutCloseReason) => void; - alertTypeId?: string; + onClose: (reason: RuleFlyoutCloseReason) => void; + ruleTypeId?: string; canChangeTrigger?: boolean; initialValues?: Partial; /** @deprecated use `onSave` as a callback after an alert is saved*/ - reloadAlerts?: () => Promise; + reloadRules?: () => Promise; onSave?: () => Promise; metadata?: MetaData; ruleTypeIndex?: RuleTypeIndex; diff --git a/x-pack/plugins/uptime/e2e/journeys/alerts/status_alert_flyouts_in_alerting_app.ts b/x-pack/plugins/uptime/e2e/journeys/alerts/status_alert_flyouts_in_alerting_app.ts index ba973a7aa8a61..859954364f9d3 100644 --- a/x-pack/plugins/uptime/e2e/journeys/alerts/status_alert_flyouts_in_alerting_app.ts +++ b/x-pack/plugins/uptime/e2e/journeys/alerts/status_alert_flyouts_in_alerting_app.ts @@ -23,7 +23,7 @@ journey('StatusFlyoutInAlertingApp', async ({ page, params }) => { }); step('Open monitor status flyout', async () => { - await page.click(byTestId('createFirstAlertButton')); + await page.click(byTestId('createFirstRuleButton')); await waitForLoadingToFinish({ page }); await page.click(byTestId('"xpack.uptime.alerts.monitorStatus-SelectOption"')); await waitForLoadingToFinish({ page }); @@ -54,7 +54,7 @@ journey('StatusFlyoutInAlertingApp', async ({ page, params }) => { }); step('Open tls alert flyout', async () => { - await page.click(byTestId('createFirstAlertButton')); + await page.click(byTestId('createFirstRuleButton')); await waitForLoadingToFinish({ page }); await page.click(byTestId('"xpack.uptime.alerts.tlsCertificate-SelectOption"')); await waitForLoadingToFinish({ page }); diff --git a/x-pack/plugins/uptime/e2e/journeys/alerts/tls_alert_flyouts_in_alerting_app.ts b/x-pack/plugins/uptime/e2e/journeys/alerts/tls_alert_flyouts_in_alerting_app.ts index 024e8e53c3b2a..d8b53f9f3c89f 100644 --- a/x-pack/plugins/uptime/e2e/journeys/alerts/tls_alert_flyouts_in_alerting_app.ts +++ b/x-pack/plugins/uptime/e2e/journeys/alerts/tls_alert_flyouts_in_alerting_app.ts @@ -23,7 +23,7 @@ journey('TlsFlyoutInAlertingApp', async ({ page, params }) => { }); step('Open tls alert flyout', async () => { - await page.click(byTestId('createFirstAlertButton')); + await page.click(byTestId('createFirstRuleButton')); await waitForLoadingToFinish({ page }); await page.click(byTestId('"xpack.uptime.alerts.tlsCertificate-SelectOption"')); await waitForLoadingToFinish({ page }); diff --git a/x-pack/plugins/uptime/e2e/journeys/monitor_details/monitor_alerts.journey.ts b/x-pack/plugins/uptime/e2e/journeys/monitor_details/monitor_alerts.journey.ts index c44dbc187bd53..565dcc56cc983 100644 --- a/x-pack/plugins/uptime/e2e/journeys/monitor_details/monitor_alerts.journey.ts +++ b/x-pack/plugins/uptime/e2e/journeys/monitor_details/monitor_alerts.journey.ts @@ -66,7 +66,7 @@ journey('MonitorAlerts', async ({ page, params }: { page: Page; params: any }) = }); step('close anomaly detection flyout', async () => { - await page.click(byTestId('cancelSaveAlertButton')); + await page.click(byTestId('cancelSaveRuleButton')); }); step('open anomaly detection alert', async () => { @@ -80,7 +80,7 @@ journey('MonitorAlerts', async ({ page, params }: { page: Page; params: any }) = }); step('save anomaly detection alert', async () => { - await page.click(byTestId('saveAlertButton')); + await page.click(byTestId('saveRuleButton')); await page.click(byTestId('confirmModalConfirmButton')); await page.waitForSelector(`text=Created rule "${alertId}"`); }); diff --git a/x-pack/plugins/uptime/e2e/page_objects/monitor_details.tsx b/x-pack/plugins/uptime/e2e/page_objects/monitor_details.tsx index efadc26a383c0..7cce2c061fa82 100644 --- a/x-pack/plugins/uptime/e2e/page_objects/monitor_details.tsx +++ b/x-pack/plugins/uptime/e2e/page_objects/monitor_details.tsx @@ -99,7 +99,7 @@ export function monitorDetailsPageProvider({ page, kibanaUrl }: { page: Page; ki }, async updateAlert({ id, threshold }: AlertType) { - await this.fillByTestSubj('alertNameInput', id); + await this.fillByTestSubj('ruleNameInput', id); await this.selectAlertThreshold(threshold); }, diff --git a/x-pack/plugins/uptime/public/components/common/alerts/uptime_edit_alert_flyout.tsx b/x-pack/plugins/uptime/public/components/common/alerts/uptime_edit_alert_flyout.tsx index fbad21cbfaed5..a12589cc74971 100644 --- a/x-pack/plugins/uptime/public/components/common/alerts/uptime_edit_alert_flyout.tsx +++ b/x-pack/plugins/uptime/public/components/common/alerts/uptime_edit_alert_flyout.tsx @@ -7,14 +7,15 @@ import React, { useMemo } from 'react'; import { useKibana } from '../../../../../../../src/plugins/kibana_react/public'; -import { +import type { Rule, TriggersAndActionsUIPublicPluginStart, } from '../../../../../triggers_actions_ui/public'; +import { UptimeAlertTypeParams } from '../../../state/alerts/alerts'; interface Props { alertFlyoutVisible: boolean; - initialAlert: Rule; + initialAlert: Rule; setAlertFlyoutVisibility: React.Dispatch>; } @@ -32,7 +33,7 @@ export const UptimeEditAlertFlyoutComponent = ({ const EditAlertFlyout = useMemo( () => triggersActionsUi.getEditAlertFlyout({ - initialAlert, + initialRule: initialAlert, onClose: () => { setAlertFlyoutVisibility(false); }, diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/uptime_alerts_flyout_wrapper.tsx b/x-pack/plugins/uptime/public/components/overview/alerts/uptime_alerts_flyout_wrapper.tsx index 459f73a78ad8b..cf3a9d0800aea 100644 --- a/x-pack/plugins/uptime/public/components/overview/alerts/uptime_alerts_flyout_wrapper.tsx +++ b/x-pack/plugins/uptime/public/components/overview/alerts/uptime_alerts_flyout_wrapper.tsx @@ -34,7 +34,7 @@ export const UptimeAlertsFlyoutWrapperComponent = ({ triggersActionsUi.getAddAlertFlyout({ consumer: 'uptime', onClose: onCloseAlertFlyout, - alertTypeId, + ruleTypeId: alertTypeId, canChangeTrigger: !alertTypeId, }), // eslint-disable-next-line react-hooks/exhaustive-deps diff --git a/x-pack/plugins/uptime/public/lib/alert_types/alert_messages.tsx b/x-pack/plugins/uptime/public/lib/alert_types/alert_messages.tsx index 3d51051d28fe5..e35234aab54b0 100644 --- a/x-pack/plugins/uptime/public/lib/alert_types/alert_messages.tsx +++ b/x-pack/plugins/uptime/public/lib/alert_types/alert_messages.tsx @@ -13,16 +13,16 @@ import type { CoreTheme } from 'kibana/public'; import { EuiLink, EuiSpacer, EuiText } from '@elastic/eui'; import { RedirectAppLinks, toMountPoint } from '../../../../../../src/plugins/kibana_react/public'; import { ActionConnector } from '../../state/alerts/alerts'; -import { Alert } from '../../../../alerting/common'; import { kibanaService } from '../../state/kibana_service'; import { getUrlForAlert } from './common'; +import type { Rule } from '../../../../triggers_actions_ui/public'; export const simpleAlertEnabled = ( defaultActions: ActionConnector[], theme$: Observable, - alert: Alert + rule: Rule ) => { - const alertUrl = getUrlForAlert(alert.id, kibanaService.core.http.basePath.get()); + const alertUrl = getUrlForAlert(rule.id, kibanaService.core.http.basePath.get()); return { title: i18n.translate('xpack.uptime.overview.alerts.enabled.success', { diff --git a/x-pack/plugins/uptime/public/state/actions/types.ts b/x-pack/plugins/uptime/public/state/actions/types.ts index 70c92d825adde..13072c1b884e1 100644 --- a/x-pack/plugins/uptime/public/state/actions/types.ts +++ b/x-pack/plugins/uptime/public/state/actions/types.ts @@ -7,7 +7,7 @@ import { Action } from 'redux-actions'; import { IHttpFetchError } from 'src/core/public'; -import { Alert } from '../../../../alerting/common'; +import type { Rule } from '../../../../triggers_actions_ui/public'; import { UptimeAlertTypeParams } from '../alerts/alerts'; export interface AsyncAction { @@ -63,5 +63,5 @@ export interface AlertsResult { page: number; perPage: number; total: number; - data: Array>; + data: Array>; } diff --git a/x-pack/plugins/uptime/public/state/alerts/alerts.ts b/x-pack/plugins/uptime/public/state/alerts/alerts.ts index c33bb7bde01b8..757ee2acec0bd 100644 --- a/x-pack/plugins/uptime/public/state/alerts/alerts.ts +++ b/x-pack/plugins/uptime/public/state/alerts/alerts.ts @@ -21,8 +21,10 @@ import { fetchMonitorAlertRecords, NewAlertParams, } from '../api/alerts'; -import { ActionConnector as RawActionConnector } from '../../../../triggers_actions_ui/public'; -import { Alert } from '../../../../alerting/common'; +import type { + ActionConnector as RawActionConnector, + Rule, +} from '../../../../triggers_actions_ui/public'; import { kibanaService } from '../kibana_service'; import { monitorIdSelector } from '../selectors'; import { AlertsResult, MonitorIdParam } from '../actions/types'; @@ -37,15 +39,14 @@ export type UptimeAlertTypeParams = Record; export const createAlertAction = createAsyncAction< NewAlertParams, - Alert | null + Rule | null >('CREATE ALERT'); export const getConnectorsAction = createAsyncAction<{}, ActionConnector[]>('GET CONNECTORS'); export const getMonitorAlertsAction = createAsyncAction<{}, AlertsResult | null>('GET ALERTS'); -export const getAnomalyAlertAction = createAsyncAction< - MonitorIdParam, - Alert ->('GET EXISTING ALERTS'); +export const getAnomalyAlertAction = createAsyncAction>( + 'GET EXISTING ALERTS' +); export const deleteAlertAction = createAsyncAction<{ alertId: string }, string | null>( 'DELETE ALERTS' ); @@ -55,9 +56,9 @@ export const deleteAnomalyAlertAction = createAsyncAction<{ alertId: string }, a export interface AlertState { connectors: AsyncInitState; - newAlert: AsyncInitState>; + newAlert: AsyncInitState>; alerts: AsyncInitState; - anomalyAlert: AsyncInitState>; + anomalyAlert: AsyncInitState>; alertDeletion: AsyncInitState; anomalyAlertDeletion: AsyncInitState; } @@ -147,7 +148,7 @@ export function* fetchAlertsEffect() { ); yield takeLatest(createAlertAction.get, function* (action: Action): Generator { try { - const response = (yield call(createAlert, action.payload)) as Alert; + const response = (yield call(createAlert, action.payload)) as Rule; yield put(createAlertAction.success(response)); kibanaService.core.notifications.toasts.addSuccess( diff --git a/x-pack/plugins/uptime/public/state/api/alert_actions.ts b/x-pack/plugins/uptime/public/state/api/alert_actions.ts index 0e29300f02a65..93a19cedc6001 100644 --- a/x-pack/plugins/uptime/public/state/api/alert_actions.ts +++ b/x-pack/plugins/uptime/public/state/api/alert_actions.ts @@ -7,7 +7,7 @@ import { i18n } from '@kbn/i18n'; import { NewAlertParams } from './alerts'; -import { AlertAction } from '../../../../triggers_actions_ui/public'; +import { RuleAction as RuleActionOrig } from '../../../../triggers_actions_ui/public'; import { ACTION_GROUP_DEFINITIONS } from '../../../common/constants/alerts'; import { MonitorStatusTranslations } from '../../../common/translations'; import { @@ -36,7 +36,7 @@ export const EMAIL_ACTION_ID: ActionTypeId = '.email'; const { MONITOR_STATUS } = ACTION_GROUP_DEFINITIONS; -export type RuleAction = Omit; +export type RuleAction = Omit; const getRecoveryMessage = (selectedMonitor: Ping) => { return i18n.translate('xpack.uptime.alerts.monitorStatus.recoveryMessage', { diff --git a/x-pack/plugins/uptime/public/state/api/alerts.ts b/x-pack/plugins/uptime/public/state/api/alerts.ts index 7ddfbb872fb95..d19b9688b21d0 100644 --- a/x-pack/plugins/uptime/public/state/api/alerts.ts +++ b/x-pack/plugins/uptime/public/state/api/alerts.ts @@ -10,9 +10,9 @@ import { apiService } from './utils'; import { ActionConnector } from '../alerts/alerts'; import { AlertsResult, MonitorIdParam } from '../actions/types'; -import { ActionType, AsApiContract } from '../../../../triggers_actions_ui/public'; +import type { ActionType, AsApiContract, Rule } from '../../../../triggers_actions_ui/public'; import { API_URLS } from '../../../common/constants'; -import { Alert, AlertTypeParams } from '../../../../alerting/common'; +import { AlertTypeParams } from '../../../../alerting/common'; import { AtomicStatusCheckParams } from '../../../common/runtime_types/alerts'; import { populateAlertActions, RuleAction } from './alert_actions'; @@ -49,7 +49,7 @@ export interface NewAlertParams extends AlertTypeParams { } type NewMonitorStatusAlert = Omit< - Alert, + Rule, | 'id' | 'createdBy' | 'updatedBy' @@ -60,12 +60,12 @@ type NewMonitorStatusAlert = Omit< | 'muteAll' | 'mutedInstanceIds' | 'executionStatus' - | 'alertTypeId' + | 'ruleTypeId' | 'notifyWhen' | 'actions' > & { - rule_type_id: Alert['alertTypeId']; - notify_when: Alert['notifyWhen']; + rule_type_id: Rule['ruleTypeId']; + notify_when: Rule['notifyWhen']; actions: RuleAction[]; }; @@ -74,7 +74,7 @@ export const createAlert = async ({ monitorId, selectedMonitor, defaultEmail, -}: NewAlertParams): Promise => { +}: NewAlertParams): Promise => { const actions: RuleAction[] = populateAlertActions({ defaultActions, selectedMonitor, @@ -122,7 +122,7 @@ export const fetchMonitorAlertRecords = async (): Promise => { export const fetchAlertRecords = async ({ monitorId, -}: MonitorIdParam): Promise> => { +}: MonitorIdParam): Promise> => { const data = { page: 1, per_page: 500, @@ -131,11 +131,16 @@ export const fetchAlertRecords = async ({ sort_field: 'name.keyword', sort_order: 'asc', }; - const alerts = await apiService.get<{ data: Array> }>( - API_URLS.RULES_FIND, - data - ); - return alerts.data.find((alert) => alert.params.monitorId === monitorId) as Alert; + const rawRules = await apiService.get<{ + data: Array & { rule_type_id: string }>; + }>(API_URLS.RULES_FIND, data); + const monitorRule = rawRules.data.find( + (rule) => rule.params.monitorId === monitorId + ) as Rule & { rule_type_id: string }; + return { + ...monitorRule, + ruleTypeId: monitorRule.rule_type_id, + }; }; export const disableAlertById = async ({ alertId }: { alertId: string }) => { diff --git a/x-pack/test/functional/services/ml/navigation.ts b/x-pack/test/functional/services/ml/navigation.ts index da34c97ff127f..4341fb1247119 100644 --- a/x-pack/test/functional/services/ml/navigation.ts +++ b/x-pack/test/functional/services/ml/navigation.ts @@ -55,7 +55,7 @@ export function MachineLearningNavigationProvider({ async navigateToAlertsAndAction() { await PageObjects.common.navigateToApp('triggersActions'); await testSubjects.click('rulesTab'); - await testSubjects.existOrFail('alertsList'); + await testSubjects.existOrFail('rulesList'); }, async assertTabsExist(tabTypeSubject: string, areaSubjects: string[]) { diff --git a/x-pack/test/functional/services/uptime/alerts.ts b/x-pack/test/functional/services/uptime/alerts.ts index 9275b9049ab09..76bea59cc4207 100644 --- a/x-pack/test/functional/services/uptime/alerts.ts +++ b/x-pack/test/functional/services/uptime/alerts.ts @@ -21,7 +21,7 @@ export function UptimeAlertsProvider({ getService }: FtrProviderContext) { await testSubjects.click('xpack.uptime.toggleTlsAlertFlyout'); } // ensure the flyout has opened - await testSubjects.exists('alertNameInput'); + await testSubjects.exists('ruleNameInput'); }, async openMonitorStatusAlertType(alertType: string) { await testSubjects.click(`xpack.uptime.alerts.${alertType}-SelectOption`); @@ -34,7 +34,7 @@ export function UptimeAlertsProvider({ getService }: FtrProviderContext) { } }, async setAlertName(name: string) { - await testSubjects.setValue('alertNameInput', name); + await testSubjects.setValue('ruleNameInput', name); }, async setAlertInterval(value: string) { await testSubjects.setValue('intervalInput', value); @@ -104,11 +104,11 @@ export function UptimeAlertsProvider({ getService }: FtrProviderContext) { await testSubjects.click('uptimeAlertAddFilter.monitor.type'); await testSubjects.click('uptimeCreateStatusAlert.filter_scheme'); }, - async clickSaveAlertButton() { - await testSubjects.click('saveAlertButton'); + async clickSaveRuleButton() { + await testSubjects.click('saveRuleButton'); }, async clickSaveAlertsConfirmButton() { - await testSubjects.click('confirmAlertSaveModal > confirmModalConfirmButton', 20000); + await testSubjects.click('confirmRuleSaveModal > confirmModalConfirmButton', 20000); }, }; } diff --git a/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/alert_create_flyout.ts b/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/alert_create_flyout.ts index 95ff24fc8beef..1db679d6f1286 100644 --- a/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/alert_create_flyout.ts +++ b/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/alert_create_flyout.ts @@ -41,7 +41,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { async function defineEsQueryAlert(alertName: string) { await pageObjects.triggersActionsUI.clickCreateAlertButton(); - await testSubjects.setValue('alertNameInput', alertName); + await testSubjects.setValue('ruleNameInput', alertName); await testSubjects.click(`.es-query-SelectOption`); await testSubjects.click('selectIndexExpression'); const indexComboBox = await find.byCssSelector('#indexSelectSearchBox'); @@ -57,13 +57,13 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }); await testSubjects.click('closePopover'); // need this two out of popup clicks to close them - const nameInput = await testSubjects.find('alertNameInput'); + const nameInput = await testSubjects.find('ruleNameInput'); await nameInput.click(); } async function defineIndexThresholdAlert(alertName: string) { await pageObjects.triggersActionsUI.clickCreateAlertButton(); - await testSubjects.setValue('alertNameInput', alertName); + await testSubjects.setValue('ruleNameInput', alertName); await testSubjects.click(`.index-threshold-SelectOption`); await testSubjects.click('selectIndexExpression'); const indexComboBox = await find.byCssSelector('#indexSelectSearchBox'); @@ -79,7 +79,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }); await testSubjects.click('closePopover'); // need this two out of popup clicks to close them - const nameInput = await testSubjects.find('alertNameInput'); + const nameInput = await testSubjects.find('ruleNameInput'); await nameInput.click(); await testSubjects.click('whenExpression'); @@ -101,7 +101,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { async function defineAlwaysFiringAlert(alertName: string) { await pageObjects.triggersActionsUI.clickCreateAlertButton(); - await testSubjects.setValue('alertNameInput', alertName); + await testSubjects.setValue('ruleNameInput', alertName); await testSubjects.click('test.always-firing-SelectOption'); } @@ -157,7 +157,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { 'test message {{alert.actionGroup}} some additional text {{rule.id}}' ); - await testSubjects.click('saveAlertButton'); + await testSubjects.click('saveRuleButton'); const toastTitle = await pageObjects.common.closeToast(); expect(toastTitle).to.eql(`Created rule "${alertName}"`); await pageObjects.triggersActionsUI.searchAlerts(alertName); @@ -207,7 +207,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await testSubjects.click('addNewActionConnectorActionGroup-1'); await testSubjects.click('addNewActionConnectorActionGroup-1-option-other'); - await testSubjects.click('saveAlertButton'); + await testSubjects.click('saveRuleButton'); const toastTitle = await pageObjects.common.closeToast(); expect(toastTitle).to.eql(`Created rule "${alertName}"`); await pageObjects.triggersActionsUI.searchAlerts(alertName); @@ -228,16 +228,16 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const alertName = generateUniqueKey(); await defineAlwaysFiringAlert(alertName); - await testSubjects.click('saveAlertButton'); - await testSubjects.existOrFail('confirmAlertSaveModal'); - await testSubjects.click('confirmAlertSaveModal > confirmModalCancelButton'); - await testSubjects.missingOrFail('confirmAlertSaveModal'); - await find.existsByCssSelector('[data-test-subj="saveAlertButton"]:not(disabled)'); + await testSubjects.click('saveRuleButton'); + await testSubjects.existOrFail('confirmRuleSaveModal'); + await testSubjects.click('confirmRuleSaveModal > confirmModalCancelButton'); + await testSubjects.missingOrFail('confirmRuleSaveModal'); + await find.existsByCssSelector('[data-test-subj="saveRuleButton"]:not(disabled)'); - await testSubjects.click('saveAlertButton'); - await testSubjects.existOrFail('confirmAlertSaveModal'); - await testSubjects.click('confirmAlertSaveModal > confirmModalConfirmButton'); - await testSubjects.missingOrFail('confirmAlertSaveModal'); + await testSubjects.click('saveRuleButton'); + await testSubjects.existOrFail('confirmRuleSaveModal'); + await testSubjects.click('confirmRuleSaveModal > confirmModalConfirmButton'); + await testSubjects.missingOrFail('confirmRuleSaveModal'); const toastTitle = await pageObjects.common.closeToast(); expect(toastTitle).to.eql(`Created rule "${alertName}"`); @@ -258,15 +258,15 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { it('should show discard confirmation before closing flyout without saving', async () => { await pageObjects.triggersActionsUI.clickCreateAlertButton(); - await testSubjects.click('cancelSaveAlertButton'); - await testSubjects.missingOrFail('confirmAlertCloseModal'); + await testSubjects.click('cancelSaveRuleButton'); + await testSubjects.missingOrFail('confirmRuleCloseModal'); await pageObjects.triggersActionsUI.clickCreateAlertButton(); await testSubjects.setValue('intervalInput', '10'); - await testSubjects.click('cancelSaveAlertButton'); - await testSubjects.existOrFail('confirmAlertCloseModal'); - await testSubjects.click('confirmAlertCloseModal > confirmModalCancelButton'); - await testSubjects.missingOrFail('confirmAlertCloseModal'); + await testSubjects.click('cancelSaveRuleButton'); + await testSubjects.existOrFail('confirmRuleCloseModal'); + await testSubjects.click('confirmRuleCloseModal > confirmModalCancelButton'); + await testSubjects.missingOrFail('confirmRuleCloseModal'); }); it('should successfully test valid es_query alert', async () => { @@ -281,9 +281,9 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await testSubjects.existOrFail('testQuerySuccess'); await testSubjects.missingOrFail('testQueryError'); - await testSubjects.click('cancelSaveAlertButton'); - await testSubjects.existOrFail('confirmAlertCloseModal'); - await testSubjects.click('confirmAlertCloseModal > confirmModalConfirmButton'); + await testSubjects.click('cancelSaveRuleButton'); + await testSubjects.existOrFail('confirmRuleCloseModal'); + await testSubjects.click('confirmRuleCloseModal > confirmModalConfirmButton'); }); it('should show error when es_query is invalid', async () => { @@ -301,19 +301,19 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { it('should show all rule types on click euiFormControlLayoutClearButton', async () => { await pageObjects.triggersActionsUI.clickCreateAlertButton(); - await testSubjects.setValue('alertNameInput', 'alertName'); - const ruleTypeSearchBox = await find.byCssSelector('[data-test-subj="alertSearchField"]'); + await testSubjects.setValue('ruleNameInput', 'alertName'); + const ruleTypeSearchBox = await find.byCssSelector('[data-test-subj="ruleSearchField"]'); await ruleTypeSearchBox.type('notexisting rule type'); await ruleTypeSearchBox.pressKeys(browser.keys.ENTER); - const ruleTypes = await find.allByCssSelector('.triggersActionsUI__alertTypeNodeHeading'); + const ruleTypes = await find.allByCssSelector('.triggersActionsUI__ruleTypeNodeHeading'); expect(ruleTypes).to.have.length(0); const searchClearButton = await find.byCssSelector('.euiFormControlLayoutClearButton'); await searchClearButton.click(); const ruleTypesClearFilter = await find.allByCssSelector( - '.triggersActionsUI__alertTypeNodeHeading' + '.triggersActionsUI__ruleTypeNodeHeading' ); expect(ruleTypesClearFilter.length).to.above(0); }); diff --git a/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/alerts_list.ts b/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/alerts_list.ts index 2b45a12790107..0f6e99ccf27f3 100644 --- a/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/alerts_list.ts +++ b/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/alerts_list.ts @@ -108,7 +108,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const searchClearButton = await find.byCssSelector('.euiFormControlLayoutClearButton'); await searchClearButton.click(); await find.byCssSelector( - '.euiBasicTable[data-test-subj="alertsList"]:not(.euiBasicTable-loading)' + '.euiBasicTable[data-test-subj="rulesList"]:not(.euiBasicTable-loading)' ); const searchResultsAfterClear = await pageObjects.triggersActionsUI.getAlertsList(); expect(searchResultsAfterClear.length).to.equal(2); @@ -257,7 +257,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await testSubjects.click('collapsedItemActions'); - await testSubjects.click('deleteAlert'); + await testSubjects.click('deleteRule'); await testSubjects.existOrFail('deleteIdsConfirmation'); await testSubjects.click('deleteIdsConfirmation > confirmModalConfirmButton'); await testSubjects.missingOrFail('deleteIdsConfirmation'); @@ -365,7 +365,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await createAlert({ supertest, objectRemover }); await refreshAlertsList(); - await testSubjects.existOrFail('alertsTable-P50ColumnName'); + await testSubjects.existOrFail('rulesTable-P50ColumnName'); await testSubjects.existOrFail('P50Percentile'); await retry.try(async () => { @@ -385,7 +385,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await searchClearButton.click(); await testSubjects.missingOrFail('percentileSelectablePopover-selectable'); - await testSubjects.existOrFail('alertsTable-P95ColumnName'); + await testSubjects.existOrFail('rulesTable-P95ColumnName'); await testSubjects.existOrFail('P95Percentile'); }); }); @@ -427,8 +427,8 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const refreshResults = await pageObjects.triggersActionsUI.getAlertsListWithStatus(); expect(refreshResults.map((item: any) => item.status).sort()).to.eql(['Error', 'Ok']); }); - await testSubjects.click('alertStatusFilterButton'); - await testSubjects.click('alertStatuserrorFilerOption'); // select Error status filter + await testSubjects.click('ruleStatusFilterButton'); + await testSubjects.click('ruleStatuserrorFilerOption'); // select Error status filter await retry.try(async () => { const filterErrorOnlyResults = await pageObjects.triggersActionsUI.getAlertsListWithStatus(); @@ -453,7 +453,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }); const alertsErrorBannerWhenNoErrors = await find.allByCssSelector( - '[data-test-subj="alertsErrorBanner"]' + '[data-test-subj="rulesErrorBanner"]' ); expect(alertsErrorBannerWhenNoErrors).to.have.length(0); @@ -461,7 +461,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await retry.try(async () => { await refreshAlertsList(); const alertsErrorBannerExistErrors = await find.allByCssSelector( - '[data-test-subj="alertsErrorBanner"]' + '[data-test-subj="rulesErrorBanner"]' ); expect(alertsErrorBannerExistErrors).to.have.length(1); expect( @@ -472,21 +472,21 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }); await refreshAlertsList(); - expect(await testSubjects.getVisibleText('totalAlertsCount')).to.be('Showing: 2 of 2 rules.'); - expect(await testSubjects.getVisibleText('totalActiveAlertsCount')).to.be('Active: 0'); - expect(await testSubjects.getVisibleText('totalOkAlertsCount')).to.be('Ok: 1'); - expect(await testSubjects.getVisibleText('totalErrorAlertsCount')).to.be('Error: 1'); - expect(await testSubjects.getVisibleText('totalPendingAlertsCount')).to.be('Pending: 0'); - expect(await testSubjects.getVisibleText('totalUnknownAlertsCount')).to.be('Unknown: 0'); + expect(await testSubjects.getVisibleText('totalRulesCount')).to.be('Showing: 2 of 2 rules.'); + expect(await testSubjects.getVisibleText('totalActiveRulesCount')).to.be('Active: 0'); + expect(await testSubjects.getVisibleText('totalOkRulesCount')).to.be('Ok: 1'); + expect(await testSubjects.getVisibleText('totalErrorRulesCount')).to.be('Error: 1'); + expect(await testSubjects.getVisibleText('totalPendingRulesCount')).to.be('Pending: 0'); + expect(await testSubjects.getVisibleText('totalUnknownRulesCount')).to.be('Unknown: 0'); }); it('should filter alerts by the alert type', async () => { await createAlert({ supertest, objectRemover }); const failingAlert = await createFailingAlert({ supertest, objectRemover }); await refreshAlertsList(); - await testSubjects.click('alertTypeFilterButton'); - expect(await (await testSubjects.find('alertType0Group')).getVisibleText()).to.eql('Alerts'); - await testSubjects.click('alertTypetest.failingFilterOption'); + await testSubjects.click('ruleTypeFilterButton'); + expect(await (await testSubjects.find('ruleType0Group')).getVisibleText()).to.eql('Alerts'); + await testSubjects.click('ruleTypetest.failingFilterOption'); await retry.try(async () => { const filterFailingAlertOnlyResults = await pageObjects.triggersActionsUI.getAlertsList(); @@ -529,7 +529,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { expect(filterWithSlackOnlyResults[0].interval).to.equal('1 min'); expect(filterWithSlackOnlyResults[0].duration).to.match(/\d{2,}:\d{2}/); }); - await testSubjects.click('alertTypeFilterButton'); + await testSubjects.click('ruleTypeFilterButton'); // de-select action type filter await testSubjects.click('actionTypeFilterButton'); diff --git a/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/details.ts b/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/details.ts index d350e88bcf248..b280e9a3e78c5 100644 --- a/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/details.ts +++ b/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/details.ts @@ -124,7 +124,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await pageObjects.header.waitUntilLoadingHasFinished(); // Verify content - await testSubjects.existOrFail('alertsList'); + await testSubjects.existOrFail('rulesList'); // click on first alert await pageObjects.triggersActionsUI.clickOnAlertInAlertsList(rule.name); @@ -260,20 +260,20 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await pageObjects.header.waitUntilLoadingHasFinished(); // Verify content - await testSubjects.existOrFail('alertsList'); + await testSubjects.existOrFail('rulesList'); // click on first rule await pageObjects.triggersActionsUI.clickOnAlertInAlertsList(ruleName); - const editButton = await testSubjects.find('openEditAlertFlyoutButton'); + const editButton = await testSubjects.find('openEditRuleFlyoutButton'); await editButton.click(); expect(await testSubjects.exists('hasActionsDisabled')).to.eql(false); - await testSubjects.setValue('alertNameInput', updatedRuleName, { + await testSubjects.setValue('ruleNameInput', updatedRuleName, { clearWithKeyboard: true, }); - await find.clickByCssSelector('[data-test-subj="saveEditedAlertButton"]:not(disabled)'); + await find.clickByCssSelector('[data-test-subj="saveEditedRuleButton"]:not(disabled)'); const toastTitle = await pageObjects.common.closeToast(); expect(toastTitle).to.eql(`Updated '${updatedRuleName}'`); @@ -291,26 +291,26 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await pageObjects.header.waitUntilLoadingHasFinished(); // Verify content - await testSubjects.existOrFail('alertsList'); + await testSubjects.existOrFail('rulesList'); // click on first rule await pageObjects.triggersActionsUI.clickOnAlertInAlertsList(updatedRuleName); - const editButton = await testSubjects.find('openEditAlertFlyoutButton'); + const editButton = await testSubjects.find('openEditRuleFlyoutButton'); await editButton.click(); - await testSubjects.setValue('alertNameInput', uuid.v4(), { + await testSubjects.setValue('ruleNameInput', uuid.v4(), { clearWithKeyboard: true, }); - await testSubjects.click('cancelSaveEditedAlertButton'); - await testSubjects.existOrFail('confirmAlertCloseModal'); - await testSubjects.click('confirmAlertCloseModal > confirmModalConfirmButton'); - await find.waitForDeletedByCssSelector('[data-test-subj="cancelSaveEditedAlertButton"]'); + await testSubjects.click('cancelSaveEditedRuleButton'); + await testSubjects.existOrFail('confirmRuleCloseModal'); + await testSubjects.click('confirmRuleCloseModal > confirmModalConfirmButton'); + await find.waitForDeletedByCssSelector('[data-test-subj="cancelSaveEditedRuleButton"]'); await editButton.click(); - const nameInputAfterCancel = await testSubjects.find('alertNameInput'); + const nameInputAfterCancel = await testSubjects.find('ruleNameInput'); const textAfterCancel = await nameInputAfterCancel.getAttribute('value'); expect(textAfterCancel).to.eql(updatedRuleName); }); @@ -345,7 +345,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await pageObjects.header.waitUntilLoadingHasFinished(); // verify content - await testSubjects.existOrFail('alertsList'); + await testSubjects.existOrFail('rulesList'); // delete connector await pageObjects.triggersActionsUI.changeTabs('connectorsTab'); @@ -362,7 +362,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await pageObjects.triggersActionsUI.changeTabs('rulesTab'); await pageObjects.triggersActionsUI.clickOnAlertInAlertsList(rule.name); - const editButton = await testSubjects.find('openEditAlertFlyoutButton'); + const editButton = await testSubjects.find('openEditRuleFlyoutButton'); await editButton.click(); expect(await testSubjects.exists('hasActionsDisabled')).to.eql(false); @@ -409,7 +409,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await pageObjects.header.waitUntilLoadingHasFinished(); // verify content - await testSubjects.existOrFail('alertsList'); + await testSubjects.existOrFail('rulesList'); // delete connector await pageObjects.triggersActionsUI.changeTabs('connectorsTab'); @@ -426,7 +426,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await pageObjects.triggersActionsUI.changeTabs('rulesTab'); await pageObjects.triggersActionsUI.clickOnAlertInAlertsList(alert.name); - const editButton = await testSubjects.find('openEditAlertFlyoutButton'); + const editButton = await testSubjects.find('openEditRuleFlyoutButton'); await editButton.click(); expect(await testSubjects.exists('hasActionsDisabled')).to.eql(false); @@ -479,7 +479,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await pageObjects.header.waitUntilLoadingHasFinished(); // Verify content - await testSubjects.existOrFail('alertsList'); + await testSubjects.existOrFail('rulesList'); // click on first rule await pageObjects.triggersActionsUI.clickOnAlertInAlertsList(rule.name); @@ -501,7 +501,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await pageObjects.header.waitUntilLoadingHasFinished(); // Verify content - await testSubjects.existOrFail('alertsList'); + await testSubjects.existOrFail('rulesList'); // click on first rule await pageObjects.triggersActionsUI.clickOnAlertInAlertsList(rule.name); @@ -527,7 +527,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await pageObjects.header.waitUntilLoadingHasFinished(); // Verify content - await testSubjects.existOrFail('alertsList'); + await testSubjects.existOrFail('rulesList'); // click on first rule await pageObjects.triggersActionsUI.clickOnAlertInAlertsList(rule.name); @@ -735,7 +735,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await pageObjects.header.waitUntilLoadingHasFinished(); // Verify content - await testSubjects.existOrFail('alertsList'); + await testSubjects.existOrFail('rulesList'); // click on first rule await pageObjects.triggersActionsUI.clickOnAlertInAlertsList(rule.name); diff --git a/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/home_page.ts b/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/home_page.ts index 8ebb720930364..255a0d6c09bee 100644 --- a/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/home_page.ts +++ b/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/home_page.ts @@ -79,7 +79,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { expect(url).to.contain(`/rules`); // Verify content - await testSubjects.existOrFail('alertsList'); + await testSubjects.existOrFail('rulesList'); }); it('navigates to an alert details page', async () => { @@ -103,7 +103,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await pageObjects.header.waitUntilLoadingHasFinished(); // Verify content - await testSubjects.existOrFail('alertsList'); + await testSubjects.existOrFail('rulesList'); // click on first alert await pageObjects.triggersActionsUI.clickOnAlertInAlertsList(createdAlert.name); diff --git a/x-pack/test/functional_with_es_ssl/apps/uptime/alert_flyout.ts b/x-pack/test/functional_with_es_ssl/apps/uptime/alert_flyout.ts index 1d8a172e57b78..2ad2da6d227c2 100644 --- a/x-pack/test/functional_with_es_ssl/apps/uptime/alert_flyout.ts +++ b/x-pack/test/functional_with_es_ssl/apps/uptime/alert_flyout.ts @@ -88,7 +88,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }); it('can save alert', async () => { - await alerts.clickSaveAlertButton(); + await alerts.clickSaveRuleButton(); await alerts.clickSaveAlertsConfirmButton(); await pageObjects.common.closeToast(); }); @@ -178,7 +178,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }); it('can save alert', async () => { - await alerts.clickSaveAlertButton(); + await alerts.clickSaveRuleButton(); await alerts.clickSaveAlertsConfirmButton(); await pageObjects.common.closeToast(); }); diff --git a/x-pack/test/functional_with_es_ssl/page_objects/rule_details.ts b/x-pack/test/functional_with_es_ssl/page_objects/rule_details.ts index 9e958d4207e56..01d7c24be2f41 100644 --- a/x-pack/test/functional_with_es_ssl/page_objects/rule_details.ts +++ b/x-pack/test/functional_with_es_ssl/page_objects/rule_details.ts @@ -16,10 +16,10 @@ export function RuleDetailsPageProvider({ getService }: FtrProviderContext) { return { async getHeadingText() { - return await testSubjects.getVisibleText('alertDetailsTitle'); + return await testSubjects.getVisibleText('ruleDetailsTitle'); }, async getRuleType() { - return await testSubjects.getVisibleText('alertTypeLabel'); + return await testSubjects.getVisibleText('ruleTypeLabel'); }, async getActionsLabels() { return { @@ -98,20 +98,20 @@ export function RuleDetailsPageProvider({ getService }: FtrProviderContext) { }, async isViewInAppDisabled() { await retry.try(async () => { - const viewInAppButton = await testSubjects.find(`alertDetails-viewInApp`); + const viewInAppButton = await testSubjects.find(`ruleDetails-viewInApp`); expect(await viewInAppButton.getAttribute('disabled')).to.eql('true'); }); return true; }, async isViewInAppEnabled() { await retry.try(async () => { - const viewInAppButton = await testSubjects.find(`alertDetails-viewInApp`); + const viewInAppButton = await testSubjects.find(`ruleDetails-viewInApp`); expect(await viewInAppButton.getAttribute('disabled')).to.not.eql('true'); }); return true; }, async clickViewInApp() { - return await testSubjects.click('alertDetails-viewInApp'); + return await testSubjects.click('ruleDetails-viewInApp'); }, async getNoOpAppTitle() { await retry.try(async () => { diff --git a/x-pack/test/functional_with_es_ssl/page_objects/triggers_actions_ui_page.ts b/x-pack/test/functional_with_es_ssl/page_objects/triggers_actions_ui_page.ts index a49873c6d47b5..c715800abd37e 100644 --- a/x-pack/test/functional_with_es_ssl/page_objects/triggers_actions_ui_page.ts +++ b/x-pack/test/functional_with_es_ssl/page_objects/triggers_actions_ui_page.ts @@ -21,17 +21,17 @@ export function TriggersActionsPageProvider({ getService }: FtrProviderContext) function getRowItemData(row: CustomCheerio, $: CustomCheerioStatic) { return { - name: $(row).findTestSubject('alertsTableCell-name').find('.euiTableCellContent').text(), + name: $(row).findTestSubject('rulesTableCell-name').find('.euiTableCellContent').text(), duration: $(row) - .findTestSubject('alertsTableCell-duration') + .findTestSubject('rulesTableCell-duration') .find('.euiTableCellContent') .text(), interval: $(row) - .findTestSubject('alertsTableCell-interval') + .findTestSubject('rulesTableCell-interval') .find('.euiTableCellContent') .text(), tags: $(row) - .findTestSubject('alertsTableCell-tagsPopover') + .findTestSubject('rulesTableCell-tagsPopover') .find('.euiTableCellContent') .text(), }; @@ -68,13 +68,13 @@ export function TriggersActionsPageProvider({ getService }: FtrProviderContext) ); }, async searchAlerts(searchText: string) { - const searchBox = await testSubjects.find('alertSearchField'); + const searchBox = await testSubjects.find('ruleSearchField'); await searchBox.click(); await searchBox.clearValue(); await searchBox.type(searchText); await searchBox.pressKeys(ENTER_KEY); await find.byCssSelector( - '.euiBasicTable[data-test-subj="alertsList"]:not(.euiBasicTable-loading)' + '.euiBasicTable[data-test-subj="rulesList"]:not(.euiBasicTable-loading)' ); }, async getConnectorsList() { @@ -96,42 +96,42 @@ export function TriggersActionsPageProvider({ getService }: FtrProviderContext) }); }, async getAlertsList() { - const table = await find.byCssSelector('[data-test-subj="alertsList"] table'); + const table = await find.byCssSelector('[data-test-subj="rulesList"] table'); const $ = await table.parseDomContent(); - return $.findTestSubjects('alert-row') + return $.findTestSubjects('rule-row') .toArray() .map((row) => { return getRowItemData(row, $); }); }, async getAlertsListWithStatus() { - const table = await find.byCssSelector('[data-test-subj="alertsList"] table'); + const table = await find.byCssSelector('[data-test-subj="rulesList"] table'); const $ = await table.parseDomContent(); - return $.findTestSubjects('alert-row') + return $.findTestSubjects('rule-row') .toArray() .map((row) => { const rowItem = getRowItemData(row, $); return { ...rowItem, status: $(row) - .findTestSubject('alertsTableCell-status') + .findTestSubject('rulesTableCell-status') .find('.euiTableCellContent') .text(), }; }); }, async isAlertsListDisplayed() { - const table = await find.byCssSelector('[data-test-subj="alertsList"] table'); + const table = await find.byCssSelector('[data-test-subj="rulesList"] table'); return table.isDisplayed(); }, async isAnEmptyAlertsListDisplayed() { await retry.try(async () => { - const table = await find.byCssSelector('[data-test-subj="alertsList"] table'); + const table = await find.byCssSelector('[data-test-subj="rulesList"] table'); const $ = await table.parseDomContent(); - const rows = $.findTestSubjects('alert-row').toArray(); + const rows = $.findTestSubjects('rule-row').toArray(); expect(rows.length).to.eql(0); const emptyRow = await find.byCssSelector( - '[data-test-subj="alertsList"] table .euiTableRow' + '[data-test-subj="rulesList"] table .euiTableRow' ); expect(await emptyRow.getVisibleText()).to.eql('No items found'); }); @@ -139,7 +139,7 @@ export function TriggersActionsPageProvider({ getService }: FtrProviderContext) }, async clickOnAlertInAlertsList(name: string) { await this.searchAlerts(name); - await find.clickDisplayedByCssSelector(`[data-test-subj="alertsList"] [title="${name}"]`); + await find.clickDisplayedByCssSelector(`[data-test-subj="rulesList"] [title="${name}"]`); }, async changeTabs(tab: 'rulesTab' | 'connectorsTab') { await testSubjects.click(tab); @@ -150,16 +150,16 @@ export function TriggersActionsPageProvider({ getService }: FtrProviderContext) }, async clickCreateAlertButton() { const createBtn = await find.byCssSelector( - '[data-test-subj="createAlertButton"],[data-test-subj="createFirstAlertButton"]' + '[data-test-subj="createRuleButton"],[data-test-subj="createFirstRuleButton"]' ); await createBtn.click(); }, async setAlertName(value: string) { - await testSubjects.setValue('alertNameInput', value); + await testSubjects.setValue('ruleNameInput', value); await this.assertAlertName(value); }, async assertAlertName(expectedValue: string) { - const actualValue = await testSubjects.getAttribute('alertNameInput', 'value'); + const actualValue = await testSubjects.getAttribute('ruleNameInput', 'value'); expect(actualValue).to.eql(expectedValue); }, async setAlertInterval(value: number, unit?: 's' | 'm' | 'h' | 'd') { @@ -178,8 +178,8 @@ export function TriggersActionsPageProvider({ getService }: FtrProviderContext) } }, async saveAlert() { - await testSubjects.click('saveAlertButton'); - const isConfirmationModalVisible = await testSubjects.isDisplayed('confirmAlertSaveModal'); + await testSubjects.click('saveRuleButton'); + const isConfirmationModalVisible = await testSubjects.isDisplayed('confirmRuleSaveModal'); expect(isConfirmationModalVisible).to.eql(true, 'Expect confirmation modal to be visible'); await testSubjects.click('confirmModalConfirmButton'); }, From 5142f204d84b8b11448a1c8b2630cc43e3005e43 Mon Sep 17 00:00:00 2001 From: Faisal Kanout Date: Thu, 24 Feb 2022 18:05:36 +0300 Subject: [PATCH 007/102] [RAC][UPTIME] Add {{context.reason}} as an action variable to the rule templating language (#126124) * [RAC][UPTIME] Add reason msg for status check * [RAC][UPTIME] Extract action variables into another file * Fix tests * Fix tests * Update i18n files * Fix typo in the tests * Fix tests * Cover the autoGenerated case and update its tests * Update duration anomaly tests --- .../server/lib/alerts/action_variables.ts | 43 +++++++++++++++++++ .../lib/alerts/duration_anomaly.test.ts | 31 ++++++++++++- .../server/lib/alerts/duration_anomaly.ts | 16 ++++--- .../server/lib/alerts/status_check.test.ts | 18 ++++++++ .../uptime/server/lib/alerts/status_check.ts | 31 +++++-------- 5 files changed, 111 insertions(+), 28 deletions(-) create mode 100644 x-pack/plugins/uptime/server/lib/alerts/action_variables.ts diff --git a/x-pack/plugins/uptime/server/lib/alerts/action_variables.ts b/x-pack/plugins/uptime/server/lib/alerts/action_variables.ts new file mode 100644 index 0000000000000..48fa6e45f19a8 --- /dev/null +++ b/x-pack/plugins/uptime/server/lib/alerts/action_variables.ts @@ -0,0 +1,43 @@ +/* + * 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 { i18n } from '@kbn/i18n'; + +export const MESSAGE = 'message'; +export const MONITOR_WITH_GEO = 'downMonitorsWithGeo'; +export const ALERT_REASON_MSG = 'reason'; + +export const ACTION_VARIABLES = { + [MESSAGE]: { + name: MESSAGE, + description: i18n.translate( + 'xpack.uptime.alerts.monitorStatus.actionVariables.context.message.description', + { + defaultMessage: 'A generated message summarizing the currently down monitors', + } + ), + }, + [MONITOR_WITH_GEO]: { + name: MONITOR_WITH_GEO, + description: i18n.translate( + 'xpack.uptime.alerts.monitorStatus.actionVariables.context.downMonitorsWithGeo.description', + { + defaultMessage: + 'A generated summary that shows some or all of the monitors detected as "down" by the alert', + } + ), + }, + [ALERT_REASON_MSG]: { + name: ALERT_REASON_MSG, + description: i18n.translate( + 'xpack.uptime.alerts.monitorStatus.actionVariables.context.alertReasonMessage.description', + { + defaultMessage: 'A concise description of the reason for the alert', + } + ), + }, +}; diff --git a/x-pack/plugins/uptime/server/lib/alerts/duration_anomaly.test.ts b/x-pack/plugins/uptime/server/lib/alerts/duration_anomaly.test.ts index ff6d5d42de510..208f19354a0f3 100644 --- a/x-pack/plugins/uptime/server/lib/alerts/duration_anomaly.test.ts +++ b/x-pack/plugins/uptime/server/lib/alerts/duration_anomaly.test.ts @@ -16,6 +16,7 @@ import { DynamicSettings } from '../../../common/runtime_types'; import { createRuleTypeMocks, bootstrapDependencies } from './test_utils'; import { getSeverityType } from '../../../../ml/common/util/anomaly_utils'; import { Ping } from '../../../common/runtime_types/ping'; +import { ALERT_REASON_MSG } from './action_variables'; interface MockAnomaly { severity: AnomaliesTableRecord['severity']; @@ -157,6 +158,7 @@ describe('duration anomaly alert', () => { ); const [{ value: alertInstanceMock }] = alertWithLifecycle.mock.results; expect(alertInstanceMock.replaceState).toHaveBeenCalledTimes(2); + const reasonMessages: string[] = []; mockAnomaliesResult.anomalies.forEach((anomaly, index) => { const slowestResponse = Math.round(anomaly.actualSort / 1000); const typicalResponse = Math.round(anomaly.typicalSort / 1000); @@ -180,6 +182,7 @@ Response times as high as ${slowestResponse} ms have been detected from location }, id: `${DURATION_ANOMALY.id}${index}`, }); + expect(alertInstanceMock.replaceState).toBeCalledWith({ firstCheckedAt: 'date', firstTriggeredAt: undefined, @@ -198,9 +201,35 @@ Response times as high as ${slowestResponse} ms have been detected from location slowestAnomalyResponse: `${slowestResponse} ms`, bucketSpan: anomaly.source.bucket_span, }); + const reasonMsg = `Abnormal (${getSeverityType( + anomaly.severity + )} level) response time detected on uptime-monitor with url ${ + mockPing.url?.full + } at date. Anomaly severity score is ${anomaly.severity}. + Response times as high as ${slowestResponse} ms have been detected from location ${ + anomaly.entityValue + }. Expected response time is ${typicalResponse} ms.`; + + reasonMessages.push(reasonMsg); }); expect(alertInstanceMock.scheduleActions).toHaveBeenCalledTimes(2); - expect(alertInstanceMock.scheduleActions).toBeCalledWith(DURATION_ANOMALY.id); + + expect(alertInstanceMock.scheduleActions.mock.calls[0]).toMatchInlineSnapshot(` + Array [ + "xpack.uptime.alerts.actionGroups.durationAnomaly", + Object { + "${ALERT_REASON_MSG}": "${reasonMessages[0]}", + }, + ] + `); + expect(alertInstanceMock.scheduleActions.mock.calls[1]).toMatchInlineSnapshot(` + Array [ + "xpack.uptime.alerts.actionGroups.durationAnomaly", + Object { + "${ALERT_REASON_MSG}": "${reasonMessages[1]}", + }, + ] + `); }); }); }); diff --git a/x-pack/plugins/uptime/server/lib/alerts/duration_anomaly.ts b/x-pack/plugins/uptime/server/lib/alerts/duration_anomaly.ts index b2f3ca0ad6d35..1dcb91b9e5270 100644 --- a/x-pack/plugins/uptime/server/lib/alerts/duration_anomaly.ts +++ b/x-pack/plugins/uptime/server/lib/alerts/duration_anomaly.ts @@ -26,6 +26,7 @@ import { getMLJobId } from '../../../common/lib'; import { DurationAnomalyTranslations as CommonDurationAnomalyTranslations } from '../../../common/translations'; import { createUptimeESClient } from '../lib'; +import { ALERT_REASON_MSG, ACTION_VARIABLES } from './action_variables'; export type ActionGroupIds = ActionGroupIdsOf; @@ -92,7 +93,7 @@ export const durationAnomalyAlertFactory: UptimeAlertTypeFactory }, ], actionVariables: { - context: [], + context: [ACTION_VARIABLES[ALERT_REASON_MSG]], state: [...durationAnomalyTranslations.actionVariables, ...commonStateTranslations], }, isExportable: true, @@ -122,6 +123,10 @@ export const durationAnomalyAlertFactory: UptimeAlertTypeFactory anomalies.forEach((anomaly, index) => { const summary = getAnomalySummary(anomaly, monitorInfo); + const alertReasonMessage = generateAlertMessage( + CommonDurationAnomalyTranslations.defaultActionMessage, + summary + ); const alertInstance = alertWithLifecycle({ id: DURATION_ANOMALY.id + index, @@ -133,17 +138,16 @@ export const durationAnomalyAlertFactory: UptimeAlertTypeFactory 'anomaly.bucket_span.minutes': summary.bucketSpan, [ALERT_EVALUATION_VALUE]: anomaly.actualSort, [ALERT_EVALUATION_THRESHOLD]: anomaly.typicalSort, - [ALERT_REASON]: generateAlertMessage( - CommonDurationAnomalyTranslations.defaultActionMessage, - summary - ), + [ALERT_REASON]: alertReasonMessage, }, }); alertInstance.replaceState({ ...updateState(state, false), ...summary, }); - alertInstance.scheduleActions(DURATION_ANOMALY.id); + alertInstance.scheduleActions(DURATION_ANOMALY.id, { + [ALERT_REASON_MSG]: alertReasonMessage, + }); }); } diff --git a/x-pack/plugins/uptime/server/lib/alerts/status_check.test.ts b/x-pack/plugins/uptime/server/lib/alerts/status_check.test.ts index cea34b6daad96..d2e4a8dbc044e 100644 --- a/x-pack/plugins/uptime/server/lib/alerts/status_check.test.ts +++ b/x-pack/plugins/uptime/server/lib/alerts/status_check.test.ts @@ -241,6 +241,9 @@ describe('status check alert', () => { expect(alertInstanceMock.scheduleActions.mock.calls[0]).toMatchInlineSnapshot(` Array [ "xpack.uptime.alerts.actionGroups.monitorStatus", + Object { + "reason": "First from harrisburg failed 234 times in the last 15 mins. Alert when > 5.", + }, ] `); }); @@ -308,6 +311,9 @@ describe('status check alert', () => { expect(alertInstanceMock.scheduleActions.mock.calls[0]).toMatchInlineSnapshot(` Array [ "xpack.uptime.alerts.actionGroups.monitorStatus", + Object { + "reason": "First from harrisburg failed 234 times in the last 15m. Alert when > 5.", + }, ] `); }); @@ -776,15 +782,27 @@ describe('status check alert', () => { Array [ Array [ "xpack.uptime.alerts.actionGroups.monitorStatus", + Object { + "reason": "Foo from harrisburg 35 days availability is 99.28%. Alert when < 99.34%.", + }, ], Array [ "xpack.uptime.alerts.actionGroups.monitorStatus", + Object { + "reason": "Foo from fairbanks 35 days availability is 98.03%. Alert when < 99.34%.", + }, ], Array [ "xpack.uptime.alerts.actionGroups.monitorStatus", + Object { + "reason": "Unreliable from fairbanks 35 days availability is 90.92%. Alert when < 99.34%.", + }, ], Array [ "xpack.uptime.alerts.actionGroups.monitorStatus", + Object { + "reason": "no-name from fairbanks 35 days availability is 90.92%. Alert when < 99.34%.", + }, ], ] `); diff --git a/x-pack/plugins/uptime/server/lib/alerts/status_check.ts b/x-pack/plugins/uptime/server/lib/alerts/status_check.ts index aa803a45fcdce..fe93928cb7e02 100644 --- a/x-pack/plugins/uptime/server/lib/alerts/status_check.ts +++ b/x-pack/plugins/uptime/server/lib/alerts/status_check.ts @@ -36,6 +36,7 @@ import { getUptimeIndexPattern, IndexPatternTitleAndFields } from '../requests/g import { UMServerLibs, UptimeESClient, createUptimeESClient } from '../lib'; import { ActionGroupIdsOf } from '../../../../alerting/common'; import { formatDurationFromTimeUnitChar, TimeUnitChar } from '../../../../observability/common'; +import { ALERT_REASON_MSG, MESSAGE, MONITOR_WITH_GEO, ACTION_VARIABLES } from './action_variables'; export type ActionGroupIds = ActionGroupIdsOf; /** @@ -268,25 +269,9 @@ export const statusCheckAlertFactory: UptimeAlertTypeFactory = ( ], actionVariables: { context: [ - { - name: 'message', - description: i18n.translate( - 'xpack.uptime.alerts.monitorStatus.actionVariables.context.message.description', - { - defaultMessage: 'A generated message summarizing the currently down monitors', - } - ), - }, - { - name: 'downMonitorsWithGeo', - description: i18n.translate( - 'xpack.uptime.alerts.monitorStatus.actionVariables.context.downMonitorsWithGeo.description', - { - defaultMessage: - 'A generated summary that shows some or all of the monitors detected as "down" by the alert', - } - ), - }, + ACTION_VARIABLES[MESSAGE], + ACTION_VARIABLES[MONITOR_WITH_GEO], + ACTION_VARIABLES[ALERT_REASON_MSG], ], state: [...commonMonitorStateI18, ...commonStateTranslations], }, @@ -375,7 +360,9 @@ export const statusCheckAlertFactory: UptimeAlertTypeFactory = ( ...updateState(state, true), }); - alert.scheduleActions(MONITOR_STATUS.id); + alert.scheduleActions(MONITOR_STATUS.id, { + [ALERT_REASON_MSG]: monitorSummary.reason, + }); } return updateState(state, downMonitorsByLocation.length > 0); } @@ -432,7 +419,9 @@ export const statusCheckAlertFactory: UptimeAlertTypeFactory = ( statusMessage, }); - alert.scheduleActions(MONITOR_STATUS.id); + alert.scheduleActions(MONITOR_STATUS.id, { + [ALERT_REASON_MSG]: monitorSummary.reason, + }); }); return updateState(state, downMonitorsByLocation.length > 0); From a216279c9cdb1eec828815507c374ee0cc49bb61 Mon Sep 17 00:00:00 2001 From: Matthew Kime Date: Thu, 24 Feb 2022 09:52:54 -0600 Subject: [PATCH 008/102] disable local painless validation (#126307) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../components/field_editor/form_schema.ts | 51 +------------------ 1 file changed, 1 insertion(+), 50 deletions(-) diff --git a/src/plugins/data_view_field_editor/public/components/field_editor/form_schema.ts b/src/plugins/data_view_field_editor/public/components/field_editor/form_schema.ts index 7a15dce3af019..8d49702b48154 100644 --- a/src/plugins/data_view_field_editor/public/components/field_editor/form_schema.ts +++ b/src/plugins/data_view_field_editor/public/components/field_editor/form_schema.ts @@ -8,17 +8,8 @@ import { i18n } from '@kbn/i18n'; import { EuiComboBoxOptionOption } from '@elastic/eui'; -import type { Subscription } from 'rxjs'; -import { first } from 'rxjs/operators'; -import { PainlessLang } from '@kbn/monaco'; -import { - fieldValidators, - FieldConfig, - RuntimeType, - ValidationFunc, - ValidationCancelablePromise, -} from '../../shared_imports'; +import { fieldValidators, FieldConfig, RuntimeType, ValidationFunc } from '../../shared_imports'; import type { Context } from '../preview'; import { RUNTIME_FIELD_OPTIONS } from './constants'; @@ -32,42 +23,6 @@ const i18nTexts = { ), }; -// Validate the painless **syntax** (no need to make an HTTP request) -const painlessSyntaxValidator = () => { - let isValidatingSub: Subscription; - - return (() => { - const promise: ValidationCancelablePromise<'ERR_PAINLESS_SYNTAX'> = new Promise((resolve) => { - isValidatingSub = PainlessLang.validation$() - .pipe( - first(({ isValidating }) => { - return isValidating === false; - }) - ) - .subscribe(({ errors }) => { - const editorHasSyntaxErrors = errors.length > 0; - - if (editorHasSyntaxErrors) { - return resolve({ - message: i18nTexts.invalidScriptErrorMessage, - code: 'ERR_PAINLESS_SYNTAX', - }); - } - - resolve(undefined); - }); - }); - - promise.cancel = () => { - if (isValidatingSub) { - isValidatingSub.unsubscribe(); - } - }; - - return promise; - }) as ValidationFunc; -}; - // Validate the painless **script** const painlessScriptValidator: ValidationFunc = async ({ customData: { provider } }) => { const previewError = (await provider()) as Context['error']; @@ -131,10 +86,6 @@ export const schema = { ) ), }, - { - validator: painlessSyntaxValidator(), - isAsync: true, - }, { validator: painlessScriptValidator, isAsync: true, From f112a814dcee8c4f70c09f62f3e001371e89175d Mon Sep 17 00:00:00 2001 From: Nicolas Chaulet Date: Thu, 24 Feb 2022 10:58:38 -0500 Subject: [PATCH 009/102] [Fleet] Allow to generate API keys for logstash (#126181) --- .../plugins/fleet/common/constants/routes.ts | 1 + .../plugins/fleet/common/openapi/bundled.json | 29 ++++++++ .../plugins/fleet/common/openapi/bundled.yaml | 17 +++++ .../fleet/common/openapi/entrypoint.yaml | 2 + .../openapi/paths/logstash_api_keys.yaml | 16 +++++ .../fleet/common/types/rest_spec/output.ts | 4 ++ .../fleet/server/routes/output/handler.ts | 25 ++++++- .../fleet/server/routes/output/index.ts | 12 ++++ .../fleet/server/services/api_keys/index.ts | 32 +-------- .../services/api_keys/logstash_api_keys.ts | 70 +++++++++++++++++++ .../apis/outputs/index.js | 1 + .../apis/outputs/logstash_api_keys.ts | 65 +++++++++++++++++ 12 files changed, 242 insertions(+), 32 deletions(-) create mode 100644 x-pack/plugins/fleet/common/openapi/paths/logstash_api_keys.yaml create mode 100644 x-pack/plugins/fleet/server/services/api_keys/logstash_api_keys.ts create mode 100644 x-pack/test/fleet_api_integration/apis/outputs/logstash_api_keys.ts diff --git a/x-pack/plugins/fleet/common/constants/routes.ts b/x-pack/plugins/fleet/common/constants/routes.ts index 81108b15f4aa1..61df3b78282ca 100644 --- a/x-pack/plugins/fleet/common/constants/routes.ts +++ b/x-pack/plugins/fleet/common/constants/routes.ts @@ -74,6 +74,7 @@ export const OUTPUT_API_ROUTES = { UPDATE_PATTERN: `${API_ROOT}/outputs/{outputId}`, DELETE_PATTERN: `${API_ROOT}/outputs/{outputId}`, CREATE_PATTERN: `${API_ROOT}/outputs`, + LOGSTASH_API_KEY_PATTERN: `${API_ROOT}/logstash_api_keys`, }; // Settings API routes diff --git a/x-pack/plugins/fleet/common/openapi/bundled.json b/x-pack/plugins/fleet/common/openapi/bundled.json index bc6fd8bff0da0..6b4ba8cf233f4 100644 --- a/x-pack/plugins/fleet/common/openapi/bundled.json +++ b/x-pack/plugins/fleet/common/openapi/bundled.json @@ -2875,6 +2875,35 @@ } ] } + }, + "/logstash_api_keys": { + "post": { + "summary": "Generate Logstash API key", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "api_key": { + "type": "string" + } + } + } + } + } + } + }, + "operationId": "generate-logstash-api-key", + "parameters": [ + { + "$ref": "#/components/parameters/kbn_xsrf" + } + ] + } } }, "components": { diff --git a/x-pack/plugins/fleet/common/openapi/bundled.yaml b/x-pack/plugins/fleet/common/openapi/bundled.yaml index 50a7463029f98..6af6f93d7659f 100644 --- a/x-pack/plugins/fleet/common/openapi/bundled.yaml +++ b/x-pack/plugins/fleet/common/openapi/bundled.yaml @@ -1760,6 +1760,23 @@ paths: - item parameters: - $ref: '#/components/parameters/kbn_xsrf' + /logstash_api_keys: + post: + summary: Generate Logstash API key + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + api_key: + type: string + operationId: generate-logstash-api-key + parameters: + - $ref: '#/components/parameters/kbn_xsrf' components: securitySchemes: basicAuth: diff --git a/x-pack/plugins/fleet/common/openapi/entrypoint.yaml b/x-pack/plugins/fleet/common/openapi/entrypoint.yaml index 5ed988e8c2a81..4d51beeb40a2e 100644 --- a/x-pack/plugins/fleet/common/openapi/entrypoint.yaml +++ b/x-pack/plugins/fleet/common/openapi/entrypoint.yaml @@ -104,6 +104,8 @@ paths: $ref: paths/outputs.yaml /outputs/{outputId}: $ref: paths/outputs@{output_id}.yaml + /logstash_api_keys: + $ref: paths/logstash_api_keys.yaml components: securitySchemes: basicAuth: diff --git a/x-pack/plugins/fleet/common/openapi/paths/logstash_api_keys.yaml b/x-pack/plugins/fleet/common/openapi/paths/logstash_api_keys.yaml new file mode 100644 index 0000000000000..e8a22be9d8afe --- /dev/null +++ b/x-pack/plugins/fleet/common/openapi/paths/logstash_api_keys.yaml @@ -0,0 +1,16 @@ +post: + summary: Generate Logstash API key + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + api_key: + type: string + operationId: generate-logstash-api-key + parameters: + - $ref: ../components/headers/kbn_xsrf.yaml diff --git a/x-pack/plugins/fleet/common/types/rest_spec/output.ts b/x-pack/plugins/fleet/common/types/rest_spec/output.ts index 9a5001a3af10b..40a00e8df2191 100644 --- a/x-pack/plugins/fleet/common/types/rest_spec/output.ts +++ b/x-pack/plugins/fleet/common/types/rest_spec/output.ts @@ -58,3 +58,7 @@ export interface PutOutputResponse { } export type GetOutputsResponse = ListResult; + +export interface PostLogstashApiKeyResponse { + api_key: string; +} diff --git a/x-pack/plugins/fleet/server/routes/output/handler.ts b/x-pack/plugins/fleet/server/routes/output/handler.ts index 6de9fe1204f1c..d4372c22f32de 100644 --- a/x-pack/plugins/fleet/server/routes/output/handler.ts +++ b/x-pack/plugins/fleet/server/routes/output/handler.ts @@ -18,10 +18,12 @@ import type { DeleteOutputResponse, GetOneOutputResponse, GetOutputsResponse, + PostLogstashApiKeyResponse, } from '../../../common'; import { outputService } from '../../services/output'; -import { defaultIngestErrorHandler } from '../../errors'; +import { defaultIngestErrorHandler, FleetUnauthorizedError } from '../../errors'; import { agentPolicyService } from '../../services'; +import { generateLogstashApiKey, canCreateLogstashApiKey } from '../../services/api_keys'; export const getOutputsHandler: RequestHandler = async (context, request, response) => { const soClient = context.core.savedObjects.client; @@ -142,3 +144,24 @@ export const deleteOutputHandler: RequestHandler< return defaultIngestErrorHandler({ error, response }); } }; + +export const postLogstashApiKeyHandler: RequestHandler = async (context, request, response) => { + const esClient = context.core.elasticsearch.client.asCurrentUser; + try { + const hasCreatePrivileges = await canCreateLogstashApiKey(esClient); + if (!hasCreatePrivileges) { + throw new FleetUnauthorizedError('Missing permissions to create logstash API key'); + } + + const apiKey = await generateLogstashApiKey(esClient); + + const body: PostLogstashApiKeyResponse = { + // Logstash expect the key to be formatted like this id:key + api_key: `${apiKey.id}:${apiKey.api_key}`, + }; + + return response.ok({ body }); + } catch (error) { + return defaultIngestErrorHandler({ error, response }); + } +}; diff --git a/x-pack/plugins/fleet/server/routes/output/index.ts b/x-pack/plugins/fleet/server/routes/output/index.ts index b9dfb1f7f742b..f74c1bb88aeb0 100644 --- a/x-pack/plugins/fleet/server/routes/output/index.ts +++ b/x-pack/plugins/fleet/server/routes/output/index.ts @@ -21,6 +21,7 @@ import { getOutputsHandler, postOuputHandler, putOuputHandler, + postLogstashApiKeyHandler, } from './handler'; export const registerRoutes = (router: FleetAuthzRouter) => { @@ -76,4 +77,15 @@ export const registerRoutes = (router: FleetAuthzRouter) => { }, deleteOutputHandler ); + + router.post( + { + path: OUTPUT_API_ROUTES.LOGSTASH_API_KEY_PATTERN, + validate: false, + fleetAuthz: { + fleet: { all: true }, + }, + }, + postLogstashApiKeyHandler + ); }; diff --git a/x-pack/plugins/fleet/server/services/api_keys/index.ts b/x-pack/plugins/fleet/server/services/api_keys/index.ts index c781b2d01943f..7b96d71c7ac9c 100644 --- a/x-pack/plugins/fleet/server/services/api_keys/index.ts +++ b/x-pack/plugins/fleet/server/services/api_keys/index.ts @@ -5,36 +5,6 @@ * 2.0. */ -import type { KibanaRequest } from 'src/core/server'; - export { invalidateAPIKeys } from './security'; +export { generateLogstashApiKey, canCreateLogstashApiKey } from './logstash_api_keys'; export * from './enrollment_api_key'; - -export function parseApiKeyFromHeaders(headers: KibanaRequest['headers']) { - const authorizationHeader = headers.authorization; - - if (!authorizationHeader) { - throw new Error('Authorization header must be set'); - } - - if (Array.isArray(authorizationHeader)) { - throw new Error('Authorization header must be `string` not `string[]`'); - } - - if (!authorizationHeader.startsWith('ApiKey ')) { - throw new Error('Authorization header is malformed'); - } - - const apiKey = authorizationHeader.split(' ')[1]; - - return parseApiKey(apiKey); -} - -export function parseApiKey(apiKey: string) { - const apiKeyId = Buffer.from(apiKey, 'base64').toString('utf8').split(':')[0]; - - return { - apiKey, - apiKeyId, - }; -} diff --git a/x-pack/plugins/fleet/server/services/api_keys/logstash_api_keys.ts b/x-pack/plugins/fleet/server/services/api_keys/logstash_api_keys.ts new file mode 100644 index 0000000000000..d55aa37fd5150 --- /dev/null +++ b/x-pack/plugins/fleet/server/services/api_keys/logstash_api_keys.ts @@ -0,0 +1,70 @@ +/* + * 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 type { ElasticsearchClient } from 'src/core/server'; + +/** + * Check if an esClient has enought permission to create a valid API key for logstash + * + * @param esClient + */ +export async function canCreateLogstashApiKey(esClient: ElasticsearchClient) { + const res = await esClient.security.hasPrivileges({ + cluster: ['monitor', 'manage_own_api_key'], + index: [ + { + names: [ + 'logs-*-*', + 'metrics-*-*', + 'traces-*-*', + 'synthetics-*-*', + '.logs-endpoint.diagnostic.collection-*', + '.logs-endpoint.action.responses-*', + ], + privileges: ['auto_configure', 'create_doc'], + }, + ], + }); + + return res.has_all_requested; +} + +/** + * Generate an Elasticsearch API key to use in logstash ES output + * + * @param esClient + */ +export async function generateLogstashApiKey(esClient: ElasticsearchClient) { + const apiKey = await esClient.security.createApiKey({ + name: 'Fleet Logstash output', + metadata: { + managed_by: 'fleet', + managed: true, + type: 'logstash', + }, + role_descriptors: { + 'logstash-output': { + cluster: ['monitor'], + index: [ + { + names: [ + 'logs-*-*', + 'metrics-*-*', + 'traces-*-*', + 'synthetics-*-*', + '.logs-endpoint.diagnostic.collection-*', + '.logs-endpoint.action.responses-*', + ], + privileges: ['auto_configure', 'create_doc'], + }, + ], + }, + }, + }); + + return apiKey; +} diff --git a/x-pack/test/fleet_api_integration/apis/outputs/index.js b/x-pack/test/fleet_api_integration/apis/outputs/index.js index b799413638d47..b01c253defe76 100644 --- a/x-pack/test/fleet_api_integration/apis/outputs/index.js +++ b/x-pack/test/fleet_api_integration/apis/outputs/index.js @@ -8,5 +8,6 @@ export default function loadTests({ loadTestFile }) { describe('Output Endpoints', () => { loadTestFile(require.resolve('./crud')); + loadTestFile(require.resolve('./logstash_api_keys')); }); } diff --git a/x-pack/test/fleet_api_integration/apis/outputs/logstash_api_keys.ts b/x-pack/test/fleet_api_integration/apis/outputs/logstash_api_keys.ts new file mode 100644 index 0000000000000..316b4d09bda1b --- /dev/null +++ b/x-pack/test/fleet_api_integration/apis/outputs/logstash_api_keys.ts @@ -0,0 +1,65 @@ +/* + * 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 { FtrProviderContext } from '../../../api_integration/ftr_provider_context'; +import { getEsClientForAPIKey } from '../agents/services'; +import { testUsers } from '../test_users'; + +export default function (providerContext: FtrProviderContext) { + const { getService } = providerContext; + const supertest = getService('supertest'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + + describe('fleet_output_logstash_api_keys', async function () { + describe('POST /logstash_api_keys', () => { + it('should allow to create an api key with the right permissions', async () => { + const { body: apiKeyRes } = await supertest + .post(`/api/fleet/logstash_api_keys`) + .set('kbn-xsrf', 'xxx') + .expect(200); + + expect(apiKeyRes).to.have.keys('api_key'); + + const { body: privileges } = await getEsClientForAPIKey( + providerContext, + Buffer.from(apiKeyRes.api_key).toString('base64') + ).security.hasPrivileges( + { + body: { + cluster: ['monitor'], + index: [ + { + names: [ + 'logs-*-*', + 'metrics-*-*', + 'traces-*-*', + 'synthetics-*-*', + '.logs-endpoint.diagnostic.collection-*', + '.logs-endpoint.action.responses-*', + ], + privileges: ['auto_configure', 'create_doc'], + }, + ], + }, + }, + { meta: true } + ); + + expect(privileges.has_all_requested).to.be(true); + }); + }); + + it('should return a 400 with a user without the correct ES permissions', async () => { + await supertestWithoutAuth + .post(`/api/fleet/logstash_api_keys`) + .auth(testUsers.fleet_all_int_all.username, testUsers.fleet_all_int_all.password) + .set('kbn-xsrf', 'xxx') + .expect(400); + }); + }); +} From 28bf2aaa264543e3112e309d69bf32d9c364f687 Mon Sep 17 00:00:00 2001 From: Katerina Patticha Date: Thu, 24 Feb 2022 17:01:51 +0100 Subject: [PATCH 010/102] [APM] Revert maxNumServices to 500 (#126325) --- .../server/routes/services/__snapshots__/queries.test.ts.snap | 4 ++-- .../server/routes/services/get_services/get_services_items.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/x-pack/plugins/apm/server/routes/services/__snapshots__/queries.test.ts.snap b/x-pack/plugins/apm/server/routes/services/__snapshots__/queries.test.ts.snap index 4014f2a4a2acc..00ec21b4ef3d9 100644 --- a/x-pack/plugins/apm/server/routes/services/__snapshots__/queries.test.ts.snap +++ b/x-pack/plugins/apm/server/routes/services/__snapshots__/queries.test.ts.snap @@ -124,7 +124,7 @@ Array [ }, "terms": Object { "field": "service.name", - "size": 50, + "size": 500, }, }, }, @@ -177,7 +177,7 @@ Array [ }, "terms": Object { "field": "service.name", - "size": 50, + "size": 500, }, }, }, diff --git a/x-pack/plugins/apm/server/routes/services/get_services/get_services_items.ts b/x-pack/plugins/apm/server/routes/services/get_services/get_services_items.ts index c158f83ff5560..716fd82aefd46 100644 --- a/x-pack/plugins/apm/server/routes/services/get_services/get_services_items.ts +++ b/x-pack/plugins/apm/server/routes/services/get_services/get_services_items.ts @@ -15,7 +15,7 @@ import { mergeServiceStats } from './merge_service_stats'; export type ServicesItemsSetup = Setup; -const MAX_NUMBER_OF_SERVICES = 50; +const MAX_NUMBER_OF_SERVICES = 500; export async function getServicesItems({ environment, From bb0e70f1c40fc40cdfa9e26231ff80a19d3fd5ba Mon Sep 17 00:00:00 2001 From: Julia Bardi <90178898+juliaElastic@users.noreply.github.com> Date: Thu, 24 Feb 2022 17:35:16 +0100 Subject: [PATCH 011/102] [Fleet] added time_series_metric mapping for metric_type package field (#126322) * moved metric_type to time_series_metric mapping * added back meta.metric_type for bwc, made time_series_metric to string --- .../elasticsearch/template/template.test.ts | 50 +++++++++++-------- .../epm/elasticsearch/template/template.ts | 3 ++ 2 files changed, 31 insertions(+), 22 deletions(-) diff --git a/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/template.test.ts b/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/template.test.ts index 5d144435bbee1..7650caf73d714 100644 --- a/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/template.test.ts +++ b/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/template.test.ts @@ -714,42 +714,53 @@ describe('EPM template', () => { expect(mappings).toEqual(expectedMapping); }); - it('processes meta fields', () => { - const metaFieldLiteralYaml = ` -- name: fieldWithMetas - type: integer - unit: byte + it('tests processing metric_type field', () => { + const literalYml = ` +- name: total.norm.pct + type: scaled_float metric_type: gauge - `; - const metaFieldMapping = { + unit: percent + format: percent +`; + const expectedMapping = { properties: { - fieldWithMetas: { - type: 'long', - meta: { - metric_type: 'gauge', - unit: 'byte', + total: { + properties: { + norm: { + properties: { + pct: { + scaling_factor: 1000, + type: 'scaled_float', + meta: { + metric_type: 'gauge', + unit: 'percent', + }, + time_series_metric: 'gauge', + }, + }, + }, }, }, }, }; - const fields: Field[] = safeLoad(metaFieldLiteralYaml); + const fields: Field[] = safeLoad(literalYml); const processedFields = processFields(fields); const mappings = generateMappings(processedFields); - expect(JSON.stringify(mappings)).toEqual(JSON.stringify(metaFieldMapping)); + expect(mappings).toEqual(expectedMapping); }); - it('processes meta fields with only one meta value', () => { + it('processes meta fields', () => { const metaFieldLiteralYaml = ` - name: fieldWithMetas type: integer - metric_type: gauge + unit: byte `; const metaFieldMapping = { properties: { fieldWithMetas: { type: 'long', meta: { - metric_type: 'gauge', + unit: 'byte', }, }, }, @@ -765,16 +776,13 @@ describe('EPM template', () => { - name: groupWithMetas type: group unit: byte - metric_type: gauge fields: - name: fieldA type: integer unit: byte - metric_type: gauge - name: fieldB type: integer unit: byte - metric_type: gauge `; const metaFieldMapping = { properties: { @@ -783,14 +791,12 @@ describe('EPM template', () => { fieldA: { type: 'long', meta: { - metric_type: 'gauge', unit: 'byte', }, }, fieldB: { type: 'long', meta: { - metric_type: 'gauge', unit: 'byte', }, }, diff --git a/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/template.ts b/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/template.ts index f88f5aeb1c727..73ad218d1a9fd 100644 --- a/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/template.ts +++ b/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/template.ts @@ -132,6 +132,9 @@ export function generateMappings(fields: Field[]): IndexTemplateMappings { case 'scaled_float': fieldProps.type = 'scaled_float'; fieldProps.scaling_factor = field.scaling_factor || DEFAULT_SCALING_FACTOR; + if (field.metric_type) { + fieldProps.time_series_metric = field.metric_type; + } break; case 'text': const textMapping = generateTextMapping(field); From dceafe1d2ad829effb771eb8aa9405d47d8b5823 Mon Sep 17 00:00:00 2001 From: gchaps <33642766+gchaps@users.noreply.github.com> Date: Thu, 24 Feb 2022 08:42:13 -0800 Subject: [PATCH 012/102] [DOCS] Adds link to Document Explorer video (#126360) --- docs/discover/document-explorer.asciidoc | 15 +++++++++++++-- docs/discover/images/document-explorer.png | Bin 261127 -> 0 bytes 2 files changed, 13 insertions(+), 2 deletions(-) delete mode 100644 docs/discover/images/document-explorer.png diff --git a/docs/discover/document-explorer.asciidoc b/docs/discover/document-explorer.asciidoc index 99447a2478b3a..de7b07aa4d784 100644 --- a/docs/discover/document-explorer.asciidoc +++ b/docs/discover/document-explorer.asciidoc @@ -6,8 +6,19 @@ beta::[] *Discover* has a *Document Explorer* with resizable columns, better data sorting and comparison, and a fullscreen view. -[role="screenshot"] -image::images/document-explorer.png[Document Explorer with improved look over classic view] +++++ + + +
+++++ To use the *Document Explorer* instead of the classic document table: diff --git a/docs/discover/images/document-explorer.png b/docs/discover/images/document-explorer.png deleted file mode 100644 index 75d2826869a1d6da11105344f6b7e4fef8a92d60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 261127 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 z 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�f<^O2!t)r@1xBp>5FhD^`X;HenOX==z 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 From 15756a7e226f13fe110f55772bf2c6a15ef1cfea Mon Sep 17 00:00:00 2001 From: Dominique Clarke Date: Thu, 24 Feb 2022 12:19:58 -0500 Subject: [PATCH 013/102] [Uptime] UI Monitor Management - adjust delete modal content (#126271) * adjust delete modal content * Update x-pack/plugins/uptime/public/components/monitor_management/monitor_list/delete_monitor.test.tsx * update tests Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../monitor_management/monitor_list/actions.test.tsx | 2 +- .../monitor_management/monitor_list/actions.tsx | 5 +++-- .../monitor_list/delete_monitor.test.tsx | 7 ++++--- .../monitor_list/delete_monitor.tsx | 11 +++++++---- .../monitor_management/monitor_list/monitor_list.tsx | 10 ++++++++-- 5 files changed, 23 insertions(+), 12 deletions(-) diff --git a/x-pack/plugins/uptime/public/components/monitor_management/monitor_list/actions.test.tsx b/x-pack/plugins/uptime/public/components/monitor_management/monitor_list/actions.test.tsx index e79150a4eb79e..ec58ac7ee5010 100644 --- a/x-pack/plugins/uptime/public/components/monitor_management/monitor_list/actions.test.tsx +++ b/x-pack/plugins/uptime/public/components/monitor_management/monitor_list/actions.test.tsx @@ -15,7 +15,7 @@ describe('', () => { const onUpdate = jest.fn(); it('navigates to edit monitor flow on edit pencil', () => { - render(); + render(); expect(screen.getByLabelText('Edit monitor')).toHaveAttribute( 'href', diff --git a/x-pack/plugins/uptime/public/components/monitor_management/monitor_list/actions.tsx b/x-pack/plugins/uptime/public/components/monitor_management/monitor_list/actions.tsx index 5fa29b7cd7c56..9d84263f3701e 100644 --- a/x-pack/plugins/uptime/public/components/monitor_management/monitor_list/actions.tsx +++ b/x-pack/plugins/uptime/public/components/monitor_management/monitor_list/actions.tsx @@ -13,11 +13,12 @@ import { DeleteMonitor } from './delete_monitor'; interface Props { id: string; + name: string; isDisabled?: boolean; onUpdate: () => void; } -export const Actions = ({ id, onUpdate, isDisabled }: Props) => { +export const Actions = ({ id, name, onUpdate, isDisabled }: Props) => { const { basePath } = useContext(UptimeSettingsContext); return ( @@ -32,7 +33,7 @@ export const Actions = ({ id, onUpdate, isDisabled }: Props) => { /> - + ); diff --git a/x-pack/plugins/uptime/public/components/monitor_management/monitor_list/delete_monitor.test.tsx b/x-pack/plugins/uptime/public/components/monitor_management/monitor_list/delete_monitor.test.tsx index a5c712b6e0456..2e69196c86cff 100644 --- a/x-pack/plugins/uptime/public/components/monitor_management/monitor_list/delete_monitor.test.tsx +++ b/x-pack/plugins/uptime/public/components/monitor_management/monitor_list/delete_monitor.test.tsx @@ -26,7 +26,7 @@ describe('', () => { useFetcher.mockImplementation(originalUseFetcher); const deleteMonitor = jest.spyOn(fetchers, 'deleteMonitor'); const id = 'test-id'; - render(); + render(); expect(deleteMonitor).not.toBeCalled(); @@ -39,7 +39,8 @@ describe('', () => { it('calls set refresh when deletion is successful', () => { const id = 'test-id'; - render(); + const name = 'sample monitor'; + render(); userEvent.click(screen.getByLabelText('Delete monitor')); @@ -53,7 +54,7 @@ describe('', () => { status: FETCH_STATUS.LOADING, refetch: () => {}, }); - render(); + render(); expect(screen.getByLabelText('Deleting monitor...')).toBeInTheDocument(); }); diff --git a/x-pack/plugins/uptime/public/components/monitor_management/monitor_list/delete_monitor.tsx b/x-pack/plugins/uptime/public/components/monitor_management/monitor_list/delete_monitor.tsx index e0b706241b79a..88bace104adac 100644 --- a/x-pack/plugins/uptime/public/components/monitor_management/monitor_list/delete_monitor.tsx +++ b/x-pack/plugins/uptime/public/components/monitor_management/monitor_list/delete_monitor.tsx @@ -16,10 +16,12 @@ import { toMountPoint } from '../../../../../../../src/plugins/kibana_react/publ export const DeleteMonitor = ({ id, + name, onUpdate, isDisabled, }: { id: string; + name: string; isDisabled?: boolean; onUpdate: () => void; }) => { @@ -70,7 +72,7 @@ export const DeleteMonitor = ({ const destroyModal = ( setIsDeleteModalVisible(false)} onConfirm={onConfirmDelete} cancelButtonText={NO_LABEL} @@ -103,16 +105,17 @@ export const DeleteMonitor = ({ const DELETE_DESCRIPTION_LABEL = i18n.translate( 'xpack.uptime.monitorManagement.confirmDescriptionLabel', { - defaultMessage: 'Are you sure you want to do delete the monitor?', + defaultMessage: + 'This action will delete the monitor but keep any data collected. This action cannot be undone.', } ); const YES_LABEL = i18n.translate('xpack.uptime.monitorManagement.yesLabel', { - defaultMessage: 'Yes', + defaultMessage: 'Delete', }); const NO_LABEL = i18n.translate('xpack.uptime.monitorManagement.noLabel', { - defaultMessage: 'No', + defaultMessage: 'Cancel', }); const DELETE_MONITOR_LABEL = i18n.translate('xpack.uptime.monitorManagement.deleteMonitorLabel', { diff --git a/x-pack/plugins/uptime/public/components/monitor_management/monitor_list/monitor_list.tsx b/x-pack/plugins/uptime/public/components/monitor_management/monitor_list/monitor_list.tsx index a222070b5d9d1..5d18fdcaca6fe 100644 --- a/x-pack/plugins/uptime/public/components/monitor_management/monitor_list/monitor_list.tsx +++ b/x-pack/plugins/uptime/public/components/monitor_management/monitor_list/monitor_list.tsx @@ -179,11 +179,17 @@ export const MonitorManagementList = ({ }, { align: 'left' as const, - field: 'id', name: i18n.translate('xpack.uptime.monitorManagement.monitorList.actions', { defaultMessage: 'Actions', }), - render: (id: string) => , + render: (fields: SyntheticsMonitorWithId) => ( + + ), }, ] as Array>; From 43a2622b97c1fa73b3bdabf5bb7d0d69a8bea6ac Mon Sep 17 00:00:00 2001 From: Nicolas Chaulet Date: Thu, 24 Feb 2022 12:28:21 -0500 Subject: [PATCH 014/102] [Fleet] Fix package policy name verification on update (#126356) --- x-pack/plugins/fleet/server/services/package_policy.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/fleet/server/services/package_policy.ts b/x-pack/plugins/fleet/server/services/package_policy.ts index 1acbce4f22cd1..546ae9c6fb9ac 100644 --- a/x-pack/plugins/fleet/server/services/package_policy.ts +++ b/x-pack/plugins/fleet/server/services/package_policy.ts @@ -28,6 +28,7 @@ import { doesAgentPolicyAlreadyIncludePackage, validatePackagePolicy, validationHasErrors, + SO_SEARCH_LIMIT, } from '../../common'; import type { DeletePackagePoliciesResponse, @@ -369,9 +370,10 @@ class PackagePolicyService implements PackagePolicyServiceInterface { } // Check that the name does not exist already but exclude the current package policy const existingPoliciesWithName = await this.list(soClient, { - perPage: 1, - kuery: `${PACKAGE_POLICY_SAVED_OBJECT_TYPE}.name: "${packagePolicy.name}"`, + perPage: SO_SEARCH_LIMIT, + kuery: `${PACKAGE_POLICY_SAVED_OBJECT_TYPE}.name:"${packagePolicy.name}"`, }); + const filtered = (existingPoliciesWithName?.items || []).filter((p) => p.id !== id); if (filtered.length > 0) { From 4e238ecbe5cc83e61e114f3a898bf291a1f096dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cau=C3=AA=20Marcondes?= <55978943+cauemarcondes@users.noreply.github.com> Date: Thu, 24 Feb 2022 13:04:45 -0500 Subject: [PATCH 015/102] [APM] Make UI indices space aware (support for spaces) (#126176) * new apm indices saved object * adding some comments * fixing typo * addressing PR comments * fixing tests * addressing PR comments * fixing tests * fixing test * showing callout with space name * addressing PR changes --- .../apm/common/apm_saved_object_constants.ts | 6 +- .../app/settings/apm_indices/index.test.tsx | 37 ---- .../app/settings/apm_indices/index.tsx | 35 +++ x-pack/plugins/apm/public/plugin.ts | 2 + x-pack/plugins/apm/server/plugin.ts | 6 + .../settings/apm_indices/get_apm_indices.ts | 21 +- .../apm_indices/save_apm_indices.test.ts | 5 +- .../settings/apm_indices/save_apm_indices.ts | 16 +- .../apm/server/saved_objects/apm_indices.ts | 41 +++- ..._legacy_apm_indices_to_space_aware.test.ts | 206 ++++++++++++++++++ ...grate_legacy_apm_indices_to_space_aware.ts | 90 ++++++++ 11 files changed, 397 insertions(+), 68 deletions(-) delete mode 100644 x-pack/plugins/apm/public/components/app/settings/apm_indices/index.test.tsx create mode 100644 x-pack/plugins/apm/server/saved_objects/migrations/migrate_legacy_apm_indices_to_space_aware.test.ts create mode 100644 x-pack/plugins/apm/server/saved_objects/migrations/migrate_legacy_apm_indices_to_space_aware.ts diff --git a/x-pack/plugins/apm/common/apm_saved_object_constants.ts b/x-pack/plugins/apm/common/apm_saved_object_constants.ts index 7d9e571242afe..17c5a802a440a 100644 --- a/x-pack/plugins/apm/common/apm_saved_object_constants.ts +++ b/x-pack/plugins/apm/common/apm_saved_object_constants.ts @@ -8,9 +8,9 @@ // the types have to match the names of the saved object mappings // in /x-pack/plugins/apm/mappings.json -// APM indices -export const APM_INDICES_SAVED_OBJECT_TYPE = 'apm-indices'; -export const APM_INDICES_SAVED_OBJECT_ID = 'apm-indices'; +// APM index settings +export const APM_INDEX_SETTINGS_SAVED_OBJECT_TYPE = 'apm-indices'; +export const APM_INDEX_SETTINGS_SAVED_OBJECT_ID = 'apm-indices'; // APM telemetry export const APM_TELEMETRY_SAVED_OBJECT_TYPE = 'apm-telemetry'; diff --git a/x-pack/plugins/apm/public/components/app/settings/apm_indices/index.test.tsx b/x-pack/plugins/apm/public/components/app/settings/apm_indices/index.test.tsx deleted file mode 100644 index 1b19bb5860b2c..0000000000000 --- a/x-pack/plugins/apm/public/components/app/settings/apm_indices/index.test.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 { render } from '@testing-library/react'; -import React from 'react'; -import { ApmIndices } from '.'; -import * as hooks from '../../../../hooks/use_fetcher'; -import { MockApmPluginContextWrapper } from '../../../../context/apm_plugin/mock_apm_plugin_context'; - -describe('ApmIndices', () => { - it('should not get stuck in infinite loop', () => { - const spy = jest.spyOn(hooks, 'useFetcher').mockReturnValue({ - data: undefined, - status: hooks.FETCH_STATUS.LOADING, - refetch: jest.fn(), - }); - const { getByText } = render( - - - - ); - - expect(getByText('Indices')).toMatchInlineSnapshot(` -

- Indices -

- `); - - expect(spy).toHaveBeenCalledTimes(2); - }); -}); diff --git a/x-pack/plugins/apm/public/components/app/settings/apm_indices/index.tsx b/x-pack/plugins/apm/public/components/app/settings/apm_indices/index.tsx index 1a1654e22eb19..383be90168a10 100644 --- a/x-pack/plugins/apm/public/components/app/settings/apm_indices/index.tsx +++ b/x-pack/plugins/apm/public/components/app/settings/apm_indices/index.tsx @@ -8,6 +8,7 @@ import { EuiButton, EuiButtonEmpty, + EuiCallOut, EuiFieldText, EuiFlexGroup, EuiFlexItem, @@ -19,9 +20,12 @@ import { EuiToolTip, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n-react'; import React, { useEffect, useState } from 'react'; +import { useKibana } from '../../../../../../../../src/plugins/kibana_react/public'; import { useApmPluginContext } from '../../../../context/apm_plugin/use_apm_plugin_context'; import { useFetcher } from '../../../../hooks/use_fetcher'; +import { ApmPluginStartDeps } from '../../../../plugin'; import { clearCache } from '../../../../services/rest/call_api'; import { APIReturnType, @@ -93,6 +97,8 @@ const INITIAL_STATE: ApiResponse = { apmIndexSettings: [] }; export function ApmIndices() { const { core } = useApmPluginContext(); + const { services } = useKibana(); + const { notifications, application } = core; const canSave = application.capabilities.apm.save; @@ -108,6 +114,10 @@ export function ApmIndices() { [canSave] ); + const { data: space } = useFetcher(() => { + return services.spaces?.getActiveSpace(); + }, [services.spaces]); + useEffect(() => { setApmIndices( data.apmIndexSettings.reduce( @@ -191,6 +201,31 @@ export function ApmIndices() { + {space?.name && ( + <> + + + + {space?.name}, + }} + /> + + } + /> + + + + + )} + diff --git a/x-pack/plugins/apm/public/plugin.ts b/x-pack/plugins/apm/public/plugin.ts index 952df64da840a..75c3c290512d8 100644 --- a/x-pack/plugins/apm/public/plugin.ts +++ b/x-pack/plugins/apm/public/plugin.ts @@ -53,6 +53,7 @@ import { getLazyAPMPolicyCreateExtension } from './components/fleet_integration/ import { getLazyAPMPolicyEditExtension } from './components/fleet_integration/lazy_apm_policy_edit_extension'; import { featureCatalogueEntry } from './feature_catalogue_entry'; import type { SecurityPluginStart } from '../../security/public'; +import { SpacesPluginStart } from '../../spaces/public'; export type ApmPluginSetup = ReturnType; @@ -82,6 +83,7 @@ export interface ApmPluginStartDeps { observability: ObservabilityPublicStart; fleet?: FleetStart; security?: SecurityPluginStart; + spaces?: SpacesPluginStart; } const servicesTitle = i18n.translate('xpack.apm.navigation.servicesTitle', { diff --git a/x-pack/plugins/apm/server/plugin.ts b/x-pack/plugins/apm/server/plugin.ts index e5ad2cb6c6c1f..34a09fe57a05b 100644 --- a/x-pack/plugins/apm/server/plugin.ts +++ b/x-pack/plugins/apm/server/plugin.ts @@ -48,6 +48,7 @@ import { TRANSACTION_TYPE, } from '../common/elasticsearch_fieldnames'; import { tutorialProvider } from './tutorial'; +import { migrateLegacyAPMIndicesToSpaceAware } from './saved_objects/migrations/migrate_legacy_apm_indices_to_space_aware'; export class APMPlugin implements @@ -247,6 +248,11 @@ export class APMPlugin config: this.currentConfig, logger: this.logger, }); + + migrateLegacyAPMIndicesToSpaceAware({ + coreStart: core, + logger: this.logger, + }); } public stop() {} diff --git a/x-pack/plugins/apm/server/routes/settings/apm_indices/get_apm_indices.ts b/x-pack/plugins/apm/server/routes/settings/apm_indices/get_apm_indices.ts index 450ce3fa18dad..7d98502ee5d93 100644 --- a/x-pack/plugins/apm/server/routes/settings/apm_indices/get_apm_indices.ts +++ b/x-pack/plugins/apm/server/routes/settings/apm_indices/get_apm_indices.ts @@ -7,13 +7,14 @@ import { SavedObjectsClient } from 'src/core/server'; import { - APM_INDICES_SAVED_OBJECT_TYPE, - APM_INDICES_SAVED_OBJECT_ID, + APM_INDEX_SETTINGS_SAVED_OBJECT_TYPE, + APM_INDEX_SETTINGS_SAVED_OBJECT_ID, } from '../../../../common/apm_saved_object_constants'; import { APMConfig } from '../../..'; import { APMRouteHandlerResources } from '../../typings'; import { withApmSpan } from '../../../utils/with_apm_span'; import { ApmIndicesConfig } from '../../../../../observability/common/typings'; +import { APMIndices } from '../../../saved_objects/apm_indices'; export type { ApmIndicesConfig }; @@ -22,13 +23,15 @@ type ISavedObjectsClient = Pick; async function getApmIndicesSavedObject( savedObjectsClient: ISavedObjectsClient ) { - const apmIndices = await withApmSpan('get_apm_indices_saved_object', () => - savedObjectsClient.get>( - APM_INDICES_SAVED_OBJECT_TYPE, - APM_INDICES_SAVED_OBJECT_ID - ) + const apmIndicesSavedObject = await withApmSpan( + 'get_apm_indices_saved_object', + () => + savedObjectsClient.get>( + APM_INDEX_SETTINGS_SAVED_OBJECT_TYPE, + APM_INDEX_SETTINGS_SAVED_OBJECT_ID + ) ); - return apmIndices.attributes; + return apmIndicesSavedObject.attributes.apmIndices; } export function getApmIndicesConfig(config: APMConfig): ApmIndicesConfig { @@ -90,6 +93,6 @@ export async function getApmIndexSettings({ return apmIndices.map((configurationName) => ({ configurationName, defaultValue: apmIndicesConfig[configurationName], // value defined in kibana[.dev].yml - savedValue: apmIndicesSavedObject[configurationName], // value saved via Saved Objects service + savedValue: apmIndicesSavedObject?.[configurationName], // value saved via Saved Objects service })); } diff --git a/x-pack/plugins/apm/server/routes/settings/apm_indices/save_apm_indices.test.ts b/x-pack/plugins/apm/server/routes/settings/apm_indices/save_apm_indices.test.ts index bce6857aa4ff2..0c91bccb42999 100644 --- a/x-pack/plugins/apm/server/routes/settings/apm_indices/save_apm_indices.test.ts +++ b/x-pack/plugins/apm/server/routes/settings/apm_indices/save_apm_indices.test.ts @@ -26,7 +26,10 @@ describe('saveApmIndices', () => { await saveApmIndices(savedObjectsClient, apmIndices); expect(savedObjectsClient.create).toHaveBeenCalledWith( expect.any(String), - { settingA: 'aa', settingF: 'ff', settingG: 'gg' }, + { + apmIndices: { settingA: 'aa', settingF: 'ff', settingG: 'gg' }, + isSpaceAware: true, + }, expect.any(Object) ); }); diff --git a/x-pack/plugins/apm/server/routes/settings/apm_indices/save_apm_indices.ts b/x-pack/plugins/apm/server/routes/settings/apm_indices/save_apm_indices.ts index 14a5830d8246c..2bd4273910bbf 100644 --- a/x-pack/plugins/apm/server/routes/settings/apm_indices/save_apm_indices.ts +++ b/x-pack/plugins/apm/server/routes/settings/apm_indices/save_apm_indices.ts @@ -7,9 +7,10 @@ import { SavedObjectsClientContract } from '../../../../../../../src/core/server'; import { - APM_INDICES_SAVED_OBJECT_TYPE, - APM_INDICES_SAVED_OBJECT_ID, + APM_INDEX_SETTINGS_SAVED_OBJECT_TYPE, + APM_INDEX_SETTINGS_SAVED_OBJECT_ID, } from '../../../../common/apm_saved_object_constants'; +import { APMIndices } from '../../../saved_objects/apm_indices'; import { withApmSpan } from '../../../utils/with_apm_span'; import { ApmIndicesConfig } from './get_apm_indices'; @@ -18,13 +19,10 @@ export function saveApmIndices( apmIndices: Partial ) { return withApmSpan('save_apm_indices', () => - savedObjectsClient.create( - APM_INDICES_SAVED_OBJECT_TYPE, - removeEmpty(apmIndices), - { - id: APM_INDICES_SAVED_OBJECT_ID, - overwrite: true, - } + savedObjectsClient.create( + APM_INDEX_SETTINGS_SAVED_OBJECT_TYPE, + { apmIndices: removeEmpty(apmIndices), isSpaceAware: true }, + { id: APM_INDEX_SETTINGS_SAVED_OBJECT_ID, overwrite: true } ) ); } diff --git a/x-pack/plugins/apm/server/saved_objects/apm_indices.ts b/x-pack/plugins/apm/server/saved_objects/apm_indices.ts index 4aa6c4953056a..4a3b0d32e9667 100644 --- a/x-pack/plugins/apm/server/saved_objects/apm_indices.ts +++ b/x-pack/plugins/apm/server/saved_objects/apm_indices.ts @@ -10,20 +10,43 @@ import { i18n } from '@kbn/i18n'; import { updateApmOssIndexPaths } from './migrations/update_apm_oss_index_paths'; import { ApmIndicesConfigName } from '..'; -const properties: { [Property in ApmIndicesConfigName]: { type: 'keyword' } } = - { - sourcemap: { type: 'keyword' }, - error: { type: 'keyword' }, - onboarding: { type: 'keyword' }, - span: { type: 'keyword' }, - transaction: { type: 'keyword' }, - metric: { type: 'keyword' }, +export interface APMIndices { + apmIndices?: { + sourcemap?: string; + error?: string; + onboarding?: string; + span?: string; + transaction?: string; + metric?: string; }; + isSpaceAware?: boolean; +} + +const properties: { + apmIndices: { + properties: { + [Property in ApmIndicesConfigName]: { type: 'keyword' }; + }; + }; + isSpaceAware: { type: 'boolean' }; +} = { + apmIndices: { + properties: { + sourcemap: { type: 'keyword' }, + error: { type: 'keyword' }, + onboarding: { type: 'keyword' }, + span: { type: 'keyword' }, + transaction: { type: 'keyword' }, + metric: { type: 'keyword' }, + }, + }, + isSpaceAware: { type: 'boolean' }, +}; export const apmIndices: SavedObjectsType = { name: 'apm-indices', hidden: false, - namespaceType: 'agnostic', + namespaceType: 'single', mappings: { properties }, management: { importableAndExportable: true, diff --git a/x-pack/plugins/apm/server/saved_objects/migrations/migrate_legacy_apm_indices_to_space_aware.test.ts b/x-pack/plugins/apm/server/saved_objects/migrations/migrate_legacy_apm_indices_to_space_aware.test.ts new file mode 100644 index 0000000000000..404e08a6b112b --- /dev/null +++ b/x-pack/plugins/apm/server/saved_objects/migrations/migrate_legacy_apm_indices_to_space_aware.test.ts @@ -0,0 +1,206 @@ +/* + * 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 type { CoreStart, Logger } from 'src/core/server'; +import { + APM_INDEX_SETTINGS_SAVED_OBJECT_ID, + APM_INDEX_SETTINGS_SAVED_OBJECT_TYPE, +} from '../../../common/apm_saved_object_constants'; +import { migrateLegacyAPMIndicesToSpaceAware } from './migrate_legacy_apm_indices_to_space_aware'; + +const loggerMock = { + debug: jest.fn(), + warn: jest.fn(), + error: jest.fn(), +} as unknown as Logger; + +describe('migrateLegacyAPMIndicesToSpaceAware', () => { + describe('when legacy APM indices is not found', () => { + const mockBulkCreate = jest.fn(); + const mockCreate = jest.fn(); + const mockFind = jest.fn(); + const core = { + savedObjects: { + createInternalRepository: jest.fn().mockReturnValue({ + get: () => { + throw new Error('BOOM'); + }, + find: mockFind, + bulkCreate: mockBulkCreate, + create: mockCreate, + }), + }, + } as unknown as CoreStart; + + it('does not save any new saved object', () => { + migrateLegacyAPMIndicesToSpaceAware({ + coreStart: core, + logger: loggerMock, + }); + expect(mockFind).not.toHaveBeenCalled(); + expect(mockBulkCreate).not.toHaveBeenCalled(); + expect(mockCreate).not.toHaveBeenCalled(); + }); + }); + + describe('when only default space is available', () => { + const mockBulkCreate = jest.fn(); + const mockCreate = jest.fn(); + const mockSpaceFind = jest.fn().mockReturnValue({ + page: 1, + per_page: 10000, + total: 3, + saved_objects: [ + { + type: 'space', + id: 'default', + attributes: { + name: 'Default', + }, + references: [], + migrationVersion: { + space: '6.6.0', + }, + coreMigrationVersion: '8.2.0', + updated_at: '2022-02-22T14:13:28.839Z', + version: 'WzI4OSwxXQ==', + score: 0, + }, + ], + }); + const core = { + savedObjects: { + createInternalRepository: jest.fn().mockReturnValue({ + get: jest.fn().mockReturnValue({ + id: 'apm-indices', + type: 'apm-indices', + namespaces: [], + updated_at: '2022-02-22T14:17:10.584Z', + version: 'WzE1OSwxXQ==', + attributes: { + transaction: 'default-apm-*', + span: 'default-apm-*', + error: 'default-apm-*', + metric: 'default-apm-*', + sourcemap: 'default-apm-*', + onboarding: 'default-apm-*', + }, + references: [], + migrationVersion: { + 'apm-indices': '7.16.0', + }, + coreMigrationVersion: '8.2.0', + }), + find: mockSpaceFind, + bulkCreate: mockBulkCreate, + create: mockCreate, + }), + }, + } as unknown as CoreStart; + it('creates new default saved object with space awareness and delete legacy', async () => { + await migrateLegacyAPMIndicesToSpaceAware({ + coreStart: core, + logger: loggerMock, + }); + expect(mockCreate).toBeCalledWith( + APM_INDEX_SETTINGS_SAVED_OBJECT_TYPE, + { + apmIndices: { + transaction: 'default-apm-*', + span: 'default-apm-*', + error: 'default-apm-*', + metric: 'default-apm-*', + sourcemap: 'default-apm-*', + onboarding: 'default-apm-*', + }, + isSpaceAware: true, + }, + { + id: APM_INDEX_SETTINGS_SAVED_OBJECT_ID, + overwrite: true, + } + ); + }); + }); + + describe('when multiple spaces are found', () => { + const mockBulkCreate = jest.fn(); + const mockCreate = jest.fn(); + + const savedObjects = [ + { id: 'default', name: 'Default' }, + { id: 'space-a', name: 'Space A' }, + { id: 'space-b', name: 'Space B' }, + ]; + const mockSpaceFind = jest.fn().mockReturnValue({ + page: 1, + per_page: 10000, + total: 3, + saved_objects: savedObjects.map(({ id, name }) => { + return { + type: 'space', + id, + attributes: { name }, + references: [], + migrationVersion: { space: '6.6.0' }, + coreMigrationVersion: '8.2.0', + updated_at: '2022-02-22T14:13:28.839Z', + version: 'WzI4OSwxXQ==', + score: 0, + }; + }), + }); + const attributes = { + transaction: 'space-apm-*', + span: 'space-apm-*', + error: 'space-apm-*', + metric: 'space-apm-*', + sourcemap: 'space-apm-*', + onboarding: 'space-apm-*', + }; + const core = { + savedObjects: { + createInternalRepository: jest.fn().mockReturnValue({ + get: jest.fn().mockReturnValue({ + id: 'apm-indices', + type: 'apm-indices', + namespaces: [], + updated_at: '2022-02-22T14:17:10.584Z', + version: 'WzE1OSwxXQ==', + attributes, + references: [], + migrationVersion: { + 'apm-indices': '7.16.0', + }, + coreMigrationVersion: '8.2.0', + }), + find: mockSpaceFind, + bulkCreate: mockBulkCreate, + create: mockCreate, + }), + }, + } as unknown as CoreStart; + it('creates multiple saved objects with space awareness and delete legacies', async () => { + await migrateLegacyAPMIndicesToSpaceAware({ + coreStart: core, + logger: loggerMock, + }); + expect(mockCreate).toBeCalled(); + expect(mockBulkCreate).toBeCalledWith( + savedObjects + .filter(({ id }) => id !== 'default') + .map(({ id }) => { + return { + type: APM_INDEX_SETTINGS_SAVED_OBJECT_TYPE, + id: APM_INDEX_SETTINGS_SAVED_OBJECT_ID, + initialNamespaces: [id], + attributes: { apmIndices: attributes, isSpaceAware: true }, + }; + }) + ); + }); + }); +}); diff --git a/x-pack/plugins/apm/server/saved_objects/migrations/migrate_legacy_apm_indices_to_space_aware.ts b/x-pack/plugins/apm/server/saved_objects/migrations/migrate_legacy_apm_indices_to_space_aware.ts new file mode 100644 index 0000000000000..130070b80ff14 --- /dev/null +++ b/x-pack/plugins/apm/server/saved_objects/migrations/migrate_legacy_apm_indices_to_space_aware.ts @@ -0,0 +1,90 @@ +/* + * 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 type { + CoreStart, + Logger, + ISavedObjectsRepository, +} from 'src/core/server'; +import { SavedObjectsErrorHelpers } from '../../../../../../src/core/server'; +import { + APM_INDEX_SETTINGS_SAVED_OBJECT_ID, + APM_INDEX_SETTINGS_SAVED_OBJECT_TYPE, +} from '../../../common/apm_saved_object_constants'; +import { ApmIndicesConfig } from '../../routes/settings/apm_indices/get_apm_indices'; +import { APMIndices } from '../apm_indices'; + +async function fetchLegacyAPMIndices(repository: ISavedObjectsRepository) { + try { + const apmIndices = await repository.get< + Partial + >(APM_INDEX_SETTINGS_SAVED_OBJECT_TYPE, APM_INDEX_SETTINGS_SAVED_OBJECT_ID); + if (apmIndices.attributes.isSpaceAware) { + // This has already been migrated to become space-aware + return null; + } + return apmIndices; + } catch (err) { + if (SavedObjectsErrorHelpers.isNotFoundError(err)) { + // This can happen if APM is not being used + return null; + } + throw err; + } +} + +export async function migrateLegacyAPMIndicesToSpaceAware({ + coreStart, + logger, +}: { + coreStart: CoreStart; + logger: Logger; +}) { + const repository = coreStart.savedObjects.createInternalRepository(['space']); + try { + // Fetch legacy APM indices + const legacyAPMIndices = await fetchLegacyAPMIndices(repository); + + if (legacyAPMIndices === null) { + return; + } + // Fetch spaces available + const spaces = await repository.find({ + type: 'space', + page: 1, + perPage: 10_000, // max number of spaces as of 8.2 + fields: ['name'], // to avoid fetching *all* fields + }); + + const savedObjectAttributes: APMIndices = { + apmIndices: legacyAPMIndices.attributes, + isSpaceAware: true, + }; + + // Calls create first to update the default space setting isSpaceAware to true + await repository.create< + Partial + >(APM_INDEX_SETTINGS_SAVED_OBJECT_TYPE, savedObjectAttributes, { + id: APM_INDEX_SETTINGS_SAVED_OBJECT_ID, + overwrite: true, + }); + + // Create new APM indices space aware for all spaces available + await repository.bulkCreate>( + spaces.saved_objects + // Skip default space since it was already updated + .filter(({ id: spaceId }) => spaceId !== 'default') + .map(({ id: spaceId }) => ({ + id: APM_INDEX_SETTINGS_SAVED_OBJECT_ID, + type: APM_INDEX_SETTINGS_SAVED_OBJECT_TYPE, + initialNamespaces: [spaceId], + attributes: savedObjectAttributes, + })) + ); + } catch (e) { + logger.error('Failed to migrate legacy APM indices object: ' + e.message); + } +} From 68ab355dc3e5d6d181b27ef1b2aaee3dd022fb8c Mon Sep 17 00:00:00 2001 From: John Dorlus Date: Thu, 24 Feb 2022 13:10:55 -0500 Subject: [PATCH 016/102] CCS Fail Test Mode (#125997) * Added the search.check_ccs_compatibility flag * Moved up the level on the logging statements for ES Args so we can debug locally. * Updated snapshots to reflect new flag that was added. --- packages/kbn-es/src/cluster.js | 5 +++-- packages/kbn-es/src/integration_tests/cluster.test.js | 2 ++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/kbn-es/src/cluster.js b/packages/kbn-es/src/cluster.js index 630a5e6567887..e8106b52d6aaf 100644 --- a/packages/kbn-es/src/cluster.js +++ b/packages/kbn-es/src/cluster.js @@ -252,6 +252,7 @@ exports.Cluster = class Cluster { const esArgs = [ 'action.destructive_requires_name=true', 'ingest.geoip.downloader.enabled=false', + 'search.check_ccs_compatibility=true', ].concat(options.esArgs || []); // Add to esArgs if ssl is enabled @@ -274,7 +275,7 @@ exports.Cluster = class Cluster { [] ); - this._log.debug('%s %s', ES_BIN, args.join(' ')); + this._log.info('%s %s', ES_BIN, args.join(' ')); let esJavaOpts = `${options.esJavaOpts || ''} ${process.env.ES_JAVA_OPTS || ''}`; @@ -287,7 +288,7 @@ exports.Cluster = class Cluster { esJavaOpts += ' -Xms1536m -Xmx1536m'; } - this._log.debug('ES_JAVA_OPTS: %s', esJavaOpts.trim()); + this._log.info('ES_JAVA_OPTS: %s', esJavaOpts.trim()); this._process = execa(ES_BIN, args, { cwd: installPath, diff --git a/packages/kbn-es/src/integration_tests/cluster.test.js b/packages/kbn-es/src/integration_tests/cluster.test.js index c4b1512331483..5633bd32b9ab2 100644 --- a/packages/kbn-es/src/integration_tests/cluster.test.js +++ b/packages/kbn-es/src/integration_tests/cluster.test.js @@ -309,6 +309,7 @@ describe('#start(installPath)', () => { Array [ "action.destructive_requires_name=true", "ingest.geoip.downloader.enabled=false", + "search.check_ccs_compatibility=true", ], undefined, Object { @@ -387,6 +388,7 @@ describe('#run()', () => { Array [ "action.destructive_requires_name=true", "ingest.geoip.downloader.enabled=false", + "search.check_ccs_compatibility=true", ], undefined, Object { From 6f2e49d82b7ba91743e72abcd4afbf77f51cea81 Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Thu, 24 Feb 2022 11:25:54 -0700 Subject: [PATCH 017/102] [maps] give data plugin control of filter migrations (#124729) * convert saved_object_migrations to TS * wire up filter migrations for saved objects * cleanup * implement filter migration * update embeddable migration Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../migrate_data_persisted_state.test.ts | 30 ++++++ .../migrate_data_persisted_state.ts | 35 ++++++ .../embeddable_migrations.test.ts | 3 +- .../{ => embeddable}/embeddable_migrations.ts | 10 +- .../plugins/maps/server/embeddable/index.ts | 8 ++ .../server/embeddable/setup_embeddable.ts | 33 ++++++ x-pack/plugins/maps/server/plugin.ts | 19 ++-- .../maps/server/saved_objects/index.ts | 3 +- .../plugins/maps/server/saved_objects/map.ts | 44 -------- .../server/saved_objects/maps_telemetry.ts | 25 ----- ...grations.js => saved_object_migrations.ts} | 73 ++++++++++--- .../saved_objects/setup_saved_objects.ts | 100 ++++++++++++++++++ x-pack/plugins/maps/server/types.ts | 6 +- 13 files changed, 286 insertions(+), 103 deletions(-) create mode 100644 x-pack/plugins/maps/common/migrations/migrate_data_persisted_state.test.ts create mode 100644 x-pack/plugins/maps/common/migrations/migrate_data_persisted_state.ts rename x-pack/plugins/maps/server/{ => embeddable}/embeddable_migrations.test.ts (90%) rename x-pack/plugins/maps/server/{ => embeddable}/embeddable_migrations.ts (84%) create mode 100644 x-pack/plugins/maps/server/embeddable/index.ts create mode 100644 x-pack/plugins/maps/server/embeddable/setup_embeddable.ts delete mode 100644 x-pack/plugins/maps/server/saved_objects/map.ts delete mode 100644 x-pack/plugins/maps/server/saved_objects/maps_telemetry.ts rename x-pack/plugins/maps/server/saved_objects/{saved_object_migrations.js => saved_object_migrations.ts} (71%) create mode 100644 x-pack/plugins/maps/server/saved_objects/setup_saved_objects.ts diff --git a/x-pack/plugins/maps/common/migrations/migrate_data_persisted_state.test.ts b/x-pack/plugins/maps/common/migrations/migrate_data_persisted_state.test.ts new file mode 100644 index 0000000000000..51d7a41f797eb --- /dev/null +++ b/x-pack/plugins/maps/common/migrations/migrate_data_persisted_state.test.ts @@ -0,0 +1,30 @@ +/* + * 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 { Filter } from '@kbn/es-query'; +import { migrateDataPersistedState } from './migrate_data_persisted_state'; + +const attributes = { + title: 'My map', + mapStateJSON: + '{"filters":[{"meta":{"index":"90943e30-9a47-11e8-b64d-95841ca0b247","params":{"lt":10000,"gte":2000},"field":"bytes","alias":null,"negate":false,"disabled":false,"type":"range","key":"bytes"},"query":{"range":{"bytes":{"lt":10000,"gte":2000}}},"$state":{"store":"appState"}}]}', +}; + +const filterMigrationMock = (filters: Filter[]): Filter[] => { + return filters.map((filter) => { + return { + ...filter, + alias: 'filter_has_been_migrated', + }; + }); +}; + +test('should apply data migrations to data peristed data', () => { + const { mapStateJSON } = migrateDataPersistedState({ attributes }, filterMigrationMock); + const mapState = JSON.parse(mapStateJSON!); + expect(mapState.filters[0].alias).toEqual('filter_has_been_migrated'); +}); diff --git a/x-pack/plugins/maps/common/migrations/migrate_data_persisted_state.ts b/x-pack/plugins/maps/common/migrations/migrate_data_persisted_state.ts new file mode 100644 index 0000000000000..7a933663a60f2 --- /dev/null +++ b/x-pack/plugins/maps/common/migrations/migrate_data_persisted_state.ts @@ -0,0 +1,35 @@ +/* + * 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 { Filter } from '@kbn/es-query'; +import { MapSavedObjectAttributes } from '../map_saved_object_type'; +import { MigrateFunction } from '../../../../../src/plugins/kibana_utils/common'; + +export function migrateDataPersistedState( + { + attributes, + }: { + attributes: MapSavedObjectAttributes; + }, + filterMigration: MigrateFunction +): MapSavedObjectAttributes { + let mapState: { filters: Filter[] } = { filters: [] }; + if (attributes.mapStateJSON) { + try { + mapState = JSON.parse(attributes.mapStateJSON); + } catch (e) { + throw new Error('Unable to parse attribute mapStateJSON'); + } + + mapState.filters = filterMigration(mapState.filters); + } + + return { + ...attributes, + mapStateJSON: JSON.stringify(mapState), + }; +} diff --git a/x-pack/plugins/maps/server/embeddable_migrations.test.ts b/x-pack/plugins/maps/server/embeddable/embeddable_migrations.test.ts similarity index 90% rename from x-pack/plugins/maps/server/embeddable_migrations.test.ts rename to x-pack/plugins/maps/server/embeddable/embeddable_migrations.test.ts index 4cf2642bb545c..58a6716c517a9 100644 --- a/x-pack/plugins/maps/server/embeddable_migrations.test.ts +++ b/x-pack/plugins/maps/server/embeddable/embeddable_migrations.test.ts @@ -7,8 +7,7 @@ import semverGte from 'semver/functions/gte'; import { embeddableMigrations } from './embeddable_migrations'; -// @ts-ignore -import { savedObjectMigrations } from './saved_objects/saved_object_migrations'; +import { savedObjectMigrations } from '../saved_objects/saved_object_migrations'; describe('saved object migrations and embeddable migrations', () => { test('should have same versions registered (>7.12)', () => { diff --git a/x-pack/plugins/maps/server/embeddable_migrations.ts b/x-pack/plugins/maps/server/embeddable/embeddable_migrations.ts similarity index 84% rename from x-pack/plugins/maps/server/embeddable_migrations.ts rename to x-pack/plugins/maps/server/embeddable/embeddable_migrations.ts index 9c17889e0c33c..951877a31f828 100644 --- a/x-pack/plugins/maps/server/embeddable_migrations.ts +++ b/x-pack/plugins/maps/server/embeddable/embeddable_migrations.ts @@ -6,11 +6,11 @@ */ import type { SerializableRecord } from '@kbn/utility-types'; -import { MapSavedObjectAttributes } from '../common/map_saved_object_type'; -import { moveAttribution } from '../common/migrations/move_attribution'; -import { setEmsTmsDefaultModes } from '../common/migrations/set_ems_tms_default_modes'; -import { renameLayerTypes } from '../common/migrations/rename_layer_types'; -import { extractReferences } from '../common/migrations/references'; +import { MapSavedObjectAttributes } from '../../common/map_saved_object_type'; +import { moveAttribution } from '../../common/migrations/move_attribution'; +import { setEmsTmsDefaultModes } from '../../common/migrations/set_ems_tms_default_modes'; +import { renameLayerTypes } from '../../common/migrations/rename_layer_types'; +import { extractReferences } from '../../common/migrations/references'; /* * Embeddables such as Maps, Lens, and Visualize can be embedded by value or by reference on a dashboard. diff --git a/x-pack/plugins/maps/server/embeddable/index.ts b/x-pack/plugins/maps/server/embeddable/index.ts new file mode 100644 index 0000000000000..5061fc03dcfc1 --- /dev/null +++ b/x-pack/plugins/maps/server/embeddable/index.ts @@ -0,0 +1,8 @@ +/* + * 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. + */ + +export { setupEmbeddable } from './setup_embeddable'; diff --git a/x-pack/plugins/maps/server/embeddable/setup_embeddable.ts b/x-pack/plugins/maps/server/embeddable/setup_embeddable.ts new file mode 100644 index 0000000000000..9411869c5ad11 --- /dev/null +++ b/x-pack/plugins/maps/server/embeddable/setup_embeddable.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 { EmbeddableSetup } from '../../../../../src/plugins/embeddable/server'; +import { + mergeMigrationFunctionMaps, + MigrateFunctionsObject, +} from '../../../../../src/plugins/kibana_utils/common'; +import { MAP_SAVED_OBJECT_TYPE } from '../../common/constants'; +import { extract, inject } from '../../common/embeddable'; +import { embeddableMigrations } from './embeddable_migrations'; +import { getPersistedStateMigrations } from '../saved_objects'; + +export function setupEmbeddable( + embeddable: EmbeddableSetup, + getFilterMigrations: () => MigrateFunctionsObject +) { + embeddable.registerEmbeddableFactory({ + id: MAP_SAVED_OBJECT_TYPE, + migrations: () => { + return mergeMigrationFunctionMaps( + embeddableMigrations, + getPersistedStateMigrations(getFilterMigrations()) + ); + }, + inject, + extract, + }); +} diff --git a/x-pack/plugins/maps/server/plugin.ts b/x-pack/plugins/maps/server/plugin.ts index 92d0f08fb51ab..05051a861d595 100644 --- a/x-pack/plugins/maps/server/plugin.ts +++ b/x-pack/plugins/maps/server/plugin.ts @@ -22,15 +22,14 @@ import { getFlightsSavedObjects } from './sample_data/flights_saved_objects.js'; import { getWebLogsSavedObjects } from './sample_data/web_logs_saved_objects.js'; import { registerMapsUsageCollector } from './maps_telemetry/collectors/register'; import { APP_ID, APP_ICON, MAP_SAVED_OBJECT_TYPE, getFullPath } from '../common/constants'; -import { extract, inject } from '../common/embeddable'; -import { mapSavedObjects, mapsTelemetrySavedObjects } from './saved_objects'; import { MapsXPackConfig } from '../config'; import { setStartServices } from './kibana_server_services'; import { emsBoundariesSpecProvider } from './tutorials/ems'; import { initRoutes } from './routes'; import { HomeServerPluginSetup } from '../../../../src/plugins/home/server'; import type { EMSSettings } from '../../../../src/plugins/maps_ems/server'; -import { embeddableMigrations } from './embeddable_migrations'; +import { setupEmbeddable } from './embeddable'; +import { setupSavedObjects } from './saved_objects'; import { registerIntegrations } from './register_integrations'; import { StartDeps, SetupDeps } from './types'; @@ -146,6 +145,10 @@ export class MapsPlugin implements Plugin { } setup(core: CoreSetup, plugins: SetupDeps) { + const getFilterMigrations = plugins.data.query.filterManager.getAllMigrations.bind( + plugins.data.query.filterManager + ); + const { usageCollection, home, features, customIntegrations } = plugins; const config$ = this._initializerContext.config.create(); @@ -192,16 +195,10 @@ export class MapsPlugin implements Plugin { }, }); - core.savedObjects.registerType(mapsTelemetrySavedObjects); - core.savedObjects.registerType(mapSavedObjects); + setupSavedObjects(core, getFilterMigrations); registerMapsUsageCollector(usageCollection); - plugins.embeddable.registerEmbeddableFactory({ - id: MAP_SAVED_OBJECT_TYPE, - migrations: embeddableMigrations, - inject, - extract, - }); + setupEmbeddable(plugins.embeddable, getFilterMigrations); return { config: config$, diff --git a/x-pack/plugins/maps/server/saved_objects/index.ts b/x-pack/plugins/maps/server/saved_objects/index.ts index f34e20becd437..1b0b129a29299 100644 --- a/x-pack/plugins/maps/server/saved_objects/index.ts +++ b/x-pack/plugins/maps/server/saved_objects/index.ts @@ -5,5 +5,4 @@ * 2.0. */ -export { mapsTelemetrySavedObjects } from './maps_telemetry'; -export { mapSavedObjects } from './map'; +export { getPersistedStateMigrations, setupSavedObjects } from './setup_saved_objects'; diff --git a/x-pack/plugins/maps/server/saved_objects/map.ts b/x-pack/plugins/maps/server/saved_objects/map.ts deleted file mode 100644 index b13f24fc6ba1c..0000000000000 --- a/x-pack/plugins/maps/server/saved_objects/map.ts +++ /dev/null @@ -1,44 +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 { SavedObjectsType } from 'src/core/server'; -import { APP_ICON, getFullPath } from '../../common/constants'; -// @ts-ignore -import { savedObjectMigrations } from './saved_object_migrations'; - -export const mapSavedObjects: SavedObjectsType = { - name: 'map', - hidden: false, - namespaceType: 'multiple-isolated', - convertToMultiNamespaceTypeVersion: '8.0.0', - mappings: { - properties: { - description: { type: 'text' }, - title: { type: 'text' }, - version: { type: 'integer' }, - mapStateJSON: { type: 'text' }, - layerListJSON: { type: 'text' }, - uiStateJSON: { type: 'text' }, - bounds: { dynamic: false, properties: {} }, // Disable removed field - }, - }, - management: { - icon: APP_ICON, - defaultSearchField: 'title', - importableAndExportable: true, - getTitle(obj) { - return obj.attributes.title; - }, - getInAppUrl(obj) { - return { - path: getFullPath(obj.id), - uiCapabilitiesPath: 'maps.show', - }; - }, - }, - migrations: savedObjectMigrations, -}; diff --git a/x-pack/plugins/maps/server/saved_objects/maps_telemetry.ts b/x-pack/plugins/maps/server/saved_objects/maps_telemetry.ts deleted file mode 100644 index 35366188f909d..0000000000000 --- a/x-pack/plugins/maps/server/saved_objects/maps_telemetry.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 { SavedObjectsType } from 'src/core/server'; - -/* - * The maps-telemetry saved object type isn't used, but in order to remove these fields from - * the mappings we register this type with `type: 'object', enabled: true` to remove all - * previous fields from the mappings until https://github.com/elastic/kibana/issues/67086 is - * solved. - */ -export const mapsTelemetrySavedObjects: SavedObjectsType = { - name: 'maps-telemetry', - hidden: false, - namespaceType: 'agnostic', - mappings: { - // @ts-ignore Core types don't support this since it's only really valid when removing a previously registered type - type: 'object', - enabled: false, - }, -}; diff --git a/x-pack/plugins/maps/server/saved_objects/saved_object_migrations.js b/x-pack/plugins/maps/server/saved_objects/saved_object_migrations.ts similarity index 71% rename from x-pack/plugins/maps/server/saved_objects/saved_object_migrations.js rename to x-pack/plugins/maps/server/saved_objects/saved_object_migrations.ts index 986878e65eb8b..f8cd06cf60bfc 100644 --- a/x-pack/plugins/maps/server/saved_objects/saved_object_migrations.js +++ b/x-pack/plugins/maps/server/saved_objects/saved_object_migrations.ts @@ -5,11 +5,17 @@ * 2.0. */ +import type { SavedObjectMigrationContext, SavedObjectUnsanitizedDoc } from 'kibana/server'; import { extractReferences } from '../../common/migrations/references'; +// @ts-expect-error import { emsRasterTileToEmsVectorTile } from '../../common/migrations/ems_raster_tile_to_ems_vector_tile'; +// @ts-expect-error import { topHitsTimeToSort } from '../../common/migrations/top_hits_time_to_sort'; +// @ts-expect-error import { moveApplyGlobalQueryToSources } from '../../common/migrations/move_apply_global_query'; +// @ts-expect-error import { addFieldMetaOptions } from '../../common/migrations/add_field_meta_options'; +// @ts-expect-error import { migrateSymbolStyleDescriptor } from '../../common/migrations/migrate_symbol_style_descriptor'; import { migrateUseTopHitsToScalingType } from '../../common/migrations/scaling_type'; import { migrateJoinAggKey } from '../../common/migrations/join_agg_key'; @@ -19,8 +25,13 @@ import { addTypeToTermJoin } from '../../common/migrations/add_type_to_termjoin' import { moveAttribution } from '../../common/migrations/move_attribution'; import { setEmsTmsDefaultModes } from '../../common/migrations/set_ems_tms_default_modes'; import { renameLayerTypes } from '../../common/migrations/rename_layer_types'; +import type { MapSavedObjectAttributes } from '../../common/map_saved_object_type'; -function logMigrationWarning(context, errorMsg, doc) { +function logMigrationWarning( + context: SavedObjectMigrationContext, + errorMsg: string, + doc: SavedObjectUnsanitizedDoc +) { context.log.warning( `map migration failed (${context.migrationVersion}). ${errorMsg}. attributes: ${JSON.stringify( doc @@ -36,7 +47,10 @@ function logMigrationWarning(context, errorMsg, doc) { * This is the saved object migration registry. */ export const savedObjectMigrations = { - '7.2.0': (doc, context) => { + '7.2.0': ( + doc: SavedObjectUnsanitizedDoc, + context: SavedObjectMigrationContext + ) => { try { const { attributes, references } = extractReferences(doc); @@ -50,7 +64,10 @@ export const savedObjectMigrations = { return doc; } }, - '7.4.0': (doc, context) => { + '7.4.0': ( + doc: SavedObjectUnsanitizedDoc, + context: SavedObjectMigrationContext + ) => { try { const attributes = emsRasterTileToEmsVectorTile(doc); @@ -63,7 +80,10 @@ export const savedObjectMigrations = { return doc; } }, - '7.5.0': (doc, context) => { + '7.5.0': ( + doc: SavedObjectUnsanitizedDoc, + context: SavedObjectMigrationContext + ) => { try { const attributes = topHitsTimeToSort(doc); @@ -76,7 +96,10 @@ export const savedObjectMigrations = { return doc; } }, - '7.6.0': (doc, context) => { + '7.6.0': ( + doc: SavedObjectUnsanitizedDoc, + context: SavedObjectMigrationContext + ) => { try { const attributesPhase1 = moveApplyGlobalQueryToSources(doc); const attributesPhase2 = addFieldMetaOptions({ attributes: attributesPhase1 }); @@ -90,7 +113,10 @@ export const savedObjectMigrations = { return doc; } }, - '7.7.0': (doc, context) => { + '7.7.0': ( + doc: SavedObjectUnsanitizedDoc, + context: SavedObjectMigrationContext + ) => { try { const attributesPhase1 = migrateSymbolStyleDescriptor(doc); const attributesPhase2 = migrateUseTopHitsToScalingType({ attributes: attributesPhase1 }); @@ -104,7 +130,10 @@ export const savedObjectMigrations = { return doc; } }, - '7.8.0': (doc, context) => { + '7.8.0': ( + doc: SavedObjectUnsanitizedDoc, + context: SavedObjectMigrationContext + ) => { try { const attributes = migrateJoinAggKey(doc); @@ -117,7 +146,10 @@ export const savedObjectMigrations = { return doc; } }, - '7.9.0': (doc, context) => { + '7.9.0': ( + doc: SavedObjectUnsanitizedDoc, + context: SavedObjectMigrationContext + ) => { try { const attributes = removeBoundsFromSavedObject(doc); @@ -130,7 +162,10 @@ export const savedObjectMigrations = { return doc; } }, - '7.10.0': (doc, context) => { + '7.10.0': ( + doc: SavedObjectUnsanitizedDoc, + context: SavedObjectMigrationContext + ) => { try { const attributes = setDefaultAutoFitToBounds(doc); @@ -143,7 +178,10 @@ export const savedObjectMigrations = { return doc; } }, - '7.12.0': (doc, context) => { + '7.12.0': ( + doc: SavedObjectUnsanitizedDoc, + context: SavedObjectMigrationContext + ) => { try { const attributes = addTypeToTermJoin(doc); @@ -156,7 +194,10 @@ export const savedObjectMigrations = { return doc; } }, - '7.14.0': (doc, context) => { + '7.14.0': ( + doc: SavedObjectUnsanitizedDoc, + context: SavedObjectMigrationContext + ) => { try { const attributes = moveAttribution(doc); @@ -169,7 +210,10 @@ export const savedObjectMigrations = { return doc; } }, - '8.0.0': (doc, context) => { + '8.0.0': ( + doc: SavedObjectUnsanitizedDoc, + context: SavedObjectMigrationContext + ) => { try { const attributes = setEmsTmsDefaultModes(doc); @@ -182,7 +226,10 @@ export const savedObjectMigrations = { return doc; } }, - '8.1.0': (doc, context) => { + '8.1.0': ( + doc: SavedObjectUnsanitizedDoc, + context: SavedObjectMigrationContext + ) => { try { const attributes = renameLayerTypes(doc); diff --git a/x-pack/plugins/maps/server/saved_objects/setup_saved_objects.ts b/x-pack/plugins/maps/server/saved_objects/setup_saved_objects.ts new file mode 100644 index 0000000000000..d5c0c0fa6dcf3 --- /dev/null +++ b/x-pack/plugins/maps/server/saved_objects/setup_saved_objects.ts @@ -0,0 +1,100 @@ +/* + * 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 { mapValues } from 'lodash'; +import type { CoreSetup, SavedObjectUnsanitizedDoc } from 'kibana/server'; +import type { SavedObjectMigrationMap } from 'src/core/server'; +import { MigrateFunctionsObject } from '../../../../../src/plugins/kibana_utils/common'; +import { mergeSavedObjectMigrationMaps } from '../../../../../src/core/server'; +import { APP_ICON, getFullPath } from '../../common/constants'; +import { migrateDataPersistedState } from '../../common/migrations/migrate_data_persisted_state'; +import type { MapSavedObjectAttributes } from '../../common/map_saved_object_type'; +import { savedObjectMigrations } from './saved_object_migrations'; + +export function setupSavedObjects( + core: CoreSetup, + getFilterMigrations: () => MigrateFunctionsObject +) { + core.savedObjects.registerType({ + name: 'map', + hidden: false, + namespaceType: 'multiple-isolated', + convertToMultiNamespaceTypeVersion: '8.0.0', + mappings: { + properties: { + description: { type: 'text' }, + title: { type: 'text' }, + version: { type: 'integer' }, + mapStateJSON: { type: 'text' }, + layerListJSON: { type: 'text' }, + uiStateJSON: { type: 'text' }, + bounds: { dynamic: false, properties: {} }, // Disable removed field + }, + }, + management: { + icon: APP_ICON, + defaultSearchField: 'title', + importableAndExportable: true, + getTitle(obj) { + return obj.attributes.title; + }, + getInAppUrl(obj) { + return { + path: getFullPath(obj.id), + uiCapabilitiesPath: 'maps.show', + }; + }, + }, + migrations: () => { + return mergeSavedObjectMigrationMaps( + savedObjectMigrations, + getPersistedStateMigrations(getFilterMigrations()) as unknown as SavedObjectMigrationMap + ); + }, + }); + + /* + * The maps-telemetry saved object type isn't used, but in order to remove these fields from + * the mappings we register this type with `type: 'object', enabled: true` to remove all + * previous fields from the mappings until https://github.com/elastic/kibana/issues/67086 is + * solved. + */ + core.savedObjects.registerType({ + name: 'maps-telemetry', + hidden: false, + namespaceType: 'agnostic', + mappings: { + // @ts-ignore Core types don't support this since it's only really valid when removing a previously registered type + type: 'object', + enabled: false, + }, + }); +} + +/** + * This creates a migration map that applies external plugin migrations to persisted state stored in Maps + */ +export const getPersistedStateMigrations = ( + filterMigrations: MigrateFunctionsObject +): MigrateFunctionsObject => + mapValues( + filterMigrations, + (filterMigration) => (doc: SavedObjectUnsanitizedDoc) => { + try { + const attributes = migrateDataPersistedState(doc, filterMigration); + + return { + ...doc, + attributes, + }; + } catch (e) { + // Do not fail migration + // Maps application can display error when saved object is viewed + return doc; + } + } + ); diff --git a/x-pack/plugins/maps/server/types.ts b/x-pack/plugins/maps/server/types.ts index 293964fdb6fee..597b826eee56d 100644 --- a/x-pack/plugins/maps/server/types.ts +++ b/x-pack/plugins/maps/server/types.ts @@ -11,10 +11,14 @@ import { HomeServerPluginSetup } from '../../../../src/plugins/home/server'; import { LicensingPluginSetup } from '../../licensing/server'; import { MapsEmsPluginServerSetup } from '../../../../src/plugins/maps_ems/server'; import { EmbeddableSetup } from '../../../../src/plugins/embeddable/server'; -import { PluginStart as DataPluginStart } from '../../../../src/plugins/data/server'; +import { + PluginSetup as DataPluginSetup, + PluginStart as DataPluginStart, +} from '../../../../src/plugins/data/server'; import { CustomIntegrationsPluginSetup } from '../../../../src/plugins/custom_integrations/server'; export interface SetupDeps { + data: DataPluginSetup; features: FeaturesPluginSetupContract; usageCollection?: UsageCollectionSetup; home?: HomeServerPluginSetup; From 614139b8e5a38c60918586c2282eb75c88fedb80 Mon Sep 17 00:00:00 2001 From: Spencer Date: Thu, 24 Feb 2022 12:43:12 -0600 Subject: [PATCH 018/102] [bazel] avoid a little boilerplate in packages (#126309) * [bazel] avoid a little boilerplate for @types packages * [bazel/ts] stop building sourcemaps since they're ignored --- packages/elastic-apm-synthtrace/BUILD.bazel | 5 +---- packages/elastic-apm-synthtrace/tsconfig.json | 3 --- packages/elastic-datemath/BUILD.bazel | 5 +---- packages/elastic-datemath/tsconfig.json | 3 --- packages/kbn-ace/BUILD.bazel | 5 +---- packages/kbn-ace/tsconfig.json | 3 --- packages/kbn-alerts/BUILD.bazel | 5 +---- packages/kbn-alerts/tsconfig.json | 3 --- packages/kbn-analytics/BUILD.bazel | 5 +---- packages/kbn-analytics/tsconfig.json | 3 --- packages/kbn-apm-config-loader/BUILD.bazel | 5 +---- packages/kbn-apm-config-loader/tsconfig.json | 3 --- packages/kbn-apm-utils/BUILD.bazel | 5 +---- packages/kbn-apm-utils/tsconfig.json | 3 --- packages/kbn-cli-dev-mode/BUILD.bazel | 5 +---- packages/kbn-cli-dev-mode/tsconfig.json | 3 --- packages/kbn-config-schema/BUILD.bazel | 5 +---- packages/kbn-config-schema/tsconfig.json | 3 --- packages/kbn-config/BUILD.bazel | 5 +---- packages/kbn-config/tsconfig.json | 3 --- packages/kbn-crypto/BUILD.bazel | 7 ++----- packages/kbn-crypto/tsconfig.json | 3 --- packages/kbn-dev-utils/BUILD.bazel | 5 +---- packages/kbn-dev-utils/tsconfig.json | 3 --- packages/kbn-doc-links/BUILD.bazel | 5 +---- packages/kbn-doc-links/tsconfig.json | 3 --- packages/kbn-docs-utils/BUILD.bazel | 5 +---- packages/kbn-docs-utils/tsconfig.json | 3 --- packages/kbn-es-archiver/BUILD.bazel | 5 +---- packages/kbn-es-archiver/tsconfig.json | 3 --- packages/kbn-es-query/BUILD.bazel | 5 +---- packages/kbn-es-query/tsconfig.json | 3 --- packages/kbn-field-types/BUILD.bazel | 5 +---- packages/kbn-field-types/tsconfig.json | 3 --- packages/kbn-i18n-react/BUILD.bazel | 5 +---- packages/kbn-i18n-react/tsconfig.json | 3 --- packages/kbn-i18n/BUILD.bazel | 5 +---- packages/kbn-i18n/tsconfig.json | 3 --- packages/kbn-interpreter/BUILD.bazel | 5 +---- packages/kbn-interpreter/tsconfig.json | 3 --- packages/kbn-io-ts-utils/BUILD.bazel | 5 +---- packages/kbn-io-ts-utils/tsconfig.json | 3 --- packages/kbn-logging-mocks/BUILD.bazel | 5 +---- packages/kbn-logging-mocks/tsconfig.json | 3 --- packages/kbn-logging/BUILD.bazel | 5 +---- packages/kbn-logging/tsconfig.json | 3 --- packages/kbn-mapbox-gl/BUILD.bazel | 5 +---- packages/kbn-mapbox-gl/tsconfig.json | 3 --- packages/kbn-monaco/BUILD.bazel | 5 +---- packages/kbn-monaco/tsconfig.json | 3 --- packages/kbn-optimizer/BUILD.bazel | 5 +---- packages/kbn-optimizer/tsconfig.json | 3 --- packages/kbn-plugin-generator/BUILD.bazel | 5 +---- packages/kbn-plugin-generator/tsconfig.json | 3 --- packages/kbn-plugin-helpers/BUILD.bazel | 5 +---- packages/kbn-plugin-helpers/tsconfig.json | 3 --- packages/kbn-react-field/BUILD.bazel | 5 +---- packages/kbn-react-field/tsconfig.json | 3 --- packages/kbn-rule-data-utils/BUILD.bazel | 5 +---- packages/kbn-rule-data-utils/tsconfig.json | 3 --- packages/kbn-securitysolution-autocomplete/BUILD.bazel | 5 +---- packages/kbn-securitysolution-autocomplete/tsconfig.json | 3 --- packages/kbn-securitysolution-es-utils/BUILD.bazel | 5 +---- packages/kbn-securitysolution-es-utils/tsconfig.json | 3 --- packages/kbn-securitysolution-hook-utils/BUILD.bazel | 5 +---- packages/kbn-securitysolution-hook-utils/tsconfig.json | 3 --- .../kbn-securitysolution-io-ts-alerting-types/BUILD.bazel | 5 +---- .../tsconfig.json | 3 --- packages/kbn-securitysolution-io-ts-list-types/BUILD.bazel | 5 +---- .../kbn-securitysolution-io-ts-list-types/tsconfig.json | 3 --- packages/kbn-securitysolution-io-ts-types/BUILD.bazel | 5 +---- packages/kbn-securitysolution-io-ts-types/tsconfig.json | 3 --- packages/kbn-securitysolution-io-ts-utils/BUILD.bazel | 5 +---- packages/kbn-securitysolution-io-ts-utils/tsconfig.json | 3 --- packages/kbn-securitysolution-list-api/BUILD.bazel | 5 +---- packages/kbn-securitysolution-list-api/tsconfig.json | 3 --- packages/kbn-securitysolution-list-constants/BUILD.bazel | 5 +---- packages/kbn-securitysolution-list-constants/tsconfig.json | 3 --- packages/kbn-securitysolution-list-hooks/BUILD.bazel | 5 +---- packages/kbn-securitysolution-list-hooks/tsconfig.json | 3 --- packages/kbn-securitysolution-list-utils/BUILD.bazel | 5 +---- packages/kbn-securitysolution-list-utils/tsconfig.json | 3 --- packages/kbn-securitysolution-rules/BUILD.bazel | 5 +---- packages/kbn-securitysolution-rules/tsconfig.json | 3 --- packages/kbn-securitysolution-t-grid/BUILD.bazel | 5 +---- packages/kbn-securitysolution-t-grid/tsconfig.json | 3 --- packages/kbn-securitysolution-utils/BUILD.bazel | 5 +---- packages/kbn-securitysolution-utils/tsconfig.json | 3 --- packages/kbn-server-http-tools/BUILD.bazel | 5 +---- packages/kbn-server-http-tools/tsconfig.json | 3 --- packages/kbn-server-route-repository/BUILD.bazel | 5 +---- packages/kbn-server-route-repository/tsconfig.json | 3 --- packages/kbn-std/BUILD.bazel | 5 +---- packages/kbn-std/tsconfig.json | 3 --- packages/kbn-storybook/BUILD.bazel | 5 +---- packages/kbn-storybook/tsconfig.json | 3 --- packages/kbn-telemetry-tools/BUILD.bazel | 5 +---- packages/kbn-telemetry-tools/tsconfig.json | 3 --- packages/kbn-test-jest-helpers/BUILD.bazel | 5 +---- packages/kbn-test-jest-helpers/tsconfig.json | 3 --- packages/kbn-test/BUILD.bazel | 5 +---- packages/kbn-test/tsconfig.json | 3 --- packages/kbn-typed-react-router-config/BUILD.bazel | 5 +---- packages/kbn-typed-react-router-config/tsconfig.json | 3 --- packages/kbn-ui-shared-deps-npm/BUILD.bazel | 5 +---- packages/kbn-ui-shared-deps-npm/tsconfig.json | 3 --- packages/kbn-ui-shared-deps-src/BUILD.bazel | 5 +---- packages/kbn-ui-shared-deps-src/tsconfig.json | 3 --- packages/kbn-ui-theme/BUILD.bazel | 5 +---- packages/kbn-ui-theme/tsconfig.json | 3 --- packages/kbn-utility-types/BUILD.bazel | 5 +---- packages/kbn-utility-types/tsconfig.json | 3 --- packages/kbn-utils/BUILD.bazel | 5 +---- packages/kbn-utils/tsconfig.json | 3 --- src/dev/bazel/pkg_npm_types/pkg_npm_types.bzl | 7 +++++-- 115 files changed, 63 insertions(+), 402 deletions(-) diff --git a/packages/elastic-apm-synthtrace/BUILD.bazel b/packages/elastic-apm-synthtrace/BUILD.bazel index 7fb188de435b6..09406644f44b2 100644 --- a/packages/elastic-apm-synthtrace/BUILD.bazel +++ b/packages/elastic-apm-synthtrace/BUILD.bazel @@ -4,7 +4,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "elastic-apm-synthtrace" PKG_REQUIRE_NAME = "@elastic/apm-synthtrace" -TYPES_PKG_REQUIRE_NAME = "@types/elastic__apm-synthtrace" SOURCE_FILES = glob( [ @@ -67,11 +66,9 @@ ts_project( srcs = SRCS, deps = TYPES_DEPS, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", root_dir = "src", - source_map = True, tsconfig = ":tsconfig", validate = False, ) @@ -103,7 +100,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/elastic-apm-synthtrace/tsconfig.json b/packages/elastic-apm-synthtrace/tsconfig.json index 6ae9c20b4387b..9d9a6ecc6b2b6 100644 --- a/packages/elastic-apm-synthtrace/tsconfig.json +++ b/packages/elastic-apm-synthtrace/tsconfig.json @@ -2,12 +2,9 @@ "extends": "../../tsconfig.bazel.json", "compilerOptions": { "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "outDir": "target_types", "rootDir": "./src", - "sourceMap": true, - "sourceRoot": "../../../../packages/elastic-apm-synthtrace/src", "types": ["node", "jest"] }, "include": ["./src/**/*.ts"] diff --git a/packages/elastic-datemath/BUILD.bazel b/packages/elastic-datemath/BUILD.bazel index b4ed018fe9d04..1ee7f8582cb7e 100644 --- a/packages/elastic-datemath/BUILD.bazel +++ b/packages/elastic-datemath/BUILD.bazel @@ -4,7 +4,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "ts_project", "pkg_npm", "p PKG_BASE_NAME = "elastic-datemath" PKG_REQUIRE_NAME = "@elastic/datemath" -TYPES_PKG_REQUIRE_NAME = "@types/elastic__datemath" SOURCE_FILES = glob([ "src/index.ts", @@ -50,10 +49,8 @@ ts_project( srcs = SRCS, deps = TYPES_DEPS, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", - source_map = True, root_dir = "src", tsconfig = ":tsconfig" ) @@ -85,7 +82,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/elastic-datemath/tsconfig.json b/packages/elastic-datemath/tsconfig.json index 02465bebe519a..3f81ea4e68516 100644 --- a/packages/elastic-datemath/tsconfig.json +++ b/packages/elastic-datemath/tsconfig.json @@ -2,12 +2,9 @@ "extends": "../../tsconfig.bazel.json", "compilerOptions": { "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "outDir": "target_types", "rootDir": "src", - "sourceMap": true, - "sourceRoot": "../../../../packages/elastic-datemath/src", "types": [ "node" ] diff --git a/packages/kbn-ace/BUILD.bazel b/packages/kbn-ace/BUILD.bazel index c674f9ae8e00f..583d81ce847bd 100644 --- a/packages/kbn-ace/BUILD.bazel +++ b/packages/kbn-ace/BUILD.bazel @@ -4,7 +4,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-ace" PKG_REQUIRE_NAME = "@kbn/ace" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__ace" SOURCE_FILES = glob( [ @@ -68,10 +67,8 @@ ts_project( srcs = SRCS, deps = TYPES_DEPS, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", - source_map = True, root_dir = "src", tsconfig = ":tsconfig", ) @@ -103,7 +100,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-ace/tsconfig.json b/packages/kbn-ace/tsconfig.json index 4a132efa09118..0fd9a15b5dbf8 100644 --- a/packages/kbn-ace/tsconfig.json +++ b/packages/kbn-ace/tsconfig.json @@ -2,11 +2,8 @@ "extends": "../../tsconfig.bazel.json", "compilerOptions": { "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "outDir": "./target_types", - "sourceMap": true, - "sourceRoot": "../../../../packages/kbn-ace/src", "stripInternal": true, "types": ["node"] }, diff --git a/packages/kbn-alerts/BUILD.bazel b/packages/kbn-alerts/BUILD.bazel index a6e5f167735c0..e6ebdaa202701 100644 --- a/packages/kbn-alerts/BUILD.bazel +++ b/packages/kbn-alerts/BUILD.bazel @@ -4,7 +4,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-alerts" PKG_REQUIRE_NAME = "@kbn/alerts" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__alerts" SOURCE_FILES = glob( [ @@ -74,11 +73,9 @@ ts_project( srcs = SRCS, deps = TYPES_DEPS, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", root_dir = "src", - source_map = True, tsconfig = ":tsconfig", ) @@ -109,7 +106,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-alerts/tsconfig.json b/packages/kbn-alerts/tsconfig.json index ac523fb77a9e1..dfe59c663d3e1 100644 --- a/packages/kbn-alerts/tsconfig.json +++ b/packages/kbn-alerts/tsconfig.json @@ -2,12 +2,9 @@ "extends": "../../tsconfig.bazel.json", "compilerOptions": { "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "outDir": "target_types", "rootDir": "src", - "sourceMap": true, - "sourceRoot": "../../../../packages/kbn-alerts/src", "types": ["jest", "node"] }, "include": ["src/**/*"], diff --git a/packages/kbn-analytics/BUILD.bazel b/packages/kbn-analytics/BUILD.bazel index 94e65b2e35ba3..d144ab186a6a1 100644 --- a/packages/kbn-analytics/BUILD.bazel +++ b/packages/kbn-analytics/BUILD.bazel @@ -4,7 +4,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-analytics" PKG_REQUIRE_NAME = "@kbn/analytics" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__analytics" SOURCE_FILES = glob( [ @@ -71,11 +70,9 @@ ts_project( srcs = SRCS, deps = TYPES_DEPS, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", root_dir = "src", - source_map = True, tsconfig = ":tsconfig", ) @@ -106,7 +103,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-analytics/tsconfig.json b/packages/kbn-analytics/tsconfig.json index dfae54ad91c8e..de4301e2a2ac0 100644 --- a/packages/kbn-analytics/tsconfig.json +++ b/packages/kbn-analytics/tsconfig.json @@ -2,12 +2,9 @@ "extends": "../../tsconfig.bazel.json", "compilerOptions": { "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "isolatedModules": true, "outDir": "./target_types", - "sourceMap": true, - "sourceRoot": "../../../../../packages/kbn-analytics/src", "stripInternal": true, "types": [ "node" diff --git a/packages/kbn-apm-config-loader/BUILD.bazel b/packages/kbn-apm-config-loader/BUILD.bazel index a18a5e973d3a0..bcdbefb132aa6 100644 --- a/packages/kbn-apm-config-loader/BUILD.bazel +++ b/packages/kbn-apm-config-loader/BUILD.bazel @@ -4,7 +4,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-apm-config-loader" PKG_REQUIRE_NAME = "@kbn/apm-config-loader" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__apm-config-loader" SOURCE_FILES = glob( [ @@ -66,10 +65,8 @@ ts_project( srcs = SRCS, deps = TYPES_DEPS, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", - source_map = True, root_dir = "src", tsconfig = ":tsconfig", ) @@ -101,7 +98,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-apm-config-loader/tsconfig.json b/packages/kbn-apm-config-loader/tsconfig.json index 2f6da800d9dd2..7d2597d318b31 100644 --- a/packages/kbn-apm-config-loader/tsconfig.json +++ b/packages/kbn-apm-config-loader/tsconfig.json @@ -2,12 +2,9 @@ "extends": "../../tsconfig.bazel.json", "compilerOptions": { "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "outDir": "./target_types", "rootDir": "./src", - "sourceMap": true, - "sourceRoot": "../../../../packages/kbn-apm-config-loader/src", "stripInternal": false, "types": [ "jest", diff --git a/packages/kbn-apm-utils/BUILD.bazel b/packages/kbn-apm-utils/BUILD.bazel index c8ad4d1a09625..9ca9009bb7186 100644 --- a/packages/kbn-apm-utils/BUILD.bazel +++ b/packages/kbn-apm-utils/BUILD.bazel @@ -4,7 +4,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-apm-utils" PKG_REQUIRE_NAME = "@kbn/apm-utils" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__apm-utils" SOURCE_FILES = glob([ "src/index.ts", @@ -51,10 +50,8 @@ ts_project( srcs = SRCS, deps = TYPES_DEPS, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", - source_map = True, root_dir = "src", tsconfig = ":tsconfig", ) @@ -86,7 +83,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-apm-utils/tsconfig.json b/packages/kbn-apm-utils/tsconfig.json index d7056cda6d71a..9c8c443436ce5 100644 --- a/packages/kbn-apm-utils/tsconfig.json +++ b/packages/kbn-apm-utils/tsconfig.json @@ -2,12 +2,9 @@ "extends": "../../tsconfig.bazel.json", "compilerOptions": { "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "outDir": "target_types", "rootDir": "src", - "sourceMap": true, - "sourceRoot": "../../../../packages/kbn-apm-utils/src", "types": [ "node" ] diff --git a/packages/kbn-cli-dev-mode/BUILD.bazel b/packages/kbn-cli-dev-mode/BUILD.bazel index 133474a3aefa6..4b45e34b7e9fa 100644 --- a/packages/kbn-cli-dev-mode/BUILD.bazel +++ b/packages/kbn-cli-dev-mode/BUILD.bazel @@ -4,7 +4,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-cli-dev-mode" PKG_REQUIRE_NAME = "@kbn/cli-dev-mode" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__cli-dev-mode" SOURCE_FILES = glob( [ @@ -93,11 +92,9 @@ ts_project( srcs = SRCS, deps = TYPES_DEPS, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", root_dir = "src", - source_map = True, tsconfig = ":tsconfig", ) @@ -128,7 +125,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-cli-dev-mode/tsconfig.json b/packages/kbn-cli-dev-mode/tsconfig.json index 6ce2e21b84674..4ba84d786cb4b 100644 --- a/packages/kbn-cli-dev-mode/tsconfig.json +++ b/packages/kbn-cli-dev-mode/tsconfig.json @@ -2,12 +2,9 @@ "extends": "../../tsconfig.bazel.json", "compilerOptions": { "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "outDir": "./target_types", "rootDir": "./src", - "sourceMap": true, - "sourceRoot": "../../../../packages/kbn-cli-dev-mode/src", "types": [ "jest", "node" diff --git a/packages/kbn-config-schema/BUILD.bazel b/packages/kbn-config-schema/BUILD.bazel index ed6082527bab9..e496aa31b49d3 100644 --- a/packages/kbn-config-schema/BUILD.bazel +++ b/packages/kbn-config-schema/BUILD.bazel @@ -4,7 +4,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-config-schema" PKG_REQUIRE_NAME = "@kbn/config-schema" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__config-schema" SOURCE_FILES = glob([ "src/**/*.ts", @@ -62,10 +61,8 @@ ts_project( srcs = SRCS, deps = TYPES_DEPS, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", - source_map = True, root_dir = "src", tsconfig = ":tsconfig", ) @@ -97,7 +94,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-config-schema/tsconfig.json b/packages/kbn-config-schema/tsconfig.json index 79b652daf7ec1..e1125366bc390 100644 --- a/packages/kbn-config-schema/tsconfig.json +++ b/packages/kbn-config-schema/tsconfig.json @@ -2,12 +2,9 @@ "extends": "../../tsconfig.bazel.json", "compilerOptions": { "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "outDir": "target_types", "rootDir": "src", - "sourceMap": true, - "sourceRoot": "../../../../packages/kbn-config-schema/src", "stripInternal": true, "types": [ "jest", diff --git a/packages/kbn-config/BUILD.bazel b/packages/kbn-config/BUILD.bazel index 0577014768d4c..e242cf5c92622 100644 --- a/packages/kbn-config/BUILD.bazel +++ b/packages/kbn-config/BUILD.bazel @@ -4,7 +4,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-config" PKG_REQUIRE_NAME = "@kbn/config" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__config" SOURCE_FILES = glob( [ @@ -83,10 +82,8 @@ ts_project( srcs = SRCS, deps = TYPES_DEPS, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", - source_map = True, root_dir = "src", tsconfig = ":tsconfig", ) @@ -118,7 +115,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-config/tsconfig.json b/packages/kbn-config/tsconfig.json index 0971923a11a0f..a684de9502b5e 100644 --- a/packages/kbn-config/tsconfig.json +++ b/packages/kbn-config/tsconfig.json @@ -2,12 +2,9 @@ "extends": "../../tsconfig.bazel.json", "compilerOptions": { "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "outDir": "./target_types", "rootDir": "src", - "sourceMap": true, - "sourceRoot": "../../../../packages/kbn-config/src", "stripInternal": false, "types": [ "jest", diff --git a/packages/kbn-crypto/BUILD.bazel b/packages/kbn-crypto/BUILD.bazel index f71c8b866fd5d..de8c97ed3b713 100644 --- a/packages/kbn-crypto/BUILD.bazel +++ b/packages/kbn-crypto/BUILD.bazel @@ -5,7 +5,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-crypto" PKG_REQUIRE_NAME = "@kbn/crypto" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__crypto" SOURCE_FILES = glob( [ @@ -29,7 +28,7 @@ NPM_MODULE_EXTRA_FILES = [ ] RUNTIME_DEPS = [ - "//packages/kbn-dev-utils", + "//packages/kbn-dev-utils:build", "@npm//node-forge", ] @@ -62,10 +61,8 @@ ts_project( srcs = SRCS, deps = TYPES_DEPS, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", - source_map = True, root_dir = "src", tsconfig = ":tsconfig", ) @@ -97,7 +94,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-crypto/tsconfig.json b/packages/kbn-crypto/tsconfig.json index 0863fc3f530de..272363e976ba1 100644 --- a/packages/kbn-crypto/tsconfig.json +++ b/packages/kbn-crypto/tsconfig.json @@ -2,12 +2,9 @@ "extends": "../../tsconfig.bazel.json", "compilerOptions": { "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "outDir": "./target_types", "rootDir": "src", - "sourceMap": true, - "sourceRoot": "../../../../packages/kbn-crypto/src", "types": [ "jest", "node" diff --git a/packages/kbn-dev-utils/BUILD.bazel b/packages/kbn-dev-utils/BUILD.bazel index 65e0957fe5d90..7be527c65a06c 100644 --- a/packages/kbn-dev-utils/BUILD.bazel +++ b/packages/kbn-dev-utils/BUILD.bazel @@ -4,7 +4,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-dev-utils" PKG_REQUIRE_NAME = "@kbn/dev-utils" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__dev-utils" SOURCE_FILES = glob( [ @@ -114,10 +113,8 @@ ts_project( srcs = SRCS, deps = TYPES_DEPS, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", - source_map = True, root_dir = "src", tsconfig = ":tsconfig", ) @@ -149,7 +146,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-dev-utils/tsconfig.json b/packages/kbn-dev-utils/tsconfig.json index 3c22642edfaa1..a8cfc2cceb08b 100644 --- a/packages/kbn-dev-utils/tsconfig.json +++ b/packages/kbn-dev-utils/tsconfig.json @@ -2,12 +2,9 @@ "extends": "../../tsconfig.bazel.json", "compilerOptions": { "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "outDir": "target_types", "rootDir": "src", - "sourceMap": true, - "sourceRoot": "../../../../packages/kbn-dev-utils/src", "stripInternal": false, "types": [ "jest", diff --git a/packages/kbn-doc-links/BUILD.bazel b/packages/kbn-doc-links/BUILD.bazel index b4ae92aa8050b..13b68935c4326 100644 --- a/packages/kbn-doc-links/BUILD.bazel +++ b/packages/kbn-doc-links/BUILD.bazel @@ -4,7 +4,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-doc-links" PKG_REQUIRE_NAME = "@kbn/doc-links" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__doc-links" SOURCE_FILES = glob( [ @@ -61,10 +60,8 @@ ts_project( srcs = SRCS, deps = TYPES_DEPS, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", - source_map = True, root_dir = "src", tsconfig = ":tsconfig", ) @@ -96,7 +93,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-doc-links/tsconfig.json b/packages/kbn-doc-links/tsconfig.json index e2178f72072e9..a684de9502b5e 100644 --- a/packages/kbn-doc-links/tsconfig.json +++ b/packages/kbn-doc-links/tsconfig.json @@ -2,12 +2,9 @@ "extends": "../../tsconfig.bazel.json", "compilerOptions": { "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "outDir": "./target_types", "rootDir": "src", - "sourceMap": true, - "sourceRoot": "../../../../packages/kbn-doc-links/src", "stripInternal": false, "types": [ "jest", diff --git a/packages/kbn-docs-utils/BUILD.bazel b/packages/kbn-docs-utils/BUILD.bazel index ad6b6687b7e1a..30baa9dccb7f7 100644 --- a/packages/kbn-docs-utils/BUILD.bazel +++ b/packages/kbn-docs-utils/BUILD.bazel @@ -4,7 +4,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-docs-utils" PKG_REQUIRE_NAME = "@kbn/docs-utils" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__docs-utils" SOURCE_FILES = glob( [ @@ -67,10 +66,8 @@ ts_project( srcs = SRCS, deps = TYPES_DEPS, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", - source_map = True, root_dir = "src", tsconfig = ":tsconfig", ) @@ -102,7 +99,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-docs-utils/tsconfig.json b/packages/kbn-docs-utils/tsconfig.json index fa20d6f4be398..9a68b2e81940c 100644 --- a/packages/kbn-docs-utils/tsconfig.json +++ b/packages/kbn-docs-utils/tsconfig.json @@ -2,12 +2,9 @@ "extends": "../../tsconfig.bazel.json", "compilerOptions": { "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "outDir": "target_types", "rootDir": "src", - "sourceMap": true, - "sourceRoot": "../../../../packages/kbn-docs-utils/src", "types": [ "jest", "node" diff --git a/packages/kbn-es-archiver/BUILD.bazel b/packages/kbn-es-archiver/BUILD.bazel index fed3f248c0995..70bda4c67106f 100644 --- a/packages/kbn-es-archiver/BUILD.bazel +++ b/packages/kbn-es-archiver/BUILD.bazel @@ -4,7 +4,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-es-archiver" PKG_REQUIRE_NAME = "@kbn/es-archiver" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__es-archiver" SOURCE_FILES = glob( [ @@ -80,10 +79,8 @@ ts_project( srcs = SRCS, deps = TYPES_DEPS, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", - source_map = True, root_dir = "src", tsconfig = ":tsconfig", ) @@ -115,7 +112,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-es-archiver/tsconfig.json b/packages/kbn-es-archiver/tsconfig.json index 15c846f052b47..92bc23ab6616b 100644 --- a/packages/kbn-es-archiver/tsconfig.json +++ b/packages/kbn-es-archiver/tsconfig.json @@ -2,11 +2,8 @@ "extends": "../../tsconfig.bazel.json", "compilerOptions": { "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "outDir": "./target_types", - "sourceMap": true, - "sourceRoot": "../../../../packages/kbn-es-archiver/src", "types": [ "jest", "node" diff --git a/packages/kbn-es-query/BUILD.bazel b/packages/kbn-es-query/BUILD.bazel index 84ee5584ceabe..c7d8ad33cf7f6 100644 --- a/packages/kbn-es-query/BUILD.bazel +++ b/packages/kbn-es-query/BUILD.bazel @@ -5,7 +5,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-es-query" PKG_REQUIRE_NAME = "@kbn/es-query" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__es-query" SOURCE_FILES = glob( [ @@ -94,10 +93,8 @@ ts_project( srcs = SRCS, deps = TYPES_DEPS, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", - source_map = True, root_dir = "src", tsconfig = ":tsconfig", ) @@ -129,7 +126,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-es-query/tsconfig.json b/packages/kbn-es-query/tsconfig.json index 5b1f3be263138..4b2faade0d50a 100644 --- a/packages/kbn-es-query/tsconfig.json +++ b/packages/kbn-es-query/tsconfig.json @@ -2,11 +2,8 @@ "extends": "../../tsconfig.bazel.json", "compilerOptions": { "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "outDir": "./target_types", - "sourceMap": true, - "sourceRoot": "../../../../packages/kbn-es-query/src", "types": [ "jest", "node" diff --git a/packages/kbn-field-types/BUILD.bazel b/packages/kbn-field-types/BUILD.bazel index 0398d4d9b9ba6..77a4acaedb235 100644 --- a/packages/kbn-field-types/BUILD.bazel +++ b/packages/kbn-field-types/BUILD.bazel @@ -5,7 +5,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-field-types" PKG_REQUIRE_NAME = "@kbn/field-types" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__field-types" SOURCE_FILES = glob( [ @@ -64,10 +63,8 @@ ts_project( srcs = SRCS, deps = TYPES_DEPS, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", - source_map = True, root_dir = "src", tsconfig = ":tsconfig", ) @@ -99,7 +96,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-field-types/tsconfig.json b/packages/kbn-field-types/tsconfig.json index 150854076bbf8..f4dd1662f832f 100644 --- a/packages/kbn-field-types/tsconfig.json +++ b/packages/kbn-field-types/tsconfig.json @@ -3,11 +3,8 @@ "compilerOptions": { "outDir": "./target_types", "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "rootDir": "src", - "sourceMap": true, - "sourceRoot": "../../../../packages/kbn-field-types/src" }, "include": ["src/**/*"] } diff --git a/packages/kbn-i18n-react/BUILD.bazel b/packages/kbn-i18n-react/BUILD.bazel index 505afabfa860d..0ba7335390380 100644 --- a/packages/kbn-i18n-react/BUILD.bazel +++ b/packages/kbn-i18n-react/BUILD.bazel @@ -4,7 +4,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-i18n-react" PKG_REQUIRE_NAME = "@kbn/i18n-react" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__i18n-react" SOURCE_FILES = glob( [ @@ -74,10 +73,8 @@ ts_project( srcs = SRCS, deps = TYPES_DEPS, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", - source_map = True, root_dir = "src", tsconfig = ":tsconfig", ) @@ -109,7 +106,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-i18n-react/tsconfig.json b/packages/kbn-i18n-react/tsconfig.json index d2707938041d2..5f0c08bace6d3 100644 --- a/packages/kbn-i18n-react/tsconfig.json +++ b/packages/kbn-i18n-react/tsconfig.json @@ -2,11 +2,8 @@ "extends": "../../tsconfig.bazel.json", "compilerOptions": { "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "outDir": "./target_types", - "sourceMap": true, - "sourceRoot": "../../../../../packages/kbn-i18n-react/src", "types": [ "jest", "node" diff --git a/packages/kbn-i18n/BUILD.bazel b/packages/kbn-i18n/BUILD.bazel index 385bdafb7c8ee..07b2c0b4d773a 100644 --- a/packages/kbn-i18n/BUILD.bazel +++ b/packages/kbn-i18n/BUILD.bazel @@ -4,7 +4,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-i18n" PKG_REQUIRE_NAME = "@kbn/i18n" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__i18n" SOURCE_FILES = glob( [ @@ -75,10 +74,8 @@ ts_project( srcs = SRCS, deps = TYPES_DEPS, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", - source_map = True, root_dir = "src", tsconfig = ":tsconfig", ) @@ -110,7 +107,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-i18n/tsconfig.json b/packages/kbn-i18n/tsconfig.json index 2ac0b081b76dd..0fd24d62281b6 100644 --- a/packages/kbn-i18n/tsconfig.json +++ b/packages/kbn-i18n/tsconfig.json @@ -2,11 +2,8 @@ "extends": "../../tsconfig.bazel.json", "compilerOptions": { "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "outDir": "./target_types", - "sourceMap": true, - "sourceRoot": "../../../../../packages/kbn-i18n/src", "types": [ "jest", "node" diff --git a/packages/kbn-interpreter/BUILD.bazel b/packages/kbn-interpreter/BUILD.bazel index fd19413116f8d..d390ccbc2ebde 100644 --- a/packages/kbn-interpreter/BUILD.bazel +++ b/packages/kbn-interpreter/BUILD.bazel @@ -5,7 +5,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-interpreter" PKG_REQUIRE_NAME = "@kbn/interpreter" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__interpreter" SOURCE_FILES = glob( [ @@ -74,10 +73,8 @@ ts_project( deps = TYPES_DEPS, allow_js = True, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", - source_map = True, root_dir = "src", tsconfig = ":tsconfig", ) @@ -109,7 +106,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-interpreter/tsconfig.json b/packages/kbn-interpreter/tsconfig.json index 60f8c76cf8809..de30741c59a60 100644 --- a/packages/kbn-interpreter/tsconfig.json +++ b/packages/kbn-interpreter/tsconfig.json @@ -3,12 +3,9 @@ "compilerOptions": { "allowJs": true, "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "outDir": "./target_types", "rootDir": "src", - "sourceMap": true, - "sourceRoot": "../../../../packages/kbn-interpreter/src", "stripInternal": true, "types": [ "jest", diff --git a/packages/kbn-io-ts-utils/BUILD.bazel b/packages/kbn-io-ts-utils/BUILD.bazel index 5ecfc0acc55e8..aa0116b81efe6 100644 --- a/packages/kbn-io-ts-utils/BUILD.bazel +++ b/packages/kbn-io-ts-utils/BUILD.bazel @@ -4,7 +4,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-io-ts-utils" PKG_REQUIRE_NAME = "@kbn/io-ts-utils" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__io-ts-utils" SOURCE_FILES = glob( [ @@ -65,10 +64,8 @@ ts_project( srcs = SRCS, deps = TYPES_DEPS, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", - source_map = True, root_dir = "src", tsconfig = ":tsconfig", ) @@ -100,7 +97,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-io-ts-utils/tsconfig.json b/packages/kbn-io-ts-utils/tsconfig.json index 72d1479621345..1998f132ffd24 100644 --- a/packages/kbn-io-ts-utils/tsconfig.json +++ b/packages/kbn-io-ts-utils/tsconfig.json @@ -2,12 +2,9 @@ "extends": "../../tsconfig.bazel.json", "compilerOptions": { "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "outDir": "./target_types", "rootDir": "src", - "sourceMap": true, - "sourceRoot": "../../../../packages/kbn-io-ts-utils/src", "stripInternal": false, "types": [ "jest", diff --git a/packages/kbn-logging-mocks/BUILD.bazel b/packages/kbn-logging-mocks/BUILD.bazel index 74fb9c2651e5d..90a2046444291 100644 --- a/packages/kbn-logging-mocks/BUILD.bazel +++ b/packages/kbn-logging-mocks/BUILD.bazel @@ -4,7 +4,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-logging-mocks" PKG_REQUIRE_NAME = "@kbn/logging-mocks" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__logging-mocks" SOURCE_FILES = glob( [ @@ -57,10 +56,8 @@ ts_project( srcs = SRCS, deps = TYPES_DEPS, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", - source_map = True, root_dir = "src", tsconfig = ":tsconfig", ) @@ -92,7 +89,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-logging-mocks/tsconfig.json b/packages/kbn-logging-mocks/tsconfig.json index ce53e016c2830..ee25c507e7f56 100644 --- a/packages/kbn-logging-mocks/tsconfig.json +++ b/packages/kbn-logging-mocks/tsconfig.json @@ -2,12 +2,9 @@ "extends": "../../tsconfig.bazel.json", "compilerOptions": { "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "outDir": "target_types", "rootDir": "src", - "sourceMap": true, - "sourceRoot": "../../../../packages/kbn-logging-mocks/src", "stripInternal": false, "types": [ "jest", diff --git a/packages/kbn-logging/BUILD.bazel b/packages/kbn-logging/BUILD.bazel index 09ff3f0d83b2d..ec25b5cd3ae88 100644 --- a/packages/kbn-logging/BUILD.bazel +++ b/packages/kbn-logging/BUILD.bazel @@ -4,7 +4,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-logging" PKG_REQUIRE_NAME = "@kbn/logging" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__logging" SOURCE_FILES = glob( [ @@ -58,10 +57,8 @@ ts_project( srcs = SRCS, deps = TYPES_DEPS, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", - source_map = True, root_dir = "src", tsconfig = ":tsconfig", ) @@ -93,7 +90,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-logging/tsconfig.json b/packages/kbn-logging/tsconfig.json index a6fb0f2f73187..ee25c507e7f56 100644 --- a/packages/kbn-logging/tsconfig.json +++ b/packages/kbn-logging/tsconfig.json @@ -2,12 +2,9 @@ "extends": "../../tsconfig.bazel.json", "compilerOptions": { "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "outDir": "target_types", "rootDir": "src", - "sourceMap": true, - "sourceRoot": "../../../../packages/kbn-logging/src", "stripInternal": false, "types": [ "jest", diff --git a/packages/kbn-mapbox-gl/BUILD.bazel b/packages/kbn-mapbox-gl/BUILD.bazel index b09b783a0aebf..89cbeb4c431ae 100644 --- a/packages/kbn-mapbox-gl/BUILD.bazel +++ b/packages/kbn-mapbox-gl/BUILD.bazel @@ -5,7 +5,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-mapbox-gl" PKG_REQUIRE_NAME = "@kbn/mapbox-gl" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__mapbox-gl" SOURCE_FILES = glob( [ @@ -61,10 +60,8 @@ ts_project( srcs = SRCS, deps = TYPES_DEPS, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", - source_map = True, root_dir = "src", tsconfig = ":tsconfig", ) @@ -96,7 +93,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-mapbox-gl/tsconfig.json b/packages/kbn-mapbox-gl/tsconfig.json index e935276e91762..ee063bd30933e 100644 --- a/packages/kbn-mapbox-gl/tsconfig.json +++ b/packages/kbn-mapbox-gl/tsconfig.json @@ -2,12 +2,9 @@ "extends": "../../tsconfig.bazel.json", "compilerOptions": { "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "outDir": "target_types", "rootDir": "src", - "sourceMap": true, - "sourceRoot": "../../../../packages/kbn-mapbox-gl/src", "types": [] }, "include": [ diff --git a/packages/kbn-monaco/BUILD.bazel b/packages/kbn-monaco/BUILD.bazel index c72c46f8ed202..c615196f5c182 100644 --- a/packages/kbn-monaco/BUILD.bazel +++ b/packages/kbn-monaco/BUILD.bazel @@ -5,7 +5,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-monaco" PKG_REQUIRE_NAME = "@kbn/monaco" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__monaco" SOURCE_FILES = glob( [ @@ -96,10 +95,8 @@ ts_project( srcs = SRCS, deps = TYPES_DEPS, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", - source_map = True, root_dir = "src", tsconfig = ":tsconfig", ) @@ -131,7 +128,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-monaco/tsconfig.json b/packages/kbn-monaco/tsconfig.json index 959051b17b782..e55d786c41bc3 100644 --- a/packages/kbn-monaco/tsconfig.json +++ b/packages/kbn-monaco/tsconfig.json @@ -2,11 +2,8 @@ "extends": "../../tsconfig.bazel.json", "compilerOptions": { "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "outDir": "./target_types", - "sourceMap": true, - "sourceRoot": "../../../../packages/kbn-monaco/src", "types": [ "jest", "node" diff --git a/packages/kbn-optimizer/BUILD.bazel b/packages/kbn-optimizer/BUILD.bazel index 9486f309bd0f3..680ca0e58b8eb 100644 --- a/packages/kbn-optimizer/BUILD.bazel +++ b/packages/kbn-optimizer/BUILD.bazel @@ -4,7 +4,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-optimizer" PKG_REQUIRE_NAME = "@kbn/optimizer" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__optimizer" SOURCE_FILES = glob( [ @@ -119,10 +118,8 @@ ts_project( srcs = SRCS, deps = TYPES_DEPS, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", - source_map = True, root_dir = "src", tsconfig = ":tsconfig", ) @@ -154,7 +151,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-optimizer/tsconfig.json b/packages/kbn-optimizer/tsconfig.json index 5fbd02106e777..72de52e593cf7 100644 --- a/packages/kbn-optimizer/tsconfig.json +++ b/packages/kbn-optimizer/tsconfig.json @@ -2,12 +2,9 @@ "extends": "../../tsconfig.bazel.json", "compilerOptions": { "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "outDir": "./target_types", "rootDir": "./src", - "sourceMap": true, - "sourceRoot": "../../../../packages/kbn-optimizer/src", "types": [ "jest", "node" diff --git a/packages/kbn-plugin-generator/BUILD.bazel b/packages/kbn-plugin-generator/BUILD.bazel index 0578842a7509b..3e1565e86fe0d 100644 --- a/packages/kbn-plugin-generator/BUILD.bazel +++ b/packages/kbn-plugin-generator/BUILD.bazel @@ -4,7 +4,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-plugin-generator" PKG_REQUIRE_NAME = "@kbn/plugin-generator" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__plugin-generator" SOURCE_FILES = glob( [ @@ -86,10 +85,8 @@ ts_project( srcs = SRCS, deps = TYPES_DEPS, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", - source_map = True, root_dir = "src", tsconfig = ":tsconfig", ) @@ -121,7 +118,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-plugin-generator/tsconfig.json b/packages/kbn-plugin-generator/tsconfig.json index 5b666cf801da6..519de9b703140 100644 --- a/packages/kbn-plugin-generator/tsconfig.json +++ b/packages/kbn-plugin-generator/tsconfig.json @@ -2,11 +2,8 @@ "extends": "../../tsconfig.bazel.json", "compilerOptions": { "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "outDir": "target_types", - "sourceMap": true, - "sourceRoot": "../../../../packages/kbn-plugin-generator/src", "target": "ES2019", "types": [ "jest", diff --git a/packages/kbn-plugin-helpers/BUILD.bazel b/packages/kbn-plugin-helpers/BUILD.bazel index 7112c497f6ff8..cda9dce927e35 100644 --- a/packages/kbn-plugin-helpers/BUILD.bazel +++ b/packages/kbn-plugin-helpers/BUILD.bazel @@ -5,7 +5,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-plugin-helpers" PKG_REQUIRE_NAME = "@kbn/plugin-helpers" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__plugin-helpers" SOURCE_FILES = glob( [ @@ -79,10 +78,8 @@ ts_project( srcs = SRCS, deps = TYPES_DEPS, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", - source_map = True, root_dir = "src", tsconfig = ":tsconfig", ) @@ -114,7 +111,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-plugin-helpers/tsconfig.json b/packages/kbn-plugin-helpers/tsconfig.json index 34f3ec5e67503..0bff4cdbb85e1 100644 --- a/packages/kbn-plugin-helpers/tsconfig.json +++ b/packages/kbn-plugin-helpers/tsconfig.json @@ -2,11 +2,8 @@ "extends": "../../tsconfig.bazel.json", "compilerOptions": { "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "outDir": "target_types", - "sourceMap": true, - "sourceRoot": "../../../../packages/kbn-plugin-helpers/src", "target": "ES2018", "types": [ "jest", diff --git a/packages/kbn-react-field/BUILD.bazel b/packages/kbn-react-field/BUILD.bazel index 36ab9d7f38c56..07ecbcb61db26 100644 --- a/packages/kbn-react-field/BUILD.bazel +++ b/packages/kbn-react-field/BUILD.bazel @@ -4,7 +4,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-react-field" PKG_REQUIRE_NAME = "@kbn/react-field" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__react-field" SOURCE_FILES = glob( [ @@ -84,10 +83,8 @@ ts_project( srcs = SRCS, deps = TYPES_DEPS, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", - source_map = True, root_dir = "src", tsconfig = ":tsconfig", ) @@ -119,7 +116,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-react-field/tsconfig.json b/packages/kbn-react-field/tsconfig.json index 4d37e1825c85a..f91c1f4c54d74 100644 --- a/packages/kbn-react-field/tsconfig.json +++ b/packages/kbn-react-field/tsconfig.json @@ -2,11 +2,8 @@ "extends": "../../tsconfig.bazel.json", "compilerOptions": { "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "outDir": "./target_types", - "sourceMap": true, - "sourceRoot": "../../../../../packages/kbn-react-field/src", "types": [ "jest", "node", diff --git a/packages/kbn-rule-data-utils/BUILD.bazel b/packages/kbn-rule-data-utils/BUILD.bazel index 1e71947566722..6477b558db9cb 100644 --- a/packages/kbn-rule-data-utils/BUILD.bazel +++ b/packages/kbn-rule-data-utils/BUILD.bazel @@ -4,7 +4,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-rule-data-utils" PKG_REQUIRE_NAME = "@kbn/rule-data-utils" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__rule-data-utils" SOURCE_FILES = glob( [ @@ -60,11 +59,9 @@ ts_project( srcs = SRCS, deps = TYPES_DEPS, declaration = True, - declaration_map = True, emit_declaration_only = True, incremental = False, out_dir = "target_types", - source_map = True, root_dir = "src", tsconfig = ":tsconfig", ) @@ -96,7 +93,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-rule-data-utils/tsconfig.json b/packages/kbn-rule-data-utils/tsconfig.json index be6095d187ef3..05947e9286a74 100644 --- a/packages/kbn-rule-data-utils/tsconfig.json +++ b/packages/kbn-rule-data-utils/tsconfig.json @@ -2,13 +2,10 @@ "extends": "../../tsconfig.bazel.json", "compilerOptions": { "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "incremental": false, "outDir": "./target_types", "rootDir": "src", - "sourceMap": true, - "sourceRoot": "../../../../packages/kbn-rule-data-utils/src", "stripInternal": false, "types": [ "jest", diff --git a/packages/kbn-securitysolution-autocomplete/BUILD.bazel b/packages/kbn-securitysolution-autocomplete/BUILD.bazel index bc29f400f4d5b..16aa28e79b45b 100644 --- a/packages/kbn-securitysolution-autocomplete/BUILD.bazel +++ b/packages/kbn-securitysolution-autocomplete/BUILD.bazel @@ -4,7 +4,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-securitysolution-autocomplete" PKG_REQUIRE_NAME = "@kbn/securitysolution-autocomplete" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__securitysolution-autocomplete" SOURCE_FILES = glob( [ @@ -93,11 +92,9 @@ ts_project( srcs = SRCS, deps = TYPES_DEPS, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", root_dir = "src", - source_map = True, tsconfig = ":tsconfig", ) @@ -128,7 +125,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-securitysolution-autocomplete/tsconfig.json b/packages/kbn-securitysolution-autocomplete/tsconfig.json index b2e24676cdbd4..dfe59c663d3e1 100644 --- a/packages/kbn-securitysolution-autocomplete/tsconfig.json +++ b/packages/kbn-securitysolution-autocomplete/tsconfig.json @@ -2,11 +2,8 @@ "extends": "../../tsconfig.bazel.json", "compilerOptions": { "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "outDir": "target_types", - "sourceMap": true, - "sourceRoot": "../../../../packages/kbn-securitysolution-autocomplete/src", "rootDir": "src", "types": ["jest", "node"] }, diff --git a/packages/kbn-securitysolution-es-utils/BUILD.bazel b/packages/kbn-securitysolution-es-utils/BUILD.bazel index ceb643246249e..e36409f464b3e 100644 --- a/packages/kbn-securitysolution-es-utils/BUILD.bazel +++ b/packages/kbn-securitysolution-es-utils/BUILD.bazel @@ -4,7 +4,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-securitysolution-es-utils" PKG_REQUIRE_NAME = "@kbn/securitysolution-es-utils" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__securitysolution-es-utils" SOURCE_FILES = glob( [ @@ -65,11 +64,9 @@ ts_project( srcs = SRCS, deps = TYPES_DEPS, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", root_dir = "src", - source_map = True, tsconfig = ":tsconfig", ) @@ -100,7 +97,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-securitysolution-es-utils/tsconfig.json b/packages/kbn-securitysolution-es-utils/tsconfig.json index e5b1c99d3f598..305954d669b75 100644 --- a/packages/kbn-securitysolution-es-utils/tsconfig.json +++ b/packages/kbn-securitysolution-es-utils/tsconfig.json @@ -2,12 +2,9 @@ "extends": "../../tsconfig.bazel.json", "compilerOptions": { "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "outDir": "target_types", "rootDir": "src", - "sourceMap": true, - "sourceRoot": "../../../../packages/kbn-securitysolution-es-utils/src", "types": [ "jest", "node" diff --git a/packages/kbn-securitysolution-hook-utils/BUILD.bazel b/packages/kbn-securitysolution-hook-utils/BUILD.bazel index 4f46992ad13d6..363d4f688783d 100644 --- a/packages/kbn-securitysolution-hook-utils/BUILD.bazel +++ b/packages/kbn-securitysolution-hook-utils/BUILD.bazel @@ -4,7 +4,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-securitysolution-hook-utils" PKG_REQUIRE_NAME = "@kbn/securitysolution-hook-utils" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__securitysolution-hook-utils" SOURCE_FILES = glob( [ @@ -72,11 +71,9 @@ ts_project( srcs = SRCS, deps = TYPES_DEPS, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", root_dir = "src", - source_map = True, tsconfig = ":tsconfig", ) @@ -107,7 +104,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-securitysolution-hook-utils/tsconfig.json b/packages/kbn-securitysolution-hook-utils/tsconfig.json index 4782331e31c44..6a1981335d68e 100644 --- a/packages/kbn-securitysolution-hook-utils/tsconfig.json +++ b/packages/kbn-securitysolution-hook-utils/tsconfig.json @@ -2,12 +2,9 @@ "extends": "../../tsconfig.bazel.json", "compilerOptions": { "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "outDir": "target_types", "rootDir": "src", - "sourceMap": true, - "sourceRoot": "../../../../packages/kbn-securitysolution-hook-utils/src", "types": ["jest", "node"] }, "include": ["src/**/*"] diff --git a/packages/kbn-securitysolution-io-ts-alerting-types/BUILD.bazel b/packages/kbn-securitysolution-io-ts-alerting-types/BUILD.bazel index 61cdb9cccd292..0a06de87e8303 100644 --- a/packages/kbn-securitysolution-io-ts-alerting-types/BUILD.bazel +++ b/packages/kbn-securitysolution-io-ts-alerting-types/BUILD.bazel @@ -4,7 +4,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-securitysolution-io-ts-alerting-types" PKG_REQUIRE_NAME = "@kbn/securitysolution-io-ts-alerting-types" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__securitysolution-io-ts-alerting-types" SOURCE_FILES = glob( [ @@ -75,11 +74,9 @@ ts_project( srcs = SRCS, deps = TYPES_DEPS, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", root_dir = "src", - source_map = True, tsconfig = ":tsconfig", ) @@ -110,7 +107,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-securitysolution-io-ts-alerting-types/tsconfig.json b/packages/kbn-securitysolution-io-ts-alerting-types/tsconfig.json index 0e58572c1b82b..305954d669b75 100644 --- a/packages/kbn-securitysolution-io-ts-alerting-types/tsconfig.json +++ b/packages/kbn-securitysolution-io-ts-alerting-types/tsconfig.json @@ -2,12 +2,9 @@ "extends": "../../tsconfig.bazel.json", "compilerOptions": { "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "outDir": "target_types", "rootDir": "src", - "sourceMap": true, - "sourceRoot": "../../../../packages/kbn-securitysolution-io-ts-alerting-types/src", "types": [ "jest", "node" diff --git a/packages/kbn-securitysolution-io-ts-list-types/BUILD.bazel b/packages/kbn-securitysolution-io-ts-list-types/BUILD.bazel index 66e52c1f509b4..d4ba51713d7e3 100644 --- a/packages/kbn-securitysolution-io-ts-list-types/BUILD.bazel +++ b/packages/kbn-securitysolution-io-ts-list-types/BUILD.bazel @@ -4,7 +4,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-securitysolution-io-ts-list-types" PKG_REQUIRE_NAME = "@kbn/securitysolution-io-ts-list-types" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__securitysolution-io-ts-list-types" SOURCE_FILES = glob( [ @@ -75,11 +74,9 @@ ts_project( srcs = SRCS, deps = TYPES_DEPS, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", root_dir = "src", - source_map = True, tsconfig = ":tsconfig", ) @@ -110,7 +107,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-securitysolution-io-ts-list-types/tsconfig.json b/packages/kbn-securitysolution-io-ts-list-types/tsconfig.json index ca0ea969f89d8..305954d669b75 100644 --- a/packages/kbn-securitysolution-io-ts-list-types/tsconfig.json +++ b/packages/kbn-securitysolution-io-ts-list-types/tsconfig.json @@ -2,12 +2,9 @@ "extends": "../../tsconfig.bazel.json", "compilerOptions": { "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "outDir": "target_types", "rootDir": "src", - "sourceMap": true, - "sourceRoot": "../../../../packages/kbn-securitysolution-io-ts-list-types/src", "types": [ "jest", "node" diff --git a/packages/kbn-securitysolution-io-ts-types/BUILD.bazel b/packages/kbn-securitysolution-io-ts-types/BUILD.bazel index a4f817ac55f09..794eab1635b73 100644 --- a/packages/kbn-securitysolution-io-ts-types/BUILD.bazel +++ b/packages/kbn-securitysolution-io-ts-types/BUILD.bazel @@ -4,7 +4,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-securitysolution-io-ts-types" PKG_REQUIRE_NAME = "@kbn/securitysolution-io-ts-types" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__securitysolution-io-ts-types" SOURCE_FILES = glob( [ @@ -73,11 +72,9 @@ ts_project( srcs = SRCS, deps = TYPES_DEPS, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", root_dir = "src", - source_map = True, tsconfig = ":tsconfig", ) @@ -108,7 +105,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-securitysolution-io-ts-types/tsconfig.json b/packages/kbn-securitysolution-io-ts-types/tsconfig.json index c640181145be8..305954d669b75 100644 --- a/packages/kbn-securitysolution-io-ts-types/tsconfig.json +++ b/packages/kbn-securitysolution-io-ts-types/tsconfig.json @@ -2,12 +2,9 @@ "extends": "../../tsconfig.bazel.json", "compilerOptions": { "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "outDir": "target_types", "rootDir": "src", - "sourceMap": true, - "sourceRoot": "../../../../packages/kbn-securitysolution-io-ts-types/src", "types": [ "jest", "node" diff --git a/packages/kbn-securitysolution-io-ts-utils/BUILD.bazel b/packages/kbn-securitysolution-io-ts-utils/BUILD.bazel index 46afff1a6affb..0229acdb474e4 100644 --- a/packages/kbn-securitysolution-io-ts-utils/BUILD.bazel +++ b/packages/kbn-securitysolution-io-ts-utils/BUILD.bazel @@ -4,7 +4,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-securitysolution-io-ts-utils" PKG_REQUIRE_NAME = "@kbn/securitysolution-io-ts-utils" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__securitysolution-io-ts-utils" SOURCE_FILES = glob( [ @@ -76,11 +75,9 @@ ts_project( srcs = SRCS, deps = TYPES_DEPS, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", root_dir = "src", - source_map = True, tsconfig = ":tsconfig", ) @@ -111,7 +108,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-securitysolution-io-ts-utils/tsconfig.json b/packages/kbn-securitysolution-io-ts-utils/tsconfig.json index 7c71143083d4d..305954d669b75 100644 --- a/packages/kbn-securitysolution-io-ts-utils/tsconfig.json +++ b/packages/kbn-securitysolution-io-ts-utils/tsconfig.json @@ -2,12 +2,9 @@ "extends": "../../tsconfig.bazel.json", "compilerOptions": { "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "outDir": "target_types", "rootDir": "src", - "sourceMap": true, - "sourceRoot": "../../../../packages/kbn-securitysolution-io-ts-utils/src", "types": [ "jest", "node" diff --git a/packages/kbn-securitysolution-list-api/BUILD.bazel b/packages/kbn-securitysolution-list-api/BUILD.bazel index 587b564ab9192..c73b9b4ea7503 100644 --- a/packages/kbn-securitysolution-list-api/BUILD.bazel +++ b/packages/kbn-securitysolution-list-api/BUILD.bazel @@ -4,7 +4,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-securitysolution-list-api" PKG_REQUIRE_NAME = "@kbn/securitysolution-list-api" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__securitysolution-list-api" SOURCE_FILES = glob( [ @@ -75,11 +74,9 @@ ts_project( deps = TYPES_DEPS, args = ["--pretty"], declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", root_dir = "src", - source_map = True, tsconfig = ":tsconfig", ) @@ -110,7 +107,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-securitysolution-list-api/tsconfig.json b/packages/kbn-securitysolution-list-api/tsconfig.json index d51cd3ac71d8d..305954d669b75 100644 --- a/packages/kbn-securitysolution-list-api/tsconfig.json +++ b/packages/kbn-securitysolution-list-api/tsconfig.json @@ -2,12 +2,9 @@ "extends": "../../tsconfig.bazel.json", "compilerOptions": { "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "outDir": "target_types", "rootDir": "src", - "sourceMap": true, - "sourceRoot": "../../../../packages/kbn-securitysolution-list-api/src", "types": [ "jest", "node" diff --git a/packages/kbn-securitysolution-list-constants/BUILD.bazel b/packages/kbn-securitysolution-list-constants/BUILD.bazel index 3802e3a581969..339743721bc84 100644 --- a/packages/kbn-securitysolution-list-constants/BUILD.bazel +++ b/packages/kbn-securitysolution-list-constants/BUILD.bazel @@ -4,7 +4,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-securitysolution-list-constants" PKG_REQUIRE_NAME = "@kbn/securitysolution-list-constants" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__securitysolution-list-constants" SOURCE_FILES = glob( [ @@ -63,11 +62,9 @@ ts_project( deps = TYPES_DEPS, args = ["--pretty"], declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", root_dir = "src", - source_map = True, tsconfig = ":tsconfig", ) @@ -98,7 +95,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-securitysolution-list-constants/tsconfig.json b/packages/kbn-securitysolution-list-constants/tsconfig.json index 8697cbd61580a..305954d669b75 100644 --- a/packages/kbn-securitysolution-list-constants/tsconfig.json +++ b/packages/kbn-securitysolution-list-constants/tsconfig.json @@ -2,12 +2,9 @@ "extends": "../../tsconfig.bazel.json", "compilerOptions": { "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "outDir": "target_types", "rootDir": "src", - "sourceMap": true, - "sourceRoot": "../../../../packages/kbn-securitysolution-list-constants/src", "types": [ "jest", "node" diff --git a/packages/kbn-securitysolution-list-hooks/BUILD.bazel b/packages/kbn-securitysolution-list-hooks/BUILD.bazel index 7b3fc87b6f87e..d709a0ddfbb80 100644 --- a/packages/kbn-securitysolution-list-hooks/BUILD.bazel +++ b/packages/kbn-securitysolution-list-hooks/BUILD.bazel @@ -4,7 +4,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-securitysolution-list-hooks" PKG_REQUIRE_NAME = "@kbn/securitysolution-list-hooks" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__securitysolution-list-hooks" SOURCE_FILES = glob( [ @@ -83,11 +82,9 @@ ts_project( srcs = SRCS, deps = TYPES_DEPS, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", root_dir = "src", - source_map = True, tsconfig = ":tsconfig", ) @@ -118,7 +115,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-securitysolution-list-hooks/tsconfig.json b/packages/kbn-securitysolution-list-hooks/tsconfig.json index 41ec03f2ebf35..305954d669b75 100644 --- a/packages/kbn-securitysolution-list-hooks/tsconfig.json +++ b/packages/kbn-securitysolution-list-hooks/tsconfig.json @@ -2,12 +2,9 @@ "extends": "../../tsconfig.bazel.json", "compilerOptions": { "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "outDir": "target_types", "rootDir": "src", - "sourceMap": true, - "sourceRoot": "../../../../packages/kbn-securitysolution-list-hooks/src", "types": [ "jest", "node" diff --git a/packages/kbn-securitysolution-list-utils/BUILD.bazel b/packages/kbn-securitysolution-list-utils/BUILD.bazel index 87e546a1fff08..642e4a970aca2 100644 --- a/packages/kbn-securitysolution-list-utils/BUILD.bazel +++ b/packages/kbn-securitysolution-list-utils/BUILD.bazel @@ -4,7 +4,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-securitysolution-list-utils" PKG_REQUIRE_NAME = "@kbn/securitysolution-list-utils" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__securitysolution-list-utils" SOURCE_FILES = glob( [ @@ -82,11 +81,9 @@ ts_project( srcs = SRCS, deps = TYPES_DEPS, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", root_dir = "src", - source_map = True, tsconfig = ":tsconfig", ) @@ -118,7 +115,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-securitysolution-list-utils/tsconfig.json b/packages/kbn-securitysolution-list-utils/tsconfig.json index fa50bd7981214..305954d669b75 100644 --- a/packages/kbn-securitysolution-list-utils/tsconfig.json +++ b/packages/kbn-securitysolution-list-utils/tsconfig.json @@ -2,12 +2,9 @@ "extends": "../../tsconfig.bazel.json", "compilerOptions": { "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "outDir": "target_types", "rootDir": "src", - "sourceMap": true, - "sourceRoot": "../../../../packages/kbn-securitysolution-list-utils/src", "types": [ "jest", "node" diff --git a/packages/kbn-securitysolution-rules/BUILD.bazel b/packages/kbn-securitysolution-rules/BUILD.bazel index 7158f759f4466..80a27a426fbb2 100644 --- a/packages/kbn-securitysolution-rules/BUILD.bazel +++ b/packages/kbn-securitysolution-rules/BUILD.bazel @@ -4,7 +4,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-securitysolution-rules" PKG_REQUIRE_NAME = "@kbn/securitysolution-rules" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__securitysolution-rules" SOURCE_FILES = glob( [ @@ -63,11 +62,9 @@ ts_project( srcs = SRCS, deps = TYPES_DEPS, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", root_dir = "src", - source_map = True, tsconfig = ":tsconfig", ) @@ -98,7 +95,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-securitysolution-rules/tsconfig.json b/packages/kbn-securitysolution-rules/tsconfig.json index 3895e13ad28ed..305954d669b75 100644 --- a/packages/kbn-securitysolution-rules/tsconfig.json +++ b/packages/kbn-securitysolution-rules/tsconfig.json @@ -2,12 +2,9 @@ "extends": "../../tsconfig.bazel.json", "compilerOptions": { "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "outDir": "target_types", "rootDir": "src", - "sourceMap": true, - "sourceRoot": "../../../../packages/kbn-securitysolution-rules/src", "types": [ "jest", "node" diff --git a/packages/kbn-securitysolution-t-grid/BUILD.bazel b/packages/kbn-securitysolution-t-grid/BUILD.bazel index e0898f90d7f87..6ee620199a6e6 100644 --- a/packages/kbn-securitysolution-t-grid/BUILD.bazel +++ b/packages/kbn-securitysolution-t-grid/BUILD.bazel @@ -4,7 +4,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-securitysolution-t-grid" PKG_REQUIRE_NAME = "@kbn/securitysolution-t-grid" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__securitysolution-t-grid" SOURCE_FILES = glob( [ @@ -72,11 +71,9 @@ ts_project( srcs = SRCS, deps = TYPES_DEPS, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", root_dir = "src", - source_map = True, tsconfig = ":tsconfig", ) @@ -107,7 +104,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-securitysolution-t-grid/tsconfig.json b/packages/kbn-securitysolution-t-grid/tsconfig.json index 3c701d149ab2e..305954d669b75 100644 --- a/packages/kbn-securitysolution-t-grid/tsconfig.json +++ b/packages/kbn-securitysolution-t-grid/tsconfig.json @@ -2,12 +2,9 @@ "extends": "../../tsconfig.bazel.json", "compilerOptions": { "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "outDir": "target_types", "rootDir": "src", - "sourceMap": true, - "sourceRoot": "../../../../packages/kbn-securitysolution-t-grid/src", "types": [ "jest", "node" diff --git a/packages/kbn-securitysolution-utils/BUILD.bazel b/packages/kbn-securitysolution-utils/BUILD.bazel index d22e31daacd55..cfb6b722ea2e6 100644 --- a/packages/kbn-securitysolution-utils/BUILD.bazel +++ b/packages/kbn-securitysolution-utils/BUILD.bazel @@ -4,7 +4,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-securitysolution-utils" PKG_REQUIRE_NAME = "@kbn/securitysolution-utils" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__securitysolution-utils" SOURCE_FILES = glob( [ @@ -61,11 +60,9 @@ ts_project( srcs = SRCS, deps = TYPES_DEPS, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", root_dir = "src", - source_map = True, tsconfig = ":tsconfig", ) @@ -96,7 +93,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-securitysolution-utils/tsconfig.json b/packages/kbn-securitysolution-utils/tsconfig.json index 23fdf3178e174..305954d669b75 100644 --- a/packages/kbn-securitysolution-utils/tsconfig.json +++ b/packages/kbn-securitysolution-utils/tsconfig.json @@ -2,12 +2,9 @@ "extends": "../../tsconfig.bazel.json", "compilerOptions": { "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "outDir": "target_types", "rootDir": "src", - "sourceMap": true, - "sourceRoot": "../../../../packages/kbn-securitysolution-utils/src", "types": [ "jest", "node" diff --git a/packages/kbn-server-http-tools/BUILD.bazel b/packages/kbn-server-http-tools/BUILD.bazel index e524078a8ba89..29ca48adc566e 100644 --- a/packages/kbn-server-http-tools/BUILD.bazel +++ b/packages/kbn-server-http-tools/BUILD.bazel @@ -4,7 +4,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-server-http-tools" PKG_REQUIRE_NAME = "@kbn/server-http-tools" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__server-http-tools" SOURCE_FILES = glob( [ @@ -72,10 +71,8 @@ ts_project( srcs = SRCS, deps = TYPES_DEPS, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", - source_map = True, root_dir = "src", tsconfig = ":tsconfig", ) @@ -107,7 +104,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-server-http-tools/tsconfig.json b/packages/kbn-server-http-tools/tsconfig.json index e378e41c3828b..c89835eada818 100644 --- a/packages/kbn-server-http-tools/tsconfig.json +++ b/packages/kbn-server-http-tools/tsconfig.json @@ -2,12 +2,9 @@ "extends": "../../tsconfig.bazel.json", "compilerOptions": { "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "outDir": "./target/types", "rootDir": "src", - "sourceMap": true, - "sourceRoot": "../../../../packages/kbn-server-http-tools/src", "types": [ "jest", "node" diff --git a/packages/kbn-server-route-repository/BUILD.bazel b/packages/kbn-server-route-repository/BUILD.bazel index a0e1cf41dcf8f..06c09260e2fa6 100644 --- a/packages/kbn-server-route-repository/BUILD.bazel +++ b/packages/kbn-server-route-repository/BUILD.bazel @@ -4,7 +4,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-server-route-repository" PKG_REQUIRE_NAME = "@kbn/server-route-repository" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__server-route-repository" SOURCE_FILES = glob( [ @@ -68,10 +67,8 @@ ts_project( srcs = SRCS, deps = TYPES_DEPS, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", - source_map = True, root_dir = "src", tsconfig = ":tsconfig", ) @@ -103,7 +100,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-server-route-repository/tsconfig.json b/packages/kbn-server-route-repository/tsconfig.json index 447a2084926c6..db908eacc6c35 100644 --- a/packages/kbn-server-route-repository/tsconfig.json +++ b/packages/kbn-server-route-repository/tsconfig.json @@ -2,12 +2,9 @@ "extends": "../../tsconfig.bazel.json", "compilerOptions": { "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "outDir": "./target_types", "rootDir": "src", - "sourceMap": true, - "sourceRoot": "../../../../packages/kbn-server-route-repository/src", "stripInternal": false, "types": [ "jest", diff --git a/packages/kbn-std/BUILD.bazel b/packages/kbn-std/BUILD.bazel index 1e45803dbdcf1..08cfa2a2a1308 100644 --- a/packages/kbn-std/BUILD.bazel +++ b/packages/kbn-std/BUILD.bazel @@ -4,7 +4,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-std" PKG_REQUIRE_NAME = "@kbn/std" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__std" SOURCE_FILES = glob( [ @@ -67,10 +66,8 @@ ts_project( srcs = SRCS, deps = TYPES_DEPS, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", - source_map = True, root_dir = "src", tsconfig = ":tsconfig", ) @@ -102,7 +99,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-std/tsconfig.json b/packages/kbn-std/tsconfig.json index 2674ca26e96d5..04d1a54cc3951 100644 --- a/packages/kbn-std/tsconfig.json +++ b/packages/kbn-std/tsconfig.json @@ -2,12 +2,9 @@ "extends": "../../tsconfig.bazel.json", "compilerOptions": { "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "outDir": "./target_types", "rootDir": "src", - "sourceMap": true, - "sourceRoot": "../../../../packages/kbn-std/src", "stripInternal": true, "types": [ "jest", diff --git a/packages/kbn-storybook/BUILD.bazel b/packages/kbn-storybook/BUILD.bazel index 686de744b656f..ed7b167a30078 100644 --- a/packages/kbn-storybook/BUILD.bazel +++ b/packages/kbn-storybook/BUILD.bazel @@ -4,7 +4,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-storybook" PKG_REQUIRE_NAME = "@kbn/storybook" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__storybook" SOURCE_FILES = glob( [ @@ -93,11 +92,9 @@ ts_project( srcs = SRCS, deps = TYPES_DEPS, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", root_dir = "src", - source_map = True, tsconfig = ":tsconfig", ) @@ -128,7 +125,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-storybook/tsconfig.json b/packages/kbn-storybook/tsconfig.json index 0ccf3e78c8288..53e689b569e5e 100644 --- a/packages/kbn-storybook/tsconfig.json +++ b/packages/kbn-storybook/tsconfig.json @@ -2,14 +2,11 @@ "extends": "../../tsconfig.bazel.json", "compilerOptions": { "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "incremental": false, "outDir": "target_types", "rootDir": "src", "skipLibCheck": true, - "sourceMap": true, - "sourceRoot": "../../../../packages/kbn-storybook", "target": "es2015", "types": ["node"] }, diff --git a/packages/kbn-telemetry-tools/BUILD.bazel b/packages/kbn-telemetry-tools/BUILD.bazel index 1f53e4b71ae21..50336dc44da00 100644 --- a/packages/kbn-telemetry-tools/BUILD.bazel +++ b/packages/kbn-telemetry-tools/BUILD.bazel @@ -4,7 +4,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-telemetry-tools" PKG_REQUIRE_NAME = "@kbn/telemetry-tools" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__telemetry-tools" SOURCE_FILES = glob( [ @@ -71,10 +70,8 @@ ts_project( srcs = SRCS, deps = TYPES_DEPS, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", - source_map = True, root_dir = "src", tsconfig = ":tsconfig", ) @@ -106,7 +103,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-telemetry-tools/tsconfig.json b/packages/kbn-telemetry-tools/tsconfig.json index 034d7c0c6e745..25e1d341ac07b 100644 --- a/packages/kbn-telemetry-tools/tsconfig.json +++ b/packages/kbn-telemetry-tools/tsconfig.json @@ -2,13 +2,10 @@ "extends": "../../tsconfig.bazel.json", "compilerOptions": { "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "isolatedModules": true, "outDir": "./target_types", "rootDir": "src", - "sourceMap": true, - "sourceRoot": "../../../../packages/kbn-telemetry-tools/src", "types": [ "jest", "node" diff --git a/packages/kbn-test-jest-helpers/BUILD.bazel b/packages/kbn-test-jest-helpers/BUILD.bazel index c713e24592944..d910fab5295d5 100644 --- a/packages/kbn-test-jest-helpers/BUILD.bazel +++ b/packages/kbn-test-jest-helpers/BUILD.bazel @@ -5,7 +5,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-test-jest-helpers" PKG_REQUIRE_NAME = "@kbn/test-jest-helpers" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__test-jest-helpers" SOURCE_FILES = glob( [ @@ -133,10 +132,8 @@ ts_project( srcs = SRCS, deps = TYPES_DEPS, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", - source_map = True, root_dir = "src", tsconfig = ":tsconfig", ) @@ -168,7 +165,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-test-jest-helpers/tsconfig.json b/packages/kbn-test-jest-helpers/tsconfig.json index 7a1121c9e91f1..72d996c69e2da 100644 --- a/packages/kbn-test-jest-helpers/tsconfig.json +++ b/packages/kbn-test-jest-helpers/tsconfig.json @@ -2,13 +2,10 @@ "extends": "../../tsconfig.bazel.json", "compilerOptions": { "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "outDir": "./target_types", "stripInternal": true, "rootDir": "src", - "sourceMap": true, - "sourceRoot": "../../../../../../packages/kbn-test-jest-helpers/src", "types": ["jest", "node"] }, "include": ["src/**/*"], diff --git a/packages/kbn-test/BUILD.bazel b/packages/kbn-test/BUILD.bazel index 233aeab6250b1..6732b08d8bc72 100644 --- a/packages/kbn-test/BUILD.bazel +++ b/packages/kbn-test/BUILD.bazel @@ -5,7 +5,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-test" PKG_REQUIRE_NAME = "@kbn/test" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__test" SOURCE_FILES = glob( [ @@ -139,10 +138,8 @@ ts_project( srcs = SRCS, deps = TYPES_DEPS, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", - source_map = True, root_dir = "src", tsconfig = ":tsconfig", ) @@ -174,7 +171,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-test/tsconfig.json b/packages/kbn-test/tsconfig.json index 7ba83019b0075..aa9fb4f04135d 100644 --- a/packages/kbn-test/tsconfig.json +++ b/packages/kbn-test/tsconfig.json @@ -2,13 +2,10 @@ "extends": "../../tsconfig.bazel.json", "compilerOptions": { "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "outDir": "./target_types", "stripInternal": true, "rootDir": "src", - "sourceMap": true, - "sourceRoot": "../../../../../../packages/kbn-test/src", "types": ["jest", "node"] }, "include": ["src/**/*", "index.d.ts"], diff --git a/packages/kbn-typed-react-router-config/BUILD.bazel b/packages/kbn-typed-react-router-config/BUILD.bazel index 62fd6adf5bb26..c2a5aa84dbb2d 100644 --- a/packages/kbn-typed-react-router-config/BUILD.bazel +++ b/packages/kbn-typed-react-router-config/BUILD.bazel @@ -4,7 +4,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-typed-react-router-config" PKG_REQUIRE_NAME = "@kbn/typed-react-router-config" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__typed-react-router-config" SOURCE_FILES = glob( [ @@ -83,10 +82,8 @@ ts_project( srcs = SRCS, deps = TYPES_DEPS, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", - source_map = True, root_dir = "src", tsconfig = ":tsconfig", ) @@ -118,7 +115,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-typed-react-router-config/tsconfig.json b/packages/kbn-typed-react-router-config/tsconfig.json index 8e17781119ee9..2619b0ff8f9d3 100644 --- a/packages/kbn-typed-react-router-config/tsconfig.json +++ b/packages/kbn-typed-react-router-config/tsconfig.json @@ -2,12 +2,9 @@ "extends": "../../tsconfig.bazel.json", "compilerOptions": { "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "isolatedModules": true, "outDir": "./target_types", - "sourceMap": true, - "sourceRoot": "../../../../../packages/kbn-typed-react-router-config/src", "stripInternal": true, "types": [ "node", diff --git a/packages/kbn-ui-shared-deps-npm/BUILD.bazel b/packages/kbn-ui-shared-deps-npm/BUILD.bazel index 22d51e260bcc0..17bbb09bd36e3 100644 --- a/packages/kbn-ui-shared-deps-npm/BUILD.bazel +++ b/packages/kbn-ui-shared-deps-npm/BUILD.bazel @@ -5,7 +5,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-ui-shared-deps-npm" PKG_REQUIRE_NAME = "@kbn/ui-shared-deps-npm" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__ui-shared-deps-npm" SOURCE_FILES = glob( [ @@ -121,11 +120,9 @@ ts_project( deps = TYPES_DEPS, allow_js = True, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", root_dir = "src", - source_map = True, tsconfig = ":tsconfig", ) @@ -174,7 +171,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-ui-shared-deps-npm/tsconfig.json b/packages/kbn-ui-shared-deps-npm/tsconfig.json index 107d82aa59ee8..a8a821708d036 100644 --- a/packages/kbn-ui-shared-deps-npm/tsconfig.json +++ b/packages/kbn-ui-shared-deps-npm/tsconfig.json @@ -3,12 +3,9 @@ "compilerOptions": { "allowJs": true, "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "outDir": "./target_types", "rootDir": "src", - "sourceMap": true, - "sourceRoot": "../../../../packages/kbn-ui-shared-deps-npm/src", "types": [ "node", ] diff --git a/packages/kbn-ui-shared-deps-src/BUILD.bazel b/packages/kbn-ui-shared-deps-src/BUILD.bazel index 3617956b15c4a..295f6fa0594ed 100644 --- a/packages/kbn-ui-shared-deps-src/BUILD.bazel +++ b/packages/kbn-ui-shared-deps-src/BUILD.bazel @@ -5,7 +5,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-ui-shared-deps-src" PKG_REQUIRE_NAME = "@kbn/ui-shared-deps-src" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__ui-shared-deps-src" SOURCE_FILES = glob( [ @@ -77,11 +76,9 @@ ts_project( deps = TYPES_DEPS, allow_js = True, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", root_dir = "src", - source_map = True, tsconfig = ":tsconfig", ) @@ -130,7 +127,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-ui-shared-deps-src/tsconfig.json b/packages/kbn-ui-shared-deps-src/tsconfig.json index 521fb122e4659..a8a821708d036 100644 --- a/packages/kbn-ui-shared-deps-src/tsconfig.json +++ b/packages/kbn-ui-shared-deps-src/tsconfig.json @@ -3,12 +3,9 @@ "compilerOptions": { "allowJs": true, "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "outDir": "./target_types", "rootDir": "src", - "sourceMap": true, - "sourceRoot": "../../../../packages/kbn-ui-shared-deps-src/src", "types": [ "node", ] diff --git a/packages/kbn-ui-theme/BUILD.bazel b/packages/kbn-ui-theme/BUILD.bazel index 8e388efe23757..5a848ddcc838f 100644 --- a/packages/kbn-ui-theme/BUILD.bazel +++ b/packages/kbn-ui-theme/BUILD.bazel @@ -4,7 +4,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-ui-theme" PKG_REQUIRE_NAME = "@kbn/ui-theme" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__ui-theme" SOURCE_FILES = glob( [ @@ -61,10 +60,8 @@ ts_project( srcs = SRCS, deps = TYPES_DEPS, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", - source_map = True, root_dir = "src", tsconfig = ":tsconfig", ) @@ -96,7 +93,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-ui-theme/tsconfig.json b/packages/kbn-ui-theme/tsconfig.json index e1c27e88f1c91..0fd9a15b5dbf8 100644 --- a/packages/kbn-ui-theme/tsconfig.json +++ b/packages/kbn-ui-theme/tsconfig.json @@ -2,11 +2,8 @@ "extends": "../../tsconfig.bazel.json", "compilerOptions": { "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "outDir": "./target_types", - "sourceMap": true, - "sourceRoot": "../../../../packages/kbn-ui-theme/src", "stripInternal": true, "types": ["node"] }, diff --git a/packages/kbn-utility-types/BUILD.bazel b/packages/kbn-utility-types/BUILD.bazel index 159ab134684f8..c556751d7550e 100644 --- a/packages/kbn-utility-types/BUILD.bazel +++ b/packages/kbn-utility-types/BUILD.bazel @@ -4,7 +4,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-utility-types" PKG_REQUIRE_NAME = "@kbn/utility-types" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__utility-types" SOURCE_FILES = glob([ "src/jest/index.ts", @@ -56,10 +55,8 @@ ts_project( srcs = SRCS, deps = TYPES_DEPS, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", - source_map = True, root_dir = "src", tsconfig = ":tsconfig", ) @@ -91,7 +88,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-utility-types/tsconfig.json b/packages/kbn-utility-types/tsconfig.json index 997bcf9e0c45b..1d7104a6fc254 100644 --- a/packages/kbn-utility-types/tsconfig.json +++ b/packages/kbn-utility-types/tsconfig.json @@ -2,12 +2,9 @@ "extends": "../../tsconfig.bazel.json", "compilerOptions": { "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "outDir": "./target_types", "rootDir": "./src", - "sourceMap": true, - "sourceRoot": "../../../../packages/kbn-utility-types", "stripInternal": true, "types": [ "jest", diff --git a/packages/kbn-utils/BUILD.bazel b/packages/kbn-utils/BUILD.bazel index 6ac23129a1d03..b60c60af43c25 100644 --- a/packages/kbn-utils/BUILD.bazel +++ b/packages/kbn-utils/BUILD.bazel @@ -4,7 +4,6 @@ load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", PKG_BASE_NAME = "kbn-utils" PKG_REQUIRE_NAME = "@kbn/utils" -TYPES_PKG_REQUIRE_NAME = "@types/kbn__utils" SOURCE_FILES = glob( [ @@ -60,10 +59,8 @@ ts_project( srcs = SRCS, deps = TYPES_DEPS, declaration = True, - declaration_map = True, emit_declaration_only = True, out_dir = "target_types", - source_map = True, root_dir = "src", tsconfig = ":tsconfig", ) @@ -95,7 +92,7 @@ pkg_npm_types( name = "npm_module_types", srcs = SRCS, deps = [":tsc_types"], - package_name = TYPES_PKG_REQUIRE_NAME, + package_name = PKG_REQUIRE_NAME, tsconfig = ":tsconfig", visibility = ["//visibility:public"], ) diff --git a/packages/kbn-utils/tsconfig.json b/packages/kbn-utils/tsconfig.json index 85c26f42a695c..a2851d55c0a45 100644 --- a/packages/kbn-utils/tsconfig.json +++ b/packages/kbn-utils/tsconfig.json @@ -2,11 +2,8 @@ "extends": "../../tsconfig.bazel.json", "compilerOptions": { "declaration": true, - "declarationMap": true, "emitDeclarationOnly": true, "outDir": "target_types", - "sourceMap": true, - "sourceRoot": "../../../../packages/kbn-utils/src", "types": [ "jest", "node" diff --git a/src/dev/bazel/pkg_npm_types/pkg_npm_types.bzl b/src/dev/bazel/pkg_npm_types/pkg_npm_types.bzl index 4651e9264ef50..ed48228bc9587 100644 --- a/src/dev/bazel/pkg_npm_types/pkg_npm_types.bzl +++ b/src/dev/bazel/pkg_npm_types/pkg_npm_types.bzl @@ -33,6 +33,9 @@ def _collect_inputs_deps_and_transitive_types_deps(ctx): deps_files = depset(transitive = deps_files_depsets).to_list() return [deps_files, transitive_types_deps] +def _get_type_package_name(actualName): + return "@types/" + actualName.replace("@", "").replace("/", "__") + def _calculate_entrypoint_path(ctx): return _join(ctx.bin_dir.path, ctx.label.package, _get_types_outdir_name(ctx), ctx.attr.entrypoint_name) @@ -78,7 +81,7 @@ def _pkg_npm_types_impl(ctx): # gathering template args template_args = [ - "NAME", ctx.attr.package_name + "NAME", _get_type_package_name(ctx.attr.package_name) ] # layout api extractor arguments @@ -119,7 +122,7 @@ def _pkg_npm_types_impl(ctx): deps = transitive_types_deps, ), LinkablePackageInfo( - package_name = ctx.attr.package_name, + package_name = _get_type_package_name(ctx.attr.package_name), package_path = "", path = package_dir.path, files = package_dir_depset, From f0803c9a3b7f815248a675046cd76cef1b3f33d3 Mon Sep 17 00:00:00 2001 From: Christos Nasikas Date: Thu, 24 Feb 2022 20:58:47 +0200 Subject: [PATCH 019/102] [Cases] Show release phase badges to page titles (#126152) --- .../public/common/mock/test_providers.tsx | 18 +++-- ..._cases_add_to_existing_case_modal.test.tsx | 1 + .../public/components/cases_context/index.tsx | 6 +- .../use_cases_add_to_new_case_flyout.test.tsx | 1 + .../editable_title.test.tsx.snap | 51 ++++++------ .../__snapshots__/index.test.tsx.snap | 60 +++++++------- .../__snapshots__/title.test.tsx.snap | 35 -------- .../header_page/editable_title.test.tsx | 62 ++++++++++++--- .../components/header_page/editable_title.tsx | 29 +++---- .../components/header_page/index.test.tsx | 48 ++++++++--- .../public/components/header_page/index.tsx | 21 ++--- .../components/header_page/title.test.tsx | 55 +++++++------ .../public/components/header_page/title.tsx | 79 ++++++++++--------- .../components/header_page/translations.ts | 18 +++++ .../public/components/header_page/types.ts | 20 ----- .../plugins/cases/public/components/types.ts | 2 + .../cases/public/methods/get_cases.tsx | 3 +- .../public/methods/get_cases_context.tsx | 5 +- 18 files changed, 277 insertions(+), 237 deletions(-) delete mode 100644 x-pack/plugins/cases/public/components/header_page/__snapshots__/title.test.tsx.snap delete mode 100644 x-pack/plugins/cases/public/components/header_page/types.ts diff --git a/x-pack/plugins/cases/public/common/mock/test_providers.tsx b/x-pack/plugins/cases/public/common/mock/test_providers.tsx index 314796bdaa0ed..0bd08e348c3bd 100644 --- a/x-pack/plugins/cases/public/common/mock/test_providers.tsx +++ b/x-pack/plugins/cases/public/common/mock/test_providers.tsx @@ -21,12 +21,14 @@ import { } from '../lib/kibana/kibana_react.mock'; import { FieldHook } from '../shared_imports'; import { StartServices } from '../../types'; +import { ReleasePhase } from '../../components/types'; -interface Props { +interface TestProviderProps { children: React.ReactNode; userCanCrud?: boolean; features?: CasesFeatures; owner?: string[]; + releasePhase?: ReleasePhase; } type UiRender = (ui: React.ReactElement, options?: RenderOptions) => RenderResult; @@ -34,11 +36,12 @@ window.scrollTo = jest.fn(); const MockKibanaContextProvider = createKibanaContextProviderMock(); /** A utility for wrapping children in the providers required to run most tests */ -const TestProvidersComponent: React.FC = ({ +const TestProvidersComponent: React.FC = ({ children, features, owner = [SECURITY_SOLUTION_OWNER], userCanCrud = true, + releasePhase = 'ga', }) => { return ( @@ -63,18 +66,17 @@ export const createAppMockRenderer = ({ features, owner = [SECURITY_SOLUTION_OWNER], userCanCrud = true, -}: { - features?: CasesFeatures; - owner?: string[]; - userCanCrud?: boolean; -} = {}): AppMockRenderer => { + releasePhase = 'ga', +}: Omit = {}): AppMockRenderer => { const services = createStartServicesMock(); const AppWrapper: React.FC<{ children: React.ReactElement }> = ({ children }) => ( ({ eui: euiDarkVars, darkMode: true })}> - {children} + + {children} + diff --git a/x-pack/plugins/cases/public/components/all_cases/selector_modal/uses_cases_add_to_existing_case_modal.test.tsx b/x-pack/plugins/cases/public/components/all_cases/selector_modal/uses_cases_add_to_existing_case_modal.test.tsx index 954284a670fd2..6eeff6102ae6a 100644 --- a/x-pack/plugins/cases/public/components/all_cases/selector_modal/uses_cases_add_to_existing_case_modal.test.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/selector_modal/uses_cases_add_to_existing_case_modal.test.tsx @@ -32,6 +32,7 @@ describe('use cases add to existing case modal hook', () => { basePath: '/jest', dispatch, features: { alerts: { sync: true }, metrics: [] }, + releasePhase: 'ga', }} > {children} diff --git a/x-pack/plugins/cases/public/components/cases_context/index.tsx b/x-pack/plugins/cases/public/components/cases_context/index.tsx index 1f1da31595a04..70490882d31b3 100644 --- a/x-pack/plugins/cases/public/components/cases_context/index.tsx +++ b/x-pack/plugins/cases/public/components/cases_context/index.tsx @@ -17,6 +17,7 @@ import { } from './cases_context_reducer'; import { CasesContextFeatures, CasesFeatures } from '../../containers/types'; import { CasesGlobalComponents } from './cases_global_components'; +import { ReleasePhase } from '../types'; export type CasesContextValueDispatch = Dispatch; @@ -27,12 +28,14 @@ export interface CasesContextValue { userCanCrud: boolean; basePath: string; features: CasesContextFeatures; + releasePhase: ReleasePhase; dispatch: CasesContextValueDispatch; } export interface CasesContextProps extends Pick { basePath?: string; features?: CasesFeatures; + releasePhase?: ReleasePhase; } export const CasesContext = React.createContext(undefined); @@ -44,7 +47,7 @@ export interface CasesContextStateValue extends Omit = ({ children, - value: { owner, userCanCrud, basePath = DEFAULT_BASE_PATH, features = {} }, + value: { owner, userCanCrud, basePath = DEFAULT_BASE_PATH, features = {}, releasePhase = 'ga' }, }) => { const { appId, appTitle } = useApplication(); const [state, dispatch] = useReducer(casesContextReducer, getInitialCasesContextState()); @@ -57,6 +60,7 @@ export const CasesProvider: React.FC<{ value: CasesContextProps }> = ({ * of the DEFAULT_FEATURES object */ features: merge({}, DEFAULT_FEATURES, features), + releasePhase, dispatch, })); diff --git a/x-pack/plugins/cases/public/components/create/flyout/use_cases_add_to_new_case_flyout.test.tsx b/x-pack/plugins/cases/public/components/create/flyout/use_cases_add_to_new_case_flyout.test.tsx index 2c3750887cb1d..103e24c4b7a65 100644 --- a/x-pack/plugins/cases/public/components/create/flyout/use_cases_add_to_new_case_flyout.test.tsx +++ b/x-pack/plugins/cases/public/components/create/flyout/use_cases_add_to_new_case_flyout.test.tsx @@ -29,6 +29,7 @@ describe('use cases add to new case flyout hook', () => { basePath: '/jest', dispatch, features: { alerts: { sync: true }, metrics: [] }, + releasePhase: 'ga', }} > {children} diff --git a/x-pack/plugins/cases/public/components/header_page/__snapshots__/editable_title.test.tsx.snap b/x-pack/plugins/cases/public/components/header_page/__snapshots__/editable_title.test.tsx.snap index 86d752f84a8b3..ae50f4fd81cb6 100644 --- a/x-pack/plugins/cases/public/components/header_page/__snapshots__/editable_title.test.tsx.snap +++ b/x-pack/plugins/cases/public/components/header_page/__snapshots__/editable_title.test.tsx.snap @@ -1,27 +1,30 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`EditableTitle it renders 1`] = ` - - - - - - - - +exports[`EditableTitle renders 1`] = ` + + + + + + + + + `; diff --git a/x-pack/plugins/cases/public/components/header_page/__snapshots__/index.test.tsx.snap b/x-pack/plugins/cases/public/components/header_page/__snapshots__/index.test.tsx.snap index 17517b1d05f19..b5175e7e8c116 100644 --- a/x-pack/plugins/cases/public/components/header_page/__snapshots__/index.test.tsx.snap +++ b/x-pack/plugins/cases/public/components/header_page/__snapshots__/index.test.tsx.snap @@ -1,40 +1,34 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`HeaderPage it renders 1`] = ` -
- - - + + + - - - - -

- Test supplement -

-
-
-
+ > + +

+ Test supplement +

+
+ + + +
`; diff --git a/x-pack/plugins/cases/public/components/header_page/__snapshots__/title.test.tsx.snap b/x-pack/plugins/cases/public/components/header_page/__snapshots__/title.test.tsx.snap deleted file mode 100644 index 60714d6e7bb29..0000000000000 --- a/x-pack/plugins/cases/public/components/header_page/__snapshots__/title.test.tsx.snap +++ /dev/null @@ -1,35 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Title it renders 1`] = ` - -

- - - -

-
-`; - -exports[`Title it renders the title if is not a string 1`] = ` - -

- - Test title - -

-
-`; diff --git a/x-pack/plugins/cases/public/components/header_page/editable_title.test.tsx b/x-pack/plugins/cases/public/components/header_page/editable_title.test.tsx index 19aea39f1f793..9cf956c78fe72 100644 --- a/x-pack/plugins/cases/public/components/header_page/editable_title.test.tsx +++ b/x-pack/plugins/cases/public/components/header_page/editable_title.test.tsx @@ -9,7 +9,7 @@ import { shallow } from 'enzyme'; import React from 'react'; import '../../common/mock/match_media'; -import { TestProviders } from '../../common/mock'; +import { AppMockRenderer, createAppMockRenderer, TestProviders } from '../../common/mock'; import { EditableTitle, EditableTitleProps } from './editable_title'; import { useMountAppended } from '../../utils/use_mount_appended'; @@ -27,13 +27,17 @@ describe('EditableTitle', () => { jest.clearAllMocks(); }); - test('it renders', () => { - const wrapper = shallow(); + it('renders', () => { + const wrapper = shallow( + + + + ); expect(wrapper).toMatchSnapshot(); }); - test('it does not show the edit icon when the user does not have edit permissions', () => { + it('does not show the edit icon when the user does not have edit permissions', () => { const wrapper = mount( @@ -43,7 +47,7 @@ describe('EditableTitle', () => { expect(wrapper.find('[data-test-subj="editable-title-edit-icon"]').exists()).toBeFalsy(); }); - test('it shows the edit title input field', () => { + it('shows the edit title input field', () => { const wrapper = mount( @@ -58,7 +62,7 @@ describe('EditableTitle', () => { ); }); - test('it shows the submit button', () => { + it('shows the submit button', () => { const wrapper = mount( @@ -73,7 +77,7 @@ describe('EditableTitle', () => { ); }); - test('it shows the cancel button', () => { + it('shows the cancel button', () => { const wrapper = mount( @@ -88,7 +92,7 @@ describe('EditableTitle', () => { ); }); - test('it DOES NOT shows the edit icon when in edit mode', () => { + it('DOES NOT shows the edit icon when in edit mode', () => { const wrapper = mount( @@ -103,7 +107,7 @@ describe('EditableTitle', () => { ); }); - test('it switch to non edit mode when canceled', () => { + it('switch to non edit mode when canceled', () => { const wrapper = mount( @@ -117,7 +121,7 @@ describe('EditableTitle', () => { expect(wrapper.find('[data-test-subj="editable-title-edit-icon"]').first().exists()).toBe(true); }); - test('it should change the title', () => { + it('should change the title', () => { const newTitle = 'new test title'; const wrapper = mount( @@ -140,7 +144,7 @@ describe('EditableTitle', () => { ).toEqual(newTitle); }); - test('it should NOT change the title when cancel', () => { + it('should NOT change the title when cancel', () => { const title = 'Test title'; const newTitle = 'new test title'; @@ -164,7 +168,7 @@ describe('EditableTitle', () => { expect(wrapper.find('h1[data-test-subj="header-page-title"]').text()).toEqual(title); }); - test('it submits the title', () => { + it('submits the title', () => { const newTitle = 'new test title'; const wrapper = mount( @@ -188,7 +192,7 @@ describe('EditableTitle', () => { expect(wrapper.find('[data-test-subj="editable-title-edit-icon"]').first().exists()).toBe(true); }); - test('it does not submits the title when the length is longer than 64 characters', () => { + it('does not submit the title when the length is longer than 64 characters', () => { const longTitle = 'This is a title that should not be saved as it is longer than 64 characters.'; @@ -216,4 +220,36 @@ describe('EditableTitle', () => { false ); }); + + describe('Badges', () => { + let appMock: AppMockRenderer; + + beforeEach(() => { + appMock = createAppMockRenderer(); + }); + + it('does not render the badge if the release is ga', () => { + const renderResult = appMock.render(); + + expect(renderResult.getByText('Test title')).toBeInTheDocument(); + expect(renderResult.queryByText('Beta')).toBeFalsy(); + expect(renderResult.queryByText('Technical preview')).toBeFalsy(); + }); + + it('does render the beta badge', () => { + appMock = createAppMockRenderer({ releasePhase: 'beta' }); + const renderResult = appMock.render(); + + expect(renderResult.getByText('Test title')).toBeInTheDocument(); + expect(renderResult.getByText('Beta')).toBeInTheDocument(); + }); + + it('does render the experimental badge', () => { + appMock = createAppMockRenderer({ releasePhase: 'experimental' }); + const renderResult = appMock.render(); + + expect(renderResult.getByText('Test title')).toBeInTheDocument(); + expect(renderResult.getByText('Technical preview')).toBeInTheDocument(); + }); + }); }); diff --git a/x-pack/plugins/cases/public/components/header_page/editable_title.tsx b/x-pack/plugins/cases/public/components/header_page/editable_title.tsx index 674a31122d983..95e3f6f4a4bcb 100644 --- a/x-pack/plugins/cases/public/components/header_page/editable_title.tsx +++ b/x-pack/plugins/cases/public/components/header_page/editable_title.tsx @@ -22,6 +22,7 @@ import { import { MAX_TITLE_LENGTH } from '../../../common/constants'; import * as i18n from './translations'; import { Title } from './title'; +import { useCasesContext } from '../cases_context/use_cases_context'; const MyEuiButtonIcon = styled(EuiButtonIcon)` ${({ theme }) => css` @@ -48,6 +49,7 @@ const EditableTitleComponent: React.FC = ({ isLoading, title, }) => { + const { releasePhase } = useCasesContext(); const [editMode, setEditMode] = useState(false); const [errors, setErrors] = useState([]); const [newTitle, setNewTitle] = useState(title); @@ -116,22 +118,17 @@ const EditableTitleComponent: React.FC = ({
) : ( - - - - </EuiFlexItem> - <EuiFlexItem grow={false}> - {isLoading && <MySpinner data-test-subj="editable-title-loading" />} - {!isLoading && userCanCrud && ( - <MyEuiButtonIcon - aria-label={i18n.EDIT_TITLE_ARIA(title as string)} - iconType="pencil" - onClick={onClickEditIcon} - data-test-subj="editable-title-edit-icon" - /> - )} - </EuiFlexItem> - </EuiFlexGroup> + <Title title={title} releasePhase={releasePhase}> + {isLoading && <MySpinner data-test-subj="editable-title-loading" />} + {!isLoading && userCanCrud && ( + <MyEuiButtonIcon + aria-label={i18n.EDIT_TITLE_ARIA(title as string)} + iconType="pencil" + onClick={onClickEditIcon} + data-test-subj="editable-title-edit-icon" + /> + )} + ); }; EditableTitleComponent.displayName = 'EditableTitle'; diff --git a/x-pack/plugins/cases/public/components/header_page/index.test.tsx b/x-pack/plugins/cases/public/components/header_page/index.test.tsx index 4f0da554f3d1b..bd4069cd11679 100644 --- a/x-pack/plugins/cases/public/components/header_page/index.test.tsx +++ b/x-pack/plugins/cases/public/components/header_page/index.test.tsx @@ -10,7 +10,7 @@ import { shallow } from 'enzyme'; import React from 'react'; import '../../common/mock/match_media'; -import { TestProviders } from '../../common/mock'; +import { AppMockRenderer, createAppMockRenderer, TestProviders } from '../../common/mock'; import { HeaderPage } from './index'; import { useMountAppended } from '../../utils/use_mount_appended'; @@ -21,15 +21,11 @@ describe('HeaderPage', () => { test('it renders', () => { const wrapper = shallow( - -

{'Test supplement'}

-
+ + +

{'Test supplement'}

+
+
); expect(wrapper).toMatchSnapshot(); @@ -142,4 +138,36 @@ describe('HeaderPage', () => { expect(casesHeaderPage).not.toHaveStyleRule('border-bottom', euiDarkVars.euiBorderThin); expect(casesHeaderPage).not.toHaveStyleRule('padding-bottom', euiDarkVars.paddingSizes.l); }); + + describe('Badges', () => { + let appMock: AppMockRenderer; + + beforeEach(() => { + appMock = createAppMockRenderer(); + }); + + it('does not render the badge if the release is ga', () => { + const renderResult = appMock.render(); + + expect(renderResult.getByText('Test title')).toBeInTheDocument(); + expect(renderResult.queryByText('Beta')).toBeFalsy(); + expect(renderResult.queryByText('Technical preview')).toBeFalsy(); + }); + + it('does render the beta badge', () => { + appMock = createAppMockRenderer({ releasePhase: 'beta' }); + const renderResult = appMock.render(); + + expect(renderResult.getByText('Test title')).toBeInTheDocument(); + expect(renderResult.getByText('Beta')).toBeInTheDocument(); + }); + + it('does render the experimental badge', () => { + appMock = createAppMockRenderer({ releasePhase: 'experimental' }); + const renderResult = appMock.render(); + + expect(renderResult.getByText('Test title')).toBeInTheDocument(); + expect(renderResult.getByText('Technical preview')).toBeInTheDocument(); + }); + }); }); diff --git a/x-pack/plugins/cases/public/components/header_page/index.tsx b/x-pack/plugins/cases/public/components/header_page/index.tsx index 3afcd15bfa817..db0c9bb3011c7 100644 --- a/x-pack/plugins/cases/public/components/header_page/index.tsx +++ b/x-pack/plugins/cases/public/components/header_page/index.tsx @@ -6,15 +6,15 @@ */ import React, { useCallback } from 'react'; -import { EuiBadge, EuiFlexGroup, EuiFlexItem, EuiProgress } from '@elastic/eui'; +import { EuiFlexGroup, EuiFlexItem, EuiProgress } from '@elastic/eui'; import styled, { css } from 'styled-components'; -import { useAllCasesNavigation } from '../../common/navigation'; +import { useAllCasesNavigation } from '../../common/navigation'; import { LinkIcon } from '../link_icon'; import { Subtitle, SubtitleProps } from '../subtitle'; import { Title } from './title'; -import { BadgeOptions, TitleProp } from './types'; import * as i18n from './translations'; +import { useCasesContext } from '../cases_context/use_cases_context'; interface HeaderProps { border?: boolean; @@ -55,24 +55,17 @@ const LinkBack = styled.div.attrs({ `; LinkBack.displayName = 'LinkBack'; -const Badge = styled(EuiBadge)` - letter-spacing: 0; -` as unknown as typeof EuiBadge; -Badge.displayName = 'Badge'; - export interface HeaderPageProps extends HeaderProps { showBackButton?: boolean; - badgeOptions?: BadgeOptions; children?: React.ReactNode; subtitle?: SubtitleProps['items']; subtitle2?: SubtitleProps['items']; - title: TitleProp; + title: string | React.ReactNode; titleNode?: React.ReactElement; } const HeaderPageComponent: React.FC = ({ showBackButton = false, - badgeOptions, border, children, isLoading, @@ -80,8 +73,8 @@ const HeaderPageComponent: React.FC = ({ subtitle2, title, titleNode, - ...rest }) => { + const { releasePhase } = useCasesContext(); const { getAllCasesUrl, navigateToAllCases } = useAllCasesNavigation(); const navigateToAllCasesClick = useCallback( @@ -95,7 +88,7 @@ const HeaderPageComponent: React.FC = ({ ); return ( -
+
{showBackButton && ( @@ -111,7 +104,7 @@ const HeaderPageComponent: React.FC = ({ )} - {titleNode || } + {titleNode || <Title title={title} releasePhase={releasePhase} />} {subtitle && <Subtitle data-test-subj="header-page-subtitle" items={subtitle} />} {subtitle2 && <Subtitle data-test-subj="header-page-subtitle-2" items={subtitle2} />} diff --git a/x-pack/plugins/cases/public/components/header_page/title.test.tsx b/x-pack/plugins/cases/public/components/header_page/title.test.tsx index 063b21e4d8906..bd26b37956e65 100644 --- a/x-pack/plugins/cases/public/components/header_page/title.test.tsx +++ b/x-pack/plugins/cases/public/components/header_page/title.test.tsx @@ -5,41 +5,50 @@ * 2.0. */ -import { shallow } from 'enzyme'; import React from 'react'; +import { render, screen } from '@testing-library/react'; import '../../common/mock/match_media'; -import { TestProviders } from '../../common/mock'; import { Title } from './title'; -import { useMountAppended } from '../../utils/use_mount_appended'; describe('Title', () => { - const mount = useMountAppended(); - - test('it renders', () => { - const wrapper = shallow( - <Title - badgeOptions={{ beta: true, text: 'Beta', tooltip: 'Test tooltip' }} - title="Test title" - /> - ); + it('does not render the badge if the release is ga', () => { + render(<Title title="Test title" releasePhase="ga" />); - expect(wrapper).toMatchSnapshot(); + expect(screen.getByText('Test title')).toBeInTheDocument(); + expect(screen.queryByText('Beta')).toBeFalsy(); + expect(screen.queryByText('Technical preview')).toBeFalsy(); }); - test('it renders the title', () => { - const wrapper = mount( - <TestProviders> - <Title title="Test title" /> - </TestProviders> - ); + it('does render the beta badge', () => { + render(<Title title="Test title" releasePhase="beta" />); + + expect(screen.getByText('Test title')).toBeInTheDocument(); + expect(screen.getByText('Beta')).toBeInTheDocument(); + }); + + it('does render the experimental badge', () => { + render(<Title title="Test title" releasePhase="experimental" />); - expect(wrapper.find('[data-test-subj="header-page-title"]').first().exists()).toBe(true); + expect(screen.getByText('Test title')).toBeInTheDocument(); + expect(screen.getByText('Technical preview')).toBeInTheDocument(); }); - test('it renders the title if is not a string', () => { - const wrapper = shallow(<Title title={<span>{'Test title'}</span>} />); + it('renders the title if is not a string', () => { + render(<Title title={<span>{'Test title'}</span>} releasePhase="experimental" />); + + expect(screen.getByText('Test title')).toBeInTheDocument(); + expect(screen.getByText('Technical preview')).toBeInTheDocument(); + }); + + it('renders the children if provided', () => { + render( + <Title title="Test title" releasePhase="ga"> + <span>{'children'}</span> + + ); - expect(wrapper).toMatchSnapshot(); + expect(screen.getByText('Test title')).toBeInTheDocument(); + expect(screen.getByText('children')).toBeInTheDocument(); }); }); diff --git a/x-pack/plugins/cases/public/components/header_page/title.tsx b/x-pack/plugins/cases/public/components/header_page/title.tsx index 9ccf13b8d83a9..c6d2bf97e1cf1 100644 --- a/x-pack/plugins/cases/public/components/header_page/title.tsx +++ b/x-pack/plugins/cases/public/components/header_page/title.tsx @@ -7,51 +7,54 @@ import React from 'react'; import { isString } from 'lodash'; -import { EuiBetaBadge, EuiBadge, EuiTitle } from '@elastic/eui'; -import styled from 'styled-components'; +import { EuiBetaBadge, EuiTitle, EuiFlexItem, EuiFlexGroup } from '@elastic/eui'; -import { BadgeOptions, TitleProp } from './types'; import { TruncatedText } from '../truncated_text'; +import { ReleasePhase } from '../types'; +import * as i18n from './translations'; -const StyledEuiBetaBadge = styled(EuiBetaBadge)` - vertical-align: middle; -`; +interface Props { + title: string | React.ReactNode; + releasePhase: ReleasePhase; + children?: React.ReactNode; +} -StyledEuiBetaBadge.displayName = 'StyledEuiBetaBadge'; +const ExperimentalBadge: React.FC = () => ( + +); -const Badge = styled(EuiBadge)` - letter-spacing: 0; -` as unknown as typeof EuiBadge; -Badge.displayName = 'Badge'; +ExperimentalBadge.displayName = 'ExperimentalBadge'; -interface Props { - badgeOptions?: BadgeOptions; - title: TitleProp; -} +const BetaBadge: React.FC = () => ( + +); -const TitleComponent: React.FC = ({ title, badgeOptions }) => ( - -

- {isString(title) ? : title} - {badgeOptions && ( - <> - {' '} - {badgeOptions.beta ? ( - - ) : ( - - {badgeOptions.text} - - )} - - )} -

-
+BetaBadge.displayName = 'BetaBadge'; + +const TitleComponent: React.FC = ({ title, releasePhase, children }) => ( + + + + + +

+ {isString(title) ? : title} +

+
+
+ {children} +
+
+ + {releasePhase === 'experimental' && } + {releasePhase === 'beta' && } + +
); -TitleComponent.displayName = 'Title'; +TitleComponent.displayName = 'Title'; export const Title = React.memo(TitleComponent); diff --git a/x-pack/plugins/cases/public/components/header_page/translations.ts b/x-pack/plugins/cases/public/components/header_page/translations.ts index ba987d1f45f15..358f667bba367 100644 --- a/x-pack/plugins/cases/public/components/header_page/translations.ts +++ b/x-pack/plugins/cases/public/components/header_page/translations.ts @@ -22,3 +22,21 @@ export const EDIT_TITLE_ARIA = (title: string) => values: { title }, defaultMessage: 'You can edit {title} by clicking', }); + +export const EXPERIMENTAL_LABEL = i18n.translate('xpack.cases.header.badge.experimentalLabel', { + defaultMessage: 'Technical preview', +}); + +export const EXPERIMENTAL_DESC = i18n.translate('xpack.cases.header.badge.experimentalDesc', { + defaultMessage: + 'This functionality is in technical preview and may be changed or removed completely in a future release. Elastic will take a best effort approach to fix any issues, but features in technical preview are not subject to the support SLA of official GA features.', +}); + +export const BETA_LABEL = i18n.translate('xpack.cases.header.badge.betaLabel', { + defaultMessage: 'Beta', +}); + +export const BETA_DESC = i18n.translate('xpack.cases.header.badge.betaDesc', { + defaultMessage: + 'This feature is currently in beta. If you encounter any bugs or have feedback, please open an issue or visit our discussion forum.', +}); diff --git a/x-pack/plugins/cases/public/components/header_page/types.ts b/x-pack/plugins/cases/public/components/header_page/types.ts deleted file mode 100644 index e95d0c8e1e69c..0000000000000 --- a/x-pack/plugins/cases/public/components/header_page/types.ts +++ /dev/null @@ -1,20 +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 type React from 'react'; -export type TitleProp = string | React.ReactNode; - -export interface DraggableArguments { - field: string; - value: string; -} - -export interface BadgeOptions { - beta?: boolean; - text: string; - tooltip?: string; -} diff --git a/x-pack/plugins/cases/public/components/types.ts b/x-pack/plugins/cases/public/components/types.ts index 6d72a74fa5d81..d31c297d18b1c 100644 --- a/x-pack/plugins/cases/public/components/types.ts +++ b/x-pack/plugins/cases/public/components/types.ts @@ -6,3 +6,5 @@ */ export type { CaseActionConnector } from '../../common/ui/types'; + +export type ReleasePhase = 'experimental' | 'beta' | 'ga'; diff --git a/x-pack/plugins/cases/public/methods/get_cases.tsx b/x-pack/plugins/cases/public/methods/get_cases.tsx index 94e7d321840a8..3c1d3294d38ce 100644 --- a/x-pack/plugins/cases/public/methods/get_cases.tsx +++ b/x-pack/plugins/cases/public/methods/get_cases.tsx @@ -25,8 +25,9 @@ export const getCasesLazy = ({ refreshRef, timelineIntegration, features, + releasePhase, }: GetCasesProps) => ( - + }> { return ( }> - {children} + + {children} + ); }; From f4a13a883b71c53aba8663ee52c33091375d5d83 Mon Sep 17 00:00:00 2001 From: Paul Tavares <56442535+paul-tavares@users.noreply.github.com> Date: Thu, 24 Feb 2022 13:59:40 -0500 Subject: [PATCH 020/102] [Security Solution][Endpoint] Common Artifact List page for use across all artifacts (#124580) * Generic Artifact List Page component * re-usable `useIsMounted()` hook * Initial Blocklist page (using new artifact list component) --- .../exceptions_list_item_generator.ts | 9 +- .../endpoint/service/artifacts/constants.ts | 8 + .../endpoint/service/artifacts/utils.test.ts | 93 +++++ .../endpoint/service/artifacts/utils.ts | 24 +- .../public/management/common/utils.ts | 7 +- .../components/artifact_entry_card/index.ts | 1 + .../artifact_list_page/artifact_list_page.tsx | 290 ++++++++++++++ .../components/artifact_delete_modal.tsx | 151 ++++++++ .../components/artifact_flyout.tsx | 354 ++++++++++++++++++ .../components/no_data_empty_state.tsx | 65 ++++ .../hooks/use_artifact_card_props_provider.ts | 106 ++++++ .../hooks/use_artifact_create_item.ts | 46 +++ .../hooks/use_artifact_delete_item.ts | 89 +++++ .../hooks/use_artifact_get_item.ts | 28 ++ .../hooks/use_artifact_update_item.ts | 49 +++ ...se_is_artifact_allowed_per_policy_usage.ts | 23 ++ .../hooks/use_is_flyout_opened.ts | 17 + ...use_kuery_from_exceptions_search_filter.ts | 23 ++ .../hooks/use_set_url_params.ts | 36 ++ .../hooks/use_url_params.ts | 25 ++ .../hooks/use_with_artifact_list_data.ts | 171 +++++++++ .../hooks/use_with_artifact_submit_data.ts | 21 ++ .../components/artifact_list_page/index.ts | 10 + .../artifact_list_page/translations.ts | 123 ++++++ .../components/artifact_list_page/types.ts | 40 ++ .../components/hooks/use_is_mounted.ts | 26 ++ .../components/management_page_loader.tsx | 2 +- .../search_exceptions.test.tsx | 4 +- .../search_exceptions/search_exceptions.tsx | 15 +- .../use_bulk_delete_artifact.test.tsx | 8 +- .../artifacts/use_bulk_delete_artifact.tsx | 37 +- .../artifacts/use_bulk_update_artifact.tsx | 4 +- .../hooks/artifacts/use_create_artifact.tsx | 4 +- .../artifacts/use_delete_artifact.test.tsx | 4 +- .../hooks/artifacts/use_delete_artifact.tsx | 20 +- .../hooks/artifacts/use_get_artifact.test.tsx | 6 +- .../hooks/artifacts/use_get_artifact.tsx | 11 +- .../hooks/artifacts/use_update_artifact.tsx | 4 +- .../pages/blocklist/view/blocklist.test.tsx | 15 +- .../pages/blocklist/view/blocklist.tsx | 184 +++++---- .../pages/blocklist/view/components/empty.tsx | 58 --- .../pages/mocks/trusted_apps_http_mocks.ts | 17 +- .../policy_trusted_apps_flyout.test.tsx | 13 +- ...ove_trusted_app_from_policy_modal.test.tsx | 2 +- .../view/trusted_apps_page.test.tsx | 10 +- .../exceptions_list_api_client.test.ts | 33 +- .../exceptions_list_api_client.ts | 31 +- .../scripts/endpoint/event_filters/index.ts | 10 +- .../host_isolation_exceptions.ts | 20 +- .../apis/endpoint_artifacts/trusted_apps.ts | 10 +- 50 files changed, 2150 insertions(+), 207 deletions(-) create mode 100644 x-pack/plugins/security_solution/common/endpoint/service/artifacts/utils.test.ts create mode 100644 x-pack/plugins/security_solution/public/management/components/artifact_list_page/artifact_list_page.tsx create mode 100644 x-pack/plugins/security_solution/public/management/components/artifact_list_page/components/artifact_delete_modal.tsx create mode 100644 x-pack/plugins/security_solution/public/management/components/artifact_list_page/components/artifact_flyout.tsx create mode 100644 x-pack/plugins/security_solution/public/management/components/artifact_list_page/components/no_data_empty_state.tsx create mode 100644 x-pack/plugins/security_solution/public/management/components/artifact_list_page/hooks/use_artifact_card_props_provider.ts create mode 100644 x-pack/plugins/security_solution/public/management/components/artifact_list_page/hooks/use_artifact_create_item.ts create mode 100644 x-pack/plugins/security_solution/public/management/components/artifact_list_page/hooks/use_artifact_delete_item.ts create mode 100644 x-pack/plugins/security_solution/public/management/components/artifact_list_page/hooks/use_artifact_get_item.ts create mode 100644 x-pack/plugins/security_solution/public/management/components/artifact_list_page/hooks/use_artifact_update_item.ts create mode 100644 x-pack/plugins/security_solution/public/management/components/artifact_list_page/hooks/use_is_artifact_allowed_per_policy_usage.ts create mode 100644 x-pack/plugins/security_solution/public/management/components/artifact_list_page/hooks/use_is_flyout_opened.ts create mode 100644 x-pack/plugins/security_solution/public/management/components/artifact_list_page/hooks/use_kuery_from_exceptions_search_filter.ts create mode 100644 x-pack/plugins/security_solution/public/management/components/artifact_list_page/hooks/use_set_url_params.ts create mode 100644 x-pack/plugins/security_solution/public/management/components/artifact_list_page/hooks/use_url_params.ts create mode 100644 x-pack/plugins/security_solution/public/management/components/artifact_list_page/hooks/use_with_artifact_list_data.ts create mode 100644 x-pack/plugins/security_solution/public/management/components/artifact_list_page/hooks/use_with_artifact_submit_data.ts create mode 100644 x-pack/plugins/security_solution/public/management/components/artifact_list_page/index.ts create mode 100644 x-pack/plugins/security_solution/public/management/components/artifact_list_page/translations.ts create mode 100644 x-pack/plugins/security_solution/public/management/components/artifact_list_page/types.ts create mode 100644 x-pack/plugins/security_solution/public/management/components/hooks/use_is_mounted.ts delete mode 100644 x-pack/plugins/security_solution/public/management/pages/blocklist/view/components/empty.tsx diff --git a/x-pack/plugins/security_solution/common/endpoint/data_generators/exceptions_list_item_generator.ts b/x-pack/plugins/security_solution/common/endpoint/data_generators/exceptions_list_item_generator.ts index f15e3f418427a..90bd928cbd1fe 100644 --- a/x-pack/plugins/security_solution/common/endpoint/data_generators/exceptions_list_item_generator.ts +++ b/x-pack/plugins/security_solution/common/endpoint/data_generators/exceptions_list_item_generator.ts @@ -17,7 +17,7 @@ import { } from '@kbn/securitysolution-list-constants'; import { BaseDataGenerator } from './base_data_generator'; import { ConditionEntryField } from '../types'; -import { BY_POLICY_ARTIFACT_TAG_PREFIX } from '../service/artifacts/constants'; +import { BY_POLICY_ARTIFACT_TAG_PREFIX, GLOBAL_ARTIFACT_TAG } from '../service/artifacts/constants'; /** Utility that removes null and undefined from a Type's property value */ type NonNullableTypeProperties = { @@ -87,6 +87,11 @@ const exceptionItemToUpdateExceptionItem = ( }; }; +const EFFECTIVE_SCOPE: readonly string[] = [ + `${BY_POLICY_ARTIFACT_TAG_PREFIX}123-456`, // Policy Specific + GLOBAL_ARTIFACT_TAG, +]; + export class ExceptionsListItemGenerator extends BaseDataGenerator { generate(overrides: Partial = {}): ExceptionListItemSchema { const exceptionItem: ExceptionListItemSchema = { @@ -110,7 +115,7 @@ export class ExceptionsListItemGenerator extends BaseDataGenerator = [ + `name`, + `description`, + `entries.value`, + `entries.entries.value`, + `item_id`, +]; diff --git a/x-pack/plugins/security_solution/common/endpoint/service/artifacts/utils.test.ts b/x-pack/plugins/security_solution/common/endpoint/service/artifacts/utils.test.ts new file mode 100644 index 0000000000000..75076e191dcdc --- /dev/null +++ b/x-pack/plugins/security_solution/common/endpoint/service/artifacts/utils.test.ts @@ -0,0 +1,93 @@ +/* + * 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 { ExceptionListItemSchema } from '@kbn/securitysolution-io-ts-list-types'; +import { BY_POLICY_ARTIFACT_TAG_PREFIX, GLOBAL_ARTIFACT_TAG } from './constants'; +import { + createExceptionListItemForCreate, + getPolicyIdsFromArtifact, + isArtifactByPolicy, + isArtifactGlobal, +} from './utils'; + +describe('Endpoint artifact utilities', () => { + let globalEntry: Pick; + let perPolicyWithPolicy: Pick; + let perPolicyNoPolicies: Pick; + + beforeEach(() => { + globalEntry = { + tags: [GLOBAL_ARTIFACT_TAG], + }; + + perPolicyWithPolicy = { + tags: [`${BY_POLICY_ARTIFACT_TAG_PREFIX}123`, `${BY_POLICY_ARTIFACT_TAG_PREFIX}456`], + }; + + perPolicyNoPolicies = { + tags: [], + }; + }); + + describe('when using `isArtifactGlobal()', () => { + it('should return `true` if artifact is global', () => { + expect(isArtifactGlobal(globalEntry)).toBe(true); + }); + + it('should return `false` if artifact is per-policy', () => { + expect(isArtifactGlobal(perPolicyWithPolicy)).toBe(false); + }); + + it('should return `false` if artifact is per-policy but not assigned to any policy', () => { + expect(isArtifactGlobal(perPolicyNoPolicies)).toBe(false); + }); + }); + + describe('when using `isArtifactByPolicy()', () => { + it('should return `true` if artifact is per-policy', () => { + expect(isArtifactByPolicy(perPolicyWithPolicy)).toBe(true); + }); + + it('should return `true` if artifact is per-policy but not assigned to any policy', () => { + expect(isArtifactByPolicy(perPolicyNoPolicies)).toBe(true); + }); + + it('should return `false` if artifact is global', () => { + expect(isArtifactByPolicy(globalEntry)).toBe(false); + }); + }); + + describe('when using `getPolicyIdsFromArtifact()`', () => { + it('should return array of policies', () => { + expect(getPolicyIdsFromArtifact(perPolicyWithPolicy)).toEqual(['123', '456']); + }); + + it('should return empty array if there are none', () => { + expect(getPolicyIdsFromArtifact(perPolicyNoPolicies)).toEqual([]); + }); + }); + + describe('when using `createExceptionListItemForCreate()`', () => { + it('should return an empty exception list ready for create', () => { + expect(createExceptionListItemForCreate('abc')).toEqual({ + comments: [], + description: '', + entries: [], + item_id: undefined, + list_id: 'abc', + meta: { + temporaryUuid: expect.any(String), + }, + name: '', + namespace_type: 'agnostic', + tags: [GLOBAL_ARTIFACT_TAG], + type: 'simple', + os_types: ['windows'], + }); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/common/endpoint/service/artifacts/utils.ts b/x-pack/plugins/security_solution/common/endpoint/service/artifacts/utils.ts index 4cc39e9fb8980..332667064a605 100644 --- a/x-pack/plugins/security_solution/common/endpoint/service/artifacts/utils.ts +++ b/x-pack/plugins/security_solution/common/endpoint/service/artifacts/utils.ts @@ -5,7 +5,11 @@ * 2.0. */ -import { ExceptionListItemSchema } from '@kbn/securitysolution-io-ts-list-types'; +import { + ExceptionListItemSchema, + CreateExceptionListItemSchema, +} from '@kbn/securitysolution-io-ts-list-types'; +import uuid from 'uuid'; import { BY_POLICY_ARTIFACT_TAG_PREFIX, GLOBAL_ARTIFACT_TAG } from './constants'; const POLICY_ID_START_POSITION = BY_POLICY_ARTIFACT_TAG_PREFIX.length; @@ -30,3 +34,21 @@ export const getPolicyIdsFromArtifact = (item: Pick { + return { + comments: [], + description: '', + entries: [], + item_id: undefined, + list_id: listId, + meta: { + temporaryUuid: uuid.v4(), + }, + name: '', + namespace_type: 'agnostic', + tags: [GLOBAL_ARTIFACT_TAG], + type: 'simple', + os_types: ['windows'], + }; +}; diff --git a/x-pack/plugins/security_solution/public/management/common/utils.ts b/x-pack/plugins/security_solution/public/management/common/utils.ts index 12da54a992bec..8b88fcaff8a78 100644 --- a/x-pack/plugins/security_solution/public/management/common/utils.ts +++ b/x-pack/plugins/security_solution/public/management/common/utils.ts @@ -7,7 +7,10 @@ import { isEmpty } from 'lodash/fp'; -export const parseQueryFilterToKQL = (filter: string, fields: Readonly): string => { +export const parseQueryFilterToKQL = ( + filter: string | undefined, + fields: Readonly +): string => { if (!filter) return ''; const kuery = fields .map( @@ -66,7 +69,7 @@ export const parsePoliciesAndFilterToKql = ({ kuery?: string; }): string | undefined => { if (policies?.length === 0 && excludedPolicies?.length === 0) { - return kuery; + return kuery ? kuery : undefined; } const policiesKQL = parsePoliciesToKQL(policies, excludedPolicies); diff --git a/x-pack/plugins/security_solution/public/management/components/artifact_entry_card/index.ts b/x-pack/plugins/security_solution/public/management/components/artifact_entry_card/index.ts index 71a1230889559..d8e2eeb956c11 100644 --- a/x-pack/plugins/security_solution/public/management/components/artifact_entry_card/index.ts +++ b/x-pack/plugins/security_solution/public/management/components/artifact_entry_card/index.ts @@ -11,3 +11,4 @@ export * from './artifact_entry_collapsible_card'; export * from './components/card_section_panel'; export * from './types'; export { CardCompressedHeaderLayout } from './components/card_compressed_header'; +export { useEndpointPoliciesToArtifactPolicies } from './hooks/use_endpoint_policies_to_artifact_policies'; diff --git a/x-pack/plugins/security_solution/public/management/components/artifact_list_page/artifact_list_page.tsx b/x-pack/plugins/security_solution/public/management/components/artifact_list_page/artifact_list_page.tsx new file mode 100644 index 0000000000000..87673cf5c1e47 --- /dev/null +++ b/x-pack/plugins/security_solution/public/management/components/artifact_list_page/artifact_list_page.tsx @@ -0,0 +1,290 @@ +/* + * 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, useCallback, useMemo, useState } from 'react'; + +import type { ExceptionListItemSchema } from '@kbn/securitysolution-io-ts-list-types'; +import { EuiButton, EuiSpacer, EuiText } from '@elastic/eui'; +import { EuiFlyoutSize } from '@elastic/eui/src/components/flyout/flyout'; +import { useLocation } from 'react-router-dom'; +import { AdministrationListPage } from '../administration_list_page'; + +import { PaginatedContent, PaginatedContentProps } from '../paginated_content'; + +import { ArtifactEntryCard } from '../artifact_entry_card'; + +import { ArtifactListPageLabels, artifactListPageLabels } from './translations'; +import { useTestIdGenerator } from '../hooks/use_test_id_generator'; +import { ManagementPageLoader } from '../management_page_loader'; +import { SearchExceptions } from '../search_exceptions'; +import { + useArtifactCardPropsProvider, + UseArtifactCardPropsProviderProps, +} from './hooks/use_artifact_card_props_provider'; +import { NoDataEmptyState } from './components/no_data_empty_state'; +import { ArtifactFlyoutProps, MaybeArtifactFlyout } from './components/artifact_flyout'; +import { useIsFlyoutOpened } from './hooks/use_is_flyout_opened'; +import { useSetUrlParams } from './hooks/use_set_url_params'; +import { useWithArtifactListData } from './hooks/use_with_artifact_list_data'; +import { ExceptionsListApiClient } from '../../services/exceptions_list/exceptions_list_api_client'; +import { ArtifactListPageUrlParams } from './types'; +import { useUrlParams } from './hooks/use_url_params'; +import { ListPageRouteState, MaybeImmutable } from '../../../../common/endpoint/types'; +import { DEFAULT_EXCEPTION_LIST_ITEM_SEARCHABLE_FIELDS } from '../../../../common/endpoint/service/artifacts/constants'; +import { ArtifactDeleteModal } from './components/artifact_delete_modal'; +import { useGetEndpointSpecificPolicies } from '../../services/policies/hooks'; +import { getLoadPoliciesError } from '../../common/translations'; +import { useToasts } from '../../../common/lib/kibana'; +import { useMemoizedRouteState } from '../../common/hooks'; +import { BackToExternalAppSecondaryButton } from '../back_to_external_app_secondary_button'; +import { BackToExternalAppButton } from '../back_to_external_app_button'; + +type ArtifactEntryCardType = typeof ArtifactEntryCard; + +type ArtifactListPagePaginatedContentComponent = PaginatedContentProps< + ExceptionListItemSchema, + ArtifactEntryCardType +>; + +export interface ArtifactListPageProps { + apiClient: ExceptionsListApiClient; + /** The artifact Component that will be displayed in the Flyout for Create and Edit flows */ + ArtifactFormComponent: ArtifactFlyoutProps['FormComponent']; + /** A list of labels for the given artifact page. Not all have to be defined, only those that should override the defaults */ + labels: ArtifactListPageLabels; + /** A list of fields that will be used by the search functionality when a user enters a value in the searchbar */ + searchableFields?: MaybeImmutable; + flyoutSize?: EuiFlyoutSize; + 'data-test-subj'?: string; +} + +export const ArtifactListPage = memo( + ({ + apiClient, + ArtifactFormComponent, + searchableFields = DEFAULT_EXCEPTION_LIST_ITEM_SEARCHABLE_FIELDS, + labels: _labels = {}, + 'data-test-subj': dataTestSubj, + }) => { + const { state: routeState } = useLocation(); + const getTestId = useTestIdGenerator(dataTestSubj); + const toasts = useToasts(); + const isFlyoutOpened = useIsFlyoutOpened(); + const setUrlParams = useSetUrlParams(); + const { + urlParams: { filter, includedPolicies }, + } = useUrlParams(); + + const { + isPageInitializing, + isFetching: isLoading, + data: listDataResponse, + uiPagination, + doesDataExist, + error, + refetch: refetchListData, + } = useWithArtifactListData(apiClient, searchableFields); + + const items = useMemo(() => { + return listDataResponse?.data ?? []; + }, [listDataResponse?.data]); + + const [selectedItemForDelete, setSelectedItemForDelete] = useState< + undefined | ExceptionListItemSchema + >(undefined); + + const [selectedItemForEdit, setSelectedItemForEdit] = useState< + undefined | ExceptionListItemSchema + >(undefined); + + const labels = useMemo(() => { + return { + ...artifactListPageLabels, + ..._labels, + }; + }, [_labels]); + + const handleOnCardActionClick = useCallback( + ({ type, item }) => { + switch (type) { + case 'edit': + setSelectedItemForEdit(item); + setUrlParams({ show: 'edit', itemId: item.item_id }); + break; + + case 'delete': + setSelectedItemForDelete(item); + break; + } + }, + [setUrlParams] + ); + + const handleCardProps = useArtifactCardPropsProvider({ + items, + onAction: handleOnCardActionClick, + cardActionDeleteLabel: labels.cardActionDeleteLabel, + cardActionEditLabel: labels.cardActionEditLabel, + dataTestSubj: getTestId('card'), + }); + + const policiesRequest = useGetEndpointSpecificPolicies({ + onError: (err) => { + toasts.addWarning(getLoadPoliciesError(err)); + }, + }); + + const memoizedRouteState = useMemoizedRouteState(routeState); + + const backButtonEmptyComponent = useMemo(() => { + if (memoizedRouteState && memoizedRouteState.onBackButtonNavigateTo) { + return ; + } + }, [memoizedRouteState]); + + const backButtonHeaderComponent = useMemo(() => { + if (memoizedRouteState && memoizedRouteState.onBackButtonNavigateTo) { + return ; + } + }, [memoizedRouteState]); + + const handleOpenCreateFlyoutClick = useCallback(() => { + setUrlParams({ show: 'create' }); + }, [setUrlParams]); + + const handlePaginationChange: ArtifactListPagePaginatedContentComponent['onChange'] = + useCallback( + ({ pageIndex, pageSize }) => { + setUrlParams({ + page: pageIndex + 1, + pageSize, + }); + + // Scroll to the top to ensure that when new set of data is received and list updated, + // the user is back at the top of the list + window.scrollTo({ top: 0, left: 0, behavior: 'smooth' }); + }, + [setUrlParams] + ); + + const handleOnSearch = useCallback( + (filterValue: string, selectedPolicies: string, doHardRefresh) => { + setUrlParams({ + // `undefined` will drop the param from the url + filter: filterValue.trim() === '' ? undefined : filterValue, + includedPolicies: selectedPolicies.trim() === '' ? undefined : selectedPolicies, + }); + + if (doHardRefresh) { + refetchListData(); + } + }, + [refetchListData, setUrlParams] + ); + + const handleArtifactDeleteModalOnSuccess = useCallback(() => { + setSelectedItemForDelete(undefined); + refetchListData(); + }, [refetchListData]); + + const handleArtifactDeleteModalOnCancel = useCallback(() => { + setSelectedItemForDelete(undefined); + }, []); + + const handleArtifactFlyoutOnSuccess = useCallback(() => { + refetchListData(); + }, [refetchListData]); + + if (isPageInitializing) { + return ; + } + + return ( + + {labels.pageAddButtonTitle} + + } + > + {/* Flyout component is driven by URL params and may or may not be displayed based on those */} + + + {selectedItemForDelete && ( + + )} + + {!doesDataExist ? ( + + ) : ( + <> + + + + + + {labels.getShowingCountLabel(uiPagination.totalItemCount)} + + + + + + items={items} + ItemComponent={ArtifactEntryCard} + itemComponentProps={handleCardProps} + onChange={handlePaginationChange} + error={error} + loading={isLoading} + pagination={uiPagination} + contentClassName="card-container" + data-test-subj={getTestId('cardContent')} + /> + + )} + + ); + } +); +ArtifactListPage.displayName = 'ArtifactListPage'; diff --git a/x-pack/plugins/security_solution/public/management/components/artifact_list_page/components/artifact_delete_modal.tsx b/x-pack/plugins/security_solution/public/management/components/artifact_list_page/components/artifact_delete_modal.tsx new file mode 100644 index 0000000000000..4228d923a9ab3 --- /dev/null +++ b/x-pack/plugins/security_solution/public/management/components/artifact_list_page/components/artifact_delete_modal.tsx @@ -0,0 +1,151 @@ +/* + * 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, useCallback } from 'react'; +import { ExceptionListItemSchema } from '@kbn/securitysolution-io-ts-list-types'; +import { i18n } from '@kbn/i18n'; +import { + EuiButtonEmpty, + EuiCallOut, + EuiModal, + EuiModalBody, + EuiModalFooter, + EuiModalHeader, + EuiModalHeaderTitle, + EuiSpacer, + EuiText, +} from '@elastic/eui'; +import { AutoFocusButton } from '../../../../common/components/autofocus_button/autofocus_button'; +import { useTestIdGenerator } from '../../hooks/use_test_id_generator'; +import { + getPolicyIdsFromArtifact, + isArtifactGlobal, +} from '../../../../../common/endpoint/service/artifacts'; +import { + ARTIFACT_DELETE_ACTION_LABELS, + useArtifactDeleteItem, +} from '../hooks/use_artifact_delete_item'; +import { ExceptionsListApiClient } from '../../../services/exceptions_list/exceptions_list_api_client'; + +export const ARTIFACT_DELETE_LABELS = Object.freeze({ + deleteModalTitle: (itemName: string): string => + i18n.translate('xpack.securitySolution.artifactListPage.deleteModalTitle', { + defaultMessage: 'Delete {itemName}', + values: { itemName }, + }), + + deleteModalImpactTitle: i18n.translate( + 'xpack.securitySolution.artifactListPage.deleteModalImpactTitle', + { + defaultMessage: 'Warning', + } + ), + + deleteModalImpactInfo: (item: ExceptionListItemSchema): string => { + return i18n.translate('xpack.securitySolution.artifactListPage.deleteModalImpactInfo', { + defaultMessage: + 'Deleting this entry will remove it from {count} associated {count, plural, one {policy} other {policies}}.', + values: { + count: isArtifactGlobal(item) + ? i18n.translate('xpack.securitySolution.artifactListPage.deleteModalImpactInfoAll', { + defaultMessage: 'all', + }) + : getPolicyIdsFromArtifact(item).length, + }, + }); + }, + + deleteModalConfirmInfo: i18n.translate( + 'xpack.securitySolution.artifactListPage.deleteModalConfirmInfo', + { + defaultMessage: 'This action cannot be undone. Are you sure you wish to continue?', + } + ), + + deleteModalSubmitButtonTitle: i18n.translate( + 'xpack.securitySolution.artifactListPage.deleteModalSubmitButtonTitle', + { defaultMessage: 'Delete' } + ), + + deleteModalCancelButtonTitle: i18n.translate( + 'xpack.securitySolution.artifactListPage.deleteModalCancelButtonTitle', + { defaultMessage: 'Cancel' } + ), +}); + +interface DeleteArtifactModalProps { + apiClient: ExceptionsListApiClient; + item: ExceptionListItemSchema; + onCancel: () => void; + onSuccess: () => void; + labels: typeof ARTIFACT_DELETE_LABELS & typeof ARTIFACT_DELETE_ACTION_LABELS; + 'data-test-subj'?: string; +} + +export const ArtifactDeleteModal = memo( + ({ apiClient, item, onCancel, onSuccess, 'data-test-subj': dataTestSubj, labels }) => { + const getTestId = useTestIdGenerator(dataTestSubj); + + const { deleteArtifactItem, isLoading: isDeleting } = useArtifactDeleteItem(apiClient, labels); + + const onConfirm = useCallback(() => { + deleteArtifactItem(item).then(() => onSuccess()); + }, [deleteArtifactItem, item, onSuccess]); + + const handleOnCancel = useCallback(() => { + if (!isDeleting) { + onCancel(); + } + }, [isDeleting, onCancel]); + + return ( + + + {labels.deleteModalTitle(item.name)} + + + + + +

+ {labels.deleteModalImpactInfo(item)} +

+
+ +

{labels.deleteModalConfirmInfo}

+
+
+ + + + {labels.deleteModalCancelButtonTitle} + + + + {labels.deleteModalSubmitButtonTitle} + + +
+ ); + } +); +ArtifactDeleteModal.displayName = 'ArtifactDeleteModal'; diff --git a/x-pack/plugins/security_solution/public/management/components/artifact_list_page/components/artifact_flyout.tsx b/x-pack/plugins/security_solution/public/management/components/artifact_list_page/components/artifact_flyout.tsx new file mode 100644 index 0000000000000..483695de73824 --- /dev/null +++ b/x-pack/plugins/security_solution/public/management/components/artifact_list_page/components/artifact_flyout.tsx @@ -0,0 +1,354 @@ +/* + * 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, useCallback, useEffect, useMemo, useState } from 'react'; +import { i18n } from '@kbn/i18n'; +import { ExceptionListItemSchema } from '@kbn/securitysolution-io-ts-list-types'; +import { + EuiButton, + EuiButtonEmpty, + EuiCallOut, + EuiFlexGroup, + EuiFlexItem, + EuiFlyout, + EuiFlyoutBody, + EuiFlyoutFooter, + EuiFlyoutHeader, + EuiTitle, +} from '@elastic/eui'; +import { EuiFlyoutSize } from '@elastic/eui/src/components/flyout/flyout'; +import { useUrlParams } from '../hooks/use_url_params'; +import { useIsFlyoutOpened } from '../hooks/use_is_flyout_opened'; +import { useTestIdGenerator } from '../../hooks/use_test_id_generator'; +import { useSetUrlParams } from '../hooks/use_set_url_params'; +import { useArtifactGetItem } from '../hooks/use_artifact_get_item'; +import { + ArtifactFormComponentOnChangeCallbackProps, + ArtifactFormComponentProps, + ArtifactListPageUrlParams, +} from '../types'; +import { ManagementPageLoader } from '../../management_page_loader'; +import { ExceptionsListApiClient } from '../../../services/exceptions_list/exceptions_list_api_client'; +import { useToasts } from '../../../../common/lib/kibana'; +import { createExceptionListItemForCreate } from '../../../../../common/endpoint/service/artifacts/utils'; +import { useWithArtifactSubmitData } from '../hooks/use_with_artifact_submit_data'; +import { useIsArtifactAllowedPerPolicyUsage } from '../hooks/use_is_artifact_allowed_per_policy_usage'; + +export const ARTIFACT_FLYOUT_LABELS = Object.freeze({ + flyoutEditTitle: i18n.translate('xpack.securitySolution.artifactListPage.flyoutEditTitle', { + defaultMessage: 'Add artifact', + }), + + flyoutCreateTitle: i18n.translate('xpack.securitySolution.artifactListPage.flyoutCreateTitle', { + defaultMessage: 'Create artifact', + }), + flyoutCancelButtonLabel: i18n.translate( + 'xpack.securitySolution.artifactListPage.flyoutCancelButtonLabel', + { + defaultMessage: 'Cancel', + } + ), + flyoutCreateSubmitButtonLabel: i18n.translate( + 'xpack.securitySolution.artifactListPage.flyoutCreateSubmitButtonLabel', + { defaultMessage: 'Add' } + ), + flyoutEditSubmitButtonLabel: i18n.translate( + 'xpack.securitySolution.artifactListPage.flyoutEditSubmitButtonLabel', + { defaultMessage: 'Save' } + ), + flyoutDowngradedLicenseTitle: i18n.translate( + 'xpack.securitySolution.artifactListPage.expiredLicenseTitle', + { + defaultMessage: 'Expired License', + } + ), + flyoutDowngradedLicenseInfo: i18n.translate( + 'xpack.securitySolution.artifactListPage.flyoutDowngradedLicenseInfo', + { + defaultMessage: + 'Your Kibana license has been downgraded. Future policy configurations will now be globally assigned to all policies.', + } + ), + /** + * This should be set to a sentence that includes a link to the documentation page for this specific artifact type. + * + * @example + * // in a component + * () => { + * const { docLinks } = useKibana().services; + * return ( + * + * + * + * }} + * /> + * ); + * } + */ + flyoutDowngradedLicenseDocsInfo: (): React.ReactNode => + i18n.translate('xpack.securitySolution.artifactListPage.flyoutDowngradedLicenseDocsInfo', { + defaultMessage: 'For more information, see our documentation.', + }), + + flyoutEditItemLoadFailure: (errorMessage: string) => + i18n.translate('xpack.securitySolution.artifactListPage.flyoutEditItemLoadFailure', { + defaultMessage: 'Failed to retrieve item for edit. Reason: {errorMessage}', + values: { errorMessage }, + }), + + /** + * A function returning the label for the success message toast + * @param itemName + * @example + * ({ name }) => i18n.translate('xpack.securitySolution.some_page.flyoutCreateSubmitSuccess', { + * defaultMessage: '"{name}" has been added.', + * values: { name }, + * }) + */ + flyoutCreateSubmitSuccess: ({ name }: ExceptionListItemSchema) => + i18n.translate('xpack.securitySolution.some_page.flyoutCreateSubmitSuccess', { + defaultMessage: '"{name}" has been added to your event filters.', + values: { name }, + }), + + /** + * Returns the edit success message for the toast + * @param item + * @example + * ({ name }) => + * i18n.translate('xpack.securitySolution.some_page.flyoutEditSubmitSuccess', { + * defaultMessage: '"{name}" has been updated.', + * values: { name }, + * }) + */ + flyoutEditSubmitSuccess: ({ name }: ExceptionListItemSchema) => + i18n.translate('xpack.securitySolution.artifactListPage.flyoutEditSubmitSuccess', { + defaultMessage: '"{name}" has been updated.', + values: { name }, + }), +}); + +const createFormInitialState = ( + listId: string, + item: ArtifactFormComponentOnChangeCallbackProps['item'] | undefined +): ArtifactFormComponentOnChangeCallbackProps => { + return { + isValid: false, + item: item ?? createExceptionListItemForCreate(listId), + }; +}; + +export interface ArtifactFlyoutProps { + apiClient: ExceptionsListApiClient; + FormComponent: React.ComponentType; + onSuccess(): void; + /** + * If the artifact data is provided and it matches the id in the URL, then it will not be + * retrieved again via the API + */ + item?: ExceptionListItemSchema; + /** Any label overrides */ + labels?: Partial; + 'data-test-subj'?: string; + size?: EuiFlyoutSize; +} + +/** + * Show the flyout based on URL params + */ +export const MaybeArtifactFlyout = memo( + ({ + apiClient, + item, + FormComponent, + onSuccess, + labels: _labels = {}, + 'data-test-subj': dataTestSubj, + size = 'm', + }) => { + const getTestId = useTestIdGenerator(dataTestSubj); + const toasts = useToasts(); + const isFlyoutOpened = useIsFlyoutOpened(); + const setUrlParams = useSetUrlParams(); + const { urlParams } = useUrlParams(); + const labels = useMemo(() => { + return { + ...ARTIFACT_FLYOUT_LABELS, + ..._labels, + }; + }, [_labels]); + + const isEditFlow = urlParams.show === 'edit'; + const formMode: ArtifactFormComponentProps['mode'] = isEditFlow ? 'edit' : 'create'; + + const { + isLoading: isSubmittingData, + mutateAsync: submitData, + error: submitError, + } = useWithArtifactSubmitData(apiClient, formMode); + + const { + isLoading: isLoadingItemForEdit, + error, + refetch: fetchItemForEdit, + } = useArtifactGetItem(apiClient, urlParams.itemId ?? '', false); + + const [formState, setFormState] = useState( + createFormInitialState.bind(null, apiClient.listId, item) + ); + const showExpiredLicenseBanner = useIsArtifactAllowedPerPolicyUsage( + { tags: formState.item.tags ?? [] }, + formMode + ); + + const hasItemDataForEdit = useMemo(() => { + // `item_id` will not be defined for a `create` flow, so we use it below to determine if we + // are still attempting to load the item for edit from the api + return !!item || !!formState.item.item_id; + }, [formState.item.item_id, item]); + + const isInitializing = useMemo(() => { + return isEditFlow && !hasItemDataForEdit; + }, [hasItemDataForEdit, isEditFlow]); + + const handleFlyoutClose = useCallback(() => { + if (isSubmittingData) { + return; + } + + // `undefined` will cause params to be dropped from url + setUrlParams({ id: undefined, show: undefined }, true); + }, [isSubmittingData, setUrlParams]); + + const handleFormComponentOnChange: ArtifactFormComponentProps['onChange'] = useCallback( + ({ item: updatedItem, isValid }) => { + setFormState({ + item: updatedItem, + isValid, + }); + }, + [] + ); + + const handleSubmitClick = useCallback(() => { + submitData(formState.item).then((result) => { + toasts.addSuccess( + isEditFlow + ? labels.flyoutEditSubmitSuccess(result) + : labels.flyoutCreateSubmitSuccess(result) + ); + + // Close the flyout + // `undefined` will cause params to be dropped from url + setUrlParams({ id: undefined, show: undefined }, true); + }); + }, [formState.item, isEditFlow, labels, setUrlParams, submitData, toasts]); + + // If we don't have the actual Artifact data yet for edit (in initialization phase - ex. came in with an + // ID in the url that was not in the list), then retrieve it now + useEffect(() => { + if (isEditFlow && !hasItemDataForEdit && !error && isInitializing && !isLoadingItemForEdit) { + fetchItemForEdit().then(({ data: editItemData }) => { + if (editItemData) { + setFormState(createFormInitialState(apiClient.listId, editItemData)); + } + }); + } + }, [ + apiClient.listId, + error, + fetchItemForEdit, + isEditFlow, + isInitializing, + isLoadingItemForEdit, + hasItemDataForEdit, + ]); + + // If we got an error while trying ot retrieve the item for edit, then show a toast message + useEffect(() => { + if (isEditFlow && error) { + toasts.addWarning(labels.flyoutEditItemLoadFailure(error?.body?.message || error.message)); + + // Blank out the url params for id and show (will close out the flyout) + setUrlParams({ id: undefined, show: undefined }); + } + }, [error, isEditFlow, labels, setUrlParams, toasts, urlParams.itemId]); + + if (!isFlyoutOpened || error) { + return null; + } + + return ( + + + +

{isEditFlow ? labels.flyoutEditTitle : labels.flyoutCreateTitle}

+
+
+ + {!isInitializing && showExpiredLicenseBanner && ( + + {`${labels.flyoutDowngradedLicenseInfo} ${labels.flyoutDowngradedLicenseDocsInfo()}`} + + )} + + + {isInitializing && } + + {!isInitializing && ( + + )} + + + {!isInitializing && ( + + + + + {labels.flyoutCancelButtonLabel} + + + + + {isEditFlow + ? labels.flyoutEditSubmitButtonLabel + : labels.flyoutCreateSubmitButtonLabel} + + + + + )} +
+ ); + } +); +MaybeArtifactFlyout.displayName = 'MaybeArtifactFlyout'; diff --git a/x-pack/plugins/security_solution/public/management/components/artifact_list_page/components/no_data_empty_state.tsx b/x-pack/plugins/security_solution/public/management/components/artifact_list_page/components/no_data_empty_state.tsx new file mode 100644 index 0000000000000..cbb6bd8c5454e --- /dev/null +++ b/x-pack/plugins/security_solution/public/management/components/artifact_list_page/components/no_data_empty_state.tsx @@ -0,0 +1,65 @@ +/* + * 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 styled, { css } from 'styled-components'; +import { EuiButton, EuiEmptyPrompt } from '@elastic/eui'; +import { ManagementEmptyStateWrapper } from '../../management_empty_state_wrapper'; +import { useTestIdGenerator } from '../../hooks/use_test_id_generator'; + +const EmptyPrompt = styled(EuiEmptyPrompt)` + ${() => css` + max-width: 100%; + `} +`; + +export const NoDataEmptyState = memo<{ + onAdd: () => void; + titleLabel: string; + aboutInfo: string; + primaryButtonLabel: string; + /** Should the Add button be disabled */ + isAddDisabled?: boolean; + backComponent?: React.ReactNode; + 'data-test-subj'?: string; +}>( + ({ + onAdd, + isAddDisabled = false, + backComponent, + 'data-test-subj': dataTestSubj, + titleLabel, + aboutInfo, + primaryButtonLabel, + }) => { + const getTestId = useTestIdGenerator(dataTestSubj); + + return ( + + {titleLabel}} + body={
{aboutInfo}
} + actions={[ + + {primaryButtonLabel} + , + ...(backComponent ? [backComponent] : []), + ]} + /> +
+ ); + } +); + +NoDataEmptyState.displayName = 'NoDataEmptyState'; diff --git a/x-pack/plugins/security_solution/public/management/components/artifact_list_page/hooks/use_artifact_card_props_provider.ts b/x-pack/plugins/security_solution/public/management/components/artifact_list_page/hooks/use_artifact_card_props_provider.ts new file mode 100644 index 0000000000000..58a0f59feaa38 --- /dev/null +++ b/x-pack/plugins/security_solution/public/management/components/artifact_list_page/hooks/use_artifact_card_props_provider.ts @@ -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 { ExceptionListItemSchema } from '@kbn/securitysolution-io-ts-list-types'; +import { useCallback, useMemo } from 'react'; +import { + AnyArtifact, + ArtifactEntryCardProps, + useEndpointPoliciesToArtifactPolicies, +} from '../../artifact_entry_card'; +import { useTestIdGenerator } from '../../hooks/use_test_id_generator'; +import { useGetEndpointSpecificPolicies } from '../../../services/policies/hooks'; +import { getLoadPoliciesError } from '../../../common/translations'; +import { useToasts } from '../../../../common/lib/kibana'; + +type CardActionType = 'edit' | 'delete'; + +export interface UseArtifactCardPropsProviderProps { + items: ExceptionListItemSchema[]; + onAction: (action: { type: CardActionType; item: ExceptionListItemSchema }) => void; + cardActionEditLabel: string; + cardActionDeleteLabel: string; + dataTestSubj?: string; +} + +type ArtifactCardPropsProvider = (artifactItem: ExceptionListItemSchema) => ArtifactEntryCardProps; + +/** + * Return a function that can be used to retrieve props for an `ArtifactCardEntry` component given an + * `ExceptionListItemSchema` on input + */ +export const useArtifactCardPropsProvider = ({ + items, + onAction, + cardActionDeleteLabel, + cardActionEditLabel, + dataTestSubj, +}: UseArtifactCardPropsProviderProps): ArtifactCardPropsProvider => { + const getTestId = useTestIdGenerator(dataTestSubj); + const toasts = useToasts(); + + const { data: policyData } = useGetEndpointSpecificPolicies({ + onError: (error) => { + toasts.addDanger(getLoadPoliciesError(error)); + }, + }); + + const policies: ArtifactEntryCardProps['policies'] = useEndpointPoliciesToArtifactPolicies( + policyData?.items + ); + + const artifactCardPropsPerItem = useMemo(() => { + const cachedCardProps: Record = {}; + + // Casting `listItems` below to remove the `Immutable<>` from it in order to prevent errors + // with common component's props + for (const artifactItem of items as ExceptionListItemSchema[]) { + cachedCardProps[artifactItem.id] = { + item: artifactItem as AnyArtifact, + policies, + 'data-test-subj': dataTestSubj, + actions: [ + { + icon: 'controlsHorizontal', + onClick: () => { + onAction({ type: 'edit', item: artifactItem }); + }, + 'data-test-subj': getTestId('cardEditAction'), + children: cardActionEditLabel, + }, + { + icon: 'trash', + onClick: () => { + onAction({ type: 'delete', item: artifactItem }); + }, + 'data-test-subj': getTestId('cardDeleteAction'), + children: cardActionDeleteLabel, + }, + ], + hideDescription: !artifactItem.description, + hideComments: !artifactItem.comments.length, + }; + } + + return cachedCardProps; + }, [ + items, + policies, + dataTestSubj, + getTestId, + cardActionEditLabel, + cardActionDeleteLabel, + onAction, + ]); + + return useCallback( + (artifactItem: ExceptionListItemSchema) => { + return artifactCardPropsPerItem[artifactItem.id]; + }, + [artifactCardPropsPerItem] + ); +}; diff --git a/x-pack/plugins/security_solution/public/management/components/artifact_list_page/hooks/use_artifact_create_item.ts b/x-pack/plugins/security_solution/public/management/components/artifact_list_page/hooks/use_artifact_create_item.ts new file mode 100644 index 0000000000000..4252d66f2a510 --- /dev/null +++ b/x-pack/plugins/security_solution/public/management/components/artifact_list_page/hooks/use_artifact_create_item.ts @@ -0,0 +1,46 @@ +/* + * 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 { + CreateExceptionListItemSchema, + ExceptionListItemSchema, +} from '@kbn/securitysolution-io-ts-list-types'; +import { useMutation } from 'react-query'; +import { HttpFetchError } from 'kibana/public'; +import { ExceptionsListApiClient } from '../../../services/exceptions_list/exceptions_list_api_client'; + +// FIXME: delete entire file once PR# 125198 is merged. This entire file was copied from that pr + +export interface CallbackTypes { + onSuccess?: (updatedException: ExceptionListItemSchema) => void; + onError?: (error?: HttpFetchError) => void; + onSettled?: () => void; +} + +export function useCreateArtifact( + exceptionListApiClient: ExceptionsListApiClient, + callbacks: CallbackTypes = {} +) { + const { onSuccess = () => {}, onError = () => {}, onSettled = () => {} } = callbacks; + + return useMutation< + ExceptionListItemSchema, + HttpFetchError, + CreateExceptionListItemSchema, + () => void + >( + async (exception: CreateExceptionListItemSchema) => { + return exceptionListApiClient.create(exception); + }, + { + onSuccess, + onError, + onSettled: () => { + onSettled(); + }, + } + ); +} diff --git a/x-pack/plugins/security_solution/public/management/components/artifact_list_page/hooks/use_artifact_delete_item.ts b/x-pack/plugins/security_solution/public/management/components/artifact_list_page/hooks/use_artifact_delete_item.ts new file mode 100644 index 0000000000000..feac0c2b0c599 --- /dev/null +++ b/x-pack/plugins/security_solution/public/management/components/artifact_list_page/hooks/use_artifact_delete_item.ts @@ -0,0 +1,89 @@ +/* + * 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 { ExceptionListItemSchema } from '@kbn/securitysolution-io-ts-list-types'; +import { useMutation, UseMutationResult } from 'react-query'; +import { i18n } from '@kbn/i18n'; +import { useMemo } from 'react'; +import type { HttpFetchError } from 'kibana/public'; +import { useToasts } from '../../../../common/lib/kibana'; +import { ExceptionsListApiClient } from '../../../services/exceptions_list/exceptions_list_api_client'; + +export const ARTIFACT_DELETE_ACTION_LABELS = Object.freeze({ + /** + * Message to be displayed in toast when deletion fails + * @param itemName + * @param errorMessage + * @example + * (itemsName, errorMessage) => i18n.translate( + * 'xpack.securitySolution.artifactListPage.deleteActionFailure', + * { + * defaultMessage: 'Unable to remove "{itemName}" . Reason: {errorMessage}', + * values: { itemName, errorMessage }, + * }) + */ + deleteActionFailure: (itemName: string, errorMessage: string) => + i18n.translate('xpack.securitySolution.artifactListPage.deleteActionFailure', { + defaultMessage: 'Unable to remove "{itemName}" . Reason: {errorMessage}', + values: { itemName, errorMessage }, + }), + + /** + * Message to be displayed in the toast after a successful delete + * @param itemName + * @example + * (itemName) => i18n.translate('xpack.securitySolution.some_page.deleteSuccess', { + * defaultMessage: '"{itemName}" has been removed', + * values: { itemName }, + * }) + */ + deleteActionSuccess: (itemName: string) => + i18n.translate('xpack.securitySolution.artifactListPage.deleteActionSuccess', { + defaultMessage: '"{itemName}" has been removed', + values: { itemName }, + }), +}); + +type UseArtifactDeleteItemMutationResult = UseMutationResult< + ExceptionListItemSchema, + HttpFetchError, + ExceptionListItemSchema +>; + +export type UseArtifactDeleteItemInterface = UseArtifactDeleteItemMutationResult & { + deleteArtifactItem: UseArtifactDeleteItemMutationResult['mutateAsync']; +}; + +export const useArtifactDeleteItem = ( + apiClient: ExceptionsListApiClient, + labels: typeof ARTIFACT_DELETE_ACTION_LABELS +): UseArtifactDeleteItemInterface => { + const toasts = useToasts(); + + const mutation = useMutation( + async (item: ExceptionListItemSchema) => { + return apiClient.delete(item.item_id); + }, + { + onError: (error: HttpFetchError, item) => { + toasts.addDanger( + labels.deleteActionFailure(item.name, error.body?.message || error.message) + ); + }, + onSuccess: (response) => { + toasts.addSuccess(labels.deleteActionSuccess(response.name)); + }, + } + ); + + return useMemo(() => { + return { + ...mutation, + deleteArtifactItem: mutation.mutateAsync, + }; + }, [mutation]); +}; diff --git a/x-pack/plugins/security_solution/public/management/components/artifact_list_page/hooks/use_artifact_get_item.ts b/x-pack/plugins/security_solution/public/management/components/artifact_list_page/hooks/use_artifact_get_item.ts new file mode 100644 index 0000000000000..21b13aa285376 --- /dev/null +++ b/x-pack/plugins/security_solution/public/management/components/artifact_list_page/hooks/use_artifact_get_item.ts @@ -0,0 +1,28 @@ +/* + * 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 { useQuery } from 'react-query'; +import { ExceptionListItemSchema } from '@kbn/securitysolution-io-ts-list-types'; +import { HttpFetchError } from 'kibana/public'; +import { ExceptionsListApiClient } from '../../../services/exceptions_list/exceptions_list_api_client'; + +export const useArtifactGetItem = ( + apiClient: ExceptionsListApiClient, + itemId: string, + enabled: boolean = true +) => { + return useQuery( + ['item', apiClient, itemId], + () => apiClient.get(itemId), + { + enabled, + refetchOnWindowFocus: false, + keepPreviousData: true, + retry: false, + } + ); +}; diff --git a/x-pack/plugins/security_solution/public/management/components/artifact_list_page/hooks/use_artifact_update_item.ts b/x-pack/plugins/security_solution/public/management/components/artifact_list_page/hooks/use_artifact_update_item.ts new file mode 100644 index 0000000000000..a217da0159ed8 --- /dev/null +++ b/x-pack/plugins/security_solution/public/management/components/artifact_list_page/hooks/use_artifact_update_item.ts @@ -0,0 +1,49 @@ +/* + * 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 { + UpdateExceptionListItemSchema, + ExceptionListItemSchema, +} from '@kbn/securitysolution-io-ts-list-types'; +import { useQueryClient, useMutation } from 'react-query'; +import { HttpFetchError } from 'kibana/public'; +import { ExceptionsListApiClient } from '../../../services/exceptions_list/exceptions_list_api_client'; + +// FIXME: delete entire file once PR# 125198 is merged. This entire file was copied from that pr + +export interface CallbackTypes { + onSuccess?: (updatedException: ExceptionListItemSchema) => void; + onError?: (error?: HttpFetchError) => void; + onSettled?: () => void; +} + +export function useUpdateArtifact( + exceptionListApiClient: ExceptionsListApiClient, + callbacks: CallbackTypes = {} +) { + const queryClient = useQueryClient(); + const { onSuccess = () => {}, onError = () => {}, onSettled = () => {} } = callbacks; + + return useMutation< + ExceptionListItemSchema, + HttpFetchError, + UpdateExceptionListItemSchema, + () => void + >( + async (exception: UpdateExceptionListItemSchema) => { + return exceptionListApiClient.update(exception); + }, + { + onSuccess, + onError, + onSettled: () => { + queryClient.invalidateQueries(['list', exceptionListApiClient]); + queryClient.invalidateQueries(['get', exceptionListApiClient]); + onSettled(); + }, + } + ); +} diff --git a/x-pack/plugins/security_solution/public/management/components/artifact_list_page/hooks/use_is_artifact_allowed_per_policy_usage.ts b/x-pack/plugins/security_solution/public/management/components/artifact_list_page/hooks/use_is_artifact_allowed_per_policy_usage.ts new file mode 100644 index 0000000000000..08a51ca061fe0 --- /dev/null +++ b/x-pack/plugins/security_solution/public/management/components/artifact_list_page/hooks/use_is_artifact_allowed_per_policy_usage.ts @@ -0,0 +1,23 @@ +/* + * 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 { useMemo } from 'react'; +import type { ExceptionListItemSchema } from '@kbn/securitysolution-io-ts-list-types'; +import { ArtifactFormComponentProps } from '../types'; +import { useUserPrivileges } from '../../../../common/components/user_privileges'; +import { isArtifactByPolicy } from '../../../../../common/endpoint/service/artifacts'; + +export const useIsArtifactAllowedPerPolicyUsage = ( + item: Pick, + mode: ArtifactFormComponentProps['mode'] +): boolean => { + const endpointAuthz = useUserPrivileges().endpointPrivileges; + + return useMemo(() => { + return mode === 'edit' && !endpointAuthz.canCreateArtifactsByPolicy && isArtifactByPolicy(item); + }, [endpointAuthz.canCreateArtifactsByPolicy, item, mode]); +}; diff --git a/x-pack/plugins/security_solution/public/management/components/artifact_list_page/hooks/use_is_flyout_opened.ts b/x-pack/plugins/security_solution/public/management/components/artifact_list_page/hooks/use_is_flyout_opened.ts new file mode 100644 index 0000000000000..dc53a58924e83 --- /dev/null +++ b/x-pack/plugins/security_solution/public/management/components/artifact_list_page/hooks/use_is_flyout_opened.ts @@ -0,0 +1,17 @@ +/* + * 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 { useMemo } from 'react'; +import { useUrlParams } from './use_url_params'; +import { ArtifactListPageUrlParams } from '../types'; + +const SHOW_VALUES: readonly string[] = ['create', 'edit']; + +export const useIsFlyoutOpened = (): boolean => { + const showUrlParamValue = useUrlParams().urlParams.show ?? ''; + return useMemo(() => SHOW_VALUES.includes(showUrlParamValue), [showUrlParamValue]); +}; diff --git a/x-pack/plugins/security_solution/public/management/components/artifact_list_page/hooks/use_kuery_from_exceptions_search_filter.ts b/x-pack/plugins/security_solution/public/management/components/artifact_list_page/hooks/use_kuery_from_exceptions_search_filter.ts new file mode 100644 index 0000000000000..60923a26c694f --- /dev/null +++ b/x-pack/plugins/security_solution/public/management/components/artifact_list_page/hooks/use_kuery_from_exceptions_search_filter.ts @@ -0,0 +1,23 @@ +/* + * 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 { useMemo } from 'react'; +import { parsePoliciesAndFilterToKql, parseQueryFilterToKQL } from '../../../common/utils'; +import { MaybeImmutable } from '../../../../../common/endpoint/types'; + +export const useKueryFromExceptionsSearchFilter = ( + filter: string | undefined, + fields: MaybeImmutable, + policies: string | undefined +): string | undefined => { + return useMemo(() => { + return parsePoliciesAndFilterToKql({ + kuery: parseQueryFilterToKQL(filter, fields), + policies: policies ? policies.split(',') : [], + }); + }, [fields, filter, policies]); +}; diff --git a/x-pack/plugins/security_solution/public/management/components/artifact_list_page/hooks/use_set_url_params.ts b/x-pack/plugins/security_solution/public/management/components/artifact_list_page/hooks/use_set_url_params.ts new file mode 100644 index 0000000000000..80ffdeb253946 --- /dev/null +++ b/x-pack/plugins/security_solution/public/management/components/artifact_list_page/hooks/use_set_url_params.ts @@ -0,0 +1,36 @@ +/* + * 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 { useHistory, useLocation } from 'react-router-dom'; +import { useCallback } from 'react'; +import { pickBy } from 'lodash'; +import { useUrlParams } from './use_url_params'; + +// FIXME:PT delete/change once we get the common hook from @parkiino PR +export const useSetUrlParams = (): (( + /** Any param whose value is `undefined` will be removed from the URl when in append mode */ + params: Record, + replace?: boolean +) => void) => { + const location = useLocation(); + const history = useHistory(); + const { toUrlParams, urlParams: currentUrlParams } = useUrlParams(); + + return useCallback( + (params, replace = false) => { + history.push({ + ...location, + search: toUrlParams( + replace + ? params + : pickBy({ ...currentUrlParams, ...params }, (value) => value !== undefined) + ), + }); + }, + [currentUrlParams, history, location, toUrlParams] + ); +}; diff --git a/x-pack/plugins/security_solution/public/management/components/artifact_list_page/hooks/use_url_params.ts b/x-pack/plugins/security_solution/public/management/components/artifact_list_page/hooks/use_url_params.ts new file mode 100644 index 0000000000000..7e1b8d16b3771 --- /dev/null +++ b/x-pack/plugins/security_solution/public/management/components/artifact_list_page/hooks/use_url_params.ts @@ -0,0 +1,25 @@ +/* + * 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 { useMemo } from 'react'; +import { useLocation } from 'react-router-dom'; +import { parse, stringify } from 'query-string'; + +// FIXME:PT delete and use common hook once @parkiino merges +export function useUrlParams>(): { + urlParams: T; + toUrlParams: (params?: T) => string; +} { + const { search } = useLocation(); + return useMemo(() => { + const urlParams = parse(search) as unknown as T; + return { + urlParams, + toUrlParams: (params: T = urlParams) => stringify(params as unknown as object), + }; + }, [search]); +} diff --git a/x-pack/plugins/security_solution/public/management/components/artifact_list_page/hooks/use_with_artifact_list_data.ts b/x-pack/plugins/security_solution/public/management/components/artifact_list_page/hooks/use_with_artifact_list_data.ts new file mode 100644 index 0000000000000..3eca6c60bc711 --- /dev/null +++ b/x-pack/plugins/security_solution/public/management/components/artifact_list_page/hooks/use_with_artifact_list_data.ts @@ -0,0 +1,171 @@ +/* + * 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 type { QueryObserverResult } from 'react-query'; +import type { FoundExceptionListItemSchema } from '@kbn/securitysolution-io-ts-list-types'; +import { useEffect, useMemo, useState } from 'react'; +import { Pagination } from '@elastic/eui'; +import { useQuery } from 'react-query'; +import type { ServerApiError } from '../../../../common/types'; +import { useIsMounted } from '../../hooks/use_is_mounted'; +import { + MANAGEMENT_DEFAULT_PAGE_SIZE, + MANAGEMENT_PAGE_SIZE_OPTIONS, +} from '../../../common/constants'; +import { useUrlParams } from './use_url_params'; +import { ExceptionsListApiClient } from '../../../services/exceptions_list/exceptions_list_api_client'; +import { ArtifactListPageUrlParams } from '../types'; +import { MaybeImmutable } from '../../../../../common/endpoint/types'; +import { useKueryFromExceptionsSearchFilter } from './use_kuery_from_exceptions_search_filter'; + +type WithArtifactListDataInterface = QueryObserverResult< + FoundExceptionListItemSchema, + ServerApiError +> & { + /** + * Set to true during initialization of the page until it can be determined if either data exists. + * This should drive the showing of the overall page loading state if set to `true` + */ + isPageInitializing: boolean; + + /** + * Indicates if the exception list has any data at all (regardless of filters the user might have used) + */ + doesDataExist: boolean; + + /** + * The UI pagination data based on the data retrieved for the list + */ + uiPagination: Pagination; +}; + +export const useWithArtifactListData = ( + apiClient: ExceptionsListApiClient, + searchableFields: MaybeImmutable +): WithArtifactListDataInterface => { + const isMounted = useIsMounted(); + + const { + urlParams: { + page = 1, + pageSize = MANAGEMENT_DEFAULT_PAGE_SIZE, + sortOrder, + sortField, + filter, + includedPolicies, + }, + } = useUrlParams(); + + const kuery = useKueryFromExceptionsSearchFilter(filter, searchableFields, includedPolicies); + + const { + data: doesDataExist, + isFetching: isLoadingDataExists, + refetch: checkIfDataExists, + } = useQuery( + ['does-data-exists', apiClient], + async () => apiClient.hasData(), + { + enabled: true, + keepPreviousData: true, + refetchOnWindowFocus: false, + } + ); + + const [uiPagination, setUiPagination] = useState({ + totalItemCount: 0, + pageSize, + pageSizeOptions: [...MANAGEMENT_PAGE_SIZE_OPTIONS], + pageIndex: page - 1, + }); + + const [isPageInitializing, setIsPageInitializing] = useState(true); + + const listDataRequest = useQuery( + ['list', apiClient, page, pageSize, sortField, sortField, kuery], + async () => apiClient.find({ page, perPage: pageSize, filter: kuery, sortField, sortOrder }), + { + enabled: true, + keepPreviousData: true, + refetchOnWindowFocus: false, + } + ); + + const { + data: listData, + isFetching: isLoadingListData, + error: listDataError, + isSuccess: isSuccessListData, + } = listDataRequest; + + // Once we know if data exists, update the page initializing state. + // This should only ever happen at most once; + useEffect(() => { + if (isMounted) { + if (isPageInitializing === true && !isLoadingDataExists) { + setIsPageInitializing(false); + } + } + }, [isLoadingDataExists, isMounted, isPageInitializing]); + + // Update the uiPagination once the query succeeds + useEffect(() => { + if (isMounted && listData && !isLoadingListData && isSuccessListData) { + setUiPagination((prevState) => { + return { + ...prevState, + pageIndex: listData.page - 1, + pageSize: listData.per_page, + totalItemCount: listData.total, + }; + }); + } + }, [isLoadingListData, isMounted, isSuccessListData, listData]); + + // Keep the `doesDataExist` updated if we detect that list data result total is zero. + // Anytime: + // 1. the list data total is 0 + // 2. and page is 1 + // 3. and filter is empty + // 4. and doesDataExists is currently set to true + // check if data exists again + useEffect(() => { + if ( + isMounted && + !isLoadingListData && + !listDataError && + listData && + listData.total === 0 && + String(page) === '1' && + !kuery && + doesDataExist + ) { + checkIfDataExists(); + } + }, [ + checkIfDataExists, + doesDataExist, + filter, + includedPolicies, + isLoadingListData, + isMounted, + kuery, + listData, + listDataError, + page, + ]); + + return useMemo( + () => ({ + isPageInitializing, + doesDataExist: doesDataExist ?? false, + uiPagination, + ...listDataRequest, + }), + [doesDataExist, isPageInitializing, listDataRequest, uiPagination] + ); +}; diff --git a/x-pack/plugins/security_solution/public/management/components/artifact_list_page/hooks/use_with_artifact_submit_data.ts b/x-pack/plugins/security_solution/public/management/components/artifact_list_page/hooks/use_with_artifact_submit_data.ts new file mode 100644 index 0000000000000..59a2739c9d3af --- /dev/null +++ b/x-pack/plugins/security_solution/public/management/components/artifact_list_page/hooks/use_with_artifact_submit_data.ts @@ -0,0 +1,21 @@ +/* + * 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 { ExceptionsListApiClient } from '../../../services/exceptions_list/exceptions_list_api_client'; +import { ArtifactFormComponentProps } from '../types'; +import { useUpdateArtifact } from './use_artifact_update_item'; +import { useCreateArtifact } from './use_artifact_create_item'; + +export const useWithArtifactSubmitData = ( + apiClient: ExceptionsListApiClient, + mode: ArtifactFormComponentProps['mode'] +) => { + const artifactUpdater = useUpdateArtifact(apiClient); + const artifactCreator = useCreateArtifact(apiClient); + + return mode === 'create' ? artifactCreator : artifactUpdater; +}; diff --git a/x-pack/plugins/security_solution/public/management/components/artifact_list_page/index.ts b/x-pack/plugins/security_solution/public/management/components/artifact_list_page/index.ts new file mode 100644 index 0000000000000..ba26a44259021 --- /dev/null +++ b/x-pack/plugins/security_solution/public/management/components/artifact_list_page/index.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. + */ + +export { ArtifactListPage } from './artifact_list_page'; +export type { ArtifactListPageProps } from './artifact_list_page'; +export * from './types'; diff --git a/x-pack/plugins/security_solution/public/management/components/artifact_list_page/translations.ts b/x-pack/plugins/security_solution/public/management/components/artifact_list_page/translations.ts new file mode 100644 index 0000000000000..ba6acf8a359aa --- /dev/null +++ b/x-pack/plugins/security_solution/public/management/components/artifact_list_page/translations.ts @@ -0,0 +1,123 @@ +/* + * 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 { i18n } from '@kbn/i18n'; +import { ARTIFACT_FLYOUT_LABELS } from './components/artifact_flyout'; +import { ARTIFACT_DELETE_LABELS } from './components/artifact_delete_modal'; +import { ARTIFACT_DELETE_ACTION_LABELS } from './hooks/use_artifact_delete_item'; + +export const artifactListPageLabels = Object.freeze({ + // ------------------------------ + // PAGE labels + // ------------------------------ + pageTitle: i18n.translate('xpack.securitySolution.artifactListPage.pageTitle', { + defaultMessage: 'Artifact', + }), + pageAboutInfo: i18n.translate('xpack.securitySolution.artifactListPage.aboutInfo', { + defaultMessage: 'A list of artifacts for endpoint', + }), + pageAddButtonTitle: i18n.translate('xpack.securitySolution.artifactListPage.addButtonTitle', { + defaultMessage: 'Add artifact', + }), + + // ------------------------------ + // EMPTY state labels + // ------------------------------ + emptyStateTitle: i18n.translate('xpack.securitySolution.artifactListPage.emptyStateTitle', { + defaultMessage: 'Add your first artifact', + }), + emptyStateInfo: i18n.translate('xpack.securitySolution.artifactListPage.emptyStateInfo', { + defaultMessage: 'Add an artifact', + }), + emptyStatePrimaryButtonLabel: i18n.translate( + 'xpack.securitySolution.artifactListPage.emptyStatePrimaryButtonLabel', + { defaultMessage: 'Add' } + ), + + // ------------------------------ + // SEARCH BAR labels + // ------------------------------ + searchPlaceholderInfo: i18n.translate( + 'xpack.securitySolution.artifactListPage.searchPlaceholderInfo', + { + defaultMessage: 'Search on the fields below: name, description, comments, value', + } + ), + /** + * Return the label to show under the search bar with the total number of items that match the current filter (or all) + * @param total + * + * @example: + * (total) => i18n.translate('xpack.securitySolution.somepage.showingTotal', { + * defaultMessage: 'Showing {total} {total, plural, one {event filter} other {event filters}}', + * values: { total }, + * }) + */ + getShowingCountLabel: (total: number) => { + return i18n.translate('xpack.securitySolution.artifactListPage.showingTotal', { + defaultMessage: 'Showing {total, plural, one {# artifact} other {# artifacts}}', + values: { total }, + }); + }, + + // ------------------------------ + // CARD ACTIONS labels + // ------------------------------ + cardActionEditLabel: i18n.translate( + 'xpack.securitySolution.artifactListPage.cardActionEditLabel', + { + defaultMessage: 'Edit artifact', + } + ), + cardActionDeleteLabel: i18n.translate( + 'xpack.securitySolution.artifactListPage.cardActionDeleteLabel', + { + defaultMessage: 'Delete event filter', + } + ), + + // ------------------------------ + // ARTIFACT FLYOUT + // ------------------------------ + ...ARTIFACT_FLYOUT_LABELS, + + // ------------------------------ + // ARTIFACT DELETE MODAL + // ------------------------------ + ...ARTIFACT_DELETE_LABELS, + ...ARTIFACT_DELETE_ACTION_LABELS, +}); + +type IAllLabels = typeof artifactListPageLabels; + +/** + * The set of labels that normally have the artifact specific name in it, thus must be set for every page + */ +export type ArtifactListPageRequiredLabels = Pick< + IAllLabels, + | 'pageTitle' + | 'pageAboutInfo' + | 'pageAddButtonTitle' + | 'getShowingCountLabel' + | 'cardActionEditLabel' + | 'cardActionDeleteLabel' + | 'flyoutCreateTitle' + | 'flyoutEditTitle' + | 'flyoutCreateSubmitButtonLabel' + | 'flyoutCreateSubmitSuccess' + | 'flyoutEditSubmitSuccess' + | 'flyoutDowngradedLicenseDocsInfo' + | 'deleteActionSuccess' + | 'emptyStateTitle' + | 'emptyStateInfo' + | 'emptyStatePrimaryButtonLabel' +>; + +export type ArtifactListPageOptionalLabels = Omit; + +export type ArtifactListPageLabels = ArtifactListPageRequiredLabels & + Partial; diff --git a/x-pack/plugins/security_solution/public/management/components/artifact_list_page/types.ts b/x-pack/plugins/security_solution/public/management/components/artifact_list_page/types.ts new file mode 100644 index 0000000000000..fa63ebb863ce5 --- /dev/null +++ b/x-pack/plugins/security_solution/public/management/components/artifact_list_page/types.ts @@ -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 { HttpFetchError } from 'kibana/public'; +import type { + ExceptionListItemSchema, + CreateExceptionListItemSchema, +} from '@kbn/securitysolution-io-ts-list-types'; + +export interface ArtifactListPageUrlParams { + page?: number; + pageSize?: number; + filter?: string; + includedPolicies?: string; + show?: 'create' | 'edit'; + itemId?: string; + sortField?: string; + sortOrder?: string; +} + +export interface ArtifactFormComponentProps { + item: ExceptionListItemSchema | CreateExceptionListItemSchema; + mode: 'edit' | 'create'; + /** signals that the form should be made disabled (ex. while an update/create api call is in flight) */ + disabled: boolean; + /** Error will be set if the submission of the form to the api results in an API error. Form can use it to provide feedback to the user */ + error: HttpFetchError | undefined; + + /** reports the state of the form data and the current updated item */ + onChange(formStatus: ArtifactFormComponentOnChangeCallbackProps): void; +} + +export interface ArtifactFormComponentOnChangeCallbackProps { + isValid: boolean; + item: ExceptionListItemSchema | CreateExceptionListItemSchema; +} diff --git a/x-pack/plugins/security_solution/public/management/components/hooks/use_is_mounted.ts b/x-pack/plugins/security_solution/public/management/components/hooks/use_is_mounted.ts new file mode 100644 index 0000000000000..c3ab4472cf429 --- /dev/null +++ b/x-pack/plugins/security_solution/public/management/components/hooks/use_is_mounted.ts @@ -0,0 +1,26 @@ +/* + * 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 { useEffect, useRef } from 'react'; + +/** + * Track when a comonent is mounted/unmounted. Good for use in async processing that may update + * a component's internal state. + */ +export const useIsMounted = (): boolean => { + const isMounted = useRef(false); + + useEffect(() => { + isMounted.current = true; + + return () => { + isMounted.current = false; + }; + }, []); + + return isMounted.current; +}; diff --git a/x-pack/plugins/security_solution/public/management/components/management_page_loader.tsx b/x-pack/plugins/security_solution/public/management/components/management_page_loader.tsx index cc1104127871f..20941c11b1593 100644 --- a/x-pack/plugins/security_solution/public/management/components/management_page_loader.tsx +++ b/x-pack/plugins/security_solution/public/management/components/management_page_loader.tsx @@ -9,7 +9,7 @@ import React, { memo } from 'react'; import { EuiLoadingSpinner } from '@elastic/eui'; import { ManagementEmptyStateWrapper } from './management_empty_state_wrapper'; -export const ManagementPageLoader = memo<{ 'data-test-subj': string }>( +export const ManagementPageLoader = memo<{ 'data-test-subj'?: string }>( ({ 'data-test-subj': dataTestSubj }) => { return ( diff --git a/x-pack/plugins/security_solution/public/management/components/search_exceptions/search_exceptions.test.tsx b/x-pack/plugins/security_solution/public/management/components/search_exceptions/search_exceptions.test.tsx index b6a15c04b3b06..6e86c69c49750 100644 --- a/x-pack/plugins/security_solution/public/management/components/search_exceptions/search_exceptions.test.tsx +++ b/x-pack/plugins/security_solution/public/management/components/search_exceptions/search_exceptions.test.tsx @@ -83,7 +83,7 @@ describe('Search exceptions', () => { }); expect(onSearchMock).toHaveBeenCalledTimes(1); - expect(onSearchMock).toHaveBeenCalledWith(expectedDefaultValue, ''); + expect(onSearchMock).toHaveBeenCalledWith(expectedDefaultValue, '', false); }); it('should dispatch search action when click on button', () => { @@ -96,7 +96,7 @@ describe('Search exceptions', () => { }); expect(onSearchMock).toHaveBeenCalledTimes(1); - expect(onSearchMock).toHaveBeenCalledWith(expectedDefaultValue, ''); + expect(onSearchMock).toHaveBeenCalledWith(expectedDefaultValue, '', true); }); it('should hide refresh button', () => { diff --git a/x-pack/plugins/security_solution/public/management/components/search_exceptions/search_exceptions.tsx b/x-pack/plugins/security_solution/public/management/components/search_exceptions/search_exceptions.tsx index 52eb8d1e7d4f1..7a7a28b4b0647 100644 --- a/x-pack/plugins/security_solution/public/management/components/search_exceptions/search_exceptions.tsx +++ b/x-pack/plugins/security_solution/public/management/components/search_exceptions/search_exceptions.tsx @@ -19,7 +19,14 @@ export interface SearchExceptionsProps { policyList?: ImmutableArray; defaultIncludedPolicies?: string; hideRefreshButton?: boolean; - onSearch(query: string, includedPolicies?: string): void; + onSearch( + /** The query string the user entered into the text field */ + query: string, + /** A list of policy id's comma delimited */ + includedPolicies: string | undefined, + /** Will be `true` if the user clicked the `refresh` button */ + refresh: boolean + ): void; } export const SearchExceptions = memo( @@ -45,7 +52,7 @@ export const SearchExceptions = memo( setIncludedPolicies(includePoliciesNew); - onSearch(query, includePoliciesNew); + onSearch(query, includePoliciesNew, false); }, [onSearch, query] ); @@ -55,13 +62,13 @@ export const SearchExceptions = memo( [setQuery] ); const handleOnSearch = useCallback( - () => onSearch(query, includedPolicies), + () => onSearch(query, includedPolicies, true), [onSearch, query, includedPolicies] ); const handleOnSearchQuery = useCallback( (value) => { - onSearch(value, includedPolicies); + onSearch(value, includedPolicies, false); }, [onSearch, includedPolicies] ); diff --git a/x-pack/plugins/security_solution/public/management/hooks/artifacts/use_bulk_delete_artifact.test.tsx b/x-pack/plugins/security_solution/public/management/hooks/artifacts/use_bulk_delete_artifact.test.tsx index a7bae8c1f37d6..152b2c3f0d690 100644 --- a/x-pack/plugins/security_solution/public/management/hooks/artifacts/use_bulk_delete_artifact.test.tsx +++ b/x-pack/plugins/security_solution/public/management/hooks/artifacts/use_bulk_delete_artifact.test.tsx @@ -51,19 +51,21 @@ describe('Bulk delete artifact hook', () => { expect(fakeHttpServices.delete).toHaveBeenCalledTimes(0); await act(async () => { - const res = await result.mutateAsync(['fakeId-1', 'fakeId-2']); + const res = await result.mutateAsync([{ id: 'fakeId-1' }, { itemId: 'fakeId-2' }]); expect(res).toEqual([exceptionItem1, exceptionItem2]); expect(onSuccessMock).toHaveBeenCalledTimes(1); expect(fakeHttpServices.delete).toHaveBeenCalledTimes(2); expect(fakeHttpServices.delete).toHaveBeenNthCalledWith(1, '/api/exception_lists/items', { query: { id: 'fakeId-1', + item_id: undefined, namespace_type: 'agnostic', }, }); expect(fakeHttpServices.delete).toHaveBeenNthCalledWith(2, '/api/exception_lists/items', { query: { - id: 'fakeId-2', + id: undefined, + item_id: 'fakeId-2', namespace_type: 'agnostic', }, }); @@ -90,7 +92,7 @@ describe('Bulk delete artifact hook', () => { await act(async () => { try { - await result.mutateAsync(['fakeId-1', 'fakeId-2']); + await result.mutateAsync([{ id: 'fakeId-1' }, { id: 'fakeId-2' }]); } catch (err) { expect(err).toBe(error); expect(fakeHttpServices.delete).toHaveBeenCalledTimes(2); diff --git a/x-pack/plugins/security_solution/public/management/hooks/artifacts/use_bulk_delete_artifact.tsx b/x-pack/plugins/security_solution/public/management/hooks/artifacts/use_bulk_delete_artifact.tsx index 5feda65996ea1..9957ff27d4bf9 100644 --- a/x-pack/plugins/security_solution/public/management/hooks/artifacts/use_bulk_delete_artifact.tsx +++ b/x-pack/plugins/security_solution/public/management/hooks/artifacts/use_bulk_delete_artifact.tsx @@ -10,25 +10,34 @@ import { ExceptionListItemSchema } from '@kbn/securitysolution-io-ts-list-types' import { useMutation, UseMutationResult, UseQueryOptions } from 'react-query'; import { ExceptionsListApiClient } from '../../services/exceptions_list/exceptions_list_api_client'; +const DEFAULT_OPTIONS = Object.freeze({}); + export function useBulkDeleteArtifact( exceptionListApiClient: ExceptionsListApiClient, - customOptions: UseQueryOptions, + customOptions: UseQueryOptions = DEFAULT_OPTIONS, options: { concurrency: number; } = { concurrency: 5, } -): UseMutationResult void> { - return useMutation void>( - (exceptionIds: string[]) => { - return pMap( - exceptionIds, - (id) => { - return exceptionListApiClient.delete(id); - }, - options - ); - }, - customOptions - ); +): UseMutationResult< + ExceptionListItemSchema[], + HttpFetchError, + Array<{ itemId?: string; id?: string }>, + () => void +> { + return useMutation< + ExceptionListItemSchema[], + HttpFetchError, + Array<{ itemId?: string; id?: string }>, + () => void + >((exceptionIds: Array<{ itemId?: string; id?: string }>) => { + return pMap( + exceptionIds, + ({ itemId, id }) => { + return exceptionListApiClient.delete(itemId, id); + }, + options + ); + }, customOptions); } diff --git a/x-pack/plugins/security_solution/public/management/hooks/artifacts/use_bulk_update_artifact.tsx b/x-pack/plugins/security_solution/public/management/hooks/artifacts/use_bulk_update_artifact.tsx index 181fe6dc9d7d5..b4854209fa07b 100644 --- a/x-pack/plugins/security_solution/public/management/hooks/artifacts/use_bulk_update_artifact.tsx +++ b/x-pack/plugins/security_solution/public/management/hooks/artifacts/use_bulk_update_artifact.tsx @@ -13,9 +13,11 @@ import { import { useMutation, UseMutationResult, UseQueryOptions } from 'react-query'; import { ExceptionsListApiClient } from '../../services/exceptions_list/exceptions_list_api_client'; +const DEFAULT_OPTIONS = Object.freeze({}); + export function useBulkUpdateArtifact( exceptionListApiClient: ExceptionsListApiClient, - customOptions: UseQueryOptions, + customOptions: UseQueryOptions = DEFAULT_OPTIONS, options: { concurrency: number; } = { diff --git a/x-pack/plugins/security_solution/public/management/hooks/artifacts/use_create_artifact.tsx b/x-pack/plugins/security_solution/public/management/hooks/artifacts/use_create_artifact.tsx index 346c4f7b42a87..74aa6752f371c 100644 --- a/x-pack/plugins/security_solution/public/management/hooks/artifacts/use_create_artifact.tsx +++ b/x-pack/plugins/security_solution/public/management/hooks/artifacts/use_create_artifact.tsx @@ -12,9 +12,11 @@ import { HttpFetchError } from 'kibana/public'; import { useMutation, UseMutationResult, UseQueryOptions } from 'react-query'; import { ExceptionsListApiClient } from '../../services/exceptions_list/exceptions_list_api_client'; +const DEFAULT_OPTIONS = Object.freeze({}); + export function useCreateArtifact( exceptionListApiClient: ExceptionsListApiClient, - customOptions: UseQueryOptions + customOptions: UseQueryOptions = DEFAULT_OPTIONS ): UseMutationResult< ExceptionListItemSchema, HttpFetchError, diff --git a/x-pack/plugins/security_solution/public/management/hooks/artifacts/use_delete_artifact.test.tsx b/x-pack/plugins/security_solution/public/management/hooks/artifacts/use_delete_artifact.test.tsx index 8d31ce8f059bb..bed3faf237b9f 100644 --- a/x-pack/plugins/security_solution/public/management/hooks/artifacts/use_delete_artifact.test.tsx +++ b/x-pack/plugins/security_solution/public/management/hooks/artifacts/use_delete_artifact.test.tsx @@ -49,7 +49,7 @@ describe('Delete artifact hook', () => { expect(fakeHttpServices.delete).toHaveBeenCalledTimes(0); await act(async () => { - const res = await result.mutateAsync('fakeId'); + const res = await result.mutateAsync({ id: 'fakeId' }); expect(res).toBe(exceptionItem); expect(onSuccessMock).toHaveBeenCalledTimes(1); expect(fakeHttpServices.delete).toHaveBeenCalledTimes(1); @@ -82,7 +82,7 @@ describe('Delete artifact hook', () => { await act(async () => { try { - await result.mutateAsync('fakeId'); + await result.mutateAsync({ itemId: 'fakeId' }); } catch (err) { expect(err).toBe(error); expect(fakeHttpServices.delete).toHaveBeenCalledTimes(1); diff --git a/x-pack/plugins/security_solution/public/management/hooks/artifacts/use_delete_artifact.tsx b/x-pack/plugins/security_solution/public/management/hooks/artifacts/use_delete_artifact.tsx index 27820c73b740a..e072eecb06130 100644 --- a/x-pack/plugins/security_solution/public/management/hooks/artifacts/use_delete_artifact.tsx +++ b/x-pack/plugins/security_solution/public/management/hooks/artifacts/use_delete_artifact.tsx @@ -9,11 +9,23 @@ import { HttpFetchError } from 'kibana/public'; import { useMutation, UseMutationResult, UseQueryOptions } from 'react-query'; import { ExceptionsListApiClient } from '../../services/exceptions_list/exceptions_list_api_client'; +const DEFAULT_OPTIONS = Object.freeze({}); + export function useDeleteArtifact( exceptionListApiClient: ExceptionsListApiClient, - customOptions: UseQueryOptions -): UseMutationResult void> { - return useMutation void>((id: string) => { - return exceptionListApiClient.delete(id); + customOptions: UseQueryOptions = DEFAULT_OPTIONS +): UseMutationResult< + ExceptionListItemSchema, + HttpFetchError, + { itemId?: string; id?: string }, + () => void +> { + return useMutation< + ExceptionListItemSchema, + HttpFetchError, + { itemId?: string; id?: string }, + () => void + >(({ itemId, id }) => { + return exceptionListApiClient.delete(itemId, id); }, customOptions); } diff --git a/x-pack/plugins/security_solution/public/management/hooks/artifacts/use_get_artifact.test.tsx b/x-pack/plugins/security_solution/public/management/hooks/artifacts/use_get_artifact.test.tsx index 70f9620c6edc9..470f29b563f67 100644 --- a/x-pack/plugins/security_solution/public/management/hooks/artifacts/use_get_artifact.test.tsx +++ b/x-pack/plugins/security_solution/public/management/hooks/artifacts/use_get_artifact.test.tsx @@ -39,7 +39,7 @@ describe('Get artifact hook', () => { result = await renderQuery( () => - useGetArtifact(instance, 'fakeId', { + useGetArtifact(instance, 'fakeId', undefined, { onSuccess: onSuccessMock, retry: false, }), @@ -50,7 +50,7 @@ describe('Get artifact hook', () => { expect(fakeHttpServices.get).toHaveBeenCalledTimes(1); expect(fakeHttpServices.get).toHaveBeenCalledWith('/api/exception_lists/items', { query: { - id: 'fakeId', + item_id: 'fakeId', namespace_type: 'agnostic', }, }); @@ -69,7 +69,7 @@ describe('Get artifact hook', () => { result = await renderQuery( () => - useGetArtifact(instance, 'fakeId', { + useGetArtifact(instance, undefined, 'fakeId', { onError: onErrorMock, retry: false, }), diff --git a/x-pack/plugins/security_solution/public/management/hooks/artifacts/use_get_artifact.tsx b/x-pack/plugins/security_solution/public/management/hooks/artifacts/use_get_artifact.tsx index bc27ba285ccb3..676c424e1a278 100644 --- a/x-pack/plugins/security_solution/public/management/hooks/artifacts/use_get_artifact.tsx +++ b/x-pack/plugins/security_solution/public/management/hooks/artifacts/use_get_artifact.tsx @@ -9,15 +9,18 @@ import { HttpFetchError } from 'kibana/public'; import { QueryObserverResult, useQuery, UseQueryOptions } from 'react-query'; import { ExceptionsListApiClient } from '../../services/exceptions_list/exceptions_list_api_client'; +const DEFAULT_OPTIONS = Object.freeze({}); + export function useGetArtifact( exceptionListApiClient: ExceptionsListApiClient, - id: string, - customQueryOptions: UseQueryOptions + itemId?: string, + id?: string, + customQueryOptions: UseQueryOptions = DEFAULT_OPTIONS ): QueryObserverResult { return useQuery( - ['get', exceptionListApiClient, id], + ['get', exceptionListApiClient, itemId, id], () => { - return exceptionListApiClient.get(id); + return exceptionListApiClient.get(itemId, id); }, { refetchIntervalInBackground: false, diff --git a/x-pack/plugins/security_solution/public/management/hooks/artifacts/use_update_artifact.tsx b/x-pack/plugins/security_solution/public/management/hooks/artifacts/use_update_artifact.tsx index a972096bb600c..54acea6489574 100644 --- a/x-pack/plugins/security_solution/public/management/hooks/artifacts/use_update_artifact.tsx +++ b/x-pack/plugins/security_solution/public/management/hooks/artifacts/use_update_artifact.tsx @@ -12,9 +12,11 @@ import { HttpFetchError } from 'kibana/public'; import { useMutation, UseMutationResult, UseQueryOptions } from 'react-query'; import { ExceptionsListApiClient } from '../../services/exceptions_list/exceptions_list_api_client'; +const DEFAULT_OPTIONS = Object.freeze({}); + export function useUpdateArtifact( exceptionListApiClient: ExceptionsListApiClient, - customQueryOptions: UseQueryOptions + customQueryOptions: UseQueryOptions = DEFAULT_OPTIONS ): UseMutationResult< ExceptionListItemSchema, HttpFetchError, diff --git a/x-pack/plugins/security_solution/public/management/pages/blocklist/view/blocklist.test.tsx b/x-pack/plugins/security_solution/public/management/pages/blocklist/view/blocklist.test.tsx index 37f4004ba9174..2dab6a8fd497a 100644 --- a/x-pack/plugins/security_solution/public/management/pages/blocklist/view/blocklist.test.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/blocklist/view/blocklist.test.tsx @@ -5,10 +5,9 @@ * 2.0. */ -import { act } from '@testing-library/react'; +import { act, waitFor } from '@testing-library/react'; import React from 'react'; import { BLOCKLIST_PATH } from '../../../../../common/constants'; -import { useUserPrivileges as _useUserPrivileges } from '../../../../common/components/user_privileges'; import { AppContextTestRender, createAppRootMockRenderer } from '../../../../common/mock/endpoint'; import { Blocklist } from './blocklist'; @@ -28,12 +27,12 @@ describe('When on the blocklist page', () => { }); }); - describe('When on the blocklist list page', () => { - describe('And no data exists', () => { - it('should show the Empty message', async () => { - render(); - expect(renderResult.getByTestId('blocklistEmpty')).toBeTruthy(); - }); + describe('And no data exists', () => { + it('should show the Empty message', async () => { + render(); + await waitFor(() => + expect(renderResult.getByTestId('blocklistPage-emptyState')).toBeTruthy() + ); }); }); }); diff --git a/x-pack/plugins/security_solution/public/management/pages/blocklist/view/blocklist.tsx b/x-pack/plugins/security_solution/public/management/pages/blocklist/view/blocklist.tsx index ab96451f0cd25..a48d6c5bd8377 100644 --- a/x-pack/plugins/security_solution/public/management/pages/blocklist/view/blocklist.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/blocklist/view/blocklist.tsx @@ -5,80 +5,130 @@ * 2.0. */ -import React, { memo, useMemo } from 'react'; -import { useLocation } from 'react-router-dom'; -import { FormattedMessage } from '@kbn/i18n-react'; -import { EuiButton } from '@elastic/eui'; -import { AdministrationListPage } from '../../../components/administration_list_page'; -import { ListPageRouteState } from '../../../../../common/endpoint/types'; -import { useMemoizedRouteState } from '../../../common/hooks'; -import { BackToExternalAppButton } from '../../../components/back_to_external_app_button'; -import { BlocklistEmptyState } from './components/empty'; -import { BackToExternalAppSecondaryButton } from '../../../components/back_to_external_app_secondary_button'; +import React, { memo } from 'react'; +import { i18n } from '@kbn/i18n'; +import { useHttp } from '../../../../common/lib/kibana'; +import { ArtifactListPage, ArtifactListPageProps } from '../../../components/artifact_list_page'; +import { HostIsolationExceptionsApiClient } from '../../host_isolation_exceptions/host_isolation_exceptions_api_client'; -export const Blocklist = memo(() => { - const { state: routeState } = useLocation(); - const memoizedRouteState = useMemoizedRouteState(routeState); +// FIXME:PT delete this when real component is implemented +const TempDevFormComponent: ArtifactListPageProps['ArtifactFormComponent'] = (props) => { + // For Dev. Delete once we implement this component + // @ts-ignore + if (!window._dev_artifact_form_props) { + // @ts-ignore + window._dev_artifact_form_props = []; + // @ts-ignore + window.console.log(window._dev_artifact_form_props); + } + // @ts-ignore + window._dev_artifact_form_props.push(props); - const backButtonEmptyComponent = useMemo(() => { - if (memoizedRouteState && memoizedRouteState.onBackButtonNavigateTo) { - return ; - } - }, [memoizedRouteState]); + return ( +
+
+ {props.error ? props.error?.body?.message || props.error : ''} +
+ {`TODO: ${props.mode} Form here`} +
+ ); +}; - const backButtonHeaderComponent = useMemo(() => { - if (memoizedRouteState && memoizedRouteState.onBackButtonNavigateTo) { - return ; - } - }, [memoizedRouteState]); +const BLOCKLIST_PAGE_LABELS: ArtifactListPageProps['labels'] = { + pageTitle: i18n.translate('xpack.securitySolution.blocklist.pageTitle', { + defaultMessage: 'Blocklist', + }), + pageAboutInfo: i18n.translate('xpack.securitySolution.blocklist.pageAboutInfo', { + defaultMessage: '(DEV: temporarily using isolation exception api)', // FIXME: need wording from PM + }), + pageAddButtonTitle: i18n.translate('xpack.securitySolution.blocklist.pageAddButtonTitle', { + defaultMessage: 'Add blocklist entry', + }), + getShowingCountLabel: (total) => + i18n.translate('xpack.securitySolution.blocklist.showingTotal', { + defaultMessage: 'Showing {total} {total, plural, one {blocklist} other {blocklists}}', + values: { total }, + }), + cardActionEditLabel: i18n.translate('xpack.securitySolution.blocklist.cardActionEditLabel', { + defaultMessage: 'Edit blocklist', + }), + cardActionDeleteLabel: i18n.translate('xpack.securitySolution.blocklist.cardActionDeleteLabel', { + defaultMessage: 'Delete blocklist', + }), + flyoutCreateTitle: i18n.translate('xpack.securitySolution.blocklist.flyoutCreateTitle', { + defaultMessage: 'Add blocklist', + }), + flyoutEditTitle: i18n.translate('xpack.securitySolution.blocklist.flyoutEditTitle', { + defaultMessage: 'Edit blocklist', + }), + flyoutCreateSubmitButtonLabel: i18n.translate( + 'xpack.securitySolution.blocklist.flyoutCreateSubmitButtonLabel', + { defaultMessage: 'Add blocklist' } + ), + flyoutCreateSubmitSuccess: ({ name }) => + i18n.translate('xpack.securitySolution.blocklist.flyoutCreateSubmitSuccess', { + defaultMessage: '"{name}" has been added to your blocklist.', // FIXME: match this to design (needs count of items) + values: { name }, + }), + flyoutEditSubmitSuccess: ({ name }) => + i18n.translate('xpack.securitySolution.blocklist.flyoutEditSubmitSuccess', { + defaultMessage: '"{name}" has been updated.', + values: { name }, + }), + flyoutDowngradedLicenseDocsInfo: () => { + return 'tbd...'; + // FIXME: define docs link for license downgrade message. sample code below - const hasDataToShow = false; + // const { docLinks } = useKibana().services; + // return ( + // + // {' '} + // {' '} + // + // ), + // }} + // /> + // ); + }, + deleteActionSuccess: (itemName) => + i18n.translate('xpack.securitySolution.blocklist.deleteSuccess', { + defaultMessage: '"{itemName}" has been removed from blocklist.', + values: { itemName }, + }), + emptyStateTitle: i18n.translate('xpack.securitySolution.blocklist.emptyStateTitle', { + defaultMessage: 'Add your first blocklist', + }), + emptyStateInfo: i18n.translate( + 'xpack.securitySolution.blocklist.emptyStateInfo', + { defaultMessage: 'Add a blocklist to prevent execution on the endpoint' } // FIXME: need wording here form PM + ), + emptyStatePrimaryButtonLabel: i18n.translate( + 'xpack.securitySolution.blocklist.emptyStatePrimaryButtonLabel', + { defaultMessage: 'Add blocklist' } + ), +}; - const handleAddButtonClick = () => {}; +export const Blocklist = memo(() => { + const http = useHttp(); + // FIXME: Implement Blocklist API client and define list + // for now, just using Event Filters + const eventFiltersApiClient = HostIsolationExceptionsApiClient.getInstance(http); return ( - - } - subtitle={ - - } - actions={ - hasDataToShow ? ( - - - - ) : ( - [] - ) - } - hideHeader={!hasDataToShow} - > - {hasDataToShow ? ( -

{'Data, search bar, etc here'}

- ) : ( - - )} -
+ ); }); diff --git a/x-pack/plugins/security_solution/public/management/pages/blocklist/view/components/empty.tsx b/x-pack/plugins/security_solution/public/management/pages/blocklist/view/components/empty.tsx deleted file mode 100644 index bd1d01b73ec8d..0000000000000 --- a/x-pack/plugins/security_solution/public/management/pages/blocklist/view/components/empty.tsx +++ /dev/null @@ -1,58 +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, { memo } from 'react'; -import styled, { css } from 'styled-components'; -import { EuiButton, EuiEmptyPrompt } from '@elastic/eui'; -import { FormattedMessage } from '@kbn/i18n-react'; -import { ManagementEmptyStateWrapper } from '../../../../components/management_empty_state_wrapper'; - -const EmptyPrompt = styled(EuiEmptyPrompt)` - ${() => css` - max-width: 100%; - `} -`; - -export const BlocklistEmptyState = memo<{ - onAdd: () => void; - backComponent?: React.ReactNode; -}>(({ onAdd, backComponent }) => { - return ( - - - - - } - body={ - - } - actions={[ - - - , - - ...(backComponent ? [backComponent] : []), - ]} - /> - - ); -}); - -BlocklistEmptyState.displayName = 'BlocklistEmptyState'; diff --git a/x-pack/plugins/security_solution/public/management/pages/mocks/trusted_apps_http_mocks.ts b/x-pack/plugins/security_solution/public/management/pages/mocks/trusted_apps_http_mocks.ts index 347f1dc088c10..c92dcc0bd7cc4 100644 --- a/x-pack/plugins/security_solution/public/management/pages/mocks/trusted_apps_http_mocks.ts +++ b/x-pack/plugins/security_solution/public/management/pages/mocks/trusted_apps_http_mocks.ts @@ -33,7 +33,10 @@ import { fleetGetEndpointPackagePolicyListHttpMock, FleetGetEndpointPackagePolicyListHttpMockInterface, } from './fleet_mocks'; -import { BY_POLICY_ARTIFACT_TAG_PREFIX } from '../../../../common/endpoint/service/artifacts/constants'; +import { + BY_POLICY_ARTIFACT_TAG_PREFIX, + GLOBAL_ARTIFACT_TAG, +} from '../../../../common/endpoint/service/artifacts/constants'; interface FindExceptionListItemSchemaQueryParams extends Omit { @@ -58,7 +61,11 @@ export const trustedAppsGetListHttpMocks = const generator = new ExceptionsListItemGenerator('seed'); const perPage = apiQueryParams.per_page ?? 10; const data = Array.from({ length: Math.min(perPage, 50) }, () => - generator.generate({ list_id: ENDPOINT_TRUSTED_APPS_LIST_ID, os_types: ['windows'] }) + generator.generate({ + list_id: ENDPOINT_TRUSTED_APPS_LIST_ID, + os_types: ['windows'], + tags: [GLOBAL_ARTIFACT_TAG], + }) ); // FIXME: remove hard-coded IDs below adn get them from the new FleetPackagePolicyGenerator (#2262) @@ -130,6 +137,7 @@ export const trustedAppsGetOneHttpMocks = const apiQueryParams = query as ReadExceptionListItemSchema; const exceptionItem = new ExceptionsListItemGenerator('seed').generate({ os_types: ['windows'], + tags: [GLOBAL_ARTIFACT_TAG], }); exceptionItem.item_id = apiQueryParams.item_id ?? exceptionItem.item_id; @@ -157,7 +165,10 @@ export const trustedAppPostHttpMocks = httpHandlerMockFactory { mockedApis = trustedAppsAllHttpMocks(mockedContext.coreStart.http); getState = () => mockedContext.store.getState().management.policyDetails; render = () => mockedContext.render(); + + const getTaListApiResponseMock = + mockedApis.responseProvider.trustedAppsList.getMockImplementation(); + mockedApis.responseProvider.trustedAppsList.mockImplementation((options) => { + const response = getTaListApiResponseMock!(options); + response.data = response.data.filter((ta) => isArtifactByPolicy(ta)); + return response; + }); }); afterEach(() => reactTestingLibrary.cleanup()); @@ -97,7 +106,7 @@ describe('Policy trusted apps flyout', () => { }); expect(component.getByTestId('confirmPolicyTrustedAppsFlyout')).not.toBeNull(); - expect(component.getByTestId('Generated Exception (u6kh2)_checkbox')).not.toBeNull(); + expect(component.getByTestId('Generated Exception (nng74)_checkbox')).not.toBeNull(); }); it('should confirm flyout action', async () => { @@ -111,7 +120,7 @@ describe('Policy trusted apps flyout', () => { }); // TA name below in the selector matches the 3rd generated trusted app which is policy specific - const tACardCheckbox = component.getByTestId('Generated Exception (3xnng)_checkbox'); + const tACardCheckbox = component.getByTestId('Generated Exception (nng74)_checkbox'); act(() => { fireEvent.click(tACardCheckbox); diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/trusted_apps/list/remove_trusted_app_from_policy_modal.test.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/trusted_apps/list/remove_trusted_app_from_policy_modal.test.tsx index 172b5218188c6..676080d180a6a 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/trusted_apps/list/remove_trusted_app_from_policy_modal.test.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/trusted_apps/list/remove_trusted_app_from_policy_modal.test.tsx @@ -214,7 +214,7 @@ describe('When using the RemoveTrustedAppFromPolicyModal component', () => { await clickConfirmButton(true, true); expect(appTestContext.coreStart.notifications.toasts.addSuccess).toHaveBeenCalledWith({ - text: '"Generated Exception (3xnng)" has been removed from Endpoint Policy policy', + text: '"Generated Exception (nng74)" has been removed from Endpoint Policy policy', title: 'Successfully removed', }); }); diff --git a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/trusted_apps_page.test.tsx b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/trusted_apps_page.test.tsx index 73d85077e9579..82169fcd19c10 100644 --- a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/trusted_apps_page.test.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/trusted_apps_page.test.tsx @@ -219,7 +219,7 @@ describe('When on the Trusted Apps Page', () => { it('should persist edit params to url', () => { expect(history.location.search).toEqual( - '?show=edit&id=2d95bec3-b48f-4db7-9622-a2b061cc031d' + '?show=edit&id=bec3b48f-ddb7-4622-a2b0-61cc031d17eb' ); }); @@ -251,7 +251,7 @@ describe('When on the Trusted Apps Page', () => { 'addTrustedAppFlyout-createForm-descriptionField' ) as HTMLTextAreaElement; - expect(formNameInput.value).toEqual('Generated Exception (3xnng)'); + expect(formNameInput.value).toEqual('Generated Exception (nng74)'); expect(formDescriptionInput.value).toEqual('created by ExceptionListItemGenerator'); }); @@ -276,8 +276,8 @@ describe('When on the Trusted Apps Page', () => { expect(lastCallToPut[0]).toEqual('/api/exception_lists/items'); expect(JSON.parse(lastCallToPut[1].body as string)).toEqual({ - _version: '3o9za', - name: 'Generated Exception (3xnng)', + _version: '9zawi', + name: 'Generated Exception (nng74)', description: 'created by ExceptionListItemGenerator', entries: [ { @@ -300,7 +300,7 @@ describe('When on the Trusted Apps Page', () => { ], id: '05b5e350-0cad-4dc3-a61d-6e6796b0af39', comments: [], - item_id: '2d95bec3-b48f-4db7-9622-a2b061cc031d', + item_id: 'bec3b48f-ddb7-4622-a2b0-61cc031d17eb', namespace_type: 'agnostic', type: 'simple', }); diff --git a/x-pack/plugins/security_solution/public/management/services/exceptions_list/exceptions_list_api_client.test.ts b/x-pack/plugins/security_solution/public/management/services/exceptions_list/exceptions_list_api_client.test.ts index 21a50079a1f1f..e5c8d110b63f2 100644 --- a/x-pack/plugins/security_solution/public/management/services/exceptions_list/exceptions_list_api_client.test.ts +++ b/x-pack/plugins/security_solution/public/management/services/exceptions_list/exceptions_list_api_client.test.ts @@ -165,7 +165,8 @@ describe('Exceptions List Api Client', () => { expect(fakeHttpServices.get).toHaveBeenCalledTimes(1); expect(fakeHttpServices.get).toHaveBeenCalledWith(EXCEPTION_LIST_ITEM_URL, { query: { - id: fakeItemId, + item_id: fakeItemId, + id: undefined, namespace_type: 'agnostic', }, }); @@ -222,7 +223,8 @@ describe('Exceptions List Api Client', () => { expect(fakeHttpServices.delete).toHaveBeenCalledTimes(1); expect(fakeHttpServices.delete).toHaveBeenCalledWith(EXCEPTION_LIST_ITEM_URL, { query: { - id: fakeItemId, + item_id: fakeItemId, + id: undefined, namespace_type: 'agnostic', }, }); @@ -243,5 +245,32 @@ describe('Exceptions List Api Client', () => { }, }); }); + + it('hasData method returns true when list has data', async () => { + fakeHttpServices.get.mockResolvedValue({ + total: 1, + }); + + const exceptionsListApiClientInstance = getInstance(); + + await expect(exceptionsListApiClientInstance.hasData()).resolves.toBe(true); + + expect(fakeHttpServices.get).toHaveBeenCalledWith(`${EXCEPTION_LIST_ITEM_URL}/_find`, { + query: expect.objectContaining({ + page: 1, + per_page: 1, + }), + }); + }); + + it('hasData method returns false when list has no data', async () => { + fakeHttpServices.get.mockResolvedValue({ + total: 0, + }); + + const exceptionsListApiClientInstance = getInstance(); + + await expect(exceptionsListApiClientInstance.hasData()).resolves.toBe(false); + }); }); }); diff --git a/x-pack/plugins/security_solution/public/management/services/exceptions_list/exceptions_list_api_client.ts b/x-pack/plugins/security_solution/public/management/services/exceptions_list/exceptions_list_api_client.ts index 6edf55e569d35..c995754dd1907 100644 --- a/x-pack/plugins/security_solution/public/management/services/exceptions_list/exceptions_list_api_client.ts +++ b/x-pack/plugins/security_solution/public/management/services/exceptions_list/exceptions_list_api_client.ts @@ -30,7 +30,7 @@ export class ExceptionsListApiClient { constructor( private readonly http: HttpStart, - private readonly listId: ListId, + public readonly listId: ListId, private readonly listDefinition: CreateExceptionListSchema ) { this.ensureListExists = this.createExceptionList(); @@ -166,14 +166,19 @@ export class ExceptionsListApiClient { } /** - * Returns an item filtered by id - * It requires an id in order to get the desired item + * Returns an item for the given `itemId` or `id`. Exception List Items have both an `item_id` + * and `id`, and at least one of these two is required to be provided. */ - async get(id: string): Promise { + async get(itemId?: string, id?: string): Promise { + if (!itemId && !id) { + throw TypeError('either `itemId` or `id` argument must be set'); + } + await this.ensureListExists; return this.http.get(EXCEPTION_LIST_ITEM_URL, { query: { id, + item_id: itemId, namespace_type: 'agnostic', }, }); @@ -204,14 +209,19 @@ export class ExceptionsListApiClient { } /** - * It deletes an existing item. - * It requires a valid item id. + * It deletes an existing item by `itemId` or `id`. Exception List Items have both an `item_id` + * and `id`, and at least one of these two is required to be provided. */ - async delete(id: string): Promise { + async delete(itemId?: string, id?: string): Promise { + if (!itemId && !id) { + throw TypeError('either `itemId` or `id` argument must be set'); + } + await this.ensureListExists; return this.http.delete(EXCEPTION_LIST_ITEM_URL, { query: { id, + item_id: itemId, namespace_type: 'agnostic', }, }); @@ -231,4 +241,11 @@ export class ExceptionsListApiClient { }, }); } + + /** + * Checks if the given list has any data in it + */ + async hasData(): Promise { + return (await this.find({ perPage: 1, page: 1 })).total > 0; + } } diff --git a/x-pack/plugins/security_solution/scripts/endpoint/event_filters/index.ts b/x-pack/plugins/security_solution/scripts/endpoint/event_filters/index.ts index 70801e08ea335..7f18c0b40fed7 100644 --- a/x-pack/plugins/security_solution/scripts/endpoint/event_filters/index.ts +++ b/x-pack/plugins/security_solution/scripts/endpoint/event_filters/index.ts @@ -17,8 +17,9 @@ import { EXCEPTION_LIST_ITEM_URL, EXCEPTION_LIST_URL, } from '@kbn/securitysolution-list-constants'; -import { EventFilterGenerator } from '../../../common/endpoint/data_generators/event_filter_generator'; import { randomPolicyIdGenerator } from '../common/random_policy_id_generator'; +import { ExceptionsListItemGenerator } from '../../../common/endpoint/data_generators/exceptions_list_item_generator'; +import { isArtifactByPolicy } from '../../../common/endpoint/service/artifacts'; export const cli = () => { run( @@ -66,7 +67,7 @@ const handleThrowAxiosHttpError = (err: AxiosError): never => { }; const createEventFilters: RunFn = async ({ flags, log }) => { - const eventGenerator = new EventFilterGenerator(); + const eventGenerator = new ExceptionsListItemGenerator(); const kbn = new KbnClient({ log, url: flags.kibana as string }); await ensureCreateEndpointEventFiltersList(kbn); @@ -76,8 +77,9 @@ const createEventFilters: RunFn = async ({ flags, log }) => { await pMap( Array.from({ length: flags.count as unknown as number }), () => { - const body = eventGenerator.generate(); - if (body.tags?.length && body.tags[0] !== 'policy:all') { + const body = eventGenerator.generateEventFilterForCreate(); + + if (isArtifactByPolicy(body)) { const nmExceptions = Math.floor(Math.random() * 3) || 1; body.tags = Array.from({ length: nmExceptions }, () => { return `policy:${randomPolicyId()}`; diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_artifacts/host_isolation_exceptions.ts b/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_artifacts/host_isolation_exceptions.ts index ffa7473e95416..5e1166d03f0d5 100644 --- a/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_artifacts/host_isolation_exceptions.ts +++ b/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_artifacts/host_isolation_exceptions.ts @@ -11,7 +11,10 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../../ftr_provider_context'; import { PolicyTestResourceInfo } from '../../../security_solution_endpoint/services/endpoint_policy'; import { ArtifactTestData } from '../../../security_solution_endpoint/services/endpoint_artifacts'; -import { BY_POLICY_ARTIFACT_TAG_PREFIX } from '../../../../plugins/security_solution/common/endpoint/service/artifacts'; +import { + BY_POLICY_ARTIFACT_TAG_PREFIX, + GLOBAL_ARTIFACT_TAG, +} from '../../../../plugins/security_solution/common/endpoint/service/artifacts'; import { createUserAndRole, deleteUserAndRole, @@ -29,6 +32,7 @@ export default function ({ getService }: FtrProviderContext) { const supertestWithoutAuth = getService('supertestWithoutAuth'); const endpointPolicyTestResources = getService('endpointPolicyTestResources'); const endpointArtifactTestResources = getService('endpointArtifactTestResources'); + const log = getService('log'); type ApiCallsInterface = Array<{ method: keyof Pick; @@ -67,7 +71,10 @@ export default function ({ getService }: FtrProviderContext) { { method: 'post', path: EXCEPTION_LIST_ITEM_URL, - getBody: () => exceptionsGenerator.generateHostIsolationExceptionForCreate(), + getBody: () => + exceptionsGenerator.generateHostIsolationExceptionForCreate({ + tags: [GLOBAL_ARTIFACT_TAG], + }), }, { method: 'put', @@ -77,6 +84,7 @@ export default function ({ getService }: FtrProviderContext) { id: existingExceptionData.artifact.id, item_id: existingExceptionData.artifact.item_id, _version: existingExceptionData.artifact._version, + tags: [GLOBAL_ARTIFACT_TAG], }), }, ]; @@ -214,11 +222,17 @@ export default function ({ getService }: FtrProviderContext) { await supertest[apiCall.method](apiCall.path) .set('kbn-xsrf', 'true') + .on('error', (error) => { + log.error(JSON.stringify(error?.response?.body ?? error, null, 2)); + }) .send(body) .expect(200); const deleteUrl = `${EXCEPTION_LIST_ITEM_URL}?item_id=${body.item_id}&namespace_type=${body.namespace_type}`; - await supertest.delete(deleteUrl).set('kbn-xsrf', 'true'); + + log.info(`cleaning up: ${deleteUrl}`); + + await supertest.delete(deleteUrl).set('kbn-xsrf', 'true').expect(200); }); } }); diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_artifacts/trusted_apps.ts b/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_artifacts/trusted_apps.ts index 7caf4f085694a..60b479c5b37d9 100644 --- a/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_artifacts/trusted_apps.ts +++ b/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_artifacts/trusted_apps.ts @@ -11,7 +11,10 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../../ftr_provider_context'; import { PolicyTestResourceInfo } from '../../../security_solution_endpoint/services/endpoint_policy'; import { ArtifactTestData } from '../../../security_solution_endpoint/services//endpoint_artifacts'; -import { BY_POLICY_ARTIFACT_TAG_PREFIX } from '../../../../plugins/security_solution/common/endpoint/service/artifacts'; +import { + BY_POLICY_ARTIFACT_TAG_PREFIX, + GLOBAL_ARTIFACT_TAG, +} from '../../../../plugins/security_solution/common/endpoint/service/artifacts'; import { ExceptionsListItemGenerator } from '../../../../plugins/security_solution/common/endpoint/data_generators/exceptions_list_item_generator'; import { createUserAndRole, @@ -91,7 +94,9 @@ export default function ({ getService }: FtrProviderContext) { { method: 'post', path: EXCEPTION_LIST_ITEM_URL, - getBody: () => exceptionsGenerator.generateTrustedAppForCreate(), + getBody: () => { + return exceptionsGenerator.generateTrustedAppForCreate({ tags: [GLOBAL_ARTIFACT_TAG] }); + }, }, { method: 'put', @@ -100,6 +105,7 @@ export default function ({ getService }: FtrProviderContext) { exceptionsGenerator.generateTrustedAppForUpdate({ id: trustedAppData.artifact.id, item_id: trustedAppData.artifact.item_id, + tags: [GLOBAL_ARTIFACT_TAG], }), }, ]; From d746bd4c5f9e57114cb61749c7a878d87d83bdff Mon Sep 17 00:00:00 2001 From: John Dorlus Date: Thu, 24 Feb 2022 14:09:20 -0500 Subject: [PATCH 021/102] Migrated Snapshot and Restore tests to use test user (#126011) * Migrated Snapshot and Restore tests to use test user. * added another permission to address unauthorized failure. * Added metadata perms for kibana administration. * Testing out different permissions. * Edited test to not refresh page after role is set. Causing errors. * Adjusted perms per documentation. * Addded link to the documentation specifying the permissions needed for snapshot restore. Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../apps/snapshot_restore/home_page.ts | 5 +++-- x-pack/test/functional/config.js | 19 +++++++++++++++++++ .../page_objects/snapshot_restore_page.ts | 5 ++++- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/x-pack/test/functional/apps/snapshot_restore/home_page.ts b/x-pack/test/functional/apps/snapshot_restore/home_page.ts index b2893ace7b20a..c29135e089bfa 100644 --- a/x-pack/test/functional/apps/snapshot_restore/home_page.ts +++ b/x-pack/test/functional/apps/snapshot_restore/home_page.ts @@ -12,9 +12,11 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const pageObjects = getPageObjects(['common', 'snapshotRestore']); const log = getService('log'); const es = getService('es'); + const security = getService('security'); describe('Home page', function () { before(async () => { + await security.testUser.setRoles(['snapshot_restore_user'], false); await pageObjects.common.navigateToApp('snapshotRestore'); }); @@ -46,9 +48,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { it('cleanup repository', async () => { await pageObjects.snapshotRestore.viewRepositoryDetails('my-repository'); - await pageObjects.common.sleep(25000); const cleanupResponse = await pageObjects.snapshotRestore.performRepositoryCleanup(); - await pageObjects.common.sleep(25000); expect(cleanupResponse).to.contain('results'); expect(cleanupResponse).to.contain('deleted_bytes'); expect(cleanupResponse).to.contain('deleted_blobs'); @@ -57,6 +57,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await es.snapshot.deleteRepository({ name: 'my-repository', }); + await security.testUser.restoreDefaults(); }); }); }); diff --git a/x-pack/test/functional/config.js b/x-pack/test/functional/config.js index 2d26bc6391d9d..66b32dac8e4b7 100644 --- a/x-pack/test/functional/config.js +++ b/x-pack/test/functional/config.js @@ -551,6 +551,25 @@ export default async function ({ readConfigFile }) { }, ], }, + // https://www.elastic.co/guide/en/elasticsearch/reference/master/snapshots-register-repository.html#snapshot-repo-prereqs + snapshot_restore_user: { + elasticsearch: { + cluster: [ + 'monitor', + 'manage_slm', + 'cluster:admin/snapshot', + 'cluster:admin/repository', + ], + }, + kibana: [ + { + feature: { + advancedSettings: ['read'], + }, + spaces: ['*'], + }, + ], + }, ingest_pipelines_user: { elasticsearch: { diff --git a/x-pack/test/functional/page_objects/snapshot_restore_page.ts b/x-pack/test/functional/page_objects/snapshot_restore_page.ts index 216b2bfff9d7e..e1fc50ed86fa2 100644 --- a/x-pack/test/functional/page_objects/snapshot_restore_page.ts +++ b/x-pack/test/functional/page_objects/snapshot_restore_page.ts @@ -49,12 +49,15 @@ export function SnapshotRestorePageProvider({ getService }: FtrProviderContext) const repoToView = repos.filter((r) => (r.repoName = name))[0]; await repoToView.repoLink.click(); } - await retry.waitForWithTimeout(`Repo title should be ${name}`, 10000, async () => { + await retry.waitForWithTimeout(`Repo title should be ${name}`, 25000, async () => { return (await testSubjects.getVisibleText('title')) === name; }); }, async performRepositoryCleanup() { await testSubjects.click('cleanupRepositoryButton'); + await retry.waitForWithTimeout(`wait for code block to be visible`, 25000, async () => { + return await testSubjects.isDisplayed('cleanupCodeBlock'); + }); return await testSubjects.getVisibleText('cleanupCodeBlock'); }, }; From febb41c3e60a6c3ad9928726890ed37a5cf5ef99 Mon Sep 17 00:00:00 2001 From: Maja Grubic Date: Thu, 24 Feb 2022 20:39:59 +0100 Subject: [PATCH 022/102] [Shared UX] No Data Views Component (#125403) * Adding illustration * Add components * Add fake data view editor * [Shared UX] Adding No data views component * updating failing button snapshot * Fix style name * Update test * Change folder structure * Refactoring service * Fixing comments * Minor fixes * Fix failing snapshot * Change the layout of the component * Polish * Fix missing export * Fix docLinks initialization * Fix failing test * Remove unnecessary div Co-authored-by: Caroline Horn <549577+cchaos@users.noreply.github.com> * Use calc function Co-authored-by: Caroline Horn <549577+cchaos@users.noreply.github.com> * Rename onClick prop * Updated to use EuiEmptyPrompt * Fixing tests * Applying Clint's comments * Add documentation * Update string * Feedback for PR #125403 * Add missing comment * Fix import issue Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Caroline Horn <549577+cchaos@users.noreply.github.com> Co-authored-by: cchaos Co-authored-by: Clint Andrew Hall --- src/plugins/shared_ux/kibana.json | 2 +- .../assets/data_view_illustration.tsx | 552 ++++++++++++++++++ .../components/empty_state/assets/index.tsx | 24 + .../public/components/empty_state/index.tsx | 9 + .../documentation_link.test.tsx.snap | 35 ++ .../no_data_views/documentation_link.test.tsx | 28 + .../no_data_views/documentation_link.tsx | 39 ++ .../empty_state/no_data_views/index.tsx | 9 + .../no_data_views.component.test.tsx | 53 ++ .../no_data_views/no_data_views.component.tsx | 90 +++ .../no_data_views/no_data_views.mdx | 14 + .../no_data_views/no_data_views.stories.tsx | 52 ++ .../no_data_views/no_data_views.test.tsx | 48 ++ .../no_data_views/no_data_views.tsx | 72 +++ .../exit_full_screen_button.test.tsx.snap | 15 + .../shared_ux/public/components/index.ts | 17 + src/plugins/shared_ux/public/index.ts | 1 + .../shared_ux/public/services/doc_links.ts | 10 + .../shared_ux/public/services/editors.ts | 15 + .../shared_ux/public/services/index.tsx | 12 + .../public/services/kibana/doc_links.ts | 23 + .../public/services/kibana/editors.ts | 23 + .../shared_ux/public/services/kibana/index.ts | 6 + .../public/services/kibana/permissions.ts | 23 + .../public/services/mocks/doc_links.mock.ts | 19 + .../public/services/mocks/editors.mock.ts | 19 + .../shared_ux/public/services/mocks/index.ts | 6 + .../public/services/mocks/permissions.mock.ts | 20 + .../shared_ux/public/services/permissions.ts | 11 + .../public/services/storybook/doc_links.ts | 19 + .../public/services/storybook/editors.ts | 22 + .../public/services/storybook/index.ts | 6 + .../public/services/storybook/permissions.ts | 20 + .../public/services/stub/doc_links.ts | 19 + .../shared_ux/public/services/stub/editors.ts | 22 + .../shared_ux/public/services/stub/index.ts | 6 + .../public/services/stub/permissions.ts | 22 + src/plugins/shared_ux/public/types/index.ts | 5 +- src/plugins/shared_ux/tsconfig.json | 6 + 39 files changed, 1392 insertions(+), 2 deletions(-) create mode 100644 src/plugins/shared_ux/public/components/empty_state/assets/data_view_illustration.tsx create mode 100644 src/plugins/shared_ux/public/components/empty_state/assets/index.tsx create mode 100644 src/plugins/shared_ux/public/components/empty_state/index.tsx create mode 100644 src/plugins/shared_ux/public/components/empty_state/no_data_views/__snapshots__/documentation_link.test.tsx.snap create mode 100644 src/plugins/shared_ux/public/components/empty_state/no_data_views/documentation_link.test.tsx create mode 100644 src/plugins/shared_ux/public/components/empty_state/no_data_views/documentation_link.tsx create mode 100644 src/plugins/shared_ux/public/components/empty_state/no_data_views/index.tsx create mode 100644 src/plugins/shared_ux/public/components/empty_state/no_data_views/no_data_views.component.test.tsx create mode 100644 src/plugins/shared_ux/public/components/empty_state/no_data_views/no_data_views.component.tsx create mode 100644 src/plugins/shared_ux/public/components/empty_state/no_data_views/no_data_views.mdx create mode 100644 src/plugins/shared_ux/public/components/empty_state/no_data_views/no_data_views.stories.tsx create mode 100644 src/plugins/shared_ux/public/components/empty_state/no_data_views/no_data_views.test.tsx create mode 100644 src/plugins/shared_ux/public/components/empty_state/no_data_views/no_data_views.tsx create mode 100644 src/plugins/shared_ux/public/services/doc_links.ts create mode 100644 src/plugins/shared_ux/public/services/editors.ts create mode 100644 src/plugins/shared_ux/public/services/kibana/doc_links.ts create mode 100644 src/plugins/shared_ux/public/services/kibana/editors.ts create mode 100644 src/plugins/shared_ux/public/services/kibana/permissions.ts create mode 100644 src/plugins/shared_ux/public/services/mocks/doc_links.mock.ts create mode 100644 src/plugins/shared_ux/public/services/mocks/editors.mock.ts create mode 100644 src/plugins/shared_ux/public/services/mocks/permissions.mock.ts create mode 100644 src/plugins/shared_ux/public/services/permissions.ts create mode 100644 src/plugins/shared_ux/public/services/storybook/doc_links.ts create mode 100644 src/plugins/shared_ux/public/services/storybook/editors.ts create mode 100644 src/plugins/shared_ux/public/services/storybook/permissions.ts create mode 100644 src/plugins/shared_ux/public/services/stub/doc_links.ts create mode 100644 src/plugins/shared_ux/public/services/stub/editors.ts create mode 100644 src/plugins/shared_ux/public/services/stub/permissions.ts diff --git a/src/plugins/shared_ux/kibana.json b/src/plugins/shared_ux/kibana.json index 44aeeb9cf80fc..308a252f70b54 100755 --- a/src/plugins/shared_ux/kibana.json +++ b/src/plugins/shared_ux/kibana.json @@ -9,6 +9,6 @@ "description": "A plugin providing components and services for shared user experiences in Kibana.", "server": true, "ui": true, - "requiredPlugins": [], + "requiredPlugins": ["dataViewEditor", "dataViews"], "optionalPlugins": [] } diff --git a/src/plugins/shared_ux/public/components/empty_state/assets/data_view_illustration.tsx b/src/plugins/shared_ux/public/components/empty_state/assets/data_view_illustration.tsx new file mode 100644 index 0000000000000..8a889a9267dee --- /dev/null +++ b/src/plugins/shared_ux/public/components/empty_state/assets/data_view_illustration.tsx @@ -0,0 +1,552 @@ +/* + * 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 React from 'react'; +import { useEuiTheme } from '@elastic/eui'; +import { css } from '@emotion/css'; + +export const DataViewIllustration = () => { + const { euiTheme } = useEuiTheme(); + const { colors } = euiTheme; + + const dataViewIllustrationVerticalStripes = css` + fill: ${colors.fullShade}; + `; + + const dataViewIllustrationDots = css` + fill: ${colors.lightShade}; + `; + + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +}; diff --git a/src/plugins/shared_ux/public/components/empty_state/assets/index.tsx b/src/plugins/shared_ux/public/components/empty_state/assets/index.tsx new file mode 100644 index 0000000000000..c234cdf40055b --- /dev/null +++ b/src/plugins/shared_ux/public/components/empty_state/assets/index.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 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 React from 'react'; + +import { EuiLoadingSpinner } from '@elastic/eui'; + +import { withSuspense } from '../../utility'; + +export const LazyDataViewIllustration = React.lazy(() => + import('../assets/data_view_illustration').then(({ DataViewIllustration }) => ({ + default: DataViewIllustration, + })) +); + +export const DataViewIllustration = withSuspense( + LazyDataViewIllustration, + +); diff --git a/src/plugins/shared_ux/public/components/empty_state/index.tsx b/src/plugins/shared_ux/public/components/empty_state/index.tsx new file mode 100644 index 0000000000000..fc05199aae207 --- /dev/null +++ b/src/plugins/shared_ux/public/components/empty_state/index.tsx @@ -0,0 +1,9 @@ +/* + * 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. + */ + +export { NoDataViews } from './no_data_views'; diff --git a/src/plugins/shared_ux/public/components/empty_state/no_data_views/__snapshots__/documentation_link.test.tsx.snap b/src/plugins/shared_ux/public/components/empty_state/no_data_views/__snapshots__/documentation_link.test.tsx.snap new file mode 100644 index 0000000000000..5526b78bceb73 --- /dev/null +++ b/src/plugins/shared_ux/public/components/empty_state/no_data_views/__snapshots__/documentation_link.test.tsx.snap @@ -0,0 +1,35 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[` is rendered correctly 1`] = ` +
+ +
+ +
+
+   +
+ + + +
+
+`; diff --git a/src/plugins/shared_ux/public/components/empty_state/no_data_views/documentation_link.test.tsx b/src/plugins/shared_ux/public/components/empty_state/no_data_views/documentation_link.test.tsx new file mode 100644 index 0000000000000..fd963dfaa8e1c --- /dev/null +++ b/src/plugins/shared_ux/public/components/empty_state/no_data_views/documentation_link.test.tsx @@ -0,0 +1,28 @@ +/* + * 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 React from 'react'; + +import { EuiLink, EuiTitle } from '@elastic/eui'; +import { shallowWithIntl } from '@kbn/test-jest-helpers'; + +import { DocumentationLink } from './documentation_link'; + +describe('', () => { + test('is rendered correctly', () => { + const component = shallowWithIntl(); + expect(component).toMatchSnapshot(); + + expect(component.find('dl').length).toBe(1); + expect(component.find(EuiTitle).length).toBe(1); + expect(component.find(EuiLink).length).toBe(1); + + const link = component.find(EuiLink).at(0); + expect(link.prop('href')).toBe('dummy'); + }); +}); diff --git a/src/plugins/shared_ux/public/components/empty_state/no_data_views/documentation_link.tsx b/src/plugins/shared_ux/public/components/empty_state/no_data_views/documentation_link.tsx new file mode 100644 index 0000000000000..4ac07899fef5f --- /dev/null +++ b/src/plugins/shared_ux/public/components/empty_state/no_data_views/documentation_link.tsx @@ -0,0 +1,39 @@ +/* + * 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 React from 'react'; +import { EuiLink, EuiTitle } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n-react'; + +interface Props { + href: string; +} + +export function DocumentationLink({ href }: Props) { + return ( +
+ +
+ +
+
+   +
+ + + +
+
+ ); +} diff --git a/src/plugins/shared_ux/public/components/empty_state/no_data_views/index.tsx b/src/plugins/shared_ux/public/components/empty_state/no_data_views/index.tsx new file mode 100644 index 0000000000000..fc05199aae207 --- /dev/null +++ b/src/plugins/shared_ux/public/components/empty_state/no_data_views/index.tsx @@ -0,0 +1,9 @@ +/* + * 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. + */ + +export { NoDataViews } from './no_data_views'; diff --git a/src/plugins/shared_ux/public/components/empty_state/no_data_views/no_data_views.component.test.tsx b/src/plugins/shared_ux/public/components/empty_state/no_data_views/no_data_views.component.test.tsx new file mode 100644 index 0000000000000..1d8028d4889a0 --- /dev/null +++ b/src/plugins/shared_ux/public/components/empty_state/no_data_views/no_data_views.component.test.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 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 React from 'react'; +import { mountWithIntl } from '@kbn/test-jest-helpers'; +import { EuiButton, EuiPanel } from '@elastic/eui'; +import { NoDataViews } from './no_data_views.component'; +import { DocumentationLink } from './documentation_link'; + +describe('', () => { + test('is rendered correctly', () => { + const component = mountWithIntl( + + ); + expect(component.find(EuiPanel).length).toBe(1); + expect(component.find(EuiButton).length).toBe(1); + expect(component.find(DocumentationLink).length).toBe(1); + }); + + test('does not render button if canCreateNewDataViews is false', () => { + const component = mountWithIntl(); + + expect(component.find(EuiButton).length).toBe(0); + }); + + test('does not documentation link if linkToDocumentation is not provided', () => { + const component = mountWithIntl( + + ); + + expect(component.find(DocumentationLink).length).toBe(0); + }); + + test('onClickCreate', () => { + const onClickCreate = jest.fn(); + const component = mountWithIntl( + + ); + + component.find('button').simulate('click'); + + expect(onClickCreate).toHaveBeenCalledTimes(1); + }); +}); diff --git a/src/plugins/shared_ux/public/components/empty_state/no_data_views/no_data_views.component.tsx b/src/plugins/shared_ux/public/components/empty_state/no_data_views/no_data_views.component.tsx new file mode 100644 index 0000000000000..bfab91ef03b26 --- /dev/null +++ b/src/plugins/shared_ux/public/components/empty_state/no_data_views/no_data_views.component.tsx @@ -0,0 +1,90 @@ +/* + * 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 React from 'react'; +import { css } from '@emotion/react'; + +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { EuiButton, EuiEmptyPrompt, EuiEmptyPromptProps } from '@elastic/eui'; + +import { DataViewIllustration } from '../assets'; +import { DocumentationLink } from './documentation_link'; + +export interface Props { + canCreateNewDataView: boolean; + onClickCreate?: () => void; + dataViewsDocLink?: string; + emptyPromptColor?: EuiEmptyPromptProps['color']; +} + +const createDataViewText = i18n.translate('sharedUX.noDataViewsPage.addDataViewText', { + defaultMessage: 'Create Data View', +}); + +// Using raw value because it is content dependent +const MAX_WIDTH = 830; + +/** + * A presentational component that is shown in cases when there are no data views created yet. + */ +export const NoDataViews = ({ + onClickCreate, + canCreateNewDataView, + dataViewsDocLink, + emptyPromptColor = 'plain', +}: Props) => { + const createNewButton = canCreateNewDataView && ( + + {createDataViewText} + + ); + + return ( + } + title={ +

+ +
+ +

+ } + body={ +

+ +

+ } + actions={createNewButton} + footer={dataViewsDocLink && } + /> + ); +}; diff --git a/src/plugins/shared_ux/public/components/empty_state/no_data_views/no_data_views.mdx b/src/plugins/shared_ux/public/components/empty_state/no_data_views/no_data_views.mdx new file mode 100644 index 0000000000000..ef8812c565a9f --- /dev/null +++ b/src/plugins/shared_ux/public/components/empty_state/no_data_views/no_data_views.mdx @@ -0,0 +1,14 @@ +**id:** sharedUX/Components/NoDataViewsPage +**slug:** /shared-ux/components/no-data-views-page +**title:** No Data Views Page +**summary:** A page to be displayed when there is data in Elasticsearch, but no data views +**tags:** ['shared-ux', 'component'] +**date:** 2022-02-09 + +--- + +When there is data in Elasticsearch, but there haven't been any data views created yet, we want to display an appropriate message to the user and facilitate creation of data views (if appropriate permissions are in place). + +The pure component, `no_data_views.component.tsx`, is a pre-configured **EuiEmptyPrompt**. + +The connected component, `no_data_views.tsx`, uses services from the `shared_ux` plugin to open Data View Editor. You must wrap your plugin app in the `ServicesContext` provided by the start contract of the `shared_ux` plugin to use it. diff --git a/src/plugins/shared_ux/public/components/empty_state/no_data_views/no_data_views.stories.tsx b/src/plugins/shared_ux/public/components/empty_state/no_data_views/no_data_views.stories.tsx new file mode 100644 index 0000000000000..3f9ae1958cad7 --- /dev/null +++ b/src/plugins/shared_ux/public/components/empty_state/no_data_views/no_data_views.stories.tsx @@ -0,0 +1,52 @@ +/* + * 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 React from 'react'; +import { action } from '@storybook/addon-actions'; + +import { docLinksServiceFactory } from '../../../services/storybook/doc_links'; + +import { NoDataViews as NoDataViewsComponent, Props } from './no_data_views.component'; +import { NoDataViews } from './no_data_views'; + +import mdx from './no_data_views.mdx'; + +export default { + title: 'No Data Views', + description: 'A component to display when there are no user-created data views available.', + parameters: { + docs: { + page: mdx, + }, + }, +}; + +export const ConnectedComponent = () => { + return ( + + ); +}; + +type Params = Pick; + +export const PureComponent = (params: Params) => { + return ; +}; + +PureComponent.argTypes = { + canCreateNewDataView: { + control: 'boolean', + defaultValue: true, + }, + dataViewsDocLink: { + options: [docLinksServiceFactory().dataViewsDocsLink, undefined], + control: { type: 'radio' }, + }, +}; diff --git a/src/plugins/shared_ux/public/components/empty_state/no_data_views/no_data_views.test.tsx b/src/plugins/shared_ux/public/components/empty_state/no_data_views/no_data_views.test.tsx new file mode 100644 index 0000000000000..650d78fa64a03 --- /dev/null +++ b/src/plugins/shared_ux/public/components/empty_state/no_data_views/no_data_views.test.tsx @@ -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 React from 'react'; +import { ReactWrapper } from 'enzyme'; + +import { mountWithIntl } from '@kbn/test-jest-helpers'; +import { EuiButton } from '@elastic/eui'; + +import { ServicesProvider, SharedUXServices } from '../../../services'; +import { servicesFactory } from '../../../services/mocks'; +import { NoDataViews } from './no_data_views'; + +describe('', () => { + let services: SharedUXServices; + let mount: (element: JSX.Element) => ReactWrapper; + + beforeEach(() => { + services = servicesFactory(); + mount = (element: JSX.Element) => + mountWithIntl({element}); + }); + + afterEach(() => { + jest.resetAllMocks(); + }); + + test('on dataView created', () => { + const component = mount( + + ); + + expect(services.editors.openDataViewEditor).not.toHaveBeenCalled(); + component.find(EuiButton).simulate('click'); + + component.unmount(); + + expect(services.editors.openDataViewEditor).toHaveBeenCalled(); + }); +}); diff --git a/src/plugins/shared_ux/public/components/empty_state/no_data_views/no_data_views.tsx b/src/plugins/shared_ux/public/components/empty_state/no_data_views/no_data_views.tsx new file mode 100644 index 0000000000000..01494d2c8a5b3 --- /dev/null +++ b/src/plugins/shared_ux/public/components/empty_state/no_data_views/no_data_views.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 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 React, { useCallback, useEffect, useRef } from 'react'; + +import { DataView } from '../../../../../data_views/public'; +import { useEditors, usePermissions } from '../../../services'; +import type { SharedUXEditorsService } from '../../../services/editors'; + +import { NoDataViews as NoDataViewsComponent } from './no_data_views.component'; + +export interface Props { + onDataViewCreated: (dataView: DataView) => void; + dataViewsDocLink: string; +} + +type CloseDataViewEditorFn = ReturnType; + +/** + * A service-enabled component that provides Kibana-specific functionality to the `NoDataViews` + * component. + * + * Use of this component requires both the `EuiTheme` context as well as either a configured Shared UX + * `ServicesProvider` or the `ServicesContext` provided by the Shared UX public plugin contract. + * + * See shared-ux/public/services for information. + */ +export const NoDataViews = ({ onDataViewCreated, dataViewsDocLink }: Props) => { + const { canCreateNewDataView } = usePermissions(); + const { openDataViewEditor } = useEditors(); + const closeDataViewEditor = useRef(); + + useEffect(() => { + const cleanup = () => { + if (closeDataViewEditor?.current) { + closeDataViewEditor?.current(); + } + }; + + return () => { + // Make sure to close the editor when unmounting + cleanup(); + }; + }, []); + + const setDataViewEditorRef = useCallback((ref: CloseDataViewEditorFn) => { + closeDataViewEditor.current = ref; + }, []); + + const onClickCreate = useCallback(() => { + if (!canCreateNewDataView) { + return; + } + + const ref = openDataViewEditor({ + onSave: (dataView) => { + onDataViewCreated(dataView); + }, + }); + + if (setDataViewEditorRef) { + setDataViewEditorRef(ref); + } + }, [canCreateNewDataView, openDataViewEditor, setDataViewEditorRef, onDataViewCreated]); + + return ; +}; diff --git a/src/plugins/shared_ux/public/components/exit_full_screen_button/__snapshots__/exit_full_screen_button.test.tsx.snap b/src/plugins/shared_ux/public/components/exit_full_screen_button/__snapshots__/exit_full_screen_button.test.tsx.snap index abf76f9da48ce..d2609e6b3c7a6 100644 --- a/src/plugins/shared_ux/public/components/exit_full_screen_button/__snapshots__/exit_full_screen_button.test.tsx.snap +++ b/src/plugins/shared_ux/public/components/exit_full_screen_button/__snapshots__/exit_full_screen_button.test.tsx.snap @@ -2,6 +2,21 @@ exports[` is rendered 1`] = ` * a predefined fallback and error boundary. */ export const ExitFullScreenButton = withSuspense(LazyExitFullScreenButton); + +/** + * The Lazily-loaded `NoDataViews` component. Consumers should use `React.Suspennse` or the + * `withSuspense` HOC to load this component. + */ +export const LazyNoDataViewsPage = React.lazy(() => + import('./empty_state/no_data_views').then(({ NoDataViews }) => ({ + default: NoDataViews, + })) +); + +/** + * A `NoDataViewsPage` component that is wrapped by the `withSuspense` HOC. This component can + * be used directly by consumers and will load the `LazyNoDataViewsPage` component lazily with + * a predefined fallback and error boundary. + */ +export const NoDataViewsPage = withSuspense(LazyNoDataViewsPage); diff --git a/src/plugins/shared_ux/public/index.ts b/src/plugins/shared_ux/public/index.ts index e6a2f925c5120..a196a60db847b 100755 --- a/src/plugins/shared_ux/public/index.ts +++ b/src/plugins/shared_ux/public/index.ts @@ -17,3 +17,4 @@ export function plugin() { export type { SharedUXPluginSetup, SharedUXPluginStart } from './types'; export { ExitFullScreenButton, LazyExitFullScreenButton } from './components'; +export { NoDataViewsPage, LazyNoDataViewsPage } from './components'; diff --git a/src/plugins/shared_ux/public/services/doc_links.ts b/src/plugins/shared_ux/public/services/doc_links.ts new file mode 100644 index 0000000000000..3c6d23bd33ae4 --- /dev/null +++ b/src/plugins/shared_ux/public/services/doc_links.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 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. + */ +export interface SharedUXDocLinksService { + dataViewsDocsLink: string; +} diff --git a/src/plugins/shared_ux/public/services/editors.ts b/src/plugins/shared_ux/public/services/editors.ts new file mode 100644 index 0000000000000..176b22a6006e1 --- /dev/null +++ b/src/plugins/shared_ux/public/services/editors.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 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 { DataView } from '../../../data_views/common'; + +export interface SharedUxDataViewEditorProps { + onSave: (dataView: DataView) => void; +} +export interface SharedUXEditorsService { + openDataViewEditor: (options: SharedUxDataViewEditorProps) => () => void; +} diff --git a/src/plugins/shared_ux/public/services/index.tsx b/src/plugins/shared_ux/public/services/index.tsx index 0677f3ef0ca84..bdca90c725858 100644 --- a/src/plugins/shared_ux/public/services/index.tsx +++ b/src/plugins/shared_ux/public/services/index.tsx @@ -9,6 +9,9 @@ import React, { FC, createContext, useContext } from 'react'; import { SharedUXPlatformService } from './platform'; import { servicesFactory } from './stub'; +import { SharedUXUserPermissionsService } from './permissions'; +import { SharedUXEditorsService } from './editors'; +import { SharedUXDocLinksService } from './doc_links'; /** * A collection of services utilized by SharedUX. This serves as a thin @@ -20,6 +23,9 @@ import { servicesFactory } from './stub'; */ export interface SharedUXServices { platform: SharedUXPlatformService; + permissions: SharedUXUserPermissionsService; + editors: SharedUXEditorsService; + docLinks: SharedUXDocLinksService; } // The React Context used to provide the services to the SharedUX components. @@ -48,3 +54,9 @@ export function useServices() { * React hook for accessing the pre-wired `SharedUXPlatformService`. */ export const usePlatformService = () => useServices().platform; + +export const usePermissions = () => useServices().permissions; + +export const useEditors = () => useServices().editors; + +export const useDocLinks = () => useServices().docLinks; diff --git a/src/plugins/shared_ux/public/services/kibana/doc_links.ts b/src/plugins/shared_ux/public/services/kibana/doc_links.ts new file mode 100644 index 0000000000000..eb25114a188a2 --- /dev/null +++ b/src/plugins/shared_ux/public/services/kibana/doc_links.ts @@ -0,0 +1,23 @@ +/* + * 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 { KibanaPluginServiceFactory } from '../types'; +import { SharedUXPluginStartDeps } from '../../types'; +import { SharedUXDocLinksService } from '../doc_links'; + +export type DocLinksServiceFactory = KibanaPluginServiceFactory< + SharedUXDocLinksService, + SharedUXPluginStartDeps +>; + +/** + * A factory function for creating a Kibana-based implementation of `SharedUXEditorsService`. + */ +export const docLinksServiceFactory: DocLinksServiceFactory = ({ coreStart }) => ({ + dataViewsDocsLink: coreStart.docLinks.links.indexPatterns?.introduction, +}); diff --git a/src/plugins/shared_ux/public/services/kibana/editors.ts b/src/plugins/shared_ux/public/services/kibana/editors.ts new file mode 100644 index 0000000000000..0f8082d7d00e2 --- /dev/null +++ b/src/plugins/shared_ux/public/services/kibana/editors.ts @@ -0,0 +1,23 @@ +/* + * 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 { KibanaPluginServiceFactory } from '../types'; +import { SharedUXEditorsService } from '../editors'; +import { SharedUXPluginStartDeps } from '../../types'; + +export type EditorsServiceFactory = KibanaPluginServiceFactory< + SharedUXEditorsService, + SharedUXPluginStartDeps +>; + +/** + * A factory function for creating a Kibana-based implementation of `SharedUXEditorsService`. + */ +export const editorsServiceFactory: EditorsServiceFactory = ({ startPlugins }) => ({ + openDataViewEditor: startPlugins.dataViewEditor.openEditor, +}); diff --git a/src/plugins/shared_ux/public/services/kibana/index.ts b/src/plugins/shared_ux/public/services/kibana/index.ts index f7c4cd7b2c56d..506176cffbc45 100644 --- a/src/plugins/shared_ux/public/services/kibana/index.ts +++ b/src/plugins/shared_ux/public/services/kibana/index.ts @@ -10,6 +10,9 @@ import type { SharedUXServices } from '..'; import type { SharedUXPluginStartDeps } from '../../types'; import type { KibanaPluginServiceFactory } from '../types'; import { platformServiceFactory } from './platform'; +import { userPermissionsServiceFactory } from './permissions'; +import { editorsServiceFactory } from './editors'; +import { docLinksServiceFactory } from './doc_links'; /** * A factory function for creating a Kibana-based implementation of `SharedUXServices`. @@ -19,4 +22,7 @@ export const servicesFactory: KibanaPluginServiceFactory< SharedUXPluginStartDeps > = (params) => ({ platform: platformServiceFactory(params), + permissions: userPermissionsServiceFactory(params), + editors: editorsServiceFactory(params), + docLinks: docLinksServiceFactory(params), }); diff --git a/src/plugins/shared_ux/public/services/kibana/permissions.ts b/src/plugins/shared_ux/public/services/kibana/permissions.ts new file mode 100644 index 0000000000000..caaeccdccbccd --- /dev/null +++ b/src/plugins/shared_ux/public/services/kibana/permissions.ts @@ -0,0 +1,23 @@ +/* + * 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 { KibanaPluginServiceFactory } from '../types'; +import { SharedUXPluginStartDeps } from '../../types'; +import { SharedUXUserPermissionsService } from '../permissions'; + +export type UserPermissionsServiceFactory = KibanaPluginServiceFactory< + SharedUXUserPermissionsService, + SharedUXPluginStartDeps +>; + +/** + * A factory function for creating a Kibana-based implementation of `SharedUXPermissionsService`. + */ +export const userPermissionsServiceFactory: UserPermissionsServiceFactory = ({ startPlugins }) => ({ + canCreateNewDataView: startPlugins.dataViewEditor.userPermissions.editDataView(), +}); diff --git a/src/plugins/shared_ux/public/services/mocks/doc_links.mock.ts b/src/plugins/shared_ux/public/services/mocks/doc_links.mock.ts new file mode 100644 index 0000000000000..28cfa14c50d28 --- /dev/null +++ b/src/plugins/shared_ux/public/services/mocks/doc_links.mock.ts @@ -0,0 +1,19 @@ +/* + * 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 { PluginServiceFactory } from '../types'; +import { SharedUXDocLinksService } from '../doc_links'; + +export type MockDockLinksServiceFactory = PluginServiceFactory; + +/** + * A factory function for creating a Jest-based implementation of `SharedUXDocLinksService`. + */ +export const docLinksServiceFactory: MockDockLinksServiceFactory = () => ({ + dataViewsDocsLink: 'dummy link', +}); diff --git a/src/plugins/shared_ux/public/services/mocks/editors.mock.ts b/src/plugins/shared_ux/public/services/mocks/editors.mock.ts new file mode 100644 index 0000000000000..28a89d5326d62 --- /dev/null +++ b/src/plugins/shared_ux/public/services/mocks/editors.mock.ts @@ -0,0 +1,19 @@ +/* + * 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 { PluginServiceFactory } from '../types'; +import { SharedUXEditorsService } from '../editors'; + +export type MockEditorsServiceFactory = PluginServiceFactory; + +/** + * A factory function for creating a Jest-based implementation of `SharedUXEditorsService`. + */ +export const editorsServiceFactory: MockEditorsServiceFactory = () => ({ + openDataViewEditor: jest.fn(), +}); diff --git a/src/plugins/shared_ux/public/services/mocks/index.ts b/src/plugins/shared_ux/public/services/mocks/index.ts index 14d38a484e53b..9fce633c52539 100644 --- a/src/plugins/shared_ux/public/services/mocks/index.ts +++ b/src/plugins/shared_ux/public/services/mocks/index.ts @@ -5,6 +5,7 @@ * in compliance with, at your election, the Elastic License 2.0 or the Server * Side Public License, v 1. */ +import { docLinksServiceFactory } from './doc_links.mock'; export type { MockPlatformServiceFactory } from './platform.mock'; export { platformServiceFactory } from './platform.mock'; @@ -12,10 +13,15 @@ export { platformServiceFactory } from './platform.mock'; import type { SharedUXServices } from '../.'; import { PluginServiceFactory } from '../types'; import { platformServiceFactory } from './platform.mock'; +import { userPermissionsServiceFactory } from './permissions.mock'; +import { editorsServiceFactory } from './editors.mock'; /** * A factory function for creating a Jest-based implementation of `SharedUXServices`. */ export const servicesFactory: PluginServiceFactory = () => ({ platform: platformServiceFactory(), + permissions: userPermissionsServiceFactory(), + editors: editorsServiceFactory(), + docLinks: docLinksServiceFactory(), }); diff --git a/src/plugins/shared_ux/public/services/mocks/permissions.mock.ts b/src/plugins/shared_ux/public/services/mocks/permissions.mock.ts new file mode 100644 index 0000000000000..ff65d2393248a --- /dev/null +++ b/src/plugins/shared_ux/public/services/mocks/permissions.mock.ts @@ -0,0 +1,20 @@ +/* + * 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 { PluginServiceFactory } from '../types'; +import { SharedUXUserPermissionsService } from '../permissions'; + +export type MockUserPermissionsServiceFactory = + PluginServiceFactory; + +/** + * A factory function for creating a Jest-based implementation of `SharedUXUserPermissionsService`. + */ +export const userPermissionsServiceFactory: MockUserPermissionsServiceFactory = () => ({ + canCreateNewDataView: true, +}); diff --git a/src/plugins/shared_ux/public/services/permissions.ts b/src/plugins/shared_ux/public/services/permissions.ts new file mode 100644 index 0000000000000..009f497e35706 --- /dev/null +++ b/src/plugins/shared_ux/public/services/permissions.ts @@ -0,0 +1,11 @@ +/* + * 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. + */ + +export interface SharedUXUserPermissionsService { + canCreateNewDataView: boolean; +} diff --git a/src/plugins/shared_ux/public/services/storybook/doc_links.ts b/src/plugins/shared_ux/public/services/storybook/doc_links.ts new file mode 100644 index 0000000000000..548d504336108 --- /dev/null +++ b/src/plugins/shared_ux/public/services/storybook/doc_links.ts @@ -0,0 +1,19 @@ +/* + * 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 { PluginServiceFactory } from '../types'; +import { SharedUXDocLinksService } from '../doc_links'; + +export type SharedUXDockLinksServiceFactory = PluginServiceFactory; + +/** + * A factory function for creating a Jest-based implementation of `SharedUXDocLinksService`. + */ +export const docLinksServiceFactory: SharedUXDockLinksServiceFactory = () => ({ + dataViewsDocsLink: 'https://www.elastic.co/guide/en/kibana/master/data-views.html', +}); diff --git a/src/plugins/shared_ux/public/services/storybook/editors.ts b/src/plugins/shared_ux/public/services/storybook/editors.ts new file mode 100644 index 0000000000000..248699d5beb95 --- /dev/null +++ b/src/plugins/shared_ux/public/services/storybook/editors.ts @@ -0,0 +1,22 @@ +/* + * 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 { action } from '@storybook/addon-actions'; +import { PluginServiceFactory } from '../types'; +import { SharedUxDataViewEditorProps, SharedUXEditorsService } from '../editors'; + +export type SharedUXEditorsServiceFactory = PluginServiceFactory; + +/** + * A factory function for creating a storybook implementation of `SharedUXEditorsService`. + */ +export const editorsServiceFactory: SharedUXEditorsServiceFactory = () => ({ + openDataViewEditor: action('openEditor') as SharedUXEditorsService['openDataViewEditor'] as ( + options: SharedUxDataViewEditorProps + ) => () => void, +}); diff --git a/src/plugins/shared_ux/public/services/storybook/index.ts b/src/plugins/shared_ux/public/services/storybook/index.ts index 8ea03317e53a2..c915b1a463365 100644 --- a/src/plugins/shared_ux/public/services/storybook/index.ts +++ b/src/plugins/shared_ux/public/services/storybook/index.ts @@ -9,10 +9,16 @@ import type { SharedUXServices } from '../.'; import { PluginServiceFactory } from '../types'; import { platformServiceFactory } from './platform'; +import { editorsServiceFactory } from './editors'; +import { userPermissionsServiceFactory } from './permissions'; +import { docLinksServiceFactory } from './doc_links'; /** * A factory function for creating a Storybook-based implementation of `SharedUXServices`. */ export const servicesFactory: PluginServiceFactory = (params) => ({ platform: platformServiceFactory(params), + permissions: userPermissionsServiceFactory(), + editors: editorsServiceFactory(), + docLinks: docLinksServiceFactory(), }); diff --git a/src/plugins/shared_ux/public/services/storybook/permissions.ts b/src/plugins/shared_ux/public/services/storybook/permissions.ts new file mode 100644 index 0000000000000..c7110fccf7eea --- /dev/null +++ b/src/plugins/shared_ux/public/services/storybook/permissions.ts @@ -0,0 +1,20 @@ +/* + * 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 { PluginServiceFactory } from '../types'; +import { SharedUXUserPermissionsService } from '../permissions'; + +export type SharedUXUserPermissionsServiceFactory = + PluginServiceFactory; + +/** + * A factory function for creating a storybook implementation of `SharedUXUserPermissionsService`. + */ +export const userPermissionsServiceFactory: SharedUXUserPermissionsServiceFactory = () => ({ + canCreateNewDataView: true, +}); diff --git a/src/plugins/shared_ux/public/services/stub/doc_links.ts b/src/plugins/shared_ux/public/services/stub/doc_links.ts new file mode 100644 index 0000000000000..424a24c578539 --- /dev/null +++ b/src/plugins/shared_ux/public/services/stub/doc_links.ts @@ -0,0 +1,19 @@ +/* + * 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 { PluginServiceFactory } from '../types'; +import { SharedUXDocLinksService } from '../doc_links'; + +export type DockLinksServiceFactory = PluginServiceFactory; + +/** + * A factory function for creating a Jest-based implementation of `SharedUXDocLinksService`. + */ +export const docLinksServiceFactory: DockLinksServiceFactory = () => ({ + dataViewsDocsLink: 'docs', +}); diff --git a/src/plugins/shared_ux/public/services/stub/editors.ts b/src/plugins/shared_ux/public/services/stub/editors.ts new file mode 100644 index 0000000000000..03fea5e6c98b5 --- /dev/null +++ b/src/plugins/shared_ux/public/services/stub/editors.ts @@ -0,0 +1,22 @@ +/* + * 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 { PluginServiceFactory } from '../types'; +import { SharedUXEditorsService } from '../editors'; + +/** + * A factory function for creating a simple stubbed implementation of `SharedUXEditorsService`. + */ +export type EditorsServiceFactory = PluginServiceFactory; + +/** + * A factory function for creating a simple stubbed implementation of `SharedUXEditorsService`. + */ +export const editorsServiceFactory: EditorsServiceFactory = () => ({ + openDataViewEditor: () => () => {}, +}); diff --git a/src/plugins/shared_ux/public/services/stub/index.ts b/src/plugins/shared_ux/public/services/stub/index.ts index 8a5afe8cdcafb..9e4fa8f03133a 100644 --- a/src/plugins/shared_ux/public/services/stub/index.ts +++ b/src/plugins/shared_ux/public/services/stub/index.ts @@ -9,10 +9,16 @@ import type { SharedUXServices } from '../.'; import { PluginServiceFactory } from '../types'; import { platformServiceFactory } from './platform'; +import { userPermissionsServiceFactory } from './permissions'; +import { editorsServiceFactory } from './editors'; +import { docLinksServiceFactory } from './doc_links'; /** * A factory function for creating a simple stubbed implemetation of `SharedUXServices`. */ export const servicesFactory: PluginServiceFactory = () => ({ platform: platformServiceFactory(), + permissions: userPermissionsServiceFactory(), + editors: editorsServiceFactory(), + docLinks: docLinksServiceFactory(), }); diff --git a/src/plugins/shared_ux/public/services/stub/permissions.ts b/src/plugins/shared_ux/public/services/stub/permissions.ts new file mode 100644 index 0000000000000..c51abf41e2842 --- /dev/null +++ b/src/plugins/shared_ux/public/services/stub/permissions.ts @@ -0,0 +1,22 @@ +/* + * 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 { PluginServiceFactory } from '../types'; +import { SharedUXUserPermissionsService } from '../permissions'; + +/** + * A factory function for creating a simple stubbed implementation of `SharedUXUserPermissionsService`. + */ +export type UserPermissionsServiceFactory = PluginServiceFactory; + +/** + * A factory function for creating a simple stubbed implementation of `SharedUXUserPermissionsService`. + */ +export const userPermissionsServiceFactory: UserPermissionsServiceFactory = () => ({ + canCreateNewDataView: true, +}); diff --git a/src/plugins/shared_ux/public/types/index.ts b/src/plugins/shared_ux/public/types/index.ts index 767dbf1aa10a4..38f91815f2e7b 100644 --- a/src/plugins/shared_ux/public/types/index.ts +++ b/src/plugins/shared_ux/public/types/index.ts @@ -9,6 +9,7 @@ /* eslint-disable @typescript-eslint/no-empty-interface */ import { FC } from 'react'; +import { DataViewEditorStart } from 'src/plugins/data_view_editor/public'; /** @internal */ export interface SharedUXPluginSetup {} @@ -28,4 +29,6 @@ export interface SharedUXPluginStart { export interface SharedUXPluginSetupDeps {} /** @internal */ -export interface SharedUXPluginStartDeps {} +export interface SharedUXPluginStartDeps { + dataViewEditor: DataViewEditorStart; +} diff --git a/src/plugins/shared_ux/tsconfig.json b/src/plugins/shared_ux/tsconfig.json index 6717616c8f2f3..069fe1d069b4a 100644 --- a/src/plugins/shared_ux/tsconfig.json +++ b/src/plugins/shared_ux/tsconfig.json @@ -17,5 +17,11 @@ { "path": "../../core/tsconfig.json" }, + { + "path": "../data_view_editor/tsconfig.json" + }, + { + "path": "../data_views/tsconfig.json" + } ] } From c914e9484127193536078cebfe6d668d5e0b2c37 Mon Sep 17 00:00:00 2001 From: Pierre Gayvallet Date: Thu, 24 Feb 2022 21:41:58 +0100 Subject: [PATCH 023/102] [Status service] reuse plugin status observables (#126334) --- src/core/server/status/plugins_status.ts | 73 +++++++++++++++--------- 1 file changed, 47 insertions(+), 26 deletions(-) diff --git a/src/core/server/status/plugins_status.ts b/src/core/server/status/plugins_status.ts index 719535133e7ab..c4e8e7e364248 100644 --- a/src/core/server/status/plugins_status.ts +++ b/src/core/server/status/plugins_status.ts @@ -30,6 +30,13 @@ interface Deps { export class PluginsStatusService { private readonly pluginStatuses = new Map>(); + private readonly derivedStatuses = new Map>(); + private readonly dependenciesStatuses = new Map< + PluginName, + Observable> + >(); + private allPluginsStatuses?: Observable>; + private readonly update$ = new BehaviorSubject(true); private readonly defaultInheritedStatus$: Observable; private newRegistrationsAllowed = true; @@ -59,7 +66,10 @@ export class PluginsStatusService { } public getAll$(): Observable> { - return this.getPluginStatuses$([...this.deps.pluginDependencies.keys()]); + if (!this.allPluginsStatuses) { + this.allPluginsStatuses = this.getPluginStatuses$([...this.deps.pluginDependencies.keys()]); + } + return this.allPluginsStatuses; } public getDependenciesStatus$(plugin: PluginName): Observable> { @@ -67,35 +77,46 @@ export class PluginsStatusService { if (!dependencies) { throw new Error(`Unknown plugin: ${plugin}`); } - - return this.getPluginStatuses$(dependencies).pipe( - // Prevent many emissions at once from dependency status resolution from making this too noisy - debounceTime(25) - ); + if (!this.dependenciesStatuses.has(plugin)) { + this.dependenciesStatuses.set( + plugin, + this.getPluginStatuses$(dependencies).pipe( + // Prevent many emissions at once from dependency status resolution from making this too noisy + debounceTime(25) + ) + ); + } + return this.dependenciesStatuses.get(plugin)!; } public getDerivedStatus$(plugin: PluginName): Observable { - return this.update$.pipe( - debounceTime(25), // Avoid calling the plugin's custom status logic for every plugin that depends on it. - switchMap(() => { - // Only go up the dependency tree if any of this plugin's dependencies have a custom status - // Helps eliminate memory overhead of creating thousands of Observables unnecessarily. - if (this.anyCustomStatuses(plugin)) { - return combineLatest([this.deps.core$, this.getDependenciesStatus$(plugin)]).pipe( - map(([coreStatus, pluginStatuses]) => { - return getSummaryStatus( - [...Object.entries(coreStatus), ...Object.entries(pluginStatuses)], - { - allAvailableSummary: `All dependencies are available`, - } + if (!this.derivedStatuses.has(plugin)) { + this.derivedStatuses.set( + plugin, + this.update$.pipe( + debounceTime(25), // Avoid calling the plugin's custom status logic for every plugin that depends on it. + switchMap(() => { + // Only go up the dependency tree if any of this plugin's dependencies have a custom status + // Helps eliminate memory overhead of creating thousands of Observables unnecessarily. + if (this.anyCustomStatuses(plugin)) { + return combineLatest([this.deps.core$, this.getDependenciesStatus$(plugin)]).pipe( + map(([coreStatus, pluginStatuses]) => { + return getSummaryStatus( + [...Object.entries(coreStatus), ...Object.entries(pluginStatuses)], + { + allAvailableSummary: `All dependencies are available`, + } + ); + }) ); - }) - ); - } else { - return this.defaultInheritedStatus$; - } - }) - ); + } else { + return this.defaultInheritedStatus$; + } + }) + ) + ); + } + return this.derivedStatuses.get(plugin)!; } private getPluginStatuses$(plugins: PluginName[]): Observable> { From 1e16db4d18302c4434acfb8ce2e7fb6a414c5f2f Mon Sep 17 00:00:00 2001 From: John Dorlus Date: Thu, 24 Feb 2022 16:33:11 -0500 Subject: [PATCH 024/102] Added CCS test for data view functionality. (#124586) * Added CCS test for data view functionality. * Changed how we are approaching the test. Just adding a remote to exercise the CCS functionality. * Adjusted test to use correct port for remote cluster. * Added and corrected config for the tests to be able to run. * Changed test title. * Added functional ccs suite to functional test runner script. * Changed config.ts to config.js * Moved es to before clause. * Added await for an async call. * Added await for an async call. * Updated saved queries test to use CCS. One test is failing, all others are passing. * Merge branch 'main' of github.com:elastic/kibana into CCS_Functional_Test_POC * Fixed a reference. * Removed the OSS tests since we created CCS versions of them. * Removed tests from index file. * Restored test files per comment with matthias. * Did some cleanup of comments. Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- scripts/functional_tests.js | 1 + .../kbn_archiver/date_nested_ccs.json | 15 ++ .../fixtures/kbn_archiver/discover_ccs.json | 51 ++++ .../apps/discover/_data_view_ccs.ts | 62 +++++ .../apps/discover/_saved_queries_ccs.ts | 221 ++++++++++++++++++ .../apps/discover/ftr_provider_context.d.ts | 13 ++ test/functional_ccs/apps/discover/index.ts | 43 ++++ test/functional_ccs/config.js | 25 ++ 8 files changed, 431 insertions(+) create mode 100644 test/functional/fixtures/kbn_archiver/date_nested_ccs.json create mode 100644 test/functional/fixtures/kbn_archiver/discover_ccs.json create mode 100644 test/functional_ccs/apps/discover/_data_view_ccs.ts create mode 100644 test/functional_ccs/apps/discover/_saved_queries_ccs.ts create mode 100644 test/functional_ccs/apps/discover/ftr_provider_context.d.ts create mode 100644 test/functional_ccs/apps/discover/index.ts create mode 100644 test/functional_ccs/config.js diff --git a/scripts/functional_tests.js b/scripts/functional_tests.js index 6cfd1d57e9c96..972c682ab0d9f 100644 --- a/scripts/functional_tests.js +++ b/scripts/functional_tests.js @@ -9,6 +9,7 @@ require('../src/setup_node_env'); require('@kbn/test').runTestsCli([ require.resolve('../test/functional/config.js'), + require.resolve('../test/functional_ccs/config.js'), require.resolve('../test/plugin_functional/config.ts'), require.resolve('../test/ui_capabilities/newsfeed_err/config.ts'), require.resolve('../test/new_visualize_flow/config.ts'), diff --git a/test/functional/fixtures/kbn_archiver/date_nested_ccs.json b/test/functional/fixtures/kbn_archiver/date_nested_ccs.json new file mode 100644 index 0000000000000..933b21d920c00 --- /dev/null +++ b/test/functional/fixtures/kbn_archiver/date_nested_ccs.json @@ -0,0 +1,15 @@ +{ + "attributes": { + "fields": "[]", + "timeFieldName": "nested.timestamp", + "title": "remote:date-nested" + }, + "coreMigrationVersion": "8.2.0", + "id": "remote:date-nested", + "migrationVersion": { + "index-pattern": "8.0.0" + }, + "references": [], + "type": "index-pattern", + "version": "WzIyLDFd" +} diff --git a/test/functional/fixtures/kbn_archiver/discover_ccs.json b/test/functional/fixtures/kbn_archiver/discover_ccs.json new file mode 100644 index 0000000000000..d53aa1bc759af --- /dev/null +++ b/test/functional/fixtures/kbn_archiver/discover_ccs.json @@ -0,0 +1,51 @@ +{ + "attributes": { + "fieldAttrs": "{\"referer\":{\"customLabel\":\"Referer custom\"}}", + "fields": "[{\"name\":\"@message\",\"type\":\"string\",\"esTypes\":[\"text\"],\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"@message.raw\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"@message\"}}},{\"name\":\"@tags\",\"type\":\"string\",\"esTypes\":[\"text\"],\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"@tags.raw\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"@tags\"}}},{\"name\":\"@timestamp\",\"type\":\"date\",\"esTypes\":[\"date\"],\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"_id\",\"type\":\"string\",\"esTypes\":[\"_id\"],\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"_index\",\"type\":\"string\",\"esTypes\":[\"_index\"],\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"_score\",\"type\":\"number\",\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"_source\",\"type\":\"_source\",\"esTypes\":[\"_source\"],\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"_type\",\"type\":\"string\",\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"agent\",\"type\":\"string\",\"esTypes\":[\"text\"],\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"agent.raw\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"agent\"}}},{\"name\":\"bytes\",\"type\":\"number\",\"esTypes\":[\"long\"],\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"clientip\",\"type\":\"ip\",\"esTypes\":[\"ip\"],\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"extension\",\"type\":\"string\",\"esTypes\":[\"text\"],\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"extension.raw\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"extension\"}}},{\"name\":\"geo.coordinates\",\"type\":\"geo_point\",\"esTypes\":[\"geo_point\"],\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"geo.dest\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"geo.src\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"geo.srcdest\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"headings\",\"type\":\"string\",\"esTypes\":[\"text\"],\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"headings.raw\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"headings\"}}},{\"name\":\"host\",\"type\":\"string\",\"esTypes\":[\"text\"],\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"host.raw\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"host\"}}},{\"name\":\"id\",\"type\":\"number\",\"esTypes\":[\"integer\"],\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"index\",\"type\":\"string\",\"esTypes\":[\"text\"],\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"index.raw\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"index\"}}},{\"name\":\"ip\",\"type\":\"ip\",\"esTypes\":[\"ip\"],\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"links\",\"type\":\"string\",\"esTypes\":[\"text\"],\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"links.raw\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"links\"}}},{\"name\":\"machine.os\",\"type\":\"string\",\"esTypes\":[\"text\"],\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"machine.os.raw\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"machine.os\"}}},{\"name\":\"machine.ram\",\"type\":\"number\",\"esTypes\":[\"long\"],\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"memory\",\"type\":\"number\",\"esTypes\":[\"double\"],\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"meta.char\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"meta.related\",\"type\":\"string\",\"esTypes\":[\"text\"],\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"meta.user.firstname\",\"type\":\"string\",\"esTypes\":[\"text\"],\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"meta.user.lastname\",\"type\":\"number\",\"esTypes\":[\"integer\"],\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"nestedField.child\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"nested\":{\"path\":\"nestedField\"}}},{\"name\":\"phpmemory\",\"type\":\"number\",\"esTypes\":[\"long\"],\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"referer\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"relatedContent.article:modified_time\",\"type\":\"date\",\"esTypes\":[\"date\"],\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"relatedContent.article:published_time\",\"type\":\"date\",\"esTypes\":[\"date\"],\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"relatedContent.article:section\",\"type\":\"string\",\"esTypes\":[\"text\"],\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"relatedContent.article:section.raw\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"relatedContent.article:section\"}}},{\"name\":\"relatedContent.article:tag\",\"type\":\"string\",\"esTypes\":[\"text\"],\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"relatedContent.article:tag.raw\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"relatedContent.article:tag\"}}},{\"name\":\"relatedContent.og:description\",\"type\":\"string\",\"esTypes\":[\"text\"],\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"relatedContent.og:description.raw\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"relatedContent.og:description\"}}},{\"name\":\"relatedContent.og:image\",\"type\":\"string\",\"esTypes\":[\"text\"],\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"relatedContent.og:image.raw\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"relatedContent.og:image\"}}},{\"name\":\"relatedContent.og:image:height\",\"type\":\"string\",\"esTypes\":[\"text\"],\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"relatedContent.og:image:height.raw\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"relatedContent.og:image:height\"}}},{\"name\":\"relatedContent.og:image:width\",\"type\":\"string\",\"esTypes\":[\"text\"],\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"relatedContent.og:image:width.raw\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"relatedContent.og:image:width\"}}},{\"name\":\"relatedContent.og:site_name\",\"type\":\"string\",\"esTypes\":[\"text\"],\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"relatedContent.og:site_name.raw\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"relatedContent.og:site_name\"}}},{\"name\":\"relatedContent.og:title\",\"type\":\"string\",\"esTypes\":[\"text\"],\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"relatedContent.og:title.raw\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"relatedContent.og:title\"}}},{\"name\":\"relatedContent.og:type\",\"type\":\"string\",\"esTypes\":[\"text\"],\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"relatedContent.og:type.raw\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"relatedContent.og:type\"}}},{\"name\":\"relatedContent.og:url\",\"type\":\"string\",\"esTypes\":[\"text\"],\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"relatedContent.og:url.raw\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"relatedContent.og:url\"}}},{\"name\":\"relatedContent.twitter:card\",\"type\":\"string\",\"esTypes\":[\"text\"],\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"relatedContent.twitter:card.raw\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"relatedContent.twitter:card\"}}},{\"name\":\"relatedContent.twitter:description\",\"type\":\"string\",\"esTypes\":[\"text\"],\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"relatedContent.twitter:description.raw\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"relatedContent.twitter:description\"}}},{\"name\":\"relatedContent.twitter:image\",\"type\":\"string\",\"esTypes\":[\"text\"],\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"relatedContent.twitter:image.raw\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"relatedContent.twitter:image\"}}},{\"name\":\"relatedContent.twitter:site\",\"type\":\"string\",\"esTypes\":[\"text\"],\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"relatedContent.twitter:site.raw\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"relatedContent.twitter:site\"}}},{\"name\":\"relatedContent.twitter:title\",\"type\":\"string\",\"esTypes\":[\"text\"],\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"relatedContent.twitter:title.raw\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"relatedContent.twitter:title\"}}},{\"name\":\"relatedContent.url\",\"type\":\"string\",\"esTypes\":[\"text\"],\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"relatedContent.url.raw\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"relatedContent.url\"}}},{\"name\":\"request\",\"type\":\"string\",\"esTypes\":[\"text\"],\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"request.raw\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"request\"}}},{\"name\":\"response\",\"type\":\"string\",\"esTypes\":[\"text\"],\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"response.raw\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"response\"}}},{\"name\":\"spaces\",\"type\":\"string\",\"esTypes\":[\"text\"],\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"spaces.raw\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"spaces\"}}},{\"name\":\"type\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"url\",\"type\":\"string\",\"esTypes\":[\"text\"],\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"url.raw\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"url\"}}},{\"name\":\"utc_time\",\"type\":\"date\",\"esTypes\":[\"date\"],\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"xss\",\"type\":\"string\",\"esTypes\":[\"text\"],\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"xss.raw\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"xss\"}}}]", + "timeFieldName": "@timestamp", + "title": "remote:logstash-*" + }, + "coreMigrationVersion": "8.0.0", + "id": "remote:logstash-*", + "migrationVersion": { + "index-pattern": "7.11.0" + }, + "references": [], + "type": "index-pattern", + "version": "WzQsMl0=" +} + +{ + "attributes": { + "columns": [ + "_source" + ], + "description": "A Saved Search Description", + "hits": 0, + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"highlightAll\":true,\"filter\":[],\"query\":{\"query_string\":{\"query\":\"*\",\"analyze_wildcard\":true}},\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + }, + "sort": [ + [ + "@timestamp", + "desc" + ] + ], + "title": "A Saved Search", + "version": 1 + }, + "coreMigrationVersion": "8.0.0", + "id": "ab12e3c0-f231-11e6-9486-733b1ac9221a", + "migrationVersion": { + "search": "7.9.3" + }, + "references": [ + { + "id": "remote:logstash-*", + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "type": "index-pattern" + } + ], + "type": "search", + "version": "WzUsMl0=" +} diff --git a/test/functional_ccs/apps/discover/_data_view_ccs.ts b/test/functional_ccs/apps/discover/_data_view_ccs.ts new file mode 100644 index 0000000000000..91d9cb2faf681 --- /dev/null +++ b/test/functional_ccs/apps/discover/_data_view_ccs.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 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 retry = getService('retry'); + const testSubjects = getService('testSubjects'); + const kibanaServer = getService('kibanaServer'); + const esArchiver = getService('esArchiver'); + + const security = getService('security'); + const PageObjects = getPageObjects(['common', 'discover', 'header', 'timePicker']); + + const createDataView = async (dataViewName: string) => { + await PageObjects.discover.clickIndexPatternActions(); + await PageObjects.discover.clickCreateNewDataView(); + await testSubjects.setValue('createIndexPatternNameInput', dataViewName, { + clearWithKeyboard: true, + typeCharByChar: true, + }); + await testSubjects.click('saveIndexPatternButton'); + }; + + describe('discover integration with data view editor', function describeIndexTests() { + before(async function () { + await security.testUser.setRoles(['kibana_admin', 'test_logstash_reader']); + await esArchiver.loadIfNeeded('test/functional/fixtures/es_archiver/logstash_functional'); + await kibanaServer.savedObjects.clean({ types: ['saved-search', 'index-pattern'] }); + await kibanaServer.importExport.load('test/functional/fixtures/kbn_archiver/discover'); + await PageObjects.timePicker.setDefaultAbsoluteRangeViaUiSettings(); + await PageObjects.common.navigateToApp('discover'); + }); + + after(async () => { + await security.testUser.restoreDefaults(); + await kibanaServer.importExport.unload('test/functional/fixtures/kbn_archiver/discover'); + await kibanaServer.savedObjects.clean({ types: ['saved-search', 'index-pattern'] }); + }); + + it('use ccs to create a new data view', async function () { + const dataViewToCreate = 'remote:logstash'; + await createDataView(dataViewToCreate); + await PageObjects.header.waitUntilLoadingHasFinished(); + await retry.waitForWithTimeout( + 'data view selector to include a newly created dataview', + 5000, + async () => { + const dataViewTitle = await PageObjects.discover.getCurrentlySelectedDataView(); + // data view editor will add wildcard symbol by default + // so we need to include it in our original title when comparing + return dataViewTitle === `${dataViewToCreate}*`; + } + ); + }); + }); +} diff --git a/test/functional_ccs/apps/discover/_saved_queries_ccs.ts b/test/functional_ccs/apps/discover/_saved_queries_ccs.ts new file mode 100644 index 0000000000000..325f279ff28ab --- /dev/null +++ b/test/functional_ccs/apps/discover/_saved_queries_ccs.ts @@ -0,0 +1,221 @@ +/* + * 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 expect from '@kbn/expect'; + +import { FtrProviderContext } from './ftr_provider_context'; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const retry = getService('retry'); + const log = getService('log'); + const esArchiver = getService('esArchiver'); + const kibanaServer = getService('kibanaServer'); + const PageObjects = getPageObjects(['common', 'discover', 'timePicker']); + const browser = getService('browser'); + const filterBar = getService('filterBar'); + const queryBar = getService('queryBar'); + const savedQueryManagementComponent = getService('savedQueryManagementComponent'); + const testSubjects = getService('testSubjects'); + const defaultSettings = { + defaultIndex: 'logstash-*', + }; + + const setUpQueriesWithFilters = async () => { + // set up a query with filters and a time filter + log.debug('set up a query with filters to save'); + const from = 'Sep 20, 2015 @ 08:00:00.000'; + const to = 'Sep 21, 2015 @ 08:00:00.000'; + await PageObjects.common.setTime({ from, to }); + await PageObjects.common.navigateToApp('discover'); + await filterBar.addFilter('extension.raw', 'is one of', 'jpg'); + await queryBar.setQuery('response:200'); + }; + + describe('saved queries saved objects', function describeIndexTests() { + before(async function () { + log.debug('load kibana index with default index pattern'); + await kibanaServer.savedObjects.clean({ types: ['search', 'index-pattern'] }); + + await kibanaServer.importExport.load( + 'test/functional/fixtures/kbn_archiver/discover_ccs.json' + ); + await kibanaServer.importExport.load( + 'test/functional/fixtures/kbn_archiver/date_nested_ccs.json' + ); + await esArchiver.load('test/functional/fixtures/es_archiver/date_nested'); + await esArchiver.load('test/functional/fixtures/es_archiver/logstash_functional'); + + await kibanaServer.uiSettings.replace(defaultSettings); + log.debug('discover'); + await PageObjects.common.navigateToApp('discover'); + await PageObjects.timePicker.setDefaultAbsoluteRange(); + }); + + after(async () => { + await kibanaServer.importExport.unload('test/functional/fixtures/kbn_archiver/discover_ccs'); + await kibanaServer.importExport.unload( + 'test/functional/fixtures/kbn_archiver/date_nested_ccs' + ); + await esArchiver.unload('test/functional/fixtures/es_archiver/date_nested'); + await esArchiver.unload('test/functional/fixtures/es_archiver/logstash_functional'); + await PageObjects.common.unsetTime(); + }); + + describe('saved query selection', () => { + before(async () => await setUpQueriesWithFilters()); + + it(`should unselect saved query when navigating to a 'new'`, async function () { + await savedQueryManagementComponent.saveNewQuery( + 'test-unselect-saved-query', + 'mock', + true, + true + ); + + await queryBar.submitQuery(); + + expect(await filterBar.hasFilter('extension.raw', 'jpg')).to.be(true); + expect(await queryBar.getQueryString()).to.eql('response:200'); + + await PageObjects.discover.clickNewSearchButton(); + + expect(await filterBar.hasFilter('extension.raw', 'jpg')).to.be(false); + expect(await queryBar.getQueryString()).to.eql(''); + + await PageObjects.discover.selectIndexPattern('remote:date-nested'); + + expect(await filterBar.hasFilter('extension.raw', 'jpg')).to.be(false); + expect(await queryBar.getQueryString()).to.eql(''); + + await PageObjects.discover.selectIndexPattern('remote:logstash-*'); + + expect(await filterBar.hasFilter('extension.raw', 'jpg')).to.be(false); + expect(await queryBar.getQueryString()).to.eql(''); + + // reset state + await savedQueryManagementComponent.deleteSavedQuery('test-unselect-saved-query'); + }); + }); + + describe('saved query management component functionality', function () { + before(async () => await setUpQueriesWithFilters()); + + it('should show the saved query management component when there are no saved queries', async () => { + await savedQueryManagementComponent.openSavedQueryManagementComponent(); + const descriptionText = await testSubjects.getVisibleText('saved-query-management-popover'); + expect(descriptionText).to.eql( + 'Saved Queries\nThere are no saved queries. Save query text and filters that you want to use again.\nSave current query' + ); + }); + + it('should allow a query to be saved via the saved objects management component', async () => { + await savedQueryManagementComponent.saveNewQuery( + 'OkResponse', + '200 responses for .jpg over 24 hours', + true, + true + ); + await savedQueryManagementComponent.savedQueryExistOrFail('OkResponse'); + await savedQueryManagementComponent.savedQueryTextExist('response:200'); + }); + + it('reinstates filters and the time filter when a saved query has filters and a time filter included', async () => { + await PageObjects.timePicker.setDefaultAbsoluteRange(); + await savedQueryManagementComponent.clearCurrentlyLoadedQuery(); + await savedQueryManagementComponent.loadSavedQuery('OkResponse'); + const timePickerValues = await PageObjects.timePicker.getTimeConfigAsAbsoluteTimes(); + expect(await filterBar.hasFilter('extension.raw', 'jpg')).to.be(true); + expect(timePickerValues.start).to.not.eql(PageObjects.timePicker.defaultStartTime); + expect(timePickerValues.end).to.not.eql(PageObjects.timePicker.defaultEndTime); + }); + + it('preserves the currently loaded query when the page is reloaded', async () => { + await browser.refresh(); + const timePickerValues = await PageObjects.timePicker.getTimeConfigAsAbsoluteTimes(); + expect(await filterBar.hasFilter('extension.raw', 'jpg')).to.be(true); + expect(timePickerValues.start).to.not.eql(PageObjects.timePicker.defaultStartTime); + expect(timePickerValues.end).to.not.eql(PageObjects.timePicker.defaultEndTime); + await retry.waitFor( + 'the right hit count', + async () => (await PageObjects.discover.getHitCount()) === '2,792' + ); + expect(await savedQueryManagementComponent.getCurrentlyLoadedQueryID()).to.be('OkResponse'); + }); + + it('allows saving changes to a currently loaded query via the saved query management component', async () => { + await queryBar.setQuery('response:404'); + await savedQueryManagementComponent.updateCurrentlyLoadedQuery('OkResponse', false, false); + await savedQueryManagementComponent.savedQueryExistOrFail('OkResponse'); + await savedQueryManagementComponent.clearCurrentlyLoadedQuery(); + expect(await queryBar.getQueryString()).to.eql(''); + await savedQueryManagementComponent.loadSavedQuery('OkResponse'); + expect(await queryBar.getQueryString()).to.eql('response:404'); + }); + + it('allows saving the currently loaded query as a new query', async () => { + await savedQueryManagementComponent.saveCurrentlyLoadedAsNewQuery( + 'OkResponseCopy', + '200 responses', + false, + false + ); + await savedQueryManagementComponent.savedQueryExistOrFail('OkResponseCopy'); + }); + + it('allows deleting the currently loaded saved query in the saved query management component and clears the query', async () => { + await savedQueryManagementComponent.deleteSavedQuery('OkResponseCopy'); + await savedQueryManagementComponent.savedQueryMissingOrFail('OkResponseCopy'); + expect(await queryBar.getQueryString()).to.eql(''); + }); + + it('does not allow saving a query with a non-unique name', async () => { + // this check allows this test to run stand alone, also should fix occacional flakiness + const savedQueryExists = await savedQueryManagementComponent.savedQueryExist('OkResponse'); + if (!savedQueryExists) { + await savedQueryManagementComponent.saveNewQuery( + 'OkResponse', + '200 responses for .jpg over 24 hours', + true, + true + ); + await savedQueryManagementComponent.clearCurrentlyLoadedQuery(); + } + await savedQueryManagementComponent.saveNewQueryWithNameError('OkResponse'); + }); + + it('resets any changes to a loaded query on reloading the same saved query', async () => { + await savedQueryManagementComponent.loadSavedQuery('OkResponse'); + await queryBar.setQuery('response:503'); + await savedQueryManagementComponent.loadSavedQuery('OkResponse'); + expect(await queryBar.getQueryString()).to.eql('response:404'); + }); + + it('allows clearing the currently loaded saved query', async () => { + await savedQueryManagementComponent.loadSavedQuery('OkResponse'); + await savedQueryManagementComponent.clearCurrentlyLoadedQuery(); + expect(await queryBar.getQueryString()).to.eql(''); + }); + + it('allows clearing if non default language was remembered in localstorage', async () => { + await queryBar.switchQueryLanguage('lucene'); + await PageObjects.common.navigateToApp('discover'); // makes sure discovered is reloaded without any state in url + await queryBar.expectQueryLanguageOrFail('lucene'); // make sure lucene is remembered after refresh (comes from localstorage) + await savedQueryManagementComponent.loadSavedQuery('OkResponse'); + await queryBar.expectQueryLanguageOrFail('kql'); + await savedQueryManagementComponent.clearCurrentlyLoadedQuery(); + await queryBar.expectQueryLanguageOrFail('lucene'); + }); + + it('changing language removes saved query', async () => { + await savedQueryManagementComponent.loadSavedQuery('OkResponse'); + await queryBar.switchQueryLanguage('lucene'); + expect(await queryBar.getQueryString()).to.eql(''); + }); + }); + }); +} diff --git a/test/functional_ccs/apps/discover/ftr_provider_context.d.ts b/test/functional_ccs/apps/discover/ftr_provider_context.d.ts new file mode 100644 index 0000000000000..ea232d23463e6 --- /dev/null +++ b/test/functional_ccs/apps/discover/ftr_provider_context.d.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 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 { GenericFtrProviderContext } from '@kbn/test'; +import { services } from '../../../functional/services'; +import { pageObjects } from '../../../functional/page_objects'; + +export type FtrProviderContext = GenericFtrProviderContext; diff --git a/test/functional_ccs/apps/discover/index.ts b/test/functional_ccs/apps/discover/index.ts new file mode 100644 index 0000000000000..629423b1b75aa --- /dev/null +++ b/test/functional_ccs/apps/discover/index.ts @@ -0,0 +1,43 @@ +/* + * 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, loadTestFile }: FtrProviderContext) { + const esArchiver = getService('esArchiver'); + const browser = getService('browser'); + const esClient = getService('es'); + + describe('discover app css', function () { + this.tags('ciGroup6'); + + before(async function () { + await esClient.cluster.putSettings({ + persistent: { + cluster: { + remote: { + remote: { + skip_unavailable: 'true', + seeds: ['localhost:9300'], + }, + }, + }, + }, + }); + return browser.setWindowSize(1300, 800); + }); + + after(function unloadMakelogs() { + // Make sure to clean up the cluster setting from the before above. + return esArchiver.unload('test/functional/fixtures/es_archiver/logstash_functional'); + }); + + loadTestFile(require.resolve('./_data_view_ccs')); + loadTestFile(require.resolve('./_saved_queries_ccs')); + }); +} diff --git a/test/functional_ccs/config.js b/test/functional_ccs/config.js new file mode 100644 index 0000000000000..4cd8875798372 --- /dev/null +++ b/test/functional_ccs/config.js @@ -0,0 +1,25 @@ +/* + * 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 { services } from '../functional/services'; + +export default async function ({ readConfigFile }) { + const functionalConfig = await readConfigFile(require.resolve('../functional/config')); + + return { + ...functionalConfig.getAll(), + + testFiles: [require.resolve('./apps/discover')], + + services, + + junit: { + reportName: 'Kibana CCS Tests', + }, + }; +} From a16c20b7b4c0ddf867a231b0f41d8a4477b482a0 Mon Sep 17 00:00:00 2001 From: Spencer Date: Thu, 24 Feb 2022 16:44:37 -0600 Subject: [PATCH 025/102] [kbn/es] add support for --ready-timeout (#126217) --- packages/kbn-es/src/cli_commands/archive.js | 13 +- packages/kbn-es/src/cli_commands/snapshot.js | 11 +- packages/kbn-es/src/cli_commands/source.js | 13 +- packages/kbn-es/src/cluster.js | 144 +++++++++++++----- packages/kbn-es/src/cluster_exec_options.ts | 18 +++ packages/kbn-es/src/utils/index.ts | 1 + packages/kbn-es/src/utils/native_realm.js | 26 +--- .../kbn-es/src/utils/native_realm.test.js | 8 +- .../src/utils/parse_timeout_to_ms.test.ts | 37 +++++ .../kbn-es/src/utils/parse_timeout_to_ms.ts | 43 ++++++ packages/kbn-test/src/es/test_es_cluster.ts | 3 +- 11 files changed, 244 insertions(+), 73 deletions(-) create mode 100644 packages/kbn-es/src/cluster_exec_options.ts create mode 100644 packages/kbn-es/src/utils/parse_timeout_to_ms.test.ts create mode 100644 packages/kbn-es/src/utils/parse_timeout_to_ms.ts diff --git a/packages/kbn-es/src/cli_commands/archive.js b/packages/kbn-es/src/cli_commands/archive.js index c92ed98ce03fc..96ffc1fec34c2 100644 --- a/packages/kbn-es/src/cli_commands/archive.js +++ b/packages/kbn-es/src/cli_commands/archive.js @@ -10,6 +10,7 @@ const dedent = require('dedent'); const getopts = require('getopts'); const { Cluster } = require('../cluster'); const { createCliError } = require('../errors'); +const { parseTimeoutToMs } = require('../utils'); exports.description = 'Install and run from an Elasticsearch tar'; @@ -27,6 +28,8 @@ exports.help = (defaults = {}) => { --password.[user] Sets password for native realm user [default: ${password}] --ssl Sets up SSL on Elasticsearch -E Additional key=value settings to pass to Elasticsearch + --skip-ready-check Disable the ready check, + --ready-timeout Customize the ready check timeout, in seconds or "Xm" format, defaults to 1m Example: @@ -41,8 +44,13 @@ exports.run = async (defaults = {}) => { basePath: 'base-path', installPath: 'install-path', esArgs: 'E', + skipReadyCheck: 'skip-ready-check', + readyTimeout: 'ready-timeout', }, + string: ['ready-timeout'], + boolean: ['skip-ready-check'], + default: defaults, }); @@ -54,5 +62,8 @@ exports.run = async (defaults = {}) => { } const { installPath } = await cluster.installArchive(path, options); - await cluster.run(installPath, options); + await cluster.run(installPath, { + ...options, + readyTimeout: parseTimeoutToMs(options.readyTimeout), + }); }; diff --git a/packages/kbn-es/src/cli_commands/snapshot.js b/packages/kbn-es/src/cli_commands/snapshot.js index b89f1f8214813..1c902796a0a0c 100644 --- a/packages/kbn-es/src/cli_commands/snapshot.js +++ b/packages/kbn-es/src/cli_commands/snapshot.js @@ -10,6 +10,7 @@ const dedent = require('dedent'); const getopts = require('getopts'); import { ToolingLog, getTimeReporter } from '@kbn/dev-utils'; const { Cluster } = require('../cluster'); +const { parseTimeoutToMs } = require('../utils'); exports.description = 'Downloads and run from a nightly snapshot'; @@ -30,6 +31,8 @@ exports.help = (defaults = {}) => { --download-only Download the snapshot but don't actually start it --ssl Sets up SSL on Elasticsearch --use-cached Skips cache verification and use cached ES snapshot. + --skip-ready-check Disable the ready check, + --ready-timeout Customize the ready check timeout, in seconds or "Xm" format, defaults to 1m Example: @@ -53,11 +56,12 @@ exports.run = async (defaults = {}) => { dataArchive: 'data-archive', esArgs: 'E', useCached: 'use-cached', + skipReadyCheck: 'skip-ready-check', + readyTimeout: 'ready-timeout', }, - string: ['version'], - - boolean: ['download-only', 'use-cached'], + string: ['version', 'ready-timeout'], + boolean: ['download-only', 'use-cached', 'skip-ready-check'], default: defaults, }); @@ -82,6 +86,7 @@ exports.run = async (defaults = {}) => { reportTime, startTime: runStartTime, ...options, + readyTimeout: parseTimeoutToMs(options.readyTimeout), }); } }; diff --git a/packages/kbn-es/src/cli_commands/source.js b/packages/kbn-es/src/cli_commands/source.js index 5a4192ae7703c..c16e89e2c7f32 100644 --- a/packages/kbn-es/src/cli_commands/source.js +++ b/packages/kbn-es/src/cli_commands/source.js @@ -9,6 +9,7 @@ const dedent = require('dedent'); const getopts = require('getopts'); const { Cluster } = require('../cluster'); +const { parseTimeoutToMs } = require('../utils'); exports.description = 'Build and run from source'; @@ -27,6 +28,8 @@ exports.help = (defaults = {}) => { --password.[user] Sets password for native realm user [default: ${password}] --ssl Sets up SSL on Elasticsearch -E Additional key=value settings to pass to Elasticsearch + --skip-ready-check Disable the ready check, + --ready-timeout Customize the ready check timeout, in seconds or "Xm" format, defaults to 1m Example: @@ -42,9 +45,14 @@ exports.run = async (defaults = {}) => { installPath: 'install-path', sourcePath: 'source-path', dataArchive: 'data-archive', + skipReadyCheck: 'skip-ready-check', + readyTimeout: 'ready-timeout', esArgs: 'E', }, + string: ['ready-timeout'], + boolean: ['skip-ready-check'], + default: defaults, }); @@ -55,5 +63,8 @@ exports.run = async (defaults = {}) => { await cluster.extractDataDirectory(installPath, options.dataArchive); } - await cluster.run(installPath, options); + await cluster.run(installPath, { + ...options, + readyTimeout: parseTimeoutToMs(options.readyTimeout), + }); }; diff --git a/packages/kbn-es/src/cluster.js b/packages/kbn-es/src/cluster.js index e8106b52d6aaf..4ad7329752347 100644 --- a/packages/kbn-es/src/cluster.js +++ b/packages/kbn-es/src/cluster.js @@ -6,20 +6,29 @@ * Side Public License, v 1. */ -const fs = require('fs'); -const util = require('util'); +const fsp = require('fs/promises'); const execa = require('execa'); const chalk = require('chalk'); const path = require('path'); +const { Client } = require('@elastic/elasticsearch'); const { downloadSnapshot, installSnapshot, installSource, installArchive } = require('./install'); const { ES_BIN } = require('./paths'); -const { log: defaultLog, parseEsLog, extractConfigFiles, NativeRealm } = require('./utils'); +const { + log: defaultLog, + parseEsLog, + extractConfigFiles, + NativeRealm, + parseTimeoutToMs, +} = require('./utils'); const { createCliError } = require('./errors'); const { promisify } = require('util'); const treeKillAsync = promisify(require('tree-kill')); const { parseSettings, SettingsFilter } = require('./settings'); const { CA_CERT_PATH, ES_NOPASSWORD_P12_PATH, extract } = require('@kbn/dev-utils'); -const readFile = util.promisify(fs.readFile); + +const DEFAULT_READY_TIMEOUT = parseTimeoutToMs('1m'); + +/** @typedef {import('./cluster_exec_options').EsClusterExecOptions} ExecOptions */ // listen to data on stream until map returns anything but undefined const first = (stream, map) => @@ -38,7 +47,6 @@ exports.Cluster = class Cluster { constructor({ log = defaultLog, ssl = false } = {}) { this._log = log.withType('@kbn/es Cluster'); this._ssl = ssl; - this._caCertPromise = ssl ? readFile(CA_CERT_PATH) : undefined; } /** @@ -157,10 +165,8 @@ exports.Cluster = class Cluster { * Starts ES and returns resolved promise once started * * @param {String} installPath - * @param {Object} options - * @property {Array} options.esArgs - * @property {String} options.password - super user password used to bootstrap - * @returns {Promise} + * @param {ExecOptions} options + * @returns {Promise} */ async start(installPath, options = {}) { this._exec(installPath, options); @@ -173,7 +179,7 @@ exports.Cluster = class Cluster { return true; } }), - this._nativeRealmSetup, + this._setupPromise, ]), // await the outcome of the process in case it exits before starting @@ -187,15 +193,14 @@ exports.Cluster = class Cluster { * Starts Elasticsearch and waits for Elasticsearch to exit * * @param {String} installPath - * @param {Object} options - * @property {Array} options.esArgs - * @returns {Promise} + * @param {ExecOptions} options + * @returns {Promise} */ async run(installPath, options = {}) { this._exec(installPath, options); // log native realm setup errors so they aren't uncaught - this._nativeRealmSetup.catch((error) => { + this._setupPromise.catch((error) => { this._log.error(error); this.stop(); }); @@ -233,14 +238,17 @@ exports.Cluster = class Cluster { * * @private * @param {String} installPath - * @param {Object} options - * @property {string|Array} options.esArgs - * @property {string} options.esJavaOpts - * @property {Boolean} options.skipNativeRealmSetup - * @return {undefined} + * @param {ExecOptions} opts */ _exec(installPath, opts = {}) { - const { skipNativeRealmSetup = false, reportTime = () => {}, startTime, ...options } = opts; + const { + skipNativeRealmSetup = false, + reportTime = () => {}, + startTime, + skipReadyCheck, + readyTimeout, + ...options + } = opts; if (this._process || this._outcome) { throw new Error('ES has already been started'); @@ -301,30 +309,49 @@ exports.Cluster = class Cluster { stdio: ['ignore', 'pipe', 'pipe'], }); - // parse log output to find http port - const httpPort = first(this._process.stdout, (data) => { - const match = data.toString('utf8').match(/HttpServer.+publish_address {[0-9.]+:([0-9]+)/); + this._setupPromise = Promise.all([ + // parse log output to find http port + first(this._process.stdout, (data) => { + const match = data.toString('utf8').match(/HttpServer.+publish_address {[0-9.]+:([0-9]+)/); - if (match) { - return match[1]; + if (match) { + return match[1]; + } + }), + + // load the CA cert from disk if necessary + this._ssl ? fsp.readFile(CA_CERT_PATH) : null, + ]).then(async ([port, caCert]) => { + const client = new Client({ + node: `${caCert ? 'https:' : 'http:'}//localhost:${port}`, + auth: { + username: 'elastic', + password: options.password, + }, + tls: caCert + ? { + ca: caCert, + rejectUnauthorized: true, + } + : undefined, + }); + + if (!skipReadyCheck) { + await this._waitForClusterReady(client, readyTimeout); } - }); - // once the http port is available setup the native realm - this._nativeRealmSetup = httpPort.then(async (port) => { - if (skipNativeRealmSetup) { - return; + // once the cluster is ready setup the native realm + if (!skipNativeRealmSetup) { + const nativeRealm = new NativeRealm({ + log: this._log, + elasticPassword: options.password, + client, + }); + + await nativeRealm.setPasswords(options); } - const caCert = await this._caCertPromise; - const nativeRealm = new NativeRealm({ - port, - caCert, - log: this._log, - elasticPassword: options.password, - ssl: this._ssl, - }); - await nativeRealm.setPasswords(options); + this._log.success('kbn/es setup complete'); }); let reportSent = false; @@ -367,4 +394,43 @@ exports.Cluster = class Cluster { } }); } + + async _waitForClusterReady(client, readyTimeout = DEFAULT_READY_TIMEOUT) { + let attempt = 0; + const start = Date.now(); + + this._log.info('waiting for ES cluster to report a yellow or green status'); + + while (true) { + attempt += 1; + + try { + const resp = await client.cluster.health(); + if (resp.status !== 'red') { + return; + } + + throw new Error(`not ready, cluster health is ${resp.status}`); + } catch (error) { + const timeSinceStart = Date.now() - start; + if (timeSinceStart > readyTimeout) { + const sec = readyTimeout / 1000; + throw new Error(`ES cluster failed to come online with the ${sec} second timeout`); + } + + if (error.message.startsWith('not ready,')) { + if (timeSinceStart > 10_000) { + this._log.warning(error.message); + } + } else { + this._log.warning( + `waiting for ES cluster to come online, attempt ${attempt} failed with: ${error.message}` + ); + } + + const waitSec = attempt * 1.5; + await new Promise((resolve) => setTimeout(resolve, waitSec * 1000)); + } + } + } }; diff --git a/packages/kbn-es/src/cluster_exec_options.ts b/packages/kbn-es/src/cluster_exec_options.ts new file mode 100644 index 0000000000000..8ef3b23cd8c51 --- /dev/null +++ b/packages/kbn-es/src/cluster_exec_options.ts @@ -0,0 +1,18 @@ +/* + * 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. + */ + +export interface EsClusterExecOptions { + skipNativeRealmSetup?: boolean; + reportTime?: (...args: any[]) => void; + startTime?: number; + esArgs?: string[]; + esJavaOpts?: string; + password?: string; + skipReadyCheck?: boolean; + readyTimeout?: number; +} diff --git a/packages/kbn-es/src/utils/index.ts b/packages/kbn-es/src/utils/index.ts index 4b4ae1bc05259..4e75d1d81f6fb 100644 --- a/packages/kbn-es/src/utils/index.ts +++ b/packages/kbn-es/src/utils/index.ts @@ -17,3 +17,4 @@ export { extractConfigFiles } from './extract_config_files'; export { NativeRealm, SYSTEM_INDICES_SUPERUSER } from './native_realm'; export { buildSnapshot } from './build_snapshot'; export { archiveForPlatform } from './build_snapshot'; +export * from './parse_timeout_to_ms'; diff --git a/packages/kbn-es/src/utils/native_realm.js b/packages/kbn-es/src/utils/native_realm.js index 52d6ae807777b..ae0ce05f4d6b7 100644 --- a/packages/kbn-es/src/utils/native_realm.js +++ b/packages/kbn-es/src/utils/native_realm.js @@ -6,7 +6,6 @@ * Side Public License, v 1. */ -const { Client } = require('@elastic/elasticsearch'); const chalk = require('chalk'); const { log: defaultLog } = require('./log'); @@ -15,14 +14,9 @@ export const SYSTEM_INDICES_SUPERUSER = process.env.TEST_ES_SYSTEM_INDICES_USER || 'system_indices_superuser'; exports.NativeRealm = class NativeRealm { - constructor({ elasticPassword, port, log = defaultLog, ssl = false, caCert }) { - const auth = { username: 'elastic', password: elasticPassword }; - this._client = new Client( - ssl - ? { node: `https://localhost:${port}`, tls: { ca: caCert, rejectUnauthorized: true }, auth } - : { node: `http://localhost:${port}`, auth } - ); + constructor({ elasticPassword, log = defaultLog, client }) { this._elasticPassword = elasticPassword; + this._client = client; this._log = log; } @@ -53,24 +47,14 @@ exports.NativeRealm = class NativeRealm { }); } - async clusterReady() { - return await this._autoRetry({ maxAttempts: 10 }, async () => { - const { status } = await this._client.cluster.health(); - if (status === 'red') { - throw new Error(`not ready, cluster health is ${status}`); - } - }); - } - async setPasswords(options) { - await this.clusterReady(); - if (!(await this.isSecurityEnabled())) { this._log.info('security is not enabled, unable to set native realm passwords'); return; } const reservedUsers = await this.getReservedUsers(); + this._log.info(`Set up ${reservedUsers.length} ES users`); await Promise.all([ ...reservedUsers.map(async (user) => { await this.setPassword(user, options[`password.${user}`]); @@ -108,7 +92,7 @@ exports.NativeRealm = class NativeRealm { } async _autoRetry(opts, fn) { - const { attempt = 1, maxAttempts = 3, sleep = 1000 } = opts; + const { attempt = 1, maxAttempts = 3 } = opts; try { return await fn(attempt); @@ -119,7 +103,7 @@ exports.NativeRealm = class NativeRealm { const sec = 1.5 * attempt; this._log.warning(`assuming ES isn't initialized completely, trying again in ${sec} seconds`); - await new Promise((resolve) => setTimeout(resolve, sleep)); + await new Promise((resolve) => setTimeout(resolve, sec * 1000)); const nextOpts = { ...opts, diff --git a/packages/kbn-es/src/utils/native_realm.test.js b/packages/kbn-es/src/utils/native_realm.test.js index a567c15e743af..d3eaf6bd97b72 100644 --- a/packages/kbn-es/src/utils/native_realm.test.js +++ b/packages/kbn-es/src/utils/native_realm.test.js @@ -7,12 +7,7 @@ */ const { NativeRealm } = require('./native_realm'); - -jest.genMockFromModule('@elastic/elasticsearch'); -jest.mock('@elastic/elasticsearch'); - const { ToolingLog } = require('@kbn/dev-utils'); -const { Client } = require('@elastic/elasticsearch'); const mockClient = { xpack: { @@ -28,13 +23,12 @@ const mockClient = { putUser: jest.fn(), }, }; -Client.mockImplementation(() => mockClient); const log = new ToolingLog(); let nativeRealm; beforeEach(() => { - nativeRealm = new NativeRealm({ elasticPassword: 'changeme', port: '9200', log }); + nativeRealm = new NativeRealm({ elasticPassword: 'changeme', client: mockClient, log }); }); afterAll(() => { diff --git a/packages/kbn-es/src/utils/parse_timeout_to_ms.test.ts b/packages/kbn-es/src/utils/parse_timeout_to_ms.test.ts new file mode 100644 index 0000000000000..fba387cad278b --- /dev/null +++ b/packages/kbn-es/src/utils/parse_timeout_to_ms.test.ts @@ -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 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 { parseTimeoutToMs } from './parse_timeout_to_ms'; + +it('handles empty values', () => { + expect(parseTimeoutToMs(undefined)).toMatchInlineSnapshot(`undefined`); + expect(parseTimeoutToMs('')).toMatchInlineSnapshot(`undefined`); +}); +it('returns numbers', () => { + expect(parseTimeoutToMs(10)).toMatchInlineSnapshot(`10`); +}); +it('parses seconds', () => { + expect(parseTimeoutToMs('10')).toMatchInlineSnapshot(`10000`); +}); +it('parses minutes', () => { + expect(parseTimeoutToMs('10m')).toMatchInlineSnapshot(`600000`); +}); +it('throws for invalid values', () => { + expect(() => parseTimeoutToMs(true)).toThrowErrorMatchingInlineSnapshot( + `"[true] is not a valid timeout value"` + ); + expect(() => parseTimeoutToMs([true])).toThrowErrorMatchingInlineSnapshot( + `"[[ true ]] is not a valid timeout value"` + ); + expect(() => parseTimeoutToMs(['true'])).toThrowErrorMatchingInlineSnapshot( + `"[[ 'true' ]] is not a valid timeout value"` + ); + expect(() => parseTimeoutToMs(NaN)).toThrowErrorMatchingInlineSnapshot( + `"[NaN] is not a valid timeout value"` + ); +}); diff --git a/packages/kbn-es/src/utils/parse_timeout_to_ms.ts b/packages/kbn-es/src/utils/parse_timeout_to_ms.ts new file mode 100644 index 0000000000000..c8272bdfeee51 --- /dev/null +++ b/packages/kbn-es/src/utils/parse_timeout_to_ms.ts @@ -0,0 +1,43 @@ +/* + * 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 { inspect } from 'util'; + +function parseInt(n: string) { + const number = Number.parseInt(n, 10); + if (Number.isNaN(number)) { + throw new Error(`invalid number [${n}]`); + } + return number; +} + +/** + * Parse a timeout value to milliseconds. Supports undefined, a number, an + * empty string, a string representing a number of minutes eg 1m, or a string + * representing a number of seconds eg 60. All other values throw an error + */ +export function parseTimeoutToMs(seconds: any): number | undefined { + if (seconds === undefined || seconds === '') { + return undefined; + } + + if (typeof seconds === 'number' && !Number.isNaN(seconds)) { + return seconds; + } + + if (typeof seconds !== 'string') { + throw new Error(`[${inspect(seconds)}] is not a valid timeout value`); + } + + if (seconds.endsWith('m')) { + const m = parseInt(seconds.slice(0, -1)); + return m * 60 * 1000; + } + + return parseInt(seconds) * 1000; +} diff --git a/packages/kbn-test/src/es/test_es_cluster.ts b/packages/kbn-test/src/es/test_es_cluster.ts index 388d578c9af57..6e4fc2fb14628 100644 --- a/packages/kbn-test/src/es/test_es_cluster.ts +++ b/packages/kbn-test/src/es/test_es_cluster.ts @@ -244,9 +244,10 @@ export function createTestEsCluster< esArgs: assignArgs(esArgs, overriddenArgs), esJavaOpts, // If we have multiple nodes, we shouldn't try setting up the native realm - // right away, or ES will complain as the cluster isn't ready. So we only + // right away or wait for ES to be green, the cluster isn't ready. So we only // set it up after the last node is started. skipNativeRealmSetup: this.nodes.length > 1 && i < this.nodes.length - 1, + skipReadyCheck: this.nodes.length > 1 && i < this.nodes.length - 1, }); }); } From bf89f3d0d36685d90705fb1d9eabec95650cdb1e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 24 Feb 2022 17:57:57 -0500 Subject: [PATCH 026/102] Update dependency core-js to ^3.21.1 (main) (#126299) * Update dependency core-js to ^3.21.1 * dedupe Co-authored-by: Renovate Bot Co-authored-by: Jonathan Budzenski --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 72309e07bde77..b72f87f4243e3 100644 --- a/package.json +++ b/package.json @@ -218,7 +218,7 @@ "constate": "^1.3.2", "content-disposition": "0.5.3", "copy-to-clipboard": "^3.0.8", - "core-js": "^3.21.0", + "core-js": "^3.21.1", "cronstrue": "^1.51.0", "cytoscape": "^3.10.0", "cytoscape-dagre": "^2.2.2", diff --git a/yarn.lock b/yarn.lock index 3a4e8503fc8fa..ee986fe2f4d32 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11595,10 +11595,10 @@ core-js@^2.4.0, core-js@^2.5.0, core-js@^2.6.9: resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.9.tgz#6b4b214620c834152e179323727fc19741b084f2" integrity sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A== -core-js@^3.0.4, core-js@^3.21.0, core-js@^3.6.5, core-js@^3.8.2, core-js@^3.8.3: - version "3.21.0" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.21.0.tgz#f479dbfc3dffb035a0827602dd056839a774aa71" - integrity sha512-YUdI3fFu4TF/2WykQ2xzSiTQdldLB4KVuL9WeAy5XONZYt5Cun/fpQvctoKbCgvPhmzADeesTk/j2Rdx77AcKQ== +core-js@^3.0.4, core-js@^3.21.1, core-js@^3.6.5, core-js@^3.8.2, core-js@^3.8.3: + version "3.21.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.21.1.tgz#f2e0ddc1fc43da6f904706e8e955bc19d06a0d94" + integrity sha512-FRq5b/VMrWlrmCzwRrpDYNxyHP9BcAZC+xHJaqTgIE5091ZV1NTmyh0sGOg5XqpnHvR0svdy0sv1gWA1zmhxig== core-util-is@1.0.2, core-util-is@^1.0.2, core-util-is@~1.0.0: version "1.0.2" From ef62706a59355a4005920124d0c0faa33bc7798a Mon Sep 17 00:00:00 2001 From: Ersin Erdal <92688503+ersin-erdal@users.noreply.github.com> Date: Fri, 25 Feb 2022 00:36:12 +0100 Subject: [PATCH 027/102] =?UTF-8?q?[Alerting]=20Refactor=20task=5Frunner.?= =?UTF-8?q?=20Move=20Interface=20and=20test=20fixtures=20to=20=E2=80=A6=20?= =?UTF-8?q?(#125418)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [Alerting] Refactor task_runner. Move Interface and test fixtures to their own file --- .../alerting/common/rule_task_instance.ts | 7 + .../alerting/server/task_runner/fixtures.ts | 378 ++ .../server/task_runner/task_runner.test.ts | 4583 +++-------------- .../server/task_runner/task_runner.ts | 93 +- .../alerting/server/task_runner/types.ts | 105 + 5 files changed, 1218 insertions(+), 3948 deletions(-) create mode 100644 x-pack/plugins/alerting/server/task_runner/fixtures.ts create mode 100644 x-pack/plugins/alerting/server/task_runner/types.ts diff --git a/x-pack/plugins/alerting/common/rule_task_instance.ts b/x-pack/plugins/alerting/common/rule_task_instance.ts index 59ed9097f1675..32437338b9c13 100644 --- a/x-pack/plugins/alerting/common/rule_task_instance.ts +++ b/x-pack/plugins/alerting/common/rule_task_instance.ts @@ -8,6 +8,7 @@ import * as t from 'io-ts'; import { rawAlertInstance } from './alert_instance'; import { DateFromString } from './date_from_string'; +import { IntervalSchedule, RuleMonitoring } from './alert'; const actionSchema = t.partial({ group: t.string, @@ -44,3 +45,9 @@ export const ruleParamsSchema = t.intersection([ }), ]); export type RuleTaskParams = t.TypeOf; + +export interface RuleExecutionRunResult { + state: RuleExecutionState; + monitoring: RuleMonitoring | undefined; + schedule: IntervalSchedule | undefined; +} diff --git a/x-pack/plugins/alerting/server/task_runner/fixtures.ts b/x-pack/plugins/alerting/server/task_runner/fixtures.ts new file mode 100644 index 0000000000000..07f2487de20fb --- /dev/null +++ b/x-pack/plugins/alerting/server/task_runner/fixtures.ts @@ -0,0 +1,378 @@ +/* + * 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 { isNil } from 'lodash'; +import { Alert, AlertTypeParams, RecoveredActionGroup } from '../../common'; +import { getDefaultRuleMonitoring } from './task_runner'; +import { UntypedNormalizedRuleType } from '../rule_type_registry'; +import { TaskStatus } from '../../../task_manager/server'; +import { EVENT_LOG_ACTIONS } from '../plugin'; + +interface GeneratorParams { + [key: string]: string | number | boolean | undefined | object[] | boolean[] | object; +} + +export const RULE_NAME = 'rule-name'; +export const RULE_ID = '1'; +export const RULE_TYPE_ID = 'test'; +export const DATE_1969 = '1969-12-31T00:00:00.000Z'; +export const DATE_1970 = '1970-01-01T00:00:00.000Z'; +export const DATE_1970_5_MIN = '1969-12-31T23:55:00.000Z'; +export const MOCK_DURATION = 86400000000000; + +export const SAVED_OBJECT = { + id: '1', + type: 'alert', + attributes: { + apiKey: Buffer.from('123:abc').toString('base64'), + enabled: true, + }, + references: [], +}; + +export const RULE_ACTIONS = [ + { + actionTypeId: 'action', + group: 'default', + id: '1', + params: { + foo: true, + }, + }, + { + actionTypeId: 'action', + group: 'recovered', + id: '2', + params: { + isResolved: true, + }, + }, +]; + +export const SAVED_OBJECT_UPDATE_PARAMS = [ + 'alert', + '1', + { + monitoring: { + execution: { + calculated_metrics: { + success_ratio: 1, + }, + history: [ + { + success: true, + timestamp: 0, + }, + ], + }, + }, + executionStatus: { + error: null, + lastDuration: 0, + lastExecutionDate: '1970-01-01T00:00:00.000Z', + status: 'ok', + }, + }, + { refresh: false, namespace: undefined }, +]; + +export const GENERIC_ERROR_MESSAGE = 'GENERIC ERROR MESSAGE'; + +export const ruleType: jest.Mocked = { + id: RULE_TYPE_ID, + name: 'My test rule', + actionGroups: [{ id: 'default', name: 'Default' }, RecoveredActionGroup], + defaultActionGroupId: 'default', + minimumLicenseRequired: 'basic', + isExportable: true, + recoveryActionGroup: RecoveredActionGroup, + executor: jest.fn(), + producer: 'alerts', +}; + +export const mockRunNowResponse = { + id: 1, +} as jest.ResolvedValue; + +export const mockDate = new Date('2019-02-12T21:01:22.479Z'); + +export const mockedRuleTypeSavedObject: Alert = { + id: '1', + consumer: 'bar', + createdAt: mockDate, + updatedAt: mockDate, + throttle: null, + muteAll: false, + notifyWhen: 'onActiveAlert', + enabled: true, + alertTypeId: ruleType.id, + apiKey: '', + apiKeyOwner: 'elastic', + schedule: { interval: '10s' }, + name: RULE_NAME, + tags: ['rule-', '-tags'], + createdBy: 'rule-creator', + updatedBy: 'rule-updater', + mutedInstanceIds: [], + params: { + bar: true, + }, + actions: [ + { + group: 'default', + id: '1', + actionTypeId: 'action', + params: { + foo: true, + }, + }, + { + group: RecoveredActionGroup.id, + id: '2', + actionTypeId: 'action', + params: { + isResolved: true, + }, + }, + ], + executionStatus: { + status: 'unknown', + lastExecutionDate: new Date('2020-08-20T19:23:38Z'), + }, + monitoring: getDefaultRuleMonitoring(), +}; + +export const mockTaskInstance = () => ({ + id: '', + attempts: 0, + status: TaskStatus.Running, + version: '123', + runAt: new Date(), + schedule: { interval: '10s' }, + scheduledAt: new Date(), + startedAt: new Date(), + retryAt: new Date(Date.now() + 5 * 60 * 1000), + state: {}, + taskType: 'alerting:test', + params: { + alertId: RULE_ID, + }, + ownerId: null, +}); + +export const generateAlertSO = (id: string) => ({ + id, + rel: 'primary', + type: 'alert', + type_id: RULE_TYPE_ID, +}); + +export const generateActionSO = (id: string) => ({ + id, + namespace: undefined, + type: 'action', + type_id: 'action', +}); + +export const generateEventLog = ({ + action, + task, + duration, + start, + end, + outcome, + reason, + instanceId, + actionSubgroup, + actionGroupId, + status, + numberOfTriggeredActions, + savedObjects = [generateAlertSO('1')], +}: GeneratorParams = {}) => ({ + ...(status === 'error' && { + error: { + message: generateErrorMessage(String(reason)), + }, + }), + event: { + action, + ...(!isNil(duration) && { duration }), + ...(start && { start }), + ...(end && { end }), + ...(outcome && { outcome }), + ...(reason && { reason }), + category: ['alerts'], + kind: 'alert', + }, + kibana: { + alert: { + rule: { + execution: { + uuid: '5f6aa57d-3e22-484e-bae8-cbed868f4d28', + ...(!isNil(numberOfTriggeredActions) && { + metrics: { + number_of_triggered_actions: numberOfTriggeredActions, + number_of_searches: 3, + es_search_duration_ms: 33, + total_search_duration_ms: 23423, + }, + }), + }, + }, + }, + ...((actionSubgroup || actionGroupId || instanceId || status) && { + alerting: { + ...(actionSubgroup && { action_subgroup: actionSubgroup }), + ...(actionGroupId && { action_group_id: actionGroupId }), + ...(instanceId && { instance_id: instanceId }), + ...(status && { status }), + }, + }), + saved_objects: savedObjects, + ...(task && { + task: { + schedule_delay: 0, + scheduled: '1970-01-01T00:00:00.000Z', + }, + }), + }, + message: generateMessage({ action, instanceId, actionGroupId, actionSubgroup, reason, status }), + rule: { + category: 'test', + id: '1', + license: 'basic', + ...(hasRuleName({ action, status }) && { name: RULE_NAME }), + ruleset: 'alerts', + }, +}); + +const generateMessage = ({ + action, + instanceId, + actionGroupId, + actionSubgroup, + reason, + status, +}: GeneratorParams) => { + if (action === EVENT_LOG_ACTIONS.executeStart) { + return `rule execution start: "${mockTaskInstance().params.alertId}"`; + } + + if (action === EVENT_LOG_ACTIONS.newInstance) { + return `${RULE_TYPE_ID}:${RULE_ID}: '${RULE_NAME}' created new alert: '${instanceId}'`; + } + + if (action === EVENT_LOG_ACTIONS.activeInstance) { + if (actionSubgroup) { + return `${RULE_TYPE_ID}:${RULE_ID}: '${RULE_NAME}' active alert: '${instanceId}' in actionGroup(subgroup): 'default(${actionSubgroup})'`; + } + return `${RULE_TYPE_ID}:${RULE_ID}: '${RULE_NAME}' active alert: '${instanceId}' in actionGroup: '${actionGroupId}'`; + } + + if (action === EVENT_LOG_ACTIONS.recoveredInstance) { + return `${RULE_TYPE_ID}:${RULE_ID}: '${RULE_NAME}' alert '${instanceId}' has recovered`; + } + + if (action === EVENT_LOG_ACTIONS.executeAction) { + if (actionSubgroup) { + return `alert: ${RULE_TYPE_ID}:${RULE_ID}: '${RULE_NAME}' instanceId: '${instanceId}' scheduled actionGroup(subgroup): 'default(${actionSubgroup})' action: action:${instanceId}`; + } + return `alert: ${RULE_TYPE_ID}:${RULE_ID}: '${RULE_NAME}' instanceId: '${instanceId}' scheduled actionGroup: '${actionGroupId}' action: action:${instanceId}`; + } + + if (action === EVENT_LOG_ACTIONS.execute) { + if (status === 'error' && reason === 'execute') { + return `rule execution failure: ${RULE_TYPE_ID}:${RULE_ID}: '${RULE_NAME}'`; + } + if (status === 'error') { + return `${RULE_TYPE_ID}:${RULE_ID}: execution failed`; + } + if (actionGroupId === 'recovered') { + return `rule-name' instanceId: '${instanceId}' scheduled actionGroup: '${actionGroupId}' action: action:${instanceId}`; + } + return `rule executed: ${RULE_TYPE_ID}:${RULE_ID}: '${RULE_NAME}'`; + } +}; + +const generateErrorMessage = (reason: string) => { + if (reason === 'disabled') { + return 'Rule failed to execute because rule ran after it was disabled.'; + } + return GENERIC_ERROR_MESSAGE; +}; + +export const generateRunnerResult = ({ + successRatio = 1, + history = Array(false), + state = false, + interval = '10s', +}: GeneratorParams = {}) => { + return { + monitoring: { + execution: { + calculated_metrics: { + success_ratio: successRatio, + }, + // @ts-ignore + history: history.map((success) => ({ success, timestamp: 0 })), + }, + }, + schedule: { + interval, + }, + state: { + ...(state && { alertInstances: {} }), + ...(state && { alertTypeState: undefined }), + ...(state && { previousStartedAt: new Date('1970-01-01T00:00:00.000Z') }), + }, + }; +}; + +export const generateEnqueueFunctionInput = () => ({ + apiKey: 'MTIzOmFiYw==', + executionId: '5f6aa57d-3e22-484e-bae8-cbed868f4d28', + id: '1', + params: { + foo: true, + }, + relatedSavedObjects: [ + { + id: '1', + namespace: undefined, + type: 'alert', + typeId: RULE_TYPE_ID, + }, + ], + source: { + source: { + id: '1', + type: 'alert', + }, + type: 'SAVED_OBJECT', + }, + spaceId: undefined, +}); + +export const generateAlertInstance = ({ id, duration, start }: GeneratorParams = { id: 1 }) => ({ + [String(id)]: { + meta: { + lastScheduledActions: { + date: new Date(DATE_1970), + group: 'default', + subgroup: undefined, + }, + }, + state: { + bar: false, + duration, + start, + }, + }, +}); +const hasRuleName = ({ action, status }: GeneratorParams) => { + return action !== 'execute-start' && status !== 'error'; +}; diff --git a/x-pack/plugins/alerting/server/task_runner/task_runner.test.ts b/x-pack/plugins/alerting/server/task_runner/task_runner.test.ts index 7496cdf7fd336..99feefb472df1 100644 --- a/x-pack/plugins/alerting/server/task_runner/task_runner.test.ts +++ b/x-pack/plugins/alerting/server/task_runner/task_runner.test.ts @@ -19,10 +19,9 @@ import { ConcreteTaskInstance, isUnrecoverableError, RunNowResult, - TaskStatus, } from '../../../task_manager/server'; import { TaskRunnerContext } from './task_runner_factory'; -import { TaskRunner, getDefaultRuleMonitoring } from './task_runner'; +import { TaskRunner } from './task_runner'; import { encryptedSavedObjectsMock } from '../../../encrypted_saved_objects/server/mocks'; import { loggingSystemMock, @@ -38,32 +37,42 @@ import { alertsMock, rulesClientMock } from '../mocks'; import { eventLoggerMock } from '../../../event_log/server/event_logger.mock'; import { IEventLogger } from '../../../event_log/server'; import { SavedObjectsErrorHelpers } from '../../../../../src/core/server'; -import { Alert, RecoveredActionGroup } from '../../common'; import { omit } from 'lodash'; -import { UntypedNormalizedRuleType } from '../rule_type_registry'; import { ruleTypeRegistryMock } from '../rule_type_registry.mock'; import { ExecuteOptions } from '../../../actions/server/create_execute_function'; import moment from 'moment'; +import { + generateActionSO, + generateAlertSO, + generateEventLog, + mockDate, + mockedRuleTypeSavedObject, + mockRunNowResponse, + ruleType, + RULE_NAME, + SAVED_OBJECT, + generateRunnerResult, + RULE_ACTIONS, + generateEnqueueFunctionInput, + SAVED_OBJECT_UPDATE_PARAMS, + mockTaskInstance, + GENERIC_ERROR_MESSAGE, + generateAlertInstance, + MOCK_DURATION, + DATE_1969, + DATE_1970, + DATE_1970_5_MIN, +} from './fixtures'; +import { EVENT_LOG_ACTIONS } from '../plugin'; jest.mock('uuid', () => ({ v4: () => '5f6aa57d-3e22-484e-bae8-cbed868f4d28', })); + jest.mock('../lib/wrap_scoped_cluster_client', () => ({ createWrappedScopedClusterClientFactory: jest.fn(), })); -const ruleType: jest.Mocked = { - id: 'test', - name: 'My test rule', - actionGroups: [{ id: 'default', name: 'Default' }, RecoveredActionGroup], - defaultActionGroupId: 'default', - minimumLicenseRequired: 'basic', - isExportable: true, - recoveryActionGroup: RecoveredActionGroup, - executor: jest.fn(), - producer: 'alerts', -}; - let fakeTimer: sinon.SinonFakeTimers; const mockUsageCountersSetup = usageCountersServiceMock.createSetupContract(); @@ -74,23 +83,7 @@ describe('Task Runner', () => { beforeAll(() => { fakeTimer = sinon.useFakeTimers(); - mockedTaskInstance = { - id: '', - attempts: 0, - status: TaskStatus.Running, - version: '123', - runAt: new Date(), - schedule: { interval: '10s' }, - scheduledAt: new Date(), - startedAt: new Date(), - retryAt: new Date(Date.now() + 5 * 60 * 1000), - state: {}, - taskType: 'alerting:test', - params: { - alertId: '1', - }, - ownerId: null, - }; + mockedTaskInstance = mockTaskInstance(); }); afterAll(() => fakeTimer.restore()); @@ -131,56 +124,6 @@ describe('Task Runner', () => { usageCounter: mockUsageCounter, }; - const mockDate = new Date('2019-02-12T21:01:22.479Z'); - const mockedRuleTypeSavedObject: Alert = { - id: '1', - consumer: 'bar', - createdAt: mockDate, - updatedAt: mockDate, - throttle: null, - muteAll: false, - notifyWhen: 'onActiveAlert', - enabled: true, - alertTypeId: ruleType.id, - apiKey: '', - apiKeyOwner: 'elastic', - schedule: { interval: '10s' }, - name: 'rule-name', - tags: ['rule-', '-tags'], - createdBy: 'rule-creator', - updatedBy: 'rule-updater', - mutedInstanceIds: [], - params: { - bar: true, - }, - actions: [ - { - group: 'default', - id: '1', - actionTypeId: 'action', - params: { - foo: true, - }, - }, - { - group: RecoveredActionGroup.id, - id: '2', - actionTypeId: 'action', - params: { - isResolved: true, - }, - }, - ], - executionStatus: { - status: 'unknown', - lastExecutionDate: new Date('2020-08-20T19:23:38Z'), - }, - monitoring: getDefaultRuleMonitoring(), - }; - const mockRunNowResponse = { - id: 1, - } as jest.ResolvedValue; - const ephemeralTestParams: Array< [ nameExtension: string, @@ -241,65 +184,25 @@ describe('Task Runner', () => { taskRunnerFactoryInitializerParams ); rulesClient.get.mockResolvedValue(mockedRuleTypeSavedObject); - encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue({ - id: '1', - type: 'alert', - attributes: { - apiKey: Buffer.from('123:abc').toString('base64'), - enabled: true, - }, - references: [], - }); + encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue(SAVED_OBJECT); const runnerResult = await taskRunner.run(); - expect(runnerResult).toMatchInlineSnapshot(` - Object { - "monitoring": Object { - "execution": Object { - "calculated_metrics": Object { - "success_ratio": 1, - }, - "history": Array [ - Object { - "success": true, - "timestamp": 0, - }, - ], - }, - }, - "schedule": Object { - "interval": "10s", - }, - "state": Object { - "alertInstances": Object {}, - "alertTypeState": undefined, - "previousStartedAt": 1970-01-01T00:00:00.000Z, - }, - } - `); + expect(runnerResult).toEqual(generateRunnerResult({ state: true, history: [true] })); expect(ruleType.executor).toHaveBeenCalledTimes(1); const call = ruleType.executor.mock.calls[0][0]; - expect(call.params).toMatchInlineSnapshot(` - Object { - "bar": true, - } - `); - expect(call.startedAt).toMatchInlineSnapshot(`1970-01-01T00:00:00.000Z`); - expect(call.previousStartedAt).toMatchInlineSnapshot(`1969-12-31T23:55:00.000Z`); - expect(call.state).toMatchInlineSnapshot(`Object {}`); - expect(call.name).toBe('rule-name'); + expect(call.params).toEqual({ bar: true }); + expect(call.startedAt).toStrictEqual(new Date(DATE_1970)); + expect(call.previousStartedAt).toStrictEqual(new Date(DATE_1970_5_MIN)); + expect(call.state).toEqual({}); + expect(call.name).toBe(RULE_NAME); expect(call.tags).toEqual(['rule-', '-tags']); expect(call.createdBy).toBe('rule-creator'); expect(call.updatedBy).toBe('rule-updater'); expect(call.rule).not.toBe(null); - expect(call.rule.name).toBe('rule-name'); + expect(call.rule.name).toBe(RULE_NAME); expect(call.rule.tags).toEqual(['rule-', '-tags']); expect(call.rule.consumer).toBe('bar'); expect(call.rule.enabled).toBe(true); - expect(call.rule.schedule).toMatchInlineSnapshot(` - Object { - "interval": "10s", - } - `); + expect(call.rule.schedule).toEqual({ interval: '10s' }); expect(call.rule.createdBy).toBe('rule-creator'); expect(call.rule.updatedBy).toBe('rule-updater'); expect(call.rule.createdAt).toBe(mockDate); @@ -309,26 +212,7 @@ describe('Task Runner', () => { expect(call.rule.producer).toBe('alerts'); expect(call.rule.ruleTypeId).toBe('test'); expect(call.rule.ruleTypeName).toBe('My test rule'); - expect(call.rule.actions).toMatchInlineSnapshot(` - Array [ - Object { - "actionTypeId": "action", - "group": "default", - "id": "1", - "params": Object { - "foo": true, - }, - }, - Object { - "actionTypeId": "action", - "group": "recovered", - "id": "2", - "params": Object { - "isResolved": true, - }, - }, - ] - `); + expect(call.rule.actions).toEqual(RULE_ACTIONS); expect(call.services.alertFactory.create).toBeTruthy(); expect(call.services.scopedClusterClient).toBeTruthy(); expect(call.services).toBeTruthy(); @@ -344,75 +228,16 @@ describe('Task Runner', () => { const eventLogger = taskRunnerFactoryInitializerParams.eventLogger; expect(eventLogger.logEvent).toHaveBeenCalledTimes(2); expect(eventLogger.startTiming).toHaveBeenCalledTimes(1); - expect(eventLogger.logEvent.mock.calls[0][0]).toMatchInlineSnapshot(` - Object { - "event": Object { - "action": "execute-start", - "category": Array [ - "alerts", - ], - "kind": "alert", - }, - "kibana": Object { - "alert": Object { - "rule": Object { - "execution": Object { - "uuid": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - }, - }, - }, - "saved_objects": Array [ - Object { - "id": "1", - "namespace": undefined, - "rel": "primary", - "type": "alert", - "type_id": "test", - }, - ], - "task": Object { - "schedule_delay": 0, - "scheduled": "1970-01-01T00:00:00.000Z", - }, - }, - "message": "rule execution start: \\"1\\"", - "rule": Object { - "category": "test", - "id": "1", - "license": "basic", - "ruleset": "alerts", - }, - } - `); + expect(eventLogger.logEvent).toHaveBeenCalledWith( + generateEventLog({ + task: true, + action: EVENT_LOG_ACTIONS.executeStart, + }) + ); expect( taskRunnerFactoryInitializerParams.internalSavedObjectsRepository.update - ).toHaveBeenCalledWith( - 'alert', - '1', - { - monitoring: { - execution: { - calculated_metrics: { - success_ratio: 1, - }, - history: [ - { - success: true, - timestamp: 0, - }, - ], - }, - }, - executionStatus: { - error: null, - lastDuration: 0, - lastExecutionDate: '1970-01-01T00:00:00.000Z', - status: 'ok', - }, - }, - { refresh: false, namespace: undefined } - ); + ).toHaveBeenCalledWith(...SAVED_OBJECT_UPDATE_PARAMS); expect(taskRunnerFactoryInitializerParams.executionContext.withContext).toBeCalledTimes(1); expect(taskRunnerFactoryInitializerParams.executionContext.withContext).toHaveBeenCalledWith( @@ -461,262 +286,74 @@ describe('Task Runner', () => { customTaskRunnerFactoryInitializerParams ); rulesClient.get.mockResolvedValue(mockedRuleTypeSavedObject); - encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue({ - id: '1', - type: 'alert', - attributes: { - apiKey: Buffer.from('123:abc').toString('base64'), - enabled: true, - }, - references: [], - }); + encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue(SAVED_OBJECT); await taskRunner.run(); expect(enqueueFunction).toHaveBeenCalledTimes(1); - expect((enqueueFunction as jest.Mock).mock.calls[0]).toMatchInlineSnapshot(` - Array [ - Object { - "apiKey": "MTIzOmFiYw==", - "executionId": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - "id": "1", - "params": Object { - "foo": true, - }, - "relatedSavedObjects": Array [ - Object { - "id": "1", - "namespace": undefined, - "type": "alert", - "typeId": "test", - }, - ], - "source": Object { - "source": Object { - "id": "1", - "type": "alert", - }, - "type": "SAVED_OBJECT", - }, - "spaceId": undefined, - }, - ] - `); + expect(enqueueFunction).toHaveBeenCalledWith(generateEnqueueFunctionInput()); const logger = customTaskRunnerFactoryInitializerParams.logger; expect(logger.debug).toHaveBeenCalledTimes(4); expect(logger.debug).nthCalledWith(1, 'executing rule test:1 at 1970-01-01T00:00:00.000Z'); expect(logger.debug).nthCalledWith( 2, - `rule test:1: 'rule-name' has 1 active alerts: [{\"instanceId\":\"1\",\"actionGroup\":\"default\"}]` + `rule test:1: '${RULE_NAME}' has 1 active alerts: [{\"instanceId\":\"1\",\"actionGroup\":\"default\"}]` ); expect(logger.debug).nthCalledWith( 3, 'ruleExecutionStatus for test:1: {"metrics":{"numSearches":3,"esSearchDurationMs":33,"totalSearchDurationMs":23423},"numberOfTriggeredActions":1,"lastExecutionDate":"1970-01-01T00:00:00.000Z","status":"active"}' ); - // ruleExecutionStatus for test:1: {\"lastExecutionDate\":\"1970-01-01T00:00:00.000Z\",\"status\":\"error\",\"error\":{\"reason\":\"unknown\",\"message\":\"Cannot read property 'catch' of undefined\"}} const eventLogger = customTaskRunnerFactoryInitializerParams.eventLogger; expect(eventLogger.logEvent).toHaveBeenCalledTimes(5); - expect(eventLogger.logEvent).toHaveBeenNthCalledWith(1, { - event: { - action: 'execute-start', - category: ['alerts'], - kind: 'alert', - }, - kibana: { - alert: { - rule: { - execution: { - uuid: '5f6aa57d-3e22-484e-bae8-cbed868f4d28', - }, - }, - }, - task: { - schedule_delay: 0, - scheduled: '1970-01-01T00:00:00.000Z', - }, - saved_objects: [ - { - id: '1', - namespace: undefined, - rel: 'primary', - type: 'alert', - type_id: 'test', - }, - ], - }, - message: `rule execution start: "1"`, - rule: { - category: 'test', - id: '1', - license: 'basic', - ruleset: 'alerts', - }, - }); - expect(eventLogger.logEvent).toHaveBeenNthCalledWith(2, { - event: { - action: 'new-instance', - category: ['alerts'], - kind: 'alert', + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 1, + generateEventLog({ + task: true, + action: EVENT_LOG_ACTIONS.executeStart, + }) + ); + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 2, + generateEventLog({ duration: 0, - start: '1970-01-01T00:00:00.000Z', - }, - kibana: { - alert: { - rule: { - execution: { - uuid: '5f6aa57d-3e22-484e-bae8-cbed868f4d28', - }, - }, - }, - alerting: { - action_group_id: 'default', - action_subgroup: 'subDefault', - instance_id: '1', - }, - saved_objects: [ - { - id: '1', - namespace: undefined, - rel: 'primary', - type: 'alert', - type_id: 'test', - }, - ], - }, - message: "test:1: 'rule-name' created new alert: '1'", - rule: { - category: 'test', - id: '1', - license: 'basic', - name: 'rule-name', - namespace: undefined, - ruleset: 'alerts', - }, - }); - expect(eventLogger.logEvent).toHaveBeenNthCalledWith(3, { - event: { - action: 'active-instance', - category: ['alerts'], + start: DATE_1970, + action: EVENT_LOG_ACTIONS.newInstance, + actionSubgroup: 'subDefault', + actionGroupId: 'default', + instanceId: '1', + }) + ); + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 3, + generateEventLog({ duration: 0, - kind: 'alert', - start: '1970-01-01T00:00:00.000Z', - }, - kibana: { - alert: { - rule: { - execution: { - uuid: '5f6aa57d-3e22-484e-bae8-cbed868f4d28', - }, - }, - }, - alerting: { - action_group_id: 'default', - action_subgroup: 'subDefault', - instance_id: '1', - }, - saved_objects: [ - { id: '1', namespace: undefined, rel: 'primary', type: 'alert', type_id: 'test' }, - ], - }, - message: - "test:1: 'rule-name' active alert: '1' in actionGroup(subgroup): 'default(subDefault)'", - rule: { - category: 'test', - id: '1', - license: 'basic', - name: 'rule-name', - namespace: undefined, - ruleset: 'alerts', - }, - }); - expect(eventLogger.logEvent).toHaveBeenNthCalledWith(4, { - event: { - action: 'execute-action', - category: ['alerts'], - kind: 'alert', - }, - kibana: { - alert: { - rule: { - execution: { - uuid: '5f6aa57d-3e22-484e-bae8-cbed868f4d28', - }, - }, - }, - alerting: { - instance_id: '1', - action_group_id: 'default', - action_subgroup: 'subDefault', - }, - saved_objects: [ - { - id: '1', - namespace: undefined, - rel: 'primary', - type: 'alert', - type_id: 'test', - }, - { - id: '1', - namespace: undefined, - type: 'action', - type_id: 'action', - }, - ], - }, - message: - "alert: test:1: 'rule-name' instanceId: '1' scheduled actionGroup(subgroup): 'default(subDefault)' action: action:1", - rule: { - category: 'test', - id: '1', - license: 'basic', - name: 'rule-name', - namespace: undefined, - ruleset: 'alerts', - }, - }); - expect(eventLogger.logEvent).toHaveBeenNthCalledWith(5, { - event: { action: 'execute', category: ['alerts'], kind: 'alert', outcome: 'success' }, - kibana: { - alert: { - rule: { - execution: { - uuid: '5f6aa57d-3e22-484e-bae8-cbed868f4d28', - metrics: { - number_of_searches: 3, - number_of_triggered_actions: 1, - es_search_duration_ms: 33, - total_search_duration_ms: 23423, - }, - }, - }, - }, - task: { - schedule_delay: 0, - scheduled: '1970-01-01T00:00:00.000Z', - }, - alerting: { - status: 'active', - }, - saved_objects: [ - { - id: '1', - namespace: undefined, - rel: 'primary', - type: 'alert', - type_id: 'test', - }, - ], - }, - message: "rule executed: test:1: 'rule-name'", - rule: { - category: 'test', - id: '1', - license: 'basic', - name: 'rule-name', - ruleset: 'alerts', - }, - }); + start: DATE_1970, + action: EVENT_LOG_ACTIONS.activeInstance, + actionGroupId: 'default', + actionSubgroup: 'subDefault', + instanceId: '1', + }) + ); + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 4, + generateEventLog({ + action: EVENT_LOG_ACTIONS.executeAction, + actionGroupId: 'default', + instanceId: '1', + actionSubgroup: 'subDefault', + savedObjects: [generateAlertSO('1'), generateActionSO('1')], + }) + ); + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 5, + generateEventLog({ + action: EVENT_LOG_ACTIONS.execute, + outcome: 'success', + status: 'active', + numberOfTriggeredActions: 1, + task: true, + }) + ); expect(mockUsageCounter.incrementCounter).not.toHaveBeenCalled(); } ); @@ -746,15 +383,7 @@ describe('Task Runner', () => { ...mockedRuleTypeSavedObject, muteAll: true, }); - encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue({ - id: '1', - type: 'alert', - attributes: { - apiKey: Buffer.from('123:abc').toString('base64'), - enabled: true, - }, - references: [], - }); + encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue(SAVED_OBJECT); await taskRunner.run(); expect(actionsClient.ephemeralEnqueuedExecution).toHaveBeenCalledTimes(0); @@ -763,11 +392,11 @@ describe('Task Runner', () => { expect(logger.debug).nthCalledWith(1, 'executing rule test:1 at 1970-01-01T00:00:00.000Z'); expect(logger.debug).nthCalledWith( 2, - `rule test:1: 'rule-name' has 1 active alerts: [{\"instanceId\":\"1\",\"actionGroup\":\"default\"}]` + `rule test:1: '${RULE_NAME}' has 1 active alerts: [{\"instanceId\":\"1\",\"actionGroup\":\"default\"}]` ); expect(logger.debug).nthCalledWith( 3, - `no scheduling of actions for rule test:1: 'rule-name': rule is muted.` + `no scheduling of actions for rule test:1: '${RULE_NAME}': rule is muted.` ); expect(logger.debug).nthCalledWith( 4, @@ -777,169 +406,43 @@ describe('Task Runner', () => { const eventLogger = taskRunnerFactoryInitializerParams.eventLogger; expect(eventLogger.startTiming).toHaveBeenCalledTimes(1); expect(eventLogger.logEvent).toHaveBeenCalledTimes(4); - expect(eventLogger.logEvent).toHaveBeenNthCalledWith(1, { - event: { - action: 'execute-start', - category: ['alerts'], - kind: 'alert', - }, - kibana: { - task: { - schedule_delay: 0, - scheduled: '1970-01-01T00:00:00.000Z', - }, - alert: { - rule: { - execution: { - uuid: '5f6aa57d-3e22-484e-bae8-cbed868f4d28', - }, - }, - }, - saved_objects: [ - { - id: '1', - namespace: undefined, - rel: 'primary', - type: 'alert', - type_id: 'test', - }, - ], - }, - message: `rule execution start: \"1\"`, - rule: { - category: 'test', - id: '1', - license: 'basic', - ruleset: 'alerts', - }, - }); - expect(eventLogger.logEvent).toHaveBeenNthCalledWith(2, { - event: { - action: 'new-instance', - category: ['alerts'], - kind: 'alert', + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 1, + generateEventLog({ + task: true, + action: EVENT_LOG_ACTIONS.executeStart, + }) + ); + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 2, + generateEventLog({ duration: 0, - start: '1970-01-01T00:00:00.000Z', - }, - kibana: { - alert: { - rule: { - execution: { - uuid: '5f6aa57d-3e22-484e-bae8-cbed868f4d28', - }, - }, - }, - alerting: { - action_group_id: 'default', - instance_id: '1', - }, - saved_objects: [ - { - id: '1', - namespace: undefined, - rel: 'primary', - type: 'alert', - type_id: 'test', - }, - ], - }, - message: "test:1: 'rule-name' created new alert: '1'", - rule: { - category: 'test', - id: '1', - license: 'basic', - name: 'rule-name', - namespace: undefined, - ruleset: 'alerts', - }, - }); - expect(eventLogger.logEvent).toHaveBeenNthCalledWith(3, { - event: { - action: 'active-instance', - category: ['alerts'], - kind: 'alert', + start: DATE_1970, + action: EVENT_LOG_ACTIONS.newInstance, + actionGroupId: 'default', + instanceId: '1', + }) + ); + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 3, + generateEventLog({ duration: 0, - start: '1970-01-01T00:00:00.000Z', - }, - kibana: { - alert: { - rule: { - execution: { - uuid: '5f6aa57d-3e22-484e-bae8-cbed868f4d28', - }, - }, - }, - alerting: { - instance_id: '1', - action_group_id: 'default', - }, - saved_objects: [ - { - id: '1', - namespace: undefined, - rel: 'primary', - type: 'alert', - type_id: 'test', - }, - ], - }, - message: "test:1: 'rule-name' active alert: '1' in actionGroup: 'default'", - rule: { - category: 'test', - id: '1', - license: 'basic', - name: 'rule-name', - namespace: undefined, - ruleset: 'alerts', - }, - }); - expect(eventLogger.logEvent).toHaveBeenNthCalledWith(4, { - event: { - action: 'execute', - category: ['alerts'], - kind: 'alert', + start: DATE_1970, + action: EVENT_LOG_ACTIONS.activeInstance, + actionGroupId: 'default', + instanceId: '1', + }) + ); + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 4, + generateEventLog({ + action: EVENT_LOG_ACTIONS.execute, outcome: 'success', - }, - kibana: { - alert: { - rule: { - execution: { - uuid: '5f6aa57d-3e22-484e-bae8-cbed868f4d28', - metrics: { - number_of_searches: 3, - number_of_triggered_actions: 0, - es_search_duration_ms: 33, - total_search_duration_ms: 23423, - }, - }, - }, - }, - alerting: { - status: 'active', - }, - task: { - schedule_delay: 0, - scheduled: '1970-01-01T00:00:00.000Z', - }, - saved_objects: [ - { - id: '1', - namespace: undefined, - rel: 'primary', - type: 'alert', - type_id: 'test', - }, - ], - }, - message: "rule executed: test:1: 'rule-name'", - rule: { - category: 'test', - id: '1', - license: 'basic', - name: 'rule-name', - ruleset: 'alerts', - }, - }); + status: 'active', + numberOfTriggeredActions: 0, + task: true, + }) + ); expect(mockUsageCounter.incrementCounter).not.toHaveBeenCalled(); }); @@ -976,15 +479,7 @@ describe('Task Runner', () => { ...mockedRuleTypeSavedObject, mutedInstanceIds: ['2'], }); - encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue({ - id: '1', - type: 'alert', - attributes: { - apiKey: Buffer.from('123:abc').toString('base64'), - enabled: true, - }, - references: [], - }); + encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue(SAVED_OBJECT); await taskRunner.run(); expect(enqueueFunction).toHaveBeenCalledTimes(1); @@ -993,11 +488,11 @@ describe('Task Runner', () => { expect(logger.debug).nthCalledWith(1, 'executing rule test:1 at 1970-01-01T00:00:00.000Z'); expect(logger.debug).nthCalledWith( 2, - `rule test:1: 'rule-name' has 2 active alerts: [{\"instanceId\":\"1\",\"actionGroup\":\"default\"},{\"instanceId\":\"2\",\"actionGroup\":\"default\"}]` + `rule test:1: '${RULE_NAME}' has 2 active alerts: [{\"instanceId\":\"1\",\"actionGroup\":\"default\"},{\"instanceId\":\"2\",\"actionGroup\":\"default\"}]` ); expect(logger.debug).nthCalledWith( 3, - `skipping scheduling of actions for '2' in rule test:1: 'rule-name': rule is muted` + `skipping scheduling of actions for '2' in rule test:1: '${RULE_NAME}': rule is muted` ); expect(logger.debug).nthCalledWith( 4, @@ -1044,8 +539,8 @@ describe('Task Runner', () => { }, state: { bar: false, - start: '1969-12-31T00:00:00.000Z', - duration: 86400000000000, + start: DATE_1969, + duration: MOCK_DURATION, }, }, }, @@ -1057,15 +552,7 @@ describe('Task Runner', () => { ...mockedRuleTypeSavedObject, throttle: '1d', }); - encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue({ - id: '1', - type: 'alert', - attributes: { - apiKey: Buffer.from('123:abc').toString('base64'), - enabled: true, - }, - references: [], - }); + encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue(SAVED_OBJECT); await taskRunner.run(); // expect(enqueueFunction).toHaveBeenCalledTimes(1); @@ -1073,7 +560,7 @@ describe('Task Runner', () => { // expect(logger.debug).toHaveBeenCalledTimes(5); expect(logger.debug).nthCalledWith( 3, - `skipping scheduling of actions for '2' in rule test:1: 'rule-name': rule is throttled` + `skipping scheduling of actions for '2' in rule test:1: '${RULE_NAME}': rule is throttled` ); } ); @@ -1108,22 +595,14 @@ describe('Task Runner', () => { mutedInstanceIds: ['2'], notifyWhen: 'onActionGroupChange', }); - encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue({ - id: '1', - type: 'alert', - attributes: { - apiKey: Buffer.from('123:abc').toString('base64'), - enabled: true, - }, - references: [], - }); + encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue(SAVED_OBJECT); await taskRunner.run(); expect(enqueueFunction).toHaveBeenCalledTimes(1); const logger = customTaskRunnerFactoryInitializerParams.logger; expect(logger.debug).toHaveBeenCalledTimes(5); expect(logger.debug).nthCalledWith( 3, - `skipping scheduling of actions for '2' in rule test:1: 'rule-name': rule is muted` + `skipping scheduling of actions for '2' in rule test:1: '${RULE_NAME}': rule is muted` ); } ); @@ -1153,12 +632,12 @@ describe('Task Runner', () => { alertInstances: { '1': { meta: { - lastScheduledActions: { date: '1970-01-01T00:00:00.000Z', group: 'default' }, + lastScheduledActions: { date: DATE_1970, group: 'default' }, }, state: { bar: false, - start: '1969-12-31T00:00:00.000Z', - duration: 86400000000000, + start: DATE_1969, + duration: MOCK_DURATION, }, }, }, @@ -1170,159 +649,40 @@ describe('Task Runner', () => { ...mockedRuleTypeSavedObject, notifyWhen: 'onActionGroupChange', }); - encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue({ - id: '1', - type: 'alert', - attributes: { - apiKey: Buffer.from('123:abc').toString('base64'), - enabled: true, - }, - references: [], - }); + encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue(SAVED_OBJECT); await taskRunner.run(); expect(actionsClient.ephemeralEnqueuedExecution).toHaveBeenCalledTimes(0); const eventLogger = taskRunnerFactoryInitializerParams.eventLogger; expect(eventLogger.logEvent).toHaveBeenCalledTimes(3); expect(eventLogger.startTiming).toHaveBeenCalledTimes(1); - expect(eventLogger.logEvent.mock.calls).toMatchInlineSnapshot(` - Array [ - Array [ - Object { - "event": Object { - "action": "execute-start", - "category": Array [ - "alerts", - ], - "kind": "alert", - }, - "kibana": Object { - "alert": Object { - "rule": Object { - "execution": Object { - "uuid": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - }, - }, - }, - "saved_objects": Array [ - Object { - "id": "1", - "namespace": undefined, - "rel": "primary", - "type": "alert", - "type_id": "test", - }, - ], - "task": Object { - "schedule_delay": 0, - "scheduled": "1970-01-01T00:00:00.000Z", - }, - }, - "message": "rule execution start: \\"1\\"", - "rule": Object { - "category": "test", - "id": "1", - "license": "basic", - "ruleset": "alerts", - }, - }, - ], - Array [ - Object { - "event": Object { - "action": "active-instance", - "category": Array [ - "alerts", - ], - "duration": 86400000000000, - "kind": "alert", - "start": "1969-12-31T00:00:00.000Z", - }, - "kibana": Object { - "alert": Object { - "rule": Object { - "execution": Object { - "uuid": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - }, - }, - }, - "alerting": Object { - "action_group_id": "default", - "instance_id": "1", - }, - "saved_objects": Array [ - Object { - "id": "1", - "namespace": undefined, - "rel": "primary", - "type": "alert", - "type_id": "test", - }, - ], - }, - "message": "test:1: 'rule-name' active alert: '1' in actionGroup: 'default'", - "rule": Object { - "category": "test", - "id": "1", - "license": "basic", - "name": "rule-name", - "ruleset": "alerts", - }, - }, - ], - Array [ - Object { - "event": Object { - "action": "execute", - "category": Array [ - "alerts", - ], - "kind": "alert", - "outcome": "success", - }, - "kibana": Object { - "alert": Object { - "rule": Object { - "execution": Object { - "metrics": Object { - "es_search_duration_ms": 33, - "number_of_searches": 3, - "number_of_triggered_actions": 0, - "total_search_duration_ms": 23423, - }, - "uuid": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - }, - }, - }, - "alerting": Object { - "status": "active", - }, - "saved_objects": Array [ - Object { - "id": "1", - "namespace": undefined, - "rel": "primary", - "type": "alert", - "type_id": "test", - }, - ], - "task": Object { - "schedule_delay": 0, - "scheduled": "1970-01-01T00:00:00.000Z", - }, - }, - "message": "rule executed: test:1: 'rule-name'", - "rule": Object { - "category": "test", - "id": "1", - "license": "basic", - "name": "rule-name", - "ruleset": "alerts", - }, - }, - ], - ] - `); + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 1, + generateEventLog({ + task: true, + action: EVENT_LOG_ACTIONS.executeStart, + }) + ); + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 2, + generateEventLog({ + duration: MOCK_DURATION, + start: DATE_1969, + action: EVENT_LOG_ACTIONS.activeInstance, + actionGroupId: 'default', + instanceId: '1', + }) + ); + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 3, + generateEventLog({ + action: EVENT_LOG_ACTIONS.execute, + outcome: 'success', + status: 'active', + numberOfTriggeredActions: 0, + task: true, + }) + ); expect(mockUsageCounter.incrementCounter).not.toHaveBeenCalled(); }); @@ -1370,35 +730,19 @@ describe('Task Runner', () => { ...mockedRuleTypeSavedObject, notifyWhen: 'onActionGroupChange', }); - encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue({ - id: '1', - type: 'alert', - attributes: { - apiKey: Buffer.from('123:abc').toString('base64'), - enabled: true, - }, - references: [], - }); + encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue(SAVED_OBJECT); const eventLogger = customTaskRunnerFactoryInitializerParams.eventLogger; await taskRunner.run(); - expect(eventLogger.logEvent.mock.calls[3][0]).toEqual( - expect.objectContaining({ - kibana: expect.objectContaining({ - alert: expect.objectContaining({ - rule: expect.objectContaining({ - execution: expect.objectContaining({ - metrics: expect.objectContaining({ - number_of_searches: 3, - number_of_triggered_actions: 1, - es_search_duration_ms: 33, - total_search_duration_ms: 23423, - }), - }), - }), - }), - }), + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 4, + generateEventLog({ + action: EVENT_LOG_ACTIONS.execute, + outcome: 'success', + status: 'active', + numberOfTriggeredActions: 1, + task: true, }) ); expect(enqueueFunction).toHaveBeenCalledTimes(1); @@ -1457,37 +801,22 @@ describe('Task Runner', () => { ...mockedRuleTypeSavedObject, notifyWhen: 'onActionGroupChange', }); - encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue({ - id: '1', - type: 'alert', - attributes: { - apiKey: Buffer.from('123:abc').toString('base64'), - enabled: true, - }, - references: [], - }); + encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue(SAVED_OBJECT); await taskRunner.run(); const eventLogger = customTaskRunnerFactoryInitializerParams.eventLogger; - expect(eventLogger.logEvent.mock.calls[3][0]).toEqual( - expect.objectContaining({ - kibana: expect.objectContaining({ - alert: expect.objectContaining({ - rule: expect.objectContaining({ - execution: expect.objectContaining({ - metrics: expect.objectContaining({ - number_of_searches: 3, - number_of_triggered_actions: 1, - es_search_duration_ms: 33, - total_search_duration_ms: 23423, - }), - }), - }), - }), - }), + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 4, + generateEventLog({ + action: EVENT_LOG_ACTIONS.execute, + outcome: 'success', + status: 'active', + numberOfTriggeredActions: 1, + task: true, }) ); + expect(enqueueFunction).toHaveBeenCalledTimes(1); expect(mockUsageCounter.incrementCounter).not.toHaveBeenCalled(); } @@ -1522,15 +851,7 @@ describe('Task Runner', () => { customTaskRunnerFactoryInitializerParams ); rulesClient.get.mockResolvedValue(mockedRuleTypeSavedObject); - encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValueOnce({ - id: '1', - type: 'alert', - attributes: { - apiKey: Buffer.from('123:abc').toString('base64'), - enabled: true, - }, - references: [], - }); + encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValueOnce(SAVED_OBJECT); await taskRunner.run(); expect( customTaskRunnerFactoryInitializerParams.actionsPlugin.getActionsClientWithRequest @@ -1553,266 +874,58 @@ describe('Task Runner', () => { ); expect(enqueueFunction).toHaveBeenCalledTimes(1); - expect((enqueueFunction as jest.Mock).mock.calls[0]).toMatchInlineSnapshot(` - Array [ - Object { - "apiKey": "MTIzOmFiYw==", - "executionId": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - "id": "1", - "params": Object { - "foo": true, - }, - "relatedSavedObjects": Array [ - Object { - "id": "1", - "namespace": undefined, - "type": "alert", - "typeId": "test", - }, - ], - "source": Object { - "source": Object { - "id": "1", - "type": "alert", - }, - "type": "SAVED_OBJECT", - }, - "spaceId": undefined, - }, - ] - `); + expect(enqueueFunction).toHaveBeenCalledWith(generateEnqueueFunctionInput()); const eventLogger = customTaskRunnerFactoryInitializerParams.eventLogger; expect(eventLogger.logEvent).toHaveBeenCalledTimes(5); expect(eventLogger.startTiming).toHaveBeenCalledTimes(1); - expect(eventLogger.logEvent.mock.calls).toMatchInlineSnapshot(` - Array [ - Array [ - Object { - "event": Object { - "action": "execute-start", - "category": Array [ - "alerts", - ], - "kind": "alert", - }, - "kibana": Object { - "alert": Object { - "rule": Object { - "execution": Object { - "uuid": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - }, - }, - }, - "saved_objects": Array [ - Object { - "id": "1", - "namespace": undefined, - "rel": "primary", - "type": "alert", - "type_id": "test", - }, - ], - "task": Object { - "schedule_delay": 0, - "scheduled": "1970-01-01T00:00:00.000Z", - }, - }, - "message": "rule execution start: \\"1\\"", - "rule": Object { - "category": "test", - "id": "1", - "license": "basic", - "ruleset": "alerts", - }, - }, - ], - Array [ - Object { - "event": Object { - "action": "new-instance", - "category": Array [ - "alerts", - ], - "duration": 0, - "kind": "alert", - "start": "1970-01-01T00:00:00.000Z", - }, - "kibana": Object { - "alert": Object { - "rule": Object { - "execution": Object { - "uuid": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - }, - }, - }, - "alerting": Object { - "action_group_id": "default", - "instance_id": "1", - }, - "saved_objects": Array [ - Object { - "id": "1", - "namespace": undefined, - "rel": "primary", - "type": "alert", - "type_id": "test", - }, - ], - }, - "message": "test:1: 'rule-name' created new alert: '1'", - "rule": Object { - "category": "test", - "id": "1", - "license": "basic", - "name": "rule-name", - "ruleset": "alerts", - }, - }, - ], - Array [ - Object { - "event": Object { - "action": "active-instance", - "category": Array [ - "alerts", - ], - "duration": 0, - "kind": "alert", - "start": "1970-01-01T00:00:00.000Z", - }, - "kibana": Object { - "alert": Object { - "rule": Object { - "execution": Object { - "uuid": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - }, - }, - }, - "alerting": Object { - "action_group_id": "default", - "instance_id": "1", - }, - "saved_objects": Array [ - Object { - "id": "1", - "namespace": undefined, - "rel": "primary", - "type": "alert", - "type_id": "test", - }, - ], - }, - "message": "test:1: 'rule-name' active alert: '1' in actionGroup: 'default'", - "rule": Object { - "category": "test", - "id": "1", - "license": "basic", - "name": "rule-name", - "ruleset": "alerts", - }, - }, - ], - Array [ - Object { - "event": Object { - "action": "execute-action", - "category": Array [ - "alerts", - ], - "kind": "alert", - }, - "kibana": Object { - "alert": Object { - "rule": Object { - "execution": Object { - "uuid": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - }, - }, - }, - "alerting": Object { - "action_group_id": "default", - "instance_id": "1", - }, - "saved_objects": Array [ - Object { - "id": "1", - "namespace": undefined, - "rel": "primary", - "type": "alert", - "type_id": "test", - }, - Object { - "id": "1", - "namespace": undefined, - "type": "action", - "type_id": "action", - }, - ], - }, - "message": "alert: test:1: 'rule-name' instanceId: '1' scheduled actionGroup: 'default' action: action:1", - "rule": Object { - "category": "test", - "id": "1", - "license": "basic", - "name": "rule-name", - "ruleset": "alerts", - }, - }, - ], - Array [ - Object { - "event": Object { - "action": "execute", - "category": Array [ - "alerts", - ], - "kind": "alert", - "outcome": "success", - }, - "kibana": Object { - "alert": Object { - "rule": Object { - "execution": Object { - "metrics": Object { - "es_search_duration_ms": 33, - "number_of_searches": 3, - "number_of_triggered_actions": 1, - "total_search_duration_ms": 23423, - }, - "uuid": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - }, - }, - }, - "alerting": Object { - "status": "active", - }, - "saved_objects": Array [ - Object { - "id": "1", - "namespace": undefined, - "rel": "primary", - "type": "alert", - "type_id": "test", - }, - ], - "task": Object { - "schedule_delay": 0, - "scheduled": "1970-01-01T00:00:00.000Z", - }, - }, - "message": "rule executed: test:1: 'rule-name'", - "rule": Object { - "category": "test", - "id": "1", - "license": "basic", - "name": "rule-name", - "ruleset": "alerts", - }, - }, - ], - ] - `); + + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 1, + generateEventLog({ + task: true, + action: EVENT_LOG_ACTIONS.executeStart, + }) + ); + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 2, + generateEventLog({ + duration: 0, + start: DATE_1970, + action: EVENT_LOG_ACTIONS.newInstance, + actionGroupId: 'default', + instanceId: '1', + }) + ); + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 3, + generateEventLog({ + duration: 0, + start: DATE_1970, + action: EVENT_LOG_ACTIONS.activeInstance, + actionGroupId: 'default', + instanceId: '1', + }) + ); + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 4, + generateEventLog({ + action: EVENT_LOG_ACTIONS.executeAction, + actionGroupId: 'default', + instanceId: '1', + savedObjects: [generateAlertSO('1'), generateActionSO('1')], + }) + ); + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 5, + generateEventLog({ + action: EVENT_LOG_ACTIONS.execute, + outcome: 'success', + status: 'active', + numberOfTriggeredActions: 1, + task: true, + }) + ); expect(mockUsageCounter.incrementCounter).not.toHaveBeenCalled(); } ); @@ -1852,7 +965,7 @@ describe('Task Runner', () => { meta: {}, state: { bar: false, - start: '1969-12-31T00:00:00.000Z', + start: DATE_1969, duration: 80000000000, }, }, @@ -1870,45 +983,22 @@ describe('Task Runner', () => { customTaskRunnerFactoryInitializerParams ); rulesClient.get.mockResolvedValue(mockedRuleTypeSavedObject); - encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue({ - id: '1', - type: 'alert', - attributes: { - apiKey: Buffer.from('123:abc').toString('base64'), - enabled: true, - }, - references: [], - }); + encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue(SAVED_OBJECT); const runnerResult = await taskRunner.run(); - expect(runnerResult.state.alertInstances).toMatchInlineSnapshot(` - Object { - "1": Object { - "meta": Object { - "lastScheduledActions": Object { - "date": 1970-01-01T00:00:00.000Z, - "group": "default", - "subgroup": undefined, - }, - }, - "state": Object { - "bar": false, - "duration": 86400000000000, - "start": "1969-12-31T00:00:00.000Z", - }, - }, - } - `); + expect(runnerResult.state.alertInstances).toEqual( + generateAlertInstance({ id: 1, duration: MOCK_DURATION, start: DATE_1969 }) + ); const logger = customTaskRunnerFactoryInitializerParams.logger; expect(logger.debug).toHaveBeenCalledTimes(5); expect(logger.debug).nthCalledWith(1, 'executing rule test:1 at 1970-01-01T00:00:00.000Z'); expect(logger.debug).nthCalledWith( 2, - `rule test:1: 'rule-name' has 1 active alerts: [{\"instanceId\":\"1\",\"actionGroup\":\"default\"}]` + `rule test:1: '${RULE_NAME}' has 1 active alerts: [{\"instanceId\":\"1\",\"actionGroup\":\"default\"}]` ); expect(logger.debug).nthCalledWith( 3, - `rule test:1: 'rule-name' has 1 recovered alerts: [\"2\"]` + `rule test:1: '${RULE_NAME}' has 1 recovered alerts: [\"2\"]` ); expect(logger.debug).nthCalledWith( 4, @@ -1918,311 +1008,66 @@ describe('Task Runner', () => { const eventLogger = customTaskRunnerFactoryInitializerParams.eventLogger; expect(eventLogger.logEvent).toHaveBeenCalledTimes(6); expect(eventLogger.startTiming).toHaveBeenCalledTimes(1); - expect(eventLogger.logEvent.mock.calls).toMatchInlineSnapshot(` - Array [ - Array [ - Object { - "event": Object { - "action": "execute-start", - "category": Array [ - "alerts", - ], - "kind": "alert", - }, - "kibana": Object { - "alert": Object { - "rule": Object { - "execution": Object { - "uuid": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - }, - }, - }, - "saved_objects": Array [ - Object { - "id": "1", - "namespace": undefined, - "rel": "primary", - "type": "alert", - "type_id": "test", - }, - ], - "task": Object { - "schedule_delay": 0, - "scheduled": "1970-01-01T00:00:00.000Z", - }, - }, - "message": "rule execution start: \\"1\\"", - "rule": Object { - "category": "test", - "id": "1", - "license": "basic", - "ruleset": "alerts", - }, - }, - ], - Array [ - Object { - "event": Object { - "action": "recovered-instance", - "category": Array [ - "alerts", - ], - "duration": 64800000000000, - "end": "1970-01-01T00:00:00.000Z", - "kind": "alert", - "start": "1969-12-31T06:00:00.000Z", - }, - "kibana": Object { - "alert": Object { - "rule": Object { - "execution": Object { - "uuid": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - }, - }, - }, - "alerting": Object { - "instance_id": "2", - }, - "saved_objects": Array [ - Object { - "id": "1", - "namespace": undefined, - "rel": "primary", - "type": "alert", - "type_id": "test", - }, - ], - }, - "message": "test:1: 'rule-name' alert '2' has recovered", - "rule": Object { - "category": "test", - "id": "1", - "license": "basic", - "name": "rule-name", - "ruleset": "alerts", - }, - }, - ], - Array [ - Object { - "event": Object { - "action": "active-instance", - "category": Array [ - "alerts", - ], - "duration": 86400000000000, - "kind": "alert", - "start": "1969-12-31T00:00:00.000Z", - }, - "kibana": Object { - "alert": Object { - "rule": Object { - "execution": Object { - "uuid": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - }, - }, - }, - "alerting": Object { - "action_group_id": "default", - "instance_id": "1", - }, - "saved_objects": Array [ - Object { - "id": "1", - "namespace": undefined, - "rel": "primary", - "type": "alert", - "type_id": "test", - }, - ], - }, - "message": "test:1: 'rule-name' active alert: '1' in actionGroup: 'default'", - "rule": Object { - "category": "test", - "id": "1", - "license": "basic", - "name": "rule-name", - "ruleset": "alerts", - }, - }, - ], - Array [ - Object { - "event": Object { - "action": "execute-action", - "category": Array [ - "alerts", - ], - "kind": "alert", - }, - "kibana": Object { - "alert": Object { - "rule": Object { - "execution": Object { - "uuid": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - }, - }, - }, - "alerting": Object { - "action_group_id": "recovered", - "instance_id": "2", - }, - "saved_objects": Array [ - Object { - "id": "1", - "namespace": undefined, - "rel": "primary", - "type": "alert", - "type_id": "test", - }, - Object { - "id": "2", - "namespace": undefined, - "type": "action", - "type_id": "action", - }, - ], - }, - "message": "alert: test:1: 'rule-name' instanceId: '2' scheduled actionGroup: 'recovered' action: action:2", - "rule": Object { - "category": "test", - "id": "1", - "license": "basic", - "name": "rule-name", - "ruleset": "alerts", - }, - }, - ], - Array [ - Object { - "event": Object { - "action": "execute-action", - "category": Array [ - "alerts", - ], - "kind": "alert", - }, - "kibana": Object { - "alert": Object { - "rule": Object { - "execution": Object { - "uuid": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - }, - }, - }, - "alerting": Object { - "action_group_id": "default", - "instance_id": "1", - }, - "saved_objects": Array [ - Object { - "id": "1", - "namespace": undefined, - "rel": "primary", - "type": "alert", - "type_id": "test", - }, - Object { - "id": "1", - "namespace": undefined, - "type": "action", - "type_id": "action", - }, - ], - }, - "message": "alert: test:1: 'rule-name' instanceId: '1' scheduled actionGroup: 'default' action: action:1", - "rule": Object { - "category": "test", - "id": "1", - "license": "basic", - "name": "rule-name", - "ruleset": "alerts", - }, - }, - ], - Array [ - Object { - "event": Object { - "action": "execute", - "category": Array [ - "alerts", - ], - "kind": "alert", - "outcome": "success", - }, - "kibana": Object { - "alert": Object { - "rule": Object { - "execution": Object { - "metrics": Object { - "es_search_duration_ms": 33, - "number_of_searches": 3, - "number_of_triggered_actions": 2, - "total_search_duration_ms": 23423, - }, - "uuid": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - }, - }, - }, - "alerting": Object { - "status": "active", - }, - "saved_objects": Array [ - Object { - "id": "1", - "namespace": undefined, - "rel": "primary", - "type": "alert", - "type_id": "test", - }, - ], - "task": Object { - "schedule_delay": 0, - "scheduled": "1970-01-01T00:00:00.000Z", - }, - }, - "message": "rule executed: test:1: 'rule-name'", - "rule": Object { - "category": "test", - "id": "1", - "license": "basic", - "name": "rule-name", - "ruleset": "alerts", - }, - }, - ], - ] - `); + + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 1, + generateEventLog({ + task: true, + action: EVENT_LOG_ACTIONS.executeStart, + }) + ); + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 2, + generateEventLog({ + action: EVENT_LOG_ACTIONS.recoveredInstance, + duration: 64800000000000, + instanceId: '2', + start: '1969-12-31T06:00:00.000Z', + end: DATE_1970, + }) + ); + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 3, + generateEventLog({ + action: EVENT_LOG_ACTIONS.activeInstance, + actionGroupId: 'default', + duration: MOCK_DURATION, + start: DATE_1969, + instanceId: '1', + }) + ); + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 4, + generateEventLog({ + action: EVENT_LOG_ACTIONS.executeAction, + savedObjects: [generateAlertSO('1'), generateActionSO('2')], + actionGroupId: 'recovered', + instanceId: '2', + }) + ); + + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 5, + generateEventLog({ + action: EVENT_LOG_ACTIONS.executeAction, + savedObjects: [generateAlertSO('1'), generateActionSO('1')], + actionGroupId: 'default', + instanceId: '1', + }) + ); + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 6, + generateEventLog({ + action: EVENT_LOG_ACTIONS.execute, + outcome: 'success', + status: 'active', + numberOfTriggeredActions: 2, + task: true, + }) + ); expect(enqueueFunction).toHaveBeenCalledTimes(2); - expect((enqueueFunction as jest.Mock).mock.calls[0]).toMatchInlineSnapshot(` - Array [ - Object { - "apiKey": "MTIzOmFiYw==", - "executionId": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - "id": "2", - "params": Object { - "isResolved": true, - }, - "relatedSavedObjects": Array [ - Object { - "id": "1", - "namespace": undefined, - "type": "alert", - "typeId": "test", - }, - ], - "source": Object { - "source": Object { - "id": "1", - "type": "alert", - }, - "type": "SAVED_OBJECT", - }, - "spaceId": undefined, - }, - ] - `); + expect(enqueueFunction).toHaveBeenCalledWith(generateEnqueueFunctionInput()); expect(mockUsageCounter.incrementCounter).not.toHaveBeenCalled(); } ); @@ -2273,41 +1118,18 @@ describe('Task Runner', () => { customTaskRunnerFactoryInitializerParams ); rulesClient.get.mockResolvedValue(mockedRuleTypeSavedObject); - encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue({ - id: alertId, - type: 'alert', - attributes: { - apiKey: Buffer.from('123:abc').toString('base64'), - enabled: true, - }, - references: [], - }); + encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue(SAVED_OBJECT); const runnerResult = await taskRunner.run(); - expect(runnerResult.state.alertInstances).toMatchInlineSnapshot(` - Object { - "1": Object { - "meta": Object { - "lastScheduledActions": Object { - "date": 1970-01-01T00:00:00.000Z, - "group": "default", - "subgroup": undefined, - }, - }, - "state": Object { - "bar": false, - }, - }, - } - `); + expect(runnerResult.state.alertInstances).toEqual(generateAlertInstance()); const logger = customTaskRunnerFactoryInitializerParams.logger; expect(logger.debug).toHaveBeenCalledWith( - `rule test:${alertId}: 'rule-name' has 1 active alerts: [{\"instanceId\":\"1\",\"actionGroup\":\"default\"}]` + `rule test:${alertId}: '${RULE_NAME}' has 1 active alerts: [{\"instanceId\":\"1\",\"actionGroup\":\"default\"}]` ); expect(logger.debug).nthCalledWith( 3, - `rule test:${alertId}: 'rule-name' has 1 recovered alerts: [\"2\"]` + `rule test:${alertId}: '${RULE_NAME}' has 1 recovered alerts: [\"2\"]` ); expect(logger.debug).nthCalledWith( 4, @@ -2393,64 +1215,14 @@ describe('Task Runner', () => { }, ], }); - encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue({ - id: '1', - type: 'alert', - attributes: { - apiKey: Buffer.from('123:abc').toString('base64'), - enabled: true, - }, - references: [], - }); + encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue(SAVED_OBJECT); const runnerResult = await taskRunner.run(); - expect(runnerResult.state.alertInstances).toMatchInlineSnapshot(` - Object { - "1": Object { - "meta": Object { - "lastScheduledActions": Object { - "date": 1970-01-01T00:00:00.000Z, - "group": "default", - "subgroup": undefined, - }, - }, - "state": Object { - "bar": false, - }, - }, - } - `); + expect(runnerResult.state.alertInstances).toEqual(generateAlertInstance()); const eventLogger = customTaskRunnerFactoryInitializerParams.eventLogger; expect(eventLogger.logEvent).toHaveBeenCalledTimes(6); expect(enqueueFunction).toHaveBeenCalledTimes(2); - expect((enqueueFunction as jest.Mock).mock.calls[0]).toMatchInlineSnapshot(` - Array [ - Object { - "apiKey": "MTIzOmFiYw==", - "executionId": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - "id": "2", - "params": Object { - "isResolved": true, - }, - "relatedSavedObjects": Array [ - Object { - "id": "1", - "namespace": undefined, - "type": "alert", - "typeId": "test", - }, - ], - "source": Object { - "source": Object { - "id": "1", - "type": "alert", - }, - "type": "SAVED_OBJECT", - }, - "spaceId": undefined, - }, - ] - `); + expect(enqueueFunction).toHaveBeenCalledWith(generateEnqueueFunctionInput()); expect(mockUsageCounter.incrementCounter).not.toHaveBeenCalled(); } ); @@ -2481,7 +1253,7 @@ describe('Task Runner', () => { meta: { lastScheduledActions: { group: 'default', date } }, state: { bar: false, - start: '1969-12-31T00:00:00.000Z', + start: DATE_1969, duration: 80000000000, }, }, @@ -2499,222 +1271,56 @@ describe('Task Runner', () => { taskRunnerFactoryInitializerParams ); rulesClient.get.mockResolvedValue(mockedRuleTypeSavedObject); - encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue({ - id: '1', - type: 'alert', - attributes: { - apiKey: Buffer.from('123:abc').toString('base64'), - enabled: true, - }, - references: [], - }); + encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue(SAVED_OBJECT); const runnerResult = await taskRunner.run(); - expect(runnerResult.state.alertInstances).toMatchInlineSnapshot(` - Object { - "1": Object { - "meta": Object { - "lastScheduledActions": Object { - "date": 1970-01-01T00:00:00.000Z, - "group": "default", - "subgroup": undefined, - }, - }, - "state": Object { - "bar": false, - "duration": 86400000000000, - "start": "1969-12-31T00:00:00.000Z", - }, - }, - } - `); + expect(runnerResult.state.alertInstances).toEqual( + generateAlertInstance({ id: 1, duration: MOCK_DURATION, start: DATE_1969 }) + ); const eventLogger = taskRunnerFactoryInitializerParams.eventLogger; expect(eventLogger.logEvent).toHaveBeenCalledTimes(4); expect(eventLogger.startTiming).toHaveBeenCalledTimes(1); - expect(eventLogger.logEvent.mock.calls).toMatchInlineSnapshot(` - Array [ - Array [ - Object { - "event": Object { - "action": "execute-start", - "category": Array [ - "alerts", - ], - "kind": "alert", - }, - "kibana": Object { - "alert": Object { - "rule": Object { - "execution": Object { - "uuid": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - }, - }, - }, - "saved_objects": Array [ - Object { - "id": "1", - "namespace": undefined, - "rel": "primary", - "type": "alert", - "type_id": "test", - }, - ], - "task": Object { - "schedule_delay": 0, - "scheduled": "1970-01-01T00:00:00.000Z", - }, - }, - "message": "rule execution start: \\"1\\"", - "rule": Object { - "category": "test", - "id": "1", - "license": "basic", - "ruleset": "alerts", - }, - }, - ], - Array [ - Object { - "event": Object { - "action": "recovered-instance", - "category": Array [ - "alerts", - ], - "duration": 64800000000000, - "end": "1970-01-01T00:00:00.000Z", - "kind": "alert", - "start": "1969-12-31T06:00:00.000Z", - }, - "kibana": Object { - "alert": Object { - "rule": Object { - "execution": Object { - "uuid": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - }, - }, - }, - "alerting": Object { - "action_group_id": "default", - "instance_id": "2", - }, - "saved_objects": Array [ - Object { - "id": "1", - "namespace": undefined, - "rel": "primary", - "type": "alert", - "type_id": "test", - }, - ], - }, - "message": "test:1: 'rule-name' alert '2' has recovered", - "rule": Object { - "category": "test", - "id": "1", - "license": "basic", - "name": "rule-name", - "ruleset": "alerts", - }, - }, - ], - Array [ - Object { - "event": Object { - "action": "active-instance", - "category": Array [ - "alerts", - ], - "duration": 86400000000000, - "kind": "alert", - "start": "1969-12-31T00:00:00.000Z", - }, - "kibana": Object { - "alert": Object { - "rule": Object { - "execution": Object { - "uuid": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - }, - }, - }, - "alerting": Object { - "action_group_id": "default", - "instance_id": "1", - }, - "saved_objects": Array [ - Object { - "id": "1", - "namespace": undefined, - "rel": "primary", - "type": "alert", - "type_id": "test", - }, - ], - }, - "message": "test:1: 'rule-name' active alert: '1' in actionGroup: 'default'", - "rule": Object { - "category": "test", - "id": "1", - "license": "basic", - "name": "rule-name", - "ruleset": "alerts", - }, - }, - ], - Array [ - Object { - "event": Object { - "action": "execute", - "category": Array [ - "alerts", - ], - "kind": "alert", - "outcome": "success", - }, - "kibana": Object { - "alert": Object { - "rule": Object { - "execution": Object { - "metrics": Object { - "es_search_duration_ms": 33, - "number_of_searches": 3, - "number_of_triggered_actions": 0, - "total_search_duration_ms": 23423, - }, - "uuid": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - }, - }, - }, - "alerting": Object { - "status": "active", - }, - "saved_objects": Array [ - Object { - "id": "1", - "namespace": undefined, - "rel": "primary", - "type": "alert", - "type_id": "test", - }, - ], - "task": Object { - "schedule_delay": 0, - "scheduled": "1970-01-01T00:00:00.000Z", - }, - }, - "message": "rule executed: test:1: 'rule-name'", - "rule": Object { - "category": "test", - "id": "1", - "license": "basic", - "name": "rule-name", - "ruleset": "alerts", - }, - }, - ], - ] - `); - expect(mockUsageCounter.incrementCounter).not.toHaveBeenCalled(); - }); + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 1, + generateEventLog({ + task: true, + action: EVENT_LOG_ACTIONS.executeStart, + }) + ); + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 2, + generateEventLog({ + action: EVENT_LOG_ACTIONS.recoveredInstance, + actionGroupId: 'default', + duration: 64800000000000, + instanceId: '2', + start: '1969-12-31T06:00:00.000Z', + end: DATE_1970, + }) + ); + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 3, + generateEventLog({ + action: EVENT_LOG_ACTIONS.activeInstance, + actionGroupId: 'default', + duration: MOCK_DURATION, + start: DATE_1969, + instanceId: '1', + }) + ); + + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 4, + generateEventLog({ + action: EVENT_LOG_ACTIONS.execute, + outcome: 'success', + status: 'active', + numberOfTriggeredActions: 0, + task: true, + }) + ); + expect(mockUsageCounter.incrementCounter).not.toHaveBeenCalled(); + }); test('validates params before executing the alert type', async () => { const taskRunner = new TaskRunner( @@ -2736,37 +1342,9 @@ describe('Task Runner', () => { taskRunnerFactoryInitializerParams ); rulesClient.get.mockResolvedValue(mockedRuleTypeSavedObject); - encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValueOnce({ - id: '1', - type: 'alert', - attributes: { - apiKey: Buffer.from('123:abc').toString('base64'), - enabled: true, - }, - references: [], - }); + encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValueOnce(SAVED_OBJECT); const runnerResult = await taskRunner.run(); - expect(runnerResult).toMatchInlineSnapshot(` - Object { - "monitoring": Object { - "execution": Object { - "calculated_metrics": Object { - "success_ratio": 0, - }, - "history": Array [ - Object { - "success": false, - "timestamp": 0, - }, - ], - }, - }, - "schedule": Object { - "interval": "10s", - }, - "state": Object {}, - } - `); + expect(runnerResult).toEqual(generateRunnerResult({ successRatio: 0 })); expect(taskRunnerFactoryInitializerParams.logger.error).toHaveBeenCalledWith( `Executing Rule foo:test:1 has resulted in Error: params invalid: [param1]: expected value of type [string] but got [undefined]` ); @@ -2780,15 +1358,7 @@ describe('Task Runner', () => { taskRunnerFactoryInitializerParams ); rulesClient.get.mockResolvedValue(mockedRuleTypeSavedObject); - encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValueOnce({ - id: '1', - type: 'alert', - attributes: { - apiKey: Buffer.from('123:abc').toString('base64'), - enabled: true, - }, - references: [], - }); + encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValueOnce(SAVED_OBJECT); await taskRunner.run(); expect(taskRunnerFactoryInitializerParams.getRulesClientWithRequest).toHaveBeenCalledWith( @@ -2816,12 +1386,8 @@ describe('Task Runner', () => { ); rulesClient.get.mockResolvedValue(mockedRuleTypeSavedObject); encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValueOnce({ - id: '1', - type: 'alert', - attributes: { - enabled: true, - }, - references: [], + ...SAVED_OBJECT, + attributes: { enabled: true }, }); await taskRunner.run(); @@ -2853,42 +1419,12 @@ describe('Task Runner', () => { ...mockedRuleTypeSavedObject, schedule: { interval: '30s' }, }); - encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValueOnce({ - id: '1', - type: 'alert', - attributes: { - apiKey: Buffer.from('123:abc').toString('base64'), - enabled: true, - }, - references: [], - }); + encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValueOnce(SAVED_OBJECT); const runnerResult = await taskRunner.run(); - expect(runnerResult).toMatchInlineSnapshot(` - Object { - "monitoring": Object { - "execution": Object { - "calculated_metrics": Object { - "success_ratio": 1, - }, - "history": Array [ - Object { - "success": true, - "timestamp": 0, - }, - ], - }, - }, - "schedule": Object { - "interval": "30s", - }, - "state": Object { - "alertInstances": Object {}, - "alertTypeState": undefined, - "previousStartedAt": 1970-01-01T00:00:00.000Z, - }, - } - `); + expect(runnerResult).toEqual( + generateRunnerResult({ state: true, interval: '30s', history: [true] }) + ); expect(mockUsageCounter.incrementCounter).not.toHaveBeenCalled(); }); @@ -2903,7 +1439,7 @@ describe('Task Runner', () => { AlertInstanceContext, string >) => { - throw new Error('OMG'); + throw new Error(GENERIC_ERROR_MESSAGE); } ); @@ -2914,141 +1450,37 @@ describe('Task Runner', () => { ); rulesClient.get.mockResolvedValue(mockedRuleTypeSavedObject); - encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValueOnce({ - id: '1', - type: 'alert', - attributes: { - apiKey: Buffer.from('123:abc').toString('base64'), - enabled: true, - }, - references: [], - }); + encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValueOnce(SAVED_OBJECT); const runnerResult = await taskRunner.run(); - expect(runnerResult).toMatchInlineSnapshot(` - Object { - "monitoring": Object { - "execution": Object { - "calculated_metrics": Object { - "success_ratio": 0, - }, - "history": Array [ - Object { - "success": false, - "timestamp": 0, - }, - ], - }, - }, - "schedule": Object { - "interval": "10s", - }, - "state": Object {}, - } - `); - + expect(runnerResult).toEqual(generateRunnerResult({ successRatio: 0 })); const eventLogger = taskRunnerFactoryInitializerParams.eventLogger; expect(eventLogger.logEvent).toHaveBeenCalledTimes(2); expect(eventLogger.startTiming).toHaveBeenCalledTimes(1); - expect(eventLogger.logEvent.mock.calls).toMatchInlineSnapshot(` - Array [ - Array [ - Object { - "event": Object { - "action": "execute-start", - "category": Array [ - "alerts", - ], - "kind": "alert", - }, - "kibana": Object { - "alert": Object { - "rule": Object { - "execution": Object { - "uuid": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - }, - }, - }, - "saved_objects": Array [ - Object { - "id": "1", - "namespace": undefined, - "rel": "primary", - "type": "alert", - "type_id": "test", - }, - ], - "task": Object { - "schedule_delay": 0, - "scheduled": "1970-01-01T00:00:00.000Z", - }, - }, - "message": "rule execution start: \\"1\\"", - "rule": Object { - "category": "test", - "id": "1", - "license": "basic", - "ruleset": "alerts", - }, - }, - ], - Array [ - Object { - "error": Object { - "message": "OMG", - }, - "event": Object { - "action": "execute", - "category": Array [ - "alerts", - ], - "kind": "alert", - "outcome": "failure", - "reason": "execute", - }, - "kibana": Object { - "alert": Object { - "rule": Object { - "execution": Object { - "uuid": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - }, - }, - }, - "alerting": Object { - "status": "error", - }, - "saved_objects": Array [ - Object { - "id": "1", - "namespace": undefined, - "rel": "primary", - "type": "alert", - "type_id": "test", - }, - ], - "task": Object { - "schedule_delay": 0, - "scheduled": "1970-01-01T00:00:00.000Z", - }, - }, - "message": "rule execution failure: test:1: 'rule-name'", - "rule": Object { - "category": "test", - "id": "1", - "license": "basic", - "ruleset": "alerts", - }, - }, - ], - ] - `); + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 1, + generateEventLog({ + task: true, + action: EVENT_LOG_ACTIONS.executeStart, + }) + ); + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 2, + generateEventLog({ + action: EVENT_LOG_ACTIONS.execute, + outcome: 'failure', + reason: 'execute', + task: true, + status: 'error', + }) + ); expect(mockUsageCounter.incrementCounter).not.toHaveBeenCalled(); }); test('recovers gracefully when the Alert Task Runner throws an exception when fetching the encrypted attributes', async () => { encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockImplementation(() => { - throw new Error('OMG'); + throw new Error(GENERIC_ERROR_MESSAGE); }); const taskRunner = new TaskRunner( @@ -3061,129 +1493,34 @@ describe('Task Runner', () => { const runnerResult = await taskRunner.run(); - expect(runnerResult).toMatchInlineSnapshot(` - Object { - "monitoring": Object { - "execution": Object { - "calculated_metrics": Object { - "success_ratio": 0, - }, - "history": Array [ - Object { - "success": false, - "timestamp": 0, - }, - ], - }, - }, - "schedule": Object { - "interval": "10s", - }, - "state": Object {}, - } - `); + expect(runnerResult).toEqual(generateRunnerResult({ successRatio: 0 })); const eventLogger = taskRunnerFactoryInitializerParams.eventLogger; expect(eventLogger.logEvent).toHaveBeenCalledTimes(2); expect(eventLogger.startTiming).toHaveBeenCalledTimes(1); - expect(eventLogger.logEvent.mock.calls).toMatchInlineSnapshot(` - Array [ - Array [ - Object { - "event": Object { - "action": "execute-start", - "category": Array [ - "alerts", - ], - "kind": "alert", - }, - "kibana": Object { - "alert": Object { - "rule": Object { - "execution": Object { - "uuid": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - }, - }, - }, - "saved_objects": Array [ - Object { - "id": "1", - "namespace": undefined, - "rel": "primary", - "type": "alert", - "type_id": "test", - }, - ], - "task": Object { - "schedule_delay": 0, - "scheduled": "1970-01-01T00:00:00.000Z", - }, - }, - "message": "rule execution start: \\"1\\"", - "rule": Object { - "category": "test", - "id": "1", - "license": "basic", - "ruleset": "alerts", - }, - }, - ], - Array [ - Object { - "error": Object { - "message": "OMG", - }, - "event": Object { - "action": "execute", - "category": Array [ - "alerts", - ], - "kind": "alert", - "outcome": "failure", - "reason": "decrypt", - }, - "kibana": Object { - "alert": Object { - "rule": Object { - "execution": Object { - "uuid": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - }, - }, - }, - "alerting": Object { - "status": "error", - }, - "saved_objects": Array [ - Object { - "id": "1", - "namespace": undefined, - "rel": "primary", - "type": "alert", - "type_id": "test", - }, - ], - "task": Object { - "schedule_delay": 0, - "scheduled": "1970-01-01T00:00:00.000Z", - }, - }, - "message": "test:1: execution failed", - "rule": Object { - "category": "test", - "id": "1", - "license": "basic", - "ruleset": "alerts", - }, - }, - ], - ] - `); + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 1, + generateEventLog({ + task: true, + action: EVENT_LOG_ACTIONS.executeStart, + }) + ); + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 2, + generateEventLog({ + action: EVENT_LOG_ACTIONS.execute, + outcome: 'failure', + task: true, + reason: 'decrypt', + status: 'error', + }) + ); expect(mockUsageCounter.incrementCounter).not.toHaveBeenCalled(); }); test('recovers gracefully when the Alert Task Runner throws an exception when license is higher than supported', async () => { ruleTypeRegistry.ensureRuleTypeEnabled.mockImplementation(() => { - throw new Error('OMG'); + throw new Error(GENERIC_ERROR_MESSAGE); }); const taskRunner = new TaskRunner( @@ -3193,141 +1530,38 @@ describe('Task Runner', () => { ); rulesClient.get.mockResolvedValue(mockedRuleTypeSavedObject); - encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue({ - id: '1', - type: 'alert', - attributes: { - apiKey: Buffer.from('123:abc').toString('base64'), - enabled: true, - }, - references: [], - }); + encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue(SAVED_OBJECT); const runnerResult = await taskRunner.run(); - expect(runnerResult).toMatchInlineSnapshot(` - Object { - "monitoring": Object { - "execution": Object { - "calculated_metrics": Object { - "success_ratio": 0, - }, - "history": Array [ - Object { - "success": false, - "timestamp": 0, - }, - ], - }, - }, - "schedule": Object { - "interval": "10s", - }, - "state": Object {}, - } - `); + expect(runnerResult).toEqual(generateRunnerResult({ successRatio: 0 })); const eventLogger = taskRunnerFactoryInitializerParams.eventLogger; expect(eventLogger.logEvent).toHaveBeenCalledTimes(2); expect(eventLogger.startTiming).toHaveBeenCalledTimes(1); - expect(eventLogger.logEvent.mock.calls).toMatchInlineSnapshot(` - Array [ - Array [ - Object { - "event": Object { - "action": "execute-start", - "category": Array [ - "alerts", - ], - "kind": "alert", - }, - "kibana": Object { - "alert": Object { - "rule": Object { - "execution": Object { - "uuid": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - }, - }, - }, - "saved_objects": Array [ - Object { - "id": "1", - "namespace": undefined, - "rel": "primary", - "type": "alert", - "type_id": "test", - }, - ], - "task": Object { - "schedule_delay": 0, - "scheduled": "1970-01-01T00:00:00.000Z", - }, - }, - "message": "rule execution start: \\"1\\"", - "rule": Object { - "category": "test", - "id": "1", - "license": "basic", - "ruleset": "alerts", - }, - }, - ], - Array [ - Object { - "error": Object { - "message": "OMG", - }, - "event": Object { - "action": "execute", - "category": Array [ - "alerts", - ], - "kind": "alert", - "outcome": "failure", - "reason": "license", - }, - "kibana": Object { - "alert": Object { - "rule": Object { - "execution": Object { - "uuid": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - }, - }, - }, - "alerting": Object { - "status": "error", - }, - "saved_objects": Array [ - Object { - "id": "1", - "namespace": undefined, - "rel": "primary", - "type": "alert", - "type_id": "test", - }, - ], - "task": Object { - "schedule_delay": 0, - "scheduled": "1970-01-01T00:00:00.000Z", - }, - }, - "message": "test:1: execution failed", - "rule": Object { - "category": "test", - "id": "1", - "license": "basic", - "ruleset": "alerts", - }, - }, - ], - ] - `); + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 1, + generateEventLog({ + task: true, + action: EVENT_LOG_ACTIONS.executeStart, + }) + ); + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 2, + generateEventLog({ + action: EVENT_LOG_ACTIONS.execute, + outcome: 'failure', + task: true, + reason: 'license', + status: 'error', + }) + ); expect(mockUsageCounter.incrementCounter).not.toHaveBeenCalled(); }); test('recovers gracefully when the Alert Task Runner throws an exception when getting internal Services', async () => { taskRunnerFactoryInitializerParams.getRulesClientWithRequest.mockImplementation(() => { - throw new Error('OMG'); + throw new Error(GENERIC_ERROR_MESSAGE); }); const taskRunner = new TaskRunner( @@ -3337,141 +1571,31 @@ describe('Task Runner', () => { ); rulesClient.get.mockResolvedValue(mockedRuleTypeSavedObject); - encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue({ - id: '1', - type: 'alert', - attributes: { - apiKey: Buffer.from('123:abc').toString('base64'), - enabled: true, - }, - references: [], - }); + encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue(SAVED_OBJECT); const runnerResult = await taskRunner.run(); - expect(runnerResult).toMatchInlineSnapshot(` - Object { - "monitoring": Object { - "execution": Object { - "calculated_metrics": Object { - "success_ratio": 0, - }, - "history": Array [ - Object { - "success": false, - "timestamp": 0, - }, - ], - }, - }, - "schedule": Object { - "interval": "10s", - }, - "state": Object {}, - } - `); + expect(runnerResult).toEqual(generateRunnerResult({ successRatio: 0 })); const eventLogger = taskRunnerFactoryInitializerParams.eventLogger; expect(eventLogger.logEvent).toHaveBeenCalledTimes(2); expect(eventLogger.startTiming).toHaveBeenCalledTimes(1); - expect(eventLogger.logEvent.mock.calls).toMatchInlineSnapshot(` - Array [ - Array [ - Object { - "event": Object { - "action": "execute-start", - "category": Array [ - "alerts", - ], - "kind": "alert", - }, - "kibana": Object { - "alert": Object { - "rule": Object { - "execution": Object { - "uuid": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - }, - }, - }, - "saved_objects": Array [ - Object { - "id": "1", - "namespace": undefined, - "rel": "primary", - "type": "alert", - "type_id": "test", - }, - ], - "task": Object { - "schedule_delay": 0, - "scheduled": "1970-01-01T00:00:00.000Z", - }, - }, - "message": "rule execution start: \\"1\\"", - "rule": Object { - "category": "test", - "id": "1", - "license": "basic", - "ruleset": "alerts", - }, - }, - ], - Array [ - Object { - "error": Object { - "message": "OMG", - }, - "event": Object { - "action": "execute", - "category": Array [ - "alerts", - ], - "kind": "alert", - "outcome": "failure", - "reason": "unknown", - }, - "kibana": Object { - "alert": Object { - "rule": Object { - "execution": Object { - "uuid": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - }, - }, - }, - "alerting": Object { - "status": "error", - }, - "saved_objects": Array [ - Object { - "id": "1", - "namespace": undefined, - "rel": "primary", - "type": "alert", - "type_id": "test", - }, - ], - "task": Object { - "schedule_delay": 0, - "scheduled": "1970-01-01T00:00:00.000Z", - }, - }, - "message": "test:1: execution failed", - "rule": Object { - "category": "test", - "id": "1", - "license": "basic", - "ruleset": "alerts", - }, - }, - ], - ] - `); + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 2, + generateEventLog({ + action: EVENT_LOG_ACTIONS.execute, + outcome: 'failure', + task: true, + reason: 'unknown', + status: 'error', + }) + ); expect(mockUsageCounter.incrementCounter).not.toHaveBeenCalled(); }); test('recovers gracefully when the Alert Task Runner throws an exception when fetching attributes', async () => { rulesClient.get.mockImplementation(() => { - throw new Error('OMG'); + throw new Error(GENERIC_ERROR_MESSAGE); }); const taskRunner = new TaskRunner( @@ -3480,141 +1604,31 @@ describe('Task Runner', () => { taskRunnerFactoryInitializerParams ); - encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue({ - id: '1', - type: 'alert', - attributes: { - apiKey: Buffer.from('123:abc').toString('base64'), - enabled: true, - }, - references: [], - }); + encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue(SAVED_OBJECT); const runnerResult = await taskRunner.run(); - expect(runnerResult).toMatchInlineSnapshot(` - Object { - "monitoring": Object { - "execution": Object { - "calculated_metrics": Object { - "success_ratio": 0, - }, - "history": Array [ - Object { - "success": false, - "timestamp": 0, - }, - ], - }, - }, - "schedule": Object { - "interval": "10s", - }, - "state": Object {}, - } - `); + expect(runnerResult).toEqual(generateRunnerResult({ successRatio: 0 })); const eventLogger = taskRunnerFactoryInitializerParams.eventLogger; expect(eventLogger.logEvent).toHaveBeenCalledTimes(2); expect(eventLogger.startTiming).toHaveBeenCalledTimes(1); - expect(eventLogger.logEvent.mock.calls).toMatchInlineSnapshot(` - Array [ - Array [ - Object { - "event": Object { - "action": "execute-start", - "category": Array [ - "alerts", - ], - "kind": "alert", - }, - "kibana": Object { - "alert": Object { - "rule": Object { - "execution": Object { - "uuid": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - }, - }, - }, - "saved_objects": Array [ - Object { - "id": "1", - "namespace": undefined, - "rel": "primary", - "type": "alert", - "type_id": "test", - }, - ], - "task": Object { - "schedule_delay": 0, - "scheduled": "1970-01-01T00:00:00.000Z", - }, - }, - "message": "rule execution start: \\"1\\"", - "rule": Object { - "category": "test", - "id": "1", - "license": "basic", - "ruleset": "alerts", - }, - }, - ], - Array [ - Object { - "error": Object { - "message": "OMG", - }, - "event": Object { - "action": "execute", - "category": Array [ - "alerts", - ], - "kind": "alert", - "outcome": "failure", - "reason": "read", - }, - "kibana": Object { - "alert": Object { - "rule": Object { - "execution": Object { - "uuid": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - }, - }, - }, - "alerting": Object { - "status": "error", - }, - "saved_objects": Array [ - Object { - "id": "1", - "namespace": undefined, - "rel": "primary", - "type": "alert", - "type_id": "test", - }, - ], - "task": Object { - "schedule_delay": 0, - "scheduled": "1970-01-01T00:00:00.000Z", - }, - }, - "message": "test:1: execution failed", - "rule": Object { - "category": "test", - "id": "1", - "license": "basic", - "ruleset": "alerts", - }, - }, - ], - ] - `); + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 2, + generateEventLog({ + action: EVENT_LOG_ACTIONS.execute, + outcome: 'failure', + task: true, + reason: 'read', + status: 'error', + }) + ); expect(mockUsageCounter.incrementCounter).not.toHaveBeenCalled(); }); test('recovers gracefully when the Runner of a legacy Alert task which has no schedule throws an exception when fetching attributes', async () => { rulesClient.get.mockImplementation(() => { - throw new Error('OMG'); + throw new Error(GENERIC_ERROR_MESSAGE); }); // legacy alerts used to run by returning a new `runAt` instead of using a schedule @@ -3627,45 +1641,17 @@ describe('Task Runner', () => { taskRunnerFactoryInitializerParams ); - encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValueOnce({ - id: '1', - type: 'alert', - attributes: { - apiKey: Buffer.from('123:abc').toString('base64'), - enabled: true, - }, - references: [], - }); + encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValueOnce(SAVED_OBJECT); const runnerResult = await taskRunner.run(); - expect(runnerResult).toMatchInlineSnapshot(` - Object { - "monitoring": Object { - "execution": Object { - "calculated_metrics": Object { - "success_ratio": 0, - }, - "history": Array [ - Object { - "success": false, - "timestamp": 0, - }, - ], - }, - }, - "schedule": Object { - "interval": "5m", - }, - "state": Object {}, - } - `); + expect(runnerResult).toEqual(generateRunnerResult({ successRatio: 0, interval: '5m' })); expect(mockUsageCounter.incrementCounter).not.toHaveBeenCalled(); }); test(`doesn't change previousStartedAt when it fails to run`, async () => { const originalAlertSate = { - previousStartedAt: '1970-01-05T00:00:00.000Z', + previousStartedAt: DATE_1970, }; ruleType.executor.mockImplementation( @@ -3678,7 +1664,7 @@ describe('Task Runner', () => { AlertInstanceContext, string >) => { - throw new Error('OMG'); + throw new Error(GENERIC_ERROR_MESSAGE); } ); @@ -3692,15 +1678,7 @@ describe('Task Runner', () => { ); rulesClient.get.mockResolvedValue(mockedRuleTypeSavedObject); - encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue({ - id: '1', - type: 'alert', - attributes: { - apiKey: Buffer.from('123:abc').toString('base64'), - enabled: true, - }, - references: [], - }); + encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue(SAVED_OBJECT); const runnerResult = await taskRunner.run(); @@ -3727,19 +1705,11 @@ describe('Task Runner', () => { taskRunnerFactoryInitializerParams ); - encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue({ - id: '1', - type: 'alert', - attributes: { - apiKey: Buffer.from('123:abc').toString('base64'), - enabled: true, - }, - references: [], - }); + encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue(SAVED_OBJECT); const logger = taskRunnerFactoryInitializerParams.logger; return taskRunner.run().catch((ex) => { - expect(ex).toMatchInlineSnapshot(`[Error: Saved object [alert/1] not found]`); + expect(ex.toString()).toEqual(`Error: Saved object [alert/1] not found`); expect(logger.debug).toHaveBeenCalledWith( `Executing Rule foo:test:1 has resulted in Error: Saved object [alert/1] not found` ); @@ -3764,15 +1734,7 @@ describe('Task Runner', () => { taskRunnerFactoryInitializerParams ); - encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue({ - id: '1', - type: 'alert', - attributes: { - apiKey: Buffer.from('123:abc').toString('base64'), - enabled: true, - }, - references: [], - }); + encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue(SAVED_OBJECT); const runnerResult = await taskRunner.run(); expect(runnerResult.schedule!.interval).toEqual(mockedTaskInstance.schedule!.interval); @@ -3794,15 +1756,7 @@ describe('Task Runner', () => { taskRunnerFactoryInitializerParams ); - encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue({ - id: '1', - type: 'alert', - attributes: { - apiKey: Buffer.from('123:abc').toString('base64'), - enabled: true, - }, - references: [], - }); + encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue(SAVED_OBJECT); const runnerResult = await taskRunner.run(); @@ -3826,19 +1780,11 @@ describe('Task Runner', () => { taskRunnerFactoryInitializerParams ); - encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue({ - id: '1', - type: 'alert', - attributes: { - apiKey: Buffer.from('123:abc').toString('base64'), - enabled: true, - }, - references: [], - }); + encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue(SAVED_OBJECT); const logger = taskRunnerFactoryInitializerParams.logger; return taskRunner.run().catch((ex) => { - expect(ex).toMatchInlineSnapshot(`[Error: Saved object [alert/1] not found]`); + expect(ex.toString()).toEqual(`Error: Saved object [alert/1] not found`); expect(logger.debug).toHaveBeenCalledWith( `Executing Rule test space:test:1 has resulted in Error: Saved object [alert/1] not found` ); @@ -3884,287 +1830,70 @@ describe('Task Runner', () => { notifyWhen: 'onActionGroupChange', actions: [], }); - encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue({ - id: '1', - type: 'alert', - attributes: { - apiKey: Buffer.from('123:abc').toString('base64'), - enabled: true, - }, - references: [], - }); + encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue(SAVED_OBJECT); await taskRunner.run(); const eventLogger = taskRunnerFactoryInitializerParams.eventLogger; expect(eventLogger.logEvent).toHaveBeenCalledTimes(6); expect(eventLogger.startTiming).toHaveBeenCalledTimes(1); - expect(eventLogger.logEvent.mock.calls).toMatchInlineSnapshot(` - Array [ - Array [ - Object { - "event": Object { - "action": "execute-start", - "category": Array [ - "alerts", - ], - "kind": "alert", - }, - "kibana": Object { - "alert": Object { - "rule": Object { - "execution": Object { - "uuid": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - }, - }, - }, - "saved_objects": Array [ - Object { - "id": "1", - "namespace": undefined, - "rel": "primary", - "type": "alert", - "type_id": "test", - }, - ], - "task": Object { - "schedule_delay": 0, - "scheduled": "1970-01-01T00:00:00.000Z", - }, - }, - "message": "rule execution start: \\"1\\"", - "rule": Object { - "category": "test", - "id": "1", - "license": "basic", - "ruleset": "alerts", - }, - }, - ], - Array [ - Object { - "event": Object { - "action": "new-instance", - "category": Array [ - "alerts", - ], - "duration": 0, - "kind": "alert", - "start": "1970-01-01T00:00:00.000Z", - }, - "kibana": Object { - "alert": Object { - "rule": Object { - "execution": Object { - "uuid": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - }, - }, - }, - "alerting": Object { - "action_group_id": "default", - "instance_id": "1", - }, - "saved_objects": Array [ - Object { - "id": "1", - "namespace": undefined, - "rel": "primary", - "type": "alert", - "type_id": "test", - }, - ], - }, - "message": "test:1: 'rule-name' created new alert: '1'", - "rule": Object { - "category": "test", - "id": "1", - "license": "basic", - "name": "rule-name", - "ruleset": "alerts", - }, - }, - ], - Array [ - Object { - "event": Object { - "action": "new-instance", - "category": Array [ - "alerts", - ], - "duration": 0, - "kind": "alert", - "start": "1970-01-01T00:00:00.000Z", - }, - "kibana": Object { - "alert": Object { - "rule": Object { - "execution": Object { - "uuid": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - }, - }, - }, - "alerting": Object { - "action_group_id": "default", - "instance_id": "2", - }, - "saved_objects": Array [ - Object { - "id": "1", - "namespace": undefined, - "rel": "primary", - "type": "alert", - "type_id": "test", - }, - ], - }, - "message": "test:1: 'rule-name' created new alert: '2'", - "rule": Object { - "category": "test", - "id": "1", - "license": "basic", - "name": "rule-name", - "ruleset": "alerts", - }, - }, - ], - Array [ - Object { - "event": Object { - "action": "active-instance", - "category": Array [ - "alerts", - ], - "duration": 0, - "kind": "alert", - "start": "1970-01-01T00:00:00.000Z", - }, - "kibana": Object { - "alert": Object { - "rule": Object { - "execution": Object { - "uuid": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - }, - }, - }, - "alerting": Object { - "action_group_id": "default", - "instance_id": "1", - }, - "saved_objects": Array [ - Object { - "id": "1", - "namespace": undefined, - "rel": "primary", - "type": "alert", - "type_id": "test", - }, - ], - }, - "message": "test:1: 'rule-name' active alert: '1' in actionGroup: 'default'", - "rule": Object { - "category": "test", - "id": "1", - "license": "basic", - "name": "rule-name", - "ruleset": "alerts", - }, - }, - ], - Array [ - Object { - "event": Object { - "action": "active-instance", - "category": Array [ - "alerts", - ], - "duration": 0, - "kind": "alert", - "start": "1970-01-01T00:00:00.000Z", - }, - "kibana": Object { - "alert": Object { - "rule": Object { - "execution": Object { - "uuid": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - }, - }, - }, - "alerting": Object { - "action_group_id": "default", - "instance_id": "2", - }, - "saved_objects": Array [ - Object { - "id": "1", - "namespace": undefined, - "rel": "primary", - "type": "alert", - "type_id": "test", - }, - ], - }, - "message": "test:1: 'rule-name' active alert: '2' in actionGroup: 'default'", - "rule": Object { - "category": "test", - "id": "1", - "license": "basic", - "name": "rule-name", - "ruleset": "alerts", - }, - }, - ], - Array [ - Object { - "event": Object { - "action": "execute", - "category": Array [ - "alerts", - ], - "kind": "alert", - "outcome": "success", - }, - "kibana": Object { - "alert": Object { - "rule": Object { - "execution": Object { - "metrics": Object { - "es_search_duration_ms": 33, - "number_of_searches": 3, - "number_of_triggered_actions": 0, - "total_search_duration_ms": 23423, - }, - "uuid": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - }, - }, - }, - "alerting": Object { - "status": "active", - }, - "saved_objects": Array [ - Object { - "id": "1", - "namespace": undefined, - "rel": "primary", - "type": "alert", - "type_id": "test", - }, - ], - "task": Object { - "schedule_delay": 0, - "scheduled": "1970-01-01T00:00:00.000Z", - }, - }, - "message": "rule executed: test:1: 'rule-name'", - "rule": Object { - "category": "test", - "id": "1", - "license": "basic", - "name": "rule-name", - "ruleset": "alerts", - }, - }, - ], - ] - `); + + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 1, + generateEventLog({ + task: true, + action: EVENT_LOG_ACTIONS.executeStart, + }) + ); + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 2, + generateEventLog({ + duration: 0, + start: DATE_1970, + action: EVENT_LOG_ACTIONS.newInstance, + actionGroupId: 'default', + instanceId: '1', + }) + ); + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 3, + generateEventLog({ + duration: 0, + start: DATE_1970, + action: EVENT_LOG_ACTIONS.newInstance, + actionGroupId: 'default', + instanceId: '2', + }) + ); + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 4, + generateEventLog({ + duration: 0, + start: DATE_1970, + action: EVENT_LOG_ACTIONS.activeInstance, + actionGroupId: 'default', + instanceId: '1', + }) + ); + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 5, + generateEventLog({ + duration: 0, + start: DATE_1970, + action: EVENT_LOG_ACTIONS.activeInstance, + actionGroupId: 'default', + instanceId: '2', + }) + ); + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 6, + generateEventLog({ + action: EVENT_LOG_ACTIONS.execute, + outcome: 'success', + status: 'active', + numberOfTriggeredActions: 0, + task: true, + }) + ); expect(mockUsageCounter.incrementCounter).not.toHaveBeenCalled(); }); @@ -4196,7 +1925,7 @@ describe('Task Runner', () => { meta: {}, state: { bar: false, - start: '1969-12-31T00:00:00.000Z', + start: DATE_1969, duration: 80000000000, }, }, @@ -4218,201 +1947,51 @@ describe('Task Runner', () => { notifyWhen: 'onActionGroupChange', actions: [], }); - encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue({ - id: '1', - type: 'alert', - attributes: { - apiKey: Buffer.from('123:abc').toString('base64'), - enabled: true, - }, - references: [], - }); + encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue(SAVED_OBJECT); await taskRunner.run(); const eventLogger = taskRunnerFactoryInitializerParams.eventLogger; expect(eventLogger.logEvent).toHaveBeenCalledTimes(4); expect(eventLogger.startTiming).toHaveBeenCalledTimes(1); - expect(eventLogger.logEvent.mock.calls).toMatchInlineSnapshot(` - Array [ - Array [ - Object { - "event": Object { - "action": "execute-start", - "category": Array [ - "alerts", - ], - "kind": "alert", - }, - "kibana": Object { - "alert": Object { - "rule": Object { - "execution": Object { - "uuid": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - }, - }, - }, - "saved_objects": Array [ - Object { - "id": "1", - "namespace": undefined, - "rel": "primary", - "type": "alert", - "type_id": "test", - }, - ], - "task": Object { - "schedule_delay": 0, - "scheduled": "1970-01-01T00:00:00.000Z", - }, - }, - "message": "rule execution start: \\"1\\"", - "rule": Object { - "category": "test", - "id": "1", - "license": "basic", - "ruleset": "alerts", - }, - }, - ], - Array [ - Object { - "event": Object { - "action": "active-instance", - "category": Array [ - "alerts", - ], - "duration": 86400000000000, - "kind": "alert", - "start": "1969-12-31T00:00:00.000Z", - }, - "kibana": Object { - "alert": Object { - "rule": Object { - "execution": Object { - "uuid": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - }, - }, - }, - "alerting": Object { - "action_group_id": "default", - "instance_id": "1", - }, - "saved_objects": Array [ - Object { - "id": "1", - "namespace": undefined, - "rel": "primary", - "type": "alert", - "type_id": "test", - }, - ], - }, - "message": "test:1: 'rule-name' active alert: '1' in actionGroup: 'default'", - "rule": Object { - "category": "test", - "id": "1", - "license": "basic", - "name": "rule-name", - "ruleset": "alerts", - }, - }, - ], - Array [ - Object { - "event": Object { - "action": "active-instance", - "category": Array [ - "alerts", - ], - "duration": 64800000000000, - "kind": "alert", - "start": "1969-12-31T06:00:00.000Z", - }, - "kibana": Object { - "alert": Object { - "rule": Object { - "execution": Object { - "uuid": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - }, - }, - }, - "alerting": Object { - "action_group_id": "default", - "instance_id": "2", - }, - "saved_objects": Array [ - Object { - "id": "1", - "namespace": undefined, - "rel": "primary", - "type": "alert", - "type_id": "test", - }, - ], - }, - "message": "test:1: 'rule-name' active alert: '2' in actionGroup: 'default'", - "rule": Object { - "category": "test", - "id": "1", - "license": "basic", - "name": "rule-name", - "ruleset": "alerts", - }, - }, - ], - Array [ - Object { - "event": Object { - "action": "execute", - "category": Array [ - "alerts", - ], - "kind": "alert", - "outcome": "success", - }, - "kibana": Object { - "alert": Object { - "rule": Object { - "execution": Object { - "metrics": Object { - "es_search_duration_ms": 33, - "number_of_searches": 3, - "number_of_triggered_actions": 0, - "total_search_duration_ms": 23423, - }, - "uuid": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - }, - }, - }, - "alerting": Object { - "status": "active", - }, - "saved_objects": Array [ - Object { - "id": "1", - "namespace": undefined, - "rel": "primary", - "type": "alert", - "type_id": "test", - }, - ], - "task": Object { - "schedule_delay": 0, - "scheduled": "1970-01-01T00:00:00.000Z", - }, - }, - "message": "rule executed: test:1: 'rule-name'", - "rule": Object { - "category": "test", - "id": "1", - "license": "basic", - "name": "rule-name", - "ruleset": "alerts", - }, - }, - ], - ] - `); + + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 1, + generateEventLog({ + task: true, + action: EVENT_LOG_ACTIONS.executeStart, + }) + ); + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 2, + generateEventLog({ + action: EVENT_LOG_ACTIONS.activeInstance, + actionGroupId: 'default', + duration: MOCK_DURATION, + start: DATE_1969, + instanceId: '1', + }) + ); + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 3, + generateEventLog({ + action: EVENT_LOG_ACTIONS.activeInstance, + actionGroupId: 'default', + duration: 64800000000000, + start: '1969-12-31T06:00:00.000Z', + instanceId: '2', + }) + ); + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 4, + generateEventLog({ + action: EVENT_LOG_ACTIONS.execute, + outcome: 'success', + status: 'active', + numberOfTriggeredActions: 0, + task: true, + }) + ); + expect(mockUsageCounter.incrementCounter).not.toHaveBeenCalled(); }); @@ -4458,197 +2037,45 @@ describe('Task Runner', () => { notifyWhen: 'onActionGroupChange', actions: [], }); - encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue({ - id: '1', - type: 'alert', - attributes: { - apiKey: Buffer.from('123:abc').toString('base64'), - enabled: true, - }, - references: [], - }); + encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue(SAVED_OBJECT); await taskRunner.run(); const eventLogger = taskRunnerFactoryInitializerParams.eventLogger; expect(eventLogger.logEvent).toHaveBeenCalledTimes(4); expect(eventLogger.startTiming).toHaveBeenCalledTimes(1); - expect(eventLogger.logEvent.mock.calls).toMatchInlineSnapshot(` - Array [ - Array [ - Object { - "event": Object { - "action": "execute-start", - "category": Array [ - "alerts", - ], - "kind": "alert", - }, - "kibana": Object { - "alert": Object { - "rule": Object { - "execution": Object { - "uuid": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - }, - }, - }, - "saved_objects": Array [ - Object { - "id": "1", - "namespace": undefined, - "rel": "primary", - "type": "alert", - "type_id": "test", - }, - ], - "task": Object { - "schedule_delay": 0, - "scheduled": "1970-01-01T00:00:00.000Z", - }, - }, - "message": "rule execution start: \\"1\\"", - "rule": Object { - "category": "test", - "id": "1", - "license": "basic", - "ruleset": "alerts", - }, - }, - ], - Array [ - Object { - "event": Object { - "action": "active-instance", - "category": Array [ - "alerts", - ], - "kind": "alert", - }, - "kibana": Object { - "alert": Object { - "rule": Object { - "execution": Object { - "uuid": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - }, - }, - }, - "alerting": Object { - "action_group_id": "default", - "instance_id": "1", - }, - "saved_objects": Array [ - Object { - "id": "1", - "namespace": undefined, - "rel": "primary", - "type": "alert", - "type_id": "test", - }, - ], - }, - "message": "test:1: 'rule-name' active alert: '1' in actionGroup: 'default'", - "rule": Object { - "category": "test", - "id": "1", - "license": "basic", - "name": "rule-name", - "ruleset": "alerts", - }, - }, - ], - Array [ - Object { - "event": Object { - "action": "active-instance", - "category": Array [ - "alerts", - ], - "kind": "alert", - }, - "kibana": Object { - "alert": Object { - "rule": Object { - "execution": Object { - "uuid": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - }, - }, - }, - "alerting": Object { - "action_group_id": "default", - "instance_id": "2", - }, - "saved_objects": Array [ - Object { - "id": "1", - "namespace": undefined, - "rel": "primary", - "type": "alert", - "type_id": "test", - }, - ], - }, - "message": "test:1: 'rule-name' active alert: '2' in actionGroup: 'default'", - "rule": Object { - "category": "test", - "id": "1", - "license": "basic", - "name": "rule-name", - "ruleset": "alerts", - }, - }, - ], - Array [ - Object { - "event": Object { - "action": "execute", - "category": Array [ - "alerts", - ], - "kind": "alert", - "outcome": "success", - }, - "kibana": Object { - "alert": Object { - "rule": Object { - "execution": Object { - "metrics": Object { - "es_search_duration_ms": 33, - "number_of_searches": 3, - "number_of_triggered_actions": 0, - "total_search_duration_ms": 23423, - }, - "uuid": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - }, - }, - }, - "alerting": Object { - "status": "active", - }, - "saved_objects": Array [ - Object { - "id": "1", - "namespace": undefined, - "rel": "primary", - "type": "alert", - "type_id": "test", - }, - ], - "task": Object { - "schedule_delay": 0, - "scheduled": "1970-01-01T00:00:00.000Z", - }, - }, - "message": "rule executed: test:1: 'rule-name'", - "rule": Object { - "category": "test", - "id": "1", - "license": "basic", - "name": "rule-name", - "ruleset": "alerts", - }, - }, - ], - ] - `); + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 1, + generateEventLog({ + task: true, + action: EVENT_LOG_ACTIONS.executeStart, + }) + ); + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 2, + generateEventLog({ + action: EVENT_LOG_ACTIONS.activeInstance, + actionGroupId: 'default', + instanceId: '1', + }) + ); + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 3, + generateEventLog({ + action: EVENT_LOG_ACTIONS.activeInstance, + actionGroupId: 'default', + instanceId: '2', + }) + ); + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 4, + generateEventLog({ + action: EVENT_LOG_ACTIONS.execute, + outcome: 'success', + status: 'active', + numberOfTriggeredActions: 0, + task: true, + }) + ); expect(mockUsageCounter.incrementCounter).not.toHaveBeenCalled(); }); @@ -4667,7 +2094,7 @@ describe('Task Runner', () => { meta: {}, state: { bar: false, - start: '1969-12-31T00:00:00.000Z', + start: DATE_1969, duration: 80000000000, }, }, @@ -4689,201 +2116,50 @@ describe('Task Runner', () => { notifyWhen: 'onActionGroupChange', actions: [], }); - encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue({ - id: '1', - type: 'alert', - attributes: { - apiKey: Buffer.from('123:abc').toString('base64'), - enabled: true, - }, - references: [], - }); + encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue(SAVED_OBJECT); await taskRunner.run(); const eventLogger = taskRunnerFactoryInitializerParams.eventLogger; expect(eventLogger.logEvent).toHaveBeenCalledTimes(4); expect(eventLogger.startTiming).toHaveBeenCalledTimes(1); - expect(eventLogger.logEvent.mock.calls).toMatchInlineSnapshot(` - Array [ - Array [ - Object { - "event": Object { - "action": "execute-start", - "category": Array [ - "alerts", - ], - "kind": "alert", - }, - "kibana": Object { - "alert": Object { - "rule": Object { - "execution": Object { - "uuid": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - }, - }, - }, - "saved_objects": Array [ - Object { - "id": "1", - "namespace": undefined, - "rel": "primary", - "type": "alert", - "type_id": "test", - }, - ], - "task": Object { - "schedule_delay": 0, - "scheduled": "1970-01-01T00:00:00.000Z", - }, - }, - "message": "rule execution start: \\"1\\"", - "rule": Object { - "category": "test", - "id": "1", - "license": "basic", - "ruleset": "alerts", - }, - }, - ], - Array [ - Object { - "event": Object { - "action": "recovered-instance", - "category": Array [ - "alerts", - ], - "duration": 86400000000000, - "end": "1970-01-01T00:00:00.000Z", - "kind": "alert", - "start": "1969-12-31T00:00:00.000Z", - }, - "kibana": Object { - "alert": Object { - "rule": Object { - "execution": Object { - "uuid": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - }, - }, - }, - "alerting": Object { - "instance_id": "1", - }, - "saved_objects": Array [ - Object { - "id": "1", - "namespace": undefined, - "rel": "primary", - "type": "alert", - "type_id": "test", - }, - ], - }, - "message": "test:1: 'rule-name' alert '1' has recovered", - "rule": Object { - "category": "test", - "id": "1", - "license": "basic", - "name": "rule-name", - "ruleset": "alerts", - }, - }, - ], - Array [ - Object { - "event": Object { - "action": "recovered-instance", - "category": Array [ - "alerts", - ], - "duration": 64800000000000, - "end": "1970-01-01T00:00:00.000Z", - "kind": "alert", - "start": "1969-12-31T06:00:00.000Z", - }, - "kibana": Object { - "alert": Object { - "rule": Object { - "execution": Object { - "uuid": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - }, - }, - }, - "alerting": Object { - "instance_id": "2", - }, - "saved_objects": Array [ - Object { - "id": "1", - "namespace": undefined, - "rel": "primary", - "type": "alert", - "type_id": "test", - }, - ], - }, - "message": "test:1: 'rule-name' alert '2' has recovered", - "rule": Object { - "category": "test", - "id": "1", - "license": "basic", - "name": "rule-name", - "ruleset": "alerts", - }, - }, - ], - Array [ - Object { - "event": Object { - "action": "execute", - "category": Array [ - "alerts", - ], - "kind": "alert", - "outcome": "success", - }, - "kibana": Object { - "alert": Object { - "rule": Object { - "execution": Object { - "metrics": Object { - "es_search_duration_ms": 33, - "number_of_searches": 3, - "number_of_triggered_actions": 0, - "total_search_duration_ms": 23423, - }, - "uuid": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - }, - }, - }, - "alerting": Object { - "status": "ok", - }, - "saved_objects": Array [ - Object { - "id": "1", - "namespace": undefined, - "rel": "primary", - "type": "alert", - "type_id": "test", - }, - ], - "task": Object { - "schedule_delay": 0, - "scheduled": "1970-01-01T00:00:00.000Z", - }, - }, - "message": "rule executed: test:1: 'rule-name'", - "rule": Object { - "category": "test", - "id": "1", - "license": "basic", - "name": "rule-name", - "ruleset": "alerts", - }, - }, - ], - ] - `); + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 1, + generateEventLog({ + task: true, + action: EVENT_LOG_ACTIONS.executeStart, + }) + ); + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 2, + generateEventLog({ + action: EVENT_LOG_ACTIONS.recoveredInstance, + duration: MOCK_DURATION, + start: DATE_1969, + end: DATE_1970, + instanceId: '1', + }) + ); + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 3, + generateEventLog({ + action: EVENT_LOG_ACTIONS.recoveredInstance, + duration: 64800000000000, + start: '1969-12-31T06:00:00.000Z', + end: DATE_1970, + instanceId: '2', + }) + ); + + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 4, + generateEventLog({ + action: EVENT_LOG_ACTIONS.execute, + outcome: 'success', + status: 'ok', + numberOfTriggeredActions: 0, + task: true, + }) + ); expect(mockUsageCounter.incrementCounter).not.toHaveBeenCalled(); }); @@ -4926,195 +2202,44 @@ describe('Task Runner', () => { notifyWhen: 'onActionGroupChange', actions: [], }); - encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue({ - id: '1', - type: 'alert', - attributes: { - apiKey: Buffer.from('123:abc').toString('base64'), - enabled: true, - }, - references: [], - }); + encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue(SAVED_OBJECT); await taskRunner.run(); const eventLogger = taskRunnerFactoryInitializerParams.eventLogger; expect(eventLogger.logEvent).toHaveBeenCalledTimes(4); expect(eventLogger.startTiming).toHaveBeenCalledTimes(1); - expect(eventLogger.logEvent.mock.calls).toMatchInlineSnapshot(` - Array [ - Array [ - Object { - "event": Object { - "action": "execute-start", - "category": Array [ - "alerts", - ], - "kind": "alert", - }, - "kibana": Object { - "alert": Object { - "rule": Object { - "execution": Object { - "uuid": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - }, - }, - }, - "saved_objects": Array [ - Object { - "id": "1", - "namespace": undefined, - "rel": "primary", - "type": "alert", - "type_id": "test", - }, - ], - "task": Object { - "schedule_delay": 0, - "scheduled": "1970-01-01T00:00:00.000Z", - }, - }, - "message": "rule execution start: \\"1\\"", - "rule": Object { - "category": "test", - "id": "1", - "license": "basic", - "ruleset": "alerts", - }, - }, - ], - Array [ - Object { - "event": Object { - "action": "recovered-instance", - "category": Array [ - "alerts", - ], - "kind": "alert", - }, - "kibana": Object { - "alert": Object { - "rule": Object { - "execution": Object { - "uuid": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - }, - }, - }, - "alerting": Object { - "instance_id": "1", - }, - "saved_objects": Array [ - Object { - "id": "1", - "namespace": undefined, - "rel": "primary", - "type": "alert", - "type_id": "test", - }, - ], - }, - "message": "test:1: 'rule-name' alert '1' has recovered", - "rule": Object { - "category": "test", - "id": "1", - "license": "basic", - "name": "rule-name", - "ruleset": "alerts", - }, - }, - ], - Array [ - Object { - "event": Object { - "action": "recovered-instance", - "category": Array [ - "alerts", - ], - "kind": "alert", - }, - "kibana": Object { - "alert": Object { - "rule": Object { - "execution": Object { - "uuid": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - }, - }, - }, - "alerting": Object { - "instance_id": "2", - }, - "saved_objects": Array [ - Object { - "id": "1", - "namespace": undefined, - "rel": "primary", - "type": "alert", - "type_id": "test", - }, - ], - }, - "message": "test:1: 'rule-name' alert '2' has recovered", - "rule": Object { - "category": "test", - "id": "1", - "license": "basic", - "name": "rule-name", - "ruleset": "alerts", - }, - }, - ], - Array [ - Object { - "event": Object { - "action": "execute", - "category": Array [ - "alerts", - ], - "kind": "alert", - "outcome": "success", - }, - "kibana": Object { - "alert": Object { - "rule": Object { - "execution": Object { - "metrics": Object { - "es_search_duration_ms": 33, - "number_of_searches": 3, - "number_of_triggered_actions": 0, - "total_search_duration_ms": 23423, - }, - "uuid": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - }, - }, - }, - "alerting": Object { - "status": "ok", - }, - "saved_objects": Array [ - Object { - "id": "1", - "namespace": undefined, - "rel": "primary", - "type": "alert", - "type_id": "test", - }, - ], - "task": Object { - "schedule_delay": 0, - "scheduled": "1970-01-01T00:00:00.000Z", - }, - }, - "message": "rule executed: test:1: 'rule-name'", - "rule": Object { - "category": "test", - "id": "1", - "license": "basic", - "name": "rule-name", - "ruleset": "alerts", - }, - }, - ], - ] - `); + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 1, + generateEventLog({ + task: true, + action: EVENT_LOG_ACTIONS.executeStart, + }) + ); + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 2, + generateEventLog({ + action: EVENT_LOG_ACTIONS.recoveredInstance, + instanceId: '1', + }) + ); + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 3, + generateEventLog({ + action: EVENT_LOG_ACTIONS.recoveredInstance, + instanceId: '2', + }) + ); + + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 4, + generateEventLog({ + action: EVENT_LOG_ACTIONS.execute, + outcome: 'success', + status: 'ok', + numberOfTriggeredActions: 0, + task: true, + }) + ); expect(mockUsageCounter.incrementCounter).not.toHaveBeenCalled(); }); @@ -5134,65 +2259,25 @@ describe('Task Runner', () => { } ); rulesClient.get.mockResolvedValue(mockedRuleTypeSavedObject); - encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue({ - id: '1', - type: 'alert', - attributes: { - apiKey: Buffer.from('123:abc').toString('base64'), - enabled: true, - }, - references: [], - }); + encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue(SAVED_OBJECT); const runnerResult = await taskRunner.run(); - expect(runnerResult).toMatchInlineSnapshot(` - Object { - "monitoring": Object { - "execution": Object { - "calculated_metrics": Object { - "success_ratio": 1, - }, - "history": Array [ - Object { - "success": true, - "timestamp": 0, - }, - ], - }, - }, - "schedule": Object { - "interval": "10s", - }, - "state": Object { - "alertInstances": Object {}, - "alertTypeState": undefined, - "previousStartedAt": 1970-01-01T00:00:00.000Z, - }, - } - `); + expect(runnerResult).toEqual(generateRunnerResult({ state: true, history: [true] })); expect(ruleType.executor).toHaveBeenCalledTimes(1); const call = ruleType.executor.mock.calls[0][0]; - expect(call.params).toMatchInlineSnapshot(` - Object { - "bar": true, - } - `); - expect(call.startedAt).toMatchInlineSnapshot(`1970-01-01T00:00:00.000Z`); - expect(call.previousStartedAt).toMatchInlineSnapshot(`1969-12-31T23:55:00.000Z`); - expect(call.state).toMatchInlineSnapshot(`Object {}`); - expect(call.name).toBe('rule-name'); + expect(call.params).toEqual({ bar: true }); + expect(call.startedAt).toEqual(new Date(DATE_1970)); + expect(call.previousStartedAt).toEqual(new Date(DATE_1970_5_MIN)); + expect(call.state).toEqual({}); + expect(call.name).toBe(RULE_NAME); expect(call.tags).toEqual(['rule-', '-tags']); expect(call.createdBy).toBe('rule-creator'); expect(call.updatedBy).toBe('rule-updater'); expect(call.rule).not.toBe(null); - expect(call.rule.name).toBe('rule-name'); + expect(call.rule.name).toBe(RULE_NAME); expect(call.rule.tags).toEqual(['rule-', '-tags']); expect(call.rule.consumer).toBe('bar'); expect(call.rule.enabled).toBe(true); - expect(call.rule.schedule).toMatchInlineSnapshot(` - Object { - "interval": "10s", - } - `); + expect(call.rule.schedule).toEqual({ interval: '10s' }); expect(call.rule.createdBy).toBe('rule-creator'); expect(call.rule.updatedBy).toBe('rule-updater'); expect(call.rule.createdAt).toBe(mockDate); @@ -5202,26 +2287,7 @@ describe('Task Runner', () => { expect(call.rule.producer).toBe('alerts'); expect(call.rule.ruleTypeId).toBe('test'); expect(call.rule.ruleTypeName).toBe('My test rule'); - expect(call.rule.actions).toMatchInlineSnapshot(` - Array [ - Object { - "actionTypeId": "action", - "group": "default", - "id": "1", - "params": Object { - "foo": true, - }, - }, - Object { - "actionTypeId": "action", - "group": "recovered", - "id": "2", - "params": Object { - "isResolved": true, - }, - }, - ] - `); + expect(call.rule.actions).toEqual(RULE_ACTIONS); expect(call.services.alertFactory.create).toBeTruthy(); expect(call.services.scopedClusterClient).toBeTruthy(); expect(call.services).toBeTruthy(); @@ -5237,75 +2303,16 @@ describe('Task Runner', () => { const eventLogger = taskRunnerFactoryInitializerParams.eventLogger; expect(eventLogger.logEvent).toHaveBeenCalledTimes(2); expect(eventLogger.startTiming).toHaveBeenCalledTimes(1); - expect(eventLogger.logEvent.mock.calls[0][0]).toMatchInlineSnapshot(` - Object { - "event": Object { - "action": "execute-start", - "category": Array [ - "alerts", - ], - "kind": "alert", - }, - "kibana": Object { - "alert": Object { - "rule": Object { - "execution": Object { - "uuid": "5f6aa57d-3e22-484e-bae8-cbed868f4d28", - }, - }, - }, - "saved_objects": Array [ - Object { - "id": "1", - "namespace": undefined, - "rel": "primary", - "type": "alert", - "type_id": "test", - }, - ], - "task": Object { - "schedule_delay": 0, - "scheduled": "1970-01-01T00:00:00.000Z", - }, - }, - "message": "rule execution start: \\"1\\"", - "rule": Object { - "category": "test", - "id": "1", - "license": "basic", - "ruleset": "alerts", - }, - } - `); - + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 1, + generateEventLog({ + task: true, + action: EVENT_LOG_ACTIONS.executeStart, + }) + ); expect( taskRunnerFactoryInitializerParams.internalSavedObjectsRepository.update - ).toHaveBeenCalledWith( - 'alert', - '1', - { - monitoring: { - execution: { - calculated_metrics: { - success_ratio: 1, - }, - history: [ - { - success: true, - timestamp: 0, - }, - ], - }, - }, - executionStatus: { - error: null, - lastDuration: 0, - lastExecutionDate: '1970-01-01T00:00:00.000Z', - status: 'ok', - }, - }, - { refresh: false, namespace: undefined } - ); + ).toHaveBeenCalledWith(...SAVED_OBJECT_UPDATE_PARAMS); expect(mockUsageCounter.incrementCounter).not.toHaveBeenCalled(); }); @@ -5324,13 +2331,8 @@ describe('Task Runner', () => { ); rulesClient.get.mockResolvedValue(mockedRuleTypeSavedObject); encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue({ - id: '1', - type: 'alert', - attributes: { - apiKey: Buffer.from('123:abc').toString('base64'), - enabled: false, - }, - references: [], + ...SAVED_OBJECT, + attributes: { ...SAVED_OBJECT.attributes, enabled: false }, }); const runnerResult = await taskRunner.run(); expect(runnerResult.state.previousStartedAt?.toISOString()).toBe(state.previousStartedAt); @@ -5338,69 +2340,24 @@ describe('Task Runner', () => { const eventLogger = taskRunnerFactoryInitializerParams.eventLogger; expect(eventLogger.logEvent).toHaveBeenCalledTimes(2); - expect(eventLogger.logEvent.mock.calls[0][0]).toStrictEqual({ - event: { - action: 'execute-start', - kind: 'alert', - category: ['alerts'], - }, - kibana: { - alert: { - rule: { - execution: { - uuid: '5f6aa57d-3e22-484e-bae8-cbed868f4d28', - }, - }, - }, - saved_objects: [ - { rel: 'primary', type: 'alert', id: '1', namespace: undefined, type_id: 'test' }, - ], - task: { scheduled: '1970-01-01T00:00:00.000Z', schedule_delay: 0 }, - }, - rule: { - id: '1', - license: 'basic', - category: 'test', - ruleset: 'alerts', - }, - message: 'rule execution start: "1"', - }); - expect(eventLogger.logEvent.mock.calls[1][0]).toStrictEqual({ - event: { - action: 'execute', - kind: 'alert', - category: ['alerts'], - reason: 'disabled', + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 1, + generateEventLog({ + task: true, + action: EVENT_LOG_ACTIONS.executeStart, + }) + ); + expect(eventLogger.logEvent).toHaveBeenNthCalledWith( + 2, + generateEventLog({ + errorMessage: 'Rule failed to execute because rule ran after it was disabled.', + action: EVENT_LOG_ACTIONS.execute, outcome: 'failure', - }, - kibana: { - alert: { - rule: { - execution: { - uuid: '5f6aa57d-3e22-484e-bae8-cbed868f4d28', - }, - }, - }, - saved_objects: [ - { rel: 'primary', type: 'alert', id: '1', namespace: undefined, type_id: 'test' }, - ], - task: { - scheduled: '1970-01-01T00:00:00.000Z', - schedule_delay: 0, - }, - alerting: { status: 'error' }, - }, - rule: { - id: '1', - license: 'basic', - category: 'test', - ruleset: 'alerts', - }, - error: { - message: 'Rule failed to execute because rule ran after it was disabled.', - }, - message: 'test:1: execution failed', - }); + task: true, + reason: 'disabled', + status: 'error', + }) + ); expect(mockUsageCounter.incrementCounter).not.toHaveBeenCalled(); }); @@ -5412,41 +2369,9 @@ describe('Task Runner', () => { ); rulesClient.get.mockResolvedValue(mockedRuleTypeSavedObject); - encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValueOnce({ - id: '1', - type: 'alert', - attributes: { - apiKey: Buffer.from('123:abc').toString('base64'), - enabled: true, - }, - references: [], - }); + encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValueOnce(SAVED_OBJECT); const runnerResult = await taskRunner.run(); - expect(runnerResult).toMatchInlineSnapshot(` - Object { - "monitoring": Object { - "execution": Object { - "calculated_metrics": Object { - "success_ratio": 1, - }, - "history": Array [ - Object { - "success": true, - "timestamp": 0, - }, - ], - }, - }, - "schedule": Object { - "interval": "10s", - }, - "state": Object { - "alertInstances": Object {}, - "alertTypeState": undefined, - "previousStartedAt": 1970-01-01T00:00:00.000Z, - }, - } - `); + expect(runnerResult).toEqual(generateRunnerResult({ state: true, history: [true] })); }); test('successfully stores failure runs', async () => { @@ -5456,15 +2381,7 @@ describe('Task Runner', () => { taskRunnerFactoryInitializerParams ); rulesClient.get.mockResolvedValue(mockedRuleTypeSavedObject); - encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValueOnce({ - id: '1', - type: 'alert', - attributes: { - apiKey: Buffer.from('123:abc').toString('base64'), - enabled: true, - }, - references: [], - }); + encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValueOnce(SAVED_OBJECT); ruleType.executor.mockImplementation( async ({ services: executorServices, @@ -5475,31 +2392,11 @@ describe('Task Runner', () => { AlertInstanceContext, string >) => { - throw new Error('OMG'); + throw new Error(GENERIC_ERROR_MESSAGE); } ); const runnerResult = await taskRunner.run(); - expect(runnerResult).toMatchInlineSnapshot(` - Object { - "monitoring": Object { - "execution": Object { - "calculated_metrics": Object { - "success_ratio": 0, - }, - "history": Array [ - Object { - "success": false, - "timestamp": 0, - }, - ], - }, - }, - "schedule": Object { - "interval": "10s", - }, - "state": Object {}, - } - `); + expect(runnerResult).toEqual(generateRunnerResult({ successRatio: 0, success: false })); }); test('successfully stores the success ratio', async () => { @@ -5509,15 +2406,7 @@ describe('Task Runner', () => { taskRunnerFactoryInitializerParams ); rulesClient.get.mockResolvedValue(mockedRuleTypeSavedObject); - encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue({ - id: '1', - type: 'alert', - attributes: { - apiKey: Buffer.from('123:abc').toString('base64'), - enabled: true, - }, - references: [], - }); + encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue(SAVED_OBJECT); await taskRunner.run(); await taskRunner.run(); await taskRunner.run(); @@ -5532,44 +2421,14 @@ describe('Task Runner', () => { AlertInstanceContext, string >) => { - throw new Error('OMG'); + throw new Error(GENERIC_ERROR_MESSAGE); } ); const runnerResult = await taskRunner.run(); ruleType.executor.mockClear(); - expect(runnerResult).toMatchInlineSnapshot(` - Object { - "monitoring": Object { - "execution": Object { - "calculated_metrics": Object { - "success_ratio": 0.75, - }, - "history": Array [ - Object { - "success": true, - "timestamp": 0, - }, - Object { - "success": true, - "timestamp": 0, - }, - Object { - "success": true, - "timestamp": 0, - }, - Object { - "success": false, - "timestamp": 0, - }, - ], - }, - }, - "schedule": Object { - "interval": "10s", - }, - "state": Object {}, - } - `); + expect(runnerResult).toEqual( + generateRunnerResult({ successRatio: 0.75, history: [true, true, true, false] }) + ); }); test('caps monitoring history at 200', async () => { @@ -5579,15 +2438,7 @@ describe('Task Runner', () => { taskRunnerFactoryInitializerParams ); rulesClient.get.mockResolvedValue(mockedRuleTypeSavedObject); - encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue({ - id: '1', - type: 'alert', - attributes: { - apiKey: Buffer.from('123:abc').toString('base64'), - enabled: true, - }, - references: [], - }); + encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue(SAVED_OBJECT); for (let i = 0; i < 300; i++) { await taskRunner.run(); diff --git a/x-pack/plugins/alerting/server/task_runner/task_runner.ts b/x-pack/plugins/alerting/server/task_runner/task_runner.ts index c5651dcf4f57b..dbc7749a0fbdf 100644 --- a/x-pack/plugins/alerting/server/task_runner/task_runner.ts +++ b/x-pack/plugins/alerting/server/task_runner/task_runner.ts @@ -5,7 +5,7 @@ * 2.0. */ import apm from 'elastic-apm-node'; -import { Dictionary, pickBy, mapValues, without, cloneDeep, concat, set, omit } from 'lodash'; +import { pickBy, mapValues, without, cloneDeep, concat, set, omit } from 'lodash'; import type { Request } from '@hapi/hapi'; import { UsageCounter } from 'src/plugins/usage_collection/server'; import uuid from 'uuid'; @@ -38,16 +38,16 @@ import { RawRuleExecutionStatus, AlertAction, RuleExecutionState, + RuleExecutionRunResult, } from '../types'; import { promiseResult, map, Resultable, asOk, asErr, resolveErr } from '../lib/result_type'; import { getExecutionSuccessRatio, getExecutionDurationPercentiles } from '../lib/monitoring'; import { taskInstanceToAlertTaskInstance } from './alert_task_instance'; import { EVENT_LOG_ACTIONS } from '../plugin'; -import { IEvent, IEventLogger, SAVED_OBJECT_REL_PRIMARY } from '../../../event_log/server'; +import { IEvent, SAVED_OBJECT_REL_PRIMARY } from '../../../event_log/server'; import { isAlertSavedObjectNotFoundError, isEsUnavailableError } from '../lib/is_alerting_error'; import { partiallyUpdateAlert } from '../saved_objects'; import { - ActionGroup, AlertTypeParams, AlertTypeState, AlertInstanceState, @@ -65,6 +65,14 @@ import { import { createAbortableEsClientFactory } from '../lib/create_abortable_es_client_factory'; import { createWrappedScopedClusterClientFactory } from '../lib'; import { getRecoveredAlerts } from '../lib'; +import { + GenerateNewAndRecoveredAlertEventsParams, + LogActiveAndRecoveredAlertsParams, + RuleTaskInstance, + RuleTaskRunResult, + ScheduleActionsForRecoveredAlertsParams, + TrackAlertDurationsParams, +} from './types'; const FALLBACK_RETRY_INTERVAL = '5m'; const CONNECTIVITY_RETRY_INTERVAL = '5m'; @@ -81,22 +89,6 @@ export const getDefaultRuleMonitoring = (): RuleMonitoring => ({ }, }); -interface RuleExecutionRunResult { - state: RuleExecutionState; - monitoring: RuleMonitoring | undefined; - schedule: IntervalSchedule | undefined; -} - -interface RuleTaskRunResult { - state: RuleTaskState; - monitoring: RuleMonitoring | undefined; - schedule: IntervalSchedule | undefined; -} - -interface RuleTaskInstance extends ConcreteTaskInstance { - state: RuleTaskState; -} - export class TaskRunner< Params extends AlertTypeParams, ExtractedParams extends AlertTypeParams, @@ -940,15 +932,6 @@ export class TaskRunner< } } -interface TrackAlertDurationsParams< - InstanceState extends AlertInstanceState, - InstanceContext extends AlertInstanceContext -> { - originalAlerts: Dictionary>; - currentAlerts: Dictionary>; - recoveredAlerts: Dictionary>; -} - function trackAlertDurations< InstanceState extends AlertInstanceState, InstanceContext extends AlertInstanceContext @@ -995,34 +978,6 @@ function trackAlertDurations< } } -interface GenerateNewAndRecoveredAlertEventsParams< - InstanceState extends AlertInstanceState, - InstanceContext extends AlertInstanceContext -> { - eventLogger: IEventLogger; - executionId: string; - originalAlerts: Dictionary>; - currentAlerts: Dictionary>; - recoveredAlerts: Dictionary>; - ruleId: string; - ruleLabel: string; - namespace: string | undefined; - ruleType: NormalizedRuleType< - AlertTypeParams, - AlertTypeParams, - AlertTypeState, - { - [x: string]: unknown; - }, - { - [x: string]: unknown; - }, - string, - string - >; - rule: SanitizedAlert; -} - function generateNewAndRecoveredAlertEvents< InstanceState extends AlertInstanceState, InstanceContext extends AlertInstanceContext @@ -1144,19 +1099,6 @@ function generateNewAndRecoveredAlertEvents< } } -interface ScheduleActionsForRecoveredAlertsParams< - InstanceState extends AlertInstanceState, - InstanceContext extends AlertInstanceContext, - RecoveryActionGroupId extends string -> { - logger: Logger; - recoveryActionGroup: ActionGroup; - recoveredAlerts: Dictionary>; - executionHandler: ExecutionHandler; - mutedAlertIdsSet: Set; - ruleLabel: string; -} - async function scheduleActionsForRecoveredAlerts< InstanceState extends AlertInstanceState, InstanceContext extends AlertInstanceContext, @@ -1200,19 +1142,6 @@ async function scheduleActionsForRecoveredAlerts< return triggeredActions; } -interface LogActiveAndRecoveredAlertsParams< - InstanceState extends AlertInstanceState, - InstanceContext extends AlertInstanceContext, - ActionGroupIds extends string, - RecoveryActionGroupId extends string -> { - logger: Logger; - activeAlerts: Dictionary>; - recoveredAlerts: Dictionary>; - ruleLabel: string; - canSetRecoveryContext: boolean; -} - function logActiveAndRecoveredAlerts< InstanceState extends AlertInstanceState, InstanceContext extends AlertInstanceContext, diff --git a/x-pack/plugins/alerting/server/task_runner/types.ts b/x-pack/plugins/alerting/server/task_runner/types.ts new file mode 100644 index 0000000000000..c14ccfbef3220 --- /dev/null +++ b/x-pack/plugins/alerting/server/task_runner/types.ts @@ -0,0 +1,105 @@ +/* + * 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 { Dictionary } from 'lodash'; +import { Logger } from 'kibana/server'; +import { + ActionGroup, + AlertInstanceContext, + AlertInstanceState, + AlertTypeParams, + AlertTypeState, + IntervalSchedule, + RuleExecutionState, + RuleMonitoring, + RuleTaskState, + SanitizedAlert, +} from '../../common'; +import { ConcreteTaskInstance } from '../../../task_manager/server'; +import { Alert as CreatedAlert } from '../alert'; +import { IEventLogger } from '../../../event_log/server'; +import { NormalizedRuleType } from '../rule_type_registry'; +import { ExecutionHandler } from './create_execution_handler'; + +export interface RuleTaskRunResultWithActions { + state: RuleExecutionState; + monitoring: RuleMonitoring | undefined; + schedule: IntervalSchedule | undefined; +} + +export interface RuleTaskRunResult { + state: RuleTaskState; + monitoring: RuleMonitoring | undefined; + schedule: IntervalSchedule | undefined; +} + +export interface RuleTaskInstance extends ConcreteTaskInstance { + state: RuleTaskState; +} + +export interface TrackAlertDurationsParams< + InstanceState extends AlertInstanceState, + InstanceContext extends AlertInstanceContext +> { + originalAlerts: Dictionary>; + currentAlerts: Dictionary>; + recoveredAlerts: Dictionary>; +} + +export interface GenerateNewAndRecoveredAlertEventsParams< + InstanceState extends AlertInstanceState, + InstanceContext extends AlertInstanceContext +> { + eventLogger: IEventLogger; + executionId: string; + originalAlerts: Dictionary>; + currentAlerts: Dictionary>; + recoveredAlerts: Dictionary>; + ruleId: string; + ruleLabel: string; + namespace: string | undefined; + ruleType: NormalizedRuleType< + AlertTypeParams, + AlertTypeParams, + AlertTypeState, + { + [x: string]: unknown; + }, + { + [x: string]: unknown; + }, + string, + string + >; + rule: SanitizedAlert; +} + +export interface ScheduleActionsForRecoveredAlertsParams< + InstanceState extends AlertInstanceState, + InstanceContext extends AlertInstanceContext, + RecoveryActionGroupId extends string +> { + logger: Logger; + recoveryActionGroup: ActionGroup; + recoveredAlerts: Dictionary>; + executionHandler: ExecutionHandler; + mutedAlertIdsSet: Set; + ruleLabel: string; +} + +export interface LogActiveAndRecoveredAlertsParams< + InstanceState extends AlertInstanceState, + InstanceContext extends AlertInstanceContext, + ActionGroupIds extends string, + RecoveryActionGroupId extends string +> { + logger: Logger; + activeAlerts: Dictionary>; + recoveredAlerts: Dictionary>; + ruleLabel: string; + canSetRecoveryContext: boolean; +} From 0393f3f261b4f53bc2460ac41ba542a78ec5eb4e Mon Sep 17 00:00:00 2001 From: Mikhail Shustov Date: Fri, 25 Feb 2022 00:45:18 +0100 Subject: [PATCH 028/102] [main] update ES client version (#126129) * update renovate bot settings * update es client to 8.1-canary3 * specify type explicitly when pass a serialized object * attempt 1 in fleet.specify type explicitly when pass a serialized object * fix the first batch of ts errors * fix more violations * fix unit test * fix more violations 2 * fix more violations 3 * fix more violations 4 * review comments Co-authored-by: pgayvallet Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- package.json | 2 +- renovate.json | 6 ++-- .../create_alert_history_index_template.ts | 1 - .../canvas/server/lib/essql_strategy.ts | 2 +- .../server/es/cluster_client_adapter.test.ts | 4 ++- .../server/es/cluster_client_adapter.ts | 3 +- .../epm/elasticsearch/ml_model/install.ts | 21 +++++++++----- .../epm/elasticsearch/transform/remove.ts | 1 - .../elasticsearch/transform/transform.test.ts | 2 ++ .../server/lib/fetch_indices.ts | 2 -- .../license_management/server/lib/license.ts | 1 + .../chart_loader.ts | 14 ++++++---- .../revert_model_snapshot_flyout.tsx | 4 +-- .../hooks/use_index_data.ts | 5 +++- .../new_job/common/job_creator/job_creator.ts | 3 +- .../data_frame_analytics/models_provider.ts | 1 + .../models/data_recognizer/data_recognizer.ts | 5 ++-- .../ml/server/models/job_service/jobs.ts | 3 +- .../memory_overview_service.ts | 2 +- .../server/utils/create_or_update_index.ts | 2 +- .../painless_lab/server/routes/api/execute.ts | 15 +++++++--- .../check_ilm_migration_status.ts | 1 + .../routes/deprecations/deprecations.ts | 6 ++-- .../routes/api/jobs/register_create_route.ts | 1 + .../resource_installer.ts | 3 +- .../server/routes/api/snapshots.ts | 3 +- .../transform_health_service.ts | 6 +++- .../transform/server/routes/api/transforms.ts | 7 ++--- .../lib/reindexing/index_settings.test.ts | 7 +++-- .../server/routes/cloud_backup_status.ts | 1 - .../aggregated_scripted_job.ts | 4 --- .../ml/stack_management_jobs/export_jobs.ts | 3 -- yarn.lock | 28 +++++++++---------- 33 files changed, 94 insertions(+), 75 deletions(-) diff --git a/package.json b/package.json index b72f87f4243e3..5626837a4e48b 100644 --- a/package.json +++ b/package.json @@ -107,7 +107,7 @@ "@elastic/apm-synthtrace": "link:bazel-bin/packages/elastic-apm-synthtrace", "@elastic/charts": "43.1.1", "@elastic/datemath": "link:bazel-bin/packages/elastic-datemath", - "@elastic/elasticsearch": "npm:@elastic/elasticsearch-canary@8.1.0-canary.2", + "@elastic/elasticsearch": "npm:@elastic/elasticsearch-canary@8.1.0-canary.3", "@elastic/ems-client": "8.0.0", "@elastic/eui": "48.1.1", "@elastic/filesaver": "1.1.2", diff --git a/renovate.json b/renovate.json index 95358af48a2cc..9b673a5a9ccf6 100644 --- a/renovate.json +++ b/renovate.json @@ -35,14 +35,14 @@ "matchPackageNames": ["@elastic/elasticsearch"], "reviewers": ["team:kibana-operations", "team:kibana-core"], "matchBaseBranches": ["main"], - "labels": ["release_note:skip", "backport:skip", "Team:Operations", "Team:Core", "v8.1.0"], + "labels": ["release_note:skip", "backport:skip", "Team:Operations", "Team:Core"], "enabled": true }, { "groupName": "@elastic/elasticsearch", "matchPackageNames": ["@elastic/elasticsearch"], "reviewers": ["team:kibana-operations", "team:kibana-core"], - "matchBaseBranches": ["7.16"], + "matchBaseBranches": ["8.1"], "labels": ["release_note:skip", "Team:Operations", "Team:Core", "backport:skip"], "enabled": true }, @@ -50,7 +50,7 @@ "groupName": "@elastic/elasticsearch", "matchPackageNames": ["@elastic/elasticsearch"], "reviewers": ["team:kibana-operations", "team:kibana-core"], - "matchBaseBranches": ["7.15"], + "matchBaseBranches": ["7.17"], "labels": ["release_note:skip", "Team:Operations", "Team:Core", "backport:skip"], "enabled": true }, diff --git a/x-pack/plugins/actions/server/preconfigured_connectors/alert_history_es_index/create_alert_history_index_template.ts b/x-pack/plugins/actions/server/preconfigured_connectors/alert_history_es_index/create_alert_history_index_template.ts index bf3c4ff18e570..0a1c5037e7f8a 100644 --- a/x-pack/plugins/actions/server/preconfigured_connectors/alert_history_es_index/create_alert_history_index_template.ts +++ b/x-pack/plugins/actions/server/preconfigured_connectors/alert_history_es_index/create_alert_history_index_template.ts @@ -53,7 +53,6 @@ async function createIndexTemplate({ await client.indices.putIndexTemplate({ name: templateName, body: template, - // @ts-expect-error doesn't exist in @elastic/elasticsearch create: true, }); } catch (err) { diff --git a/x-pack/plugins/canvas/server/lib/essql_strategy.ts b/x-pack/plugins/canvas/server/lib/essql_strategy.ts index 0cc5c8a21121b..4e69f4831d375 100644 --- a/x-pack/plugins/canvas/server/lib/essql_strategy.ts +++ b/x-pack/plugins/canvas/server/lib/essql_strategy.ts @@ -32,11 +32,11 @@ export const essqlSearchStrategyProvider = (): ISearchStrategy< format: 'json', body: { query, - // @ts-expect-error `params` missing from `QuerySqlRequest` type params, field_multi_value_leniency: true, time_zone: timezone, fetch_size: count, + // @ts-expect-error `client_id` missing from `QuerySqlRequest` type client_id: 'canvas', filter: { bool: { diff --git a/x-pack/plugins/event_log/server/es/cluster_client_adapter.test.ts b/x-pack/plugins/event_log/server/es/cluster_client_adapter.test.ts index 5ff3b6c481d74..22898ac54db5a 100644 --- a/x-pack/plugins/event_log/server/es/cluster_client_adapter.test.ts +++ b/x-pack/plugins/event_log/server/es/cluster_client_adapter.test.ts @@ -393,7 +393,9 @@ describe('setIndexToHidden', () => { expect(clusterClient.indices.putSettings).toHaveBeenCalledWith({ index: 'foo-bar-000001', body: { - 'index.hidden': true, + index: { + hidden: true, + }, }, }); }); diff --git a/x-pack/plugins/event_log/server/es/cluster_client_adapter.ts b/x-pack/plugins/event_log/server/es/cluster_client_adapter.ts index 010d162c62ea1..bb958c3ce2b54 100644 --- a/x-pack/plugins/event_log/server/es/cluster_client_adapter.ts +++ b/x-pack/plugins/event_log/server/es/cluster_client_adapter.ts @@ -178,7 +178,6 @@ export class ClusterClientAdapter - esClient.ml.putTrainedModel({ - model_id: mlModel.installationName, - defer_definition_decompression: true, - timeout: '45s', - // @ts-expect-error expects an object not a string - body: mlModel.content, - }), + esClient.ml.putTrainedModel( + { + model_id: mlModel.installationName, + defer_definition_decompression: true, + timeout: '45s', + // @ts-expect-error expects an object not a string + body: mlModel.content, + }, + { + headers: { + 'content-type': 'application/json', + }, + } + ), { logger } ); } catch (err) { diff --git a/x-pack/plugins/fleet/server/services/epm/elasticsearch/transform/remove.ts b/x-pack/plugins/fleet/server/services/epm/elasticsearch/transform/remove.ts index 6a2284e0df742..07748c1635b3a 100644 --- a/x-pack/plugins/fleet/server/services/epm/elasticsearch/transform/remove.ts +++ b/x-pack/plugins/fleet/server/services/epm/elasticsearch/transform/remove.ts @@ -46,7 +46,6 @@ export const deleteTransforms = async (esClient: ElasticsearchClient, transformI await esClient.transport.request( { method: 'DELETE', - // @ts-expect-error @elastic/elasticsearch Transform is empty interface path: `/${transform?.dest?.index}`, }, { diff --git a/x-pack/plugins/fleet/server/services/epm/elasticsearch/transform/transform.test.ts b/x-pack/plugins/fleet/server/services/epm/elasticsearch/transform/transform.test.ts index 879c7614fedbf..4a1909cc813e7 100644 --- a/x-pack/plugins/fleet/server/services/epm/elasticsearch/transform/transform.test.ts +++ b/x-pack/plugins/fleet/server/services/epm/elasticsearch/transform/transform.test.ts @@ -106,6 +106,7 @@ describe('test transform install', () => { esClient.transform.getTransform.mockResponseOnce({ count: 1, transforms: [ + // @ts-expect-error incomplete data { dest: { index: 'index', @@ -394,6 +395,7 @@ describe('test transform install', () => { esClient.transform.getTransform.mockResponseOnce({ count: 1, transforms: [ + // @ts-expect-error incomplete data { dest: { index: 'index', diff --git a/x-pack/plugins/index_management/server/lib/fetch_indices.ts b/x-pack/plugins/index_management/server/lib/fetch_indices.ts index 9e8a8b23a7d9d..cec763a247ed7 100644 --- a/x-pack/plugins/index_management/server/lib/fetch_indices.ts +++ b/x-pack/plugins/index_management/server/lib/fetch_indices.ts @@ -51,9 +51,7 @@ async function fetchIndicesCall( const indexStats = indicesStats[indexName]; const aliases = Object.keys(indexData.aliases!); return { - // @ts-expect-error new property https://github.com/elastic/elasticsearch-specification/issues/1253 health: indexStats?.health, - // @ts-expect-error new property https://github.com/elastic/elasticsearch-specification/issues/1253 status: indexStats?.status, name: indexName, uuid: indexStats?.uuid, diff --git a/x-pack/plugins/license_management/server/lib/license.ts b/x-pack/plugins/license_management/server/lib/license.ts index 12f831f3d780a..915d3a8b50a3d 100644 --- a/x-pack/plugins/license_management/server/lib/license.ts +++ b/x-pack/plugins/license_management/server/lib/license.ts @@ -18,6 +18,7 @@ interface PutLicenseArg { export async function putLicense({ acknowledge, client, licensing, license }: PutLicenseArg) { try { const response = await client.asCurrentUser.license.post({ + // @ts-expect-error license is not typed in LM code body: license, acknowledge, }); diff --git a/x-pack/plugins/ml/public/application/components/model_snapshots/revert_model_snapshot_flyout/chart_loader.ts b/x-pack/plugins/ml/public/application/components/model_snapshots/revert_model_snapshot_flyout/chart_loader.ts index ad790b75f0454..790b69f7ebdd0 100644 --- a/x-pack/plugins/ml/public/application/components/model_snapshots/revert_model_snapshot_flyout/chart_loader.ts +++ b/x-pack/plugins/ml/public/application/components/model_snapshots/revert_model_snapshot_flyout/chart_loader.ts @@ -19,7 +19,8 @@ export function chartLoaderProvider(mlResultsService: MlResultsService) { ): Promise { const intervalMs = Math.max( Math.floor( - (job.data_counts.latest_record_timestamp - job.data_counts.earliest_record_timestamp) / bars + (job.data_counts.latest_record_timestamp! - job.data_counts.earliest_record_timestamp!) / + bars ), bucketSpanMs ); @@ -27,8 +28,8 @@ export function chartLoaderProvider(mlResultsService: MlResultsService) { job.datafeed_config.indices.join(), job.datafeed_config.query, job.data_description.time_field!, - job.data_counts.earliest_record_timestamp, - job.data_counts.latest_record_timestamp, + job.data_counts.earliest_record_timestamp!, + job.data_counts.latest_record_timestamp!, intervalMs, job.datafeed_config.runtime_mappings, job.datafeed_config.indices_options @@ -60,15 +61,16 @@ export function chartLoaderProvider(mlResultsService: MlResultsService) { ) { const intervalMs = Math.max( Math.floor( - (job.data_counts.latest_record_timestamp - job.data_counts.earliest_record_timestamp) / bars + (job.data_counts.latest_record_timestamp! - job.data_counts.earliest_record_timestamp!) / + bars ), bucketSpanMs ); const resp = await mlResultsService.getScoresByBucket( [job.job_id], - job.data_counts.earliest_record_timestamp, - job.data_counts.latest_record_timestamp, + job.data_counts.earliest_record_timestamp!, + job.data_counts.latest_record_timestamp!, intervalMs, 1 ); diff --git a/x-pack/plugins/ml/public/application/components/model_snapshots/revert_model_snapshot_flyout/revert_model_snapshot_flyout.tsx b/x-pack/plugins/ml/public/application/components/model_snapshots/revert_model_snapshot_flyout/revert_model_snapshot_flyout.tsx index b6b03f879bb57..498a27834d050 100644 --- a/x-pack/plugins/ml/public/application/components/model_snapshots/revert_model_snapshot_flyout/revert_model_snapshot_flyout.tsx +++ b/x-pack/plugins/ml/public/application/components/model_snapshots/revert_model_snapshot_flyout/revert_model_snapshot_flyout.tsx @@ -231,7 +231,7 @@ export const RevertModelSnapshotFlyout: FC = ({ overlayRanges={[ { start: currentSnapshot.latest_record_time_stamp, - end: job.data_counts.latest_record_timestamp, + end: job.data_counts.latest_record_timestamp!, color: '#ff0000', }, ]} @@ -334,7 +334,7 @@ export const RevertModelSnapshotFlyout: FC = ({ calendarEvents={calendarEvents} setCalendarEvents={setCalendarEvents} minSelectableTimeStamp={snapshot.latest_record_time_stamp} - maxSelectableTimeStamp={job.data_counts.latest_record_timestamp} + maxSelectableTimeStamp={job.data_counts.latest_record_timestamp!} eventRateData={eventRateData} anomalies={anomalies} chartReady={chartReady} diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/hooks/use_index_data.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/hooks/use_index_data.ts index 018fb326ba398..b8b8db4c916ae 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/hooks/use_index_data.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/hooks/use_index_data.ts @@ -44,7 +44,10 @@ interface MLEuiDataGridColumn extends EuiDataGridColumn { function getRuntimeFieldColumns(runtimeMappings: RuntimeMappings) { return Object.keys(runtimeMappings).map((id) => { - const field = runtimeMappings[id]; + let field = runtimeMappings[id]; + if (Array.isArray(field)) { + field = field[0]; + } const schema = getDataGridSchemaFromESFieldType( field.type as estypes.MappingRuntimeField['type'] ); diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/job_creator.ts b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/job_creator.ts index 804a368174c76..8c5a45137a8a1 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/job_creator.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/job_creator.ts @@ -262,6 +262,7 @@ export class JobCreator { this._initModelPlotConfig(); this._job_config.model_plot_config!.enabled = enable; } + public get modelPlot() { return ( this._job_config.model_plot_config !== undefined && @@ -737,7 +738,7 @@ export class JobCreator { ({ id, name: id, - type: runtimeField.type, + type: Array.isArray(runtimeField) ? runtimeField[0].type : runtimeField.type, aggregatable: true, aggs: [], runtimeField, diff --git a/x-pack/plugins/ml/server/models/data_frame_analytics/models_provider.ts b/x-pack/plugins/ml/server/models/data_frame_analytics/models_provider.ts index aba12ae93fdec..c12f611c011f6 100644 --- a/x-pack/plugins/ml/server/models/data_frame_analytics/models_provider.ts +++ b/x-pack/plugins/ml/server/models/data_frame_analytics/models_provider.ts @@ -34,6 +34,7 @@ const NODE_FIELDS = ['attributes', 'name', 'roles', 'version'] as const; export type RequiredNodeFields = Pick; +// @ts-expect-error TrainedModelDeploymentStatsResponse missing properties from MlTrainedModelDeploymentStats interface TrainedModelStatsResponse extends MlTrainedModelStats { deployment_stats?: Omit; model_size_stats?: TrainedModelModelSizeStats; diff --git a/x-pack/plugins/ml/server/models/data_recognizer/data_recognizer.ts b/x-pack/plugins/ml/server/models/data_recognizer/data_recognizer.ts index dad1ecb7bc4ba..3df5016f560c0 100644 --- a/x-pack/plugins/ml/server/models/data_recognizer/data_recognizer.ts +++ b/x-pack/plugins/ml/server/models/data_recognizer/data_recognizer.ts @@ -603,8 +603,8 @@ export class DataRecognizer { } as JobStat; if (job.data_counts) { - jobStat.earliestTimestampMs = job.data_counts.earliest_record_timestamp; - jobStat.latestTimestampMs = job.data_counts.latest_record_timestamp; + jobStat.earliestTimestampMs = job.data_counts.earliest_record_timestamp!; + jobStat.latestTimestampMs = job.data_counts.latest_record_timestamp!; jobStat.latestResultsTimestampMs = getLatestDataOrBucketTimestamp( jobStat.latestTimestampMs, latestBucketTimestampsByJob[job.job_id] as number @@ -781,6 +781,7 @@ export class DataRecognizer { } private async _saveJob(job: ModuleJob) { + // @ts-expect-error type mismatch on MlPutJobRequest.body return this._mlClient.putJob({ job_id: job.id, body: job.config }); } diff --git a/x-pack/plugins/ml/server/models/job_service/jobs.ts b/x-pack/plugins/ml/server/models/job_service/jobs.ts index 81e1b1f693449..2f8e17ce142a7 100644 --- a/x-pack/plugins/ml/server/models/job_service/jobs.ts +++ b/x-pack/plugins/ml/server/models/job_service/jobs.ts @@ -590,7 +590,7 @@ export function jobsProvider( if (body.jobs.length) { const statsForJob = body.jobs[0]; - const time = statsForJob.data_counts.latest_record_timestamp; + const time = statsForJob.data_counts.latest_record_timestamp!; const progress = (time - start) / (end - start); const isJobClosed = statsForJob.state === JOB_STATE.CLOSED; return { @@ -631,6 +631,7 @@ export function jobsProvider( results[job.job_id] = { job: { success: false }, datafeed: { success: false } }; try { + // @ts-expect-error type mismatch on MlPutJobRequest.body await mlClient.putJob({ job_id: job.job_id, body: job }); results[job.job_id].job = { success: true }; } catch (error) { diff --git a/x-pack/plugins/ml/server/models/memory_overview/memory_overview_service.ts b/x-pack/plugins/ml/server/models/memory_overview/memory_overview_service.ts index e7bbc95ded742..d7f6eb584f7fe 100644 --- a/x-pack/plugins/ml/server/models/memory_overview/memory_overview_service.ts +++ b/x-pack/plugins/ml/server/models/memory_overview/memory_overview_service.ts @@ -74,7 +74,7 @@ export function memoryOverviewServiceProvider(mlClient: MlClient) { .filter((v) => v.state === 'opened') .map((jobStats) => { return { - node_id: jobStats.node.id, + node_id: jobStats.node!.id, // @ts-expect-error model_bytes can be string | number, cannot sum it with AD_PROCESS_MEMORY_OVERHEAD model_size: jobStats.model_size_stats.model_bytes + AD_PROCESS_MEMORY_OVERHEAD, job_id: jobStats.job_id, diff --git a/x-pack/plugins/observability/server/utils/create_or_update_index.ts b/x-pack/plugins/observability/server/utils/create_or_update_index.ts index a9d583bbf86af..af7dc670b0be8 100644 --- a/x-pack/plugins/observability/server/utils/create_or_update_index.ts +++ b/x-pack/plugins/observability/server/utils/create_or_update_index.ts @@ -77,7 +77,7 @@ function createNewIndex({ index, body: { // auto_expand_replicas: Allows cluster to not have replicas for this index - settings: { 'index.auto_expand_replicas': '0-1' }, + settings: { index: { auto_expand_replicas: '0-1' } }, mappings, }, }); diff --git a/x-pack/plugins/painless_lab/server/routes/api/execute.ts b/x-pack/plugins/painless_lab/server/routes/api/execute.ts index bc850f9e8043d..58cb9f4328d29 100644 --- a/x-pack/plugins/painless_lab/server/routes/api/execute.ts +++ b/x-pack/plugins/painless_lab/server/routes/api/execute.ts @@ -26,10 +26,17 @@ export function registerExecuteRoute({ router, license }: RouteDependencies) { try { const client = ctx.core.elasticsearch.client.asCurrentUser; - const response = await client.scriptsPainlessExecute({ - // @ts-expect-error `ExecutePainlessScriptRequest.body` does not allow `string` - body, - }); + const response = await client.scriptsPainlessExecute( + { + // @ts-expect-error `ExecutePainlessScriptRequest.body` does not allow `string` + body, + }, + { + headers: { + 'content-type': 'application/json', + }, + } + ); return res.ok({ body: response, diff --git a/x-pack/plugins/reporting/server/lib/deprecations/check_ilm_migration_status.ts b/x-pack/plugins/reporting/server/lib/deprecations/check_ilm_migration_status.ts index a7b9ecc7dc437..c3aea64171444 100644 --- a/x-pack/plugins/reporting/server/lib/deprecations/check_ilm_migration_status.ts +++ b/x-pack/plugins/reporting/server/lib/deprecations/check_ilm_migration_status.ts @@ -29,6 +29,7 @@ export const checkIlmMigrationStatus = async ({ const hasUnmanagedIndices = Object.values(reportingIndicesSettings).some((settings) => { return ( settings?.settings?.index?.lifecycle?.name !== ILM_POLICY_NAME && + // @ts-expect-error index.lifecycle not present on type def settings?.settings?.['index.lifecycle']?.name !== ILM_POLICY_NAME ); }); diff --git a/x-pack/plugins/reporting/server/routes/deprecations/deprecations.ts b/x-pack/plugins/reporting/server/routes/deprecations/deprecations.ts index b369a5758fcb5..4c368337cd482 100644 --- a/x-pack/plugins/reporting/server/routes/deprecations/deprecations.ts +++ b/x-pack/plugins/reporting/server/routes/deprecations/deprecations.ts @@ -126,8 +126,10 @@ export const registerDeprecationsRoutes = (reporting: ReportingCore, logger: Log await client.indices.putSettings({ index: indexPattern, body: { - 'index.lifecycle': { - name: ILM_POLICY_NAME, + index: { + lifecycle: { + name: ILM_POLICY_NAME, + }, }, }, }); diff --git a/x-pack/plugins/rollup/server/routes/api/jobs/register_create_route.ts b/x-pack/plugins/rollup/server/routes/api/jobs/register_create_route.ts index a13bf4936a77f..ca067d0833981 100644 --- a/x-pack/plugins/rollup/server/routes/api/jobs/register_create_route.ts +++ b/x-pack/plugins/rollup/server/routes/api/jobs/register_create_route.ts @@ -35,6 +35,7 @@ export const registerCreateRoute = ({ // Create job. await clusterClient.asCurrentUser.rollup.putJob({ id, + // @ts-expect-error type mismatch on RollupPutJobRequest.body body: rest, }); // Then request the newly created job. diff --git a/x-pack/plugins/rule_registry/server/rule_data_plugin_service/resource_installer.ts b/x-pack/plugins/rule_registry/server/rule_data_plugin_service/resource_installer.ts index 2bda23ca3c46f..8e7d13b0dc210 100644 --- a/x-pack/plugins/rule_registry/server/rule_data_plugin_service/resource_installer.ts +++ b/x-pack/plugins/rule_registry/server/rule_data_plugin_service/resource_installer.ts @@ -309,10 +309,9 @@ export class ResourceInstaller { template: { settings: { hidden: true, + // @ts-expect-error type only defines nested structure 'index.lifecycle': { name: ilmPolicyName, - // TODO: fix the types in the ES package, they don't include rollover_alias??? - // @ts-expect-error rollover_alias: primaryNamespacedAlias, }, 'index.mapping.total_fields.limit': 1700, diff --git a/x-pack/plugins/snapshot_restore/server/routes/api/snapshots.ts b/x-pack/plugins/snapshot_restore/server/routes/api/snapshots.ts index f85c9c33756b7..7425ad0c272c6 100644 --- a/x-pack/plugins/snapshot_restore/server/routes/api/snapshots.ts +++ b/x-pack/plugins/snapshot_restore/server/routes/api/snapshots.ts @@ -127,8 +127,6 @@ export function registerSnapshotsRoutes({ operator: searchOperator, }) : '_all', - // @ts-expect-error @elastic/elasticsearch new API params - // https://github.com/elastic/elasticsearch-specification/issues/845 slm_policy_filter: searchField === 'policyName' ? getSnapshotSearchWildcard({ @@ -139,6 +137,7 @@ export function registerSnapshotsRoutes({ }) : '*,_none', order: sortDirection, + // @ts-expect-error sortField: string is not compatible with SnapshotSnapshotSort type sort: sortField, size: pageSize, offset: pageIndex * pageSize, diff --git a/x-pack/plugins/transform/server/lib/alerting/transform_health_rule_type/transform_health_service.ts b/x-pack/plugins/transform/server/lib/alerting/transform_health_rule_type/transform_health_service.ts index e2512bfac2c55..7aebf83b27cca 100644 --- a/x-pack/plugins/transform/server/lib/alerting/transform_health_rule_type/transform_health_service.ts +++ b/x-pack/plugins/transform/server/lib/alerting/transform_health_rule_type/transform_health_service.ts @@ -29,7 +29,11 @@ interface TestResult { context: TransformHealthAlertContext; } -type Transform = estypes.Transform & { id: string; description?: string; sync: object }; +type Transform = estypes.TransformGetTransformTransformSummary & { + id: string; + description?: string; + sync: object; +}; type TransformWithAlertingRules = Transform & { alerting_rules: TransformHealthAlertRule[] }; diff --git a/x-pack/plugins/transform/server/routes/api/transforms.ts b/x-pack/plugins/transform/server/routes/api/transforms.ts index 09fab2b45909e..2f82b9a70389b 100644 --- a/x-pack/plugins/transform/server/routes/api/transforms.ts +++ b/x-pack/plugins/transform/server/routes/api/transforms.ts @@ -508,12 +508,9 @@ async function deleteTransforms( transform_id: transformId, }); const transformConfig = body.transforms[0]; - // @ts-expect-error @elastic/elasticsearch doesn't provide typings for Transform destinationIndex = Array.isArray(transformConfig.dest.index) - ? // @ts-expect-error @elastic/elasticsearch doesn't provide typings for Transform - transformConfig.dest.index[0] - : // @ts-expect-error @elastic/elasticsearch doesn't provide typings for Transform - transformConfig.dest.index; + ? transformConfig.dest.index[0] + : transformConfig.dest.index; } catch (getTransformConfigError) { transformDeleted.error = getTransformConfigError.meta.body.error; results[transformId] = { diff --git a/x-pack/plugins/upgrade_assistant/server/lib/reindexing/index_settings.test.ts b/x-pack/plugins/upgrade_assistant/server/lib/reindexing/index_settings.test.ts index 0c31a5b8d2fe5..69584dd75de7d 100644 --- a/x-pack/plugins/upgrade_assistant/server/lib/reindexing/index_settings.test.ts +++ b/x-pack/plugins/upgrade_assistant/server/lib/reindexing/index_settings.test.ts @@ -36,11 +36,11 @@ describe('transformFlatSettings', () => { transformFlatSettings({ settings: { // Settings that should get preserved + // @ts-expect-error @elastic/elasticsearch doesn't declare it 'index.number_of_replicas': '1', 'index.number_of_shards': '5', // Blacklisted settings - // @ts-expect-error @elastic/elasticsearch doesn't declare it 'index.allocation.existing_shards_allocator': 'gateway_allocator', 'index.blocks.write': 'true', 'index.creation_date': '1547052614626', @@ -87,11 +87,11 @@ describe('transformFlatSettings', () => { transformFlatSettings({ settings: { // Settings that should get preserved + // @ts-expect-error @elastic/elasticsearch doesn't declare it 'index.number_of_replicas': '1', 'index.number_of_shards': '5', // Deprecated settings - // @ts-expect-error @elastic/elasticsearch doesn't declare it 'index.soft_deletes.enabled': 'true', 'index.translog.retention.size': '5b', }, @@ -111,11 +111,11 @@ describe('transformFlatSettings', () => { transformFlatSettings({ settings: { // Settings that should get preserved + // @ts-expect-error @elastic/elasticsearch doesn't declare it 'index.number_of_replicas': '1', 'index.number_of_shards': '5', // Deprecated settings - // @ts-expect-error @elastic/elasticsearch doesn't declare it 'index.soft_deletes.enabled': 'true', 'index.translog.retention.age': '5d', }, @@ -245,6 +245,7 @@ describe('transformFlatSettings', () => { expect( getReindexWarnings({ settings: { + // @ts-expect-error @elastic/elasticsearch doesn't declare it 'index.number_of_replicas': '1', }, mappings: {}, diff --git a/x-pack/plugins/upgrade_assistant/server/routes/cloud_backup_status.ts b/x-pack/plugins/upgrade_assistant/server/routes/cloud_backup_status.ts index b757602c6ab53..6dffead8ec91f 100644 --- a/x-pack/plugins/upgrade_assistant/server/routes/cloud_backup_status.ts +++ b/x-pack/plugins/upgrade_assistant/server/routes/cloud_backup_status.ts @@ -24,7 +24,6 @@ export function registerCloudBackupStatusRoutes({ repository: CLOUD_SNAPSHOT_REPOSITORY, snapshot: '_all', ignore_unavailable: true, // Allow request to succeed even if some snapshots are unavailable. - // @ts-expect-error @elastic/elasticsearch "desc" is a new param order: 'desc', sort: 'start_time', size: 1, diff --git a/x-pack/test/functional/apps/ml/anomaly_detection/aggregated_scripted_job.ts b/x-pack/test/functional/apps/ml/anomaly_detection/aggregated_scripted_job.ts index 4edf87ab8d1fb..e5b2fb30d4e45 100644 --- a/x-pack/test/functional/apps/ml/anomaly_detection/aggregated_scripted_job.ts +++ b/x-pack/test/functional/apps/ml/anomaly_detection/aggregated_scripted_job.ts @@ -16,7 +16,6 @@ export default function ({ getService }: FtrProviderContext) { const supportedTestSuites = [ { suiteTitle: 'supported job with aggregation field', - // @ts-expect-error not convertable to Job type jobConfig: { job_id: `fq_supported_aggs_${ts}`, job_type: 'anomaly_detector', @@ -103,7 +102,6 @@ export default function ({ getService }: FtrProviderContext) { }, { suiteTitle: 'supported job with scripted field', - // @ts-expect-error not convertable to Job type jobConfig: { job_id: `fq_supported_script_${ts}`, job_type: 'anomaly_detector', @@ -178,7 +176,6 @@ export default function ({ getService }: FtrProviderContext) { const unsupportedTestSuites = [ { suiteTitle: 'unsupported job with bucket_script aggregation field', - // @ts-expect-error not convertable to Job type jobConfig: { job_id: `fq_unsupported_aggs_${ts}`, job_type: 'anomaly_detector', @@ -283,7 +280,6 @@ export default function ({ getService }: FtrProviderContext) { }, { suiteTitle: 'unsupported job with partition by of a scripted field', - // @ts-expect-error not convertable to Job type jobConfig: { job_id: `fq_unsupported_script_${ts}`, job_type: 'anomaly_detector', diff --git a/x-pack/test/functional/apps/ml/stack_management_jobs/export_jobs.ts b/x-pack/test/functional/apps/ml/stack_management_jobs/export_jobs.ts index a31b9faa169f9..c3d0ee718cecd 100644 --- a/x-pack/test/functional/apps/ml/stack_management_jobs/export_jobs.ts +++ b/x-pack/test/functional/apps/ml/stack_management_jobs/export_jobs.ts @@ -11,7 +11,6 @@ import type { DataFrameAnalyticsConfig } from '../../../../../plugins/ml/public/ const testADJobs: Array<{ job: Job; datafeed: Datafeed }> = [ { - // @ts-expect-error not full interface job: { job_id: 'fq_single_1_smv', groups: ['farequote', 'automated', 'single-metric'], @@ -64,7 +63,6 @@ const testADJobs: Array<{ job: Job; datafeed: Datafeed }> = [ }, }, { - // @ts-expect-error not full interface job: { job_id: 'fq_single_2_smv', groups: ['farequote', 'automated', 'single-metric'], @@ -117,7 +115,6 @@ const testADJobs: Array<{ job: Job; datafeed: Datafeed }> = [ }, }, { - // @ts-expect-error not full interface job: { job_id: 'fq_single_3_smv', groups: ['farequote', 'automated', 'single-metric'], diff --git a/yarn.lock b/yarn.lock index ee986fe2f4d32..e68fcf7c1e3c4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2371,12 +2371,12 @@ dependencies: "@elastic/ecs-helpers" "^1.1.0" -"@elastic/elasticsearch@npm:@elastic/elasticsearch-canary@8.1.0-canary.2": - version "8.1.0-canary.2" - resolved "https://registry.yarnpkg.com/@elastic/elasticsearch-canary/-/elasticsearch-canary-8.1.0-canary.2.tgz#7676b3bdad79a37be4b4ada38f97751314a33a52" - integrity sha512-nmr7yZbvlTqA5SHu/IJZFsU6v14+Y2nx0btMKB9Hjd0vardaibCAdovO9Bp1RPxda2g6XayEkKEzwq5s79xR1g== +"@elastic/elasticsearch@npm:@elastic/elasticsearch-canary@8.1.0-canary.3": + version "8.1.0-canary.3" + resolved "https://registry.yarnpkg.com/@elastic/elasticsearch-canary/-/elasticsearch-canary-8.1.0-canary.3.tgz#a84669ad45ea465e533d860bf99aa55aed781cb3" + integrity sha512-rpsMiJX5sAAlPjfWzZhijQgpu7ZlPwjcJQHCT3wNz03DTDnokLCqkhc8gsU+uqesbQ/GqYUlSL9erCk4GqjOLg== dependencies: - "@elastic/transport" "^8.1.0-beta.1" + "@elastic/transport" "^8.0.2" tslib "^2.3.0" "@elastic/ems-client@8.0.0": @@ -2559,17 +2559,17 @@ ts-node "^10.2.1" typescript "^4.3.5" -"@elastic/transport@^8.1.0-beta.1": - version "8.1.0-beta.1" - resolved "https://registry.yarnpkg.com/@elastic/transport/-/transport-8.1.0-beta.1.tgz#37fde777cf83226f1ea46bf0a22e51a3e43efb85" - integrity sha512-aqncMX86d3r6tNGlve6HEy+NF8XZXetMxDXpplrOAcShL20mHXkMFTJyUyML01tgfkbbgwXnN714YEjin1u1Xg== +"@elastic/transport@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@elastic/transport/-/transport-8.0.2.tgz#715f06c7739516867508108df30c33973ca8e81c" + integrity sha512-OlDz3WO3pKE9vSxW4wV/mn7rYCtBmSsDwxr64h/S1Uc/zrIBXb0iUsRMSkiybXugXhjwyjqG2n1Wc7jjFxrskQ== dependencies: debug "^4.3.2" hpagent "^0.1.2" ms "^2.1.3" secure-json-parse "^2.4.0" tslib "^2.3.0" - undici "^4.7.0" + undici "^4.14.1" "@emotion/babel-plugin-jsx-pragmatic@^0.1.5": version "0.1.5" @@ -29147,10 +29147,10 @@ undertaker@^1.2.1: object.reduce "^1.0.0" undertaker-registry "^1.0.0" -undici@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/undici/-/undici-4.7.0.tgz#3bda286d67bf45d0ab1b94ca6c84e546dcb3b0d4" - integrity sha512-O1q+/EIs4g0HnVMH8colei3qODGiYBLpavWYv3kI+JazBBsBIndnZfUqZ2MEfPJ12H9d56yVdwZG1/nV/xcoSQ== +undici@^4.14.1: + version "4.14.1" + resolved "https://registry.yarnpkg.com/undici/-/undici-4.14.1.tgz#7633b143a8a10d6d63335e00511d071e8d52a1d9" + integrity sha512-WJ+g+XqiZcATcBaUeluCajqy4pEDcQfK1vy+Fo+bC4/mqXI9IIQD/XWHLS70fkGUT6P52Drm7IFslO651OdLPQ== unfetch@^4.2.0: version "4.2.0" From 4155f166f3f1017b5a9fa8c2e2a8679e204ab400 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B8ren=20Louv-Jansen?= Date: Fri, 25 Feb 2022 01:01:20 +0100 Subject: [PATCH 029/102] Bump backport to 7.3.0 (#126149) --- .github/workflows/backport-next.yml | 27 +++++++++++++++++ package.json | 2 +- yarn.lock | 46 ++++++++++++++++++++++++----- 3 files changed, 67 insertions(+), 8 deletions(-) create mode 100644 .github/workflows/backport-next.yml diff --git a/.github/workflows/backport-next.yml b/.github/workflows/backport-next.yml new file mode 100644 index 0000000000000..6779bb4247241 --- /dev/null +++ b/.github/workflows/backport-next.yml @@ -0,0 +1,27 @@ +on: + pull_request_target: + branches: + - main + types: + - labeled + - closed + +jobs: + backport: + name: Backport PR + runs-on: ubuntu-latest + if: | + github.event.pull_request.merged == true + && contains(github.event.pull_request.labels.*.name, 'auto-backport-next') + && ( + (github.event.action == 'labeled' && github.event.label.name == 'auto-backport-next') + || (github.event.action == 'closed') + ) + steps: + - name: Backport Action + uses: sqren/backport-github-action@v7.3.1 + with: + github_token: ${{secrets.KIBANAMACHINE_TOKEN}} + + - name: Backport log + run: cat /home/runner/.backport/backport.log diff --git a/package.json b/package.json index 5626837a4e48b..c87ce15f455ca 100644 --- a/package.json +++ b/package.json @@ -733,7 +733,7 @@ "babel-plugin-require-context-hook": "^1.0.0", "babel-plugin-styled-components": "^2.0.2", "babel-plugin-transform-react-remove-prop-types": "^0.4.24", - "backport": "7.0.1", + "backport": "^7.3.1", "callsites": "^3.1.0", "chai": "3.5.0", "chance": "1.0.18", diff --git a/yarn.lock b/yarn.lock index e68fcf7c1e3c4..68816f9b172a9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2142,6 +2142,11 @@ exec-sh "^0.3.2" minimist "^1.2.0" +"@colors/colors@1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" + integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== + "@cspotcode/source-map-consumer@0.8.0": version "0.8.0" resolved "https://registry.yarnpkg.com/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz#33bf4b7b39c178821606f669bbc447a6a629786b" @@ -9587,10 +9592,10 @@ bach@^1.0.0: async-settle "^1.0.0" now-and-later "^2.0.0" -backport@7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/backport/-/backport-7.0.1.tgz#021f70db76b89699b2c7b826cb3040e9c1d991c9" - integrity sha512-f/7+NDzLFd307c85Tz60cfBzoRd4HlFlNOm3MYFynQwI4igMmKd4J9bFxLgc3KdToaVWDmZ37Gx9nRkYgMfUkA== +backport@^7.3.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/backport/-/backport-7.3.1.tgz#c5c57e03c87f5883f769e30efc0e7193ce7670f2" + integrity sha512-F1gjJx/pxn9zI74Np6FlTD8ovqeUbzzgzGyBpoYypAdDTJG8Vxt1jcrcwZtRIaSd7McfXCSoQsinlFzO4qlPcA== dependencies: "@octokit/rest" "^18.12.0" axios "^0.25.0" @@ -9608,7 +9613,7 @@ backport@7.0.1: strip-json-comments "^3.1.1" terminal-link "^2.1.1" utility-types "^3.10.0" - winston "^3.5.1" + winston "^3.6.0" yargs "^17.3.1" yargs-parser "^21.0.0" @@ -20101,6 +20106,17 @@ logform@^2.3.2: safe-stable-stringify "^1.1.0" triple-beam "^1.3.0" +logform@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/logform/-/logform-2.4.0.tgz#131651715a17d50f09c2a2c1a524ff1a4164bcfe" + integrity sha512-CPSJw4ftjf517EhXZGGvTHHkYobo7ZCc0kvwUoOYcjfR2UVrI66RHj8MCrfAdEitdmFqbu2BYdYs8FHHZSb6iw== + dependencies: + "@colors/colors" "1.5.0" + fecha "^4.2.0" + ms "^2.1.1" + safe-stable-stringify "^2.3.1" + triple-beam "^1.3.0" + loglevel@^1.6.8: version "1.6.8" resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.8.tgz#8a25fb75d092230ecd4457270d80b54e28011171" @@ -30808,7 +30824,7 @@ windows-release@^3.1.0: dependencies: execa "^1.0.0" -winston-transport@^4.4.2: +winston-transport@^4.4.2, winston-transport@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.5.0.tgz#6e7b0dd04d393171ed5e4e4905db265f7ab384fa" integrity sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q== @@ -30817,7 +30833,7 @@ winston-transport@^4.4.2: readable-stream "^3.6.0" triple-beam "^1.3.0" -winston@^3.0.0, winston@^3.3.3, winston@^3.5.1: +winston@^3.0.0, winston@^3.3.3: version "3.5.1" resolved "https://registry.yarnpkg.com/winston/-/winston-3.5.1.tgz#b25cc899d015836dbf8c583dec8c4c4483a0da2e" integrity sha512-tbRtVy+vsSSCLcZq/8nXZaOie/S2tPXPFt4be/Q3vI/WtYwm7rrwidxVw2GRa38FIXcJ1kUM6MOZ9Jmnk3F3UA== @@ -30833,6 +30849,22 @@ winston@^3.0.0, winston@^3.3.3, winston@^3.5.1: triple-beam "^1.3.0" winston-transport "^4.4.2" +winston@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/winston/-/winston-3.6.0.tgz#be32587a099a292b88c49fac6fa529d478d93fb6" + integrity sha512-9j8T75p+bcN6D00sF/zjFVmPp+t8KMPB1MzbbzYjeN9VWxdsYnTB40TkbNUEXAmILEfChMvAMgidlX64OG3p6w== + dependencies: + "@dabh/diagnostics" "^2.0.2" + async "^3.2.3" + is-stream "^2.0.0" + logform "^2.4.0" + one-time "^1.0.0" + readable-stream "^3.4.0" + safe-stable-stringify "^2.3.1" + stack-trace "0.0.x" + triple-beam "^1.3.0" + winston-transport "^4.5.0" + wkt-parser@^1.2.4: version "1.3.2" resolved "https://registry.yarnpkg.com/wkt-parser/-/wkt-parser-1.3.2.tgz#deeff04a21edc5b170a60da418e9ed1d1ab0e219" From 45a003fa061d6bea1185b484d2259f7fa1c80590 Mon Sep 17 00:00:00 2001 From: Muhammad Ibragimov <53621505+mibragimov@users.noreply.github.com> Date: Fri, 25 Feb 2022 10:03:53 +0500 Subject: [PATCH 030/102] [Console] unskip flaky tests (#124783) * Unskip flaky console tests Co-authored-by: Muhammad Ibragimov Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- test/functional/apps/console/_autocomplete.ts | 62 +++++++++++++++++++ test/functional/apps/console/_console.ts | 34 +--------- test/functional/apps/console/index.js | 4 +- test/functional/page_objects/console_page.ts | 28 ++++++--- 4 files changed, 83 insertions(+), 45 deletions(-) create mode 100644 test/functional/apps/console/_autocomplete.ts diff --git a/test/functional/apps/console/_autocomplete.ts b/test/functional/apps/console/_autocomplete.ts new file mode 100644 index 0000000000000..423440ecdf3f8 --- /dev/null +++ b/test/functional/apps/console/_autocomplete.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 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 expect from '@kbn/expect'; +import { FtrProviderContext } from '../../ftr_provider_context'; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const log = getService('log'); + const PageObjects = getPageObjects(['common', 'console']); + + describe('console autocomplete feature', function describeIndexTests() { + this.tags('includeFirefox'); + before(async () => { + log.debug('navigateTo console'); + await PageObjects.common.navigateToApp('console'); + // Ensure that the text area can be interacted with + await PageObjects.console.dismissTutorial(); + }); + + it('should provide basic auto-complete functionality', async () => { + await PageObjects.console.enterRequest(); + await PageObjects.console.promptAutocomplete(); + expect(PageObjects.console.isAutocompleteVisible()).to.be.eql(true); + }); + + describe('with a missing comma in query', () => { + const LINE_NUMBER = 4; + beforeEach(async () => { + await PageObjects.console.clearTextArea(); + await PageObjects.console.enterRequest(); + }); + it('should add a comma after previous non empty line', async () => { + await PageObjects.console.enterText(`{\n\t"query": {\n\t\t"match": {}`); + await PageObjects.console.pressEnter(); + await PageObjects.console.pressEnter(); + await PageObjects.console.pressEnter(); + await PageObjects.console.promptAutocomplete(); + await PageObjects.console.pressEnter(); + + const text = await PageObjects.console.getVisibleTextAt(LINE_NUMBER); + const lastChar = text.charAt(text.length - 1); + expect(lastChar).to.be.eql(','); + }); + + it('should add a comma after the triple quoted strings', async () => { + await PageObjects.console.enterText(`{\n\t"query": {\n\t\t"term": """some data"""`); + await PageObjects.console.pressEnter(); + await PageObjects.console.promptAutocomplete(); + await PageObjects.console.pressEnter(); + + const text = await PageObjects.console.getVisibleTextAt(LINE_NUMBER); + const lastChar = text.charAt(text.length - 1); + expect(lastChar).to.be.eql(','); + }); + }); + }); +} diff --git a/test/functional/apps/console/_console.ts b/test/functional/apps/console/_console.ts index 12d3663ebecbb..1913a38d7573e 100644 --- a/test/functional/apps/console/_console.ts +++ b/test/functional/apps/console/_console.ts @@ -27,8 +27,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const PageObjects = getPageObjects(['common', 'console']); const toasts = getService('toasts'); - // FLAKY: https://github.com/elastic/kibana/issues/124104 - describe.skip('console app', function describeIndexTests() { + describe('console app', function describeIndexTests() { this.tags('includeFirefox'); before(async () => { log.debug('navigateTo console'); @@ -82,37 +81,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(initialSize.width).to.be.greaterThan(afterSize.width); }); - it('should provide basic auto-complete functionality', async () => { - // Ensure that the text area can be interacted with - await PageObjects.console.dismissTutorial(); - expect(await PageObjects.console.hasAutocompleter()).to.be(false); - await PageObjects.console.enterRequest(); - await PageObjects.console.promptAutocomplete(); - await retry.waitFor('autocomplete to be visible', () => - PageObjects.console.hasAutocompleter() - ); - }); - - it('should add comma after previous non empty line on autocomplete', async () => { - const LINE_NUMBER = 4; - - await PageObjects.console.dismissTutorial(); - await PageObjects.console.clearTextArea(); - await PageObjects.console.enterRequest(); - - await PageObjects.console.enterText(`{\n\t"query": {\n\t\t"match": {}`); - await PageObjects.console.pressEnter(); - await PageObjects.console.pressEnter(); - await PageObjects.console.pressEnter(); - await PageObjects.console.promptAutocomplete(); - await PageObjects.console.pressEnter(); - - const textOfPreviousNonEmptyLine = await PageObjects.console.getVisibleTextAt(LINE_NUMBER); - log.debug(textOfPreviousNonEmptyLine); - const lastChar = textOfPreviousNonEmptyLine.charAt(textOfPreviousNonEmptyLine.length - 1); - expect(lastChar).to.be.equal(','); - }); - describe('with a data URI in the load_from query', () => { it('loads the data from the URI', async () => { await PageObjects.common.navigateToApp('console', { diff --git a/test/functional/apps/console/index.js b/test/functional/apps/console/index.js index 55f9dffdedb06..7a1fb578b4e4a 100644 --- a/test/functional/apps/console/index.js +++ b/test/functional/apps/console/index.js @@ -9,8 +9,7 @@ export default function ({ getService, loadTestFile }) { const browser = getService('browser'); - // FLAKY: https://github.com/elastic/kibana/issues/123556 - describe.skip('console app', function () { + describe('console app', function () { this.tags('ciGroup1'); before(async function () { @@ -18,5 +17,6 @@ export default function ({ getService, loadTestFile }) { }); loadTestFile(require.resolve('./_console')); + loadTestFile(require.resolve('./_autocomplete')); }); } diff --git a/test/functional/page_objects/console_page.ts b/test/functional/page_objects/console_page.ts index 4fdc47756e710..e6450480bbb02 100644 --- a/test/functional/page_objects/console_page.ts +++ b/test/functional/page_objects/console_page.ts @@ -87,14 +87,15 @@ export class ConsolePageObject extends FtrService { const textArea = await this.testSubjects.find('console-textarea'); // There should be autocomplete for this on all license levels await textArea.pressKeys([Key.CONTROL, Key.SPACE]); + await this.retry.waitFor('autocomplete to be visible', () => this.isAutocompleteVisible()); } - public async hasAutocompleter(): Promise { - try { - return Boolean(await this.find.byCssSelector('.ace_autocomplete')); - } catch (e) { - return false; - } + public async isAutocompleteVisible() { + const element = await this.find.byCssSelector('.ace_autocomplete'); + if (!element) return false; + + const attribute = await element.getAttribute('style'); + return !attribute.includes('display: none;'); } public async enterRequest(request: string = '\nGET _search') { @@ -104,8 +105,8 @@ export class ConsolePageObject extends FtrService { } public async enterText(text: string) { - const textArea = await this.getEditorTextArea(); - await textArea.pressKeys(text); + const textArea = await this.testSubjects.find('console-textarea'); + await textArea.type(text); } private async getEditorTextArea() { @@ -138,9 +139,16 @@ export class ConsolePageObject extends FtrService { } public async clearTextArea() { - const textArea = await this.getEditorTextArea(); - await this.retry.try(async () => { + await this.retry.waitForWithTimeout('text area is cleared', 20000, async () => { + const textArea = await this.testSubjects.find('console-textarea'); + await textArea.clickMouseButton(); await textArea.clearValueWithKeyboard(); + + const editor = await this.getEditor(); + const lines = await editor.findAllByClassName('ace_line_group'); + // there should be only one empty line after clearing the textarea + const text = await lines[lines.length - 1].getVisibleText(); + return lines.length === 1 && text.trim() === ''; }); } } From 61fc407e905d5d06196b21398f1c731f1e60ff08 Mon Sep 17 00:00:00 2001 From: Christos Nasikas Date: Fri, 25 Feb 2022 09:56:33 +0200 Subject: [PATCH 031/102] [Cases] Add telemetry to the cases APIs (#125928) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- x-pack/plugins/cases/kibana.json | 3 +- .../cases/server/client/attachments/get.ts | 10 +- x-pack/plugins/cases/server/plugin.ts | 15 +- .../routes/api/cases/alerts/get_cases.ts | 59 ++-- .../server/routes/api/cases/delete_cases.ts | 49 ++- .../server/routes/api/cases/find_cases.ts | 45 ++- .../cases/server/routes/api/cases/get_case.ts | 146 +++++---- .../server/routes/api/cases/patch_cases.ts | 46 ++- .../server/routes/api/cases/post_case.ts | 46 ++- .../server/routes/api/cases/push_case.ts | 61 ++-- .../api/cases/reporters/get_reporters.ts | 42 ++- .../server/routes/api/cases/tags/get_tags.ts | 42 ++- .../api/comments/delete_all_comments.ts | 51 ++-- .../routes/api/comments/delete_comment.ts | 55 ++-- .../routes/api/comments/find_comments.ts | 64 ++-- .../server/routes/api/comments/get_alerts.ts | 51 ++-- .../routes/api/comments/get_all_comment.ts | 70 +++-- .../server/routes/api/comments/get_comment.ts | 57 ++-- .../routes/api/comments/patch_comment.ts | 64 ++-- .../routes/api/comments/post_comment.ts | 58 ++-- .../routes/api/configure/get_configure.ts | 42 ++- .../routes/api/configure/get_connectors.ts | 35 +-- .../routes/api/configure/patch_configure.ts | 51 ++-- .../routes/api/configure/post_configure.ts | 48 ++- .../server/routes/api/create_cases_route.ts | 10 + .../server/routes/api/get_external_routes.ts | 61 ++++ .../plugins/cases/server/routes/api/index.ts | 69 +---- .../routes/api/metrics/get_case_metrics.ts | 58 ++-- .../server/routes/api/register_routes.test.ts | 280 ++++++++++++++++++ .../server/routes/api/register_routes.ts | 88 ++++++ .../server/routes/api/stats/get_status.ts | 56 ++-- .../plugins/cases/server/routes/api/types.ts | 33 ++- .../api/user_actions/get_all_user_actions.ts | 72 +++-- .../plugins/cases/server/routes/api/utils.ts | 4 +- .../cases/server/services/cases/index.ts | 6 +- 35 files changed, 1119 insertions(+), 828 deletions(-) create mode 100644 x-pack/plugins/cases/server/routes/api/create_cases_route.ts create mode 100644 x-pack/plugins/cases/server/routes/api/get_external_routes.ts create mode 100644 x-pack/plugins/cases/server/routes/api/register_routes.test.ts create mode 100644 x-pack/plugins/cases/server/routes/api/register_routes.ts diff --git a/x-pack/plugins/cases/kibana.json b/x-pack/plugins/cases/kibana.json index bf3cc0ee320bd..170ac2a96aaa8 100644 --- a/x-pack/plugins/cases/kibana.json +++ b/x-pack/plugins/cases/kibana.json @@ -11,7 +11,8 @@ "kibanaVersion":"kibana", "optionalPlugins":[ "security", - "spaces" + "spaces", + "usageCollection" ], "owner":{ "githubTeam":"response-ops", diff --git a/x-pack/plugins/cases/server/client/attachments/get.ts b/x-pack/plugins/cases/server/client/attachments/get.ts index 4cd620ac5a772..6e9e924fbee30 100644 --- a/x-pack/plugins/cases/server/client/attachments/get.ts +++ b/x-pack/plugins/cases/server/client/attachments/get.ts @@ -25,7 +25,7 @@ import { getIDsAndIndicesAsArrays, } from '../../common/utils'; import { createCaseError } from '../../common/error'; -import { defaultPage, defaultPerPage } from '../../routes/api'; +import { DEFAULT_PAGE, DEFAULT_PER_PAGE } from '../../routes/api'; import { CasesClientArgs } from '../types'; import { combineFilters, stringToKueryNode } from '../utils'; import { Operations } from '../../authorization'; @@ -170,8 +170,8 @@ export async function find( // We need this because the default behavior of getAllCaseComments is to return all the comments // unless the page and/or perPage is specified. Since we're spreading the query after the request can // still override this behavior. - page: defaultPage, - perPage: defaultPerPage, + page: DEFAULT_PAGE, + perPage: DEFAULT_PER_PAGE, sortField: 'created_at', filter: combinedFilter, ...queryWithoutFilter, @@ -183,8 +183,8 @@ export async function find( unsecuredSavedObjectsClient, id, options: { - page: defaultPage, - perPage: defaultPerPage, + page: DEFAULT_PAGE, + perPage: DEFAULT_PER_PAGE, sortField: 'created_at', filter: combinedFilter, }, diff --git a/x-pack/plugins/cases/server/plugin.ts b/x-pack/plugins/cases/server/plugin.ts index 5881b7b7633be..e6c4faac93938 100644 --- a/x-pack/plugins/cases/server/plugin.ts +++ b/x-pack/plugins/cases/server/plugin.ts @@ -8,6 +8,7 @@ import { IContextProvider, KibanaRequest, Logger, PluginInitializerContext } from 'kibana/server'; import { CoreSetup, CoreStart } from 'src/core/server'; +import { UsageCollectionSetup } from '../../../../src/plugins/usage_collection/server'; import { SecurityPluginSetup, SecurityPluginStart } from '../../security/server'; import { PluginSetupContract as ActionsPluginSetup, @@ -15,7 +16,6 @@ import { } from '../../actions/server'; import { APP_ID } from '../common/constants'; -import { initCaseApi } from './routes/api'; import { createCaseCommentSavedObjectType, caseConfigureSavedObjectType, @@ -30,11 +30,14 @@ import { CasesClientFactory } from './client/factory'; import { SpacesPluginStart } from '../../spaces/server'; import { PluginStartContract as FeaturesPluginStart } from '../../features/server'; import { LensServerPluginSetup } from '../../lens/server'; +import { registerRoutes } from './routes/api/register_routes'; +import { getExternalRoutes } from './routes/api/get_external_routes'; export interface PluginsSetup { - security?: SecurityPluginSetup; actions: ActionsPluginSetup; lens: LensServerPluginSetup; + usageCollection?: UsageCollectionSetup; + security?: SecurityPluginSetup; } export interface PluginsStart { @@ -100,10 +103,14 @@ export class CasePlugin { ); const router = core.http.createRouter(); - initCaseApi({ - logger: this.log, + const telemetryUsageCounter = plugins.usageCollection?.createUsageCounter(APP_ID); + + registerRoutes({ router, + routes: getExternalRoutes(), + logger: this.log, kibanaVersion: this.kibanaVersion, + telemetryUsageCounter, }); } diff --git a/x-pack/plugins/cases/server/routes/api/cases/alerts/get_cases.ts b/x-pack/plugins/cases/server/routes/api/cases/alerts/get_cases.ts index 8a490e2f68bd0..00a368e834a0a 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/alerts/get_cases.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/alerts/get_cases.ts @@ -6,42 +6,35 @@ */ import { schema } from '@kbn/config-schema'; -import Boom from '@hapi/boom'; -import { RouteDeps } from '../../types'; -import { escapeHatch, wrapError } from '../../utils'; import { CasesByAlertIDRequest } from '../../../../../common/api'; import { CASE_ALERTS_URL } from '../../../../../common/constants'; +import { createCaseError } from '../../../../common/error'; +import { createCasesRoute } from '../../create_cases_route'; -export function initGetCasesByAlertIdApi({ router, logger }: RouteDeps) { - router.get( - { - path: CASE_ALERTS_URL, - validate: { - params: schema.object({ - alert_id: schema.string(), - }), - query: escapeHatch, - }, - }, - async (context, request, response) => { - try { - const alertID = request.params.alert_id; - if (alertID == null || alertID === '') { - throw Boom.badRequest('The `alertId` is not valid'); - } - const casesClient = await context.cases.getCasesClient(); - const options = request.query as CasesByAlertIDRequest; +export const getCasesByAlertIdRoute = createCasesRoute({ + method: 'get', + path: CASE_ALERTS_URL, + params: { + params: schema.object({ + alert_id: schema.string({ minLength: 1 }), + }), + }, + handler: async ({ context, request, response }) => { + try { + const alertID = request.params.alert_id; - return response.ok({ - body: await casesClient.cases.getCasesByAlertID({ alertID, options }), - }); - } catch (error) { - logger.error( - `Failed to retrieve case ids for this alert id: ${request.params.alert_id}: ${error}` - ); - return response.customError(wrapError(error)); - } + const casesClient = await context.cases.getCasesClient(); + const options = request.query as CasesByAlertIDRequest; + + return response.ok({ + body: await casesClient.cases.getCasesByAlertID({ alertID, options }), + }); + } catch (error) { + throw createCaseError({ + message: `Failed to retrieve case ids for this alert id: ${request.params.alert_id}: ${error}`, + error, + }); } - ); -} + }, +}); diff --git a/x-pack/plugins/cases/server/routes/api/cases/delete_cases.ts b/x-pack/plugins/cases/server/routes/api/cases/delete_cases.ts index 1784a434292cc..a63d07037de01 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/delete_cases.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/delete_cases.ts @@ -7,32 +7,31 @@ import { schema } from '@kbn/config-schema'; -import { RouteDeps } from '../types'; -import { wrapError } from '../utils'; import { CASES_URL } from '../../../../common/constants'; +import { createCaseError } from '../../../common/error'; +import { createCasesRoute } from '../create_cases_route'; -export function initDeleteCasesApi({ router, logger }: RouteDeps) { - router.delete( - { - path: CASES_URL, - validate: { - query: schema.object({ - ids: schema.arrayOf(schema.string()), - }), - }, - }, - async (context, request, response) => { - try { - const client = await context.cases.getCasesClient(); - await client.cases.delete(request.query.ids); +export const deleteCaseRoute = createCasesRoute({ + method: 'delete', + path: CASES_URL, + params: { + query: schema.object({ + ids: schema.arrayOf(schema.string()), + }), + }, + handler: async ({ context, request, response }) => { + try { + const client = await context.cases.getCasesClient(); + await client.cases.delete(request.query.ids); - return response.noContent(); - } catch (error) { - logger.error( - `Failed to delete cases in route ids: ${JSON.stringify(request.query.ids)}: ${error}` - ); - return response.customError(wrapError(error)); - } + return response.noContent(); + } catch (error) { + throw createCaseError({ + message: `Failed to delete cases in route ids: ${JSON.stringify( + request.query.ids + )}: ${error}`, + error, + }); } - ); -} + }, +}); diff --git a/x-pack/plugins/cases/server/routes/api/cases/find_cases.ts b/x-pack/plugins/cases/server/routes/api/cases/find_cases.ts index 8474d781a202a..711c6909df46c 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/find_cases.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/find_cases.ts @@ -7,32 +7,25 @@ import { CasesFindRequest } from '../../../../common/api'; import { CASES_URL } from '../../../../common/constants'; -import { wrapError, escapeHatch } from '../utils'; -import { RouteDeps } from '../types'; +import { createCaseError } from '../../../common/error'; +import { createCasesRoute } from '../create_cases_route'; -export function initFindCasesApi({ router, logger }: RouteDeps) { - router.get( - { - path: `${CASES_URL}/_find`, - validate: { - query: escapeHatch, - }, - }, - async (context, request, response) => { - try { - if (!context.cases) { - return response.badRequest({ body: 'RouteHandlerContext is not registered for cases' }); - } - const casesClient = await context.cases.getCasesClient(); - const options = request.query as CasesFindRequest; +export const findCaseRoute = createCasesRoute({ + method: 'get', + path: `${CASES_URL}/_find`, + handler: async ({ context, request, response }) => { + try { + const casesClient = await context.cases.getCasesClient(); + const options = request.query as CasesFindRequest; - return response.ok({ - body: await casesClient.cases.find({ ...options }), - }); - } catch (error) { - logger.error(`Failed to find cases in route: ${error}`); - return response.customError(wrapError(error)); - } + return response.ok({ + body: await casesClient.cases.find({ ...options }), + }); + } catch (error) { + throw createCaseError({ + message: `Failed to find cases in route: ${error}`, + error, + }); } - ); -} + }, +}); diff --git a/x-pack/plugins/cases/server/routes/api/cases/get_case.ts b/x-pack/plugins/cases/server/routes/api/cases/get_case.ts index c8558d09e5c5f..f0e53e82f1494 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/get_case.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/get_case.ts @@ -7,91 +7,83 @@ import { schema } from '@kbn/config-schema'; -import { RouteDeps } from '../types'; -import { getWarningHeader, logDeprecatedEndpoint, wrapError } from '../utils'; +import { getWarningHeader, logDeprecatedEndpoint } from '../utils'; import { CASE_DETAILS_URL } from '../../../../common/constants'; +import { createCaseError } from '../../../common/error'; +import { createCasesRoute } from '../create_cases_route'; -export function initGetCaseApi({ router, logger, kibanaVersion }: RouteDeps) { - router.get( - { - path: CASE_DETAILS_URL, - validate: { - params: schema.object({ - case_id: schema.string(), - }), - query: schema.object({ - /** - * @deprecated since version 8.1.0 - */ - includeComments: schema.boolean({ defaultValue: true }), - }), - }, - }, - async (context, request, response) => { - try { - const isIncludeCommentsParamProvidedByTheUser = - request.url.searchParams.has('includeComments'); - - if (isIncludeCommentsParamProvidedByTheUser) { - logDeprecatedEndpoint( - logger, - request.headers, - `The query parameter 'includeComments' of the get case API '${CASE_DETAILS_URL}' is deprecated` - ); - } +const params = { + params: schema.object({ + case_id: schema.string(), + }), + query: schema.object({ + /** + * @deprecated since version 8.1.0 + */ + includeComments: schema.boolean({ defaultValue: true }), + }), +}; - const casesClient = await context.cases.getCasesClient(); - const id = request.params.case_id; +export const getCaseRoute = createCasesRoute({ + method: 'get', + path: CASE_DETAILS_URL, + params, + handler: async ({ context, request, response, logger, kibanaVersion }) => { + try { + const isIncludeCommentsParamProvidedByTheUser = + request.url.searchParams.has('includeComments'); - return response.ok({ - ...(isIncludeCommentsParamProvidedByTheUser && { - headers: { - ...getWarningHeader(kibanaVersion, 'Deprecated query parameter includeComments'), - }, - }), - body: await casesClient.cases.get({ - id, - includeComments: request.query.includeComments, - }), - }); - } catch (error) { - logger.error( - `Failed to retrieve case in route case id: ${request.params.case_id} \ninclude comments: ${request.query.includeComments}: ${error}` + if (isIncludeCommentsParamProvidedByTheUser) { + logDeprecatedEndpoint( + logger, + request.headers, + `The query parameter 'includeComments' of the get case API '${CASE_DETAILS_URL}' is deprecated` ); - return response.customError(wrapError(error)); } - } - ); - router.get( - { - path: `${CASE_DETAILS_URL}/resolve`, - validate: { - params: schema.object({ - case_id: schema.string(), + const casesClient = await context.cases.getCasesClient(); + const id = request.params.case_id; + + return response.ok({ + ...(isIncludeCommentsParamProvidedByTheUser && { + headers: { + ...getWarningHeader(kibanaVersion, 'Deprecated query parameter includeComments'), + }, }), - query: schema.object({ - includeComments: schema.boolean({ defaultValue: true }), + body: await casesClient.cases.get({ + id, + includeComments: request.query.includeComments, }), - }, - }, - async (context, request, response) => { - try { - const casesClient = await context.cases.getCasesClient(); - const id = request.params.case_id; + }); + } catch (error) { + throw createCaseError({ + message: `Failed to retrieve case in route case id: ${request.params.case_id} \ninclude comments: ${request.query.includeComments}: ${error}`, + error, + }); + } + }, +}); - return response.ok({ - body: await casesClient.cases.resolve({ - id, - includeComments: request.query.includeComments, - }), - }); - } catch (error) { - logger.error( - `Failed to retrieve case in resolve route case id: ${request.params.case_id} \ninclude comments: ${request.query.includeComments}: ${error}` - ); - return response.customError(wrapError(error)); - } +export const resolveCaseRoute = createCasesRoute({ + method: 'get', + path: `${CASE_DETAILS_URL}/resolve`, + params, + handler: async ({ context, request, response }) => { + try { + const casesClient = await context.cases.getCasesClient(); + const id = request.params.case_id; + + return response.ok({ + body: await casesClient.cases.resolve({ + id, + includeComments: request.query.includeComments, + }), + }); + } catch (error) { + throw createCaseError({ + message: `Failed to retrieve case in resolve route case id: ${request.params.case_id} \ninclude comments: ${request.query.includeComments}: ${error}`, + error, + }); } - ); -} + }, +}); diff --git a/x-pack/plugins/cases/server/routes/api/cases/patch_cases.ts b/x-pack/plugins/cases/server/routes/api/cases/patch_cases.ts index 5cde28bcb01f9..c148a45220a74 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/patch_cases.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/patch_cases.ts @@ -5,35 +5,27 @@ * 2.0. */ -import { escapeHatch, wrapError } from '../utils'; -import { RouteDeps } from '../types'; import { CasesPatchRequest } from '../../../../common/api'; import { CASES_URL } from '../../../../common/constants'; +import { createCaseError } from '../../../common/error'; +import { createCasesRoute } from '../create_cases_route'; -export function initPatchCasesApi({ router, logger }: RouteDeps) { - router.patch( - { - path: CASES_URL, - validate: { - body: escapeHatch, - }, - }, - async (context, request, response) => { - try { - if (!context.cases) { - return response.badRequest({ body: 'RouteHandlerContext is not registered for cases' }); - } +export const patchCaseRoute = createCasesRoute({ + method: 'patch', + path: CASES_URL, + handler: async ({ context, request, response }) => { + try { + const casesClient = await context.cases.getCasesClient(); + const cases = request.body as CasesPatchRequest; - const casesClient = await context.cases.getCasesClient(); - const cases = request.body as CasesPatchRequest; - - return response.ok({ - body: await casesClient.cases.update(cases), - }); - } catch (error) { - logger.error(`Failed to patch cases in route: ${error}`); - return response.customError(wrapError(error)); - } + return response.ok({ + body: await casesClient.cases.update(cases), + }); + } catch (error) { + throw createCaseError({ + message: `Failed to patch cases in route: ${error}`, + error, + }); } - ); -} + }, +}); diff --git a/x-pack/plugins/cases/server/routes/api/cases/post_case.ts b/x-pack/plugins/cases/server/routes/api/cases/post_case.ts index df994f18c5bbd..226d0308a3152 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/post_case.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/post_case.ts @@ -5,35 +5,27 @@ * 2.0. */ -import { wrapError, escapeHatch } from '../utils'; - -import { RouteDeps } from '../types'; import { CasePostRequest } from '../../../../common/api'; import { CASES_URL } from '../../../../common/constants'; +import { createCaseError } from '../../../common/error'; +import { createCasesRoute } from '../create_cases_route'; -export function initPostCaseApi({ router, logger }: RouteDeps) { - router.post( - { - path: CASES_URL, - validate: { - body: escapeHatch, - }, - }, - async (context, request, response) => { - try { - if (!context.cases) { - return response.badRequest({ body: 'RouteHandlerContext is not registered for cases' }); - } - const casesClient = await context.cases.getCasesClient(); - const theCase = request.body as CasePostRequest; +export const postCaseRoute = createCasesRoute({ + method: 'post', + path: CASES_URL, + handler: async ({ context, request, response }) => { + try { + const casesClient = await context.cases.getCasesClient(); + const theCase = request.body as CasePostRequest; - return response.ok({ - body: await casesClient.cases.create({ ...theCase }), - }); - } catch (error) { - logger.error(`Failed to post case in route: ${error}`); - return response.customError(wrapError(error)); - } + return response.ok({ + body: await casesClient.cases.create({ ...theCase }), + }); + } catch (error) { + throw createCaseError({ + message: `Failed to post case in route: ${error}`, + error, + }); } - ); -} + }, +}); diff --git a/x-pack/plugins/cases/server/routes/api/cases/push_case.ts b/x-pack/plugins/cases/server/routes/api/cases/push_case.ts index 2b3e7954febfe..175838a9d313c 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/push_case.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/push_case.ts @@ -10,44 +10,35 @@ import { pipe } from 'fp-ts/lib/pipeable'; import { fold } from 'fp-ts/lib/Either'; import { identity } from 'fp-ts/lib/function'; -import { wrapError, escapeHatch } from '../utils'; - import { throwErrors, CasePushRequestParamsRt } from '../../../../common/api'; import { CASE_PUSH_URL } from '../../../../common/constants'; -import { RouteDeps } from '../types'; - -export function initPushCaseApi({ router, logger }: RouteDeps) { - router.post( - { - path: CASE_PUSH_URL, - validate: { - params: escapeHatch, - body: escapeHatch, - }, - }, - async (context, request, response) => { - try { - if (!context.cases) { - return response.badRequest({ body: 'RouteHandlerContext is not registered for cases' }); - } +import { CaseRoute } from '../types'; +import { createCaseError } from '../../../common/error'; +import { createCasesRoute } from '../create_cases_route'; - const casesClient = await context.cases.getCasesClient(); +export const pushCaseRoute: CaseRoute = createCasesRoute({ + method: 'post', + path: CASE_PUSH_URL, + handler: async ({ context, request, response }) => { + try { + const casesClient = await context.cases.getCasesClient(); - const params = pipe( - CasePushRequestParamsRt.decode(request.params), - fold(throwErrors(Boom.badRequest), identity) - ); + const params = pipe( + CasePushRequestParamsRt.decode(request.params), + fold(throwErrors(Boom.badRequest), identity) + ); - return response.ok({ - body: await casesClient.cases.push({ - caseId: params.case_id, - connectorId: params.connector_id, - }), - }); - } catch (error) { - logger.error(`Failed to push case in route: ${error}`); - return response.customError(wrapError(error)); - } + return response.ok({ + body: await casesClient.cases.push({ + caseId: params.case_id, + connectorId: params.connector_id, + }), + }); + } catch (error) { + throw createCaseError({ + message: `Failed to push case in route: ${error}`, + error, + }); } - ); -} + }, +}); diff --git a/x-pack/plugins/cases/server/routes/api/cases/reporters/get_reporters.ts b/x-pack/plugins/cases/server/routes/api/cases/reporters/get_reporters.ts index 8e0d0640263ec..ee413d73565ee 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/reporters/get_reporters.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/reporters/get_reporters.ts @@ -5,33 +5,25 @@ * 2.0. */ -import { RouteDeps } from '../../types'; -import { wrapError, escapeHatch } from '../../utils'; import { AllReportersFindRequest } from '../../../../../common/api'; import { CASE_REPORTERS_URL } from '../../../../../common/constants'; +import { createCaseError } from '../../../../common/error'; +import { createCasesRoute } from '../../create_cases_route'; -export function initGetReportersApi({ router, logger }: RouteDeps) { - router.get( - { - path: CASE_REPORTERS_URL, - validate: { - query: escapeHatch, - }, - }, - async (context, request, response) => { - try { - if (!context.cases) { - return response.badRequest({ body: 'RouteHandlerContext is not registered for cases' }); - } +export const getReportersRoute = createCasesRoute({ + method: 'get', + path: CASE_REPORTERS_URL, + handler: async ({ context, request, response }) => { + try { + const client = await context.cases.getCasesClient(); + const options = request.query as AllReportersFindRequest; - const client = await context.cases.getCasesClient(); - const options = request.query as AllReportersFindRequest; - - return response.ok({ body: await client.cases.getReporters({ ...options }) }); - } catch (error) { - logger.error(`Failed to get reporters in route: ${error}`); - return response.customError(wrapError(error)); - } + return response.ok({ body: await client.cases.getReporters({ ...options }) }); + } catch (error) { + throw createCaseError({ + message: `Failed to find cases in route: ${error}`, + error, + }); } - ); -} + }, +}); diff --git a/x-pack/plugins/cases/server/routes/api/cases/tags/get_tags.ts b/x-pack/plugins/cases/server/routes/api/cases/tags/get_tags.ts index 2afa96be95bc1..7dfa948aa623c 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/tags/get_tags.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/tags/get_tags.ts @@ -5,33 +5,25 @@ * 2.0. */ -import { RouteDeps } from '../../types'; -import { wrapError, escapeHatch } from '../../utils'; import { AllTagsFindRequest } from '../../../../../common/api'; import { CASE_TAGS_URL } from '../../../../../common/constants'; +import { createCaseError } from '../../../../common/error'; +import { createCasesRoute } from '../../create_cases_route'; -export function initGetTagsApi({ router, logger }: RouteDeps) { - router.get( - { - path: CASE_TAGS_URL, - validate: { - query: escapeHatch, - }, - }, - async (context, request, response) => { - try { - if (!context.cases) { - return response.badRequest({ body: 'RouteHandlerContext is not registered for cases' }); - } +export const getTagsRoute = createCasesRoute({ + method: 'get', + path: CASE_TAGS_URL, + handler: async ({ context, request, response }) => { + try { + const client = await context.cases.getCasesClient(); + const options = request.query as AllTagsFindRequest; - const client = await context.cases.getCasesClient(); - const options = request.query as AllTagsFindRequest; - - return response.ok({ body: await client.cases.getTags({ ...options }) }); - } catch (error) { - logger.error(`Failed to retrieve tags in route: ${error}`); - return response.customError(wrapError(error)); - } + return response.ok({ body: await client.cases.getTags({ ...options }) }); + } catch (error) { + throw createCaseError({ + message: `Failed to retrieve tags in route: ${error}`, + error, + }); } - ); -} + }, +}); diff --git a/x-pack/plugins/cases/server/routes/api/comments/delete_all_comments.ts b/x-pack/plugins/cases/server/routes/api/comments/delete_all_comments.ts index d79f90ac43935..0a1ebd3b66a74 100644 --- a/x-pack/plugins/cases/server/routes/api/comments/delete_all_comments.ts +++ b/x-pack/plugins/cases/server/routes/api/comments/delete_all_comments.ts @@ -6,35 +6,32 @@ */ import { schema } from '@kbn/config-schema'; -import { RouteDeps } from '../types'; -import { wrapError } from '../utils'; import { CASE_COMMENTS_URL } from '../../../../common/constants'; +import { createCasesRoute } from '../create_cases_route'; +import { createCaseError } from '../../../common/error'; -export function initDeleteAllCommentsApi({ router, logger }: RouteDeps) { - router.delete( - { - path: CASE_COMMENTS_URL, - validate: { - params: schema.object({ - case_id: schema.string(), - }), - }, - }, - async (context, request, response) => { - try { - const client = await context.cases.getCasesClient(); +export const deleteAllCommentsRoute = createCasesRoute({ + method: 'delete', + path: CASE_COMMENTS_URL, + params: { + params: schema.object({ + case_id: schema.string(), + }), + }, + handler: async ({ context, request, response }) => { + try { + const client = await context.cases.getCasesClient(); - await client.attachments.deleteAll({ - caseID: request.params.case_id, - }); + await client.attachments.deleteAll({ + caseID: request.params.case_id, + }); - return response.noContent(); - } catch (error) { - logger.error( - `Failed to delete all comments in route case id: ${request.params.case_id}: ${error}` - ); - return response.customError(wrapError(error)); - } + return response.noContent(); + } catch (error) { + throw createCaseError({ + message: `Failed to delete all comments in route case id: ${request.params.case_id}: ${error}`, + error, + }); } - ); -} + }, +}); diff --git a/x-pack/plugins/cases/server/routes/api/comments/delete_comment.ts b/x-pack/plugins/cases/server/routes/api/comments/delete_comment.ts index b27be46d7220d..220fbffc76cc0 100644 --- a/x-pack/plugins/cases/server/routes/api/comments/delete_comment.ts +++ b/x-pack/plugins/cases/server/routes/api/comments/delete_comment.ts @@ -7,36 +7,33 @@ import { schema } from '@kbn/config-schema'; -import { RouteDeps } from '../types'; -import { wrapError } from '../utils'; import { CASE_COMMENT_DETAILS_URL } from '../../../../common/constants'; +import { createCasesRoute } from '../create_cases_route'; +import { createCaseError } from '../../../common/error'; -export function initDeleteCommentApi({ router, logger }: RouteDeps) { - router.delete( - { - path: CASE_COMMENT_DETAILS_URL, - validate: { - params: schema.object({ - case_id: schema.string(), - comment_id: schema.string(), - }), - }, - }, - async (context, request, response) => { - try { - const client = await context.cases.getCasesClient(); - await client.attachments.delete({ - attachmentID: request.params.comment_id, - caseID: request.params.case_id, - }); +export const deleteCommentRoute = createCasesRoute({ + method: 'delete', + path: CASE_COMMENT_DETAILS_URL, + params: { + params: schema.object({ + case_id: schema.string(), + comment_id: schema.string(), + }), + }, + handler: async ({ context, request, response }) => { + try { + const client = await context.cases.getCasesClient(); + await client.attachments.delete({ + attachmentID: request.params.comment_id, + caseID: request.params.case_id, + }); - return response.noContent(); - } catch (error) { - logger.error( - `Failed to delete comment in route case id: ${request.params.case_id} comment id: ${request.params.comment_id}: ${error}` - ); - return response.customError(wrapError(error)); - } + return response.noContent(); + } catch (error) { + throw createCaseError({ + message: `Failed to delete comment in route case id: ${request.params.case_id} comment id: ${request.params.comment_id}: ${error}`, + error, + }); } - ); -} + }, +}); diff --git a/x-pack/plugins/cases/server/routes/api/comments/find_comments.ts b/x-pack/plugins/cases/server/routes/api/comments/find_comments.ts index d4c65e6306a63..14c6090d62ea1 100644 --- a/x-pack/plugins/cases/server/routes/api/comments/find_comments.ts +++ b/x-pack/plugins/cases/server/routes/api/comments/find_comments.ts @@ -14,40 +14,36 @@ import { identity } from 'fp-ts/lib/function'; import { FindQueryParamsRt, throwErrors, excess } from '../../../../common/api'; import { CASE_COMMENTS_URL } from '../../../../common/constants'; -import { RouteDeps } from '../types'; -import { escapeHatch, wrapError } from '../utils'; +import { createCasesRoute } from '../create_cases_route'; +import { createCaseError } from '../../../common/error'; -export function initFindCaseCommentsApi({ router, logger }: RouteDeps) { - router.get( - { - path: `${CASE_COMMENTS_URL}/_find`, - validate: { - params: schema.object({ - case_id: schema.string(), - }), - query: escapeHatch, - }, - }, - async (context, request, response) => { - try { - const query = pipe( - excess(FindQueryParamsRt).decode(request.query), - fold(throwErrors(Boom.badRequest), identity) - ); +export const findCommentsRoute = createCasesRoute({ + method: 'get', + path: `${CASE_COMMENTS_URL}/_find`, + params: { + params: schema.object({ + case_id: schema.string(), + }), + }, + handler: async ({ context, request, response }) => { + try { + const query = pipe( + excess(FindQueryParamsRt).decode(request.query), + fold(throwErrors(Boom.badRequest), identity) + ); - const client = await context.cases.getCasesClient(); - return response.ok({ - body: await client.attachments.find({ - caseID: request.params.case_id, - queryParams: query, - }), - }); - } catch (error) { - logger.error( - `Failed to find comments in route case id: ${request.params.case_id}: ${error}` - ); - return response.customError(wrapError(error)); - } + const client = await context.cases.getCasesClient(); + return response.ok({ + body: await client.attachments.find({ + caseID: request.params.case_id, + queryParams: query, + }), + }); + } catch (error) { + throw createCaseError({ + message: `Failed to find comments in route case id: ${request.params.case_id}: ${error}`, + error, + }); } - ); -} + }, +}); diff --git a/x-pack/plugins/cases/server/routes/api/comments/get_alerts.ts b/x-pack/plugins/cases/server/routes/api/comments/get_alerts.ts index 9c0bfac4d9c6e..4fa793059ed63 100644 --- a/x-pack/plugins/cases/server/routes/api/comments/get_alerts.ts +++ b/x-pack/plugins/cases/server/routes/api/comments/get_alerts.ts @@ -7,35 +7,32 @@ import { schema } from '@kbn/config-schema'; -import { RouteDeps } from '../types'; -import { wrapError } from '../utils'; import { CASE_DETAILS_ALERTS_URL } from '../../../../common/constants'; +import { createCaseError } from '../../../common/error'; +import { createCasesRoute } from '../create_cases_route'; -export function initGetAllAlertsAttachToCaseApi({ router, logger }: RouteDeps) { - router.get( - { - path: CASE_DETAILS_ALERTS_URL, - validate: { - params: schema.object({ - case_id: schema.string({ minLength: 1 }), - }), - }, - }, - async (context, request, response) => { - try { - const caseId = request.params.case_id; +export const getAllAlertsAttachedToCaseRoute = createCasesRoute({ + method: 'get', + path: CASE_DETAILS_ALERTS_URL, + params: { + params: schema.object({ + case_id: schema.string({ minLength: 1 }), + }), + }, + handler: async ({ context, request, response }) => { + try { + const caseId = request.params.case_id; - const casesClient = await context.cases.getCasesClient(); + const casesClient = await context.cases.getCasesClient(); - return response.ok({ - body: await casesClient.attachments.getAllAlertsAttachToCase({ caseId }), - }); - } catch (error) { - logger.error( - `Failed to retrieve alert ids for this case id: ${request.params.case_id}: ${error}` - ); - return response.customError(wrapError(error)); - } + return response.ok({ + body: await casesClient.attachments.getAllAlertsAttachToCase({ caseId }), + }); + } catch (error) { + throw createCaseError({ + message: `Failed to retrieve alert ids for this case id: ${request.params.case_id}: ${error}`, + error, + }); } - ); -} + }, +}); diff --git a/x-pack/plugins/cases/server/routes/api/comments/get_all_comment.ts b/x-pack/plugins/cases/server/routes/api/comments/get_all_comment.ts index e94b19cdd9a1c..d1e47276af1ab 100644 --- a/x-pack/plugins/cases/server/routes/api/comments/get_all_comment.ts +++ b/x-pack/plugins/cases/server/routes/api/comments/get_all_comment.ts @@ -7,47 +7,45 @@ import { schema } from '@kbn/config-schema'; -import { RouteDeps } from '../types'; -import { wrapError, getWarningHeader, logDeprecatedEndpoint } from '../utils'; +import { getWarningHeader, logDeprecatedEndpoint } from '../utils'; import { CASE_COMMENTS_URL } from '../../../../common/constants'; +import { createCaseError } from '../../../common/error'; +import { createCasesRoute } from '../create_cases_route'; /** * @deprecated since version 8.1.0 */ -export function initGetAllCommentsApi({ router, logger, kibanaVersion }: RouteDeps) { - router.get( - { - path: CASE_COMMENTS_URL, - validate: { - params: schema.object({ - case_id: schema.string(), - }), - }, - }, - async (context, request, response) => { - try { - logDeprecatedEndpoint( - logger, - request.headers, - `The get all cases comments API '${CASE_COMMENTS_URL}' is deprecated.` - ); +export const getAllCommentsRoute = createCasesRoute({ + method: 'get', + path: CASE_COMMENTS_URL, + params: { + params: schema.object({ + case_id: schema.string(), + }), + }, + handler: async ({ context, request, response, logger, kibanaVersion }) => { + try { + logDeprecatedEndpoint( + logger, + request.headers, + `The get all cases comments API '${CASE_COMMENTS_URL}' is deprecated.` + ); - const client = await context.cases.getCasesClient(); + const client = await context.cases.getCasesClient(); - return response.ok({ - headers: { - ...getWarningHeader(kibanaVersion), - }, - body: await client.attachments.getAll({ - caseID: request.params.case_id, - }), - }); - } catch (error) { - logger.error( - `Failed to get all comments in route case id: ${request.params.case_id}: ${error}` - ); - return response.customError(wrapError(error)); - } + return response.ok({ + headers: { + ...getWarningHeader(kibanaVersion), + }, + body: await client.attachments.getAll({ + caseID: request.params.case_id, + }), + }); + } catch (error) { + throw createCaseError({ + message: `Failed to get all comments in route case id: ${request.params.case_id}: ${error}`, + error, + }); } - ); -} + }, +}); diff --git a/x-pack/plugins/cases/server/routes/api/comments/get_comment.ts b/x-pack/plugins/cases/server/routes/api/comments/get_comment.ts index 09805c00cb10a..91adf832f1ea6 100644 --- a/x-pack/plugins/cases/server/routes/api/comments/get_comment.ts +++ b/x-pack/plugins/cases/server/routes/api/comments/get_comment.ts @@ -7,37 +7,34 @@ import { schema } from '@kbn/config-schema'; -import { RouteDeps } from '../types'; -import { wrapError } from '../utils'; import { CASE_COMMENT_DETAILS_URL } from '../../../../common/constants'; +import { createCaseError } from '../../../common/error'; +import { createCasesRoute } from '../create_cases_route'; -export function initGetCommentApi({ router, logger }: RouteDeps) { - router.get( - { - path: CASE_COMMENT_DETAILS_URL, - validate: { - params: schema.object({ - case_id: schema.string(), - comment_id: schema.string(), - }), - }, - }, - async (context, request, response) => { - try { - const client = await context.cases.getCasesClient(); +export const getCommentRoute = createCasesRoute({ + method: 'get', + path: CASE_COMMENT_DETAILS_URL, + params: { + params: schema.object({ + case_id: schema.string(), + comment_id: schema.string(), + }), + }, + handler: async ({ context, request, response }) => { + try { + const client = await context.cases.getCasesClient(); - return response.ok({ - body: await client.attachments.get({ - attachmentID: request.params.comment_id, - caseID: request.params.case_id, - }), - }); - } catch (error) { - logger.error( - `Failed to get comment in route case id: ${request.params.case_id} comment id: ${request.params.comment_id}: ${error}` - ); - return response.customError(wrapError(error)); - } + return response.ok({ + body: await client.attachments.get({ + attachmentID: request.params.comment_id, + caseID: request.params.case_id, + }), + }); + } catch (error) { + throw createCaseError({ + message: `Failed to get comment in route case id: ${request.params.case_id} comment id: ${request.params.comment_id}: ${error}`, + error, + }); } - ); -} + }, +}); diff --git a/x-pack/plugins/cases/server/routes/api/comments/patch_comment.ts b/x-pack/plugins/cases/server/routes/api/comments/patch_comment.ts index 5f9d885178404..ebc17daa25611 100644 --- a/x-pack/plugins/cases/server/routes/api/comments/patch_comment.ts +++ b/x-pack/plugins/cases/server/routes/api/comments/patch_comment.ts @@ -11,43 +11,39 @@ import { identity } from 'fp-ts/lib/function'; import { schema } from '@kbn/config-schema'; import Boom from '@hapi/boom'; -import { RouteDeps } from '../types'; -import { escapeHatch, wrapError } from '../utils'; import { CommentPatchRequestRt, throwErrors } from '../../../../common/api'; import { CASE_COMMENTS_URL } from '../../../../common/constants'; +import { createCaseError } from '../../../common/error'; +import { createCasesRoute } from '../create_cases_route'; -export function initPatchCommentApi({ router, logger }: RouteDeps) { - router.patch( - { - path: CASE_COMMENTS_URL, - validate: { - params: schema.object({ - case_id: schema.string(), - }), - body: escapeHatch, - }, - }, - async (context, request, response) => { - try { - const query = pipe( - CommentPatchRequestRt.decode(request.body), - fold(throwErrors(Boom.badRequest), identity) - ); +export const patchCommentRoute = createCasesRoute({ + method: 'patch', + path: CASE_COMMENTS_URL, + params: { + params: schema.object({ + case_id: schema.string(), + }), + }, + handler: async ({ context, request, response }) => { + try { + const query = pipe( + CommentPatchRequestRt.decode(request.body), + fold(throwErrors(Boom.badRequest), identity) + ); - const client = await context.cases.getCasesClient(); + const client = await context.cases.getCasesClient(); - return response.ok({ - body: await client.attachments.update({ - caseID: request.params.case_id, - updateRequest: query, - }), - }); - } catch (error) { - logger.error( - `Failed to patch comment in route case id: ${request.params.case_id}: ${error}` - ); - return response.customError(wrapError(error)); - } + return response.ok({ + body: await client.attachments.update({ + caseID: request.params.case_id, + updateRequest: query, + }), + }); + } catch (error) { + throw createCaseError({ + message: `Failed to patch comment in route case id: ${request.params.case_id}: ${error}`, + error, + }); } - ); -} + }, +}); diff --git a/x-pack/plugins/cases/server/routes/api/comments/post_comment.ts b/x-pack/plugins/cases/server/routes/api/comments/post_comment.ts index ed9c917008417..1ececb3653741 100644 --- a/x-pack/plugins/cases/server/routes/api/comments/post_comment.ts +++ b/x-pack/plugins/cases/server/routes/api/comments/post_comment.ts @@ -6,41 +6,33 @@ */ import { schema } from '@kbn/config-schema'; -import { escapeHatch, wrapError } from '../utils'; -import { RouteDeps } from '../types'; import { CASE_COMMENTS_URL } from '../../../../common/constants'; import { CommentRequest } from '../../../../common/api'; +import { createCaseError } from '../../../common/error'; +import { createCasesRoute } from '../create_cases_route'; -export function initPostCommentApi({ router, logger }: RouteDeps) { - router.post( - { - path: CASE_COMMENTS_URL, - validate: { - params: schema.object({ - case_id: schema.string(), - }), - body: escapeHatch, - }, - }, - async (context, request, response) => { - try { - if (!context.cases) { - return response.badRequest({ body: 'RouteHandlerContext is not registered for cases' }); - } +export const postCommentRoute = createCasesRoute({ + method: 'post', + path: CASE_COMMENTS_URL, + params: { + params: schema.object({ + case_id: schema.string(), + }), + }, + handler: async ({ context, request, response }) => { + try { + const casesClient = await context.cases.getCasesClient(); + const caseId = request.params.case_id; + const comment = request.body as CommentRequest; - const casesClient = await context.cases.getCasesClient(); - const caseId = request.params.case_id; - const comment = request.body as CommentRequest; - - return response.ok({ - body: await casesClient.attachments.add({ caseId, comment }), - }); - } catch (error) { - logger.error( - `Failed to post comment in route case id: ${request.params.case_id}: ${error}` - ); - return response.customError(wrapError(error)); - } + return response.ok({ + body: await casesClient.attachments.add({ caseId, comment }), + }); + } catch (error) { + throw createCaseError({ + message: `Failed to post comment in route case id: ${request.params.case_id}: ${error}`, + error, + }); } - ); -} + }, +}); diff --git a/x-pack/plugins/cases/server/routes/api/configure/get_configure.ts b/x-pack/plugins/cases/server/routes/api/configure/get_configure.ts index 8222ac8fe5690..8dabf7862fc88 100644 --- a/x-pack/plugins/cases/server/routes/api/configure/get_configure.ts +++ b/x-pack/plugins/cases/server/routes/api/configure/get_configure.ts @@ -5,31 +5,27 @@ * 2.0. */ -import { RouteDeps } from '../types'; -import { escapeHatch, wrapError } from '../utils'; import { CASE_CONFIGURE_URL } from '../../../../common/constants'; import { GetConfigureFindRequest } from '../../../../common/api'; +import { createCaseError } from '../../../common/error'; +import { createCasesRoute } from '../create_cases_route'; -export function initGetCaseConfigure({ router, logger }: RouteDeps) { - router.get( - { - path: CASE_CONFIGURE_URL, - validate: { - query: escapeHatch, - }, - }, - async (context, request, response) => { - try { - const client = await context.cases.getCasesClient(); - const options = request.query as GetConfigureFindRequest; +export const getCaseConfigureRoute = createCasesRoute({ + method: 'get', + path: CASE_CONFIGURE_URL, + handler: async ({ context, request, response }) => { + try { + const client = await context.cases.getCasesClient(); + const options = request.query as GetConfigureFindRequest; - return response.ok({ - body: await client.configure.get({ ...options }), - }); - } catch (error) { - logger.error(`Failed to get case configure in route: ${error}`); - return response.customError(wrapError(error)); - } + return response.ok({ + body: await client.configure.get({ ...options }), + }); + } catch (error) { + throw createCaseError({ + message: `Failed to get case configure in route: ${error}`, + error, + }); } - ); -} + }, +}); diff --git a/x-pack/plugins/cases/server/routes/api/configure/get_connectors.ts b/x-pack/plugins/cases/server/routes/api/configure/get_connectors.ts index 46c110bbb8ba5..da99cd19065d6 100644 --- a/x-pack/plugins/cases/server/routes/api/configure/get_connectors.ts +++ b/x-pack/plugins/cases/server/routes/api/configure/get_connectors.ts @@ -5,29 +5,26 @@ * 2.0. */ -import { RouteDeps } from '../types'; -import { wrapError } from '../utils'; - import { CASE_CONFIGURE_CONNECTORS_URL } from '../../../../common/constants'; +import { createCaseError } from '../../../common/error'; +import { createCasesRoute } from '../create_cases_route'; /* * Be aware that this api will only return 20 connectors */ -export function initCaseConfigureGetActionConnector({ router, logger }: RouteDeps) { - router.get( - { - path: `${CASE_CONFIGURE_CONNECTORS_URL}/_find`, - validate: false, - }, - async (context, request, response) => { - try { - const client = await context.cases.getCasesClient(); +export const getConnectorsRoute = createCasesRoute({ + method: 'get', + path: `${CASE_CONFIGURE_CONNECTORS_URL}/_find`, + handler: async ({ context, response }) => { + try { + const client = await context.cases.getCasesClient(); - return response.ok({ body: await client.configure.getConnectors() }); - } catch (error) { - logger.error(`Failed to get connectors in route: ${error}`); - return response.customError(wrapError(error)); - } + return response.ok({ body: await client.configure.getConnectors() }); + } catch (error) { + throw createCaseError({ + message: `Failed to get connectors in route: ${error}`, + error, + }); } - ); -} + }, +}); diff --git a/x-pack/plugins/cases/server/routes/api/configure/patch_configure.ts b/x-pack/plugins/cases/server/routes/api/configure/patch_configure.ts index e856a568f387a..40b0d5123f429 100644 --- a/x-pack/plugins/cases/server/routes/api/configure/patch_configure.ts +++ b/x-pack/plugins/cases/server/routes/api/configure/patch_configure.ts @@ -17,35 +17,30 @@ import { excess, } from '../../../../common/api'; import { CASE_CONFIGURE_DETAILS_URL } from '../../../../common/constants'; -import { RouteDeps } from '../types'; -import { wrapError, escapeHatch } from '../utils'; +import { createCaseError } from '../../../common/error'; +import { createCasesRoute } from '../create_cases_route'; -export function initPatchCaseConfigure({ router, logger }: RouteDeps) { - router.patch( - { - path: CASE_CONFIGURE_DETAILS_URL, - validate: { - params: escapeHatch, - body: escapeHatch, - }, - }, - async (context, request, response) => { - try { - const params = pipe( - excess(CaseConfigureRequestParamsRt).decode(request.params), - fold(throwErrors(Boom.badRequest), identity) - ); +export const patchCaseConfigureRoute = createCasesRoute({ + method: 'patch', + path: CASE_CONFIGURE_DETAILS_URL, + handler: async ({ context, request, response }) => { + try { + const params = pipe( + excess(CaseConfigureRequestParamsRt).decode(request.params), + fold(throwErrors(Boom.badRequest), identity) + ); - const client = await context.cases.getCasesClient(); - const configuration = request.body as CasesConfigurePatch; + const client = await context.cases.getCasesClient(); + const configuration = request.body as CasesConfigurePatch; - return response.ok({ - body: await client.configure.update(params.configuration_id, configuration), - }); - } catch (error) { - logger.error(`Failed to get patch configure in route: ${error}`); - return response.customError(wrapError(error)); - } + return response.ok({ + body: await client.configure.update(params.configuration_id, configuration), + }); + } catch (error) { + throw createCaseError({ + message: `Failed to patch configure in route: ${error}`, + error, + }); } - ); -} + }, +}); diff --git a/x-pack/plugins/cases/server/routes/api/configure/post_configure.ts b/x-pack/plugins/cases/server/routes/api/configure/post_configure.ts index ed4c3529f2ca0..bb64175fb52ad 100644 --- a/x-pack/plugins/cases/server/routes/api/configure/post_configure.ts +++ b/x-pack/plugins/cases/server/routes/api/configure/post_configure.ts @@ -12,33 +12,29 @@ import { identity } from 'fp-ts/lib/function'; import { CasesConfigureRequestRt, throwErrors } from '../../../../common/api'; import { CASE_CONFIGURE_URL } from '../../../../common/constants'; -import { RouteDeps } from '../types'; -import { wrapError, escapeHatch } from '../utils'; +import { createCaseError } from '../../../common/error'; +import { createCasesRoute } from '../create_cases_route'; -export function initPostCaseConfigure({ router, logger }: RouteDeps) { - router.post( - { - path: CASE_CONFIGURE_URL, - validate: { - body: escapeHatch, - }, - }, - async (context, request, response) => { - try { - const query = pipe( - CasesConfigureRequestRt.decode(request.body), - fold(throwErrors(Boom.badRequest), identity) - ); +export const postCaseConfigureRoute = createCasesRoute({ + method: 'post', + path: CASE_CONFIGURE_URL, + handler: async ({ context, request, response }) => { + try { + const query = pipe( + CasesConfigureRequestRt.decode(request.body), + fold(throwErrors(Boom.badRequest), identity) + ); - const client = await context.cases.getCasesClient(); + const client = await context.cases.getCasesClient(); - return response.ok({ - body: await client.configure.create(query), - }); - } catch (error) { - logger.error(`Failed to post case configure in route: ${error}`); - return response.customError(wrapError(error)); - } + return response.ok({ + body: await client.configure.create(query), + }); + } catch (error) { + throw createCaseError({ + message: `Failed to post case configure in route: ${error}`, + error, + }); } - ); -} + }, +}); diff --git a/x-pack/plugins/cases/server/routes/api/create_cases_route.ts b/x-pack/plugins/cases/server/routes/api/create_cases_route.ts new file mode 100644 index 0000000000000..eb6a1079440a0 --- /dev/null +++ b/x-pack/plugins/cases/server/routes/api/create_cases_route.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 { CaseRoute } from './types'; + +export const createCasesRoute = (route: CaseRoute) => route; diff --git a/x-pack/plugins/cases/server/routes/api/get_external_routes.ts b/x-pack/plugins/cases/server/routes/api/get_external_routes.ts new file mode 100644 index 0000000000000..7908e4eb84359 --- /dev/null +++ b/x-pack/plugins/cases/server/routes/api/get_external_routes.ts @@ -0,0 +1,61 @@ +/* + * 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 { getCasesByAlertIdRoute } from './cases/alerts/get_cases'; +import { deleteCaseRoute } from './cases/delete_cases'; +import { findCaseRoute } from './cases/find_cases'; +import { getCaseRoute, resolveCaseRoute } from './cases/get_case'; +import { patchCaseRoute } from './cases/patch_cases'; +import { postCaseRoute } from './cases/post_case'; +import { pushCaseRoute } from './cases/push_case'; +import { getReportersRoute } from './cases/reporters/get_reporters'; +import { getStatusRoute } from './stats/get_status'; +import { getUserActionsRoute } from './user_actions/get_all_user_actions'; +import { CaseRoute } from './types'; +import { getTagsRoute } from './cases/tags/get_tags'; +import { deleteAllCommentsRoute } from './comments/delete_all_comments'; +import { deleteCommentRoute } from './comments/delete_comment'; +import { findCommentsRoute } from './comments/find_comments'; +import { getCommentRoute } from './comments/get_comment'; +import { getAllCommentsRoute } from './comments/get_all_comment'; +import { patchCommentRoute } from './comments/patch_comment'; +import { postCommentRoute } from './comments/post_comment'; +import { getCaseConfigureRoute } from './configure/get_configure'; +import { getConnectorsRoute } from './configure/get_connectors'; +import { patchCaseConfigureRoute } from './configure/patch_configure'; +import { postCaseConfigureRoute } from './configure/post_configure'; +import { getAllAlertsAttachedToCaseRoute } from './comments/get_alerts'; +import { getCaseMetricRoute } from './metrics/get_case_metrics'; + +export const getExternalRoutes = () => + [ + deleteCaseRoute, + findCaseRoute, + getCaseRoute, + resolveCaseRoute, + patchCaseRoute, + postCaseRoute, + pushCaseRoute, + getUserActionsRoute, + getStatusRoute, + getCasesByAlertIdRoute, + getReportersRoute, + getTagsRoute, + deleteCommentRoute, + deleteAllCommentsRoute, + findCommentsRoute, + getCommentRoute, + getAllCommentsRoute, + patchCommentRoute, + postCommentRoute, + getCaseConfigureRoute, + getConnectorsRoute, + patchCaseConfigureRoute, + postCaseConfigureRoute, + getAllAlertsAttachedToCaseRoute, + getCaseMetricRoute, + ] as CaseRoute[]; diff --git a/x-pack/plugins/cases/server/routes/api/index.ts b/x-pack/plugins/cases/server/routes/api/index.ts index 8298f7469f236..31eafe0f29d28 100644 --- a/x-pack/plugins/cases/server/routes/api/index.ts +++ b/x-pack/plugins/cases/server/routes/api/index.ts @@ -5,76 +5,11 @@ * 2.0. */ -import { initDeleteCasesApi } from './cases/delete_cases'; -import { initFindCasesApi } from '././cases/find_cases'; -import { initGetCaseApi } from './cases/get_case'; -import { initPatchCasesApi } from './cases/patch_cases'; -import { initPostCaseApi } from './cases/post_case'; -import { initPushCaseApi } from './cases/push_case'; -import { initGetReportersApi } from './cases/reporters/get_reporters'; -import { initGetCasesStatusApi } from './stats/get_status'; -import { initGetTagsApi } from './cases/tags/get_tags'; -import { initGetAllCaseUserActionsApi } from './user_actions/get_all_user_actions'; - -import { initDeleteCommentApi } from './comments/delete_comment'; -import { initDeleteAllCommentsApi } from './comments/delete_all_comments'; -import { initFindCaseCommentsApi } from './comments/find_comments'; -import { initGetAllCommentsApi } from './comments/get_all_comment'; -import { initGetCommentApi } from './comments/get_comment'; -import { initPatchCommentApi } from './comments/patch_comment'; -import { initPostCommentApi } from './comments/post_comment'; - -import { initCaseConfigureGetActionConnector } from './configure/get_connectors'; -import { initGetCaseConfigure } from './configure/get_configure'; -import { initPatchCaseConfigure } from './configure/patch_configure'; -import { initPostCaseConfigure } from './configure/post_configure'; - -import { RouteDeps } from './types'; -import { initGetCasesByAlertIdApi } from './cases/alerts/get_cases'; -import { initGetAllAlertsAttachToCaseApi } from './comments/get_alerts'; -import { initGetCaseMetricsApi } from './metrics/get_case_metrics'; - /** * Default page number when interacting with the saved objects API. */ -export const defaultPage = 1; +export const DEFAULT_PAGE = 1; /** * Default number of results when interacting with the saved objects API. */ -export const defaultPerPage = 20; - -export function initCaseApi(deps: RouteDeps) { - // Cases - initDeleteCasesApi(deps); - initFindCasesApi(deps); - initGetCaseApi(deps); - initPatchCasesApi(deps); - initPostCaseApi(deps); - initPushCaseApi(deps); - initGetAllCaseUserActionsApi(deps); - - // Comments - initDeleteCommentApi(deps); - initDeleteAllCommentsApi(deps); - initFindCaseCommentsApi(deps); - initGetCommentApi(deps); - initGetAllCommentsApi(deps); - initPatchCommentApi(deps); - initPostCommentApi(deps); - // Cases Configure - initCaseConfigureGetActionConnector(deps); - initGetCaseConfigure(deps); - initPatchCaseConfigure(deps); - initPostCaseConfigure(deps); - // Reporters - initGetReportersApi(deps); - // Status - initGetCasesStatusApi(deps); - // Tags - initGetTagsApi(deps); - // Alerts - initGetCasesByAlertIdApi(deps); - initGetAllAlertsAttachToCaseApi(deps); - // Metrics - initGetCaseMetricsApi(deps); -} +export const DEFAULT_PER_PAGE = 20; diff --git a/x-pack/plugins/cases/server/routes/api/metrics/get_case_metrics.ts b/x-pack/plugins/cases/server/routes/api/metrics/get_case_metrics.ts index 0cfad10b28316..b86b84410abe6 100644 --- a/x-pack/plugins/cases/server/routes/api/metrics/get_case_metrics.ts +++ b/x-pack/plugins/cases/server/routes/api/metrics/get_case_metrics.ts @@ -7,37 +7,35 @@ import { schema } from '@kbn/config-schema'; -import { RouteDeps } from '../types'; -import { wrapError } from '../utils'; - import { CASE_METRICS_DETAILS_URL } from '../../../../common/constants'; +import { createCaseError } from '../../../common/error'; +import { createCasesRoute } from '../create_cases_route'; -export function initGetCaseMetricsApi({ router, logger }: RouteDeps) { - router.get( - { - path: CASE_METRICS_DETAILS_URL, - validate: { - params: schema.object({ - case_id: schema.string({ minLength: 1 }), - }), - query: schema.object({ - features: schema.arrayOf(schema.string({ minLength: 1 })), +export const getCaseMetricRoute = createCasesRoute({ + method: 'get', + path: CASE_METRICS_DETAILS_URL, + params: { + params: schema.object({ + case_id: schema.string({ minLength: 1 }), + }), + query: schema.object({ + features: schema.arrayOf(schema.string({ minLength: 1 })), + }), + }, + handler: async ({ context, request, response }) => { + try { + const client = await context.cases.getCasesClient(); + return response.ok({ + body: await client.metrics.getCaseMetrics({ + caseId: request.params.case_id, + features: request.query.features, }), - }, - }, - async (context, request, response) => { - try { - const client = await context.cases.getCasesClient(); - return response.ok({ - body: await client.metrics.getCaseMetrics({ - caseId: request.params.case_id, - features: request.query.features, - }), - }); - } catch (error) { - logger.error(`Failed to get case metrics in route: ${error}`); - return response.customError(wrapError(error)); - } + }); + } catch (error) { + throw createCaseError({ + message: `Failed to get case metrics in route: ${error}`, + error, + }); } - ); -} + }, +}); diff --git a/x-pack/plugins/cases/server/routes/api/register_routes.test.ts b/x-pack/plugins/cases/server/routes/api/register_routes.test.ts new file mode 100644 index 0000000000000..71ec6f2bce5cd --- /dev/null +++ b/x-pack/plugins/cases/server/routes/api/register_routes.test.ts @@ -0,0 +1,280 @@ +/* + * 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 { schema } from '@kbn/config-schema'; + +import { + httpServerMock, + httpServiceMock, + loggingSystemMock, +} from '../../../../../../src/core/server/mocks'; + +import { usageCollectionPluginMock } from '../../../../../../src/plugins/usage_collection/server/mocks'; + +import { CasesRouter } from '../../types'; +import { createCasesRoute } from './create_cases_route'; +import { registerRoutes } from './register_routes'; +import { CaseRoute } from './types'; + +describe('registerRoutes', () => { + let router: jest.Mocked; + const logger = loggingSystemMock.createLogger(); + const response = httpServerMock.createResponseFactory(); + const telemetryUsageCounter = usageCollectionPluginMock + .createSetupContract() + .createUsageCounter('test'); + + const handler = jest.fn(); + const customError = jest.fn(); + const badRequest = jest.fn(); + + const routes = [ + createCasesRoute({ + method: 'get', + path: '/foo/{case_id}', + params: { + params: schema.object({ + case_id: schema.string(), + }), + query: schema.object({ + includeComments: schema.boolean(), + }), + }, + handler, + }), + + createCasesRoute({ + method: 'post', + path: '/bar', + params: { + body: schema.object({ + title: schema.string(), + }), + }, + handler: async () => response.ok(), + }), + createCasesRoute({ + method: 'put', + path: '/baz', + handler: async () => response.ok(), + }), + createCasesRoute({ + method: 'patch', + path: '/qux', + handler: async () => response.ok(), + }), + createCasesRoute({ + method: 'delete', + path: '/quux', + handler: async () => response.ok(), + }), + ] as CaseRoute[]; + + const initApi = (casesRoutes: CaseRoute[]) => { + registerRoutes({ + router, + logger, + routes: casesRoutes, + kibanaVersion: '8.2.0', + telemetryUsageCounter, + }); + + const simulateRequest = async ({ + method, + path, + context = { cases: {} }, + headers = {}, + }: { + method: keyof Pick; + path: string; + context?: Record; + headers?: Record; + }) => { + const [, registeredRouteHandler] = + // @ts-ignore + router[method].mock.calls.find((call) => { + return call[0].path === path; + }) ?? []; + + const result = await registeredRouteHandler( + context, + { headers }, + { customError, badRequest } + ); + return result; + }; + + return { + simulateRequest, + }; + }; + + const initAndSimulateError = async () => { + const { simulateRequest } = initApi([ + ...routes, + createCasesRoute({ + method: 'get', + path: '/error', + handler: async () => { + throw new Error('API error'); + }, + }), + ]); + + await simulateRequest({ + method: 'get', + path: '/error', + }); + }; + + beforeEach(() => { + jest.clearAllMocks(); + router = httpServiceMock.createRouter(); + }); + + describe('api registration', () => { + const endpoints: Array<[CaseRoute['method'], string]> = [ + ['get', '/foo/{case_id}'], + ['post', '/bar'], + ['put', '/baz'], + ['patch', '/qux'], + ['delete', '/quux'], + ]; + + it('registers the endpoints correctly', () => { + initApi(routes); + + for (const endpoint of endpoints) { + const [method, path] = endpoint; + + expect(router[method]).toHaveBeenCalledTimes(1); + expect(router[method]).toBeCalledWith( + { path, validate: expect.anything() }, + expect.anything() + ); + } + }); + }); + + describe('api validation', () => { + const validation: Array< + ['params' | 'query' | 'body', keyof CasesRouter, Record] + > = [ + ['params', 'get', { case_id: '123' }], + ['query', 'get', { includeComments: false }], + ['body', 'post', { title: 'test' }], + ]; + + describe.each(validation)('%s', (type, method, value) => { + it(`validates ${type} correctly`, () => { + initApi(routes); + // @ts-ignore + const params = router[method].mock.calls[0][0].validate[type]; + expect(() => params.validate(value)).not.toThrow(); + }); + + it(`throws if ${type} is wrong`, () => { + initApi(routes); + // @ts-ignore + const params = router[method].mock.calls[0][0].validate[type]; + expect(() => params.validate({})).toThrow(); + }); + + it(`skips path parameter validation if ${type} is not provided`, () => { + initApi(routes); + // @ts-ignore + const params = router.put.mock.calls[0][0].validate[type]; + expect(() => params.validate({})).not.toThrow(); + }); + }); + }); + + describe('handler execution', () => { + it('calls the handler correctly', async () => { + const { simulateRequest } = initApi(routes); + await simulateRequest({ method: 'get', path: '/foo/{case_id}' }); + expect(handler).toHaveBeenCalled(); + }); + }); + + describe('telemetry', () => { + it('increases the counters correctly on a successful kibana request', async () => { + const { simulateRequest } = initApi(routes); + await simulateRequest({ + method: 'get', + path: '/foo/{case_id}', + headers: { 'kbn-version': '8.2.0', referer: 'https://example.com' }, + }); + expect(telemetryUsageCounter.incrementCounter).toHaveBeenCalledWith({ + counterName: 'GET /foo/{case_id}', + counterType: 'success', + }); + + expect(telemetryUsageCounter.incrementCounter).toHaveBeenCalledWith({ + counterName: 'GET /foo/{case_id}', + counterType: 'kibanaRequest.yes', + }); + }); + + it('increases the counters correctly on a successful non kibana request', async () => { + const { simulateRequest } = initApi(routes); + await simulateRequest({ + method: 'get', + path: '/foo/{case_id}', + }); + expect(telemetryUsageCounter.incrementCounter).toHaveBeenCalledWith({ + counterName: 'GET /foo/{case_id}', + counterType: 'success', + }); + + expect(telemetryUsageCounter.incrementCounter).toHaveBeenCalledWith({ + counterName: 'GET /foo/{case_id}', + counterType: 'kibanaRequest.no', + }); + }); + + it('increases the counters correctly on an error', async () => { + await initAndSimulateError(); + + expect(telemetryUsageCounter.incrementCounter).toHaveBeenCalledWith({ + counterName: 'GET /error', + counterType: 'error', + }); + }); + }); + + describe('errors', () => { + it('logs the error', async () => { + await initAndSimulateError(); + + expect(logger.error).toBeCalledWith('API error'); + }); + + it('returns an error response', async () => { + await initAndSimulateError(); + + expect(customError).toBeCalledWith({ + body: expect.anything(), + headers: {}, + statusCode: 500, + }); + }); + + it('returns an error response when the case context is not registered', async () => { + const { simulateRequest } = initApi(routes); + await simulateRequest({ + method: 'get', + path: '/foo/{case_id}', + context: {}, + }); + + expect(badRequest).toBeCalledWith({ + body: 'RouteHandlerContext is not registered for cases', + }); + }); + }); +}); diff --git a/x-pack/plugins/cases/server/routes/api/register_routes.ts b/x-pack/plugins/cases/server/routes/api/register_routes.ts new file mode 100644 index 0000000000000..843009f3b22c5 --- /dev/null +++ b/x-pack/plugins/cases/server/routes/api/register_routes.ts @@ -0,0 +1,88 @@ +/* + * 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 { schema } from '@kbn/config-schema'; +import { RouteRegistrar } from 'kibana/server'; +import { CasesRequestHandlerContext } from '../../types'; +import { CaseRoute, RegisterRoutesDeps } from './types'; +import { escapeHatch, getIsKibanaRequest, wrapError } from './utils'; + +const increaseTelemetryCounters = ({ + telemetryUsageCounter, + method, + path, + isKibanaRequest, + isError = false, +}: { + telemetryUsageCounter: Exclude; + method: string; + path: string; + isKibanaRequest: boolean; + isError?: boolean; +}) => { + const counterName = `${method.toUpperCase()} ${path}`; + + telemetryUsageCounter.incrementCounter({ + counterName, + counterType: isError ? 'error' : 'success', + }); + + telemetryUsageCounter.incrementCounter({ + counterName, + counterType: `kibanaRequest.${isKibanaRequest ? 'yes' : 'no'}`, + }); +}; + +export const registerRoutes = (deps: RegisterRoutesDeps) => { + const { router, routes, logger, kibanaVersion, telemetryUsageCounter } = deps; + + routes.forEach((route) => { + const { method, path, params, handler } = route as CaseRoute; + + (router[method] as RouteRegistrar)( + { + path, + validate: { + params: params?.params ?? escapeHatch, + query: params?.query ?? escapeHatch, + body: params?.body ?? schema.nullable(escapeHatch), + }, + }, + async (context, request, response) => { + const isKibanaRequest = getIsKibanaRequest(request.headers); + + if (!context.cases) { + return response.badRequest({ body: 'RouteHandlerContext is not registered for cases' }); + } + + try { + const res = await handler({ logger, context, request, response, kibanaVersion }); + + if (telemetryUsageCounter) { + increaseTelemetryCounters({ telemetryUsageCounter, method, path, isKibanaRequest }); + } + + return res; + } catch (error) { + logger.error(error.message); + + if (telemetryUsageCounter) { + increaseTelemetryCounters({ + telemetryUsageCounter, + method, + path, + isError: true, + isKibanaRequest, + }); + } + + return response.customError(wrapError(error)); + } + } + ); + }); +}; diff --git a/x-pack/plugins/cases/server/routes/api/stats/get_status.ts b/x-pack/plugins/cases/server/routes/api/stats/get_status.ts index 90044c9516b3a..4cd5bd7eebd0a 100644 --- a/x-pack/plugins/cases/server/routes/api/stats/get_status.ts +++ b/x-pack/plugins/cases/server/routes/api/stats/get_status.ts @@ -5,40 +5,40 @@ * 2.0. */ -import { RouteDeps } from '../types'; -import { escapeHatch, wrapError, getWarningHeader, logDeprecatedEndpoint } from '../utils'; +import { CaseRoute } from '../types'; +import { getWarningHeader, logDeprecatedEndpoint } from '../utils'; import { CasesStatusRequest } from '../../../../common/api'; import { CASE_STATUS_URL } from '../../../../common/constants'; +import { createCaseError } from '../../../common/error'; +import { createCasesRoute } from '../create_cases_route'; /** * @deprecated since version 8.1.0 */ -export function initGetCasesStatusApi({ router, logger, kibanaVersion }: RouteDeps) { - router.get( - { - path: CASE_STATUS_URL, - validate: { query: escapeHatch }, - }, - async (context, request, response) => { - try { - logDeprecatedEndpoint( - logger, - request.headers, - `The get cases status API '${CASE_STATUS_URL}' is deprecated.` - ); +export const getStatusRoute: CaseRoute = createCasesRoute({ + method: 'get', + path: CASE_STATUS_URL, + handler: async ({ context, request, response, logger, kibanaVersion }) => { + try { + logDeprecatedEndpoint( + logger, + request.headers, + `The get cases status API '${CASE_STATUS_URL}' is deprecated.` + ); - const client = await context.cases.getCasesClient(); - return response.ok({ - headers: { - ...getWarningHeader(kibanaVersion), - }, - body: await client.metrics.getStatusTotalsByType(request.query as CasesStatusRequest), - }); - } catch (error) { - logger.error(`Failed to get status stats in route: ${error}`); - return response.customError(wrapError(error)); - } + const client = await context.cases.getCasesClient(); + return response.ok({ + headers: { + ...getWarningHeader(kibanaVersion), + }, + body: await client.metrics.getStatusTotalsByType(request.query as CasesStatusRequest), + }); + } catch (error) { + throw createCaseError({ + message: `Failed to get status stats in route: ${error}`, + error, + }); } - ); -} + }, +}); diff --git a/x-pack/plugins/cases/server/routes/api/types.ts b/x-pack/plugins/cases/server/routes/api/types.ts index e3aa6e0e970fa..2b1893ebb75c7 100644 --- a/x-pack/plugins/cases/server/routes/api/types.ts +++ b/x-pack/plugins/cases/server/routes/api/types.ts @@ -5,17 +5,44 @@ * 2.0. */ -import type { Logger, PluginInitializerContext } from 'kibana/server'; +import type { + Logger, + PluginInitializerContext, + KibanaRequest, + IKibanaResponse, + KibanaResponseFactory, + RouteValidatorConfig, +} from 'kibana/server'; -import type { CasesRouter } from '../../types'; +import { UsageCollectionSetup } from '../../../../../../src/plugins/usage_collection/server'; +import type { CasesRequestHandlerContext, CasesRouter } from '../../types'; -export interface RouteDeps { +type TelemetryUsageCounter = ReturnType; + +export interface RegisterRoutesDeps { router: CasesRouter; + routes: CaseRoute[]; logger: Logger; kibanaVersion: PluginInitializerContext['env']['packageInfo']['version']; + telemetryUsageCounter?: TelemetryUsageCounter; } export interface TotalCommentByCase { caseId: string; totalComments: number; } + +interface CaseRouteHandlerArguments { + request: KibanaRequest; + context: CasesRequestHandlerContext; + response: KibanaResponseFactory; + logger: Logger; + kibanaVersion: PluginInitializerContext['env']['packageInfo']['version']; +} + +export interface CaseRoute

{ + method: 'get' | 'post' | 'put' | 'delete' | 'patch'; + path: string; + params?: RouteValidatorConfig; + handler: (args: CaseRouteHandlerArguments) => Promise; +} diff --git a/x-pack/plugins/cases/server/routes/api/user_actions/get_all_user_actions.ts b/x-pack/plugins/cases/server/routes/api/user_actions/get_all_user_actions.ts index 2e38ac8b4ebc7..b9b6ce43a9fdf 100644 --- a/x-pack/plugins/cases/server/routes/api/user_actions/get_all_user_actions.ts +++ b/x-pack/plugins/cases/server/routes/api/user_actions/get_all_user_actions.ts @@ -7,50 +7,44 @@ import { schema } from '@kbn/config-schema'; -import { RouteDeps } from '../types'; -import { getWarningHeader, logDeprecatedEndpoint, wrapError } from '../utils'; +import { getWarningHeader, logDeprecatedEndpoint } from '../utils'; import { CASE_USER_ACTIONS_URL } from '../../../../common/constants'; +import { createCaseError } from '../../../common/error'; +import { createCasesRoute } from '../create_cases_route'; /** * @deprecated since version 8.1.0 */ -export function initGetAllCaseUserActionsApi({ router, logger, kibanaVersion }: RouteDeps) { - router.get( - { - path: CASE_USER_ACTIONS_URL, - validate: { - params: schema.object({ - case_id: schema.string(), - }), - }, - }, - async (context, request, response) => { - try { - if (!context.cases) { - return response.badRequest({ body: 'RouteHandlerContext is not registered for cases' }); - } +export const getUserActionsRoute = createCasesRoute({ + method: 'get', + path: CASE_USER_ACTIONS_URL, + params: { + params: schema.object({ + case_id: schema.string(), + }), + }, + handler: async ({ context, request, response, logger, kibanaVersion }) => { + try { + logDeprecatedEndpoint( + logger, + request.headers, + `The get all cases user actions API '${CASE_USER_ACTIONS_URL}' is deprecated.` + ); - logDeprecatedEndpoint( - logger, - request.headers, - `The get all cases user actions API '${CASE_USER_ACTIONS_URL}' is deprecated.` - ); + const casesClient = await context.cases.getCasesClient(); + const caseId = request.params.case_id; - const casesClient = await context.cases.getCasesClient(); - const caseId = request.params.case_id; - - return response.ok({ - headers: { - ...getWarningHeader(kibanaVersion), - }, - body: await casesClient.userActions.getAll({ caseId }), - }); - } catch (error) { - logger.error( - `Failed to retrieve case user actions in route case id: ${request.params.case_id}: ${error}` - ); - return response.customError(wrapError(error)); - } + return response.ok({ + headers: { + ...getWarningHeader(kibanaVersion), + }, + body: await casesClient.userActions.getAll({ caseId }), + }); + } catch (error) { + throw createCaseError({ + message: `Failed to retrieve case user actions in route case id: ${request.params.case_id}: ${error}`, + error, + }); } - ); -} + }, +}); diff --git a/x-pack/plugins/cases/server/routes/api/utils.ts b/x-pack/plugins/cases/server/routes/api/utils.ts index 532a316e9a7b8..3536e4db34667 100644 --- a/x-pack/plugins/cases/server/routes/api/utils.ts +++ b/x-pack/plugins/cases/server/routes/api/utils.ts @@ -52,10 +52,10 @@ export const getWarningHeader = ( * https://github.com/elastic/kibana/blob/ec30f2aeeb10fb64b507935e558832d3ef5abfaa/x-pack/plugins/spaces/server/usage_stats/usage_stats_client.ts#L113-L118 */ -const getIsKibanaRequest = (headers?: Headers) => { +export const getIsKibanaRequest = (headers?: Headers): boolean => { // The presence of these two request headers gives us a good indication that this is a first-party request from the Kibana client. // We can't be 100% certain, but this is a reasonable attempt. - return headers && headers['kbn-version'] && headers.referer; + return !!(headers && headers['kbn-version'] && headers.referer); }; export const logDeprecatedEndpoint = (logger: Logger, headers: Headers, msg: string) => { diff --git a/x-pack/plugins/cases/server/services/cases/index.ts b/x-pack/plugins/cases/server/services/cases/index.ts index 832d12071b466..684edcc077f8e 100644 --- a/x-pack/plugins/cases/server/services/cases/index.ts +++ b/x-pack/plugins/cases/server/services/cases/index.ts @@ -39,7 +39,7 @@ import { } from '../../../common/api'; import { SavedObjectFindOptionsKueryNode } from '../../common/types'; import { defaultSortField, flattenCaseSavedObject } from '../../common/utils'; -import { defaultPage, defaultPerPage } from '../../routes/api'; +import { DEFAULT_PAGE, DEFAULT_PER_PAGE } from '../../routes/api'; import { combineFilters } from '../../client/utils'; import { includeFieldsRequiredForAuthentication } from '../../authorization/utils'; import { @@ -420,8 +420,8 @@ export class CasesService { return { saved_objects: [], total: 0, - per_page: options?.perPage ?? defaultPerPage, - page: options?.page ?? defaultPage, + per_page: options?.perPage ?? DEFAULT_PER_PAGE, + page: options?.page ?? DEFAULT_PAGE, }; } From 5d1ef0e7e58868b32eeb6130b6a94a65cc5ec912 Mon Sep 17 00:00:00 2001 From: Chris Roberson Date: Fri, 25 Feb 2022 14:41:58 -0500 Subject: [PATCH 032/102] [Response Ops] Alert search strategy (#124430) * Initial code for search strategy in rule registry for use in triggers actions ui * WIP * More * Bump this up * Add a couple basic tests * More separation * Some api tests * Fix types * fix type * Remove tests * add this back in, not sure why this happened * Remove test code * PR feedback * Fix typing * Fix unit tests * Skip this test due to errors * Add more tests * Use fields api * Add issue link * PR feedback * Fix types and test * Use nested key TS definition Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../plugins/rule_registry/common/constants.ts | 1 + x-pack/plugins/rule_registry/common/index.ts | 4 +- .../common/search_strategy/index.ts | 58 +++++ x-pack/plugins/rule_registry/kibana.json | 2 +- .../server/alert_data_client/alerts_client.ts | 18 +- .../server/lib/get_authz_filter.test.ts | 20 ++ .../server/lib/get_authz_filter.ts | 33 +++ .../server/lib/get_spaces_filter.test.ts | 20 ++ .../server/lib/get_spaces_filter.ts | 11 + .../plugins/rule_registry/server/lib/index.ts | 8 + x-pack/plugins/rule_registry/server/plugin.ts | 25 +++ .../server/search_strategy/index.ts | 8 + .../search_strategy/search_strategy.test.ts | 202 ++++++++++++++++++ .../server/search_strategy/search_strategy.ts | 149 +++++++++++++ x-pack/plugins/rule_registry/tsconfig.json | 1 - .../plugins/triggers_actions_ui/tsconfig.json | 1 + .../security_and_spaces/tests/basic/index.ts | 15 +- .../tests/basic/search_strategy.ts | 138 ++++++++++++ 18 files changed, 691 insertions(+), 23 deletions(-) create mode 100644 x-pack/plugins/rule_registry/common/search_strategy/index.ts create mode 100644 x-pack/plugins/rule_registry/server/lib/get_authz_filter.test.ts create mode 100644 x-pack/plugins/rule_registry/server/lib/get_authz_filter.ts create mode 100644 x-pack/plugins/rule_registry/server/lib/get_spaces_filter.test.ts create mode 100644 x-pack/plugins/rule_registry/server/lib/get_spaces_filter.ts create mode 100644 x-pack/plugins/rule_registry/server/lib/index.ts create mode 100644 x-pack/plugins/rule_registry/server/search_strategy/index.ts create mode 100644 x-pack/plugins/rule_registry/server/search_strategy/search_strategy.test.ts create mode 100644 x-pack/plugins/rule_registry/server/search_strategy/search_strategy.ts create mode 100644 x-pack/test/rule_registry/security_and_spaces/tests/basic/search_strategy.ts diff --git a/x-pack/plugins/rule_registry/common/constants.ts b/x-pack/plugins/rule_registry/common/constants.ts index 72793b1087e7b..1c5fad0e2215f 100644 --- a/x-pack/plugins/rule_registry/common/constants.ts +++ b/x-pack/plugins/rule_registry/common/constants.ts @@ -6,3 +6,4 @@ */ export const BASE_RAC_ALERTS_API_PATH = '/internal/rac/alerts'; +export const MAX_ALERT_SEARCH_SIZE = 1000; diff --git a/x-pack/plugins/rule_registry/common/index.ts b/x-pack/plugins/rule_registry/common/index.ts index 5d36cd8cad7be..2dd7f6bbc456e 100644 --- a/x-pack/plugins/rule_registry/common/index.ts +++ b/x-pack/plugins/rule_registry/common/index.ts @@ -4,4 +4,6 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -export { parseTechnicalFields } from './parse_technical_fields'; +export { parseTechnicalFields, type ParsedTechnicalFields } from './parse_technical_fields'; +export type { RuleRegistrySearchRequest, RuleRegistrySearchResponse } from './search_strategy'; +export { BASE_RAC_ALERTS_API_PATH } from './constants'; diff --git a/x-pack/plugins/rule_registry/common/search_strategy/index.ts b/x-pack/plugins/rule_registry/common/search_strategy/index.ts new file mode 100644 index 0000000000000..efb8a3478263e --- /dev/null +++ b/x-pack/plugins/rule_registry/common/search_strategy/index.ts @@ -0,0 +1,58 @@ +/* + * 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 { ValidFeatureId } from '@kbn/rule-data-utils'; +import { Ecs } from 'kibana/server'; +import * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; +import { IEsSearchRequest, IEsSearchResponse } from 'src/plugins/data/common'; + +export type RuleRegistrySearchRequest = IEsSearchRequest & { + featureIds: ValidFeatureId[]; + query?: { bool: estypes.QueryDslBoolQuery }; +}; + +type Prev = [ + never, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + ...Array<0> +]; + +type Join = K extends string | number + ? P extends string | number + ? `${K}${'' extends P ? '' : '.'}${P}` + : never + : never; + +type DotNestedKeys = [D] extends [never] + ? never + : T extends object + ? { [K in keyof T]-?: Join> }[keyof T] + : ''; + +type EcsFieldsResponse = { + [Property in DotNestedKeys]: string[]; +}; +export type RuleRegistrySearchResponse = IEsSearchResponse; diff --git a/x-pack/plugins/rule_registry/kibana.json b/x-pack/plugins/rule_registry/kibana.json index 75e0c2c8c0bac..9603cb0a2640b 100644 --- a/x-pack/plugins/rule_registry/kibana.json +++ b/x-pack/plugins/rule_registry/kibana.json @@ -8,6 +8,6 @@ "kibanaVersion": "kibana", "configPath": ["xpack", "ruleRegistry"], "requiredPlugins": ["alerting", "data", "triggersActionsUi"], - "optionalPlugins": ["security"], + "optionalPlugins": ["security", "spaces"], "server": true } diff --git a/x-pack/plugins/rule_registry/server/alert_data_client/alerts_client.ts b/x-pack/plugins/rule_registry/server/alert_data_client/alerts_client.ts index 1f8cfb4b78c85..a97b43332e0a9 100644 --- a/x-pack/plugins/rule_registry/server/alert_data_client/alerts_client.ts +++ b/x-pack/plugins/rule_registry/server/alert_data_client/alerts_client.ts @@ -21,7 +21,7 @@ import { InlineScript, QueryDslQueryContainer, } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; -import { AlertTypeParams, AlertingAuthorizationFilterType } from '../../../alerting/server'; +import { AlertTypeParams } from '../../../alerting/server'; import { ReadOperations, AlertingAuthorization, @@ -39,6 +39,7 @@ import { } from '../../common/technical_rule_data_field_names'; import { ParsedTechnicalFields } from '../../common/parse_technical_fields'; import { Dataset, IRuleDataService } from '../rule_data_plugin_service'; +import { getAuthzFilter, getSpacesFilter } from '../lib'; // TODO: Fix typings https://github.com/elastic/kibana/issues/101776 type NonNullableProps = Omit & { @@ -369,14 +370,8 @@ export class AlertsClient { config: EsQueryConfig ) { try { - const { filter: authzFilter } = await this.authorization.getAuthorizationFilter( - AlertingAuthorizationEntity.Alert, - { - type: AlertingAuthorizationFilterType.ESDSL, - fieldNames: { consumer: ALERT_RULE_CONSUMER, ruleTypeId: ALERT_RULE_TYPE_ID }, - }, - operation - ); + const authzFilter = (await getAuthzFilter(this.authorization, operation)) as Filter; + const spacesFilter = getSpacesFilter(alertSpaceId) as unknown as Filter; let esQuery; if (id != null) { esQuery = { query: `_id:${id}`, language: 'kuery' }; @@ -388,10 +383,7 @@ export class AlertsClient { const builtQuery = buildEsQuery( undefined, esQuery == null ? { query: ``, language: 'kuery' } : esQuery, - [ - authzFilter as unknown as Filter, - { query: { term: { [SPACE_IDS]: alertSpaceId } } } as unknown as Filter, - ], + [authzFilter, spacesFilter], config ); if (query != null && typeof query === 'object') { diff --git a/x-pack/plugins/rule_registry/server/lib/get_authz_filter.test.ts b/x-pack/plugins/rule_registry/server/lib/get_authz_filter.test.ts new file mode 100644 index 0000000000000..3b79c7a5bad8a --- /dev/null +++ b/x-pack/plugins/rule_registry/server/lib/get_authz_filter.test.ts @@ -0,0 +1,20 @@ +/* + * 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 { alertingAuthorizationMock } from '../../../alerting/server/authorization/alerting_authorization.mock'; +import { ReadOperations } from '../../../alerting/server'; +import { getAuthzFilter } from './get_authz_filter'; + +describe('getAuthzFilter()', () => { + it('should call `getAuthorizationFilter`', async () => { + const authorization = alertingAuthorizationMock.create(); + authorization.getAuthorizationFilter.mockImplementationOnce(async () => { + return { filter: { test: true }, ensureRuleTypeIsAuthorized: () => {} }; + }); + const filter = await getAuthzFilter(authorization, ReadOperations.Find); + expect(filter).toStrictEqual({ test: true }); + }); +}); diff --git a/x-pack/plugins/rule_registry/server/lib/get_authz_filter.ts b/x-pack/plugins/rule_registry/server/lib/get_authz_filter.ts new file mode 100644 index 0000000000000..88b8feb2ca97c --- /dev/null +++ b/x-pack/plugins/rule_registry/server/lib/get_authz_filter.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 { PublicMethodsOf } from '@kbn/utility-types'; +import { + ReadOperations, + WriteOperations, + AlertingAuthorization, + AlertingAuthorizationEntity, + AlertingAuthorizationFilterType, +} from '../../../alerting/server'; +import { + ALERT_RULE_CONSUMER, + ALERT_RULE_TYPE_ID, +} from '../../common/technical_rule_data_field_names'; + +export async function getAuthzFilter( + authorization: PublicMethodsOf, + operation: WriteOperations.Update | ReadOperations.Get | ReadOperations.Find +) { + const { filter } = await authorization.getAuthorizationFilter( + AlertingAuthorizationEntity.Alert, + { + type: AlertingAuthorizationFilterType.ESDSL, + fieldNames: { consumer: ALERT_RULE_CONSUMER, ruleTypeId: ALERT_RULE_TYPE_ID }, + }, + operation + ); + return filter; +} diff --git a/x-pack/plugins/rule_registry/server/lib/get_spaces_filter.test.ts b/x-pack/plugins/rule_registry/server/lib/get_spaces_filter.test.ts new file mode 100644 index 0000000000000..7fd5f00fd99b1 --- /dev/null +++ b/x-pack/plugins/rule_registry/server/lib/get_spaces_filter.test.ts @@ -0,0 +1,20 @@ +/* + * 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 { getSpacesFilter } from '.'; +describe('getSpacesFilter()', () => { + it('should return a spaces filter', () => { + expect(getSpacesFilter('1')).toStrictEqual({ + term: { + 'kibana.space_ids': '1', + }, + }); + }); + + it('should return undefined if no space id is provided', () => { + expect(getSpacesFilter()).toBeUndefined(); + }); +}); diff --git a/x-pack/plugins/rule_registry/server/lib/get_spaces_filter.ts b/x-pack/plugins/rule_registry/server/lib/get_spaces_filter.ts new file mode 100644 index 0000000000000..2756b3d600f18 --- /dev/null +++ b/x-pack/plugins/rule_registry/server/lib/get_spaces_filter.ts @@ -0,0 +1,11 @@ +/* + * 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 { SPACE_IDS } from '../../common/technical_rule_data_field_names'; + +export function getSpacesFilter(spaceId?: string) { + return spaceId ? { term: { [SPACE_IDS]: spaceId } } : undefined; +} diff --git a/x-pack/plugins/rule_registry/server/lib/index.ts b/x-pack/plugins/rule_registry/server/lib/index.ts new file mode 100644 index 0000000000000..c9ed157e7c18a --- /dev/null +++ b/x-pack/plugins/rule_registry/server/lib/index.ts @@ -0,0 +1,8 @@ +/* + * 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. + */ +export { getAuthzFilter } from './get_authz_filter'; +export { getSpacesFilter } from './get_spaces_filter'; diff --git a/x-pack/plugins/rule_registry/server/plugin.ts b/x-pack/plugins/rule_registry/server/plugin.ts index 713e7862207b8..292e987879d58 100644 --- a/x-pack/plugins/rule_registry/server/plugin.ts +++ b/x-pack/plugins/rule_registry/server/plugin.ts @@ -17,6 +17,11 @@ import { import { PluginStartContract as AlertingStart } from '../../alerting/server'; import { SecurityPluginSetup } from '../../security/server'; +import { SpacesPluginStart } from '../../spaces/server'; +import { + PluginStart as DataPluginStart, + PluginSetup as DataPluginSetup, +} from '../../../../src/plugins/data/server'; import { RuleRegistryPluginConfig } from './config'; import { IRuleDataService, RuleDataService } from './rule_data_plugin_service'; @@ -24,13 +29,17 @@ import { AlertsClientFactory } from './alert_data_client/alerts_client_factory'; import { AlertsClient } from './alert_data_client/alerts_client'; import { RacApiRequestHandlerContext, RacRequestHandlerContext } from './types'; import { defineRoutes } from './routes'; +import { ruleRegistrySearchStrategyProvider } from './search_strategy'; export interface RuleRegistryPluginSetupDependencies { security?: SecurityPluginSetup; + data: DataPluginSetup; } export interface RuleRegistryPluginStartDependencies { alerting: AlertingStart; + data: DataPluginStart; + spaces?: SpacesPluginStart; } export interface RuleRegistryPluginSetupContract { @@ -95,6 +104,22 @@ export class RuleRegistryPlugin this.ruleDataService.initializeService(); + core.getStartServices().then(([_, depsStart]) => { + const ruleRegistrySearchStrategy = ruleRegistrySearchStrategyProvider( + depsStart.data, + this.ruleDataService!, + depsStart.alerting, + logger, + plugins.security, + depsStart.spaces + ); + + plugins.data.search.registerSearchStrategy( + 'ruleRegistryAlertsSearchStrategy', + ruleRegistrySearchStrategy + ); + }); + // ALERTS ROUTES const router = core.http.createRouter(); core.http.registerRouteHandlerContext( diff --git a/x-pack/plugins/rule_registry/server/search_strategy/index.ts b/x-pack/plugins/rule_registry/server/search_strategy/index.ts new file mode 100644 index 0000000000000..63f39430a5522 --- /dev/null +++ b/x-pack/plugins/rule_registry/server/search_strategy/index.ts @@ -0,0 +1,8 @@ +/* + * 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. + */ + +export { ruleRegistrySearchStrategyProvider } from './search_strategy'; diff --git a/x-pack/plugins/rule_registry/server/search_strategy/search_strategy.test.ts b/x-pack/plugins/rule_registry/server/search_strategy/search_strategy.test.ts new file mode 100644 index 0000000000000..9f83930dadc69 --- /dev/null +++ b/x-pack/plugins/rule_registry/server/search_strategy/search_strategy.test.ts @@ -0,0 +1,202 @@ +/* + * 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 { of } from 'rxjs'; +import { merge } from 'lodash'; +import { loggerMock } from '@kbn/logging-mocks'; +import { AlertConsumers } from '@kbn/rule-data-utils'; +import { ruleRegistrySearchStrategyProvider, EMPTY_RESPONSE } from './search_strategy'; +import { ruleDataServiceMock } from '../rule_data_plugin_service/rule_data_plugin_service.mock'; +import { dataPluginMock } from '../../../../../src/plugins/data/server/mocks'; +import { SearchStrategyDependencies } from '../../../../../src/plugins/data/server'; +import { alertsMock } from '../../../alerting/server/mocks'; +import { securityMock } from '../../../security/server/mocks'; +import { spacesMock } from '../../../spaces/server/mocks'; +import { RuleRegistrySearchRequest } from '../../common/search_strategy'; +import { IndexInfo } from '../rule_data_plugin_service/index_info'; +import * as getAuthzFilterImport from '../lib/get_authz_filter'; + +const getBasicResponse = (overwrites = {}) => { + return merge( + { + isPartial: false, + isRunning: false, + total: 0, + loaded: 0, + rawResponse: { + took: 1, + timed_out: false, + _shards: { + failed: 0, + successful: 1, + total: 1, + }, + hits: { + max_score: 0, + hits: [], + total: 0, + }, + }, + }, + overwrites + ); +}; + +describe('ruleRegistrySearchStrategyProvider()', () => { + const data = dataPluginMock.createStartContract(); + const ruleDataService = ruleDataServiceMock.create(); + const alerting = alertsMock.createStart(); + const security = securityMock.createSetup(); + const spaces = spacesMock.createStart(); + const logger = loggerMock.create(); + + const response = getBasicResponse({ + rawResponse: { + hits: { + hits: [ + { + _source: { + foo: 1, + }, + }, + ], + }, + }, + }); + + let getAuthzFilterSpy: jest.SpyInstance; + + beforeEach(() => { + ruleDataService.findIndicesByFeature.mockImplementation(() => { + return [ + { + baseName: 'test', + } as IndexInfo, + ]; + }); + + data.search.getSearchStrategy.mockImplementation(() => { + return { + search: () => of(response), + }; + }); + + getAuthzFilterSpy = jest + .spyOn(getAuthzFilterImport, 'getAuthzFilter') + .mockImplementation(async () => { + return {}; + }); + }); + + afterEach(() => { + ruleDataService.findIndicesByFeature.mockClear(); + data.search.getSearchStrategy.mockClear(); + getAuthzFilterSpy.mockClear(); + }); + + it('should handle a basic search request', async () => { + const request: RuleRegistrySearchRequest = { + featureIds: [AlertConsumers.LOGS], + }; + const options = {}; + const deps = { + request: {}, + }; + + const strategy = ruleRegistrySearchStrategyProvider( + data, + ruleDataService, + alerting, + logger, + security, + spaces + ); + + const result = await strategy + .search(request, options, deps as unknown as SearchStrategyDependencies) + .toPromise(); + expect(result).toBe(response); + }); + + it('should use the active space in siem queries', async () => { + const request: RuleRegistrySearchRequest = { + featureIds: [AlertConsumers.SIEM], + }; + const options = {}; + const deps = { + request: {}, + }; + + spaces.spacesService.getActiveSpace.mockImplementation(async () => { + return { + id: 'testSpace', + name: 'Test Space', + disabledFeatures: [], + }; + }); + + ruleDataService.findIndicesByFeature.mockImplementation(() => { + return [ + { + baseName: 'myTestIndex', + } as unknown as IndexInfo, + ]; + }); + + let searchRequest: RuleRegistrySearchRequest = {} as unknown as RuleRegistrySearchRequest; + data.search.getSearchStrategy.mockImplementation(() => { + return { + search: (_request) => { + searchRequest = _request as unknown as RuleRegistrySearchRequest; + return of(response); + }, + }; + }); + + const strategy = ruleRegistrySearchStrategyProvider( + data, + ruleDataService, + alerting, + logger, + security, + spaces + ); + + await strategy + .search(request, options, deps as unknown as SearchStrategyDependencies) + .toPromise(); + spaces.spacesService.getActiveSpace.mockClear(); + expect(searchRequest?.params?.index).toStrictEqual(['myTestIndex-testSpace*']); + }); + + it('should return an empty response if no valid indices are found', async () => { + const request: RuleRegistrySearchRequest = { + featureIds: [AlertConsumers.LOGS], + }; + const options = {}; + const deps = { + request: {}, + }; + + ruleDataService.findIndicesByFeature.mockImplementationOnce(() => { + return []; + }); + + const strategy = ruleRegistrySearchStrategyProvider( + data, + ruleDataService, + alerting, + logger, + security, + spaces + ); + + const result = await strategy + .search(request, options, deps as unknown as SearchStrategyDependencies) + .toPromise(); + expect(result).toBe(EMPTY_RESPONSE); + }); +}); diff --git a/x-pack/plugins/rule_registry/server/search_strategy/search_strategy.ts b/x-pack/plugins/rule_registry/server/search_strategy/search_strategy.ts new file mode 100644 index 0000000000000..dd7f392b0a268 --- /dev/null +++ b/x-pack/plugins/rule_registry/server/search_strategy/search_strategy.ts @@ -0,0 +1,149 @@ +/* + * 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 { map, mergeMap, catchError } from 'rxjs/operators'; +import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; +import { Logger } from 'src/core/server'; +import { from, of } from 'rxjs'; +import { isValidFeatureId } from '@kbn/rule-data-utils'; +import { ENHANCED_ES_SEARCH_STRATEGY } from '../../../../../src/plugins/data/common'; +import { ISearchStrategy, PluginStart } from '../../../../../src/plugins/data/server'; +import { + RuleRegistrySearchRequest, + RuleRegistrySearchResponse, +} from '../../common/search_strategy'; +import { ReadOperations, PluginStartContract as AlertingStart } from '../../../alerting/server'; +import { SecurityPluginSetup } from '../../../security/server'; +import { SpacesPluginStart } from '../../../spaces/server'; +import { IRuleDataService } from '..'; +import { Dataset } from '../rule_data_plugin_service/index_options'; +import { MAX_ALERT_SEARCH_SIZE } from '../../common/constants'; +import { AlertAuditAction, alertAuditEvent } from '../'; +import { getSpacesFilter, getAuthzFilter } from '../lib'; + +export const EMPTY_RESPONSE: RuleRegistrySearchResponse = { + rawResponse: {} as RuleRegistrySearchResponse['rawResponse'], +}; + +export const ruleRegistrySearchStrategyProvider = ( + data: PluginStart, + ruleDataService: IRuleDataService, + alerting: AlertingStart, + logger: Logger, + security?: SecurityPluginSetup, + spaces?: SpacesPluginStart +): ISearchStrategy => { + const es = data.search.getSearchStrategy(ENHANCED_ES_SEARCH_STRATEGY); + + return { + search: (request, options, deps) => { + const securityAuditLogger = security?.audit.asScoped(deps.request); + const getActiveSpace = async () => spaces?.spacesService.getActiveSpace(deps.request); + const getAsync = async () => { + const [space, authorization] = await Promise.all([ + getActiveSpace(), + alerting.getAlertingAuthorizationWithRequest(deps.request), + ]); + const authzFilter = (await getAuthzFilter( + authorization, + ReadOperations.Find + )) as estypes.QueryDslQueryContainer; + return { space, authzFilter }; + }; + return from(getAsync()).pipe( + mergeMap(({ space, authzFilter }) => { + const indices: string[] = request.featureIds.reduce((accum: string[], featureId) => { + if (!isValidFeatureId(featureId)) { + logger.warn( + `Found invalid feature '${featureId}' while using rule registry search strategy. No alert data from this feature will be searched.` + ); + return accum; + } + + return [ + ...accum, + ...ruleDataService + .findIndicesByFeature(featureId, Dataset.alerts) + .map((indexInfo) => { + return featureId === 'siem' + ? `${indexInfo.baseName}-${space?.id ?? ''}*` + : `${indexInfo.baseName}*`; + }), + ]; + }, []); + + if (indices.length === 0) { + return of(EMPTY_RESPONSE); + } + + const filter = request.query?.bool?.filter + ? Array.isArray(request.query?.bool?.filter) + ? request.query?.bool?.filter + : [request.query?.bool?.filter] + : []; + if (authzFilter) { + filter.push(authzFilter); + } + if (space?.id) { + filter.push(getSpacesFilter(space.id) as estypes.QueryDslQueryContainer); + } + + const query = { + bool: { + ...request.query?.bool, + filter, + }, + }; + const params = { + index: indices, + body: { + _source: false, + fields: ['*'], + size: MAX_ALERT_SEARCH_SIZE, + query, + }, + }; + return es.search({ ...request, params }, options, deps); + }), + map((response) => { + // Do we have to loop over each hit? Yes. + // ecs auditLogger requires that we log each alert independently + if (securityAuditLogger != null) { + response.rawResponse.hits?.hits?.forEach((hit) => { + securityAuditLogger.log( + alertAuditEvent({ + action: AlertAuditAction.FIND, + id: hit._id, + outcome: 'success', + }) + ); + }); + } + return response; + }), + catchError((err) => { + // check if auth error, if yes, write to ecs logger + if (securityAuditLogger != null && err?.output?.statusCode === 403) { + securityAuditLogger.log( + alertAuditEvent({ + action: AlertAuditAction.FIND, + outcome: 'failure', + error: err, + }) + ); + } + + throw err; + }) + ); + }, + cancel: async (id, options, deps) => { + if (es.cancel) { + return es.cancel(id, options, deps); + } + }, + }; +}; diff --git a/x-pack/plugins/rule_registry/tsconfig.json b/x-pack/plugins/rule_registry/tsconfig.json index 384ffa0ee3428..810524a7a8122 100644 --- a/x-pack/plugins/rule_registry/tsconfig.json +++ b/x-pack/plugins/rule_registry/tsconfig.json @@ -19,6 +19,5 @@ { "path": "../../../src/plugins/data/tsconfig.json" }, { "path": "../alerting/tsconfig.json" }, { "path": "../security/tsconfig.json" }, - { "path": "../triggers_actions_ui/tsconfig.json" } ] } diff --git a/x-pack/plugins/triggers_actions_ui/tsconfig.json b/x-pack/plugins/triggers_actions_ui/tsconfig.json index ac36780f10c01..38d3fa9ad5996 100644 --- a/x-pack/plugins/triggers_actions_ui/tsconfig.json +++ b/x-pack/plugins/triggers_actions_ui/tsconfig.json @@ -17,6 +17,7 @@ { "path": "../../../src/core/tsconfig.json" }, { "path": "../alerting/tsconfig.json" }, { "path": "../features/tsconfig.json" }, + { "path": "../rule_registry/tsconfig.json" }, { "path": "../../../src/plugins/data/tsconfig.json" }, { "path": "../../../src/plugins/saved_objects/tsconfig.json" }, { "path": "../../../src/plugins/home/tsconfig.json" }, diff --git a/x-pack/test/rule_registry/security_and_spaces/tests/basic/index.ts b/x-pack/test/rule_registry/security_and_spaces/tests/basic/index.ts index e4512798db7d3..229f31375200a 100644 --- a/x-pack/test/rule_registry/security_and_spaces/tests/basic/index.ts +++ b/x-pack/test/rule_registry/security_and_spaces/tests/basic/index.ts @@ -10,8 +10,7 @@ import { createSpacesAndUsers, deleteSpacesAndUsers } from '../../../common/lib/ // eslint-disable-next-line import/no-default-export export default ({ loadTestFile, getService }: FtrProviderContext): void => { - // FAILING: https://github.com/elastic/kibana/issues/110153 - describe.skip('rules security and spaces enabled: basic', function () { + describe('rules security and spaces enabled: basic', function () { // Fastest ciGroup for the moment. this.tags('ciGroup5'); @@ -24,10 +23,12 @@ export default ({ loadTestFile, getService }: FtrProviderContext): void => { }); // Basic - loadTestFile(require.resolve('./get_alert_by_id')); - loadTestFile(require.resolve('./update_alert')); - loadTestFile(require.resolve('./bulk_update_alerts')); - loadTestFile(require.resolve('./find_alerts')); - loadTestFile(require.resolve('./get_alerts_index')); + // FAILING: https://github.com/elastic/kibana/issues/110153 + // loadTestFile(require.resolve('./get_alert_by_id')); + // loadTestFile(require.resolve('./update_alert')); + // loadTestFile(require.resolve('./bulk_update_alerts')); + // loadTestFile(require.resolve('./find_alerts')); + // loadTestFile(require.resolve('./get_alerts_index')); + loadTestFile(require.resolve('./search_strategy')); }); }; diff --git a/x-pack/test/rule_registry/security_and_spaces/tests/basic/search_strategy.ts b/x-pack/test/rule_registry/security_and_spaces/tests/basic/search_strategy.ts new file mode 100644 index 0000000000000..2124cb8a1d04b --- /dev/null +++ b/x-pack/test/rule_registry/security_and_spaces/tests/basic/search_strategy.ts @@ -0,0 +1,138 @@ +/* + * 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 { AlertConsumers } from '@kbn/rule-data-utils'; + +import { FtrProviderContext } from '../../../common/ftr_provider_context'; +import { RuleRegistrySearchResponse } from '../../../../../plugins/rule_registry/common/search_strategy'; +import { + deleteSignalsIndex, + createSignalsIndex, + deleteAllAlerts, + getRuleForSignalTesting, + createRule, + waitForSignalsToBePresent, + waitForRuleSuccessOrStatus, +} from '../../../../detection_engine_api_integration/utils'; +import { ID } from '../../../../detection_engine_api_integration/security_and_spaces/tests/generating_signals'; +import { QueryCreateSchema } from '../../../../../plugins/security_solution/common/detection_engine/schemas/request'; + +// eslint-disable-next-line import/no-default-export +export default ({ getService }: FtrProviderContext) => { + const esArchiver = getService('esArchiver'); + const supertest = getService('supertest'); + const bsearch = getService('bsearch'); + const log = getService('log'); + + const SPACE1 = 'space1'; + + describe('ruleRegistryAlertsSearchStrategy', () => { + describe('logs', () => { + beforeEach(async () => { + await esArchiver.load('x-pack/test/functional/es_archives/observability/alerts'); + }); + afterEach(async () => { + await esArchiver.unload('x-pack/test/functional/es_archives/observability/alerts'); + }); + it('should return alerts from log rules', async () => { + const result = await bsearch.send({ + supertest, + options: { + featureIds: [AlertConsumers.LOGS], + }, + strategy: 'ruleRegistryAlertsSearchStrategy', + }); + expect(result.rawResponse.hits.total).to.eql(5); + const consumers = result.rawResponse.hits.hits.map((hit) => { + return hit.fields?.['kibana.alert.rule.consumer']; + }); + expect(consumers.every((consumer) => consumer === AlertConsumers.LOGS)); + }); + }); + + describe('siem', () => { + beforeEach(async () => { + await deleteSignalsIndex(supertest, log); + await createSignalsIndex(supertest, log); + }); + + afterEach(async () => { + await deleteSignalsIndex(supertest, log); + await deleteAllAlerts(supertest, log); + }); + + before(async () => { + await esArchiver.load('x-pack/test/functional/es_archives/auditbeat/hosts'); + }); + after(async () => { + await esArchiver.unload('x-pack/test/functional/es_archives/auditbeat/hosts'); + }); + + it('should return alerts from siem rules', async () => { + const rule: QueryCreateSchema = { + ...getRuleForSignalTesting(['auditbeat-*']), + query: `_id:${ID}`, + }; + const { id: createdId } = await createRule(supertest, log, rule); + await waitForRuleSuccessOrStatus(supertest, log, createdId); + await waitForSignalsToBePresent(supertest, log, 1, [createdId]); + + const result = await bsearch.send({ + supertest, + options: { + featureIds: [AlertConsumers.SIEM], + }, + strategy: 'ruleRegistryAlertsSearchStrategy', + }); + expect(result.rawResponse.hits.total).to.eql(1); + const consumers = result.rawResponse.hits.hits.map( + (hit) => hit.fields?.['kibana.alert.rule.consumer'] + ); + expect(consumers.every((consumer) => consumer === AlertConsumers.SIEM)); + }); + }); + + describe('apm', () => { + beforeEach(async () => { + await esArchiver.load('x-pack/test/functional/es_archives/rule_registry/alerts'); + }); + afterEach(async () => { + await esArchiver.unload('x-pack/test/functional/es_archives/rule_registry/alerts'); + }); + + it('should return alerts from apm rules', async () => { + const result = await bsearch.send({ + supertest, + options: { + featureIds: [AlertConsumers.APM], + }, + strategy: 'ruleRegistryAlertsSearchStrategy', + space: SPACE1, + }); + expect(result.rawResponse.hits.total).to.eql(2); + const consumers = result.rawResponse.hits.hits.map( + (hit) => hit.fields?.['kibana.alert.rule.consumer'] + ); + expect(consumers.every((consumer) => consumer === AlertConsumers.APM)); + }); + }); + + describe('empty response', () => { + it('should return an empty response', async () => { + const result = await bsearch.send({ + supertest, + options: { + featureIds: [], + }, + strategy: 'ruleRegistryAlertsSearchStrategy', + space: SPACE1, + }); + expect(result.rawResponse).to.eql({}); + }); + }); + }); +}; From d499ed533a5d744cabea76a3347b0a99d72de7a4 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Sun, 27 Feb 2022 00:54:58 -0500 Subject: [PATCH 033/102] skip failing test suite (#126421) --- test/functional/apps/console/_autocomplete.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/functional/apps/console/_autocomplete.ts b/test/functional/apps/console/_autocomplete.ts index 423440ecdf3f8..580847351be9c 100644 --- a/test/functional/apps/console/_autocomplete.ts +++ b/test/functional/apps/console/_autocomplete.ts @@ -13,7 +13,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const log = getService('log'); const PageObjects = getPageObjects(['common', 'console']); - describe('console autocomplete feature', function describeIndexTests() { + // Failing: See https://github.com/elastic/kibana/issues/126421 + describe.skip('console autocomplete feature', function describeIndexTests() { this.tags('includeFirefox'); before(async () => { log.debug('navigateTo console'); From e7e9be9fa69e6d96b54aeaf1b2457247001972f0 Mon Sep 17 00:00:00 2001 From: Matthias Wilhelm Date: Mon, 28 Feb 2022 09:49:55 +0100 Subject: [PATCH 034/102] [Discover] Fix ""range filter on version" permissions for cloud functional testing (#126377) --- test/functional/config.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/test/functional/config.js b/test/functional/config.js index 09eccc863a0e5..389f432641acf 100644 --- a/test/functional/config.js +++ b/test/functional/config.js @@ -201,6 +201,21 @@ export default async function ({ readConfigFile }) { kibana: [], }, + version_test: { + elasticsearch: { + cluster: [], + indices: [ + { + names: ['version-test'], + privileges: ['read', 'view_index_metadata', 'manage', 'create_index', 'index'], + field_security: { grant: ['*'], except: [] }, + }, + ], + run_as: [], + }, + kibana: [], + }, + kibana_sample_read: { elasticsearch: { cluster: [], From 18af3deb7c6dc3d1f737a912fb3046090f916c45 Mon Sep 17 00:00:00 2001 From: Miriam <31922082+MiriamAparicio@users.noreply.github.com> Date: Mon, 28 Feb 2022 09:49:03 +0000 Subject: [PATCH 035/102] Add exception type column to errors table (#126140) * [APM] Add exception type column to errors table in service overview * add e2e test for type column * replace legacy linking to client linking * fix test --- .../cypress/fixtures/synthtrace/opbeans.ts | 6 ++- .../service_overview/errors_table.spec.ts | 15 +++++++ .../error_group_list.stories.tsx | 6 ++- .../error_group_list/index.tsx | 17 ++++---- .../get_columns.tsx | 34 ++++++++++++++++ .../service_overview_errors_table/index.tsx | 18 +++++---- .../shared/links/apm/error_overview_link.tsx | 40 ++++++++----------- 7 files changed, 93 insertions(+), 43 deletions(-) diff --git a/x-pack/plugins/apm/ftr_e2e/cypress/fixtures/synthtrace/opbeans.ts b/x-pack/plugins/apm/ftr_e2e/cypress/fixtures/synthtrace/opbeans.ts index a6d2454de99fd..b51874f951c0e 100644 --- a/x-pack/plugins/apm/ftr_e2e/cypress/fixtures/synthtrace/opbeans.ts +++ b/x-pack/plugins/apm/ftr_e2e/cypress/fixtures/synthtrace/opbeans.ts @@ -34,7 +34,11 @@ export function opbeans({ from, to }: { from: number; to: number }) { .timestamp(timestamp) .duration(1000) .success() - .errors(opbeansJava.error('[MockError] Foo').timestamp(timestamp)) + .errors( + opbeansJava + .error('[MockError] Foo', `Exception`) + .timestamp(timestamp) + ) .children( opbeansJava .span('SELECT * FROM product', 'db', 'postgresql') diff --git a/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/service_overview/errors_table.spec.ts b/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/service_overview/errors_table.spec.ts index 9ea6ef028b805..efeeec72941a2 100644 --- a/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/service_overview/errors_table.spec.ts +++ b/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/service_overview/errors_table.spec.ts @@ -48,6 +48,21 @@ describe('Errors table', () => { cy.url().should('include', '/opbeans-java/errors'); }); + it('clicking on type adds a filter in the kuerybar and navigates to errors page', () => { + cy.visit(serviceOverviewHref); + cy.get('[data-test-subj="headerFilterKuerybar"]') + .invoke('val') + .should('be.empty'); + // `force: true` because Cypress says the element is 0x0 + cy.contains('Exception').click({ + force: true, + }); + cy.get('[data-test-subj="headerFilterKuerybar"]') + .its('length') + .should('be.gt', 0); + cy.get('table').find('td:contains("Exception")').should('have.length', 1); + }); + it('navigates to error detail page', () => { cy.visit(serviceOverviewHref); cy.contains('a', '[MockError] Foo').click(); diff --git a/x-pack/plugins/apm/public/components/app/error_group_overview/error_group_list/error_group_list.stories.tsx b/x-pack/plugins/apm/public/components/app/error_group_overview/error_group_list/error_group_list.stories.tsx index 3d6a9af707955..c61a37fa86e5e 100644 --- a/x-pack/plugins/apm/public/components/app/error_group_overview/error_group_list/error_group_list.stories.tsx +++ b/x-pack/plugins/apm/public/components/app/error_group_overview/error_group_list/error_group_list.stories.tsx @@ -21,7 +21,11 @@ const stories: Meta = { decorators: [ (StoryComponent) => { return ( - + diff --git a/x-pack/plugins/apm/public/components/app/error_group_overview/error_group_list/index.tsx b/x-pack/plugins/apm/public/components/app/error_group_overview/error_group_list/index.tsx index cd991b0f128c5..7a54a633e7f15 100644 --- a/x-pack/plugins/apm/public/components/app/error_group_overview/error_group_list/index.tsx +++ b/x-pack/plugins/apm/public/components/app/error_group_overview/error_group_list/index.tsx @@ -13,15 +13,14 @@ import { } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import React, { useMemo } from 'react'; +import { useApmParams } from '../../../../hooks/use_apm_params'; import { asInteger } from '../../../../../common/utils/formatters'; import { euiStyled } from '../../../../../../../../src/plugins/kibana_react/common'; import { NOT_AVAILABLE_LABEL } from '../../../../../common/i18n'; -import { useLegacyUrlParams } from '../../../../context/url_params_context/use_url_params'; import { APIReturnType } from '../../../../services/rest/create_call_apm_api'; import { truncate, unit } from '../../../../utils/style'; import { ErrorDetailLink } from '../../../shared/links/apm/error_detail_link'; import { ErrorOverviewLink } from '../../../shared/links/apm/error_overview_link'; -import { APMQueryParams } from '../../../shared/links/url_helpers'; import { ITableColumn, ManagedTable } from '../../../shared/managed_table'; import { TimestampTooltip } from '../../../shared/timestamp_tooltip'; import { SparkPlot } from '../../../shared/charts/spark_plot'; @@ -70,7 +69,7 @@ function ErrorGroupList({ detailedStatistics, comparisonEnabled, }: Props) { - const { urlParams } = useLegacyUrlParams(); + const { query } = useApmParams('/services/{serviceName}/errors'); const columns = useMemo(() => { return [ @@ -119,12 +118,10 @@ function ErrorGroupList({ {type} @@ -232,7 +229,7 @@ function ErrorGroupList({ }, }, ] as Array>; - }, [serviceName, urlParams, detailedStatistics, comparisonEnabled]); + }, [serviceName, query, detailedStatistics, comparisonEnabled]); return ( ; @@ -28,12 +37,37 @@ export function getColumns({ serviceName, errorGroupDetailedStatistics, comparisonEnabled, + query, }: { serviceName: string; errorGroupDetailedStatistics: ErrorGroupDetailedStatistics; comparisonEnabled?: boolean; + query: TypeOf['query']; }): Array> { return [ + { + name: i18n.translate('xpack.apm.errorsTable.typeColumnLabel', { + defaultMessage: 'Type', + }), + field: 'type', + sortable: false, + render: (_, { type }) => { + return ( + ['query'] + } + > + {type} + + ); + }, + }, { field: 'name', name: i18n.translate('xpack.apm.serviceOverview.errorsTableColumnName', { diff --git a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_errors_table/index.tsx b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_errors_table/index.tsx index 0b7d3c32957e2..8eb5158f304c5 100644 --- a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_errors_table/index.tsx +++ b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_errors_table/index.tsx @@ -15,7 +15,6 @@ import { i18n } from '@kbn/i18n'; import { orderBy } from 'lodash'; import React, { useState } from 'react'; import uuid from 'uuid'; -import { useLegacyUrlParams } from '../../../../context/url_params_context/use_url_params'; import { FETCH_STATUS, useFetcher } from '../../../../hooks/use_fetcher'; import { APIReturnType } from '../../../../services/rest/create_call_apm_api'; import { ErrorOverviewLink } from '../../../shared/links/apm/error_overview_link'; @@ -58,9 +57,6 @@ const INITIAL_STATE_DETAILED_STATISTICS: ErrorGroupDetailedStatistics = { }; export function ServiceOverviewErrorsTable({ serviceName }: Props) { - const { - urlParams: { comparisonType, comparisonEnabled }, - } = useLegacyUrlParams(); const [tableOptions, setTableOptions] = useState<{ pageIndex: number; sort: { @@ -72,9 +68,16 @@ export function ServiceOverviewErrorsTable({ serviceName }: Props) { sort: DEFAULT_SORT, }); + const { query } = useApmParams('/services/{serviceName}/overview'); + const { - query: { environment, kuery, rangeFrom, rangeTo }, - } = useApmParams('/services/{serviceName}/overview'); + environment, + kuery, + rangeFrom, + rangeTo, + comparisonType, + comparisonEnabled, + } = query; const { start, end } = useTimeRange({ rangeFrom, rangeTo }); @@ -177,6 +180,7 @@ export function ServiceOverviewErrorsTable({ serviceName }: Props) { serviceName, errorGroupDetailedStatistics, comparisonEnabled, + query, }); return ( @@ -197,7 +201,7 @@ export function ServiceOverviewErrorsTable({ serviceName }: Props) { - + {i18n.translate('xpack.apm.serviceOverview.errorsTableLinkText', { defaultMessage: 'View errors', })} diff --git a/x-pack/plugins/apm/public/components/shared/links/apm/error_overview_link.tsx b/x-pack/plugins/apm/public/components/shared/links/apm/error_overview_link.tsx index b517a39c1004d..bfa2067e9e7ee 100644 --- a/x-pack/plugins/apm/public/components/shared/links/apm/error_overview_link.tsx +++ b/x-pack/plugins/apm/public/components/shared/links/apm/error_overview_link.tsx @@ -6,34 +6,26 @@ */ import React from 'react'; -import { pickKeys } from '../../../../../common/utils/pick_keys'; -import { useLegacyUrlParams } from '../../../../context/url_params_context/use_url_params'; -import { APMQueryParams } from '../url_helpers'; -import { APMLink, APMLinkExtendProps } from './apm_link'; +import { EuiLink } from '@elastic/eui'; +import { TypeOf } from '@kbn/typed-react-router-config'; +import { useApmRouter } from '../../../../hooks/use_apm_router'; +import { ApmRoutes } from '../../../routing/apm_route_config'; -const persistedFilters: Array = [ - 'host', - 'containerId', - 'podName', - 'serviceVersion', -]; - -interface Props extends APMLinkExtendProps { +interface Props { + children: React.ReactNode; + title?: string; serviceName: string; - query?: APMQueryParams; + query: TypeOf['query']; } export function ErrorOverviewLink({ serviceName, query, ...rest }: Props) { - const { urlParams } = useLegacyUrlParams(); + const router = useApmRouter(); + const errorOverviewLink = router.link('/services/{serviceName}/errors', { + path: { + serviceName, + }, + query, + }); - return ( - - ); + return ; } From 5ec3206bf83eb97256992c051d30bbe51b59e052 Mon Sep 17 00:00:00 2001 From: Mat Schaffer Date: Mon, 28 Feb 2022 19:07:03 +0900 Subject: [PATCH 036/102] [Stack Monitoring] api_integration - Ignore `logs` section of index detail api (#126427) --- .../apis/monitoring/elasticsearch/index_detail.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/x-pack/test/api_integration/apis/monitoring/elasticsearch/index_detail.js b/x-pack/test/api_integration/apis/monitoring/elasticsearch/index_detail.js index e243c3a372f7b..87371187c83e8 100644 --- a/x-pack/test/api_integration/apis/monitoring/elasticsearch/index_detail.js +++ b/x-pack/test/api_integration/apis/monitoring/elasticsearch/index_detail.js @@ -41,6 +41,9 @@ export default function ({ getService }) { }) .expect(200); + // Work around ESTF failure outlined in https://github.com/elastic/kibana/issues/124594 + indexDetailFixture.logs = body.logs; + expect(body).to.eql(indexDetailFixture); }); From b00831cedd9c08b0c7fe823cebd617bd32f33371 Mon Sep 17 00:00:00 2001 From: Josh Dover <1813008+joshdover@users.noreply.github.com> Date: Mon, 28 Feb 2022 11:37:15 +0100 Subject: [PATCH 037/102] Add back Fleet QA labeling automation (#126327) * Revert "Remove Fleet QA labeling automation (#126244)" This reverts commit 324245c94c6808089b06966ae60bf9035ab965db. * Use pull_request_target event instead Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .github/workflows/label-qa-fixed-in.yml | 87 +++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 .github/workflows/label-qa-fixed-in.yml diff --git a/.github/workflows/label-qa-fixed-in.yml b/.github/workflows/label-qa-fixed-in.yml new file mode 100644 index 0000000000000..92c1f95f31759 --- /dev/null +++ b/.github/workflows/label-qa-fixed-in.yml @@ -0,0 +1,87 @@ +name: Add QA labels to Fleet issues +on: + # pull_request_target allows running actions on PRs from forks with a read/write GITHUB_TOKEN, but it will not allow + # running workflows defined in the PRs itself, only workflows already merged into the target branch. This avoids + # potential vulnerabilities that could allow someone to open a PR and retrieve secrets. + # It's important that this workflow never runs any checkout actions which could be used to circumvent this protection. + # See these links for more information: + # - https://github.blog/2020-08-03-github-actions-improvements-for-fork-and-pull-request-workflows/ + # - https://nathandavison.com/blog/github-actions-and-the-threat-of-malicious-pull-requests + pull_request_target: + types: + - closed + +jobs: + fetch_issues_to_label: + runs-on: ubuntu-latest + # Only run on PRs that were merged for the Fleet team + if: | + github.event.pull_request.merged_at && + contains(github.event.pull_request.labels.*.name, 'Team:Fleet') + outputs: + matrix: ${{ steps.issues_to_label.outputs.value }} + label_ids: ${{ steps.label_ids.outputs.value }} + steps: + - uses: octokit/graphql-action@v2.x + id: closing_issues + with: + query: | + query closingIssueNumbersQuery($prnumber: Int!) { + repository(owner: "elastic", name: "kibana") { + pullRequest(number: $prnumber) { + closingIssuesReferences(first: 10) { + nodes { + id + labels(first: 20) { + nodes { + id + name + } + } + } + } + } + } + } + prnumber: ${{ github.event.number }} + env: + GITHUB_TOKEN: ${{ env.GITHUB_TOKEN }} + - uses: sergeysova/jq-action@v2 + id: issues_to_label + with: + # Map to the issues' node id + cmd: echo $CLOSING_ISSUES | jq -c '.repository.pullRequest.closingIssuesReferences.nodes | map(.id)' + multiline: true + env: + CLOSING_ISSUES: ${{ steps.closing_issues.outputs.data }} + - uses: sergeysova/jq-action@v2 + id: label_ids + with: + # Get list of version labels on pull request and map to label's node id, append 'QA:Ready For Testing' id ("MDU6TGFiZWwyNTQ1NjcwOTI4") + cmd: echo $PR_LABELS | jq -c 'map(select(.name | test("v[0-9]+\\.[0-9]+\\.[0-9]+")) | .node_id) + ["MDU6TGFiZWwyNTQ1NjcwOTI4"]' + multiline: true + env: + PR_LABELS: ${{ toJSON(github.event.pull_request.labels) }} + + label_issues: + needs: fetch_issues_to_label + runs-on: ubuntu-latest + # For each issue closed by the PR run this job + strategy: + matrix: + issueNodeId: ${{ fromJSON(needs.fetch_issues_to_label.outputs.matrix) }} + name: Label issue ${{ matrix.issueNodeId }} + steps: + - uses: octokit/graphql-action@v2.x + id: add_labels_to_closed_issue + with: + query: | + mutation add_label($issueid:String!, $labelids:[String!]!) { + addLabelsToLabelable(input: {labelableId: $issueid, labelIds: $labelids}) { + clientMutationId + } + } + issueid: ${{ matrix.issueNodeId }} + labelids: ${{ needs.fetch_issues_to_label.outputs.label_ids }} + env: + GITHUB_TOKEN: ${{ env.GITHUB_TOKEN }} From 2597dfc2dfd4568a647b675466568670ca06828c Mon Sep 17 00:00:00 2001 From: Miriam <31922082+MiriamAparicio@users.noreply.github.com> Date: Mon, 28 Feb 2022 11:15:03 +0000 Subject: [PATCH 038/102] [APM] remove legacy data toast (#126352) * [APM] remove legacy data toast * remove useUpgradeAssistantHref --- .../app/service_inventory/index.tsx | 47 +------------------ .../public/components/shared/links/kibana.ts | 6 --- .../translations/translations/ja-JP.json | 3 -- .../translations/translations/zh-CN.json | 3 -- 4 files changed, 2 insertions(+), 57 deletions(-) diff --git a/x-pack/plugins/apm/public/components/app/service_inventory/index.tsx b/x-pack/plugins/apm/public/components/app/service_inventory/index.tsx index dc7b80ded50ad..1e736409a9604 100644 --- a/x-pack/plugins/apm/public/components/app/service_inventory/index.tsx +++ b/x-pack/plugins/apm/public/components/app/service_inventory/index.tsx @@ -5,24 +5,16 @@ * 2.0. */ -import { - EuiFlexGroup, - EuiFlexItem, - EuiLink, - EuiEmptyPrompt, -} from '@elastic/eui'; +import { EuiFlexGroup, EuiFlexItem, EuiEmptyPrompt } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import React, { useEffect } from 'react'; +import React from 'react'; import uuid from 'uuid'; -import { toMountPoint } from '../../../../../../../src/plugins/kibana_react/public'; import { useAnomalyDetectionJobsContext } from '../../../context/anomaly_detection_jobs/use_anomaly_detection_jobs_context'; -import { useApmPluginContext } from '../../../context/apm_plugin/use_apm_plugin_context'; import { useLegacyUrlParams } from '../../../context/url_params_context/use_url_params'; import { useLocalStorage } from '../../../hooks/use_local_storage'; import { useAnyOfApmParams } from '../../../hooks/use_apm_params'; import { FETCH_STATUS, useFetcher } from '../../../hooks/use_fetcher'; import { useTimeRange } from '../../../hooks/use_time_range'; -import { useUpgradeAssistantHref } from '../../shared/links/kibana'; import { SearchBar } from '../../shared/search_bar'; import { getTimeRangeComparison } from '../../shared/time_comparison/get_time_range_comparison'; import { ServiceList } from './service_list'; @@ -37,8 +29,6 @@ const initialData = { }, }; -let hasDisplayedToast = false; - function useServicesFetcher() { const { urlParams: { comparisonEnabled, comparisonType }, @@ -50,9 +40,6 @@ function useServicesFetcher() { const { start, end } = useTimeRange({ rangeFrom, rangeTo }); - const { core } = useApmPluginContext(); - const upgradeAssistantHref = useUpgradeAssistantHref(); - const { offset } = getTimeRangeComparison({ start, end, @@ -113,36 +100,6 @@ function useServicesFetcher() { { preservePreviousData: false } ); - useEffect(() => { - if (!hasDisplayedToast) { - hasDisplayedToast = true; - - core.notifications.toasts.addWarning({ - title: i18n.translate('xpack.apm.serviceInventory.toastTitle', { - defaultMessage: - 'Legacy data was detected within the selected time range', - }), - text: toMountPoint( -

- {i18n.translate('xpack.apm.serviceInventory.toastText', { - defaultMessage: - "You're running Elastic Stack 7.0+ and we've detected incompatible data from a previous 6.x version. If you want to view this data in APM, you should migrate it. See more in ", - })} - - - {i18n.translate( - 'xpack.apm.serviceInventory.upgradeAssistantLinkText', - { - defaultMessage: 'the upgrade assistant', - } - )} - -

- ), - }); - } - }, [upgradeAssistantHref, core.notifications.toasts]); - return { mainStatisticsData, mainStatisticsStatus, diff --git a/x-pack/plugins/apm/public/components/shared/links/kibana.ts b/x-pack/plugins/apm/public/components/shared/links/kibana.ts index c0bdf3a98aa31..e05ccf4e6fcff 100644 --- a/x-pack/plugins/apm/public/components/shared/links/kibana.ts +++ b/x-pack/plugins/apm/public/components/shared/links/kibana.ts @@ -12,12 +12,6 @@ export function getUpgradeAssistantHref(basePath: IBasePath) { return basePath.prepend('/app/management/stack/upgrade_assistant'); } -export function useUpgradeAssistantHref() { - const { core } = useApmPluginContext(); - - return getUpgradeAssistantHref(core.http.basePath); -} - export function useFleetCloudAgentPolicyHref() { const { core: { diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index bf120f49965c9..c10f30068bfb3 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -7315,9 +7315,6 @@ "xpack.apm.serviceIcons.serviceDetails.service.frameworkLabel": "フレームワーク名", "xpack.apm.serviceIcons.serviceDetails.service.runtimeLabel": "ランタイム名・バージョン", "xpack.apm.serviceIcons.serviceDetails.service.versionLabel": "サービスバージョン", - "xpack.apm.serviceInventory.toastText": "現在 Elastic Stack 7.0+ を実行中で、以前のバージョン 6.x からの互換性のないデータを検知しました。このデータを APM で表示するには、移行が必要です。詳細 ", - "xpack.apm.serviceInventory.toastTitle": "選択された時間範囲内にレガシーデータが検知されました。", - "xpack.apm.serviceInventory.upgradeAssistantLinkText": "アップグレードアシスタント", "xpack.apm.serviceLogs.noInfrastructureMessage": "表示するログメッセージがありません。", "xpack.apm.serviceMap.anomalyDetectionPopoverDisabled": "APM 設定で異常検知を有効にすると、サービス正常性インジケーターが表示されます。", "xpack.apm.serviceMap.anomalyDetectionPopoverLink": "異常を表示", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index afdf5b7561bc4..6cd78eb4cac68 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -7332,9 +7332,6 @@ "xpack.apm.serviceIcons.serviceDetails.service.frameworkLabel": "框架名称", "xpack.apm.serviceIcons.serviceDetails.service.runtimeLabel": "运行时名称和版本", "xpack.apm.serviceIcons.serviceDetails.service.versionLabel": "服务版本", - "xpack.apm.serviceInventory.toastText": "您正在运行 Elastic Stack 7.0+,我们检测到来自以前 6.x 版本的数据不兼容。如果想在 APM 中查看此数据,您应迁移数据。在以下位置查看更多内容: ", - "xpack.apm.serviceInventory.toastTitle": "在选定时间范围中检测到旧数据", - "xpack.apm.serviceInventory.upgradeAssistantLinkText": "升级助手", "xpack.apm.serviceLogs.noInfrastructureMessage": "没有可显示的日志消息。", "xpack.apm.serviceMap.anomalyDetectionPopoverDisabled": "通过在 APM 设置中启用异常检测来显示服务运行状况指标。", "xpack.apm.serviceMap.anomalyDetectionPopoverLink": "查看异常", From e2dd796bdf0ba08dd05f10e5290bde73bd3bd9a9 Mon Sep 17 00:00:00 2001 From: Josh Dover <1813008+joshdover@users.noreply.github.com> Date: Mon, 28 Feb 2022 12:25:15 +0100 Subject: [PATCH 039/102] [Fleet] Fix github token fetching in QA label action (#126445) --- .github/workflows/label-qa-fixed-in.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/label-qa-fixed-in.yml b/.github/workflows/label-qa-fixed-in.yml index 92c1f95f31759..65efc6fd694f8 100644 --- a/.github/workflows/label-qa-fixed-in.yml +++ b/.github/workflows/label-qa-fixed-in.yml @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-latest # Only run on PRs that were merged for the Fleet team if: | - github.event.pull_request.merged_at && + github.event.pull_request_target.merged == true && contains(github.event.pull_request.labels.*.name, 'Team:Fleet') outputs: matrix: ${{ steps.issues_to_label.outputs.value }} @@ -45,7 +45,7 @@ jobs: } prnumber: ${{ github.event.number }} env: - GITHUB_TOKEN: ${{ env.GITHUB_TOKEN }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - uses: sergeysova/jq-action@v2 id: issues_to_label with: @@ -84,4 +84,4 @@ jobs: issueid: ${{ matrix.issueNodeId }} labelids: ${{ needs.fetch_issues_to_label.outputs.label_ids }} env: - GITHUB_TOKEN: ${{ env.GITHUB_TOKEN }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 9ddb3e8756e9294c857e58b3ab0deedfb9375cbe Mon Sep 17 00:00:00 2001 From: Josh Dover <1813008+joshdover@users.noreply.github.com> Date: Mon, 28 Feb 2022 12:30:41 +0100 Subject: [PATCH 040/102] [Fleet] Fix event condition in QA label action (#126447) --- .github/workflows/label-qa-fixed-in.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/label-qa-fixed-in.yml b/.github/workflows/label-qa-fixed-in.yml index 65efc6fd694f8..5bbdd5b71ef75 100644 --- a/.github/workflows/label-qa-fixed-in.yml +++ b/.github/workflows/label-qa-fixed-in.yml @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-latest # Only run on PRs that were merged for the Fleet team if: | - github.event.pull_request_target.merged == true && + github.event.pull_request.merged_at && contains(github.event.pull_request.labels.*.name, 'Team:Fleet') outputs: matrix: ${{ steps.issues_to_label.outputs.value }} From 58aba97c20bdb93f6710453e88f5584d088f3c3d Mon Sep 17 00:00:00 2001 From: Uladzislau Lasitsa Date: Mon, 28 Feb 2022 14:42:29 +0300 Subject: [PATCH 041/102] [Expression] Problem with formatting when we use vis_dimension type as arg (#126016) * Use format from datatable if user doesn't specify format in expression * Fix shapshots * Fix shapshot * Update comment Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../expression_functions/vis_dimension.ts | 21 ++++++++++++------- .../snapshots/baseline/combined_test3.json | 2 +- .../snapshots/baseline/final_output_test.json | 2 +- .../snapshots/baseline/metric_all_data.json | 2 +- .../snapshots/baseline/metric_empty_data.json | 2 +- .../baseline/metric_multi_metric_data.json | 2 +- .../baseline/metric_percentage_mode.json | 2 +- .../baseline/metric_single_metric_data.json | 2 +- .../snapshots/baseline/partial_test_1.json | 2 +- .../snapshots/baseline/partial_test_2.json | 2 +- .../snapshots/baseline/step_output_test3.json | 2 +- .../snapshots/baseline/tagcloud_all_data.json | 2 +- .../baseline/tagcloud_empty_data.json | 2 +- .../snapshots/baseline/tagcloud_fontsize.json | 2 +- .../baseline/tagcloud_metric_data.json | 2 +- .../snapshots/baseline/tagcloud_options.json | 2 +- 16 files changed, 29 insertions(+), 22 deletions(-) diff --git a/src/plugins/visualizations/common/expression_functions/vis_dimension.ts b/src/plugins/visualizations/common/expression_functions/vis_dimension.ts index 254f3ac5b68e8..bd5694cb69a03 100644 --- a/src/plugins/visualizations/common/expression_functions/vis_dimension.ts +++ b/src/plugins/visualizations/common/expression_functions/vis_dimension.ts @@ -27,7 +27,7 @@ export type ExpressionValueVisDimension = ExpressionValueBoxed< accessor: number | DatatableColumn; format: { id?: string; - params: Record; + params?: Record; }; } >; @@ -54,14 +54,12 @@ export const visDimension = (): ExpressionFunctionDefinition< }, format: { types: ['string'], - default: 'string', help: i18n.translate('visualizations.function.visDimension.format.help', { defaultMessage: 'Format', }), }, formatParams: { types: ['string'], - default: '"{}"', help: i18n.translate('visualizations.function.visDimension.formatParams.help', { defaultMessage: 'Format params', }), @@ -69,13 +67,22 @@ export const visDimension = (): ExpressionFunctionDefinition< }, fn: (input, args) => { const accessor = findAccessorOrFail(args.accessor, input.columns); + const column = typeof accessor === 'number' ? input.columns[accessor] : accessor; + const columnFormat = column.meta.params; + // if a user hasn't specified the format of the column and its format is not specified at the table columns, + // then the default format id ('string') should be used + const format = + args.format || args.formatParams || !columnFormat + ? { + id: args.format || 'string', + params: JSON.parse(args.formatParams || '{}'), + } + : columnFormat; + return { type: 'vis_dimension', accessor, - format: { - id: args.format, - params: JSON.parse(args.formatParams!), - }, + format, }; }, }); diff --git a/test/interpreter_functional/snapshots/baseline/combined_test3.json b/test/interpreter_functional/snapshots/baseline/combined_test3.json index aefe875ff248c..dc39ecfc53594 100644 --- a/test/interpreter_functional/snapshots/baseline/combined_test3.json +++ b/test/interpreter_functional/snapshots/baseline/combined_test3.json @@ -1 +1 @@ -{"as":"metricVis","type":"render","value":{"visConfig":{"dimensions":{"bucket":{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},"metrics":[{"accessor":1,"format":{"id":"number","params":{}},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":null,"percentageMode":false,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file +{"as":"metricVis","type":"render","value":{"visConfig":{"dimensions":{"bucket":{"accessor":0,"format":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"type":"vis_dimension"},"metrics":[{"accessor":1,"format":{"id":"number","params":{}},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":null,"percentageMode":false,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/baseline/final_output_test.json b/test/interpreter_functional/snapshots/baseline/final_output_test.json index aefe875ff248c..dc39ecfc53594 100644 --- a/test/interpreter_functional/snapshots/baseline/final_output_test.json +++ b/test/interpreter_functional/snapshots/baseline/final_output_test.json @@ -1 +1 @@ -{"as":"metricVis","type":"render","value":{"visConfig":{"dimensions":{"bucket":{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},"metrics":[{"accessor":1,"format":{"id":"number","params":{}},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":null,"percentageMode":false,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file +{"as":"metricVis","type":"render","value":{"visConfig":{"dimensions":{"bucket":{"accessor":0,"format":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"type":"vis_dimension"},"metrics":[{"accessor":1,"format":{"id":"number","params":{}},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":null,"percentageMode":false,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/baseline/metric_all_data.json b/test/interpreter_functional/snapshots/baseline/metric_all_data.json index c146b8ca6e39d..a26b85daee932 100644 --- a/test/interpreter_functional/snapshots/baseline/metric_all_data.json +++ b/test/interpreter_functional/snapshots/baseline/metric_all_data.json @@ -1 +1 @@ -{"as":"metricVis","type":"render","value":{"visConfig":{"dimensions":{"bucket":{"accessor":2,"format":{"id":"string","params":{}},"type":"vis_dimension"},"metrics":[{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":null,"percentageMode":false,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"},{"id":"col-2-1","meta":{"field":"bytes","index":"logstash-*","params":{"id":"bytes","params":null},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"field":"bytes"},"schema":"metric","type":"max"},"type":"number"},"name":"Max bytes"}],"rows":[{"col-0-2":"200","col-1-1":12891,"col-2-1":19986},{"col-0-2":"404","col-1-1":696,"col-2-1":19881},{"col-0-2":"503","col-1-1":417,"col-2-1":0}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file +{"as":"metricVis","type":"render","value":{"visConfig":{"dimensions":{"bucket":{"accessor":2,"format":{"id":"bytes","params":null},"type":"vis_dimension"},"metrics":[{"accessor":0,"format":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":null,"percentageMode":false,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"},{"id":"col-2-1","meta":{"field":"bytes","index":"logstash-*","params":{"id":"bytes","params":null},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"field":"bytes"},"schema":"metric","type":"max"},"type":"number"},"name":"Max bytes"}],"rows":[{"col-0-2":"200","col-1-1":12891,"col-2-1":19986},{"col-0-2":"404","col-1-1":696,"col-2-1":19881},{"col-0-2":"503","col-1-1":417,"col-2-1":0}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/baseline/metric_empty_data.json b/test/interpreter_functional/snapshots/baseline/metric_empty_data.json index 84ea37086d00c..0917ecc8f9b2e 100644 --- a/test/interpreter_functional/snapshots/baseline/metric_empty_data.json +++ b/test/interpreter_functional/snapshots/baseline/metric_empty_data.json @@ -1 +1 @@ -{"as":"metricVis","type":"render","value":{"visConfig":{"dimensions":{"metrics":[{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":null,"percentageMode":false,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"},{"id":"col-2-1","meta":{"field":"bytes","index":"logstash-*","params":{"id":"bytes","params":null},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"field":"bytes"},"schema":"metric","type":"max"},"type":"number"},"name":"Max bytes"}],"rows":[],"type":"datatable"},"visType":"metric"}} \ No newline at end of file +{"as":"metricVis","type":"render","value":{"visConfig":{"dimensions":{"metrics":[{"accessor":0,"format":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":null,"percentageMode":false,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"},{"id":"col-2-1","meta":{"field":"bytes","index":"logstash-*","params":{"id":"bytes","params":null},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"field":"bytes"},"schema":"metric","type":"max"},"type":"number"},"name":"Max bytes"}],"rows":[],"type":"datatable"},"visType":"metric"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/baseline/metric_multi_metric_data.json b/test/interpreter_functional/snapshots/baseline/metric_multi_metric_data.json index de55a313fde43..44bc7717db04f 100644 --- a/test/interpreter_functional/snapshots/baseline/metric_multi_metric_data.json +++ b/test/interpreter_functional/snapshots/baseline/metric_multi_metric_data.json @@ -1 +1 @@ -{"as":"metricVis","type":"render","value":{"visConfig":{"dimensions":{"metrics":[{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},{"accessor":1,"format":{"id":"string","params":{}},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":null,"percentageMode":false,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"},{"id":"col-2-1","meta":{"field":"bytes","index":"logstash-*","params":{"id":"bytes","params":null},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"field":"bytes"},"schema":"metric","type":"max"},"type":"number"},"name":"Max bytes"}],"rows":[{"col-0-2":"200","col-1-1":12891,"col-2-1":19986},{"col-0-2":"404","col-1-1":696,"col-2-1":19881},{"col-0-2":"503","col-1-1":417,"col-2-1":0}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file +{"as":"metricVis","type":"render","value":{"visConfig":{"dimensions":{"metrics":[{"accessor":0,"format":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"type":"vis_dimension"},{"accessor":1,"format":{"id":"number"},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":null,"percentageMode":false,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"},{"id":"col-2-1","meta":{"field":"bytes","index":"logstash-*","params":{"id":"bytes","params":null},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"field":"bytes"},"schema":"metric","type":"max"},"type":"number"},"name":"Max bytes"}],"rows":[{"col-0-2":"200","col-1-1":12891,"col-2-1":19986},{"col-0-2":"404","col-1-1":696,"col-2-1":19881},{"col-0-2":"503","col-1-1":417,"col-2-1":0}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/baseline/metric_percentage_mode.json b/test/interpreter_functional/snapshots/baseline/metric_percentage_mode.json index aacb5a1d38eaf..99604aa377475 100644 --- a/test/interpreter_functional/snapshots/baseline/metric_percentage_mode.json +++ b/test/interpreter_functional/snapshots/baseline/metric_percentage_mode.json @@ -1 +1 @@ -{"as":"metricVis","type":"render","value":{"visConfig":{"dimensions":{"metrics":[{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":{"colors":["rgb(0,0,0,0)","rgb(100, 100, 100)"],"continuity":"none","gradient":false,"range":"number","rangeMax":10000,"rangeMin":0,"stops":[0,10000]},"percentageMode":true,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"},{"id":"col-2-1","meta":{"field":"bytes","index":"logstash-*","params":{"id":"bytes","params":null},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"field":"bytes"},"schema":"metric","type":"max"},"type":"number"},"name":"Max bytes"}],"rows":[{"col-0-2":"200","col-1-1":12891,"col-2-1":19986},{"col-0-2":"404","col-1-1":696,"col-2-1":19881},{"col-0-2":"503","col-1-1":417,"col-2-1":0}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file +{"as":"metricVis","type":"render","value":{"visConfig":{"dimensions":{"metrics":[{"accessor":0,"format":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":{"colors":["rgb(0,0,0,0)","rgb(100, 100, 100)"],"continuity":"none","gradient":false,"range":"number","rangeMax":10000,"rangeMin":0,"stops":[0,10000]},"percentageMode":true,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"},{"id":"col-2-1","meta":{"field":"bytes","index":"logstash-*","params":{"id":"bytes","params":null},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"field":"bytes"},"schema":"metric","type":"max"},"type":"number"},"name":"Max bytes"}],"rows":[{"col-0-2":"200","col-1-1":12891,"col-2-1":19986},{"col-0-2":"404","col-1-1":696,"col-2-1":19881},{"col-0-2":"503","col-1-1":417,"col-2-1":0}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/baseline/metric_single_metric_data.json b/test/interpreter_functional/snapshots/baseline/metric_single_metric_data.json index 91d78e9942f1a..63c91a3cc749d 100644 --- a/test/interpreter_functional/snapshots/baseline/metric_single_metric_data.json +++ b/test/interpreter_functional/snapshots/baseline/metric_single_metric_data.json @@ -1 +1 @@ -{"as":"metricVis","type":"render","value":{"visConfig":{"dimensions":{"metrics":[{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":null,"percentageMode":false,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"},{"id":"col-2-1","meta":{"field":"bytes","index":"logstash-*","params":{"id":"bytes","params":null},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"field":"bytes"},"schema":"metric","type":"max"},"type":"number"},"name":"Max bytes"}],"rows":[{"col-0-2":"200","col-1-1":12891,"col-2-1":19986},{"col-0-2":"404","col-1-1":696,"col-2-1":19881},{"col-0-2":"503","col-1-1":417,"col-2-1":0}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file +{"as":"metricVis","type":"render","value":{"visConfig":{"dimensions":{"metrics":[{"accessor":0,"format":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":null,"percentageMode":false,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"},{"id":"col-2-1","meta":{"field":"bytes","index":"logstash-*","params":{"id":"bytes","params":null},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{"field":"bytes"},"schema":"metric","type":"max"},"type":"number"},"name":"Max bytes"}],"rows":[{"col-0-2":"200","col-1-1":12891,"col-2-1":19986},{"col-0-2":"404","col-1-1":696,"col-2-1":19881},{"col-0-2":"503","col-1-1":417,"col-2-1":0}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/baseline/partial_test_1.json b/test/interpreter_functional/snapshots/baseline/partial_test_1.json index 9e6888a319c38..e8a847b43de3b 100644 --- a/test/interpreter_functional/snapshots/baseline/partial_test_1.json +++ b/test/interpreter_functional/snapshots/baseline/partial_test_1.json @@ -1 +1 @@ -{"as":"tagcloud","type":"render","value":{"syncColors":false,"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visParams":{"ariaLabel":null,"bucket":{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},"maxFontSize":72,"metric":{"accessor":1,"format":{"id":"number","params":{}},"type":"vis_dimension"},"minFontSize":18,"orientation":"single","palette":{"name":"custom","params":{"colors":["#882E72","#B178A6","#D6C1DE","#1965B0","#5289C7","#7BAFDE","#4EB265","#90C987","#CAE0AB","#F7EE55","#F6C141","#F1932D","#E8601C","#DC050C"],"continuity":"above","gradient":false,"range":"percent","rangeMax":null,"rangeMin":0,"stops":[]},"type":"palette"},"scale":"linear","showLabel":true},"visType":"tagcloud"}} \ No newline at end of file +{"as":"tagcloud","type":"render","value":{"syncColors":false,"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visParams":{"ariaLabel":null,"bucket":{"accessor":0,"format":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"type":"vis_dimension"},"maxFontSize":72,"metric":{"accessor":1,"format":{"id":"number","params":{}},"type":"vis_dimension"},"minFontSize":18,"orientation":"single","palette":{"name":"custom","params":{"colors":["#882E72","#B178A6","#D6C1DE","#1965B0","#5289C7","#7BAFDE","#4EB265","#90C987","#CAE0AB","#F7EE55","#F6C141","#F1932D","#E8601C","#DC050C"],"continuity":"above","gradient":false,"range":"percent","rangeMax":null,"rangeMin":0,"stops":[]},"type":"palette"},"scale":"linear","showLabel":true},"visType":"tagcloud"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/baseline/partial_test_2.json b/test/interpreter_functional/snapshots/baseline/partial_test_2.json index aefe875ff248c..dc39ecfc53594 100644 --- a/test/interpreter_functional/snapshots/baseline/partial_test_2.json +++ b/test/interpreter_functional/snapshots/baseline/partial_test_2.json @@ -1 +1 @@ -{"as":"metricVis","type":"render","value":{"visConfig":{"dimensions":{"bucket":{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},"metrics":[{"accessor":1,"format":{"id":"number","params":{}},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":null,"percentageMode":false,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file +{"as":"metricVis","type":"render","value":{"visConfig":{"dimensions":{"bucket":{"accessor":0,"format":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"type":"vis_dimension"},"metrics":[{"accessor":1,"format":{"id":"number","params":{}},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":null,"percentageMode":false,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/baseline/step_output_test3.json b/test/interpreter_functional/snapshots/baseline/step_output_test3.json index aefe875ff248c..dc39ecfc53594 100644 --- a/test/interpreter_functional/snapshots/baseline/step_output_test3.json +++ b/test/interpreter_functional/snapshots/baseline/step_output_test3.json @@ -1 +1 @@ -{"as":"metricVis","type":"render","value":{"visConfig":{"dimensions":{"bucket":{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},"metrics":[{"accessor":1,"format":{"id":"number","params":{}},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":null,"percentageMode":false,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file +{"as":"metricVis","type":"render","value":{"visConfig":{"dimensions":{"bucket":{"accessor":0,"format":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"type":"vis_dimension"},"metrics":[{"accessor":1,"format":{"id":"number","params":{}},"type":"vis_dimension"}]},"metric":{"autoScale":null,"colorFullBackground":false,"labels":{"position":"bottom","show":true,"style":{"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:24px;line-height:1","spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"24px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}},"metricColorMode":"None","palette":null,"percentageMode":false,"style":{"bgColor":false,"css":"font-family:'Open Sans', Helvetica, Arial, sans-serif;font-weight:normal;font-style:normal;text-decoration:none;text-align:center;font-size:60px;line-height:1","labelColor":false,"spec":{"fontFamily":"'Open Sans', Helvetica, Arial, sans-serif","fontSize":"60px","fontStyle":"normal","fontWeight":"normal","lineHeight":"1","textAlign":"center","textDecoration":"none"},"type":"style"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/baseline/tagcloud_all_data.json b/test/interpreter_functional/snapshots/baseline/tagcloud_all_data.json index 775839764b410..518eb529e70f4 100644 --- a/test/interpreter_functional/snapshots/baseline/tagcloud_all_data.json +++ b/test/interpreter_functional/snapshots/baseline/tagcloud_all_data.json @@ -1 +1 @@ -{"as":"tagcloud","type":"render","value":{"syncColors":false,"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visParams":{"ariaLabel":null,"bucket":{"accessor":1,"format":{"id":"string","params":{}},"type":"vis_dimension"},"maxFontSize":72,"metric":{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},"minFontSize":18,"orientation":"single","palette":{"name":"custom","params":{"colors":["#882E72","#B178A6","#D6C1DE","#1965B0","#5289C7","#7BAFDE","#4EB265","#90C987","#CAE0AB","#F7EE55","#F6C141","#F1932D","#E8601C","#DC050C"],"continuity":"above","gradient":false,"range":"percent","rangeMax":null,"rangeMin":0,"stops":[]},"type":"palette"},"scale":"linear","showLabel":true},"visType":"tagcloud"}} \ No newline at end of file +{"as":"tagcloud","type":"render","value":{"syncColors":false,"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visParams":{"ariaLabel":null,"bucket":{"accessor":1,"format":{"id":"number"},"type":"vis_dimension"},"maxFontSize":72,"metric":{"accessor":0,"format":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"type":"vis_dimension"},"minFontSize":18,"orientation":"single","palette":{"name":"custom","params":{"colors":["#882E72","#B178A6","#D6C1DE","#1965B0","#5289C7","#7BAFDE","#4EB265","#90C987","#CAE0AB","#F7EE55","#F6C141","#F1932D","#E8601C","#DC050C"],"continuity":"above","gradient":false,"range":"percent","rangeMax":null,"rangeMin":0,"stops":[]},"type":"palette"},"scale":"linear","showLabel":true},"visType":"tagcloud"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/baseline/tagcloud_empty_data.json b/test/interpreter_functional/snapshots/baseline/tagcloud_empty_data.json index 70c7ea6d7827b..7417545550cd8 100644 --- a/test/interpreter_functional/snapshots/baseline/tagcloud_empty_data.json +++ b/test/interpreter_functional/snapshots/baseline/tagcloud_empty_data.json @@ -1 +1 @@ -{"as":"tagcloud","type":"render","value":{"syncColors":false,"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[],"type":"datatable"},"visParams":{"ariaLabel":null,"maxFontSize":72,"metric":{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},"minFontSize":18,"orientation":"single","palette":{"name":"custom","params":{"colors":["#882E72","#B178A6","#D6C1DE","#1965B0","#5289C7","#7BAFDE","#4EB265","#90C987","#CAE0AB","#F7EE55","#F6C141","#F1932D","#E8601C","#DC050C"],"continuity":"above","gradient":false,"range":"percent","rangeMax":null,"rangeMin":0,"stops":[]},"type":"palette"},"scale":"linear","showLabel":true},"visType":"tagcloud"}} \ No newline at end of file +{"as":"tagcloud","type":"render","value":{"syncColors":false,"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[],"type":"datatable"},"visParams":{"ariaLabel":null,"maxFontSize":72,"metric":{"accessor":0,"format":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"type":"vis_dimension"},"minFontSize":18,"orientation":"single","palette":{"name":"custom","params":{"colors":["#882E72","#B178A6","#D6C1DE","#1965B0","#5289C7","#7BAFDE","#4EB265","#90C987","#CAE0AB","#F7EE55","#F6C141","#F1932D","#E8601C","#DC050C"],"continuity":"above","gradient":false,"range":"percent","rangeMax":null,"rangeMin":0,"stops":[]},"type":"palette"},"scale":"linear","showLabel":true},"visType":"tagcloud"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/baseline/tagcloud_fontsize.json b/test/interpreter_functional/snapshots/baseline/tagcloud_fontsize.json index dc251faaee827..986e6d19e91f3 100644 --- a/test/interpreter_functional/snapshots/baseline/tagcloud_fontsize.json +++ b/test/interpreter_functional/snapshots/baseline/tagcloud_fontsize.json @@ -1 +1 @@ -{"as":"tagcloud","type":"render","value":{"syncColors":false,"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visParams":{"ariaLabel":null,"bucket":{"accessor":1,"format":{"id":"string","params":{}},"type":"vis_dimension"},"maxFontSize":40,"metric":{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},"minFontSize":20,"orientation":"single","palette":{"name":"custom","params":{"colors":["#882E72","#B178A6","#D6C1DE","#1965B0","#5289C7","#7BAFDE","#4EB265","#90C987","#CAE0AB","#F7EE55","#F6C141","#F1932D","#E8601C","#DC050C"],"continuity":"above","gradient":false,"range":"percent","rangeMax":null,"rangeMin":0,"stops":[]},"type":"palette"},"scale":"linear","showLabel":true},"visType":"tagcloud"}} \ No newline at end of file +{"as":"tagcloud","type":"render","value":{"syncColors":false,"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visParams":{"ariaLabel":null,"bucket":{"accessor":1,"format":{"id":"number"},"type":"vis_dimension"},"maxFontSize":40,"metric":{"accessor":0,"format":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"type":"vis_dimension"},"minFontSize":20,"orientation":"single","palette":{"name":"custom","params":{"colors":["#882E72","#B178A6","#D6C1DE","#1965B0","#5289C7","#7BAFDE","#4EB265","#90C987","#CAE0AB","#F7EE55","#F6C141","#F1932D","#E8601C","#DC050C"],"continuity":"above","gradient":false,"range":"percent","rangeMax":null,"rangeMin":0,"stops":[]},"type":"palette"},"scale":"linear","showLabel":true},"visType":"tagcloud"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/baseline/tagcloud_metric_data.json b/test/interpreter_functional/snapshots/baseline/tagcloud_metric_data.json index 89df8d2f4146b..cf0aa1162c23f 100644 --- a/test/interpreter_functional/snapshots/baseline/tagcloud_metric_data.json +++ b/test/interpreter_functional/snapshots/baseline/tagcloud_metric_data.json @@ -1 +1 @@ -{"as":"tagcloud","type":"render","value":{"syncColors":false,"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visParams":{"ariaLabel":null,"maxFontSize":72,"metric":{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},"minFontSize":18,"orientation":"single","palette":{"name":"custom","params":{"colors":["#882E72","#B178A6","#D6C1DE","#1965B0","#5289C7","#7BAFDE","#4EB265","#90C987","#CAE0AB","#F7EE55","#F6C141","#F1932D","#E8601C","#DC050C"],"continuity":"above","gradient":false,"range":"percent","rangeMax":null,"rangeMin":0,"stops":[]},"type":"palette"},"scale":"linear","showLabel":true},"visType":"tagcloud"}} \ No newline at end of file +{"as":"tagcloud","type":"render","value":{"syncColors":false,"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visParams":{"ariaLabel":null,"maxFontSize":72,"metric":{"accessor":0,"format":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"type":"vis_dimension"},"minFontSize":18,"orientation":"single","palette":{"name":"custom","params":{"colors":["#882E72","#B178A6","#D6C1DE","#1965B0","#5289C7","#7BAFDE","#4EB265","#90C987","#CAE0AB","#F7EE55","#F6C141","#F1932D","#E8601C","#DC050C"],"continuity":"above","gradient":false,"range":"percent","rangeMax":null,"rangeMin":0,"stops":[]},"type":"palette"},"scale":"linear","showLabel":true},"visType":"tagcloud"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/baseline/tagcloud_options.json b/test/interpreter_functional/snapshots/baseline/tagcloud_options.json index 7bd4ff7dedfa0..357ac0fc76784 100644 --- a/test/interpreter_functional/snapshots/baseline/tagcloud_options.json +++ b/test/interpreter_functional/snapshots/baseline/tagcloud_options.json @@ -1 +1 @@ -{"as":"tagcloud","type":"render","value":{"syncColors":false,"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visParams":{"ariaLabel":null,"bucket":{"accessor":1,"format":{"id":"string","params":{}},"type":"vis_dimension"},"maxFontSize":72,"metric":{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},"minFontSize":18,"orientation":"multiple","palette":{"name":"custom","params":{"colors":["#882E72","#B178A6","#D6C1DE","#1965B0","#5289C7","#7BAFDE","#4EB265","#90C987","#CAE0AB","#F7EE55","#F6C141","#F1932D","#E8601C","#DC050C"],"continuity":"above","gradient":false,"range":"percent","rangeMax":null,"rangeMin":0,"stops":[]},"type":"palette"},"scale":"log","showLabel":true},"visType":"tagcloud"}} \ No newline at end of file +{"as":"tagcloud","type":"render","value":{"syncColors":false,"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"appliedTimeRange":null,"enabled":true,"hasPrecisionError":false,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visParams":{"ariaLabel":null,"bucket":{"accessor":1,"format":{"id":"number"},"type":"vis_dimension"},"maxFontSize":72,"metric":{"accessor":0,"format":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other"}},"type":"vis_dimension"},"minFontSize":18,"orientation":"multiple","palette":{"name":"custom","params":{"colors":["#882E72","#B178A6","#D6C1DE","#1965B0","#5289C7","#7BAFDE","#4EB265","#90C987","#CAE0AB","#F7EE55","#F6C141","#F1932D","#E8601C","#DC050C"],"continuity":"above","gradient":false,"range":"percent","rangeMax":null,"rangeMin":0,"stops":[]},"type":"palette"},"scale":"log","showLabel":true},"visType":"tagcloud"}} \ No newline at end of file From f2a56adc36404a3abb8be7b9c1b2dc3fc3429a7a Mon Sep 17 00:00:00 2001 From: Julia Bardi <90178898+juliaElastic@users.noreply.github.com> Date: Mon, 28 Feb 2022 13:43:08 +0100 Subject: [PATCH 042/102] hide enroll command when clicking on create agent policy (#126431) --- .../agent_enrollment_flyout/agent_policy_select_create.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/agent_policy_select_create.tsx b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/agent_policy_select_create.tsx index 655875d044893..53e8140086c2c 100644 --- a/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/agent_policy_select_create.tsx +++ b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/agent_policy_select_create.tsx @@ -73,6 +73,9 @@ export const SelectCreateAgentPolicy: React.FC = ({ const onClickCreatePolicy = () => { setCreateState({ status: CREATE_STATUS.INITIAL }); setShowCreatePolicy(true); + if (withKeySelection && onKeyChange) { + onKeyChange(undefined); + } }; return ( From 865c351ecf179b68d99115d909040036f2d9af73 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Mon, 28 Feb 2022 13:14:03 +0000 Subject: [PATCH 043/102] skip flaky suite (#92567) --- .../security_solution_endpoint/apps/endpoint/policy_details.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/security_solution_endpoint/apps/endpoint/policy_details.ts b/x-pack/test/security_solution_endpoint/apps/endpoint/policy_details.ts index 3f057d198a25c..4e4a1fc61d707 100644 --- a/x-pack/test/security_solution_endpoint/apps/endpoint/policy_details.ts +++ b/x-pack/test/security_solution_endpoint/apps/endpoint/policy_details.ts @@ -337,7 +337,8 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { }); }); - describe('and the save button is clicked', () => { + // FLAKY: https://github.com/elastic/kibana/issues/92567 + describe.skip('and the save button is clicked', () => { let policyInfo: PolicyTestResourceInfo; beforeEach(async () => { From 1ded153692d222b7f126767037d3bd7a5a55c917 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Mon, 28 Feb 2022 13:21:36 +0000 Subject: [PATCH 044/102] skip flaky suite (#126414) --- test/functional/apps/console/_autocomplete.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/functional/apps/console/_autocomplete.ts b/test/functional/apps/console/_autocomplete.ts index 580847351be9c..1ba4bcaa76b36 100644 --- a/test/functional/apps/console/_autocomplete.ts +++ b/test/functional/apps/console/_autocomplete.ts @@ -29,7 +29,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(PageObjects.console.isAutocompleteVisible()).to.be.eql(true); }); - describe('with a missing comma in query', () => { + // FLAKY: https://github.com/elastic/kibana/issues/126414 + describe.skip('with a missing comma in query', () => { const LINE_NUMBER = 4; beforeEach(async () => { await PageObjects.console.clearTextArea(); From f3ec5433411d8c0c57c6f4ac5b47f34c24d21160 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Mon, 28 Feb 2022 13:44:23 +0000 Subject: [PATCH 045/102] skip flakt suite (#124413 #122838) --- .../functional_basic/apps/ml/permissions/full_ml_access.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/x-pack/test/functional_basic/apps/ml/permissions/full_ml_access.ts b/x-pack/test/functional_basic/apps/ml/permissions/full_ml_access.ts index b44c5f08bdbc6..6db82801a5bdd 100644 --- a/x-pack/test/functional_basic/apps/ml/permissions/full_ml_access.ts +++ b/x-pack/test/functional_basic/apps/ml/permissions/full_ml_access.ts @@ -20,7 +20,9 @@ export default function ({ getService }: FtrProviderContext) { { user: USER.ML_POWERUSER_SPACES, discoverAvailable: false }, ]; - describe('for user with full ML access', function () { + // FLAKY: https://github.com/elastic/kibana/issues/124413 + // FLAKY: https://github.com/elastic/kibana/issues/122838 + describe.skip('for user with full ML access', function () { for (const testUser of testUsers) { describe(`(${testUser.user})`, function () { const ecIndexPattern = 'ft_module_sample_ecommerce'; From a483dd0f51773b4ee45ec0859fbbc60ed9c8feaf Mon Sep 17 00:00:00 2001 From: Julia Bardi <90178898+juliaElastic@users.noreply.github.com> Date: Mon, 28 Feb 2022 15:44:52 +0100 Subject: [PATCH 046/102] [Fleet] fix showing fleet server policies in enroll selection (#126457) --- .../agent_enrollment_flyout/managed_instructions.tsx | 1 - .../fleet/public/components/agent_enrollment_flyout/steps.tsx | 4 +--- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/managed_instructions.tsx b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/managed_instructions.tsx index 05458a1fcd6eb..ba0da6c7ec83a 100644 --- a/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/managed_instructions.tsx +++ b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/managed_instructions.tsx @@ -120,7 +120,6 @@ export const ManagedInstructions = React.memo( selectedApiKeyId, setSelectedAPIKeyId, setSelectedPolicyId, - excludeFleetServer: true, refreshAgentPolicies, }) : AgentEnrollmentKeySelectionStep({ agentPolicy, selectedApiKeyId, setSelectedAPIKeyId }), diff --git a/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/steps.tsx b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/steps.tsx index 92c71df1b8f0f..31a56056c0bcc 100644 --- a/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/steps.tsx +++ b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/steps.tsx @@ -16,8 +16,6 @@ import semverPatch from 'semver/functions/patch'; import type { AgentPolicy } from '../../types'; import { useKibanaVersion } from '../../hooks'; -import { policyHasFleetServer } from '../../applications/fleet/sections/agents/services/has_fleet_server'; - import { AdvancedAgentAuthenticationSettings } from './advanced_agent_authentication_settings'; import { SelectCreateAgentPolicy } from './agent_policy_select_create'; @@ -95,7 +93,7 @@ export const AgentPolicySelectionStep = ({ const regularAgentPolicies = useMemo(() => { return agentPolicies.filter( (policy) => - policy && !policy.is_managed && (!excludeFleetServer || !policyHasFleetServer(policy)) + policy && !policy.is_managed && (!excludeFleetServer || !policy.is_default_fleet_server) ); }, [agentPolicies, excludeFleetServer]); From 2ccda5a47f727d1f78f6f2ff95d41719a0a08269 Mon Sep 17 00:00:00 2001 From: James Rodewig Date: Mon, 28 Feb 2022 09:57:11 -0500 Subject: [PATCH 047/102] [DOCS] Fix copy for `Allow string indices in TSVB` setting (#126374) Updates the copy for the `Allow string indices in TSVB` setting to remove a reference to index patterns. While technically correct, the reference is confusing and unneeded. --- src/plugins/vis_types/timeseries/server/ui_settings.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/vis_types/timeseries/server/ui_settings.ts b/src/plugins/vis_types/timeseries/server/ui_settings.ts index c64d5771479b6..3d30482dec916 100644 --- a/src/plugins/vis_types/timeseries/server/ui_settings.ts +++ b/src/plugins/vis_types/timeseries/server/ui_settings.ts @@ -32,7 +32,7 @@ export const getUiSettings: () => Record = () => ({ requiresPageReload: true, description: i18n.translate('visTypeTimeseries.advancedSettings.allowStringIndicesText', { defaultMessage: - 'Enables you to use index patterns and Elasticsearch indices in TSVB visualizations.', + 'Enables you to query Elasticsearch indices in TSVB visualizations.', }), schema: schema.boolean(), }, From 35c819c2288e71dc85fc2810b06ff532e6d51796 Mon Sep 17 00:00:00 2001 From: Stacey Gammon Date: Mon, 28 Feb 2022 10:26:15 -0500 Subject: [PATCH 048/102] udpate api docs (#126460) --- api_docs/actions.devdocs.json | 2 +- api_docs/actions.mdx | 2 +- api_docs/advanced_settings.mdx | 2 +- api_docs/alerting.devdocs.json | 510 +- api_docs/alerting.mdx | 4 +- api_docs/apm.devdocs.json | 10 +- api_docs/apm.mdx | 2 +- api_docs/banners.mdx | 2 +- api_docs/bfetch.mdx | 2 +- api_docs/canvas.mdx | 2 +- api_docs/cases.devdocs.json | 151 + api_docs/cases.mdx | 4 +- api_docs/charts.devdocs.json | 32 +- api_docs/charts.mdx | 4 +- api_docs/cloud.mdx | 2 +- api_docs/console.mdx | 2 +- api_docs/controls.mdx | 2 +- api_docs/core.devdocs.json | 7664 ++++++++++++-- api_docs/core.mdx | 4 +- api_docs/core_application.devdocs.json | 31 +- api_docs/core_application.mdx | 4 +- api_docs/core_chrome.mdx | 4 +- api_docs/core_http.mdx | 4 +- api_docs/core_saved_objects.devdocs.json | 4 + api_docs/core_saved_objects.mdx | 4 +- api_docs/custom_integrations.mdx | 2 +- api_docs/dashboard.devdocs.json | 41 + api_docs/dashboard.mdx | 4 +- api_docs/dashboard_enhanced.devdocs.json | 30 +- api_docs/dashboard_enhanced.mdx | 4 +- api_docs/data.devdocs.json | 2037 ++-- api_docs/data.mdx | 4 +- api_docs/data_autocomplete.mdx | 4 +- api_docs/data_enhanced.mdx | 2 +- api_docs/data_query.mdx | 4 +- api_docs/data_search.devdocs.json | 4 +- api_docs/data_search.mdx | 4 +- api_docs/data_ui.mdx | 4 +- 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 | 3682 ++++++- api_docs/data_views.mdx | 4 +- api_docs/data_visualizer.mdx | 2 +- api_docs/deprecations_by_api.mdx | 59 +- api_docs/deprecations_by_plugin.mdx | 82 +- api_docs/deprecations_by_team.mdx | 25 +- api_docs/dev_tools.mdx | 2 +- api_docs/discover.devdocs.json | 340 +- api_docs/discover.mdx | 4 +- api_docs/discover_enhanced.mdx | 2 +- api_docs/elastic_apm_synthtrace.mdx | 2 +- api_docs/elastic_datemath.mdx | 2 +- api_docs/embeddable.devdocs.json | 12 +- 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/es_ui_shared.mdx | 2 +- api_docs/event_log.devdocs.json | 6 +- api_docs/event_log.mdx | 2 +- api_docs/expression_error.mdx | 2 +- api_docs/expression_gauge.devdocs.json | 434 +- api_docs/expression_gauge.mdx | 4 +- api_docs/expression_heatmap.mdx | 2 +- api_docs/expression_image.mdx | 2 +- api_docs/expression_metric.mdx | 2 +- api_docs/expression_metric_vis.devdocs.json | 67 +- 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/expressions.mdx | 2 +- api_docs/features.mdx | 2 +- api_docs/field_formats.mdx | 2 +- api_docs/file_upload.mdx | 2 +- api_docs/fleet.devdocs.json | 2065 +++- api_docs/fleet.mdx | 4 +- api_docs/global_search.mdx | 2 +- api_docs/home.mdx | 2 +- api_docs/index_lifecycle_management.mdx | 2 +- api_docs/index_management.mdx | 2 +- api_docs/infra.mdx | 2 +- api_docs/inspector.mdx | 2 +- api_docs/interactive_setup.mdx | 2 +- api_docs/kbn_ace.mdx | 2 +- api_docs/kbn_alerts.mdx | 2 +- api_docs/kbn_analytics.devdocs.json | 55 +- api_docs/kbn_analytics.mdx | 2 +- api_docs/kbn_apm_config_loader.mdx | 2 +- api_docs/kbn_apm_utils.mdx | 2 +- api_docs/kbn_cli_dev_mode.mdx | 2 +- api_docs/kbn_config.mdx | 2 +- api_docs/kbn_config_schema.mdx | 2 +- api_docs/kbn_crypto.mdx | 2 +- api_docs/kbn_dev_utils.devdocs.json | 210 +- api_docs/kbn_dev_utils.mdx | 4 +- api_docs/kbn_doc_links.mdx | 2 +- api_docs/kbn_docs_utils.mdx | 2 +- api_docs/kbn_es_archiver.mdx | 2 +- api_docs/kbn_es_query.mdx | 2 +- api_docs/kbn_field_types.mdx | 2 +- api_docs/kbn_i18n.mdx | 2 +- api_docs/kbn_interpreter.mdx | 2 +- api_docs/kbn_io_ts_utils.devdocs.json | 4 +- api_docs/kbn_io_ts_utils.mdx | 2 +- api_docs/kbn_logging.mdx | 2 +- api_docs/kbn_logging_mocks.mdx | 2 +- api_docs/kbn_mapbox_gl.mdx | 2 +- api_docs/kbn_monaco.mdx | 2 +- api_docs/kbn_optimizer.mdx | 2 +- api_docs/kbn_plugin_generator.mdx | 2 +- api_docs/kbn_plugin_helpers.mdx | 2 +- api_docs/kbn_pm.mdx | 2 +- api_docs/kbn_react_field.mdx | 2 +- api_docs/kbn_rule_data_utils.mdx | 2 +- ...securitysolution_autocomplete.devdocs.json | 6 +- .../kbn_securitysolution_autocomplete.mdx | 2 +- ...kbn_securitysolution_es_utils.devdocs.json | 9112 ++++------------- api_docs/kbn_securitysolution_es_utils.mdx | 2 +- api_docs/kbn_securitysolution_hook_utils.mdx | 2 +- ..._securitysolution_io_ts_alerting_types.mdx | 2 +- ...ritysolution_io_ts_list_types.devdocs.json | 544 +- .../kbn_securitysolution_io_ts_list_types.mdx | 4 +- api_docs/kbn_securitysolution_io_ts_types.mdx | 2 +- api_docs/kbn_securitysolution_io_ts_utils.mdx | 2 +- ...kbn_securitysolution_list_api.devdocs.json | 20 +- api_docs/kbn_securitysolution_list_api.mdx | 2 +- .../kbn_securitysolution_list_constants.mdx | 2 +- ...n_securitysolution_list_hooks.devdocs.json | 40 +- api_docs/kbn_securitysolution_list_hooks.mdx | 2 +- ...n_securitysolution_list_utils.devdocs.json | 26 +- 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_std.mdx | 2 +- api_docs/kbn_storybook.mdx | 2 +- api_docs/kbn_telemetry_tools.mdx | 2 +- api_docs/kbn_test.devdocs.json | 50 - api_docs/kbn_test.mdx | 4 +- api_docs/kbn_test_jest_helpers.mdx | 2 +- api_docs/kbn_typed_react_router_config.mdx | 2 +- api_docs/kbn_ui_theme.mdx | 2 +- api_docs/kbn_utility_types.mdx | 2 +- api_docs/kbn_utils.mdx | 2 +- api_docs/kibana_overview.mdx | 2 +- api_docs/kibana_react.devdocs.json | 32 +- api_docs/kibana_react.mdx | 2 +- api_docs/kibana_utils.mdx | 2 +- api_docs/lens.devdocs.json | 566 +- api_docs/lens.mdx | 7 +- api_docs/license_api_guard.mdx | 2 +- api_docs/license_management.mdx | 2 +- api_docs/licensing.devdocs.json | 8 - api_docs/licensing.mdx | 2 +- api_docs/lists.devdocs.json | 1505 ++- api_docs/lists.mdx | 4 +- api_docs/management.mdx | 2 +- api_docs/maps.mdx | 2 +- api_docs/maps_ems.mdx | 2 +- api_docs/metrics_entities.devdocs.json | 1188 ++- api_docs/metrics_entities.mdx | 2 +- api_docs/ml.devdocs.json | 4 +- api_docs/ml.mdx | 2 +- api_docs/monitoring.devdocs.json | 58 +- api_docs/monitoring.mdx | 4 +- api_docs/navigation.devdocs.json | 163 + api_docs/navigation.mdx | 4 +- api_docs/newsfeed.mdx | 2 +- api_docs/observability.devdocs.json | 1444 ++- api_docs/observability.mdx | 4 +- api_docs/osquery.mdx | 2 +- api_docs/plugin_directory.mdx | 64 +- api_docs/presentation_util.mdx | 2 +- api_docs/remote_clusters.mdx | 2 +- api_docs/reporting.devdocs.json | 825 +- api_docs/reporting.mdx | 15 +- api_docs/rollup.mdx | 2 +- api_docs/rule_registry.devdocs.json | 97 +- api_docs/rule_registry.mdx | 7 +- api_docs/runtime_fields.mdx | 2 +- api_docs/saved_objects.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/screenshot_mode.mdx | 2 +- api_docs/screenshotting.devdocs.json | 30 +- api_docs/screenshotting.mdx | 4 +- api_docs/security.mdx | 2 +- api_docs/security_solution.devdocs.json | 4 +- api_docs/security_solution.mdx | 2 +- api_docs/share.devdocs.json | 523 +- api_docs/share.mdx | 7 +- api_docs/shared_u_x.devdocs.json | 70 + api_docs/shared_u_x.mdx | 4 +- api_docs/snapshot_restore.devdocs.json | 27 +- api_docs/snapshot_restore.mdx | 4 +- api_docs/spaces.mdx | 2 +- api_docs/stack_alerts.mdx | 2 +- api_docs/task_manager.mdx | 2 +- api_docs/telemetry.mdx | 2 +- .../telemetry_collection_manager.devdocs.json | 1188 ++- api_docs/telemetry_collection_manager.mdx | 2 +- api_docs/telemetry_collection_xpack.mdx | 2 +- api_docs/telemetry_management_section.mdx | 2 +- api_docs/timelines.devdocs.json | 8 +- api_docs/timelines.mdx | 2 +- api_docs/transform.mdx | 2 +- api_docs/triggers_actions_ui.devdocs.json | 138 +- api_docs/triggers_actions_ui.mdx | 4 +- api_docs/ui_actions.devdocs.json | 13 + api_docs/ui_actions.mdx | 4 +- api_docs/ui_actions_enhanced.mdx | 2 +- api_docs/url_forwarding.mdx | 2 +- api_docs/usage_collection.devdocs.json | 18 +- api_docs/usage_collection.mdx | 2 +- api_docs/ux.mdx | 2 +- api_docs/vis_default_editor.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.devdocs.json | 4 +- api_docs/vis_type_vislib.mdx | 2 +- api_docs/vis_type_xy.mdx | 2 +- api_docs/visualizations.devdocs.json | 567 +- api_docs/visualizations.mdx | 4 +- 234 files changed, 24682 insertions(+), 11667 deletions(-) diff --git a/api_docs/actions.devdocs.json b/api_docs/actions.devdocs.json index 29a799f020c22..703029e49ca4b 100644 --- a/api_docs/actions.devdocs.json +++ b/api_docs/actions.devdocs.json @@ -695,7 +695,7 @@ "label": "ActionParamsType", "description": [], "signature": [ - "{ readonly source?: string | undefined; readonly group?: string | undefined; readonly summary?: string | undefined; readonly timestamp?: string | undefined; readonly eventAction?: \"resolve\" | \"trigger\" | \"acknowledge\" | undefined; readonly dedupKey?: string | undefined; readonly severity?: \"error\" | \"info\" | \"warning\" | \"critical\" | undefined; readonly component?: string | undefined; readonly class?: string | undefined; }" + "{ readonly source?: string | undefined; readonly summary?: string | undefined; readonly group?: string | undefined; readonly timestamp?: string | undefined; readonly eventAction?: \"resolve\" | \"trigger\" | \"acknowledge\" | undefined; readonly dedupKey?: string | undefined; readonly severity?: \"error\" | \"info\" | \"warning\" | \"critical\" | undefined; readonly component?: string | undefined; readonly class?: string | undefined; }" ], "path": "x-pack/plugins/actions/server/builtin_action_types/pagerduty.ts", "deprecated": false, diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index f60c99d62ced6..ec19812917d50 100644 --- a/api_docs/actions.mdx +++ b/api_docs/actions.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/actions title: "actions" image: https://source.unsplash.com/400x175/?github summary: API docs for the actions plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'actions'] warning: 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. --- diff --git a/api_docs/advanced_settings.mdx b/api_docs/advanced_settings.mdx index 2b6d59e46e5b0..8ef8640df80ad 100644 --- a/api_docs/advanced_settings.mdx +++ b/api_docs/advanced_settings.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/advancedSettings title: "advancedSettings" image: https://source.unsplash.com/400x175/?github summary: API docs for the advancedSettings plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'advancedSettings'] warning: 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. --- diff --git a/api_docs/alerting.devdocs.json b/api_docs/alerting.devdocs.json index 389461e4a833d..6c5b1a4dc02f8 100644 --- a/api_docs/alerting.devdocs.json +++ b/api_docs/alerting.devdocs.json @@ -1311,12 +1311,367 @@ "section": "def-server.AlertServices", "text": "AlertServices" }, - " extends ", - "Services" + "" ], "path": "x-pack/plugins/alerting/server/types.ts", "deprecated": false, "children": [ + { + "parentPluginId": "alerting", + "id": "def-server.AlertServices.savedObjectsClient", + "type": "Object", + "tags": [], + "label": "savedObjectsClient", + "description": [], + "signature": [ + "{ create: (type: string, attributes: T, options?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsCreateOptions", + "text": "SavedObjectsCreateOptions" + }, + " | undefined) => Promise<", + "SavedObject", + ">; bulkCreate: (objects: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsBulkCreateObject", + "text": "SavedObjectsBulkCreateObject" + }, + "[], options?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsCreateOptions", + "text": "SavedObjectsCreateOptions" + }, + " | undefined) => Promise<", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsBulkResponse", + "text": "SavedObjectsBulkResponse" + }, + ">; checkConflicts: (objects?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsCheckConflictsObject", + "text": "SavedObjectsCheckConflictsObject" + }, + "[], options?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsBaseOptions", + "text": "SavedObjectsBaseOptions" + }, + ") => Promise<", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsCheckConflictsResponse", + "text": "SavedObjectsCheckConflictsResponse" + }, + ">; delete: (type: string, id: string, options?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsDeleteOptions", + "text": "SavedObjectsDeleteOptions" + }, + ") => Promise<{}>; find: (options: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsFindOptions", + "text": "SavedObjectsFindOptions" + }, + ") => Promise<", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsFindResponse", + "text": "SavedObjectsFindResponse" + }, + ">; bulkGet: (objects?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsBulkGetObject", + "text": "SavedObjectsBulkGetObject" + }, + "[], options?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsBaseOptions", + "text": "SavedObjectsBaseOptions" + }, + ") => Promise<", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsBulkResponse", + "text": "SavedObjectsBulkResponse" + }, + ">; bulkResolve: (objects: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsBulkResolveObject", + "text": "SavedObjectsBulkResolveObject" + }, + "[], options?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsBaseOptions", + "text": "SavedObjectsBaseOptions" + }, + " | undefined) => Promise<", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsBulkResolveResponse", + "text": "SavedObjectsBulkResolveResponse" + }, + ">; get: (type: string, id: string, options?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsBaseOptions", + "text": "SavedObjectsBaseOptions" + }, + ") => Promise<", + "SavedObject", + ">; resolve: (type: string, id: string, options?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsBaseOptions", + "text": "SavedObjectsBaseOptions" + }, + ") => Promise<", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsResolveResponse", + "text": "SavedObjectsResolveResponse" + }, + ">; update: (type: string, id: string, attributes: Partial, options?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsUpdateOptions", + "text": "SavedObjectsUpdateOptions" + }, + ") => Promise<", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsUpdateResponse", + "text": "SavedObjectsUpdateResponse" + }, + ">; collectMultiNamespaceReferences: (objects: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsCollectMultiNamespaceReferencesObject", + "text": "SavedObjectsCollectMultiNamespaceReferencesObject" + }, + "[], options?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsCollectMultiNamespaceReferencesOptions", + "text": "SavedObjectsCollectMultiNamespaceReferencesOptions" + }, + " | undefined) => Promise<", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsCollectMultiNamespaceReferencesResponse", + "text": "SavedObjectsCollectMultiNamespaceReferencesResponse" + }, + ">; updateObjectsSpaces: (objects: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsUpdateObjectsSpacesObject", + "text": "SavedObjectsUpdateObjectsSpacesObject" + }, + "[], spacesToAdd: string[], spacesToRemove: string[], options?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsUpdateObjectsSpacesOptions", + "text": "SavedObjectsUpdateObjectsSpacesOptions" + }, + " | undefined) => Promise<", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsUpdateObjectsSpacesResponse", + "text": "SavedObjectsUpdateObjectsSpacesResponse" + }, + ">; bulkUpdate: (objects: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsBulkUpdateObject", + "text": "SavedObjectsBulkUpdateObject" + }, + "[], options?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsBulkUpdateOptions", + "text": "SavedObjectsBulkUpdateOptions" + }, + " | undefined) => Promise<", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsBulkUpdateResponse", + "text": "SavedObjectsBulkUpdateResponse" + }, + ">; removeReferencesTo: (type: string, id: string, options?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsRemoveReferencesToOptions", + "text": "SavedObjectsRemoveReferencesToOptions" + }, + " | undefined) => Promise<", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsRemoveReferencesToResponse", + "text": "SavedObjectsRemoveReferencesToResponse" + }, + ">; openPointInTimeForType: (type: string | string[], options?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsOpenPointInTimeOptions", + "text": "SavedObjectsOpenPointInTimeOptions" + }, + ") => Promise<", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsOpenPointInTimeResponse", + "text": "SavedObjectsOpenPointInTimeResponse" + }, + ">; closePointInTime: (id: string, options?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsBaseOptions", + "text": "SavedObjectsBaseOptions" + }, + " | undefined) => Promise<", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsClosePointInTimeResponse", + "text": "SavedObjectsClosePointInTimeResponse" + }, + ">; createPointInTimeFinder: (findOptions: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsCreatePointInTimeFinderOptions", + "text": "SavedObjectsCreatePointInTimeFinderOptions" + }, + ", dependencies?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsCreatePointInTimeFinderDependencies", + "text": "SavedObjectsCreatePointInTimeFinderDependencies" + }, + " | undefined) => ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.ISavedObjectsPointInTimeFinder", + "text": "ISavedObjectsPointInTimeFinder" + }, + "; errors: typeof ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsErrorHelpers", + "text": "SavedObjectsErrorHelpers" + }, + "; }" + ], + "path": "x-pack/plugins/alerting/server/types.ts", + "deprecated": false + }, + { + "parentPluginId": "alerting", + "id": "def-server.AlertServices.scopedClusterClient", + "type": "Object", + "tags": [], + "label": "scopedClusterClient", + "description": [], + "signature": [ + { + "pluginId": "core", + "scope": "server", + "docId": "kibCorePluginApi", + "section": "def-server.IScopedClusterClient", + "text": "IScopedClusterClient" + } + ], + "path": "x-pack/plugins/alerting/server/types.ts", + "deprecated": false + }, { "parentPluginId": "alerting", "id": "def-server.AlertServices.alertFactory", @@ -1333,6 +1688,8 @@ "section": "def-server.PublicAlert", "text": "PublicAlert" }, + "; done: () => ", + "AlertFactoryDoneUtils", "; }" ], "path": "x-pack/plugins/alerting/server/types.ts", @@ -2226,6 +2583,19 @@ ], "path": "x-pack/plugins/alerting/server/types.ts", "deprecated": false + }, + { + "parentPluginId": "alerting", + "id": "def-server.RuleType.doesSetRecoveryContext", + "type": "CompoundType", + "tags": [], + "label": "doesSetRecoveryContext", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "x-pack/plugins/alerting/server/types.ts", + "deprecated": false } ], "initialIsOpen": false @@ -2436,7 +2806,9 @@ "Alert", "; scheduleActionsWithSubGroup: (actionGroup: ActionGroupIds, subgroup: string, context?: Context) => ", "Alert", - "; }" + "; setContext: (context: Context) => ", + "Alert", + "; getContext: () => Context; hasContext: () => boolean; }" ], "path": "x-pack/plugins/alerting/server/alert/alert.ts", "deprecated": false, @@ -3431,6 +3803,19 @@ "path": "x-pack/plugins/alerting/common/alert.ts", "deprecated": false }, + { + "parentPluginId": "alerting", + "id": "def-common.AlertExecutionStatus.metrics", + "type": "Object", + "tags": [], + "label": "metrics", + "description": [], + "signature": [ + "{ numSearches?: number | undefined; totalSearchDurationMs?: number | undefined; esSearchDurationMs?: number | undefined; } | undefined" + ], + "path": "x-pack/plugins/alerting/common/alert.ts", + "deprecated": false + }, { "parentPluginId": "alerting", "id": "def-common.AlertExecutionStatus.lastExecutionDate", @@ -4001,6 +4386,72 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "alerting", + "id": "def-common.RuleExecutionRunResult", + "type": "Interface", + "tags": [], + "label": "RuleExecutionRunResult", + "description": [], + "path": "x-pack/plugins/alerting/common/rule_task_instance.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "alerting", + "id": "def-common.RuleExecutionRunResult.state", + "type": "CompoundType", + "tags": [], + "label": "state", + "description": [], + "signature": [ + "{ alertTypeState?: { [x: string]: unknown; } | undefined; alertInstances?: { [x: string]: { state?: { [x: string]: unknown; } | undefined; meta?: { lastScheduledActions?: ({ subgroup?: string | undefined; } & { group: string; date: Date; }) | undefined; } | undefined; }; } | undefined; previousStartedAt?: Date | null | undefined; } & { metrics: { numSearches?: number | undefined; totalSearchDurationMs?: number | undefined; esSearchDurationMs?: number | undefined; }; triggeredActions: { group?: string | undefined; id?: string | undefined; actionTypeId?: string | undefined; params?: { [x: string]: unknown; } | undefined; }[]; }" + ], + "path": "x-pack/plugins/alerting/common/rule_task_instance.ts", + "deprecated": false + }, + { + "parentPluginId": "alerting", + "id": "def-common.RuleExecutionRunResult.monitoring", + "type": "Object", + "tags": [], + "label": "monitoring", + "description": [], + "signature": [ + { + "pluginId": "alerting", + "scope": "common", + "docId": "kibAlertingPluginApi", + "section": "def-common.RuleMonitoring", + "text": "RuleMonitoring" + }, + " | undefined" + ], + "path": "x-pack/plugins/alerting/common/rule_task_instance.ts", + "deprecated": false + }, + { + "parentPluginId": "alerting", + "id": "def-common.RuleExecutionRunResult.schedule", + "type": "Object", + "tags": [], + "label": "schedule", + "description": [], + "signature": [ + { + "pluginId": "alerting", + "scope": "common", + "docId": "kibAlertingPluginApi", + "section": "def-common.IntervalSchedule", + "text": "IntervalSchedule" + }, + " | undefined" + ], + "path": "x-pack/plugins/alerting/common/rule_task_instance.ts", + "deprecated": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "alerting", "id": "def-common.RuleMonitoring", @@ -4281,6 +4732,19 @@ "path": "x-pack/plugins/alerting/common/rule_type.ts", "deprecated": false }, + { + "parentPluginId": "alerting", + "id": "def-common.RuleType.doesSetRecoveryContext", + "type": "CompoundType", + "tags": [], + "label": "doesSetRecoveryContext", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "x-pack/plugins/alerting/common/rule_type.ts", + "deprecated": false + }, { "parentPluginId": "alerting", "id": "def-common.RuleType.enabledInLicense", @@ -4691,27 +5155,27 @@ }, { "parentPluginId": "alerting", - "id": "def-common.RuleStatusValues", + "id": "def-common.RuleExecutionMetrics", "type": "Type", "tags": [], - "label": "RuleStatusValues", + "label": "RuleExecutionMetrics", "description": [], "signature": [ - "\"OK\" | \"Active\" | \"Error\"" + "{ numSearches?: number | undefined; totalSearchDurationMs?: number | undefined; esSearchDurationMs?: number | undefined; }" ], - "path": "x-pack/plugins/alerting/common/alert_summary.ts", + "path": "x-pack/plugins/alerting/common/rule_task_instance.ts", "deprecated": false, "initialIsOpen": false }, { "parentPluginId": "alerting", - "id": "def-common.RuleTaskParams", + "id": "def-common.RuleExecutionState", "type": "Type", "tags": [], - "label": "RuleTaskParams", + "label": "RuleExecutionState", "description": [], "signature": [ - "{ alertId: string; } & { spaceId?: string | undefined; }" + "{ alertTypeState?: { [x: string]: unknown; } | undefined; alertInstances?: { [x: string]: { state?: { [x: string]: unknown; } | undefined; meta?: { lastScheduledActions?: ({ subgroup?: string | undefined; } & { group: string; date: Date; }) | undefined; } | undefined; }; } | undefined; previousStartedAt?: Date | null | undefined; } & { metrics: { numSearches?: number | undefined; totalSearchDurationMs?: number | undefined; esSearchDurationMs?: number | undefined; }; triggeredActions: { group?: string | undefined; id?: string | undefined; actionTypeId?: string | undefined; params?: { [x: string]: unknown; } | undefined; }[]; }" ], "path": "x-pack/plugins/alerting/common/rule_task_instance.ts", "deprecated": false, @@ -4719,13 +5183,27 @@ }, { "parentPluginId": "alerting", - "id": "def-common.RuleTaskState", + "id": "def-common.RuleStatusValues", "type": "Type", "tags": [], - "label": "RuleTaskState", + "label": "RuleStatusValues", "description": [], "signature": [ - "{ alertTypeState?: { [x: string]: unknown; } | undefined; alertInstances?: { [x: string]: { state?: { [x: string]: unknown; } | undefined; meta?: { lastScheduledActions?: ({ subgroup?: string | undefined; } & { group: string; date: Date; }) | undefined; } | undefined; }; } | undefined; previousStartedAt?: Date | null | undefined; }" + "\"OK\" | \"Active\" | \"Error\"" + ], + "path": "x-pack/plugins/alerting/common/alert_summary.ts", + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "alerting", + "id": "def-common.RuleTaskParams", + "type": "Type", + "tags": [], + "label": "RuleTaskParams", + "description": [], + "signature": [ + "{ alertId: string; } & { spaceId?: string | undefined; }" ], "path": "x-pack/plugins/alerting/common/rule_task_instance.ts", "deprecated": false, @@ -4733,13 +5211,13 @@ }, { "parentPluginId": "alerting", - "id": "def-common.RuleTaskStateWithActions", + "id": "def-common.RuleTaskState", "type": "Type", "tags": [], - "label": "RuleTaskStateWithActions", + "label": "RuleTaskState", "description": [], "signature": [ - "{ alertTypeState?: { [x: string]: unknown; } | undefined; alertInstances?: { [x: string]: { state?: { [x: string]: unknown; } | undefined; meta?: { lastScheduledActions?: ({ subgroup?: string | undefined; } & { group: string; date: Date; }) | undefined; } | undefined; }; } | undefined; previousStartedAt?: Date | null | undefined; } & { triggeredActions: { group?: string | undefined; id?: string | undefined; actionTypeId?: string | undefined; params?: { [x: string]: unknown; } | undefined; }[]; }" + "{ alertTypeState?: { [x: string]: unknown; } | undefined; alertInstances?: { [x: string]: { state?: { [x: string]: unknown; } | undefined; meta?: { lastScheduledActions?: ({ subgroup?: string | undefined; } & { group: string; date: Date; }) | undefined; } | undefined; }; } | undefined; previousStartedAt?: Date | null | undefined; }" ], "path": "x-pack/plugins/alerting/common/rule_task_instance.ts", "deprecated": false, diff --git a/api_docs/alerting.mdx b/api_docs/alerting.mdx index 9e42d8dbfabbf..bad1c9dd0214e 100644 --- a/api_docs/alerting.mdx +++ b/api_docs/alerting.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/alerting title: "alerting" image: https://source.unsplash.com/400x175/?github summary: API docs for the alerting plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'alerting'] warning: 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. --- @@ -18,7 +18,7 @@ Contact [Kibana Alerting](https://github.com/orgs/elastic/teams/kibana-alerting- | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 289 | 0 | 281 | 19 | +| 299 | 0 | 291 | 19 | ## Client diff --git a/api_docs/apm.devdocs.json b/api_docs/apm.devdocs.json index 04ad9a4d92bad..f0df027d6acad 100644 --- a/api_docs/apm.devdocs.json +++ b/api_docs/apm.devdocs.json @@ -731,7 +731,7 @@ "label": "APIEndpoint", "description": [], "signature": [ - "\"POST /internal/apm/data_view/static\" | \"GET /internal/apm/data_view/dynamic\" | \"GET /internal/apm/environments\" | \"GET /internal/apm/services/{serviceName}/errors/groups/main_statistics\" | \"GET /internal/apm/services/{serviceName}/errors/groups/detailed_statistics\" | \"GET /internal/apm/services/{serviceName}/errors/{groupId}\" | \"GET /internal/apm/services/{serviceName}/errors/distribution\" | \"POST /internal/apm/latency/overall_distribution\" | \"GET /internal/apm/services/{serviceName}/metrics/charts\" | \"GET /internal/apm/observability_overview\" | \"GET /internal/apm/observability_overview/has_data\" | \"GET /internal/apm/ux/client-metrics\" | \"GET /internal/apm/ux/page-load-distribution\" | \"GET /internal/apm/ux/page-load-distribution/breakdown\" | \"GET /internal/apm/ux/page-view-trends\" | \"GET /internal/apm/ux/services\" | \"GET /internal/apm/ux/visitor-breakdown\" | \"GET /internal/apm/ux/web-core-vitals\" | \"GET /internal/apm/ux/long-task-metrics\" | \"GET /internal/apm/ux/url-search\" | \"GET /internal/apm/ux/js-errors\" | \"GET /api/apm/observability_overview/has_rum_data\" | \"GET /internal/apm/service-map\" | \"GET /internal/apm/service-map/service/{serviceName}\" | \"GET /internal/apm/service-map/backend\" | \"GET /internal/apm/services/{serviceName}/serviceNodes\" | \"GET /internal/apm/services\" | \"GET /internal/apm/services/detailed_statistics\" | \"GET /internal/apm/services/{serviceName}/metadata/details\" | \"GET /internal/apm/services/{serviceName}/metadata/icons\" | \"GET /internal/apm/services/{serviceName}/agent\" | \"GET /internal/apm/services/{serviceName}/transaction_types\" | \"GET /internal/apm/services/{serviceName}/node/{serviceNodeName}/metadata\" | \"GET /api/apm/services/{serviceName}/annotation/search\" | \"POST /api/apm/services/{serviceName}/annotation\" | \"GET /internal/apm/services/{serviceName}/service_overview_instances/details/{serviceNodeName}\" | \"GET /internal/apm/services/{serviceName}/throughput\" | \"GET /internal/apm/services/{serviceName}/service_overview_instances/main_statistics\" | \"GET /internal/apm/services/{serviceName}/service_overview_instances/detailed_statistics\" | \"GET /internal/apm/services/{serviceName}/dependencies\" | \"GET /internal/apm/services/{serviceName}/dependencies/breakdown\" | \"GET /internal/apm/services/{serviceName}/profiling/timeline\" | \"GET /internal/apm/services/{serviceName}/profiling/statistics\" | \"GET /internal/apm/services/{serviceName}/alerts\" | \"GET /internal/apm/services/{serviceName}/infrastructure\" | \"GET /internal/apm/services/{serviceName}/anomaly_charts\" | \"GET /internal/apm/suggestions\" | \"GET /internal/apm/traces/{traceId}\" | \"GET /internal/apm/traces\" | \"GET /internal/apm/traces/{traceId}/root_transaction\" | \"GET /internal/apm/transactions/{transactionId}\" | \"GET /internal/apm/services/{serviceName}/transactions/groups/main_statistics\" | \"GET /internal/apm/services/{serviceName}/transactions/groups/detailed_statistics\" | \"GET /internal/apm/services/{serviceName}/transactions/charts/latency\" | \"GET /internal/apm/services/{serviceName}/transactions/traces/samples\" | \"GET /internal/apm/services/{serviceName}/transaction/charts/breakdown\" | \"GET /internal/apm/services/{serviceName}/transactions/charts/error_rate\" | \"GET /internal/apm/services/{serviceName}/transactions/charts/coldstart_rate\" | \"GET /internal/apm/services/{serviceName}/transactions/charts/coldstart_rate_by_transaction_name\" | \"GET /internal/apm/alerts/chart_preview/transaction_error_rate\" | \"GET /internal/apm/alerts/chart_preview/transaction_duration\" | \"GET /internal/apm/alerts/chart_preview/transaction_error_count\" | \"GET /api/apm/settings/agent-configuration\" | \"GET /api/apm/settings/agent-configuration/view\" | \"DELETE /api/apm/settings/agent-configuration\" | \"PUT /api/apm/settings/agent-configuration\" | \"POST /api/apm/settings/agent-configuration/search\" | \"GET /api/apm/settings/agent-configuration/services\" | \"GET /api/apm/settings/agent-configuration/environments\" | \"GET /api/apm/settings/agent-configuration/agent_name\" | \"GET /internal/apm/settings/anomaly-detection/jobs\" | \"POST /internal/apm/settings/anomaly-detection/jobs\" | \"GET /internal/apm/settings/anomaly-detection/environments\" | \"POST /internal/apm/settings/anomaly-detection/update_to_v3\" | \"GET /internal/apm/settings/apm-index-settings\" | \"GET /internal/apm/settings/apm-indices\" | \"POST /internal/apm/settings/apm-indices/save\" | \"GET /internal/apm/settings/custom_links/transaction\" | \"GET /internal/apm/settings/custom_links\" | \"POST /internal/apm/settings/custom_links\" | \"PUT /internal/apm/settings/custom_links/{id}\" | \"DELETE /internal/apm/settings/custom_links/{id}\" | \"GET /api/apm/sourcemaps\" | \"POST /api/apm/sourcemaps\" | \"DELETE /api/apm/sourcemaps/{id}\" | \"GET /internal/apm/fleet/has_data\" | \"GET /internal/apm/fleet/agents\" | \"POST /api/apm/fleet/apm_server_schema\" | \"GET /internal/apm/fleet/apm_server_schema/unsupported\" | \"GET /internal/apm/fleet/migration_check\" | \"POST /internal/apm/fleet/cloud_apm_package_policy\" | \"GET /internal/apm/backends/top_backends\" | \"GET /internal/apm/backends/upstream_services\" | \"GET /internal/apm/backends/metadata\" | \"GET /internal/apm/backends/charts/latency\" | \"GET /internal/apm/backends/charts/throughput\" | \"GET /internal/apm/backends/charts/error_rate\" | \"POST /internal/apm/correlations/p_values\" | \"GET /internal/apm/correlations/field_candidates\" | \"POST /internal/apm/correlations/field_stats\" | \"GET /internal/apm/correlations/field_value_stats\" | \"POST /internal/apm/correlations/field_value_pairs\" | \"POST /internal/apm/correlations/significant_correlations\" | \"GET /internal/apm/fallback_to_transactions\" | \"GET /internal/apm/has_data\" | \"GET /internal/apm/event_metadata/{processorEvent}/{id}\" | \"GET /internal/apm/agent_keys\" | \"GET /internal/apm/agent_keys/privileges\" | \"POST /internal/apm/api_key/invalidate\" | \"POST /api/apm/agent_keys\"" + "\"POST /internal/apm/data_view/static\" | \"GET /internal/apm/data_view/dynamic\" | \"GET /internal/apm/environments\" | \"GET /internal/apm/services/{serviceName}/errors/groups/main_statistics\" | \"GET /internal/apm/services/{serviceName}/errors/groups/detailed_statistics\" | \"GET /internal/apm/services/{serviceName}/errors/{groupId}\" | \"GET /internal/apm/services/{serviceName}/errors/distribution\" | \"POST /internal/apm/latency/overall_distribution\" | \"GET /internal/apm/services/{serviceName}/metrics/charts\" | \"GET /internal/apm/observability_overview\" | \"GET /internal/apm/observability_overview/has_data\" | \"GET /internal/apm/ux/client-metrics\" | \"GET /internal/apm/ux/page-load-distribution\" | \"GET /internal/apm/ux/page-load-distribution/breakdown\" | \"GET /internal/apm/ux/page-view-trends\" | \"GET /internal/apm/ux/services\" | \"GET /internal/apm/ux/visitor-breakdown\" | \"GET /internal/apm/ux/web-core-vitals\" | \"GET /internal/apm/ux/long-task-metrics\" | \"GET /internal/apm/ux/url-search\" | \"GET /internal/apm/ux/js-errors\" | \"GET /api/apm/observability_overview/has_rum_data\" | \"GET /internal/apm/service-map\" | \"GET /internal/apm/service-map/service/{serviceName}\" | \"GET /internal/apm/service-map/backend\" | \"GET /internal/apm/services/{serviceName}/serviceNodes\" | \"GET /internal/apm/services\" | \"GET /internal/apm/services/detailed_statistics\" | \"GET /internal/apm/services/{serviceName}/metadata/details\" | \"GET /internal/apm/services/{serviceName}/metadata/icons\" | \"GET /internal/apm/services/{serviceName}/agent\" | \"GET /internal/apm/services/{serviceName}/transaction_types\" | \"GET /internal/apm/services/{serviceName}/node/{serviceNodeName}/metadata\" | \"GET /api/apm/services/{serviceName}/annotation/search\" | \"POST /api/apm/services/{serviceName}/annotation\" | \"GET /internal/apm/services/{serviceName}/service_overview_instances/details/{serviceNodeName}\" | \"GET /internal/apm/services/{serviceName}/throughput\" | \"GET /internal/apm/services/{serviceName}/service_overview_instances/main_statistics\" | \"GET /internal/apm/services/{serviceName}/service_overview_instances/detailed_statistics\" | \"GET /internal/apm/services/{serviceName}/dependencies\" | \"GET /internal/apm/services/{serviceName}/dependencies/breakdown\" | \"GET /internal/apm/services/{serviceName}/profiling/timeline\" | \"GET /internal/apm/services/{serviceName}/profiling/statistics\" | \"GET /internal/apm/services/{serviceName}/alerts\" | \"GET /internal/apm/services/{serviceName}/infrastructure\" | \"GET /internal/apm/services/{serviceName}/anomaly_charts\" | \"GET /internal/apm/suggestions\" | \"GET /internal/apm/traces/{traceId}\" | \"GET /internal/apm/traces\" | \"GET /internal/apm/traces/{traceId}/root_transaction\" | \"GET /internal/apm/transactions/{transactionId}\" | \"GET /internal/apm/services/{serviceName}/transactions/groups/main_statistics\" | \"GET /internal/apm/services/{serviceName}/transactions/groups/detailed_statistics\" | \"GET /internal/apm/services/{serviceName}/transactions/charts/latency\" | \"GET /internal/apm/services/{serviceName}/transactions/traces/samples\" | \"GET /internal/apm/services/{serviceName}/transaction/charts/breakdown\" | \"GET /internal/apm/services/{serviceName}/transactions/charts/error_rate\" | \"GET /internal/apm/services/{serviceName}/transactions/charts/coldstart_rate\" | \"GET /internal/apm/services/{serviceName}/transactions/charts/coldstart_rate_by_transaction_name\" | \"GET /internal/apm/alerts/chart_preview/transaction_error_rate\" | \"GET /internal/apm/alerts/chart_preview/transaction_duration\" | \"GET /internal/apm/alerts/chart_preview/transaction_error_count\" | \"GET /api/apm/settings/agent-configuration\" | \"GET /api/apm/settings/agent-configuration/view\" | \"DELETE /api/apm/settings/agent-configuration\" | \"PUT /api/apm/settings/agent-configuration\" | \"POST /api/apm/settings/agent-configuration/search\" | \"GET /api/apm/settings/agent-configuration/services\" | \"GET /api/apm/settings/agent-configuration/environments\" | \"GET /api/apm/settings/agent-configuration/agent_name\" | \"GET /internal/apm/settings/anomaly-detection/jobs\" | \"POST /internal/apm/settings/anomaly-detection/jobs\" | \"GET /internal/apm/settings/anomaly-detection/environments\" | \"POST /internal/apm/settings/anomaly-detection/update_to_v3\" | \"GET /internal/apm/settings/apm-index-settings\" | \"GET /internal/apm/settings/apm-indices\" | \"POST /internal/apm/settings/apm-indices/save\" | \"GET /internal/apm/settings/custom_links/transaction\" | \"GET /internal/apm/settings/custom_links\" | \"POST /internal/apm/settings/custom_links\" | \"PUT /internal/apm/settings/custom_links/{id}\" | \"DELETE /internal/apm/settings/custom_links/{id}\" | \"GET /api/apm/sourcemaps\" | \"POST /api/apm/sourcemaps\" | \"DELETE /api/apm/sourcemaps/{id}\" | \"GET /internal/apm/fleet/has_apm_policies\" | \"GET /internal/apm/fleet/agents\" | \"POST /api/apm/fleet/apm_server_schema\" | \"GET /internal/apm/fleet/apm_server_schema/unsupported\" | \"GET /internal/apm/fleet/migration_check\" | \"POST /internal/apm/fleet/cloud_apm_package_policy\" | \"GET /internal/apm/backends/top_backends\" | \"GET /internal/apm/backends/upstream_services\" | \"GET /internal/apm/backends/metadata\" | \"GET /internal/apm/backends/charts/latency\" | \"GET /internal/apm/backends/charts/throughput\" | \"GET /internal/apm/backends/charts/error_rate\" | \"POST /internal/apm/correlations/p_values\" | \"GET /internal/apm/correlations/field_candidates\" | \"POST /internal/apm/correlations/field_stats\" | \"GET /internal/apm/correlations/field_value_stats\" | \"POST /internal/apm/correlations/field_value_pairs\" | \"POST /internal/apm/correlations/significant_correlations\" | \"GET /internal/apm/fallback_to_transactions\" | \"GET /internal/apm/has_data\" | \"GET /internal/apm/event_metadata/{processorEvent}/{id}\" | \"GET /internal/apm/agent_keys\" | \"GET /internal/apm/agent_keys/privileges\" | \"POST /internal/apm/api_key/invalidate\" | \"POST /api/apm/agent_keys\"" ], "path": "x-pack/plugins/apm/server/routes/apm_routes/get_global_apm_server_route_repository.ts", "deprecated": false, @@ -1695,9 +1695,9 @@ }, ", { cloudStandaloneSetup: { apmServerUrl: string | undefined; secretToken: string | undefined; } | undefined; fleetAgents: never[]; isFleetEnabled: false; } | { cloudStandaloneSetup: { apmServerUrl: string | undefined; secretToken: string | undefined; } | undefined; isFleetEnabled: true; fleetAgents: { id: string; name: string; apmServerUrl: any; secretToken: any; }[]; }, ", "APMRouteCreateOptions", - ">; \"GET /internal/apm/fleet/has_data\": ", + ">; \"GET /internal/apm/fleet/has_apm_policies\": ", "ServerRoute", - "<\"GET /internal/apm/fleet/has_data\", undefined, ", + "<\"GET /internal/apm/fleet/has_apm_policies\", undefined, ", { "pluginId": "apm", "scope": "server", @@ -1705,7 +1705,7 @@ "section": "def-server.APMRouteHandlerResources", "text": "APMRouteHandlerResources" }, - ", { hasData: boolean; }, ", + ", { hasApmPolicies: boolean; }, ", "APMRouteCreateOptions", ">; \"DELETE /api/apm/sourcemaps/{id}\": ", "ServerRoute", @@ -4001,7 +4001,7 @@ "AgentName", "; } & { serviceName: string; healthStatus: ", "ServiceHealthStatus", - "; }>; hasLegacyData: boolean; }, ", + "; }>; }, ", "APMRouteCreateOptions", ">; \"GET /internal/apm/services/{serviceName}/serviceNodes\": ", "ServerRoute", diff --git a/api_docs/apm.mdx b/api_docs/apm.mdx index 4c215e864b0a8..8364b357d677b 100644 --- a/api_docs/apm.mdx +++ b/api_docs/apm.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/apm title: "apm" image: https://source.unsplash.com/400x175/?github summary: API docs for the apm plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apm'] warning: 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. --- diff --git a/api_docs/banners.mdx b/api_docs/banners.mdx index 08f3a09434e5a..570db3e540d9f 100644 --- a/api_docs/banners.mdx +++ b/api_docs/banners.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/banners title: "banners" image: https://source.unsplash.com/400x175/?github summary: API docs for the banners plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'banners'] warning: 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. --- diff --git a/api_docs/bfetch.mdx b/api_docs/bfetch.mdx index 9fcae4a691d20..bd5a3577bb43a 100644 --- a/api_docs/bfetch.mdx +++ b/api_docs/bfetch.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/bfetch title: "bfetch" image: https://source.unsplash.com/400x175/?github summary: API docs for the bfetch plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'bfetch'] warning: 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. --- diff --git a/api_docs/canvas.mdx b/api_docs/canvas.mdx index 47217436fe639..e7c2d60908ea4 100644 --- a/api_docs/canvas.mdx +++ b/api_docs/canvas.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/canvas title: "canvas" image: https://source.unsplash.com/400x175/?github summary: API docs for the canvas plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'canvas'] warning: 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. --- diff --git a/api_docs/cases.devdocs.json b/api_docs/cases.devdocs.json index a9887264af299..bd34b6f2b0334 100644 --- a/api_docs/cases.devdocs.json +++ b/api_docs/cases.devdocs.json @@ -444,6 +444,35 @@ "interfaces": [], "enums": [], "misc": [ + { + "parentPluginId": "cases", + "id": "def-public.CaseAttachments", + "type": "Type", + "tags": [], + "label": "CaseAttachments", + "description": [], + "signature": [ + "SupportedCaseAttachment", + "[]" + ], + "path": "x-pack/plugins/cases/public/types.ts", + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "cases", + "id": "def-public.DRAFT_COMMENT_STORAGE_ID", + "type": "string", + "tags": [], + "label": "DRAFT_COMMENT_STORAGE_ID", + "description": [], + "signature": [ + "\"xpack.cases.commentDraft\"" + ], + "path": "x-pack/plugins/cases/public/components/markdown_editor/plugins/lens/constants.ts", + "deprecated": false, + "initialIsOpen": false + }, { "parentPluginId": "cases", "id": "def-public.GetAllCasesSelectorModalProps", @@ -646,6 +675,25 @@ ], "returnComment": [] }, + { + "parentPluginId": "cases", + "id": "def-public.CasesUiStart.getCasesContext", + "type": "Function", + "tags": [], + "label": "getCasesContext", + "description": [], + "signature": [ + "() => (props: ", + "CasesContextProps", + " & { children: React.ReactNode; }) => React.ReactElement<", + "CasesContextProps", + ", string | React.JSXElementConstructor>" + ], + "path": "x-pack/plugins/cases/public/types.ts", + "deprecated": false, + "children": [], + "returnComment": [] + }, { "parentPluginId": "cases", "id": "def-public.CasesUiStart.getAllCasesSelectorModal", @@ -704,6 +752,58 @@ "A react component that is a modal for selecting a case" ] }, + { + "parentPluginId": "cases", + "id": "def-public.CasesUiStart.getAllCasesSelectorModalNoProvider", + "type": "Function", + "tags": [], + "label": "getAllCasesSelectorModalNoProvider", + "description": [], + "signature": [ + "(props: ", + { + "pluginId": "cases", + "scope": "public", + "docId": "kibCasesPluginApi", + "section": "def-public.GetAllCasesSelectorModalProps", + "text": "GetAllCasesSelectorModalProps" + }, + ") => React.ReactElement<", + { + "pluginId": "cases", + "scope": "public", + "docId": "kibCasesPluginApi", + "section": "def-public.GetAllCasesSelectorModalProps", + "text": "GetAllCasesSelectorModalProps" + }, + ", string | React.JSXElementConstructor>" + ], + "path": "x-pack/plugins/cases/public/types.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "cases", + "id": "def-public.CasesUiStart.getAllCasesSelectorModalNoProvider.$1", + "type": "CompoundType", + "tags": [], + "label": "props", + "description": [], + "signature": [ + { + "pluginId": "cases", + "scope": "public", + "docId": "kibCasesPluginApi", + "section": "def-public.GetAllCasesSelectorModalProps", + "text": "GetAllCasesSelectorModalProps" + } + ], + "path": "x-pack/plugins/cases/public/types.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, { "parentPluginId": "cases", "id": "def-public.CasesUiStart.getCreateCaseFlyout", @@ -762,6 +862,40 @@ "A react component that is a flyout for creating a case" ] }, + { + "parentPluginId": "cases", + "id": "def-public.CasesUiStart.getCreateCaseFlyoutNoProvider", + "type": "Function", + "tags": [], + "label": "getCreateCaseFlyoutNoProvider", + "description": [], + "signature": [ + "(props: ", + "CreateCaseFlyoutProps", + ") => React.ReactElement<", + "CreateCaseFlyoutProps", + ", string | React.JSXElementConstructor>" + ], + "path": "x-pack/plugins/cases/public/types.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "cases", + "id": "def-public.CasesUiStart.getCreateCaseFlyoutNoProvider.$1", + "type": "Object", + "tags": [], + "label": "props", + "description": [], + "signature": [ + "CreateCaseFlyoutProps" + ], + "path": "x-pack/plugins/cases/public/types.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, { "parentPluginId": "cases", "id": "def-public.CasesUiStart.getRecentCases", @@ -819,6 +953,23 @@ "returnComment": [ "A react component for showing recent cases" ] + }, + { + "parentPluginId": "cases", + "id": "def-public.CasesUiStart.hooks", + "type": "Object", + "tags": [], + "label": "hooks", + "description": [], + "signature": [ + "{ getUseCasesAddToNewCaseFlyout: (props: ", + "CreateCaseFlyoutProps", + ") => { open: () => void; close: () => void; }; getUseCasesAddToExistingCaseModal: (props: ", + "AllCasesSelectorModalProps", + ") => { open: () => void; close: () => void; }; }" + ], + "path": "x-pack/plugins/cases/public/types.ts", + "deprecated": false } ], "lifecycle": "start", diff --git a/api_docs/cases.mdx b/api_docs/cases.mdx index 1e07e40d42adb..fd7fb30d09bab 100644 --- a/api_docs/cases.mdx +++ b/api_docs/cases.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/cases title: "cases" image: https://source.unsplash.com/400x175/?github summary: API docs for the cases plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cases'] warning: 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. --- @@ -18,7 +18,7 @@ Contact [ResponseOps](https://github.com/orgs/elastic/teams/response-ops) for qu | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 74 | 0 | 51 | 19 | +| 82 | 0 | 59 | 20 | ## Client diff --git a/api_docs/charts.devdocs.json b/api_docs/charts.devdocs.json index eac5adfc1c61a..6acc863cb7a24 100644 --- a/api_docs/charts.devdocs.json +++ b/api_docs/charts.devdocs.json @@ -108,9 +108,9 @@ "label": "EmptyPlaceholder", "description": [], "signature": [ - "({ icon, message, }: { icon: ", + "({ icon, iconColor, message, dataTestSubj, }: { icon: ", "IconType", - "; message?: JSX.Element | undefined; }) => JSX.Element" + "; iconColor?: string | undefined; message?: JSX.Element | undefined; dataTestSubj?: string | undefined; }) => JSX.Element" ], "path": "src/plugins/charts/public/static/components/empty_placeholder.tsx", "deprecated": false, @@ -120,7 +120,7 @@ "id": "def-public.EmptyPlaceholder.$1", "type": "Object", "tags": [], - "label": "{\n icon,\n message = ,\n}", + "label": "{\n icon,\n iconColor = 'subdued',\n message = ,\n dataTestSubj = 'emptyPlaceholder',\n}", "description": [], "path": "src/plugins/charts/public/static/components/empty_placeholder.tsx", "deprecated": false, @@ -138,6 +138,19 @@ "path": "src/plugins/charts/public/static/components/empty_placeholder.tsx", "deprecated": false }, + { + "parentPluginId": "charts", + "id": "def-public.EmptyPlaceholder.$1.iconColor", + "type": "string", + "tags": [], + "label": "iconColor", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "src/plugins/charts/public/static/components/empty_placeholder.tsx", + "deprecated": false + }, { "parentPluginId": "charts", "id": "def-public.EmptyPlaceholder.$1.message", @@ -150,6 +163,19 @@ ], "path": "src/plugins/charts/public/static/components/empty_placeholder.tsx", "deprecated": false + }, + { + "parentPluginId": "charts", + "id": "def-public.EmptyPlaceholder.$1.dataTestSubj", + "type": "string", + "tags": [], + "label": "dataTestSubj", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "src/plugins/charts/public/static/components/empty_placeholder.tsx", + "deprecated": false } ] } diff --git a/api_docs/charts.mdx b/api_docs/charts.mdx index 3cbb943b1bba0..5eda2bcb2295a 100644 --- a/api_docs/charts.mdx +++ b/api_docs/charts.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/charts title: "charts" image: https://source.unsplash.com/400x175/?github summary: API docs for the charts plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'charts'] warning: 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. --- @@ -18,7 +18,7 @@ Contact [Vis Editors](https://github.com/orgs/elastic/teams/kibana-vis-editors) | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 319 | 2 | 286 | 4 | +| 321 | 2 | 288 | 4 | ## Client diff --git a/api_docs/cloud.mdx b/api_docs/cloud.mdx index 3924d4cbe40e8..12472f322c464 100644 --- a/api_docs/cloud.mdx +++ b/api_docs/cloud.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/cloud title: "cloud" image: https://source.unsplash.com/400x175/?github summary: API docs for the cloud plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloud'] warning: 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. --- diff --git a/api_docs/console.mdx b/api_docs/console.mdx index cddd0dac25d1e..e19e9db1fabbc 100644 --- a/api_docs/console.mdx +++ b/api_docs/console.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/console title: "console" image: https://source.unsplash.com/400x175/?github summary: API docs for the console plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'console'] warning: 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. --- diff --git a/api_docs/controls.mdx b/api_docs/controls.mdx index 1807e789987fd..d031009861ead 100644 --- a/api_docs/controls.mdx +++ b/api_docs/controls.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/controls title: "controls" image: https://source.unsplash.com/400x175/?github summary: API docs for the controls plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'controls'] warning: 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. --- diff --git a/api_docs/core.devdocs.json b/api_docs/core.devdocs.json index 8903cc844a4c3..9e4d8681b8ef7 100644 --- a/api_docs/core.devdocs.json +++ b/api_docs/core.devdocs.json @@ -1686,9 +1686,6 @@ "tags": [], "label": "EnvironmentMode", "description": [], - "signature": [ - "EnvironmentMode" - ], "path": "node_modules/@types/kbn__config/index.d.ts", "deprecated": false, "children": [ @@ -3989,9 +3986,6 @@ "tags": [], "label": "PackageInfo", "description": [], - "signature": [ - "PackageInfo" - ], "path": "node_modules/@types/kbn__config/index.d.ts", "deprecated": false, "children": [ @@ -6332,9 +6326,7 @@ "\nMetric to track once this property changes" ], "signature": [ - "{ type: ", - "UiCounterMetricType", - "; name: string; } | undefined" + "{ type: string; name: string; } | undefined" ], "path": "src/core/types/ui_settings.ts", "deprecated": true, @@ -6646,7 +6638,7 @@ "label": "KibanaExecutionContext", "description": [], "signature": [ - "{ readonly type: string; readonly name: string; readonly id: string; readonly description: string; readonly url?: string | undefined; parent?: ", + "{ readonly type: string; readonly name: string; readonly id: string; readonly description?: string | undefined; readonly url?: string | undefined; child?: ", "KibanaExecutionContext", " | undefined; }" ], @@ -6788,9 +6780,7 @@ "UiSettingsType", " | undefined; description?: string | undefined; name?: string | undefined; options?: string[] | undefined; order?: number | undefined; value?: unknown; category?: string[] | undefined; optionLabels?: Record | undefined; requiresPageReload?: boolean | undefined; readonly?: boolean | undefined; sensitive?: boolean | undefined; deprecation?: ", "DeprecationSettings", - " | undefined; metric?: { type: ", - "UiCounterMetricType", - "; name: string; } | undefined; }" + " | undefined; metric?: { type: string; name: string; } | undefined; }" ], "path": "src/core/types/ui_settings.ts", "deprecated": false, @@ -8031,14 +8021,6 @@ "path": "src/core/server/plugins/types.ts", "deprecated": true, "references": [ - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/plugin.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/plugin.ts" - }, { "plugin": "fleet", "path": "x-pack/plugins/fleet/target/types/server/plugin.d.ts" @@ -8582,9 +8564,6 @@ "description": [ "\r\nDeprecation context provided to {@link ConfigDeprecation | config deprecations}\r\n" ], - "signature": [ - "ConfigDeprecationContext" - ], "path": "node_modules/@types/kbn__config/index.d.ts", "deprecated": false, "children": [ @@ -8677,9 +8656,6 @@ "description": [ "\r\nProvides helpers to generates the most commonly used {@link ConfigDeprecation}\r\nwhen invoking a {@link ConfigDeprecationProvider}.\r\n\r\nSee methods documentation for more detailed examples.\r\n" ], - "signature": [ - "ConfigDeprecationFactory" - ], "path": "node_modules/@types/kbn__config/index.d.ts", "deprecated": false, "children": [ @@ -10599,9 +10575,6 @@ "tags": [], "label": "EnvironmentMode", "description": [], - "signature": [ - "EnvironmentMode" - ], "path": "node_modules/@types/kbn__config/index.d.ts", "deprecated": false, "children": [ @@ -11703,731 +11676,1907 @@ { "parentPluginId": "core", "id": "def-server.IClusterClient.asInternalUser", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "asInternalUser", "description": [ "\nA {@link ElasticsearchClient | client} to be used to query the ES cluster on behalf of the Kibana internal user" ], "signature": [ - "Omit<", - "KibanaClient", - ", \"extend\" | \"connectionPool\" | \"transport\" | \"serializer\" | \"child\" | \"close\" | \"diagnostic\"> & { transport: { request(params: ", - "TransportRequestParams", + "{ eql: ", + "default", + "; search: { >(this: That, params?: ", + "SearchRequest", + " | ", + "SearchRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "SearchResponse", + ">; >(this: That, params?: ", + "SearchRequest", + " | ", + "SearchRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "SearchResponse", + ", unknown>>; >(this: That, params?: ", + "SearchRequest", + " | ", + "SearchRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "SearchResponse", + ">; }; create: { (this: That, params: ", + "CreateRequest", + " | ", + "CreateRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "CreateResponse", + ">; (this: That, params: ", + "CreateRequest", + " | ", + "CreateRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "CreateResponse", + ", unknown>>; (this: That, params: ", + "CreateRequest", + " | ", + "CreateRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "CreateResponse", + ">; }; monitoring: ", + "default", + "; security: ", + "default", + "; name: string | symbol; index: { (this: That, params: ", + "IndexRequest", + " | ", + "IndexRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "IndexResponse", + ">; (this: That, params: ", + "IndexRequest", + " | ", + "IndexRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "IndexResponse", + ", unknown>>; (this: That, params: ", + "IndexRequest", + " | ", + "IndexRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "IndexResponse", + ">; }; delete: { (this: That, params: ", + "DeleteRequest", + " | ", + "DeleteRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "DeleteResponse", + ">; (this: That, params: ", + "DeleteRequest", + " | ", + "DeleteRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "DeleteResponse", + ", unknown>>; (this: That, params: ", + "DeleteRequest", + " | ", + "DeleteRequest", ", options?: ", "TransportRequestOptions", " | undefined): Promise<", + "DeleteResponse", + ">; }; get: { (this: That, params: ", + "GetRequest", + " | ", + "GetRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetResponse", + ">; (this: That, params: ", + "GetRequest", + " | ", + "GetRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", - ">; }; }" - ], - "path": "src/core/server/elasticsearch/client/cluster_client.ts", - "deprecated": false - }, - { - "parentPluginId": "core", - "id": "def-server.IClusterClient.asScoped", - "type": "Function", - "tags": [], - "label": "asScoped", - "description": [ - "\nCreates a {@link IScopedClusterClient | scoped cluster client} bound to given {@link ScopeableRequest | request}" - ], - "signature": [ - "(request: ", - { - "pluginId": "core", - "scope": "server", - "docId": "kibCorePluginApi", - "section": "def-server.ScopeableRequest", - "text": "ScopeableRequest" - }, - ") => ", - { - "pluginId": "core", - "scope": "server", - "docId": "kibCorePluginApi", - "section": "def-server.IScopedClusterClient", - "text": "IScopedClusterClient" - } - ], - "path": "src/core/server/elasticsearch/client/cluster_client.ts", - "deprecated": false, - "children": [ - { - "parentPluginId": "core", - "id": "def-server.IClusterClient.asScoped.$1", - "type": "CompoundType", - "tags": [], - "label": "request", - "description": [], - "signature": [ - { - "pluginId": "core", - "scope": "server", - "docId": "kibCorePluginApi", - "section": "def-server.ScopeableRequest", - "text": "ScopeableRequest" - } - ], - "path": "src/core/server/elasticsearch/client/cluster_client.ts", - "deprecated": false, - "isRequired": true - } - ], - "returnComment": [] - } - ], - "initialIsOpen": false - }, - { - "parentPluginId": "core", - "id": "def-server.IContextContainer", - "type": "Interface", - "tags": [], - "label": "IContextContainer", - "description": [ - "\nAn object that handles registration of context providers and configuring handlers with context.\n" - ], - "path": "src/core/server/context/container/context.ts", - "deprecated": false, - "children": [ - { - "parentPluginId": "core", - "id": "def-server.IContextContainer.registerContext", - "type": "Function", - "tags": [], - "label": "registerContext", - "description": [ - "\nRegister a new context provider.\n" - ], - "signature": [ - "(pluginOpaqueId: symbol, contextName: ContextName, provider: ", - { - "pluginId": "core", - "scope": "server", - "docId": "kibCorePluginApi", - "section": "def-server.IContextProvider", - "text": "IContextProvider" - }, - ") => this" - ], - "path": "src/core/server/context/container/context.ts", - "deprecated": false, - "children": [ - { - "parentPluginId": "core", - "id": "def-server.IContextContainer.registerContext.$1", - "type": "Uncategorized", - "tags": [], - "label": "pluginOpaqueId", - "description": [ - "- The plugin opaque ID for the plugin that registers this context." - ], - "signature": [ - "symbol" - ], - "path": "src/core/server/context/container/context.ts", - "deprecated": false, - "isRequired": true - }, - { - "parentPluginId": "core", - "id": "def-server.IContextContainer.registerContext.$2", - "type": "Uncategorized", - "tags": [], - "label": "contextName", - "description": [ - "- The key of the `TContext` object this provider supplies the value for." - ], - "signature": [ - "ContextName" - ], - "path": "src/core/server/context/container/context.ts", - "deprecated": false, - "isRequired": true - }, - { - "parentPluginId": "core", - "id": "def-server.IContextContainer.registerContext.$3", - "type": "Function", - "tags": [], - "label": "provider", - "description": [ - "- A {@link IContextProvider } to be called each time a new context is created." - ], - "signature": [ - { - "pluginId": "core", - "scope": "server", - "docId": "kibCorePluginApi", - "section": "def-server.IContextProvider", - "text": "IContextProvider" - }, - "" - ], - "path": "src/core/server/context/container/context.ts", - "deprecated": false, - "isRequired": true - } - ], - "returnComment": [ - "The {@link IContextContainer } for method chaining." - ] - }, - { - "parentPluginId": "core", - "id": "def-server.IContextContainer.createHandler", - "type": "Function", - "tags": [], - "label": "createHandler", - "description": [ - "\nCreate a new handler function pre-wired to context for the plugin.\n" - ], - "signature": [ - "(pluginOpaqueId: symbol, handler: ", - { - "pluginId": "core", - "scope": "server", - "docId": "kibCoreHttpPluginApi", - "section": "def-server.RequestHandler", - "text": "RequestHandler" - }, - " | Error | { message: string | Error; attributes?: ", - { - "pluginId": "core", - "scope": "server", - "docId": "kibCoreHttpPluginApi", - "section": "def-server.ResponseErrorAttributes", - "text": "ResponseErrorAttributes" - }, - " | undefined; } | Buffer | ", - "Stream", - " | undefined>(options: ", - { - "pluginId": "core", - "scope": "server", - "docId": "kibCoreHttpPluginApi", - "section": "def-server.CustomHttpResponseOptions", - "text": "CustomHttpResponseOptions" - }, - ") => ", - "KibanaResponse", - "; badRequest: (options?: ", - { - "pluginId": "core", - "scope": "server", - "docId": "kibCoreHttpPluginApi", - "section": "def-server.ErrorHttpResponseOptions", - "text": "ErrorHttpResponseOptions" - }, - ") => ", - "KibanaResponse", - "; unauthorized: (options?: ", - { - "pluginId": "core", - "scope": "server", - "docId": "kibCoreHttpPluginApi", - "section": "def-server.ErrorHttpResponseOptions", - "text": "ErrorHttpResponseOptions" - }, - ") => ", - "KibanaResponse", - "; forbidden: (options?: ", - { - "pluginId": "core", - "scope": "server", - "docId": "kibCoreHttpPluginApi", - "section": "def-server.ErrorHttpResponseOptions", - "text": "ErrorHttpResponseOptions" - }, - ") => ", - "KibanaResponse", - "; notFound: (options?: ", - { - "pluginId": "core", - "scope": "server", - "docId": "kibCoreHttpPluginApi", - "section": "def-server.ErrorHttpResponseOptions", - "text": "ErrorHttpResponseOptions" - }, - ") => ", - "KibanaResponse", - "; conflict: (options?: ", - { - "pluginId": "core", - "scope": "server", - "docId": "kibCoreHttpPluginApi", - "section": "def-server.ErrorHttpResponseOptions", - "text": "ErrorHttpResponseOptions" - }, - ") => ", - "KibanaResponse", - "; customError: (options: ", - { - "pluginId": "core", - "scope": "server", - "docId": "kibCoreHttpPluginApi", - "section": "def-server.CustomHttpResponseOptions", - "text": "CustomHttpResponseOptions" - }, "<", - { - "pluginId": "core", - "scope": "server", - "docId": "kibCoreHttpPluginApi", - "section": "def-server.ResponseError", - "text": "ResponseError" - }, - ">) => ", - "KibanaResponse", - "; redirected: (options: ", - { - "pluginId": "core", - "scope": "server", - "docId": "kibCoreHttpPluginApi", - "section": "def-server.RedirectResponseOptions", - "text": "RedirectResponseOptions" - }, - ") => ", - "KibanaResponse", - " | Buffer | ", - "Stream", - ">; ok: (options?: ", - { - "pluginId": "core", - "scope": "server", - "docId": "kibCoreHttpPluginApi", - "section": "def-server.HttpResponseOptions", - "text": "HttpResponseOptions" - }, - ") => ", - "KibanaResponse", - " | Buffer | ", - "Stream", - ">; accepted: (options?: ", - { - "pluginId": "core", - "scope": "server", - "docId": "kibCoreHttpPluginApi", - "section": "def-server.HttpResponseOptions", - "text": "HttpResponseOptions" - }, - ") => ", - "KibanaResponse", - " | Buffer | ", - "Stream", - ">; noContent: (options?: ", - { - "pluginId": "core", - "scope": "server", - "docId": "kibCoreHttpPluginApi", - "section": "def-server.HttpResponseOptions", - "text": "HttpResponseOptions" - }, - ") => ", - "KibanaResponse", - "; }>) => (request: ", - { - "pluginId": "core", - "scope": "server", - "docId": "kibCoreHttpPluginApi", - "section": "def-server.KibanaRequest", - "text": "KibanaRequest" - }, - ", response: { custom: | Error | { message: string | Error; attributes?: ", - { - "pluginId": "core", - "scope": "server", - "docId": "kibCoreHttpPluginApi", - "section": "def-server.ResponseErrorAttributes", - "text": "ResponseErrorAttributes" - }, - " | undefined; } | Buffer | ", - "Stream", - " | undefined>(options: ", - { - "pluginId": "core", - "scope": "server", - "docId": "kibCoreHttpPluginApi", - "section": "def-server.CustomHttpResponseOptions", - "text": "CustomHttpResponseOptions" - }, - ") => ", - "KibanaResponse", - "; badRequest: (options?: ", - { - "pluginId": "core", - "scope": "server", - "docId": "kibCoreHttpPluginApi", - "section": "def-server.ErrorHttpResponseOptions", - "text": "ErrorHttpResponseOptions" - }, - ") => ", - "KibanaResponse", - "; unauthorized: (options?: ", - { - "pluginId": "core", - "scope": "server", - "docId": "kibCoreHttpPluginApi", - "section": "def-server.ErrorHttpResponseOptions", - "text": "ErrorHttpResponseOptions" - }, - ") => ", - "KibanaResponse", - "; forbidden: (options?: ", - { - "pluginId": "core", - "scope": "server", - "docId": "kibCoreHttpPluginApi", - "section": "def-server.ErrorHttpResponseOptions", - "text": "ErrorHttpResponseOptions" - }, - ") => ", - "KibanaResponse", - "; notFound: (options?: ", - { - "pluginId": "core", - "scope": "server", - "docId": "kibCoreHttpPluginApi", - "section": "def-server.ErrorHttpResponseOptions", - "text": "ErrorHttpResponseOptions" - }, - ") => ", - "KibanaResponse", - "; conflict: (options?: ", - { - "pluginId": "core", - "scope": "server", - "docId": "kibCoreHttpPluginApi", - "section": "def-server.ErrorHttpResponseOptions", - "text": "ErrorHttpResponseOptions" - }, - ") => ", - "KibanaResponse", - "; customError: (options: ", - { - "pluginId": "core", - "scope": "server", - "docId": "kibCoreHttpPluginApi", - "section": "def-server.CustomHttpResponseOptions", - "text": "CustomHttpResponseOptions" - }, + "GetResponse", + ", unknown>>; (this: That, params: ", + "GetRequest", + " | ", + "GetRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "GetResponse", + ">; }; update: { (this: That, params: ", + "UpdateRequest", + " | ", + "UpdateRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "UpdateResponse", + ">; (this: That, params: ", + "UpdateRequest", + " | ", + "UpdateRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", "<", - { - "pluginId": "core", - "scope": "server", - "docId": "kibCoreHttpPluginApi", - "section": "def-server.ResponseError", - "text": "ResponseError" - }, - ">) => ", - "KibanaResponse", - "; redirected: (options: ", - { - "pluginId": "core", - "scope": "server", - "docId": "kibCoreHttpPluginApi", - "section": "def-server.RedirectResponseOptions", - "text": "RedirectResponseOptions" - }, - ") => ", - "KibanaResponse", - " | Buffer | ", - "Stream", - ">; ok: (options?: ", - { - "pluginId": "core", - "scope": "server", - "docId": "kibCoreHttpPluginApi", - "section": "def-server.HttpResponseOptions", - "text": "HttpResponseOptions" - }, - ") => ", - "KibanaResponse", - " | Buffer | ", - "Stream", - ">; accepted: (options?: ", - { - "pluginId": "core", - "scope": "server", - "docId": "kibCoreHttpPluginApi", - "section": "def-server.HttpResponseOptions", - "text": "HttpResponseOptions" - }, - ") => ", - "KibanaResponse", - " | Buffer | ", - "Stream", - ">; noContent: (options?: ", - { - "pluginId": "core", - "scope": "server", - "docId": "kibCoreHttpPluginApi", - "section": "def-server.HttpResponseOptions", - "text": "HttpResponseOptions" - }, - ") => ", - "KibanaResponse", - "; }) => Promise<", - { - "pluginId": "core", - "scope": "server", - "docId": "kibCoreHttpPluginApi", - "section": "def-server.IKibanaResponse", - "text": "IKibanaResponse" - }, - ">" - ], - "path": "src/core/server/context/container/context.ts", - "deprecated": false, - "children": [ - { - "parentPluginId": "core", - "id": "def-server.IContextContainer.createHandler.$1", - "type": "Uncategorized", - "tags": [], - "label": "pluginOpaqueId", - "description": [ - "- The plugin opaque ID for the plugin that registers this handler." - ], - "signature": [ - "symbol" - ], - "path": "src/core/server/context/container/context.ts", - "deprecated": false, - "isRequired": true - }, - { - "parentPluginId": "core", - "id": "def-server.IContextContainer.createHandler.$2", - "type": "Function", - "tags": [], - "label": "handler", - "description": [ - "- Handler function to pass context object to." - ], - "signature": [ - { - "pluginId": "core", - "scope": "server", - "docId": "kibCoreHttpPluginApi", - "section": "def-server.RequestHandler", - "text": "RequestHandler" - }, - " | Error | { message: string | Error; attributes?: ", - { - "pluginId": "core", - "scope": "server", - "docId": "kibCoreHttpPluginApi", - "section": "def-server.ResponseErrorAttributes", - "text": "ResponseErrorAttributes" - }, - " | undefined; } | Buffer | ", - "Stream", - " | undefined>(options: ", - { - "pluginId": "core", - "scope": "server", - "docId": "kibCoreHttpPluginApi", - "section": "def-server.CustomHttpResponseOptions", - "text": "CustomHttpResponseOptions" - }, - ") => ", - "KibanaResponse", - "; badRequest: (options?: ", - { - "pluginId": "core", - "scope": "server", - "docId": "kibCoreHttpPluginApi", - "section": "def-server.ErrorHttpResponseOptions", - "text": "ErrorHttpResponseOptions" - }, - ") => ", - "KibanaResponse", - "; unauthorized: (options?: ", - { - "pluginId": "core", - "scope": "server", - "docId": "kibCoreHttpPluginApi", - "section": "def-server.ErrorHttpResponseOptions", - "text": "ErrorHttpResponseOptions" - }, - ") => ", - "KibanaResponse", - "; forbidden: (options?: ", - { - "pluginId": "core", - "scope": "server", - "docId": "kibCoreHttpPluginApi", - "section": "def-server.ErrorHttpResponseOptions", - "text": "ErrorHttpResponseOptions" - }, - ") => ", - "KibanaResponse", - "; notFound: (options?: ", - { - "pluginId": "core", - "scope": "server", - "docId": "kibCoreHttpPluginApi", - "section": "def-server.ErrorHttpResponseOptions", - "text": "ErrorHttpResponseOptions" - }, - ") => ", - "KibanaResponse", - "; conflict: (options?: ", - { + "UpdateResponse", + ", unknown>>; (this: That, params: ", + "UpdateRequest", + " | ", + "UpdateRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "UpdateResponse", + ">; }; closePointInTime: { (this: That, params: ", + "ClosePointInTimeRequest", + " | ", + "ClosePointInTimeRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ClosePointInTimeResponse", + ">; (this: That, params: ", + "ClosePointInTimeRequest", + " | ", + "ClosePointInTimeRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ClosePointInTimeResponse", + ", unknown>>; (this: That, params: ", + "ClosePointInTimeRequest", + " | ", + "ClosePointInTimeRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ClosePointInTimeResponse", + ">; }; transform: ", + "default", + "; helpers: ", + "default", + "; [kInternal]: symbol | null; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", + "default", + "; Internal: ", + "default", + "; asyncSearch: ", + "default", + "; autoscaling: ", + "default", + "; bulk: { (this: That, params: ", + "BulkRequest", + " | ", + "BulkRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "BulkResponse", + ">; (this: That, params: ", + "BulkRequest", + " | ", + "BulkRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "BulkResponse", + ", unknown>>; (this: That, params: ", + "BulkRequest", + " | ", + "BulkRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "BulkResponse", + ">; }; cat: ", + "default", + "; ccr: ", + "default", + "; clearScroll: { (this: That, params?: ", + "ClearScrollRequest", + " | ", + "ClearScrollRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ClearScrollResponse", + ">; (this: That, params?: ", + "ClearScrollRequest", + " | ", + "ClearScrollRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ClearScrollResponse", + ", unknown>>; (this: That, params?: ", + "ClearScrollRequest", + " | ", + "ClearScrollRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ClearScrollResponse", + ">; }; cluster: ", + "default", + "; count: { (this: That, params?: ", + "CountRequest", + " | ", + "CountRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "CountResponse", + ">; (this: That, params?: ", + "CountRequest", + " | ", + "CountRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "CountResponse", + ", unknown>>; (this: That, params?: ", + "CountRequest", + " | ", + "CountRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "CountResponse", + ">; }; danglingIndices: ", + "default", + "; deleteByQuery: { (this: That, params: ", + "DeleteByQueryRequest", + " | ", + "DeleteByQueryRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "DeleteByQueryResponse", + ">; (this: That, params: ", + "DeleteByQueryRequest", + " | ", + "DeleteByQueryRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "DeleteByQueryResponse", + ", unknown>>; (this: That, params: ", + "DeleteByQueryRequest", + " | ", + "DeleteByQueryRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "DeleteByQueryResponse", + ">; }; deleteByQueryRethrottle: { (this: That, params: ", + "DeleteByQueryRethrottleRequest", + " | ", + "DeleteByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "DeleteByQueryRethrottleResponse", + ">; (this: That, params: ", + "DeleteByQueryRethrottleRequest", + " | ", + "DeleteByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "DeleteByQueryRethrottleResponse", + ", unknown>>; (this: That, params: ", + "DeleteByQueryRethrottleRequest", + " | ", + "DeleteByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "DeleteByQueryRethrottleResponse", + ">; }; deleteScript: { (this: That, params: ", + "DeleteScriptRequest", + " | ", + "DeleteScriptRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "DeleteScriptResponse", + ">; (this: That, params: ", + "DeleteScriptRequest", + " | ", + "DeleteScriptRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "DeleteScriptResponse", + ", unknown>>; (this: That, params: ", + "DeleteScriptRequest", + " | ", + "DeleteScriptRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "DeleteScriptResponse", + ">; }; enrich: ", + "default", + "; exists: { (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; existsSource: { (this: That, params: ", + "ExistsSourceRequest", + " | ", + "ExistsSourceRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "ExistsSourceRequest", + " | ", + "ExistsSourceRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "ExistsSourceRequest", + " | ", + "ExistsSourceRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; explain: { (this: That, params: ", + "ExplainRequest", + " | ", + "ExplainRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ExplainResponse", + ">; (this: That, params: ", + "ExplainRequest", + " | ", + "ExplainRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ExplainResponse", + ", unknown>>; (this: That, params: ", + "ExplainRequest", + " | ", + "ExplainRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ExplainResponse", + ">; }; features: ", + "default", + "; fieldCaps: { (this: That, params?: ", + "FieldCapsRequest", + " | ", + "FieldCapsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "FieldCapsResponse", + ">; (this: That, params?: ", + "FieldCapsRequest", + " | ", + "FieldCapsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "FieldCapsResponse", + ", unknown>>; (this: That, params?: ", + "FieldCapsRequest", + " | ", + "FieldCapsRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "FieldCapsResponse", + ">; }; fleet: ", + "default", + "; getScript: { (this: That, params: ", + "GetScriptRequest", + " | ", + "GetScriptRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetScriptResponse", + ">; (this: That, params: ", + "GetScriptRequest", + " | ", + "GetScriptRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "GetScriptResponse", + ", unknown>>; (this: That, params: ", + "GetScriptRequest", + " | ", + "GetScriptRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "GetScriptResponse", + ">; }; getScriptContext: { (this: That, params?: ", + "GetScriptContextRequest", + " | ", + "GetScriptContextRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetScriptContextResponse", + ">; (this: That, params?: ", + "GetScriptContextRequest", + " | ", + "GetScriptContextRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "GetScriptContextResponse", + ", unknown>>; (this: That, params?: ", + "GetScriptContextRequest", + " | ", + "GetScriptContextRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "GetScriptContextResponse", + ">; }; getScriptLanguages: { (this: That, params?: ", + "GetScriptLanguagesRequest", + " | ", + "GetScriptLanguagesRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetScriptLanguagesResponse", + ">; (this: That, params?: ", + "GetScriptLanguagesRequest", + " | ", + "GetScriptLanguagesRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "GetScriptLanguagesResponse", + ", unknown>>; (this: That, params?: ", + "GetScriptLanguagesRequest", + " | ", + "GetScriptLanguagesRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "GetScriptLanguagesResponse", + ">; }; getSource: { (this: That, params: ", + "GetSourceRequest", + " | ", + "GetSourceRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "GetSourceRequest", + " | ", + "GetSourceRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "GetSourceRequest", + " | ", + "GetSourceRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; graph: ", + "default", + "; ilm: ", + "default", + "; indices: ", + "default", + "; info: { (this: That, params?: ", + "InfoRequest", + " | ", + "InfoRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "InfoResponse", + ">; (this: That, params?: ", + "InfoRequest", + " | ", + "InfoRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "InfoResponse", + ", unknown>>; (this: That, params?: ", + "InfoRequest", + " | ", + "InfoRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "InfoResponse", + ">; }; ingest: ", + "default", + "; knnSearch: { (this: That, params: ", + "KnnSearchRequest", + " | ", + "KnnSearchRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "KnnSearchResponse", + ">; (this: That, params: ", + "KnnSearchRequest", + " | ", + "KnnSearchRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "KnnSearchResponse", + ", unknown>>; (this: That, params: ", + "KnnSearchRequest", + " | ", + "KnnSearchRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "KnnSearchResponse", + ">; }; license: ", + "default", + "; logstash: ", + "default", + "; mget: { (this: That, params?: ", + "MgetRequest", + " | ", + "MgetRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MgetResponse", + ">; (this: That, params?: ", + "MgetRequest", + " | ", + "MgetRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "MgetResponse", + ", unknown>>; (this: That, params?: ", + "MgetRequest", + " | ", + "MgetRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "MgetResponse", + ">; }; migration: ", + "default", + "; ml: ", + "default", + "; msearch: { >(this: That, params: ", + "MsearchRequest", + " | ", + "MsearchRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MsearchResponse", + ">; >(this: That, params: ", + "MsearchRequest", + " | ", + "MsearchRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "MsearchResponse", + ", unknown>>; >(this: That, params: ", + "MsearchRequest", + " | ", + "MsearchRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "MsearchResponse", + ">; }; msearchTemplate: { >(this: That, params: ", + "MsearchTemplateRequest", + " | ", + "MsearchTemplateRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MsearchTemplateResponse", + ">; >(this: That, params: ", + "MsearchTemplateRequest", + " | ", + "MsearchTemplateRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "MsearchTemplateResponse", + ", unknown>>; >(this: That, params: ", + "MsearchTemplateRequest", + " | ", + "MsearchTemplateRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "MsearchTemplateResponse", + ">; }; mtermvectors: { (this: That, params?: ", + "MtermvectorsRequest", + " | ", + "MtermvectorsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MtermvectorsResponse", + ">; (this: That, params?: ", + "MtermvectorsRequest", + " | ", + "MtermvectorsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "MtermvectorsResponse", + ", unknown>>; (this: That, params?: ", + "MtermvectorsRequest", + " | ", + "MtermvectorsRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "MtermvectorsResponse", + ">; }; nodes: ", + "default", + "; openPointInTime: { (this: That, params: ", + "OpenPointInTimeRequest", + " | ", + "OpenPointInTimeRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "OpenPointInTimeResponse", + ">; (this: That, params: ", + "OpenPointInTimeRequest", + " | ", + "OpenPointInTimeRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "OpenPointInTimeResponse", + ", unknown>>; (this: That, params: ", + "OpenPointInTimeRequest", + " | ", + "OpenPointInTimeRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "OpenPointInTimeResponse", + ">; }; ping: { (this: That, params?: ", + "PingRequest", + " | ", + "PingRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params?: ", + "PingRequest", + " | ", + "PingRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params?: ", + "PingRequest", + " | ", + "PingRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; putScript: { (this: That, params: ", + "PutScriptRequest", + " | ", + "PutScriptRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "PutScriptResponse", + ">; (this: That, params: ", + "PutScriptRequest", + " | ", + "PutScriptRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "PutScriptResponse", + ", unknown>>; (this: That, params: ", + "PutScriptRequest", + " | ", + "PutScriptRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "PutScriptResponse", + ">; }; rankEval: { (this: That, params: ", + "RankEvalRequest", + " | ", + "RankEvalRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "RankEvalResponse", + ">; (this: That, params: ", + "RankEvalRequest", + " | ", + "RankEvalRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "RankEvalResponse", + ", unknown>>; (this: That, params: ", + "RankEvalRequest", + " | ", + "RankEvalRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "RankEvalResponse", + ">; }; reindex: { (this: That, params?: ", + "ReindexRequest", + " | ", + "ReindexRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ReindexResponse", + ">; (this: That, params?: ", + "ReindexRequest", + " | ", + "ReindexRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ReindexResponse", + ", unknown>>; (this: That, params?: ", + "ReindexRequest", + " | ", + "ReindexRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ReindexResponse", + ">; }; reindexRethrottle: { (this: That, params: ", + "ReindexRethrottleRequest", + " | ", + "ReindexRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ReindexRethrottleResponse", + ">; (this: That, params: ", + "ReindexRethrottleRequest", + " | ", + "ReindexRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ReindexRethrottleResponse", + ", unknown>>; (this: That, params: ", + "ReindexRethrottleRequest", + " | ", + "ReindexRethrottleRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ReindexRethrottleResponse", + ">; }; renderSearchTemplate: { (this: That, params?: ", + "RenderSearchTemplateRequest", + " | ", + "RenderSearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "RenderSearchTemplateResponse", + ">; (this: That, params?: ", + "RenderSearchTemplateRequest", + " | ", + "RenderSearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "RenderSearchTemplateResponse", + ", unknown>>; (this: That, params?: ", + "RenderSearchTemplateRequest", + " | ", + "RenderSearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "RenderSearchTemplateResponse", + ">; }; rollup: ", + "default", + "; scriptsPainlessExecute: { (this: That, params?: ", + "ScriptsPainlessExecuteRequest", + " | ", + "ScriptsPainlessExecuteRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ScriptsPainlessExecuteResponse", + ">; (this: That, params?: ", + "ScriptsPainlessExecuteRequest", + " | ", + "ScriptsPainlessExecuteRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ScriptsPainlessExecuteResponse", + ", unknown>>; (this: That, params?: ", + "ScriptsPainlessExecuteRequest", + " | ", + "ScriptsPainlessExecuteRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ScriptsPainlessExecuteResponse", + ">; }; scroll: { >(this: That, params: ", + "ScrollRequest", + " | ", + "ScrollRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ScrollResponse", + ">; >(this: That, params: ", + "ScrollRequest", + " | ", + "ScrollRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ScrollResponse", + ", unknown>>; >(this: That, params: ", + "ScrollRequest", + " | ", + "ScrollRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ScrollResponse", + ">; }; searchMvt: { (this: That, params: ", + "SearchMvtRequest", + " | ", + "SearchMvtRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "SearchMvtRequest", + " | ", + "SearchMvtRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "SearchMvtRequest", + " | ", + "SearchMvtRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; searchShards: { (this: That, params?: ", + "SearchShardsRequest", + " | ", + "SearchShardsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "SearchShardsResponse", + ">; (this: That, params?: ", + "SearchShardsRequest", + " | ", + "SearchShardsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "SearchShardsResponse", + ", unknown>>; (this: That, params?: ", + "SearchShardsRequest", + " | ", + "SearchShardsRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "SearchShardsResponse", + ">; }; searchTemplate: { (this: That, params?: ", + "SearchTemplateRequest", + " | ", + "SearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "SearchTemplateResponse", + ">; (this: That, params?: ", + "SearchTemplateRequest", + " | ", + "SearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "SearchTemplateResponse", + ", unknown>>; (this: That, params?: ", + "SearchTemplateRequest", + " | ", + "SearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "SearchTemplateResponse", + ">; }; searchableSnapshots: ", + "default", + "; shutdown: ", + "default", + "; slm: ", + "default", + "; snapshot: ", + "default", + "; sql: ", + "default", + "; ssl: ", + "default", + "; tasks: ", + "default", + "; termsEnum: { (this: That, params: ", + "TermsEnumRequest", + " | ", + "TermsEnumRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "TermsEnumResponse", + ">; (this: That, params: ", + "TermsEnumRequest", + " | ", + "TermsEnumRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "TermsEnumResponse", + ", unknown>>; (this: That, params: ", + "TermsEnumRequest", + " | ", + "TermsEnumRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "TermsEnumResponse", + ">; }; termvectors: { (this: That, params: ", + "TermvectorsRequest", + " | ", + "TermvectorsRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "TermvectorsResponse", + ">; (this: That, params: ", + "TermvectorsRequest", + " | ", + "TermvectorsRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "TermvectorsResponse", + ", unknown>>; (this: That, params: ", + "TermvectorsRequest", + " | ", + "TermvectorsRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "TermvectorsResponse", + ">; }; textStructure: ", + "default", + "; updateByQuery: { (this: That, params: ", + "UpdateByQueryRequest", + " | ", + "UpdateByQueryRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "UpdateByQueryResponse", + ">; (this: That, params: ", + "UpdateByQueryRequest", + " | ", + "UpdateByQueryRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "UpdateByQueryResponse", + ", unknown>>; (this: That, params: ", + "UpdateByQueryRequest", + " | ", + "UpdateByQueryRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "UpdateByQueryResponse", + ">; }; updateByQueryRethrottle: { (this: That, params: ", + "UpdateByQueryRethrottleRequest", + " | ", + "UpdateByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "UpdateByQueryRethrottleResponse", + ">; (this: That, params: ", + "UpdateByQueryRethrottleRequest", + " | ", + "UpdateByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "UpdateByQueryRethrottleResponse", + ", unknown>>; (this: That, params: ", + "UpdateByQueryRethrottleRequest", + " | ", + "UpdateByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "UpdateByQueryRethrottleResponse", + ">; }; watcher: ", + "default", + "; xpack: ", + "default", + "; }" + ], + "path": "src/core/server/elasticsearch/client/cluster_client.ts", + "deprecated": false + }, + { + "parentPluginId": "core", + "id": "def-server.IClusterClient.asScoped", + "type": "Function", + "tags": [], + "label": "asScoped", + "description": [ + "\nCreates a {@link IScopedClusterClient | scoped cluster client} bound to given {@link ScopeableRequest | request}" + ], + "signature": [ + "(request: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCorePluginApi", + "section": "def-server.ScopeableRequest", + "text": "ScopeableRequest" + }, + ") => ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCorePluginApi", + "section": "def-server.IScopedClusterClient", + "text": "IScopedClusterClient" + } + ], + "path": "src/core/server/elasticsearch/client/cluster_client.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "core", + "id": "def-server.IClusterClient.asScoped.$1", + "type": "CompoundType", + "tags": [], + "label": "request", + "description": [], + "signature": [ + { + "pluginId": "core", + "scope": "server", + "docId": "kibCorePluginApi", + "section": "def-server.ScopeableRequest", + "text": "ScopeableRequest" + } + ], + "path": "src/core/server/elasticsearch/client/cluster_client.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "core", + "id": "def-server.IContextContainer", + "type": "Interface", + "tags": [], + "label": "IContextContainer", + "description": [ + "\nAn object that handles registration of context providers and configuring handlers with context.\n" + ], + "path": "src/core/server/context/container/context.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "core", + "id": "def-server.IContextContainer.registerContext", + "type": "Function", + "tags": [], + "label": "registerContext", + "description": [ + "\nRegister a new context provider.\n" + ], + "signature": [ + "(pluginOpaqueId: symbol, contextName: ContextName, provider: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCorePluginApi", + "section": "def-server.IContextProvider", + "text": "IContextProvider" + }, + ") => this" + ], + "path": "src/core/server/context/container/context.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "core", + "id": "def-server.IContextContainer.registerContext.$1", + "type": "Uncategorized", + "tags": [], + "label": "pluginOpaqueId", + "description": [ + "- The plugin opaque ID for the plugin that registers this context." + ], + "signature": [ + "symbol" + ], + "path": "src/core/server/context/container/context.ts", + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "core", + "id": "def-server.IContextContainer.registerContext.$2", + "type": "Uncategorized", + "tags": [], + "label": "contextName", + "description": [ + "- The key of the `TContext` object this provider supplies the value for." + ], + "signature": [ + "ContextName" + ], + "path": "src/core/server/context/container/context.ts", + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "core", + "id": "def-server.IContextContainer.registerContext.$3", + "type": "Function", + "tags": [], + "label": "provider", + "description": [ + "- A {@link IContextProvider } to be called each time a new context is created." + ], + "signature": [ + { + "pluginId": "core", + "scope": "server", + "docId": "kibCorePluginApi", + "section": "def-server.IContextProvider", + "text": "IContextProvider" + }, + "" + ], + "path": "src/core/server/context/container/context.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [ + "The {@link IContextContainer } for method chaining." + ] + }, + { + "parentPluginId": "core", + "id": "def-server.IContextContainer.createHandler", + "type": "Function", + "tags": [], + "label": "createHandler", + "description": [ + "\nCreate a new handler function pre-wired to context for the plugin.\n" + ], + "signature": [ + "(pluginOpaqueId: symbol, handler: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreHttpPluginApi", + "section": "def-server.RequestHandler", + "text": "RequestHandler" + }, + " | Error | { message: string | Error; attributes?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreHttpPluginApi", + "section": "def-server.ResponseErrorAttributes", + "text": "ResponseErrorAttributes" + }, + " | undefined; } | Buffer | ", + "Stream", + " | undefined>(options: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreHttpPluginApi", + "section": "def-server.CustomHttpResponseOptions", + "text": "CustomHttpResponseOptions" + }, + ") => ", + "KibanaResponse", + "; badRequest: (options?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreHttpPluginApi", + "section": "def-server.ErrorHttpResponseOptions", + "text": "ErrorHttpResponseOptions" + }, + ") => ", + "KibanaResponse", + "; unauthorized: (options?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreHttpPluginApi", + "section": "def-server.ErrorHttpResponseOptions", + "text": "ErrorHttpResponseOptions" + }, + ") => ", + "KibanaResponse", + "; forbidden: (options?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreHttpPluginApi", + "section": "def-server.ErrorHttpResponseOptions", + "text": "ErrorHttpResponseOptions" + }, + ") => ", + "KibanaResponse", + "; notFound: (options?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreHttpPluginApi", + "section": "def-server.ErrorHttpResponseOptions", + "text": "ErrorHttpResponseOptions" + }, + ") => ", + "KibanaResponse", + "; conflict: (options?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreHttpPluginApi", + "section": "def-server.ErrorHttpResponseOptions", + "text": "ErrorHttpResponseOptions" + }, + ") => ", + "KibanaResponse", + "; customError: (options: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreHttpPluginApi", + "section": "def-server.CustomHttpResponseOptions", + "text": "CustomHttpResponseOptions" + }, + "<", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreHttpPluginApi", + "section": "def-server.ResponseError", + "text": "ResponseError" + }, + ">) => ", + "KibanaResponse", + "; redirected: (options: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreHttpPluginApi", + "section": "def-server.RedirectResponseOptions", + "text": "RedirectResponseOptions" + }, + ") => ", + "KibanaResponse", + " | Buffer | ", + "Stream", + ">; ok: (options?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreHttpPluginApi", + "section": "def-server.HttpResponseOptions", + "text": "HttpResponseOptions" + }, + ") => ", + "KibanaResponse", + " | Buffer | ", + "Stream", + ">; accepted: (options?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreHttpPluginApi", + "section": "def-server.HttpResponseOptions", + "text": "HttpResponseOptions" + }, + ") => ", + "KibanaResponse", + " | Buffer | ", + "Stream", + ">; noContent: (options?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreHttpPluginApi", + "section": "def-server.HttpResponseOptions", + "text": "HttpResponseOptions" + }, + ") => ", + "KibanaResponse", + "; }>) => (request: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreHttpPluginApi", + "section": "def-server.KibanaRequest", + "text": "KibanaRequest" + }, + ", response: { custom: | Error | { message: string | Error; attributes?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreHttpPluginApi", + "section": "def-server.ResponseErrorAttributes", + "text": "ResponseErrorAttributes" + }, + " | undefined; } | Buffer | ", + "Stream", + " | undefined>(options: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreHttpPluginApi", + "section": "def-server.CustomHttpResponseOptions", + "text": "CustomHttpResponseOptions" + }, + ") => ", + "KibanaResponse", + "; badRequest: (options?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreHttpPluginApi", + "section": "def-server.ErrorHttpResponseOptions", + "text": "ErrorHttpResponseOptions" + }, + ") => ", + "KibanaResponse", + "; unauthorized: (options?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreHttpPluginApi", + "section": "def-server.ErrorHttpResponseOptions", + "text": "ErrorHttpResponseOptions" + }, + ") => ", + "KibanaResponse", + "; forbidden: (options?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreHttpPluginApi", + "section": "def-server.ErrorHttpResponseOptions", + "text": "ErrorHttpResponseOptions" + }, + ") => ", + "KibanaResponse", + "; notFound: (options?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreHttpPluginApi", + "section": "def-server.ErrorHttpResponseOptions", + "text": "ErrorHttpResponseOptions" + }, + ") => ", + "KibanaResponse", + "; conflict: (options?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreHttpPluginApi", + "section": "def-server.ErrorHttpResponseOptions", + "text": "ErrorHttpResponseOptions" + }, + ") => ", + "KibanaResponse", + "; customError: (options: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreHttpPluginApi", + "section": "def-server.CustomHttpResponseOptions", + "text": "CustomHttpResponseOptions" + }, + "<", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreHttpPluginApi", + "section": "def-server.ResponseError", + "text": "ResponseError" + }, + ">) => ", + "KibanaResponse", + "; redirected: (options: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreHttpPluginApi", + "section": "def-server.RedirectResponseOptions", + "text": "RedirectResponseOptions" + }, + ") => ", + "KibanaResponse", + " | Buffer | ", + "Stream", + ">; ok: (options?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreHttpPluginApi", + "section": "def-server.HttpResponseOptions", + "text": "HttpResponseOptions" + }, + ") => ", + "KibanaResponse", + " | Buffer | ", + "Stream", + ">; accepted: (options?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreHttpPluginApi", + "section": "def-server.HttpResponseOptions", + "text": "HttpResponseOptions" + }, + ") => ", + "KibanaResponse", + " | Buffer | ", + "Stream", + ">; noContent: (options?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreHttpPluginApi", + "section": "def-server.HttpResponseOptions", + "text": "HttpResponseOptions" + }, + ") => ", + "KibanaResponse", + "; }) => Promise<", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreHttpPluginApi", + "section": "def-server.IKibanaResponse", + "text": "IKibanaResponse" + }, + ">" + ], + "path": "src/core/server/context/container/context.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "core", + "id": "def-server.IContextContainer.createHandler.$1", + "type": "Uncategorized", + "tags": [], + "label": "pluginOpaqueId", + "description": [ + "- The plugin opaque ID for the plugin that registers this handler." + ], + "signature": [ + "symbol" + ], + "path": "src/core/server/context/container/context.ts", + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "core", + "id": "def-server.IContextContainer.createHandler.$2", + "type": "Function", + "tags": [], + "label": "handler", + "description": [ + "- Handler function to pass context object to." + ], + "signature": [ + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreHttpPluginApi", + "section": "def-server.RequestHandler", + "text": "RequestHandler" + }, + " | Error | { message: string | Error; attributes?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreHttpPluginApi", + "section": "def-server.ResponseErrorAttributes", + "text": "ResponseErrorAttributes" + }, + " | undefined; } | Buffer | ", + "Stream", + " | undefined>(options: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreHttpPluginApi", + "section": "def-server.CustomHttpResponseOptions", + "text": "CustomHttpResponseOptions" + }, + ") => ", + "KibanaResponse", + "; badRequest: (options?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreHttpPluginApi", + "section": "def-server.ErrorHttpResponseOptions", + "text": "ErrorHttpResponseOptions" + }, + ") => ", + "KibanaResponse", + "; unauthorized: (options?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreHttpPluginApi", + "section": "def-server.ErrorHttpResponseOptions", + "text": "ErrorHttpResponseOptions" + }, + ") => ", + "KibanaResponse", + "; forbidden: (options?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreHttpPluginApi", + "section": "def-server.ErrorHttpResponseOptions", + "text": "ErrorHttpResponseOptions" + }, + ") => ", + "KibanaResponse", + "; notFound: (options?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreHttpPluginApi", + "section": "def-server.ErrorHttpResponseOptions", + "text": "ErrorHttpResponseOptions" + }, + ") => ", + "KibanaResponse", + "; conflict: (options?: ", + { "pluginId": "core", "scope": "server", "docId": "kibCoreHttpPluginApi", @@ -12921,46 +14070,2398 @@ "children": [ { "parentPluginId": "core", - "id": "def-server.IScopedClusterClient.asInternalUser", - "type": "CompoundType", + "id": "def-server.IScopedClusterClient.asInternalUser", + "type": "Object", + "tags": [], + "label": "asInternalUser", + "description": [ + "\nA {@link ElasticsearchClient | client} to be used to query the elasticsearch cluster\non behalf of the internal Kibana user." + ], + "signature": [ + "{ eql: ", + "default", + "; search: { >(this: That, params?: ", + "SearchRequest", + " | ", + "SearchRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "SearchResponse", + ">; >(this: That, params?: ", + "SearchRequest", + " | ", + "SearchRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "SearchResponse", + ", unknown>>; >(this: That, params?: ", + "SearchRequest", + " | ", + "SearchRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "SearchResponse", + ">; }; create: { (this: That, params: ", + "CreateRequest", + " | ", + "CreateRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "CreateResponse", + ">; (this: That, params: ", + "CreateRequest", + " | ", + "CreateRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "CreateResponse", + ", unknown>>; (this: That, params: ", + "CreateRequest", + " | ", + "CreateRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "CreateResponse", + ">; }; monitoring: ", + "default", + "; security: ", + "default", + "; name: string | symbol; index: { (this: That, params: ", + "IndexRequest", + " | ", + "IndexRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "IndexResponse", + ">; (this: That, params: ", + "IndexRequest", + " | ", + "IndexRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "IndexResponse", + ", unknown>>; (this: That, params: ", + "IndexRequest", + " | ", + "IndexRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "IndexResponse", + ">; }; delete: { (this: That, params: ", + "DeleteRequest", + " | ", + "DeleteRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "DeleteResponse", + ">; (this: That, params: ", + "DeleteRequest", + " | ", + "DeleteRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "DeleteResponse", + ", unknown>>; (this: That, params: ", + "DeleteRequest", + " | ", + "DeleteRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "DeleteResponse", + ">; }; get: { (this: That, params: ", + "GetRequest", + " | ", + "GetRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetResponse", + ">; (this: That, params: ", + "GetRequest", + " | ", + "GetRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "GetResponse", + ", unknown>>; (this: That, params: ", + "GetRequest", + " | ", + "GetRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "GetResponse", + ">; }; update: { (this: That, params: ", + "UpdateRequest", + " | ", + "UpdateRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "UpdateResponse", + ">; (this: That, params: ", + "UpdateRequest", + " | ", + "UpdateRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "UpdateResponse", + ", unknown>>; (this: That, params: ", + "UpdateRequest", + " | ", + "UpdateRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "UpdateResponse", + ">; }; closePointInTime: { (this: That, params: ", + "ClosePointInTimeRequest", + " | ", + "ClosePointInTimeRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ClosePointInTimeResponse", + ">; (this: That, params: ", + "ClosePointInTimeRequest", + " | ", + "ClosePointInTimeRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ClosePointInTimeResponse", + ", unknown>>; (this: That, params: ", + "ClosePointInTimeRequest", + " | ", + "ClosePointInTimeRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ClosePointInTimeResponse", + ">; }; transform: ", + "default", + "; helpers: ", + "default", + "; [kInternal]: symbol | null; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", + "default", + "; Internal: ", + "default", + "; asyncSearch: ", + "default", + "; autoscaling: ", + "default", + "; bulk: { (this: That, params: ", + "BulkRequest", + " | ", + "BulkRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "BulkResponse", + ">; (this: That, params: ", + "BulkRequest", + " | ", + "BulkRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "BulkResponse", + ", unknown>>; (this: That, params: ", + "BulkRequest", + " | ", + "BulkRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "BulkResponse", + ">; }; cat: ", + "default", + "; ccr: ", + "default", + "; clearScroll: { (this: That, params?: ", + "ClearScrollRequest", + " | ", + "ClearScrollRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ClearScrollResponse", + ">; (this: That, params?: ", + "ClearScrollRequest", + " | ", + "ClearScrollRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ClearScrollResponse", + ", unknown>>; (this: That, params?: ", + "ClearScrollRequest", + " | ", + "ClearScrollRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ClearScrollResponse", + ">; }; cluster: ", + "default", + "; count: { (this: That, params?: ", + "CountRequest", + " | ", + "CountRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "CountResponse", + ">; (this: That, params?: ", + "CountRequest", + " | ", + "CountRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "CountResponse", + ", unknown>>; (this: That, params?: ", + "CountRequest", + " | ", + "CountRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "CountResponse", + ">; }; danglingIndices: ", + "default", + "; deleteByQuery: { (this: That, params: ", + "DeleteByQueryRequest", + " | ", + "DeleteByQueryRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "DeleteByQueryResponse", + ">; (this: That, params: ", + "DeleteByQueryRequest", + " | ", + "DeleteByQueryRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "DeleteByQueryResponse", + ", unknown>>; (this: That, params: ", + "DeleteByQueryRequest", + " | ", + "DeleteByQueryRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "DeleteByQueryResponse", + ">; }; deleteByQueryRethrottle: { (this: That, params: ", + "DeleteByQueryRethrottleRequest", + " | ", + "DeleteByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "DeleteByQueryRethrottleResponse", + ">; (this: That, params: ", + "DeleteByQueryRethrottleRequest", + " | ", + "DeleteByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "DeleteByQueryRethrottleResponse", + ", unknown>>; (this: That, params: ", + "DeleteByQueryRethrottleRequest", + " | ", + "DeleteByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "DeleteByQueryRethrottleResponse", + ">; }; deleteScript: { (this: That, params: ", + "DeleteScriptRequest", + " | ", + "DeleteScriptRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "DeleteScriptResponse", + ">; (this: That, params: ", + "DeleteScriptRequest", + " | ", + "DeleteScriptRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "DeleteScriptResponse", + ", unknown>>; (this: That, params: ", + "DeleteScriptRequest", + " | ", + "DeleteScriptRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "DeleteScriptResponse", + ">; }; enrich: ", + "default", + "; exists: { (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; existsSource: { (this: That, params: ", + "ExistsSourceRequest", + " | ", + "ExistsSourceRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "ExistsSourceRequest", + " | ", + "ExistsSourceRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "ExistsSourceRequest", + " | ", + "ExistsSourceRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; explain: { (this: That, params: ", + "ExplainRequest", + " | ", + "ExplainRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ExplainResponse", + ">; (this: That, params: ", + "ExplainRequest", + " | ", + "ExplainRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ExplainResponse", + ", unknown>>; (this: That, params: ", + "ExplainRequest", + " | ", + "ExplainRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ExplainResponse", + ">; }; features: ", + "default", + "; fieldCaps: { (this: That, params?: ", + "FieldCapsRequest", + " | ", + "FieldCapsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "FieldCapsResponse", + ">; (this: That, params?: ", + "FieldCapsRequest", + " | ", + "FieldCapsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "FieldCapsResponse", + ", unknown>>; (this: That, params?: ", + "FieldCapsRequest", + " | ", + "FieldCapsRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "FieldCapsResponse", + ">; }; fleet: ", + "default", + "; getScript: { (this: That, params: ", + "GetScriptRequest", + " | ", + "GetScriptRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetScriptResponse", + ">; (this: That, params: ", + "GetScriptRequest", + " | ", + "GetScriptRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "GetScriptResponse", + ", unknown>>; (this: That, params: ", + "GetScriptRequest", + " | ", + "GetScriptRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "GetScriptResponse", + ">; }; getScriptContext: { (this: That, params?: ", + "GetScriptContextRequest", + " | ", + "GetScriptContextRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetScriptContextResponse", + ">; (this: That, params?: ", + "GetScriptContextRequest", + " | ", + "GetScriptContextRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "GetScriptContextResponse", + ", unknown>>; (this: That, params?: ", + "GetScriptContextRequest", + " | ", + "GetScriptContextRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "GetScriptContextResponse", + ">; }; getScriptLanguages: { (this: That, params?: ", + "GetScriptLanguagesRequest", + " | ", + "GetScriptLanguagesRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetScriptLanguagesResponse", + ">; (this: That, params?: ", + "GetScriptLanguagesRequest", + " | ", + "GetScriptLanguagesRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "GetScriptLanguagesResponse", + ", unknown>>; (this: That, params?: ", + "GetScriptLanguagesRequest", + " | ", + "GetScriptLanguagesRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "GetScriptLanguagesResponse", + ">; }; getSource: { (this: That, params: ", + "GetSourceRequest", + " | ", + "GetSourceRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "GetSourceRequest", + " | ", + "GetSourceRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "GetSourceRequest", + " | ", + "GetSourceRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; graph: ", + "default", + "; ilm: ", + "default", + "; indices: ", + "default", + "; info: { (this: That, params?: ", + "InfoRequest", + " | ", + "InfoRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "InfoResponse", + ">; (this: That, params?: ", + "InfoRequest", + " | ", + "InfoRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "InfoResponse", + ", unknown>>; (this: That, params?: ", + "InfoRequest", + " | ", + "InfoRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "InfoResponse", + ">; }; ingest: ", + "default", + "; knnSearch: { (this: That, params: ", + "KnnSearchRequest", + " | ", + "KnnSearchRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "KnnSearchResponse", + ">; (this: That, params: ", + "KnnSearchRequest", + " | ", + "KnnSearchRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "KnnSearchResponse", + ", unknown>>; (this: That, params: ", + "KnnSearchRequest", + " | ", + "KnnSearchRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "KnnSearchResponse", + ">; }; license: ", + "default", + "; logstash: ", + "default", + "; mget: { (this: That, params?: ", + "MgetRequest", + " | ", + "MgetRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MgetResponse", + ">; (this: That, params?: ", + "MgetRequest", + " | ", + "MgetRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "MgetResponse", + ", unknown>>; (this: That, params?: ", + "MgetRequest", + " | ", + "MgetRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "MgetResponse", + ">; }; migration: ", + "default", + "; ml: ", + "default", + "; msearch: { >(this: That, params: ", + "MsearchRequest", + " | ", + "MsearchRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MsearchResponse", + ">; >(this: That, params: ", + "MsearchRequest", + " | ", + "MsearchRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "MsearchResponse", + ", unknown>>; >(this: That, params: ", + "MsearchRequest", + " | ", + "MsearchRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "MsearchResponse", + ">; }; msearchTemplate: { >(this: That, params: ", + "MsearchTemplateRequest", + " | ", + "MsearchTemplateRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MsearchTemplateResponse", + ">; >(this: That, params: ", + "MsearchTemplateRequest", + " | ", + "MsearchTemplateRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "MsearchTemplateResponse", + ", unknown>>; >(this: That, params: ", + "MsearchTemplateRequest", + " | ", + "MsearchTemplateRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "MsearchTemplateResponse", + ">; }; mtermvectors: { (this: That, params?: ", + "MtermvectorsRequest", + " | ", + "MtermvectorsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MtermvectorsResponse", + ">; (this: That, params?: ", + "MtermvectorsRequest", + " | ", + "MtermvectorsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "MtermvectorsResponse", + ", unknown>>; (this: That, params?: ", + "MtermvectorsRequest", + " | ", + "MtermvectorsRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "MtermvectorsResponse", + ">; }; nodes: ", + "default", + "; openPointInTime: { (this: That, params: ", + "OpenPointInTimeRequest", + " | ", + "OpenPointInTimeRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "OpenPointInTimeResponse", + ">; (this: That, params: ", + "OpenPointInTimeRequest", + " | ", + "OpenPointInTimeRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "OpenPointInTimeResponse", + ", unknown>>; (this: That, params: ", + "OpenPointInTimeRequest", + " | ", + "OpenPointInTimeRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "OpenPointInTimeResponse", + ">; }; ping: { (this: That, params?: ", + "PingRequest", + " | ", + "PingRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params?: ", + "PingRequest", + " | ", + "PingRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params?: ", + "PingRequest", + " | ", + "PingRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; putScript: { (this: That, params: ", + "PutScriptRequest", + " | ", + "PutScriptRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "PutScriptResponse", + ">; (this: That, params: ", + "PutScriptRequest", + " | ", + "PutScriptRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "PutScriptResponse", + ", unknown>>; (this: That, params: ", + "PutScriptRequest", + " | ", + "PutScriptRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "PutScriptResponse", + ">; }; rankEval: { (this: That, params: ", + "RankEvalRequest", + " | ", + "RankEvalRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "RankEvalResponse", + ">; (this: That, params: ", + "RankEvalRequest", + " | ", + "RankEvalRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "RankEvalResponse", + ", unknown>>; (this: That, params: ", + "RankEvalRequest", + " | ", + "RankEvalRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "RankEvalResponse", + ">; }; reindex: { (this: That, params?: ", + "ReindexRequest", + " | ", + "ReindexRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ReindexResponse", + ">; (this: That, params?: ", + "ReindexRequest", + " | ", + "ReindexRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ReindexResponse", + ", unknown>>; (this: That, params?: ", + "ReindexRequest", + " | ", + "ReindexRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ReindexResponse", + ">; }; reindexRethrottle: { (this: That, params: ", + "ReindexRethrottleRequest", + " | ", + "ReindexRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ReindexRethrottleResponse", + ">; (this: That, params: ", + "ReindexRethrottleRequest", + " | ", + "ReindexRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ReindexRethrottleResponse", + ", unknown>>; (this: That, params: ", + "ReindexRethrottleRequest", + " | ", + "ReindexRethrottleRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ReindexRethrottleResponse", + ">; }; renderSearchTemplate: { (this: That, params?: ", + "RenderSearchTemplateRequest", + " | ", + "RenderSearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "RenderSearchTemplateResponse", + ">; (this: That, params?: ", + "RenderSearchTemplateRequest", + " | ", + "RenderSearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "RenderSearchTemplateResponse", + ", unknown>>; (this: That, params?: ", + "RenderSearchTemplateRequest", + " | ", + "RenderSearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "RenderSearchTemplateResponse", + ">; }; rollup: ", + "default", + "; scriptsPainlessExecute: { (this: That, params?: ", + "ScriptsPainlessExecuteRequest", + " | ", + "ScriptsPainlessExecuteRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ScriptsPainlessExecuteResponse", + ">; (this: That, params?: ", + "ScriptsPainlessExecuteRequest", + " | ", + "ScriptsPainlessExecuteRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ScriptsPainlessExecuteResponse", + ", unknown>>; (this: That, params?: ", + "ScriptsPainlessExecuteRequest", + " | ", + "ScriptsPainlessExecuteRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ScriptsPainlessExecuteResponse", + ">; }; scroll: { >(this: That, params: ", + "ScrollRequest", + " | ", + "ScrollRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ScrollResponse", + ">; >(this: That, params: ", + "ScrollRequest", + " | ", + "ScrollRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ScrollResponse", + ", unknown>>; >(this: That, params: ", + "ScrollRequest", + " | ", + "ScrollRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ScrollResponse", + ">; }; searchMvt: { (this: That, params: ", + "SearchMvtRequest", + " | ", + "SearchMvtRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "SearchMvtRequest", + " | ", + "SearchMvtRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "SearchMvtRequest", + " | ", + "SearchMvtRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; searchShards: { (this: That, params?: ", + "SearchShardsRequest", + " | ", + "SearchShardsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "SearchShardsResponse", + ">; (this: That, params?: ", + "SearchShardsRequest", + " | ", + "SearchShardsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "SearchShardsResponse", + ", unknown>>; (this: That, params?: ", + "SearchShardsRequest", + " | ", + "SearchShardsRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "SearchShardsResponse", + ">; }; searchTemplate: { (this: That, params?: ", + "SearchTemplateRequest", + " | ", + "SearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "SearchTemplateResponse", + ">; (this: That, params?: ", + "SearchTemplateRequest", + " | ", + "SearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "SearchTemplateResponse", + ", unknown>>; (this: That, params?: ", + "SearchTemplateRequest", + " | ", + "SearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "SearchTemplateResponse", + ">; }; searchableSnapshots: ", + "default", + "; shutdown: ", + "default", + "; slm: ", + "default", + "; snapshot: ", + "default", + "; sql: ", + "default", + "; ssl: ", + "default", + "; tasks: ", + "default", + "; termsEnum: { (this: That, params: ", + "TermsEnumRequest", + " | ", + "TermsEnumRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "TermsEnumResponse", + ">; (this: That, params: ", + "TermsEnumRequest", + " | ", + "TermsEnumRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "TermsEnumResponse", + ", unknown>>; (this: That, params: ", + "TermsEnumRequest", + " | ", + "TermsEnumRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "TermsEnumResponse", + ">; }; termvectors: { (this: That, params: ", + "TermvectorsRequest", + " | ", + "TermvectorsRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "TermvectorsResponse", + ">; (this: That, params: ", + "TermvectorsRequest", + " | ", + "TermvectorsRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "TermvectorsResponse", + ", unknown>>; (this: That, params: ", + "TermvectorsRequest", + " | ", + "TermvectorsRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "TermvectorsResponse", + ">; }; textStructure: ", + "default", + "; updateByQuery: { (this: That, params: ", + "UpdateByQueryRequest", + " | ", + "UpdateByQueryRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "UpdateByQueryResponse", + ">; (this: That, params: ", + "UpdateByQueryRequest", + " | ", + "UpdateByQueryRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "UpdateByQueryResponse", + ", unknown>>; (this: That, params: ", + "UpdateByQueryRequest", + " | ", + "UpdateByQueryRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "UpdateByQueryResponse", + ">; }; updateByQueryRethrottle: { (this: That, params: ", + "UpdateByQueryRethrottleRequest", + " | ", + "UpdateByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "UpdateByQueryRethrottleResponse", + ">; (this: That, params: ", + "UpdateByQueryRethrottleRequest", + " | ", + "UpdateByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "UpdateByQueryRethrottleResponse", + ", unknown>>; (this: That, params: ", + "UpdateByQueryRethrottleRequest", + " | ", + "UpdateByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "UpdateByQueryRethrottleResponse", + ">; }; watcher: ", + "default", + "; xpack: ", + "default", + "; }" + ], + "path": "src/core/server/elasticsearch/client/scoped_cluster_client.ts", + "deprecated": false + }, + { + "parentPluginId": "core", + "id": "def-server.IScopedClusterClient.asCurrentUser", + "type": "Object", "tags": [], - "label": "asInternalUser", + "label": "asCurrentUser", "description": [ - "\nA {@link ElasticsearchClient | client} to be used to query the elasticsearch cluster\non behalf of the internal Kibana user." + "\nA {@link ElasticsearchClient | client} to be used to query the elasticsearch cluster\non behalf of the user that initiated the request to the Kibana server." ], "signature": [ - "Omit<", - "KibanaClient", - ", \"extend\" | \"connectionPool\" | \"transport\" | \"serializer\" | \"child\" | \"close\" | \"diagnostic\"> & { transport: { request(params: ", - "TransportRequestParams", + "{ eql: ", + "default", + "; search: { >(this: That, params?: ", + "SearchRequest", + " | ", + "SearchRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "SearchResponse", + ">; >(this: That, params?: ", + "SearchRequest", + " | ", + "SearchRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "SearchResponse", + ", unknown>>; >(this: That, params?: ", + "SearchRequest", + " | ", + "SearchRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "SearchResponse", + ">; }; create: { (this: That, params: ", + "CreateRequest", + " | ", + "CreateRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "CreateResponse", + ">; (this: That, params: ", + "CreateRequest", + " | ", + "CreateRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "CreateResponse", + ", unknown>>; (this: That, params: ", + "CreateRequest", + " | ", + "CreateRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "CreateResponse", + ">; }; monitoring: ", + "default", + "; security: ", + "default", + "; name: string | symbol; index: { (this: That, params: ", + "IndexRequest", + " | ", + "IndexRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "IndexResponse", + ">; (this: That, params: ", + "IndexRequest", + " | ", + "IndexRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "IndexResponse", + ", unknown>>; (this: That, params: ", + "IndexRequest", + " | ", + "IndexRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "IndexResponse", + ">; }; delete: { (this: That, params: ", + "DeleteRequest", + " | ", + "DeleteRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "DeleteResponse", + ">; (this: That, params: ", + "DeleteRequest", + " | ", + "DeleteRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "DeleteResponse", + ", unknown>>; (this: That, params: ", + "DeleteRequest", + " | ", + "DeleteRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "DeleteResponse", + ">; }; get: { (this: That, params: ", + "GetRequest", + " | ", + "GetRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetResponse", + ">; (this: That, params: ", + "GetRequest", + " | ", + "GetRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "GetResponse", + ", unknown>>; (this: That, params: ", + "GetRequest", + " | ", + "GetRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "GetResponse", + ">; }; update: { (this: That, params: ", + "UpdateRequest", + " | ", + "UpdateRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "UpdateResponse", + ">; (this: That, params: ", + "UpdateRequest", + " | ", + "UpdateRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "UpdateResponse", + ", unknown>>; (this: That, params: ", + "UpdateRequest", + " | ", + "UpdateRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "UpdateResponse", + ">; }; closePointInTime: { (this: That, params: ", + "ClosePointInTimeRequest", + " | ", + "ClosePointInTimeRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ClosePointInTimeResponse", + ">; (this: That, params: ", + "ClosePointInTimeRequest", + " | ", + "ClosePointInTimeRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ClosePointInTimeResponse", + ", unknown>>; (this: That, params: ", + "ClosePointInTimeRequest", + " | ", + "ClosePointInTimeRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ClosePointInTimeResponse", + ">; }; transform: ", + "default", + "; helpers: ", + "default", + "; [kInternal]: symbol | null; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", + "default", + "; Internal: ", + "default", + "; asyncSearch: ", + "default", + "; autoscaling: ", + "default", + "; bulk: { (this: That, params: ", + "BulkRequest", + " | ", + "BulkRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "BulkResponse", + ">; (this: That, params: ", + "BulkRequest", + " | ", + "BulkRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "BulkResponse", + ", unknown>>; (this: That, params: ", + "BulkRequest", + " | ", + "BulkRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "BulkResponse", + ">; }; cat: ", + "default", + "; ccr: ", + "default", + "; clearScroll: { (this: That, params?: ", + "ClearScrollRequest", + " | ", + "ClearScrollRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ClearScrollResponse", + ">; (this: That, params?: ", + "ClearScrollRequest", + " | ", + "ClearScrollRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ClearScrollResponse", + ", unknown>>; (this: That, params?: ", + "ClearScrollRequest", + " | ", + "ClearScrollRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ClearScrollResponse", + ">; }; cluster: ", + "default", + "; count: { (this: That, params?: ", + "CountRequest", + " | ", + "CountRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "CountResponse", + ">; (this: That, params?: ", + "CountRequest", + " | ", + "CountRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "CountResponse", + ", unknown>>; (this: That, params?: ", + "CountRequest", + " | ", + "CountRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "CountResponse", + ">; }; danglingIndices: ", + "default", + "; deleteByQuery: { (this: That, params: ", + "DeleteByQueryRequest", + " | ", + "DeleteByQueryRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "DeleteByQueryResponse", + ">; (this: That, params: ", + "DeleteByQueryRequest", + " | ", + "DeleteByQueryRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "DeleteByQueryResponse", + ", unknown>>; (this: That, params: ", + "DeleteByQueryRequest", + " | ", + "DeleteByQueryRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "DeleteByQueryResponse", + ">; }; deleteByQueryRethrottle: { (this: That, params: ", + "DeleteByQueryRethrottleRequest", + " | ", + "DeleteByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "DeleteByQueryRethrottleResponse", + ">; (this: That, params: ", + "DeleteByQueryRethrottleRequest", + " | ", + "DeleteByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "DeleteByQueryRethrottleResponse", + ", unknown>>; (this: That, params: ", + "DeleteByQueryRethrottleRequest", + " | ", + "DeleteByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "DeleteByQueryRethrottleResponse", + ">; }; deleteScript: { (this: That, params: ", + "DeleteScriptRequest", + " | ", + "DeleteScriptRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "DeleteScriptResponse", + ">; (this: That, params: ", + "DeleteScriptRequest", + " | ", + "DeleteScriptRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "DeleteScriptResponse", + ", unknown>>; (this: That, params: ", + "DeleteScriptRequest", + " | ", + "DeleteScriptRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "DeleteScriptResponse", + ">; }; enrich: ", + "default", + "; exists: { (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; existsSource: { (this: That, params: ", + "ExistsSourceRequest", + " | ", + "ExistsSourceRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "ExistsSourceRequest", + " | ", + "ExistsSourceRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "ExistsSourceRequest", + " | ", + "ExistsSourceRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; explain: { (this: That, params: ", + "ExplainRequest", + " | ", + "ExplainRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ExplainResponse", + ">; (this: That, params: ", + "ExplainRequest", + " | ", + "ExplainRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ExplainResponse", + ", unknown>>; (this: That, params: ", + "ExplainRequest", + " | ", + "ExplainRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ExplainResponse", + ">; }; features: ", + "default", + "; fieldCaps: { (this: That, params?: ", + "FieldCapsRequest", + " | ", + "FieldCapsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "FieldCapsResponse", + ">; (this: That, params?: ", + "FieldCapsRequest", + " | ", + "FieldCapsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "FieldCapsResponse", + ", unknown>>; (this: That, params?: ", + "FieldCapsRequest", + " | ", + "FieldCapsRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "FieldCapsResponse", + ">; }; fleet: ", + "default", + "; getScript: { (this: That, params: ", + "GetScriptRequest", + " | ", + "GetScriptRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetScriptResponse", + ">; (this: That, params: ", + "GetScriptRequest", + " | ", + "GetScriptRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "GetScriptResponse", + ", unknown>>; (this: That, params: ", + "GetScriptRequest", + " | ", + "GetScriptRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "GetScriptResponse", + ">; }; getScriptContext: { (this: That, params?: ", + "GetScriptContextRequest", + " | ", + "GetScriptContextRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetScriptContextResponse", + ">; (this: That, params?: ", + "GetScriptContextRequest", + " | ", + "GetScriptContextRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "GetScriptContextResponse", + ", unknown>>; (this: That, params?: ", + "GetScriptContextRequest", + " | ", + "GetScriptContextRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "GetScriptContextResponse", + ">; }; getScriptLanguages: { (this: That, params?: ", + "GetScriptLanguagesRequest", + " | ", + "GetScriptLanguagesRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetScriptLanguagesResponse", + ">; (this: That, params?: ", + "GetScriptLanguagesRequest", + " | ", + "GetScriptLanguagesRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "GetScriptLanguagesResponse", + ", unknown>>; (this: That, params?: ", + "GetScriptLanguagesRequest", + " | ", + "GetScriptLanguagesRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "GetScriptLanguagesResponse", + ">; }; getSource: { (this: That, params: ", + "GetSourceRequest", + " | ", + "GetSourceRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "GetSourceRequest", + " | ", + "GetSourceRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "GetSourceRequest", + " | ", + "GetSourceRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; graph: ", + "default", + "; ilm: ", + "default", + "; indices: ", + "default", + "; info: { (this: That, params?: ", + "InfoRequest", + " | ", + "InfoRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "InfoResponse", + ">; (this: That, params?: ", + "InfoRequest", + " | ", + "InfoRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "InfoResponse", + ", unknown>>; (this: That, params?: ", + "InfoRequest", + " | ", + "InfoRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "InfoResponse", + ">; }; ingest: ", + "default", + "; knnSearch: { (this: That, params: ", + "KnnSearchRequest", + " | ", + "KnnSearchRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "KnnSearchResponse", + ">; (this: That, params: ", + "KnnSearchRequest", + " | ", + "KnnSearchRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "KnnSearchResponse", + ", unknown>>; (this: That, params: ", + "KnnSearchRequest", + " | ", + "KnnSearchRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "KnnSearchResponse", + ">; }; license: ", + "default", + "; logstash: ", + "default", + "; mget: { (this: That, params?: ", + "MgetRequest", + " | ", + "MgetRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MgetResponse", + ">; (this: That, params?: ", + "MgetRequest", + " | ", + "MgetRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "MgetResponse", + ", unknown>>; (this: That, params?: ", + "MgetRequest", + " | ", + "MgetRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "MgetResponse", + ">; }; migration: ", + "default", + "; ml: ", + "default", + "; msearch: { >(this: That, params: ", + "MsearchRequest", + " | ", + "MsearchRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MsearchResponse", + ">; >(this: That, params: ", + "MsearchRequest", + " | ", + "MsearchRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "MsearchResponse", + ", unknown>>; >(this: That, params: ", + "MsearchRequest", + " | ", + "MsearchRequest", ", options?: ", "TransportRequestOptions", " | undefined): Promise<", + "MsearchResponse", + ">; }; msearchTemplate: { >(this: That, params: ", + "MsearchTemplateRequest", + " | ", + "MsearchTemplateRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MsearchTemplateResponse", + ">; >(this: That, params: ", + "MsearchTemplateRequest", + " | ", + "MsearchTemplateRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", - ">; }; }" - ], - "path": "src/core/server/elasticsearch/client/scoped_cluster_client.ts", - "deprecated": false - }, - { - "parentPluginId": "core", - "id": "def-server.IScopedClusterClient.asCurrentUser", - "type": "CompoundType", - "tags": [], - "label": "asCurrentUser", - "description": [ - "\nA {@link ElasticsearchClient | client} to be used to query the elasticsearch cluster\non behalf of the user that initiated the request to the Kibana server." - ], - "signature": [ - "Omit<", - "KibanaClient", - ", \"extend\" | \"connectionPool\" | \"transport\" | \"serializer\" | \"child\" | \"close\" | \"diagnostic\"> & { transport: { request(params: ", - "TransportRequestParams", + "<", + "MsearchTemplateResponse", + ", unknown>>; >(this: That, params: ", + "MsearchTemplateRequest", + " | ", + "MsearchTemplateRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "MsearchTemplateResponse", + ">; }; mtermvectors: { (this: That, params?: ", + "MtermvectorsRequest", + " | ", + "MtermvectorsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MtermvectorsResponse", + ">; (this: That, params?: ", + "MtermvectorsRequest", + " | ", + "MtermvectorsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "MtermvectorsResponse", + ", unknown>>; (this: That, params?: ", + "MtermvectorsRequest", + " | ", + "MtermvectorsRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "MtermvectorsResponse", + ">; }; nodes: ", + "default", + "; openPointInTime: { (this: That, params: ", + "OpenPointInTimeRequest", + " | ", + "OpenPointInTimeRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "OpenPointInTimeResponse", + ">; (this: That, params: ", + "OpenPointInTimeRequest", + " | ", + "OpenPointInTimeRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "OpenPointInTimeResponse", + ", unknown>>; (this: That, params: ", + "OpenPointInTimeRequest", + " | ", + "OpenPointInTimeRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "OpenPointInTimeResponse", + ">; }; ping: { (this: That, params?: ", + "PingRequest", + " | ", + "PingRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params?: ", + "PingRequest", + " | ", + "PingRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params?: ", + "PingRequest", + " | ", + "PingRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; putScript: { (this: That, params: ", + "PutScriptRequest", + " | ", + "PutScriptRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "PutScriptResponse", + ">; (this: That, params: ", + "PutScriptRequest", + " | ", + "PutScriptRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "PutScriptResponse", + ", unknown>>; (this: That, params: ", + "PutScriptRequest", + " | ", + "PutScriptRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "PutScriptResponse", + ">; }; rankEval: { (this: That, params: ", + "RankEvalRequest", + " | ", + "RankEvalRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "RankEvalResponse", + ">; (this: That, params: ", + "RankEvalRequest", + " | ", + "RankEvalRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "RankEvalResponse", + ", unknown>>; (this: That, params: ", + "RankEvalRequest", + " | ", + "RankEvalRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "RankEvalResponse", + ">; }; reindex: { (this: That, params?: ", + "ReindexRequest", + " | ", + "ReindexRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ReindexResponse", + ">; (this: That, params?: ", + "ReindexRequest", + " | ", + "ReindexRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ReindexResponse", + ", unknown>>; (this: That, params?: ", + "ReindexRequest", + " | ", + "ReindexRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ReindexResponse", + ">; }; reindexRethrottle: { (this: That, params: ", + "ReindexRethrottleRequest", + " | ", + "ReindexRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ReindexRethrottleResponse", + ">; (this: That, params: ", + "ReindexRethrottleRequest", + " | ", + "ReindexRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ReindexRethrottleResponse", + ", unknown>>; (this: That, params: ", + "ReindexRethrottleRequest", + " | ", + "ReindexRethrottleRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ReindexRethrottleResponse", + ">; }; renderSearchTemplate: { (this: That, params?: ", + "RenderSearchTemplateRequest", + " | ", + "RenderSearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "RenderSearchTemplateResponse", + ">; (this: That, params?: ", + "RenderSearchTemplateRequest", + " | ", + "RenderSearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "RenderSearchTemplateResponse", + ", unknown>>; (this: That, params?: ", + "RenderSearchTemplateRequest", + " | ", + "RenderSearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "RenderSearchTemplateResponse", + ">; }; rollup: ", + "default", + "; scriptsPainlessExecute: { (this: That, params?: ", + "ScriptsPainlessExecuteRequest", + " | ", + "ScriptsPainlessExecuteRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ScriptsPainlessExecuteResponse", + ">; (this: That, params?: ", + "ScriptsPainlessExecuteRequest", + " | ", + "ScriptsPainlessExecuteRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ScriptsPainlessExecuteResponse", + ", unknown>>; (this: That, params?: ", + "ScriptsPainlessExecuteRequest", + " | ", + "ScriptsPainlessExecuteRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ScriptsPainlessExecuteResponse", + ">; }; scroll: { >(this: That, params: ", + "ScrollRequest", + " | ", + "ScrollRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ScrollResponse", + ">; >(this: That, params: ", + "ScrollRequest", + " | ", + "ScrollRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ScrollResponse", + ", unknown>>; >(this: That, params: ", + "ScrollRequest", + " | ", + "ScrollRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ScrollResponse", + ">; }; searchMvt: { (this: That, params: ", + "SearchMvtRequest", + " | ", + "SearchMvtRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "SearchMvtRequest", + " | ", + "SearchMvtRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "SearchMvtRequest", + " | ", + "SearchMvtRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; searchShards: { (this: That, params?: ", + "SearchShardsRequest", + " | ", + "SearchShardsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "SearchShardsResponse", + ">; (this: That, params?: ", + "SearchShardsRequest", + " | ", + "SearchShardsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "SearchShardsResponse", + ", unknown>>; (this: That, params?: ", + "SearchShardsRequest", + " | ", + "SearchShardsRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "SearchShardsResponse", + ">; }; searchTemplate: { (this: That, params?: ", + "SearchTemplateRequest", + " | ", + "SearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "SearchTemplateResponse", + ">; (this: That, params?: ", + "SearchTemplateRequest", + " | ", + "SearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "SearchTemplateResponse", + ", unknown>>; (this: That, params?: ", + "SearchTemplateRequest", + " | ", + "SearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "SearchTemplateResponse", + ">; }; searchableSnapshots: ", + "default", + "; shutdown: ", + "default", + "; slm: ", + "default", + "; snapshot: ", + "default", + "; sql: ", + "default", + "; ssl: ", + "default", + "; tasks: ", + "default", + "; termsEnum: { (this: That, params: ", + "TermsEnumRequest", + " | ", + "TermsEnumRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "TermsEnumResponse", + ">; (this: That, params: ", + "TermsEnumRequest", + " | ", + "TermsEnumRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "TermsEnumResponse", + ", unknown>>; (this: That, params: ", + "TermsEnumRequest", + " | ", + "TermsEnumRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "TermsEnumResponse", + ">; }; termvectors: { (this: That, params: ", + "TermvectorsRequest", + " | ", + "TermvectorsRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "TermvectorsResponse", + ">; (this: That, params: ", + "TermvectorsRequest", + " | ", + "TermvectorsRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "TermvectorsResponse", + ", unknown>>; (this: That, params: ", + "TermvectorsRequest", + " | ", + "TermvectorsRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "TermvectorsResponse", + ">; }; textStructure: ", + "default", + "; updateByQuery: { (this: That, params: ", + "UpdateByQueryRequest", + " | ", + "UpdateByQueryRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "UpdateByQueryResponse", + ">; (this: That, params: ", + "UpdateByQueryRequest", + " | ", + "UpdateByQueryRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "UpdateByQueryResponse", + ", unknown>>; (this: That, params: ", + "UpdateByQueryRequest", + " | ", + "UpdateByQueryRequest", ", options?: ", "TransportRequestOptions", " | undefined): Promise<", + "UpdateByQueryResponse", + ">; }; updateByQueryRethrottle: { (this: That, params: ", + "UpdateByQueryRethrottleRequest", + " | ", + "UpdateByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "UpdateByQueryRethrottleResponse", + ">; (this: That, params: ", + "UpdateByQueryRethrottleRequest", + " | ", + "UpdateByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", - ">; }; }" + "<", + "UpdateByQueryRethrottleResponse", + ", unknown>>; (this: That, params: ", + "UpdateByQueryRethrottleRequest", + " | ", + "UpdateByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "UpdateByQueryRethrottleResponse", + ">; }; watcher: ", + "default", + "; xpack: ", + "default", + "; }" ], "path": "src/core/server/elasticsearch/client/scoped_cluster_client.ts", "deprecated": false @@ -13285,9 +16786,6 @@ "description": [ "\r\nLogger exposes all the necessary methods to log any type of information and\r\nthis is the interface used by the logging consumers including plugins.\r\n" ], - "signature": [ - "Logger" - ], "path": "node_modules/@types/kbn__logging/index.d.ts", "deprecated": false, "children": [ @@ -13715,9 +17213,6 @@ "description": [ "\r\nThe single purpose of `LoggerFactory` interface is to define a way to\r\nretrieve a context-based logger instance.\r\n" ], - "signature": [ - "LoggerFactory" - ], "path": "node_modules/@types/kbn__logging/index.d.ts", "deprecated": false, "children": [ @@ -14407,9 +17902,6 @@ "tags": [], "label": "PackageInfo", "description": [], - "signature": [ - "PackageInfo" - ], "path": "node_modules/@types/kbn__config/index.d.ts", "deprecated": false, "children": [ @@ -15048,20 +18540,1196 @@ { "parentPluginId": "core", "id": "def-server.PollEsNodesVersionOptions.internalClient", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "internalClient", "description": [], "signature": [ - "Omit<", - "KibanaClient", - ", \"extend\" | \"connectionPool\" | \"transport\" | \"serializer\" | \"child\" | \"close\" | \"diagnostic\"> & { transport: { request(params: ", - "TransportRequestParams", + "{ eql: ", + "default", + "; search: { >(this: That, params?: ", + "SearchRequest", + " | ", + "SearchRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "SearchResponse", + ">; >(this: That, params?: ", + "SearchRequest", + " | ", + "SearchRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "SearchResponse", + ", unknown>>; >(this: That, params?: ", + "SearchRequest", + " | ", + "SearchRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "SearchResponse", + ">; }; create: { (this: That, params: ", + "CreateRequest", + " | ", + "CreateRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "CreateResponse", + ">; (this: That, params: ", + "CreateRequest", + " | ", + "CreateRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "CreateResponse", + ", unknown>>; (this: That, params: ", + "CreateRequest", + " | ", + "CreateRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "CreateResponse", + ">; }; monitoring: ", + "default", + "; security: ", + "default", + "; name: string | symbol; index: { (this: That, params: ", + "IndexRequest", + " | ", + "IndexRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "IndexResponse", + ">; (this: That, params: ", + "IndexRequest", + " | ", + "IndexRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "IndexResponse", + ", unknown>>; (this: That, params: ", + "IndexRequest", + " | ", + "IndexRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "IndexResponse", + ">; }; delete: { (this: That, params: ", + "DeleteRequest", + " | ", + "DeleteRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "DeleteResponse", + ">; (this: That, params: ", + "DeleteRequest", + " | ", + "DeleteRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "DeleteResponse", + ", unknown>>; (this: That, params: ", + "DeleteRequest", + " | ", + "DeleteRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "DeleteResponse", + ">; }; get: { (this: That, params: ", + "GetRequest", + " | ", + "GetRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetResponse", + ">; (this: That, params: ", + "GetRequest", + " | ", + "GetRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "GetResponse", + ", unknown>>; (this: That, params: ", + "GetRequest", + " | ", + "GetRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "GetResponse", + ">; }; update: { (this: That, params: ", + "UpdateRequest", + " | ", + "UpdateRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "UpdateResponse", + ">; (this: That, params: ", + "UpdateRequest", + " | ", + "UpdateRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "UpdateResponse", + ", unknown>>; (this: That, params: ", + "UpdateRequest", + " | ", + "UpdateRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "UpdateResponse", + ">; }; closePointInTime: { (this: That, params: ", + "ClosePointInTimeRequest", + " | ", + "ClosePointInTimeRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ClosePointInTimeResponse", + ">; (this: That, params: ", + "ClosePointInTimeRequest", + " | ", + "ClosePointInTimeRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ClosePointInTimeResponse", + ", unknown>>; (this: That, params: ", + "ClosePointInTimeRequest", + " | ", + "ClosePointInTimeRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ClosePointInTimeResponse", + ">; }; transform: ", + "default", + "; helpers: ", + "default", + "; [kInternal]: symbol | null; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", + "default", + "; Internal: ", + "default", + "; asyncSearch: ", + "default", + "; autoscaling: ", + "default", + "; bulk: { (this: That, params: ", + "BulkRequest", + " | ", + "BulkRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "BulkResponse", + ">; (this: That, params: ", + "BulkRequest", + " | ", + "BulkRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "BulkResponse", + ", unknown>>; (this: That, params: ", + "BulkRequest", + " | ", + "BulkRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "BulkResponse", + ">; }; cat: ", + "default", + "; ccr: ", + "default", + "; clearScroll: { (this: That, params?: ", + "ClearScrollRequest", + " | ", + "ClearScrollRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ClearScrollResponse", + ">; (this: That, params?: ", + "ClearScrollRequest", + " | ", + "ClearScrollRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ClearScrollResponse", + ", unknown>>; (this: That, params?: ", + "ClearScrollRequest", + " | ", + "ClearScrollRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ClearScrollResponse", + ">; }; cluster: ", + "default", + "; count: { (this: That, params?: ", + "CountRequest", + " | ", + "CountRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "CountResponse", + ">; (this: That, params?: ", + "CountRequest", + " | ", + "CountRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "CountResponse", + ", unknown>>; (this: That, params?: ", + "CountRequest", + " | ", + "CountRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "CountResponse", + ">; }; danglingIndices: ", + "default", + "; deleteByQuery: { (this: That, params: ", + "DeleteByQueryRequest", + " | ", + "DeleteByQueryRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "DeleteByQueryResponse", + ">; (this: That, params: ", + "DeleteByQueryRequest", + " | ", + "DeleteByQueryRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "DeleteByQueryResponse", + ", unknown>>; (this: That, params: ", + "DeleteByQueryRequest", + " | ", + "DeleteByQueryRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "DeleteByQueryResponse", + ">; }; deleteByQueryRethrottle: { (this: That, params: ", + "DeleteByQueryRethrottleRequest", + " | ", + "DeleteByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "DeleteByQueryRethrottleResponse", + ">; (this: That, params: ", + "DeleteByQueryRethrottleRequest", + " | ", + "DeleteByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "DeleteByQueryRethrottleResponse", + ", unknown>>; (this: That, params: ", + "DeleteByQueryRethrottleRequest", + " | ", + "DeleteByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "DeleteByQueryRethrottleResponse", + ">; }; deleteScript: { (this: That, params: ", + "DeleteScriptRequest", + " | ", + "DeleteScriptRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "DeleteScriptResponse", + ">; (this: That, params: ", + "DeleteScriptRequest", + " | ", + "DeleteScriptRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "DeleteScriptResponse", + ", unknown>>; (this: That, params: ", + "DeleteScriptRequest", + " | ", + "DeleteScriptRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "DeleteScriptResponse", + ">; }; enrich: ", + "default", + "; exists: { (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; existsSource: { (this: That, params: ", + "ExistsSourceRequest", + " | ", + "ExistsSourceRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "ExistsSourceRequest", + " | ", + "ExistsSourceRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "ExistsSourceRequest", + " | ", + "ExistsSourceRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; explain: { (this: That, params: ", + "ExplainRequest", + " | ", + "ExplainRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ExplainResponse", + ">; (this: That, params: ", + "ExplainRequest", + " | ", + "ExplainRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ExplainResponse", + ", unknown>>; (this: That, params: ", + "ExplainRequest", + " | ", + "ExplainRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ExplainResponse", + ">; }; features: ", + "default", + "; fieldCaps: { (this: That, params?: ", + "FieldCapsRequest", + " | ", + "FieldCapsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "FieldCapsResponse", + ">; (this: That, params?: ", + "FieldCapsRequest", + " | ", + "FieldCapsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "FieldCapsResponse", + ", unknown>>; (this: That, params?: ", + "FieldCapsRequest", + " | ", + "FieldCapsRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "FieldCapsResponse", + ">; }; fleet: ", + "default", + "; getScript: { (this: That, params: ", + "GetScriptRequest", + " | ", + "GetScriptRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetScriptResponse", + ">; (this: That, params: ", + "GetScriptRequest", + " | ", + "GetScriptRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "GetScriptResponse", + ", unknown>>; (this: That, params: ", + "GetScriptRequest", + " | ", + "GetScriptRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "GetScriptResponse", + ">; }; getScriptContext: { (this: That, params?: ", + "GetScriptContextRequest", + " | ", + "GetScriptContextRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetScriptContextResponse", + ">; (this: That, params?: ", + "GetScriptContextRequest", + " | ", + "GetScriptContextRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "GetScriptContextResponse", + ", unknown>>; (this: That, params?: ", + "GetScriptContextRequest", + " | ", + "GetScriptContextRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "GetScriptContextResponse", + ">; }; getScriptLanguages: { (this: That, params?: ", + "GetScriptLanguagesRequest", + " | ", + "GetScriptLanguagesRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetScriptLanguagesResponse", + ">; (this: That, params?: ", + "GetScriptLanguagesRequest", + " | ", + "GetScriptLanguagesRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "GetScriptLanguagesResponse", + ", unknown>>; (this: That, params?: ", + "GetScriptLanguagesRequest", + " | ", + "GetScriptLanguagesRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "GetScriptLanguagesResponse", + ">; }; getSource: { (this: That, params: ", + "GetSourceRequest", + " | ", + "GetSourceRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "GetSourceRequest", + " | ", + "GetSourceRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "GetSourceRequest", + " | ", + "GetSourceRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; graph: ", + "default", + "; ilm: ", + "default", + "; indices: ", + "default", + "; info: { (this: That, params?: ", + "InfoRequest", + " | ", + "InfoRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "InfoResponse", + ">; (this: That, params?: ", + "InfoRequest", + " | ", + "InfoRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "InfoResponse", + ", unknown>>; (this: That, params?: ", + "InfoRequest", + " | ", + "InfoRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "InfoResponse", + ">; }; ingest: ", + "default", + "; knnSearch: { (this: That, params: ", + "KnnSearchRequest", + " | ", + "KnnSearchRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "KnnSearchResponse", + ">; (this: That, params: ", + "KnnSearchRequest", + " | ", + "KnnSearchRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "KnnSearchResponse", + ", unknown>>; (this: That, params: ", + "KnnSearchRequest", + " | ", + "KnnSearchRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "KnnSearchResponse", + ">; }; license: ", + "default", + "; logstash: ", + "default", + "; mget: { (this: That, params?: ", + "MgetRequest", + " | ", + "MgetRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MgetResponse", + ">; (this: That, params?: ", + "MgetRequest", + " | ", + "MgetRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "MgetResponse", + ", unknown>>; (this: That, params?: ", + "MgetRequest", + " | ", + "MgetRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "MgetResponse", + ">; }; migration: ", + "default", + "; ml: ", + "default", + "; msearch: { >(this: That, params: ", + "MsearchRequest", + " | ", + "MsearchRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MsearchResponse", + ">; >(this: That, params: ", + "MsearchRequest", + " | ", + "MsearchRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "MsearchResponse", + ", unknown>>; >(this: That, params: ", + "MsearchRequest", + " | ", + "MsearchRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "MsearchResponse", + ">; }; msearchTemplate: { >(this: That, params: ", + "MsearchTemplateRequest", + " | ", + "MsearchTemplateRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MsearchTemplateResponse", + ">; >(this: That, params: ", + "MsearchTemplateRequest", + " | ", + "MsearchTemplateRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "MsearchTemplateResponse", + ", unknown>>; >(this: That, params: ", + "MsearchTemplateRequest", + " | ", + "MsearchTemplateRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "MsearchTemplateResponse", + ">; }; mtermvectors: { (this: That, params?: ", + "MtermvectorsRequest", + " | ", + "MtermvectorsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MtermvectorsResponse", + ">; (this: That, params?: ", + "MtermvectorsRequest", + " | ", + "MtermvectorsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "MtermvectorsResponse", + ", unknown>>; (this: That, params?: ", + "MtermvectorsRequest", + " | ", + "MtermvectorsRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "MtermvectorsResponse", + ">; }; nodes: ", + "default", + "; openPointInTime: { (this: That, params: ", + "OpenPointInTimeRequest", + " | ", + "OpenPointInTimeRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "OpenPointInTimeResponse", + ">; (this: That, params: ", + "OpenPointInTimeRequest", + " | ", + "OpenPointInTimeRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "OpenPointInTimeResponse", + ", unknown>>; (this: That, params: ", + "OpenPointInTimeRequest", + " | ", + "OpenPointInTimeRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "OpenPointInTimeResponse", + ">; }; ping: { (this: That, params?: ", + "PingRequest", + " | ", + "PingRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params?: ", + "PingRequest", + " | ", + "PingRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params?: ", + "PingRequest", + " | ", + "PingRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; putScript: { (this: That, params: ", + "PutScriptRequest", + " | ", + "PutScriptRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "PutScriptResponse", + ">; (this: That, params: ", + "PutScriptRequest", + " | ", + "PutScriptRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "PutScriptResponse", + ", unknown>>; (this: That, params: ", + "PutScriptRequest", + " | ", + "PutScriptRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "PutScriptResponse", + ">; }; rankEval: { (this: That, params: ", + "RankEvalRequest", + " | ", + "RankEvalRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "RankEvalResponse", + ">; (this: That, params: ", + "RankEvalRequest", + " | ", + "RankEvalRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "RankEvalResponse", + ", unknown>>; (this: That, params: ", + "RankEvalRequest", + " | ", + "RankEvalRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "RankEvalResponse", + ">; }; reindex: { (this: That, params?: ", + "ReindexRequest", + " | ", + "ReindexRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ReindexResponse", + ">; (this: That, params?: ", + "ReindexRequest", + " | ", + "ReindexRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ReindexResponse", + ", unknown>>; (this: That, params?: ", + "ReindexRequest", + " | ", + "ReindexRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ReindexResponse", + ">; }; reindexRethrottle: { (this: That, params: ", + "ReindexRethrottleRequest", + " | ", + "ReindexRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ReindexRethrottleResponse", + ">; (this: That, params: ", + "ReindexRethrottleRequest", + " | ", + "ReindexRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ReindexRethrottleResponse", + ", unknown>>; (this: That, params: ", + "ReindexRethrottleRequest", + " | ", + "ReindexRethrottleRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ReindexRethrottleResponse", + ">; }; renderSearchTemplate: { (this: That, params?: ", + "RenderSearchTemplateRequest", + " | ", + "RenderSearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "RenderSearchTemplateResponse", + ">; (this: That, params?: ", + "RenderSearchTemplateRequest", + " | ", + "RenderSearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "RenderSearchTemplateResponse", + ", unknown>>; (this: That, params?: ", + "RenderSearchTemplateRequest", + " | ", + "RenderSearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "RenderSearchTemplateResponse", + ">; }; rollup: ", + "default", + "; scriptsPainlessExecute: { (this: That, params?: ", + "ScriptsPainlessExecuteRequest", + " | ", + "ScriptsPainlessExecuteRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ScriptsPainlessExecuteResponse", + ">; (this: That, params?: ", + "ScriptsPainlessExecuteRequest", + " | ", + "ScriptsPainlessExecuteRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ScriptsPainlessExecuteResponse", + ", unknown>>; (this: That, params?: ", + "ScriptsPainlessExecuteRequest", + " | ", + "ScriptsPainlessExecuteRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ScriptsPainlessExecuteResponse", + ">; }; scroll: { >(this: That, params: ", + "ScrollRequest", + " | ", + "ScrollRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ScrollResponse", + ">; >(this: That, params: ", + "ScrollRequest", + " | ", + "ScrollRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ScrollResponse", + ", unknown>>; >(this: That, params: ", + "ScrollRequest", + " | ", + "ScrollRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ScrollResponse", + ">; }; searchMvt: { (this: That, params: ", + "SearchMvtRequest", + " | ", + "SearchMvtRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "SearchMvtRequest", + " | ", + "SearchMvtRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "SearchMvtRequest", + " | ", + "SearchMvtRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; searchShards: { (this: That, params?: ", + "SearchShardsRequest", + " | ", + "SearchShardsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "SearchShardsResponse", + ">; (this: That, params?: ", + "SearchShardsRequest", + " | ", + "SearchShardsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "SearchShardsResponse", + ", unknown>>; (this: That, params?: ", + "SearchShardsRequest", + " | ", + "SearchShardsRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "SearchShardsResponse", + ">; }; searchTemplate: { (this: That, params?: ", + "SearchTemplateRequest", + " | ", + "SearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "SearchTemplateResponse", + ">; (this: That, params?: ", + "SearchTemplateRequest", + " | ", + "SearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "SearchTemplateResponse", + ", unknown>>; (this: That, params?: ", + "SearchTemplateRequest", + " | ", + "SearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "SearchTemplateResponse", + ">; }; searchableSnapshots: ", + "default", + "; shutdown: ", + "default", + "; slm: ", + "default", + "; snapshot: ", + "default", + "; sql: ", + "default", + "; ssl: ", + "default", + "; tasks: ", + "default", + "; termsEnum: { (this: That, params: ", + "TermsEnumRequest", + " | ", + "TermsEnumRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "TermsEnumResponse", + ">; (this: That, params: ", + "TermsEnumRequest", + " | ", + "TermsEnumRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "TermsEnumResponse", + ", unknown>>; (this: That, params: ", + "TermsEnumRequest", + " | ", + "TermsEnumRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "TermsEnumResponse", + ">; }; termvectors: { (this: That, params: ", + "TermvectorsRequest", + " | ", + "TermvectorsRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "TermvectorsResponse", + ">; (this: That, params: ", + "TermvectorsRequest", + " | ", + "TermvectorsRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "TermvectorsResponse", + ", unknown>>; (this: That, params: ", + "TermvectorsRequest", + " | ", + "TermvectorsRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "TermvectorsResponse", + ">; }; textStructure: ", + "default", + "; updateByQuery: { (this: That, params: ", + "UpdateByQueryRequest", + " | ", + "UpdateByQueryRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "UpdateByQueryResponse", + ">; (this: That, params: ", + "UpdateByQueryRequest", + " | ", + "UpdateByQueryRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "UpdateByQueryResponse", + ", unknown>>; (this: That, params: ", + "UpdateByQueryRequest", + " | ", + "UpdateByQueryRequest", ", options?: ", "TransportRequestOptions", " | undefined): Promise<", + "UpdateByQueryResponse", + ">; }; updateByQueryRethrottle: { (this: That, params: ", + "UpdateByQueryRethrottleRequest", + " | ", + "UpdateByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "UpdateByQueryRethrottleResponse", + ">; (this: That, params: ", + "UpdateByQueryRethrottleRequest", + " | ", + "UpdateByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", - ">; }; }" + "<", + "UpdateByQueryRethrottleResponse", + ", unknown>>; (this: That, params: ", + "UpdateByQueryRethrottleRequest", + " | ", + "UpdateByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "UpdateByQueryRethrottleResponse", + ">; }; watcher: ", + "default", + "; xpack: ", + "default", + "; }" ], "path": "src/core/server/elasticsearch/version_check/ensure_es_version.ts", "deprecated": false @@ -16505,9 +21173,7 @@ "\nMetric to track once this property changes" ], "signature": [ - "{ type: ", - "UiCounterMetricType", - "; name: string; } | undefined" + "{ type: string; name: string; } | undefined" ], "path": "src/core/types/ui_settings.ts", "deprecated": true, @@ -17263,129 +21929,1305 @@ "text": "ConfigDeprecationDetails" }, " | ", - { - "pluginId": "core", - "scope": "server", - "docId": "kibCorePluginApi", - "section": "def-server.FeatureDeprecationDetails", - "text": "FeatureDeprecationDetails" - } - ], - "path": "src/core/server/deprecations/types.ts", - "deprecated": false, - "initialIsOpen": false - }, - { - "parentPluginId": "core", - "id": "def-server.DocLinksServiceStart", - "type": "Type", - "tags": [], - "label": "DocLinksServiceStart", - "description": [], - "signature": [ - { - "pluginId": "core", - "scope": "server", - "docId": "kibCorePluginApi", - "section": "def-server.DocLinksServiceSetup", - "text": "DocLinksServiceSetup" - } - ], - "path": "src/core/server/doc_links/types.ts", - "deprecated": false, - "initialIsOpen": false - }, - { - "parentPluginId": "core", - "id": "def-server.Ecs", - "type": "Type", - "tags": [], - "label": "Ecs", - "description": [ - "\r\nRepresents the full ECS schema.\r\n" - ], - "signature": [ - "EcsBase & EcsTracing & { ecs: EcsField; agent?: EcsAgent | undefined; as?: EcsAutonomousSystem | undefined; client?: EcsClient | undefined; cloud?: EcsCloud | undefined; container?: EcsContainer | undefined; data_stream?: EcsDataStream | undefined; destination?: EcsDestination | undefined; dns?: EcsDns | undefined; email?: EcsEmail | undefined; error?: EcsError | undefined; event?: EcsEvent | undefined; file?: EcsFile | undefined; group?: EcsGroup | undefined; host?: EcsHost | undefined; http?: EcsHttp | undefined; log?: EcsLog | undefined; network?: EcsNetwork | undefined; observer?: EcsObserver | undefined; orchestrator?: EcsOrchestrator | undefined; organization?: EcsOrganization | undefined; package?: EcsPackage | undefined; process?: EcsProcess | undefined; registry?: EcsRegistry | undefined; related?: EcsRelated | undefined; rule?: EcsRule | undefined; server?: EcsServer | undefined; service?: EcsService | undefined; source?: EcsSource | undefined; threat?: EcsThreat | undefined; tls?: EcsTls | undefined; url?: EcsUrl | undefined; user?: EcsUser | undefined; user_agent?: EcsUserAgent | undefined; vulnerability?: EcsVulnerability | undefined; }" - ], - "path": "node_modules/@types/kbn__logging/index.d.ts", - "deprecated": false, - "initialIsOpen": false - }, - { - "parentPluginId": "core", - "id": "def-server.EcsEventCategory", - "type": "Type", - "tags": [], - "label": "EcsEventCategory", - "description": [], - "signature": [ - "\"database\" | \"package\" | \"network\" | \"web\" | \"host\" | \"session\" | \"file\" | \"registry\" | \"process\" | \"authentication\" | \"configuration\" | \"driver\" | \"iam\" | \"intrusion_detection\" | \"malware\"" - ], - "path": "node_modules/@types/kbn__logging/index.d.ts", - "deprecated": false, - "initialIsOpen": false - }, - { - "parentPluginId": "core", - "id": "def-server.EcsEventKind", - "type": "Type", - "tags": [], - "label": "EcsEventKind", - "description": [], - "signature": [ - "\"alert\" | \"metric\" | \"event\" | \"state\" | \"signal\" | \"pipeline_error\"" - ], - "path": "node_modules/@types/kbn__logging/index.d.ts", - "deprecated": false, - "initialIsOpen": false - }, - { - "parentPluginId": "core", - "id": "def-server.EcsEventOutcome", - "type": "Type", - "tags": [], - "label": "EcsEventOutcome", - "description": [], - "signature": [ - "\"unknown\" | \"success\" | \"failure\"" - ], - "path": "node_modules/@types/kbn__logging/index.d.ts", - "deprecated": false, - "initialIsOpen": false - }, - { - "parentPluginId": "core", - "id": "def-server.EcsEventType", - "type": "Type", - "tags": [], - "label": "EcsEventType", - "description": [], - "signature": [ - "\"start\" | \"user\" | \"error\" | \"end\" | \"info\" | \"group\" | \"protocol\" | \"connection\" | \"access\" | \"admin\" | \"allowed\" | \"change\" | \"creation\" | \"deletion\" | \"denied\" | \"installation\"" - ], - "path": "node_modules/@types/kbn__logging/index.d.ts", - "deprecated": false, - "initialIsOpen": false - }, - { - "parentPluginId": "core", - "id": "def-server.ElasticsearchClient", - "type": "Type", - "tags": [], - "label": "ElasticsearchClient", - "description": [ - "\nClient used to query the elasticsearch cluster.\n" - ], - "signature": [ - "Omit<", - "KibanaClient", - ", \"extend\" | \"connectionPool\" | \"transport\" | \"serializer\" | \"child\" | \"close\" | \"diagnostic\"> & { transport: { request(params: ", - "TransportRequestParams", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCorePluginApi", + "section": "def-server.FeatureDeprecationDetails", + "text": "FeatureDeprecationDetails" + } + ], + "path": "src/core/server/deprecations/types.ts", + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "core", + "id": "def-server.DocLinksServiceStart", + "type": "Type", + "tags": [], + "label": "DocLinksServiceStart", + "description": [], + "signature": [ + { + "pluginId": "core", + "scope": "server", + "docId": "kibCorePluginApi", + "section": "def-server.DocLinksServiceSetup", + "text": "DocLinksServiceSetup" + } + ], + "path": "src/core/server/doc_links/types.ts", + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "core", + "id": "def-server.Ecs", + "type": "Type", + "tags": [], + "label": "Ecs", + "description": [ + "\r\nRepresents the full ECS schema.\r\n" + ], + "signature": [ + "EcsBase & EcsTracing & { ecs: EcsField; agent?: EcsAgent | undefined; as?: EcsAutonomousSystem | undefined; client?: EcsClient | undefined; cloud?: EcsCloud | undefined; container?: EcsContainer | undefined; data_stream?: EcsDataStream | undefined; destination?: EcsDestination | undefined; dns?: EcsDns | undefined; email?: EcsEmail | undefined; error?: EcsError | undefined; event?: EcsEvent | undefined; file?: EcsFile | undefined; group?: EcsGroup | undefined; host?: EcsHost | undefined; http?: EcsHttp | undefined; log?: EcsLog | undefined; network?: EcsNetwork | undefined; observer?: EcsObserver | undefined; orchestrator?: EcsOrchestrator | undefined; organization?: EcsOrganization | undefined; package?: EcsPackage | undefined; process?: EcsProcess | undefined; registry?: EcsRegistry | undefined; related?: EcsRelated | undefined; rule?: EcsRule | undefined; server?: EcsServer | undefined; service?: EcsService | undefined; source?: EcsSource | undefined; threat?: EcsThreat | undefined; tls?: EcsTls | undefined; url?: EcsUrl | undefined; user?: EcsUser | undefined; user_agent?: EcsUserAgent | undefined; vulnerability?: EcsVulnerability | undefined; }" + ], + "path": "node_modules/@types/kbn__logging/index.d.ts", + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "core", + "id": "def-server.EcsEventCategory", + "type": "Type", + "tags": [], + "label": "EcsEventCategory", + "description": [], + "signature": [ + "\"database\" | \"package\" | \"network\" | \"web\" | \"host\" | \"session\" | \"file\" | \"registry\" | \"process\" | \"authentication\" | \"configuration\" | \"driver\" | \"iam\" | \"intrusion_detection\" | \"malware\"" + ], + "path": "node_modules/@types/kbn__logging/index.d.ts", + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "core", + "id": "def-server.EcsEventKind", + "type": "Type", + "tags": [], + "label": "EcsEventKind", + "description": [], + "signature": [ + "\"alert\" | \"metric\" | \"event\" | \"state\" | \"signal\" | \"pipeline_error\"" + ], + "path": "node_modules/@types/kbn__logging/index.d.ts", + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "core", + "id": "def-server.EcsEventOutcome", + "type": "Type", + "tags": [], + "label": "EcsEventOutcome", + "description": [], + "signature": [ + "\"unknown\" | \"success\" | \"failure\"" + ], + "path": "node_modules/@types/kbn__logging/index.d.ts", + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "core", + "id": "def-server.EcsEventType", + "type": "Type", + "tags": [], + "label": "EcsEventType", + "description": [], + "signature": [ + "\"start\" | \"user\" | \"error\" | \"end\" | \"info\" | \"group\" | \"protocol\" | \"connection\" | \"access\" | \"admin\" | \"allowed\" | \"change\" | \"creation\" | \"deletion\" | \"denied\" | \"installation\"" + ], + "path": "node_modules/@types/kbn__logging/index.d.ts", + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "core", + "id": "def-server.ElasticsearchClient", + "type": "Type", + "tags": [], + "label": "ElasticsearchClient", + "description": [ + "\nClient used to query the elasticsearch cluster.\n" + ], + "signature": [ + "{ eql: ", + "default", + "; search: { >(this: That, params?: ", + "SearchRequest", + " | ", + "SearchRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "SearchResponse", + ">; >(this: That, params?: ", + "SearchRequest", + " | ", + "SearchRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "SearchResponse", + ", unknown>>; >(this: That, params?: ", + "SearchRequest", + " | ", + "SearchRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "SearchResponse", + ">; }; create: { (this: That, params: ", + "CreateRequest", + " | ", + "CreateRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "CreateResponse", + ">; (this: That, params: ", + "CreateRequest", + " | ", + "CreateRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "CreateResponse", + ", unknown>>; (this: That, params: ", + "CreateRequest", + " | ", + "CreateRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "CreateResponse", + ">; }; monitoring: ", + "default", + "; security: ", + "default", + "; name: string | symbol; index: { (this: That, params: ", + "IndexRequest", + " | ", + "IndexRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "IndexResponse", + ">; (this: That, params: ", + "IndexRequest", + " | ", + "IndexRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "IndexResponse", + ", unknown>>; (this: That, params: ", + "IndexRequest", + " | ", + "IndexRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "IndexResponse", + ">; }; delete: { (this: That, params: ", + "DeleteRequest", + " | ", + "DeleteRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "DeleteResponse", + ">; (this: That, params: ", + "DeleteRequest", + " | ", + "DeleteRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "DeleteResponse", + ", unknown>>; (this: That, params: ", + "DeleteRequest", + " | ", + "DeleteRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "DeleteResponse", + ">; }; get: { (this: That, params: ", + "GetRequest", + " | ", + "GetRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetResponse", + ">; (this: That, params: ", + "GetRequest", + " | ", + "GetRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "GetResponse", + ", unknown>>; (this: That, params: ", + "GetRequest", + " | ", + "GetRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "GetResponse", + ">; }; update: { (this: That, params: ", + "UpdateRequest", + " | ", + "UpdateRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "UpdateResponse", + ">; (this: That, params: ", + "UpdateRequest", + " | ", + "UpdateRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "UpdateResponse", + ", unknown>>; (this: That, params: ", + "UpdateRequest", + " | ", + "UpdateRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "UpdateResponse", + ">; }; closePointInTime: { (this: That, params: ", + "ClosePointInTimeRequest", + " | ", + "ClosePointInTimeRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ClosePointInTimeResponse", + ">; (this: That, params: ", + "ClosePointInTimeRequest", + " | ", + "ClosePointInTimeRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ClosePointInTimeResponse", + ", unknown>>; (this: That, params: ", + "ClosePointInTimeRequest", + " | ", + "ClosePointInTimeRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ClosePointInTimeResponse", + ">; }; transform: ", + "default", + "; helpers: ", + "default", + "; [kInternal]: symbol | null; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", + "default", + "; Internal: ", + "default", + "; asyncSearch: ", + "default", + "; autoscaling: ", + "default", + "; bulk: { (this: That, params: ", + "BulkRequest", + " | ", + "BulkRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "BulkResponse", + ">; (this: That, params: ", + "BulkRequest", + " | ", + "BulkRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "BulkResponse", + ", unknown>>; (this: That, params: ", + "BulkRequest", + " | ", + "BulkRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "BulkResponse", + ">; }; cat: ", + "default", + "; ccr: ", + "default", + "; clearScroll: { (this: That, params?: ", + "ClearScrollRequest", + " | ", + "ClearScrollRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ClearScrollResponse", + ">; (this: That, params?: ", + "ClearScrollRequest", + " | ", + "ClearScrollRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ClearScrollResponse", + ", unknown>>; (this: That, params?: ", + "ClearScrollRequest", + " | ", + "ClearScrollRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ClearScrollResponse", + ">; }; cluster: ", + "default", + "; count: { (this: That, params?: ", + "CountRequest", + " | ", + "CountRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "CountResponse", + ">; (this: That, params?: ", + "CountRequest", + " | ", + "CountRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "CountResponse", + ", unknown>>; (this: That, params?: ", + "CountRequest", + " | ", + "CountRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "CountResponse", + ">; }; danglingIndices: ", + "default", + "; deleteByQuery: { (this: That, params: ", + "DeleteByQueryRequest", + " | ", + "DeleteByQueryRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "DeleteByQueryResponse", + ">; (this: That, params: ", + "DeleteByQueryRequest", + " | ", + "DeleteByQueryRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "DeleteByQueryResponse", + ", unknown>>; (this: That, params: ", + "DeleteByQueryRequest", + " | ", + "DeleteByQueryRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "DeleteByQueryResponse", + ">; }; deleteByQueryRethrottle: { (this: That, params: ", + "DeleteByQueryRethrottleRequest", + " | ", + "DeleteByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "DeleteByQueryRethrottleResponse", + ">; (this: That, params: ", + "DeleteByQueryRethrottleRequest", + " | ", + "DeleteByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "DeleteByQueryRethrottleResponse", + ", unknown>>; (this: That, params: ", + "DeleteByQueryRethrottleRequest", + " | ", + "DeleteByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "DeleteByQueryRethrottleResponse", + ">; }; deleteScript: { (this: That, params: ", + "DeleteScriptRequest", + " | ", + "DeleteScriptRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "DeleteScriptResponse", + ">; (this: That, params: ", + "DeleteScriptRequest", + " | ", + "DeleteScriptRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "DeleteScriptResponse", + ", unknown>>; (this: That, params: ", + "DeleteScriptRequest", + " | ", + "DeleteScriptRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "DeleteScriptResponse", + ">; }; enrich: ", + "default", + "; exists: { (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; existsSource: { (this: That, params: ", + "ExistsSourceRequest", + " | ", + "ExistsSourceRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "ExistsSourceRequest", + " | ", + "ExistsSourceRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "ExistsSourceRequest", + " | ", + "ExistsSourceRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; explain: { (this: That, params: ", + "ExplainRequest", + " | ", + "ExplainRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ExplainResponse", + ">; (this: That, params: ", + "ExplainRequest", + " | ", + "ExplainRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ExplainResponse", + ", unknown>>; (this: That, params: ", + "ExplainRequest", + " | ", + "ExplainRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ExplainResponse", + ">; }; features: ", + "default", + "; fieldCaps: { (this: That, params?: ", + "FieldCapsRequest", + " | ", + "FieldCapsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "FieldCapsResponse", + ">; (this: That, params?: ", + "FieldCapsRequest", + " | ", + "FieldCapsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "FieldCapsResponse", + ", unknown>>; (this: That, params?: ", + "FieldCapsRequest", + " | ", + "FieldCapsRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "FieldCapsResponse", + ">; }; fleet: ", + "default", + "; getScript: { (this: That, params: ", + "GetScriptRequest", + " | ", + "GetScriptRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetScriptResponse", + ">; (this: That, params: ", + "GetScriptRequest", + " | ", + "GetScriptRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "GetScriptResponse", + ", unknown>>; (this: That, params: ", + "GetScriptRequest", + " | ", + "GetScriptRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "GetScriptResponse", + ">; }; getScriptContext: { (this: That, params?: ", + "GetScriptContextRequest", + " | ", + "GetScriptContextRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetScriptContextResponse", + ">; (this: That, params?: ", + "GetScriptContextRequest", + " | ", + "GetScriptContextRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "GetScriptContextResponse", + ", unknown>>; (this: That, params?: ", + "GetScriptContextRequest", + " | ", + "GetScriptContextRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "GetScriptContextResponse", + ">; }; getScriptLanguages: { (this: That, params?: ", + "GetScriptLanguagesRequest", + " | ", + "GetScriptLanguagesRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetScriptLanguagesResponse", + ">; (this: That, params?: ", + "GetScriptLanguagesRequest", + " | ", + "GetScriptLanguagesRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "GetScriptLanguagesResponse", + ", unknown>>; (this: That, params?: ", + "GetScriptLanguagesRequest", + " | ", + "GetScriptLanguagesRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "GetScriptLanguagesResponse", + ">; }; getSource: { (this: That, params: ", + "GetSourceRequest", + " | ", + "GetSourceRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "GetSourceRequest", + " | ", + "GetSourceRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "GetSourceRequest", + " | ", + "GetSourceRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; graph: ", + "default", + "; ilm: ", + "default", + "; indices: ", + "default", + "; info: { (this: That, params?: ", + "InfoRequest", + " | ", + "InfoRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "InfoResponse", + ">; (this: That, params?: ", + "InfoRequest", + " | ", + "InfoRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "InfoResponse", + ", unknown>>; (this: That, params?: ", + "InfoRequest", + " | ", + "InfoRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "InfoResponse", + ">; }; ingest: ", + "default", + "; knnSearch: { (this: That, params: ", + "KnnSearchRequest", + " | ", + "KnnSearchRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "KnnSearchResponse", + ">; (this: That, params: ", + "KnnSearchRequest", + " | ", + "KnnSearchRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "KnnSearchResponse", + ", unknown>>; (this: That, params: ", + "KnnSearchRequest", + " | ", + "KnnSearchRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "KnnSearchResponse", + ">; }; license: ", + "default", + "; logstash: ", + "default", + "; mget: { (this: That, params?: ", + "MgetRequest", + " | ", + "MgetRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MgetResponse", + ">; (this: That, params?: ", + "MgetRequest", + " | ", + "MgetRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "MgetResponse", + ", unknown>>; (this: That, params?: ", + "MgetRequest", + " | ", + "MgetRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "MgetResponse", + ">; }; migration: ", + "default", + "; ml: ", + "default", + "; msearch: { >(this: That, params: ", + "MsearchRequest", + " | ", + "MsearchRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MsearchResponse", + ">; >(this: That, params: ", + "MsearchRequest", + " | ", + "MsearchRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "MsearchResponse", + ", unknown>>; >(this: That, params: ", + "MsearchRequest", + " | ", + "MsearchRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "MsearchResponse", + ">; }; msearchTemplate: { >(this: That, params: ", + "MsearchTemplateRequest", + " | ", + "MsearchTemplateRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MsearchTemplateResponse", + ">; >(this: That, params: ", + "MsearchTemplateRequest", + " | ", + "MsearchTemplateRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "MsearchTemplateResponse", + ", unknown>>; >(this: That, params: ", + "MsearchTemplateRequest", + " | ", + "MsearchTemplateRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "MsearchTemplateResponse", + ">; }; mtermvectors: { (this: That, params?: ", + "MtermvectorsRequest", + " | ", + "MtermvectorsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MtermvectorsResponse", + ">; (this: That, params?: ", + "MtermvectorsRequest", + " | ", + "MtermvectorsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "MtermvectorsResponse", + ", unknown>>; (this: That, params?: ", + "MtermvectorsRequest", + " | ", + "MtermvectorsRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "MtermvectorsResponse", + ">; }; nodes: ", + "default", + "; openPointInTime: { (this: That, params: ", + "OpenPointInTimeRequest", + " | ", + "OpenPointInTimeRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "OpenPointInTimeResponse", + ">; (this: That, params: ", + "OpenPointInTimeRequest", + " | ", + "OpenPointInTimeRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "OpenPointInTimeResponse", + ", unknown>>; (this: That, params: ", + "OpenPointInTimeRequest", + " | ", + "OpenPointInTimeRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "OpenPointInTimeResponse", + ">; }; ping: { (this: That, params?: ", + "PingRequest", + " | ", + "PingRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params?: ", + "PingRequest", + " | ", + "PingRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params?: ", + "PingRequest", + " | ", + "PingRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; putScript: { (this: That, params: ", + "PutScriptRequest", + " | ", + "PutScriptRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "PutScriptResponse", + ">; (this: That, params: ", + "PutScriptRequest", + " | ", + "PutScriptRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "PutScriptResponse", + ", unknown>>; (this: That, params: ", + "PutScriptRequest", + " | ", + "PutScriptRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "PutScriptResponse", + ">; }; rankEval: { (this: That, params: ", + "RankEvalRequest", + " | ", + "RankEvalRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "RankEvalResponse", + ">; (this: That, params: ", + "RankEvalRequest", + " | ", + "RankEvalRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "RankEvalResponse", + ", unknown>>; (this: That, params: ", + "RankEvalRequest", + " | ", + "RankEvalRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "RankEvalResponse", + ">; }; reindex: { (this: That, params?: ", + "ReindexRequest", + " | ", + "ReindexRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ReindexResponse", + ">; (this: That, params?: ", + "ReindexRequest", + " | ", + "ReindexRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ReindexResponse", + ", unknown>>; (this: That, params?: ", + "ReindexRequest", + " | ", + "ReindexRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ReindexResponse", + ">; }; reindexRethrottle: { (this: That, params: ", + "ReindexRethrottleRequest", + " | ", + "ReindexRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ReindexRethrottleResponse", + ">; (this: That, params: ", + "ReindexRethrottleRequest", + " | ", + "ReindexRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ReindexRethrottleResponse", + ", unknown>>; (this: That, params: ", + "ReindexRethrottleRequest", + " | ", + "ReindexRethrottleRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ReindexRethrottleResponse", + ">; }; renderSearchTemplate: { (this: That, params?: ", + "RenderSearchTemplateRequest", + " | ", + "RenderSearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "RenderSearchTemplateResponse", + ">; (this: That, params?: ", + "RenderSearchTemplateRequest", + " | ", + "RenderSearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "RenderSearchTemplateResponse", + ", unknown>>; (this: That, params?: ", + "RenderSearchTemplateRequest", + " | ", + "RenderSearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "RenderSearchTemplateResponse", + ">; }; rollup: ", + "default", + "; scriptsPainlessExecute: { (this: That, params?: ", + "ScriptsPainlessExecuteRequest", + " | ", + "ScriptsPainlessExecuteRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ScriptsPainlessExecuteResponse", + ">; (this: That, params?: ", + "ScriptsPainlessExecuteRequest", + " | ", + "ScriptsPainlessExecuteRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ScriptsPainlessExecuteResponse", + ", unknown>>; (this: That, params?: ", + "ScriptsPainlessExecuteRequest", + " | ", + "ScriptsPainlessExecuteRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ScriptsPainlessExecuteResponse", + ">; }; scroll: { >(this: That, params: ", + "ScrollRequest", + " | ", + "ScrollRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ScrollResponse", + ">; >(this: That, params: ", + "ScrollRequest", + " | ", + "ScrollRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ScrollResponse", + ", unknown>>; >(this: That, params: ", + "ScrollRequest", + " | ", + "ScrollRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ScrollResponse", + ">; }; searchMvt: { (this: That, params: ", + "SearchMvtRequest", + " | ", + "SearchMvtRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "SearchMvtRequest", + " | ", + "SearchMvtRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "SearchMvtRequest", + " | ", + "SearchMvtRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; searchShards: { (this: That, params?: ", + "SearchShardsRequest", + " | ", + "SearchShardsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "SearchShardsResponse", + ">; (this: That, params?: ", + "SearchShardsRequest", + " | ", + "SearchShardsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "SearchShardsResponse", + ", unknown>>; (this: That, params?: ", + "SearchShardsRequest", + " | ", + "SearchShardsRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "SearchShardsResponse", + ">; }; searchTemplate: { (this: That, params?: ", + "SearchTemplateRequest", + " | ", + "SearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "SearchTemplateResponse", + ">; (this: That, params?: ", + "SearchTemplateRequest", + " | ", + "SearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "SearchTemplateResponse", + ", unknown>>; (this: That, params?: ", + "SearchTemplateRequest", + " | ", + "SearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "SearchTemplateResponse", + ">; }; searchableSnapshots: ", + "default", + "; shutdown: ", + "default", + "; slm: ", + "default", + "; snapshot: ", + "default", + "; sql: ", + "default", + "; ssl: ", + "default", + "; tasks: ", + "default", + "; termsEnum: { (this: That, params: ", + "TermsEnumRequest", + " | ", + "TermsEnumRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "TermsEnumResponse", + ">; (this: That, params: ", + "TermsEnumRequest", + " | ", + "TermsEnumRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "TermsEnumResponse", + ", unknown>>; (this: That, params: ", + "TermsEnumRequest", + " | ", + "TermsEnumRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "TermsEnumResponse", + ">; }; termvectors: { (this: That, params: ", + "TermvectorsRequest", + " | ", + "TermvectorsRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "TermvectorsResponse", + ">; (this: That, params: ", + "TermvectorsRequest", + " | ", + "TermvectorsRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "TermvectorsResponse", + ", unknown>>; (this: That, params: ", + "TermvectorsRequest", + " | ", + "TermvectorsRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "TermvectorsResponse", + ">; }; textStructure: ", + "default", + "; updateByQuery: { (this: That, params: ", + "UpdateByQueryRequest", + " | ", + "UpdateByQueryRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "UpdateByQueryResponse", + ">; (this: That, params: ", + "UpdateByQueryRequest", + " | ", + "UpdateByQueryRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "UpdateByQueryResponse", + ", unknown>>; (this: That, params: ", + "UpdateByQueryRequest", + " | ", + "UpdateByQueryRequest", ", options?: ", "TransportRequestOptions", " | undefined): Promise<", + "UpdateByQueryResponse", + ">; }; updateByQueryRethrottle: { (this: That, params: ", + "UpdateByQueryRethrottleRequest", + " | ", + "UpdateByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "UpdateByQueryRethrottleResponse", + ">; (this: That, params: ", + "UpdateByQueryRethrottleRequest", + " | ", + "UpdateByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", - ">; }; }" + "<", + "UpdateByQueryRethrottleResponse", + ", unknown>>; (this: That, params: ", + "UpdateByQueryRethrottleRequest", + " | ", + "UpdateByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "UpdateByQueryRethrottleResponse", + ">; }; watcher: ", + "default", + "; xpack: ", + "default", + "; }" ], "path": "src/core/server/elasticsearch/client/types.ts", "deprecated": false, @@ -18266,7 +24108,7 @@ "label": "KibanaExecutionContext", "description": [], "signature": [ - "{ readonly type: string; readonly name: string; readonly id: string; readonly description: string; readonly url?: string | undefined; parent?: ", + "{ readonly type: string; readonly name: string; readonly id: string; readonly description?: string | undefined; readonly url?: string | undefined; child?: ", "KibanaExecutionContext", " | undefined; }" ], @@ -18482,9 +24324,7 @@ "UiSettingsType", " | undefined; description?: string | undefined; name?: string | undefined; options?: string[] | undefined; order?: number | undefined; value?: unknown; category?: string[] | undefined; optionLabels?: Record | undefined; requiresPageReload?: boolean | undefined; readonly?: boolean | undefined; sensitive?: boolean | undefined; deprecation?: ", "DeprecationSettings", - " | undefined; metric?: { type: ", - "UiCounterMetricType", - "; name: string; } | undefined; }" + " | undefined; metric?: { type: string; name: string; } | undefined; }" ], "path": "src/core/types/ui_settings.ts", "deprecated": false, diff --git a/api_docs/core.mdx b/api_docs/core.mdx index 4cead3ed131ee..18f8da72e47e4 100644 --- a/api_docs/core.mdx +++ b/api_docs/core.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/core title: "core" image: https://source.unsplash.com/400x175/?github summary: API docs for the core plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'core'] warning: 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. --- @@ -18,7 +18,7 @@ Contact [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) for que | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 2366 | 15 | 973 | 32 | +| 2368 | 15 | 975 | 32 | ## Client diff --git a/api_docs/core_application.devdocs.json b/api_docs/core_application.devdocs.json index 193b728e1c088..2b85de6e9f5fe 100644 --- a/api_docs/core_application.devdocs.json +++ b/api_docs/core_application.devdocs.json @@ -860,6 +860,33 @@ "path": "src/core/public/application/types.ts", "deprecated": false }, + { + "parentPluginId": "core", + "id": "def-public.AppLeaveConfirmAction.confirmButtonText", + "type": "string", + "tags": [], + "label": "confirmButtonText", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "src/core/public/application/types.ts", + "deprecated": false + }, + { + "parentPluginId": "core", + "id": "def-public.AppLeaveConfirmAction.buttonColor", + "type": "CompoundType", + "tags": [], + "label": "buttonColor", + "description": [], + "signature": [ + "ButtonColor", + " | undefined" + ], + "path": "src/core/public/application/types.ts", + "deprecated": false + }, { "parentPluginId": "core", "id": "def-public.AppLeaveConfirmAction.callback", @@ -1353,10 +1380,6 @@ "plugin": "fleet", "path": "x-pack/plugins/fleet/public/applications/integrations/index.tsx" }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/public/applications/fleet/index.tsx" - }, { "plugin": "security", "path": "x-pack/plugins/security/public/authentication/logout/logout_app.test.ts" diff --git a/api_docs/core_application.mdx b/api_docs/core_application.mdx index 72545603645f0..1966be80f8ba5 100644 --- a/api_docs/core_application.mdx +++ b/api_docs/core_application.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/core-application title: "core.application" image: https://source.unsplash.com/400x175/?github summary: API docs for the core.application plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'core.application'] warning: 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. --- @@ -18,7 +18,7 @@ Contact [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) for que | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 2366 | 15 | 973 | 32 | +| 2368 | 15 | 975 | 32 | ## Client diff --git a/api_docs/core_chrome.mdx b/api_docs/core_chrome.mdx index 8e50bda60dce5..7048c43fd84a0 100644 --- a/api_docs/core_chrome.mdx +++ b/api_docs/core_chrome.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/core-chrome title: "core.chrome" image: https://source.unsplash.com/400x175/?github summary: API docs for the core.chrome plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'core.chrome'] warning: 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. --- @@ -18,7 +18,7 @@ Contact [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) for que | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 2366 | 15 | 973 | 32 | +| 2368 | 15 | 975 | 32 | ## Client diff --git a/api_docs/core_http.mdx b/api_docs/core_http.mdx index 2ea23af5a885e..89dee2ccba96c 100644 --- a/api_docs/core_http.mdx +++ b/api_docs/core_http.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/core-http title: "core.http" image: https://source.unsplash.com/400x175/?github summary: API docs for the core.http plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'core.http'] warning: 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. --- @@ -18,7 +18,7 @@ Contact [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) for que | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 2366 | 15 | 973 | 32 | +| 2368 | 15 | 975 | 32 | ## Client diff --git a/api_docs/core_saved_objects.devdocs.json b/api_docs/core_saved_objects.devdocs.json index 525b950ddf80e..6b8adb5a2e621 100644 --- a/api_docs/core_saved_objects.devdocs.json +++ b/api_docs/core_saved_objects.devdocs.json @@ -13484,6 +13484,10 @@ { "plugin": "dashboard", "path": "src/plugins/dashboard/server/saved_objects/migrations_730.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/server/saved_objects/saved_object_migrations.ts" } ], "children": [ diff --git a/api_docs/core_saved_objects.mdx b/api_docs/core_saved_objects.mdx index d472479fa4e30..6888a16005366 100644 --- a/api_docs/core_saved_objects.mdx +++ b/api_docs/core_saved_objects.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/core-savedObjects title: "core.savedObjects" image: https://source.unsplash.com/400x175/?github summary: API docs for the core.savedObjects plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'core.savedObjects'] warning: 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. --- @@ -18,7 +18,7 @@ Contact [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) for que | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 2366 | 15 | 973 | 32 | +| 2368 | 15 | 975 | 32 | ## Client diff --git a/api_docs/custom_integrations.mdx b/api_docs/custom_integrations.mdx index 443110cb658e8..00e483f3bc202 100644 --- a/api_docs/custom_integrations.mdx +++ b/api_docs/custom_integrations.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/customIntegrations title: "customIntegrations" image: https://source.unsplash.com/400x175/?github summary: API docs for the customIntegrations plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'customIntegrations'] warning: 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. --- diff --git a/api_docs/dashboard.devdocs.json b/api_docs/dashboard.devdocs.json index b1ffd09f9fab2..22489858b5d62 100644 --- a/api_docs/dashboard.devdocs.json +++ b/api_docs/dashboard.devdocs.json @@ -1091,6 +1091,37 @@ } ], "functions": [ + { + "parentPluginId": "dashboard", + "id": "def-public.cleanEmptyKeys", + "type": "Function", + "tags": [], + "label": "cleanEmptyKeys", + "description": [], + "signature": [ + "(stateObj: Record) => Record" + ], + "path": "src/plugins/dashboard/public/locator.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "dashboard", + "id": "def-public.cleanEmptyKeys.$1", + "type": "Object", + "tags": [], + "label": "stateObj", + "description": [], + "signature": [ + "Record" + ], + "path": "src/plugins/dashboard/public/locator.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "dashboard", "id": "def-public.createDashboardEditUrl", @@ -1263,6 +1294,16 @@ "path": "src/plugins/dashboard/public/types.ts", "deprecated": false }, + { + "parentPluginId": "dashboard", + "id": "def-public.DashboardContainerInput.timeRestore", + "type": "boolean", + "tags": [], + "label": "timeRestore", + "description": [], + "path": "src/plugins/dashboard/public/types.ts", + "deprecated": false + }, { "parentPluginId": "dashboard", "id": "def-public.DashboardContainerInput.description", diff --git a/api_docs/dashboard.mdx b/api_docs/dashboard.mdx index 9440593e200d9..bbd449c960d58 100644 --- a/api_docs/dashboard.mdx +++ b/api_docs/dashboard.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/dashboard title: "dashboard" image: https://source.unsplash.com/400x175/?github summary: API docs for the dashboard plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboard'] warning: 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. --- @@ -18,7 +18,7 @@ Contact [Kibana Presentation](https://github.com/orgs/elastic/teams/kibana-prese | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 138 | 0 | 136 | 14 | +| 141 | 0 | 139 | 14 | ## Client diff --git a/api_docs/dashboard_enhanced.devdocs.json b/api_docs/dashboard_enhanced.devdocs.json index 7bfbf4fb30ef7..33137ff371963 100644 --- a/api_docs/dashboard_enhanced.devdocs.json +++ b/api_docs/dashboard_enhanced.devdocs.json @@ -123,7 +123,7 @@ "section": "def-common.DrilldownConfig", "text": "DrilldownConfig" }, - ", context: Context) => Promise<", + ", context: Context, useUrlForState: boolean) => Promise<", "KibanaLocation", ">" ], @@ -163,6 +163,20 @@ "path": "x-pack/plugins/dashboard_enhanced/public/services/drilldowns/abstract_dashboard_drilldown/abstract_dashboard_drilldown.tsx", "deprecated": false, "isRequired": true + }, + { + "parentPluginId": "dashboardEnhanced", + "id": "def-public.AbstractDashboardDrilldown.getLocation.$3", + "type": "boolean", + "tags": [], + "label": "useUrlForState", + "description": [], + "signature": [ + "boolean" + ], + "path": "x-pack/plugins/dashboard_enhanced/public/services/drilldowns/abstract_dashboard_drilldown/abstract_dashboard_drilldown.tsx", + "deprecated": false, + "isRequired": true } ], "returnComment": [] @@ -263,7 +277,7 @@ "label": "createConfig", "description": [], "signature": [ - "() => { dashboardId: string; useCurrentFilters: boolean; useCurrentDateRange: boolean; }" + "() => { dashboardId: string; useCurrentFilters: boolean; useCurrentDateRange: boolean; openInNewTab: boolean; }" ], "path": "x-pack/plugins/dashboard_enhanced/public/services/drilldowns/abstract_dashboard_drilldown/abstract_dashboard_drilldown.tsx", "deprecated": false, @@ -595,9 +609,7 @@ "section": "def-public.ShareMenuProvider", "text": "ShareMenuProvider" }, - ") => void; } & { urlGenerators: ", - "UrlGeneratorsSetup", - "; url: ", + ") => void; } & { url: ", { "pluginId": "share", "scope": "public", @@ -708,9 +720,7 @@ "section": "def-public.ShowShareMenuOptions", "text": "ShowShareMenuOptions" }, - ") => void; } & { urlGenerators: ", - "UrlGeneratorsStart", - "; url: ", + ") => void; } & { url: ", { "pluginId": "share", "scope": "public", @@ -760,7 +770,7 @@ "label": "Config", "description": [], "signature": [ - "{ dashboardId?: string | undefined; useCurrentFilters: boolean; useCurrentDateRange: boolean; }" + "{ dashboardId?: string | undefined; useCurrentFilters: boolean; useCurrentDateRange: boolean; openInNewTab: boolean; }" ], "path": "x-pack/plugins/dashboard_enhanced/public/services/drilldowns/abstract_dashboard_drilldown/types.ts", "deprecated": false, @@ -1016,7 +1026,7 @@ "label": "DrilldownConfig", "description": [], "signature": [ - "{ dashboardId?: string | undefined; useCurrentFilters: boolean; useCurrentDateRange: boolean; }" + "{ dashboardId?: string | undefined; useCurrentFilters: boolean; useCurrentDateRange: boolean; openInNewTab: boolean; }" ], "path": "x-pack/plugins/dashboard_enhanced/common/drilldowns/dashboard_drilldown/types.ts", "deprecated": false, diff --git a/api_docs/dashboard_enhanced.mdx b/api_docs/dashboard_enhanced.mdx index 95cc9f0affbb2..fc677c3267ed5 100644 --- a/api_docs/dashboard_enhanced.mdx +++ b/api_docs/dashboard_enhanced.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/dashboardEnhanced title: "dashboardEnhanced" image: https://source.unsplash.com/400x175/?github summary: API docs for the dashboardEnhanced plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboardEnhanced'] warning: 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. --- @@ -18,7 +18,7 @@ Contact [App Services](https://github.com/orgs/elastic/teams/kibana-app-services | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 51 | 0 | 50 | 0 | +| 52 | 0 | 51 | 0 | ## Client diff --git a/api_docs/data.devdocs.json b/api_docs/data.devdocs.json index df156d4840ea5..1d33a00a53fcf 100644 --- a/api_docs/data.devdocs.json +++ b/api_docs/data.devdocs.json @@ -2679,6 +2679,10 @@ "plugin": "visualizations", "path": "src/plugins/visualizations/target/types/public/vis_types/base_vis_type.d.ts" }, + { + "plugin": "dashboard", + "path": "src/plugins/dashboard/target/types/public/application/hooks/use_dashboard_app_state.d.ts" + }, { "plugin": "discover", "path": "src/plugins/discover/target/types/public/application/main/utils/use_discover_state.d.ts" @@ -2883,6 +2887,14 @@ "plugin": "lens", "path": "x-pack/plugins/lens/server/routes/existing_fields.test.ts" }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts" + }, { "plugin": "observability", "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/rtl_helpers.tsx" @@ -2907,6 +2919,22 @@ "plugin": "ux", "path": "x-pack/plugins/ux/public/components/app/rum_dashboard/local_uifilters/selected_filters.tsx" }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/fields/agg/percentile_agg_field.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/fields/agg/percentile_agg_field.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts" + }, { "plugin": "visTypeTimeseries", "path": "src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts" @@ -2983,14 +3011,6 @@ "plugin": "savedObjects", "path": "src/plugins/saved_objects/public/saved_object/helpers/apply_es_resp.ts" }, - { - "plugin": "dataViewFieldEditor", - "path": "src/plugins/data_view_field_editor/public/components/field_format_editor/field_format_editor.tsx" - }, - { - "plugin": "dataViewFieldEditor", - "path": "src/plugins/data_view_field_editor/public/components/field_format_editor/field_format_editor.tsx" - }, { "plugin": "dataViewEditor", "path": "src/plugins/data_view_editor/public/shared_imports.ts" @@ -3359,6 +3379,38 @@ "plugin": "maps", "path": "x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.test.ts" }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_source/es_source.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_source/es_source.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_source/es_source.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_source/es_source.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/es_search_source.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/es_search_source.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, { "plugin": "maps", "path": "x-pack/plugins/maps/public/classes/fields/agg/percentile_agg_field.test.ts" @@ -3367,6 +3419,14 @@ "plugin": "maps", "path": "x-pack/plugins/maps/public/classes/fields/agg/percentile_agg_field.test.ts" }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/components/geo_index_pattern_select.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/components/geo_index_pattern_select.d.ts" + }, { "plugin": "maps", "path": "x-pack/plugins/maps/public/classes/sources/es_search_source/util/get_docvalue_source_fields.test.ts" @@ -3379,6 +3439,98 @@ "plugin": "maps", "path": "x-pack/plugins/maps/public/classes/sources/es_search_source/util/get_docvalue_source_fields.test.ts" }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/fields/agg/count_agg_field.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/fields/agg/count_agg_field.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/fields/agg/agg_field.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/fields/agg/agg_field.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_geo_line_source/create_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_geo_line_source/create_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_geo_line_source/create_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_geo_line_source/geo_line_form.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_geo_line_source/geo_line_form.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_geo_line_source/update_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_geo_line_source/update_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/connected_components/edit_layer_panel/filter_editor/filter_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/connected_components/edit_layer_panel/filter_editor/filter_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/layers/wizards/choropleth_layer_wizard/layer_template.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/layers/wizards/choropleth_layer_wizard/layer_template.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/layers/wizards/choropleth_layer_wizard/layer_template.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/top_hits/create_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/top_hits/create_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/top_hits/create_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/connected_components/edit_layer_panel/join_editor/resources/join.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/connected_components/edit_layer_panel/join_editor/resources/join.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/connected_components/edit_layer_panel/join_editor/resources/where_expression.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/connected_components/edit_layer_panel/join_editor/resources/where_expression.d.ts" + }, { "plugin": "stackAlerts", "path": "x-pack/plugins/stack_alerts/target/types/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.d.ts" @@ -3663,26 +3815,6 @@ "plugin": "visTypeTimeseries", "path": "src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts" }, - { - "plugin": "visTypeTimeseries", - "path": "src/plugins/vis_types/timeseries/target/types/public/application/components/annotations_editor.d.ts" - }, - { - "plugin": "visTypeTimeseries", - "path": "src/plugins/vis_types/timeseries/target/types/public/application/components/annotations_editor.d.ts" - }, - { - "plugin": "visTypeTimeseries", - "path": "src/plugins/vis_types/timeseries/target/types/public/application/components/annotations_editor.d.ts" - }, - { - "plugin": "visTypeTimeseries", - "path": "src/plugins/vis_types/timeseries/target/types/public/application/components/vis_editor.d.ts" - }, - { - "plugin": "visTypeTimeseries", - "path": "src/plugins/vis_types/timeseries/target/types/public/application/components/vis_editor.d.ts" - }, { "plugin": "visTypeTimeseries", "path": "src/plugins/vis_types/timeseries/target/types/public/application/components/lib/convert_series_to_datatable.d.ts" @@ -3695,14 +3827,6 @@ "plugin": "visTypeTimeseries", "path": "src/plugins/vis_types/timeseries/target/types/public/application/components/lib/convert_series_to_datatable.d.ts" }, - { - "plugin": "visTypeTimeseries", - "path": "src/plugins/vis_types/timeseries/target/types/public/application/components/panel_config/types.d.ts" - }, - { - "plugin": "visTypeTimeseries", - "path": "src/plugins/vis_types/timeseries/target/types/public/application/components/panel_config/types.d.ts" - }, { "plugin": "visTypeTimeseries", "path": "src/plugins/vis_types/timeseries/public/metrics_type.ts" @@ -3852,6 +3976,18 @@ "plugin": "lens", "path": "x-pack/plugins/lens/server/routes/field_stats.ts" }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts" + }, { "plugin": "lens", "path": "x-pack/plugins/lens/target/types/server/routes/field_stats.d.ts" @@ -4060,6 +4196,14 @@ "plugin": "maps", "path": "x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.test.ts" }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_source/es_source.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_source/es_source.d.ts" + }, { "plugin": "maps", "path": "x-pack/plugins/maps/target/types/public/classes/fields/es_doc_field.d.ts" @@ -4080,6 +4224,66 @@ "plugin": "maps", "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/top_hits/update_source_editor.d.ts" }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, { "plugin": "maps", "path": "x-pack/plugins/maps/target/types/public/components/geo_field_select.d.ts" @@ -4136,6 +4340,46 @@ "plugin": "maps", "path": "x-pack/plugins/maps/target/types/public/components/metrics_editor/metric_editor.d.ts" }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_geo_line_source/update_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_geo_line_source/update_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/layers/wizards/choropleth_layer_wizard/layer_template.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/layers/wizards/choropleth_layer_wizard/layer_template.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/layers/wizards/choropleth_layer_wizard/layer_template.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/layers/wizards/choropleth_layer_wizard/layer_template.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/top_hits/create_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/top_hits/create_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/top_hits/create_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/top_hits/create_source_editor.d.ts" + }, { "plugin": "maps", "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/top_hits/top_hits_form.d.ts" @@ -4148,6 +4392,14 @@ "plugin": "maps", "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/top_hits/top_hits_form.d.ts" }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/connected_components/edit_layer_panel/join_editor/resources/join.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/connected_components/edit_layer_panel/join_editor/resources/join.d.ts" + }, { "plugin": "maps", "path": "x-pack/plugins/maps/target/types/public/connected_components/edit_layer_panel/join_editor/resources/join_expression.d.ts" @@ -5757,26 +6009,6 @@ "returnComment": [], "initialIsOpen": false }, - { - "parentPluginId": "data", - "id": "def-public.getKbnTypeNames", - "type": "Function", - "tags": [ - "deprecated" - ], - "label": "getKbnTypeNames", - "description": [], - "signature": [ - "() => string[]" - ], - "path": "src/plugins/data/common/kbn_field_types/index.ts", - "deprecated": true, - "removeBy": "8.1", - "references": [], - "returnComment": [], - "children": [], - "initialIsOpen": false - }, { "parentPluginId": "data", "id": "def-public.getSearchParamsFromRequest", @@ -6210,16 +6442,7 @@ "path": "src/plugins/data/common/es_query/index.ts", "deprecated": true, "removeBy": "8.1", - "references": [ - { - "plugin": "dashboardEnhanced", - "path": "x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx" - }, - { - "plugin": "dashboardEnhanced", - "path": "x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx" - } - ], + "references": [], "returnComment": [], "children": [ { @@ -8380,6 +8603,19 @@ "path": "src/plugins/data_views/common/data_views/data_views.ts", "deprecated": false }, + { + "parentPluginId": "data", + "id": "def-public.DataViewListItem.namespaces", + "type": "Array", + "tags": [], + "label": "namespaces", + "description": [], + "signature": [ + "string[] | undefined" + ], + "path": "src/plugins/data_views/common/data_views/data_views.ts", + "deprecated": false + }, { "parentPluginId": "data", "id": "def-public.DataViewListItem.title", @@ -10546,9 +10782,6 @@ "tags": [], "label": "ES_FIELD_TYPES", "description": [], - "signature": [ - "ES_FIELD_TYPES" - ], "path": "node_modules/@types/kbn__field-types/index.d.ts", "deprecated": false, "initialIsOpen": false @@ -10560,9 +10793,6 @@ "tags": [], "label": "KBN_FIELD_TYPES", "description": [], - "signature": [ - "KBN_FIELD_TYPES" - ], "path": "node_modules/@types/kbn__field-types/index.d.ts", "deprecated": false, "initialIsOpen": false @@ -11386,74 +11616,6 @@ "deprecated": true, "removeBy": "8.1", "references": [ - { - "plugin": "discover", - "path": "src/plugins/discover/public/url_generator.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/url_generator.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/url_generator.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/locator.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/locator.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/locator.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/application/main/services/discover_state.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/application/main/services/discover_state.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/application/main/services/discover_state.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/application/main/services/discover_state.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/application/context/services/context_state.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/application/context/services/context_state.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/application/context/services/context_state.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/application/context/services/context_state.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/application/context/services/context_state.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/application/context/services/context_state.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/application/context/services/context_state.ts" - }, { "plugin": "dashboard", "path": "src/plugins/dashboard/public/application/lib/filter_utils.ts" @@ -11514,14 +11676,6 @@ "plugin": "dashboard", "path": "src/plugins/dashboard/public/application/embeddable/dashboard_container.tsx" }, - { - "plugin": "dashboardEnhanced", - "path": "x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx" - }, - { - "plugin": "dashboardEnhanced", - "path": "x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx" - }, { "plugin": "discoverEnhanced", "path": "x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_context_menu_action.ts" @@ -11634,14 +11788,6 @@ "plugin": "discover", "path": "src/plugins/discover/public/application/context/services/context_state.test.ts" }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/embeddable/types.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/embeddable/types.ts" - }, { "plugin": "discover", "path": "src/plugins/discover/public/embeddable/saved_search_embeddable.tsx" @@ -11651,44 +11797,40 @@ "path": "src/plugins/discover/public/embeddable/saved_search_embeddable.tsx" }, { - "plugin": "discover", - "path": "src/plugins/discover/public/application/context/services/context.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/application/context/services/context.ts" + "plugin": "maps", + "path": "x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts" }, { - "plugin": "discover", - "path": "src/plugins/discover/public/application/context/services/context.ts" + "plugin": "maps", + "path": "x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts" }, { - "plugin": "discover", - "path": "src/plugins/discover/public/application/context/services/context.ts" + "plugin": "maps", + "path": "x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts" }, { - "plugin": "discover", - "path": "src/plugins/discover/public/utils/get_sharing_data.ts" + "plugin": "maps", + "path": "x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts" }, { - "plugin": "discover", - "path": "src/plugins/discover/public/utils/get_sharing_data.ts" + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts" }, { "plugin": "maps", - "path": "x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts" + "path": "x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts" }, { "plugin": "maps", - "path": "x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts" + "path": "x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts" }, { "plugin": "maps", - "path": "x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts" + "path": "x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts" }, { "plugin": "maps", - "path": "x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts" + "path": "x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts" }, { "plugin": "discover", @@ -11822,24 +11964,6 @@ "deprecated": false, "initialIsOpen": false }, - { - "parentPluginId": "data", - "id": "def-public.IFieldSubType", - "type": "Type", - "tags": [ - "deprecated" - ], - "label": "IFieldSubType", - "description": [], - "signature": [ - "IFieldSubTypeMultiOptional | IFieldSubTypeNestedOptional" - ], - "path": "src/plugins/data/common/es_query/index.ts", - "deprecated": true, - "removeBy": "8.1", - "references": [], - "initialIsOpen": false - }, { "parentPluginId": "data", "id": "def-public.IMetricAggType", @@ -12758,9 +12882,6 @@ ], "label": "KueryNode", "description": [], - "signature": [ - "KueryNode" - ], "path": "src/plugins/data/common/es_query/index.ts", "deprecated": true, "removeBy": "8.1", @@ -12985,9 +13106,6 @@ ], "label": "RangeFilterParams", "description": [], - "signature": [ - "RangeFilterParams" - ], "path": "src/plugins/data/common/es_query/index.ts", "deprecated": true, "removeBy": "8.1", @@ -13154,82 +13272,6 @@ "deprecated": true, "removeBy": "8.1", "references": [ - { - "plugin": "discover", - "path": "src/plugins/discover/public/url_generator.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/url_generator.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/url_generator.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/locator.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/locator.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/locator.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/utils/use_navigation_props.tsx" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/utils/use_navigation_props.tsx" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/application/main/services/discover_state.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/application/main/services/discover_state.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/application/main/services/discover_state.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/application/main/services/discover_state.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/application/context/services/context_state.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/application/context/services/context_state.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/application/context/services/context_state.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/application/context/services/context_state.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/application/context/services/context_state.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/embeddable/saved_search_embeddable.tsx" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/embeddable/saved_search_embeddable.tsx" - }, { "plugin": "discover", "path": "src/plugins/discover/public/embeddable/saved_search_embeddable.tsx" @@ -13238,42 +13280,6 @@ "plugin": "discover", "path": "src/plugins/discover/public/embeddable/saved_search_embeddable.tsx" }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/application/context/context_app.tsx" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/application/context/context_app.tsx" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/application/main/components/layout/discover_layout.tsx" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/application/main/components/layout/discover_layout.tsx" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/plugin.tsx" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/plugin.tsx" - }, - { - "plugin": "dashboardEnhanced", - "path": "x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx" - }, - { - "plugin": "dashboardEnhanced", - "path": "x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx" - }, - { - "plugin": "dashboardEnhanced", - "path": "x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx" - }, { "plugin": "discoverEnhanced", "path": "x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_chart_action.ts" @@ -17564,26 +17570,6 @@ "path": "src/plugins/data/public/types.ts", "deprecated": true, "references": [ - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/public/applications/fleet/sections/data_stream/list_page/index.tsx" - }, - { - "plugin": "dataViewFieldEditor", - "path": "src/plugins/data_view_field_editor/public/components/field_editor_context.tsx" - }, - { - "plugin": "dataViewFieldEditor", - "path": "src/plugins/data_view_field_editor/public/components/field_format_editor/field_format_editor.tsx" - }, - { - "plugin": "dataViewFieldEditor", - "path": "src/plugins/data_view_field_editor/public/components/field_format_editor/field_format_editor.tsx" - }, - { - "plugin": "dataViewFieldEditor", - "path": "src/plugins/data_view_field_editor/public/components/field_editor_flyout_content_container.tsx" - }, { "plugin": "discover", "path": "src/plugins/discover/public/application/main/components/chart/histogram.tsx" @@ -18369,6 +18355,19 @@ "path": "src/plugins/data_views/common/data_views/data_view.ts", "deprecated": false }, + { + "parentPluginId": "data", + "id": "def-server.DataView.namespaces", + "type": "Array", + "tags": [], + "label": "namespaces", + "description": [], + "signature": [ + "string[]" + ], + "path": "src/plugins/data_views/common/data_views/data_view.ts", + "deprecated": false + }, { "parentPluginId": "data", "id": "def-server.DataView.allowNoIndex", @@ -18478,15 +18477,9 @@ "signature": [ "() => { storedFields: string[]; scriptFields: Record; docvalueFields: { field: string; format: string; }[]; runtimeFields: Record; }" + ">; docvalueFields: { field: string; format: string; }[]; runtimeFields: ", + "MappingRuntimeFields", + "; }" ], "path": "src/plugins/data_views/common/data_views/data_view.ts", "deprecated": false, @@ -18968,7 +18961,7 @@ "tags": [], "label": "addRuntimeField", "description": [ - "\nAdd a runtime field - Appended to existing mapped field or a new field is\ncreated as appropriate" + "\nAdd a runtime field - Appended to existing mapped field or a new field is\ncreated as appropriate." ], "signature": [ "(name: string, runtimeField: ", @@ -18979,7 +18972,15 @@ "section": "def-common.RuntimeField", "text": "RuntimeField" }, - ") => void" + ") => ", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.DataViewField", + "text": "DataViewField" + }, + "[]" ], "path": "src/plugins/data_views/common/data_views/data_view.ts", "deprecated": false, @@ -19097,6 +19098,67 @@ ], "returnComment": [] }, + { + "parentPluginId": "data", + "id": "def-server.DataView.getAllRuntimeFields", + "type": "Function", + "tags": [], + "label": "getAllRuntimeFields", + "description": [], + "signature": [ + "() => Record" + ], + "path": "src/plugins/data_views/common/data_views/data_view.ts", + "deprecated": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "data", + "id": "def-server.DataView.getFieldsByRuntimeFieldName", + "type": "Function", + "tags": [], + "label": "getFieldsByRuntimeFieldName", + "description": [], + "signature": [ + "(name: string) => Record | undefined" + ], + "path": "src/plugins/data_views/common/data_views/data_view.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "data", + "id": "def-server.DataView.getFieldsByRuntimeFieldName.$1", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "signature": [ + "string" + ], + "path": "src/plugins/data_views/common/data_views/data_view.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, { "parentPluginId": "data", "id": "def-server.DataView.replaceAllRuntimeFields", @@ -19179,6 +19241,24 @@ ], "returnComment": [] }, + { + "parentPluginId": "data", + "id": "def-server.DataView.getRuntimeMappings", + "type": "Function", + "tags": [], + "label": "getRuntimeMappings", + "description": [ + "\nReturn the \"runtime_mappings\" section of the ES search query" + ], + "signature": [ + "() => ", + "MappingRuntimeFields" + ], + "path": "src/plugins/data_views/common/data_views/data_view.ts", + "deprecated": false, + "children": [], + "returnComment": [] + }, { "parentPluginId": "data", "id": "def-server.DataView.getFormatterForFieldNoDefault", @@ -19545,6 +19625,10 @@ "plugin": "visualizations", "path": "src/plugins/visualizations/target/types/public/vis_types/base_vis_type.d.ts" }, + { + "plugin": "dashboard", + "path": "src/plugins/dashboard/target/types/public/application/hooks/use_dashboard_app_state.d.ts" + }, { "plugin": "discover", "path": "src/plugins/discover/target/types/public/application/main/utils/use_discover_state.d.ts" @@ -19749,6 +19833,14 @@ "plugin": "lens", "path": "x-pack/plugins/lens/server/routes/existing_fields.test.ts" }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts" + }, { "plugin": "observability", "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/rtl_helpers.tsx" @@ -19773,6 +19865,22 @@ "plugin": "ux", "path": "x-pack/plugins/ux/public/components/app/rum_dashboard/local_uifilters/selected_filters.tsx" }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/fields/agg/percentile_agg_field.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/fields/agg/percentile_agg_field.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts" + }, { "plugin": "visTypeTimeseries", "path": "src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts" @@ -19849,14 +19957,6 @@ "plugin": "savedObjects", "path": "src/plugins/saved_objects/public/saved_object/helpers/apply_es_resp.ts" }, - { - "plugin": "dataViewFieldEditor", - "path": "src/plugins/data_view_field_editor/public/components/field_format_editor/field_format_editor.tsx" - }, - { - "plugin": "dataViewFieldEditor", - "path": "src/plugins/data_view_field_editor/public/components/field_format_editor/field_format_editor.tsx" - }, { "plugin": "dataViewEditor", "path": "src/plugins/data_view_editor/public/shared_imports.ts" @@ -20225,6 +20325,38 @@ "plugin": "maps", "path": "x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.test.ts" }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_source/es_source.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_source/es_source.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_source/es_source.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_source/es_source.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/es_search_source.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/es_search_source.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, { "plugin": "maps", "path": "x-pack/plugins/maps/public/classes/fields/agg/percentile_agg_field.test.ts" @@ -20233,6 +20365,14 @@ "plugin": "maps", "path": "x-pack/plugins/maps/public/classes/fields/agg/percentile_agg_field.test.ts" }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/components/geo_index_pattern_select.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/components/geo_index_pattern_select.d.ts" + }, { "plugin": "maps", "path": "x-pack/plugins/maps/public/classes/sources/es_search_source/util/get_docvalue_source_fields.test.ts" @@ -20245,6 +20385,98 @@ "plugin": "maps", "path": "x-pack/plugins/maps/public/classes/sources/es_search_source/util/get_docvalue_source_fields.test.ts" }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/fields/agg/count_agg_field.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/fields/agg/count_agg_field.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/fields/agg/agg_field.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/fields/agg/agg_field.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_geo_line_source/create_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_geo_line_source/create_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_geo_line_source/create_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_geo_line_source/geo_line_form.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_geo_line_source/geo_line_form.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_geo_line_source/update_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_geo_line_source/update_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/connected_components/edit_layer_panel/filter_editor/filter_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/connected_components/edit_layer_panel/filter_editor/filter_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/layers/wizards/choropleth_layer_wizard/layer_template.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/layers/wizards/choropleth_layer_wizard/layer_template.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/layers/wizards/choropleth_layer_wizard/layer_template.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/top_hits/create_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/top_hits/create_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/top_hits/create_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/connected_components/edit_layer_panel/join_editor/resources/join.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/connected_components/edit_layer_panel/join_editor/resources/join.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/connected_components/edit_layer_panel/join_editor/resources/where_expression.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/connected_components/edit_layer_panel/join_editor/resources/where_expression.d.ts" + }, { "plugin": "stackAlerts", "path": "x-pack/plugins/stack_alerts/target/types/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.d.ts" @@ -20529,26 +20761,6 @@ "plugin": "visTypeTimeseries", "path": "src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts" }, - { - "plugin": "visTypeTimeseries", - "path": "src/plugins/vis_types/timeseries/target/types/public/application/components/annotations_editor.d.ts" - }, - { - "plugin": "visTypeTimeseries", - "path": "src/plugins/vis_types/timeseries/target/types/public/application/components/annotations_editor.d.ts" - }, - { - "plugin": "visTypeTimeseries", - "path": "src/plugins/vis_types/timeseries/target/types/public/application/components/annotations_editor.d.ts" - }, - { - "plugin": "visTypeTimeseries", - "path": "src/plugins/vis_types/timeseries/target/types/public/application/components/vis_editor.d.ts" - }, - { - "plugin": "visTypeTimeseries", - "path": "src/plugins/vis_types/timeseries/target/types/public/application/components/vis_editor.d.ts" - }, { "plugin": "visTypeTimeseries", "path": "src/plugins/vis_types/timeseries/target/types/public/application/components/lib/convert_series_to_datatable.d.ts" @@ -20561,14 +20773,6 @@ "plugin": "visTypeTimeseries", "path": "src/plugins/vis_types/timeseries/target/types/public/application/components/lib/convert_series_to_datatable.d.ts" }, - { - "plugin": "visTypeTimeseries", - "path": "src/plugins/vis_types/timeseries/target/types/public/application/components/panel_config/types.d.ts" - }, - { - "plugin": "visTypeTimeseries", - "path": "src/plugins/vis_types/timeseries/target/types/public/application/components/panel_config/types.d.ts" - }, { "plugin": "visTypeTimeseries", "path": "src/plugins/vis_types/timeseries/public/metrics_type.ts" @@ -20718,6 +20922,18 @@ "plugin": "lens", "path": "x-pack/plugins/lens/server/routes/field_stats.ts" }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts" + }, { "plugin": "lens", "path": "x-pack/plugins/lens/target/types/server/routes/field_stats.d.ts" @@ -20926,6 +21142,14 @@ "plugin": "maps", "path": "x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.test.ts" }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_source/es_source.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_source/es_source.d.ts" + }, { "plugin": "maps", "path": "x-pack/plugins/maps/target/types/public/classes/fields/es_doc_field.d.ts" @@ -20946,6 +21170,66 @@ "plugin": "maps", "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/top_hits/update_source_editor.d.ts" }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, { "plugin": "maps", "path": "x-pack/plugins/maps/target/types/public/components/geo_field_select.d.ts" @@ -21002,6 +21286,46 @@ "plugin": "maps", "path": "x-pack/plugins/maps/target/types/public/components/metrics_editor/metric_editor.d.ts" }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_geo_line_source/update_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_geo_line_source/update_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/layers/wizards/choropleth_layer_wizard/layer_template.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/layers/wizards/choropleth_layer_wizard/layer_template.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/layers/wizards/choropleth_layer_wizard/layer_template.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/layers/wizards/choropleth_layer_wizard/layer_template.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/top_hits/create_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/top_hits/create_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/top_hits/create_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/top_hits/create_source_editor.d.ts" + }, { "plugin": "maps", "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/top_hits/top_hits_form.d.ts" @@ -21014,6 +21338,14 @@ "plugin": "maps", "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/top_hits/top_hits_form.d.ts" }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/connected_components/edit_layer_panel/join_editor/resources/join.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/connected_components/edit_layer_panel/join_editor/resources/join.d.ts" + }, { "plugin": "maps", "path": "x-pack/plugins/maps/target/types/public/connected_components/edit_layer_panel/join_editor/resources/join_expression.d.ts" @@ -21304,7 +21636,7 @@ { "parentPluginId": "data", "id": "def-server.IndexPatternsFetcher.Unnamed.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "elasticsearchClient", "description": [], @@ -22964,9 +23296,6 @@ "tags": [], "label": "ES_FIELD_TYPES", "description": [], - "signature": [ - "ES_FIELD_TYPES" - ], "path": "node_modules/@types/kbn__field-types/index.d.ts", "deprecated": false, "initialIsOpen": false @@ -22978,9 +23307,6 @@ "tags": [], "label": "KBN_FIELD_TYPES", "description": [], - "signature": [ - "KBN_FIELD_TYPES" - ], "path": "node_modules/@types/kbn__field-types/index.d.ts", "deprecated": false, "initialIsOpen": false @@ -23067,74 +23393,6 @@ "deprecated": true, "removeBy": "8.1", "references": [ - { - "plugin": "discover", - "path": "src/plugins/discover/public/url_generator.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/url_generator.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/url_generator.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/locator.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/locator.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/locator.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/application/main/services/discover_state.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/application/main/services/discover_state.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/application/main/services/discover_state.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/application/main/services/discover_state.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/application/context/services/context_state.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/application/context/services/context_state.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/application/context/services/context_state.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/application/context/services/context_state.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/application/context/services/context_state.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/application/context/services/context_state.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/application/context/services/context_state.ts" - }, { "plugin": "dashboard", "path": "src/plugins/dashboard/public/application/lib/filter_utils.ts" @@ -23195,14 +23453,6 @@ "plugin": "dashboard", "path": "src/plugins/dashboard/public/application/embeddable/dashboard_container.tsx" }, - { - "plugin": "dashboardEnhanced", - "path": "x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx" - }, - { - "plugin": "dashboardEnhanced", - "path": "x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx" - }, { "plugin": "discoverEnhanced", "path": "x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_context_menu_action.ts" @@ -23315,14 +23565,6 @@ "plugin": "discover", "path": "src/plugins/discover/public/application/context/services/context_state.test.ts" }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/embeddable/types.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/embeddable/types.ts" - }, { "plugin": "discover", "path": "src/plugins/discover/public/embeddable/saved_search_embeddable.tsx" @@ -23332,44 +23574,40 @@ "path": "src/plugins/discover/public/embeddable/saved_search_embeddable.tsx" }, { - "plugin": "discover", - "path": "src/plugins/discover/public/application/context/services/context.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/application/context/services/context.ts" + "plugin": "maps", + "path": "x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts" }, { - "plugin": "discover", - "path": "src/plugins/discover/public/application/context/services/context.ts" + "plugin": "maps", + "path": "x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts" }, { - "plugin": "discover", - "path": "src/plugins/discover/public/application/context/services/context.ts" + "plugin": "maps", + "path": "x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts" }, { - "plugin": "discover", - "path": "src/plugins/discover/public/utils/get_sharing_data.ts" + "plugin": "maps", + "path": "x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts" }, { - "plugin": "discover", - "path": "src/plugins/discover/public/utils/get_sharing_data.ts" + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts" }, { "plugin": "maps", - "path": "x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts" + "path": "x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts" }, { "plugin": "maps", - "path": "x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts" + "path": "x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts" }, { "plugin": "maps", - "path": "x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts" + "path": "x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts" }, { "plugin": "maps", - "path": "x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts" + "path": "x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts" }, { "plugin": "discover", @@ -23415,24 +23653,6 @@ "deprecated": false, "initialIsOpen": false }, - { - "parentPluginId": "data", - "id": "def-server.IFieldSubType", - "type": "Type", - "tags": [ - "deprecated" - ], - "label": "IFieldSubType", - "description": [], - "signature": [ - "IFieldSubTypeMultiOptional | IFieldSubTypeNestedOptional" - ], - "path": "src/plugins/data/common/es_query/index.ts", - "deprecated": true, - "removeBy": "8.1", - "references": [], - "initialIsOpen": false - }, { "parentPluginId": "data", "id": "def-server.IndexPatternAttributes", @@ -23538,9 +23758,6 @@ ], "label": "KueryNode", "description": [], - "signature": [ - "KueryNode" - ], "path": "src/plugins/data/common/es_query/index.ts", "deprecated": true, "removeBy": "8.1", @@ -25294,6 +25511,19 @@ "path": "src/plugins/data_views/common/data_views/data_view.ts", "deprecated": false }, + { + "parentPluginId": "data", + "id": "def-common.DataView.namespaces", + "type": "Array", + "tags": [], + "label": "namespaces", + "description": [], + "signature": [ + "string[]" + ], + "path": "src/plugins/data_views/common/data_views/data_view.ts", + "deprecated": false + }, { "parentPluginId": "data", "id": "def-common.DataView.allowNoIndex", @@ -25403,15 +25633,9 @@ "signature": [ "() => { storedFields: string[]; scriptFields: Record; docvalueFields: { field: string; format: string; }[]; runtimeFields: Record; }" + ">; docvalueFields: { field: string; format: string; }[]; runtimeFields: ", + "MappingRuntimeFields", + "; }" ], "path": "src/plugins/data_views/common/data_views/data_view.ts", "deprecated": false, @@ -25893,7 +26117,7 @@ "tags": [], "label": "addRuntimeField", "description": [ - "\nAdd a runtime field - Appended to existing mapped field or a new field is\ncreated as appropriate" + "\nAdd a runtime field - Appended to existing mapped field or a new field is\ncreated as appropriate." ], "signature": [ "(name: string, runtimeField: ", @@ -25904,7 +26128,15 @@ "section": "def-common.RuntimeField", "text": "RuntimeField" }, - ") => void" + ") => ", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.DataViewField", + "text": "DataViewField" + }, + "[]" ], "path": "src/plugins/data_views/common/data_views/data_view.ts", "deprecated": false, @@ -26022,6 +26254,67 @@ ], "returnComment": [] }, + { + "parentPluginId": "data", + "id": "def-common.DataView.getAllRuntimeFields", + "type": "Function", + "tags": [], + "label": "getAllRuntimeFields", + "description": [], + "signature": [ + "() => Record" + ], + "path": "src/plugins/data_views/common/data_views/data_view.ts", + "deprecated": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "data", + "id": "def-common.DataView.getFieldsByRuntimeFieldName", + "type": "Function", + "tags": [], + "label": "getFieldsByRuntimeFieldName", + "description": [], + "signature": [ + "(name: string) => Record | undefined" + ], + "path": "src/plugins/data_views/common/data_views/data_view.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "data", + "id": "def-common.DataView.getFieldsByRuntimeFieldName.$1", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "signature": [ + "string" + ], + "path": "src/plugins/data_views/common/data_views/data_view.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, { "parentPluginId": "data", "id": "def-common.DataView.replaceAllRuntimeFields", @@ -26104,6 +26397,24 @@ ], "returnComment": [] }, + { + "parentPluginId": "data", + "id": "def-common.DataView.getRuntimeMappings", + "type": "Function", + "tags": [], + "label": "getRuntimeMappings", + "description": [ + "\nReturn the \"runtime_mappings\" section of the ES search query" + ], + "signature": [ + "() => ", + "MappingRuntimeFields" + ], + "path": "src/plugins/data_views/common/data_views/data_view.ts", + "deprecated": false, + "children": [], + "returnComment": [] + }, { "parentPluginId": "data", "id": "def-common.DataView.getFormatterForFieldNoDefault", @@ -26537,8 +26848,8 @@ "pluginId": "dataViews", "scope": "common", "docId": "kibDataViewsPluginApi", - "section": "def-common.RuntimeField", - "text": "RuntimeField" + "section": "def-common.RuntimeFieldSpec", + "text": "RuntimeFieldSpec" }, " | undefined" ], @@ -26557,8 +26868,8 @@ "pluginId": "dataViews", "scope": "common", "docId": "kibDataViewsPluginApi", - "section": "def-common.RuntimeField", - "text": "RuntimeField" + "section": "def-common.RuntimeFieldSpec", + "text": "RuntimeFieldSpec" }, " | undefined" ], @@ -26787,6 +27098,16 @@ "path": "src/plugins/data_views/common/fields/data_view_field.ts", "deprecated": false }, + { + "parentPluginId": "data", + "id": "def-common.DataViewField.isRuntimeField", + "type": "boolean", + "tags": [], + "label": "isRuntimeField", + "description": [], + "path": "src/plugins/data_views/common/fields/data_view_field.ts", + "deprecated": false + }, { "parentPluginId": "data", "id": "def-common.DataViewField.sortable", @@ -27024,6 +27345,21 @@ } ], "returnComment": [] + }, + { + "parentPluginId": "data", + "id": "def-common.DataViewField.isRuntimeCompositeSubField", + "type": "Function", + "tags": [], + "label": "isRuntimeCompositeSubField", + "description": [], + "signature": [ + "() => boolean" + ], + "path": "src/plugins/data_views/common/fields/data_view_field.ts", + "deprecated": false, + "children": [], + "returnComment": [] } ], "initialIsOpen": false @@ -28353,6 +28689,10 @@ "plugin": "visualizations", "path": "src/plugins/visualizations/target/types/public/vis_types/base_vis_type.d.ts" }, + { + "plugin": "dashboard", + "path": "src/plugins/dashboard/target/types/public/application/hooks/use_dashboard_app_state.d.ts" + }, { "plugin": "discover", "path": "src/plugins/discover/target/types/public/application/main/utils/use_discover_state.d.ts" @@ -28557,6 +28897,14 @@ "plugin": "lens", "path": "x-pack/plugins/lens/server/routes/existing_fields.test.ts" }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts" + }, { "plugin": "observability", "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/rtl_helpers.tsx" @@ -28581,6 +28929,22 @@ "plugin": "ux", "path": "x-pack/plugins/ux/public/components/app/rum_dashboard/local_uifilters/selected_filters.tsx" }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/fields/agg/percentile_agg_field.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/fields/agg/percentile_agg_field.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts" + }, { "plugin": "visTypeTimeseries", "path": "src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts" @@ -28657,14 +29021,6 @@ "plugin": "savedObjects", "path": "src/plugins/saved_objects/public/saved_object/helpers/apply_es_resp.ts" }, - { - "plugin": "dataViewFieldEditor", - "path": "src/plugins/data_view_field_editor/public/components/field_format_editor/field_format_editor.tsx" - }, - { - "plugin": "dataViewFieldEditor", - "path": "src/plugins/data_view_field_editor/public/components/field_format_editor/field_format_editor.tsx" - }, { "plugin": "dataViewEditor", "path": "src/plugins/data_view_editor/public/shared_imports.ts" @@ -29033,6 +29389,38 @@ "plugin": "maps", "path": "x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.test.ts" }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_source/es_source.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_source/es_source.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_source/es_source.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_source/es_source.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/es_search_source.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/es_search_source.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, { "plugin": "maps", "path": "x-pack/plugins/maps/public/classes/fields/agg/percentile_agg_field.test.ts" @@ -29041,6 +29429,14 @@ "plugin": "maps", "path": "x-pack/plugins/maps/public/classes/fields/agg/percentile_agg_field.test.ts" }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/components/geo_index_pattern_select.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/components/geo_index_pattern_select.d.ts" + }, { "plugin": "maps", "path": "x-pack/plugins/maps/public/classes/sources/es_search_source/util/get_docvalue_source_fields.test.ts" @@ -29053,6 +29449,98 @@ "plugin": "maps", "path": "x-pack/plugins/maps/public/classes/sources/es_search_source/util/get_docvalue_source_fields.test.ts" }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/fields/agg/count_agg_field.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/fields/agg/count_agg_field.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/fields/agg/agg_field.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/fields/agg/agg_field.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_geo_line_source/create_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_geo_line_source/create_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_geo_line_source/create_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_geo_line_source/geo_line_form.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_geo_line_source/geo_line_form.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_geo_line_source/update_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_geo_line_source/update_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/connected_components/edit_layer_panel/filter_editor/filter_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/connected_components/edit_layer_panel/filter_editor/filter_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/layers/wizards/choropleth_layer_wizard/layer_template.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/layers/wizards/choropleth_layer_wizard/layer_template.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/layers/wizards/choropleth_layer_wizard/layer_template.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/top_hits/create_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/top_hits/create_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/top_hits/create_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/connected_components/edit_layer_panel/join_editor/resources/join.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/connected_components/edit_layer_panel/join_editor/resources/join.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/connected_components/edit_layer_panel/join_editor/resources/where_expression.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/connected_components/edit_layer_panel/join_editor/resources/where_expression.d.ts" + }, { "plugin": "stackAlerts", "path": "x-pack/plugins/stack_alerts/target/types/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.d.ts" @@ -29337,26 +29825,6 @@ "plugin": "visTypeTimeseries", "path": "src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts" }, - { - "plugin": "visTypeTimeseries", - "path": "src/plugins/vis_types/timeseries/target/types/public/application/components/annotations_editor.d.ts" - }, - { - "plugin": "visTypeTimeseries", - "path": "src/plugins/vis_types/timeseries/target/types/public/application/components/annotations_editor.d.ts" - }, - { - "plugin": "visTypeTimeseries", - "path": "src/plugins/vis_types/timeseries/target/types/public/application/components/annotations_editor.d.ts" - }, - { - "plugin": "visTypeTimeseries", - "path": "src/plugins/vis_types/timeseries/target/types/public/application/components/vis_editor.d.ts" - }, - { - "plugin": "visTypeTimeseries", - "path": "src/plugins/vis_types/timeseries/target/types/public/application/components/vis_editor.d.ts" - }, { "plugin": "visTypeTimeseries", "path": "src/plugins/vis_types/timeseries/target/types/public/application/components/lib/convert_series_to_datatable.d.ts" @@ -29369,14 +29837,6 @@ "plugin": "visTypeTimeseries", "path": "src/plugins/vis_types/timeseries/target/types/public/application/components/lib/convert_series_to_datatable.d.ts" }, - { - "plugin": "visTypeTimeseries", - "path": "src/plugins/vis_types/timeseries/target/types/public/application/components/panel_config/types.d.ts" - }, - { - "plugin": "visTypeTimeseries", - "path": "src/plugins/vis_types/timeseries/target/types/public/application/components/panel_config/types.d.ts" - }, { "plugin": "visTypeTimeseries", "path": "src/plugins/vis_types/timeseries/public/metrics_type.ts" @@ -29526,6 +29986,18 @@ "plugin": "lens", "path": "x-pack/plugins/lens/server/routes/field_stats.ts" }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts" + }, { "plugin": "lens", "path": "x-pack/plugins/lens/target/types/server/routes/field_stats.d.ts" @@ -29734,6 +30206,14 @@ "plugin": "maps", "path": "x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.test.ts" }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_source/es_source.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_source/es_source.d.ts" + }, { "plugin": "maps", "path": "x-pack/plugins/maps/target/types/public/classes/fields/es_doc_field.d.ts" @@ -29754,6 +30234,66 @@ "plugin": "maps", "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/top_hits/update_source_editor.d.ts" }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, { "plugin": "maps", "path": "x-pack/plugins/maps/target/types/public/components/geo_field_select.d.ts" @@ -29810,6 +30350,46 @@ "plugin": "maps", "path": "x-pack/plugins/maps/target/types/public/components/metrics_editor/metric_editor.d.ts" }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_geo_line_source/update_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_geo_line_source/update_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/layers/wizards/choropleth_layer_wizard/layer_template.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/layers/wizards/choropleth_layer_wizard/layer_template.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/layers/wizards/choropleth_layer_wizard/layer_template.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/layers/wizards/choropleth_layer_wizard/layer_template.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/top_hits/create_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/top_hits/create_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/top_hits/create_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/top_hits/create_source_editor.d.ts" + }, { "plugin": "maps", "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/top_hits/top_hits_form.d.ts" @@ -29822,6 +30402,14 @@ "plugin": "maps", "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/top_hits/top_hits_form.d.ts" }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/connected_components/edit_layer_panel/join_editor/resources/join.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/connected_components/edit_layer_panel/join_editor/resources/join.d.ts" + }, { "plugin": "maps", "path": "x-pack/plugins/maps/target/types/public/connected_components/edit_layer_panel/join_editor/resources/join_expression.d.ts" @@ -30250,9 +30838,6 @@ "tags": [], "label": "KbnFieldType", "description": [], - "signature": [ - "KbnFieldType" - ], "path": "node_modules/@types/kbn__field-types/index.d.ts", "deprecated": false, "children": [ @@ -31768,26 +32353,6 @@ ], "initialIsOpen": false }, - { - "parentPluginId": "data", - "id": "def-common.getFilterableKbnTypeNames", - "type": "Function", - "tags": [ - "deprecated" - ], - "label": "getFilterableKbnTypeNames", - "description": [], - "signature": [ - "() => string[]" - ], - "path": "src/plugins/data/common/kbn_field_types/index.ts", - "deprecated": true, - "removeBy": "8.1", - "references": [], - "returnComment": [], - "children": [], - "initialIsOpen": false - }, { "parentPluginId": "data", "id": "def-common.getIndexPatternLoadMeta", @@ -31812,58 +32377,6 @@ "returnComment": [], "initialIsOpen": false }, - { - "parentPluginId": "data", - "id": "def-common.getKbnFieldType", - "type": "Function", - "tags": [ - "deprecated" - ], - "label": "getKbnFieldType", - "description": [], - "signature": [ - "(typeName: string) => ", - "KbnFieldType" - ], - "path": "src/plugins/data/common/kbn_field_types/index.ts", - "deprecated": true, - "removeBy": "8.1", - "references": [], - "returnComment": [], - "children": [ - { - "parentPluginId": "data", - "id": "def-common.getKbnFieldType.$1", - "type": "string", - "tags": [], - "label": "typeName", - "description": [], - "path": "node_modules/@types/kbn__field-types/index.d.ts", - "deprecated": false - } - ], - "initialIsOpen": false - }, - { - "parentPluginId": "data", - "id": "def-common.getKbnTypeNames", - "type": "Function", - "tags": [ - "deprecated" - ], - "label": "getKbnTypeNames", - "description": [], - "signature": [ - "() => string[]" - ], - "path": "src/plugins/data/common/kbn_field_types/index.ts", - "deprecated": true, - "removeBy": "8.1", - "references": [], - "returnComment": [], - "children": [], - "initialIsOpen": false - }, { "parentPluginId": "data", "id": "def-common.getPhraseFilterField", @@ -32163,16 +32676,7 @@ "path": "src/plugins/data/common/es_query/index.ts", "deprecated": true, "removeBy": "8.1", - "references": [ - { - "plugin": "dashboardEnhanced", - "path": "x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx" - }, - { - "plugin": "dashboardEnhanced", - "path": "x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx" - } - ], + "references": [], "returnComment": [], "children": [ { @@ -33048,6 +33552,19 @@ "path": "src/plugins/data_views/common/data_views/data_views.ts", "deprecated": false }, + { + "parentPluginId": "data", + "id": "def-common.DataViewListItem.namespaces", + "type": "Array", + "tags": [], + "label": "namespaces", + "description": [], + "signature": [ + "string[] | undefined" + ], + "path": "src/plugins/data_views/common/data_views/data_views.ts", + "deprecated": false + }, { "parentPluginId": "data", "id": "def-common.DataViewListItem.title", @@ -33277,8 +33794,8 @@ "pluginId": "dataViews", "scope": "common", "docId": "kibDataViewsPluginApi", - "section": "def-common.RuntimeField", - "text": "RuntimeField" + "section": "def-common.RuntimeFieldSpec", + "text": "RuntimeFieldSpec" }, "> | undefined" ], @@ -33317,6 +33834,19 @@ ], "path": "src/plugins/data_views/common/types.ts", "deprecated": false + }, + { + "parentPluginId": "data", + "id": "def-common.DataViewSpec.namespaces", + "type": "Array", + "tags": [], + "label": "namespaces", + "description": [], + "signature": [ + "string[] | undefined" + ], + "path": "src/plugins/data_views/common/types.ts", + "deprecated": false } ], "initialIsOpen": false @@ -33556,8 +34086,8 @@ "pluginId": "dataViews", "scope": "common", "docId": "kibDataViewsPluginApi", - "section": "def-common.RuntimeField", - "text": "RuntimeField" + "section": "def-common.RuntimeFieldSpec", + "text": "RuntimeFieldSpec" }, " | undefined" ], @@ -35006,7 +35536,14 @@ "section": "def-common.FieldSpec", "text": "FieldSpec" }, - ") => void" + ") => ", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.DataViewField", + "text": "DataViewField" + } ], "path": "src/plugins/data_views/common/fields/field_list.ts", "deprecated": false, @@ -35448,9 +35985,6 @@ "tags": [], "label": "KbnFieldTypeOptions", "description": [], - "signature": [ - "KbnFieldTypeOptions" - ], "path": "node_modules/@types/kbn__field-types/index.d.ts", "deprecated": false, "children": [ @@ -35505,34 +36039,46 @@ "parentPluginId": "data", "id": "def-common.RuntimeField", "type": "Interface", - "tags": [], + "tags": [ + "see" + ], "label": "RuntimeField", - "description": [], + "description": [ + "\nThis is the RuntimeField interface enhanced with Data view field\nconfiguration: field format definition, customLabel or popularity.\n" + ], + "signature": [ + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.RuntimeField", + "text": "RuntimeField" + }, + " extends ", + "RuntimeFieldBase", + ",", + "FieldConfiguration" + ], "path": "src/plugins/data_views/common/types.ts", "deprecated": false, "children": [ { "parentPluginId": "data", - "id": "def-common.RuntimeField.type", - "type": "CompoundType", - "tags": [], - "label": "type", - "description": [], - "signature": [ - "\"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"long\" | \"double\"" - ], - "path": "src/plugins/data_views/common/types.ts", - "deprecated": false - }, - { - "parentPluginId": "data", - "id": "def-common.RuntimeField.script", + "id": "def-common.RuntimeField.fields", "type": "Object", "tags": [], - "label": "script", + "label": "fields", "description": [], "signature": [ - "{ source: string; } | undefined" + "Record | undefined" ], "path": "src/plugins/data_views/common/types.ts", "deprecated": false @@ -36300,9 +36846,6 @@ "tags": [], "label": "ES_FIELD_TYPES", "description": [], - "signature": [ - "ES_FIELD_TYPES" - ], "path": "node_modules/@types/kbn__field-types/index.d.ts", "deprecated": false, "initialIsOpen": false @@ -36316,9 +36859,6 @@ "description": [ "\r\n Filter,\r\nAn enum to denote whether a filter is specific to an application's context or whether it should be applied globally." ], - "signature": [ - "FilterStateStore" - ], "path": "node_modules/@types/kbn__es-query/index.d.ts", "deprecated": false, "initialIsOpen": false @@ -36330,9 +36870,6 @@ "tags": [], "label": "KBN_FIELD_TYPES", "description": [], - "signature": [ - "KBN_FIELD_TYPES" - ], "path": "node_modules/@types/kbn__field-types/index.d.ts", "deprecated": false, "initialIsOpen": false @@ -36773,74 +37310,6 @@ "deprecated": true, "removeBy": "8.1", "references": [ - { - "plugin": "discover", - "path": "src/plugins/discover/public/url_generator.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/url_generator.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/url_generator.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/locator.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/locator.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/locator.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/application/main/services/discover_state.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/application/main/services/discover_state.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/application/main/services/discover_state.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/application/main/services/discover_state.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/application/context/services/context_state.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/application/context/services/context_state.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/application/context/services/context_state.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/application/context/services/context_state.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/application/context/services/context_state.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/application/context/services/context_state.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/application/context/services/context_state.ts" - }, { "plugin": "dashboard", "path": "src/plugins/dashboard/public/application/lib/filter_utils.ts" @@ -36901,14 +37370,6 @@ "plugin": "dashboard", "path": "src/plugins/dashboard/public/application/embeddable/dashboard_container.tsx" }, - { - "plugin": "dashboardEnhanced", - "path": "x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx" - }, - { - "plugin": "dashboardEnhanced", - "path": "x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx" - }, { "plugin": "discoverEnhanced", "path": "x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_context_menu_action.ts" @@ -37021,14 +37482,6 @@ "plugin": "discover", "path": "src/plugins/discover/public/application/context/services/context_state.test.ts" }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/embeddable/types.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/embeddable/types.ts" - }, { "plugin": "discover", "path": "src/plugins/discover/public/embeddable/saved_search_embeddable.tsx" @@ -37038,44 +37491,40 @@ "path": "src/plugins/discover/public/embeddable/saved_search_embeddable.tsx" }, { - "plugin": "discover", - "path": "src/plugins/discover/public/application/context/services/context.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/application/context/services/context.ts" + "plugin": "maps", + "path": "x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts" }, { - "plugin": "discover", - "path": "src/plugins/discover/public/application/context/services/context.ts" + "plugin": "maps", + "path": "x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts" }, { - "plugin": "discover", - "path": "src/plugins/discover/public/application/context/services/context.ts" + "plugin": "maps", + "path": "x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts" }, { - "plugin": "discover", - "path": "src/plugins/discover/public/utils/get_sharing_data.ts" + "plugin": "maps", + "path": "x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts" }, { - "plugin": "discover", - "path": "src/plugins/discover/public/utils/get_sharing_data.ts" + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts" }, { "plugin": "maps", - "path": "x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts" + "path": "x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts" }, { "plugin": "maps", - "path": "x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts" + "path": "x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts" }, { "plugin": "maps", - "path": "x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts" + "path": "x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts" }, { "plugin": "maps", - "path": "x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts" + "path": "x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts" }, { "plugin": "discover", @@ -37156,24 +37605,6 @@ ], "initialIsOpen": false }, - { - "parentPluginId": "data", - "id": "def-common.IFieldSubType", - "type": "Type", - "tags": [ - "deprecated" - ], - "label": "IFieldSubType", - "description": [], - "signature": [ - "IFieldSubTypeMultiOptional | IFieldSubTypeNestedOptional" - ], - "path": "src/plugins/data/common/es_query/index.ts", - "deprecated": true, - "removeBy": "8.1", - "references": [], - "initialIsOpen": false - }, { "parentPluginId": "data", "id": "def-common.INDEX_PATTERN_SAVED_OBJECT_TYPE", @@ -37792,9 +38223,6 @@ ], "label": "KueryNode", "description": [], - "signature": [ - "KueryNode" - ], "path": "src/plugins/data/common/es_query/index.ts", "deprecated": true, "removeBy": "8.1", @@ -38130,9 +38558,6 @@ ], "label": "RangeFilterParams", "description": [], - "signature": [ - "RangeFilterParams" - ], "path": "src/plugins/data/common/es_query/index.ts", "deprecated": true, "removeBy": "8.1", @@ -38147,7 +38572,7 @@ "label": "RuntimeType", "description": [], "signature": [ - "\"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"long\" | \"double\"" + "\"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"long\" | \"double\" | \"composite\"" ], "path": "src/plugins/data_views/common/types.ts", "deprecated": false, @@ -38408,7 +38833,7 @@ "label": "RUNTIME_FIELD_TYPES", "description": [], "signature": [ - "readonly [\"keyword\", \"long\", \"double\", \"date\", \"ip\", \"boolean\", \"geo_point\"]" + "readonly [\"keyword\", \"long\", \"double\", \"date\", \"ip\", \"boolean\", \"geo_point\", \"composite\"]" ], "path": "src/plugins/data_views/common/constants.ts", "deprecated": false, diff --git a/api_docs/data.mdx b/api_docs/data.mdx index 83578e4206fba..75501fbd0013b 100644 --- a/api_docs/data.mdx +++ b/api_docs/data.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/data title: "data" image: https://source.unsplash.com/400x175/?github summary: API docs for the data plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data'] warning: 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. --- @@ -18,7 +18,7 @@ Contact [App Services](https://github.com/orgs/elastic/teams/kibana-app-services | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 3386 | 40 | 2791 | 26 | +| 3392 | 40 | 2795 | 26 | ## Client diff --git a/api_docs/data_autocomplete.mdx b/api_docs/data_autocomplete.mdx index 03d9948ab4606..00c930c343325 100644 --- a/api_docs/data_autocomplete.mdx +++ b/api_docs/data_autocomplete.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/data-autocomplete title: "data.autocomplete" image: https://source.unsplash.com/400x175/?github summary: API docs for the data.autocomplete plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.autocomplete'] warning: 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. --- @@ -18,7 +18,7 @@ Contact [App Services](https://github.com/orgs/elastic/teams/kibana-app-services | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 3386 | 40 | 2791 | 26 | +| 3392 | 40 | 2795 | 26 | ## Client diff --git a/api_docs/data_enhanced.mdx b/api_docs/data_enhanced.mdx index 23567d436cb56..511af26bb9015 100644 --- a/api_docs/data_enhanced.mdx +++ b/api_docs/data_enhanced.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/dataEnhanced title: "dataEnhanced" image: https://source.unsplash.com/400x175/?github summary: API docs for the dataEnhanced plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataEnhanced'] warning: 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. --- diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx index 5b27cb9570bf5..c4d4875f1393e 100644 --- a/api_docs/data_query.mdx +++ b/api_docs/data_query.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/data-query title: "data.query" image: https://source.unsplash.com/400x175/?github summary: API docs for the data.query plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.query'] warning: 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. --- @@ -18,7 +18,7 @@ Contact [App Services](https://github.com/orgs/elastic/teams/kibana-app-services | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 3386 | 40 | 2791 | 26 | +| 3392 | 40 | 2795 | 26 | ## Client diff --git a/api_docs/data_search.devdocs.json b/api_docs/data_search.devdocs.json index e31eeecd66eba..c37265a550a31 100644 --- a/api_docs/data_search.devdocs.json +++ b/api_docs/data_search.devdocs.json @@ -23898,7 +23898,7 @@ "label": "type", "description": [], "signature": [ - "\"date\" | \"long\" | \"double\" | \"date_nanos\" | undefined" + "\"date\" | \"date_nanos\" | \"long\" | \"double\" | undefined" ], "path": "src/plugins/data/common/search/search_source/types.ts", "deprecated": false @@ -27660,7 +27660,7 @@ "section": "def-common.SortDirection", "text": "SortDirection" }, - "; numeric_type?: \"date\" | \"long\" | \"double\" | \"date_nanos\" | undefined; }" + "; numeric_type?: \"date\" | \"date_nanos\" | \"long\" | \"double\" | undefined; }" ], "path": "src/plugins/data/common/search/search_source/types.ts", "deprecated": false, diff --git a/api_docs/data_search.mdx b/api_docs/data_search.mdx index 12468c8bc7a4e..0e8930269f2de 100644 --- a/api_docs/data_search.mdx +++ b/api_docs/data_search.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/data-search title: "data.search" image: https://source.unsplash.com/400x175/?github summary: API docs for the data.search plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.search'] warning: 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. --- @@ -18,7 +18,7 @@ Contact [App Services](https://github.com/orgs/elastic/teams/kibana-app-services | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 3386 | 40 | 2791 | 26 | +| 3392 | 40 | 2795 | 26 | ## Client diff --git a/api_docs/data_ui.mdx b/api_docs/data_ui.mdx index aa6a8118f3215..bdab96a480712 100644 --- a/api_docs/data_ui.mdx +++ b/api_docs/data_ui.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/data-ui title: "data.ui" image: https://source.unsplash.com/400x175/?github summary: API docs for the data.ui plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.ui'] warning: 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. --- @@ -18,7 +18,7 @@ Contact [App Services](https://github.com/orgs/elastic/teams/kibana-app-services | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 3386 | 40 | 2791 | 26 | +| 3392 | 40 | 2795 | 26 | ## Client diff --git a/api_docs/data_view_editor.mdx b/api_docs/data_view_editor.mdx index f94b095a4fb6b..b44cf2309f9a4 100644 --- a/api_docs/data_view_editor.mdx +++ b/api_docs/data_view_editor.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/dataViewEditor title: "dataViewEditor" image: https://source.unsplash.com/400x175/?github summary: API docs for the dataViewEditor plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewEditor'] warning: 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. --- diff --git a/api_docs/data_view_field_editor.mdx b/api_docs/data_view_field_editor.mdx index 2e3ffc6ef478d..5cebff6aee871 100644 --- a/api_docs/data_view_field_editor.mdx +++ b/api_docs/data_view_field_editor.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/dataViewFieldEditor title: "dataViewFieldEditor" image: https://source.unsplash.com/400x175/?github summary: API docs for the dataViewFieldEditor plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewFieldEditor'] warning: 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. --- diff --git a/api_docs/data_view_management.mdx b/api_docs/data_view_management.mdx index 37f551b5cfdc7..55a219292069f 100644 --- a/api_docs/data_view_management.mdx +++ b/api_docs/data_view_management.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/dataViewManagement title: "dataViewManagement" image: https://source.unsplash.com/400x175/?github summary: API docs for the dataViewManagement plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewManagement'] warning: 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. --- diff --git a/api_docs/data_views.devdocs.json b/api_docs/data_views.devdocs.json index 677b535526246..ccc8a5573bbdf 100644 --- a/api_docs/data_views.devdocs.json +++ b/api_docs/data_views.devdocs.json @@ -245,6 +245,19 @@ "path": "src/plugins/data_views/common/data_views/data_view.ts", "deprecated": false }, + { + "parentPluginId": "dataViews", + "id": "def-public.DataView.namespaces", + "type": "Array", + "tags": [], + "label": "namespaces", + "description": [], + "signature": [ + "string[]" + ], + "path": "src/plugins/data_views/common/data_views/data_view.ts", + "deprecated": false + }, { "parentPluginId": "dataViews", "id": "def-public.DataView.allowNoIndex", @@ -354,15 +367,9 @@ "signature": [ "() => { storedFields: string[]; scriptFields: Record; docvalueFields: { field: string; format: string; }[]; runtimeFields: Record; }" + ">; docvalueFields: { field: string; format: string; }[]; runtimeFields: ", + "MappingRuntimeFields", + "; }" ], "path": "src/plugins/data_views/common/data_views/data_view.ts", "deprecated": false, @@ -800,7 +807,7 @@ "tags": [], "label": "addRuntimeField", "description": [ - "\nAdd a runtime field - Appended to existing mapped field or a new field is\ncreated as appropriate" + "\nAdd a runtime field - Appended to existing mapped field or a new field is\ncreated as appropriate." ], "signature": [ "(name: string, runtimeField: ", @@ -811,7 +818,15 @@ "section": "def-common.RuntimeField", "text": "RuntimeField" }, - ") => void" + ") => ", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.DataViewField", + "text": "DataViewField" + }, + "[]" ], "path": "src/plugins/data_views/common/data_views/data_view.ts", "deprecated": false, @@ -929,6 +944,67 @@ ], "returnComment": [] }, + { + "parentPluginId": "dataViews", + "id": "def-public.DataView.getAllRuntimeFields", + "type": "Function", + "tags": [], + "label": "getAllRuntimeFields", + "description": [], + "signature": [ + "() => Record" + ], + "path": "src/plugins/data_views/common/data_views/data_view.ts", + "deprecated": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "dataViews", + "id": "def-public.DataView.getFieldsByRuntimeFieldName", + "type": "Function", + "tags": [], + "label": "getFieldsByRuntimeFieldName", + "description": [], + "signature": [ + "(name: string) => Record | undefined" + ], + "path": "src/plugins/data_views/common/data_views/data_view.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "dataViews", + "id": "def-public.DataView.getFieldsByRuntimeFieldName.$1", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "signature": [ + "string" + ], + "path": "src/plugins/data_views/common/data_views/data_view.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, { "parentPluginId": "dataViews", "id": "def-public.DataView.replaceAllRuntimeFields", @@ -1011,6 +1087,24 @@ ], "returnComment": [] }, + { + "parentPluginId": "dataViews", + "id": "def-public.DataView.getRuntimeMappings", + "type": "Function", + "tags": [], + "label": "getRuntimeMappings", + "description": [ + "\nReturn the \"runtime_mappings\" section of the ES search query" + ], + "signature": [ + "() => ", + "MappingRuntimeFields" + ], + "path": "src/plugins/data_views/common/data_views/data_view.ts", + "deprecated": false, + "children": [], + "returnComment": [] + }, { "parentPluginId": "dataViews", "id": "def-public.DataView.getFormatterForFieldNoDefault", @@ -1444,8 +1538,8 @@ "pluginId": "dataViews", "scope": "common", "docId": "kibDataViewsPluginApi", - "section": "def-common.RuntimeField", - "text": "RuntimeField" + "section": "def-common.RuntimeFieldSpec", + "text": "RuntimeFieldSpec" }, " | undefined" ], @@ -1464,8 +1558,8 @@ "pluginId": "dataViews", "scope": "common", "docId": "kibDataViewsPluginApi", - "section": "def-common.RuntimeField", - "text": "RuntimeField" + "section": "def-common.RuntimeFieldSpec", + "text": "RuntimeFieldSpec" }, " | undefined" ], @@ -1694,6 +1788,16 @@ "path": "src/plugins/data_views/common/fields/data_view_field.ts", "deprecated": false }, + { + "parentPluginId": "dataViews", + "id": "def-public.DataViewField.isRuntimeField", + "type": "boolean", + "tags": [], + "label": "isRuntimeField", + "description": [], + "path": "src/plugins/data_views/common/fields/data_view_field.ts", + "deprecated": false + }, { "parentPluginId": "dataViews", "id": "def-public.DataViewField.sortable", @@ -1931,6 +2035,21 @@ } ], "returnComment": [] + }, + { + "parentPluginId": "dataViews", + "id": "def-public.DataViewField.isRuntimeCompositeSubField", + "type": "Function", + "tags": [], + "label": "isRuntimeCompositeSubField", + "description": [], + "signature": [ + "() => boolean" + ], + "path": "src/plugins/data_views/common/fields/data_view_field.ts", + "deprecated": false, + "children": [], + "returnComment": [] } ], "initialIsOpen": false @@ -3536,6 +3655,10 @@ "plugin": "visualizations", "path": "src/plugins/visualizations/target/types/public/vis_types/base_vis_type.d.ts" }, + { + "plugin": "dashboard", + "path": "src/plugins/dashboard/target/types/public/application/hooks/use_dashboard_app_state.d.ts" + }, { "plugin": "discover", "path": "src/plugins/discover/target/types/public/application/main/utils/use_discover_state.d.ts" @@ -3880,6 +4003,14 @@ "plugin": "lens", "path": "x-pack/plugins/lens/server/routes/existing_fields.test.ts" }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts" + }, { "plugin": "observability", "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/rtl_helpers.tsx" @@ -3904,6 +4035,22 @@ "plugin": "ux", "path": "x-pack/plugins/ux/public/components/app/rum_dashboard/local_uifilters/selected_filters.tsx" }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/fields/agg/percentile_agg_field.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/fields/agg/percentile_agg_field.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts" + }, { "plugin": "visTypeTimeseries", "path": "src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts" @@ -4244,14 +4391,6 @@ "plugin": "savedObjects", "path": "src/plugins/saved_objects/public/saved_object/helpers/apply_es_resp.ts" }, - { - "plugin": "dataViewFieldEditor", - "path": "src/plugins/data_view_field_editor/public/components/field_format_editor/field_format_editor.tsx" - }, - { - "plugin": "dataViewFieldEditor", - "path": "src/plugins/data_view_field_editor/public/components/field_format_editor/field_format_editor.tsx" - }, { "plugin": "dataViewEditor", "path": "src/plugins/data_view_editor/public/shared_imports.ts" @@ -4620,6 +4759,38 @@ "plugin": "maps", "path": "x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.test.ts" }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_source/es_source.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_source/es_source.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_source/es_source.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_source/es_source.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/es_search_source.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/es_search_source.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, { "plugin": "maps", "path": "x-pack/plugins/maps/public/classes/fields/agg/percentile_agg_field.test.ts" @@ -4628,6 +4799,14 @@ "plugin": "maps", "path": "x-pack/plugins/maps/public/classes/fields/agg/percentile_agg_field.test.ts" }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/components/geo_index_pattern_select.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/components/geo_index_pattern_select.d.ts" + }, { "plugin": "maps", "path": "x-pack/plugins/maps/public/classes/sources/es_search_source/util/get_docvalue_source_fields.test.ts" @@ -4640,6 +4819,98 @@ "plugin": "maps", "path": "x-pack/plugins/maps/public/classes/sources/es_search_source/util/get_docvalue_source_fields.test.ts" }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/fields/agg/count_agg_field.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/fields/agg/count_agg_field.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/fields/agg/agg_field.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/fields/agg/agg_field.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_geo_line_source/create_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_geo_line_source/create_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_geo_line_source/create_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_geo_line_source/geo_line_form.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_geo_line_source/geo_line_form.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_geo_line_source/update_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_geo_line_source/update_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/connected_components/edit_layer_panel/filter_editor/filter_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/connected_components/edit_layer_panel/filter_editor/filter_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/layers/wizards/choropleth_layer_wizard/layer_template.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/layers/wizards/choropleth_layer_wizard/layer_template.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/layers/wizards/choropleth_layer_wizard/layer_template.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/top_hits/create_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/top_hits/create_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/top_hits/create_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/connected_components/edit_layer_panel/join_editor/resources/join.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/connected_components/edit_layer_panel/join_editor/resources/join.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/connected_components/edit_layer_panel/join_editor/resources/where_expression.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/connected_components/edit_layer_panel/join_editor/resources/where_expression.d.ts" + }, { "plugin": "stackAlerts", "path": "x-pack/plugins/stack_alerts/target/types/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.d.ts" @@ -4926,51 +5197,23 @@ }, { "plugin": "visTypeTimeseries", - "path": "src/plugins/vis_types/timeseries/target/types/public/application/components/annotations_editor.d.ts" + "path": "src/plugins/vis_types/timeseries/target/types/public/application/components/lib/convert_series_to_datatable.d.ts" }, { "plugin": "visTypeTimeseries", - "path": "src/plugins/vis_types/timeseries/target/types/public/application/components/annotations_editor.d.ts" + "path": "src/plugins/vis_types/timeseries/target/types/public/application/components/lib/convert_series_to_datatable.d.ts" }, { "plugin": "visTypeTimeseries", - "path": "src/plugins/vis_types/timeseries/target/types/public/application/components/annotations_editor.d.ts" + "path": "src/plugins/vis_types/timeseries/target/types/public/application/components/lib/convert_series_to_datatable.d.ts" }, { "plugin": "visTypeTimeseries", - "path": "src/plugins/vis_types/timeseries/target/types/public/application/components/vis_editor.d.ts" + "path": "src/plugins/vis_types/timeseries/public/metrics_type.ts" }, { "plugin": "visTypeTimeseries", - "path": "src/plugins/vis_types/timeseries/target/types/public/application/components/vis_editor.d.ts" - }, - { - "plugin": "visTypeTimeseries", - "path": "src/plugins/vis_types/timeseries/target/types/public/application/components/lib/convert_series_to_datatable.d.ts" - }, - { - "plugin": "visTypeTimeseries", - "path": "src/plugins/vis_types/timeseries/target/types/public/application/components/lib/convert_series_to_datatable.d.ts" - }, - { - "plugin": "visTypeTimeseries", - "path": "src/plugins/vis_types/timeseries/target/types/public/application/components/lib/convert_series_to_datatable.d.ts" - }, - { - "plugin": "visTypeTimeseries", - "path": "src/plugins/vis_types/timeseries/target/types/public/application/components/panel_config/types.d.ts" - }, - { - "plugin": "visTypeTimeseries", - "path": "src/plugins/vis_types/timeseries/target/types/public/application/components/panel_config/types.d.ts" - }, - { - "plugin": "visTypeTimeseries", - "path": "src/plugins/vis_types/timeseries/public/metrics_type.ts" - }, - { - "plugin": "visTypeTimeseries", - "path": "src/plugins/vis_types/timeseries/public/metrics_type.ts" + "path": "src/plugins/vis_types/timeseries/public/metrics_type.ts" }, { "plugin": "visTypeTimeseries", @@ -5137,6 +5380,18 @@ "plugin": "lens", "path": "x-pack/plugins/lens/server/routes/field_stats.ts" }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts" + }, { "plugin": "lens", "path": "x-pack/plugins/lens/target/types/server/routes/field_stats.d.ts" @@ -5401,6 +5656,14 @@ "plugin": "maps", "path": "x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.test.ts" }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_source/es_source.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_source/es_source.d.ts" + }, { "plugin": "maps", "path": "x-pack/plugins/maps/target/types/public/classes/fields/es_doc_field.d.ts" @@ -5421,6 +5684,66 @@ "plugin": "maps", "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/top_hits/update_source_editor.d.ts" }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, { "plugin": "maps", "path": "x-pack/plugins/maps/target/types/public/components/geo_field_select.d.ts" @@ -5477,6 +5800,46 @@ "plugin": "maps", "path": "x-pack/plugins/maps/target/types/public/components/metrics_editor/metric_editor.d.ts" }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_geo_line_source/update_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_geo_line_source/update_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/layers/wizards/choropleth_layer_wizard/layer_template.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/layers/wizards/choropleth_layer_wizard/layer_template.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/layers/wizards/choropleth_layer_wizard/layer_template.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/layers/wizards/choropleth_layer_wizard/layer_template.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/top_hits/create_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/top_hits/create_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/top_hits/create_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/top_hits/create_source_editor.d.ts" + }, { "plugin": "maps", "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/top_hits/top_hits_form.d.ts" @@ -5489,6 +5852,14 @@ "plugin": "maps", "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/top_hits/top_hits_form.d.ts" }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/connected_components/edit_layer_panel/join_editor/resources/join.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/connected_components/edit_layer_panel/join_editor/resources/join.d.ts" + }, { "plugin": "maps", "path": "x-pack/plugins/maps/target/types/public/connected_components/edit_layer_panel/join_editor/resources/join_expression.d.ts" @@ -6573,6 +6944,19 @@ "path": "src/plugins/data_views/common/data_views/data_views.ts", "deprecated": false }, + { + "parentPluginId": "dataViews", + "id": "def-public.DataViewListItem.namespaces", + "type": "Array", + "tags": [], + "label": "namespaces", + "description": [], + "signature": [ + "string[] | undefined" + ], + "path": "src/plugins/data_views/common/data_views/data_views.ts", + "deprecated": false + }, { "parentPluginId": "dataViews", "id": "def-public.DataViewListItem.title", @@ -6802,8 +7186,8 @@ "pluginId": "dataViews", "scope": "common", "docId": "kibDataViewsPluginApi", - "section": "def-common.RuntimeField", - "text": "RuntimeField" + "section": "def-common.RuntimeFieldSpec", + "text": "RuntimeFieldSpec" }, "> | undefined" ], @@ -6842,6 +7226,19 @@ ], "path": "src/plugins/data_views/common/types.ts", "deprecated": false + }, + { + "parentPluginId": "dataViews", + "id": "def-public.DataViewSpec.namespaces", + "type": "Array", + "tags": [], + "label": "namespaces", + "description": [], + "signature": [ + "string[] | undefined" + ], + "path": "src/plugins/data_views/common/types.ts", + "deprecated": false } ], "initialIsOpen": false @@ -6890,7 +7287,14 @@ "section": "def-common.FieldSpec", "text": "FieldSpec" }, - ") => void" + ") => ", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.DataViewField", + "text": "DataViewField" + } ], "path": "src/plugins/data_views/common/fields/field_list.ts", "deprecated": false, @@ -7356,6 +7760,20 @@ "deprecated": false, "initialIsOpen": false }, + { + "parentPluginId": "dataViews", + "id": "def-public.DATA_VIEW_SAVED_OBJECT_TYPE", + "type": "string", + "tags": [], + "label": "DATA_VIEW_SAVED_OBJECT_TYPE", + "description": [], + "signature": [ + "\"index-pattern\"" + ], + "path": "src/plugins/data_views/common/constants.ts", + "deprecated": false, + "initialIsOpen": false + }, { "parentPluginId": "dataViews", "id": "def-public.DataViewsContract", @@ -8195,6 +8613,20 @@ "path": "src/plugins/data_views/common/constants.ts", "deprecated": false, "initialIsOpen": false + }, + { + "parentPluginId": "dataViews", + "id": "def-public.RuntimeType", + "type": "Type", + "tags": [], + "label": "RuntimeType", + "description": [], + "signature": [ + "\"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"long\" | \"double\" | \"composite\"" + ], + "path": "src/plugins/data_views/common/types.ts", + "deprecated": false, + "initialIsOpen": false } ], "objects": [], @@ -8767,7 +9199,7 @@ { "parentPluginId": "dataViews", "id": "def-server.IndexPatternsFetcher.Unnamed.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "elasticsearchClient", "description": [], @@ -10241,66 +10673,1242 @@ { "parentPluginId": "dataViews", "id": "def-server.DataViewsServerPluginStart.dataViewsServiceFactory.$2", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "elasticsearchClient", "description": [], "signature": [ - "Omit<", - "KibanaClient", - ", \"extend\" | \"connectionPool\" | \"transport\" | \"serializer\" | \"child\" | \"close\" | \"diagnostic\"> & { transport: { request(params: ", - "TransportRequestParams", + "{ eql: ", + "default", + "; search: { >(this: That, params?: ", + "SearchRequest", + " | ", + "SearchRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "SearchResponse", + ">; >(this: That, params?: ", + "SearchRequest", + " | ", + "SearchRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "SearchResponse", + ", unknown>>; >(this: That, params?: ", + "SearchRequest", + " | ", + "SearchRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "SearchResponse", + ">; }; create: { (this: That, params: ", + "CreateRequest", + " | ", + "CreateRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "CreateResponse", + ">; (this: That, params: ", + "CreateRequest", + " | ", + "CreateRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "CreateResponse", + ", unknown>>; (this: That, params: ", + "CreateRequest", + " | ", + "CreateRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "CreateResponse", + ">; }; monitoring: ", + "default", + "; security: ", + "default", + "; name: string | symbol; index: { (this: That, params: ", + "IndexRequest", + " | ", + "IndexRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "IndexResponse", + ">; (this: That, params: ", + "IndexRequest", + " | ", + "IndexRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "IndexResponse", + ", unknown>>; (this: That, params: ", + "IndexRequest", + " | ", + "IndexRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "IndexResponse", + ">; }; delete: { (this: That, params: ", + "DeleteRequest", + " | ", + "DeleteRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "DeleteResponse", + ">; (this: That, params: ", + "DeleteRequest", + " | ", + "DeleteRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "DeleteResponse", + ", unknown>>; (this: That, params: ", + "DeleteRequest", + " | ", + "DeleteRequest", ", options?: ", "TransportRequestOptions", " | undefined): Promise<", + "DeleteResponse", + ">; }; get: { (this: That, params: ", + "GetRequest", + " | ", + "GetRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetResponse", + ">; (this: That, params: ", + "GetRequest", + " | ", + "GetRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", - ">; }; }" - ], - "path": "src/plugins/data_views/server/types.ts", - "deprecated": false - }, - { - "parentPluginId": "dataViews", - "id": "def-server.DataViewsServerPluginStart.dataViewsServiceFactory.$3", - "type": "Object", - "tags": [], - "label": "request", - "description": [], - "signature": [ - { - "pluginId": "core", - "scope": "server", - "docId": "kibCoreHttpPluginApi", - "section": "def-server.KibanaRequest", - "text": "KibanaRequest" - }, - " | undefined" - ], - "path": "src/plugins/data_views/server/types.ts", - "deprecated": false - }, - { - "parentPluginId": "dataViews", - "id": "def-server.DataViewsServerPluginStart.dataViewsServiceFactory.$4", - "type": "CompoundType", - "tags": [], - "label": "byPassCapabilities", - "description": [], - "signature": [ - "boolean | undefined" - ], - "path": "src/plugins/data_views/server/types.ts", - "deprecated": false - } - ] - }, - { - "parentPluginId": "dataViews", - "id": "def-server.DataViewsServerPluginStart.indexPatternsServiceFactory", - "type": "Function", - "tags": [ - "deprecated" - ], + "<", + "GetResponse", + ", unknown>>; (this: That, params: ", + "GetRequest", + " | ", + "GetRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "GetResponse", + ">; }; update: { (this: That, params: ", + "UpdateRequest", + " | ", + "UpdateRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "UpdateResponse", + ">; (this: That, params: ", + "UpdateRequest", + " | ", + "UpdateRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "UpdateResponse", + ", unknown>>; (this: That, params: ", + "UpdateRequest", + " | ", + "UpdateRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "UpdateResponse", + ">; }; closePointInTime: { (this: That, params: ", + "ClosePointInTimeRequest", + " | ", + "ClosePointInTimeRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ClosePointInTimeResponse", + ">; (this: That, params: ", + "ClosePointInTimeRequest", + " | ", + "ClosePointInTimeRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ClosePointInTimeResponse", + ", unknown>>; (this: That, params: ", + "ClosePointInTimeRequest", + " | ", + "ClosePointInTimeRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ClosePointInTimeResponse", + ">; }; transform: ", + "default", + "; helpers: ", + "default", + "; [kInternal]: symbol | null; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", + "default", + "; Internal: ", + "default", + "; asyncSearch: ", + "default", + "; autoscaling: ", + "default", + "; bulk: { (this: That, params: ", + "BulkRequest", + " | ", + "BulkRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "BulkResponse", + ">; (this: That, params: ", + "BulkRequest", + " | ", + "BulkRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "BulkResponse", + ", unknown>>; (this: That, params: ", + "BulkRequest", + " | ", + "BulkRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "BulkResponse", + ">; }; cat: ", + "default", + "; ccr: ", + "default", + "; clearScroll: { (this: That, params?: ", + "ClearScrollRequest", + " | ", + "ClearScrollRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ClearScrollResponse", + ">; (this: That, params?: ", + "ClearScrollRequest", + " | ", + "ClearScrollRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ClearScrollResponse", + ", unknown>>; (this: That, params?: ", + "ClearScrollRequest", + " | ", + "ClearScrollRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ClearScrollResponse", + ">; }; cluster: ", + "default", + "; count: { (this: That, params?: ", + "CountRequest", + " | ", + "CountRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "CountResponse", + ">; (this: That, params?: ", + "CountRequest", + " | ", + "CountRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "CountResponse", + ", unknown>>; (this: That, params?: ", + "CountRequest", + " | ", + "CountRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "CountResponse", + ">; }; danglingIndices: ", + "default", + "; deleteByQuery: { (this: That, params: ", + "DeleteByQueryRequest", + " | ", + "DeleteByQueryRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "DeleteByQueryResponse", + ">; (this: That, params: ", + "DeleteByQueryRequest", + " | ", + "DeleteByQueryRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "DeleteByQueryResponse", + ", unknown>>; (this: That, params: ", + "DeleteByQueryRequest", + " | ", + "DeleteByQueryRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "DeleteByQueryResponse", + ">; }; deleteByQueryRethrottle: { (this: That, params: ", + "DeleteByQueryRethrottleRequest", + " | ", + "DeleteByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "DeleteByQueryRethrottleResponse", + ">; (this: That, params: ", + "DeleteByQueryRethrottleRequest", + " | ", + "DeleteByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "DeleteByQueryRethrottleResponse", + ", unknown>>; (this: That, params: ", + "DeleteByQueryRethrottleRequest", + " | ", + "DeleteByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "DeleteByQueryRethrottleResponse", + ">; }; deleteScript: { (this: That, params: ", + "DeleteScriptRequest", + " | ", + "DeleteScriptRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "DeleteScriptResponse", + ">; (this: That, params: ", + "DeleteScriptRequest", + " | ", + "DeleteScriptRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "DeleteScriptResponse", + ", unknown>>; (this: That, params: ", + "DeleteScriptRequest", + " | ", + "DeleteScriptRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "DeleteScriptResponse", + ">; }; enrich: ", + "default", + "; exists: { (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; existsSource: { (this: That, params: ", + "ExistsSourceRequest", + " | ", + "ExistsSourceRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "ExistsSourceRequest", + " | ", + "ExistsSourceRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "ExistsSourceRequest", + " | ", + "ExistsSourceRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; explain: { (this: That, params: ", + "ExplainRequest", + " | ", + "ExplainRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ExplainResponse", + ">; (this: That, params: ", + "ExplainRequest", + " | ", + "ExplainRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ExplainResponse", + ", unknown>>; (this: That, params: ", + "ExplainRequest", + " | ", + "ExplainRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ExplainResponse", + ">; }; features: ", + "default", + "; fieldCaps: { (this: That, params?: ", + "FieldCapsRequest", + " | ", + "FieldCapsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "FieldCapsResponse", + ">; (this: That, params?: ", + "FieldCapsRequest", + " | ", + "FieldCapsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "FieldCapsResponse", + ", unknown>>; (this: That, params?: ", + "FieldCapsRequest", + " | ", + "FieldCapsRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "FieldCapsResponse", + ">; }; fleet: ", + "default", + "; getScript: { (this: That, params: ", + "GetScriptRequest", + " | ", + "GetScriptRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetScriptResponse", + ">; (this: That, params: ", + "GetScriptRequest", + " | ", + "GetScriptRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "GetScriptResponse", + ", unknown>>; (this: That, params: ", + "GetScriptRequest", + " | ", + "GetScriptRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "GetScriptResponse", + ">; }; getScriptContext: { (this: That, params?: ", + "GetScriptContextRequest", + " | ", + "GetScriptContextRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetScriptContextResponse", + ">; (this: That, params?: ", + "GetScriptContextRequest", + " | ", + "GetScriptContextRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "GetScriptContextResponse", + ", unknown>>; (this: That, params?: ", + "GetScriptContextRequest", + " | ", + "GetScriptContextRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "GetScriptContextResponse", + ">; }; getScriptLanguages: { (this: That, params?: ", + "GetScriptLanguagesRequest", + " | ", + "GetScriptLanguagesRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetScriptLanguagesResponse", + ">; (this: That, params?: ", + "GetScriptLanguagesRequest", + " | ", + "GetScriptLanguagesRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "GetScriptLanguagesResponse", + ", unknown>>; (this: That, params?: ", + "GetScriptLanguagesRequest", + " | ", + "GetScriptLanguagesRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "GetScriptLanguagesResponse", + ">; }; getSource: { (this: That, params: ", + "GetSourceRequest", + " | ", + "GetSourceRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "GetSourceRequest", + " | ", + "GetSourceRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "GetSourceRequest", + " | ", + "GetSourceRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; graph: ", + "default", + "; ilm: ", + "default", + "; indices: ", + "default", + "; info: { (this: That, params?: ", + "InfoRequest", + " | ", + "InfoRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "InfoResponse", + ">; (this: That, params?: ", + "InfoRequest", + " | ", + "InfoRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "InfoResponse", + ", unknown>>; (this: That, params?: ", + "InfoRequest", + " | ", + "InfoRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "InfoResponse", + ">; }; ingest: ", + "default", + "; knnSearch: { (this: That, params: ", + "KnnSearchRequest", + " | ", + "KnnSearchRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "KnnSearchResponse", + ">; (this: That, params: ", + "KnnSearchRequest", + " | ", + "KnnSearchRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "KnnSearchResponse", + ", unknown>>; (this: That, params: ", + "KnnSearchRequest", + " | ", + "KnnSearchRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "KnnSearchResponse", + ">; }; license: ", + "default", + "; logstash: ", + "default", + "; mget: { (this: That, params?: ", + "MgetRequest", + " | ", + "MgetRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MgetResponse", + ">; (this: That, params?: ", + "MgetRequest", + " | ", + "MgetRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "MgetResponse", + ", unknown>>; (this: That, params?: ", + "MgetRequest", + " | ", + "MgetRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "MgetResponse", + ">; }; migration: ", + "default", + "; ml: ", + "default", + "; msearch: { >(this: That, params: ", + "MsearchRequest", + " | ", + "MsearchRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MsearchResponse", + ">; >(this: That, params: ", + "MsearchRequest", + " | ", + "MsearchRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "MsearchResponse", + ", unknown>>; >(this: That, params: ", + "MsearchRequest", + " | ", + "MsearchRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "MsearchResponse", + ">; }; msearchTemplate: { >(this: That, params: ", + "MsearchTemplateRequest", + " | ", + "MsearchTemplateRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MsearchTemplateResponse", + ">; >(this: That, params: ", + "MsearchTemplateRequest", + " | ", + "MsearchTemplateRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "MsearchTemplateResponse", + ", unknown>>; >(this: That, params: ", + "MsearchTemplateRequest", + " | ", + "MsearchTemplateRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "MsearchTemplateResponse", + ">; }; mtermvectors: { (this: That, params?: ", + "MtermvectorsRequest", + " | ", + "MtermvectorsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MtermvectorsResponse", + ">; (this: That, params?: ", + "MtermvectorsRequest", + " | ", + "MtermvectorsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "MtermvectorsResponse", + ", unknown>>; (this: That, params?: ", + "MtermvectorsRequest", + " | ", + "MtermvectorsRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "MtermvectorsResponse", + ">; }; nodes: ", + "default", + "; openPointInTime: { (this: That, params: ", + "OpenPointInTimeRequest", + " | ", + "OpenPointInTimeRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "OpenPointInTimeResponse", + ">; (this: That, params: ", + "OpenPointInTimeRequest", + " | ", + "OpenPointInTimeRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "OpenPointInTimeResponse", + ", unknown>>; (this: That, params: ", + "OpenPointInTimeRequest", + " | ", + "OpenPointInTimeRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "OpenPointInTimeResponse", + ">; }; ping: { (this: That, params?: ", + "PingRequest", + " | ", + "PingRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params?: ", + "PingRequest", + " | ", + "PingRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params?: ", + "PingRequest", + " | ", + "PingRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; putScript: { (this: That, params: ", + "PutScriptRequest", + " | ", + "PutScriptRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "PutScriptResponse", + ">; (this: That, params: ", + "PutScriptRequest", + " | ", + "PutScriptRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "PutScriptResponse", + ", unknown>>; (this: That, params: ", + "PutScriptRequest", + " | ", + "PutScriptRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "PutScriptResponse", + ">; }; rankEval: { (this: That, params: ", + "RankEvalRequest", + " | ", + "RankEvalRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "RankEvalResponse", + ">; (this: That, params: ", + "RankEvalRequest", + " | ", + "RankEvalRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "RankEvalResponse", + ", unknown>>; (this: That, params: ", + "RankEvalRequest", + " | ", + "RankEvalRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "RankEvalResponse", + ">; }; reindex: { (this: That, params?: ", + "ReindexRequest", + " | ", + "ReindexRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ReindexResponse", + ">; (this: That, params?: ", + "ReindexRequest", + " | ", + "ReindexRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ReindexResponse", + ", unknown>>; (this: That, params?: ", + "ReindexRequest", + " | ", + "ReindexRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ReindexResponse", + ">; }; reindexRethrottle: { (this: That, params: ", + "ReindexRethrottleRequest", + " | ", + "ReindexRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ReindexRethrottleResponse", + ">; (this: That, params: ", + "ReindexRethrottleRequest", + " | ", + "ReindexRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ReindexRethrottleResponse", + ", unknown>>; (this: That, params: ", + "ReindexRethrottleRequest", + " | ", + "ReindexRethrottleRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ReindexRethrottleResponse", + ">; }; renderSearchTemplate: { (this: That, params?: ", + "RenderSearchTemplateRequest", + " | ", + "RenderSearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "RenderSearchTemplateResponse", + ">; (this: That, params?: ", + "RenderSearchTemplateRequest", + " | ", + "RenderSearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "RenderSearchTemplateResponse", + ", unknown>>; (this: That, params?: ", + "RenderSearchTemplateRequest", + " | ", + "RenderSearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "RenderSearchTemplateResponse", + ">; }; rollup: ", + "default", + "; scriptsPainlessExecute: { (this: That, params?: ", + "ScriptsPainlessExecuteRequest", + " | ", + "ScriptsPainlessExecuteRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ScriptsPainlessExecuteResponse", + ">; (this: That, params?: ", + "ScriptsPainlessExecuteRequest", + " | ", + "ScriptsPainlessExecuteRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ScriptsPainlessExecuteResponse", + ", unknown>>; (this: That, params?: ", + "ScriptsPainlessExecuteRequest", + " | ", + "ScriptsPainlessExecuteRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ScriptsPainlessExecuteResponse", + ">; }; scroll: { >(this: That, params: ", + "ScrollRequest", + " | ", + "ScrollRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ScrollResponse", + ">; >(this: That, params: ", + "ScrollRequest", + " | ", + "ScrollRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ScrollResponse", + ", unknown>>; >(this: That, params: ", + "ScrollRequest", + " | ", + "ScrollRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ScrollResponse", + ">; }; searchMvt: { (this: That, params: ", + "SearchMvtRequest", + " | ", + "SearchMvtRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "SearchMvtRequest", + " | ", + "SearchMvtRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "SearchMvtRequest", + " | ", + "SearchMvtRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; searchShards: { (this: That, params?: ", + "SearchShardsRequest", + " | ", + "SearchShardsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "SearchShardsResponse", + ">; (this: That, params?: ", + "SearchShardsRequest", + " | ", + "SearchShardsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "SearchShardsResponse", + ", unknown>>; (this: That, params?: ", + "SearchShardsRequest", + " | ", + "SearchShardsRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "SearchShardsResponse", + ">; }; searchTemplate: { (this: That, params?: ", + "SearchTemplateRequest", + " | ", + "SearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "SearchTemplateResponse", + ">; (this: That, params?: ", + "SearchTemplateRequest", + " | ", + "SearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "SearchTemplateResponse", + ", unknown>>; (this: That, params?: ", + "SearchTemplateRequest", + " | ", + "SearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "SearchTemplateResponse", + ">; }; searchableSnapshots: ", + "default", + "; shutdown: ", + "default", + "; slm: ", + "default", + "; snapshot: ", + "default", + "; sql: ", + "default", + "; ssl: ", + "default", + "; tasks: ", + "default", + "; termsEnum: { (this: That, params: ", + "TermsEnumRequest", + " | ", + "TermsEnumRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "TermsEnumResponse", + ">; (this: That, params: ", + "TermsEnumRequest", + " | ", + "TermsEnumRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "TermsEnumResponse", + ", unknown>>; (this: That, params: ", + "TermsEnumRequest", + " | ", + "TermsEnumRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "TermsEnumResponse", + ">; }; termvectors: { (this: That, params: ", + "TermvectorsRequest", + " | ", + "TermvectorsRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "TermvectorsResponse", + ">; (this: That, params: ", + "TermvectorsRequest", + " | ", + "TermvectorsRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "TermvectorsResponse", + ", unknown>>; (this: That, params: ", + "TermvectorsRequest", + " | ", + "TermvectorsRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "TermvectorsResponse", + ">; }; textStructure: ", + "default", + "; updateByQuery: { (this: That, params: ", + "UpdateByQueryRequest", + " | ", + "UpdateByQueryRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "UpdateByQueryResponse", + ">; (this: That, params: ", + "UpdateByQueryRequest", + " | ", + "UpdateByQueryRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "UpdateByQueryResponse", + ", unknown>>; (this: That, params: ", + "UpdateByQueryRequest", + " | ", + "UpdateByQueryRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "UpdateByQueryResponse", + ">; }; updateByQueryRethrottle: { (this: That, params: ", + "UpdateByQueryRethrottleRequest", + " | ", + "UpdateByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "UpdateByQueryRethrottleResponse", + ">; (this: That, params: ", + "UpdateByQueryRethrottleRequest", + " | ", + "UpdateByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "UpdateByQueryRethrottleResponse", + ", unknown>>; (this: That, params: ", + "UpdateByQueryRethrottleRequest", + " | ", + "UpdateByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "UpdateByQueryRethrottleResponse", + ">; }; watcher: ", + "default", + "; xpack: ", + "default", + "; }" + ], + "path": "src/plugins/data_views/server/types.ts", + "deprecated": false + }, + { + "parentPluginId": "dataViews", + "id": "def-server.DataViewsServerPluginStart.dataViewsServiceFactory.$3", + "type": "Object", + "tags": [], + "label": "request", + "description": [], + "signature": [ + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreHttpPluginApi", + "section": "def-server.KibanaRequest", + "text": "KibanaRequest" + }, + " | undefined" + ], + "path": "src/plugins/data_views/server/types.ts", + "deprecated": false + }, + { + "parentPluginId": "dataViews", + "id": "def-server.DataViewsServerPluginStart.dataViewsServiceFactory.$4", + "type": "CompoundType", + "tags": [], + "label": "byPassCapabilities", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "src/plugins/data_views/server/types.ts", + "deprecated": false + } + ] + }, + { + "parentPluginId": "dataViews", + "id": "def-server.DataViewsServerPluginStart.indexPatternsServiceFactory", + "type": "Function", + "tags": [ + "deprecated" + ], "label": "indexPatternsServiceFactory", "description": [], "signature": [ @@ -10728,20 +12336,1196 @@ { "parentPluginId": "dataViews", "id": "def-server.DataViewsServerPluginStart.indexPatternsServiceFactory.$2", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "elasticsearchClient", "description": [], "signature": [ - "Omit<", - "KibanaClient", - ", \"extend\" | \"connectionPool\" | \"transport\" | \"serializer\" | \"child\" | \"close\" | \"diagnostic\"> & { transport: { request(params: ", - "TransportRequestParams", + "{ eql: ", + "default", + "; search: { >(this: That, params?: ", + "SearchRequest", + " | ", + "SearchRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "SearchResponse", + ">; >(this: That, params?: ", + "SearchRequest", + " | ", + "SearchRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "SearchResponse", + ", unknown>>; >(this: That, params?: ", + "SearchRequest", + " | ", + "SearchRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "SearchResponse", + ">; }; create: { (this: That, params: ", + "CreateRequest", + " | ", + "CreateRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "CreateResponse", + ">; (this: That, params: ", + "CreateRequest", + " | ", + "CreateRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "CreateResponse", + ", unknown>>; (this: That, params: ", + "CreateRequest", + " | ", + "CreateRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "CreateResponse", + ">; }; monitoring: ", + "default", + "; security: ", + "default", + "; name: string | symbol; index: { (this: That, params: ", + "IndexRequest", + " | ", + "IndexRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "IndexResponse", + ">; (this: That, params: ", + "IndexRequest", + " | ", + "IndexRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "IndexResponse", + ", unknown>>; (this: That, params: ", + "IndexRequest", + " | ", + "IndexRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "IndexResponse", + ">; }; delete: { (this: That, params: ", + "DeleteRequest", + " | ", + "DeleteRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "DeleteResponse", + ">; (this: That, params: ", + "DeleteRequest", + " | ", + "DeleteRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "DeleteResponse", + ", unknown>>; (this: That, params: ", + "DeleteRequest", + " | ", + "DeleteRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "DeleteResponse", + ">; }; get: { (this: That, params: ", + "GetRequest", + " | ", + "GetRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetResponse", + ">; (this: That, params: ", + "GetRequest", + " | ", + "GetRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "GetResponse", + ", unknown>>; (this: That, params: ", + "GetRequest", + " | ", + "GetRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "GetResponse", + ">; }; update: { (this: That, params: ", + "UpdateRequest", + " | ", + "UpdateRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "UpdateResponse", + ">; (this: That, params: ", + "UpdateRequest", + " | ", + "UpdateRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "UpdateResponse", + ", unknown>>; (this: That, params: ", + "UpdateRequest", + " | ", + "UpdateRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "UpdateResponse", + ">; }; closePointInTime: { (this: That, params: ", + "ClosePointInTimeRequest", + " | ", + "ClosePointInTimeRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ClosePointInTimeResponse", + ">; (this: That, params: ", + "ClosePointInTimeRequest", + " | ", + "ClosePointInTimeRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ClosePointInTimeResponse", + ", unknown>>; (this: That, params: ", + "ClosePointInTimeRequest", + " | ", + "ClosePointInTimeRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ClosePointInTimeResponse", + ">; }; transform: ", + "default", + "; helpers: ", + "default", + "; [kInternal]: symbol | null; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", + "default", + "; Internal: ", + "default", + "; asyncSearch: ", + "default", + "; autoscaling: ", + "default", + "; bulk: { (this: That, params: ", + "BulkRequest", + " | ", + "BulkRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "BulkResponse", + ">; (this: That, params: ", + "BulkRequest", + " | ", + "BulkRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "BulkResponse", + ", unknown>>; (this: That, params: ", + "BulkRequest", + " | ", + "BulkRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "BulkResponse", + ">; }; cat: ", + "default", + "; ccr: ", + "default", + "; clearScroll: { (this: That, params?: ", + "ClearScrollRequest", + " | ", + "ClearScrollRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ClearScrollResponse", + ">; (this: That, params?: ", + "ClearScrollRequest", + " | ", + "ClearScrollRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ClearScrollResponse", + ", unknown>>; (this: That, params?: ", + "ClearScrollRequest", + " | ", + "ClearScrollRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ClearScrollResponse", + ">; }; cluster: ", + "default", + "; count: { (this: That, params?: ", + "CountRequest", + " | ", + "CountRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "CountResponse", + ">; (this: That, params?: ", + "CountRequest", + " | ", + "CountRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "CountResponse", + ", unknown>>; (this: That, params?: ", + "CountRequest", + " | ", + "CountRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "CountResponse", + ">; }; danglingIndices: ", + "default", + "; deleteByQuery: { (this: That, params: ", + "DeleteByQueryRequest", + " | ", + "DeleteByQueryRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "DeleteByQueryResponse", + ">; (this: That, params: ", + "DeleteByQueryRequest", + " | ", + "DeleteByQueryRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "DeleteByQueryResponse", + ", unknown>>; (this: That, params: ", + "DeleteByQueryRequest", + " | ", + "DeleteByQueryRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "DeleteByQueryResponse", + ">; }; deleteByQueryRethrottle: { (this: That, params: ", + "DeleteByQueryRethrottleRequest", + " | ", + "DeleteByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "DeleteByQueryRethrottleResponse", + ">; (this: That, params: ", + "DeleteByQueryRethrottleRequest", + " | ", + "DeleteByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "DeleteByQueryRethrottleResponse", + ", unknown>>; (this: That, params: ", + "DeleteByQueryRethrottleRequest", + " | ", + "DeleteByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "DeleteByQueryRethrottleResponse", + ">; }; deleteScript: { (this: That, params: ", + "DeleteScriptRequest", + " | ", + "DeleteScriptRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "DeleteScriptResponse", + ">; (this: That, params: ", + "DeleteScriptRequest", + " | ", + "DeleteScriptRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "DeleteScriptResponse", + ", unknown>>; (this: That, params: ", + "DeleteScriptRequest", + " | ", + "DeleteScriptRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "DeleteScriptResponse", + ">; }; enrich: ", + "default", + "; exists: { (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; existsSource: { (this: That, params: ", + "ExistsSourceRequest", + " | ", + "ExistsSourceRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "ExistsSourceRequest", + " | ", + "ExistsSourceRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "ExistsSourceRequest", + " | ", + "ExistsSourceRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; explain: { (this: That, params: ", + "ExplainRequest", + " | ", + "ExplainRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ExplainResponse", + ">; (this: That, params: ", + "ExplainRequest", + " | ", + "ExplainRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ExplainResponse", + ", unknown>>; (this: That, params: ", + "ExplainRequest", + " | ", + "ExplainRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ExplainResponse", + ">; }; features: ", + "default", + "; fieldCaps: { (this: That, params?: ", + "FieldCapsRequest", + " | ", + "FieldCapsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "FieldCapsResponse", + ">; (this: That, params?: ", + "FieldCapsRequest", + " | ", + "FieldCapsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "FieldCapsResponse", + ", unknown>>; (this: That, params?: ", + "FieldCapsRequest", + " | ", + "FieldCapsRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "FieldCapsResponse", + ">; }; fleet: ", + "default", + "; getScript: { (this: That, params: ", + "GetScriptRequest", + " | ", + "GetScriptRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetScriptResponse", + ">; (this: That, params: ", + "GetScriptRequest", + " | ", + "GetScriptRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "GetScriptResponse", + ", unknown>>; (this: That, params: ", + "GetScriptRequest", + " | ", + "GetScriptRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "GetScriptResponse", + ">; }; getScriptContext: { (this: That, params?: ", + "GetScriptContextRequest", + " | ", + "GetScriptContextRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetScriptContextResponse", + ">; (this: That, params?: ", + "GetScriptContextRequest", + " | ", + "GetScriptContextRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "GetScriptContextResponse", + ", unknown>>; (this: That, params?: ", + "GetScriptContextRequest", + " | ", + "GetScriptContextRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "GetScriptContextResponse", + ">; }; getScriptLanguages: { (this: That, params?: ", + "GetScriptLanguagesRequest", + " | ", + "GetScriptLanguagesRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetScriptLanguagesResponse", + ">; (this: That, params?: ", + "GetScriptLanguagesRequest", + " | ", + "GetScriptLanguagesRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "GetScriptLanguagesResponse", + ", unknown>>; (this: That, params?: ", + "GetScriptLanguagesRequest", + " | ", + "GetScriptLanguagesRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "GetScriptLanguagesResponse", + ">; }; getSource: { (this: That, params: ", + "GetSourceRequest", + " | ", + "GetSourceRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "GetSourceRequest", + " | ", + "GetSourceRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "GetSourceRequest", + " | ", + "GetSourceRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; graph: ", + "default", + "; ilm: ", + "default", + "; indices: ", + "default", + "; info: { (this: That, params?: ", + "InfoRequest", + " | ", + "InfoRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "InfoResponse", + ">; (this: That, params?: ", + "InfoRequest", + " | ", + "InfoRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "InfoResponse", + ", unknown>>; (this: That, params?: ", + "InfoRequest", + " | ", + "InfoRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "InfoResponse", + ">; }; ingest: ", + "default", + "; knnSearch: { (this: That, params: ", + "KnnSearchRequest", + " | ", + "KnnSearchRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "KnnSearchResponse", + ">; (this: That, params: ", + "KnnSearchRequest", + " | ", + "KnnSearchRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "KnnSearchResponse", + ", unknown>>; (this: That, params: ", + "KnnSearchRequest", + " | ", + "KnnSearchRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "KnnSearchResponse", + ">; }; license: ", + "default", + "; logstash: ", + "default", + "; mget: { (this: That, params?: ", + "MgetRequest", + " | ", + "MgetRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MgetResponse", + ">; (this: That, params?: ", + "MgetRequest", + " | ", + "MgetRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "MgetResponse", + ", unknown>>; (this: That, params?: ", + "MgetRequest", + " | ", + "MgetRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "MgetResponse", + ">; }; migration: ", + "default", + "; ml: ", + "default", + "; msearch: { >(this: That, params: ", + "MsearchRequest", + " | ", + "MsearchRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MsearchResponse", + ">; >(this: That, params: ", + "MsearchRequest", + " | ", + "MsearchRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "MsearchResponse", + ", unknown>>; >(this: That, params: ", + "MsearchRequest", + " | ", + "MsearchRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "MsearchResponse", + ">; }; msearchTemplate: { >(this: That, params: ", + "MsearchTemplateRequest", + " | ", + "MsearchTemplateRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MsearchTemplateResponse", + ">; >(this: That, params: ", + "MsearchTemplateRequest", + " | ", + "MsearchTemplateRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "MsearchTemplateResponse", + ", unknown>>; >(this: That, params: ", + "MsearchTemplateRequest", + " | ", + "MsearchTemplateRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "MsearchTemplateResponse", + ">; }; mtermvectors: { (this: That, params?: ", + "MtermvectorsRequest", + " | ", + "MtermvectorsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MtermvectorsResponse", + ">; (this: That, params?: ", + "MtermvectorsRequest", + " | ", + "MtermvectorsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "MtermvectorsResponse", + ", unknown>>; (this: That, params?: ", + "MtermvectorsRequest", + " | ", + "MtermvectorsRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "MtermvectorsResponse", + ">; }; nodes: ", + "default", + "; openPointInTime: { (this: That, params: ", + "OpenPointInTimeRequest", + " | ", + "OpenPointInTimeRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "OpenPointInTimeResponse", + ">; (this: That, params: ", + "OpenPointInTimeRequest", + " | ", + "OpenPointInTimeRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "OpenPointInTimeResponse", + ", unknown>>; (this: That, params: ", + "OpenPointInTimeRequest", + " | ", + "OpenPointInTimeRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "OpenPointInTimeResponse", + ">; }; ping: { (this: That, params?: ", + "PingRequest", + " | ", + "PingRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params?: ", + "PingRequest", + " | ", + "PingRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params?: ", + "PingRequest", + " | ", + "PingRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; putScript: { (this: That, params: ", + "PutScriptRequest", + " | ", + "PutScriptRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "PutScriptResponse", + ">; (this: That, params: ", + "PutScriptRequest", + " | ", + "PutScriptRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "PutScriptResponse", + ", unknown>>; (this: That, params: ", + "PutScriptRequest", + " | ", + "PutScriptRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "PutScriptResponse", + ">; }; rankEval: { (this: That, params: ", + "RankEvalRequest", + " | ", + "RankEvalRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "RankEvalResponse", + ">; (this: That, params: ", + "RankEvalRequest", + " | ", + "RankEvalRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "RankEvalResponse", + ", unknown>>; (this: That, params: ", + "RankEvalRequest", + " | ", + "RankEvalRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "RankEvalResponse", + ">; }; reindex: { (this: That, params?: ", + "ReindexRequest", + " | ", + "ReindexRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ReindexResponse", + ">; (this: That, params?: ", + "ReindexRequest", + " | ", + "ReindexRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ReindexResponse", + ", unknown>>; (this: That, params?: ", + "ReindexRequest", + " | ", + "ReindexRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ReindexResponse", + ">; }; reindexRethrottle: { (this: That, params: ", + "ReindexRethrottleRequest", + " | ", + "ReindexRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ReindexRethrottleResponse", + ">; (this: That, params: ", + "ReindexRethrottleRequest", + " | ", + "ReindexRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ReindexRethrottleResponse", + ", unknown>>; (this: That, params: ", + "ReindexRethrottleRequest", + " | ", + "ReindexRethrottleRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ReindexRethrottleResponse", + ">; }; renderSearchTemplate: { (this: That, params?: ", + "RenderSearchTemplateRequest", + " | ", + "RenderSearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "RenderSearchTemplateResponse", + ">; (this: That, params?: ", + "RenderSearchTemplateRequest", + " | ", + "RenderSearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "RenderSearchTemplateResponse", + ", unknown>>; (this: That, params?: ", + "RenderSearchTemplateRequest", + " | ", + "RenderSearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "RenderSearchTemplateResponse", + ">; }; rollup: ", + "default", + "; scriptsPainlessExecute: { (this: That, params?: ", + "ScriptsPainlessExecuteRequest", + " | ", + "ScriptsPainlessExecuteRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ScriptsPainlessExecuteResponse", + ">; (this: That, params?: ", + "ScriptsPainlessExecuteRequest", + " | ", + "ScriptsPainlessExecuteRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ScriptsPainlessExecuteResponse", + ", unknown>>; (this: That, params?: ", + "ScriptsPainlessExecuteRequest", + " | ", + "ScriptsPainlessExecuteRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ScriptsPainlessExecuteResponse", + ">; }; scroll: { >(this: That, params: ", + "ScrollRequest", + " | ", + "ScrollRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ScrollResponse", + ">; >(this: That, params: ", + "ScrollRequest", + " | ", + "ScrollRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ScrollResponse", + ", unknown>>; >(this: That, params: ", + "ScrollRequest", + " | ", + "ScrollRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ScrollResponse", + ">; }; searchMvt: { (this: That, params: ", + "SearchMvtRequest", + " | ", + "SearchMvtRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "SearchMvtRequest", + " | ", + "SearchMvtRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "SearchMvtRequest", + " | ", + "SearchMvtRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; searchShards: { (this: That, params?: ", + "SearchShardsRequest", + " | ", + "SearchShardsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "SearchShardsResponse", + ">; (this: That, params?: ", + "SearchShardsRequest", + " | ", + "SearchShardsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "SearchShardsResponse", + ", unknown>>; (this: That, params?: ", + "SearchShardsRequest", + " | ", + "SearchShardsRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "SearchShardsResponse", + ">; }; searchTemplate: { (this: That, params?: ", + "SearchTemplateRequest", + " | ", + "SearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "SearchTemplateResponse", + ">; (this: That, params?: ", + "SearchTemplateRequest", + " | ", + "SearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "SearchTemplateResponse", + ", unknown>>; (this: That, params?: ", + "SearchTemplateRequest", + " | ", + "SearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "SearchTemplateResponse", + ">; }; searchableSnapshots: ", + "default", + "; shutdown: ", + "default", + "; slm: ", + "default", + "; snapshot: ", + "default", + "; sql: ", + "default", + "; ssl: ", + "default", + "; tasks: ", + "default", + "; termsEnum: { (this: That, params: ", + "TermsEnumRequest", + " | ", + "TermsEnumRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "TermsEnumResponse", + ">; (this: That, params: ", + "TermsEnumRequest", + " | ", + "TermsEnumRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "TermsEnumResponse", + ", unknown>>; (this: That, params: ", + "TermsEnumRequest", + " | ", + "TermsEnumRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "TermsEnumResponse", + ">; }; termvectors: { (this: That, params: ", + "TermvectorsRequest", + " | ", + "TermvectorsRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "TermvectorsResponse", + ">; (this: That, params: ", + "TermvectorsRequest", + " | ", + "TermvectorsRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "TermvectorsResponse", + ", unknown>>; (this: That, params: ", + "TermvectorsRequest", + " | ", + "TermvectorsRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "TermvectorsResponse", + ">; }; textStructure: ", + "default", + "; updateByQuery: { (this: That, params: ", + "UpdateByQueryRequest", + " | ", + "UpdateByQueryRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "UpdateByQueryResponse", + ">; (this: That, params: ", + "UpdateByQueryRequest", + " | ", + "UpdateByQueryRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "UpdateByQueryResponse", + ", unknown>>; (this: That, params: ", + "UpdateByQueryRequest", + " | ", + "UpdateByQueryRequest", ", options?: ", "TransportRequestOptions", " | undefined): Promise<", + "UpdateByQueryResponse", + ">; }; updateByQueryRethrottle: { (this: That, params: ", + "UpdateByQueryRethrottleRequest", + " | ", + "UpdateByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "UpdateByQueryRethrottleResponse", + ">; (this: That, params: ", + "UpdateByQueryRethrottleRequest", + " | ", + "UpdateByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", - ">; }; }" + "<", + "UpdateByQueryRethrottleResponse", + ", unknown>>; (this: That, params: ", + "UpdateByQueryRethrottleRequest", + " | ", + "UpdateByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "UpdateByQueryRethrottleResponse", + ">; }; watcher: ", + "default", + "; xpack: ", + "default", + "; }" ], "path": "src/plugins/data_views/server/types.ts", "deprecated": false @@ -11044,6 +13828,19 @@ "path": "src/plugins/data_views/common/data_views/data_view.ts", "deprecated": false }, + { + "parentPluginId": "dataViews", + "id": "def-common.DataView.namespaces", + "type": "Array", + "tags": [], + "label": "namespaces", + "description": [], + "signature": [ + "string[]" + ], + "path": "src/plugins/data_views/common/data_views/data_view.ts", + "deprecated": false + }, { "parentPluginId": "dataViews", "id": "def-common.DataView.allowNoIndex", @@ -11153,15 +13950,9 @@ "signature": [ "() => { storedFields: string[]; scriptFields: Record; docvalueFields: { field: string; format: string; }[]; runtimeFields: Record; }" + ">; docvalueFields: { field: string; format: string; }[]; runtimeFields: ", + "MappingRuntimeFields", + "; }" ], "path": "src/plugins/data_views/common/data_views/data_view.ts", "deprecated": false, @@ -11599,7 +14390,7 @@ "tags": [], "label": "addRuntimeField", "description": [ - "\nAdd a runtime field - Appended to existing mapped field or a new field is\ncreated as appropriate" + "\nAdd a runtime field - Appended to existing mapped field or a new field is\ncreated as appropriate." ], "signature": [ "(name: string, runtimeField: ", @@ -11610,7 +14401,15 @@ "section": "def-common.RuntimeField", "text": "RuntimeField" }, - ") => void" + ") => ", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.DataViewField", + "text": "DataViewField" + }, + "[]" ], "path": "src/plugins/data_views/common/data_views/data_view.ts", "deprecated": false, @@ -11728,6 +14527,67 @@ ], "returnComment": [] }, + { + "parentPluginId": "dataViews", + "id": "def-common.DataView.getAllRuntimeFields", + "type": "Function", + "tags": [], + "label": "getAllRuntimeFields", + "description": [], + "signature": [ + "() => Record" + ], + "path": "src/plugins/data_views/common/data_views/data_view.ts", + "deprecated": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "dataViews", + "id": "def-common.DataView.getFieldsByRuntimeFieldName", + "type": "Function", + "tags": [], + "label": "getFieldsByRuntimeFieldName", + "description": [], + "signature": [ + "(name: string) => Record | undefined" + ], + "path": "src/plugins/data_views/common/data_views/data_view.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "dataViews", + "id": "def-common.DataView.getFieldsByRuntimeFieldName.$1", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "signature": [ + "string" + ], + "path": "src/plugins/data_views/common/data_views/data_view.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, { "parentPluginId": "dataViews", "id": "def-common.DataView.replaceAllRuntimeFields", @@ -11810,6 +14670,24 @@ ], "returnComment": [] }, + { + "parentPluginId": "dataViews", + "id": "def-common.DataView.getRuntimeMappings", + "type": "Function", + "tags": [], + "label": "getRuntimeMappings", + "description": [ + "\nReturn the \"runtime_mappings\" section of the ES search query" + ], + "signature": [ + "() => ", + "MappingRuntimeFields" + ], + "path": "src/plugins/data_views/common/data_views/data_view.ts", + "deprecated": false, + "children": [], + "returnComment": [] + }, { "parentPluginId": "dataViews", "id": "def-common.DataView.getFormatterForFieldNoDefault", @@ -12243,8 +15121,8 @@ "pluginId": "dataViews", "scope": "common", "docId": "kibDataViewsPluginApi", - "section": "def-common.RuntimeField", - "text": "RuntimeField" + "section": "def-common.RuntimeFieldSpec", + "text": "RuntimeFieldSpec" }, " | undefined" ], @@ -12263,8 +15141,8 @@ "pluginId": "dataViews", "scope": "common", "docId": "kibDataViewsPluginApi", - "section": "def-common.RuntimeField", - "text": "RuntimeField" + "section": "def-common.RuntimeFieldSpec", + "text": "RuntimeFieldSpec" }, " | undefined" ], @@ -12493,6 +15371,16 @@ "path": "src/plugins/data_views/common/fields/data_view_field.ts", "deprecated": false }, + { + "parentPluginId": "dataViews", + "id": "def-common.DataViewField.isRuntimeField", + "type": "boolean", + "tags": [], + "label": "isRuntimeField", + "description": [], + "path": "src/plugins/data_views/common/fields/data_view_field.ts", + "deprecated": false + }, { "parentPluginId": "dataViews", "id": "def-common.DataViewField.sortable", @@ -12730,6 +15618,21 @@ } ], "returnComment": [] + }, + { + "parentPluginId": "dataViews", + "id": "def-common.DataViewField.isRuntimeCompositeSubField", + "type": "Function", + "tags": [], + "label": "isRuntimeCompositeSubField", + "description": [], + "signature": [ + "() => boolean" + ], + "path": "src/plugins/data_views/common/fields/data_view_field.ts", + "deprecated": false, + "children": [], + "returnComment": [] } ], "initialIsOpen": false @@ -14104,6 +17007,10 @@ "plugin": "visualizations", "path": "src/plugins/visualizations/target/types/public/vis_types/base_vis_type.d.ts" }, + { + "plugin": "dashboard", + "path": "src/plugins/dashboard/target/types/public/application/hooks/use_dashboard_app_state.d.ts" + }, { "plugin": "discover", "path": "src/plugins/discover/target/types/public/application/main/utils/use_discover_state.d.ts" @@ -14448,6 +17355,14 @@ "plugin": "lens", "path": "x-pack/plugins/lens/server/routes/existing_fields.test.ts" }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts" + }, { "plugin": "observability", "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/rtl_helpers.tsx" @@ -14472,6 +17387,22 @@ "plugin": "ux", "path": "x-pack/plugins/ux/public/components/app/rum_dashboard/local_uifilters/selected_filters.tsx" }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/fields/agg/percentile_agg_field.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/fields/agg/percentile_agg_field.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts" + }, { "plugin": "visTypeTimeseries", "path": "src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts" @@ -14812,14 +17743,6 @@ "plugin": "savedObjects", "path": "src/plugins/saved_objects/public/saved_object/helpers/apply_es_resp.ts" }, - { - "plugin": "dataViewFieldEditor", - "path": "src/plugins/data_view_field_editor/public/components/field_format_editor/field_format_editor.tsx" - }, - { - "plugin": "dataViewFieldEditor", - "path": "src/plugins/data_view_field_editor/public/components/field_format_editor/field_format_editor.tsx" - }, { "plugin": "dataViewEditor", "path": "src/plugins/data_view_editor/public/shared_imports.ts" @@ -15161,52 +18084,184 @@ "path": "x-pack/plugins/graph/public/services/persistence/deserialize.test.ts" }, { - "plugin": "graph", - "path": "x-pack/plugins/graph/public/services/persistence/deserialize.test.ts" + "plugin": "graph", + "path": "x-pack/plugins/graph/public/services/persistence/deserialize.test.ts" + }, + { + "plugin": "lens", + "path": "x-pack/plugins/lens/target/types/public/embeddable/embeddable.d.ts" + }, + { + "plugin": "lens", + "path": "x-pack/plugins/lens/target/types/public/embeddable/embeddable.d.ts" + }, + { + "plugin": "lens", + "path": "x-pack/plugins/lens/target/types/public/utils.d.ts" + }, + { + "plugin": "lens", + "path": "x-pack/plugins/lens/target/types/public/utils.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.test.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.test.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_source/es_source.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_source/es_source.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_source/es_source.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_source/es_source.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/es_search_source.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/es_search_source.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/public/classes/fields/agg/percentile_agg_field.test.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/public/classes/fields/agg/percentile_agg_field.test.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/components/geo_index_pattern_select.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/components/geo_index_pattern_select.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/public/classes/sources/es_search_source/util/get_docvalue_source_fields.test.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/public/classes/sources/es_search_source/util/get_docvalue_source_fields.test.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/public/classes/sources/es_search_source/util/get_docvalue_source_fields.test.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/fields/agg/count_agg_field.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/fields/agg/count_agg_field.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/fields/agg/agg_field.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/fields/agg/agg_field.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_geo_line_source/create_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_geo_line_source/create_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_geo_line_source/create_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_geo_line_source/geo_line_form.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_geo_line_source/geo_line_form.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_geo_line_source/update_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_geo_line_source/update_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/connected_components/edit_layer_panel/filter_editor/filter_editor.d.ts" }, { - "plugin": "lens", - "path": "x-pack/plugins/lens/target/types/public/embeddable/embeddable.d.ts" + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/connected_components/edit_layer_panel/filter_editor/filter_editor.d.ts" }, { - "plugin": "lens", - "path": "x-pack/plugins/lens/target/types/public/embeddable/embeddable.d.ts" + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/layers/wizards/choropleth_layer_wizard/layer_template.d.ts" }, { - "plugin": "lens", - "path": "x-pack/plugins/lens/target/types/public/utils.d.ts" + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/layers/wizards/choropleth_layer_wizard/layer_template.d.ts" }, { - "plugin": "lens", - "path": "x-pack/plugins/lens/target/types/public/utils.d.ts" + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/layers/wizards/choropleth_layer_wizard/layer_template.d.ts" }, { "plugin": "maps", - "path": "x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.test.ts" + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/top_hits/create_source_editor.d.ts" }, { "plugin": "maps", - "path": "x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.test.ts" + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/top_hits/create_source_editor.d.ts" }, { "plugin": "maps", - "path": "x-pack/plugins/maps/public/classes/fields/agg/percentile_agg_field.test.ts" + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/top_hits/create_source_editor.d.ts" }, { "plugin": "maps", - "path": "x-pack/plugins/maps/public/classes/fields/agg/percentile_agg_field.test.ts" + "path": "x-pack/plugins/maps/target/types/public/connected_components/edit_layer_panel/join_editor/resources/join.d.ts" }, { "plugin": "maps", - "path": "x-pack/plugins/maps/public/classes/sources/es_search_source/util/get_docvalue_source_fields.test.ts" + "path": "x-pack/plugins/maps/target/types/public/connected_components/edit_layer_panel/join_editor/resources/join.d.ts" }, { "plugin": "maps", - "path": "x-pack/plugins/maps/public/classes/sources/es_search_source/util/get_docvalue_source_fields.test.ts" + "path": "x-pack/plugins/maps/target/types/public/connected_components/edit_layer_panel/join_editor/resources/where_expression.d.ts" }, { "plugin": "maps", - "path": "x-pack/plugins/maps/public/classes/sources/es_search_source/util/get_docvalue_source_fields.test.ts" + "path": "x-pack/plugins/maps/target/types/public/connected_components/edit_layer_panel/join_editor/resources/where_expression.d.ts" }, { "plugin": "stackAlerts", @@ -15492,26 +18547,6 @@ "plugin": "visTypeTimeseries", "path": "src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts" }, - { - "plugin": "visTypeTimeseries", - "path": "src/plugins/vis_types/timeseries/target/types/public/application/components/annotations_editor.d.ts" - }, - { - "plugin": "visTypeTimeseries", - "path": "src/plugins/vis_types/timeseries/target/types/public/application/components/annotations_editor.d.ts" - }, - { - "plugin": "visTypeTimeseries", - "path": "src/plugins/vis_types/timeseries/target/types/public/application/components/annotations_editor.d.ts" - }, - { - "plugin": "visTypeTimeseries", - "path": "src/plugins/vis_types/timeseries/target/types/public/application/components/vis_editor.d.ts" - }, - { - "plugin": "visTypeTimeseries", - "path": "src/plugins/vis_types/timeseries/target/types/public/application/components/vis_editor.d.ts" - }, { "plugin": "visTypeTimeseries", "path": "src/plugins/vis_types/timeseries/target/types/public/application/components/lib/convert_series_to_datatable.d.ts" @@ -15524,14 +18559,6 @@ "plugin": "visTypeTimeseries", "path": "src/plugins/vis_types/timeseries/target/types/public/application/components/lib/convert_series_to_datatable.d.ts" }, - { - "plugin": "visTypeTimeseries", - "path": "src/plugins/vis_types/timeseries/target/types/public/application/components/panel_config/types.d.ts" - }, - { - "plugin": "visTypeTimeseries", - "path": "src/plugins/vis_types/timeseries/target/types/public/application/components/panel_config/types.d.ts" - }, { "plugin": "visTypeTimeseries", "path": "src/plugins/vis_types/timeseries/public/metrics_type.ts" @@ -15705,6 +18732,18 @@ "plugin": "lens", "path": "x-pack/plugins/lens/server/routes/field_stats.ts" }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts" + }, { "plugin": "lens", "path": "x-pack/plugins/lens/target/types/server/routes/field_stats.d.ts" @@ -15969,6 +19008,14 @@ "plugin": "maps", "path": "x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.test.ts" }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_source/es_source.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_source/es_source.d.ts" + }, { "plugin": "maps", "path": "x-pack/plugins/maps/target/types/public/classes/fields/es_doc_field.d.ts" @@ -15989,6 +19036,66 @@ "plugin": "maps", "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/top_hits/update_source_editor.d.ts" }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/index_pattern_util.d.ts" + }, { "plugin": "maps", "path": "x-pack/plugins/maps/target/types/public/components/geo_field_select.d.ts" @@ -16045,6 +19152,46 @@ "plugin": "maps", "path": "x-pack/plugins/maps/target/types/public/components/metrics_editor/metric_editor.d.ts" }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_geo_line_source/update_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_geo_line_source/update_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/layers/wizards/choropleth_layer_wizard/layer_template.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/layers/wizards/choropleth_layer_wizard/layer_template.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/layers/wizards/choropleth_layer_wizard/layer_template.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/layers/wizards/choropleth_layer_wizard/layer_template.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/top_hits/create_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/top_hits/create_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/top_hits/create_source_editor.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/top_hits/create_source_editor.d.ts" + }, { "plugin": "maps", "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/top_hits/top_hits_form.d.ts" @@ -16057,6 +19204,14 @@ "plugin": "maps", "path": "x-pack/plugins/maps/target/types/public/classes/sources/es_search_source/top_hits/top_hits_form.d.ts" }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/connected_components/edit_layer_panel/join_editor/resources/join.d.ts" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/target/types/public/connected_components/edit_layer_panel/join_editor/resources/join.d.ts" + }, { "plugin": "maps", "path": "x-pack/plugins/maps/target/types/public/connected_components/edit_layer_panel/join_editor/resources/join_expression.d.ts" @@ -16883,6 +20038,19 @@ "path": "src/plugins/data_views/common/data_views/data_views.ts", "deprecated": false }, + { + "parentPluginId": "dataViews", + "id": "def-common.DataViewListItem.namespaces", + "type": "Array", + "tags": [], + "label": "namespaces", + "description": [], + "signature": [ + "string[] | undefined" + ], + "path": "src/plugins/data_views/common/data_views/data_views.ts", + "deprecated": false + }, { "parentPluginId": "dataViews", "id": "def-common.DataViewListItem.title", @@ -17112,8 +20280,8 @@ "pluginId": "dataViews", "scope": "common", "docId": "kibDataViewsPluginApi", - "section": "def-common.RuntimeField", - "text": "RuntimeField" + "section": "def-common.RuntimeFieldSpec", + "text": "RuntimeFieldSpec" }, "> | undefined" ], @@ -17152,6 +20320,19 @@ ], "path": "src/plugins/data_views/common/types.ts", "deprecated": false + }, + { + "parentPluginId": "dataViews", + "id": "def-common.DataViewSpec.namespaces", + "type": "Array", + "tags": [], + "label": "namespaces", + "description": [], + "signature": [ + "string[] | undefined" + ], + "path": "src/plugins/data_views/common/types.ts", + "deprecated": false } ], "initialIsOpen": false @@ -17391,8 +20572,8 @@ "pluginId": "dataViews", "scope": "common", "docId": "kibDataViewsPluginApi", - "section": "def-common.RuntimeField", - "text": "RuntimeField" + "section": "def-common.RuntimeFieldSpec", + "text": "RuntimeFieldSpec" }, " | undefined" ], @@ -19173,7 +22354,14 @@ "section": "def-common.FieldSpec", "text": "FieldSpec" }, - ") => void" + ") => ", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.DataViewField", + "text": "DataViewField" + } ], "path": "src/plugins/data_views/common/fields/field_list.ts", "deprecated": false, @@ -19612,34 +22800,124 @@ "parentPluginId": "dataViews", "id": "def-common.RuntimeField", "type": "Interface", - "tags": [], + "tags": [ + "see" + ], "label": "RuntimeField", - "description": [], + "description": [ + "\nThis is the RuntimeField interface enhanced with Data view field\nconfiguration: field format definition, customLabel or popularity.\n" + ], + "signature": [ + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.RuntimeField", + "text": "RuntimeField" + }, + " extends ", + "RuntimeFieldBase", + ",", + "FieldConfiguration" + ], "path": "src/plugins/data_views/common/types.ts", "deprecated": false, "children": [ { "parentPluginId": "dataViews", - "id": "def-common.RuntimeField.type", - "type": "CompoundType", + "id": "def-common.RuntimeField.fields", + "type": "Object", "tags": [], - "label": "type", + "label": "fields", "description": [], "signature": [ - "\"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"long\" | \"double\"" + "Record | undefined" ], "path": "src/plugins/data_views/common/types.ts", "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "dataViews", + "id": "def-common.RuntimeFieldSpec", + "type": "Interface", + "tags": [], + "label": "RuntimeFieldSpec", + "description": [ + "\nThe RuntimeField that will be sent in the ES Query \"runtime_mappings\" object" + ], + "signature": [ + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.RuntimeFieldSpec", + "text": "RuntimeFieldSpec" }, + " extends ", + "RuntimeFieldBase" + ], + "path": "src/plugins/data_views/common/types.ts", + "deprecated": false, + "children": [ { "parentPluginId": "dataViews", - "id": "def-common.RuntimeField.script", + "id": "def-common.RuntimeFieldSpec.fields", "type": "Object", "tags": [], - "label": "script", + "label": "fields", + "description": [], + "signature": [ + "Record | undefined" + ], + "path": "src/plugins/data_views/common/types.ts", + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "dataViews", + "id": "def-common.RuntimeFieldSubField", + "type": "Interface", + "tags": [], + "label": "RuntimeFieldSubField", + "description": [], + "signature": [ + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.RuntimeFieldSubField", + "text": "RuntimeFieldSubField" + }, + " extends ", + "FieldConfiguration" + ], + "path": "src/plugins/data_views/common/types.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "dataViews", + "id": "def-common.RuntimeFieldSubField.type", + "type": "CompoundType", + "tags": [], + "label": "type", "description": [], "signature": [ - "{ source: string; } | undefined" + "\"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"long\" | \"double\"" ], "path": "src/plugins/data_views/common/types.ts", "deprecated": false @@ -21660,7 +24938,7 @@ "label": "RuntimeType", "description": [], "signature": [ - "\"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"long\" | \"double\"" + "\"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"long\" | \"double\" | \"composite\"" ], "path": "src/plugins/data_views/common/types.ts", "deprecated": false, @@ -21741,7 +25019,7 @@ "label": "RUNTIME_FIELD_TYPES", "description": [], "signature": [ - "readonly [\"keyword\", \"long\", \"double\", \"date\", \"ip\", \"boolean\", \"geo_point\"]" + "readonly [\"keyword\", \"long\", \"double\", \"date\", \"ip\", \"boolean\", \"geo_point\", \"composite\"]" ], "path": "src/plugins/data_views/common/constants.ts", "deprecated": false, diff --git a/api_docs/data_views.mdx b/api_docs/data_views.mdx index b08a61c35ba1c..65eb1beeb6be7 100644 --- a/api_docs/data_views.mdx +++ b/api_docs/data_views.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/dataViews title: "dataViews" image: https://source.unsplash.com/400x175/?github summary: API docs for the dataViews plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViews'] warning: 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. --- @@ -18,7 +18,7 @@ Contact [App Services](https://github.com/orgs/elastic/teams/kibana-app-services | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 742 | 3 | 597 | 7 | +| 765 | 3 | 616 | 10 | ## Client diff --git a/api_docs/data_visualizer.mdx b/api_docs/data_visualizer.mdx index b2caa1e7b51b0..9dd9eabccc6e4 100644 --- a/api_docs/data_visualizer.mdx +++ b/api_docs/data_visualizer.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/dataVisualizer title: "dataVisualizer" image: https://source.unsplash.com/400x175/?github summary: API docs for the dataVisualizer plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataVisualizer'] warning: 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. --- diff --git a/api_docs/deprecations_by_api.mdx b/api_docs/deprecations_by_api.mdx index 786e201a382fb..918b5e74758dd 100644 --- a/api_docs/deprecations_by_api.mdx +++ b/api_docs/deprecations_by_api.mdx @@ -3,7 +3,7 @@ id: kibDevDocsDeprecationsByApi slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-api title: Deprecated API usage by API summary: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. --- @@ -15,52 +15,50 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | ---------------|-----------|-----------| | | dataViews, visTypeTimeseries, maps, data | - | | | dataViews, observability, lens, maps, graph, stackAlerts, transform, inputControlVis, visTypeTimelion, data | - | -| | dataViews, upgradeAssistant, dashboard, visualizations, discover, visTypeTimeseries, observability, dataVisualizer, transform, lens, ux, savedObjects, dataViewFieldEditor, dataViewEditor, graph, stackAlerts, uptime, maps, inputControlVis, visDefaultEditor, visTypeVega, data | - | -| | dataViews, dataVisualizer, lens, dataViewEditor, maps, inputControlVis, visDefaultEditor, visTypeTimeseries, discover, data | - | +| | dataViews, upgradeAssistant, dashboard, visualizations, discover, visTypeTimeseries, observability, dataVisualizer, transform, lens, maps, ux, savedObjects, dataViewEditor, graph, stackAlerts, uptime, inputControlVis, visDefaultEditor, visTypeVega, dataViewFieldEditor, data | - | +| | dataViews, dataVisualizer, lens, maps, dataViewEditor, inputControlVis, visDefaultEditor, visTypeTimeseries, discover, data | - | | | dataViews, monitoring, stackAlerts, transform | - | | | dataViews, transform, canvas, discover | - | | | dataViews, monitoring, stackAlerts, transform, data | - | | | dataViews, transform, canvas, discover, data | - | | | dataViews, observability, lens, maps, graph, stackAlerts, transform, inputControlVis, visTypeTimelion, data | - | | | dataViews, visualizations, data | - | -| | dataViews, dataVisualizer, lens, dataViewEditor, maps, inputControlVis, visDefaultEditor, visTypeTimeseries, discover, data | - | +| | dataViews, dataVisualizer, lens, maps, dataViewEditor, inputControlVis, visDefaultEditor, visTypeTimeseries, discover, data | - | | | dataViews, visTypeTimeseries, maps, data | - | | | dataViews, visualizations, dashboard, lens | - | -| | dataViews, upgradeAssistant, dashboard, visualizations, discover, visTypeTimeseries, observability, dataVisualizer, transform, lens, ux, savedObjects, dataViewFieldEditor, dataViewEditor, graph, stackAlerts, uptime, maps, inputControlVis, visDefaultEditor, visTypeVega, data | - | +| | dataViews, upgradeAssistant, dashboard, visualizations, discover, visTypeTimeseries, observability, dataVisualizer, transform, lens, maps, ux, savedObjects, dataViewEditor, graph, stackAlerts, uptime, inputControlVis, visDefaultEditor, visTypeVega, dataViewFieldEditor, data | - | | | dataViews, maps | - | | | dataViewManagement, dataViews | - | | | visTypeTimeseries, graph, dataViewManagement, dataViews | - | | | dataViews, dataViewManagement | - | | | dataViews, transform, canvas, discover | - | -| | dataViews, dataVisualizer, lens, dataViewEditor, maps, inputControlVis, visDefaultEditor, visTypeTimeseries, discover | - | -| | dataViews, upgradeAssistant, dashboard, visualizations, discover, visTypeTimeseries, observability, dataVisualizer, transform, lens, ux, savedObjects, dataViewFieldEditor, dataViewEditor, graph, stackAlerts, uptime, maps, inputControlVis, visDefaultEditor, visTypeVega | - | +| | dataViews, dataVisualizer, lens, maps, dataViewEditor, inputControlVis, visDefaultEditor, visTypeTimeseries, discover | - | +| | dataViews, upgradeAssistant, dashboard, visualizations, discover, visTypeTimeseries, observability, dataVisualizer, transform, lens, maps, ux, savedObjects, dataViewEditor, graph, stackAlerts, uptime, inputControlVis, visDefaultEditor, visTypeVega, dataViewFieldEditor | - | | | dataViews, visTypeTimeseries, maps | - | | | dataViews, maps | - | | | dataViewManagement, dataViews | - | | | visTypeTimeseries, graph, dataViewManagement, dataViews | - | | | dataViews, dataViewManagement | - | | | discover, visualizations, lens, maps, fileUpload, dataVisualizer, infra, graph, monitoring, securitySolution, stackAlerts, transform, uptime, inputControlVis, visTypeTimelion, visTypeTimeseries, visTypeVega, savedObjects | - | -| | fleet, dataViewFieldEditor, discover, dashboard, lens, stackAlerts, visTypeTable, visTypeTimeseries, visTypeXy, visTypeVislib, expressionPartitionVis | - | +| | discover, dashboard, lens, stackAlerts, visTypeTable, visTypeTimeseries, visTypeXy, visTypeVislib, dataViewFieldEditor, expressionPartitionVis | - | | | visTypeTimeseries | - | | | visTypeTimeseries, graph, dataViewManagement | - | | | data, lens, visTypeTimeseries, infra, maps, visTypeTimelion | - | | | maps | - | +| | dashboard, maps | - | | | visualizations, dashboard, maps, graph | - | | | visualizations, dashboard, lens, maps, ml, securitySolution, security | - | -| | observability, osquery | - | +| | lens, dashboard, maps | - | | | visualizations, dashboard, lens | - | | | savedObjectsTaggingOss, visualizations, dashboard, lens | - | -| | lens, dashboard | - | | | embeddable, presentationUtil, discover, dashboard, graph | - | -| | spaces, security, actions, alerting, ml, fleet, remoteClusters, graph, indexLifecycleManagement, mapsEms, painlessLab, rollup, searchprofiler, snapshotRestore, transform, upgradeAssistant | - | +| | spaces, security, actions, alerting, ml, remoteClusters, graph, indexLifecycleManagement, mapsEms, painlessLab, rollup, searchprofiler, snapshotRestore, transform, upgradeAssistant | - | | | dashboard | - | | | discover | - | | | discover | - | | | data, discover, embeddable | - | | | advancedSettings, discover | - | | | advancedSettings, discover | - | -| | dataVisualizer | - | -| | dataVisualizer | - | | | visTypeVega | - | | | monitoring, visTypeVega | - | | | monitoring, kibanaUsageCollection | - | @@ -78,36 +76,34 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | | apm, security, securitySolution | - | | | encryptedSavedObjects, actions, cloud, ml, dataEnhanced, logstash, securitySolution | - | | | securitySolution | - | -| | security, fleet | - | -| | security, fleet | - | -| | security, fleet | - | -| | security, licenseManagement, ml, fleet, apm, crossClusterReplication, logstash, painlessLab, searchprofiler, watcher | - | -| | management, fleet, security, kibanaOverview | - | -| | fleet | - | | | actions, alerting | - | | | cloud, apm | - | +| | security, licenseManagement, ml, apm, crossClusterReplication, logstash, painlessLab, searchprofiler, watcher | - | | | dataViewManagement | - | | | dataViewManagement | - | | | actions, ml, enterpriseSearch, savedObjectsTagging | - | | | visTypePie | - | | | visTypePie | - | +| | security, fleet | - | | | security | - | +| | security, fleet | - | +| | security, fleet | - | | | security | - | +| | management, fleet, security, kibanaOverview | - | +| | fleet | - | | | ml | - | | | spaces, savedObjectsManagement | - | | | spaces, savedObjectsManagement | - | | | mapsEms | - | | | console | - | | | discover, maps, inputControlVis | 8.1 | -| | discover, dashboardEnhanced, discoverEnhanced, maps | 8.1 | -| | discover, dashboard, dashboardEnhanced, discoverEnhanced, urlDrilldown, inputControlVis, maps | 8.1 | -| | discover, dashboard, dashboardEnhanced, discoverEnhanced, urlDrilldown, inputControlVis, maps | 8.1 | +| | discover, discoverEnhanced, maps | 8.1 | +| | dashboard, discoverEnhanced, urlDrilldown, inputControlVis, discover, maps | 8.1 | +| | dashboard, discoverEnhanced, urlDrilldown, inputControlVis, discover, maps | 8.1 | | | discover, maps, inputControlVis | 8.1 | -| | discover, dashboard, dashboardEnhanced, discoverEnhanced, urlDrilldown, inputControlVis, maps | 8.1 | +| | dashboard, discoverEnhanced, urlDrilldown, inputControlVis, discover, maps | 8.1 | | | apm, graph, stackAlerts | 8.1 | | | stackAlerts | 8.1 | -| | dashboardEnhanced | 8.1 | -| | dashboardEnhanced | 8.1 | | | discoverEnhanced | 8.1 | | | discoverEnhanced | 8.1 | | | alerting, dataEnhanced | 8.1 | @@ -127,7 +123,6 @@ Safe to remove. | ---------------|------------| | | data | | | data | -| | data | | | data | | | data | | | data | @@ -135,9 +130,9 @@ Safe to remove. | | data | | | data | | | data | -| | data | | | data | | | data | +| | data | | | data | | | data | | | data | @@ -146,7 +141,6 @@ Safe to remove. | | data | | | data | | | data | -| | data | | | data | | | data | | | data | @@ -164,6 +158,7 @@ Safe to remove. | | data | | | data | | | data | +| | data | | | data | | | data | | | data | @@ -185,14 +180,10 @@ Safe to remove. | | data | | | data | | | data | -| | data | -| | data | -| | data | | | data | | | data | | | data | | | data | -| | data | | | expressions | | | expressions | | | expressions | @@ -206,6 +197,10 @@ Safe to remove. | | licensing | | | licensing | | | licensing | +| | reporting | +| | reporting | +| | reporting | +| | reporting | | | taskManager | | | core | | | core | diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index 9aac5a24121eb..b71f930504c21 100644 --- a/api_docs/deprecations_by_plugin.mdx +++ b/api_docs/deprecations_by_plugin.mdx @@ -3,7 +3,7 @@ id: kibDevDocsDeprecationsByPlugin slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-plugin title: Deprecated API usage by plugin summary: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. --- @@ -104,15 +104,16 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [load_saved_dashboard_state.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/target/types/public/application/lib/load_saved_dashboard_state.d.ts#:~:text=IndexPattern), [load_saved_dashboard_state.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/target/types/public/application/lib/load_saved_dashboard_state.d.ts#:~:text=IndexPattern) | - | +| | [load_saved_dashboard_state.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/target/types/public/application/lib/load_saved_dashboard_state.d.ts#:~:text=IndexPattern), [use_dashboard_app_state.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/target/types/public/application/hooks/use_dashboard_app_state.d.ts#:~:text=IndexPattern), [load_saved_dashboard_state.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/target/types/public/application/lib/load_saved_dashboard_state.d.ts#:~:text=IndexPattern), [use_dashboard_app_state.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/target/types/public/application/hooks/use_dashboard_app_state.d.ts#:~:text=IndexPattern) | - | | | [export_csv_action.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/actions/export_csv_action.tsx#:~:text=fieldFormats) | - | | | [filter_utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/filter_utils.ts#:~:text=Filter), [filter_utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/filter_utils.ts#:~:text=Filter), [filter_utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/filter_utils.ts#:~:text=Filter), [filter_utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/filter_utils.ts#:~:text=Filter), [filter_utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/filter_utils.ts#:~:text=Filter), [saved_dashboard.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/saved_dashboards/saved_dashboard.ts#:~:text=Filter), [saved_dashboard.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/saved_dashboards/saved_dashboard.ts#:~:text=Filter), [dashboard_state_slice.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/state/dashboard_state_slice.ts#:~:text=Filter), [dashboard_state_slice.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/state/dashboard_state_slice.ts#:~:text=Filter), [dashboard_state_slice.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/state/dashboard_state_slice.ts#:~:text=Filter)+ 5 more | 8.1 | | | [load_saved_dashboard_state.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/load_saved_dashboard_state.ts#:~:text=ensureDefaultDataView), [load_saved_dashboard_state.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/load_saved_dashboard_state.ts#:~:text=ensureDefaultDataView) | - | -| | [load_saved_dashboard_state.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/target/types/public/application/lib/load_saved_dashboard_state.d.ts#:~:text=IndexPattern), [load_saved_dashboard_state.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/target/types/public/application/lib/load_saved_dashboard_state.d.ts#:~:text=IndexPattern) | - | +| | [load_saved_dashboard_state.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/target/types/public/application/lib/load_saved_dashboard_state.d.ts#:~:text=IndexPattern), [use_dashboard_app_state.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/target/types/public/application/hooks/use_dashboard_app_state.d.ts#:~:text=IndexPattern), [load_saved_dashboard_state.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/target/types/public/application/lib/load_saved_dashboard_state.d.ts#:~:text=IndexPattern), [use_dashboard_app_state.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/target/types/public/application/hooks/use_dashboard_app_state.d.ts#:~:text=IndexPattern) | - | | | [filter_utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/filter_utils.ts#:~:text=Filter), [filter_utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/filter_utils.ts#:~:text=Filter), [filter_utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/filter_utils.ts#:~:text=Filter), [filter_utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/filter_utils.ts#:~:text=Filter), [filter_utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/filter_utils.ts#:~:text=Filter), [saved_dashboard.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/saved_dashboards/saved_dashboard.ts#:~:text=Filter), [saved_dashboard.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/saved_dashboards/saved_dashboard.ts#:~:text=Filter), [dashboard_state_slice.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/state/dashboard_state_slice.ts#:~:text=Filter), [dashboard_state_slice.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/state/dashboard_state_slice.ts#:~:text=Filter), [dashboard_state_slice.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/state/dashboard_state_slice.ts#:~:text=Filter)+ 5 more | 8.1 | -| | [load_saved_dashboard_state.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/target/types/public/application/lib/load_saved_dashboard_state.d.ts#:~:text=IndexPattern) | - | +| | [load_saved_dashboard_state.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/target/types/public/application/lib/load_saved_dashboard_state.d.ts#:~:text=IndexPattern), [use_dashboard_app_state.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/target/types/public/application/hooks/use_dashboard_app_state.d.ts#:~:text=IndexPattern) | - | | | [filter_utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/filter_utils.ts#:~:text=Filter), [filter_utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/filter_utils.ts#:~:text=Filter), [filter_utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/filter_utils.ts#:~:text=Filter), [filter_utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/filter_utils.ts#:~:text=Filter), [filter_utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/filter_utils.ts#:~:text=Filter), [saved_dashboard.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/saved_dashboards/saved_dashboard.ts#:~:text=Filter), [saved_dashboard.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/saved_dashboards/saved_dashboard.ts#:~:text=Filter), [dashboard_state_slice.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/state/dashboard_state_slice.ts#:~:text=Filter), [dashboard_state_slice.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/state/dashboard_state_slice.ts#:~:text=Filter), [dashboard_state_slice.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/state/dashboard_state_slice.ts#:~:text=Filter)+ 5 more | 8.1 | | | [load_saved_dashboard_state.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/load_saved_dashboard_state.ts#:~:text=ensureDefaultDataView) | - | +| | [kibana_react.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/services/kibana_react.ts#:~:text=ExitFullScreenButton), [plugin.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/plugin.tsx#:~:text=ExitFullScreenButton), [plugin.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/plugin.tsx#:~:text=ExitFullScreenButton), [plugin.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/plugin.tsx#:~:text=ExitFullScreenButton) | - | | | [saved_objects.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/services/saved_objects.ts#:~:text=SavedObjectSaveModal), [save_modal.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/top_nav/save_modal.tsx#:~:text=SavedObjectSaveModal), [save_modal.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/top_nav/save_modal.tsx#:~:text=SavedObjectSaveModal) | - | | | [saved_object_loader.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/services/saved_object_loader.ts#:~:text=SavedObject), [saved_object_loader.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/services/saved_object_loader.ts#:~:text=SavedObject), [saved_object_loader.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/services/saved_object_loader.ts#:~:text=SavedObject), [saved_objects.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/services/saved_objects.ts#:~:text=SavedObject), [saved_dashboard.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/saved_dashboards/saved_dashboard.ts#:~:text=SavedObject), [saved_dashboard.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/saved_dashboards/saved_dashboard.ts#:~:text=SavedObject), [dashboard_tagging.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/dashboard_tagging.ts#:~:text=SavedObject), [dashboard_tagging.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/dashboard_tagging.ts#:~:text=SavedObject), [clone_panel_action.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/actions/clone_panel_action.tsx#:~:text=SavedObject), [clone_panel_action.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/actions/clone_panel_action.tsx#:~:text=SavedObject)+ 1 more | - | | | [saved_dashboard.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/saved_dashboards/saved_dashboard.ts#:~:text=SavedObjectClass) | - | @@ -122,19 +123,6 @@ warning: This document is auto-generated and is meant to be viewed inside our ex -## dashboardEnhanced - -| Deprecated API | Reference location(s) | Remove By | -| ---------------|-----------|-----------| -| | [embeddable_to_dashboard_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx#:~:text=esFilters), [embeddable_to_dashboard_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx#:~:text=esFilters), [embeddable_to_dashboard_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx#:~:text=esFilters) | 8.1 | -| | [embeddable_to_dashboard_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx#:~:text=isFilters), [embeddable_to_dashboard_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx#:~:text=isFilters) | 8.1 | -| | [embeddable_to_dashboard_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx#:~:text=Filter), [embeddable_to_dashboard_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx#:~:text=Filter) | 8.1 | -| | [embeddable_to_dashboard_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx#:~:text=Filter), [embeddable_to_dashboard_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx#:~:text=Filter) | 8.1 | -| | [embeddable_to_dashboard_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx#:~:text=isFilters), [embeddable_to_dashboard_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx#:~:text=isFilters) | 8.1 | -| | [embeddable_to_dashboard_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx#:~:text=Filter), [embeddable_to_dashboard_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx#:~:text=Filter) | 8.1 | - - - ## data | Deprecated API | Reference location(s) | Remove By | @@ -185,10 +173,10 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [field_format_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/data_view_field_editor/public/components/field_format_editor/field_format_editor.tsx#:~:text=IndexPattern), [field_format_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/data_view_field_editor/public/components/field_format_editor/field_format_editor.tsx#:~:text=IndexPattern), [field_format_editor.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_view_field_editor/target/types/public/components/field_format_editor/field_format_editor.d.ts#:~:text=IndexPattern), [field_format_editor.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_view_field_editor/target/types/public/components/field_format_editor/field_format_editor.d.ts#:~:text=IndexPattern), [field_format_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/data_view_field_editor/public/components/field_format_editor/field_format_editor.tsx#:~:text=IndexPattern), [field_format_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/data_view_field_editor/public/components/field_format_editor/field_format_editor.tsx#:~:text=IndexPattern), [field_format_editor.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_view_field_editor/target/types/public/components/field_format_editor/field_format_editor.d.ts#:~:text=IndexPattern), [field_format_editor.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_view_field_editor/target/types/public/components/field_format_editor/field_format_editor.d.ts#:~:text=IndexPattern) | - | -| | [field_editor_context.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/data_view_field_editor/public/components/field_editor_context.tsx#:~:text=fieldFormats), [field_format_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/data_view_field_editor/public/components/field_format_editor/field_format_editor.tsx#:~:text=fieldFormats), [field_format_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/data_view_field_editor/public/components/field_format_editor/field_format_editor.tsx#:~:text=fieldFormats), [field_editor_flyout_content_container.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/data_view_field_editor/public/components/field_editor_flyout_content_container.tsx#:~:text=fieldFormats), [field_format_editor.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_view_field_editor/target/types/public/components/field_format_editor/field_format_editor.d.ts#:~:text=fieldFormats) | - | -| | [field_format_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/data_view_field_editor/public/components/field_format_editor/field_format_editor.tsx#:~:text=IndexPattern), [field_format_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/data_view_field_editor/public/components/field_format_editor/field_format_editor.tsx#:~:text=IndexPattern), [field_format_editor.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_view_field_editor/target/types/public/components/field_format_editor/field_format_editor.d.ts#:~:text=IndexPattern), [field_format_editor.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_view_field_editor/target/types/public/components/field_format_editor/field_format_editor.d.ts#:~:text=IndexPattern), [field_format_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/data_view_field_editor/public/components/field_format_editor/field_format_editor.tsx#:~:text=IndexPattern), [field_format_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/data_view_field_editor/public/components/field_format_editor/field_format_editor.tsx#:~:text=IndexPattern), [field_format_editor.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_view_field_editor/target/types/public/components/field_format_editor/field_format_editor.d.ts#:~:text=IndexPattern), [field_format_editor.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_view_field_editor/target/types/public/components/field_format_editor/field_format_editor.d.ts#:~:text=IndexPattern) | - | -| | [field_format_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/data_view_field_editor/public/components/field_format_editor/field_format_editor.tsx#:~:text=IndexPattern), [field_format_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/data_view_field_editor/public/components/field_format_editor/field_format_editor.tsx#:~:text=IndexPattern), [field_format_editor.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_view_field_editor/target/types/public/components/field_format_editor/field_format_editor.d.ts#:~:text=IndexPattern), [field_format_editor.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_view_field_editor/target/types/public/components/field_format_editor/field_format_editor.d.ts#:~:text=IndexPattern) | - | +| | [field_format_editor.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_view_field_editor/target/types/public/components/field_format_editor/field_format_editor.d.ts#:~:text=IndexPattern), [field_format_editor.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_view_field_editor/target/types/public/components/field_format_editor/field_format_editor.d.ts#:~:text=IndexPattern), [field_format_editor.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_view_field_editor/target/types/public/components/field_format_editor/field_format_editor.d.ts#:~:text=IndexPattern), [field_format_editor.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_view_field_editor/target/types/public/components/field_format_editor/field_format_editor.d.ts#:~:text=IndexPattern) | - | +| | [field_format_editor.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_view_field_editor/target/types/public/components/field_format_editor/field_format_editor.d.ts#:~:text=fieldFormats) | - | +| | [field_format_editor.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_view_field_editor/target/types/public/components/field_format_editor/field_format_editor.d.ts#:~:text=IndexPattern), [field_format_editor.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_view_field_editor/target/types/public/components/field_format_editor/field_format_editor.d.ts#:~:text=IndexPattern), [field_format_editor.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_view_field_editor/target/types/public/components/field_format_editor/field_format_editor.d.ts#:~:text=IndexPattern), [field_format_editor.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_view_field_editor/target/types/public/components/field_format_editor/field_format_editor.d.ts#:~:text=IndexPattern) | - | +| | [field_format_editor.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_view_field_editor/target/types/public/components/field_format_editor/field_format_editor.d.ts#:~:text=IndexPattern), [field_format_editor.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_view_field_editor/target/types/public/components/field_format_editor/field_format_editor.d.ts#:~:text=IndexPattern) | - | @@ -255,8 +243,6 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | | [geo_point_content_with_map.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/expanded_row/geo_point_content_with_map/geo_point_content_with_map.tsx#:~:text=IndexPattern), [geo_point_content_with_map.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/expanded_row/geo_point_content_with_map/geo_point_content_with_map.tsx#:~:text=IndexPattern), [index_based_expanded_row.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/expanded_row/index_based_expanded_row.tsx#:~:text=IndexPattern), [index_based_expanded_row.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/expanded_row/index_based_expanded_row.tsx#:~:text=IndexPattern), [saved_search_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/utils/saved_search_utils.ts#:~:text=IndexPattern), [saved_search_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/utils/saved_search_utils.ts#:~:text=IndexPattern), [saved_search_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/utils/saved_search_utils.ts#:~:text=IndexPattern), [search_panel.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/search_panel/search_panel.tsx#:~:text=IndexPattern), [search_panel.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/search_panel/search_panel.tsx#:~:text=IndexPattern), [actions_panel.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/actions_panel/actions_panel.tsx#:~:text=IndexPattern)+ 44 more | - | | | [field_data_row.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/types/field_data_row.ts#:~:text=IndexPatternField), [field_data_row.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/types/field_data_row.ts#:~:text=IndexPatternField), [field_types_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/util/field_types_utils.ts#:~:text=IndexPatternField), [field_types_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/util/field_types_utils.ts#:~:text=IndexPatternField), [index_based_expanded_row.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/expanded_row/index_based_expanded_row.tsx#:~:text=IndexPatternField), [index_based_expanded_row.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/expanded_row/index_based_expanded_row.tsx#:~:text=IndexPatternField), [search_panel.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/search_panel/search_panel.tsx#:~:text=IndexPatternField), [search_panel.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/search_panel/search_panel.tsx#:~:text=IndexPatternField), [grid_embeddable.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/embeddables/grid_embeddable/grid_embeddable.tsx#:~:text=IndexPatternField), [grid_embeddable.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/embeddables/grid_embeddable/grid_embeddable.tsx#:~:text=IndexPatternField)+ 5 more | - | | | [geo_point_content_with_map.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/expanded_row/geo_point_content_with_map/geo_point_content_with_map.tsx#:~:text=IndexPattern), [geo_point_content_with_map.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/expanded_row/geo_point_content_with_map/geo_point_content_with_map.tsx#:~:text=IndexPattern), [index_based_expanded_row.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/expanded_row/index_based_expanded_row.tsx#:~:text=IndexPattern), [index_based_expanded_row.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/expanded_row/index_based_expanded_row.tsx#:~:text=IndexPattern), [saved_search_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/utils/saved_search_utils.ts#:~:text=IndexPattern), [saved_search_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/utils/saved_search_utils.ts#:~:text=IndexPattern), [saved_search_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/utils/saved_search_utils.ts#:~:text=IndexPattern), [search_panel.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/search_panel/search_panel.tsx#:~:text=IndexPattern), [search_panel.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/search_panel/search_panel.tsx#:~:text=IndexPattern), [actions_panel.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/actions_panel/actions_panel.tsx#:~:text=IndexPattern)+ 17 more | - | -| | [results_links.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/results_links/results_links.tsx#:~:text=DiscoverUrlGeneratorState), [results_links.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/results_links/results_links.tsx#:~:text=DiscoverUrlGeneratorState), [actions_panel.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/actions_panel/actions_panel.tsx#:~:text=DiscoverUrlGeneratorState), [actions_panel.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/actions_panel/actions_panel.tsx#:~:text=DiscoverUrlGeneratorState) | - | -| | [results_links.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/results_links/results_links.tsx#:~:text=DISCOVER_APP_URL_GENERATOR), [results_links.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/results_links/results_links.tsx#:~:text=DISCOVER_APP_URL_GENERATOR), [actions_panel.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/actions_panel/actions_panel.tsx#:~:text=DISCOVER_APP_URL_GENERATOR), [actions_panel.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/actions_panel/actions_panel.tsx#:~:text=DISCOVER_APP_URL_GENERATOR) | - | @@ -271,18 +257,18 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | | [anchor.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/context/services/anchor.ts#:~:text=fetch), [fetch_hits_in_interval.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/context/utils/fetch_hits_in_interval.ts#:~:text=fetch) | 8.1 | | | [build_services.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/build_services.ts#:~:text=indexPatterns), [discover_main_route.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/discover_main_route.tsx#:~:text=indexPatterns), [discover_main_route.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/discover_main_route.tsx#:~:text=indexPatterns), [plugin.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/plugin.tsx#:~:text=indexPatterns) | - | | | [histogram.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/components/chart/histogram.tsx#:~:text=fieldFormats) | - | -| | [url_generator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/url_generator.ts#:~:text=esFilters), [url_generator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/url_generator.ts#:~:text=esFilters), [url_generator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/url_generator.ts#:~:text=esFilters), [locator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/locator.ts#:~:text=esFilters), [locator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/locator.ts#:~:text=esFilters), [locator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/locator.ts#:~:text=esFilters), [use_navigation_props.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/utils/use_navigation_props.tsx#:~:text=esFilters), [use_navigation_props.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/utils/use_navigation_props.tsx#:~:text=esFilters), [discover_state.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/services/discover_state.ts#:~:text=esFilters), [discover_state.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/services/discover_state.ts#:~:text=esFilters)+ 17 more | 8.1 | -| | [url_generator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/url_generator.ts#:~:text=Filter), [url_generator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/url_generator.ts#:~:text=Filter), [url_generator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/url_generator.ts#:~:text=Filter), [locator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/locator.ts#:~:text=Filter), [locator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/locator.ts#:~:text=Filter), [locator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/locator.ts#:~:text=Filter), [discover_state.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/services/discover_state.ts#:~:text=Filter), [discover_state.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/services/discover_state.ts#:~:text=Filter), [discover_state.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/services/discover_state.ts#:~:text=Filter), [discover_state.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/services/discover_state.ts#:~:text=Filter)+ 24 more | 8.1 | +| | [saved_search_embeddable.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/embeddable/saved_search_embeddable.tsx#:~:text=esFilters), [saved_search_embeddable.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/embeddable/saved_search_embeddable.tsx#:~:text=esFilters) | 8.1 | +| | [context_state.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/context/services/context_state.test.ts#:~:text=Filter), [context_state.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/context/services/context_state.test.ts#:~:text=Filter), [context_state.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/context/services/context_state.test.ts#:~:text=Filter), [saved_search_embeddable.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/embeddable/saved_search_embeddable.tsx#:~:text=Filter), [saved_search_embeddable.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/embeddable/saved_search_embeddable.tsx#:~:text=Filter), [context.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/target/types/public/application/context/services/context.d.ts#:~:text=Filter), [context.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/target/types/public/application/context/services/context.d.ts#:~:text=Filter), [context.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/target/types/public/application/context/services/context.d.ts#:~:text=Filter), [context.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/target/types/public/application/context/services/context.d.ts#:~:text=Filter) | 8.1 | | | [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/components/layout/types.ts#:~:text=IndexPatternAttributes), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/components/layout/types.ts#:~:text=IndexPatternAttributes), [discover_main_app.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/discover_main_app.tsx#:~:text=IndexPatternAttributes), [discover_main_app.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/discover_main_app.tsx#:~:text=IndexPatternAttributes), [discover_main_route.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/discover_main_route.tsx#:~:text=IndexPatternAttributes), [discover_main_route.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/discover_main_route.tsx#:~:text=IndexPatternAttributes), [discover_main_route.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/discover_main_route.tsx#:~:text=IndexPatternAttributes), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/components/layout/types.ts#:~:text=IndexPatternAttributes), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/components/layout/types.ts#:~:text=IndexPatternAttributes), [discover_main_app.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/discover_main_app.tsx#:~:text=IndexPatternAttributes)+ 4 more | - | | | [discover_field_visualize_inner.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/components/sidebar/discover_field_visualize_inner.tsx#:~:text=IndexPatternField), [discover_field_visualize_inner.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/components/sidebar/discover_field_visualize_inner.tsx#:~:text=IndexPatternField), [fields.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/components/sidebar/__stories__/fields.ts#:~:text=IndexPatternField), [fields.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/components/sidebar/__stories__/fields.ts#:~:text=IndexPatternField), [discover_field_visualize_inner.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/components/sidebar/discover_field_visualize_inner.tsx#:~:text=IndexPatternField), [discover_field_visualize_inner.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/components/sidebar/discover_field_visualize_inner.tsx#:~:text=IndexPatternField), [fields.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/components/sidebar/__stories__/fields.ts#:~:text=IndexPatternField), [fields.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/components/sidebar/__stories__/fields.ts#:~:text=IndexPatternField) | - | | | [use_discover_state.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/target/types/public/application/main/utils/use_discover_state.d.ts#:~:text=IndexPattern), [use_discover_state.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/target/types/public/application/main/utils/use_discover_state.d.ts#:~:text=IndexPattern) | - | -| | [url_generator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/url_generator.ts#:~:text=Filter), [url_generator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/url_generator.ts#:~:text=Filter), [url_generator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/url_generator.ts#:~:text=Filter), [locator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/locator.ts#:~:text=Filter), [locator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/locator.ts#:~:text=Filter), [locator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/locator.ts#:~:text=Filter), [discover_state.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/services/discover_state.ts#:~:text=Filter), [discover_state.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/services/discover_state.ts#:~:text=Filter), [discover_state.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/services/discover_state.ts#:~:text=Filter), [discover_state.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/services/discover_state.ts#:~:text=Filter)+ 24 more | 8.1 | +| | [context_state.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/context/services/context_state.test.ts#:~:text=Filter), [context_state.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/context/services/context_state.test.ts#:~:text=Filter), [context_state.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/context/services/context_state.test.ts#:~:text=Filter), [saved_search_embeddable.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/embeddable/saved_search_embeddable.tsx#:~:text=Filter), [saved_search_embeddable.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/embeddable/saved_search_embeddable.tsx#:~:text=Filter), [context.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/target/types/public/application/context/services/context.d.ts#:~:text=Filter), [context.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/target/types/public/application/context/services/context.d.ts#:~:text=Filter), [context.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/target/types/public/application/context/services/context.d.ts#:~:text=Filter), [context.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/target/types/public/application/context/services/context.d.ts#:~:text=Filter) | 8.1 | | | [saved_search_embeddable.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/embeddable/saved_search_embeddable.tsx#:~:text=create), [saved_search_embeddable.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/embeddable/saved_search_embeddable.tsx#:~:text=create) | - | | | [anchor.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/context/services/anchor.ts#:~:text=fetch), [fetch_hits_in_interval.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/context/utils/fetch_hits_in_interval.ts#:~:text=fetch) | 8.1 | | | [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/components/layout/types.ts#:~:text=IndexPatternAttributes), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/components/layout/types.ts#:~:text=IndexPatternAttributes), [discover_main_app.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/discover_main_app.tsx#:~:text=IndexPatternAttributes), [discover_main_app.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/discover_main_app.tsx#:~:text=IndexPatternAttributes), [discover_main_route.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/discover_main_route.tsx#:~:text=IndexPatternAttributes), [discover_main_route.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/discover_main_route.tsx#:~:text=IndexPatternAttributes), [discover_main_route.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/discover_main_route.tsx#:~:text=IndexPatternAttributes) | - | | | [discover_field_visualize_inner.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/components/sidebar/discover_field_visualize_inner.tsx#:~:text=IndexPatternField), [discover_field_visualize_inner.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/components/sidebar/discover_field_visualize_inner.tsx#:~:text=IndexPatternField), [fields.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/components/sidebar/__stories__/fields.ts#:~:text=IndexPatternField), [fields.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/components/sidebar/__stories__/fields.ts#:~:text=IndexPatternField) | - | | | [use_discover_state.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/target/types/public/application/main/utils/use_discover_state.d.ts#:~:text=IndexPattern) | - | -| | [url_generator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/url_generator.ts#:~:text=Filter), [url_generator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/url_generator.ts#:~:text=Filter), [url_generator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/url_generator.ts#:~:text=Filter), [locator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/locator.ts#:~:text=Filter), [locator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/locator.ts#:~:text=Filter), [locator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/locator.ts#:~:text=Filter), [discover_state.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/services/discover_state.ts#:~:text=Filter), [discover_state.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/services/discover_state.ts#:~:text=Filter), [discover_state.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/services/discover_state.ts#:~:text=Filter), [discover_state.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/services/discover_state.ts#:~:text=Filter)+ 24 more | 8.1 | +| | [context_state.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/context/services/context_state.test.ts#:~:text=Filter), [context_state.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/context/services/context_state.test.ts#:~:text=Filter), [context_state.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/context/services/context_state.test.ts#:~:text=Filter), [saved_search_embeddable.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/embeddable/saved_search_embeddable.tsx#:~:text=Filter), [saved_search_embeddable.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/embeddable/saved_search_embeddable.tsx#:~:text=Filter), [context.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/target/types/public/application/context/services/context.d.ts#:~:text=Filter), [context.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/target/types/public/application/context/services/context.d.ts#:~:text=Filter), [context.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/target/types/public/application/context/services/context.d.ts#:~:text=Filter), [context.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/target/types/public/application/context/services/context.d.ts#:~:text=Filter) | 8.1 | | | [on_save_search.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/components/top_nav/on_save_search.tsx#:~:text=SavedObjectSaveModal), [on_save_search.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/components/top_nav/on_save_search.tsx#:~:text=SavedObjectSaveModal) | - | | | [saved_search_embeddable.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/embeddable/saved_search_embeddable.tsx#:~:text=executeTriggerActions), [search_embeddable_factory.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/embeddable/search_embeddable_factory.ts#:~:text=executeTriggerActions), [plugin.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/plugin.tsx#:~:text=executeTriggerActions), [search_embeddable_factory.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/target/types/public/embeddable/search_embeddable_factory.d.ts#:~:text=executeTriggerActions) | - | | | [ui_settings.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/server/ui_settings.ts#:~:text=metric), [ui_settings.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/server/ui_settings.ts#:~:text=metric), [ui_settings.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/server/ui_settings.ts#:~:text=metric) | - | @@ -348,14 +334,11 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/public/applications/fleet/sections/data_stream/list_page/index.tsx#:~:text=fieldFormats) | - | | | [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/server/plugin.ts#:~:text=disabled) | - | | | [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/server/plugin.ts#:~:text=disabled) | - | | | [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/server/plugin.ts#:~:text=disabled) | - | -| | [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/public/plugin.ts#:~:text=license%24) | - | -| | [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/server/plugin.ts#:~:text=license%24) | - | -| | [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/public/applications/integrations/index.tsx#:~:text=appBasePath), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/public/applications/fleet/index.tsx#:~:text=appBasePath), [index.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/target/types/public/applications/fleet/index.d.ts#:~:text=appBasePath), [index.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/target/types/public/applications/integrations/index.d.ts#:~:text=appBasePath) | - | -| | [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/server/plugin.ts#:~:text=AsyncPlugin), [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/server/plugin.ts#:~:text=AsyncPlugin), [plugin.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/target/types/server/plugin.d.ts#:~:text=AsyncPlugin), [plugin.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/target/types/server/plugin.d.ts#:~:text=AsyncPlugin) | - | +| | [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/public/applications/integrations/index.tsx#:~:text=appBasePath), [index.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/target/types/public/applications/fleet/index.d.ts#:~:text=appBasePath), [index.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/target/types/public/applications/integrations/index.d.ts#:~:text=appBasePath) | - | +| | [plugin.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/target/types/server/plugin.d.ts#:~:text=AsyncPlugin), [plugin.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/target/types/server/plugin.d.ts#:~:text=AsyncPlugin) | - | @@ -487,28 +470,30 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | ---------------|-----------|-----------| | | [create_doc_source.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/server/data_indexing/create_doc_source.ts#:~:text=IndexPatternsService), [create_doc_source.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/server/data_indexing/create_doc_source.ts#:~:text=IndexPatternsService), [create_doc_source.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/server/data_indexing/create_doc_source.ts#:~:text=IndexPatternsService), [create_doc_source.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/server/data_indexing/create_doc_source.ts#:~:text=IndexPatternsService) | - | | | [index.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/lazy_load_bundle/index.ts#:~:text=IndexPatternsContract), [index.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/lazy_load_bundle/index.ts#:~:text=IndexPatternsContract), [index.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/lazy_load_bundle/index.d.ts#:~:text=IndexPatternsContract), [index.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/lazy_load_bundle/index.d.ts#:~:text=IndexPatternsContract), [index.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/lazy_load_bundle/index.ts#:~:text=IndexPatternsContract), [index.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/lazy_load_bundle/index.ts#:~:text=IndexPatternsContract), [index.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/lazy_load_bundle/index.d.ts#:~:text=IndexPatternsContract), [index.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/lazy_load_bundle/index.d.ts#:~:text=IndexPatternsContract) | - | -| | [es_tooltip_property.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.test.ts#:~:text=IndexPattern), [es_tooltip_property.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.test.ts#:~:text=IndexPattern), [percentile_agg_field.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/fields/agg/percentile_agg_field.test.ts#:~:text=IndexPattern), [percentile_agg_field.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/fields/agg/percentile_agg_field.test.ts#:~:text=IndexPattern), [get_docvalue_source_fields.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/util/get_docvalue_source_fields.test.ts#:~:text=IndexPattern), [get_docvalue_source_fields.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/util/get_docvalue_source_fields.test.ts#:~:text=IndexPattern), [get_docvalue_source_fields.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/util/get_docvalue_source_fields.test.ts#:~:text=IndexPattern), [es_tooltip_property.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.test.ts#:~:text=IndexPattern), [es_tooltip_property.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.test.ts#:~:text=IndexPattern), [percentile_agg_field.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/fields/agg/percentile_agg_field.test.ts#:~:text=IndexPattern)+ 4 more | - | -| | [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/single_field_select.tsx#:~:text=IndexPatternField), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/single_field_select.tsx#:~:text=IndexPatternField), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/single_field_select.tsx#:~:text=IndexPatternField), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/single_field_select.tsx#:~:text=IndexPatternField), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/single_field_select.tsx#:~:text=IndexPatternField), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/single_field_select.tsx#:~:text=IndexPatternField), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/single_field_select.tsx#:~:text=IndexPatternField), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/single_field_select.tsx#:~:text=IndexPatternField), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/single_field_select.tsx#:~:text=IndexPatternField), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/single_field_select.tsx#:~:text=IndexPatternField)+ 130 more | - | +| | [es_agg_utils.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts#:~:text=IndexPattern), [es_agg_utils.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts#:~:text=IndexPattern), [percentile_agg_field.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/classes/fields/agg/percentile_agg_field.d.ts#:~:text=IndexPattern), [percentile_agg_field.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/classes/fields/agg/percentile_agg_field.d.ts#:~:text=IndexPattern), [map_app.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts#:~:text=IndexPattern), [map_app.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts#:~:text=IndexPattern), [es_tooltip_property.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.test.ts#:~:text=IndexPattern), [es_tooltip_property.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.test.ts#:~:text=IndexPattern), [es_source.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/classes/sources/es_source/es_source.d.ts#:~:text=IndexPattern), [es_source.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/classes/sources/es_source/es_source.d.ts#:~:text=IndexPattern)+ 82 more | - | +| | [es_agg_utils.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts#:~:text=IndexPatternField), [es_agg_utils.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts#:~:text=IndexPatternField), [es_agg_utils.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts#:~:text=IndexPatternField), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/single_field_select.tsx#:~:text=IndexPatternField), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/single_field_select.tsx#:~:text=IndexPatternField), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/single_field_select.tsx#:~:text=IndexPatternField), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/single_field_select.tsx#:~:text=IndexPatternField), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/single_field_select.tsx#:~:text=IndexPatternField), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/single_field_select.tsx#:~:text=IndexPatternField), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/single_field_select.tsx#:~:text=IndexPatternField)+ 194 more | - | | | [es_source.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_source/es_source.ts#:~:text=fetch), [es_search_source.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=fetch), [es_search_source.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=fetch) | 8.1 | | | [kibana_services.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/kibana_services.ts#:~:text=indexPatterns) | - | | | [locators.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/locators.test.ts#:~:text=esFilters), [locators.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/locators.test.ts#:~:text=esFilters) | 8.1 | -| | [can_skip_fetch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts#:~:text=Filter), [can_skip_fetch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts#:~:text=Filter), [can_skip_fetch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts#:~:text=Filter), [can_skip_fetch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts#:~:text=Filter) | 8.1 | +| | [can_skip_fetch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts#:~:text=Filter), [can_skip_fetch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts#:~:text=Filter), [can_skip_fetch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts#:~:text=Filter), [can_skip_fetch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts#:~:text=Filter), [map_app.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts#:~:text=Filter), [map_app.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts#:~:text=Filter), [map_app.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts#:~:text=Filter), [map_app.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts#:~:text=Filter), [map_app.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts#:~:text=Filter) | 8.1 | | | [index.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/lazy_load_bundle/index.ts#:~:text=IndexPatternsContract), [index.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/lazy_load_bundle/index.ts#:~:text=IndexPatternsContract), [index.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/lazy_load_bundle/index.d.ts#:~:text=IndexPatternsContract), [index.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/lazy_load_bundle/index.d.ts#:~:text=IndexPatternsContract), [index.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/lazy_load_bundle/index.ts#:~:text=IndexPatternsContract), [index.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/lazy_load_bundle/index.ts#:~:text=IndexPatternsContract), [index.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/lazy_load_bundle/index.d.ts#:~:text=IndexPatternsContract), [index.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/lazy_load_bundle/index.d.ts#:~:text=IndexPatternsContract) | - | -| | [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/single_field_select.tsx#:~:text=IndexPatternField), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/single_field_select.tsx#:~:text=IndexPatternField), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/single_field_select.tsx#:~:text=IndexPatternField), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/single_field_select.tsx#:~:text=IndexPatternField), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/single_field_select.tsx#:~:text=IndexPatternField), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/single_field_select.tsx#:~:text=IndexPatternField), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/single_field_select.tsx#:~:text=IndexPatternField), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/single_field_select.tsx#:~:text=IndexPatternField), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/single_field_select.tsx#:~:text=IndexPatternField), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/single_field_select.tsx#:~:text=IndexPatternField)+ 130 more | - | +| | [es_agg_utils.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts#:~:text=IndexPatternField), [es_agg_utils.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts#:~:text=IndexPatternField), [es_agg_utils.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts#:~:text=IndexPatternField), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/single_field_select.tsx#:~:text=IndexPatternField), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/single_field_select.tsx#:~:text=IndexPatternField), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/single_field_select.tsx#:~:text=IndexPatternField), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/single_field_select.tsx#:~:text=IndexPatternField), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/single_field_select.tsx#:~:text=IndexPatternField), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/single_field_select.tsx#:~:text=IndexPatternField), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/single_field_select.tsx#:~:text=IndexPatternField)+ 194 more | - | | | [create_doc_source.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/server/data_indexing/create_doc_source.ts#:~:text=IndexPatternsService), [create_doc_source.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/server/data_indexing/create_doc_source.ts#:~:text=IndexPatternsService), [create_doc_source.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/server/data_indexing/create_doc_source.ts#:~:text=IndexPatternsService), [create_doc_source.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/server/data_indexing/create_doc_source.ts#:~:text=IndexPatternsService) | - | -| | [es_tooltip_property.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.test.ts#:~:text=IndexPattern), [es_tooltip_property.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.test.ts#:~:text=IndexPattern), [percentile_agg_field.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/fields/agg/percentile_agg_field.test.ts#:~:text=IndexPattern), [percentile_agg_field.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/fields/agg/percentile_agg_field.test.ts#:~:text=IndexPattern), [get_docvalue_source_fields.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/util/get_docvalue_source_fields.test.ts#:~:text=IndexPattern), [get_docvalue_source_fields.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/util/get_docvalue_source_fields.test.ts#:~:text=IndexPattern), [get_docvalue_source_fields.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/util/get_docvalue_source_fields.test.ts#:~:text=IndexPattern), [es_tooltip_property.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.test.ts#:~:text=IndexPattern), [es_tooltip_property.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.test.ts#:~:text=IndexPattern), [percentile_agg_field.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/fields/agg/percentile_agg_field.test.ts#:~:text=IndexPattern)+ 4 more | - | +| | [es_agg_utils.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts#:~:text=IndexPattern), [es_agg_utils.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts#:~:text=IndexPattern), [percentile_agg_field.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/classes/fields/agg/percentile_agg_field.d.ts#:~:text=IndexPattern), [percentile_agg_field.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/classes/fields/agg/percentile_agg_field.d.ts#:~:text=IndexPattern), [map_app.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts#:~:text=IndexPattern), [map_app.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts#:~:text=IndexPattern), [es_tooltip_property.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.test.ts#:~:text=IndexPattern), [es_tooltip_property.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.test.ts#:~:text=IndexPattern), [es_source.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/classes/sources/es_source/es_source.d.ts#:~:text=IndexPattern), [es_source.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/classes/sources/es_source/es_source.d.ts#:~:text=IndexPattern)+ 82 more | - | | | [es_search_source.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=flattenHit), [es_search_source.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=flattenHit), [es_search_source.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=flattenHit), [es_search_source.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=flattenHit) | - | -| | [can_skip_fetch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts#:~:text=Filter), [can_skip_fetch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts#:~:text=Filter), [can_skip_fetch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts#:~:text=Filter), [can_skip_fetch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts#:~:text=Filter) | 8.1 | +| | [can_skip_fetch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts#:~:text=Filter), [can_skip_fetch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts#:~:text=Filter), [can_skip_fetch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts#:~:text=Filter), [can_skip_fetch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts#:~:text=Filter), [map_app.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts#:~:text=Filter), [map_app.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts#:~:text=Filter), [map_app.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts#:~:text=Filter), [map_app.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts#:~:text=Filter), [map_app.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts#:~:text=Filter) | 8.1 | | | [es_source.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_source/es_source.ts#:~:text=fetch), [es_search_source.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=fetch), [es_search_source.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=fetch) | 8.1 | -| | [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/single_field_select.tsx#:~:text=IndexPatternField), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/single_field_select.tsx#:~:text=IndexPatternField), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/single_field_select.tsx#:~:text=IndexPatternField), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/single_field_select.tsx#:~:text=IndexPatternField), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/single_field_select.tsx#:~:text=IndexPatternField), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/single_field_select.tsx#:~:text=IndexPatternField), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/single_field_select.tsx#:~:text=IndexPatternField), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/single_field_select.tsx#:~:text=IndexPatternField), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/single_field_select.tsx#:~:text=IndexPatternField), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/single_field_select.tsx#:~:text=IndexPatternField)+ 60 more | - | -| | [es_tooltip_property.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.test.ts#:~:text=IndexPattern), [es_tooltip_property.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.test.ts#:~:text=IndexPattern), [percentile_agg_field.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/fields/agg/percentile_agg_field.test.ts#:~:text=IndexPattern), [percentile_agg_field.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/fields/agg/percentile_agg_field.test.ts#:~:text=IndexPattern), [get_docvalue_source_fields.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/util/get_docvalue_source_fields.test.ts#:~:text=IndexPattern), [get_docvalue_source_fields.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/util/get_docvalue_source_fields.test.ts#:~:text=IndexPattern), [get_docvalue_source_fields.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/util/get_docvalue_source_fields.test.ts#:~:text=IndexPattern) | - | +| | [es_agg_utils.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts#:~:text=IndexPatternField), [es_agg_utils.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts#:~:text=IndexPatternField), [es_agg_utils.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts#:~:text=IndexPatternField), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/single_field_select.tsx#:~:text=IndexPatternField), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/single_field_select.tsx#:~:text=IndexPatternField), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/single_field_select.tsx#:~:text=IndexPatternField), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/single_field_select.tsx#:~:text=IndexPatternField), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/single_field_select.tsx#:~:text=IndexPatternField), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/single_field_select.tsx#:~:text=IndexPatternField), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/single_field_select.tsx#:~:text=IndexPatternField)+ 92 more | - | +| | [es_agg_utils.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts#:~:text=IndexPattern), [es_agg_utils.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts#:~:text=IndexPattern), [percentile_agg_field.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/classes/fields/agg/percentile_agg_field.d.ts#:~:text=IndexPattern), [percentile_agg_field.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/classes/fields/agg/percentile_agg_field.d.ts#:~:text=IndexPattern), [map_app.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts#:~:text=IndexPattern), [map_app.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts#:~:text=IndexPattern), [es_tooltip_property.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.test.ts#:~:text=IndexPattern), [es_tooltip_property.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.test.ts#:~:text=IndexPattern), [es_source.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/classes/sources/es_source/es_source.d.ts#:~:text=IndexPattern), [es_source.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/classes/sources/es_source/es_source.d.ts#:~:text=IndexPattern)+ 36 more | - | | | [create_doc_source.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/server/data_indexing/create_doc_source.ts#:~:text=IndexPatternsService), [create_doc_source.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/server/data_indexing/create_doc_source.ts#:~:text=IndexPatternsService), [create_doc_source.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/server/data_indexing/create_doc_source.ts#:~:text=IndexPatternsService), [create_doc_source.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/server/data_indexing/create_doc_source.ts#:~:text=IndexPatternsService) | - | | | [es_search_source.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=flattenHit), [es_search_source.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=flattenHit) | - | -| | [can_skip_fetch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts#:~:text=Filter), [can_skip_fetch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts#:~:text=Filter), [can_skip_fetch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts#:~:text=Filter), [can_skip_fetch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts#:~:text=Filter) | 8.1 | +| | [can_skip_fetch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts#:~:text=Filter), [can_skip_fetch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts#:~:text=Filter), [can_skip_fetch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts#:~:text=Filter), [can_skip_fetch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts#:~:text=Filter), [map_app.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts#:~:text=Filter), [map_app.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts#:~:text=Filter), [map_app.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts#:~:text=Filter), [map_app.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts#:~:text=Filter), [map_app.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts#:~:text=Filter) | 8.1 | | | [es_search_source.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=flattenHit), [es_search_source.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=flattenHit) | - | | | [kibana_server_services.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/server/kibana_server_services.ts#:~:text=indexPatternsServiceFactory), [indexing_routes.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/server/data_indexing/indexing_routes.ts#:~:text=indexPatternsServiceFactory) | - | +| | [map_container.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/connected_components/map_container/map_container.tsx#:~:text=ExitFullScreenButton), [map_container.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/connected_components/map_container/map_container.tsx#:~:text=ExitFullScreenButton) | - | | | [maps_list_view.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/routes/list_page/maps_list_view.tsx#:~:text=settings), [maps_list_view.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/routes/list_page/maps_list_view.tsx#:~:text=settings), [maps_list_view.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/routes/list_page/maps_list_view.tsx#:~:text=settings) | - | | | [render_app.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/render_app.tsx#:~:text=onAppLeave), [map_app.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/routes/map_page/map_app/map_app.tsx#:~:text=onAppLeave), [map_page.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/routes/map_page/map_page.tsx#:~:text=onAppLeave), [render_app.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/render_app.d.ts#:~:text=onAppLeave), [map_page.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/routes/map_page/map_page.d.ts#:~:text=onAppLeave), [map_app.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts#:~:text=onAppLeave) | - | +| | [saved_object_migrations.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/server/saved_objects/saved_object_migrations.ts#:~:text=warning) | - | @@ -555,15 +540,6 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | | [rtl_helpers.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/rtl_helpers.tsx#:~:text=IndexPatternsContract), [rtl_helpers.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/rtl_helpers.tsx#:~:text=IndexPatternsContract), [rtl_helpers.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/rtl_helpers.tsx#:~:text=IndexPatternsContract), [rtl_helpers.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/rtl_helpers.tsx#:~:text=IndexPatternsContract) | - | | | [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=IndexPattern), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=IndexPattern), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=IndexPattern), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=IndexPattern), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=IndexPattern), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=IndexPattern), [lens_attributes.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/lens_attributes.ts#:~:text=IndexPattern), [lens_attributes.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/lens_attributes.ts#:~:text=IndexPattern), [lens_attributes.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/lens_attributes.ts#:~:text=IndexPattern), [default_configs.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/default_configs.ts#:~:text=IndexPattern)+ 34 more | - | | | [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=IndexPattern), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=IndexPattern), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=IndexPattern), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=IndexPattern), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=IndexPattern), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=IndexPattern), [lens_attributes.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/lens_attributes.ts#:~:text=IndexPattern), [lens_attributes.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/lens_attributes.ts#:~:text=IndexPattern), [lens_attributes.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/lens_attributes.ts#:~:text=IndexPattern), [default_configs.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/default_configs.ts#:~:text=IndexPattern)+ 12 more | - | -| | [use_discover_link.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/hooks/use_discover_link.tsx#:~:text=urlGenerator) | - | - - - -## osquery - -| Deprecated API | Reference location(s) | Remove By | -| ---------------|-----------|-----------| -| | [pack_queries_status_table.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/osquery/public/packs/pack_queries_status_table.tsx#:~:text=urlGenerator), [use_discover_link.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/osquery/public/common/hooks/use_discover_link.tsx#:~:text=urlGenerator) | - | @@ -822,16 +798,16 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| | | [abstract_search_strategy.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts#:~:text=IndexPatternsService), [abstract_search_strategy.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts#:~:text=IndexPatternsService), [default_search_strategy.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/default_search_strategy.ts#:~:text=IndexPatternsService), [default_search_strategy.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/default_search_strategy.ts#:~:text=IndexPatternsService), [cached_index_pattern_fetcher.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.ts#:~:text=IndexPatternsService), [cached_index_pattern_fetcher.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.ts#:~:text=IndexPatternsService), [rollup_search_strategy.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/rollup_search_strategy.ts#:~:text=IndexPatternsService), [rollup_search_strategy.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/rollup_search_strategy.ts#:~:text=IndexPatternsService), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/types.ts#:~:text=IndexPatternsService), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/types.ts#:~:text=IndexPatternsService)+ 44 more | - | -| | [cached_index_pattern_fetcher.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts#:~:text=IndexPattern), [cached_index_pattern_fetcher.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts#:~:text=IndexPattern), [cached_index_pattern_fetcher.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts#:~:text=IndexPattern), [cached_index_pattern_fetcher.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts#:~:text=IndexPattern), [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/types/index.ts#:~:text=IndexPattern), [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/types/index.ts#:~:text=IndexPattern), [index_patterns_utils.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts#:~:text=IndexPattern), [index_patterns_utils.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts#:~:text=IndexPattern), [index_patterns_utils.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts#:~:text=IndexPattern), [index_patterns_utils.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts#:~:text=IndexPattern)+ 76 more | - | +| | [cached_index_pattern_fetcher.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts#:~:text=IndexPattern), [cached_index_pattern_fetcher.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts#:~:text=IndexPattern), [cached_index_pattern_fetcher.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts#:~:text=IndexPattern), [cached_index_pattern_fetcher.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts#:~:text=IndexPattern), [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/types/index.ts#:~:text=IndexPattern), [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/types/index.ts#:~:text=IndexPattern), [index_patterns_utils.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts#:~:text=IndexPattern), [index_patterns_utils.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts#:~:text=IndexPattern), [index_patterns_utils.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts#:~:text=IndexPattern), [index_patterns_utils.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts#:~:text=IndexPattern)+ 62 more | - | | | [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField)+ 2 more | - | | | [fetch_fields.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/lib/fetch_fields.ts#:~:text=indexPatterns), [combo_box_select.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/index_pattern_select/combo_box_select.tsx#:~:text=indexPatterns), [query_bar_wrapper.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/query_bar_wrapper.tsx#:~:text=indexPatterns), [annotation_row.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/annotation_row.tsx#:~:text=indexPatterns), [metrics_type.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/metrics_type.ts#:~:text=indexPatterns), [metrics_type.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/metrics_type.ts#:~:text=indexPatterns), [convert_series_to_datatable.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.ts#:~:text=indexPatterns), [timeseries_visualization.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/timeseries_visualization.tsx#:~:text=indexPatterns), [metrics_type.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/metrics_type.test.ts#:~:text=indexPatterns) | - | | | [plugin.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/plugin.ts#:~:text=fieldFormats) | - | | | [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField)+ 2 more | - | | | [abstract_search_strategy.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts#:~:text=IndexPatternsService), [abstract_search_strategy.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts#:~:text=IndexPatternsService), [default_search_strategy.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/default_search_strategy.ts#:~:text=IndexPatternsService), [default_search_strategy.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/default_search_strategy.ts#:~:text=IndexPatternsService), [cached_index_pattern_fetcher.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.ts#:~:text=IndexPatternsService), [cached_index_pattern_fetcher.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.ts#:~:text=IndexPatternsService), [rollup_search_strategy.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/rollup_search_strategy.ts#:~:text=IndexPatternsService), [rollup_search_strategy.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/rollup_search_strategy.ts#:~:text=IndexPatternsService), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/types.ts#:~:text=IndexPatternsService), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/types.ts#:~:text=IndexPatternsService)+ 44 more | - | -| | [cached_index_pattern_fetcher.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts#:~:text=IndexPattern), [cached_index_pattern_fetcher.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts#:~:text=IndexPattern), [cached_index_pattern_fetcher.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts#:~:text=IndexPattern), [cached_index_pattern_fetcher.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts#:~:text=IndexPattern), [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/types/index.ts#:~:text=IndexPattern), [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/types/index.ts#:~:text=IndexPattern), [index_patterns_utils.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts#:~:text=IndexPattern), [index_patterns_utils.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts#:~:text=IndexPattern), [index_patterns_utils.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts#:~:text=IndexPattern), [index_patterns_utils.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts#:~:text=IndexPattern)+ 76 more | - | +| | [cached_index_pattern_fetcher.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts#:~:text=IndexPattern), [cached_index_pattern_fetcher.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts#:~:text=IndexPattern), [cached_index_pattern_fetcher.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts#:~:text=IndexPattern), [cached_index_pattern_fetcher.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts#:~:text=IndexPattern), [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/types/index.ts#:~:text=IndexPattern), [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/types/index.ts#:~:text=IndexPattern), [index_patterns_utils.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts#:~:text=IndexPattern), [index_patterns_utils.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts#:~:text=IndexPattern), [index_patterns_utils.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts#:~:text=IndexPattern), [index_patterns_utils.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts#:~:text=IndexPattern)+ 62 more | - | | | [abstract_search_strategy.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts#:~:text=getNonScriptedFields), [fetch_fields.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/lib/fetch_fields.ts#:~:text=getNonScriptedFields), [abstract_search_strategy.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts#:~:text=getNonScriptedFields), [fetch_fields.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/lib/fetch_fields.ts#:~:text=getNonScriptedFields) | - | | | [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField) | - | -| | [cached_index_pattern_fetcher.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts#:~:text=IndexPattern), [cached_index_pattern_fetcher.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts#:~:text=IndexPattern), [cached_index_pattern_fetcher.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts#:~:text=IndexPattern), [cached_index_pattern_fetcher.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts#:~:text=IndexPattern), [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/types/index.ts#:~:text=IndexPattern), [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/types/index.ts#:~:text=IndexPattern), [index_patterns_utils.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts#:~:text=IndexPattern), [index_patterns_utils.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts#:~:text=IndexPattern), [index_patterns_utils.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts#:~:text=IndexPattern), [index_patterns_utils.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts#:~:text=IndexPattern)+ 33 more | - | +| | [cached_index_pattern_fetcher.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts#:~:text=IndexPattern), [cached_index_pattern_fetcher.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts#:~:text=IndexPattern), [cached_index_pattern_fetcher.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts#:~:text=IndexPattern), [cached_index_pattern_fetcher.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts#:~:text=IndexPattern), [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/types/index.ts#:~:text=IndexPattern), [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/types/index.ts#:~:text=IndexPattern), [index_patterns_utils.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts#:~:text=IndexPattern), [index_patterns_utils.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts#:~:text=IndexPattern), [index_patterns_utils.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts#:~:text=IndexPattern), [index_patterns_utils.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts#:~:text=IndexPattern)+ 26 more | - | | | [abstract_search_strategy.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts#:~:text=IndexPatternsService), [abstract_search_strategy.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts#:~:text=IndexPatternsService), [default_search_strategy.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/default_search_strategy.ts#:~:text=IndexPatternsService), [default_search_strategy.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/default_search_strategy.ts#:~:text=IndexPatternsService), [cached_index_pattern_fetcher.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.ts#:~:text=IndexPatternsService), [cached_index_pattern_fetcher.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.ts#:~:text=IndexPatternsService), [rollup_search_strategy.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/rollup_search_strategy.ts#:~:text=IndexPatternsService), [rollup_search_strategy.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/rollup_search_strategy.ts#:~:text=IndexPatternsService), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/types.ts#:~:text=IndexPatternsService), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/types.ts#:~:text=IndexPatternsService)+ 44 more | - | | | [abstract_search_strategy.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts#:~:text=getNonScriptedFields), [fetch_fields.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/lib/fetch_fields.ts#:~:text=getNonScriptedFields) | - | | | [plugin.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/plugin.ts#:~:text=fieldFormats) | - | diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index ca9516ce85df8..14a6f5f1707d7 100644 --- a/api_docs/deprecations_by_team.mdx +++ b/api_docs/deprecations_by_team.mdx @@ -3,7 +3,7 @@ id: kibDevDocsDeprecationsDueByTeam slug: /kibana-dev-docs/api-meta/deprecations-due-by-team title: Deprecated APIs due to be removed, by team summary: Lists the teams that are referencing deprecated APIs with a remove by date. -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. --- @@ -24,16 +24,13 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | dataViews | | [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/utils.ts#:~:text=IFieldType), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/utils.ts#:~:text=IFieldType), [data_view_field.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/data_view_field.ts#:~:text=IFieldType), [data_view_field.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/data_view_field.ts#:~:text=IFieldType), [field_list.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/field_list.ts#:~:text=IFieldType), [field_list.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/field_list.ts#:~:text=IFieldType), [field_list.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/field_list.ts#:~:text=IFieldType), [field_list.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/field_list.ts#:~:text=IFieldType), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/types.ts#:~:text=IFieldType), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/types.ts#:~:text=IFieldType)+ 13 more | 8.2 | | dataViews | | [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/utils.ts#:~:text=IFieldType), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/utils.ts#:~:text=IFieldType), [data_view_field.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/data_view_field.ts#:~:text=IFieldType), [data_view_field.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/data_view_field.ts#:~:text=IFieldType), [field_list.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/field_list.ts#:~:text=IFieldType), [field_list.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/field_list.ts#:~:text=IFieldType), [field_list.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/field_list.ts#:~:text=IFieldType), [field_list.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/field_list.ts#:~:text=IFieldType), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/types.ts#:~:text=IFieldType), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/types.ts#:~:text=IFieldType)+ 66 more | 8.2 | | dataViews | | [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/utils.ts#:~:text=IFieldType), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/utils.ts#:~:text=IFieldType), [data_view_field.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/data_view_field.ts#:~:text=IFieldType), [data_view_field.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/data_view_field.ts#:~:text=IFieldType), [field_list.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/field_list.ts#:~:text=IFieldType), [field_list.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/field_list.ts#:~:text=IFieldType), [field_list.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/field_list.ts#:~:text=IFieldType), [field_list.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/field_list.ts#:~:text=IFieldType), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/types.ts#:~:text=IFieldType), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/types.ts#:~:text=IFieldType)+ 13 more | 8.2 | -| dashboardEnhanced | | [embeddable_to_dashboard_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx#:~:text=esFilters), [embeddable_to_dashboard_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx#:~:text=esFilters), [embeddable_to_dashboard_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx#:~:text=esFilters) | 8.1 | -| dashboardEnhanced | | [embeddable_to_dashboard_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx#:~:text=isFilters), [embeddable_to_dashboard_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx#:~:text=isFilters) | 8.1 | -| dashboardEnhanced | | [embeddable_to_dashboard_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx#:~:text=Filter), [embeddable_to_dashboard_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx#:~:text=Filter), [context_variables.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/variables/context_variables.ts#:~:text=Filter), [context_variables.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/variables/context_variables.ts#:~:text=Filter), [url_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/url_drilldown.tsx#:~:text=Filter), [url_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/url_drilldown.tsx#:~:text=Filter), [data.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/test/data.ts#:~:text=Filter), [data.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/test/data.ts#:~:text=Filter) | 8.1 | -| dashboardEnhanced | | [embeddable_to_dashboard_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx#:~:text=Filter), [embeddable_to_dashboard_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx#:~:text=Filter), [context_variables.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/variables/context_variables.ts#:~:text=Filter), [context_variables.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/variables/context_variables.ts#:~:text=Filter), [url_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/url_drilldown.tsx#:~:text=Filter), [url_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/url_drilldown.tsx#:~:text=Filter), [data.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/test/data.ts#:~:text=Filter), [data.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/test/data.ts#:~:text=Filter) | 8.1 | -| dashboardEnhanced | | [embeddable_to_dashboard_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx#:~:text=isFilters), [embeddable_to_dashboard_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx#:~:text=isFilters) | 8.1 | -| dashboardEnhanced | | [embeddable_to_dashboard_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx#:~:text=Filter), [embeddable_to_dashboard_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx#:~:text=Filter), [context_variables.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/variables/context_variables.ts#:~:text=Filter), [context_variables.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/variables/context_variables.ts#:~:text=Filter), [url_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/url_drilldown.tsx#:~:text=Filter), [url_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/url_drilldown.tsx#:~:text=Filter), [data.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/test/data.ts#:~:text=Filter), [data.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/test/data.ts#:~:text=Filter) | 8.1 | | dataEnhanced | | [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/types.ts#:~:text=KueryNode), [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/types.ts#:~:text=KueryNode), [get_search_session_page.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/get_search_session_page.ts#:~:text=KueryNode), [get_search_session_page.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/get_search_session_page.ts#:~:text=KueryNode), [check_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/check_persisted_sessions.ts#:~:text=KueryNode), [check_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/check_persisted_sessions.ts#:~:text=KueryNode), [check_non_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/check_non_persisted_sessions.ts#:~:text=KueryNode), [check_non_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/check_non_persisted_sessions.ts#:~:text=KueryNode), [expire_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/expire_persisted_sessions.ts#:~:text=KueryNode), [expire_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/expire_persisted_sessions.ts#:~:text=KueryNode)+ 2 more | 8.1 | | dataEnhanced | | [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/types.ts#:~:text=KueryNode), [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/types.ts#:~:text=KueryNode), [get_search_session_page.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/get_search_session_page.ts#:~:text=KueryNode), [get_search_session_page.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/get_search_session_page.ts#:~:text=KueryNode), [check_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/check_persisted_sessions.ts#:~:text=KueryNode), [check_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/check_persisted_sessions.ts#:~:text=KueryNode), [check_non_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/check_non_persisted_sessions.ts#:~:text=KueryNode), [check_non_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/check_non_persisted_sessions.ts#:~:text=KueryNode), [expire_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/expire_persisted_sessions.ts#:~:text=KueryNode), [expire_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/expire_persisted_sessions.ts#:~:text=KueryNode)+ 2 more | 8.1 | | dataEnhanced | | [check_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/check_persisted_sessions.ts#:~:text=nodeBuilder), [check_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/check_persisted_sessions.ts#:~:text=nodeBuilder), [check_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/check_persisted_sessions.ts#:~:text=nodeBuilder), [check_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/check_persisted_sessions.ts#:~:text=nodeBuilder), [check_non_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/check_non_persisted_sessions.ts#:~:text=nodeBuilder), [check_non_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/check_non_persisted_sessions.ts#:~:text=nodeBuilder), [expire_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/expire_persisted_sessions.ts#:~:text=nodeBuilder), [expire_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/expire_persisted_sessions.ts#:~:text=nodeBuilder), [expire_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/expire_persisted_sessions.ts#:~:text=nodeBuilder), [expire_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/expire_persisted_sessions.ts#:~:text=nodeBuilder)+ 2 more | 8.1 | | dataEnhanced | | [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/types.ts#:~:text=KueryNode), [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/types.ts#:~:text=KueryNode), [get_search_session_page.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/get_search_session_page.ts#:~:text=KueryNode), [get_search_session_page.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/get_search_session_page.ts#:~:text=KueryNode), [check_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/check_persisted_sessions.ts#:~:text=KueryNode), [check_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/check_persisted_sessions.ts#:~:text=KueryNode), [check_non_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/check_non_persisted_sessions.ts#:~:text=KueryNode), [check_non_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/check_non_persisted_sessions.ts#:~:text=KueryNode), [expire_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/expire_persisted_sessions.ts#:~:text=KueryNode), [expire_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/expire_persisted_sessions.ts#:~:text=KueryNode)+ 2 more | 8.1 | +| urlDrilldown | | [context_variables.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/variables/context_variables.ts#:~:text=Filter), [context_variables.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/variables/context_variables.ts#:~:text=Filter), [url_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/url_drilldown.tsx#:~:text=Filter), [url_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/url_drilldown.tsx#:~:text=Filter), [data.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/test/data.ts#:~:text=Filter), [data.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/test/data.ts#:~:text=Filter) | 8.1 | +| urlDrilldown | | [context_variables.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/variables/context_variables.ts#:~:text=Filter), [context_variables.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/variables/context_variables.ts#:~:text=Filter), [url_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/url_drilldown.tsx#:~:text=Filter), [url_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/url_drilldown.tsx#:~:text=Filter), [data.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/test/data.ts#:~:text=Filter), [data.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/test/data.ts#:~:text=Filter) | 8.1 | +| urlDrilldown | | [context_variables.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/variables/context_variables.ts#:~:text=Filter), [context_variables.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/variables/context_variables.ts#:~:text=Filter), [url_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/url_drilldown.tsx#:~:text=Filter), [url_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/url_drilldown.tsx#:~:text=Filter), [data.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/test/data.ts#:~:text=Filter), [data.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/test/data.ts#:~:text=Filter) | 8.1 | @@ -43,11 +40,11 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | --------|-------|-----------|-----------| | graph | | [search_bar.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/components/search_bar.tsx#:~:text=esKuery), [search_bar.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/components/search_bar.tsx#:~:text=esKuery), [search_bar.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/components/search_bar.tsx#:~:text=esKuery) | 8.1 | | discover | | [anchor.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/context/services/anchor.ts#:~:text=fetch), [fetch_hits_in_interval.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/context/utils/fetch_hits_in_interval.ts#:~:text=fetch) | 8.1 | -| discover | | [url_generator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/url_generator.ts#:~:text=esFilters), [url_generator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/url_generator.ts#:~:text=esFilters), [url_generator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/url_generator.ts#:~:text=esFilters), [locator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/locator.ts#:~:text=esFilters), [locator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/locator.ts#:~:text=esFilters), [locator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/locator.ts#:~:text=esFilters), [use_navigation_props.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/utils/use_navigation_props.tsx#:~:text=esFilters), [use_navigation_props.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/utils/use_navigation_props.tsx#:~:text=esFilters), [discover_state.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/services/discover_state.ts#:~:text=esFilters), [discover_state.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/services/discover_state.ts#:~:text=esFilters)+ 19 more | 8.1 | -| discover | | [url_generator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/url_generator.ts#:~:text=Filter), [url_generator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/url_generator.ts#:~:text=Filter), [url_generator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/url_generator.ts#:~:text=Filter), [locator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/locator.ts#:~:text=Filter), [locator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/locator.ts#:~:text=Filter), [locator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/locator.ts#:~:text=Filter), [discover_state.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/services/discover_state.ts#:~:text=Filter), [discover_state.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/services/discover_state.ts#:~:text=Filter), [discover_state.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/services/discover_state.ts#:~:text=Filter), [discover_state.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/services/discover_state.ts#:~:text=Filter)+ 29 more | 8.1 | -| discover | | [url_generator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/url_generator.ts#:~:text=Filter), [url_generator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/url_generator.ts#:~:text=Filter), [url_generator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/url_generator.ts#:~:text=Filter), [locator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/locator.ts#:~:text=Filter), [locator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/locator.ts#:~:text=Filter), [locator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/locator.ts#:~:text=Filter), [discover_state.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/services/discover_state.ts#:~:text=Filter), [discover_state.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/services/discover_state.ts#:~:text=Filter), [discover_state.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/services/discover_state.ts#:~:text=Filter), [discover_state.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/services/discover_state.ts#:~:text=Filter)+ 29 more | 8.1 | +| discover | | [saved_search_embeddable.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/embeddable/saved_search_embeddable.tsx#:~:text=esFilters), [saved_search_embeddable.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/embeddable/saved_search_embeddable.tsx#:~:text=esFilters), [explore_data_chart_action.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_chart_action.ts#:~:text=esFilters), [explore_data_chart_action.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_chart_action.ts#:~:text=esFilters) | 8.1 | +| discover | | [context_state.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/context/services/context_state.test.ts#:~:text=Filter), [context_state.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/context/services/context_state.test.ts#:~:text=Filter), [context_state.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/context/services/context_state.test.ts#:~:text=Filter), [saved_search_embeddable.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/embeddable/saved_search_embeddable.tsx#:~:text=Filter), [saved_search_embeddable.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/embeddable/saved_search_embeddable.tsx#:~:text=Filter), [context.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/target/types/public/application/context/services/context.d.ts#:~:text=Filter), [context.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/target/types/public/application/context/services/context.d.ts#:~:text=Filter), [context.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/target/types/public/application/context/services/context.d.ts#:~:text=Filter), [context.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/target/types/public/application/context/services/context.d.ts#:~:text=Filter), [explore_data_context_menu_action.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_context_menu_action.ts#:~:text=Filter)+ 4 more | 8.1 | +| discover | | [context_state.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/context/services/context_state.test.ts#:~:text=Filter), [context_state.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/context/services/context_state.test.ts#:~:text=Filter), [context_state.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/context/services/context_state.test.ts#:~:text=Filter), [saved_search_embeddable.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/embeddable/saved_search_embeddable.tsx#:~:text=Filter), [saved_search_embeddable.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/embeddable/saved_search_embeddable.tsx#:~:text=Filter), [context.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/target/types/public/application/context/services/context.d.ts#:~:text=Filter), [context.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/target/types/public/application/context/services/context.d.ts#:~:text=Filter), [context.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/target/types/public/application/context/services/context.d.ts#:~:text=Filter), [context.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/target/types/public/application/context/services/context.d.ts#:~:text=Filter), [explore_data_context_menu_action.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_context_menu_action.ts#:~:text=Filter)+ 4 more | 8.1 | | discover | | [anchor.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/context/services/anchor.ts#:~:text=fetch), [fetch_hits_in_interval.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/context/utils/fetch_hits_in_interval.ts#:~:text=fetch) | 8.1 | -| discover | | [url_generator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/url_generator.ts#:~:text=Filter), [url_generator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/url_generator.ts#:~:text=Filter), [url_generator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/url_generator.ts#:~:text=Filter), [locator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/locator.ts#:~:text=Filter), [locator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/locator.ts#:~:text=Filter), [locator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/locator.ts#:~:text=Filter), [discover_state.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/services/discover_state.ts#:~:text=Filter), [discover_state.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/services/discover_state.ts#:~:text=Filter), [discover_state.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/services/discover_state.ts#:~:text=Filter), [discover_state.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/main/services/discover_state.ts#:~:text=Filter)+ 29 more | 8.1 | +| discover | | [context_state.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/context/services/context_state.test.ts#:~:text=Filter), [context_state.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/context/services/context_state.test.ts#:~:text=Filter), [context_state.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/context/services/context_state.test.ts#:~:text=Filter), [saved_search_embeddable.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/embeddable/saved_search_embeddable.tsx#:~:text=Filter), [saved_search_embeddable.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/embeddable/saved_search_embeddable.tsx#:~:text=Filter), [context.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/target/types/public/application/context/services/context.d.ts#:~:text=Filter), [context.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/target/types/public/application/context/services/context.d.ts#:~:text=Filter), [context.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/target/types/public/application/context/services/context.d.ts#:~:text=Filter), [context.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/target/types/public/application/context/services/context.d.ts#:~:text=Filter), [explore_data_context_menu_action.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_context_menu_action.ts#:~:text=Filter)+ 4 more | 8.1 | | discoverEnhanced | | [explore_data_chart_action.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_chart_action.test.ts#:~:text=RangeFilter), [explore_data_chart_action.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_chart_action.test.ts#:~:text=RangeFilter) | 8.1 | | discoverEnhanced | | [explore_data_chart_action.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_chart_action.test.ts#:~:text=RangeFilter), [explore_data_chart_action.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_chart_action.test.ts#:~:text=RangeFilter) | 8.1 | @@ -59,10 +56,10 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | --------|-------|-----------|-----------| | maps | | [es_source.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_source/es_source.ts#:~:text=fetch), [es_search_source.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=fetch), [es_search_source.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=fetch) | 8.1 | | maps | | [locators.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/locators.test.ts#:~:text=esFilters), [locators.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/locators.test.ts#:~:text=esFilters) | 8.1 | -| maps | | [can_skip_fetch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts#:~:text=Filter), [can_skip_fetch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts#:~:text=Filter), [can_skip_fetch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts#:~:text=Filter), [can_skip_fetch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts#:~:text=Filter) | 8.1 | -| maps | | [can_skip_fetch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts#:~:text=Filter), [can_skip_fetch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts#:~:text=Filter), [can_skip_fetch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts#:~:text=Filter), [can_skip_fetch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts#:~:text=Filter) | 8.1 | +| maps | | [can_skip_fetch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts#:~:text=Filter), [can_skip_fetch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts#:~:text=Filter), [can_skip_fetch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts#:~:text=Filter), [can_skip_fetch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts#:~:text=Filter), [map_app.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts#:~:text=Filter), [map_app.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts#:~:text=Filter), [map_app.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts#:~:text=Filter), [map_app.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts#:~:text=Filter), [map_app.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts#:~:text=Filter) | 8.1 | +| maps | | [can_skip_fetch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts#:~:text=Filter), [can_skip_fetch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts#:~:text=Filter), [can_skip_fetch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts#:~:text=Filter), [can_skip_fetch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts#:~:text=Filter), [map_app.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts#:~:text=Filter), [map_app.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts#:~:text=Filter), [map_app.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts#:~:text=Filter), [map_app.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts#:~:text=Filter), [map_app.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts#:~:text=Filter) | 8.1 | | maps | | [es_source.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_source/es_source.ts#:~:text=fetch), [es_search_source.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=fetch), [es_search_source.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=fetch) | 8.1 | -| maps | | [can_skip_fetch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts#:~:text=Filter), [can_skip_fetch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts#:~:text=Filter), [can_skip_fetch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts#:~:text=Filter), [can_skip_fetch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts#:~:text=Filter) | 8.1 | +| maps | | [can_skip_fetch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts#:~:text=Filter), [can_skip_fetch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts#:~:text=Filter), [can_skip_fetch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts#:~:text=Filter), [can_skip_fetch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.ts#:~:text=Filter), [map_app.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts#:~:text=Filter), [map_app.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts#:~:text=Filter), [map_app.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts#:~:text=Filter), [map_app.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts#:~:text=Filter), [map_app.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts#:~:text=Filter) | 8.1 | diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index 1e6820b976fc6..895d0b0f655fd 100644 --- a/api_docs/dev_tools.mdx +++ b/api_docs/dev_tools.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/devTools title: "devTools" image: https://source.unsplash.com/400x175/?github summary: API docs for the devTools plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'devTools'] warning: 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. --- diff --git a/api_docs/discover.devdocs.json b/api_docs/discover.devdocs.json index a842dc1e03fcc..37bf36e243699 100644 --- a/api_docs/discover.devdocs.json +++ b/api_docs/discover.devdocs.json @@ -482,262 +482,6 @@ ], "initialIsOpen": false }, - { - "parentPluginId": "discover", - "id": "def-public.DiscoverUrlGeneratorState", - "type": "Interface", - "tags": [ - "deprecated" - ], - "label": "DiscoverUrlGeneratorState", - "description": [], - "path": "src/plugins/discover/public/url_generator.ts", - "deprecated": true, - "references": [ - { - "plugin": "dataVisualizer", - "path": "x-pack/plugins/data_visualizer/public/application/common/components/results_links/results_links.tsx" - }, - { - "plugin": "dataVisualizer", - "path": "x-pack/plugins/data_visualizer/public/application/common/components/results_links/results_links.tsx" - }, - { - "plugin": "dataVisualizer", - "path": "x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/actions_panel/actions_panel.tsx" - }, - { - "plugin": "dataVisualizer", - "path": "x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/actions_panel/actions_panel.tsx" - } - ], - "children": [ - { - "parentPluginId": "discover", - "id": "def-public.DiscoverUrlGeneratorState.savedSearchId", - "type": "string", - "tags": [], - "label": "savedSearchId", - "description": [ - "\nOptionally set saved search ID." - ], - "signature": [ - "string | undefined" - ], - "path": "src/plugins/discover/public/url_generator.ts", - "deprecated": false - }, - { - "parentPluginId": "discover", - "id": "def-public.DiscoverUrlGeneratorState.indexPatternId", - "type": "string", - "tags": [], - "label": "indexPatternId", - "description": [ - "\nOptionally set index pattern ID." - ], - "signature": [ - "string | undefined" - ], - "path": "src/plugins/discover/public/url_generator.ts", - "deprecated": false - }, - { - "parentPluginId": "discover", - "id": "def-public.DiscoverUrlGeneratorState.timeRange", - "type": "Object", - "tags": [], - "label": "timeRange", - "description": [ - "\nOptionally set the time range in the time picker." - ], - "signature": [ - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataQueryPluginApi", - "section": "def-common.TimeRange", - "text": "TimeRange" - }, - " | undefined" - ], - "path": "src/plugins/discover/public/url_generator.ts", - "deprecated": false - }, - { - "parentPluginId": "discover", - "id": "def-public.DiscoverUrlGeneratorState.refreshInterval", - "type": "Object", - "tags": [], - "label": "refreshInterval", - "description": [ - "\nOptionally set the refresh interval." - ], - "signature": [ - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataQueryPluginApi", - "section": "def-common.RefreshInterval", - "text": "RefreshInterval" - }, - " | undefined" - ], - "path": "src/plugins/discover/public/url_generator.ts", - "deprecated": false - }, - { - "parentPluginId": "discover", - "id": "def-public.DiscoverUrlGeneratorState.filters", - "type": "Array", - "tags": [], - "label": "filters", - "description": [ - "\nOptionally apply filters." - ], - "signature": [ - "Filter", - "[] | undefined" - ], - "path": "src/plugins/discover/public/url_generator.ts", - "deprecated": false - }, - { - "parentPluginId": "discover", - "id": "def-public.DiscoverUrlGeneratorState.query", - "type": "Object", - "tags": [], - "label": "query", - "description": [ - "\nOptionally set a query. NOTE: if given and used in conjunction with `dashboardId`, and the\nsaved dashboard has a query saved with it, this will _replace_ that query." - ], - "signature": [ - "Query", - " | undefined" - ], - "path": "src/plugins/discover/public/url_generator.ts", - "deprecated": false - }, - { - "parentPluginId": "discover", - "id": "def-public.DiscoverUrlGeneratorState.useHash", - "type": "CompoundType", - "tags": [], - "label": "useHash", - "description": [ - "\nIf not given, will use the uiSettings configuration for `storeInSessionStorage`. useHash determines\nwhether to hash the data in the url to avoid url length issues." - ], - "signature": [ - "boolean | undefined" - ], - "path": "src/plugins/discover/public/url_generator.ts", - "deprecated": false - }, - { - "parentPluginId": "discover", - "id": "def-public.DiscoverUrlGeneratorState.searchSessionId", - "type": "string", - "tags": [], - "label": "searchSessionId", - "description": [ - "\nBackground search session id" - ], - "signature": [ - "string | undefined" - ], - "path": "src/plugins/discover/public/url_generator.ts", - "deprecated": false - }, - { - "parentPluginId": "discover", - "id": "def-public.DiscoverUrlGeneratorState.columns", - "type": "Array", - "tags": [], - "label": "columns", - "description": [ - "\nColumns displayed in the table" - ], - "signature": [ - "string[] | undefined" - ], - "path": "src/plugins/discover/public/url_generator.ts", - "deprecated": false - }, - { - "parentPluginId": "discover", - "id": "def-public.DiscoverUrlGeneratorState.interval", - "type": "string", - "tags": [], - "label": "interval", - "description": [ - "\nUsed interval of the histogram" - ], - "signature": [ - "string | undefined" - ], - "path": "src/plugins/discover/public/url_generator.ts", - "deprecated": false - }, - { - "parentPluginId": "discover", - "id": "def-public.DiscoverUrlGeneratorState.sort", - "type": "Array", - "tags": [], - "label": "sort", - "description": [ - "\nArray of the used sorting [[field,direction],...]" - ], - "signature": [ - "string[][] | undefined" - ], - "path": "src/plugins/discover/public/url_generator.ts", - "deprecated": false - }, - { - "parentPluginId": "discover", - "id": "def-public.DiscoverUrlGeneratorState.savedQuery", - "type": "string", - "tags": [], - "label": "savedQuery", - "description": [ - "\nid of the used saved query" - ], - "signature": [ - "string | undefined" - ], - "path": "src/plugins/discover/public/url_generator.ts", - "deprecated": false - }, - { - "parentPluginId": "discover", - "id": "def-public.DiscoverUrlGeneratorState.viewMode", - "type": "CompoundType", - "tags": [], - "label": "viewMode", - "description": [], - "signature": [ - "VIEW_MODE", - " | undefined" - ], - "path": "src/plugins/discover/public/url_generator.ts", - "deprecated": false - }, - { - "parentPluginId": "discover", - "id": "def-public.DiscoverUrlGeneratorState.hideAggregatedPreview", - "type": "CompoundType", - "tags": [], - "label": "hideAggregatedPreview", - "description": [], - "signature": [ - "boolean | undefined" - ], - "path": "src/plugins/discover/public/url_generator.ts", - "deprecated": false - } - ], - "initialIsOpen": false - }, { "parentPluginId": "discover", "id": "def-public.ISearchEmbeddable", @@ -1329,40 +1073,6 @@ "deprecated": false, "initialIsOpen": false }, - { - "parentPluginId": "discover", - "id": "def-public.DISCOVER_APP_URL_GENERATOR", - "type": "string", - "tags": [ - "deprecated" - ], - "label": "DISCOVER_APP_URL_GENERATOR", - "description": [], - "signature": [ - "\"DISCOVER_APP_URL_GENERATOR\"" - ], - "path": "src/plugins/discover/public/url_generator.ts", - "deprecated": true, - "references": [ - { - "plugin": "dataVisualizer", - "path": "x-pack/plugins/data_visualizer/public/application/common/components/results_links/results_links.tsx" - }, - { - "plugin": "dataVisualizer", - "path": "x-pack/plugins/data_visualizer/public/application/common/components/results_links/results_links.tsx" - }, - { - "plugin": "dataVisualizer", - "path": "x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/actions_panel/actions_panel.tsx" - }, - { - "plugin": "dataVisualizer", - "path": "x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/actions_panel/actions_panel.tsx" - } - ], - "initialIsOpen": false - }, { "parentPluginId": "discover", "id": "def-public.DiscoverAppLocator", @@ -1471,42 +1181,6 @@ "path": "src/plugins/discover/public/plugin.tsx", "deprecated": false, "children": [ - { - "parentPluginId": "discover", - "id": "def-public.DiscoverStart.urlGenerator", - "type": "Object", - "tags": [ - "deprecated" - ], - "label": "urlGenerator", - "description": [], - "signature": [ - { - "pluginId": "share", - "scope": "public", - "docId": "kibSharePluginApi", - "section": "def-public.UrlGeneratorContract", - "text": "UrlGeneratorContract" - }, - "<\"DISCOVER_APP_URL_GENERATOR\"> | undefined" - ], - "path": "src/plugins/discover/public/plugin.tsx", - "deprecated": true, - "references": [ - { - "plugin": "observability", - "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/hooks/use_discover_link.tsx" - }, - { - "plugin": "osquery", - "path": "x-pack/plugins/osquery/public/packs/pack_queries_status_table.tsx" - }, - { - "plugin": "osquery", - "path": "x-pack/plugins/osquery/public/common/hooks/use_discover_link.tsx" - } - ] - }, { "parentPluginId": "discover", "id": "def-public.DiscoverStart.locator", @@ -1548,6 +1222,20 @@ "interfaces": [], "enums": [], "misc": [ + { + "parentPluginId": "discover", + "id": "def-common.APP_ID", + "type": "string", + "tags": [], + "label": "APP_ID", + "description": [], + "signature": [ + "\"discover\"" + ], + "path": "src/plugins/discover/common/index.ts", + "deprecated": false, + "initialIsOpen": false + }, { "parentPluginId": "discover", "id": "def-common.CONTEXT_DEFAULT_SIZE_SETTING", diff --git a/api_docs/discover.mdx b/api_docs/discover.mdx index 55432ba1f4b9c..5295ea65340d1 100644 --- a/api_docs/discover.mdx +++ b/api_docs/discover.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/discover title: "discover" image: https://source.unsplash.com/400x175/?github summary: API docs for the discover plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discover'] warning: 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. --- @@ -18,7 +18,7 @@ Contact [Data Discovery](https://github.com/orgs/elastic/teams/kibana-data-disco | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 93 | 0 | 65 | 7 | +| 77 | 0 | 61 | 7 | ## Client diff --git a/api_docs/discover_enhanced.mdx b/api_docs/discover_enhanced.mdx index 3f3b44e44ec55..0106c5f2b9f3f 100644 --- a/api_docs/discover_enhanced.mdx +++ b/api_docs/discover_enhanced.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/discoverEnhanced title: "discoverEnhanced" image: https://source.unsplash.com/400x175/?github summary: API docs for the discoverEnhanced plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverEnhanced'] warning: 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. --- diff --git a/api_docs/elastic_apm_synthtrace.mdx b/api_docs/elastic_apm_synthtrace.mdx index d5fdbe2cbf708..4673509bf632a 100644 --- a/api_docs/elastic_apm_synthtrace.mdx +++ b/api_docs/elastic_apm_synthtrace.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/elastic-apm-synthtrace title: "@elastic/apm-synthtrace" image: https://source.unsplash.com/400x175/?github summary: API docs for the @elastic/apm-synthtrace plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@elastic/apm-synthtrace'] warning: 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. --- diff --git a/api_docs/elastic_datemath.mdx b/api_docs/elastic_datemath.mdx index 6c3e950ece95f..d82dbbd595e47 100644 --- a/api_docs/elastic_datemath.mdx +++ b/api_docs/elastic_datemath.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/elastic-datemath title: "@elastic/datemath" image: https://source.unsplash.com/400x175/?github summary: API docs for the @elastic/datemath plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@elastic/datemath'] warning: 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. --- diff --git a/api_docs/embeddable.devdocs.json b/api_docs/embeddable.devdocs.json index 36bf7d9bf5c68..2e114a9c58a69 100644 --- a/api_docs/embeddable.devdocs.json +++ b/api_docs/embeddable.devdocs.json @@ -287,9 +287,7 @@ "label": "reportUiCounter", "description": [], "signature": [ - "((appName: string, type: ", - "UiCounterMetricType", - ", eventNames: string | string[], count?: number | undefined) => void) | undefined" + "((appName: string, type: string, eventNames: string | string[], count?: number | undefined) => void) | undefined" ], "path": "src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/add_panel_action.ts", "deprecated": false, @@ -5204,9 +5202,7 @@ "section": "def-public.NotificationsStart", "text": "NotificationsStart" }, - "; SavedObjectFinder: React.ComponentType; showCreateNewMenu?: boolean | undefined; reportUiCounter?: ((appName: string, type: ", - "UiCounterMetricType", - ", eventNames: string | string[], count?: number | undefined) => void) | undefined; theme: ", + "; SavedObjectFinder: React.ComponentType; showCreateNewMenu?: boolean | undefined; reportUiCounter?: ((appName: string, type: string, eventNames: string | string[], count?: number | undefined) => void) | undefined; theme: ", { "pluginId": "core", "scope": "public", @@ -5493,9 +5489,7 @@ "label": "reportUiCounter", "description": [], "signature": [ - "((appName: string, type: ", - "UiCounterMetricType", - ", eventNames: string | string[], count?: number | undefined) => void) | undefined" + "((appName: string, type: string, eventNames: string | string[], count?: number | undefined) => void) | undefined" ], "path": "src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/open_add_panel_flyout.tsx", "deprecated": false diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index 9280c19746734..2b941ad5280c7 100644 --- a/api_docs/embeddable.mdx +++ b/api_docs/embeddable.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/embeddable title: "embeddable" image: https://source.unsplash.com/400x175/?github summary: API docs for the embeddable plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddable'] warning: 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. --- diff --git a/api_docs/embeddable_enhanced.mdx b/api_docs/embeddable_enhanced.mdx index 354cfc6def55c..8ae2bb846b988 100644 --- a/api_docs/embeddable_enhanced.mdx +++ b/api_docs/embeddable_enhanced.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/embeddableEnhanced title: "embeddableEnhanced" image: https://source.unsplash.com/400x175/?github summary: API docs for the embeddableEnhanced plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddableEnhanced'] warning: 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. --- diff --git a/api_docs/encrypted_saved_objects.mdx b/api_docs/encrypted_saved_objects.mdx index 70e712a3db5dd..eb871c7201ce9 100644 --- a/api_docs/encrypted_saved_objects.mdx +++ b/api_docs/encrypted_saved_objects.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/encryptedSavedObjects title: "encryptedSavedObjects" image: https://source.unsplash.com/400x175/?github summary: API docs for the encryptedSavedObjects plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'encryptedSavedObjects'] warning: 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. --- diff --git a/api_docs/enterprise_search.mdx b/api_docs/enterprise_search.mdx index cce7f38777bbc..f1aafa68afd5a 100644 --- a/api_docs/enterprise_search.mdx +++ b/api_docs/enterprise_search.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/enterpriseSearch title: "enterpriseSearch" image: https://source.unsplash.com/400x175/?github summary: API docs for the enterpriseSearch plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'enterpriseSearch'] warning: 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. --- diff --git a/api_docs/es_ui_shared.mdx b/api_docs/es_ui_shared.mdx index 8e8abb63f697f..c2604395841a5 100644 --- a/api_docs/es_ui_shared.mdx +++ b/api_docs/es_ui_shared.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/esUiShared title: "esUiShared" image: https://source.unsplash.com/400x175/?github summary: API docs for the esUiShared plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esUiShared'] warning: 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. --- diff --git a/api_docs/event_log.devdocs.json b/api_docs/event_log.devdocs.json index d7c3221ead97b..aa6cf99efe5ad 100644 --- a/api_docs/event_log.devdocs.json +++ b/api_docs/event_log.devdocs.json @@ -893,7 +893,7 @@ "label": "data", "description": [], "signature": [ - "(Readonly<{ user?: Readonly<{ name?: string | undefined; } & {}> | undefined; message?: string | undefined; error?: Readonly<{ message?: string | undefined; type?: string | undefined; id?: string | undefined; code?: string | undefined; stack_trace?: string | undefined; } & {}> | undefined; tags?: string[] | undefined; kibana?: Readonly<{ alert?: Readonly<{ rule?: Readonly<{ execution?: Readonly<{ status?: string | undefined; metrics?: Readonly<{ number_of_triggered_actions?: number | undefined; total_indexing_duration_ms?: number | undefined; total_search_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; } & {}> | undefined; uuid?: string | undefined; status_order?: number | undefined; } & {}> | undefined; } & {}> | undefined; } & {}> | undefined; version?: string | undefined; saved_objects?: Readonly<{ type?: string | undefined; id?: string | undefined; rel?: string | undefined; namespace?: string | undefined; type_id?: string | undefined; } & {}>[] | undefined; alerting?: Readonly<{ status?: string | undefined; instance_id?: string | undefined; action_group_id?: string | undefined; action_subgroup?: string | undefined; } & {}> | undefined; server_uuid?: string | undefined; task?: Readonly<{ id?: string | undefined; scheduled?: string | undefined; schedule_delay?: number | undefined; } & {}> | undefined; space_ids?: string[] | undefined; } & {}> | undefined; log?: Readonly<{ logger?: string | undefined; level?: string | undefined; } & {}> | undefined; ecs?: Readonly<{ version?: string | undefined; } & {}> | undefined; rule?: Readonly<{ id?: string | undefined; description?: string | undefined; name?: string | undefined; version?: string | undefined; license?: string | undefined; category?: string | undefined; reference?: string | undefined; author?: string[] | undefined; ruleset?: string | undefined; uuid?: string | undefined; } & {}> | undefined; event?: Readonly<{ start?: string | undefined; type?: string[] | undefined; id?: string | undefined; end?: string | undefined; category?: string[] | undefined; outcome?: string | undefined; url?: string | undefined; original?: string | undefined; duration?: number | undefined; code?: string | undefined; action?: string | undefined; kind?: string | undefined; hash?: string | undefined; dataset?: string | undefined; severity?: number | undefined; created?: string | undefined; ingested?: string | undefined; module?: string | undefined; provider?: string | undefined; reason?: string | undefined; reference?: string | undefined; risk_score?: number | undefined; risk_score_norm?: number | undefined; sequence?: number | undefined; timezone?: string | undefined; } & {}> | undefined; '@timestamp'?: string | undefined; } & {}> | undefined)[]" + "(Readonly<{ user?: Readonly<{ name?: string | undefined; } & {}> | undefined; message?: string | undefined; error?: Readonly<{ message?: string | undefined; type?: string | undefined; id?: string | undefined; code?: string | undefined; stack_trace?: string | undefined; } & {}> | undefined; tags?: string[] | undefined; kibana?: Readonly<{ alert?: Readonly<{ rule?: Readonly<{ execution?: Readonly<{ status?: string | undefined; metrics?: Readonly<{ number_of_triggered_actions?: number | undefined; number_of_searches?: number | undefined; total_indexing_duration_ms?: number | undefined; es_search_duration_ms?: number | undefined; total_search_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; } & {}> | undefined; uuid?: string | undefined; status_order?: number | undefined; } & {}> | undefined; } & {}> | undefined; } & {}> | undefined; version?: string | undefined; saved_objects?: Readonly<{ type?: string | undefined; id?: string | undefined; rel?: string | undefined; namespace?: string | undefined; type_id?: string | undefined; } & {}>[] | undefined; alerting?: Readonly<{ status?: string | undefined; instance_id?: string | undefined; action_group_id?: string | undefined; action_subgroup?: string | undefined; } & {}> | undefined; server_uuid?: string | undefined; task?: Readonly<{ id?: string | undefined; scheduled?: string | undefined; schedule_delay?: number | undefined; } & {}> | undefined; space_ids?: string[] | undefined; } & {}> | undefined; log?: Readonly<{ logger?: string | undefined; level?: string | undefined; } & {}> | undefined; ecs?: Readonly<{ version?: string | undefined; } & {}> | undefined; rule?: Readonly<{ id?: string | undefined; description?: string | undefined; name?: string | undefined; version?: string | undefined; license?: string | undefined; category?: string | undefined; reference?: string | undefined; author?: string[] | undefined; ruleset?: string | undefined; uuid?: string | undefined; } & {}> | undefined; event?: Readonly<{ start?: string | undefined; type?: string[] | undefined; id?: string | undefined; end?: string | undefined; category?: string[] | undefined; outcome?: string | undefined; url?: string | undefined; original?: string | undefined; duration?: number | undefined; code?: string | undefined; action?: string | undefined; kind?: string | undefined; hash?: string | undefined; dataset?: string | undefined; severity?: number | undefined; created?: string | undefined; ingested?: string | undefined; module?: string | undefined; provider?: string | undefined; reason?: string | undefined; reference?: string | undefined; risk_score?: number | undefined; risk_score_norm?: number | undefined; sequence?: number | undefined; timezone?: string | undefined; } & {}> | undefined; '@timestamp'?: string | undefined; } & {}> | undefined)[]" ], "path": "x-pack/plugins/event_log/server/es/cluster_client_adapter.ts", "deprecated": false @@ -912,7 +912,7 @@ "label": "IEvent", "description": [], "signature": [ - "DeepPartial | undefined; message?: string | undefined; error?: Readonly<{ message?: string | undefined; type?: string | undefined; id?: string | undefined; code?: string | undefined; stack_trace?: string | undefined; } & {}> | undefined; tags?: string[] | undefined; kibana?: Readonly<{ alert?: Readonly<{ rule?: Readonly<{ execution?: Readonly<{ status?: string | undefined; metrics?: Readonly<{ number_of_triggered_actions?: number | undefined; total_indexing_duration_ms?: number | undefined; total_search_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; } & {}> | undefined; uuid?: string | undefined; status_order?: number | undefined; } & {}> | undefined; } & {}> | undefined; } & {}> | undefined; version?: string | undefined; saved_objects?: Readonly<{ type?: string | undefined; id?: string | undefined; rel?: string | undefined; namespace?: string | undefined; type_id?: string | undefined; } & {}>[] | undefined; alerting?: Readonly<{ status?: string | undefined; instance_id?: string | undefined; action_group_id?: string | undefined; action_subgroup?: string | undefined; } & {}> | undefined; server_uuid?: string | undefined; task?: Readonly<{ id?: string | undefined; scheduled?: string | undefined; schedule_delay?: number | undefined; } & {}> | undefined; space_ids?: string[] | undefined; } & {}> | undefined; log?: Readonly<{ logger?: string | undefined; level?: string | undefined; } & {}> | undefined; ecs?: Readonly<{ version?: string | undefined; } & {}> | undefined; rule?: Readonly<{ id?: string | undefined; description?: string | undefined; name?: string | undefined; version?: string | undefined; license?: string | undefined; category?: string | undefined; reference?: string | undefined; author?: string[] | undefined; ruleset?: string | undefined; uuid?: string | undefined; } & {}> | undefined; event?: Readonly<{ start?: string | undefined; type?: string[] | undefined; id?: string | undefined; end?: string | undefined; category?: string[] | undefined; outcome?: string | undefined; url?: string | undefined; original?: string | undefined; duration?: number | undefined; code?: string | undefined; action?: string | undefined; kind?: string | undefined; hash?: string | undefined; dataset?: string | undefined; severity?: number | undefined; created?: string | undefined; ingested?: string | undefined; module?: string | undefined; provider?: string | undefined; reason?: string | undefined; reference?: string | undefined; risk_score?: number | undefined; risk_score_norm?: number | undefined; sequence?: number | undefined; timezone?: string | undefined; } & {}> | undefined; '@timestamp'?: string | undefined; } & {}>>> | undefined" + "DeepPartial | undefined; message?: string | undefined; error?: Readonly<{ message?: string | undefined; type?: string | undefined; id?: string | undefined; code?: string | undefined; stack_trace?: string | undefined; } & {}> | undefined; tags?: string[] | undefined; kibana?: Readonly<{ alert?: Readonly<{ rule?: Readonly<{ execution?: Readonly<{ status?: string | undefined; metrics?: Readonly<{ number_of_triggered_actions?: number | undefined; number_of_searches?: number | undefined; total_indexing_duration_ms?: number | undefined; es_search_duration_ms?: number | undefined; total_search_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; } & {}> | undefined; uuid?: string | undefined; status_order?: number | undefined; } & {}> | undefined; } & {}> | undefined; } & {}> | undefined; version?: string | undefined; saved_objects?: Readonly<{ type?: string | undefined; id?: string | undefined; rel?: string | undefined; namespace?: string | undefined; type_id?: string | undefined; } & {}>[] | undefined; alerting?: Readonly<{ status?: string | undefined; instance_id?: string | undefined; action_group_id?: string | undefined; action_subgroup?: string | undefined; } & {}> | undefined; server_uuid?: string | undefined; task?: Readonly<{ id?: string | undefined; scheduled?: string | undefined; schedule_delay?: number | undefined; } & {}> | undefined; space_ids?: string[] | undefined; } & {}> | undefined; log?: Readonly<{ logger?: string | undefined; level?: string | undefined; } & {}> | undefined; ecs?: Readonly<{ version?: string | undefined; } & {}> | undefined; rule?: Readonly<{ id?: string | undefined; description?: string | undefined; name?: string | undefined; version?: string | undefined; license?: string | undefined; category?: string | undefined; reference?: string | undefined; author?: string[] | undefined; ruleset?: string | undefined; uuid?: string | undefined; } & {}> | undefined; event?: Readonly<{ start?: string | undefined; type?: string[] | undefined; id?: string | undefined; end?: string | undefined; category?: string[] | undefined; outcome?: string | undefined; url?: string | undefined; original?: string | undefined; duration?: number | undefined; code?: string | undefined; action?: string | undefined; kind?: string | undefined; hash?: string | undefined; dataset?: string | undefined; severity?: number | undefined; created?: string | undefined; ingested?: string | undefined; module?: string | undefined; provider?: string | undefined; reason?: string | undefined; reference?: string | undefined; risk_score?: number | undefined; risk_score_norm?: number | undefined; sequence?: number | undefined; timezone?: string | undefined; } & {}> | undefined; '@timestamp'?: string | undefined; } & {}>>> | undefined" ], "path": "x-pack/plugins/event_log/generated/schemas.ts", "deprecated": false, @@ -926,7 +926,7 @@ "label": "IValidatedEvent", "description": [], "signature": [ - "Readonly<{ user?: Readonly<{ name?: string | undefined; } & {}> | undefined; message?: string | undefined; error?: Readonly<{ message?: string | undefined; type?: string | undefined; id?: string | undefined; code?: string | undefined; stack_trace?: string | undefined; } & {}> | undefined; tags?: string[] | undefined; kibana?: Readonly<{ alert?: Readonly<{ rule?: Readonly<{ execution?: Readonly<{ status?: string | undefined; metrics?: Readonly<{ number_of_triggered_actions?: number | undefined; total_indexing_duration_ms?: number | undefined; total_search_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; } & {}> | undefined; uuid?: string | undefined; status_order?: number | undefined; } & {}> | undefined; } & {}> | undefined; } & {}> | undefined; version?: string | undefined; saved_objects?: Readonly<{ type?: string | undefined; id?: string | undefined; rel?: string | undefined; namespace?: string | undefined; type_id?: string | undefined; } & {}>[] | undefined; alerting?: Readonly<{ status?: string | undefined; instance_id?: string | undefined; action_group_id?: string | undefined; action_subgroup?: string | undefined; } & {}> | undefined; server_uuid?: string | undefined; task?: Readonly<{ id?: string | undefined; scheduled?: string | undefined; schedule_delay?: number | undefined; } & {}> | undefined; space_ids?: string[] | undefined; } & {}> | undefined; log?: Readonly<{ logger?: string | undefined; level?: string | undefined; } & {}> | undefined; ecs?: Readonly<{ version?: string | undefined; } & {}> | undefined; rule?: Readonly<{ id?: string | undefined; description?: string | undefined; name?: string | undefined; version?: string | undefined; license?: string | undefined; category?: string | undefined; reference?: string | undefined; author?: string[] | undefined; ruleset?: string | undefined; uuid?: string | undefined; } & {}> | undefined; event?: Readonly<{ start?: string | undefined; type?: string[] | undefined; id?: string | undefined; end?: string | undefined; category?: string[] | undefined; outcome?: string | undefined; url?: string | undefined; original?: string | undefined; duration?: number | undefined; code?: string | undefined; action?: string | undefined; kind?: string | undefined; hash?: string | undefined; dataset?: string | undefined; severity?: number | undefined; created?: string | undefined; ingested?: string | undefined; module?: string | undefined; provider?: string | undefined; reason?: string | undefined; reference?: string | undefined; risk_score?: number | undefined; risk_score_norm?: number | undefined; sequence?: number | undefined; timezone?: string | undefined; } & {}> | undefined; '@timestamp'?: string | undefined; } & {}> | undefined" + "Readonly<{ user?: Readonly<{ name?: string | undefined; } & {}> | undefined; message?: string | undefined; error?: Readonly<{ message?: string | undefined; type?: string | undefined; id?: string | undefined; code?: string | undefined; stack_trace?: string | undefined; } & {}> | undefined; tags?: string[] | undefined; kibana?: Readonly<{ alert?: Readonly<{ rule?: Readonly<{ execution?: Readonly<{ status?: string | undefined; metrics?: Readonly<{ number_of_triggered_actions?: number | undefined; number_of_searches?: number | undefined; total_indexing_duration_ms?: number | undefined; es_search_duration_ms?: number | undefined; total_search_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; } & {}> | undefined; uuid?: string | undefined; status_order?: number | undefined; } & {}> | undefined; } & {}> | undefined; } & {}> | undefined; version?: string | undefined; saved_objects?: Readonly<{ type?: string | undefined; id?: string | undefined; rel?: string | undefined; namespace?: string | undefined; type_id?: string | undefined; } & {}>[] | undefined; alerting?: Readonly<{ status?: string | undefined; instance_id?: string | undefined; action_group_id?: string | undefined; action_subgroup?: string | undefined; } & {}> | undefined; server_uuid?: string | undefined; task?: Readonly<{ id?: string | undefined; scheduled?: string | undefined; schedule_delay?: number | undefined; } & {}> | undefined; space_ids?: string[] | undefined; } & {}> | undefined; log?: Readonly<{ logger?: string | undefined; level?: string | undefined; } & {}> | undefined; ecs?: Readonly<{ version?: string | undefined; } & {}> | undefined; rule?: Readonly<{ id?: string | undefined; description?: string | undefined; name?: string | undefined; version?: string | undefined; license?: string | undefined; category?: string | undefined; reference?: string | undefined; author?: string[] | undefined; ruleset?: string | undefined; uuid?: string | undefined; } & {}> | undefined; event?: Readonly<{ start?: string | undefined; type?: string[] | undefined; id?: string | undefined; end?: string | undefined; category?: string[] | undefined; outcome?: string | undefined; url?: string | undefined; original?: string | undefined; duration?: number | undefined; code?: string | undefined; action?: string | undefined; kind?: string | undefined; hash?: string | undefined; dataset?: string | undefined; severity?: number | undefined; created?: string | undefined; ingested?: string | undefined; module?: string | undefined; provider?: string | undefined; reason?: string | undefined; reference?: string | undefined; risk_score?: number | undefined; risk_score_norm?: number | undefined; sequence?: number | undefined; timezone?: string | undefined; } & {}> | undefined; '@timestamp'?: string | undefined; } & {}> | undefined" ], "path": "x-pack/plugins/event_log/generated/schemas.ts", "deprecated": false, diff --git a/api_docs/event_log.mdx b/api_docs/event_log.mdx index cf9e1a8537912..1c37cdac9c679 100644 --- a/api_docs/event_log.mdx +++ b/api_docs/event_log.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/eventLog title: "eventLog" image: https://source.unsplash.com/400x175/?github summary: API docs for the eventLog plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventLog'] warning: 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. --- diff --git a/api_docs/expression_error.mdx b/api_docs/expression_error.mdx index 3771b9bde60b7..383d917b5c625 100644 --- a/api_docs/expression_error.mdx +++ b/api_docs/expression_error.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionError title: "expressionError" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionError plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionError'] warning: 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. --- diff --git a/api_docs/expression_gauge.devdocs.json b/api_docs/expression_gauge.devdocs.json index 23b99f9dfb25b..0fb3ff94df9ab 100644 --- a/api_docs/expression_gauge.devdocs.json +++ b/api_docs/expression_gauge.devdocs.json @@ -3,76 +3,6 @@ "client": { "classes": [], "functions": [ - { - "parentPluginId": "expressionGauge", - "id": "def-public.GaugeIconHorizontal", - "type": "Function", - "tags": [], - "label": "GaugeIconHorizontal", - "description": [], - "signature": [ - "({ title, titleId, ...props }: Omit<", - "EuiIconProps", - ", \"type\">) => JSX.Element" - ], - "path": "src/plugins/chart_expressions/expression_gauge/public/components/gauge_icon.tsx", - "deprecated": false, - "children": [ - { - "parentPluginId": "expressionGauge", - "id": "def-public.GaugeIconHorizontal.$1", - "type": "Object", - "tags": [], - "label": "{ title, titleId, ...props }", - "description": [], - "signature": [ - "Omit<", - "EuiIconProps", - ", \"type\">" - ], - "path": "src/plugins/chart_expressions/expression_gauge/public/components/gauge_icon.tsx", - "deprecated": false, - "isRequired": true - } - ], - "returnComment": [], - "initialIsOpen": false - }, - { - "parentPluginId": "expressionGauge", - "id": "def-public.GaugeIconVertical", - "type": "Function", - "tags": [], - "label": "GaugeIconVertical", - "description": [], - "signature": [ - "({ title, titleId, ...props }: Omit<", - "EuiIconProps", - ", \"type\">) => JSX.Element" - ], - "path": "src/plugins/chart_expressions/expression_gauge/public/components/gauge_icon.tsx", - "deprecated": false, - "children": [ - { - "parentPluginId": "expressionGauge", - "id": "def-public.GaugeIconVertical.$1", - "type": "Object", - "tags": [], - "label": "{ title, titleId, ...props }", - "description": [], - "signature": [ - "Omit<", - "EuiIconProps", - ", \"type\">" - ], - "path": "src/plugins/chart_expressions/expression_gauge/public/components/gauge_icon.tsx", - "deprecated": false, - "isRequired": true - } - ], - "returnComment": [], - "initialIsOpen": false - }, { "parentPluginId": "expressionGauge", "id": "def-public.getGoalValue", @@ -89,9 +19,17 @@ "section": "def-common.DatatableRow", "text": "DatatableRow" }, - " | undefined, state?: GaugeAccessorsType | undefined) => any" + " | undefined, accessors?: ", + { + "pluginId": "expressionGauge", + "scope": "common", + "docId": "kibExpressionGaugePluginApi", + "section": "def-common.Accessors", + "text": "Accessors" + }, + " | undefined) => any" ], - "path": "src/plugins/chart_expressions/expression_gauge/public/components/utils.ts", + "path": "src/plugins/chart_expressions/expression_gauge/public/components/utils/accessors.ts", "deprecated": false, "children": [ { @@ -111,7 +49,7 @@ }, " | undefined" ], - "path": "src/plugins/chart_expressions/expression_gauge/public/components/utils.ts", + "path": "src/plugins/chart_expressions/expression_gauge/public/components/utils/accessors.ts", "deprecated": false, "isRequired": false }, @@ -120,12 +58,19 @@ "id": "def-public.getGoalValue.$2", "type": "Object", "tags": [], - "label": "state", + "label": "accessors", "description": [], "signature": [ - "GaugeAccessorsType | undefined" + { + "pluginId": "expressionGauge", + "scope": "common", + "docId": "kibExpressionGaugePluginApi", + "section": "def-common.Accessors", + "text": "Accessors" + }, + " | undefined" ], - "path": "src/plugins/chart_expressions/expression_gauge/public/components/utils.ts", + "path": "src/plugins/chart_expressions/expression_gauge/public/components/utils/accessors.ts", "deprecated": false, "isRequired": false } @@ -149,9 +94,17 @@ "section": "def-common.DatatableRow", "text": "DatatableRow" }, - " | undefined, state?: GaugeAccessorsType | undefined) => number" + " | undefined, accessors?: ", + { + "pluginId": "expressionGauge", + "scope": "common", + "docId": "kibExpressionGaugePluginApi", + "section": "def-common.Accessors", + "text": "Accessors" + }, + " | undefined) => number" ], - "path": "src/plugins/chart_expressions/expression_gauge/public/components/utils.ts", + "path": "src/plugins/chart_expressions/expression_gauge/public/components/utils/accessors.ts", "deprecated": false, "children": [ { @@ -171,7 +124,7 @@ }, " | undefined" ], - "path": "src/plugins/chart_expressions/expression_gauge/public/components/utils.ts", + "path": "src/plugins/chart_expressions/expression_gauge/public/components/utils/accessors.ts", "deprecated": false, "isRequired": false }, @@ -180,12 +133,19 @@ "id": "def-public.getMaxValue.$2", "type": "Object", "tags": [], - "label": "state", + "label": "accessors", "description": [], "signature": [ - "GaugeAccessorsType | undefined" + { + "pluginId": "expressionGauge", + "scope": "common", + "docId": "kibExpressionGaugePluginApi", + "section": "def-common.Accessors", + "text": "Accessors" + }, + " | undefined" ], - "path": "src/plugins/chart_expressions/expression_gauge/public/components/utils.ts", + "path": "src/plugins/chart_expressions/expression_gauge/public/components/utils/accessors.ts", "deprecated": false, "isRequired": false } @@ -209,9 +169,17 @@ "section": "def-common.DatatableRow", "text": "DatatableRow" }, - " | undefined, state?: GaugeAccessorsType | undefined) => any" + " | undefined, accessors?: ", + { + "pluginId": "expressionGauge", + "scope": "common", + "docId": "kibExpressionGaugePluginApi", + "section": "def-common.Accessors", + "text": "Accessors" + }, + " | undefined) => any" ], - "path": "src/plugins/chart_expressions/expression_gauge/public/components/utils.ts", + "path": "src/plugins/chart_expressions/expression_gauge/public/components/utils/accessors.ts", "deprecated": false, "children": [ { @@ -231,7 +199,7 @@ }, " | undefined" ], - "path": "src/plugins/chart_expressions/expression_gauge/public/components/utils.ts", + "path": "src/plugins/chart_expressions/expression_gauge/public/components/utils/accessors.ts", "deprecated": false, "isRequired": false }, @@ -240,12 +208,19 @@ "id": "def-public.getMinValue.$2", "type": "Object", "tags": [], - "label": "state", + "label": "accessors", "description": [], "signature": [ - "GaugeAccessorsType | undefined" + { + "pluginId": "expressionGauge", + "scope": "common", + "docId": "kibExpressionGaugePluginApi", + "section": "def-common.Accessors", + "text": "Accessors" + }, + " | undefined" ], - "path": "src/plugins/chart_expressions/expression_gauge/public/components/utils.ts", + "path": "src/plugins/chart_expressions/expression_gauge/public/components/utils/accessors.ts", "deprecated": false, "isRequired": false } @@ -261,7 +236,7 @@ "label": "getValueFromAccessor", "description": [], "signature": [ - "(accessorName: GaugeAccessors, row?: ", + "(accessor: string, row?: ", { "pluginId": "expressions", "scope": "common", @@ -269,22 +244,22 @@ "section": "def-common.DatatableRow", "text": "DatatableRow" }, - " | undefined, state?: GaugeAccessorsType | undefined) => any" + " | undefined) => any" ], - "path": "src/plugins/chart_expressions/expression_gauge/public/components/utils.ts", + "path": "src/plugins/chart_expressions/expression_gauge/public/components/utils/accessors.ts", "deprecated": false, "children": [ { "parentPluginId": "expressionGauge", "id": "def-public.getValueFromAccessor.$1", - "type": "CompoundType", + "type": "string", "tags": [], - "label": "accessorName", + "label": "accessor", "description": [], "signature": [ - "GaugeAccessors" + "string" ], - "path": "src/plugins/chart_expressions/expression_gauge/public/components/utils.ts", + "path": "src/plugins/chart_expressions/expression_gauge/public/components/utils/accessors.ts", "deprecated": false, "isRequired": true }, @@ -305,23 +280,79 @@ }, " | undefined" ], - "path": "src/plugins/chart_expressions/expression_gauge/public/components/utils.ts", + "path": "src/plugins/chart_expressions/expression_gauge/public/components/utils/accessors.ts", "deprecated": false, "isRequired": false - }, + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "expressionGauge", + "id": "def-public.HorizontalBulletIcon", + "type": "Function", + "tags": [], + "label": "HorizontalBulletIcon", + "description": [], + "signature": [ + "({ title, titleId, ...props }: Omit<", + "EuiIconProps", + ", \"type\">) => JSX.Element" + ], + "path": "src/plugins/chart_expressions/expression_gauge/public/components/icons/horizontal_bullet_icon.tsx", + "deprecated": false, + "children": [ { "parentPluginId": "expressionGauge", - "id": "def-public.getValueFromAccessor.$3", + "id": "def-public.HorizontalBulletIcon.$1", "type": "Object", "tags": [], - "label": "state", + "label": "{ title, titleId, ...props }", "description": [], "signature": [ - "GaugeAccessorsType | undefined" + "Omit<", + "EuiIconProps", + ", \"type\">" ], - "path": "src/plugins/chart_expressions/expression_gauge/public/components/utils.ts", + "path": "src/plugins/chart_expressions/expression_gauge/public/components/icons/horizontal_bullet_icon.tsx", "deprecated": false, - "isRequired": false + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "expressionGauge", + "id": "def-public.VerticalBulletIcon", + "type": "Function", + "tags": [], + "label": "VerticalBulletIcon", + "description": [], + "signature": [ + "({ title, titleId, ...props }: Omit<", + "EuiIconProps", + ", \"type\">) => JSX.Element" + ], + "path": "src/plugins/chart_expressions/expression_gauge/public/components/icons/vertical_bullet_icon.tsx", + "deprecated": false, + "children": [ + { + "parentPluginId": "expressionGauge", + "id": "def-public.VerticalBulletIcon.$1", + "type": "Object", + "tags": [], + "label": "{ title, titleId, ...props }", + "description": [], + "signature": [ + "Omit<", + "EuiIconProps", + ", \"type\">" + ], + "path": "src/plugins/chart_expressions/expression_gauge/public/components/icons/vertical_bullet_icon.tsx", + "deprecated": false, + "isRequired": true } ], "returnComment": [], @@ -363,6 +394,71 @@ } ], "interfaces": [ + { + "parentPluginId": "expressionGauge", + "id": "def-common.Accessors", + "type": "Interface", + "tags": [], + "label": "Accessors", + "description": [], + "path": "src/plugins/chart_expressions/expression_gauge/common/types/expression_functions.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "expressionGauge", + "id": "def-common.Accessors.min", + "type": "string", + "tags": [], + "label": "min", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "src/plugins/chart_expressions/expression_gauge/common/types/expression_functions.ts", + "deprecated": false + }, + { + "parentPluginId": "expressionGauge", + "id": "def-common.Accessors.max", + "type": "string", + "tags": [], + "label": "max", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "src/plugins/chart_expressions/expression_gauge/common/types/expression_functions.ts", + "deprecated": false + }, + { + "parentPluginId": "expressionGauge", + "id": "def-common.Accessors.metric", + "type": "string", + "tags": [], + "label": "metric", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "src/plugins/chart_expressions/expression_gauge/common/types/expression_functions.ts", + "deprecated": false + }, + { + "parentPluginId": "expressionGauge", + "id": "def-common.Accessors.goal", + "type": "string", + "tags": [], + "label": "goal", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "src/plugins/chart_expressions/expression_gauge/common/types/expression_functions.ts", + "deprecated": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "expressionGauge", "id": "def-common.ColorStop", @@ -597,7 +693,17 @@ "section": "def-common.GaugeState", "text": "GaugeState" }, - " & { shape: \"horizontalBullet\" | \"verticalBullet\"; colorMode: \"palette\" | \"none\"; palette?: ", + " & { shape: ", + { + "pluginId": "expressionGauge", + "scope": "common", + "docId": "kibExpressionGaugePluginApi", + "section": "def-common.GaugeShape", + "text": "GaugeShape" + }, + "; colorMode: ", + "GaugeColorMode", + "; palette?: ", { "pluginId": "charts", "scope": "common", @@ -633,52 +739,84 @@ "children": [ { "parentPluginId": "expressionGauge", - "id": "def-common.GaugeState.metricAccessor", - "type": "string", + "id": "def-common.GaugeState.metric", + "type": "CompoundType", "tags": [], - "label": "metricAccessor", + "label": "metric", "description": [], "signature": [ - "string | undefined" + "string | ", + { + "pluginId": "visualizations", + "scope": "common", + "docId": "kibVisualizationsPluginApi", + "section": "def-common.ExpressionValueVisDimension", + "text": "ExpressionValueVisDimension" + }, + " | undefined" ], "path": "src/plugins/chart_expressions/expression_gauge/common/types/expression_functions.ts", "deprecated": false }, { "parentPluginId": "expressionGauge", - "id": "def-common.GaugeState.minAccessor", - "type": "string", + "id": "def-common.GaugeState.min", + "type": "CompoundType", "tags": [], - "label": "minAccessor", + "label": "min", "description": [], "signature": [ - "string | undefined" + "string | ", + { + "pluginId": "visualizations", + "scope": "common", + "docId": "kibVisualizationsPluginApi", + "section": "def-common.ExpressionValueVisDimension", + "text": "ExpressionValueVisDimension" + }, + " | undefined" ], "path": "src/plugins/chart_expressions/expression_gauge/common/types/expression_functions.ts", "deprecated": false }, { "parentPluginId": "expressionGauge", - "id": "def-common.GaugeState.maxAccessor", - "type": "string", + "id": "def-common.GaugeState.max", + "type": "CompoundType", "tags": [], - "label": "maxAccessor", + "label": "max", "description": [], "signature": [ - "string | undefined" + "string | ", + { + "pluginId": "visualizations", + "scope": "common", + "docId": "kibVisualizationsPluginApi", + "section": "def-common.ExpressionValueVisDimension", + "text": "ExpressionValueVisDimension" + }, + " | undefined" ], "path": "src/plugins/chart_expressions/expression_gauge/common/types/expression_functions.ts", "deprecated": false }, { "parentPluginId": "expressionGauge", - "id": "def-common.GaugeState.goalAccessor", - "type": "string", + "id": "def-common.GaugeState.goal", + "type": "CompoundType", "tags": [], - "label": "goalAccessor", + "label": "goal", "description": [], "signature": [ - "string | undefined" + "string | ", + { + "pluginId": "visualizations", + "scope": "common", + "docId": "kibVisualizationsPluginApi", + "section": "def-common.ExpressionValueVisDimension", + "text": "ExpressionValueVisDimension" + }, + " | undefined" ], "path": "src/plugins/chart_expressions/expression_gauge/common/types/expression_functions.ts", "deprecated": false @@ -691,7 +829,7 @@ "label": "ticksPosition", "description": [], "signature": [ - "\"auto\" | \"bands\"" + "\"auto\" | \"hidden\" | \"bands\"" ], "path": "src/plugins/chart_expressions/expression_gauge/common/types/expression_functions.ts", "deprecated": false @@ -735,6 +873,33 @@ "path": "src/plugins/chart_expressions/expression_gauge/common/types/expression_functions.ts", "deprecated": false }, + { + "parentPluginId": "expressionGauge", + "id": "def-common.GaugeState.centralMajorMode", + "type": "CompoundType", + "tags": [], + "label": "centralMajorMode", + "description": [], + "signature": [ + "GaugeCentralMajorMode", + " | undefined" + ], + "path": "src/plugins/chart_expressions/expression_gauge/common/types/expression_functions.ts", + "deprecated": false + }, + { + "parentPluginId": "expressionGauge", + "id": "def-common.GaugeState.centralMajor", + "type": "string", + "tags": [], + "label": "centralMajor", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "src/plugins/chart_expressions/expression_gauge/common/types/expression_functions.ts", + "deprecated": false + }, { "parentPluginId": "expressionGauge", "id": "def-common.GaugeState.colorMode", @@ -743,7 +908,8 @@ "label": "colorMode", "description": [], "signature": [ - "\"palette\" | \"none\" | undefined" + "GaugeColorMode", + " | undefined" ], "path": "src/plugins/chart_expressions/expression_gauge/common/types/expression_functions.ts", "deprecated": false @@ -784,7 +950,7 @@ "label": "shape", "description": [], "signature": [ - "\"horizontalBullet\" | \"verticalBullet\"" + "\"arc\" | \"circle\" | \"horizontalBullet\" | \"verticalBullet\"" ], "path": "src/plugins/chart_expressions/expression_gauge/common/types/expression_functions.ts", "deprecated": false @@ -892,7 +1058,17 @@ "section": "def-common.GaugeState", "text": "GaugeState" }, - " & { shape: \"horizontalBullet\" | \"verticalBullet\"; colorMode: \"palette\" | \"none\"; palette?: ", + " & { shape: ", + { + "pluginId": "expressionGauge", + "scope": "common", + "docId": "kibExpressionGaugePluginApi", + "section": "def-common.GaugeShape", + "text": "GaugeShape" + }, + "; colorMode: ", + "GaugeColorMode", + "; palette?: ", { "pluginId": "charts", "scope": "common", @@ -967,7 +1143,7 @@ "label": "GaugeShape", "description": [], "signature": [ - "\"horizontalBullet\" | \"verticalBullet\"" + "\"arc\" | \"circle\" | \"horizontalBullet\" | \"verticalBullet\"" ], "path": "src/plugins/chart_expressions/expression_gauge/common/types/expression_functions.ts", "deprecated": false, @@ -981,7 +1157,7 @@ "label": "GaugeTicksPosition", "description": [], "signature": [ - "\"auto\" | \"bands\"" + "\"auto\" | \"hidden\" | \"bands\"" ], "path": "src/plugins/chart_expressions/expression_gauge/common/types/expression_functions.ts", "deprecated": false, @@ -1055,7 +1231,7 @@ "label": "GaugeColorModes", "description": [], "signature": [ - "{ readonly palette: \"palette\"; readonly none: \"none\"; }" + "{ readonly PALETTE: \"palette\"; readonly NONE: \"none\"; }" ], "path": "src/plugins/chart_expressions/expression_gauge/common/constants.ts", "deprecated": false, @@ -1069,7 +1245,7 @@ "label": "GaugeLabelMajorModes", "description": [], "signature": [ - "{ readonly auto: \"auto\"; readonly custom: \"custom\"; readonly none: \"none\"; }" + "{ readonly AUTO: \"auto\"; readonly CUSTOM: \"custom\"; readonly NONE: \"none\"; }" ], "path": "src/plugins/chart_expressions/expression_gauge/common/constants.ts", "deprecated": false, @@ -1083,7 +1259,7 @@ "label": "GaugeShapes", "description": [], "signature": [ - "{ readonly horizontalBullet: \"horizontalBullet\"; readonly verticalBullet: \"verticalBullet\"; }" + "{ readonly HORIZONTAL_BULLET: \"horizontalBullet\"; readonly VERTICAL_BULLET: \"verticalBullet\"; readonly ARC: \"arc\"; readonly CIRCLE: \"circle\"; }" ], "path": "src/plugins/chart_expressions/expression_gauge/common/constants.ts", "deprecated": false, @@ -1097,7 +1273,7 @@ "label": "GaugeTicksPositions", "description": [], "signature": [ - "{ readonly auto: \"auto\"; readonly bands: \"bands\"; }" + "{ readonly HIDDEN: \"hidden\"; readonly AUTO: \"auto\"; readonly BANDS: \"bands\"; }" ], "path": "src/plugins/chart_expressions/expression_gauge/common/constants.ts", "deprecated": false, diff --git a/api_docs/expression_gauge.mdx b/api_docs/expression_gauge.mdx index 6696301e4bc44..2abf50d176ff3 100644 --- a/api_docs/expression_gauge.mdx +++ b/api_docs/expression_gauge.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionGauge title: "expressionGauge" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionGauge plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionGauge'] warning: 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. --- @@ -18,7 +18,7 @@ Contact [Vis Editors](https://github.com/orgs/elastic/teams/kibana-vis-editors) | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 62 | 0 | 62 | 1 | +| 68 | 0 | 68 | 3 | ## Client diff --git a/api_docs/expression_heatmap.mdx b/api_docs/expression_heatmap.mdx index fa90a715a7342..22aea3abb63e5 100644 --- a/api_docs/expression_heatmap.mdx +++ b/api_docs/expression_heatmap.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionHeatmap title: "expressionHeatmap" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionHeatmap plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionHeatmap'] warning: 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. --- diff --git a/api_docs/expression_image.mdx b/api_docs/expression_image.mdx index d673fc8e08c42..6d819ea85996c 100644 --- a/api_docs/expression_image.mdx +++ b/api_docs/expression_image.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionImage title: "expressionImage" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionImage plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionImage'] warning: 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. --- diff --git a/api_docs/expression_metric.mdx b/api_docs/expression_metric.mdx index aef334ac07f78..cec75ddec416e 100644 --- a/api_docs/expression_metric.mdx +++ b/api_docs/expression_metric.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionMetric title: "expressionMetric" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionMetric plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetric'] warning: 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. --- diff --git a/api_docs/expression_metric_vis.devdocs.json b/api_docs/expression_metric_vis.devdocs.json index 5c454d684d08d..5f3dfc7ec873f 100644 --- a/api_docs/expression_metric_vis.devdocs.json +++ b/api_docs/expression_metric_vis.devdocs.json @@ -187,6 +187,38 @@ "path": "src/plugins/chart_expressions/expression_metric/common/types/expression_functions.ts", "deprecated": false }, + { + "parentPluginId": "expressionMetricVis", + "id": "def-common.MetricArguments.labelFont", + "type": "Object", + "tags": [], + "label": "labelFont", + "description": [], + "signature": [ + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExpressionTypeStyle", + "text": "ExpressionTypeStyle" + } + ], + "path": "src/plugins/chart_expressions/expression_metric/common/types/expression_functions.ts", + "deprecated": false + }, + { + "parentPluginId": "expressionMetricVis", + "id": "def-common.MetricArguments.labelPosition", + "type": "CompoundType", + "tags": [], + "label": "labelPosition", + "description": [], + "signature": [ + "\"top\" | \"bottom\"" + ], + "path": "src/plugins/chart_expressions/expression_metric/common/types/expression_functions.ts", + "deprecated": false + }, { "parentPluginId": "expressionMetricVis", "id": "def-common.MetricArguments.metric", @@ -227,6 +259,16 @@ "path": "src/plugins/chart_expressions/expression_metric/common/types/expression_functions.ts", "deprecated": false }, + { + "parentPluginId": "expressionMetricVis", + "id": "def-common.MetricArguments.colorFullBackground", + "type": "boolean", + "tags": [], + "label": "colorFullBackground", + "description": [], + "path": "src/plugins/chart_expressions/expression_metric/common/types/expression_functions.ts", + "deprecated": false + }, { "parentPluginId": "expressionMetricVis", "id": "def-common.MetricArguments.autoScale", @@ -381,7 +423,7 @@ { "parentPluginId": "expressionMetricVis", "id": "def-common.MetricVisParam.labels", - "type": "Object", + "type": "CompoundType", "tags": [], "label": "labels", "description": [], @@ -392,7 +434,18 @@ "docId": "kibChartsPluginApi", "section": "def-common.Labels", "text": "Labels" - } + }, + " & { style: ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExpressionTypeStyle", + "text": "ExpressionTypeStyle" + }, + "; position: ", + "LabelPositionType", + "; }" ], "path": "src/plugins/chart_expressions/expression_metric/common/types/expression_renderers.ts", "deprecated": false @@ -425,6 +478,16 @@ "path": "src/plugins/chart_expressions/expression_metric/common/types/expression_renderers.ts", "deprecated": false }, + { + "parentPluginId": "expressionMetricVis", + "id": "def-common.MetricVisParam.colorFullBackground", + "type": "boolean", + "tags": [], + "label": "colorFullBackground", + "description": [], + "path": "src/plugins/chart_expressions/expression_metric/common/types/expression_renderers.ts", + "deprecated": false + }, { "parentPluginId": "expressionMetricVis", "id": "def-common.MetricVisParam.autoScale", diff --git a/api_docs/expression_metric_vis.mdx b/api_docs/expression_metric_vis.mdx index 5bee79dab1d4c..beafb155508eb 100644 --- a/api_docs/expression_metric_vis.mdx +++ b/api_docs/expression_metric_vis.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionMetricVis title: "expressionMetricVis" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionMetricVis plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetricVis'] warning: 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. --- @@ -18,7 +18,7 @@ Contact [Vis Editors](https://github.com/orgs/elastic/teams/kibana-vis-editors) | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 42 | 0 | 42 | 0 | +| 46 | 0 | 46 | 1 | ## Common diff --git a/api_docs/expression_partition_vis.mdx b/api_docs/expression_partition_vis.mdx index c3dde75d963c9..ed9ab01670968 100644 --- a/api_docs/expression_partition_vis.mdx +++ b/api_docs/expression_partition_vis.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionPartitionVis title: "expressionPartitionVis" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionPartitionVis plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionPartitionVis'] warning: 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. --- diff --git a/api_docs/expression_repeat_image.mdx b/api_docs/expression_repeat_image.mdx index 4a60852a160e4..1ae5326e8e5e9 100644 --- a/api_docs/expression_repeat_image.mdx +++ b/api_docs/expression_repeat_image.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionRepeatImage title: "expressionRepeatImage" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionRepeatImage plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRepeatImage'] warning: 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. --- diff --git a/api_docs/expression_reveal_image.mdx b/api_docs/expression_reveal_image.mdx index 23a1e311b2c80..73eecd5468cac 100644 --- a/api_docs/expression_reveal_image.mdx +++ b/api_docs/expression_reveal_image.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionRevealImage title: "expressionRevealImage" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionRevealImage plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRevealImage'] warning: 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. --- diff --git a/api_docs/expression_shape.mdx b/api_docs/expression_shape.mdx index 169c7141854e7..069299b8cd10f 100644 --- a/api_docs/expression_shape.mdx +++ b/api_docs/expression_shape.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionShape title: "expressionShape" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionShape plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionShape'] warning: 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. --- diff --git a/api_docs/expression_tagcloud.mdx b/api_docs/expression_tagcloud.mdx index 35cc2b1b3a219..aa8f68f33cd96 100644 --- a/api_docs/expression_tagcloud.mdx +++ b/api_docs/expression_tagcloud.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionTagcloud title: "expressionTagcloud" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionTagcloud plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionTagcloud'] warning: 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. --- diff --git a/api_docs/expressions.mdx b/api_docs/expressions.mdx index b82d123b6e7c0..e0d1d8f1d4f41 100644 --- a/api_docs/expressions.mdx +++ b/api_docs/expressions.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressions title: "expressions" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressions plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressions'] warning: 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. --- diff --git a/api_docs/features.mdx b/api_docs/features.mdx index 51d7619c38d44..e10a65e82387f 100644 --- a/api_docs/features.mdx +++ b/api_docs/features.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/features title: "features" image: https://source.unsplash.com/400x175/?github summary: API docs for the features plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'features'] warning: 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. --- diff --git a/api_docs/field_formats.mdx b/api_docs/field_formats.mdx index a3c9f8b458d77..81dcab018752d 100644 --- a/api_docs/field_formats.mdx +++ b/api_docs/field_formats.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/fieldFormats title: "fieldFormats" image: https://source.unsplash.com/400x175/?github summary: API docs for the fieldFormats plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldFormats'] warning: 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. --- diff --git a/api_docs/file_upload.mdx b/api_docs/file_upload.mdx index d0162f67adf48..74161484515c0 100644 --- a/api_docs/file_upload.mdx +++ b/api_docs/file_upload.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/fileUpload title: "fileUpload" image: https://source.unsplash.com/400x175/?github summary: API docs for the fileUpload plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fileUpload'] warning: 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. --- diff --git a/api_docs/fleet.devdocs.json b/api_docs/fleet.devdocs.json index 42124757b9882..d76f39a27491d 100644 --- a/api_docs/fleet.devdocs.json +++ b/api_docs/fleet.devdocs.json @@ -2055,6 +2055,40 @@ ], "returnComment": [] }, + { + "parentPluginId": "fleet", + "id": "def-public.pagePathGetters.integration_policy_upgrade", + "type": "Function", + "tags": [], + "label": "integration_policy_upgrade", + "description": [ + "// Upgrades happen on the same edit form, just with a flag set. Separate page record here\n// allows us to set different breadcrumbds for upgrades when needed." + ], + "signature": [ + "({ packagePolicyId }: ", + "DynamicPagePathValues", + ") => [string, string]" + ], + "path": "x-pack/plugins/fleet/public/constants/page_paths.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "fleet", + "id": "def-public.pagePathGetters.integration_policy_upgrade.$1", + "type": "Object", + "tags": [], + "label": "{ packagePolicyId }", + "description": [], + "signature": [ + "DynamicPagePathValues" + ], + "path": "x-pack/plugins/fleet/public/constants/page_paths.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, { "parentPluginId": "fleet", "id": "def-public.pagePathGetters.policies", @@ -4907,25 +4941,6 @@ "path": "x-pack/plugins/fleet/server/plugin.ts", "deprecated": false, "children": [ - { - "parentPluginId": "fleet", - "id": "def-server.FleetSetupDeps.licensing", - "type": "Object", - "tags": [], - "label": "licensing", - "description": [], - "signature": [ - { - "pluginId": "licensing", - "scope": "server", - "docId": "kibLicensingPluginApi", - "section": "def-server.LicensingPluginSetup", - "text": "LicensingPluginSetup" - } - ], - "path": "x-pack/plugins/fleet/server/plugin.ts", - "deprecated": false - }, { "parentPluginId": "fleet", "id": "def-server.FleetSetupDeps.security", @@ -5199,25 +5214,1787 @@ "pluginId": "fleet", "scope": "common", "docId": "kibFleetPluginApi", - "section": "def-common.RegistrySearchResult", - "text": "RegistrySearchResult" + "section": "def-common.RegistryPackage", + "text": "RegistryPackage" + }, + " | ", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.BundledPackage", + "text": "BundledPackage" + }, + ">" + ], + "path": "x-pack/plugins/fleet/server/services/epm/package_service.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "fleet", + "id": "def-server.PackageClient.fetchFindLatestPackage.$1", + "type": "string", + "tags": [], + "label": "packageName", + "description": [], + "signature": [ + "string" + ], + "path": "x-pack/plugins/fleet/server/services/epm/package_service.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackageClient.getRegistryPackage", + "type": "Function", + "tags": [], + "label": "getRegistryPackage", + "description": [], + "signature": [ + "(packageName: string, packageVersion: string) => Promise<{ packageInfo: ", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.RegistryPackage", + "text": "RegistryPackage" + }, + "; paths: string[]; }>" + ], + "path": "x-pack/plugins/fleet/server/services/epm/package_service.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "fleet", + "id": "def-server.PackageClient.getRegistryPackage.$1", + "type": "string", + "tags": [], + "label": "packageName", + "description": [], + "signature": [ + "string" + ], + "path": "x-pack/plugins/fleet/server/services/epm/package_service.ts", + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackageClient.getRegistryPackage.$2", + "type": "string", + "tags": [], + "label": "packageVersion", + "description": [], + "signature": [ + "string" + ], + "path": "x-pack/plugins/fleet/server/services/epm/package_service.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackageClient.reinstallEsAssets", + "type": "Function", + "tags": [], + "label": "reinstallEsAssets", + "description": [], + "signature": [ + "(packageInfo: ", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.InstallablePackage", + "text": "InstallablePackage" + }, + ", assetPaths: string[]) => Promise<", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.EsAssetReference", + "text": "EsAssetReference" + }, + "[]>" + ], + "path": "x-pack/plugins/fleet/server/services/epm/package_service.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "fleet", + "id": "def-server.PackageClient.reinstallEsAssets.$1", + "type": "CompoundType", + "tags": [], + "label": "packageInfo", + "description": [], + "signature": [ + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.InstallablePackage", + "text": "InstallablePackage" + } + ], + "path": "x-pack/plugins/fleet/server/services/epm/package_service.ts", + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackageClient.reinstallEsAssets.$2", + "type": "Array", + "tags": [], + "label": "assetPaths", + "description": [], + "signature": [ + "string[]" + ], + "path": "x-pack/plugins/fleet/server/services/epm/package_service.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface", + "type": "Interface", + "tags": [], + "label": "PackagePolicyServiceInterface", + "description": [], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.create", + "type": "Function", + "tags": [], + "label": "create", + "description": [], + "signature": [ + "(soClient: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsClientContract", + "text": "SavedObjectsClientContract" + }, + ", esClient: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCorePluginApi", + "section": "def-server.ElasticsearchClient", + "text": "ElasticsearchClient" + }, + ", packagePolicy: ", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.NewPackagePolicy", + "text": "NewPackagePolicy" + }, + ", options?: { spaceId?: string | undefined; id?: string | undefined; user?: ", + { + "pluginId": "security", + "scope": "common", + "docId": "kibSecurityPluginApi", + "section": "def-common.AuthenticatedUser", + "text": "AuthenticatedUser" + }, + " | undefined; bumpRevision?: boolean | undefined; force?: boolean | undefined; skipEnsureInstalled?: boolean | undefined; skipUniqueNameVerification?: boolean | undefined; overwrite?: boolean | undefined; } | undefined) => Promise<", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.PackagePolicy", + "text": "PackagePolicy" + }, + ">" + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.create.$1", + "type": "Object", + "tags": [], + "label": "soClient", + "description": [], + "signature": [ + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsClientContract", + "text": "SavedObjectsClientContract" + } + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.create.$2", + "type": "Object", + "tags": [], + "label": "esClient", + "description": [], + "signature": [ + { + "pluginId": "core", + "scope": "server", + "docId": "kibCorePluginApi", + "section": "def-server.ElasticsearchClient", + "text": "ElasticsearchClient" + } + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.create.$3", + "type": "Object", + "tags": [], + "label": "packagePolicy", + "description": [], + "signature": [ + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.NewPackagePolicy", + "text": "NewPackagePolicy" + } + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.create.$4", + "type": "Object", + "tags": [], + "label": "options", + "description": [], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.create.$4.spaceId", + "type": "string", + "tags": [], + "label": "spaceId", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.create.$4.id", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.create.$4.user", + "type": "Object", + "tags": [], + "label": "user", + "description": [], + "signature": [ + { + "pluginId": "security", + "scope": "common", + "docId": "kibSecurityPluginApi", + "section": "def-common.AuthenticatedUser", + "text": "AuthenticatedUser" + }, + " | undefined" + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.create.$4.bumpRevision", + "type": "CompoundType", + "tags": [], + "label": "bumpRevision", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.create.$4.force", + "type": "CompoundType", + "tags": [], + "label": "force", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.create.$4.skipEnsureInstalled", + "type": "CompoundType", + "tags": [], + "label": "skipEnsureInstalled", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.create.$4.skipUniqueNameVerification", + "type": "CompoundType", + "tags": [], + "label": "skipUniqueNameVerification", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.create.$4.overwrite", + "type": "CompoundType", + "tags": [], + "label": "overwrite", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false + } + ] + } + ], + "returnComment": [] + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.bulkCreate", + "type": "Function", + "tags": [], + "label": "bulkCreate", + "description": [], + "signature": [ + "(soClient: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsClientContract", + "text": "SavedObjectsClientContract" + }, + ", esClient: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCorePluginApi", + "section": "def-server.ElasticsearchClient", + "text": "ElasticsearchClient" + }, + ", packagePolicies: ", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.NewPackagePolicy", + "text": "NewPackagePolicy" + }, + "[], agentPolicyId: string, options?: { user?: ", + { + "pluginId": "security", + "scope": "common", + "docId": "kibSecurityPluginApi", + "section": "def-common.AuthenticatedUser", + "text": "AuthenticatedUser" + }, + " | undefined; bumpRevision?: boolean | undefined; } | undefined) => Promise<", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.PackagePolicy", + "text": "PackagePolicy" + }, + "[]>" + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.bulkCreate.$1", + "type": "Object", + "tags": [], + "label": "soClient", + "description": [], + "signature": [ + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsClientContract", + "text": "SavedObjectsClientContract" + } + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.bulkCreate.$2", + "type": "Object", + "tags": [], + "label": "esClient", + "description": [], + "signature": [ + { + "pluginId": "core", + "scope": "server", + "docId": "kibCorePluginApi", + "section": "def-server.ElasticsearchClient", + "text": "ElasticsearchClient" + } + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.bulkCreate.$3", + "type": "Array", + "tags": [], + "label": "packagePolicies", + "description": [], + "signature": [ + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.NewPackagePolicy", + "text": "NewPackagePolicy" + }, + "[]" + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.bulkCreate.$4", + "type": "string", + "tags": [], + "label": "agentPolicyId", + "description": [], + "signature": [ + "string" + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.bulkCreate.$5", + "type": "Object", + "tags": [], + "label": "options", + "description": [], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.bulkCreate.$5.user", + "type": "Object", + "tags": [], + "label": "user", + "description": [], + "signature": [ + { + "pluginId": "security", + "scope": "common", + "docId": "kibSecurityPluginApi", + "section": "def-common.AuthenticatedUser", + "text": "AuthenticatedUser" + }, + " | undefined" + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.bulkCreate.$5.bumpRevision", + "type": "CompoundType", + "tags": [], + "label": "bumpRevision", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false + } + ] + } + ], + "returnComment": [] + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.get", + "type": "Function", + "tags": [], + "label": "get", + "description": [], + "signature": [ + "(soClient: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsClientContract", + "text": "SavedObjectsClientContract" + }, + ", id: string) => Promise<", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.PackagePolicy", + "text": "PackagePolicy" + }, + " | null>" + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.get.$1", + "type": "Object", + "tags": [], + "label": "soClient", + "description": [], + "signature": [ + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsClientContract", + "text": "SavedObjectsClientContract" + } + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.get.$2", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "signature": [ + "string" + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.getByIDs", + "type": "Function", + "tags": [], + "label": "getByIDs", + "description": [], + "signature": [ + "(soClient: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsClientContract", + "text": "SavedObjectsClientContract" + }, + ", ids: string[]) => Promise<", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.PackagePolicy", + "text": "PackagePolicy" + }, + "[] | null>" + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.getByIDs.$1", + "type": "Object", + "tags": [], + "label": "soClient", + "description": [], + "signature": [ + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsClientContract", + "text": "SavedObjectsClientContract" + } + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.getByIDs.$2", + "type": "Array", + "tags": [], + "label": "ids", + "description": [], + "signature": [ + "string[]" + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.list", + "type": "Function", + "tags": [], + "label": "list", + "description": [], + "signature": [ + "(soClient: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsClientContract", + "text": "SavedObjectsClientContract" + }, + ", options: ", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.ListWithKuery", + "text": "ListWithKuery" + }, + ") => Promise<", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.ListResult", + "text": "ListResult" + }, + "<", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.PackagePolicy", + "text": "PackagePolicy" + }, + ">>" + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.list.$1", + "type": "Object", + "tags": [], + "label": "soClient", + "description": [], + "signature": [ + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsClientContract", + "text": "SavedObjectsClientContract" + } + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.list.$2", + "type": "Object", + "tags": [], + "label": "options", + "description": [], + "signature": [ + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.ListWithKuery", + "text": "ListWithKuery" + } + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.listIds", + "type": "Function", + "tags": [], + "label": "listIds", + "description": [], + "signature": [ + "(soClient: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsClientContract", + "text": "SavedObjectsClientContract" + }, + ", options: ", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.ListWithKuery", + "text": "ListWithKuery" + }, + ") => Promise<", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.ListResult", + "text": "ListResult" + }, + ">" + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.listIds.$1", + "type": "Object", + "tags": [], + "label": "soClient", + "description": [], + "signature": [ + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsClientContract", + "text": "SavedObjectsClientContract" + } + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.listIds.$2", + "type": "Object", + "tags": [], + "label": "options", + "description": [], + "signature": [ + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.ListWithKuery", + "text": "ListWithKuery" + } + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.update", + "type": "Function", + "tags": [], + "label": "update", + "description": [], + "signature": [ + "(soClient: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsClientContract", + "text": "SavedObjectsClientContract" + }, + ", esClient: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCorePluginApi", + "section": "def-server.ElasticsearchClient", + "text": "ElasticsearchClient" + }, + ", id: string, packagePolicyUpdate: ", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.UpdatePackagePolicy", + "text": "UpdatePackagePolicy" + }, + ", options?: { user?: ", + { + "pluginId": "security", + "scope": "common", + "docId": "kibSecurityPluginApi", + "section": "def-common.AuthenticatedUser", + "text": "AuthenticatedUser" + }, + " | undefined; } | undefined, currentVersion?: string | undefined) => Promise<", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.PackagePolicy", + "text": "PackagePolicy" + }, + ">" + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.update.$1", + "type": "Object", + "tags": [], + "label": "soClient", + "description": [], + "signature": [ + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsClientContract", + "text": "SavedObjectsClientContract" + } + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.update.$2", + "type": "Object", + "tags": [], + "label": "esClient", + "description": [], + "signature": [ + { + "pluginId": "core", + "scope": "server", + "docId": "kibCorePluginApi", + "section": "def-server.ElasticsearchClient", + "text": "ElasticsearchClient" + } + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.update.$3", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "signature": [ + "string" + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.update.$4", + "type": "Object", + "tags": [], + "label": "packagePolicyUpdate", + "description": [], + "signature": [ + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.UpdatePackagePolicy", + "text": "UpdatePackagePolicy" + } + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.update.$5", + "type": "Object", + "tags": [], + "label": "options", + "description": [], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.update.$5.user", + "type": "Object", + "tags": [], + "label": "user", + "description": [], + "signature": [ + { + "pluginId": "security", + "scope": "common", + "docId": "kibSecurityPluginApi", + "section": "def-common.AuthenticatedUser", + "text": "AuthenticatedUser" + }, + " | undefined" + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false + } + ] + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.update.$6", + "type": "string", + "tags": [], + "label": "currentVersion", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "isRequired": false + } + ], + "returnComment": [] + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.delete", + "type": "Function", + "tags": [], + "label": "delete", + "description": [], + "signature": [ + "(soClient: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsClientContract", + "text": "SavedObjectsClientContract" + }, + ", esClient: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCorePluginApi", + "section": "def-server.ElasticsearchClient", + "text": "ElasticsearchClient" + }, + ", ids: string[], options?: { user?: ", + { + "pluginId": "security", + "scope": "common", + "docId": "kibSecurityPluginApi", + "section": "def-common.AuthenticatedUser", + "text": "AuthenticatedUser" + }, + " | undefined; skipUnassignFromAgentPolicies?: boolean | undefined; force?: boolean | undefined; } | undefined) => Promise<", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.DeletePackagePoliciesResponse", + "text": "DeletePackagePoliciesResponse" + }, + ">" + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.delete.$1", + "type": "Object", + "tags": [], + "label": "soClient", + "description": [], + "signature": [ + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsClientContract", + "text": "SavedObjectsClientContract" + } + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.delete.$2", + "type": "Object", + "tags": [], + "label": "esClient", + "description": [], + "signature": [ + { + "pluginId": "core", + "scope": "server", + "docId": "kibCorePluginApi", + "section": "def-server.ElasticsearchClient", + "text": "ElasticsearchClient" + } + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.delete.$3", + "type": "Array", + "tags": [], + "label": "ids", + "description": [], + "signature": [ + "string[]" + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.delete.$4", + "type": "Object", + "tags": [], + "label": "options", + "description": [], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.delete.$4.user", + "type": "Object", + "tags": [], + "label": "user", + "description": [], + "signature": [ + { + "pluginId": "security", + "scope": "common", + "docId": "kibSecurityPluginApi", + "section": "def-common.AuthenticatedUser", + "text": "AuthenticatedUser" + }, + " | undefined" + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.delete.$4.skipUnassignFromAgentPolicies", + "type": "CompoundType", + "tags": [], + "label": "skipUnassignFromAgentPolicies", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.delete.$4.force", + "type": "CompoundType", + "tags": [], + "label": "force", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false + } + ] + } + ], + "returnComment": [] + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.upgrade", + "type": "Function", + "tags": [], + "label": "upgrade", + "description": [], + "signature": [ + "(soClient: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsClientContract", + "text": "SavedObjectsClientContract" + }, + ", esClient: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCorePluginApi", + "section": "def-server.ElasticsearchClient", + "text": "ElasticsearchClient" + }, + ", ids: string[], options?: { user?: ", + { + "pluginId": "security", + "scope": "common", + "docId": "kibSecurityPluginApi", + "section": "def-common.AuthenticatedUser", + "text": "AuthenticatedUser" + }, + " | undefined; } | undefined, packagePolicy?: ", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.PackagePolicy", + "text": "PackagePolicy" + }, + " | undefined, pkgVersion?: string | undefined) => Promise<", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.UpgradePackagePolicyResponse", + "text": "UpgradePackagePolicyResponse" + }, + ">" + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.upgrade.$1", + "type": "Object", + "tags": [], + "label": "soClient", + "description": [], + "signature": [ + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsClientContract", + "text": "SavedObjectsClientContract" + } + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.upgrade.$2", + "type": "Object", + "tags": [], + "label": "esClient", + "description": [], + "signature": [ + { + "pluginId": "core", + "scope": "server", + "docId": "kibCorePluginApi", + "section": "def-server.ElasticsearchClient", + "text": "ElasticsearchClient" + } + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.upgrade.$3", + "type": "Array", + "tags": [], + "label": "ids", + "description": [], + "signature": [ + "string[]" + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.upgrade.$4", + "type": "Object", + "tags": [], + "label": "options", + "description": [], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.upgrade.$4.user", + "type": "Object", + "tags": [], + "label": "user", + "description": [], + "signature": [ + { + "pluginId": "security", + "scope": "common", + "docId": "kibSecurityPluginApi", + "section": "def-common.AuthenticatedUser", + "text": "AuthenticatedUser" + }, + " | undefined" + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false + } + ] + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.upgrade.$5", + "type": "Object", + "tags": [], + "label": "packagePolicy", + "description": [], + "signature": [ + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.PackagePolicy", + "text": "PackagePolicy" + }, + " | undefined" + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "isRequired": false + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.upgrade.$6", + "type": "string", + "tags": [], + "label": "pkgVersion", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "isRequired": false + } + ], + "returnComment": [] + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.getUpgradeDryRunDiff", + "type": "Function", + "tags": [], + "label": "getUpgradeDryRunDiff", + "description": [], + "signature": [ + "(soClient: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsClientContract", + "text": "SavedObjectsClientContract" + }, + ", id: string, packagePolicy?: ", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.PackagePolicy", + "text": "PackagePolicy" + }, + " | undefined, pkgVersion?: string | undefined) => Promise<", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.UpgradePackagePolicyDryRunResponseItem", + "text": "UpgradePackagePolicyDryRunResponseItem" + }, + ">" + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.getUpgradeDryRunDiff.$1", + "type": "Object", + "tags": [], + "label": "soClient", + "description": [], + "signature": [ + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsClientContract", + "text": "SavedObjectsClientContract" + } + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.getUpgradeDryRunDiff.$2", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "signature": [ + "string" + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.getUpgradeDryRunDiff.$3", + "type": "Object", + "tags": [], + "label": "packagePolicy", + "description": [], + "signature": [ + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.PackagePolicy", + "text": "PackagePolicy" + }, + " | undefined" + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "isRequired": false + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.getUpgradeDryRunDiff.$4", + "type": "string", + "tags": [], + "label": "pkgVersion", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "isRequired": false + } + ], + "returnComment": [] + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.enrichPolicyWithDefaultsFromPackage", + "type": "Function", + "tags": [], + "label": "enrichPolicyWithDefaultsFromPackage", + "description": [], + "signature": [ + "(soClient: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsClientContract", + "text": "SavedObjectsClientContract" + }, + ", newPolicy: ", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.NewPackagePolicy", + "text": "NewPackagePolicy" + }, + ") => Promise<", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.NewPackagePolicy", + "text": "NewPackagePolicy" + }, + ">" + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.enrichPolicyWithDefaultsFromPackage.$1", + "type": "Object", + "tags": [], + "label": "soClient", + "description": [], + "signature": [ + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsClientContract", + "text": "SavedObjectsClientContract" + } + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.enrichPolicyWithDefaultsFromPackage.$2", + "type": "Object", + "tags": [], + "label": "newPolicy", + "description": [], + "signature": [ + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.NewPackagePolicy", + "text": "NewPackagePolicy" + } + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.buildPackagePolicyFromPackage", + "type": "Function", + "tags": [], + "label": "buildPackagePolicyFromPackage", + "description": [], + "signature": [ + "(soClient: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsClientContract", + "text": "SavedObjectsClientContract" + }, + ", pkgName: string) => Promise<", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.NewPackagePolicy", + "text": "NewPackagePolicy" + }, + " | undefined>" + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.buildPackagePolicyFromPackage.$1", + "type": "Object", + "tags": [], + "label": "soClient", + "description": [], + "signature": [ + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsClientContract", + "text": "SavedObjectsClientContract" + } + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.buildPackagePolicyFromPackage.$2", + "type": "string", + "tags": [], + "label": "pkgName", + "description": [], + "signature": [ + "string" + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.runExternalCallbacks", + "type": "Function", + "tags": [], + "label": "runExternalCallbacks", + "description": [], + "signature": [ + "(externalCallbackType: A, packagePolicy: A extends \"postPackagePolicyDelete\" ? ", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.DeletePackagePoliciesResponse", + "text": "DeletePackagePoliciesResponse" + }, + " : ", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.NewPackagePolicy", + "text": "NewPackagePolicy" + }, + ", context: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCorePluginApi", + "section": "def-server.RequestHandlerContext", + "text": "RequestHandlerContext" + }, + ", request: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreHttpPluginApi", + "section": "def-server.KibanaRequest", + "text": "KibanaRequest" + }, + ") => Promise" ], - "path": "x-pack/plugins/fleet/server/services/epm/package_service.ts", + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", "deprecated": false, "children": [ { "parentPluginId": "fleet", - "id": "def-server.PackageClient.fetchFindLatestPackage.$1", - "type": "string", + "id": "def-server.PackagePolicyServiceInterface.runExternalCallbacks.$1", + "type": "Uncategorized", "tags": [], - "label": "packageName", + "label": "externalCallbackType", "description": [], "signature": [ - "string" + "A" ], - "path": "x-pack/plugins/fleet/server/services/epm/package_service.ts", + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.runExternalCallbacks.$2", + "type": "Uncategorized", + "tags": [], + "label": "packagePolicy", + "description": [], + "signature": [ + "A extends \"postPackagePolicyDelete\" ? ", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.DeletePackagePoliciesResponse", + "text": "DeletePackagePoliciesResponse" + }, + " : ", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.NewPackagePolicy", + "text": "NewPackagePolicy" + } + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.runExternalCallbacks.$3", + "type": "Object", + "tags": [], + "label": "context", + "description": [], + "signature": [ + { + "pluginId": "core", + "scope": "server", + "docId": "kibCorePluginApi", + "section": "def-server.RequestHandlerContext", + "text": "RequestHandlerContext" + } + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyServiceInterface.runExternalCallbacks.$4", + "type": "Object", + "tags": [], + "label": "request", + "description": [], + "signature": [ + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreHttpPluginApi", + "section": "def-server.KibanaRequest", + "text": "KibanaRequest" + }, + "" + ], + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", "deprecated": false, "isRequired": true } @@ -5226,50 +7003,42 @@ }, { "parentPluginId": "fleet", - "id": "def-server.PackageClient.getRegistryPackage", + "id": "def-server.PackagePolicyServiceInterface.runDeleteExternalCallbacks", "type": "Function", "tags": [], - "label": "getRegistryPackage", + "label": "runDeleteExternalCallbacks", "description": [], "signature": [ - "(packageName: string, packageVersion: string) => Promise<{ packageInfo: ", + "(deletedPackagePolicies: ", { "pluginId": "fleet", "scope": "common", "docId": "kibFleetPluginApi", - "section": "def-common.RegistryPackage", - "text": "RegistryPackage" + "section": "def-common.DeletePackagePoliciesResponse", + "text": "DeletePackagePoliciesResponse" }, - "; paths: string[]; }>" + ") => Promise" ], - "path": "x-pack/plugins/fleet/server/services/epm/package_service.ts", + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", "deprecated": false, "children": [ { "parentPluginId": "fleet", - "id": "def-server.PackageClient.getRegistryPackage.$1", - "type": "string", - "tags": [], - "label": "packageName", - "description": [], - "signature": [ - "string" - ], - "path": "x-pack/plugins/fleet/server/services/epm/package_service.ts", - "deprecated": false, - "isRequired": true - }, - { - "parentPluginId": "fleet", - "id": "def-server.PackageClient.getRegistryPackage.$2", - "type": "string", + "id": "def-server.PackagePolicyServiceInterface.runDeleteExternalCallbacks.$1", + "type": "Array", "tags": [], - "label": "packageVersion", + "label": "deletedPackagePolicies", "description": [], "signature": [ - "string" + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.DeletePackagePoliciesResponse", + "text": "DeletePackagePoliciesResponse" + } ], - "path": "x-pack/plugins/fleet/server/services/epm/package_service.ts", + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", "deprecated": false, "isRequired": true } @@ -5278,64 +7047,72 @@ }, { "parentPluginId": "fleet", - "id": "def-server.PackageClient.reinstallEsAssets", + "id": "def-server.PackagePolicyServiceInterface.getUpgradePackagePolicyInfo", "type": "Function", "tags": [], - "label": "reinstallEsAssets", + "label": "getUpgradePackagePolicyInfo", "description": [], "signature": [ - "(packageInfo: ", + "(soClient: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsClientContract", + "text": "SavedObjectsClientContract" + }, + ", id: string) => Promise<{ packagePolicy: ", { "pluginId": "fleet", "scope": "common", "docId": "kibFleetPluginApi", - "section": "def-common.InstallablePackage", - "text": "InstallablePackage" + "section": "def-common.PackagePolicy", + "text": "PackagePolicy" }, - ", assetPaths: string[]) => Promise<", + "; packageInfo: ", { "pluginId": "fleet", "scope": "common", "docId": "kibFleetPluginApi", - "section": "def-common.EsAssetReference", - "text": "EsAssetReference" + "section": "def-common.PackageInfo", + "text": "PackageInfo" }, - "[]>" + "; }>" ], - "path": "x-pack/plugins/fleet/server/services/epm/package_service.ts", + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", "deprecated": false, "children": [ { "parentPluginId": "fleet", - "id": "def-server.PackageClient.reinstallEsAssets.$1", - "type": "CompoundType", + "id": "def-server.PackagePolicyServiceInterface.getUpgradePackagePolicyInfo.$1", + "type": "Object", "tags": [], - "label": "packageInfo", + "label": "soClient", "description": [], "signature": [ { - "pluginId": "fleet", - "scope": "common", - "docId": "kibFleetPluginApi", - "section": "def-common.InstallablePackage", - "text": "InstallablePackage" + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsClientContract", + "text": "SavedObjectsClientContract" } ], - "path": "x-pack/plugins/fleet/server/services/epm/package_service.ts", + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", "deprecated": false, "isRequired": true }, { "parentPluginId": "fleet", - "id": "def-server.PackageClient.reinstallEsAssets.$2", - "type": "Array", + "id": "def-server.PackagePolicyServiceInterface.getUpgradePackagePolicyInfo.$2", + "type": "string", "tags": [], - "label": "assetPaths", + "label": "id", "description": [], "signature": [ - "string[]" + "string" ], - "path": "x-pack/plugins/fleet/server/services/epm/package_service.ts", + "path": "x-pack/plugins/fleet/server/services/package_policy.ts", "deprecated": false, "isRequired": true } @@ -5480,20 +7257,6 @@ "deprecated": false, "initialIsOpen": false }, - { - "parentPluginId": "fleet", - "id": "def-server.PackagePolicyServiceInterface", - "type": "Type", - "tags": [], - "label": "PackagePolicyServiceInterface", - "description": [], - "signature": [ - "PackagePolicyService" - ], - "path": "x-pack/plugins/fleet/server/services/package_policy.ts", - "deprecated": false, - "initialIsOpen": false - }, { "parentPluginId": "fleet", "id": "def-server.PostPackagePolicyCreateCallback", @@ -5899,7 +7662,13 @@ "\nServices for Fleet's package policies" ], "signature": [ - "PackagePolicyService" + { + "pluginId": "fleet", + "scope": "server", + "docId": "kibFleetPluginApi", + "section": "def-server.PackagePolicyServiceInterface", + "text": "PackagePolicyServiceInterface" + } ], "path": "x-pack/plugins/fleet/server/plugin.ts", "deprecated": false @@ -8239,6 +10008,52 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "fleet", + "id": "def-common.BundledPackage", + "type": "Interface", + "tags": [], + "label": "BundledPackage", + "description": [], + "path": "x-pack/plugins/fleet/common/types/models/epm.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "fleet", + "id": "def-common.BundledPackage.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "x-pack/plugins/fleet/common/types/models/epm.ts", + "deprecated": false + }, + { + "parentPluginId": "fleet", + "id": "def-common.BundledPackage.version", + "type": "string", + "tags": [], + "label": "version", + "description": [], + "path": "x-pack/plugins/fleet/common/types/models/epm.ts", + "deprecated": false + }, + { + "parentPluginId": "fleet", + "id": "def-common.BundledPackage.buffer", + "type": "Object", + "tags": [], + "label": "buffer", + "description": [], + "signature": [ + "Buffer" + ], + "path": "x-pack/plugins/fleet/common/types/models/epm.ts", + "deprecated": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "fleet", "id": "def-common.CategorySummaryItem", @@ -12845,19 +14660,6 @@ "path": "x-pack/plugins/fleet/common/types/models/output.ts", "deprecated": false }, - { - "parentPluginId": "fleet", - "id": "def-common.NewOutput.api_key", - "type": "string", - "tags": [], - "label": "api_key", - "description": [], - "signature": [ - "string | undefined" - ], - "path": "x-pack/plugins/fleet/common/types/models/output.ts", - "deprecated": false - }, { "parentPluginId": "fleet", "id": "def-common.NewOutput.config_yaml", @@ -14283,6 +16085,29 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "fleet", + "id": "def-common.PostLogstashApiKeyResponse", + "type": "Interface", + "tags": [], + "label": "PostLogstashApiKeyResponse", + "description": [], + "path": "x-pack/plugins/fleet/common/types/rest_spec/output.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "fleet", + "id": "def-common.PostLogstashApiKeyResponse.api_key", + "type": "string", + "tags": [], + "label": "api_key", + "description": [], + "path": "x-pack/plugins/fleet/common/types/rest_spec/output.ts", + "deprecated": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "fleet", "id": "def-common.PostNewAgentActionRequest", @@ -16594,7 +18419,7 @@ "section": "def-common.RegistryPackage", "text": "RegistryPackage" }, - ", \"internal\" | \"data_streams\" | \"assets\" | \"readme\">" + ", \"internal\" | \"data_streams\" | \"elasticsearch\" | \"assets\" | \"readme\">" ], "path": "x-pack/plugins/fleet/common/types/models/epm.ts", "deprecated": false, @@ -17087,7 +18912,7 @@ "label": "EnrollmentAPIKeySOAttributes", "description": [], "signature": [ - "{ name?: string | undefined; active: boolean; created_at: string; policy_id?: string | undefined; api_key: string; api_key_id: string; }" + "{ name?: string | undefined; active: boolean; created_at: string; policy_id?: string | undefined; api_key_id: string; api_key: string; }" ], "path": "x-pack/plugins/fleet/common/types/models/enrollment_api_key.ts", "deprecated": false, @@ -17198,6 +19023,20 @@ "deprecated": false, "initialIsOpen": false }, + { + "parentPluginId": "fleet", + "id": "def-common.FLEET_PACKAGES", + "type": "Array", + "tags": [], + "label": "FLEET_PACKAGES", + "description": [], + "signature": [ + "{ name: string; version: string; }[]" + ], + "path": "x-pack/plugins/fleet/common/constants/preconfiguration.ts", + "deprecated": false, + "initialIsOpen": false + }, { "parentPluginId": "fleet", "id": "def-common.FLEET_SERVER_ARTIFACTS_INDEX", @@ -17312,7 +19151,7 @@ "section": "def-common.Output", "text": "Output" }, - ", \"type\" | \"hosts\" | \"ca_sha256\" | \"api_key\"> & { [key: string]: any; }" + ", \"type\" | \"hosts\" | \"ca_sha256\"> & { [key: string]: any; }" ], "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", "deprecated": false, @@ -20796,6 +22635,16 @@ "description": [], "path": "x-pack/plugins/fleet/common/constants/routes.ts", "deprecated": false + }, + { + "parentPluginId": "fleet", + "id": "def-common.OUTPUT_API_ROUTES.LOGSTASH_API_KEY_PATTERN", + "type": "string", + "tags": [], + "label": "LOGSTASH_API_KEY_PATTERN", + "description": [], + "path": "x-pack/plugins/fleet/common/constants/routes.ts", + "deprecated": false } ], "initialIsOpen": false diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index 32601da708967..1f568ea590a21 100644 --- a/api_docs/fleet.mdx +++ b/api_docs/fleet.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/fleet title: "fleet" image: https://source.unsplash.com/400x175/?github summary: API docs for the fleet plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fleet'] warning: 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. --- @@ -18,7 +18,7 @@ Contact [Fleet](https://github.com/orgs/elastic/teams/fleet) for questions regar | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 1263 | 8 | 1147 | 10 | +| 1349 | 8 | 1232 | 9 | ## Client diff --git a/api_docs/global_search.mdx b/api_docs/global_search.mdx index 700f34f5be2b3..f8624c715d520 100644 --- a/api_docs/global_search.mdx +++ b/api_docs/global_search.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/globalSearch title: "globalSearch" image: https://source.unsplash.com/400x175/?github summary: API docs for the globalSearch plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'globalSearch'] warning: 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. --- diff --git a/api_docs/home.mdx b/api_docs/home.mdx index bbe95667a2714..0528f339d4001 100644 --- a/api_docs/home.mdx +++ b/api_docs/home.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/home title: "home" image: https://source.unsplash.com/400x175/?github summary: API docs for the home plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'home'] warning: 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. --- diff --git a/api_docs/index_lifecycle_management.mdx b/api_docs/index_lifecycle_management.mdx index b74d8f2b4628d..dd2534b5fda7e 100644 --- a/api_docs/index_lifecycle_management.mdx +++ b/api_docs/index_lifecycle_management.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/indexLifecycleManagement title: "indexLifecycleManagement" image: https://source.unsplash.com/400x175/?github summary: API docs for the indexLifecycleManagement plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexLifecycleManagement'] warning: 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. --- diff --git a/api_docs/index_management.mdx b/api_docs/index_management.mdx index d7d0a6728fdda..4e48dc476769f 100644 --- a/api_docs/index_management.mdx +++ b/api_docs/index_management.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/indexManagement title: "indexManagement" image: https://source.unsplash.com/400x175/?github summary: API docs for the indexManagement plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexManagement'] warning: 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. --- diff --git a/api_docs/infra.mdx b/api_docs/infra.mdx index 05fbc69fac209..a5e862e78d8a9 100644 --- a/api_docs/infra.mdx +++ b/api_docs/infra.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/infra title: "infra" image: https://source.unsplash.com/400x175/?github summary: API docs for the infra plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'infra'] warning: 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. --- diff --git a/api_docs/inspector.mdx b/api_docs/inspector.mdx index 2d6a65b046718..a407daf9c283b 100644 --- a/api_docs/inspector.mdx +++ b/api_docs/inspector.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/inspector title: "inspector" image: https://source.unsplash.com/400x175/?github summary: API docs for the inspector plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inspector'] warning: 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. --- diff --git a/api_docs/interactive_setup.mdx b/api_docs/interactive_setup.mdx index 88b0781bebd99..5badcf76a69c7 100644 --- a/api_docs/interactive_setup.mdx +++ b/api_docs/interactive_setup.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/interactiveSetup title: "interactiveSetup" image: https://source.unsplash.com/400x175/?github summary: API docs for the interactiveSetup plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'interactiveSetup'] warning: 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. --- diff --git a/api_docs/kbn_ace.mdx b/api_docs/kbn_ace.mdx index 214442ee13ad9..3d2ed640d1466 100644 --- a/api_docs/kbn_ace.mdx +++ b/api_docs/kbn_ace.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-ace title: "@kbn/ace" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/ace plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ace'] warning: 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. --- diff --git a/api_docs/kbn_alerts.mdx b/api_docs/kbn_alerts.mdx index bfcf60c676903..f3a59546b2e10 100644 --- a/api_docs/kbn_alerts.mdx +++ b/api_docs/kbn_alerts.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-alerts title: "@kbn/alerts" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/alerts plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts'] warning: 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. --- diff --git a/api_docs/kbn_analytics.devdocs.json b/api_docs/kbn_analytics.devdocs.json index deb67871ae603..338249b503611 100644 --- a/api_docs/kbn_analytics.devdocs.json +++ b/api_docs/kbn_analytics.devdocs.json @@ -356,15 +356,7 @@ "label": "reportUiCounter", "description": [], "signature": [ - "(appName: string, type: ", - { - "pluginId": "@kbn/analytics", - "scope": "common", - "docId": "kibKbnAnalyticsPluginApi", - "section": "def-common.UiCounterMetricType", - "text": "UiCounterMetricType" - }, - ", eventNames: string | string[], count?: number | undefined) => void" + "(appName: string, type: string, eventNames: string | string[], count?: number | undefined) => void" ], "path": "packages/kbn-analytics/src/reporter.ts", "deprecated": false, @@ -386,18 +378,12 @@ { "parentPluginId": "@kbn/analytics", "id": "def-common.Reporter.reportUiCounter.$2", - "type": "CompoundType", + "type": "string", "tags": [], "label": "type", "description": [], "signature": [ - { - "pluginId": "@kbn/analytics", - "scope": "common", - "docId": "kibKbnAnalyticsPluginApi", - "section": "def-common.UiCounterMetricType", - "text": "UiCounterMetricType" - } + "string" ], "path": "packages/kbn-analytics/src/reporter.ts", "deprecated": false, @@ -756,15 +742,7 @@ "label": "uiCounter", "description": [], "signature": [ - "Record | undefined" + "Record | undefined" ], "path": "packages/kbn-analytics/src/report.ts", "deprecated": false @@ -1138,30 +1116,7 @@ "label": "UiCounterMetricType", "description": [], "signature": [ - { - "pluginId": "@kbn/analytics", - "scope": "common", - "docId": "kibKbnAnalyticsPluginApi", - "section": "def-common.METRIC_TYPE", - "text": "METRIC_TYPE" - }, - ".COUNT | ", - { - "pluginId": "@kbn/analytics", - "scope": "common", - "docId": "kibKbnAnalyticsPluginApi", - "section": "def-common.METRIC_TYPE", - "text": "METRIC_TYPE" - }, - ".LOADED | ", - { - "pluginId": "@kbn/analytics", - "scope": "common", - "docId": "kibKbnAnalyticsPluginApi", - "section": "def-common.METRIC_TYPE", - "text": "METRIC_TYPE" - }, - ".CLICK" + "string" ], "path": "packages/kbn-analytics/src/metrics/ui_counter.ts", "deprecated": false, diff --git a/api_docs/kbn_analytics.mdx b/api_docs/kbn_analytics.mdx index 334415086381e..d27399356410b 100644 --- a/api_docs/kbn_analytics.mdx +++ b/api_docs/kbn_analytics.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-analytics title: "@kbn/analytics" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/analytics plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics'] warning: 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. --- diff --git a/api_docs/kbn_apm_config_loader.mdx b/api_docs/kbn_apm_config_loader.mdx index 3c5e4f4a334b4..591b9f17af029 100644 --- a/api_docs/kbn_apm_config_loader.mdx +++ b/api_docs/kbn_apm_config_loader.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-apm-config-loader title: "@kbn/apm-config-loader" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/apm-config-loader plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-config-loader'] warning: 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. --- diff --git a/api_docs/kbn_apm_utils.mdx b/api_docs/kbn_apm_utils.mdx index 18b0e128d481d..b3bdd40a5f05c 100644 --- a/api_docs/kbn_apm_utils.mdx +++ b/api_docs/kbn_apm_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-apm-utils title: "@kbn/apm-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/apm-utils plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-utils'] warning: 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. --- diff --git a/api_docs/kbn_cli_dev_mode.mdx b/api_docs/kbn_cli_dev_mode.mdx index 4311c83b2ef29..a243aceb5ff3c 100644 --- a/api_docs/kbn_cli_dev_mode.mdx +++ b/api_docs/kbn_cli_dev_mode.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-cli-dev-mode title: "@kbn/cli-dev-mode" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/cli-dev-mode plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cli-dev-mode'] warning: 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. --- diff --git a/api_docs/kbn_config.mdx b/api_docs/kbn_config.mdx index 8ac635c043f99..320749b4d9324 100644 --- a/api_docs/kbn_config.mdx +++ b/api_docs/kbn_config.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-config title: "@kbn/config" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/config plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config'] warning: 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. --- diff --git a/api_docs/kbn_config_schema.mdx b/api_docs/kbn_config_schema.mdx index 41a38da07a6ae..ad7de68b1df04 100644 --- a/api_docs/kbn_config_schema.mdx +++ b/api_docs/kbn_config_schema.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-config-schema title: "@kbn/config-schema" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/config-schema plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-schema'] warning: 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. --- diff --git a/api_docs/kbn_crypto.mdx b/api_docs/kbn_crypto.mdx index d5605911d5337..612576a8e3b99 100644 --- a/api_docs/kbn_crypto.mdx +++ b/api_docs/kbn_crypto.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-crypto title: "@kbn/crypto" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/crypto plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto'] warning: 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. --- diff --git a/api_docs/kbn_dev_utils.devdocs.json b/api_docs/kbn_dev_utils.devdocs.json index b83698e7ad147..d3ebe0cab44de 100644 --- a/api_docs/kbn_dev_utils.devdocs.json +++ b/api_docs/kbn_dev_utils.devdocs.json @@ -10,6 +10,154 @@ }, "server": { "classes": [ + { + "parentPluginId": "@kbn/dev-utils", + "id": "def-server.CiStatsClient", + "type": "Class", + "tags": [], + "label": "CiStatsClient", + "description": [], + "path": "packages/kbn-dev-utils/src/ci_stats_reporter/ci_stats_client.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "@kbn/dev-utils", + "id": "def-server.CiStatsClient.fromEnv", + "type": "Function", + "tags": [], + "label": "fromEnv", + "description": [ + "\nCreate a CiStatsReporter by inspecting the ENV for the necessary config" + ], + "signature": [ + "(log: ", + { + "pluginId": "@kbn/dev-utils", + "scope": "server", + "docId": "kibKbnDevUtilsPluginApi", + "section": "def-server.ToolingLog", + "text": "ToolingLog" + }, + ") => ", + { + "pluginId": "@kbn/dev-utils", + "scope": "server", + "docId": "kibKbnDevUtilsPluginApi", + "section": "def-server.CiStatsClient", + "text": "CiStatsClient" + } + ], + "path": "packages/kbn-dev-utils/src/ci_stats_reporter/ci_stats_client.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "@kbn/dev-utils", + "id": "def-server.CiStatsClient.fromEnv.$1", + "type": "Object", + "tags": [], + "label": "log", + "description": [], + "signature": [ + { + "pluginId": "@kbn/dev-utils", + "scope": "server", + "docId": "kibKbnDevUtilsPluginApi", + "section": "def-server.ToolingLog", + "text": "ToolingLog" + } + ], + "path": "packages/kbn-dev-utils/src/ci_stats_reporter/ci_stats_client.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/dev-utils", + "id": "def-server.CiStatsClient.Unnamed", + "type": "Function", + "tags": [], + "label": "Constructor", + "description": [], + "signature": [ + "any" + ], + "path": "packages/kbn-dev-utils/src/ci_stats_reporter/ci_stats_client.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "@kbn/dev-utils", + "id": "def-server.CiStatsClient.Unnamed.$1", + "type": "Object", + "tags": [], + "label": "config", + "description": [], + "signature": [ + { + "pluginId": "@kbn/dev-utils", + "scope": "server", + "docId": "kibKbnDevUtilsPluginApi", + "section": "def-server.Config", + "text": "Config" + }, + " | undefined" + ], + "path": "packages/kbn-dev-utils/src/ci_stats_reporter/ci_stats_client.ts", + "deprecated": false, + "isRequired": false + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/dev-utils", + "id": "def-server.CiStatsClient.isEnabled", + "type": "Function", + "tags": [], + "label": "isEnabled", + "description": [], + "signature": [ + "() => boolean" + ], + "path": "packages/kbn-dev-utils/src/ci_stats_reporter/ci_stats_client.ts", + "deprecated": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/dev-utils", + "id": "def-server.CiStatsClient.getLatestTestGroupStats", + "type": "Function", + "tags": [], + "label": "getLatestTestGroupStats", + "description": [], + "signature": [ + "(options: LatestTestGroupStatsOptions) => Promise" + ], + "path": "packages/kbn-dev-utils/src/ci_stats_reporter/ci_stats_client.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "@kbn/dev-utils", + "id": "def-server.CiStatsClient.getLatestTestGroupStats.$1", + "type": "Object", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "LatestTestGroupStatsOptions" + ], + "path": "packages/kbn-dev-utils/src/ci_stats_reporter/ci_stats_client.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + } + ], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/dev-utils", "id": "def-server.CiStatsReporter", @@ -2777,36 +2925,6 @@ ], "initialIsOpen": false }, - { - "parentPluginId": "@kbn/dev-utils", - "id": "def-server.CiStatsMetadata", - "type": "Interface", - "tags": [], - "label": "CiStatsMetadata", - "description": [ - "Container for metadata that can be attached to different ci-stats objects" - ], - "path": "packages/kbn-dev-utils/src/ci_stats_reporter/ci_stats_reporter.ts", - "deprecated": false, - "children": [ - { - "parentPluginId": "@kbn/dev-utils", - "id": "def-server.CiStatsMetadata.Unnamed", - "type": "IndexSignature", - "tags": [], - "label": "[key: string]: string | number | boolean | string[] | undefined", - "description": [ - "\nArbitrary key-value pairs which can be attached to CiStatsTiming and CiStatsMetric\nobjects stored in the ci-stats service" - ], - "signature": [ - "[key: string]: string | number | boolean | string[] | undefined" - ], - "path": "packages/kbn-dev-utils/src/ci_stats_reporter/ci_stats_reporter.ts", - "deprecated": false - } - ], - "initialIsOpen": false - }, { "parentPluginId": "@kbn/dev-utils", "id": "def-server.CiStatsMetric", @@ -2895,13 +3013,7 @@ "Arbitrary key-value pairs which can be used for additional filtering/reporting" ], "signature": [ - { - "pluginId": "@kbn/dev-utils", - "scope": "server", - "docId": "kibKbnDevUtilsPluginApi", - "section": "def-server.CiStatsMetadata", - "text": "CiStatsMetadata" - }, + "CiStatsMetadata", " | undefined" ], "path": "packages/kbn-dev-utils/src/ci_stats_reporter/ci_stats_reporter.ts", @@ -3036,13 +3148,7 @@ "\nArbitrary metadata associated with this group. We currently look for a ciGroup metadata property for highlighting that when appropriate" ], "signature": [ - { - "pluginId": "@kbn/dev-utils", - "scope": "server", - "docId": "kibKbnDevUtilsPluginApi", - "section": "def-server.CiStatsMetadata", - "text": "CiStatsMetadata" - } + "CiStatsMetadata" ], "path": "packages/kbn-dev-utils/src/ci_stats_reporter/ci_stats_test_group_types.ts", "deprecated": false @@ -3271,13 +3377,7 @@ "hash of key-value pairs which will be stored with the timing for additional filtering and reporting" ], "signature": [ - { - "pluginId": "@kbn/dev-utils", - "scope": "server", - "docId": "kibKbnDevUtilsPluginApi", - "section": "def-server.CiStatsMetadata", - "text": "CiStatsMetadata" - }, + "CiStatsMetadata", " | undefined" ], "path": "packages/kbn-dev-utils/src/ci_stats_reporter/ci_stats_reporter.ts", @@ -3794,13 +3894,7 @@ "Default metadata to add to each metric" ], "signature": [ - { - "pluginId": "@kbn/dev-utils", - "scope": "server", - "docId": "kibKbnDevUtilsPluginApi", - "section": "def-server.CiStatsMetadata", - "text": "CiStatsMetadata" - }, + "CiStatsMetadata", " | undefined" ], "path": "packages/kbn-dev-utils/src/ci_stats_reporter/ci_stats_reporter.ts", diff --git a/api_docs/kbn_dev_utils.mdx b/api_docs/kbn_dev_utils.mdx index 0e6e20f0cdb3a..e3a8dba905e6e 100644 --- a/api_docs/kbn_dev_utils.mdx +++ b/api_docs/kbn_dev_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-dev-utils title: "@kbn/dev-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/dev-utils plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-utils'] warning: 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. --- @@ -18,7 +18,7 @@ Contact [Owner missing] for questions regarding this plugin. | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 275 | 3 | 193 | 0 | +| 281 | 3 | 200 | 1 | ## Server diff --git a/api_docs/kbn_doc_links.mdx b/api_docs/kbn_doc_links.mdx index 0c87e23c1e49b..03433dfc96ff1 100644 --- a/api_docs/kbn_doc_links.mdx +++ b/api_docs/kbn_doc_links.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-doc-links title: "@kbn/doc-links" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/doc-links plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/doc-links'] warning: 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. --- diff --git a/api_docs/kbn_docs_utils.mdx b/api_docs/kbn_docs_utils.mdx index 5202bb66e17d5..71c27a0c7d3ba 100644 --- a/api_docs/kbn_docs_utils.mdx +++ b/api_docs/kbn_docs_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-docs-utils title: "@kbn/docs-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/docs-utils plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/docs-utils'] warning: 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. --- diff --git a/api_docs/kbn_es_archiver.mdx b/api_docs/kbn_es_archiver.mdx index adc62206d6682..c4ab4a20c6ccf 100644 --- a/api_docs/kbn_es_archiver.mdx +++ b/api_docs/kbn_es_archiver.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-es-archiver title: "@kbn/es-archiver" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/es-archiver plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-archiver'] warning: 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. --- diff --git a/api_docs/kbn_es_query.mdx b/api_docs/kbn_es_query.mdx index 19d6ff0d82c5b..98a6b082a1c5f 100644 --- a/api_docs/kbn_es_query.mdx +++ b/api_docs/kbn_es_query.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-es-query title: "@kbn/es-query" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/es-query plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-query'] warning: 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. --- diff --git a/api_docs/kbn_field_types.mdx b/api_docs/kbn_field_types.mdx index b6bd61aa31dde..14bad8dd91659 100644 --- a/api_docs/kbn_field_types.mdx +++ b/api_docs/kbn_field_types.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-field-types title: "@kbn/field-types" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/field-types plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-types'] warning: 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. --- diff --git a/api_docs/kbn_i18n.mdx b/api_docs/kbn_i18n.mdx index 871d8e319dcc0..17d50c56410a5 100644 --- a/api_docs/kbn_i18n.mdx +++ b/api_docs/kbn_i18n.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-i18n title: "@kbn/i18n" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/i18n plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n'] warning: 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. --- diff --git a/api_docs/kbn_interpreter.mdx b/api_docs/kbn_interpreter.mdx index 6cd7ec34b7f4c..ae829be4405ce 100644 --- a/api_docs/kbn_interpreter.mdx +++ b/api_docs/kbn_interpreter.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-interpreter title: "@kbn/interpreter" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/interpreter plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/interpreter'] warning: 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. --- diff --git a/api_docs/kbn_io_ts_utils.devdocs.json b/api_docs/kbn_io_ts_utils.devdocs.json index 0eac86c5269a4..6a4ae05e82231 100644 --- a/api_docs/kbn_io_ts_utils.devdocs.json +++ b/api_docs/kbn_io_ts_utils.devdocs.json @@ -59,10 +59,10 @@ " | ", "StringType", " | ", - "BooleanType", - " | ", "NumberType", " | ", + "BooleanType", + " | ", "RecordC", "<", "Mixed", diff --git a/api_docs/kbn_io_ts_utils.mdx b/api_docs/kbn_io_ts_utils.mdx index d0a2008e5aaa2..82a860e90ca52 100644 --- a/api_docs/kbn_io_ts_utils.mdx +++ b/api_docs/kbn_io_ts_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-io-ts-utils title: "@kbn/io-ts-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/io-ts-utils plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/io-ts-utils'] warning: 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. --- diff --git a/api_docs/kbn_logging.mdx b/api_docs/kbn_logging.mdx index 24aba4cd08494..a2cab655436d6 100644 --- a/api_docs/kbn_logging.mdx +++ b/api_docs/kbn_logging.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-logging title: "@kbn/logging" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/logging plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging'] warning: 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. --- diff --git a/api_docs/kbn_logging_mocks.mdx b/api_docs/kbn_logging_mocks.mdx index edc05dc05891c..a8ad21c2d7a0c 100644 --- a/api_docs/kbn_logging_mocks.mdx +++ b/api_docs/kbn_logging_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-logging-mocks title: "@kbn/logging-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/logging-mocks plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging-mocks'] warning: 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. --- diff --git a/api_docs/kbn_mapbox_gl.mdx b/api_docs/kbn_mapbox_gl.mdx index b05b0b386d08a..5f48d0e1a0f2a 100644 --- a/api_docs/kbn_mapbox_gl.mdx +++ b/api_docs/kbn_mapbox_gl.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-mapbox-gl title: "@kbn/mapbox-gl" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/mapbox-gl plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mapbox-gl'] warning: 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. --- diff --git a/api_docs/kbn_monaco.mdx b/api_docs/kbn_monaco.mdx index 47d516c8740eb..c30545ca73456 100644 --- a/api_docs/kbn_monaco.mdx +++ b/api_docs/kbn_monaco.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-monaco title: "@kbn/monaco" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/monaco plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/monaco'] warning: 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. --- diff --git a/api_docs/kbn_optimizer.mdx b/api_docs/kbn_optimizer.mdx index 72185ab05f010..45bee567c2c54 100644 --- a/api_docs/kbn_optimizer.mdx +++ b/api_docs/kbn_optimizer.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer title: "@kbn/optimizer" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/optimizer plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer'] warning: 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. --- diff --git a/api_docs/kbn_plugin_generator.mdx b/api_docs/kbn_plugin_generator.mdx index 6bf6431ac8edc..d8a0079d931a8 100644 --- a/api_docs/kbn_plugin_generator.mdx +++ b/api_docs/kbn_plugin_generator.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-generator title: "@kbn/plugin-generator" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/plugin-generator plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-generator'] warning: 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. --- diff --git a/api_docs/kbn_plugin_helpers.mdx b/api_docs/kbn_plugin_helpers.mdx index ed37bf1b924c0..f550e199abc75 100644 --- a/api_docs/kbn_plugin_helpers.mdx +++ b/api_docs/kbn_plugin_helpers.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-helpers title: "@kbn/plugin-helpers" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/plugin-helpers plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers'] warning: 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. --- diff --git a/api_docs/kbn_pm.mdx b/api_docs/kbn_pm.mdx index 5b8f5c91a1d95..8fd9428d27ffc 100644 --- a/api_docs/kbn_pm.mdx +++ b/api_docs/kbn_pm.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-pm title: "@kbn/pm" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/pm plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/pm'] warning: 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. --- diff --git a/api_docs/kbn_react_field.mdx b/api_docs/kbn_react_field.mdx index b2ecbc9ab2ff0..b52661ae1db0d 100644 --- a/api_docs/kbn_react_field.mdx +++ b/api_docs/kbn_react_field.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-react-field title: "@kbn/react-field" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/react-field plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-field'] warning: 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. --- diff --git a/api_docs/kbn_rule_data_utils.mdx b/api_docs/kbn_rule_data_utils.mdx index 250c80df3d9e5..bee3b0a9954d9 100644 --- a/api_docs/kbn_rule_data_utils.mdx +++ b/api_docs/kbn_rule_data_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-rule-data-utils title: "@kbn/rule-data-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/rule-data-utils plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rule-data-utils'] warning: 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. --- diff --git a/api_docs/kbn_securitysolution_autocomplete.devdocs.json b/api_docs/kbn_securitysolution_autocomplete.devdocs.json index 0aa872b1cbfc3..b84469fdb9c65 100644 --- a/api_docs/kbn_securitysolution_autocomplete.devdocs.json +++ b/api_docs/kbn_securitysolution_autocomplete.devdocs.json @@ -262,9 +262,9 @@ "\nGiven an array of lists and optionally a field this will return all\nthe lists that match against the field based on the types from the field\n\nNOTE: That we support one additional property from \"FieldSpec\" located here:\nsrc/plugins/data/common/index_patterns/fields/types.ts\nThis type property is esTypes. If it exists and is on there we will read off the esTypes." ], "signature": [ - "(lists: { _version: string | undefined; created_at: string; created_by: string; description: string; deserializer: string | undefined; id: string; immutable: boolean; meta: object | undefined; name: string; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; version: number; }[], field?: (", + "(lists: { _version: string | undefined; created_at: string; created_by: string; description: string; deserializer: string | undefined; id: string; immutable: boolean; meta: object | undefined; name: string; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; version: number; }[], field?: (", "DataViewFieldBase", - " & { esTypes?: string[] | undefined; }) | undefined) => { _version: string | undefined; created_at: string; created_by: string; description: string; deserializer: string | undefined; id: string; immutable: boolean; meta: object | undefined; name: string; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; version: number; }[]" + " & { esTypes?: string[] | undefined; }) | undefined) => { _version: string | undefined; created_at: string; created_by: string; description: string; deserializer: string | undefined; id: string; immutable: boolean; meta: object | undefined; name: string; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; version: number; }[]" ], "path": "packages/kbn-securitysolution-autocomplete/src/filter_field_to_list/index.ts", "deprecated": false, @@ -279,7 +279,7 @@ "The lists to match against the field" ], "signature": [ - "{ _version: string | undefined; created_at: string; created_by: string; description: string; deserializer: string | undefined; id: string; immutable: boolean; meta: object | undefined; name: string; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; version: number; }[]" + "{ _version: string | undefined; created_at: string; created_by: string; description: string; deserializer: string | undefined; id: string; immutable: boolean; meta: object | undefined; name: string; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; version: number; }[]" ], "path": "packages/kbn-securitysolution-autocomplete/src/filter_field_to_list/index.ts", "deprecated": false, diff --git a/api_docs/kbn_securitysolution_autocomplete.mdx b/api_docs/kbn_securitysolution_autocomplete.mdx index d80a51415eae1..51c458f97016b 100644 --- a/api_docs/kbn_securitysolution_autocomplete.mdx +++ b/api_docs/kbn_securitysolution_autocomplete.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-autocomplete title: "@kbn/securitysolution-autocomplete" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-autocomplete plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-autocomplete'] warning: 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. --- diff --git a/api_docs/kbn_securitysolution_es_utils.devdocs.json b/api_docs/kbn_securitysolution_es_utils.devdocs.json index 057adfd0b97eb..06b914a4aeee5 100644 --- a/api_docs/kbn_securitysolution_es_utils.devdocs.json +++ b/api_docs/kbn_securitysolution_es_utils.devdocs.json @@ -388,7857 +388,2433 @@ "label": "esClient", "description": [], "signature": [ - "{ eql: { delete: (params: ", - "EqlDeleteRequest", - " | ", - "EqlDeleteRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "EqlDeleteResponse", - ", TContext>>; get: (params: ", - "EqlGetRequest", - " | ", - "EqlGetRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "EqlGetResponse", - ", TContext>>; getStatus: (params: ", - "EqlGetStatusRequest", + "{ eql: ", + "default", + "; search: { >(this: That, params?: ", + "SearchRequest", " | ", - "EqlGetStatusRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "EqlGetStatusResponse", - ", TContext>>; search: (params: ", - "EqlSearchRequest", + "SearchRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "SearchResponse", + ">; >(this: That, params?: ", + "SearchRequest", " | ", - "EqlSearchRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "SearchRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "EqlSearchResponse", - ", TContext>>; }; search: , unknown>>; , TContext = unknown>(params?: ", + ">>(this: That, params?: ", "SearchRequest", " | ", "SearchRequest", " | undefined, options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", + " | undefined): Promise<", "SearchResponse", - ", TContext>>; create: (params: ", + ">; }; create: { (this: That, params: ", "CreateRequest", " | ", "CreateRequest", ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", "CreateResponse", - ", TContext>>; monitoring: { bulk: (params: ", - "MonitoringBulkRequest", - " | ", - "MonitoringBulkRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MonitoringBulkResponse", - ", TContext>>; }; security: { authenticate: (params?: ", - "SecurityAuthenticateRequest", - " | ", - "SecurityAuthenticateRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + ">; (this: That, params: ", + "CreateRequest", + " | ", + "CreateRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "SecurityAuthenticateResponse", - ", TContext>>; changePassword: (params?: ", - "SecurityChangePasswordRequest", - " | ", - "SecurityChangePasswordRequest", - " | undefined, options?: ", + "CreateResponse", + ", unknown>>; (this: That, params: ", + "CreateRequest", + " | ", + "CreateRequest", + ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", + " | undefined): Promise<", + "CreateResponse", + ">; }; monitoring: ", + "default", + "; security: ", + "default", + "; name: string | symbol; index: { (this: That, params: ", + "IndexRequest", + " | ", + "IndexRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "IndexResponse", + ">; (this: That, params: ", + "IndexRequest", + " | ", + "IndexRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "SecurityChangePasswordResponse", - ", TContext>>; clearApiKeyCache: (params: ", - "SecurityClearApiKeyCacheRequest", - " | ", - "SecurityClearApiKeyCacheRequest", - ", options?: ", + "IndexResponse", + ", unknown>>; (this: That, params: ", + "IndexRequest", + " | ", + "IndexRequest", + ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityClearApiKeyCacheResponse", - ", TContext>>; clearCachedPrivileges: (params: ", - "SecurityClearCachedPrivilegesRequest", + " | undefined): Promise<", + "IndexResponse", + ">; }; delete: { (this: That, params: ", + "DeleteRequest", " | ", - "SecurityClearCachedPrivilegesRequest", + "DeleteRequest", ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityClearCachedPrivilegesResponse", - ", TContext>>; clearCachedRealms: (params: ", - "SecurityClearCachedRealmsRequest", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "DeleteResponse", + ">; (this: That, params: ", + "DeleteRequest", " | ", - "SecurityClearCachedRealmsRequest", + "DeleteRequest", ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "SecurityClearCachedRealmsResponse", - ", TContext>>; clearCachedRoles: (params: ", - "SecurityClearCachedRolesRequest", + "DeleteResponse", + ", unknown>>; (this: That, params: ", + "DeleteRequest", " | ", - "SecurityClearCachedRolesRequest", + "DeleteRequest", ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityClearCachedRolesResponse", - ", TContext>>; clearCachedServiceTokens: (params: ", - "SecurityClearCachedServiceTokensRequest", + " | undefined): Promise<", + "DeleteResponse", + ">; }; get: { (this: That, params: ", + "GetRequest", " | ", - "SecurityClearCachedServiceTokensRequest", + "GetRequest", ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityClearCachedServiceTokensResponse", - ", TContext>>; createApiKey: (params?: ", - "SecurityCreateApiKeyRequest", - " | ", - "SecurityCreateApiKeyRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityCreateApiKeyResponse", - ", TContext>>; createServiceToken: (params: ", - "SecurityCreateServiceTokenRequest", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetResponse", + ">; (this: That, params: ", + "GetRequest", " | ", - "SecurityCreateServiceTokenRequest", + "GetRequest", ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "SecurityCreateServiceTokenResponse", - ", TContext>>; deletePrivileges: (params: ", - "SecurityDeletePrivilegesRequest", + "GetResponse", + ", unknown>>; (this: That, params: ", + "GetRequest", " | ", - "SecurityDeletePrivilegesRequest", + "GetRequest", ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", + " | undefined): Promise<", + "GetResponse", + ">; }; update: { (this: That, params: ", + "UpdateRequest", + " | ", + "UpdateRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "UpdateResponse", + ">; (this: That, params: ", + "UpdateRequest", + " | ", + "UpdateRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "SecurityDeletePrivilegesResponse", - ", TContext>>; deleteRole: (params: ", - "SecurityDeleteRoleRequest", - " | ", - "SecurityDeleteRoleRequest", - ", options?: ", + "UpdateResponse", + ", unknown>>; (this: That, params: ", + "UpdateRequest", + " | ", + "UpdateRequest", + ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityDeleteRoleResponse", - ", TContext>>; deleteRoleMapping: (params: ", - "SecurityDeleteRoleMappingRequest", + " | undefined): Promise<", + "UpdateResponse", + ">; }; closePointInTime: { (this: That, params: ", + "ClosePointInTimeRequest", " | ", - "SecurityDeleteRoleMappingRequest", + "ClosePointInTimeRequest", ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityDeleteRoleMappingResponse", - ", TContext>>; deleteServiceToken: (params: ", - "SecurityDeleteServiceTokenRequest", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ClosePointInTimeResponse", + ">; (this: That, params: ", + "ClosePointInTimeRequest", " | ", - "SecurityDeleteServiceTokenRequest", + "ClosePointInTimeRequest", ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "SecurityDeleteServiceTokenResponse", - ", TContext>>; deleteUser: (params: ", - "SecurityDeleteUserRequest", + "ClosePointInTimeResponse", + ", unknown>>; (this: That, params: ", + "ClosePointInTimeRequest", " | ", - "SecurityDeleteUserRequest", + "ClosePointInTimeRequest", ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", + " | undefined): Promise<", + "ClosePointInTimeResponse", + ">; }; transform: ", + "default", + "; helpers: ", + "default", + "; [kInternal]: symbol | null; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", + "default", + "; Internal: ", + "default", + "; asyncSearch: ", + "default", + "; autoscaling: ", + "default", + "; bulk: { (this: That, params: ", + "BulkRequest", + " | ", + "BulkRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "BulkResponse", + ">; (this: That, params: ", + "BulkRequest", + " | ", + "BulkRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "SecurityDeleteUserResponse", - ", TContext>>; disableUser: (params: ", - "SecurityDisableUserRequest", - " | ", - "SecurityDisableUserRequest", - ", options?: ", + "BulkResponse", + ", unknown>>; (this: That, params: ", + "BulkRequest", + " | ", + "BulkRequest", + ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityDisableUserResponse", - ", TContext>>; enableUser: (params: ", - "SecurityEnableUserRequest", + " | undefined): Promise<", + "BulkResponse", + ">; }; cat: ", + "default", + "; ccr: ", + "default", + "; clearScroll: { (this: That, params?: ", + "ClearScrollRequest", " | ", - "SecurityEnableUserRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityEnableUserResponse", - ", TContext>>; enrollKibana: (params?: ", - "TODO", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TODO", - ", unknown>>; enrollNode: (params?: ", - "TODO", + "ClearScrollRequest", " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TODO", - ", unknown>>; getApiKey: (params?: ", - "SecurityGetApiKeyRequest", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ClearScrollResponse", + ">; (this: That, params?: ", + "ClearScrollRequest", " | ", - "SecurityGetApiKeyRequest", + "ClearScrollRequest", " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "SecurityGetApiKeyResponse", - ", TContext>>; getBuiltinPrivileges: (params?: ", - "SecurityGetBuiltinPrivilegesRequest", + "ClearScrollResponse", + ", unknown>>; (this: That, params?: ", + "ClearScrollRequest", " | ", - "SecurityGetBuiltinPrivilegesRequest", + "ClearScrollRequest", " | undefined, options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityGetBuiltinPrivilegesResponse", - ", TContext>>; getPrivileges: (params?: ", - "SecurityGetPrivilegesRequest", + " | undefined): Promise<", + "ClearScrollResponse", + ">; }; cluster: ", + "default", + "; count: { (this: That, params?: ", + "CountRequest", " | ", - "SecurityGetPrivilegesRequest", + "CountRequest", " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityGetPrivilegesResponse", - ", TContext>>; getRole: (params?: ", - "SecurityGetRoleRequest", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "CountResponse", + ">; (this: That, params?: ", + "CountRequest", " | ", - "SecurityGetRoleRequest", + "CountRequest", " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "SecurityGetRoleResponse", - ", TContext>>; getRoleMapping: (params?: ", - "SecurityGetRoleMappingRequest", + "CountResponse", + ", unknown>>; (this: That, params?: ", + "CountRequest", " | ", - "SecurityGetRoleMappingRequest", + "CountRequest", " | undefined, options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityGetRoleMappingResponse", - ", TContext>>; getServiceAccounts: (params?: ", - "SecurityGetServiceAccountsRequest", + " | undefined): Promise<", + "CountResponse", + ">; }; danglingIndices: ", + "default", + "; deleteByQuery: { (this: That, params: ", + "DeleteByQueryRequest", " | ", - "SecurityGetServiceAccountsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityGetServiceAccountsResponse", - ", TContext>>; getServiceCredentials: (params: ", - "SecurityGetServiceCredentialsRequest", + "DeleteByQueryRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "DeleteByQueryResponse", + ">; (this: That, params: ", + "DeleteByQueryRequest", " | ", - "SecurityGetServiceCredentialsRequest", + "DeleteByQueryRequest", ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "SecurityGetServiceCredentialsResponse", - ", TContext>>; getToken: (params?: ", - "SecurityGetTokenRequest", + "DeleteByQueryResponse", + ", unknown>>; (this: That, params: ", + "DeleteByQueryRequest", " | ", - "SecurityGetTokenRequest", - " | undefined, options?: ", + "DeleteByQueryRequest", + ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityGetTokenResponse", - ", TContext>>; getUser: (params?: ", - "SecurityGetUserRequest", + " | undefined): Promise<", + "DeleteByQueryResponse", + ">; }; deleteByQueryRethrottle: { (this: That, params: ", + "DeleteByQueryRethrottleRequest", " | ", - "SecurityGetUserRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityGetUserResponse", - ", TContext>>; getUserPrivileges: (params?: ", - "SecurityGetUserPrivilegesRequest", + "DeleteByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "DeleteByQueryRethrottleResponse", + ">; (this: That, params: ", + "DeleteByQueryRethrottleRequest", " | ", - "SecurityGetUserPrivilegesRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "DeleteByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "SecurityGetUserPrivilegesResponse", - ", TContext>>; grantApiKey: (params?: ", - "SecurityGrantApiKeyRequest", + "DeleteByQueryRethrottleResponse", + ", unknown>>; (this: That, params: ", + "DeleteByQueryRethrottleRequest", " | ", - "SecurityGrantApiKeyRequest", - " | undefined, options?: ", + "DeleteByQueryRethrottleRequest", + ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityGrantApiKeyResponse", - ", TContext>>; hasPrivileges: (params?: ", - "SecurityHasPrivilegesRequest", + " | undefined): Promise<", + "DeleteByQueryRethrottleResponse", + ">; }; deleteScript: { (this: That, params: ", + "DeleteScriptRequest", " | ", - "SecurityHasPrivilegesRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityHasPrivilegesResponse", - ", TContext>>; invalidateApiKey: (params?: ", - "SecurityInvalidateApiKeyRequest", + "DeleteScriptRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "DeleteScriptResponse", + ">; (this: That, params: ", + "DeleteScriptRequest", " | ", - "SecurityInvalidateApiKeyRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "DeleteScriptRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "SecurityInvalidateApiKeyResponse", - ", TContext>>; invalidateToken: (params?: ", - "SecurityInvalidateTokenRequest", + "DeleteScriptResponse", + ", unknown>>; (this: That, params: ", + "DeleteScriptRequest", " | ", - "SecurityInvalidateTokenRequest", - " | undefined, options?: ", + "DeleteScriptRequest", + ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityInvalidateTokenResponse", - ", TContext>>; putPrivileges: (params?: ", - "SecurityPutPrivilegesRequest", + " | undefined): Promise<", + "DeleteScriptResponse", + ">; }; enrich: ", + "default", + "; exists: { (this: That, params: ", + "ExistsRequest", " | ", - "SecurityPutPrivilegesRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityPutPrivilegesResponse", - ", TContext>>; putRole: (params: ", - "SecurityPutRoleRequest", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "ExistsRequest", " | ", - "SecurityPutRoleRequest", + "ExistsRequest", ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", - "<", - "SecurityPutRoleResponse", - ", TContext>>; putRoleMapping: (params: ", - "SecurityPutRoleMappingRequest", + ">; (this: That, params: ", + "ExistsRequest", " | ", - "SecurityPutRoleMappingRequest", + "ExistsRequest", ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityPutRoleMappingResponse", - ", TContext>>; putUser: (params: ", - "SecurityPutUserRequest", + " | undefined): Promise; }; existsSource: { (this: That, params: ", + "ExistsSourceRequest", " | ", - "SecurityPutUserRequest", + "ExistsSourceRequest", ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityPutUserResponse", - ", TContext>>; queryApiKeys: (params?: ", - "TODO", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TODO", - ", unknown>>; samlAuthenticate: (params?: ", - "TODO", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "ExistsSourceRequest", + " | ", + "ExistsSourceRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", - "<", - "TODO", - ", unknown>>; samlCompleteLogout: (params?: ", - "TODO", - " | undefined, options?: ", + ">; (this: That, params: ", + "ExistsSourceRequest", + " | ", + "ExistsSourceRequest", + ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", + " | undefined): Promise; }; explain: { (this: That, params: ", + "ExplainRequest", + " | ", + "ExplainRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ExplainResponse", + ">; (this: That, params: ", + "ExplainRequest", + " | ", + "ExplainRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "TODO", - ", unknown>>; samlInvalidate: (params?: ", - "TODO", - " | undefined, options?: ", + "ExplainResponse", + ", unknown>>; (this: That, params: ", + "ExplainRequest", + " | ", + "ExplainRequest", + ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TODO", - ", unknown>>; samlLogout: (params?: ", - "TODO", + " | undefined): Promise<", + "ExplainResponse", + ">; }; features: ", + "default", + "; fieldCaps: { (this: That, params?: ", + "FieldCapsRequest", + " | ", + "FieldCapsRequest", " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TODO", - ", unknown>>; samlPrepareAuthentication: (params?: ", - "TODO", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "FieldCapsResponse", + ">; (this: That, params?: ", + "FieldCapsRequest", + " | ", + "FieldCapsRequest", " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "TODO", - ", unknown>>; samlServiceProviderMetadata: (params?: ", - "TODO", + "FieldCapsResponse", + ", unknown>>; (this: That, params?: ", + "FieldCapsRequest", + " | ", + "FieldCapsRequest", " | undefined, options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TODO", - ", unknown>>; }; name: string | symbol; index: (params: ", - "IndexRequest", - " | ", - "IndexRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndexResponse", - ", TContext>>; delete: (params: ", - "DeleteRequest", + " | undefined): Promise<", + "FieldCapsResponse", + ">; }; fleet: ", + "default", + "; getScript: { (this: That, params: ", + "GetScriptRequest", " | ", - "DeleteRequest", + "GetScriptRequest", ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "DeleteResponse", - ", TContext>>; get: (params: ", - "GetRequest", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetScriptResponse", + ">; (this: That, params: ", + "GetScriptRequest", " | ", - "GetRequest", + "GetScriptRequest", ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "GetResponse", - ", TContext>>; update: (params: ", - "UpdateRequest", - " | ", - "UpdateRequest", - ", options?: ", + "GetScriptResponse", + ", unknown>>; (this: That, params: ", + "GetScriptRequest", + " | ", + "GetScriptRequest", + ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "UpdateResponse", - ", TContext>>; closePointInTime: (params?: ", - "ClosePointInTimeRequest", + " | undefined): Promise<", + "GetScriptResponse", + ">; }; getScriptContext: { (this: That, params?: ", + "GetScriptContextRequest", " | ", - "ClosePointInTimeRequest", + "GetScriptContextRequest", " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "ClosePointInTimeResponse", - ", TContext>>; transform: { deleteTransform: (params: ", - "TransformDeleteTransformRequest", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetScriptContextResponse", + ">; (this: That, params?: ", + "GetScriptContextRequest", " | ", - "TransformDeleteTransformRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "GetScriptContextRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "TransformDeleteTransformResponse", - ", TContext>>; getTransform: (params?: ", - "TransformGetTransformRequest", + "GetScriptContextResponse", + ", unknown>>; (this: That, params?: ", + "GetScriptContextRequest", " | ", - "TransformGetTransformRequest", + "GetScriptContextRequest", " | undefined, options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TransformGetTransformResponse", - ", TContext>>; getTransformStats: (params: ", - "TransformGetTransformStatsRequest", + " | undefined): Promise<", + "GetScriptContextResponse", + ">; }; getScriptLanguages: { (this: That, params?: ", + "GetScriptLanguagesRequest", " | ", - "TransformGetTransformStatsRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TransformGetTransformStatsResponse", - ", TContext>>; previewTransform: (params?: ", - "TransformPreviewTransformRequest", + "GetScriptLanguagesRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetScriptLanguagesResponse", + ">; (this: That, params?: ", + "GetScriptLanguagesRequest", " | ", - "TransformPreviewTransformRequest", + "GetScriptLanguagesRequest", " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "TransformPreviewTransformResponse", - ", TContext>>; putTransform: (params: ", - "TransformPutTransformRequest", + "GetScriptLanguagesResponse", + ", unknown>>; (this: That, params?: ", + "GetScriptLanguagesRequest", " | ", - "TransformPutTransformRequest", - ", options?: ", + "GetScriptLanguagesRequest", + " | undefined, options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TransformPutTransformResponse", - ", TContext>>; resetTransform: (params: ", - "TransformResetTransformRequest", + " | undefined): Promise<", + "GetScriptLanguagesResponse", + ">; }; getSource: { (this: That, params: ", + "GetSourceRequest", " | ", - "TransformResetTransformRequest", + "GetSourceRequest", ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TransformResetTransformResponse", - ", TContext>>; startTransform: (params: ", - "TransformStartTransformRequest", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "GetSourceRequest", " | ", - "TransformStartTransformRequest", + "GetSourceRequest", ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", - "<", - "TransformStartTransformResponse", - ", TContext>>; stopTransform: (params: ", - "TransformStopTransformRequest", + ">; (this: That, params: ", + "GetSourceRequest", " | ", - "TransformStopTransformRequest", + "GetSourceRequest", ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TransformStopTransformResponse", - ", TContext>>; updateTransform: (params: ", - "TransformUpdateTransformRequest", + " | undefined): Promise; }; graph: ", + "default", + "; ilm: ", + "default", + "; indices: ", + "default", + "; info: { (this: That, params?: ", + "InfoRequest", " | ", - "TransformUpdateTransformRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "InfoRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "InfoResponse", + ">; (this: That, params?: ", + "InfoRequest", + " | ", + "InfoRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "TransformUpdateTransformResponse", - ", TContext>>; upgradeTransforms: (params?: ", - "TransformUpgradeTransformsRequest", + "InfoResponse", + ", unknown>>; (this: That, params?: ", + "InfoRequest", " | ", - "TransformUpgradeTransformsRequest", + "InfoRequest", " | undefined, options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TransformUpgradeTransformsResponse", - ", TContext>>; }; helpers: ", + " | undefined): Promise<", + "InfoResponse", + ">; }; ingest: ", "default", - "; asyncSearch: { delete: (params: ", - "AsyncSearchDeleteRequest", + "; knnSearch: { (this: That, params: ", + "KnnSearchRequest", " | ", - "AsyncSearchDeleteRequest", + "KnnSearchRequest", ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "AsyncSearchDeleteResponse", - ", TContext>>; get: (params: ", - "AsyncSearchGetRequest", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "KnnSearchResponse", + ">; (this: That, params: ", + "KnnSearchRequest", " | ", - "AsyncSearchGetRequest", + "KnnSearchRequest", ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "AsyncSearchGetResponse", - ", TContext>>; status: (params: ", - "AsyncSearchStatusRequest", + "KnnSearchResponse", + ", unknown>>; (this: That, params: ", + "KnnSearchRequest", " | ", - "AsyncSearchStatusRequest", + "KnnSearchRequest", ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "AsyncSearchStatusResponse", - ", TContext>>; submit: (params?: ", - "AsyncSearchSubmitRequest", + " | undefined): Promise<", + "KnnSearchResponse", + ">; }; license: ", + "default", + "; logstash: ", + "default", + "; mget: { (this: That, params?: ", + "MgetRequest", " | ", - "AsyncSearchSubmitRequest", + "MgetRequest", " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "AsyncSearchSubmitResponse", - ", TContext>>; }; autoscaling: { deleteAutoscalingPolicy: (params: ", - "AutoscalingDeleteAutoscalingPolicyRequest", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MgetResponse", + ">; (this: That, params?: ", + "MgetRequest", " | ", - "AutoscalingDeleteAutoscalingPolicyRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "MgetRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "AutoscalingDeleteAutoscalingPolicyResponse", - ", TContext>>; getAutoscalingCapacity: (params?: ", - "AutoscalingGetAutoscalingCapacityRequest", + "MgetResponse", + ", unknown>>; (this: That, params?: ", + "MgetRequest", " | ", - "AutoscalingGetAutoscalingCapacityRequest", + "MgetRequest", " | undefined, options?: ", "TransportRequestOptions", - " | undefined) => Promise<", + " | undefined): Promise<", + "MgetResponse", + ">; }; migration: ", + "default", + "; ml: ", + "default", + "; msearch: { >(this: That, params: ", + "MsearchRequest", + " | ", + "MsearchRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MsearchResponse", + ">; >(this: That, params: ", + "MsearchRequest", + " | ", + "MsearchRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "AutoscalingGetAutoscalingCapacityResponse", - ", TContext>>; getAutoscalingPolicy: (params: ", - "AutoscalingGetAutoscalingPolicyRequest", + "MsearchResponse", + ", unknown>>; >(this: That, params: ", + "MsearchRequest", " | ", - "AutoscalingGetAutoscalingPolicyRequest", + "MsearchRequest", ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", + " | undefined): Promise<", + "MsearchResponse", + ">; }; msearchTemplate: { >(this: That, params: ", + "MsearchTemplateRequest", + " | ", + "MsearchTemplateRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MsearchTemplateResponse", + ">; >(this: That, params: ", + "MsearchTemplateRequest", + " | ", + "MsearchTemplateRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "AutoscalingAutoscalingPolicy", - ", TContext>>; putAutoscalingPolicy: (params: ", - "AutoscalingPutAutoscalingPolicyRequest", + "MsearchTemplateResponse", + ", unknown>>; >(this: That, params: ", + "MsearchTemplateRequest", " | ", - "AutoscalingPutAutoscalingPolicyRequest", + "MsearchTemplateRequest", ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "AutoscalingPutAutoscalingPolicyResponse", - ", TContext>>; }; bulk: (params: ", - "BulkRequest", - " | ", - "BulkRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "BulkResponse", - ", TContext>>; cat: { aliases: (params?: ", - "CatAliasesRequest", + " | undefined): Promise<", + "MsearchTemplateResponse", + ">; }; mtermvectors: { (this: That, params?: ", + "MtermvectorsRequest", " | ", - "CatAliasesRequest", + "MtermvectorsRequest", " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CatAliasesResponse", - ", TContext>>; allocation: (params?: ", - "CatAllocationRequest", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MtermvectorsResponse", + ">; (this: That, params?: ", + "MtermvectorsRequest", " | ", - "CatAllocationRequest", + "MtermvectorsRequest", " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "CatAllocationResponse", - ", TContext>>; count: (params?: ", - "CatCountRequest", + "MtermvectorsResponse", + ", unknown>>; (this: That, params?: ", + "MtermvectorsRequest", " | ", - "CatCountRequest", + "MtermvectorsRequest", " | undefined, options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CatCountResponse", - ", TContext>>; fielddata: (params?: ", - "CatFielddataRequest", + " | undefined): Promise<", + "MtermvectorsResponse", + ">; }; nodes: ", + "default", + "; openPointInTime: { (this: That, params: ", + "OpenPointInTimeRequest", " | ", - "CatFielddataRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CatFielddataResponse", - ", TContext>>; health: (params?: ", - "CatHealthRequest", + "OpenPointInTimeRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "OpenPointInTimeResponse", + ">; (this: That, params: ", + "OpenPointInTimeRequest", " | ", - "CatHealthRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "OpenPointInTimeRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "CatHealthResponse", - ", TContext>>; help: (params?: ", - "CatHelpRequest", + "OpenPointInTimeResponse", + ", unknown>>; (this: That, params: ", + "OpenPointInTimeRequest", " | ", - "CatHelpRequest", - " | undefined, options?: ", + "OpenPointInTimeRequest", + ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CatHelpResponse", - ", TContext>>; indices: (params?: ", - "CatIndicesRequest", + " | undefined): Promise<", + "OpenPointInTimeResponse", + ">; }; ping: { (this: That, params?: ", + "PingRequest", " | ", - "CatIndicesRequest", + "PingRequest", " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CatIndicesResponse", - ", TContext>>; master: (params?: ", - "CatMasterRequest", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params?: ", + "PingRequest", " | ", - "CatMasterRequest", + "PingRequest", " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", - "<", - "CatMasterResponse", - ", TContext>>; mlDataFrameAnalytics: (params?: ", - "CatMlDataFrameAnalyticsRequest", + ">; (this: That, params?: ", + "PingRequest", " | ", - "CatMlDataFrameAnalyticsRequest", + "PingRequest", " | undefined, options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CatMlDataFrameAnalyticsResponse", - ", TContext>>; mlDatafeeds: (params?: ", - "CatMlDatafeedsRequest", + " | undefined): Promise; }; putScript: { (this: That, params: ", + "PutScriptRequest", " | ", - "CatMlDatafeedsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CatMlDatafeedsResponse", - ", TContext>>; mlJobs: (params?: ", - "CatMlJobsRequest", + "PutScriptRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "PutScriptResponse", + ">; (this: That, params: ", + "PutScriptRequest", " | ", - "CatMlJobsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "PutScriptRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "CatMlJobsResponse", - ", TContext>>; mlTrainedModels: (params?: ", - "CatMlTrainedModelsRequest", + "PutScriptResponse", + ", unknown>>; (this: That, params: ", + "PutScriptRequest", " | ", - "CatMlTrainedModelsRequest", - " | undefined, options?: ", + "PutScriptRequest", + ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CatMlTrainedModelsResponse", - ", TContext>>; nodeattrs: (params?: ", - "CatNodeattrsRequest", + " | undefined): Promise<", + "PutScriptResponse", + ">; }; rankEval: { (this: That, params: ", + "RankEvalRequest", " | ", - "CatNodeattrsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CatNodeattrsResponse", - ", TContext>>; nodes: (params?: ", - "CatNodesRequest", + "RankEvalRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "RankEvalResponse", + ">; (this: That, params: ", + "RankEvalRequest", " | ", - "CatNodesRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "RankEvalRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "CatNodesResponse", - ", TContext>>; pendingTasks: (params?: ", - "CatPendingTasksRequest", + "RankEvalResponse", + ", unknown>>; (this: That, params: ", + "RankEvalRequest", " | ", - "CatPendingTasksRequest", - " | undefined, options?: ", + "RankEvalRequest", + ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CatPendingTasksResponse", - ", TContext>>; plugins: (params?: ", - "CatPluginsRequest", + " | undefined): Promise<", + "RankEvalResponse", + ">; }; reindex: { (this: That, params?: ", + "ReindexRequest", " | ", - "CatPluginsRequest", + "ReindexRequest", " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CatPluginsResponse", - ", TContext>>; recovery: (params?: ", - "CatRecoveryRequest", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ReindexResponse", + ">; (this: That, params?: ", + "ReindexRequest", " | ", - "CatRecoveryRequest", + "ReindexRequest", " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "CatRecoveryResponse", - ", TContext>>; repositories: (params?: ", - "CatRepositoriesRequest", + "ReindexResponse", + ", unknown>>; (this: That, params?: ", + "ReindexRequest", " | ", - "CatRepositoriesRequest", + "ReindexRequest", " | undefined, options?: ", "TransportRequestOptions", - " | undefined) => Promise<", + " | undefined): Promise<", + "ReindexResponse", + ">; }; reindexRethrottle: { (this: That, params: ", + "ReindexRethrottleRequest", + " | ", + "ReindexRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ReindexRethrottleResponse", + ">; (this: That, params: ", + "ReindexRethrottleRequest", + " | ", + "ReindexRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "CatRepositoriesResponse", - ", TContext>>; segments: (params?: ", - "CatSegmentsRequest", + "ReindexRethrottleResponse", + ", unknown>>; (this: That, params: ", + "ReindexRethrottleRequest", " | ", - "CatSegmentsRequest", - " | undefined, options?: ", + "ReindexRethrottleRequest", + ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CatSegmentsResponse", - ", TContext>>; shards: (params?: ", - "CatShardsRequest", + " | undefined): Promise<", + "ReindexRethrottleResponse", + ">; }; renderSearchTemplate: { (this: That, params?: ", + "RenderSearchTemplateRequest", " | ", - "CatShardsRequest", + "RenderSearchTemplateRequest", " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CatShardsResponse", - ", TContext>>; snapshots: (params?: ", - "CatSnapshotsRequest", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "RenderSearchTemplateResponse", + ">; (this: That, params?: ", + "RenderSearchTemplateRequest", " | ", - "CatSnapshotsRequest", + "RenderSearchTemplateRequest", " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "CatSnapshotsResponse", - ", TContext>>; tasks: (params?: ", - "CatTasksRequest", + "RenderSearchTemplateResponse", + ", unknown>>; (this: That, params?: ", + "RenderSearchTemplateRequest", " | ", - "CatTasksRequest", + "RenderSearchTemplateRequest", " | undefined, options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CatTasksResponse", - ", TContext>>; templates: (params?: ", - "CatTemplatesRequest", + " | undefined): Promise<", + "RenderSearchTemplateResponse", + ">; }; rollup: ", + "default", + "; scriptsPainlessExecute: { (this: That, params?: ", + "ScriptsPainlessExecuteRequest", " | ", - "CatTemplatesRequest", + "ScriptsPainlessExecuteRequest", " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CatTemplatesResponse", - ", TContext>>; threadPool: (params?: ", - "CatThreadPoolRequest", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ScriptsPainlessExecuteResponse", + ">; (this: That, params?: ", + "ScriptsPainlessExecuteRequest", " | ", - "CatThreadPoolRequest", + "ScriptsPainlessExecuteRequest", " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "CatThreadPoolResponse", - ", TContext>>; transforms: (params?: ", - "CatTransformsRequest", + "ScriptsPainlessExecuteResponse", + ", unknown>>; (this: That, params?: ", + "ScriptsPainlessExecuteRequest", " | ", - "CatTransformsRequest", + "ScriptsPainlessExecuteRequest", " | undefined, options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CatTransformsResponse", - ", TContext>>; }; ccr: { deleteAutoFollowPattern: (params: ", - "CcrDeleteAutoFollowPatternRequest", + " | undefined): Promise<", + "ScriptsPainlessExecuteResponse", + ">; }; scroll: { >(this: That, params: ", + "ScrollRequest", " | ", - "CcrDeleteAutoFollowPatternRequest", + "ScrollRequest", ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CcrDeleteAutoFollowPatternResponse", - ", TContext>>; follow: (params: ", - "CcrFollowRequest", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ScrollResponse", + ">; >(this: That, params: ", + "ScrollRequest", " | ", - "CcrFollowRequest", + "ScrollRequest", ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "CcrFollowResponse", - ", TContext>>; followInfo: (params: ", - "CcrFollowInfoRequest", + "ScrollResponse", + ", unknown>>; >(this: That, params: ", + "ScrollRequest", " | ", - "CcrFollowInfoRequest", + "ScrollRequest", ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CcrFollowInfoResponse", - ", TContext>>; followStats: (params: ", - "CcrFollowStatsRequest", + " | undefined): Promise<", + "ScrollResponse", + ">; }; searchMvt: { (this: That, params: ", + "SearchMvtRequest", " | ", - "CcrFollowStatsRequest", + "SearchMvtRequest", ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "SearchMvtRequest", + " | ", + "SearchMvtRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", - "<", - "CcrFollowStatsResponse", - ", TContext>>; forgetFollower: (params: ", - "CcrForgetFollowerRequest", + ">; (this: That, params: ", + "SearchMvtRequest", " | ", - "CcrForgetFollowerRequest", + "SearchMvtRequest", ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CcrForgetFollowerResponse", - ", TContext>>; getAutoFollowPattern: (params?: ", - "CcrGetAutoFollowPatternRequest", + " | undefined): Promise; }; searchShards: { (this: That, params?: ", + "SearchShardsRequest", " | ", - "CcrGetAutoFollowPatternRequest", + "SearchShardsRequest", " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CcrGetAutoFollowPatternResponse", - ", TContext>>; pauseAutoFollowPattern: (params: ", - "CcrPauseAutoFollowPatternRequest", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "SearchShardsResponse", + ">; (this: That, params?: ", + "SearchShardsRequest", " | ", - "CcrPauseAutoFollowPatternRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "SearchShardsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "CcrPauseAutoFollowPatternResponse", - ", TContext>>; pauseFollow: (params: ", - "CcrPauseFollowRequest", + "SearchShardsResponse", + ", unknown>>; (this: That, params?: ", + "SearchShardsRequest", " | ", - "CcrPauseFollowRequest", - ", options?: ", + "SearchShardsRequest", + " | undefined, options?: ", "TransportRequestOptions", - " | undefined) => Promise<", + " | undefined): Promise<", + "SearchShardsResponse", + ">; }; searchTemplate: { (this: That, params?: ", + "SearchTemplateRequest", + " | ", + "SearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "SearchTemplateResponse", + ">; (this: That, params?: ", + "SearchTemplateRequest", + " | ", + "SearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "CcrPauseFollowResponse", - ", TContext>>; putAutoFollowPattern: (params: ", - "CcrPutAutoFollowPatternRequest", + "SearchTemplateResponse", + ", unknown>>; (this: That, params?: ", + "SearchTemplateRequest", " | ", - "CcrPutAutoFollowPatternRequest", - ", options?: ", + "SearchTemplateRequest", + " | undefined, options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CcrPutAutoFollowPatternResponse", - ", TContext>>; resumeAutoFollowPattern: (params: ", - "CcrResumeAutoFollowPatternRequest", + " | undefined): Promise<", + "SearchTemplateResponse", + ">; }; searchableSnapshots: ", + "default", + "; shutdown: ", + "default", + "; slm: ", + "default", + "; snapshot: ", + "default", + "; sql: ", + "default", + "; ssl: ", + "default", + "; tasks: ", + "default", + "; termsEnum: { (this: That, params: ", + "TermsEnumRequest", " | ", - "CcrResumeAutoFollowPatternRequest", + "TermsEnumRequest", ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CcrResumeAutoFollowPatternResponse", - ", TContext>>; resumeFollow: (params: ", - "CcrResumeFollowRequest", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "TermsEnumResponse", + ">; (this: That, params: ", + "TermsEnumRequest", " | ", - "CcrResumeFollowRequest", + "TermsEnumRequest", ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "CcrResumeFollowResponse", - ", TContext>>; stats: (params?: ", - "CcrStatsRequest", + "TermsEnumResponse", + ", unknown>>; (this: That, params: ", + "TermsEnumRequest", " | ", - "CcrStatsRequest", - " | undefined, options?: ", + "TermsEnumRequest", + ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", + " | undefined): Promise<", + "TermsEnumResponse", + ">; }; termvectors: { (this: That, params: ", + "TermvectorsRequest", + " | ", + "TermvectorsRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "TermvectorsResponse", + ">; (this: That, params: ", + "TermvectorsRequest", + " | ", + "TermvectorsRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "CcrStatsResponse", - ", TContext>>; unfollow: (params: ", - "CcrUnfollowRequest", - " | ", - "CcrUnfollowRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CcrUnfollowResponse", - ", TContext>>; }; clearScroll: (params?: ", - "ClearScrollRequest", - " | ", - "ClearScrollRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "ClearScrollResponse", - ", TContext>>; cluster: { allocationExplain: (params?: ", - "ClusterAllocationExplainRequest", - " | ", - "ClusterAllocationExplainRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "ClusterAllocationExplainResponse", - ", TContext>>; deleteComponentTemplate: (params: ", - "ClusterDeleteComponentTemplateRequest", - " | ", - "ClusterDeleteComponentTemplateRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "ClusterDeleteComponentTemplateResponse", - ", TContext>>; deleteVotingConfigExclusions: (params?: ", - "ClusterDeleteVotingConfigExclusionsRequest", - " | ", - "ClusterDeleteVotingConfigExclusionsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - ">; existsComponentTemplate: (params: ", - "ClusterExistsComponentTemplateRequest", - " | ", - "ClusterExistsComponentTemplateRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - ">; getComponentTemplate: (params?: ", - "ClusterGetComponentTemplateRequest", - " | ", - "ClusterGetComponentTemplateRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "ClusterGetComponentTemplateResponse", - ", TContext>>; getSettings: (params?: ", - "ClusterGetSettingsRequest", - " | ", - "ClusterGetSettingsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "ClusterGetSettingsResponse", - ", TContext>>; health: (params?: ", - "ClusterHealthRequest", - " | ", - "ClusterHealthRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "ClusterHealthResponse", - ", TContext>>; pendingTasks: (params?: ", - "ClusterPendingTasksRequest", - " | ", - "ClusterPendingTasksRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "ClusterPendingTasksResponse", - ", TContext>>; postVotingConfigExclusions: (params?: ", - "ClusterPostVotingConfigExclusionsRequest", - " | ", - "ClusterPostVotingConfigExclusionsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - ">; putComponentTemplate: (params: ", - "ClusterPutComponentTemplateRequest", - " | ", - "ClusterPutComponentTemplateRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "ClusterPutComponentTemplateResponse", - ", TContext>>; putSettings: (params?: ", - "ClusterPutSettingsRequest", - " | ", - "ClusterPutSettingsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "ClusterPutSettingsResponse", - ", TContext>>; remoteInfo: (params?: ", - "ClusterRemoteInfoRequest", - " | ", - "ClusterRemoteInfoRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "ClusterRemoteInfoResponse", - ", TContext>>; reroute: (params?: ", - "ClusterRerouteRequest", - " | ", - "ClusterRerouteRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "ClusterRerouteResponse", - ", TContext>>; state: (params?: ", - "ClusterStateRequest", - " | ", - "ClusterStateRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - ">; stats: (params?: ", - "ClusterStatsRequest", - " | ", - "ClusterStatsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "ClusterStatsResponse", - ", TContext>>; }; count: (params?: ", - "CountRequest", - " | ", - "CountRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CountResponse", - ", TContext>>; danglingIndices: { deleteDanglingIndex: (params: ", - "DanglingIndicesDeleteDanglingIndexRequest", - " | ", - "DanglingIndicesDeleteDanglingIndexRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "DanglingIndicesDeleteDanglingIndexResponse", - ", TContext>>; importDanglingIndex: (params: ", - "DanglingIndicesImportDanglingIndexRequest", - " | ", - "DanglingIndicesImportDanglingIndexRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "DanglingIndicesImportDanglingIndexResponse", - ", TContext>>; listDanglingIndices: (params?: ", - "DanglingIndicesListDanglingIndicesRequest", - " | ", - "DanglingIndicesListDanglingIndicesRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "DanglingIndicesListDanglingIndicesResponse", - ", TContext>>; }; deleteByQuery: (params: ", - "DeleteByQueryRequest", - " | ", - "DeleteByQueryRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "DeleteByQueryResponse", - ", TContext>>; deleteByQueryRethrottle: (params: ", - "DeleteByQueryRethrottleRequest", - " | ", - "DeleteByQueryRethrottleRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "DeleteByQueryRethrottleResponse", - ", TContext>>; deleteScript: (params: ", - "DeleteScriptRequest", - " | ", - "DeleteScriptRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "DeleteScriptResponse", - ", TContext>>; enrich: { deletePolicy: (params: ", - "EnrichDeletePolicyRequest", - " | ", - "EnrichDeletePolicyRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "EnrichDeletePolicyResponse", - ", TContext>>; executePolicy: (params: ", - "EnrichExecutePolicyRequest", - " | ", - "EnrichExecutePolicyRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "EnrichExecutePolicyResponse", - ", TContext>>; getPolicy: (params?: ", - "EnrichGetPolicyRequest", - " | ", - "EnrichGetPolicyRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "EnrichGetPolicyResponse", - ", TContext>>; putPolicy: (params: ", - "EnrichPutPolicyRequest", - " | ", - "EnrichPutPolicyRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "EnrichPutPolicyResponse", - ", TContext>>; stats: (params?: ", - "EnrichStatsRequest", - " | ", - "EnrichStatsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "EnrichStatsResponse", - ", TContext>>; }; exists: (params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - ">; existsSource: (params: ", - "ExistsSourceRequest", - " | ", - "ExistsSourceRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - ">; explain: (params: ", - "ExplainRequest", - " | ", - "ExplainRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "ExplainResponse", - ", TContext>>; features: { getFeatures: (params?: ", - "FeaturesGetFeaturesRequest", - " | ", - "FeaturesGetFeaturesRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "FeaturesGetFeaturesResponse", - ", TContext>>; resetFeatures: (params?: ", - "FeaturesResetFeaturesRequest", - " | ", - "FeaturesResetFeaturesRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "FeaturesResetFeaturesResponse", - ", TContext>>; }; fieldCaps: (params?: ", - "FieldCapsRequest", - " | ", - "FieldCapsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "FieldCapsResponse", - ", TContext>>; fleet: { globalCheckpoints: (params: ", - "FleetGlobalCheckpointsRequest", - " | ", - "FleetGlobalCheckpointsRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "FleetGlobalCheckpointsResponse", - ", TContext>>; msearch: (params?: ", - "TODO", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TODO", - ", unknown>>; search: (params?: ", - "TODO", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TODO", - ", unknown>>; }; getScript: (params: ", - "GetScriptRequest", - " | ", - "GetScriptRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "GetScriptResponse", - ", TContext>>; getScriptContext: (params?: ", - "GetScriptContextRequest", - " | ", - "GetScriptContextRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "GetScriptContextResponse", - ", TContext>>; getScriptLanguages: (params?: ", - "GetScriptLanguagesRequest", - " | ", - "GetScriptLanguagesRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "GetScriptLanguagesResponse", - ", TContext>>; getSource: (params: ", - "GetSourceRequest", - " | ", - "GetSourceRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - ">; graph: { explore: (params: ", - "GraphExploreRequest", - " | ", - "GraphExploreRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "GraphExploreResponse", - ", TContext>>; }; ilm: { deleteLifecycle: (params: ", - "IlmDeleteLifecycleRequest", - " | ", - "IlmDeleteLifecycleRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IlmDeleteLifecycleResponse", - ", TContext>>; explainLifecycle: (params: ", - "IlmExplainLifecycleRequest", - " | ", - "IlmExplainLifecycleRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IlmExplainLifecycleResponse", - ", TContext>>; getLifecycle: (params?: ", - "IlmGetLifecycleRequest", - " | ", - "IlmGetLifecycleRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IlmGetLifecycleResponse", - ", TContext>>; getStatus: (params?: ", - "IlmGetStatusRequest", - " | ", - "IlmGetStatusRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IlmGetStatusResponse", - ", TContext>>; migrateToDataTiers: (params?: ", - "TODO", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TODO", - ", unknown>>; moveToStep: (params: ", - "IlmMoveToStepRequest", - " | ", - "IlmMoveToStepRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IlmMoveToStepResponse", - ", TContext>>; putLifecycle: (params: ", - "IlmPutLifecycleRequest", - " | ", - "IlmPutLifecycleRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IlmPutLifecycleResponse", - ", TContext>>; removePolicy: (params: ", - "IlmRemovePolicyRequest", - " | ", - "IlmRemovePolicyRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IlmRemovePolicyResponse", - ", TContext>>; retry: (params: ", - "IlmRetryRequest", - " | ", - "IlmRetryRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IlmRetryResponse", - ", TContext>>; start: (params?: ", - "IlmStartRequest", - " | ", - "IlmStartRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IlmStartResponse", - ", TContext>>; stop: (params?: ", - "IlmStopRequest", - " | ", - "IlmStopRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IlmStopResponse", - ", TContext>>; }; indices: { addBlock: (params: ", - "IndicesAddBlockRequest", - " | ", - "IndicesAddBlockRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesAddBlockResponse", - ", TContext>>; analyze: (params?: ", - "IndicesAnalyzeRequest", - " | ", - "IndicesAnalyzeRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesAnalyzeResponse", - ", TContext>>; clearCache: (params?: ", - "IndicesClearCacheRequest", - " | ", - "IndicesClearCacheRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesClearCacheResponse", - ", TContext>>; clone: (params: ", - "IndicesCloneRequest", - " | ", - "IndicesCloneRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesCloneResponse", - ", TContext>>; close: (params: ", - "IndicesCloseRequest", - " | ", - "IndicesCloseRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesCloseResponse", - ", TContext>>; create: (params: ", - "IndicesCreateRequest", - " | ", - "IndicesCreateRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesCreateResponse", - ", TContext>>; createDataStream: (params: ", - "IndicesCreateDataStreamRequest", - " | ", - "IndicesCreateDataStreamRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesCreateDataStreamResponse", - ", TContext>>; dataStreamsStats: (params?: ", - "IndicesDataStreamsStatsRequest", - " | ", - "IndicesDataStreamsStatsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesDataStreamsStatsResponse", - ", TContext>>; delete: (params: ", - "IndicesDeleteRequest", - " | ", - "IndicesDeleteRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesDeleteResponse", - ", TContext>>; deleteAlias: (params: ", - "IndicesDeleteAliasRequest", - " | ", - "IndicesDeleteAliasRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesDeleteAliasResponse", - ", TContext>>; deleteDataStream: (params: ", - "IndicesDeleteDataStreamRequest", - " | ", - "IndicesDeleteDataStreamRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesDeleteDataStreamResponse", - ", TContext>>; deleteIndexTemplate: (params: ", - "IndicesDeleteIndexTemplateRequest", - " | ", - "IndicesDeleteIndexTemplateRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesDeleteIndexTemplateResponse", - ", TContext>>; deleteTemplate: (params: ", - "IndicesDeleteTemplateRequest", - " | ", - "IndicesDeleteTemplateRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesDeleteTemplateResponse", - ", TContext>>; diskUsage: (params: ", - "IndicesDiskUsageRequest", - " | ", - "IndicesDiskUsageRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - ">; exists: (params: ", - "IndicesExistsRequest", - " | ", - "IndicesExistsRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - ">; existsAlias: (params: ", - "IndicesExistsAliasRequest", - " | ", - "IndicesExistsAliasRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - ">; existsIndexTemplate: (params: ", - "IndicesExistsIndexTemplateRequest", - " | ", - "IndicesExistsIndexTemplateRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - ">; existsTemplate: (params: ", - "IndicesExistsTemplateRequest", - " | ", - "IndicesExistsTemplateRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - ">; fieldUsageStats: (params?: ", - "TODO", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TODO", - ", unknown>>; flush: (params?: ", - "IndicesFlushRequest", - " | ", - "IndicesFlushRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesFlushResponse", - ", TContext>>; forcemerge: (params?: ", - "IndicesForcemergeRequest", - " | ", - "IndicesForcemergeRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesForcemergeResponse", - ", TContext>>; get: (params: ", - "IndicesGetRequest", - " | ", - "IndicesGetRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesGetResponse", - ", TContext>>; getAlias: (params?: ", - "IndicesGetAliasRequest", - " | ", - "IndicesGetAliasRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesGetAliasResponse", - ", TContext>>; getDataStream: (params?: ", - "IndicesGetDataStreamRequest", - " | ", - "IndicesGetDataStreamRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesGetDataStreamResponse", - ", TContext>>; getFieldMapping: (params: ", - "IndicesGetFieldMappingRequest", - " | ", - "IndicesGetFieldMappingRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesGetFieldMappingResponse", - ", TContext>>; getIndexTemplate: (params?: ", - "IndicesGetIndexTemplateRequest", - " | ", - "IndicesGetIndexTemplateRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesGetIndexTemplateResponse", - ", TContext>>; getMapping: (params?: ", - "IndicesGetMappingRequest", - " | ", - "IndicesGetMappingRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesGetMappingResponse", - ", TContext>>; getSettings: (params?: ", - "IndicesGetSettingsRequest", - " | ", - "IndicesGetSettingsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesGetSettingsResponse", - ", TContext>>; getTemplate: (params?: ", - "IndicesGetTemplateRequest", - " | ", - "IndicesGetTemplateRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesGetTemplateResponse", - ", TContext>>; migrateToDataStream: (params: ", - "IndicesMigrateToDataStreamRequest", - " | ", - "IndicesMigrateToDataStreamRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesMigrateToDataStreamResponse", - ", TContext>>; modifyDataStream: (params?: ", - "TODO", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TODO", - ", unknown>>; open: (params: ", - "IndicesOpenRequest", - " | ", - "IndicesOpenRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesOpenResponse", - ", TContext>>; promoteDataStream: (params: ", - "IndicesPromoteDataStreamRequest", - " | ", - "IndicesPromoteDataStreamRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - ">; putAlias: (params: ", - "IndicesPutAliasRequest", - " | ", - "IndicesPutAliasRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesPutAliasResponse", - ", TContext>>; putIndexTemplate: (params: ", - "IndicesPutIndexTemplateRequest", - " | ", - "IndicesPutIndexTemplateRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesPutIndexTemplateResponse", - ", TContext>>; putMapping: (params: ", - "IndicesPutMappingRequest", - " | ", - "IndicesPutMappingRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesPutMappingResponse", - ", TContext>>; putSettings: (params?: ", - "IndicesPutSettingsRequest", - " | ", - "IndicesPutSettingsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesPutSettingsResponse", - ", TContext>>; putTemplate: (params: ", - "IndicesPutTemplateRequest", - " | ", - "IndicesPutTemplateRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesPutTemplateResponse", - ", TContext>>; recovery: (params?: ", - "IndicesRecoveryRequest", - " | ", - "IndicesRecoveryRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesRecoveryResponse", - ", TContext>>; refresh: (params?: ", - "IndicesRefreshRequest", - " | ", - "IndicesRefreshRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesRefreshResponse", - ", TContext>>; reloadSearchAnalyzers: (params: ", - "IndicesReloadSearchAnalyzersRequest", - " | ", - "IndicesReloadSearchAnalyzersRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesReloadSearchAnalyzersResponse", - ", TContext>>; resolveIndex: (params: ", - "IndicesResolveIndexRequest", - " | ", - "IndicesResolveIndexRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesResolveIndexResponse", - ", TContext>>; rollover: (params: ", - "IndicesRolloverRequest", - " | ", - "IndicesRolloverRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesRolloverResponse", - ", TContext>>; segments: (params?: ", - "IndicesSegmentsRequest", - " | ", - "IndicesSegmentsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesSegmentsResponse", - ", TContext>>; shardStores: (params?: ", - "IndicesShardStoresRequest", - " | ", - "IndicesShardStoresRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesShardStoresResponse", - ", TContext>>; shrink: (params: ", - "IndicesShrinkRequest", - " | ", - "IndicesShrinkRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesShrinkResponse", - ", TContext>>; simulateIndexTemplate: (params: ", - "IndicesSimulateIndexTemplateRequest", - " | ", - "IndicesSimulateIndexTemplateRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesSimulateIndexTemplateResponse", - ", TContext>>; simulateTemplate: (params?: ", - "IndicesSimulateTemplateRequest", - " | ", - "IndicesSimulateTemplateRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesSimulateTemplateResponse", - ", TContext>>; split: (params: ", - "IndicesSplitRequest", - " | ", - "IndicesSplitRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesSplitResponse", - ", TContext>>; stats: (params?: ", - "IndicesStatsRequest", - " | ", - "IndicesStatsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesStatsResponse", - ", TContext>>; unfreeze: (params: ", - "IndicesUnfreezeRequest", - " | ", - "IndicesUnfreezeRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesUnfreezeResponse", - ", TContext>>; updateAliases: (params?: ", - "IndicesUpdateAliasesRequest", - " | ", - "IndicesUpdateAliasesRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesUpdateAliasesResponse", - ", TContext>>; validateQuery: (params?: ", - "IndicesValidateQueryRequest", - " | ", - "IndicesValidateQueryRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesValidateQueryResponse", - ", TContext>>; }; info: (params?: ", - "InfoRequest", - " | ", - "InfoRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "InfoResponse", - ", TContext>>; ingest: { deletePipeline: (params: ", - "IngestDeletePipelineRequest", - " | ", - "IngestDeletePipelineRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IngestDeletePipelineResponse", - ", TContext>>; geoIpStats: (params?: ", - "IngestGeoIpStatsRequest", - " | ", - "IngestGeoIpStatsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IngestGeoIpStatsResponse", - ", TContext>>; getPipeline: (params?: ", - "IngestGetPipelineRequest", - " | ", - "IngestGetPipelineRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IngestGetPipelineResponse", - ", TContext>>; processorGrok: (params?: ", - "IngestProcessorGrokRequest", - " | ", - "IngestProcessorGrokRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IngestProcessorGrokResponse", - ", TContext>>; putPipeline: (params: ", - "IngestPutPipelineRequest", - " | ", - "IngestPutPipelineRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IngestPutPipelineResponse", - ", TContext>>; simulate: (params?: ", - "IngestSimulateRequest", - " | ", - "IngestSimulateRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IngestSimulateResponse", - ", TContext>>; }; knnSearch: (params: ", - "KnnSearchRequest", - " | ", - "KnnSearchRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "KnnSearchResponse", - ", TContext>>; license: { delete: (params?: ", - "LicenseDeleteRequest", - " | ", - "LicenseDeleteRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "LicenseDeleteResponse", - ", TContext>>; get: (params?: ", - "LicenseGetRequest", - " | ", - "LicenseGetRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "LicenseGetResponse", - ", TContext>>; getBasicStatus: (params?: ", - "LicenseGetBasicStatusRequest", - " | ", - "LicenseGetBasicStatusRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "LicenseGetBasicStatusResponse", - ", TContext>>; getTrialStatus: (params?: ", - "LicenseGetTrialStatusRequest", - " | ", - "LicenseGetTrialStatusRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "LicenseGetTrialStatusResponse", - ", TContext>>; post: (params?: ", - "LicensePostRequest", - " | ", - "LicensePostRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "LicensePostResponse", - ", TContext>>; postStartBasic: (params?: ", - "LicensePostStartBasicRequest", - " | ", - "LicensePostStartBasicRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "LicensePostStartBasicResponse", - ", TContext>>; postStartTrial: (params?: ", - "LicensePostStartTrialRequest", - " | ", - "LicensePostStartTrialRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "LicensePostStartTrialResponse", - ", TContext>>; }; logstash: { deletePipeline: (params: ", - "LogstashDeletePipelineRequest", - " | ", - "LogstashDeletePipelineRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - ">; getPipeline: (params: ", - "LogstashGetPipelineRequest", - " | ", - "LogstashGetPipelineRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "LogstashGetPipelineResponse", - ", TContext>>; putPipeline: (params: ", - "LogstashPutPipelineRequest", - " | ", - "LogstashPutPipelineRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - ">; }; mget: (params?: ", - "MgetRequest", - " | ", - "MgetRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MgetResponse", - ", TContext>>; migration: { deprecations: (params?: ", - "MigrationDeprecationsRequest", - " | ", - "MigrationDeprecationsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MigrationDeprecationsResponse", - ", TContext>>; getFeatureUpgradeStatus: (params?: ", - "TODO", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TODO", - ", unknown>>; postFeatureUpgrade: (params?: ", - "TODO", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TODO", - ", unknown>>; }; ml: { closeJob: (params: ", - "MlCloseJobRequest", - " | ", - "MlCloseJobRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlCloseJobResponse", - ", TContext>>; deleteCalendar: (params: ", - "MlDeleteCalendarRequest", - " | ", - "MlDeleteCalendarRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlDeleteCalendarResponse", - ", TContext>>; deleteCalendarEvent: (params: ", - "MlDeleteCalendarEventRequest", - " | ", - "MlDeleteCalendarEventRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlDeleteCalendarEventResponse", - ", TContext>>; deleteCalendarJob: (params: ", - "MlDeleteCalendarJobRequest", - " | ", - "MlDeleteCalendarJobRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlDeleteCalendarJobResponse", - ", TContext>>; deleteDataFrameAnalytics: (params: ", - "MlDeleteDataFrameAnalyticsRequest", - " | ", - "MlDeleteDataFrameAnalyticsRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlDeleteDataFrameAnalyticsResponse", - ", TContext>>; deleteDatafeed: (params: ", - "MlDeleteDatafeedRequest", - " | ", - "MlDeleteDatafeedRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlDeleteDatafeedResponse", - ", TContext>>; deleteExpiredData: (params?: ", - "MlDeleteExpiredDataRequest", - " | ", - "MlDeleteExpiredDataRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlDeleteExpiredDataResponse", - ", TContext>>; deleteFilter: (params: ", - "MlDeleteFilterRequest", - " | ", - "MlDeleteFilterRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlDeleteFilterResponse", - ", TContext>>; deleteForecast: (params: ", - "MlDeleteForecastRequest", - " | ", - "MlDeleteForecastRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlDeleteForecastResponse", - ", TContext>>; deleteJob: (params: ", - "MlDeleteJobRequest", - " | ", - "MlDeleteJobRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlDeleteJobResponse", - ", TContext>>; deleteModelSnapshot: (params: ", - "MlDeleteModelSnapshotRequest", - " | ", - "MlDeleteModelSnapshotRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlDeleteModelSnapshotResponse", - ", TContext>>; deleteTrainedModel: (params: ", - "MlDeleteTrainedModelRequest", - " | ", - "MlDeleteTrainedModelRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlDeleteTrainedModelResponse", - ", TContext>>; deleteTrainedModelAlias: (params: ", - "MlDeleteTrainedModelAliasRequest", - " | ", - "MlDeleteTrainedModelAliasRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlDeleteTrainedModelAliasResponse", - ", TContext>>; estimateModelMemory: (params?: ", - "MlEstimateModelMemoryRequest", - " | ", - "MlEstimateModelMemoryRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlEstimateModelMemoryResponse", - ", TContext>>; evaluateDataFrame: (params?: ", - "MlEvaluateDataFrameRequest", - " | ", - "MlEvaluateDataFrameRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlEvaluateDataFrameResponse", - ", TContext>>; explainDataFrameAnalytics: (params?: ", - "MlExplainDataFrameAnalyticsRequest", - " | ", - "MlExplainDataFrameAnalyticsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlExplainDataFrameAnalyticsResponse", - ", TContext>>; flushJob: (params: ", - "MlFlushJobRequest", - " | ", - "MlFlushJobRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlFlushJobResponse", - ", TContext>>; forecast: (params: ", - "MlForecastRequest", - " | ", - "MlForecastRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlForecastResponse", - ", TContext>>; getBuckets: (params: ", - "MlGetBucketsRequest", - " | ", - "MlGetBucketsRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlGetBucketsResponse", - ", TContext>>; getCalendarEvents: (params: ", - "MlGetCalendarEventsRequest", - " | ", - "MlGetCalendarEventsRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlGetCalendarEventsResponse", - ", TContext>>; getCalendars: (params?: ", - "MlGetCalendarsRequest", - " | ", - "MlGetCalendarsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlGetCalendarsResponse", - ", TContext>>; getCategories: (params: ", - "MlGetCategoriesRequest", - " | ", - "MlGetCategoriesRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlGetCategoriesResponse", - ", TContext>>; getDataFrameAnalytics: (params?: ", - "MlGetDataFrameAnalyticsRequest", - " | ", - "MlGetDataFrameAnalyticsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlGetDataFrameAnalyticsResponse", - ", TContext>>; getDataFrameAnalyticsStats: (params?: ", - "MlGetDataFrameAnalyticsStatsRequest", - " | ", - "MlGetDataFrameAnalyticsStatsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlGetDataFrameAnalyticsStatsResponse", - ", TContext>>; getDatafeedStats: (params?: ", - "MlGetDatafeedStatsRequest", - " | ", - "MlGetDatafeedStatsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlGetDatafeedStatsResponse", - ", TContext>>; getDatafeeds: (params?: ", - "MlGetDatafeedsRequest", - " | ", - "MlGetDatafeedsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlGetDatafeedsResponse", - ", TContext>>; getFilters: (params?: ", - "MlGetFiltersRequest", - " | ", - "MlGetFiltersRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlGetFiltersResponse", - ", TContext>>; getInfluencers: (params: ", - "MlGetInfluencersRequest", - " | ", - "MlGetInfluencersRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlGetInfluencersResponse", - ", TContext>>; getJobStats: (params?: ", - "MlGetJobStatsRequest", - " | ", - "MlGetJobStatsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlGetJobStatsResponse", - ", TContext>>; getJobs: (params?: ", - "MlGetJobsRequest", - " | ", - "MlGetJobsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlGetJobsResponse", - ", TContext>>; getModelSnapshotUpgradeStats: (params?: ", - "TODO", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TODO", - ", unknown>>; getModelSnapshots: (params: ", - "MlGetModelSnapshotsRequest", - " | ", - "MlGetModelSnapshotsRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlGetModelSnapshotsResponse", - ", TContext>>; getOverallBuckets: (params: ", - "MlGetOverallBucketsRequest", - " | ", - "MlGetOverallBucketsRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlGetOverallBucketsResponse", - ", TContext>>; getRecords: (params: ", - "MlGetRecordsRequest", - " | ", - "MlGetRecordsRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlGetRecordsResponse", - ", TContext>>; getTrainedModels: (params?: ", - "MlGetTrainedModelsRequest", - " | ", - "MlGetTrainedModelsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlGetTrainedModelsResponse", - ", TContext>>; getTrainedModelsStats: (params?: ", - "MlGetTrainedModelsStatsRequest", - " | ", - "MlGetTrainedModelsStatsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlGetTrainedModelsStatsResponse", - ", TContext>>; inferTrainedModelDeployment: (params: ", - "MlInferTrainedModelDeploymentRequest", - " | ", - "MlInferTrainedModelDeploymentRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlInferTrainedModelDeploymentResponse", - ", TContext>>; info: (params?: ", - "MlInfoRequest", - " | ", - "MlInfoRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlInfoResponse", - ", TContext>>; openJob: (params: ", - "MlOpenJobRequest", - " | ", - "MlOpenJobRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlOpenJobResponse", - ", TContext>>; postCalendarEvents: (params: ", - "MlPostCalendarEventsRequest", - " | ", - "MlPostCalendarEventsRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlPostCalendarEventsResponse", - ", TContext>>; postData: (params: ", - "MlPostDataRequest", - " | ", - "MlPostDataRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlPostDataResponse", - ", TContext>>; previewDataFrameAnalytics: (params?: ", - "MlPreviewDataFrameAnalyticsRequest", - " | ", - "MlPreviewDataFrameAnalyticsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlPreviewDataFrameAnalyticsResponse", - ", TContext>>; previewDatafeed: (params?: ", - "MlPreviewDatafeedRequest", - " | ", - "MlPreviewDatafeedRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlPreviewDatafeedResponse", - ", TContext>>; putCalendar: (params: ", - "MlPutCalendarRequest", - " | ", - "MlPutCalendarRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlPutCalendarResponse", - ", TContext>>; putCalendarJob: (params: ", - "MlPutCalendarJobRequest", - " | ", - "MlPutCalendarJobRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlPutCalendarJobResponse", - ", TContext>>; putDataFrameAnalytics: (params: ", - "MlPutDataFrameAnalyticsRequest", - " | ", - "MlPutDataFrameAnalyticsRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlPutDataFrameAnalyticsResponse", - ", TContext>>; putDatafeed: (params: ", - "MlPutDatafeedRequest", - " | ", - "MlPutDatafeedRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlPutDatafeedResponse", - ", TContext>>; putFilter: (params: ", - "MlPutFilterRequest", - " | ", - "MlPutFilterRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlPutFilterResponse", - ", TContext>>; putJob: (params: ", - "MlPutJobRequest", - " | ", - "MlPutJobRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlPutJobResponse", - ", TContext>>; putTrainedModel: (params: ", - "MlPutTrainedModelRequest", - " | ", - "MlPutTrainedModelRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlTrainedModelConfig", - ", TContext>>; putTrainedModelAlias: (params: ", - "MlPutTrainedModelAliasRequest", - " | ", - "MlPutTrainedModelAliasRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlPutTrainedModelAliasResponse", - ", TContext>>; putTrainedModelDefinitionPart: (params: ", - "MlPutTrainedModelDefinitionPartRequest", - " | ", - "MlPutTrainedModelDefinitionPartRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlPutTrainedModelDefinitionPartResponse", - ", TContext>>; putTrainedModelVocabulary: (params: ", - "MlPutTrainedModelVocabularyRequest", - " | ", - "MlPutTrainedModelVocabularyRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlPutTrainedModelVocabularyResponse", - ", TContext>>; resetJob: (params: ", - "MlResetJobRequest", - " | ", - "MlResetJobRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlResetJobResponse", - ", TContext>>; revertModelSnapshot: (params: ", - "MlRevertModelSnapshotRequest", - " | ", - "MlRevertModelSnapshotRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlRevertModelSnapshotResponse", - ", TContext>>; setUpgradeMode: (params?: ", - "MlSetUpgradeModeRequest", - " | ", - "MlSetUpgradeModeRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlSetUpgradeModeResponse", - ", TContext>>; startDataFrameAnalytics: (params: ", - "MlStartDataFrameAnalyticsRequest", - " | ", - "MlStartDataFrameAnalyticsRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlStartDataFrameAnalyticsResponse", - ", TContext>>; startDatafeed: (params: ", - "MlStartDatafeedRequest", - " | ", - "MlStartDatafeedRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlStartDatafeedResponse", - ", TContext>>; startTrainedModelDeployment: (params: ", - "MlStartTrainedModelDeploymentRequest", - " | ", - "MlStartTrainedModelDeploymentRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlStartTrainedModelDeploymentResponse", - ", TContext>>; stopDataFrameAnalytics: (params: ", - "MlStopDataFrameAnalyticsRequest", - " | ", - "MlStopDataFrameAnalyticsRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlStopDataFrameAnalyticsResponse", - ", TContext>>; stopDatafeed: (params: ", - "MlStopDatafeedRequest", - " | ", - "MlStopDatafeedRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlStopDatafeedResponse", - ", TContext>>; stopTrainedModelDeployment: (params: ", - "MlStopTrainedModelDeploymentRequest", - " | ", - "MlStopTrainedModelDeploymentRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlStopTrainedModelDeploymentResponse", - ", TContext>>; updateDataFrameAnalytics: (params: ", - "MlUpdateDataFrameAnalyticsRequest", - " | ", - "MlUpdateDataFrameAnalyticsRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlUpdateDataFrameAnalyticsResponse", - ", TContext>>; updateDatafeed: (params: ", - "MlUpdateDatafeedRequest", - " | ", - "MlUpdateDatafeedRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlUpdateDatafeedResponse", - ", TContext>>; updateFilter: (params: ", - "MlUpdateFilterRequest", - " | ", - "MlUpdateFilterRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlUpdateFilterResponse", - ", TContext>>; updateJob: (params: ", - "MlUpdateJobRequest", - " | ", - "MlUpdateJobRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlUpdateJobResponse", - ", TContext>>; updateModelSnapshot: (params: ", - "MlUpdateModelSnapshotRequest", - " | ", - "MlUpdateModelSnapshotRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlUpdateModelSnapshotResponse", - ", TContext>>; upgradeJobSnapshot: (params: ", - "MlUpgradeJobSnapshotRequest", - " | ", - "MlUpgradeJobSnapshotRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlUpgradeJobSnapshotResponse", - ", TContext>>; validate: (params?: ", - "MlValidateRequest", - " | ", - "MlValidateRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlValidateResponse", - ", TContext>>; validateDetector: (params?: ", - "MlValidateDetectorRequest", - " | ", - "MlValidateDetectorRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlValidateDetectorResponse", - ", TContext>>; }; msearch: , TContext = unknown>(params?: ", - "MsearchRequest", - " | ", - "MsearchRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MsearchResponse", - ", TContext>>; msearchTemplate: , TContext = unknown>(params?: ", - "MsearchTemplateRequest", - " | ", - "MsearchTemplateRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MsearchTemplateResponse", - ", TContext>>; mtermvectors: (params?: ", - "MtermvectorsRequest", - " | ", - "MtermvectorsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MtermvectorsResponse", - ", TContext>>; nodes: { clearRepositoriesMeteringArchive: (params?: ", - "TODO", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TODO", - ", unknown>>; getRepositoriesMeteringInfo: (params?: ", - "TODO", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TODO", - ", unknown>>; hotThreads: (params?: ", - "NodesHotThreadsRequest", - " | ", - "NodesHotThreadsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "NodesHotThreadsResponse", - ", TContext>>; info: (params?: ", - "NodesInfoRequest", - " | ", - "NodesInfoRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "NodesInfoResponse", - ", TContext>>; reloadSecureSettings: (params?: ", - "NodesReloadSecureSettingsRequest", - " | ", - "NodesReloadSecureSettingsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "NodesReloadSecureSettingsResponse", - ", TContext>>; stats: (params?: ", - "NodesStatsRequest", - " | ", - "NodesStatsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "NodesStatsResponse", - ", TContext>>; usage: (params?: ", - "NodesUsageRequest", - " | ", - "NodesUsageRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "NodesUsageResponse", - ", TContext>>; }; openPointInTime: (params: ", - "OpenPointInTimeRequest", - " | ", - "OpenPointInTimeRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "OpenPointInTimeResponse", - ", TContext>>; ping: (params?: ", - "PingRequest", - " | ", - "PingRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - ">; putScript: (params: ", - "PutScriptRequest", - " | ", - "PutScriptRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "PutScriptResponse", - ", TContext>>; rankEval: (params: ", - "RankEvalRequest", - " | ", - "RankEvalRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "RankEvalResponse", - ", TContext>>; reindex: (params?: ", - "ReindexRequest", - " | ", - "ReindexRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "ReindexResponse", - ", TContext>>; reindexRethrottle: (params: ", - "ReindexRethrottleRequest", - " | ", - "ReindexRethrottleRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "ReindexRethrottleResponse", - ", TContext>>; renderSearchTemplate: (params?: ", - "RenderSearchTemplateRequest", - " | ", - "RenderSearchTemplateRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "RenderSearchTemplateResponse", - ", TContext>>; rollup: { deleteJob: (params: ", - "RollupDeleteJobRequest", - " | ", - "RollupDeleteJobRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "RollupDeleteJobResponse", - ", TContext>>; getJobs: (params?: ", - "RollupGetJobsRequest", - " | ", - "RollupGetJobsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "RollupGetJobsResponse", - ", TContext>>; getRollupCaps: (params?: ", - "RollupGetRollupCapsRequest", - " | ", - "RollupGetRollupCapsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "RollupGetRollupCapsResponse", - ", TContext>>; getRollupIndexCaps: (params: ", - "RollupGetRollupIndexCapsRequest", - " | ", - "RollupGetRollupIndexCapsRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "RollupGetRollupIndexCapsResponse", - ", TContext>>; putJob: (params: ", - "RollupPutJobRequest", - " | ", - "RollupPutJobRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "RollupPutJobResponse", - ", TContext>>; rollup: (params: ", - "RollupRollupRequest", - " | ", - "RollupRollupRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - ">; rollupSearch: , TContext = unknown>(params: ", - "RollupRollupSearchRequest", - " | ", - "RollupRollupSearchRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "RollupRollupSearchResponse", - ", TContext>>; startJob: (params: ", - "RollupStartJobRequest", - " | ", - "RollupStartJobRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "RollupStartJobResponse", - ", TContext>>; stopJob: (params: ", - "RollupStopJobRequest", - " | ", - "RollupStopJobRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "RollupStopJobResponse", - ", TContext>>; }; scriptsPainlessExecute: (params?: ", - "ScriptsPainlessExecuteRequest", - " | ", - "ScriptsPainlessExecuteRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "ScriptsPainlessExecuteResponse", - ", TContext>>; scroll: , TContext = unknown>(params?: ", - "ScrollRequest", - " | ", - "ScrollRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "ScrollResponse", - ", TContext>>; searchMvt: (params: ", - "SearchMvtRequest", - " | ", - "SearchMvtRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - ">; searchShards: (params?: ", - "SearchShardsRequest", - " | ", - "SearchShardsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SearchShardsResponse", - ", TContext>>; searchTemplate: (params?: ", - "SearchTemplateRequest", - " | ", - "SearchTemplateRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SearchTemplateResponse", - ", TContext>>; searchableSnapshots: { cacheStats: (params?: ", - "TODO", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TODO", - ", unknown>>; clearCache: (params?: ", - "SearchableSnapshotsClearCacheRequest", - " | ", - "SearchableSnapshotsClearCacheRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - ">; mount: (params: ", - "SearchableSnapshotsMountRequest", - " | ", - "SearchableSnapshotsMountRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SearchableSnapshotsMountResponse", - ", TContext>>; stats: (params?: ", - "SearchableSnapshotsStatsRequest", - " | ", - "SearchableSnapshotsStatsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SearchableSnapshotsStatsResponse", - ", TContext>>; }; shutdown: { deleteNode: (params: ", - "ShutdownDeleteNodeRequest", - " | ", - "ShutdownDeleteNodeRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "ShutdownDeleteNodeResponse", - ", TContext>>; getNode: (params?: ", - "ShutdownGetNodeRequest", - " | ", - "ShutdownGetNodeRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "ShutdownGetNodeResponse", - ", TContext>>; putNode: (params: ", - "ShutdownPutNodeRequest", - " | ", - "ShutdownPutNodeRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "ShutdownPutNodeResponse", - ", TContext>>; }; slm: { deleteLifecycle: (params: ", - "SlmDeleteLifecycleRequest", - " | ", - "SlmDeleteLifecycleRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SlmDeleteLifecycleResponse", - ", TContext>>; executeLifecycle: (params: ", - "SlmExecuteLifecycleRequest", - " | ", - "SlmExecuteLifecycleRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SlmExecuteLifecycleResponse", - ", TContext>>; executeRetention: (params?: ", - "SlmExecuteRetentionRequest", - " | ", - "SlmExecuteRetentionRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SlmExecuteRetentionResponse", - ", TContext>>; getLifecycle: (params?: ", - "SlmGetLifecycleRequest", - " | ", - "SlmGetLifecycleRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SlmGetLifecycleResponse", - ", TContext>>; getStats: (params?: ", - "SlmGetStatsRequest", - " | ", - "SlmGetStatsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SlmGetStatsResponse", - ", TContext>>; getStatus: (params?: ", - "SlmGetStatusRequest", - " | ", - "SlmGetStatusRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SlmGetStatusResponse", - ", TContext>>; putLifecycle: (params: ", - "SlmPutLifecycleRequest", - " | ", - "SlmPutLifecycleRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SlmPutLifecycleResponse", - ", TContext>>; start: (params?: ", - "SlmStartRequest", - " | ", - "SlmStartRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SlmStartResponse", - ", TContext>>; stop: (params?: ", - "SlmStopRequest", - " | ", - "SlmStopRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SlmStopResponse", - ", TContext>>; }; snapshot: { cleanupRepository: (params: ", - "SnapshotCleanupRepositoryRequest", - " | ", - "SnapshotCleanupRepositoryRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SnapshotCleanupRepositoryResponse", - ", TContext>>; clone: (params: ", - "SnapshotCloneRequest", - " | ", - "SnapshotCloneRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SnapshotCloneResponse", - ", TContext>>; create: (params: ", - "SnapshotCreateRequest", - " | ", - "SnapshotCreateRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SnapshotCreateResponse", - ", TContext>>; createRepository: (params: ", - "SnapshotCreateRepositoryRequest", - " | ", - "SnapshotCreateRepositoryRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SnapshotCreateRepositoryResponse", - ", TContext>>; delete: (params: ", - "SnapshotDeleteRequest", - " | ", - "SnapshotDeleteRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SnapshotDeleteResponse", - ", TContext>>; deleteRepository: (params: ", - "SnapshotDeleteRepositoryRequest", - " | ", - "SnapshotDeleteRepositoryRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SnapshotDeleteRepositoryResponse", - ", TContext>>; get: (params: ", - "SnapshotGetRequest", - " | ", - "SnapshotGetRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SnapshotGetResponse", - ", TContext>>; getRepository: (params?: ", - "SnapshotGetRepositoryRequest", - " | ", - "SnapshotGetRepositoryRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SnapshotGetRepositoryResponse", - ", TContext>>; repositoryAnalyze: (params?: ", - "TODO", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TODO", - ", unknown>>; restore: (params: ", - "SnapshotRestoreRequest", - " | ", - "SnapshotRestoreRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SnapshotRestoreResponse", - ", TContext>>; status: (params?: ", - "SnapshotStatusRequest", - " | ", - "SnapshotStatusRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SnapshotStatusResponse", - ", TContext>>; verifyRepository: (params: ", - "SnapshotVerifyRepositoryRequest", - " | ", - "SnapshotVerifyRepositoryRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SnapshotVerifyRepositoryResponse", - ", TContext>>; }; sql: { clearCursor: (params?: ", - "SqlClearCursorRequest", - " | ", - "SqlClearCursorRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SqlClearCursorResponse", - ", TContext>>; deleteAsync: (params?: ", - "TODO", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TODO", - ", unknown>>; getAsync: (params?: ", - "TODO", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TODO", - ", unknown>>; getAsyncStatus: (params?: ", - "TODO", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TODO", - ", unknown>>; query: (params?: ", - "SqlQueryRequest", - " | ", - "SqlQueryRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SqlQueryResponse", - ", TContext>>; translate: (params?: ", - "SqlTranslateRequest", - " | ", - "SqlTranslateRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SqlTranslateResponse", - ", TContext>>; }; ssl: { certificates: (params?: ", - "SslCertificatesRequest", - " | ", - "SslCertificatesRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SslCertificatesResponse", - ", TContext>>; }; tasks: { cancel: (params?: ", - "TasksCancelRequest", - " | ", - "TasksCancelRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TasksCancelResponse", - ", TContext>>; get: (params: ", - "TasksGetRequest", - " | ", - "TasksGetRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TasksGetResponse", - ", TContext>>; list: (params?: ", - "TasksListRequest", - " | ", - "TasksListRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TasksListResponse", - ", TContext>>; }; termsEnum: (params: ", - "TermsEnumRequest", - " | ", - "TermsEnumRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TermsEnumResponse", - ", TContext>>; termvectors: (params: ", - "TermvectorsRequest", - " | ", - "TermvectorsRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TermvectorsResponse", - ", TContext>>; textStructure: { findStructure: (params: ", - "TextStructureFindStructureRequest", - " | ", - "TextStructureFindStructureRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TextStructureFindStructureResponse", - ", TContext>>; }; updateByQuery: (params: ", - "UpdateByQueryRequest", - " | ", - "UpdateByQueryRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "UpdateByQueryResponse", - ", TContext>>; updateByQueryRethrottle: (params: ", - "UpdateByQueryRethrottleRequest", - " | ", - "UpdateByQueryRethrottleRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "UpdateByQueryRethrottleResponse", - ", TContext>>; watcher: { ackWatch: (params: ", - "WatcherAckWatchRequest", - " | ", - "WatcherAckWatchRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "WatcherAckWatchResponse", - ", TContext>>; activateWatch: (params: ", - "WatcherActivateWatchRequest", - " | ", - "WatcherActivateWatchRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "WatcherActivateWatchResponse", - ", TContext>>; deactivateWatch: (params: ", - "WatcherDeactivateWatchRequest", - " | ", - "WatcherDeactivateWatchRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "WatcherDeactivateWatchResponse", - ", TContext>>; deleteWatch: (params: ", - "WatcherDeleteWatchRequest", - " | ", - "WatcherDeleteWatchRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "WatcherDeleteWatchResponse", - ", TContext>>; executeWatch: (params?: ", - "WatcherExecuteWatchRequest", - " | ", - "WatcherExecuteWatchRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "WatcherExecuteWatchResponse", - ", TContext>>; getWatch: (params: ", - "WatcherGetWatchRequest", - " | ", - "WatcherGetWatchRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "WatcherGetWatchResponse", - ", TContext>>; putWatch: (params: ", - "WatcherPutWatchRequest", - " | ", - "WatcherPutWatchRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "WatcherPutWatchResponse", - ", TContext>>; queryWatches: (params?: ", - "WatcherQueryWatchesRequest", - " | ", - "WatcherQueryWatchesRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "WatcherQueryWatchesResponse", - ", TContext>>; start: (params?: ", - "WatcherStartRequest", - " | ", - "WatcherStartRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "WatcherStartResponse", - ", TContext>>; stats: (params?: ", - "WatcherStatsRequest", - " | ", - "WatcherStatsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "WatcherStatsResponse", - ", TContext>>; stop: (params?: ", - "WatcherStopRequest", - " | ", - "WatcherStopRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "WatcherStopResponse", - ", TContext>>; }; xpack: { info: (params?: ", - "XpackInfoRequest", - " | ", - "XpackInfoRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "XpackInfoResponse", - ", TContext>>; usage: (params?: ", - "XpackUsageRequest", - " | ", - "XpackUsageRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "XpackUsageResponse", - ", TContext>>; }; }" - ], - "path": "packages/kbn-securitysolution-es-utils/src/get_index_aliases/index.ts", - "deprecated": false - }, - { - "parentPluginId": "@kbn/securitysolution-es-utils", - "id": "def-server.getIndexAliases.$1.alias", - "type": "string", - "tags": [], - "label": "alias", - "description": [], - "path": "packages/kbn-securitysolution-es-utils/src/get_index_aliases/index.ts", - "deprecated": false - } - ] - } - ], - "returnComment": [ - "an array of {@link IndexAlias } objects" - ], - "initialIsOpen": false - }, - { - "parentPluginId": "@kbn/securitysolution-es-utils", - "id": "def-server.getIndexCount", - "type": "Function", - "tags": [], - "label": "getIndexCount", - "description": [ - "\nRetrieves the count of documents in a given index\n" - ], - "signature": [ - "({ esClient, index, }: { esClient: ", - "ElasticsearchClient", - "; index: string; }) => Promise" - ], - "path": "packages/kbn-securitysolution-es-utils/src/get_index_count/index.ts", - "deprecated": false, - "children": [ - { - "parentPluginId": "@kbn/securitysolution-es-utils", - "id": "def-server.getIndexCount.$1", - "type": "Object", - "tags": [], - "label": "{\n esClient,\n index,\n}", - "description": [], - "path": "packages/kbn-securitysolution-es-utils/src/get_index_count/index.ts", - "deprecated": false, - "children": [ - { - "parentPluginId": "@kbn/securitysolution-es-utils", - "id": "def-server.getIndexCount.$1.esClient", - "type": "Object", - "tags": [], - "label": "esClient", - "description": [], - "signature": [ - "{ eql: { delete: (params: ", - "EqlDeleteRequest", - " | ", - "EqlDeleteRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "EqlDeleteResponse", - ", TContext>>; get: (params: ", - "EqlGetRequest", - " | ", - "EqlGetRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "EqlGetResponse", - ", TContext>>; getStatus: (params: ", - "EqlGetStatusRequest", - " | ", - "EqlGetStatusRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "EqlGetStatusResponse", - ", TContext>>; search: (params: ", - "EqlSearchRequest", - " | ", - "EqlSearchRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "EqlSearchResponse", - ", TContext>>; }; search: , TContext = unknown>(params?: ", - "SearchRequest", - " | ", - "SearchRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SearchResponse", - ", TContext>>; create: (params: ", - "CreateRequest", - " | ", - "CreateRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CreateResponse", - ", TContext>>; monitoring: { bulk: (params: ", - "MonitoringBulkRequest", - " | ", - "MonitoringBulkRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MonitoringBulkResponse", - ", TContext>>; }; security: { authenticate: (params?: ", - "SecurityAuthenticateRequest", - " | ", - "SecurityAuthenticateRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityAuthenticateResponse", - ", TContext>>; changePassword: (params?: ", - "SecurityChangePasswordRequest", - " | ", - "SecurityChangePasswordRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityChangePasswordResponse", - ", TContext>>; clearApiKeyCache: (params: ", - "SecurityClearApiKeyCacheRequest", - " | ", - "SecurityClearApiKeyCacheRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityClearApiKeyCacheResponse", - ", TContext>>; clearCachedPrivileges: (params: ", - "SecurityClearCachedPrivilegesRequest", - " | ", - "SecurityClearCachedPrivilegesRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityClearCachedPrivilegesResponse", - ", TContext>>; clearCachedRealms: (params: ", - "SecurityClearCachedRealmsRequest", - " | ", - "SecurityClearCachedRealmsRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityClearCachedRealmsResponse", - ", TContext>>; clearCachedRoles: (params: ", - "SecurityClearCachedRolesRequest", - " | ", - "SecurityClearCachedRolesRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityClearCachedRolesResponse", - ", TContext>>; clearCachedServiceTokens: (params: ", - "SecurityClearCachedServiceTokensRequest", - " | ", - "SecurityClearCachedServiceTokensRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityClearCachedServiceTokensResponse", - ", TContext>>; createApiKey: (params?: ", - "SecurityCreateApiKeyRequest", - " | ", - "SecurityCreateApiKeyRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityCreateApiKeyResponse", - ", TContext>>; createServiceToken: (params: ", - "SecurityCreateServiceTokenRequest", - " | ", - "SecurityCreateServiceTokenRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityCreateServiceTokenResponse", - ", TContext>>; deletePrivileges: (params: ", - "SecurityDeletePrivilegesRequest", - " | ", - "SecurityDeletePrivilegesRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityDeletePrivilegesResponse", - ", TContext>>; deleteRole: (params: ", - "SecurityDeleteRoleRequest", - " | ", - "SecurityDeleteRoleRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityDeleteRoleResponse", - ", TContext>>; deleteRoleMapping: (params: ", - "SecurityDeleteRoleMappingRequest", - " | ", - "SecurityDeleteRoleMappingRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityDeleteRoleMappingResponse", - ", TContext>>; deleteServiceToken: (params: ", - "SecurityDeleteServiceTokenRequest", - " | ", - "SecurityDeleteServiceTokenRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityDeleteServiceTokenResponse", - ", TContext>>; deleteUser: (params: ", - "SecurityDeleteUserRequest", - " | ", - "SecurityDeleteUserRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityDeleteUserResponse", - ", TContext>>; disableUser: (params: ", - "SecurityDisableUserRequest", - " | ", - "SecurityDisableUserRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityDisableUserResponse", - ", TContext>>; enableUser: (params: ", - "SecurityEnableUserRequest", - " | ", - "SecurityEnableUserRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityEnableUserResponse", - ", TContext>>; enrollKibana: (params?: ", - "TODO", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TODO", - ", unknown>>; enrollNode: (params?: ", - "TODO", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TODO", - ", unknown>>; getApiKey: (params?: ", - "SecurityGetApiKeyRequest", - " | ", - "SecurityGetApiKeyRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityGetApiKeyResponse", - ", TContext>>; getBuiltinPrivileges: (params?: ", - "SecurityGetBuiltinPrivilegesRequest", - " | ", - "SecurityGetBuiltinPrivilegesRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityGetBuiltinPrivilegesResponse", - ", TContext>>; getPrivileges: (params?: ", - "SecurityGetPrivilegesRequest", - " | ", - "SecurityGetPrivilegesRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityGetPrivilegesResponse", - ", TContext>>; getRole: (params?: ", - "SecurityGetRoleRequest", - " | ", - "SecurityGetRoleRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityGetRoleResponse", - ", TContext>>; getRoleMapping: (params?: ", - "SecurityGetRoleMappingRequest", - " | ", - "SecurityGetRoleMappingRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityGetRoleMappingResponse", - ", TContext>>; getServiceAccounts: (params?: ", - "SecurityGetServiceAccountsRequest", - " | ", - "SecurityGetServiceAccountsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityGetServiceAccountsResponse", - ", TContext>>; getServiceCredentials: (params: ", - "SecurityGetServiceCredentialsRequest", - " | ", - "SecurityGetServiceCredentialsRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityGetServiceCredentialsResponse", - ", TContext>>; getToken: (params?: ", - "SecurityGetTokenRequest", - " | ", - "SecurityGetTokenRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityGetTokenResponse", - ", TContext>>; getUser: (params?: ", - "SecurityGetUserRequest", - " | ", - "SecurityGetUserRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityGetUserResponse", - ", TContext>>; getUserPrivileges: (params?: ", - "SecurityGetUserPrivilegesRequest", - " | ", - "SecurityGetUserPrivilegesRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityGetUserPrivilegesResponse", - ", TContext>>; grantApiKey: (params?: ", - "SecurityGrantApiKeyRequest", - " | ", - "SecurityGrantApiKeyRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityGrantApiKeyResponse", - ", TContext>>; hasPrivileges: (params?: ", - "SecurityHasPrivilegesRequest", - " | ", - "SecurityHasPrivilegesRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityHasPrivilegesResponse", - ", TContext>>; invalidateApiKey: (params?: ", - "SecurityInvalidateApiKeyRequest", - " | ", - "SecurityInvalidateApiKeyRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityInvalidateApiKeyResponse", - ", TContext>>; invalidateToken: (params?: ", - "SecurityInvalidateTokenRequest", - " | ", - "SecurityInvalidateTokenRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityInvalidateTokenResponse", - ", TContext>>; putPrivileges: (params?: ", - "SecurityPutPrivilegesRequest", - " | ", - "SecurityPutPrivilegesRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityPutPrivilegesResponse", - ", TContext>>; putRole: (params: ", - "SecurityPutRoleRequest", - " | ", - "SecurityPutRoleRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityPutRoleResponse", - ", TContext>>; putRoleMapping: (params: ", - "SecurityPutRoleMappingRequest", - " | ", - "SecurityPutRoleMappingRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityPutRoleMappingResponse", - ", TContext>>; putUser: (params: ", - "SecurityPutUserRequest", - " | ", - "SecurityPutUserRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SecurityPutUserResponse", - ", TContext>>; queryApiKeys: (params?: ", - "TODO", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TODO", - ", unknown>>; samlAuthenticate: (params?: ", - "TODO", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TODO", - ", unknown>>; samlCompleteLogout: (params?: ", - "TODO", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TODO", - ", unknown>>; samlInvalidate: (params?: ", - "TODO", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TODO", - ", unknown>>; samlLogout: (params?: ", - "TODO", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TODO", - ", unknown>>; samlPrepareAuthentication: (params?: ", - "TODO", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TODO", - ", unknown>>; samlServiceProviderMetadata: (params?: ", - "TODO", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TODO", - ", unknown>>; }; name: string | symbol; index: (params: ", - "IndexRequest", - " | ", - "IndexRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndexResponse", - ", TContext>>; delete: (params: ", - "DeleteRequest", - " | ", - "DeleteRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "DeleteResponse", - ", TContext>>; get: (params: ", - "GetRequest", - " | ", - "GetRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "GetResponse", - ", TContext>>; update: (params: ", - "UpdateRequest", - " | ", - "UpdateRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "UpdateResponse", - ", TContext>>; closePointInTime: (params?: ", - "ClosePointInTimeRequest", - " | ", - "ClosePointInTimeRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "ClosePointInTimeResponse", - ", TContext>>; transform: { deleteTransform: (params: ", - "TransformDeleteTransformRequest", - " | ", - "TransformDeleteTransformRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TransformDeleteTransformResponse", - ", TContext>>; getTransform: (params?: ", - "TransformGetTransformRequest", - " | ", - "TransformGetTransformRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TransformGetTransformResponse", - ", TContext>>; getTransformStats: (params: ", - "TransformGetTransformStatsRequest", - " | ", - "TransformGetTransformStatsRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TransformGetTransformStatsResponse", - ", TContext>>; previewTransform: (params?: ", - "TransformPreviewTransformRequest", - " | ", - "TransformPreviewTransformRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TransformPreviewTransformResponse", - ", TContext>>; putTransform: (params: ", - "TransformPutTransformRequest", - " | ", - "TransformPutTransformRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TransformPutTransformResponse", - ", TContext>>; resetTransform: (params: ", - "TransformResetTransformRequest", - " | ", - "TransformResetTransformRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TransformResetTransformResponse", - ", TContext>>; startTransform: (params: ", - "TransformStartTransformRequest", - " | ", - "TransformStartTransformRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TransformStartTransformResponse", - ", TContext>>; stopTransform: (params: ", - "TransformStopTransformRequest", - " | ", - "TransformStopTransformRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TransformStopTransformResponse", - ", TContext>>; updateTransform: (params: ", - "TransformUpdateTransformRequest", - " | ", - "TransformUpdateTransformRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TransformUpdateTransformResponse", - ", TContext>>; upgradeTransforms: (params?: ", - "TransformUpgradeTransformsRequest", - " | ", - "TransformUpgradeTransformsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TransformUpgradeTransformsResponse", - ", TContext>>; }; helpers: ", - "default", - "; asyncSearch: { delete: (params: ", - "AsyncSearchDeleteRequest", - " | ", - "AsyncSearchDeleteRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "AsyncSearchDeleteResponse", - ", TContext>>; get: (params: ", - "AsyncSearchGetRequest", - " | ", - "AsyncSearchGetRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "AsyncSearchGetResponse", - ", TContext>>; status: (params: ", - "AsyncSearchStatusRequest", - " | ", - "AsyncSearchStatusRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "AsyncSearchStatusResponse", - ", TContext>>; submit: (params?: ", - "AsyncSearchSubmitRequest", - " | ", - "AsyncSearchSubmitRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "AsyncSearchSubmitResponse", - ", TContext>>; }; autoscaling: { deleteAutoscalingPolicy: (params: ", - "AutoscalingDeleteAutoscalingPolicyRequest", - " | ", - "AutoscalingDeleteAutoscalingPolicyRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "AutoscalingDeleteAutoscalingPolicyResponse", - ", TContext>>; getAutoscalingCapacity: (params?: ", - "AutoscalingGetAutoscalingCapacityRequest", - " | ", - "AutoscalingGetAutoscalingCapacityRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "AutoscalingGetAutoscalingCapacityResponse", - ", TContext>>; getAutoscalingPolicy: (params: ", - "AutoscalingGetAutoscalingPolicyRequest", - " | ", - "AutoscalingGetAutoscalingPolicyRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "AutoscalingAutoscalingPolicy", - ", TContext>>; putAutoscalingPolicy: (params: ", - "AutoscalingPutAutoscalingPolicyRequest", - " | ", - "AutoscalingPutAutoscalingPolicyRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "AutoscalingPutAutoscalingPolicyResponse", - ", TContext>>; }; bulk: (params: ", - "BulkRequest", - " | ", - "BulkRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "BulkResponse", - ", TContext>>; cat: { aliases: (params?: ", - "CatAliasesRequest", - " | ", - "CatAliasesRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CatAliasesResponse", - ", TContext>>; allocation: (params?: ", - "CatAllocationRequest", - " | ", - "CatAllocationRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CatAllocationResponse", - ", TContext>>; count: (params?: ", - "CatCountRequest", - " | ", - "CatCountRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CatCountResponse", - ", TContext>>; fielddata: (params?: ", - "CatFielddataRequest", - " | ", - "CatFielddataRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CatFielddataResponse", - ", TContext>>; health: (params?: ", - "CatHealthRequest", - " | ", - "CatHealthRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CatHealthResponse", - ", TContext>>; help: (params?: ", - "CatHelpRequest", - " | ", - "CatHelpRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CatHelpResponse", - ", TContext>>; indices: (params?: ", - "CatIndicesRequest", - " | ", - "CatIndicesRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CatIndicesResponse", - ", TContext>>; master: (params?: ", - "CatMasterRequest", - " | ", - "CatMasterRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CatMasterResponse", - ", TContext>>; mlDataFrameAnalytics: (params?: ", - "CatMlDataFrameAnalyticsRequest", - " | ", - "CatMlDataFrameAnalyticsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CatMlDataFrameAnalyticsResponse", - ", TContext>>; mlDatafeeds: (params?: ", - "CatMlDatafeedsRequest", - " | ", - "CatMlDatafeedsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CatMlDatafeedsResponse", - ", TContext>>; mlJobs: (params?: ", - "CatMlJobsRequest", - " | ", - "CatMlJobsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CatMlJobsResponse", - ", TContext>>; mlTrainedModels: (params?: ", - "CatMlTrainedModelsRequest", - " | ", - "CatMlTrainedModelsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CatMlTrainedModelsResponse", - ", TContext>>; nodeattrs: (params?: ", - "CatNodeattrsRequest", - " | ", - "CatNodeattrsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CatNodeattrsResponse", - ", TContext>>; nodes: (params?: ", - "CatNodesRequest", - " | ", - "CatNodesRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CatNodesResponse", - ", TContext>>; pendingTasks: (params?: ", - "CatPendingTasksRequest", - " | ", - "CatPendingTasksRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CatPendingTasksResponse", - ", TContext>>; plugins: (params?: ", - "CatPluginsRequest", - " | ", - "CatPluginsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CatPluginsResponse", - ", TContext>>; recovery: (params?: ", - "CatRecoveryRequest", - " | ", - "CatRecoveryRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CatRecoveryResponse", - ", TContext>>; repositories: (params?: ", - "CatRepositoriesRequest", - " | ", - "CatRepositoriesRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CatRepositoriesResponse", - ", TContext>>; segments: (params?: ", - "CatSegmentsRequest", - " | ", - "CatSegmentsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CatSegmentsResponse", - ", TContext>>; shards: (params?: ", - "CatShardsRequest", - " | ", - "CatShardsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CatShardsResponse", - ", TContext>>; snapshots: (params?: ", - "CatSnapshotsRequest", - " | ", - "CatSnapshotsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CatSnapshotsResponse", - ", TContext>>; tasks: (params?: ", - "CatTasksRequest", - " | ", - "CatTasksRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CatTasksResponse", - ", TContext>>; templates: (params?: ", - "CatTemplatesRequest", - " | ", - "CatTemplatesRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CatTemplatesResponse", - ", TContext>>; threadPool: (params?: ", - "CatThreadPoolRequest", - " | ", - "CatThreadPoolRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CatThreadPoolResponse", - ", TContext>>; transforms: (params?: ", - "CatTransformsRequest", - " | ", - "CatTransformsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CatTransformsResponse", - ", TContext>>; }; ccr: { deleteAutoFollowPattern: (params: ", - "CcrDeleteAutoFollowPatternRequest", - " | ", - "CcrDeleteAutoFollowPatternRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CcrDeleteAutoFollowPatternResponse", - ", TContext>>; follow: (params: ", - "CcrFollowRequest", - " | ", - "CcrFollowRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CcrFollowResponse", - ", TContext>>; followInfo: (params: ", - "CcrFollowInfoRequest", - " | ", - "CcrFollowInfoRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CcrFollowInfoResponse", - ", TContext>>; followStats: (params: ", - "CcrFollowStatsRequest", - " | ", - "CcrFollowStatsRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CcrFollowStatsResponse", - ", TContext>>; forgetFollower: (params: ", - "CcrForgetFollowerRequest", - " | ", - "CcrForgetFollowerRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CcrForgetFollowerResponse", - ", TContext>>; getAutoFollowPattern: (params?: ", - "CcrGetAutoFollowPatternRequest", - " | ", - "CcrGetAutoFollowPatternRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CcrGetAutoFollowPatternResponse", - ", TContext>>; pauseAutoFollowPattern: (params: ", - "CcrPauseAutoFollowPatternRequest", - " | ", - "CcrPauseAutoFollowPatternRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CcrPauseAutoFollowPatternResponse", - ", TContext>>; pauseFollow: (params: ", - "CcrPauseFollowRequest", - " | ", - "CcrPauseFollowRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CcrPauseFollowResponse", - ", TContext>>; putAutoFollowPattern: (params: ", - "CcrPutAutoFollowPatternRequest", - " | ", - "CcrPutAutoFollowPatternRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CcrPutAutoFollowPatternResponse", - ", TContext>>; resumeAutoFollowPattern: (params: ", - "CcrResumeAutoFollowPatternRequest", - " | ", - "CcrResumeAutoFollowPatternRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CcrResumeAutoFollowPatternResponse", - ", TContext>>; resumeFollow: (params: ", - "CcrResumeFollowRequest", - " | ", - "CcrResumeFollowRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CcrResumeFollowResponse", - ", TContext>>; stats: (params?: ", - "CcrStatsRequest", - " | ", - "CcrStatsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CcrStatsResponse", - ", TContext>>; unfollow: (params: ", - "CcrUnfollowRequest", - " | ", - "CcrUnfollowRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CcrUnfollowResponse", - ", TContext>>; }; clearScroll: (params?: ", - "ClearScrollRequest", - " | ", - "ClearScrollRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "ClearScrollResponse", - ", TContext>>; cluster: { allocationExplain: (params?: ", - "ClusterAllocationExplainRequest", - " | ", - "ClusterAllocationExplainRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "ClusterAllocationExplainResponse", - ", TContext>>; deleteComponentTemplate: (params: ", - "ClusterDeleteComponentTemplateRequest", - " | ", - "ClusterDeleteComponentTemplateRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "ClusterDeleteComponentTemplateResponse", - ", TContext>>; deleteVotingConfigExclusions: (params?: ", - "ClusterDeleteVotingConfigExclusionsRequest", - " | ", - "ClusterDeleteVotingConfigExclusionsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - ">; existsComponentTemplate: (params: ", - "ClusterExistsComponentTemplateRequest", - " | ", - "ClusterExistsComponentTemplateRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - ">; getComponentTemplate: (params?: ", - "ClusterGetComponentTemplateRequest", - " | ", - "ClusterGetComponentTemplateRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "ClusterGetComponentTemplateResponse", - ", TContext>>; getSettings: (params?: ", - "ClusterGetSettingsRequest", - " | ", - "ClusterGetSettingsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "ClusterGetSettingsResponse", - ", TContext>>; health: (params?: ", - "ClusterHealthRequest", - " | ", - "ClusterHealthRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "ClusterHealthResponse", - ", TContext>>; pendingTasks: (params?: ", - "ClusterPendingTasksRequest", - " | ", - "ClusterPendingTasksRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "ClusterPendingTasksResponse", - ", TContext>>; postVotingConfigExclusions: (params?: ", - "ClusterPostVotingConfigExclusionsRequest", - " | ", - "ClusterPostVotingConfigExclusionsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - ">; putComponentTemplate: (params: ", - "ClusterPutComponentTemplateRequest", - " | ", - "ClusterPutComponentTemplateRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "ClusterPutComponentTemplateResponse", - ", TContext>>; putSettings: (params?: ", - "ClusterPutSettingsRequest", - " | ", - "ClusterPutSettingsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "ClusterPutSettingsResponse", - ", TContext>>; remoteInfo: (params?: ", - "ClusterRemoteInfoRequest", - " | ", - "ClusterRemoteInfoRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "ClusterRemoteInfoResponse", - ", TContext>>; reroute: (params?: ", - "ClusterRerouteRequest", - " | ", - "ClusterRerouteRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "ClusterRerouteResponse", - ", TContext>>; state: (params?: ", - "ClusterStateRequest", - " | ", - "ClusterStateRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - ">; stats: (params?: ", - "ClusterStatsRequest", - " | ", - "ClusterStatsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "ClusterStatsResponse", - ", TContext>>; }; count: (params?: ", - "CountRequest", - " | ", - "CountRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "CountResponse", - ", TContext>>; danglingIndices: { deleteDanglingIndex: (params: ", - "DanglingIndicesDeleteDanglingIndexRequest", - " | ", - "DanglingIndicesDeleteDanglingIndexRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "DanglingIndicesDeleteDanglingIndexResponse", - ", TContext>>; importDanglingIndex: (params: ", - "DanglingIndicesImportDanglingIndexRequest", - " | ", - "DanglingIndicesImportDanglingIndexRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "DanglingIndicesImportDanglingIndexResponse", - ", TContext>>; listDanglingIndices: (params?: ", - "DanglingIndicesListDanglingIndicesRequest", - " | ", - "DanglingIndicesListDanglingIndicesRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "DanglingIndicesListDanglingIndicesResponse", - ", TContext>>; }; deleteByQuery: (params: ", - "DeleteByQueryRequest", - " | ", - "DeleteByQueryRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "DeleteByQueryResponse", - ", TContext>>; deleteByQueryRethrottle: (params: ", - "DeleteByQueryRethrottleRequest", - " | ", - "DeleteByQueryRethrottleRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "DeleteByQueryRethrottleResponse", - ", TContext>>; deleteScript: (params: ", - "DeleteScriptRequest", - " | ", - "DeleteScriptRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "DeleteScriptResponse", - ", TContext>>; enrich: { deletePolicy: (params: ", - "EnrichDeletePolicyRequest", - " | ", - "EnrichDeletePolicyRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "EnrichDeletePolicyResponse", - ", TContext>>; executePolicy: (params: ", - "EnrichExecutePolicyRequest", - " | ", - "EnrichExecutePolicyRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "EnrichExecutePolicyResponse", - ", TContext>>; getPolicy: (params?: ", - "EnrichGetPolicyRequest", - " | ", - "EnrichGetPolicyRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "EnrichGetPolicyResponse", - ", TContext>>; putPolicy: (params: ", - "EnrichPutPolicyRequest", - " | ", - "EnrichPutPolicyRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "EnrichPutPolicyResponse", - ", TContext>>; stats: (params?: ", - "EnrichStatsRequest", - " | ", - "EnrichStatsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "EnrichStatsResponse", - ", TContext>>; }; exists: (params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - ">; existsSource: (params: ", - "ExistsSourceRequest", - " | ", - "ExistsSourceRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - ">; explain: (params: ", - "ExplainRequest", - " | ", - "ExplainRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "ExplainResponse", - ", TContext>>; features: { getFeatures: (params?: ", - "FeaturesGetFeaturesRequest", - " | ", - "FeaturesGetFeaturesRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "FeaturesGetFeaturesResponse", - ", TContext>>; resetFeatures: (params?: ", - "FeaturesResetFeaturesRequest", - " | ", - "FeaturesResetFeaturesRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "FeaturesResetFeaturesResponse", - ", TContext>>; }; fieldCaps: (params?: ", - "FieldCapsRequest", - " | ", - "FieldCapsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "FieldCapsResponse", - ", TContext>>; fleet: { globalCheckpoints: (params: ", - "FleetGlobalCheckpointsRequest", - " | ", - "FleetGlobalCheckpointsRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "FleetGlobalCheckpointsResponse", - ", TContext>>; msearch: (params?: ", - "TODO", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TODO", - ", unknown>>; search: (params?: ", - "TODO", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TODO", - ", unknown>>; }; getScript: (params: ", - "GetScriptRequest", - " | ", - "GetScriptRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "GetScriptResponse", - ", TContext>>; getScriptContext: (params?: ", - "GetScriptContextRequest", - " | ", - "GetScriptContextRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "GetScriptContextResponse", - ", TContext>>; getScriptLanguages: (params?: ", - "GetScriptLanguagesRequest", - " | ", - "GetScriptLanguagesRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "GetScriptLanguagesResponse", - ", TContext>>; getSource: (params: ", - "GetSourceRequest", - " | ", - "GetSourceRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - ">; graph: { explore: (params: ", - "GraphExploreRequest", - " | ", - "GraphExploreRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "GraphExploreResponse", - ", TContext>>; }; ilm: { deleteLifecycle: (params: ", - "IlmDeleteLifecycleRequest", - " | ", - "IlmDeleteLifecycleRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IlmDeleteLifecycleResponse", - ", TContext>>; explainLifecycle: (params: ", - "IlmExplainLifecycleRequest", - " | ", - "IlmExplainLifecycleRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IlmExplainLifecycleResponse", - ", TContext>>; getLifecycle: (params?: ", - "IlmGetLifecycleRequest", - " | ", - "IlmGetLifecycleRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IlmGetLifecycleResponse", - ", TContext>>; getStatus: (params?: ", - "IlmGetStatusRequest", - " | ", - "IlmGetStatusRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IlmGetStatusResponse", - ", TContext>>; migrateToDataTiers: (params?: ", - "TODO", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TODO", - ", unknown>>; moveToStep: (params: ", - "IlmMoveToStepRequest", - " | ", - "IlmMoveToStepRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IlmMoveToStepResponse", - ", TContext>>; putLifecycle: (params: ", - "IlmPutLifecycleRequest", - " | ", - "IlmPutLifecycleRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IlmPutLifecycleResponse", - ", TContext>>; removePolicy: (params: ", - "IlmRemovePolicyRequest", - " | ", - "IlmRemovePolicyRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IlmRemovePolicyResponse", - ", TContext>>; retry: (params: ", - "IlmRetryRequest", - " | ", - "IlmRetryRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IlmRetryResponse", - ", TContext>>; start: (params?: ", - "IlmStartRequest", - " | ", - "IlmStartRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IlmStartResponse", - ", TContext>>; stop: (params?: ", - "IlmStopRequest", - " | ", - "IlmStopRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IlmStopResponse", - ", TContext>>; }; indices: { addBlock: (params: ", - "IndicesAddBlockRequest", - " | ", - "IndicesAddBlockRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesAddBlockResponse", - ", TContext>>; analyze: (params?: ", - "IndicesAnalyzeRequest", - " | ", - "IndicesAnalyzeRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesAnalyzeResponse", - ", TContext>>; clearCache: (params?: ", - "IndicesClearCacheRequest", - " | ", - "IndicesClearCacheRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesClearCacheResponse", - ", TContext>>; clone: (params: ", - "IndicesCloneRequest", - " | ", - "IndicesCloneRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesCloneResponse", - ", TContext>>; close: (params: ", - "IndicesCloseRequest", - " | ", - "IndicesCloseRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesCloseResponse", - ", TContext>>; create: (params: ", - "IndicesCreateRequest", - " | ", - "IndicesCreateRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesCreateResponse", - ", TContext>>; createDataStream: (params: ", - "IndicesCreateDataStreamRequest", - " | ", - "IndicesCreateDataStreamRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesCreateDataStreamResponse", - ", TContext>>; dataStreamsStats: (params?: ", - "IndicesDataStreamsStatsRequest", - " | ", - "IndicesDataStreamsStatsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesDataStreamsStatsResponse", - ", TContext>>; delete: (params: ", - "IndicesDeleteRequest", - " | ", - "IndicesDeleteRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesDeleteResponse", - ", TContext>>; deleteAlias: (params: ", - "IndicesDeleteAliasRequest", - " | ", - "IndicesDeleteAliasRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesDeleteAliasResponse", - ", TContext>>; deleteDataStream: (params: ", - "IndicesDeleteDataStreamRequest", - " | ", - "IndicesDeleteDataStreamRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesDeleteDataStreamResponse", - ", TContext>>; deleteIndexTemplate: (params: ", - "IndicesDeleteIndexTemplateRequest", - " | ", - "IndicesDeleteIndexTemplateRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesDeleteIndexTemplateResponse", - ", TContext>>; deleteTemplate: (params: ", - "IndicesDeleteTemplateRequest", - " | ", - "IndicesDeleteTemplateRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesDeleteTemplateResponse", - ", TContext>>; diskUsage: (params: ", - "IndicesDiskUsageRequest", - " | ", - "IndicesDiskUsageRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - ">; exists: (params: ", - "IndicesExistsRequest", - " | ", - "IndicesExistsRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - ">; existsAlias: (params: ", - "IndicesExistsAliasRequest", - " | ", - "IndicesExistsAliasRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - ">; existsIndexTemplate: (params: ", - "IndicesExistsIndexTemplateRequest", - " | ", - "IndicesExistsIndexTemplateRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - ">; existsTemplate: (params: ", - "IndicesExistsTemplateRequest", - " | ", - "IndicesExistsTemplateRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - ">; fieldUsageStats: (params?: ", - "TODO", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TODO", - ", unknown>>; flush: (params?: ", - "IndicesFlushRequest", - " | ", - "IndicesFlushRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesFlushResponse", - ", TContext>>; forcemerge: (params?: ", - "IndicesForcemergeRequest", - " | ", - "IndicesForcemergeRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesForcemergeResponse", - ", TContext>>; get: (params: ", - "IndicesGetRequest", - " | ", - "IndicesGetRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesGetResponse", - ", TContext>>; getAlias: (params?: ", - "IndicesGetAliasRequest", - " | ", - "IndicesGetAliasRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesGetAliasResponse", - ", TContext>>; getDataStream: (params?: ", - "IndicesGetDataStreamRequest", - " | ", - "IndicesGetDataStreamRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesGetDataStreamResponse", - ", TContext>>; getFieldMapping: (params: ", - "IndicesGetFieldMappingRequest", - " | ", - "IndicesGetFieldMappingRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesGetFieldMappingResponse", - ", TContext>>; getIndexTemplate: (params?: ", - "IndicesGetIndexTemplateRequest", - " | ", - "IndicesGetIndexTemplateRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesGetIndexTemplateResponse", - ", TContext>>; getMapping: (params?: ", - "IndicesGetMappingRequest", - " | ", - "IndicesGetMappingRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesGetMappingResponse", - ", TContext>>; getSettings: (params?: ", - "IndicesGetSettingsRequest", - " | ", - "IndicesGetSettingsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesGetSettingsResponse", - ", TContext>>; getTemplate: (params?: ", - "IndicesGetTemplateRequest", - " | ", - "IndicesGetTemplateRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesGetTemplateResponse", - ", TContext>>; migrateToDataStream: (params: ", - "IndicesMigrateToDataStreamRequest", - " | ", - "IndicesMigrateToDataStreamRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesMigrateToDataStreamResponse", - ", TContext>>; modifyDataStream: (params?: ", - "TODO", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TODO", - ", unknown>>; open: (params: ", - "IndicesOpenRequest", - " | ", - "IndicesOpenRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesOpenResponse", - ", TContext>>; promoteDataStream: (params: ", - "IndicesPromoteDataStreamRequest", - " | ", - "IndicesPromoteDataStreamRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - ">; putAlias: (params: ", - "IndicesPutAliasRequest", - " | ", - "IndicesPutAliasRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesPutAliasResponse", - ", TContext>>; putIndexTemplate: (params: ", - "IndicesPutIndexTemplateRequest", - " | ", - "IndicesPutIndexTemplateRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesPutIndexTemplateResponse", - ", TContext>>; putMapping: (params: ", - "IndicesPutMappingRequest", - " | ", - "IndicesPutMappingRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesPutMappingResponse", - ", TContext>>; putSettings: (params?: ", - "IndicesPutSettingsRequest", - " | ", - "IndicesPutSettingsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesPutSettingsResponse", - ", TContext>>; putTemplate: (params: ", - "IndicesPutTemplateRequest", - " | ", - "IndicesPutTemplateRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesPutTemplateResponse", - ", TContext>>; recovery: (params?: ", - "IndicesRecoveryRequest", - " | ", - "IndicesRecoveryRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesRecoveryResponse", - ", TContext>>; refresh: (params?: ", - "IndicesRefreshRequest", - " | ", - "IndicesRefreshRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesRefreshResponse", - ", TContext>>; reloadSearchAnalyzers: (params: ", - "IndicesReloadSearchAnalyzersRequest", - " | ", - "IndicesReloadSearchAnalyzersRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesReloadSearchAnalyzersResponse", - ", TContext>>; resolveIndex: (params: ", - "IndicesResolveIndexRequest", - " | ", - "IndicesResolveIndexRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesResolveIndexResponse", - ", TContext>>; rollover: (params: ", - "IndicesRolloverRequest", - " | ", - "IndicesRolloverRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesRolloverResponse", - ", TContext>>; segments: (params?: ", - "IndicesSegmentsRequest", - " | ", - "IndicesSegmentsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesSegmentsResponse", - ", TContext>>; shardStores: (params?: ", - "IndicesShardStoresRequest", - " | ", - "IndicesShardStoresRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesShardStoresResponse", - ", TContext>>; shrink: (params: ", - "IndicesShrinkRequest", - " | ", - "IndicesShrinkRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesShrinkResponse", - ", TContext>>; simulateIndexTemplate: (params: ", - "IndicesSimulateIndexTemplateRequest", - " | ", - "IndicesSimulateIndexTemplateRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesSimulateIndexTemplateResponse", - ", TContext>>; simulateTemplate: (params?: ", - "IndicesSimulateTemplateRequest", - " | ", - "IndicesSimulateTemplateRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesSimulateTemplateResponse", - ", TContext>>; split: (params: ", - "IndicesSplitRequest", - " | ", - "IndicesSplitRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesSplitResponse", - ", TContext>>; stats: (params?: ", - "IndicesStatsRequest", - " | ", - "IndicesStatsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesStatsResponse", - ", TContext>>; unfreeze: (params: ", - "IndicesUnfreezeRequest", - " | ", - "IndicesUnfreezeRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesUnfreezeResponse", - ", TContext>>; updateAliases: (params?: ", - "IndicesUpdateAliasesRequest", - " | ", - "IndicesUpdateAliasesRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesUpdateAliasesResponse", - ", TContext>>; validateQuery: (params?: ", - "IndicesValidateQueryRequest", - " | ", - "IndicesValidateQueryRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IndicesValidateQueryResponse", - ", TContext>>; }; info: (params?: ", - "InfoRequest", - " | ", - "InfoRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "InfoResponse", - ", TContext>>; ingest: { deletePipeline: (params: ", - "IngestDeletePipelineRequest", - " | ", - "IngestDeletePipelineRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IngestDeletePipelineResponse", - ", TContext>>; geoIpStats: (params?: ", - "IngestGeoIpStatsRequest", - " | ", - "IngestGeoIpStatsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IngestGeoIpStatsResponse", - ", TContext>>; getPipeline: (params?: ", - "IngestGetPipelineRequest", - " | ", - "IngestGetPipelineRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IngestGetPipelineResponse", - ", TContext>>; processorGrok: (params?: ", - "IngestProcessorGrokRequest", - " | ", - "IngestProcessorGrokRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IngestProcessorGrokResponse", - ", TContext>>; putPipeline: (params: ", - "IngestPutPipelineRequest", - " | ", - "IngestPutPipelineRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IngestPutPipelineResponse", - ", TContext>>; simulate: (params?: ", - "IngestSimulateRequest", - " | ", - "IngestSimulateRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "IngestSimulateResponse", - ", TContext>>; }; knnSearch: (params: ", - "KnnSearchRequest", - " | ", - "KnnSearchRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "KnnSearchResponse", - ", TContext>>; license: { delete: (params?: ", - "LicenseDeleteRequest", - " | ", - "LicenseDeleteRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "LicenseDeleteResponse", - ", TContext>>; get: (params?: ", - "LicenseGetRequest", - " | ", - "LicenseGetRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "LicenseGetResponse", - ", TContext>>; getBasicStatus: (params?: ", - "LicenseGetBasicStatusRequest", - " | ", - "LicenseGetBasicStatusRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "LicenseGetBasicStatusResponse", - ", TContext>>; getTrialStatus: (params?: ", - "LicenseGetTrialStatusRequest", - " | ", - "LicenseGetTrialStatusRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "LicenseGetTrialStatusResponse", - ", TContext>>; post: (params?: ", - "LicensePostRequest", - " | ", - "LicensePostRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "LicensePostResponse", - ", TContext>>; postStartBasic: (params?: ", - "LicensePostStartBasicRequest", - " | ", - "LicensePostStartBasicRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "LicensePostStartBasicResponse", - ", TContext>>; postStartTrial: (params?: ", - "LicensePostStartTrialRequest", - " | ", - "LicensePostStartTrialRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "LicensePostStartTrialResponse", - ", TContext>>; }; logstash: { deletePipeline: (params: ", - "LogstashDeletePipelineRequest", - " | ", - "LogstashDeletePipelineRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - ">; getPipeline: (params: ", - "LogstashGetPipelineRequest", - " | ", - "LogstashGetPipelineRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "LogstashGetPipelineResponse", - ", TContext>>; putPipeline: (params: ", - "LogstashPutPipelineRequest", - " | ", - "LogstashPutPipelineRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - ">; }; mget: (params?: ", - "MgetRequest", - " | ", - "MgetRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MgetResponse", - ", TContext>>; migration: { deprecations: (params?: ", - "MigrationDeprecationsRequest", - " | ", - "MigrationDeprecationsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MigrationDeprecationsResponse", - ", TContext>>; getFeatureUpgradeStatus: (params?: ", - "TODO", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TODO", - ", unknown>>; postFeatureUpgrade: (params?: ", - "TODO", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TODO", - ", unknown>>; }; ml: { closeJob: (params: ", - "MlCloseJobRequest", - " | ", - "MlCloseJobRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlCloseJobResponse", - ", TContext>>; deleteCalendar: (params: ", - "MlDeleteCalendarRequest", - " | ", - "MlDeleteCalendarRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlDeleteCalendarResponse", - ", TContext>>; deleteCalendarEvent: (params: ", - "MlDeleteCalendarEventRequest", - " | ", - "MlDeleteCalendarEventRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlDeleteCalendarEventResponse", - ", TContext>>; deleteCalendarJob: (params: ", - "MlDeleteCalendarJobRequest", - " | ", - "MlDeleteCalendarJobRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlDeleteCalendarJobResponse", - ", TContext>>; deleteDataFrameAnalytics: (params: ", - "MlDeleteDataFrameAnalyticsRequest", - " | ", - "MlDeleteDataFrameAnalyticsRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlDeleteDataFrameAnalyticsResponse", - ", TContext>>; deleteDatafeed: (params: ", - "MlDeleteDatafeedRequest", - " | ", - "MlDeleteDatafeedRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlDeleteDatafeedResponse", - ", TContext>>; deleteExpiredData: (params?: ", - "MlDeleteExpiredDataRequest", - " | ", - "MlDeleteExpiredDataRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlDeleteExpiredDataResponse", - ", TContext>>; deleteFilter: (params: ", - "MlDeleteFilterRequest", - " | ", - "MlDeleteFilterRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlDeleteFilterResponse", - ", TContext>>; deleteForecast: (params: ", - "MlDeleteForecastRequest", - " | ", - "MlDeleteForecastRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlDeleteForecastResponse", - ", TContext>>; deleteJob: (params: ", - "MlDeleteJobRequest", - " | ", - "MlDeleteJobRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlDeleteJobResponse", - ", TContext>>; deleteModelSnapshot: (params: ", - "MlDeleteModelSnapshotRequest", - " | ", - "MlDeleteModelSnapshotRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlDeleteModelSnapshotResponse", - ", TContext>>; deleteTrainedModel: (params: ", - "MlDeleteTrainedModelRequest", - " | ", - "MlDeleteTrainedModelRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlDeleteTrainedModelResponse", - ", TContext>>; deleteTrainedModelAlias: (params: ", - "MlDeleteTrainedModelAliasRequest", - " | ", - "MlDeleteTrainedModelAliasRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlDeleteTrainedModelAliasResponse", - ", TContext>>; estimateModelMemory: (params?: ", - "MlEstimateModelMemoryRequest", - " | ", - "MlEstimateModelMemoryRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlEstimateModelMemoryResponse", - ", TContext>>; evaluateDataFrame: (params?: ", - "MlEvaluateDataFrameRequest", - " | ", - "MlEvaluateDataFrameRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlEvaluateDataFrameResponse", - ", TContext>>; explainDataFrameAnalytics: (params?: ", - "MlExplainDataFrameAnalyticsRequest", - " | ", - "MlExplainDataFrameAnalyticsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlExplainDataFrameAnalyticsResponse", - ", TContext>>; flushJob: (params: ", - "MlFlushJobRequest", - " | ", - "MlFlushJobRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlFlushJobResponse", - ", TContext>>; forecast: (params: ", - "MlForecastRequest", - " | ", - "MlForecastRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlForecastResponse", - ", TContext>>; getBuckets: (params: ", - "MlGetBucketsRequest", - " | ", - "MlGetBucketsRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlGetBucketsResponse", - ", TContext>>; getCalendarEvents: (params: ", - "MlGetCalendarEventsRequest", - " | ", - "MlGetCalendarEventsRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlGetCalendarEventsResponse", - ", TContext>>; getCalendars: (params?: ", - "MlGetCalendarsRequest", - " | ", - "MlGetCalendarsRequest", - " | undefined, options?: ", + "TermvectorsResponse", + ", unknown>>; (this: That, params: ", + "TermvectorsRequest", + " | ", + "TermvectorsRequest", + ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlGetCalendarsResponse", - ", TContext>>; getCategories: (params: ", - "MlGetCategoriesRequest", + " | undefined): Promise<", + "TermvectorsResponse", + ">; }; textStructure: ", + "default", + "; updateByQuery: { (this: That, params: ", + "UpdateByQueryRequest", " | ", - "MlGetCategoriesRequest", + "UpdateByQueryRequest", ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlGetCategoriesResponse", - ", TContext>>; getDataFrameAnalytics: (params?: ", - "MlGetDataFrameAnalyticsRequest", - " | ", - "MlGetDataFrameAnalyticsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlGetDataFrameAnalyticsResponse", - ", TContext>>; getDataFrameAnalyticsStats: (params?: ", - "MlGetDataFrameAnalyticsStatsRequest", - " | ", - "MlGetDataFrameAnalyticsStatsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlGetDataFrameAnalyticsStatsResponse", - ", TContext>>; getDatafeedStats: (params?: ", - "MlGetDatafeedStatsRequest", - " | ", - "MlGetDatafeedStatsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlGetDatafeedStatsResponse", - ", TContext>>; getDatafeeds: (params?: ", - "MlGetDatafeedsRequest", - " | ", - "MlGetDatafeedsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlGetDatafeedsResponse", - ", TContext>>; getFilters: (params?: ", - "MlGetFiltersRequest", - " | ", - "MlGetFiltersRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlGetFiltersResponse", - ", TContext>>; getInfluencers: (params: ", - "MlGetInfluencersRequest", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "UpdateByQueryResponse", + ">; (this: That, params: ", + "UpdateByQueryRequest", " | ", - "MlGetInfluencersRequest", + "UpdateByQueryRequest", ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlGetInfluencersResponse", - ", TContext>>; getJobStats: (params?: ", - "MlGetJobStatsRequest", - " | ", - "MlGetJobStatsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlGetJobStatsResponse", - ", TContext>>; getJobs: (params?: ", - "MlGetJobsRequest", - " | ", - "MlGetJobsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "MlGetJobsResponse", - ", TContext>>; getModelSnapshotUpgradeStats: (params?: ", - "TODO", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TODO", - ", unknown>>; getModelSnapshots: (params: ", - "MlGetModelSnapshotsRequest", + "UpdateByQueryResponse", + ", unknown>>; (this: That, params: ", + "UpdateByQueryRequest", " | ", - "MlGetModelSnapshotsRequest", + "UpdateByQueryRequest", ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlGetModelSnapshotsResponse", - ", TContext>>; getOverallBuckets: (params: ", - "MlGetOverallBucketsRequest", + " | undefined): Promise<", + "UpdateByQueryResponse", + ">; }; updateByQueryRethrottle: { (this: That, params: ", + "UpdateByQueryRethrottleRequest", " | ", - "MlGetOverallBucketsRequest", + "UpdateByQueryRethrottleRequest", ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlGetOverallBucketsResponse", - ", TContext>>; getRecords: (params: ", - "MlGetRecordsRequest", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "UpdateByQueryRethrottleResponse", + ">; (this: That, params: ", + "UpdateByQueryRethrottleRequest", " | ", - "MlGetRecordsRequest", + "UpdateByQueryRethrottleRequest", ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlGetRecordsResponse", - ", TContext>>; getTrainedModels: (params?: ", - "MlGetTrainedModelsRequest", - " | ", - "MlGetTrainedModelsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "MlGetTrainedModelsResponse", - ", TContext>>; getTrainedModelsStats: (params?: ", - "MlGetTrainedModelsStatsRequest", - " | ", - "MlGetTrainedModelsStatsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlGetTrainedModelsStatsResponse", - ", TContext>>; inferTrainedModelDeployment: (params: ", - "MlInferTrainedModelDeploymentRequest", + "UpdateByQueryRethrottleResponse", + ", unknown>>; (this: That, params: ", + "UpdateByQueryRethrottleRequest", " | ", - "MlInferTrainedModelDeploymentRequest", + "UpdateByQueryRethrottleRequest", ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlInferTrainedModelDeploymentResponse", - ", TContext>>; info: (params?: ", - "MlInfoRequest", + " | undefined): Promise<", + "UpdateByQueryRethrottleResponse", + ">; }; watcher: ", + "default", + "; xpack: ", + "default", + "; }" + ], + "path": "packages/kbn-securitysolution-es-utils/src/get_index_aliases/index.ts", + "deprecated": false + }, + { + "parentPluginId": "@kbn/securitysolution-es-utils", + "id": "def-server.getIndexAliases.$1.alias", + "type": "string", + "tags": [], + "label": "alias", + "description": [], + "path": "packages/kbn-securitysolution-es-utils/src/get_index_aliases/index.ts", + "deprecated": false + } + ] + } + ], + "returnComment": [ + "an array of {@link IndexAlias } objects" + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/securitysolution-es-utils", + "id": "def-server.getIndexCount", + "type": "Function", + "tags": [], + "label": "getIndexCount", + "description": [ + "\nRetrieves the count of documents in a given index\n" + ], + "signature": [ + "({ esClient, index, }: { esClient: ", + "ElasticsearchClient", + "; index: string; }) => Promise" + ], + "path": "packages/kbn-securitysolution-es-utils/src/get_index_count/index.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "@kbn/securitysolution-es-utils", + "id": "def-server.getIndexCount.$1", + "type": "Object", + "tags": [], + "label": "{\n esClient,\n index,\n}", + "description": [], + "path": "packages/kbn-securitysolution-es-utils/src/get_index_count/index.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "@kbn/securitysolution-es-utils", + "id": "def-server.getIndexCount.$1.esClient", + "type": "Object", + "tags": [], + "label": "esClient", + "description": [], + "signature": [ + "{ eql: ", + "default", + "; search: { >(this: That, params?: ", + "SearchRequest", " | ", - "MlInfoRequest", + "SearchRequest", " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlInfoResponse", - ", TContext>>; openJob: (params: ", - "MlOpenJobRequest", - " | ", - "MlOpenJobRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlOpenJobResponse", - ", TContext>>; postCalendarEvents: (params: ", - "MlPostCalendarEventsRequest", - " | ", - "MlPostCalendarEventsRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlPostCalendarEventsResponse", - ", TContext>>; postData: (params: ", - "MlPostDataRequest", - " | ", - "MlPostDataRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlPostDataResponse", - ", TContext>>; previewDataFrameAnalytics: (params?: ", - "MlPreviewDataFrameAnalyticsRequest", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "SearchResponse", + ">; >(this: That, params?: ", + "SearchRequest", " | ", - "MlPreviewDataFrameAnalyticsRequest", + "SearchRequest", " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "MlPreviewDataFrameAnalyticsResponse", - ", TContext>>; previewDatafeed: (params?: ", - "MlPreviewDatafeedRequest", + "SearchResponse", + ", unknown>>; >(this: That, params?: ", + "SearchRequest", " | ", - "MlPreviewDatafeedRequest", + "SearchRequest", " | undefined, options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlPreviewDatafeedResponse", - ", TContext>>; putCalendar: (params: ", - "MlPutCalendarRequest", - " | ", - "MlPutCalendarRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlPutCalendarResponse", - ", TContext>>; putCalendarJob: (params: ", - "MlPutCalendarJobRequest", - " | ", - "MlPutCalendarJobRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlPutCalendarJobResponse", - ", TContext>>; putDataFrameAnalytics: (params: ", - "MlPutDataFrameAnalyticsRequest", - " | ", - "MlPutDataFrameAnalyticsRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlPutDataFrameAnalyticsResponse", - ", TContext>>; putDatafeed: (params: ", - "MlPutDatafeedRequest", - " | ", - "MlPutDatafeedRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlPutDatafeedResponse", - ", TContext>>; putFilter: (params: ", - "MlPutFilterRequest", - " | ", - "MlPutFilterRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlPutFilterResponse", - ", TContext>>; putJob: (params: ", - "MlPutJobRequest", - " | ", - "MlPutJobRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlPutJobResponse", - ", TContext>>; putTrainedModel: (params: ", - "MlPutTrainedModelRequest", - " | ", - "MlPutTrainedModelRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlTrainedModelConfig", - ", TContext>>; putTrainedModelAlias: (params: ", - "MlPutTrainedModelAliasRequest", - " | ", - "MlPutTrainedModelAliasRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlPutTrainedModelAliasResponse", - ", TContext>>; putTrainedModelDefinitionPart: (params: ", - "MlPutTrainedModelDefinitionPartRequest", - " | ", - "MlPutTrainedModelDefinitionPartRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlPutTrainedModelDefinitionPartResponse", - ", TContext>>; putTrainedModelVocabulary: (params: ", - "MlPutTrainedModelVocabularyRequest", - " | ", - "MlPutTrainedModelVocabularyRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlPutTrainedModelVocabularyResponse", - ", TContext>>; resetJob: (params: ", - "MlResetJobRequest", - " | ", - "MlResetJobRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlResetJobResponse", - ", TContext>>; revertModelSnapshot: (params: ", - "MlRevertModelSnapshotRequest", - " | ", - "MlRevertModelSnapshotRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + " | undefined): Promise<", + "SearchResponse", + ">; }; create: { (this: That, params: ", + "CreateRequest", + " | ", + "CreateRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "CreateResponse", + ">; (this: That, params: ", + "CreateRequest", + " | ", + "CreateRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "MlRevertModelSnapshotResponse", - ", TContext>>; setUpgradeMode: (params?: ", - "MlSetUpgradeModeRequest", - " | ", - "MlSetUpgradeModeRequest", - " | undefined, options?: ", + "CreateResponse", + ", unknown>>; (this: That, params: ", + "CreateRequest", + " | ", + "CreateRequest", + ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", + " | undefined): Promise<", + "CreateResponse", + ">; }; monitoring: ", + "default", + "; security: ", + "default", + "; name: string | symbol; index: { (this: That, params: ", + "IndexRequest", + " | ", + "IndexRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "IndexResponse", + ">; (this: That, params: ", + "IndexRequest", + " | ", + "IndexRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "MlSetUpgradeModeResponse", - ", TContext>>; startDataFrameAnalytics: (params: ", - "MlStartDataFrameAnalyticsRequest", - " | ", - "MlStartDataFrameAnalyticsRequest", - ", options?: ", + "IndexResponse", + ", unknown>>; (this: That, params: ", + "IndexRequest", + " | ", + "IndexRequest", + ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlStartDataFrameAnalyticsResponse", - ", TContext>>; startDatafeed: (params: ", - "MlStartDatafeedRequest", + " | undefined): Promise<", + "IndexResponse", + ">; }; delete: { (this: That, params: ", + "DeleteRequest", " | ", - "MlStartDatafeedRequest", + "DeleteRequest", ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlStartDatafeedResponse", - ", TContext>>; startTrainedModelDeployment: (params: ", - "MlStartTrainedModelDeploymentRequest", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "DeleteResponse", + ">; (this: That, params: ", + "DeleteRequest", " | ", - "MlStartTrainedModelDeploymentRequest", + "DeleteRequest", ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "MlStartTrainedModelDeploymentResponse", - ", TContext>>; stopDataFrameAnalytics: (params: ", - "MlStopDataFrameAnalyticsRequest", + "DeleteResponse", + ", unknown>>; (this: That, params: ", + "DeleteRequest", " | ", - "MlStopDataFrameAnalyticsRequest", + "DeleteRequest", ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlStopDataFrameAnalyticsResponse", - ", TContext>>; stopDatafeed: (params: ", - "MlStopDatafeedRequest", + " | undefined): Promise<", + "DeleteResponse", + ">; }; get: { (this: That, params: ", + "GetRequest", " | ", - "MlStopDatafeedRequest", + "GetRequest", ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlStopDatafeedResponse", - ", TContext>>; stopTrainedModelDeployment: (params: ", - "MlStopTrainedModelDeploymentRequest", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetResponse", + ">; (this: That, params: ", + "GetRequest", " | ", - "MlStopTrainedModelDeploymentRequest", + "GetRequest", ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "MlStopTrainedModelDeploymentResponse", - ", TContext>>; updateDataFrameAnalytics: (params: ", - "MlUpdateDataFrameAnalyticsRequest", + "GetResponse", + ", unknown>>; (this: That, params: ", + "GetRequest", " | ", - "MlUpdateDataFrameAnalyticsRequest", + "GetRequest", ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", + " | undefined): Promise<", + "GetResponse", + ">; }; update: { (this: That, params: ", + "UpdateRequest", + " | ", + "UpdateRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "UpdateResponse", + ">; (this: That, params: ", + "UpdateRequest", + " | ", + "UpdateRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "MlUpdateDataFrameAnalyticsResponse", - ", TContext>>; updateDatafeed: (params: ", - "MlUpdateDatafeedRequest", - " | ", - "MlUpdateDatafeedRequest", - ", options?: ", + "UpdateResponse", + ", unknown>>; (this: That, params: ", + "UpdateRequest", + " | ", + "UpdateRequest", + ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlUpdateDatafeedResponse", - ", TContext>>; updateFilter: (params: ", - "MlUpdateFilterRequest", + " | undefined): Promise<", + "UpdateResponse", + ">; }; closePointInTime: { (this: That, params: ", + "ClosePointInTimeRequest", " | ", - "MlUpdateFilterRequest", + "ClosePointInTimeRequest", ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlUpdateFilterResponse", - ", TContext>>; updateJob: (params: ", - "MlUpdateJobRequest", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ClosePointInTimeResponse", + ">; (this: That, params: ", + "ClosePointInTimeRequest", " | ", - "MlUpdateJobRequest", + "ClosePointInTimeRequest", ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "MlUpdateJobResponse", - ", TContext>>; updateModelSnapshot: (params: ", - "MlUpdateModelSnapshotRequest", + "ClosePointInTimeResponse", + ", unknown>>; (this: That, params: ", + "ClosePointInTimeRequest", " | ", - "MlUpdateModelSnapshotRequest", + "ClosePointInTimeRequest", ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", + " | undefined): Promise<", + "ClosePointInTimeResponse", + ">; }; transform: ", + "default", + "; helpers: ", + "default", + "; [kInternal]: symbol | null; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", + "default", + "; Internal: ", + "default", + "; asyncSearch: ", + "default", + "; autoscaling: ", + "default", + "; bulk: { (this: That, params: ", + "BulkRequest", + " | ", + "BulkRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "BulkResponse", + ">; (this: That, params: ", + "BulkRequest", + " | ", + "BulkRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "MlUpdateModelSnapshotResponse", - ", TContext>>; upgradeJobSnapshot: (params: ", - "MlUpgradeJobSnapshotRequest", - " | ", - "MlUpgradeJobSnapshotRequest", - ", options?: ", + "BulkResponse", + ", unknown>>; (this: That, params: ", + "BulkRequest", + " | ", + "BulkRequest", + ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlUpgradeJobSnapshotResponse", - ", TContext>>; validate: (params?: ", - "MlValidateRequest", + " | undefined): Promise<", + "BulkResponse", + ">; }; cat: ", + "default", + "; ccr: ", + "default", + "; clearScroll: { (this: That, params?: ", + "ClearScrollRequest", " | ", - "MlValidateRequest", + "ClearScrollRequest", " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MlValidateResponse", - ", TContext>>; validateDetector: (params?: ", - "MlValidateDetectorRequest", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ClearScrollResponse", + ">; (this: That, params?: ", + "ClearScrollRequest", " | ", - "MlValidateDetectorRequest", + "ClearScrollRequest", " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "MlValidateDetectorResponse", - ", TContext>>; }; msearch: , TContext = unknown>(params?: ", - "MsearchRequest", + "ClearScrollResponse", + ", unknown>>; (this: That, params?: ", + "ClearScrollRequest", " | ", - "MsearchRequest", + "ClearScrollRequest", " | undefined, options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MsearchResponse", - ", TContext>>; msearchTemplate: , TContext = unknown>(params?: ", - "MsearchTemplateRequest", + " | undefined): Promise<", + "ClearScrollResponse", + ">; }; cluster: ", + "default", + "; count: { (this: That, params?: ", + "CountRequest", " | ", - "MsearchTemplateRequest", + "CountRequest", " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MsearchTemplateResponse", - ", TContext>>; mtermvectors: (params?: ", - "MtermvectorsRequest", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "CountResponse", + ">; (this: That, params?: ", + "CountRequest", " | ", - "MtermvectorsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "MtermvectorsResponse", - ", TContext>>; nodes: { clearRepositoriesMeteringArchive: (params?: ", - "TODO", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TODO", - ", unknown>>; getRepositoriesMeteringInfo: (params?: ", - "TODO", + "CountRequest", " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "TODO", - ", unknown>>; hotThreads: (params?: ", - "NodesHotThreadsRequest", + "CountResponse", + ", unknown>>; (this: That, params?: ", + "CountRequest", " | ", - "NodesHotThreadsRequest", + "CountRequest", " | undefined, options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "NodesHotThreadsResponse", - ", TContext>>; info: (params?: ", - "NodesInfoRequest", + " | undefined): Promise<", + "CountResponse", + ">; }; danglingIndices: ", + "default", + "; deleteByQuery: { (this: That, params: ", + "DeleteByQueryRequest", " | ", - "NodesInfoRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "NodesInfoResponse", - ", TContext>>; reloadSecureSettings: (params?: ", - "NodesReloadSecureSettingsRequest", + "DeleteByQueryRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "DeleteByQueryResponse", + ">; (this: That, params: ", + "DeleteByQueryRequest", " | ", - "NodesReloadSecureSettingsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "DeleteByQueryRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "NodesReloadSecureSettingsResponse", - ", TContext>>; stats: (params?: ", - "NodesStatsRequest", + "DeleteByQueryResponse", + ", unknown>>; (this: That, params: ", + "DeleteByQueryRequest", " | ", - "NodesStatsRequest", - " | undefined, options?: ", + "DeleteByQueryRequest", + ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "NodesStatsResponse", - ", TContext>>; usage: (params?: ", - "NodesUsageRequest", + " | undefined): Promise<", + "DeleteByQueryResponse", + ">; }; deleteByQueryRethrottle: { (this: That, params: ", + "DeleteByQueryRethrottleRequest", " | ", - "NodesUsageRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "DeleteByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "DeleteByQueryRethrottleResponse", + ">; (this: That, params: ", + "DeleteByQueryRethrottleRequest", + " | ", + "DeleteByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "NodesUsageResponse", - ", TContext>>; }; openPointInTime: (params: ", - "OpenPointInTimeRequest", + "DeleteByQueryRethrottleResponse", + ", unknown>>; (this: That, params: ", + "DeleteByQueryRethrottleRequest", " | ", - "OpenPointInTimeRequest", + "DeleteByQueryRethrottleRequest", ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", + " | undefined): Promise<", + "DeleteByQueryRethrottleResponse", + ">; }; deleteScript: { (this: That, params: ", + "DeleteScriptRequest", + " | ", + "DeleteScriptRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "DeleteScriptResponse", + ">; (this: That, params: ", + "DeleteScriptRequest", + " | ", + "DeleteScriptRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "OpenPointInTimeResponse", - ", TContext>>; ping: (params?: ", - "PingRequest", + "DeleteScriptResponse", + ", unknown>>; (this: That, params: ", + "DeleteScriptRequest", " | ", - "PingRequest", - " | undefined, options?: ", + "DeleteScriptRequest", + ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - ">; putScript: (params: ", - "PutScriptRequest", + " | undefined): Promise<", + "DeleteScriptResponse", + ">; }; enrich: ", + "default", + "; exists: { (this: That, params: ", + "ExistsRequest", " | ", - "PutScriptRequest", + "ExistsRequest", ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", - "<", - "PutScriptResponse", - ", TContext>>; rankEval: (params: ", - "RankEvalRequest", + ">; (this: That, params: ", + "ExistsRequest", " | ", - "RankEvalRequest", + "ExistsRequest", ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", + " | undefined): Promise; }; existsSource: { (this: That, params: ", + "ExistsSourceRequest", + " | ", + "ExistsSourceRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "ExistsSourceRequest", + " | ", + "ExistsSourceRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", - "<", - "RankEvalResponse", - ", TContext>>; reindex: (params?: ", - "ReindexRequest", + ">; (this: That, params: ", + "ExistsSourceRequest", " | ", - "ReindexRequest", - " | undefined, options?: ", + "ExistsSourceRequest", + ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", + " | undefined): Promise; }; explain: { (this: That, params: ", + "ExplainRequest", + " | ", + "ExplainRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ExplainResponse", + ">; (this: That, params: ", + "ExplainRequest", + " | ", + "ExplainRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "ReindexResponse", - ", TContext>>; reindexRethrottle: (params: ", - "ReindexRethrottleRequest", + "ExplainResponse", + ", unknown>>; (this: That, params: ", + "ExplainRequest", " | ", - "ReindexRethrottleRequest", + "ExplainRequest", ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", + " | undefined): Promise<", + "ExplainResponse", + ">; }; features: ", + "default", + "; fieldCaps: { (this: That, params?: ", + "FieldCapsRequest", + " | ", + "FieldCapsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "FieldCapsResponse", + ">; (this: That, params?: ", + "FieldCapsRequest", + " | ", + "FieldCapsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "ReindexRethrottleResponse", - ", TContext>>; renderSearchTemplate: (params?: ", - "RenderSearchTemplateRequest", + "FieldCapsResponse", + ", unknown>>; (this: That, params?: ", + "FieldCapsRequest", " | ", - "RenderSearchTemplateRequest", + "FieldCapsRequest", " | undefined, options?: ", "TransportRequestOptions", - " | undefined) => Promise<", + " | undefined): Promise<", + "FieldCapsResponse", + ">; }; fleet: ", + "default", + "; getScript: { (this: That, params: ", + "GetScriptRequest", + " | ", + "GetScriptRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetScriptResponse", + ">; (this: That, params: ", + "GetScriptRequest", + " | ", + "GetScriptRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "RenderSearchTemplateResponse", - ", TContext>>; rollup: { deleteJob: (params: ", - "RollupDeleteJobRequest", + "GetScriptResponse", + ", unknown>>; (this: That, params: ", + "GetScriptRequest", " | ", - "RollupDeleteJobRequest", + "GetScriptRequest", ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "RollupDeleteJobResponse", - ", TContext>>; getJobs: (params?: ", - "RollupGetJobsRequest", + " | undefined): Promise<", + "GetScriptResponse", + ">; }; getScriptContext: { (this: That, params?: ", + "GetScriptContextRequest", " | ", - "RollupGetJobsRequest", + "GetScriptContextRequest", " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "RollupGetJobsResponse", - ", TContext>>; getRollupCaps: (params?: ", - "RollupGetRollupCapsRequest", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetScriptContextResponse", + ">; (this: That, params?: ", + "GetScriptContextRequest", " | ", - "RollupGetRollupCapsRequest", + "GetScriptContextRequest", " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "RollupGetRollupCapsResponse", - ", TContext>>; getRollupIndexCaps: (params: ", - "RollupGetRollupIndexCapsRequest", + "GetScriptContextResponse", + ", unknown>>; (this: That, params?: ", + "GetScriptContextRequest", " | ", - "RollupGetRollupIndexCapsRequest", - ", options?: ", + "GetScriptContextRequest", + " | undefined, options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "RollupGetRollupIndexCapsResponse", - ", TContext>>; putJob: (params: ", - "RollupPutJobRequest", + " | undefined): Promise<", + "GetScriptContextResponse", + ">; }; getScriptLanguages: { (this: That, params?: ", + "GetScriptLanguagesRequest", " | ", - "RollupPutJobRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "GetScriptLanguagesRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetScriptLanguagesResponse", + ">; (this: That, params?: ", + "GetScriptLanguagesRequest", + " | ", + "GetScriptLanguagesRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "RollupPutJobResponse", - ", TContext>>; rollup: (params: ", - "RollupRollupRequest", + "GetScriptLanguagesResponse", + ", unknown>>; (this: That, params?: ", + "GetScriptLanguagesRequest", " | ", - "RollupRollupRequest", - ", options?: ", + "GetScriptLanguagesRequest", + " | undefined, options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - ">; rollupSearch: , TContext = unknown>(params: ", - "RollupRollupSearchRequest", + " | undefined): Promise<", + "GetScriptLanguagesResponse", + ">; }; getSource: { (this: That, params: ", + "GetSourceRequest", " | ", - "RollupRollupSearchRequest", + "GetSourceRequest", ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "RollupRollupSearchResponse", - ", TContext>>; startJob: (params: ", - "RollupStartJobRequest", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "GetSourceRequest", " | ", - "RollupStartJobRequest", + "GetSourceRequest", ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", - "<", - "RollupStartJobResponse", - ", TContext>>; stopJob: (params: ", - "RollupStopJobRequest", + ">; (this: That, params: ", + "GetSourceRequest", " | ", - "RollupStopJobRequest", + "GetSourceRequest", ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "RollupStopJobResponse", - ", TContext>>; }; scriptsPainlessExecute: (params?: ", - "ScriptsPainlessExecuteRequest", + " | undefined): Promise; }; graph: ", + "default", + "; ilm: ", + "default", + "; indices: ", + "default", + "; info: { (this: That, params?: ", + "InfoRequest", " | ", - "ScriptsPainlessExecuteRequest", + "InfoRequest", " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "InfoResponse", + ">; (this: That, params?: ", + "InfoRequest", + " | ", + "InfoRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "ScriptsPainlessExecuteResponse", - ", TContext>>; scroll: , TContext = unknown>(params?: ", - "ScrollRequest", + "InfoResponse", + ", unknown>>; (this: That, params?: ", + "InfoRequest", " | ", - "ScrollRequest", + "InfoRequest", " | undefined, options?: ", "TransportRequestOptions", - " | undefined) => Promise<", + " | undefined): Promise<", + "InfoResponse", + ">; }; ingest: ", + "default", + "; knnSearch: { (this: That, params: ", + "KnnSearchRequest", + " | ", + "KnnSearchRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "KnnSearchResponse", + ">; (this: That, params: ", + "KnnSearchRequest", + " | ", + "KnnSearchRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "ScrollResponse", - ", TContext>>; searchMvt: (params: ", - "SearchMvtRequest", + "KnnSearchResponse", + ", unknown>>; (this: That, params: ", + "KnnSearchRequest", " | ", - "SearchMvtRequest", + "KnnSearchRequest", ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - ">; searchShards: (params?: ", - "SearchShardsRequest", + " | undefined): Promise<", + "KnnSearchResponse", + ">; }; license: ", + "default", + "; logstash: ", + "default", + "; mget: { (this: That, params?: ", + "MgetRequest", " | ", - "SearchShardsRequest", + "MgetRequest", " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SearchShardsResponse", - ", TContext>>; searchTemplate: (params?: ", - "SearchTemplateRequest", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MgetResponse", + ">; (this: That, params?: ", + "MgetRequest", " | ", - "SearchTemplateRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SearchTemplateResponse", - ", TContext>>; searchableSnapshots: { cacheStats: (params?: ", - "TODO", + "MgetRequest", " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "TODO", - ", unknown>>; clearCache: (params?: ", - "SearchableSnapshotsClearCacheRequest", + "MgetResponse", + ", unknown>>; (this: That, params?: ", + "MgetRequest", " | ", - "SearchableSnapshotsClearCacheRequest", + "MgetRequest", " | undefined, options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - ">; mount: (params: ", - "SearchableSnapshotsMountRequest", + " | undefined): Promise<", + "MgetResponse", + ">; }; migration: ", + "default", + "; ml: ", + "default", + "; msearch: { >(this: That, params: ", + "MsearchRequest", + " | ", + "MsearchRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MsearchResponse", + ">; >(this: That, params: ", + "MsearchRequest", " | ", - "SearchableSnapshotsMountRequest", + "MsearchRequest", ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "SearchableSnapshotsMountResponse", - ", TContext>>; stats: (params?: ", - "SearchableSnapshotsStatsRequest", + "MsearchResponse", + ", unknown>>; >(this: That, params: ", + "MsearchRequest", " | ", - "SearchableSnapshotsStatsRequest", - " | undefined, options?: ", + "MsearchRequest", + ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", + " | undefined): Promise<", + "MsearchResponse", + ">; }; msearchTemplate: { >(this: That, params: ", + "MsearchTemplateRequest", + " | ", + "MsearchTemplateRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MsearchTemplateResponse", + ">; >(this: That, params: ", + "MsearchTemplateRequest", + " | ", + "MsearchTemplateRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "SearchableSnapshotsStatsResponse", - ", TContext>>; }; shutdown: { deleteNode: (params: ", - "ShutdownDeleteNodeRequest", + "MsearchTemplateResponse", + ", unknown>>; >(this: That, params: ", + "MsearchTemplateRequest", " | ", - "ShutdownDeleteNodeRequest", + "MsearchTemplateRequest", ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", + " | undefined): Promise<", + "MsearchTemplateResponse", + ">; }; mtermvectors: { (this: That, params?: ", + "MtermvectorsRequest", + " | ", + "MtermvectorsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MtermvectorsResponse", + ">; (this: That, params?: ", + "MtermvectorsRequest", + " | ", + "MtermvectorsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "ShutdownDeleteNodeResponse", - ", TContext>>; getNode: (params?: ", - "ShutdownGetNodeRequest", + "MtermvectorsResponse", + ", unknown>>; (this: That, params?: ", + "MtermvectorsRequest", " | ", - "ShutdownGetNodeRequest", + "MtermvectorsRequest", " | undefined, options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "ShutdownGetNodeResponse", - ", TContext>>; putNode: (params: ", - "ShutdownPutNodeRequest", + " | undefined): Promise<", + "MtermvectorsResponse", + ">; }; nodes: ", + "default", + "; openPointInTime: { (this: That, params: ", + "OpenPointInTimeRequest", " | ", - "ShutdownPutNodeRequest", + "OpenPointInTimeRequest", ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "ShutdownPutNodeResponse", - ", TContext>>; }; slm: { deleteLifecycle: (params: ", - "SlmDeleteLifecycleRequest", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "OpenPointInTimeResponse", + ">; (this: That, params: ", + "OpenPointInTimeRequest", " | ", - "SlmDeleteLifecycleRequest", + "OpenPointInTimeRequest", ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "SlmDeleteLifecycleResponse", - ", TContext>>; executeLifecycle: (params: ", - "SlmExecuteLifecycleRequest", + "OpenPointInTimeResponse", + ", unknown>>; (this: That, params: ", + "OpenPointInTimeRequest", " | ", - "SlmExecuteLifecycleRequest", + "OpenPointInTimeRequest", ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SlmExecuteLifecycleResponse", - ", TContext>>; executeRetention: (params?: ", - "SlmExecuteRetentionRequest", + " | undefined): Promise<", + "OpenPointInTimeResponse", + ">; }; ping: { (this: That, params?: ", + "PingRequest", " | ", - "SlmExecuteRetentionRequest", + "PingRequest", " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SlmExecuteRetentionResponse", - ", TContext>>; getLifecycle: (params?: ", - "SlmGetLifecycleRequest", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params?: ", + "PingRequest", " | ", - "SlmGetLifecycleRequest", + "PingRequest", " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", - "<", - "SlmGetLifecycleResponse", - ", TContext>>; getStats: (params?: ", - "SlmGetStatsRequest", + ">; (this: That, params?: ", + "PingRequest", " | ", - "SlmGetStatsRequest", + "PingRequest", " | undefined, options?: ", "TransportRequestOptions", - " | undefined) => Promise<", + " | undefined): Promise; }; putScript: { (this: That, params: ", + "PutScriptRequest", + " | ", + "PutScriptRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "PutScriptResponse", + ">; (this: That, params: ", + "PutScriptRequest", + " | ", + "PutScriptRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "SlmGetStatsResponse", - ", TContext>>; getStatus: (params?: ", - "SlmGetStatusRequest", + "PutScriptResponse", + ", unknown>>; (this: That, params: ", + "PutScriptRequest", " | ", - "SlmGetStatusRequest", - " | undefined, options?: ", + "PutScriptRequest", + ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", + " | undefined): Promise<", + "PutScriptResponse", + ">; }; rankEval: { (this: That, params: ", + "RankEvalRequest", + " | ", + "RankEvalRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "RankEvalResponse", + ">; (this: That, params: ", + "RankEvalRequest", + " | ", + "RankEvalRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "SlmGetStatusResponse", - ", TContext>>; putLifecycle: (params: ", - "SlmPutLifecycleRequest", + "RankEvalResponse", + ", unknown>>; (this: That, params: ", + "RankEvalRequest", " | ", - "SlmPutLifecycleRequest", + "RankEvalRequest", ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SlmPutLifecycleResponse", - ", TContext>>; start: (params?: ", - "SlmStartRequest", + " | undefined): Promise<", + "RankEvalResponse", + ">; }; reindex: { (this: That, params?: ", + "ReindexRequest", " | ", - "SlmStartRequest", + "ReindexRequest", " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SlmStartResponse", - ", TContext>>; stop: (params?: ", - "SlmStopRequest", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ReindexResponse", + ">; (this: That, params?: ", + "ReindexRequest", " | ", - "SlmStopRequest", + "ReindexRequest", " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "SlmStopResponse", - ", TContext>>; }; snapshot: { cleanupRepository: (params: ", - "SnapshotCleanupRepositoryRequest", + "ReindexResponse", + ", unknown>>; (this: That, params?: ", + "ReindexRequest", " | ", - "SnapshotCleanupRepositoryRequest", - ", options?: ", + "ReindexRequest", + " | undefined, options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SnapshotCleanupRepositoryResponse", - ", TContext>>; clone: (params: ", - "SnapshotCloneRequest", + " | undefined): Promise<", + "ReindexResponse", + ">; }; reindexRethrottle: { (this: That, params: ", + "ReindexRethrottleRequest", " | ", - "SnapshotCloneRequest", + "ReindexRethrottleRequest", ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SnapshotCloneResponse", - ", TContext>>; create: (params: ", - "SnapshotCreateRequest", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ReindexRethrottleResponse", + ">; (this: That, params: ", + "ReindexRethrottleRequest", " | ", - "SnapshotCreateRequest", + "ReindexRethrottleRequest", ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "SnapshotCreateResponse", - ", TContext>>; createRepository: (params: ", - "SnapshotCreateRepositoryRequest", + "ReindexRethrottleResponse", + ", unknown>>; (this: That, params: ", + "ReindexRethrottleRequest", " | ", - "SnapshotCreateRepositoryRequest", + "ReindexRethrottleRequest", ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SnapshotCreateRepositoryResponse", - ", TContext>>; delete: (params: ", - "SnapshotDeleteRequest", + " | undefined): Promise<", + "ReindexRethrottleResponse", + ">; }; renderSearchTemplate: { (this: That, params?: ", + "RenderSearchTemplateRequest", " | ", - "SnapshotDeleteRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SnapshotDeleteResponse", - ", TContext>>; deleteRepository: (params: ", - "SnapshotDeleteRepositoryRequest", + "RenderSearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "RenderSearchTemplateResponse", + ">; (this: That, params?: ", + "RenderSearchTemplateRequest", " | ", - "SnapshotDeleteRepositoryRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "RenderSearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "SnapshotDeleteRepositoryResponse", - ", TContext>>; get: (params: ", - "SnapshotGetRequest", + "RenderSearchTemplateResponse", + ", unknown>>; (this: That, params?: ", + "RenderSearchTemplateRequest", " | ", - "SnapshotGetRequest", - ", options?: ", + "RenderSearchTemplateRequest", + " | undefined, options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SnapshotGetResponse", - ", TContext>>; getRepository: (params?: ", - "SnapshotGetRepositoryRequest", + " | undefined): Promise<", + "RenderSearchTemplateResponse", + ">; }; rollup: ", + "default", + "; scriptsPainlessExecute: { (this: That, params?: ", + "ScriptsPainlessExecuteRequest", " | ", - "SnapshotGetRepositoryRequest", + "ScriptsPainlessExecuteRequest", " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ScriptsPainlessExecuteResponse", + ">; (this: That, params?: ", + "ScriptsPainlessExecuteRequest", + " | ", + "ScriptsPainlessExecuteRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "SnapshotGetRepositoryResponse", - ", TContext>>; repositoryAnalyze: (params?: ", - "TODO", + "ScriptsPainlessExecuteResponse", + ", unknown>>; (this: That, params?: ", + "ScriptsPainlessExecuteRequest", + " | ", + "ScriptsPainlessExecuteRequest", " | undefined, options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TODO", - ", unknown>>; restore: (params: ", - "SnapshotRestoreRequest", + " | undefined): Promise<", + "ScriptsPainlessExecuteResponse", + ">; }; scroll: { >(this: That, params: ", + "ScrollRequest", " | ", - "SnapshotRestoreRequest", + "ScrollRequest", ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SnapshotRestoreResponse", - ", TContext>>; status: (params?: ", - "SnapshotStatusRequest", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ScrollResponse", + ">; >(this: That, params: ", + "ScrollRequest", " | ", - "SnapshotStatusRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "ScrollRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "SnapshotStatusResponse", - ", TContext>>; verifyRepository: (params: ", - "SnapshotVerifyRepositoryRequest", + "ScrollResponse", + ", unknown>>; >(this: That, params: ", + "ScrollRequest", " | ", - "SnapshotVerifyRepositoryRequest", + "ScrollRequest", ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SnapshotVerifyRepositoryResponse", - ", TContext>>; }; sql: { clearCursor: (params?: ", - "SqlClearCursorRequest", + " | undefined): Promise<", + "ScrollResponse", + ">; }; searchMvt: { (this: That, params: ", + "SearchMvtRequest", " | ", - "SqlClearCursorRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "SearchMvtRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "SearchMvtRequest", + " | ", + "SearchMvtRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", - "<", - "SqlClearCursorResponse", - ", TContext>>; deleteAsync: (params?: ", - "TODO", - " | undefined, options?: ", + ">; (this: That, params: ", + "SearchMvtRequest", + " | ", + "SearchMvtRequest", + ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TODO", - ", unknown>>; getAsync: (params?: ", - "TODO", + " | undefined): Promise; }; searchShards: { (this: That, params?: ", + "SearchShardsRequest", + " | ", + "SearchShardsRequest", " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TODO", - ", unknown>>; getAsyncStatus: (params?: ", - "TODO", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "SearchShardsResponse", + ">; (this: That, params?: ", + "SearchShardsRequest", + " | ", + "SearchShardsRequest", " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "TODO", - ", unknown>>; query: (params?: ", - "SqlQueryRequest", + "SearchShardsResponse", + ", unknown>>; (this: That, params?: ", + "SearchShardsRequest", " | ", - "SqlQueryRequest", + "SearchShardsRequest", " | undefined, options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SqlQueryResponse", - ", TContext>>; translate: (params?: ", - "SqlTranslateRequest", + " | undefined): Promise<", + "SearchShardsResponse", + ">; }; searchTemplate: { (this: That, params?: ", + "SearchTemplateRequest", " | ", - "SqlTranslateRequest", + "SearchTemplateRequest", " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "SqlTranslateResponse", - ", TContext>>; }; ssl: { certificates: (params?: ", - "SslCertificatesRequest", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "SearchTemplateResponse", + ">; (this: That, params?: ", + "SearchTemplateRequest", " | ", - "SslCertificatesRequest", + "SearchTemplateRequest", " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "SslCertificatesResponse", - ", TContext>>; }; tasks: { cancel: (params?: ", - "TasksCancelRequest", + "SearchTemplateResponse", + ", unknown>>; (this: That, params?: ", + "SearchTemplateRequest", " | ", - "TasksCancelRequest", + "SearchTemplateRequest", " | undefined, options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TasksCancelResponse", - ", TContext>>; get: (params: ", - "TasksGetRequest", + " | undefined): Promise<", + "SearchTemplateResponse", + ">; }; searchableSnapshots: ", + "default", + "; shutdown: ", + "default", + "; slm: ", + "default", + "; snapshot: ", + "default", + "; sql: ", + "default", + "; ssl: ", + "default", + "; tasks: ", + "default", + "; termsEnum: { (this: That, params: ", + "TermsEnumRequest", " | ", - "TasksGetRequest", + "TermsEnumRequest", ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TasksGetResponse", - ", TContext>>; list: (params?: ", - "TasksListRequest", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "TermsEnumResponse", + ">; (this: That, params: ", + "TermsEnumRequest", " | ", - "TasksListRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "TermsEnumRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "TasksListResponse", - ", TContext>>; }; termsEnum: (params: ", + "TermsEnumResponse", + ", unknown>>; (this: That, params: ", "TermsEnumRequest", " | ", "TermsEnumRequest", ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", + " | undefined): Promise<", "TermsEnumResponse", - ", TContext>>; termvectors: (params: ", + ">; }; termvectors: { (this: That, params: ", "TermvectorsRequest", " | ", "TermvectorsRequest", ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "TermvectorsResponse", + ">; (this: That, params: ", + "TermvectorsRequest", + " | ", + "TermvectorsRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", "TermvectorsResponse", - ", TContext>>; textStructure: { findStructure: (params: ", - "TextStructureFindStructureRequest", - " | ", - "TextStructureFindStructureRequest", - ", options?: ", + ", unknown>>; (this: That, params: ", + "TermvectorsRequest", + " | ", + "TermvectorsRequest", + ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "TextStructureFindStructureResponse", - ", TContext>>; }; updateByQuery: (params: ", + " | undefined): Promise<", + "TermvectorsResponse", + ">; }; textStructure: ", + "default", + "; updateByQuery: { (this: That, params: ", "UpdateByQueryRequest", " | ", "UpdateByQueryRequest", ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", "UpdateByQueryResponse", - ", TContext>>; updateByQueryRethrottle: (params: ", - "UpdateByQueryRethrottleRequest", - " | ", - "UpdateByQueryRethrottleRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "UpdateByQueryRethrottleResponse", - ", TContext>>; watcher: { ackWatch: (params: ", - "WatcherAckWatchRequest", - " | ", - "WatcherAckWatchRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "WatcherAckWatchResponse", - ", TContext>>; activateWatch: (params: ", - "WatcherActivateWatchRequest", + ">; (this: That, params: ", + "UpdateByQueryRequest", " | ", - "WatcherActivateWatchRequest", + "UpdateByQueryRequest", ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "WatcherActivateWatchResponse", - ", TContext>>; deactivateWatch: (params: ", - "WatcherDeactivateWatchRequest", + "UpdateByQueryResponse", + ", unknown>>; (this: That, params: ", + "UpdateByQueryRequest", " | ", - "WatcherDeactivateWatchRequest", + "UpdateByQueryRequest", ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "WatcherDeactivateWatchResponse", - ", TContext>>; deleteWatch: (params: ", - "WatcherDeleteWatchRequest", + " | undefined): Promise<", + "UpdateByQueryResponse", + ">; }; updateByQueryRethrottle: { (this: That, params: ", + "UpdateByQueryRethrottleRequest", " | ", - "WatcherDeleteWatchRequest", + "UpdateByQueryRethrottleRequest", ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "WatcherDeleteWatchResponse", - ", TContext>>; executeWatch: (params?: ", - "WatcherExecuteWatchRequest", - " | ", - "WatcherExecuteWatchRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "WatcherExecuteWatchResponse", - ", TContext>>; getWatch: (params: ", - "WatcherGetWatchRequest", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "UpdateByQueryRethrottleResponse", + ">; (this: That, params: ", + "UpdateByQueryRethrottleRequest", " | ", - "WatcherGetWatchRequest", + "UpdateByQueryRethrottleRequest", ", options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", "<", - "WatcherGetWatchResponse", - ", TContext>>; putWatch: (params: ", - "WatcherPutWatchRequest", + "UpdateByQueryRethrottleResponse", + ", unknown>>; (this: That, params: ", + "UpdateByQueryRethrottleRequest", " | ", - "WatcherPutWatchRequest", + "UpdateByQueryRethrottleRequest", ", options?: ", "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "WatcherPutWatchResponse", - ", TContext>>; queryWatches: (params?: ", - "WatcherQueryWatchesRequest", - " | ", - "WatcherQueryWatchesRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "WatcherQueryWatchesResponse", - ", TContext>>; start: (params?: ", - "WatcherStartRequest", - " | ", - "WatcherStartRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "WatcherStartResponse", - ", TContext>>; stats: (params?: ", - "WatcherStatsRequest", - " | ", - "WatcherStatsRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "WatcherStatsResponse", - ", TContext>>; stop: (params?: ", - "WatcherStopRequest", - " | ", - "WatcherStopRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "WatcherStopResponse", - ", TContext>>; }; xpack: { info: (params?: ", - "XpackInfoRequest", - " | ", - "XpackInfoRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "XpackInfoResponse", - ", TContext>>; usage: (params?: ", - "XpackUsageRequest", - " | ", - "XpackUsageRequest", - " | undefined, options?: ", - "TransportRequestOptions", - " | undefined) => Promise<", - "TransportResult", - "<", - "XpackUsageResponse", - ", TContext>>; }; }" + " | undefined): Promise<", + "UpdateByQueryRethrottleResponse", + ">; }; watcher: ", + "default", + "; xpack: ", + "default", + "; }" ], "path": "packages/kbn-securitysolution-es-utils/src/get_index_count/index.ts", "deprecated": false diff --git a/api_docs/kbn_securitysolution_es_utils.mdx b/api_docs/kbn_securitysolution_es_utils.mdx index 9c1d6f347ed78..389625b519633 100644 --- a/api_docs/kbn_securitysolution_es_utils.mdx +++ b/api_docs/kbn_securitysolution_es_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-es-utils title: "@kbn/securitysolution-es-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-es-utils plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-es-utils'] warning: 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. --- diff --git a/api_docs/kbn_securitysolution_hook_utils.mdx b/api_docs/kbn_securitysolution_hook_utils.mdx index e6386cd95314f..7226d52c43acf 100644 --- a/api_docs/kbn_securitysolution_hook_utils.mdx +++ b/api_docs/kbn_securitysolution_hook_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-hook-utils title: "@kbn/securitysolution-hook-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-hook-utils plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-hook-utils'] warning: 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. --- diff --git a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx index b6b8cb1d3b43e..e915b4c87a395 100644 --- a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/securitysolution-io-ts-alerting-types plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-alerting-types'] warning: 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. --- diff --git a/api_docs/kbn_securitysolution_io_ts_list_types.devdocs.json b/api_docs/kbn_securitysolution_io_ts_list_types.devdocs.json index 5976f7481cb35..2845cc96a8108 100644 --- a/api_docs/kbn_securitysolution_io_ts_list_types.devdocs.json +++ b/api_docs/kbn_securitysolution_io_ts_list_types.devdocs.json @@ -27,7 +27,7 @@ "label": "updateExceptionListItemValidate", "description": [], "signature": [ - "(schema: { description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[]; name: string; type: \"simple\"; } & { _version?: string | undefined; comments?: ({ comment: string; } & { id?: string | undefined; })[] | undefined; id?: string | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }) => string[]" + "(schema: { description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[]; name: string; type: \"simple\"; } & { _version?: string | undefined; comments?: ({ comment: string; } & { id?: string | undefined; })[] | undefined; id?: string | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }) => string[]" ], "path": "packages/kbn-securitysolution-io-ts-list-types/src/request/update_exception_list_item_validation/index.ts", "deprecated": false, @@ -40,7 +40,7 @@ "label": "schema", "description": [], "signature": [ - "{ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[]; name: string; type: \"simple\"; } & { _version?: string | undefined; comments?: ({ comment: string; } & { id?: string | undefined; })[] | undefined; id?: string | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }" + "{ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[]; name: string; type: \"simple\"; } & { _version?: string | undefined; comments?: ({ comment: string; } & { id?: string | undefined; })[] | undefined; id?: string | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }" ], "path": "packages/kbn-securitysolution-io-ts-list-types/src/request/update_exception_list_item_validation/index.ts", "deprecated": false, @@ -58,7 +58,7 @@ "label": "validateComments", "description": [], "signature": [ - "(item: { description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[]; name: string; type: \"simple\"; } & { _version?: string | undefined; comments?: ({ comment: string; } & { id?: string | undefined; })[] | undefined; id?: string | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }) => string[]" + "(item: { description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[]; name: string; type: \"simple\"; } & { _version?: string | undefined; comments?: ({ comment: string; } & { id?: string | undefined; })[] | undefined; id?: string | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }) => string[]" ], "path": "packages/kbn-securitysolution-io-ts-list-types/src/request/update_exception_list_item_validation/index.ts", "deprecated": false, @@ -71,7 +71,7 @@ "label": "item", "description": [], "signature": [ - "{ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[]; name: string; type: \"simple\"; } & { _version?: string | undefined; comments?: ({ comment: string; } & { id?: string | undefined; })[] | undefined; id?: string | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }" + "{ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[]; name: string; type: \"simple\"; } & { _version?: string | undefined; comments?: ({ comment: string; } & { id?: string | undefined; })[] | undefined; id?: string | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }" ], "path": "packages/kbn-securitysolution-io-ts-list-types/src/request/update_exception_list_item_validation/index.ts", "deprecated": false, @@ -153,7 +153,7 @@ "label": "listItem", "description": [], "signature": [ - "{ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[]; list_id: string; name: string; type: \"simple\"; } & { comments?: { comment: string; }[] | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }" + "{ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[]; list_id: string; name: string; type: \"simple\"; } & { comments?: { comment: string; }[] | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }" ], "path": "packages/kbn-securitysolution-io-ts-list-types/src/typescript_types/index.ts", "deprecated": false @@ -1216,7 +1216,7 @@ "label": "listItem", "description": [], "signature": [ - "{ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[]; name: string; type: \"simple\"; } & { _version?: string | undefined; comments?: ({ comment: string; } & { id?: string | undefined; })[] | undefined; id?: string | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }" + "{ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[]; name: string; type: \"simple\"; } & { _version?: string | undefined; comments?: ({ comment: string; } & { id?: string | undefined; })[] | undefined; id?: string | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }" ], "path": "packages/kbn-securitysolution-io-ts-list-types/src/typescript_types/index.ts", "deprecated": false @@ -1307,7 +1307,7 @@ "label": "exceptions", "description": [], "signature": [ - "{ _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }[]" + "{ _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }[]" ], "path": "packages/kbn-securitysolution-io-ts-list-types/src/typescript_types/index.ts", "deprecated": false @@ -1914,7 +1914,7 @@ "label": "CreateEndpointListItemSchemaDecoded", "description": [], "signature": [ - "Omit<{ description: string; entries: ({ field: string; operator: \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; })[]; name: string; type: \"simple\"; comments: { comment: string; }[] | undefined; item_id: string | undefined; meta: object | undefined; os_types: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags: string[] | undefined; }, \"tags\" | \"entries\" | \"comments\" | \"item_id\" | \"os_types\"> & { comments: { comment: string; }[]; tags: string[]; item_id: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[]; os_types: (\"windows\" | \"linux\" | \"macos\")[]; }" + "Omit<{ description: string; entries: ({ field: string; operator: \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; })[]; name: string; type: \"simple\"; comments: { comment: string; }[] | undefined; item_id: string | undefined; meta: object | undefined; os_types: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags: string[] | undefined; }, \"tags\" | \"entries\" | \"comments\" | \"item_id\" | \"os_types\"> & { comments: { comment: string; }[]; tags: string[]; item_id: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[]; os_types: (\"windows\" | \"linux\" | \"macos\")[]; }" ], "path": "packages/kbn-securitysolution-io-ts-list-types/src/request/create_endpoint_list_item_schema/index.ts", "deprecated": false, @@ -1942,7 +1942,7 @@ "label": "CreateExceptionListItemSchema", "description": [], "signature": [ - "{ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[]; list_id: string; name: string; type: \"simple\"; } & { comments?: { comment: string; }[] | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }" + "{ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[]; list_id: string; name: string; type: \"simple\"; } & { comments?: { comment: string; }[] | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }" ], "path": "packages/kbn-securitysolution-io-ts-list-types/src/request/create_exception_list_item_schema/index.ts", "deprecated": false, @@ -1956,7 +1956,7 @@ "label": "CreateExceptionListItemSchemaDecoded", "description": [], "signature": [ - "Omit<{ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[]; list_id: string; name: string; type: \"simple\"; comments: { comment: string; }[] | undefined; item_id: string | undefined; meta: object | undefined; namespace_type: \"single\" | \"agnostic\" | undefined; os_types: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags: string[] | undefined; }, \"tags\" | \"entries\" | \"comments\" | \"item_id\" | \"namespace_type\"> & { comments: { comment: string; }[]; tags: string[]; item_id: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[]; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; }" + "Omit<{ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[]; list_id: string; name: string; type: \"simple\"; comments: { comment: string; }[] | undefined; item_id: string | undefined; meta: object | undefined; namespace_type: \"single\" | \"agnostic\" | undefined; os_types: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags: string[] | undefined; }, \"tags\" | \"entries\" | \"comments\" | \"item_id\" | \"namespace_type\"> & { comments: { comment: string; }[]; tags: string[]; item_id: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[]; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; }" ], "path": "packages/kbn-securitysolution-io-ts-list-types/src/request/create_exception_list_item_schema/index.ts", "deprecated": false, @@ -2026,7 +2026,7 @@ "label": "CreateListSchema", "description": [], "signature": [ - "{ description: string; name: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; } & { deserializer?: string | undefined; id?: string | undefined; meta?: object | undefined; serializer?: string | undefined; version?: number | undefined; }" + "{ description: string; name: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; } & { deserializer?: string | undefined; id?: string | undefined; meta?: object | undefined; serializer?: string | undefined; version?: number | undefined; }" ], "path": "packages/kbn-securitysolution-io-ts-list-types/src/request/create_list_schema/index.ts", "deprecated": false, @@ -2040,7 +2040,7 @@ "label": "CreateListSchemaDecoded", "description": [], "signature": [ - "{ type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; id: string | undefined; description: string; name: string; meta: object | undefined; serializer: string | undefined; deserializer: string | undefined; } & { version: number; }" + "{ type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; id: string | undefined; description: string; name: string; meta: object | undefined; serializer: string | undefined; deserializer: string | undefined; } & { version: number; }" ], "path": "packages/kbn-securitysolution-io-ts-list-types/src/request/create_list_schema/index.ts", "deprecated": false, @@ -2334,7 +2334,7 @@ "label": "EntriesArray", "description": [], "signature": [ - "({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[]" + "({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[]" ], "path": "packages/kbn-securitysolution-io-ts-list-types/src/common/entries/index.ts", "deprecated": false, @@ -2348,7 +2348,7 @@ "label": "EntriesArrayOrUndefined", "description": [], "signature": [ - "({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[] | undefined" + "({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[] | undefined" ], "path": "packages/kbn-securitysolution-io-ts-list-types/src/common/entries/index.ts", "deprecated": false, @@ -2362,7 +2362,7 @@ "label": "Entry", "description": [], "signature": [ - "{ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; }" + "{ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; }" ], "path": "packages/kbn-securitysolution-io-ts-list-types/src/common/entries/index.ts", "deprecated": false, @@ -2390,7 +2390,7 @@ "label": "EntryList", "description": [], "signature": [ - "{ field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; }" + "{ field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; }" ], "path": "packages/kbn-securitysolution-io-ts-list-types/src/common/entries_list/index.ts", "deprecated": false, @@ -2460,7 +2460,7 @@ "label": "ExceptionListItemSchema", "description": [], "signature": [ - "{ _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }" + "{ _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }" ], "path": "packages/kbn-securitysolution-io-ts-list-types/src/response/exception_list_item_schema/index.ts", "deprecated": false, @@ -2782,7 +2782,7 @@ "label": "FoundExceptionListItemSchema", "description": [], "signature": [ - "{ data: { _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }[]; page: number; per_page: number; total: number; }" + "{ data: { _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }[]; page: number; per_page: number; total: number; } & { pit?: string | undefined; }" ], "path": "packages/kbn-securitysolution-io-ts-list-types/src/response/found_exception_list_item_schema/index.ts", "deprecated": false, @@ -2796,7 +2796,7 @@ "label": "FoundExceptionListSchema", "description": [], "signature": [ - "{ data: { _version: string | undefined; created_at: string; created_by: string; description: string; id: string; immutable: boolean; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"endpoint\" | \"detection\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\"; updated_at: string; updated_by: string; version: number; }[]; page: number; per_page: number; total: number; }" + "{ data: { _version: string | undefined; created_at: string; created_by: string; description: string; id: string; immutable: boolean; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"endpoint\" | \"detection\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\"; updated_at: string; updated_by: string; version: number; }[]; page: number; per_page: number; total: number; } & { pit?: string | undefined; }" ], "path": "packages/kbn-securitysolution-io-ts-list-types/src/response/found_exception_list_schema/index.ts", "deprecated": false, @@ -2810,7 +2810,7 @@ "label": "FoundListItemSchema", "description": [], "signature": [ - "{ cursor: string; data: { _version: string | undefined; created_at: string; created_by: string; deserializer: string | undefined; id: string; list_id: string; meta: object | undefined; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; value: string; }[]; page: number; per_page: number; total: number; }" + "{ cursor: string; data: { _version: string | undefined; created_at: string; created_by: string; deserializer: string | undefined; id: string; list_id: string; meta: object | undefined; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; value: string; }[]; page: number; per_page: number; total: number; }" ], "path": "packages/kbn-securitysolution-io-ts-list-types/src/response/found_list_item_schema/index.ts", "deprecated": false, @@ -2824,7 +2824,7 @@ "label": "FoundListSchema", "description": [], "signature": [ - "{ cursor: string; data: { _version: string | undefined; created_at: string; created_by: string; description: string; deserializer: string | undefined; id: string; immutable: boolean; meta: object | undefined; name: string; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; version: number; }[]; page: number; per_page: number; total: number; }" + "{ cursor: string; data: { _version: string | undefined; created_at: string; created_by: string; description: string; deserializer: string | undefined; id: string; immutable: boolean; meta: object | undefined; name: string; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; version: number; }[]; page: number; per_page: number; total: number; }" ], "path": "packages/kbn-securitysolution-io-ts-list-types/src/response/found_list_schema/index.ts", "deprecated": false, @@ -2886,6 +2886,48 @@ "deprecated": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/securitysolution-io-ts-list-types", + "id": "def-common.ImportComment", + "type": "Type", + "tags": [], + "label": "ImportComment", + "description": [], + "signature": [ + "({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; }) | { comment: string; }" + ], + "path": "packages/kbn-securitysolution-io-ts-list-types/src/common/import_comment/index.ts", + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/securitysolution-io-ts-list-types", + "id": "def-common.ImportCommentsArray", + "type": "Type", + "tags": [], + "label": "ImportCommentsArray", + "description": [], + "signature": [ + "(({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; }) | { comment: string; })[]" + ], + "path": "packages/kbn-securitysolution-io-ts-list-types/src/common/import_comment/index.ts", + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/securitysolution-io-ts-list-types", + "id": "def-common.ImportCommentsArrayOrUndefined", + "type": "Type", + "tags": [], + "label": "ImportCommentsArrayOrUndefined", + "description": [], + "signature": [ + "(({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; }) | { comment: string; })[] | undefined" + ], + "path": "packages/kbn-securitysolution-io-ts-list-types/src/common/import_comment/index.ts", + "deprecated": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/securitysolution-io-ts-list-types", "id": "def-common.ImportExceptionListItemSchema", @@ -2894,7 +2936,7 @@ "label": "ImportExceptionListItemSchema", "description": [], "signature": [ - "{ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[]; item_id: string; list_id: string; name: string; type: \"simple\"; } & { id?: string | undefined; comments?: { comment: string; }[] | undefined; created_at?: string | undefined; updated_at?: string | undefined; created_by?: string | undefined; updated_by?: string | undefined; _version?: string | undefined; tie_breaker_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }" + "{ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[]; item_id: string; list_id: string; name: string; type: \"simple\"; } & { id?: string | undefined; comments?: (({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; }) | { comment: string; })[] | undefined; created_at?: string | undefined; updated_at?: string | undefined; created_by?: string | undefined; updated_by?: string | undefined; _version?: string | undefined; tie_breaker_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }" ], "path": "packages/kbn-securitysolution-io-ts-list-types/src/request/import_exception_item_schema/index.ts", "deprecated": false, @@ -2908,7 +2950,7 @@ "label": "ImportExceptionListItemSchemaDecoded", "description": [], "signature": [ - "Omit<{ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[]; item_id: string; list_id: string; name: string; type: \"simple\"; } & { id?: string | undefined; comments?: { comment: string; }[] | undefined; created_at?: string | undefined; updated_at?: string | undefined; created_by?: string | undefined; updated_by?: string | undefined; _version?: string | undefined; tie_breaker_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }, \"tags\" | \"entries\" | \"comments\" | \"item_id\" | \"namespace_type\"> & { comments: { comment: string; }[]; tags: string[]; item_id: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[]; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; }" + "Omit<{ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[]; item_id: string; list_id: string; name: string; type: \"simple\"; } & { id?: string | undefined; comments?: (({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; }) | { comment: string; })[] | undefined; created_at?: string | undefined; updated_at?: string | undefined; created_by?: string | undefined; updated_by?: string | undefined; _version?: string | undefined; tie_breaker_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }, \"tags\" | \"entries\" | \"comments\" | \"item_id\" | \"namespace_type\"> & { comments: (({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; }) | { comment: string; })[]; tags: string[]; item_id: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[]; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; }" ], "path": "packages/kbn-securitysolution-io-ts-list-types/src/request/import_exception_item_schema/index.ts", "deprecated": false, @@ -2964,7 +3006,7 @@ "label": "ImportListItemQuerySchema", "description": [], "signature": [ - "{ deserializer: string | undefined; list_id: string | undefined; serializer: string | undefined; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\" | undefined; }" + "{ deserializer: string | undefined; list_id: string | undefined; serializer: string | undefined; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\" | undefined; }" ], "path": "packages/kbn-securitysolution-io-ts-list-types/src/request/import_list_item_query_schema/index.ts", "deprecated": false, @@ -2978,7 +3020,7 @@ "label": "ImportListItemQuerySchemaEncoded", "description": [], "signature": [ - "{ deserializer?: string | undefined; list_id?: string | undefined; serializer?: string | undefined; type?: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\" | undefined; }" + "{ deserializer?: string | undefined; list_id?: string | undefined; serializer?: string | undefined; type?: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\" | undefined; }" ], "path": "packages/kbn-securitysolution-io-ts-list-types/src/request/import_list_item_query_schema/index.ts", "deprecated": false, @@ -3090,7 +3132,7 @@ "label": "ListArraySchema", "description": [], "signature": [ - "{ _version: string | undefined; created_at: string; created_by: string; description: string; deserializer: string | undefined; id: string; immutable: boolean; meta: object | undefined; name: string; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; version: number; }[]" + "{ _version: string | undefined; created_at: string; created_by: string; description: string; deserializer: string | undefined; id: string; immutable: boolean; meta: object | undefined; name: string; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; version: number; }[]" ], "path": "packages/kbn-securitysolution-io-ts-list-types/src/response/list_schema/index.ts", "deprecated": false, @@ -3132,7 +3174,7 @@ "label": "ListItemArraySchema", "description": [], "signature": [ - "{ _version: string | undefined; created_at: string; created_by: string; deserializer: string | undefined; id: string; list_id: string; meta: object | undefined; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; value: string; }[]" + "{ _version: string | undefined; created_at: string; created_by: string; deserializer: string | undefined; id: string; list_id: string; meta: object | undefined; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; value: string; }[]" ], "path": "packages/kbn-securitysolution-io-ts-list-types/src/response/list_item_schema/index.ts", "deprecated": false, @@ -3160,7 +3202,7 @@ "label": "ListItemSchema", "description": [], "signature": [ - "{ _version: string | undefined; created_at: string; created_by: string; deserializer: string | undefined; id: string; list_id: string; meta: object | undefined; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; value: string; }" + "{ _version: string | undefined; created_at: string; created_by: string; deserializer: string | undefined; id: string; list_id: string; meta: object | undefined; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; value: string; }" ], "path": "packages/kbn-securitysolution-io-ts-list-types/src/response/list_item_schema/index.ts", "deprecated": false, @@ -3188,7 +3230,7 @@ "label": "ListSchema", "description": [], "signature": [ - "{ _version: string | undefined; created_at: string; created_by: string; description: string; deserializer: string | undefined; id: string; immutable: boolean; meta: object | undefined; name: string; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; version: number; }" + "{ _version: string | undefined; created_at: string; created_by: string; description: string; deserializer: string | undefined; id: string; immutable: boolean; meta: object | undefined; name: string; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; version: number; }" ], "path": "packages/kbn-securitysolution-io-ts-list-types/src/response/list_schema/index.ts", "deprecated": false, @@ -3208,6 +3250,34 @@ "deprecated": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/securitysolution-io-ts-list-types", + "id": "def-common.MaxSize", + "type": "Type", + "tags": [], + "label": "MaxSize", + "description": [], + "signature": [ + "number" + ], + "path": "packages/kbn-securitysolution-io-ts-list-types/src/common/max_size/index.ts", + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/securitysolution-io-ts-list-types", + "id": "def-common.MaxSizeOrUndefined", + "type": "Type", + "tags": [], + "label": "MaxSizeOrUndefined", + "description": [], + "signature": [ + "number | undefined" + ], + "path": "packages/kbn-securitysolution-io-ts-list-types/src/common/max_size/index.ts", + "deprecated": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/securitysolution-io-ts-list-types", "id": "def-common.Meta", @@ -3370,7 +3440,7 @@ "label": "NonEmptyEntriesArray", "description": [], "signature": [ - "({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[]" + "({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[]" ], "path": "packages/kbn-securitysolution-io-ts-list-types/src/common/non_empty_entries_array/index.ts", "deprecated": false, @@ -3384,7 +3454,7 @@ "label": "NonEmptyEntriesArrayDecoded", "description": [], "signature": [ - "({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[]" + "({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[]" ], "path": "packages/kbn-securitysolution-io-ts-list-types/src/common/non_empty_entries_array/index.ts", "deprecated": false, @@ -3572,6 +3642,48 @@ "deprecated": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/securitysolution-io-ts-list-types", + "id": "def-common.Pit", + "type": "Type", + "tags": [], + "label": "Pit", + "description": [], + "signature": [ + "{ id: string; keepAlive: string | undefined; }" + ], + "path": "packages/kbn-securitysolution-io-ts-list-types/src/common/pit/index.ts", + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/securitysolution-io-ts-list-types", + "id": "def-common.PitId", + "type": "Type", + "tags": [], + "label": "PitId", + "description": [], + "signature": [ + "string" + ], + "path": "packages/kbn-securitysolution-io-ts-list-types/src/common/pit/index.ts", + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/securitysolution-io-ts-list-types", + "id": "def-common.PitOrUndefined", + "type": "Type", + "tags": [], + "label": "PitOrUndefined", + "description": [], + "signature": [ + "{ id: string; keepAlive: string | undefined; } | undefined" + ], + "path": "packages/kbn-securitysolution-io-ts-list-types/src/common/pit/index.ts", + "deprecated": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/securitysolution-io-ts-list-types", "id": "def-common.ReadEndpointListItemSchema", @@ -3698,6 +3810,34 @@ "deprecated": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/securitysolution-io-ts-list-types", + "id": "def-common.SearchAfter", + "type": "Type", + "tags": [], + "label": "SearchAfter", + "description": [], + "signature": [ + "string[]" + ], + "path": "packages/kbn-securitysolution-io-ts-list-types/src/common/search_after/index.ts", + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/securitysolution-io-ts-list-types", + "id": "def-common.SearchAfterOrUndefined", + "type": "Type", + "tags": [], + "label": "SearchAfterOrUndefined", + "description": [], + "signature": [ + "string[] | undefined" + ], + "path": "packages/kbn-securitysolution-io-ts-list-types/src/common/search_after/index.ts", + "deprecated": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/securitysolution-io-ts-list-types", "id": "def-common.SearchListItemArraySchema", @@ -3706,7 +3846,7 @@ "label": "SearchListItemArraySchema", "description": [], "signature": [ - "{ items: { _version: string | undefined; created_at: string; created_by: string; deserializer: string | undefined; id: string; list_id: string; meta: object | undefined; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; value: string; }[]; value: unknown; }[]" + "{ items: { _version: string | undefined; created_at: string; created_by: string; deserializer: string | undefined; id: string; list_id: string; meta: object | undefined; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; value: string; }[]; value: unknown; }[]" ], "path": "packages/kbn-securitysolution-io-ts-list-types/src/response/search_list_item_schema/index.ts", "deprecated": false, @@ -3720,7 +3860,7 @@ "label": "SearchListItemSchema", "description": [], "signature": [ - "{ items: { _version: string | undefined; created_at: string; created_by: string; deserializer: string | undefined; id: string; list_id: string; meta: object | undefined; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; value: string; }[]; value: unknown; }" + "{ items: { _version: string | undefined; created_at: string; created_by: string; deserializer: string | undefined; id: string; list_id: string; meta: object | undefined; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; value: string; }[]; value: unknown; }" ], "path": "packages/kbn-securitysolution-io-ts-list-types/src/response/search_list_item_schema/index.ts", "deprecated": false, @@ -3860,7 +4000,7 @@ "label": "Type", "description": [], "signature": [ - "\"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"" + "\"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"" ], "path": "packages/kbn-securitysolution-io-ts-list-types/src/common/type/index.ts", "deprecated": false, @@ -3874,7 +4014,7 @@ "label": "TypeOrUndefined", "description": [], "signature": [ - "\"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\" | undefined" + "\"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\" | undefined" ], "path": "packages/kbn-securitysolution-io-ts-list-types/src/common/type/index.ts", "deprecated": false, @@ -3930,7 +4070,7 @@ "label": "UpdateEndpointListItemSchema", "description": [], "signature": [ - "{ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[]; name: string; type: \"simple\"; } & { _version?: string | undefined; comments?: ({ comment: string; } & { id?: string | undefined; })[] | undefined; id?: string | undefined; item_id?: string | undefined; meta?: object | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }" + "{ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[]; name: string; type: \"simple\"; } & { _version?: string | undefined; comments?: ({ comment: string; } & { id?: string | undefined; })[] | undefined; id?: string | undefined; item_id?: string | undefined; meta?: object | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }" ], "path": "packages/kbn-securitysolution-io-ts-list-types/src/request/update_endpoint_list_item_schema/index.ts", "deprecated": false, @@ -3944,7 +4084,7 @@ "label": "UpdateEndpointListItemSchemaDecoded", "description": [], "signature": [ - "Omit<{ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[]; name: string; type: \"simple\"; _version: string | undefined; comments: ({ comment: string; } & { id?: string | undefined; })[] | undefined; id: string | undefined; item_id: string | undefined; meta: object | undefined; os_types: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags: string[] | undefined; }, \"tags\" | \"entries\" | \"comments\"> & { comments: ({ comment: string; } & { id?: string | undefined; })[]; tags: string[]; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[]; os_types: (\"windows\" | \"linux\" | \"macos\")[]; }" + "Omit<{ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[]; name: string; type: \"simple\"; _version: string | undefined; comments: ({ comment: string; } & { id?: string | undefined; })[] | undefined; id: string | undefined; item_id: string | undefined; meta: object | undefined; os_types: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags: string[] | undefined; }, \"tags\" | \"entries\" | \"comments\"> & { comments: ({ comment: string; } & { id?: string | undefined; })[]; tags: string[]; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[]; os_types: (\"windows\" | \"linux\" | \"macos\")[]; }" ], "path": "packages/kbn-securitysolution-io-ts-list-types/src/request/update_endpoint_list_item_schema/index.ts", "deprecated": false, @@ -3958,7 +4098,7 @@ "label": "UpdateExceptionListItemSchema", "description": [], "signature": [ - "{ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[]; name: string; type: \"simple\"; } & { _version?: string | undefined; comments?: ({ comment: string; } & { id?: string | undefined; })[] | undefined; id?: string | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }" + "{ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[]; name: string; type: \"simple\"; } & { _version?: string | undefined; comments?: ({ comment: string; } & { id?: string | undefined; })[] | undefined; id?: string | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }" ], "path": "packages/kbn-securitysolution-io-ts-list-types/src/request/update_exception_list_item_schema/index.ts", "deprecated": false, @@ -3972,7 +4112,7 @@ "label": "UpdateExceptionListItemSchemaDecoded", "description": [], "signature": [ - "Omit<{ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[]; name: string; type: \"simple\"; _version: string | undefined; comments: ({ comment: string; } & { id?: string | undefined; })[] | undefined; id: string | undefined; item_id: string | undefined; meta: object | undefined; namespace_type: \"single\" | \"agnostic\" | undefined; os_types: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags: string[] | undefined; }, \"tags\" | \"entries\" | \"comments\" | \"namespace_type\" | \"os_types\"> & { comments: ({ comment: string; } & { id?: string | undefined; })[]; tags: string[]; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[]; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; }" + "Omit<{ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[]; name: string; type: \"simple\"; _version: string | undefined; comments: ({ comment: string; } & { id?: string | undefined; })[] | undefined; id: string | undefined; item_id: string | undefined; meta: object | undefined; namespace_type: \"single\" | \"agnostic\" | undefined; os_types: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags: string[] | undefined; }, \"tags\" | \"entries\" | \"comments\" | \"namespace_type\" | \"os_types\"> & { comments: ({ comment: string; } & { id?: string | undefined; })[]; tags: string[]; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[]; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; }" ], "path": "packages/kbn-securitysolution-io-ts-list-types/src/request/update_exception_list_item_schema/index.ts", "deprecated": false, @@ -4505,7 +4645,7 @@ "StringC", "; entries: ", "Type", - "<({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[], ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[], unknown>; list_id: ", + "<({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[], ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[], unknown>; list_id: ", "Type", "; name: ", "StringC", @@ -4685,6 +4825,23 @@ "deprecated": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/securitysolution-io-ts-list-types", + "id": "def-common.DefaultImportCommentsArray", + "type": "Object", + "tags": [], + "label": "DefaultImportCommentsArray", + "description": [ + "\nTypes the DefaultImportCommentsArray as:\n - If null or undefined, then a default array of type ImportCommentsArray will be set" + ], + "signature": [ + "Type", + "<(({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; }) | { comment: string; })[], (({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; }) | { comment: string; })[], unknown>" + ], + "path": "packages/kbn-securitysolution-io-ts-list-types/src/common/default_import_comments_array/index.ts", + "deprecated": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/securitysolution-io-ts-list-types", "id": "def-common.DefaultListArray", @@ -6151,6 +6308,8 @@ "label": "foundExceptionListItemSchema", "description": [], "signature": [ + "IntersectionC", + "<[", "ExactC", "<", "TypeC", @@ -6308,7 +6467,13 @@ "NumberC", "; total: ", "NumberC", - "; }>>" + "; }>>, ", + "ExactC", + "<", + "PartialC", + "<{ pit: ", + "StringC", + "; }>>]>" ], "path": "packages/kbn-securitysolution-io-ts-list-types/src/response/found_exception_list_item_schema/index.ts", "deprecated": false, @@ -6322,6 +6487,8 @@ "label": "foundExceptionListSchema", "description": [], "signature": [ + "IntersectionC", + "<[", "ExactC", "<", "TypeC", @@ -6379,7 +6546,13 @@ "NumberC", "; total: ", "NumberC", - "; }>>" + "; }>>, ", + "ExactC", + "<", + "PartialC", + "<{ pit: ", + "StringC", + "; }>>]>" ], "path": "packages/kbn-securitysolution-io-ts-list-types/src/response/found_exception_list_schema/index.ts", "deprecated": false, @@ -6602,6 +6775,143 @@ "deprecated": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/securitysolution-io-ts-list-types", + "id": "def-common.importComment", + "type": "Object", + "tags": [], + "label": "importComment", + "description": [], + "signature": [ + "UnionC", + "<[", + "IntersectionC", + "<[", + "ExactC", + "<", + "TypeC", + "<{ comment: ", + "Type", + "; created_at: ", + "StringC", + "; created_by: ", + "StringC", + "; id: ", + "Type", + "; }>>, ", + "ExactC", + "<", + "PartialC", + "<{ updated_at: ", + "StringC", + "; updated_by: ", + "StringC", + "; }>>]>, ", + "ExactC", + "<", + "TypeC", + "<{ comment: ", + "Type", + "; }>>]>" + ], + "path": "packages/kbn-securitysolution-io-ts-list-types/src/common/import_comment/index.ts", + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/securitysolution-io-ts-list-types", + "id": "def-common.importCommentsArray", + "type": "Object", + "tags": [], + "label": "importCommentsArray", + "description": [], + "signature": [ + "ArrayC", + "<", + "UnionC", + "<[", + "IntersectionC", + "<[", + "ExactC", + "<", + "TypeC", + "<{ comment: ", + "Type", + "; created_at: ", + "StringC", + "; created_by: ", + "StringC", + "; id: ", + "Type", + "; }>>, ", + "ExactC", + "<", + "PartialC", + "<{ updated_at: ", + "StringC", + "; updated_by: ", + "StringC", + "; }>>]>, ", + "ExactC", + "<", + "TypeC", + "<{ comment: ", + "Type", + "; }>>]>>" + ], + "path": "packages/kbn-securitysolution-io-ts-list-types/src/common/import_comment/index.ts", + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/securitysolution-io-ts-list-types", + "id": "def-common.importCommentsArrayOrUndefined", + "type": "Object", + "tags": [], + "label": "importCommentsArrayOrUndefined", + "description": [], + "signature": [ + "UnionC", + "<[", + "ArrayC", + "<", + "UnionC", + "<[", + "IntersectionC", + "<[", + "ExactC", + "<", + "TypeC", + "<{ comment: ", + "Type", + "; created_at: ", + "StringC", + "; created_by: ", + "StringC", + "; id: ", + "Type", + "; }>>, ", + "ExactC", + "<", + "PartialC", + "<{ updated_at: ", + "StringC", + "; updated_by: ", + "StringC", + "; }>>]>, ", + "ExactC", + "<", + "TypeC", + "<{ comment: ", + "Type", + "; }>>]>>, ", + "UndefinedC", + "]>" + ], + "path": "packages/kbn-securitysolution-io-ts-list-types/src/common/import_comment/index.ts", + "deprecated": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/securitysolution-io-ts-list-types", "id": "def-common.importExceptionListItemSchema", @@ -6621,7 +6931,7 @@ "StringC", "; entries: ", "Type", - "<({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[], ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[], unknown>; item_id: ", + "<({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[], ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[], unknown>; item_id: ", "Type", "; list_id: ", "Type", @@ -6637,7 +6947,7 @@ "Type", "; comments: ", "Type", - "<{ comment: string; }[], { comment: string; }[], unknown>; created_at: ", + "<(({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; }) | { comment: string; })[], (({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; }) | { comment: string; })[], unknown>; created_at: ", "StringC", "; updated_at: ", "StringC", @@ -7277,6 +7587,40 @@ "deprecated": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/securitysolution-io-ts-list-types", + "id": "def-common.max_size", + "type": "Object", + "tags": [], + "label": "max_size", + "description": [], + "signature": [ + "Type", + "" + ], + "path": "packages/kbn-securitysolution-io-ts-list-types/src/common/max_size/index.ts", + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/securitysolution-io-ts-list-types", + "id": "def-common.maxSizeOrUndefined", + "type": "Object", + "tags": [], + "label": "maxSizeOrUndefined", + "description": [], + "signature": [ + "UnionC", + "<[", + "Type", + ", ", + "UndefinedC", + "]>" + ], + "path": "packages/kbn-securitysolution-io-ts-list-types/src/common/max_size/index.ts", + "deprecated": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/securitysolution-io-ts-list-types", "id": "def-common.meta", @@ -7520,7 +7864,7 @@ ], "signature": [ "Type", - "<({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[], ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[], unknown>" + "<({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[], ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[], unknown>" ], "path": "packages/kbn-securitysolution-io-ts-list-types/src/common/non_empty_entries_array/index.ts", "deprecated": false, @@ -7724,6 +8068,74 @@ "deprecated": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/securitysolution-io-ts-list-types", + "id": "def-common.pit", + "type": "Object", + "tags": [], + "label": "pit", + "description": [], + "signature": [ + "ExactC", + "<", + "TypeC", + "<{ id: ", + "StringC", + "; keepAlive: ", + "UnionC", + "<[", + "StringC", + ", ", + "UndefinedC", + "]>; }>>" + ], + "path": "packages/kbn-securitysolution-io-ts-list-types/src/common/pit/index.ts", + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/securitysolution-io-ts-list-types", + "id": "def-common.pitId", + "type": "Object", + "tags": [], + "label": "pitId", + "description": [], + "signature": [ + "StringC" + ], + "path": "packages/kbn-securitysolution-io-ts-list-types/src/common/pit/index.ts", + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/securitysolution-io-ts-list-types", + "id": "def-common.pitOrUndefined", + "type": "Object", + "tags": [], + "label": "pitOrUndefined", + "description": [], + "signature": [ + "UnionC", + "<[", + "ExactC", + "<", + "TypeC", + "<{ id: ", + "StringC", + "; keepAlive: ", + "UnionC", + "<[", + "StringC", + ", ", + "UndefinedC", + "]>; }>>, ", + "UndefinedC", + "]>" + ], + "path": "packages/kbn-securitysolution-io-ts-list-types/src/common/pit/index.ts", + "deprecated": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/securitysolution-io-ts-list-types", "id": "def-common.readEndpointListItemSchema", @@ -7833,6 +8245,44 @@ "deprecated": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/securitysolution-io-ts-list-types", + "id": "def-common.search_after", + "type": "Object", + "tags": [], + "label": "search_after", + "description": [], + "signature": [ + "ArrayC", + "<", + "StringC", + ">" + ], + "path": "packages/kbn-securitysolution-io-ts-list-types/src/common/search_after/index.ts", + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/securitysolution-io-ts-list-types", + "id": "def-common.searchAfterOrUndefined", + "type": "Object", + "tags": [], + "label": "searchAfterOrUndefined", + "description": [], + "signature": [ + "UnionC", + "<[", + "ArrayC", + "<", + "StringC", + ">, ", + "UndefinedC", + "]>" + ], + "path": "packages/kbn-securitysolution-io-ts-list-types/src/common/search_after/index.ts", + "deprecated": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/securitysolution-io-ts-list-types", "id": "def-common.searchListItemArraySchema", @@ -8347,7 +8797,7 @@ "StringC", "; entries: ", "Type", - "<({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[], ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[], unknown>; name: ", + "<({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[], ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[], unknown>; name: ", "StringC", "; type: ", "KeyofC", @@ -8400,7 +8850,7 @@ "StringC", "; entries: ", "Type", - "<({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[], ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[], unknown>; name: ", + "<({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[], ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; })[], unknown>; name: ", "StringC", "; type: ", "KeyofC", diff --git a/api_docs/kbn_securitysolution_io_ts_list_types.mdx b/api_docs/kbn_securitysolution_io_ts_list_types.mdx index 2282d741d999e..fa61c1e33f4a1 100644 --- a/api_docs/kbn_securitysolution_io_ts_list_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_list_types.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/securitysolution-io-ts-list-types plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-list-types'] warning: 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. --- @@ -18,7 +18,7 @@ Contact [Owner missing] for questions regarding this plugin. | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 439 | 1 | 428 | 0 | +| 460 | 1 | 448 | 0 | ## Common diff --git a/api_docs/kbn_securitysolution_io_ts_types.mdx b/api_docs/kbn_securitysolution_io_ts_types.mdx index 494c3b0bf5669..f9d13496dc80c 100644 --- a/api_docs/kbn_securitysolution_io_ts_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_types.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-types title: "@kbn/securitysolution-io-ts-types" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-io-ts-types plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-types'] warning: 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. --- diff --git a/api_docs/kbn_securitysolution_io_ts_utils.mdx b/api_docs/kbn_securitysolution_io_ts_utils.mdx index c29e8441e9ee2..befa30c455347 100644 --- a/api_docs/kbn_securitysolution_io_ts_utils.mdx +++ b/api_docs/kbn_securitysolution_io_ts_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-utils title: "@kbn/securitysolution-io-ts-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-io-ts-utils plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-utils'] warning: 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. --- diff --git a/api_docs/kbn_securitysolution_list_api.devdocs.json b/api_docs/kbn_securitysolution_list_api.devdocs.json index b4ccd4cd6e1c1..8b5693496f42a 100644 --- a/api_docs/kbn_securitysolution_list_api.devdocs.json +++ b/api_docs/kbn_securitysolution_list_api.devdocs.json @@ -62,7 +62,7 @@ "signature": [ "({ http, listItem, signal, }: ", "AddExceptionListItemProps", - ") => Promise<{ _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }>" + ") => Promise<{ _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }>" ], "path": "packages/kbn-securitysolution-list-api/src/api/index.ts", "deprecated": false, @@ -206,7 +206,7 @@ "signature": [ "({ http, id, namespaceType, signal, }: ", "ApiCallByIdProps", - ") => Promise<{ _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }>" + ") => Promise<{ _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }>" ], "path": "packages/kbn-securitysolution-list-api/src/api/index.ts", "deprecated": false, @@ -245,7 +245,7 @@ "section": "def-common.DeleteListParams", "text": "DeleteListParams" }, - ") => Promise<{ _version: string | undefined; created_at: string; created_by: string; description: string; deserializer: string | undefined; id: string; immutable: boolean; meta: object | undefined; name: string; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; version: number; }>" + ") => Promise<{ _version: string | undefined; created_at: string; created_by: string; description: string; deserializer: string | undefined; id: string; immutable: boolean; meta: object | undefined; name: string; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; version: number; }>" ], "path": "packages/kbn-securitysolution-list-api/src/list_api/index.ts", "deprecated": false, @@ -399,7 +399,7 @@ "signature": [ "({ http, id, namespaceType, signal, }: ", "ApiCallByIdProps", - ") => Promise<{ _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }>" + ") => Promise<{ _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }>" ], "path": "packages/kbn-securitysolution-list-api/src/api/index.ts", "deprecated": false, @@ -432,7 +432,7 @@ "signature": [ "({ filterOptions, http, listIds, namespaceTypes, pagination, signal, }: ", "ApiCallByListIdProps", - ") => Promise<{ data: { _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }[]; page: number; per_page: number; total: number; }>" + ") => Promise<{ data: { _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }[]; page: number; per_page: number; total: number; } & { pit?: string | undefined; }>" ], "path": "packages/kbn-securitysolution-list-api/src/api/index.ts", "deprecated": false, @@ -465,7 +465,7 @@ "signature": [ "({ filters, http, namespaceTypes, pagination, signal, }: ", "ApiCallFetchExceptionListsProps", - ") => Promise<{ data: { _version: string | undefined; created_at: string; created_by: string; description: string; id: string; immutable: boolean; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"endpoint\" | \"detection\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\"; updated_at: string; updated_by: string; version: number; }[]; page: number; per_page: number; total: number; }>" + ") => Promise<{ data: { _version: string | undefined; created_at: string; created_by: string; description: string; id: string; immutable: boolean; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"endpoint\" | \"detection\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\"; updated_at: string; updated_by: string; version: number; }[]; page: number; per_page: number; total: number; } & { pit?: string | undefined; }>" ], "path": "packages/kbn-securitysolution-list-api/src/api/index.ts", "deprecated": false, @@ -504,7 +504,7 @@ "section": "def-common.FindListsParams", "text": "FindListsParams" }, - ") => Promise<{ cursor: string; data: { _version: string | undefined; created_at: string; created_by: string; description: string; deserializer: string | undefined; id: string; immutable: boolean; meta: object | undefined; name: string; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; version: number; }[]; page: number; per_page: number; total: number; }>" + ") => Promise<{ cursor: string; data: { _version: string | undefined; created_at: string; created_by: string; description: string; deserializer: string | undefined; id: string; immutable: boolean; meta: object | undefined; name: string; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; version: number; }[]; page: number; per_page: number; total: number; }>" ], "path": "packages/kbn-securitysolution-list-api/src/list_api/index.ts", "deprecated": false, @@ -549,7 +549,7 @@ "section": "def-common.ImportListParams", "text": "ImportListParams" }, - ") => Promise<{ _version: string | undefined; created_at: string; created_by: string; description: string; deserializer: string | undefined; id: string; immutable: boolean; meta: object | undefined; name: string; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; version: number; }>" + ") => Promise<{ _version: string | undefined; created_at: string; created_by: string; description: string; deserializer: string | undefined; id: string; immutable: boolean; meta: object | undefined; name: string; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; version: number; }>" ], "path": "packages/kbn-securitysolution-list-api/src/list_api/index.ts", "deprecated": false, @@ -743,7 +743,7 @@ "signature": [ "({ http, listItem, signal, }: ", "UpdateExceptionListItemProps", - ") => Promise<{ _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }>" + ") => Promise<{ _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }>" ], "path": "packages/kbn-securitysolution-list-api/src/api/index.ts", "deprecated": false, @@ -1076,7 +1076,7 @@ "label": "type", "description": [], "signature": [ - "\"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\" | undefined" + "\"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\" | undefined" ], "path": "packages/kbn-securitysolution-list-api/src/list_api/types.ts", "deprecated": false diff --git a/api_docs/kbn_securitysolution_list_api.mdx b/api_docs/kbn_securitysolution_list_api.mdx index 575b8941de370..5222943dbf581 100644 --- a/api_docs/kbn_securitysolution_list_api.mdx +++ b/api_docs/kbn_securitysolution_list_api.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-api title: "@kbn/securitysolution-list-api" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-list-api plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-api'] warning: 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. --- diff --git a/api_docs/kbn_securitysolution_list_constants.mdx b/api_docs/kbn_securitysolution_list_constants.mdx index 5c3aed816d7ab..d9a1d1f5f6fd6 100644 --- a/api_docs/kbn_securitysolution_list_constants.mdx +++ b/api_docs/kbn_securitysolution_list_constants.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-constants title: "@kbn/securitysolution-list-constants" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-list-constants plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-constants'] warning: 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. --- diff --git a/api_docs/kbn_securitysolution_list_hooks.devdocs.json b/api_docs/kbn_securitysolution_list_hooks.devdocs.json index f850c93307660..f835d18574804 100644 --- a/api_docs/kbn_securitysolution_list_hooks.devdocs.json +++ b/api_docs/kbn_securitysolution_list_hooks.devdocs.json @@ -29,7 +29,7 @@ "\nThis adds an id to the incoming exception item entries as ReactJS prefers to have\nan id added to them for use as a stable id. Later if we decide to change the data\nmodel to have id's within the array then this code should be removed. If not, then\nthis code should stay as an adapter for ReactJS.\n\nThis does break the type system slightly as we are lying a bit to the type system as we return\nthe same exceptionItem as we have previously but are augmenting the arrays with an id which TypeScript\ndoesn't mind us doing here. However, downstream you will notice that you have an id when the type\ndoes not indicate it. In that case use (ExceptionItem & { id: string }) temporarily if you're using the id. If you're not,\nyou can ignore the id and just use the normal TypeScript with ReactJS.\n" ], "signature": [ - "(exceptionItem: { _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }) => { _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }" + "(exceptionItem: { _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }) => { _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }" ], "path": "packages/kbn-securitysolution-list-hooks/src/transforms/index.ts", "deprecated": false, @@ -44,7 +44,7 @@ "The exceptionItem to add an id to the threat matches." ], "signature": [ - "{ _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }" + "{ _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }" ], "path": "packages/kbn-securitysolution-list-hooks/src/transforms/index.ts", "deprecated": false, @@ -66,7 +66,7 @@ "\nThis removes an id from the exceptionItem entries as ReactJS prefers to have\nan id added to them for use as a stable id. Later if we decide to change the data\nmodel to have id's within the array then this code should be removed. If not, then\nthis code should stay as an adapter for ReactJS.\n" ], "signature": [ - "(exceptionItem: T) => T" + "(exceptionItem: T) => T" ], "path": "packages/kbn-securitysolution-list-hooks/src/transforms/index.ts", "deprecated": false, @@ -103,7 +103,7 @@ "\nTransforms the output of rules to compensate for technical debt or UI concerns such as\nReactJS preferences for having ids within arrays if the data is not modeled that way.\n\nIf you add a new transform of the input called \"myNewTransform\" do it\nin the form of:\nflow(addIdToExceptionItemEntries, myNewTransform)(exceptionItem)\n" ], "signature": [ - "(exceptionItem: { _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }) => { _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }" + "(exceptionItem: { _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }) => { _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }" ], "path": "packages/kbn-securitysolution-list-hooks/src/transforms/index.ts", "deprecated": false, @@ -118,7 +118,7 @@ "The exceptionItem to transform the output of" ], "signature": [ - "{ _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }" + "{ _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }" ], "path": "packages/kbn-securitysolution-list-hooks/src/transforms/index.ts", "deprecated": false, @@ -138,7 +138,7 @@ "label": "transformNewItemOutput", "description": [], "signature": [ - "(exceptionItem: { description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; })[]; list_id: string; name: string; type: \"simple\"; } & { comments?: { comment: string; }[] | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }) => { description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; })[]; list_id: string; name: string; type: \"simple\"; } & { comments?: { comment: string; }[] | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }" + "(exceptionItem: { description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; })[]; list_id: string; name: string; type: \"simple\"; } & { comments?: { comment: string; }[] | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }) => { description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; })[]; list_id: string; name: string; type: \"simple\"; } & { comments?: { comment: string; }[] | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }" ], "path": "packages/kbn-securitysolution-list-hooks/src/transforms/index.ts", "deprecated": false, @@ -151,7 +151,7 @@ "label": "exceptionItem", "description": [], "signature": [ - "{ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; })[]; list_id: string; name: string; type: \"simple\"; } & { comments?: { comment: string; }[] | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }" + "{ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; })[]; list_id: string; name: string; type: \"simple\"; } & { comments?: { comment: string; }[] | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }" ], "path": "packages/kbn-securitysolution-list-hooks/src/transforms/index.ts", "deprecated": false, @@ -171,7 +171,7 @@ "\nTransforms the output of exception items to compensate for technical debt or UI concerns such as\nReactJS preferences for having ids within arrays if the data is not modeled that way.\n\nIf you add a new transform of the output called \"myNewTransform\" do it\nin the form of:\nflow(removeIdFromExceptionItemsEntries, myNewTransform)(exceptionItem)\n" ], "signature": [ - "(exceptionItem: { _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; } | ({ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; })[]; name: string; type: \"simple\"; } & { _version?: string | undefined; comments?: ({ comment: string; } & { id?: string | undefined; })[] | undefined; id?: string | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; })) => { _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; } | ({ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; })[]; name: string; type: \"simple\"; } & { _version?: string | undefined; comments?: ({ comment: string; } & { id?: string | undefined; })[] | undefined; id?: string | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; })" + "(exceptionItem: { _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; } | ({ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; })[]; name: string; type: \"simple\"; } & { _version?: string | undefined; comments?: ({ comment: string; } & { id?: string | undefined; })[] | undefined; id?: string | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; })) => { _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; } | ({ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; })[]; name: string; type: \"simple\"; } & { _version?: string | undefined; comments?: ({ comment: string; } & { id?: string | undefined; })[] | undefined; id?: string | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; })" ], "path": "packages/kbn-securitysolution-list-hooks/src/transforms/index.ts", "deprecated": false, @@ -186,7 +186,7 @@ "The exceptionItem to transform the output of" ], "signature": [ - "{ _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; } | ({ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; })[]; name: string; type: \"simple\"; } & { _version?: string | undefined; comments?: ({ comment: string; } & { id?: string | undefined; })[] | undefined; id?: string | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; })" + "{ _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; } | ({ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; })[]; name: string; type: \"simple\"; } & { _version?: string | undefined; comments?: ({ comment: string; } & { id?: string | undefined; })[] | undefined; id?: string | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; })" ], "path": "packages/kbn-securitysolution-list-hooks/src/transforms/index.ts", "deprecated": false, @@ -317,7 +317,7 @@ "OptionalSignalArgs", "<", "DeleteListParams", - ">], { _version: string | undefined; created_at: string; created_by: string; description: string; deserializer: string | undefined; id: string; immutable: boolean; meta: object | undefined; name: string; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; version: number; }>" + ">], { _version: string | undefined; created_at: string; created_by: string; description: string; deserializer: string | undefined; id: string; immutable: boolean; meta: object | undefined; name: string; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; version: number; }>" ], "path": "packages/kbn-securitysolution-list-hooks/src/use_delete_list/index.ts", "deprecated": false, @@ -445,7 +445,7 @@ "OptionalSignalArgs", "<", "FindListsParams", - ">], { cursor: string; data: { _version: string | undefined; created_at: string; created_by: string; description: string; deserializer: string | undefined; id: string; immutable: boolean; meta: object | undefined; name: string; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; version: number; }[]; page: number; per_page: number; total: number; }>" + ">], { cursor: string; data: { _version: string | undefined; created_at: string; created_by: string; description: string; deserializer: string | undefined; id: string; immutable: boolean; meta: object | undefined; name: string; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; version: number; }[]; page: number; per_page: number; total: number; }>" ], "path": "packages/kbn-securitysolution-list-hooks/src/use_find_lists/index.ts", "deprecated": false, @@ -467,7 +467,7 @@ "OptionalSignalArgs", "<", "ImportListParams", - ">], { _version: string | undefined; created_at: string; created_by: string; description: string; deserializer: string | undefined; id: string; immutable: boolean; meta: object | undefined; name: string; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; version: number; }>" + ">], { _version: string | undefined; created_at: string; created_by: string; description: string; deserializer: string | undefined; id: string; immutable: boolean; meta: object | undefined; name: string; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; version: number; }>" ], "path": "packages/kbn-securitysolution-list-hooks/src/use_import_list/index.ts", "deprecated": false, @@ -623,7 +623,7 @@ "label": "addExceptionListItem", "description": [], "signature": [ - "(arg: { listItem: { description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; })[]; list_id: string; name: string; type: \"simple\"; } & { comments?: { comment: string; }[] | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }; }) => Promise<{ _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }>" + "(arg: { listItem: { description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; })[]; list_id: string; name: string; type: \"simple\"; } & { comments?: { comment: string; }[] | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }; }) => Promise<{ _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }>" ], "path": "packages/kbn-securitysolution-list-hooks/src/use_api/index.ts", "deprecated": false, @@ -646,7 +646,7 @@ "label": "listItem", "description": [], "signature": [ - "{ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; })[]; list_id: string; name: string; type: \"simple\"; } & { comments?: { comment: string; }[] | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }" + "{ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; })[]; list_id: string; name: string; type: \"simple\"; } & { comments?: { comment: string; }[] | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }" ], "path": "packages/kbn-securitysolution-list-hooks/src/use_api/index.ts", "deprecated": false @@ -664,7 +664,7 @@ "label": "updateExceptionListItem", "description": [], "signature": [ - "(arg: { listItem: { description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; })[]; name: string; type: \"simple\"; } & { _version?: string | undefined; comments?: ({ comment: string; } & { id?: string | undefined; })[] | undefined; id?: string | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }; }) => Promise<{ _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }>" + "(arg: { listItem: { description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; })[]; name: string; type: \"simple\"; } & { _version?: string | undefined; comments?: ({ comment: string; } & { id?: string | undefined; })[] | undefined; id?: string | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }; }) => Promise<{ _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }>" ], "path": "packages/kbn-securitysolution-list-hooks/src/use_api/index.ts", "deprecated": false, @@ -687,7 +687,7 @@ "label": "listItem", "description": [], "signature": [ - "{ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; })[]; name: string; type: \"simple\"; } & { _version?: string | undefined; comments?: ({ comment: string; } & { id?: string | undefined; })[] | undefined; id?: string | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }" + "{ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; })[]; name: string; type: \"simple\"; } & { _version?: string | undefined; comments?: ({ comment: string; } & { id?: string | undefined; })[] | undefined; id?: string | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }" ], "path": "packages/kbn-securitysolution-list-hooks/src/use_api/index.ts", "deprecated": false @@ -771,7 +771,7 @@ "signature": [ "(arg: ", "ApiCallMemoProps", - " & { onSuccess: (arg: { _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }) => void; }) => Promise" + " & { onSuccess: (arg: { _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }) => void; }) => Promise" ], "path": "packages/kbn-securitysolution-list-hooks/src/use_api/index.ts", "deprecated": false, @@ -785,7 +785,7 @@ "description": [], "signature": [ "ApiCallMemoProps", - " & { onSuccess: (arg: { _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }) => void; }" + " & { onSuccess: (arg: { _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }) => void; }" ], "path": "packages/kbn-securitysolution-list-hooks/src/use_api/index.ts", "deprecated": false, @@ -954,7 +954,7 @@ "label": "ReturnExceptionListAndItems", "description": [], "signature": [ - "[boolean, { _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }[], ", + "[boolean, { _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }[], ", "Pagination", ", Func | null]" ], @@ -996,7 +996,7 @@ "label": "ReturnPersistExceptionItem", "description": [], "signature": [ - "[PersistReturnExceptionItem, React.Dispatch<({ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; })[]; list_id: string; name: string; type: \"simple\"; } & { comments?: { comment: string; }[] | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }) | ({ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; })[]; name: string; type: \"simple\"; } & { _version?: string | undefined; comments?: ({ comment: string; } & { id?: string | undefined; })[] | undefined; id?: string | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }) | null>]" + "[PersistReturnExceptionItem, React.Dispatch<({ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; })[]; list_id: string; name: string; type: \"simple\"; } & { comments?: { comment: string; }[] | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }) | ({ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; })[]; name: string; type: \"simple\"; } & { _version?: string | undefined; comments?: ({ comment: string; } & { id?: string | undefined; })[] | undefined; id?: string | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }) | null>]" ], "path": "packages/kbn-securitysolution-list-hooks/src/use_persist_exception_item/index.ts", "deprecated": false, diff --git a/api_docs/kbn_securitysolution_list_hooks.mdx b/api_docs/kbn_securitysolution_list_hooks.mdx index 6ccd70fd06ddf..4ca3060b2331c 100644 --- a/api_docs/kbn_securitysolution_list_hooks.mdx +++ b/api_docs/kbn_securitysolution_list_hooks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-hooks title: "@kbn/securitysolution-list-hooks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-list-hooks plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-hooks'] warning: 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. --- diff --git a/api_docs/kbn_securitysolution_list_utils.devdocs.json b/api_docs/kbn_securitysolution_list_utils.devdocs.json index 700f473e170f0..25511e6b717bf 100644 --- a/api_docs/kbn_securitysolution_list_utils.devdocs.json +++ b/api_docs/kbn_securitysolution_list_utils.devdocs.json @@ -27,7 +27,7 @@ "label": "addIdToEntries", "description": [], "signature": [ - "(entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]) => ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]" + "(entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]) => ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]" ], "path": "packages/kbn-securitysolution-list-utils/src/helpers/index.ts", "deprecated": false, @@ -40,7 +40,7 @@ "label": "entries", "description": [], "signature": [ - "({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]" + "({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]" ], "path": "packages/kbn-securitysolution-list-utils/src/helpers/index.ts", "deprecated": false, @@ -58,7 +58,7 @@ "label": "buildExceptionFilter", "description": [], "signature": [ - "({ lists, excludeExceptions, chunkSize, }: { lists: ({ _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; } | ({ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; })[]; list_id: string; name: string; type: \"simple\"; } & { comments?: { comment: string; }[] | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }))[]; excludeExceptions: boolean; chunkSize: number; }) => ", + "({ lists, excludeExceptions, chunkSize, }: { lists: ({ _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; } | ({ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; })[]; list_id: string; name: string; type: \"simple\"; } & { comments?: { comment: string; }[] | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }))[]; excludeExceptions: boolean; chunkSize: number; }) => ", "Filter", " | undefined" ], @@ -83,7 +83,7 @@ "label": "lists", "description": [], "signature": [ - "({ _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; } | ({ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; })[]; list_id: string; name: string; type: \"simple\"; } & { comments?: { comment: string; }[] | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }))[]" + "({ _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; } | ({ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; })[]; list_id: string; name: string; type: \"simple\"; } & { comments?: { comment: string; }[] | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }))[]" ], "path": "packages/kbn-securitysolution-list-utils/src/build_exception_filter/index.ts", "deprecated": false @@ -690,7 +690,7 @@ "section": "def-common.ExceptionsBuilderExceptionItem", "text": "ExceptionsBuilderExceptionItem" }, - "[]) => ({ _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; } | ({ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; })[]; list_id: string; name: string; type: \"simple\"; } & { comments?: { comment: string; }[] | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }))[]" + "[]) => ({ _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; } | ({ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; })[]; list_id: string; name: string; type: \"simple\"; } & { comments?: { comment: string; }[] | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }))[]" ], "path": "packages/kbn-securitysolution-list-utils/src/helpers/index.ts", "deprecated": false, @@ -944,7 +944,7 @@ "section": "def-common.FormattedBuilderEntry", "text": "FormattedBuilderEntry" }, - ") => ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; }) & { id?: string | undefined; }" + ") => ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; }) & { id?: string | undefined; }" ], "path": "packages/kbn-securitysolution-list-utils/src/helpers/index.ts", "deprecated": false, @@ -1086,7 +1086,7 @@ "section": "def-common.FormattedBuilderEntry", "text": "FormattedBuilderEntry" }, - ", newField: { _version: string | undefined; created_at: string; created_by: string; description: string; deserializer: string | undefined; id: string; immutable: boolean; meta: object | undefined; name: string; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; version: number; }) => { index: number; updatedEntry: ", + ", newField: { _version: string | undefined; created_at: string; created_by: string; description: string; deserializer: string | undefined; id: string; immutable: boolean; meta: object | undefined; name: string; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; version: number; }) => { index: number; updatedEntry: ", { "pluginId": "@kbn/securitysolution-list-utils", "scope": "common", @@ -1131,7 +1131,7 @@ "- newly selected list" ], "signature": [ - "{ _version: string | undefined; created_at: string; created_by: string; description: string; deserializer: string | undefined; id: string; immutable: boolean; meta: object | undefined; name: string; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; version: number; }" + "{ _version: string | undefined; created_at: string; created_by: string; description: string; deserializer: string | undefined; id: string; immutable: boolean; meta: object | undefined; name: string; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; version: number; }" ], "path": "packages/kbn-securitysolution-list-utils/src/helpers/index.ts", "deprecated": false, @@ -2503,7 +2503,7 @@ "label": "hasLargeValueList", "description": [], "signature": [ - "(entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]) => boolean" + "(entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]) => boolean" ], "path": "packages/kbn-securitysolution-list-utils/src/has_large_value_list/index.ts", "deprecated": false, @@ -2516,7 +2516,7 @@ "label": "entries", "description": [], "signature": [ - "({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]" + "({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]" ], "path": "packages/kbn-securitysolution-list-utils/src/has_large_value_list/index.ts", "deprecated": false, @@ -3161,7 +3161,7 @@ "label": "BuilderEntry", "description": [], "signature": [ - "(({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; }) & { id?: string | undefined; }) | ", + "(({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; }) & { id?: string | undefined; }) | ", { "pluginId": "@kbn/securitysolution-list-utils", "scope": "common", @@ -3220,7 +3220,7 @@ "label": "CreateExceptionListItemBuilderSchema", "description": [], "signature": [ - "Omit<{ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; })[]; list_id: string; name: string; type: \"simple\"; } & { comments?: { comment: string; }[] | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }, \"meta\" | \"entries\"> & { meta: { temporaryUuid: string; }; entries: ", + "Omit<{ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; })[]; list_id: string; name: string; type: \"simple\"; } & { comments?: { comment: string; }[] | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }, \"meta\" | \"entries\"> & { meta: { temporaryUuid: string; }; entries: ", { "pluginId": "@kbn/securitysolution-list-utils", "scope": "common", @@ -3354,7 +3354,7 @@ "label": "ExceptionListItemBuilderSchema", "description": [], "signature": [ - "Omit<{ _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }, \"entries\"> & { entries: ", + "Omit<{ _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }, \"entries\"> & { entries: ", { "pluginId": "@kbn/securitysolution-list-utils", "scope": "common", diff --git a/api_docs/kbn_securitysolution_list_utils.mdx b/api_docs/kbn_securitysolution_list_utils.mdx index cb856bd39b1f2..ac515fe68aae3 100644 --- a/api_docs/kbn_securitysolution_list_utils.mdx +++ b/api_docs/kbn_securitysolution_list_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-utils title: "@kbn/securitysolution-list-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-list-utils plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-utils'] warning: 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. --- diff --git a/api_docs/kbn_securitysolution_rules.mdx b/api_docs/kbn_securitysolution_rules.mdx index df9006730e5e9..814c363c133e2 100644 --- a/api_docs/kbn_securitysolution_rules.mdx +++ b/api_docs/kbn_securitysolution_rules.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-rules title: "@kbn/securitysolution-rules" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-rules plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-rules'] warning: 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. --- diff --git a/api_docs/kbn_securitysolution_t_grid.mdx b/api_docs/kbn_securitysolution_t_grid.mdx index d7194de125dc6..a515d88d4ba12 100644 --- a/api_docs/kbn_securitysolution_t_grid.mdx +++ b/api_docs/kbn_securitysolution_t_grid.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-t-grid title: "@kbn/securitysolution-t-grid" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-t-grid plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-t-grid'] warning: 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. --- diff --git a/api_docs/kbn_securitysolution_utils.mdx b/api_docs/kbn_securitysolution_utils.mdx index abf0e1b40b03e..d6da384558737 100644 --- a/api_docs/kbn_securitysolution_utils.mdx +++ b/api_docs/kbn_securitysolution_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-utils title: "@kbn/securitysolution-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-utils plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-utils'] warning: 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. --- diff --git a/api_docs/kbn_server_http_tools.mdx b/api_docs/kbn_server_http_tools.mdx index 5bba1c3605331..9363d91c90516 100644 --- a/api_docs/kbn_server_http_tools.mdx +++ b/api_docs/kbn_server_http_tools.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-server-http-tools title: "@kbn/server-http-tools" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/server-http-tools plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-http-tools'] warning: 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. --- diff --git a/api_docs/kbn_server_route_repository.mdx b/api_docs/kbn_server_route_repository.mdx index bcee696d4d2d0..fb55be6af9b4b 100644 --- a/api_docs/kbn_server_route_repository.mdx +++ b/api_docs/kbn_server_route_repository.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository title: "@kbn/server-route-repository" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/server-route-repository plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository'] warning: 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. --- diff --git a/api_docs/kbn_std.mdx b/api_docs/kbn_std.mdx index 35b4f33aaf0cb..10c9c97f87ab8 100644 --- a/api_docs/kbn_std.mdx +++ b/api_docs/kbn_std.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-std title: "@kbn/std" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/std plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/std'] warning: 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. --- diff --git a/api_docs/kbn_storybook.mdx b/api_docs/kbn_storybook.mdx index 1a613590c4320..3bca34bf83a42 100644 --- a/api_docs/kbn_storybook.mdx +++ b/api_docs/kbn_storybook.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-storybook title: "@kbn/storybook" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/storybook plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/storybook'] warning: 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. --- diff --git a/api_docs/kbn_telemetry_tools.mdx b/api_docs/kbn_telemetry_tools.mdx index 3c5db96b7fed1..00cce163578f7 100644 --- a/api_docs/kbn_telemetry_tools.mdx +++ b/api_docs/kbn_telemetry_tools.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-telemetry-tools title: "@kbn/telemetry-tools" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/telemetry-tools plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/telemetry-tools'] warning: 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. --- diff --git a/api_docs/kbn_test.devdocs.json b/api_docs/kbn_test.devdocs.json index d00b1b11254a3..8a782d0acba7e 100644 --- a/api_docs/kbn_test.devdocs.json +++ b/api_docs/kbn_test.devdocs.json @@ -1561,40 +1561,6 @@ } ], "functions": [ - { - "parentPluginId": "@kbn/test", - "id": "def-server.convertToKibanaClient", - "type": "Function", - "tags": [], - "label": "convertToKibanaClient", - "description": [], - "signature": [ - "(esClient: ", - "default", - ") => ", - "KibanaClient" - ], - "path": "packages/kbn-test/src/es/client_to_kibana_client.ts", - "deprecated": false, - "children": [ - { - "parentPluginId": "@kbn/test", - "id": "def-server.convertToKibanaClient.$1", - "type": "Object", - "tags": [], - "label": "esClient", - "description": [], - "signature": [ - "default" - ], - "path": "packages/kbn-test/src/es/client_to_kibana_client.ts", - "deprecated": false, - "isRequired": true - } - ], - "returnComment": [], - "initialIsOpen": false - }, { "parentPluginId": "@kbn/test", "id": "def-server.createEsClientForFtrConfig", @@ -3594,22 +3560,6 @@ "children": [], "returnComment": [] }, - { - "parentPluginId": "@kbn/test", - "id": "def-server.ICluster.getKibanaEsClient", - "type": "Function", - "tags": [], - "label": "getKibanaEsClient", - "description": [], - "signature": [ - "() => ", - "KibanaClient" - ], - "path": "packages/kbn-test/src/es/test_es_cluster.ts", - "deprecated": false, - "children": [], - "returnComment": [] - }, { "parentPluginId": "@kbn/test", "id": "def-server.ICluster.getHostUrls", diff --git a/api_docs/kbn_test.mdx b/api_docs/kbn_test.mdx index 85d43290c5d5e..f027ef7377b14 100644 --- a/api_docs/kbn_test.mdx +++ b/api_docs/kbn_test.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-test title: "@kbn/test" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/test plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test'] warning: 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. --- @@ -18,7 +18,7 @@ Contact Operations for questions regarding this plugin. | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 244 | 5 | 208 | 9 | +| 241 | 5 | 205 | 9 | ## Server diff --git a/api_docs/kbn_test_jest_helpers.mdx b/api_docs/kbn_test_jest_helpers.mdx index 8519cb0e98180..d8b5fba1fa6fc 100644 --- a/api_docs/kbn_test_jest_helpers.mdx +++ b/api_docs/kbn_test_jest_helpers.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-test-jest-helpers title: "@kbn/test-jest-helpers" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/test-jest-helpers plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-jest-helpers'] warning: 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. --- diff --git a/api_docs/kbn_typed_react_router_config.mdx b/api_docs/kbn_typed_react_router_config.mdx index d1cb8efadd949..0c66237c7b058 100644 --- a/api_docs/kbn_typed_react_router_config.mdx +++ b/api_docs/kbn_typed_react_router_config.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-typed-react-router-config title: "@kbn/typed-react-router-config" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/typed-react-router-config plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/typed-react-router-config'] warning: 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. --- diff --git a/api_docs/kbn_ui_theme.mdx b/api_docs/kbn_ui_theme.mdx index b5b49f0306c69..6030535a0250e 100644 --- a/api_docs/kbn_ui_theme.mdx +++ b/api_docs/kbn_ui_theme.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-ui-theme title: "@kbn/ui-theme" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/ui-theme plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-theme'] warning: 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. --- diff --git a/api_docs/kbn_utility_types.mdx b/api_docs/kbn_utility_types.mdx index 6fdbb2fff69ea..4adbc63e50aa5 100644 --- a/api_docs/kbn_utility_types.mdx +++ b/api_docs/kbn_utility_types.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types title: "@kbn/utility-types" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/utility-types plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utility-types'] warning: 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. --- diff --git a/api_docs/kbn_utils.mdx b/api_docs/kbn_utils.mdx index bf2153da29e25..c71b131336f05 100644 --- a/api_docs/kbn_utils.mdx +++ b/api_docs/kbn_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-utils title: "@kbn/utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/utils plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utils'] warning: 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. --- diff --git a/api_docs/kibana_overview.mdx b/api_docs/kibana_overview.mdx index efd679a9766f5..b78215b0382bc 100644 --- a/api_docs/kibana_overview.mdx +++ b/api_docs/kibana_overview.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kibanaOverview title: "kibanaOverview" image: https://source.unsplash.com/400x175/?github summary: API docs for the kibanaOverview plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaOverview'] warning: 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. --- diff --git a/api_docs/kibana_react.devdocs.json b/api_docs/kibana_react.devdocs.json index c253bc77f6a6b..adea589d4eb95 100644 --- a/api_docs/kibana_react.devdocs.json +++ b/api_docs/kibana_react.devdocs.json @@ -3871,14 +3871,42 @@ "parentPluginId": "kibanaReact", "id": "def-public.ExitFullScreenButton", "type": "Object", - "tags": [], + "tags": [ + "deprecated" + ], "label": "ExitFullScreenButton", "description": [], "signature": [ "typeof ExitFullScreenButtonUi" ], "path": "src/plugins/kibana_react/public/exit_full_screen_button/exit_full_screen_button.tsx", - "deprecated": false, + "deprecated": true, + "references": [ + { + "plugin": "dashboard", + "path": "src/plugins/dashboard/public/services/kibana_react.ts" + }, + { + "plugin": "dashboard", + "path": "src/plugins/dashboard/public/plugin.tsx" + }, + { + "plugin": "dashboard", + "path": "src/plugins/dashboard/public/plugin.tsx" + }, + { + "plugin": "dashboard", + "path": "src/plugins/dashboard/public/plugin.tsx" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/public/connected_components/map_container/map_container.tsx" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/public/connected_components/map_container/map_container.tsx" + } + ], "initialIsOpen": false }, { diff --git a/api_docs/kibana_react.mdx b/api_docs/kibana_react.mdx index 304d46f440097..cc5c4251f5619 100644 --- a/api_docs/kibana_react.mdx +++ b/api_docs/kibana_react.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kibanaReact title: "kibanaReact" image: https://source.unsplash.com/400x175/?github summary: API docs for the kibanaReact plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaReact'] warning: 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. --- diff --git a/api_docs/kibana_utils.mdx b/api_docs/kibana_utils.mdx index 088865fd838c2..327c3cc9c973a 100644 --- a/api_docs/kibana_utils.mdx +++ b/api_docs/kibana_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kibanaUtils title: "kibanaUtils" image: https://source.unsplash.com/400x175/?github summary: API docs for the kibanaUtils plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaUtils'] warning: 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. --- diff --git a/api_docs/lens.devdocs.json b/api_docs/lens.devdocs.json index 241ebb73f5b81..3a5c531a23308 100644 --- a/api_docs/lens.devdocs.json +++ b/api_docs/lens.devdocs.json @@ -231,7 +231,7 @@ "label": "params", "description": [], "signature": [ - "{ interval: string; }" + "{ interval: string; ignoreTimeRange?: boolean | undefined; }" ], "path": "x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/date_histogram.tsx", "deprecated": false @@ -1282,6 +1282,45 @@ ], "path": "x-pack/plugins/lens/common/expressions/metric_chart/types.ts", "deprecated": false + }, + { + "parentPluginId": "lens", + "id": "def-public.MetricState.titlePosition", + "type": "CompoundType", + "tags": [], + "label": "titlePosition", + "description": [], + "signature": [ + "\"top\" | \"bottom\" | undefined" + ], + "path": "x-pack/plugins/lens/common/expressions/metric_chart/types.ts", + "deprecated": false + }, + { + "parentPluginId": "lens", + "id": "def-public.MetricState.size", + "type": "string", + "tags": [], + "label": "size", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "x-pack/plugins/lens/common/expressions/metric_chart/types.ts", + "deprecated": false + }, + { + "parentPluginId": "lens", + "id": "def-public.MetricState.textAlign", + "type": "CompoundType", + "tags": [], + "label": "textAlign", + "description": [], + "signature": [ + "\"left\" | \"right\" | \"center\" | undefined" + ], + "path": "x-pack/plugins/lens/common/expressions/metric_chart/types.ts", + "deprecated": false } ], "initialIsOpen": false @@ -1414,7 +1453,7 @@ "tags": [], "label": "PieVisualizationState", "description": [], - "path": "x-pack/plugins/lens/common/expressions/pie_chart/types.ts", + "path": "x-pack/plugins/lens/common/types.ts", "deprecated": false, "children": [ { @@ -1427,7 +1466,7 @@ "signature": [ "\"pie\" | \"donut\" | \"treemap\" | \"mosaic\" | \"waffle\"" ], - "path": "x-pack/plugins/lens/common/expressions/pie_chart/types.ts", + "path": "x-pack/plugins/lens/common/types.ts", "deprecated": false }, { @@ -1438,10 +1477,16 @@ "label": "layers", "description": [], "signature": [ - "PieLayerState", + { + "pluginId": "lens", + "scope": "common", + "docId": "kibLensPluginApi", + "section": "def-common.PieLayerState", + "text": "PieLayerState" + }, "[]" ], - "path": "x-pack/plugins/lens/common/expressions/pie_chart/types.ts", + "path": "x-pack/plugins/lens/common/types.ts", "deprecated": false }, { @@ -1461,7 +1506,7 @@ }, "<{ [key: string]: unknown; }> | undefined" ], - "path": "x-pack/plugins/lens/common/expressions/pie_chart/types.ts", + "path": "x-pack/plugins/lens/common/types.ts", "deprecated": false } ], @@ -1534,7 +1579,7 @@ "tags": [], "label": "SharedPieLayerState", "description": [], - "path": "x-pack/plugins/lens/common/expressions/pie_chart/types.ts", + "path": "x-pack/plugins/lens/common/types.ts", "deprecated": false, "children": [ { @@ -1547,7 +1592,7 @@ "signature": [ "string[]" ], - "path": "x-pack/plugins/lens/common/expressions/pie_chart/types.ts", + "path": "x-pack/plugins/lens/common/types.ts", "deprecated": false }, { @@ -1560,7 +1605,7 @@ "signature": [ "string | undefined" ], - "path": "x-pack/plugins/lens/common/expressions/pie_chart/types.ts", + "path": "x-pack/plugins/lens/common/types.ts", "deprecated": false }, { @@ -1573,7 +1618,7 @@ "signature": [ "\"percent\" | \"hidden\" | \"value\"" ], - "path": "x-pack/plugins/lens/common/expressions/pie_chart/types.ts", + "path": "x-pack/plugins/lens/common/types.ts", "deprecated": false }, { @@ -1586,7 +1631,7 @@ "signature": [ "\"default\" | \"hide\" | \"inside\"" ], - "path": "x-pack/plugins/lens/common/expressions/pie_chart/types.ts", + "path": "x-pack/plugins/lens/common/types.ts", "deprecated": false }, { @@ -1599,7 +1644,7 @@ "signature": [ "\"default\" | \"show\" | \"hide\"" ], - "path": "x-pack/plugins/lens/common/expressions/pie_chart/types.ts", + "path": "x-pack/plugins/lens/common/types.ts", "deprecated": false }, { @@ -1610,9 +1655,10 @@ "label": "legendPosition", "description": [], "signature": [ - "\"top\" | \"bottom\" | \"left\" | \"right\" | undefined" + "Position", + " | undefined" ], - "path": "x-pack/plugins/lens/common/expressions/pie_chart/types.ts", + "path": "x-pack/plugins/lens/common/types.ts", "deprecated": false }, { @@ -1625,7 +1671,7 @@ "signature": [ "boolean | undefined" ], - "path": "x-pack/plugins/lens/common/expressions/pie_chart/types.ts", + "path": "x-pack/plugins/lens/common/types.ts", "deprecated": false }, { @@ -1638,7 +1684,7 @@ "signature": [ "boolean | undefined" ], - "path": "x-pack/plugins/lens/common/expressions/pie_chart/types.ts", + "path": "x-pack/plugins/lens/common/types.ts", "deprecated": false }, { @@ -1651,7 +1697,7 @@ "signature": [ "number | undefined" ], - "path": "x-pack/plugins/lens/common/expressions/pie_chart/types.ts", + "path": "x-pack/plugins/lens/common/types.ts", "deprecated": false }, { @@ -1664,7 +1710,7 @@ "signature": [ "number | undefined" ], - "path": "x-pack/plugins/lens/common/expressions/pie_chart/types.ts", + "path": "x-pack/plugins/lens/common/types.ts", "deprecated": false }, { @@ -1677,7 +1723,7 @@ "signature": [ "number | undefined" ], - "path": "x-pack/plugins/lens/common/expressions/pie_chart/types.ts", + "path": "x-pack/plugins/lens/common/types.ts", "deprecated": false }, { @@ -1690,7 +1736,7 @@ "signature": [ "boolean | undefined" ], - "path": "x-pack/plugins/lens/common/expressions/pie_chart/types.ts", + "path": "x-pack/plugins/lens/common/types.ts", "deprecated": false } ], @@ -2310,7 +2356,7 @@ }, "; label: string; icon?: ", "IconType", - " | undefined; disabled?: boolean | undefined; tooltipContent?: string | undefined; initialDimensions?: { groupId: string; columnId: string; dataType: string; label: string; staticValue: unknown; }[] | undefined; }[]" + " | undefined; disabled?: boolean | undefined; toolTipContent?: string | undefined; initialDimensions?: { groupId: string; columnId: string; dataType: string; label: string; staticValue: unknown; }[] | undefined; }[]" ], "path": "x-pack/plugins/lens/public/types.ts", "deprecated": false, @@ -2643,6 +2689,72 @@ ], "returnComment": [] }, + { + "parentPluginId": "lens", + "id": "def-public.Visualization.updateLayersConfigurationFromContext", + "type": "Function", + "tags": [], + "label": "updateLayersConfigurationFromContext", + "description": [ + "\nUpdate the configuration for the visualization. This is used to update the state" + ], + "signature": [ + "((props: VisualizationConfigurationFromContextChangeProps) => T) | undefined" + ], + "path": "x-pack/plugins/lens/public/types.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "lens", + "id": "def-public.Visualization.updateLayersConfigurationFromContext.$1", + "type": "Object", + "tags": [], + "label": "props", + "description": [], + "signature": [ + "VisualizationConfigurationFromContextChangeProps" + ], + "path": "x-pack/plugins/lens/public/types.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "lens", + "id": "def-public.Visualization.getVisualizationSuggestionFromContext", + "type": "Function", + "tags": [], + "label": "getVisualizationSuggestionFromContext", + "description": [ + "\nUpdate the visualization state from the context." + ], + "signature": [ + "((props: VisualizationStateFromContextChangeProps) => ", + "Suggestion", + ") | undefined" + ], + "path": "x-pack/plugins/lens/public/types.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "lens", + "id": "def-public.Visualization.getVisualizationSuggestionFromContext.$1", + "type": "Object", + "tags": [], + "label": "props", + "description": [], + "signature": [ + "VisualizationStateFromContextChangeProps" + ], + "path": "x-pack/plugins/lens/public/types.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, { "parentPluginId": "lens", "id": "def-public.Visualization.renderDimensionEditor", @@ -3694,6 +3806,7 @@ "label": "GaugeVisualizationState", "description": [], "signature": [ + "Omit<", { "pluginId": "expressionGauge", "scope": "common", @@ -3701,7 +3814,7 @@ "section": "def-common.GaugeState", "text": "GaugeState" }, - " & { layerId: string; layerType: ", + ", \"goal\" | \"max\" | \"min\" | \"metric\"> & { metricAccessor?: string | undefined; minAccessor?: string | undefined; maxAccessor?: string | undefined; goalAccessor?: string | undefined; } & { layerId: string; layerType: ", { "pluginId": "lens", "scope": "common", @@ -3943,7 +4056,13 @@ "label": "PieLayerState", "description": [], "signature": [ - "SharedPieLayerState", + { + "pluginId": "lens", + "scope": "common", + "docId": "kibLensPluginApi", + "section": "def-common.SharedPieLayerState", + "text": "SharedPieLayerState" + }, " & { layerId: string; layerType: ", { "pluginId": "lens", @@ -3954,7 +4073,7 @@ }, "; }" ], - "path": "x-pack/plugins/lens/common/expressions/pie_chart/types.ts", + "path": "x-pack/plugins/lens/common/types.ts", "deprecated": false, "initialIsOpen": false }, @@ -4016,7 +4135,13 @@ "text": "XYState" }, "> | LensAttributes<\"lnsPie\", ", - "PieVisualizationState", + { + "pluginId": "lens", + "scope": "common", + "docId": "kibLensPluginApi", + "section": "def-common.PieVisualizationState", + "text": "PieVisualizationState" + }, "> | LensAttributes<\"lnsDatatable\", ", { "pluginId": "lens", @@ -5980,6 +6105,242 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "lens", + "id": "def-common.PieVisualizationState", + "type": "Interface", + "tags": [], + "label": "PieVisualizationState", + "description": [], + "path": "x-pack/plugins/lens/common/types.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "lens", + "id": "def-common.PieVisualizationState.shape", + "type": "CompoundType", + "tags": [], + "label": "shape", + "description": [], + "signature": [ + "\"pie\" | \"donut\" | \"treemap\" | \"mosaic\" | \"waffle\"" + ], + "path": "x-pack/plugins/lens/common/types.ts", + "deprecated": false + }, + { + "parentPluginId": "lens", + "id": "def-common.PieVisualizationState.layers", + "type": "Array", + "tags": [], + "label": "layers", + "description": [], + "signature": [ + { + "pluginId": "lens", + "scope": "common", + "docId": "kibLensPluginApi", + "section": "def-common.PieLayerState", + "text": "PieLayerState" + }, + "[]" + ], + "path": "x-pack/plugins/lens/common/types.ts", + "deprecated": false + }, + { + "parentPluginId": "lens", + "id": "def-common.PieVisualizationState.palette", + "type": "Object", + "tags": [], + "label": "palette", + "description": [], + "signature": [ + { + "pluginId": "charts", + "scope": "common", + "docId": "kibChartsPluginApi", + "section": "def-common.PaletteOutput", + "text": "PaletteOutput" + }, + "<{ [key: string]: unknown; }> | undefined" + ], + "path": "x-pack/plugins/lens/common/types.ts", + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "lens", + "id": "def-common.SharedPieLayerState", + "type": "Interface", + "tags": [], + "label": "SharedPieLayerState", + "description": [], + "path": "x-pack/plugins/lens/common/types.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "lens", + "id": "def-common.SharedPieLayerState.groups", + "type": "Array", + "tags": [], + "label": "groups", + "description": [], + "signature": [ + "string[]" + ], + "path": "x-pack/plugins/lens/common/types.ts", + "deprecated": false + }, + { + "parentPluginId": "lens", + "id": "def-common.SharedPieLayerState.metric", + "type": "string", + "tags": [], + "label": "metric", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "x-pack/plugins/lens/common/types.ts", + "deprecated": false + }, + { + "parentPluginId": "lens", + "id": "def-common.SharedPieLayerState.numberDisplay", + "type": "CompoundType", + "tags": [], + "label": "numberDisplay", + "description": [], + "signature": [ + "\"percent\" | \"hidden\" | \"value\"" + ], + "path": "x-pack/plugins/lens/common/types.ts", + "deprecated": false + }, + { + "parentPluginId": "lens", + "id": "def-common.SharedPieLayerState.categoryDisplay", + "type": "CompoundType", + "tags": [], + "label": "categoryDisplay", + "description": [], + "signature": [ + "\"default\" | \"hide\" | \"inside\"" + ], + "path": "x-pack/plugins/lens/common/types.ts", + "deprecated": false + }, + { + "parentPluginId": "lens", + "id": "def-common.SharedPieLayerState.legendDisplay", + "type": "CompoundType", + "tags": [], + "label": "legendDisplay", + "description": [], + "signature": [ + "\"default\" | \"show\" | \"hide\"" + ], + "path": "x-pack/plugins/lens/common/types.ts", + "deprecated": false + }, + { + "parentPluginId": "lens", + "id": "def-common.SharedPieLayerState.legendPosition", + "type": "CompoundType", + "tags": [], + "label": "legendPosition", + "description": [], + "signature": [ + "Position", + " | undefined" + ], + "path": "x-pack/plugins/lens/common/types.ts", + "deprecated": false + }, + { + "parentPluginId": "lens", + "id": "def-common.SharedPieLayerState.showValuesInLegend", + "type": "CompoundType", + "tags": [], + "label": "showValuesInLegend", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "x-pack/plugins/lens/common/types.ts", + "deprecated": false + }, + { + "parentPluginId": "lens", + "id": "def-common.SharedPieLayerState.nestedLegend", + "type": "CompoundType", + "tags": [], + "label": "nestedLegend", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "x-pack/plugins/lens/common/types.ts", + "deprecated": false + }, + { + "parentPluginId": "lens", + "id": "def-common.SharedPieLayerState.percentDecimals", + "type": "number", + "tags": [], + "label": "percentDecimals", + "description": [], + "signature": [ + "number | undefined" + ], + "path": "x-pack/plugins/lens/common/types.ts", + "deprecated": false + }, + { + "parentPluginId": "lens", + "id": "def-common.SharedPieLayerState.emptySizeRatio", + "type": "number", + "tags": [], + "label": "emptySizeRatio", + "description": [], + "signature": [ + "number | undefined" + ], + "path": "x-pack/plugins/lens/common/types.ts", + "deprecated": false + }, + { + "parentPluginId": "lens", + "id": "def-common.SharedPieLayerState.legendMaxLines", + "type": "number", + "tags": [], + "label": "legendMaxLines", + "description": [], + "signature": [ + "number | undefined" + ], + "path": "x-pack/plugins/lens/common/types.ts", + "deprecated": false + }, + { + "parentPluginId": "lens", + "id": "def-common.SharedPieLayerState.truncateLegend", + "type": "CompoundType", + "tags": [], + "label": "truncateLegend", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "x-pack/plugins/lens/common/types.ts", + "deprecated": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "lens", "id": "def-common.TopValuesResult", @@ -6024,7 +6385,19 @@ "initialIsOpen": false } ], - "enums": [], + "enums": [ + { + "parentPluginId": "lens", + "id": "def-common.EmptySizeRatios", + "type": "Enum", + "tags": [], + "label": "EmptySizeRatios", + "description": [], + "path": "x-pack/plugins/lens/common/types.ts", + "deprecated": false, + "initialIsOpen": false + } + ], "misc": [ { "parentPluginId": "lens", @@ -6054,6 +6427,20 @@ "deprecated": false, "initialIsOpen": false }, + { + "parentPluginId": "lens", + "id": "def-common.CategoryDisplayType", + "type": "Type", + "tags": [], + "label": "CategoryDisplayType", + "description": [], + "signature": [ + "\"default\" | \"hide\" | \"inside\"" + ], + "path": "x-pack/plugins/lens/common/types.ts", + "deprecated": false, + "initialIsOpen": false + }, { "parentPluginId": "lens", "id": "def-common.CustomPaletteParamsConfig", @@ -6185,6 +6572,20 @@ "deprecated": false, "initialIsOpen": false }, + { + "parentPluginId": "lens", + "id": "def-common.LegendDisplayType", + "type": "Type", + "tags": [], + "label": "LegendDisplayType", + "description": [], + "signature": [ + "\"default\" | \"show\" | \"hide\"" + ], + "path": "x-pack/plugins/lens/common/types.ts", + "deprecated": false, + "initialIsOpen": false + }, { "parentPluginId": "lens", "id": "def-common.LENS_EDIT_BY_VALUE", @@ -6227,6 +6628,63 @@ "deprecated": false, "initialIsOpen": false }, + { + "parentPluginId": "lens", + "id": "def-common.NumberDisplayType", + "type": "Type", + "tags": [], + "label": "NumberDisplayType", + "description": [], + "signature": [ + "\"percent\" | \"hidden\" | \"value\"" + ], + "path": "x-pack/plugins/lens/common/types.ts", + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "lens", + "id": "def-common.PieChartType", + "type": "Type", + "tags": [], + "label": "PieChartType", + "description": [], + "signature": [ + "\"pie\" | \"donut\" | \"treemap\" | \"mosaic\" | \"waffle\"" + ], + "path": "x-pack/plugins/lens/common/types.ts", + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "lens", + "id": "def-common.PieLayerState", + "type": "Type", + "tags": [], + "label": "PieLayerState", + "description": [], + "signature": [ + { + "pluginId": "lens", + "scope": "common", + "docId": "kibLensPluginApi", + "section": "def-common.SharedPieLayerState", + "text": "SharedPieLayerState" + }, + " & { layerId: string; layerType: ", + { + "pluginId": "lens", + "scope": "common", + "docId": "kibLensPluginApi", + "section": "def-common.LayerType", + "text": "LayerType" + }, + "; }" + ], + "path": "x-pack/plugins/lens/common/types.ts", + "deprecated": false, + "initialIsOpen": false + }, { "parentPluginId": "lens", "id": "def-common.PLUGIN_ID", @@ -6293,6 +6751,20 @@ } ], "objects": [ + { + "parentPluginId": "lens", + "id": "def-common.CategoryDisplay", + "type": "Object", + "tags": [], + "label": "CategoryDisplay", + "description": [], + "signature": [ + "{ readonly DEFAULT: \"default\"; readonly INSIDE: \"inside\"; readonly HIDE: \"hide\"; }" + ], + "path": "x-pack/plugins/lens/common/constants.ts", + "deprecated": false, + "initialIsOpen": false + }, { "parentPluginId": "lens", "id": "def-common.layerTypes", @@ -6331,6 +6803,48 @@ } ], "initialIsOpen": false + }, + { + "parentPluginId": "lens", + "id": "def-common.LegendDisplay", + "type": "Object", + "tags": [], + "label": "LegendDisplay", + "description": [], + "signature": [ + "{ readonly DEFAULT: \"default\"; readonly SHOW: \"show\"; readonly HIDE: \"hide\"; }" + ], + "path": "x-pack/plugins/lens/common/constants.ts", + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "lens", + "id": "def-common.NumberDisplay", + "type": "Object", + "tags": [], + "label": "NumberDisplay", + "description": [], + "signature": [ + "{ readonly HIDDEN: \"hidden\"; readonly PERCENT: \"percent\"; readonly VALUE: \"value\"; }" + ], + "path": "x-pack/plugins/lens/common/constants.ts", + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "lens", + "id": "def-common.PieChartTypes", + "type": "Object", + "tags": [], + "label": "PieChartTypes", + "description": [], + "signature": [ + "{ readonly PIE: \"pie\"; readonly DONUT: \"donut\"; readonly TREEMAP: \"treemap\"; readonly MOSAIC: \"mosaic\"; readonly WAFFLE: \"waffle\"; }" + ], + "path": "x-pack/plugins/lens/common/constants.ts", + "deprecated": false, + "initialIsOpen": false } ] } diff --git a/api_docs/lens.mdx b/api_docs/lens.mdx index b322bfce65ece..ca6411a26645f 100644 --- a/api_docs/lens.mdx +++ b/api_docs/lens.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/lens title: "lens" image: https://source.unsplash.com/400x175/?github summary: API docs for the lens plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lens'] warning: 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. --- @@ -18,7 +18,7 @@ Contact [Vis Editors](https://github.com/orgs/elastic/teams/kibana-vis-editors) | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 365 | 0 | 316 | 44 | +| 399 | 0 | 348 | 42 | ## Client @@ -56,6 +56,9 @@ Contact [Vis Editors](https://github.com/orgs/elastic/teams/kibana-vis-editors) ### Interfaces +### Enums + + ### Consts, variables and types diff --git a/api_docs/license_api_guard.mdx b/api_docs/license_api_guard.mdx index 765d8eebc09bd..a7d065be74db7 100644 --- a/api_docs/license_api_guard.mdx +++ b/api_docs/license_api_guard.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/licenseApiGuard title: "licenseApiGuard" image: https://source.unsplash.com/400x175/?github summary: API docs for the licenseApiGuard plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseApiGuard'] warning: 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. --- diff --git a/api_docs/license_management.mdx b/api_docs/license_management.mdx index c589b8950018c..c7370959536ec 100644 --- a/api_docs/license_management.mdx +++ b/api_docs/license_management.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/licenseManagement title: "licenseManagement" image: https://source.unsplash.com/400x175/?github summary: API docs for the licenseManagement plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseManagement'] warning: 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. --- diff --git a/api_docs/licensing.devdocs.json b/api_docs/licensing.devdocs.json index 0f8d44f2f39f7..40e6f7874ec34 100644 --- a/api_docs/licensing.devdocs.json +++ b/api_docs/licensing.devdocs.json @@ -734,10 +734,6 @@ "plugin": "ml", "path": "x-pack/plugins/ml/public/plugin.ts" }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/public/plugin.ts" - }, { "plugin": "apm", "path": "x-pack/plugins/apm/public/context/license/license_context.tsx" @@ -2531,10 +2527,6 @@ "plugin": "ml", "path": "x-pack/plugins/ml/server/plugin.ts" }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/plugin.ts" - }, { "plugin": "remoteClusters", "path": "x-pack/plugins/remote_clusters/server/plugin.ts" diff --git a/api_docs/licensing.mdx b/api_docs/licensing.mdx index 4ddbb3b79197e..cbfea8a751fa0 100644 --- a/api_docs/licensing.mdx +++ b/api_docs/licensing.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/licensing title: "licensing" image: https://source.unsplash.com/400x175/?github summary: API docs for the licensing plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licensing'] warning: 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. --- diff --git a/api_docs/lists.devdocs.json b/api_docs/lists.devdocs.json index 755ff1c172200..c010e8333785a 100644 --- a/api_docs/lists.devdocs.json +++ b/api_docs/lists.devdocs.json @@ -311,7 +311,7 @@ "label": "exceptionItems", "description": [], "signature": [ - "({ _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; } | ({ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; })[]; list_id: string; name: string; type: \"simple\"; } & { comments?: { comment: string; }[] | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }))[]" + "({ _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; } | ({ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; })[]; list_id: string; name: string; type: \"simple\"; } & { comments?: { comment: string; }[] | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }))[]" ], "path": "x-pack/plugins/lists/public/exceptions/components/builder/exception_items_renderer.tsx", "deprecated": false @@ -324,7 +324,7 @@ "label": "exceptionsToDelete", "description": [], "signature": [ - "{ _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }[]" + "{ _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }[]" ], "path": "x-pack/plugins/lists/public/exceptions/components/builder/exception_items_renderer.tsx", "deprecated": false @@ -587,7 +587,7 @@ "signature": [ "({ itemId, id, namespaceType, }: ", "GetExceptionListItemOptions", - ") => Promise<{ _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; } | null>" + ") => Promise<{ _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; } | null>" ], "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", "deprecated": false, @@ -659,7 +659,7 @@ "signature": [ "({ comments, description, entries, itemId, meta, name, osTypes, tags, type, }: ", "CreateEndpointListItemOptions", - ") => Promise<{ _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }>" + ") => Promise<{ _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }>" ], "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", "deprecated": false, @@ -693,7 +693,7 @@ "signature": [ "({ _version, comments, description, entries, id, itemId, meta, name, osTypes, tags, type, }: ", "UpdateEndpointListItemOptions", - ") => Promise<{ _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; } | null>" + ") => Promise<{ _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; } | null>" ], "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", "deprecated": false, @@ -727,7 +727,7 @@ "signature": [ "({ itemId, id, }: ", "GetEndpointListItemOptions", - ") => Promise<{ _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; } | null>" + ") => Promise<{ _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; } | null>" ], "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", "deprecated": false, @@ -915,7 +915,7 @@ "section": "def-server.CreateExceptionListItemOptions", "text": "CreateExceptionListItemOptions" }, - ") => Promise<{ _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }>" + ") => Promise<{ _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }>" ], "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", "deprecated": false, @@ -977,7 +977,7 @@ "section": "def-server.UpdateExceptionListItemOptions", "text": "UpdateExceptionListItemOptions" }, - ") => Promise<{ _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; } | null>" + ") => Promise<{ _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; } | null>" ], "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", "deprecated": false, @@ -1024,7 +1024,7 @@ "signature": [ "({ id, itemId, namespaceType, }: ", "DeleteExceptionListItemOptions", - ") => Promise<{ _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; } | null>" + ") => Promise<{ _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; } | null>" ], "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", "deprecated": false, @@ -1098,7 +1098,7 @@ "signature": [ "({ id, itemId, }: ", "DeleteEndpointListItemOptions", - ") => Promise<{ _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; } | null>" + ") => Promise<{ _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; } | null>" ], "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", "deprecated": false, @@ -1128,9 +1128,9 @@ "label": "findExceptionListItem", "description": [], "signature": [ - "({ listId, filter, perPage, page, sortField, sortOrder, namespaceType, }: ", + "({ listId, filter, perPage, pit, page, searchAfter, sortField, sortOrder, namespaceType, }: ", "FindExceptionListItemOptions", - ") => Promise<{ data: { _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }[]; page: number; per_page: number; total: number; } | null>" + ") => Promise<({ data: { _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }[]; page: number; per_page: number; total: number; } & { pit?: string | undefined; }) | null>" ], "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", "deprecated": false, @@ -1140,7 +1140,7 @@ "id": "def-server.ExceptionListClient.findExceptionListItem.$1", "type": "Object", "tags": [], - "label": "{\n listId,\n filter,\n perPage,\n page,\n sortField,\n sortOrder,\n namespaceType,\n }", + "label": "{\n listId,\n filter,\n perPage,\n pit,\n page,\n searchAfter,\n sortField,\n sortOrder,\n namespaceType,\n }", "description": [], "signature": [ "FindExceptionListItemOptions" @@ -1160,9 +1160,9 @@ "label": "findExceptionListsItem", "description": [], "signature": [ - "({ listId, filter, perPage, page, sortField, sortOrder, namespaceType, }: ", + "({ listId, filter, perPage, pit, page, searchAfter, sortField, sortOrder, namespaceType, }: ", "FindExceptionListsItemOptions", - ") => Promise<{ data: { _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }[]; page: number; per_page: number; total: number; } | null>" + ") => Promise<({ data: { _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }[]; page: number; per_page: number; total: number; } & { pit?: string | undefined; }) | null>" ], "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", "deprecated": false, @@ -1172,7 +1172,7 @@ "id": "def-server.ExceptionListClient.findExceptionListsItem.$1", "type": "Object", "tags": [], - "label": "{\n listId,\n filter,\n perPage,\n page,\n sortField,\n sortOrder,\n namespaceType,\n }", + "label": "{\n listId,\n filter,\n perPage,\n pit,\n page,\n searchAfter,\n sortField,\n sortOrder,\n namespaceType,\n }", "description": [], "signature": [ "FindExceptionListsItemOptions" @@ -1192,9 +1192,9 @@ "label": "findValueListExceptionListItems", "description": [], "signature": [ - "({ perPage, page, sortField, sortOrder, valueListId, }: ", + "({ perPage, pit, page, searchAfter, sortField, sortOrder, valueListId, }: ", "FindValueListExceptionListsItems", - ") => Promise<{ data: { _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }[]; page: number; per_page: number; total: number; } | null>" + ") => Promise<({ data: { _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }[]; page: number; per_page: number; total: number; } & { pit?: string | undefined; }) | null>" ], "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", "deprecated": false, @@ -1204,7 +1204,7 @@ "id": "def-server.ExceptionListClient.findValueListExceptionListItems.$1", "type": "Object", "tags": [], - "label": "{\n perPage,\n page,\n sortField,\n sortOrder,\n valueListId,\n }", + "label": "{\n perPage,\n pit,\n page,\n searchAfter,\n sortField,\n sortOrder,\n valueListId,\n }", "description": [], "signature": [ "FindValueListExceptionListsItems" @@ -1224,9 +1224,9 @@ "label": "findExceptionList", "description": [], "signature": [ - "({ filter, perPage, page, sortField, sortOrder, namespaceType, }: ", + "({ filter, perPage, page, pit, searchAfter, sortField, sortOrder, namespaceType, }: ", "FindExceptionListOptions", - ") => Promise<{ data: { _version: string | undefined; created_at: string; created_by: string; description: string; id: string; immutable: boolean; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"endpoint\" | \"detection\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\"; updated_at: string; updated_by: string; version: number; }[]; page: number; per_page: number; total: number; }>" + ") => Promise<{ data: { _version: string | undefined; created_at: string; created_by: string; description: string; id: string; immutable: boolean; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"endpoint\" | \"detection\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\"; updated_at: string; updated_by: string; version: number; }[]; page: number; per_page: number; total: number; } & { pit?: string | undefined; }>" ], "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", "deprecated": false, @@ -1236,7 +1236,7 @@ "id": "def-server.ExceptionListClient.findExceptionList.$1", "type": "Object", "tags": [], - "label": "{\n filter,\n perPage,\n page,\n sortField,\n sortOrder,\n namespaceType,\n }", + "label": "{\n filter,\n perPage,\n page,\n pit,\n searchAfter,\n sortField,\n sortOrder,\n namespaceType,\n }", "description": [], "signature": [ "FindExceptionListOptions" @@ -1258,9 +1258,9 @@ "\nThis is the same as \"findExceptionList\" except it applies specifically to the endpoint list and will\nauto-call the \"createEndpointList\" for you so that you have the best chance of the endpoint\nbeing there if it did not exist before. If the list did not exist before, then creating it here should give you\na good guarantee that you will get an empty record set rather than null. I keep the null as the return value in\nthe off chance that you still might somehow not get into a race condition where the endpoint list does\nnot exist because someone deleted it in-between the initial create and then the find." ], "signature": [ - "({ filter, perPage, page, sortField, sortOrder, }: ", + "({ filter, perPage, page, pit, searchAfter, sortField, sortOrder, }: ", "FindEndpointListItemOptions", - ") => Promise<{ data: { _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }[]; page: number; per_page: number; total: number; } | null>" + ") => Promise<({ data: { _version: string | undefined; comments: ({ comment: string; created_at: string; created_by: string; id: string; } & { updated_at?: string | undefined; updated_by?: string | undefined; })[]; created_at: string; created_by: string; description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; id: string; item_id: string; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"simple\"; updated_at: string; updated_by: string; }[]; page: number; per_page: number; total: number; } & { pit?: string | undefined; }) | null>" ], "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", "deprecated": false, @@ -1270,7 +1270,7 @@ "id": "def-server.ExceptionListClient.findEndpointListItem.$1", "type": "Object", "tags": [], - "label": "{\n filter,\n perPage,\n page,\n sortField,\n sortOrder,\n }", + "label": "{\n filter,\n perPage,\n page,\n pit,\n searchAfter,\n sortField,\n sortOrder,\n }", "description": [], "signature": [ "FindEndpointListItemOptions" @@ -1412,6 +1412,237 @@ "returnComment": [ "summary of imported count and errors" ] + }, + { + "parentPluginId": "lists", + "id": "def-server.ExceptionListClient.openPointInTime", + "type": "Function", + "tags": [ + "params", + "params", + "return" + ], + "label": "openPointInTime", + "description": [ + "\nOpens a point in time (PIT) for either exception lists or exception list items.\nSee: https://www.elastic.co/guide/en/elasticsearch/reference/current/point-in-time-api.html" + ], + "signature": [ + "({ namespaceType, options, }: ", + "OpenPointInTimeOptions", + ") => Promise<", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsOpenPointInTimeResponse", + "text": "SavedObjectsOpenPointInTimeResponse" + }, + ">" + ], + "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "lists", + "id": "def-server.ExceptionListClient.openPointInTime.$1", + "type": "Object", + "tags": [], + "label": "{\n namespaceType,\n options,\n }", + "description": [], + "signature": [ + "OpenPointInTimeOptions" + ], + "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [ + "The point in time (PIT)" + ] + }, + { + "parentPluginId": "lists", + "id": "def-server.ExceptionListClient.closePointInTime", + "type": "Function", + "tags": [ + "params", + "return" + ], + "label": "closePointInTime", + "description": [ + "\nCloses a point in time (PIT) for either exception lists or exception list items.\nSee: https://www.elastic.co/guide/en/elasticsearch/reference/current/point-in-time-api.html" + ], + "signature": [ + "({ pit, }: ", + "ClosePointInTimeOptions", + ") => Promise<", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsClosePointInTimeResponse", + "text": "SavedObjectsClosePointInTimeResponse" + }, + ">" + ], + "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "lists", + "id": "def-server.ExceptionListClient.closePointInTime.$1", + "type": "Object", + "tags": [], + "label": "{\n pit,\n }", + "description": [], + "signature": [ + "ClosePointInTimeOptions" + ], + "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [ + "The point in time (PIT)" + ] + }, + { + "parentPluginId": "lists", + "id": "def-server.ExceptionListClient.findExceptionListItemPointInTimeFinder", + "type": "Function", + "tags": [], + "label": "findExceptionListItemPointInTimeFinder", + "description": [ + "\nFinds an exception list item within a point in time (PIT) and then calls the function\n`executeFunctionOnStream` until the maxPerPage is reached and stops.\nNOTE: This is slightly different from the saved objects version in that it takes\nan injected function, so that we avoid doing additional plumbing with generators\nto try to keep the maintenance of this machinery simpler for now.\n\nIf you want to stream all results up to 10k into memory for correlation this would be:" + ], + "signature": [ + "({ executeFunctionOnStream, filter, listId, maxSize, namespaceType, perPage, sortField, sortOrder, }: ", + "FindExceptionListItemPointInTimeFinderOptions", + ") => Promise" + ], + "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "lists", + "id": "def-server.ExceptionListClient.findExceptionListItemPointInTimeFinder.$1", + "type": "Object", + "tags": [], + "label": "{\n executeFunctionOnStream,\n filter,\n listId,\n maxSize,\n namespaceType,\n perPage,\n sortField,\n sortOrder,\n }", + "description": [], + "signature": [ + "FindExceptionListItemPointInTimeFinderOptions" + ], + "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "lists", + "id": "def-server.ExceptionListClient.findExceptionListPointInTimeFinder", + "type": "Function", + "tags": [], + "label": "findExceptionListPointInTimeFinder", + "description": [ + "\nFinds an exception list within a point in time (PIT) and then calls the function\n`executeFunctionOnStream` until the maxPerPage is reached and stops.\nNOTE: This is slightly different from the saved objects version in that it takes\nan injected function, so that we avoid doing additional plumbing with generators\nto try to keep the maintenance of this machinery simpler for now.\n\nIf you want to stream all results up to 10k into memory for correlation this would be:" + ], + "signature": [ + "({ executeFunctionOnStream, filter, maxSize, namespaceType, perPage, sortField, sortOrder, }: ", + "FindExceptionListPointInTimeFinderOptions", + ") => Promise" + ], + "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "lists", + "id": "def-server.ExceptionListClient.findExceptionListPointInTimeFinder.$1", + "type": "Object", + "tags": [], + "label": "{\n executeFunctionOnStream,\n filter,\n maxSize,\n namespaceType,\n perPage,\n sortField,\n sortOrder,\n }", + "description": [], + "signature": [ + "FindExceptionListPointInTimeFinderOptions" + ], + "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "lists", + "id": "def-server.ExceptionListClient.findExceptionListsItemPointInTimeFinder", + "type": "Function", + "tags": [], + "label": "findExceptionListsItemPointInTimeFinder", + "description": [ + "\nFinds exception list items within a point in time (PIT) and then calls the function\n`executeFunctionOnStream` until the maxPerPage is reached and stops.\nNOTE: This is slightly different from the saved objects version in that it takes\nan injected function, so that we avoid doing additional plumbing with generators\nto try to keep the maintenance of this machinery simpler for now.\n\nIf you want to stream all results up to 10k into memory for correlation this would be:" + ], + "signature": [ + "({ listId, namespaceType, executeFunctionOnStream, maxSize, filter, perPage, sortField, sortOrder, }: ", + "FindExceptionListItemsPointInTimeFinderOptions", + ") => Promise" + ], + "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "lists", + "id": "def-server.ExceptionListClient.findExceptionListsItemPointInTimeFinder.$1", + "type": "Object", + "tags": [], + "label": "{\n listId,\n namespaceType,\n executeFunctionOnStream,\n maxSize,\n filter,\n perPage,\n sortField,\n sortOrder,\n }", + "description": [], + "signature": [ + "FindExceptionListItemsPointInTimeFinderOptions" + ], + "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "lists", + "id": "def-server.ExceptionListClient.findValueListExceptionListItemsPointInTimeFinder", + "type": "Function", + "tags": [], + "label": "findValueListExceptionListItemsPointInTimeFinder", + "description": [ + "\nFinds value lists within exception lists within a point in time (PIT) and then calls the function\n`executeFunctionOnStream` until the maxPerPage is reached and stops.\nNOTE: This is slightly different from the saved objects version in that it takes\nan injected function, so that we avoid doing additional plumbing with generators\nto try to keep the maintenance of this machinery simpler for now.\n\nIf you want to stream all results up to 10k into memory for correlation this would be:" + ], + "signature": [ + "({ valueListId, executeFunctionOnStream, perPage, maxSize, sortField, sortOrder, }: ", + "FindValueListExceptionListsItemsPointInTimeFinder", + ") => Promise" + ], + "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "lists", + "id": "def-server.ExceptionListClient.findValueListExceptionListItemsPointInTimeFinder.$1", + "type": "Object", + "tags": [], + "label": "{\n valueListId,\n executeFunctionOnStream,\n perPage,\n maxSize,\n sortField,\n sortOrder,\n }", + "description": [], + "signature": [ + "FindValueListExceptionListsItemsPointInTimeFinder" + ], + "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] } ], "initialIsOpen": false @@ -1496,7 +1727,7 @@ "signature": [ "({ id }: ", "GetListOptions", - ") => Promise<{ _version: string | undefined; created_at: string; created_by: string; description: string; deserializer: string | undefined; id: string; immutable: boolean; meta: object | undefined; name: string; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; version: number; } | null>" + ") => Promise<{ _version: string | undefined; created_at: string; created_by: string; description: string; deserializer: string | undefined; id: string; immutable: boolean; meta: object | undefined; name: string; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; version: number; } | null>" ], "path": "x-pack/plugins/lists/server/services/lists/list_client.ts", "deprecated": false, @@ -1528,7 +1759,7 @@ "signature": [ "({ id, deserializer, immutable, serializer, name, description, type, meta, version, }: ", "CreateListOptions", - ") => Promise<{ _version: string | undefined; created_at: string; created_by: string; description: string; deserializer: string | undefined; id: string; immutable: boolean; meta: object | undefined; name: string; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; version: number; }>" + ") => Promise<{ _version: string | undefined; created_at: string; created_by: string; description: string; deserializer: string | undefined; id: string; immutable: boolean; meta: object | undefined; name: string; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; version: number; }>" ], "path": "x-pack/plugins/lists/server/services/lists/list_client.ts", "deprecated": false, @@ -1560,7 +1791,7 @@ "signature": [ "({ id, deserializer, serializer, name, description, immutable, type, meta, version, }: ", "CreateListIfItDoesNotExistOptions", - ") => Promise<{ _version: string | undefined; created_at: string; created_by: string; description: string; deserializer: string | undefined; id: string; immutable: boolean; meta: object | undefined; name: string; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; version: number; }>" + ") => Promise<{ _version: string | undefined; created_at: string; created_by: string; description: string; deserializer: string | undefined; id: string; immutable: boolean; meta: object | undefined; name: string; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; version: number; }>" ], "path": "x-pack/plugins/lists/server/services/lists/list_client.ts", "deprecated": false, @@ -1892,7 +2123,7 @@ "signature": [ "({ id }: ", "DeleteListItemOptions", - ") => Promise<{ _version: string | undefined; created_at: string; created_by: string; deserializer: string | undefined; id: string; list_id: string; meta: object | undefined; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; value: string; } | null>" + ") => Promise<{ _version: string | undefined; created_at: string; created_by: string; deserializer: string | undefined; id: string; list_id: string; meta: object | undefined; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; value: string; } | null>" ], "path": "x-pack/plugins/lists/server/services/lists/list_client.ts", "deprecated": false, @@ -1924,7 +2155,7 @@ "signature": [ "({ listId, value, type, }: ", "DeleteListItemByValueOptions", - ") => Promise<{ _version: string | undefined; created_at: string; created_by: string; deserializer: string | undefined; id: string; list_id: string; meta: object | undefined; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; value: string; }[]>" + ") => Promise<{ _version: string | undefined; created_at: string; created_by: string; deserializer: string | undefined; id: string; list_id: string; meta: object | undefined; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; value: string; }[]>" ], "path": "x-pack/plugins/lists/server/services/lists/list_client.ts", "deprecated": false, @@ -1956,7 +2187,7 @@ "signature": [ "({ id }: ", "DeleteListOptions", - ") => Promise<{ _version: string | undefined; created_at: string; created_by: string; description: string; deserializer: string | undefined; id: string; immutable: boolean; meta: object | undefined; name: string; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; version: number; } | null>" + ") => Promise<{ _version: string | undefined; created_at: string; created_by: string; description: string; deserializer: string | undefined; id: string; immutable: boolean; meta: object | undefined; name: string; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; version: number; } | null>" ], "path": "x-pack/plugins/lists/server/services/lists/list_client.ts", "deprecated": false, @@ -2020,7 +2251,7 @@ "signature": [ "({ deserializer, serializer, type, listId, stream, meta, version, }: ", "ImportListItemsToStreamOptions", - ") => Promise<{ _version: string | undefined; created_at: string; created_by: string; description: string; deserializer: string | undefined; id: string; immutable: boolean; meta: object | undefined; name: string; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; version: number; } | null>" + ") => Promise<{ _version: string | undefined; created_at: string; created_by: string; description: string; deserializer: string | undefined; id: string; immutable: boolean; meta: object | undefined; name: string; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; version: number; } | null>" ], "path": "x-pack/plugins/lists/server/services/lists/list_client.ts", "deprecated": false, @@ -2052,7 +2283,7 @@ "signature": [ "({ listId, value, type, }: ", "GetListItemByValueOptions", - ") => Promise<{ _version: string | undefined; created_at: string; created_by: string; deserializer: string | undefined; id: string; list_id: string; meta: object | undefined; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; value: string; }[]>" + ") => Promise<{ _version: string | undefined; created_at: string; created_by: string; deserializer: string | undefined; id: string; list_id: string; meta: object | undefined; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; value: string; }[]>" ], "path": "x-pack/plugins/lists/server/services/lists/list_client.ts", "deprecated": false, @@ -2084,7 +2315,7 @@ "signature": [ "({ id, deserializer, serializer, listId, value, type, meta, }: ", "CreateListItemOptions", - ") => Promise<{ _version: string | undefined; created_at: string; created_by: string; deserializer: string | undefined; id: string; list_id: string; meta: object | undefined; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; value: string; } | null>" + ") => Promise<{ _version: string | undefined; created_at: string; created_by: string; deserializer: string | undefined; id: string; list_id: string; meta: object | undefined; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; value: string; } | null>" ], "path": "x-pack/plugins/lists/server/services/lists/list_client.ts", "deprecated": false, @@ -2116,7 +2347,7 @@ "signature": [ "({ _version, id, value, meta, }: ", "UpdateListItemOptions", - ") => Promise<{ _version: string | undefined; created_at: string; created_by: string; deserializer: string | undefined; id: string; list_id: string; meta: object | undefined; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; value: string; } | null>" + ") => Promise<{ _version: string | undefined; created_at: string; created_by: string; deserializer: string | undefined; id: string; list_id: string; meta: object | undefined; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; value: string; } | null>" ], "path": "x-pack/plugins/lists/server/services/lists/list_client.ts", "deprecated": false, @@ -2148,7 +2379,7 @@ "signature": [ "({ _version, id, name, description, meta, version, }: ", "UpdateListOptions", - ") => Promise<{ _version: string | undefined; created_at: string; created_by: string; description: string; deserializer: string | undefined; id: string; immutable: boolean; meta: object | undefined; name: string; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; version: number; } | null>" + ") => Promise<{ _version: string | undefined; created_at: string; created_by: string; description: string; deserializer: string | undefined; id: string; immutable: boolean; meta: object | undefined; name: string; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; version: number; } | null>" ], "path": "x-pack/plugins/lists/server/services/lists/list_client.ts", "deprecated": false, @@ -2180,7 +2411,7 @@ "signature": [ "({ id }: ", "GetListItemOptions", - ") => Promise<{ _version: string | undefined; created_at: string; created_by: string; deserializer: string | undefined; id: string; list_id: string; meta: object | undefined; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; value: string; } | null>" + ") => Promise<{ _version: string | undefined; created_at: string; created_by: string; deserializer: string | undefined; id: string; list_id: string; meta: object | undefined; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; value: string; } | null>" ], "path": "x-pack/plugins/lists/server/services/lists/list_client.ts", "deprecated": false, @@ -2212,7 +2443,7 @@ "signature": [ "({ type, listId, value, }: ", "GetListItemsByValueOptions", - ") => Promise<{ _version: string | undefined; created_at: string; created_by: string; deserializer: string | undefined; id: string; list_id: string; meta: object | undefined; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; value: string; }[]>" + ") => Promise<{ _version: string | undefined; created_at: string; created_by: string; deserializer: string | undefined; id: string; list_id: string; meta: object | undefined; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; value: string; }[]>" ], "path": "x-pack/plugins/lists/server/services/lists/list_client.ts", "deprecated": false, @@ -2244,7 +2475,7 @@ "signature": [ "({ type, listId, value, }: ", "SearchListItemByValuesOptions", - ") => Promise<{ items: { _version: string | undefined; created_at: string; created_by: string; deserializer: string | undefined; id: string; list_id: string; meta: object | undefined; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; value: string; }[]; value: unknown; }[]>" + ") => Promise<{ items: { _version: string | undefined; created_at: string; created_by: string; deserializer: string | undefined; id: string; list_id: string; meta: object | undefined; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; value: string; }[]; value: unknown; }[]>" ], "path": "x-pack/plugins/lists/server/services/lists/list_client.ts", "deprecated": false, @@ -2276,7 +2507,7 @@ "signature": [ "({ filter, currentIndexPosition, perPage, page, sortField, sortOrder, searchAfter, }: ", "FindListOptions", - ") => Promise<{ cursor: string; data: { _version: string | undefined; created_at: string; created_by: string; description: string; deserializer: string | undefined; id: string; immutable: boolean; meta: object | undefined; name: string; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; version: number; }[]; page: number; per_page: number; total: number; }>" + ") => Promise<{ cursor: string; data: { _version: string | undefined; created_at: string; created_by: string; description: string; deserializer: string | undefined; id: string; immutable: boolean; meta: object | undefined; name: string; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; version: number; }[]; page: number; per_page: number; total: number; }>" ], "path": "x-pack/plugins/lists/server/services/lists/list_client.ts", "deprecated": false, @@ -2308,7 +2539,7 @@ "signature": [ "({ listId, filter, currentIndexPosition, perPage, page, sortField, sortOrder, searchAfter, }: ", "FindListItemOptions", - ") => Promise<{ cursor: string; data: { _version: string | undefined; created_at: string; created_by: string; deserializer: string | undefined; id: string; list_id: string; meta: object | undefined; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; value: string; }[]; page: number; per_page: number; total: number; } | null>" + ") => Promise<{ cursor: string; data: { _version: string | undefined; created_at: string; created_by: string; deserializer: string | undefined; id: string; list_id: string; meta: object | undefined; serializer: string | undefined; tie_breaker_id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; updated_at: string; updated_by: string; value: string; }[]; page: number; per_page: number; total: number; } | null>" ], "path": "x-pack/plugins/lists/server/services/lists/list_client.ts", "deprecated": false, @@ -2367,7 +2598,7 @@ "label": "entries", "description": [], "signature": [ - "({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]" + "({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]" ], "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client_types.ts", "deprecated": false @@ -2633,7 +2864,7 @@ "label": "entries", "description": [], "signature": [ - "({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"long\" | \"double\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]" + "({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"keyword\" | \"ip\" | \"date\" | \"geo_point\" | \"geo_shape\" | \"text\" | \"binary\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]" ], "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client_types.ts", "deprecated": false @@ -3594,20 +3825,1196 @@ { "parentPluginId": "lists", "id": "def-server.ListPluginSetup.getListClient.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "esClient", "description": [], "signature": [ - "Omit<", - "KibanaClient", - ", \"extend\" | \"connectionPool\" | \"transport\" | \"serializer\" | \"child\" | \"close\" | \"diagnostic\"> & { transport: { request(params: ", - "TransportRequestParams", + "{ eql: ", + "default", + "; search: { >(this: That, params?: ", + "SearchRequest", + " | ", + "SearchRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "SearchResponse", + ">; >(this: That, params?: ", + "SearchRequest", + " | ", + "SearchRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "SearchResponse", + ", unknown>>; >(this: That, params?: ", + "SearchRequest", + " | ", + "SearchRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "SearchResponse", + ">; }; create: { (this: That, params: ", + "CreateRequest", + " | ", + "CreateRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "CreateResponse", + ">; (this: That, params: ", + "CreateRequest", + " | ", + "CreateRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "CreateResponse", + ", unknown>>; (this: That, params: ", + "CreateRequest", + " | ", + "CreateRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "CreateResponse", + ">; }; monitoring: ", + "default", + "; security: ", + "default", + "; name: string | symbol; index: { (this: That, params: ", + "IndexRequest", + " | ", + "IndexRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "IndexResponse", + ">; (this: That, params: ", + "IndexRequest", + " | ", + "IndexRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "IndexResponse", + ", unknown>>; (this: That, params: ", + "IndexRequest", + " | ", + "IndexRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "IndexResponse", + ">; }; delete: { (this: That, params: ", + "DeleteRequest", + " | ", + "DeleteRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "DeleteResponse", + ">; (this: That, params: ", + "DeleteRequest", + " | ", + "DeleteRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "DeleteResponse", + ", unknown>>; (this: That, params: ", + "DeleteRequest", + " | ", + "DeleteRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "DeleteResponse", + ">; }; get: { (this: That, params: ", + "GetRequest", + " | ", + "GetRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetResponse", + ">; (this: That, params: ", + "GetRequest", + " | ", + "GetRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "GetResponse", + ", unknown>>; (this: That, params: ", + "GetRequest", + " | ", + "GetRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "GetResponse", + ">; }; update: { (this: That, params: ", + "UpdateRequest", + " | ", + "UpdateRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "UpdateResponse", + ">; (this: That, params: ", + "UpdateRequest", + " | ", + "UpdateRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "UpdateResponse", + ", unknown>>; (this: That, params: ", + "UpdateRequest", + " | ", + "UpdateRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "UpdateResponse", + ">; }; closePointInTime: { (this: That, params: ", + "ClosePointInTimeRequest", + " | ", + "ClosePointInTimeRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ClosePointInTimeResponse", + ">; (this: That, params: ", + "ClosePointInTimeRequest", + " | ", + "ClosePointInTimeRequest", ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ClosePointInTimeResponse", + ", unknown>>; (this: That, params: ", + "ClosePointInTimeRequest", + " | ", + "ClosePointInTimeRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ClosePointInTimeResponse", + ">; }; transform: ", + "default", + "; helpers: ", + "default", + "; [kInternal]: symbol | null; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", + "default", + "; Internal: ", + "default", + "; asyncSearch: ", + "default", + "; autoscaling: ", + "default", + "; bulk: { (this: That, params: ", + "BulkRequest", + " | ", + "BulkRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "BulkResponse", + ">; (this: That, params: ", + "BulkRequest", + " | ", + "BulkRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "BulkResponse", + ", unknown>>; (this: That, params: ", + "BulkRequest", + " | ", + "BulkRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "BulkResponse", + ">; }; cat: ", + "default", + "; ccr: ", + "default", + "; clearScroll: { (this: That, params?: ", + "ClearScrollRequest", + " | ", + "ClearScrollRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ClearScrollResponse", + ">; (this: That, params?: ", + "ClearScrollRequest", + " | ", + "ClearScrollRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ClearScrollResponse", + ", unknown>>; (this: That, params?: ", + "ClearScrollRequest", + " | ", + "ClearScrollRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ClearScrollResponse", + ">; }; cluster: ", + "default", + "; count: { (this: That, params?: ", + "CountRequest", + " | ", + "CountRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "CountResponse", + ">; (this: That, params?: ", + "CountRequest", + " | ", + "CountRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "CountResponse", + ", unknown>>; (this: That, params?: ", + "CountRequest", + " | ", + "CountRequest", + " | undefined, options?: ", "TransportRequestOptions", " | undefined): Promise<", + "CountResponse", + ">; }; danglingIndices: ", + "default", + "; deleteByQuery: { (this: That, params: ", + "DeleteByQueryRequest", + " | ", + "DeleteByQueryRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "DeleteByQueryResponse", + ">; (this: That, params: ", + "DeleteByQueryRequest", + " | ", + "DeleteByQueryRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", - ">; }; }" + "<", + "DeleteByQueryResponse", + ", unknown>>; (this: That, params: ", + "DeleteByQueryRequest", + " | ", + "DeleteByQueryRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "DeleteByQueryResponse", + ">; }; deleteByQueryRethrottle: { (this: That, params: ", + "DeleteByQueryRethrottleRequest", + " | ", + "DeleteByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "DeleteByQueryRethrottleResponse", + ">; (this: That, params: ", + "DeleteByQueryRethrottleRequest", + " | ", + "DeleteByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "DeleteByQueryRethrottleResponse", + ", unknown>>; (this: That, params: ", + "DeleteByQueryRethrottleRequest", + " | ", + "DeleteByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "DeleteByQueryRethrottleResponse", + ">; }; deleteScript: { (this: That, params: ", + "DeleteScriptRequest", + " | ", + "DeleteScriptRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "DeleteScriptResponse", + ">; (this: That, params: ", + "DeleteScriptRequest", + " | ", + "DeleteScriptRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "DeleteScriptResponse", + ", unknown>>; (this: That, params: ", + "DeleteScriptRequest", + " | ", + "DeleteScriptRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "DeleteScriptResponse", + ">; }; enrich: ", + "default", + "; exists: { (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; existsSource: { (this: That, params: ", + "ExistsSourceRequest", + " | ", + "ExistsSourceRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "ExistsSourceRequest", + " | ", + "ExistsSourceRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "ExistsSourceRequest", + " | ", + "ExistsSourceRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; explain: { (this: That, params: ", + "ExplainRequest", + " | ", + "ExplainRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ExplainResponse", + ">; (this: That, params: ", + "ExplainRequest", + " | ", + "ExplainRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ExplainResponse", + ", unknown>>; (this: That, params: ", + "ExplainRequest", + " | ", + "ExplainRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ExplainResponse", + ">; }; features: ", + "default", + "; fieldCaps: { (this: That, params?: ", + "FieldCapsRequest", + " | ", + "FieldCapsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "FieldCapsResponse", + ">; (this: That, params?: ", + "FieldCapsRequest", + " | ", + "FieldCapsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "FieldCapsResponse", + ", unknown>>; (this: That, params?: ", + "FieldCapsRequest", + " | ", + "FieldCapsRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "FieldCapsResponse", + ">; }; fleet: ", + "default", + "; getScript: { (this: That, params: ", + "GetScriptRequest", + " | ", + "GetScriptRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetScriptResponse", + ">; (this: That, params: ", + "GetScriptRequest", + " | ", + "GetScriptRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "GetScriptResponse", + ", unknown>>; (this: That, params: ", + "GetScriptRequest", + " | ", + "GetScriptRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "GetScriptResponse", + ">; }; getScriptContext: { (this: That, params?: ", + "GetScriptContextRequest", + " | ", + "GetScriptContextRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetScriptContextResponse", + ">; (this: That, params?: ", + "GetScriptContextRequest", + " | ", + "GetScriptContextRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "GetScriptContextResponse", + ", unknown>>; (this: That, params?: ", + "GetScriptContextRequest", + " | ", + "GetScriptContextRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "GetScriptContextResponse", + ">; }; getScriptLanguages: { (this: That, params?: ", + "GetScriptLanguagesRequest", + " | ", + "GetScriptLanguagesRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetScriptLanguagesResponse", + ">; (this: That, params?: ", + "GetScriptLanguagesRequest", + " | ", + "GetScriptLanguagesRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "GetScriptLanguagesResponse", + ", unknown>>; (this: That, params?: ", + "GetScriptLanguagesRequest", + " | ", + "GetScriptLanguagesRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "GetScriptLanguagesResponse", + ">; }; getSource: { (this: That, params: ", + "GetSourceRequest", + " | ", + "GetSourceRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "GetSourceRequest", + " | ", + "GetSourceRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "GetSourceRequest", + " | ", + "GetSourceRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; graph: ", + "default", + "; ilm: ", + "default", + "; indices: ", + "default", + "; info: { (this: That, params?: ", + "InfoRequest", + " | ", + "InfoRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "InfoResponse", + ">; (this: That, params?: ", + "InfoRequest", + " | ", + "InfoRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "InfoResponse", + ", unknown>>; (this: That, params?: ", + "InfoRequest", + " | ", + "InfoRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "InfoResponse", + ">; }; ingest: ", + "default", + "; knnSearch: { (this: That, params: ", + "KnnSearchRequest", + " | ", + "KnnSearchRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "KnnSearchResponse", + ">; (this: That, params: ", + "KnnSearchRequest", + " | ", + "KnnSearchRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "KnnSearchResponse", + ", unknown>>; (this: That, params: ", + "KnnSearchRequest", + " | ", + "KnnSearchRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "KnnSearchResponse", + ">; }; license: ", + "default", + "; logstash: ", + "default", + "; mget: { (this: That, params?: ", + "MgetRequest", + " | ", + "MgetRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MgetResponse", + ">; (this: That, params?: ", + "MgetRequest", + " | ", + "MgetRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "MgetResponse", + ", unknown>>; (this: That, params?: ", + "MgetRequest", + " | ", + "MgetRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "MgetResponse", + ">; }; migration: ", + "default", + "; ml: ", + "default", + "; msearch: { >(this: That, params: ", + "MsearchRequest", + " | ", + "MsearchRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MsearchResponse", + ">; >(this: That, params: ", + "MsearchRequest", + " | ", + "MsearchRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "MsearchResponse", + ", unknown>>; >(this: That, params: ", + "MsearchRequest", + " | ", + "MsearchRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "MsearchResponse", + ">; }; msearchTemplate: { >(this: That, params: ", + "MsearchTemplateRequest", + " | ", + "MsearchTemplateRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MsearchTemplateResponse", + ">; >(this: That, params: ", + "MsearchTemplateRequest", + " | ", + "MsearchTemplateRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "MsearchTemplateResponse", + ", unknown>>; >(this: That, params: ", + "MsearchTemplateRequest", + " | ", + "MsearchTemplateRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "MsearchTemplateResponse", + ">; }; mtermvectors: { (this: That, params?: ", + "MtermvectorsRequest", + " | ", + "MtermvectorsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MtermvectorsResponse", + ">; (this: That, params?: ", + "MtermvectorsRequest", + " | ", + "MtermvectorsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "MtermvectorsResponse", + ", unknown>>; (this: That, params?: ", + "MtermvectorsRequest", + " | ", + "MtermvectorsRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "MtermvectorsResponse", + ">; }; nodes: ", + "default", + "; openPointInTime: { (this: That, params: ", + "OpenPointInTimeRequest", + " | ", + "OpenPointInTimeRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "OpenPointInTimeResponse", + ">; (this: That, params: ", + "OpenPointInTimeRequest", + " | ", + "OpenPointInTimeRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "OpenPointInTimeResponse", + ", unknown>>; (this: That, params: ", + "OpenPointInTimeRequest", + " | ", + "OpenPointInTimeRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "OpenPointInTimeResponse", + ">; }; ping: { (this: That, params?: ", + "PingRequest", + " | ", + "PingRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params?: ", + "PingRequest", + " | ", + "PingRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params?: ", + "PingRequest", + " | ", + "PingRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; putScript: { (this: That, params: ", + "PutScriptRequest", + " | ", + "PutScriptRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "PutScriptResponse", + ">; (this: That, params: ", + "PutScriptRequest", + " | ", + "PutScriptRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "PutScriptResponse", + ", unknown>>; (this: That, params: ", + "PutScriptRequest", + " | ", + "PutScriptRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "PutScriptResponse", + ">; }; rankEval: { (this: That, params: ", + "RankEvalRequest", + " | ", + "RankEvalRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "RankEvalResponse", + ">; (this: That, params: ", + "RankEvalRequest", + " | ", + "RankEvalRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "RankEvalResponse", + ", unknown>>; (this: That, params: ", + "RankEvalRequest", + " | ", + "RankEvalRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "RankEvalResponse", + ">; }; reindex: { (this: That, params?: ", + "ReindexRequest", + " | ", + "ReindexRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ReindexResponse", + ">; (this: That, params?: ", + "ReindexRequest", + " | ", + "ReindexRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ReindexResponse", + ", unknown>>; (this: That, params?: ", + "ReindexRequest", + " | ", + "ReindexRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ReindexResponse", + ">; }; reindexRethrottle: { (this: That, params: ", + "ReindexRethrottleRequest", + " | ", + "ReindexRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ReindexRethrottleResponse", + ">; (this: That, params: ", + "ReindexRethrottleRequest", + " | ", + "ReindexRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ReindexRethrottleResponse", + ", unknown>>; (this: That, params: ", + "ReindexRethrottleRequest", + " | ", + "ReindexRethrottleRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ReindexRethrottleResponse", + ">; }; renderSearchTemplate: { (this: That, params?: ", + "RenderSearchTemplateRequest", + " | ", + "RenderSearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "RenderSearchTemplateResponse", + ">; (this: That, params?: ", + "RenderSearchTemplateRequest", + " | ", + "RenderSearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "RenderSearchTemplateResponse", + ", unknown>>; (this: That, params?: ", + "RenderSearchTemplateRequest", + " | ", + "RenderSearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "RenderSearchTemplateResponse", + ">; }; rollup: ", + "default", + "; scriptsPainlessExecute: { (this: That, params?: ", + "ScriptsPainlessExecuteRequest", + " | ", + "ScriptsPainlessExecuteRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ScriptsPainlessExecuteResponse", + ">; (this: That, params?: ", + "ScriptsPainlessExecuteRequest", + " | ", + "ScriptsPainlessExecuteRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ScriptsPainlessExecuteResponse", + ", unknown>>; (this: That, params?: ", + "ScriptsPainlessExecuteRequest", + " | ", + "ScriptsPainlessExecuteRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ScriptsPainlessExecuteResponse", + ">; }; scroll: { >(this: That, params: ", + "ScrollRequest", + " | ", + "ScrollRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ScrollResponse", + ">; >(this: That, params: ", + "ScrollRequest", + " | ", + "ScrollRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ScrollResponse", + ", unknown>>; >(this: That, params: ", + "ScrollRequest", + " | ", + "ScrollRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ScrollResponse", + ">; }; searchMvt: { (this: That, params: ", + "SearchMvtRequest", + " | ", + "SearchMvtRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "SearchMvtRequest", + " | ", + "SearchMvtRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "SearchMvtRequest", + " | ", + "SearchMvtRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; searchShards: { (this: That, params?: ", + "SearchShardsRequest", + " | ", + "SearchShardsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "SearchShardsResponse", + ">; (this: That, params?: ", + "SearchShardsRequest", + " | ", + "SearchShardsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "SearchShardsResponse", + ", unknown>>; (this: That, params?: ", + "SearchShardsRequest", + " | ", + "SearchShardsRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "SearchShardsResponse", + ">; }; searchTemplate: { (this: That, params?: ", + "SearchTemplateRequest", + " | ", + "SearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "SearchTemplateResponse", + ">; (this: That, params?: ", + "SearchTemplateRequest", + " | ", + "SearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "SearchTemplateResponse", + ", unknown>>; (this: That, params?: ", + "SearchTemplateRequest", + " | ", + "SearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "SearchTemplateResponse", + ">; }; searchableSnapshots: ", + "default", + "; shutdown: ", + "default", + "; slm: ", + "default", + "; snapshot: ", + "default", + "; sql: ", + "default", + "; ssl: ", + "default", + "; tasks: ", + "default", + "; termsEnum: { (this: That, params: ", + "TermsEnumRequest", + " | ", + "TermsEnumRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "TermsEnumResponse", + ">; (this: That, params: ", + "TermsEnumRequest", + " | ", + "TermsEnumRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "TermsEnumResponse", + ", unknown>>; (this: That, params: ", + "TermsEnumRequest", + " | ", + "TermsEnumRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "TermsEnumResponse", + ">; }; termvectors: { (this: That, params: ", + "TermvectorsRequest", + " | ", + "TermvectorsRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "TermvectorsResponse", + ">; (this: That, params: ", + "TermvectorsRequest", + " | ", + "TermvectorsRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "TermvectorsResponse", + ", unknown>>; (this: That, params: ", + "TermvectorsRequest", + " | ", + "TermvectorsRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "TermvectorsResponse", + ">; }; textStructure: ", + "default", + "; updateByQuery: { (this: That, params: ", + "UpdateByQueryRequest", + " | ", + "UpdateByQueryRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "UpdateByQueryResponse", + ">; (this: That, params: ", + "UpdateByQueryRequest", + " | ", + "UpdateByQueryRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "UpdateByQueryResponse", + ", unknown>>; (this: That, params: ", + "UpdateByQueryRequest", + " | ", + "UpdateByQueryRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "UpdateByQueryResponse", + ">; }; updateByQueryRethrottle: { (this: That, params: ", + "UpdateByQueryRethrottleRequest", + " | ", + "UpdateByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "UpdateByQueryRethrottleResponse", + ">; (this: That, params: ", + "UpdateByQueryRethrottleRequest", + " | ", + "UpdateByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "UpdateByQueryRethrottleResponse", + ", unknown>>; (this: That, params: ", + "UpdateByQueryRethrottleRequest", + " | ", + "UpdateByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "UpdateByQueryRethrottleResponse", + ">; }; watcher: ", + "default", + "; xpack: ", + "default", + "; }" ], "path": "x-pack/plugins/lists/server/types.ts", "deprecated": false diff --git a/api_docs/lists.mdx b/api_docs/lists.mdx index a735ff2b4cd28..629537e8b1f37 100644 --- a/api_docs/lists.mdx +++ b/api_docs/lists.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/lists title: "lists" image: https://source.unsplash.com/400x175/?github summary: API docs for the lists plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] warning: 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. --- @@ -18,7 +18,7 @@ Contact [Security detections response](https://github.com/orgs/elastic/teams/sec | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 185 | 0 | 155 | 43 | +| 197 | 0 | 161 | 49 | ## Client diff --git a/api_docs/management.mdx b/api_docs/management.mdx index 566e1554ba995..89e8e7c972ec4 100644 --- a/api_docs/management.mdx +++ b/api_docs/management.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/management title: "management" image: https://source.unsplash.com/400x175/?github summary: API docs for the management plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'management'] warning: 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. --- diff --git a/api_docs/maps.mdx b/api_docs/maps.mdx index 489e901f7d10b..f24d400d6861a 100644 --- a/api_docs/maps.mdx +++ b/api_docs/maps.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/maps title: "maps" image: https://source.unsplash.com/400x175/?github summary: API docs for the maps plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'maps'] warning: 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. --- diff --git a/api_docs/maps_ems.mdx b/api_docs/maps_ems.mdx index f7666202229f7..10c3d2cb1b131 100644 --- a/api_docs/maps_ems.mdx +++ b/api_docs/maps_ems.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/mapsEms title: "mapsEms" image: https://source.unsplash.com/400x175/?github summary: API docs for the mapsEms plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mapsEms'] warning: 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. --- diff --git a/api_docs/metrics_entities.devdocs.json b/api_docs/metrics_entities.devdocs.json index b2aa696e1aa60..ea314e0b71ec9 100644 --- a/api_docs/metrics_entities.devdocs.json +++ b/api_docs/metrics_entities.devdocs.json @@ -51,20 +51,1196 @@ { "parentPluginId": "metricsEntities", "id": "def-server.MetricsEntitiesPluginSetup.getMetricsEntitiesClient.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "esClient", "description": [], "signature": [ - "Omit<", - "KibanaClient", - ", \"extend\" | \"connectionPool\" | \"transport\" | \"serializer\" | \"child\" | \"close\" | \"diagnostic\"> & { transport: { request(params: ", - "TransportRequestParams", + "{ eql: ", + "default", + "; search: { >(this: That, params?: ", + "SearchRequest", + " | ", + "SearchRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "SearchResponse", + ">; >(this: That, params?: ", + "SearchRequest", + " | ", + "SearchRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "SearchResponse", + ", unknown>>; >(this: That, params?: ", + "SearchRequest", + " | ", + "SearchRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "SearchResponse", + ">; }; create: { (this: That, params: ", + "CreateRequest", + " | ", + "CreateRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "CreateResponse", + ">; (this: That, params: ", + "CreateRequest", + " | ", + "CreateRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "CreateResponse", + ", unknown>>; (this: That, params: ", + "CreateRequest", + " | ", + "CreateRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "CreateResponse", + ">; }; monitoring: ", + "default", + "; security: ", + "default", + "; name: string | symbol; index: { (this: That, params: ", + "IndexRequest", + " | ", + "IndexRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "IndexResponse", + ">; (this: That, params: ", + "IndexRequest", + " | ", + "IndexRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "IndexResponse", + ", unknown>>; (this: That, params: ", + "IndexRequest", + " | ", + "IndexRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "IndexResponse", + ">; }; delete: { (this: That, params: ", + "DeleteRequest", + " | ", + "DeleteRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "DeleteResponse", + ">; (this: That, params: ", + "DeleteRequest", + " | ", + "DeleteRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "DeleteResponse", + ", unknown>>; (this: That, params: ", + "DeleteRequest", + " | ", + "DeleteRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "DeleteResponse", + ">; }; get: { (this: That, params: ", + "GetRequest", + " | ", + "GetRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetResponse", + ">; (this: That, params: ", + "GetRequest", + " | ", + "GetRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "GetResponse", + ", unknown>>; (this: That, params: ", + "GetRequest", + " | ", + "GetRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "GetResponse", + ">; }; update: { (this: That, params: ", + "UpdateRequest", + " | ", + "UpdateRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "UpdateResponse", + ">; (this: That, params: ", + "UpdateRequest", + " | ", + "UpdateRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "UpdateResponse", + ", unknown>>; (this: That, params: ", + "UpdateRequest", + " | ", + "UpdateRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "UpdateResponse", + ">; }; closePointInTime: { (this: That, params: ", + "ClosePointInTimeRequest", + " | ", + "ClosePointInTimeRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ClosePointInTimeResponse", + ">; (this: That, params: ", + "ClosePointInTimeRequest", + " | ", + "ClosePointInTimeRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ClosePointInTimeResponse", + ", unknown>>; (this: That, params: ", + "ClosePointInTimeRequest", + " | ", + "ClosePointInTimeRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ClosePointInTimeResponse", + ">; }; transform: ", + "default", + "; helpers: ", + "default", + "; [kInternal]: symbol | null; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", + "default", + "; Internal: ", + "default", + "; asyncSearch: ", + "default", + "; autoscaling: ", + "default", + "; bulk: { (this: That, params: ", + "BulkRequest", + " | ", + "BulkRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "BulkResponse", + ">; (this: That, params: ", + "BulkRequest", + " | ", + "BulkRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "BulkResponse", + ", unknown>>; (this: That, params: ", + "BulkRequest", + " | ", + "BulkRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "BulkResponse", + ">; }; cat: ", + "default", + "; ccr: ", + "default", + "; clearScroll: { (this: That, params?: ", + "ClearScrollRequest", + " | ", + "ClearScrollRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ClearScrollResponse", + ">; (this: That, params?: ", + "ClearScrollRequest", + " | ", + "ClearScrollRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ClearScrollResponse", + ", unknown>>; (this: That, params?: ", + "ClearScrollRequest", + " | ", + "ClearScrollRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ClearScrollResponse", + ">; }; cluster: ", + "default", + "; count: { (this: That, params?: ", + "CountRequest", + " | ", + "CountRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "CountResponse", + ">; (this: That, params?: ", + "CountRequest", + " | ", + "CountRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "CountResponse", + ", unknown>>; (this: That, params?: ", + "CountRequest", + " | ", + "CountRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "CountResponse", + ">; }; danglingIndices: ", + "default", + "; deleteByQuery: { (this: That, params: ", + "DeleteByQueryRequest", + " | ", + "DeleteByQueryRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "DeleteByQueryResponse", + ">; (this: That, params: ", + "DeleteByQueryRequest", + " | ", + "DeleteByQueryRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "DeleteByQueryResponse", + ", unknown>>; (this: That, params: ", + "DeleteByQueryRequest", + " | ", + "DeleteByQueryRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "DeleteByQueryResponse", + ">; }; deleteByQueryRethrottle: { (this: That, params: ", + "DeleteByQueryRethrottleRequest", + " | ", + "DeleteByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "DeleteByQueryRethrottleResponse", + ">; (this: That, params: ", + "DeleteByQueryRethrottleRequest", + " | ", + "DeleteByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "DeleteByQueryRethrottleResponse", + ", unknown>>; (this: That, params: ", + "DeleteByQueryRethrottleRequest", + " | ", + "DeleteByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "DeleteByQueryRethrottleResponse", + ">; }; deleteScript: { (this: That, params: ", + "DeleteScriptRequest", + " | ", + "DeleteScriptRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "DeleteScriptResponse", + ">; (this: That, params: ", + "DeleteScriptRequest", + " | ", + "DeleteScriptRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "DeleteScriptResponse", + ", unknown>>; (this: That, params: ", + "DeleteScriptRequest", + " | ", + "DeleteScriptRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "DeleteScriptResponse", + ">; }; enrich: ", + "default", + "; exists: { (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; existsSource: { (this: That, params: ", + "ExistsSourceRequest", + " | ", + "ExistsSourceRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "ExistsSourceRequest", + " | ", + "ExistsSourceRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "ExistsSourceRequest", + " | ", + "ExistsSourceRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; explain: { (this: That, params: ", + "ExplainRequest", + " | ", + "ExplainRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ExplainResponse", + ">; (this: That, params: ", + "ExplainRequest", + " | ", + "ExplainRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ExplainResponse", + ", unknown>>; (this: That, params: ", + "ExplainRequest", + " | ", + "ExplainRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ExplainResponse", + ">; }; features: ", + "default", + "; fieldCaps: { (this: That, params?: ", + "FieldCapsRequest", + " | ", + "FieldCapsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "FieldCapsResponse", + ">; (this: That, params?: ", + "FieldCapsRequest", + " | ", + "FieldCapsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "FieldCapsResponse", + ", unknown>>; (this: That, params?: ", + "FieldCapsRequest", + " | ", + "FieldCapsRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "FieldCapsResponse", + ">; }; fleet: ", + "default", + "; getScript: { (this: That, params: ", + "GetScriptRequest", + " | ", + "GetScriptRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetScriptResponse", + ">; (this: That, params: ", + "GetScriptRequest", + " | ", + "GetScriptRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "GetScriptResponse", + ", unknown>>; (this: That, params: ", + "GetScriptRequest", + " | ", + "GetScriptRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "GetScriptResponse", + ">; }; getScriptContext: { (this: That, params?: ", + "GetScriptContextRequest", + " | ", + "GetScriptContextRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetScriptContextResponse", + ">; (this: That, params?: ", + "GetScriptContextRequest", + " | ", + "GetScriptContextRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "GetScriptContextResponse", + ", unknown>>; (this: That, params?: ", + "GetScriptContextRequest", + " | ", + "GetScriptContextRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "GetScriptContextResponse", + ">; }; getScriptLanguages: { (this: That, params?: ", + "GetScriptLanguagesRequest", + " | ", + "GetScriptLanguagesRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetScriptLanguagesResponse", + ">; (this: That, params?: ", + "GetScriptLanguagesRequest", + " | ", + "GetScriptLanguagesRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "GetScriptLanguagesResponse", + ", unknown>>; (this: That, params?: ", + "GetScriptLanguagesRequest", + " | ", + "GetScriptLanguagesRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "GetScriptLanguagesResponse", + ">; }; getSource: { (this: That, params: ", + "GetSourceRequest", + " | ", + "GetSourceRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "GetSourceRequest", + " | ", + "GetSourceRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "GetSourceRequest", + " | ", + "GetSourceRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; graph: ", + "default", + "; ilm: ", + "default", + "; indices: ", + "default", + "; info: { (this: That, params?: ", + "InfoRequest", + " | ", + "InfoRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "InfoResponse", + ">; (this: That, params?: ", + "InfoRequest", + " | ", + "InfoRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "InfoResponse", + ", unknown>>; (this: That, params?: ", + "InfoRequest", + " | ", + "InfoRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "InfoResponse", + ">; }; ingest: ", + "default", + "; knnSearch: { (this: That, params: ", + "KnnSearchRequest", + " | ", + "KnnSearchRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "KnnSearchResponse", + ">; (this: That, params: ", + "KnnSearchRequest", + " | ", + "KnnSearchRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "KnnSearchResponse", + ", unknown>>; (this: That, params: ", + "KnnSearchRequest", + " | ", + "KnnSearchRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "KnnSearchResponse", + ">; }; license: ", + "default", + "; logstash: ", + "default", + "; mget: { (this: That, params?: ", + "MgetRequest", + " | ", + "MgetRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MgetResponse", + ">; (this: That, params?: ", + "MgetRequest", + " | ", + "MgetRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "MgetResponse", + ", unknown>>; (this: That, params?: ", + "MgetRequest", + " | ", + "MgetRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "MgetResponse", + ">; }; migration: ", + "default", + "; ml: ", + "default", + "; msearch: { >(this: That, params: ", + "MsearchRequest", + " | ", + "MsearchRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MsearchResponse", + ">; >(this: That, params: ", + "MsearchRequest", + " | ", + "MsearchRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "MsearchResponse", + ", unknown>>; >(this: That, params: ", + "MsearchRequest", + " | ", + "MsearchRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "MsearchResponse", + ">; }; msearchTemplate: { >(this: That, params: ", + "MsearchTemplateRequest", + " | ", + "MsearchTemplateRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MsearchTemplateResponse", + ">; >(this: That, params: ", + "MsearchTemplateRequest", + " | ", + "MsearchTemplateRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "MsearchTemplateResponse", + ", unknown>>; >(this: That, params: ", + "MsearchTemplateRequest", + " | ", + "MsearchTemplateRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "MsearchTemplateResponse", + ">; }; mtermvectors: { (this: That, params?: ", + "MtermvectorsRequest", + " | ", + "MtermvectorsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MtermvectorsResponse", + ">; (this: That, params?: ", + "MtermvectorsRequest", + " | ", + "MtermvectorsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "MtermvectorsResponse", + ", unknown>>; (this: That, params?: ", + "MtermvectorsRequest", + " | ", + "MtermvectorsRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "MtermvectorsResponse", + ">; }; nodes: ", + "default", + "; openPointInTime: { (this: That, params: ", + "OpenPointInTimeRequest", + " | ", + "OpenPointInTimeRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "OpenPointInTimeResponse", + ">; (this: That, params: ", + "OpenPointInTimeRequest", + " | ", + "OpenPointInTimeRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "OpenPointInTimeResponse", + ", unknown>>; (this: That, params: ", + "OpenPointInTimeRequest", + " | ", + "OpenPointInTimeRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "OpenPointInTimeResponse", + ">; }; ping: { (this: That, params?: ", + "PingRequest", + " | ", + "PingRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params?: ", + "PingRequest", + " | ", + "PingRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params?: ", + "PingRequest", + " | ", + "PingRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; putScript: { (this: That, params: ", + "PutScriptRequest", + " | ", + "PutScriptRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "PutScriptResponse", + ">; (this: That, params: ", + "PutScriptRequest", + " | ", + "PutScriptRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "PutScriptResponse", + ", unknown>>; (this: That, params: ", + "PutScriptRequest", + " | ", + "PutScriptRequest", ", options?: ", "TransportRequestOptions", " | undefined): Promise<", + "PutScriptResponse", + ">; }; rankEval: { (this: That, params: ", + "RankEvalRequest", + " | ", + "RankEvalRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "RankEvalResponse", + ">; (this: That, params: ", + "RankEvalRequest", + " | ", + "RankEvalRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", - ">; }; }" + "<", + "RankEvalResponse", + ", unknown>>; (this: That, params: ", + "RankEvalRequest", + " | ", + "RankEvalRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "RankEvalResponse", + ">; }; reindex: { (this: That, params?: ", + "ReindexRequest", + " | ", + "ReindexRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ReindexResponse", + ">; (this: That, params?: ", + "ReindexRequest", + " | ", + "ReindexRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ReindexResponse", + ", unknown>>; (this: That, params?: ", + "ReindexRequest", + " | ", + "ReindexRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ReindexResponse", + ">; }; reindexRethrottle: { (this: That, params: ", + "ReindexRethrottleRequest", + " | ", + "ReindexRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ReindexRethrottleResponse", + ">; (this: That, params: ", + "ReindexRethrottleRequest", + " | ", + "ReindexRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ReindexRethrottleResponse", + ", unknown>>; (this: That, params: ", + "ReindexRethrottleRequest", + " | ", + "ReindexRethrottleRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ReindexRethrottleResponse", + ">; }; renderSearchTemplate: { (this: That, params?: ", + "RenderSearchTemplateRequest", + " | ", + "RenderSearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "RenderSearchTemplateResponse", + ">; (this: That, params?: ", + "RenderSearchTemplateRequest", + " | ", + "RenderSearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "RenderSearchTemplateResponse", + ", unknown>>; (this: That, params?: ", + "RenderSearchTemplateRequest", + " | ", + "RenderSearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "RenderSearchTemplateResponse", + ">; }; rollup: ", + "default", + "; scriptsPainlessExecute: { (this: That, params?: ", + "ScriptsPainlessExecuteRequest", + " | ", + "ScriptsPainlessExecuteRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ScriptsPainlessExecuteResponse", + ">; (this: That, params?: ", + "ScriptsPainlessExecuteRequest", + " | ", + "ScriptsPainlessExecuteRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ScriptsPainlessExecuteResponse", + ", unknown>>; (this: That, params?: ", + "ScriptsPainlessExecuteRequest", + " | ", + "ScriptsPainlessExecuteRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ScriptsPainlessExecuteResponse", + ">; }; scroll: { >(this: That, params: ", + "ScrollRequest", + " | ", + "ScrollRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ScrollResponse", + ">; >(this: That, params: ", + "ScrollRequest", + " | ", + "ScrollRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ScrollResponse", + ", unknown>>; >(this: That, params: ", + "ScrollRequest", + " | ", + "ScrollRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ScrollResponse", + ">; }; searchMvt: { (this: That, params: ", + "SearchMvtRequest", + " | ", + "SearchMvtRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "SearchMvtRequest", + " | ", + "SearchMvtRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "SearchMvtRequest", + " | ", + "SearchMvtRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; searchShards: { (this: That, params?: ", + "SearchShardsRequest", + " | ", + "SearchShardsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "SearchShardsResponse", + ">; (this: That, params?: ", + "SearchShardsRequest", + " | ", + "SearchShardsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "SearchShardsResponse", + ", unknown>>; (this: That, params?: ", + "SearchShardsRequest", + " | ", + "SearchShardsRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "SearchShardsResponse", + ">; }; searchTemplate: { (this: That, params?: ", + "SearchTemplateRequest", + " | ", + "SearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "SearchTemplateResponse", + ">; (this: That, params?: ", + "SearchTemplateRequest", + " | ", + "SearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "SearchTemplateResponse", + ", unknown>>; (this: That, params?: ", + "SearchTemplateRequest", + " | ", + "SearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "SearchTemplateResponse", + ">; }; searchableSnapshots: ", + "default", + "; shutdown: ", + "default", + "; slm: ", + "default", + "; snapshot: ", + "default", + "; sql: ", + "default", + "; ssl: ", + "default", + "; tasks: ", + "default", + "; termsEnum: { (this: That, params: ", + "TermsEnumRequest", + " | ", + "TermsEnumRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "TermsEnumResponse", + ">; (this: That, params: ", + "TermsEnumRequest", + " | ", + "TermsEnumRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "TermsEnumResponse", + ", unknown>>; (this: That, params: ", + "TermsEnumRequest", + " | ", + "TermsEnumRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "TermsEnumResponse", + ">; }; termvectors: { (this: That, params: ", + "TermvectorsRequest", + " | ", + "TermvectorsRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "TermvectorsResponse", + ">; (this: That, params: ", + "TermvectorsRequest", + " | ", + "TermvectorsRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "TermvectorsResponse", + ", unknown>>; (this: That, params: ", + "TermvectorsRequest", + " | ", + "TermvectorsRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "TermvectorsResponse", + ">; }; textStructure: ", + "default", + "; updateByQuery: { (this: That, params: ", + "UpdateByQueryRequest", + " | ", + "UpdateByQueryRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "UpdateByQueryResponse", + ">; (this: That, params: ", + "UpdateByQueryRequest", + " | ", + "UpdateByQueryRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "UpdateByQueryResponse", + ", unknown>>; (this: That, params: ", + "UpdateByQueryRequest", + " | ", + "UpdateByQueryRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "UpdateByQueryResponse", + ">; }; updateByQueryRethrottle: { (this: That, params: ", + "UpdateByQueryRethrottleRequest", + " | ", + "UpdateByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "UpdateByQueryRethrottleResponse", + ">; (this: That, params: ", + "UpdateByQueryRethrottleRequest", + " | ", + "UpdateByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "UpdateByQueryRethrottleResponse", + ", unknown>>; (this: That, params: ", + "UpdateByQueryRethrottleRequest", + " | ", + "UpdateByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "UpdateByQueryRethrottleResponse", + ">; }; watcher: ", + "default", + "; xpack: ", + "default", + "; }" ], "path": "x-pack/plugins/metrics_entities/server/types.ts", "deprecated": false diff --git a/api_docs/metrics_entities.mdx b/api_docs/metrics_entities.mdx index 851e57c811243..3e4aaaa14ca7d 100644 --- a/api_docs/metrics_entities.mdx +++ b/api_docs/metrics_entities.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/metricsEntities title: "metricsEntities" image: https://source.unsplash.com/400x175/?github summary: API docs for the metricsEntities plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'metricsEntities'] warning: 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. --- diff --git a/api_docs/ml.devdocs.json b/api_docs/ml.devdocs.json index 5246fd09dc4a3..0c79b0a86e5c7 100644 --- a/api_docs/ml.devdocs.json +++ b/api_docs/ml.devdocs.json @@ -2868,7 +2868,9 @@ "signature": [ "{ [x: string]: ", "MappingRuntimeField", - "; }" + " | ", + "MappingRuntimeField", + "[]; }" ], "path": "x-pack/plugins/ml/common/types/fields.ts", "deprecated": false, diff --git a/api_docs/ml.mdx b/api_docs/ml.mdx index 59345386930e3..dec516a13252c 100644 --- a/api_docs/ml.mdx +++ b/api_docs/ml.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/ml title: "ml" image: https://source.unsplash.com/400x175/?github summary: API docs for the ml plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ml'] warning: 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. --- diff --git a/api_docs/monitoring.devdocs.json b/api_docs/monitoring.devdocs.json index 260f6222fb20e..faaf5ce4c9742 100644 --- a/api_docs/monitoring.devdocs.json +++ b/api_docs/monitoring.devdocs.json @@ -76,7 +76,7 @@ { "parentPluginId": "monitoring", "id": "def-server.IBulkUploader.start.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "esClient", "description": [], @@ -113,6 +113,46 @@ } ], "initialIsOpen": false + }, + { + "parentPluginId": "monitoring", + "id": "def-server.MonitoringConfig", + "type": "Interface", + "tags": [], + "label": "MonitoringConfig", + "description": [ + "\nA functional representation of the `monitoring.*` configuration tree passed in from kibana.yml" + ], + "signature": [ + { + "pluginId": "monitoring", + "scope": "server", + "docId": "kibMonitoringPluginApi", + "section": "def-server.MonitoringConfig", + "text": "MonitoringConfig" + }, + " extends MonitoringConfigTypeOverriddenUI" + ], + "path": "x-pack/plugins/monitoring/server/config.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "monitoring", + "id": "def-server.MonitoringConfig.ui", + "type": "Object", + "tags": [], + "label": "ui", + "description": [ + "\nA functional representation of the `monitoring.ui.*` configuration tree passed in from kibana.yml" + ], + "signature": [ + "MonitoringConfigTypeOverriddenUIElasticsearch" + ], + "path": "x-pack/plugins/monitoring/server/config.ts", + "deprecated": false + } + ], + "initialIsOpen": false } ], "enums": [], @@ -138,22 +178,6 @@ "path": "x-pack/plugins/monitoring/server/kibana_monitoring/collectors/get_settings_collector.ts", "deprecated": false, "initialIsOpen": false - }, - { - "parentPluginId": "monitoring", - "id": "def-server.MonitoringConfig", - "type": "Type", - "tags": [], - "label": "MonitoringConfig", - "description": [], - "signature": [ - "{ ui: { elasticsearch: ", - "MonitoringElasticsearchConfig", - "; enabled: boolean; container: Readonly<{} & { logstash: Readonly<{} & { enabled: boolean; }>; apm: Readonly<{} & { enabled: boolean; }>; elasticsearch: Readonly<{} & { enabled: boolean; }>; }>; logs: Readonly<{} & { index: string; }>; debug_mode: boolean; debug_log_path: string; ccs: Readonly<{} & { enabled: boolean; }>; max_bucket_size: number; min_interval_seconds: number; show_license_expiration: boolean; }; tests: Readonly<{} & { cloud_detector: Readonly<{} & { enabled: boolean; }>; }>; kibana: Readonly<{} & { collection: Readonly<{} & { interval: number; enabled: boolean; }>; }>; agent: Readonly<{} & { interval: string; }>; licensing: Readonly<{} & { api_polling_frequency: moment.Duration; }>; cluster_alerts: Readonly<{} & { enabled: boolean; email_notifications: Readonly<{} & { enabled: boolean; email_address: string; }>; }>; }" - ], - "path": "x-pack/plugins/monitoring/server/config.ts", - "deprecated": false, - "initialIsOpen": false } ], "objects": [], diff --git a/api_docs/monitoring.mdx b/api_docs/monitoring.mdx index 14d5fc10d93b1..f0162e7b13d8f 100644 --- a/api_docs/monitoring.mdx +++ b/api_docs/monitoring.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/monitoring title: "monitoring" image: https://source.unsplash.com/400x175/?github summary: API docs for the monitoring plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoring'] warning: 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. --- @@ -18,7 +18,7 @@ Contact [Stack Monitoring](https://github.com/orgs/elastic/teams/stack-monitorin | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 10 | 0 | 10 | 2 | +| 11 | 0 | 9 | 1 | ## Server diff --git a/api_docs/navigation.devdocs.json b/api_docs/navigation.devdocs.json index 2ccfffb665c5c..1dcdc5134d353 100644 --- a/api_docs/navigation.devdocs.json +++ b/api_docs/navigation.devdocs.json @@ -396,6 +396,169 @@ "path": "src/plugins/navigation/public/top_nav_menu/top_nav_menu_data.tsx", "deprecated": false }, + { + "parentPluginId": "navigation", + "id": "def-public.TopNavMenuData.badge", + "type": "CompoundType", + "tags": [], + "label": "badge", + "description": [], + "signature": [ + "(", + "CommonProps", + " & ", + "DisambiguateSet", + "<(", + "DisambiguateSet", + " & { href: string; target?: string | undefined; rel?: string | undefined; } & Omit, \"onClick\" | \"color\" | \"href\">) | (", + "DisambiguateSet", + " & { onClick?: React.MouseEventHandler | undefined; onClickAriaLabel?: string | undefined; } & Omit, \"onClick\" | \"color\">), WithSpanProps> & WithSpanProps & { iconType?: ", + "IconType", + " | undefined; label: React.ReactNode; tooltipContent?: React.ReactNode; tooltipPosition?: ", + "ToolTipPositions", + " | undefined; title?: string | undefined; color?: \"subdued\" | \"accent\" | \"hollow\" | undefined; size?: ", + "BetaBadgeSize", + " | undefined; } & ", + "DisambiguateSet", + " & LabelAsString) | (", + "CommonProps", + " & ", + "DisambiguateSet", + "<(", + "DisambiguateSet", + " & { href: string; target?: string | undefined; rel?: string | undefined; } & Omit, \"onClick\" | \"color\" | \"href\">) | (", + "DisambiguateSet", + " & { onClick?: React.MouseEventHandler | undefined; onClickAriaLabel?: string | undefined; } & Omit, \"onClick\" | \"color\">), WithSpanProps> & WithSpanProps & { iconType?: ", + "IconType", + " | undefined; label: React.ReactNode; tooltipContent?: React.ReactNode; tooltipPosition?: ", + "ToolTipPositions", + " | undefined; title?: string | undefined; color?: \"subdued\" | \"accent\" | \"hollow\" | undefined; size?: ", + "BetaBadgeSize", + " | undefined; } & ", + "DisambiguateSet", + " & ", + "DisambiguateSet", + "<{ title: string; tooltipContent?: React.ReactNode; }, { tooltipContent: React.ReactNode; title?: string | undefined; }> & { tooltipContent: React.ReactNode; title?: string | undefined; } & { label: React.ReactNode; }) | (", + "CommonProps", + " & ", + "DisambiguateSet", + " & { href: string; target?: string | undefined; rel?: string | undefined; } & Omit, \"onClick\" | \"color\" | \"href\">) | (", + "DisambiguateSet", + " & { onClick?: React.MouseEventHandler | undefined; onClickAriaLabel?: string | undefined; } & Omit, \"onClick\" | \"color\">)> & ", + "DisambiguateSet", + " & { href: string; target?: string | undefined; rel?: string | undefined; } & Omit, \"onClick\" | \"color\" | \"href\"> & { iconType?: ", + "IconType", + " | undefined; label: React.ReactNode; tooltipContent?: React.ReactNode; tooltipPosition?: ", + "ToolTipPositions", + " | undefined; title?: string | undefined; color?: \"subdued\" | \"accent\" | \"hollow\" | undefined; size?: ", + "BetaBadgeSize", + " | undefined; } & ", + "DisambiguateSet", + " & LabelAsString) | (", + "CommonProps", + " & ", + "DisambiguateSet", + " & { href: string; target?: string | undefined; rel?: string | undefined; } & Omit, \"onClick\" | \"color\" | \"href\">) | (", + "DisambiguateSet", + " & { onClick?: React.MouseEventHandler | undefined; onClickAriaLabel?: string | undefined; } & Omit, \"onClick\" | \"color\">)> & ", + "DisambiguateSet", + " & { href: string; target?: string | undefined; rel?: string | undefined; } & Omit, \"onClick\" | \"color\" | \"href\"> & { iconType?: ", + "IconType", + " | undefined; label: React.ReactNode; tooltipContent?: React.ReactNode; tooltipPosition?: ", + "ToolTipPositions", + " | undefined; title?: string | undefined; color?: \"subdued\" | \"accent\" | \"hollow\" | undefined; size?: ", + "BetaBadgeSize", + " | undefined; } & ", + "DisambiguateSet", + " & ", + "DisambiguateSet", + "<{ title: string; tooltipContent?: React.ReactNode; }, { tooltipContent: React.ReactNode; title?: string | undefined; }> & { tooltipContent: React.ReactNode; title?: string | undefined; } & { label: React.ReactNode; }) | (", + "CommonProps", + " & ", + "DisambiguateSet", + " & { href: string; target?: string | undefined; rel?: string | undefined; } & Omit, \"onClick\" | \"color\" | \"href\">) | (", + "DisambiguateSet", + " & { onClick?: React.MouseEventHandler | undefined; onClickAriaLabel?: string | undefined; } & Omit, \"onClick\" | \"color\">)> & ", + "DisambiguateSet", + " & { href: string; target?: string | undefined; rel?: string | undefined; } & Omit, \"onClick\" | \"color\" | \"href\"> & { iconType?: ", + "IconType", + " | undefined; label: React.ReactNode; tooltipContent?: React.ReactNode; tooltipPosition?: ", + "ToolTipPositions", + " | undefined; title?: string | undefined; color?: \"subdued\" | \"accent\" | \"hollow\" | undefined; size?: ", + "BetaBadgeSize", + " | undefined; } & ", + "DisambiguateSet", + " & ", + "DisambiguateSet", + "<{ tooltipContent: React.ReactNode; title?: string | undefined; }, { title: string; tooltipContent?: React.ReactNode; }> & { title: string; tooltipContent?: React.ReactNode; } & { label: React.ReactNode; }) | (", + "CommonProps", + " & ", + "DisambiguateSet", + " & { href: string; target?: string | undefined; rel?: string | undefined; } & Omit, \"onClick\" | \"color\" | \"href\">) | (", + "DisambiguateSet", + " & { onClick?: React.MouseEventHandler | undefined; onClickAriaLabel?: string | undefined; } & Omit, \"onClick\" | \"color\">)> & ", + "DisambiguateSet", + " & { onClick?: React.MouseEventHandler | undefined; onClickAriaLabel?: string | undefined; } & Omit, \"onClick\" | \"color\"> & { iconType?: ", + "IconType", + " | undefined; label: React.ReactNode; tooltipContent?: React.ReactNode; tooltipPosition?: ", + "ToolTipPositions", + " | undefined; title?: string | undefined; color?: \"subdued\" | \"accent\" | \"hollow\" | undefined; size?: ", + "BetaBadgeSize", + " | undefined; } & ", + "DisambiguateSet", + " & LabelAsString) | (", + "CommonProps", + " & ", + "DisambiguateSet", + " & { href: string; target?: string | undefined; rel?: string | undefined; } & Omit, \"onClick\" | \"color\" | \"href\">) | (", + "DisambiguateSet", + " & { onClick?: React.MouseEventHandler | undefined; onClickAriaLabel?: string | undefined; } & Omit, \"onClick\" | \"color\">)> & ", + "DisambiguateSet", + " & { onClick?: React.MouseEventHandler | undefined; onClickAriaLabel?: string | undefined; } & Omit, \"onClick\" | \"color\"> & { iconType?: ", + "IconType", + " | undefined; label: React.ReactNode; tooltipContent?: React.ReactNode; tooltipPosition?: ", + "ToolTipPositions", + " | undefined; title?: string | undefined; color?: \"subdued\" | \"accent\" | \"hollow\" | undefined; size?: ", + "BetaBadgeSize", + " | undefined; } & ", + "DisambiguateSet", + " & ", + "DisambiguateSet", + "<{ title: string; tooltipContent?: React.ReactNode; }, { tooltipContent: React.ReactNode; title?: string | undefined; }> & { tooltipContent: React.ReactNode; title?: string | undefined; } & { label: React.ReactNode; }) | (", + "CommonProps", + " & ", + "DisambiguateSet", + " & { href: string; target?: string | undefined; rel?: string | undefined; } & Omit, \"onClick\" | \"color\" | \"href\">) | (", + "DisambiguateSet", + " & { onClick?: React.MouseEventHandler | undefined; onClickAriaLabel?: string | undefined; } & Omit, \"onClick\" | \"color\">)> & ", + "DisambiguateSet", + " & { onClick?: React.MouseEventHandler | undefined; onClickAriaLabel?: string | undefined; } & Omit, \"onClick\" | \"color\"> & { iconType?: ", + "IconType", + " | undefined; label: React.ReactNode; tooltipContent?: React.ReactNode; tooltipPosition?: ", + "ToolTipPositions", + " | undefined; title?: string | undefined; color?: \"subdued\" | \"accent\" | \"hollow\" | undefined; size?: ", + "BetaBadgeSize", + " | undefined; } & ", + "DisambiguateSet", + " & ", + "DisambiguateSet", + "<{ tooltipContent: React.ReactNode; title?: string | undefined; }, { title: string; tooltipContent?: React.ReactNode; }> & { title: string; tooltipContent?: React.ReactNode; } & { label: React.ReactNode; }) | undefined" + ], + "path": "src/plugins/navigation/public/top_nav_menu/top_nav_menu_data.tsx", + "deprecated": false + }, { "parentPluginId": "navigation", "id": "def-public.TopNavMenuData.emphasize", diff --git a/api_docs/navigation.mdx b/api_docs/navigation.mdx index fed7d30a00462..25463fc209fca 100644 --- a/api_docs/navigation.mdx +++ b/api_docs/navigation.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/navigation title: "navigation" image: https://source.unsplash.com/400x175/?github summary: API docs for the navigation plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'navigation'] warning: 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. --- @@ -18,7 +18,7 @@ Contact [App Services](https://github.com/orgs/elastic/teams/kibana-app-services | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 31 | 0 | 31 | 2 | +| 32 | 0 | 32 | 2 | ## Client diff --git a/api_docs/newsfeed.mdx b/api_docs/newsfeed.mdx index 4b2bc38f00043..36108b988c631 100644 --- a/api_docs/newsfeed.mdx +++ b/api_docs/newsfeed.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/newsfeed title: "newsfeed" image: https://source.unsplash.com/400x175/?github summary: API docs for the newsfeed plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'newsfeed'] warning: 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. --- diff --git a/api_docs/observability.devdocs.json b/api_docs/observability.devdocs.json index a7dafca1f6c52..71c8be78ca64d 100644 --- a/api_docs/observability.devdocs.json +++ b/api_docs/observability.devdocs.json @@ -90,7 +90,13 @@ "description": [], "signature": [ "({ reportType, allSeries }: { reportType: ", - "ReportViewType", + { + "pluginId": "observability", + "scope": "public", + "docId": "kibObservabilityPluginApi", + "section": "def-public.ReportViewType", + "text": "ReportViewType" + }, "; allSeries: ", { "pluginId": "observability", @@ -1891,13 +1897,26 @@ "children": [ { "parentPluginId": "observability", - "id": "def-public.ExploratoryEmbeddableProps.reportType", + "id": "def-public.ExploratoryEmbeddableProps.appId", "type": "CompoundType", "tags": [], - "label": "reportType", + "label": "appId", "description": [], "signature": [ - "\"data-distribution\" | \"kpi-over-time\" | \"core-web-vitals\" | \"device-data-distribution\"" + "\"observability\" | \"securitySolutionUI\" | undefined" + ], + "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/embeddable/embeddable.tsx", + "deprecated": false + }, + { + "parentPluginId": "observability", + "id": "def-public.ExploratoryEmbeddableProps.appendTitle", + "type": "Object", + "tags": [], + "label": "appendTitle", + "description": [], + "signature": [ + "JSX.Element | undefined" ], "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/embeddable/embeddable.tsx", "deprecated": false @@ -1914,63 +1933,91 @@ "pluginId": "observability", "scope": "public", "docId": "kibObservabilityPluginApi", - "section": "def-public.SeriesUrl", - "text": "SeriesUrl" + "section": "def-public.AllSeries", + "text": "AllSeries" }, - "[]" + " | undefined" ], "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/embeddable/embeddable.tsx", "deprecated": false }, { "parentPluginId": "observability", - "id": "def-public.ExploratoryEmbeddableProps.appendTitle", + "id": "def-public.ExploratoryEmbeddableProps.axisTitlesVisibility", "type": "Object", "tags": [], - "label": "appendTitle", + "label": "axisTitlesVisibility", "description": [], "signature": [ - "JSX.Element | undefined" + "AxesSettingsConfig", + " | undefined" ], "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/embeddable/embeddable.tsx", "deprecated": false }, { "parentPluginId": "observability", - "id": "def-public.ExploratoryEmbeddableProps.title", + "id": "def-public.ExploratoryEmbeddableProps.customHeight", "type": "CompoundType", "tags": [], - "label": "title", + "label": "customHeight", "description": [], "signature": [ - "string | JSX.Element" + "string | number | undefined" ], "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/embeddable/embeddable.tsx", "deprecated": false }, { "parentPluginId": "observability", - "id": "def-public.ExploratoryEmbeddableProps.showCalculationMethod", - "type": "CompoundType", + "id": "def-public.ExploratoryEmbeddableProps.customLensAttrs", + "type": "Any", "tags": [], - "label": "showCalculationMethod", + "label": "customLensAttrs", "description": [], "signature": [ - "boolean | undefined" + "any" ], "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/embeddable/embeddable.tsx", "deprecated": false }, { "parentPluginId": "observability", - "id": "def-public.ExploratoryEmbeddableProps.axisTitlesVisibility", + "id": "def-public.ExploratoryEmbeddableProps.customTimeRange", "type": "Object", "tags": [], - "label": "axisTitlesVisibility", + "label": "customTimeRange", "description": [], "signature": [ - "AxesSettingsConfig", - " | undefined" + "{ from: string; to: string; } | undefined" + ], + "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/embeddable/embeddable.tsx", + "deprecated": false + }, + { + "parentPluginId": "observability", + "id": "def-public.ExploratoryEmbeddableProps.dataTypesIndexPatterns", + "type": "Object", + "tags": [], + "label": "dataTypesIndexPatterns", + "description": [], + "signature": [ + "Partial> | undefined" + ], + "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/embeddable/embeddable.tsx", + "deprecated": false + }, + { + "parentPluginId": "observability", + "id": "def-public.ExploratoryEmbeddableProps.isSingleMetric", + "type": "CompoundType", + "tags": [], + "label": "isSingleMetric", + "description": [], + "signature": [ + "boolean | undefined" ], "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/embeddable/embeddable.tsx", "deprecated": false @@ -1990,15 +2037,54 @@ }, { "parentPluginId": "observability", - "id": "def-public.ExploratoryEmbeddableProps.dataTypesIndexPatterns", - "type": "Object", + "id": "def-public.ExploratoryEmbeddableProps.onBrushEnd", + "type": "Function", "tags": [], - "label": "dataTypesIndexPatterns", + "label": "onBrushEnd", "description": [], "signature": [ - "Partial> | undefined" + "((param: { range: number[]; }) => void) | undefined" + ], + "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/embeddable/embeddable.tsx", + "deprecated": false, + "children": [ + { + "parentPluginId": "observability", + "id": "def-public.ExploratoryEmbeddableProps.onBrushEnd.$1", + "type": "Object", + "tags": [], + "label": "param", + "description": [], + "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/embeddable/embeddable.tsx", + "deprecated": false, + "children": [ + { + "parentPluginId": "observability", + "id": "def-public.ExploratoryEmbeddableProps.onBrushEnd.$1.range", + "type": "Array", + "tags": [], + "label": "range", + "description": [], + "signature": [ + "number[]" + ], + "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/embeddable/embeddable.tsx", + "deprecated": false + } + ] + } + ], + "returnComment": [] + }, + { + "parentPluginId": "observability", + "id": "def-public.ExploratoryEmbeddableProps.caseOwner", + "type": "string", + "tags": [], + "label": "caseOwner", + "description": [], + "signature": [ + "string | undefined" ], "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/embeddable/embeddable.tsx", "deprecated": false @@ -2019,28 +2105,74 @@ }, { "parentPluginId": "observability", - "id": "def-public.ExploratoryEmbeddableProps.withActions", + "id": "def-public.ExploratoryEmbeddableProps.reportType", "type": "CompoundType", "tags": [], - "label": "withActions", + "label": "reportType", "description": [], "signature": [ - "boolean | ", - "ActionTypes", - "[] | undefined" + "\"data-distribution\" | \"kpi-over-time\" | \"core-web-vitals\" | \"device-data-distribution\"" ], "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/embeddable/embeddable.tsx", "deprecated": false }, { "parentPluginId": "observability", - "id": "def-public.ExploratoryEmbeddableProps.appId", + "id": "def-public.ExploratoryEmbeddableProps.showCalculationMethod", "type": "CompoundType", "tags": [], - "label": "appId", + "label": "showCalculationMethod", "description": [], "signature": [ - "\"security\" | \"observability\" | undefined" + "boolean | undefined" + ], + "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/embeddable/embeddable.tsx", + "deprecated": false + }, + { + "parentPluginId": "observability", + "id": "def-public.ExploratoryEmbeddableProps.singleMetricOptions", + "type": "Object", + "tags": [], + "label": "singleMetricOptions", + "description": [], + "signature": [ + "SingleMetricOptions", + " | undefined" + ], + "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/embeddable/embeddable.tsx", + "deprecated": false + }, + { + "parentPluginId": "observability", + "id": "def-public.ExploratoryEmbeddableProps.title", + "type": "CompoundType", + "tags": [], + "label": "title", + "description": [], + "signature": [ + "string | JSX.Element | undefined" + ], + "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/embeddable/embeddable.tsx", + "deprecated": false + }, + { + "parentPluginId": "observability", + "id": "def-public.ExploratoryEmbeddableProps.withActions", + "type": "CompoundType", + "tags": [], + "label": "withActions", + "description": [], + "signature": [ + "boolean | ", + { + "pluginId": "observability", + "scope": "public", + "docId": "kibObservabilityPluginApi", + "section": "def-public.ActionTypes", + "text": "ActionTypes" + }, + "[] | undefined" ], "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/embeddable/embeddable.tsx", "deprecated": false @@ -4246,9 +4378,6 @@ "tags": [], "label": "METRIC_TYPE", "description": [], - "signature": [ - "METRIC_TYPE" - ], "path": "node_modules/@types/kbn__analytics/index.d.ts", "deprecated": false, "initialIsOpen": false @@ -4266,6 +4395,20 @@ } ], "misc": [ + { + "parentPluginId": "observability", + "id": "def-public.ActionTypes", + "type": "Type", + "tags": [], + "label": "ActionTypes", + "description": [], + "signature": [ + "\"save\" | \"explore\" | \"addToCase\" | \"openInLens\"" + ], + "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/embeddable/use_actions.ts", + "deprecated": false, + "initialIsOpen": false + }, { "parentPluginId": "observability", "id": "def-public.AddInspectorRequest", @@ -4364,9 +4507,6 @@ "tags": [], "label": "DropResult", "description": [], - "signature": [ - "DropResult" - ], "path": "x-pack/plugins/observability/public/typings/eui_draggable/index.ts", "deprecated": false, "initialIsOpen": false @@ -4670,6 +4810,20 @@ "deprecated": false, "initialIsOpen": false }, + { + "parentPluginId": "observability", + "id": "def-public.ReportViewType", + "type": "Type", + "tags": [], + "label": "ReportViewType", + "description": [], + "signature": [ + "\"data-distribution\" | \"kpi-over-time\" | \"core-web-vitals\" | \"device-data-distribution\"" + ], + "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/types.ts", + "deprecated": false, + "initialIsOpen": false + }, { "parentPluginId": "observability", "id": "def-public.SectionLinkProps", @@ -4851,7 +5005,13 @@ "{ navigation: { PageTemplate: (pageTemplateProps: ", "WrappedPageTemplateProps", ") => JSX.Element; }; createExploratoryViewUrl: ({ reportType, allSeries }: { reportType: ", - "ReportViewType", + { + "pluginId": "observability", + "scope": "public", + "docId": "kibObservabilityPluginApi", + "section": "def-public.ReportViewType", + "text": "ReportViewType" + }, "; allSeries: ", { "pluginId": "observability", @@ -4958,7 +5118,9 @@ "MappingDynamicTemplate", ">[] | undefined; _field_names?: ", "MappingFieldNamesField", - " | undefined; _meta?: Record | undefined; numeric_detection?: boolean | undefined; properties?: Record | undefined; _routing?: ", "MappingRoutingField", @@ -5018,7 +5180,9 @@ "MappingDynamicTemplate", ">[] | undefined; _field_names?: ", "MappingFieldNamesField", - " | undefined; _meta?: Record | undefined; numeric_detection?: boolean | undefined; properties?: Record | undefined; _routing?: ", "MappingRoutingField", @@ -5034,20 +5198,1196 @@ { "parentPluginId": "observability", "id": "def-server.createOrUpdateIndex.$1.client", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "client", "description": [], "signature": [ - "Omit<", - "KibanaClient", - ", \"extend\" | \"connectionPool\" | \"transport\" | \"serializer\" | \"child\" | \"close\" | \"diagnostic\"> & { transport: { request(params: ", - "TransportRequestParams", + "{ eql: ", + "default", + "; search: { >(this: That, params?: ", + "SearchRequest", + " | ", + "SearchRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "SearchResponse", + ">; >(this: That, params?: ", + "SearchRequest", + " | ", + "SearchRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "SearchResponse", + ", unknown>>; >(this: That, params?: ", + "SearchRequest", + " | ", + "SearchRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "SearchResponse", + ">; }; create: { (this: That, params: ", + "CreateRequest", + " | ", + "CreateRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "CreateResponse", + ">; (this: That, params: ", + "CreateRequest", + " | ", + "CreateRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "CreateResponse", + ", unknown>>; (this: That, params: ", + "CreateRequest", + " | ", + "CreateRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "CreateResponse", + ">; }; monitoring: ", + "default", + "; security: ", + "default", + "; name: string | symbol; index: { (this: That, params: ", + "IndexRequest", + " | ", + "IndexRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "IndexResponse", + ">; (this: That, params: ", + "IndexRequest", + " | ", + "IndexRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "IndexResponse", + ", unknown>>; (this: That, params: ", + "IndexRequest", + " | ", + "IndexRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "IndexResponse", + ">; }; delete: { (this: That, params: ", + "DeleteRequest", + " | ", + "DeleteRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "DeleteResponse", + ">; (this: That, params: ", + "DeleteRequest", + " | ", + "DeleteRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "DeleteResponse", + ", unknown>>; (this: That, params: ", + "DeleteRequest", + " | ", + "DeleteRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "DeleteResponse", + ">; }; get: { (this: That, params: ", + "GetRequest", + " | ", + "GetRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetResponse", + ">; (this: That, params: ", + "GetRequest", + " | ", + "GetRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "GetResponse", + ", unknown>>; (this: That, params: ", + "GetRequest", + " | ", + "GetRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "GetResponse", + ">; }; update: { (this: That, params: ", + "UpdateRequest", + " | ", + "UpdateRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "UpdateResponse", + ">; (this: That, params: ", + "UpdateRequest", + " | ", + "UpdateRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "UpdateResponse", + ", unknown>>; (this: That, params: ", + "UpdateRequest", + " | ", + "UpdateRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "UpdateResponse", + ">; }; closePointInTime: { (this: That, params: ", + "ClosePointInTimeRequest", + " | ", + "ClosePointInTimeRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ClosePointInTimeResponse", + ">; (this: That, params: ", + "ClosePointInTimeRequest", + " | ", + "ClosePointInTimeRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ClosePointInTimeResponse", + ", unknown>>; (this: That, params: ", + "ClosePointInTimeRequest", + " | ", + "ClosePointInTimeRequest", ", options?: ", "TransportRequestOptions", " | undefined): Promise<", + "ClosePointInTimeResponse", + ">; }; transform: ", + "default", + "; helpers: ", + "default", + "; [kInternal]: symbol | null; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", + "default", + "; Internal: ", + "default", + "; asyncSearch: ", + "default", + "; autoscaling: ", + "default", + "; bulk: { (this: That, params: ", + "BulkRequest", + " | ", + "BulkRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "BulkResponse", + ">; (this: That, params: ", + "BulkRequest", + " | ", + "BulkRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "BulkResponse", + ", unknown>>; (this: That, params: ", + "BulkRequest", + " | ", + "BulkRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "BulkResponse", + ">; }; cat: ", + "default", + "; ccr: ", + "default", + "; clearScroll: { (this: That, params?: ", + "ClearScrollRequest", + " | ", + "ClearScrollRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ClearScrollResponse", + ">; (this: That, params?: ", + "ClearScrollRequest", + " | ", + "ClearScrollRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ClearScrollResponse", + ", unknown>>; (this: That, params?: ", + "ClearScrollRequest", + " | ", + "ClearScrollRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ClearScrollResponse", + ">; }; cluster: ", + "default", + "; count: { (this: That, params?: ", + "CountRequest", + " | ", + "CountRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "CountResponse", + ">; (this: That, params?: ", + "CountRequest", + " | ", + "CountRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "CountResponse", + ", unknown>>; (this: That, params?: ", + "CountRequest", + " | ", + "CountRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "CountResponse", + ">; }; danglingIndices: ", + "default", + "; deleteByQuery: { (this: That, params: ", + "DeleteByQueryRequest", + " | ", + "DeleteByQueryRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "DeleteByQueryResponse", + ">; (this: That, params: ", + "DeleteByQueryRequest", + " | ", + "DeleteByQueryRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "DeleteByQueryResponse", + ", unknown>>; (this: That, params: ", + "DeleteByQueryRequest", + " | ", + "DeleteByQueryRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "DeleteByQueryResponse", + ">; }; deleteByQueryRethrottle: { (this: That, params: ", + "DeleteByQueryRethrottleRequest", + " | ", + "DeleteByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "DeleteByQueryRethrottleResponse", + ">; (this: That, params: ", + "DeleteByQueryRethrottleRequest", + " | ", + "DeleteByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "DeleteByQueryRethrottleResponse", + ", unknown>>; (this: That, params: ", + "DeleteByQueryRethrottleRequest", + " | ", + "DeleteByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "DeleteByQueryRethrottleResponse", + ">; }; deleteScript: { (this: That, params: ", + "DeleteScriptRequest", + " | ", + "DeleteScriptRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "DeleteScriptResponse", + ">; (this: That, params: ", + "DeleteScriptRequest", + " | ", + "DeleteScriptRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", - ">; }; }" + "<", + "DeleteScriptResponse", + ", unknown>>; (this: That, params: ", + "DeleteScriptRequest", + " | ", + "DeleteScriptRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "DeleteScriptResponse", + ">; }; enrich: ", + "default", + "; exists: { (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; existsSource: { (this: That, params: ", + "ExistsSourceRequest", + " | ", + "ExistsSourceRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "ExistsSourceRequest", + " | ", + "ExistsSourceRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "ExistsSourceRequest", + " | ", + "ExistsSourceRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; explain: { (this: That, params: ", + "ExplainRequest", + " | ", + "ExplainRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ExplainResponse", + ">; (this: That, params: ", + "ExplainRequest", + " | ", + "ExplainRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ExplainResponse", + ", unknown>>; (this: That, params: ", + "ExplainRequest", + " | ", + "ExplainRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ExplainResponse", + ">; }; features: ", + "default", + "; fieldCaps: { (this: That, params?: ", + "FieldCapsRequest", + " | ", + "FieldCapsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "FieldCapsResponse", + ">; (this: That, params?: ", + "FieldCapsRequest", + " | ", + "FieldCapsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "FieldCapsResponse", + ", unknown>>; (this: That, params?: ", + "FieldCapsRequest", + " | ", + "FieldCapsRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "FieldCapsResponse", + ">; }; fleet: ", + "default", + "; getScript: { (this: That, params: ", + "GetScriptRequest", + " | ", + "GetScriptRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetScriptResponse", + ">; (this: That, params: ", + "GetScriptRequest", + " | ", + "GetScriptRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "GetScriptResponse", + ", unknown>>; (this: That, params: ", + "GetScriptRequest", + " | ", + "GetScriptRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "GetScriptResponse", + ">; }; getScriptContext: { (this: That, params?: ", + "GetScriptContextRequest", + " | ", + "GetScriptContextRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetScriptContextResponse", + ">; (this: That, params?: ", + "GetScriptContextRequest", + " | ", + "GetScriptContextRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "GetScriptContextResponse", + ", unknown>>; (this: That, params?: ", + "GetScriptContextRequest", + " | ", + "GetScriptContextRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "GetScriptContextResponse", + ">; }; getScriptLanguages: { (this: That, params?: ", + "GetScriptLanguagesRequest", + " | ", + "GetScriptLanguagesRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetScriptLanguagesResponse", + ">; (this: That, params?: ", + "GetScriptLanguagesRequest", + " | ", + "GetScriptLanguagesRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "GetScriptLanguagesResponse", + ", unknown>>; (this: That, params?: ", + "GetScriptLanguagesRequest", + " | ", + "GetScriptLanguagesRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "GetScriptLanguagesResponse", + ">; }; getSource: { (this: That, params: ", + "GetSourceRequest", + " | ", + "GetSourceRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "GetSourceRequest", + " | ", + "GetSourceRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "GetSourceRequest", + " | ", + "GetSourceRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; graph: ", + "default", + "; ilm: ", + "default", + "; indices: ", + "default", + "; info: { (this: That, params?: ", + "InfoRequest", + " | ", + "InfoRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "InfoResponse", + ">; (this: That, params?: ", + "InfoRequest", + " | ", + "InfoRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "InfoResponse", + ", unknown>>; (this: That, params?: ", + "InfoRequest", + " | ", + "InfoRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "InfoResponse", + ">; }; ingest: ", + "default", + "; knnSearch: { (this: That, params: ", + "KnnSearchRequest", + " | ", + "KnnSearchRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "KnnSearchResponse", + ">; (this: That, params: ", + "KnnSearchRequest", + " | ", + "KnnSearchRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "KnnSearchResponse", + ", unknown>>; (this: That, params: ", + "KnnSearchRequest", + " | ", + "KnnSearchRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "KnnSearchResponse", + ">; }; license: ", + "default", + "; logstash: ", + "default", + "; mget: { (this: That, params?: ", + "MgetRequest", + " | ", + "MgetRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MgetResponse", + ">; (this: That, params?: ", + "MgetRequest", + " | ", + "MgetRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "MgetResponse", + ", unknown>>; (this: That, params?: ", + "MgetRequest", + " | ", + "MgetRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "MgetResponse", + ">; }; migration: ", + "default", + "; ml: ", + "default", + "; msearch: { >(this: That, params: ", + "MsearchRequest", + " | ", + "MsearchRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MsearchResponse", + ">; >(this: That, params: ", + "MsearchRequest", + " | ", + "MsearchRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "MsearchResponse", + ", unknown>>; >(this: That, params: ", + "MsearchRequest", + " | ", + "MsearchRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "MsearchResponse", + ">; }; msearchTemplate: { >(this: That, params: ", + "MsearchTemplateRequest", + " | ", + "MsearchTemplateRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MsearchTemplateResponse", + ">; >(this: That, params: ", + "MsearchTemplateRequest", + " | ", + "MsearchTemplateRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "MsearchTemplateResponse", + ", unknown>>; >(this: That, params: ", + "MsearchTemplateRequest", + " | ", + "MsearchTemplateRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "MsearchTemplateResponse", + ">; }; mtermvectors: { (this: That, params?: ", + "MtermvectorsRequest", + " | ", + "MtermvectorsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MtermvectorsResponse", + ">; (this: That, params?: ", + "MtermvectorsRequest", + " | ", + "MtermvectorsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "MtermvectorsResponse", + ", unknown>>; (this: That, params?: ", + "MtermvectorsRequest", + " | ", + "MtermvectorsRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "MtermvectorsResponse", + ">; }; nodes: ", + "default", + "; openPointInTime: { (this: That, params: ", + "OpenPointInTimeRequest", + " | ", + "OpenPointInTimeRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "OpenPointInTimeResponse", + ">; (this: That, params: ", + "OpenPointInTimeRequest", + " | ", + "OpenPointInTimeRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "OpenPointInTimeResponse", + ", unknown>>; (this: That, params: ", + "OpenPointInTimeRequest", + " | ", + "OpenPointInTimeRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "OpenPointInTimeResponse", + ">; }; ping: { (this: That, params?: ", + "PingRequest", + " | ", + "PingRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params?: ", + "PingRequest", + " | ", + "PingRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params?: ", + "PingRequest", + " | ", + "PingRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; putScript: { (this: That, params: ", + "PutScriptRequest", + " | ", + "PutScriptRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "PutScriptResponse", + ">; (this: That, params: ", + "PutScriptRequest", + " | ", + "PutScriptRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "PutScriptResponse", + ", unknown>>; (this: That, params: ", + "PutScriptRequest", + " | ", + "PutScriptRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "PutScriptResponse", + ">; }; rankEval: { (this: That, params: ", + "RankEvalRequest", + " | ", + "RankEvalRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "RankEvalResponse", + ">; (this: That, params: ", + "RankEvalRequest", + " | ", + "RankEvalRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "RankEvalResponse", + ", unknown>>; (this: That, params: ", + "RankEvalRequest", + " | ", + "RankEvalRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "RankEvalResponse", + ">; }; reindex: { (this: That, params?: ", + "ReindexRequest", + " | ", + "ReindexRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ReindexResponse", + ">; (this: That, params?: ", + "ReindexRequest", + " | ", + "ReindexRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ReindexResponse", + ", unknown>>; (this: That, params?: ", + "ReindexRequest", + " | ", + "ReindexRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ReindexResponse", + ">; }; reindexRethrottle: { (this: That, params: ", + "ReindexRethrottleRequest", + " | ", + "ReindexRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ReindexRethrottleResponse", + ">; (this: That, params: ", + "ReindexRethrottleRequest", + " | ", + "ReindexRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ReindexRethrottleResponse", + ", unknown>>; (this: That, params: ", + "ReindexRethrottleRequest", + " | ", + "ReindexRethrottleRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ReindexRethrottleResponse", + ">; }; renderSearchTemplate: { (this: That, params?: ", + "RenderSearchTemplateRequest", + " | ", + "RenderSearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "RenderSearchTemplateResponse", + ">; (this: That, params?: ", + "RenderSearchTemplateRequest", + " | ", + "RenderSearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "RenderSearchTemplateResponse", + ", unknown>>; (this: That, params?: ", + "RenderSearchTemplateRequest", + " | ", + "RenderSearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "RenderSearchTemplateResponse", + ">; }; rollup: ", + "default", + "; scriptsPainlessExecute: { (this: That, params?: ", + "ScriptsPainlessExecuteRequest", + " | ", + "ScriptsPainlessExecuteRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ScriptsPainlessExecuteResponse", + ">; (this: That, params?: ", + "ScriptsPainlessExecuteRequest", + " | ", + "ScriptsPainlessExecuteRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ScriptsPainlessExecuteResponse", + ", unknown>>; (this: That, params?: ", + "ScriptsPainlessExecuteRequest", + " | ", + "ScriptsPainlessExecuteRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ScriptsPainlessExecuteResponse", + ">; }; scroll: { >(this: That, params: ", + "ScrollRequest", + " | ", + "ScrollRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ScrollResponse", + ">; >(this: That, params: ", + "ScrollRequest", + " | ", + "ScrollRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ScrollResponse", + ", unknown>>; >(this: That, params: ", + "ScrollRequest", + " | ", + "ScrollRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ScrollResponse", + ">; }; searchMvt: { (this: That, params: ", + "SearchMvtRequest", + " | ", + "SearchMvtRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "SearchMvtRequest", + " | ", + "SearchMvtRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "SearchMvtRequest", + " | ", + "SearchMvtRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; searchShards: { (this: That, params?: ", + "SearchShardsRequest", + " | ", + "SearchShardsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "SearchShardsResponse", + ">; (this: That, params?: ", + "SearchShardsRequest", + " | ", + "SearchShardsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "SearchShardsResponse", + ", unknown>>; (this: That, params?: ", + "SearchShardsRequest", + " | ", + "SearchShardsRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "SearchShardsResponse", + ">; }; searchTemplate: { (this: That, params?: ", + "SearchTemplateRequest", + " | ", + "SearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "SearchTemplateResponse", + ">; (this: That, params?: ", + "SearchTemplateRequest", + " | ", + "SearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "SearchTemplateResponse", + ", unknown>>; (this: That, params?: ", + "SearchTemplateRequest", + " | ", + "SearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "SearchTemplateResponse", + ">; }; searchableSnapshots: ", + "default", + "; shutdown: ", + "default", + "; slm: ", + "default", + "; snapshot: ", + "default", + "; sql: ", + "default", + "; ssl: ", + "default", + "; tasks: ", + "default", + "; termsEnum: { (this: That, params: ", + "TermsEnumRequest", + " | ", + "TermsEnumRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "TermsEnumResponse", + ">; (this: That, params: ", + "TermsEnumRequest", + " | ", + "TermsEnumRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "TermsEnumResponse", + ", unknown>>; (this: That, params: ", + "TermsEnumRequest", + " | ", + "TermsEnumRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "TermsEnumResponse", + ">; }; termvectors: { (this: That, params: ", + "TermvectorsRequest", + " | ", + "TermvectorsRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "TermvectorsResponse", + ">; (this: That, params: ", + "TermvectorsRequest", + " | ", + "TermvectorsRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "TermvectorsResponse", + ", unknown>>; (this: That, params: ", + "TermvectorsRequest", + " | ", + "TermvectorsRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "TermvectorsResponse", + ">; }; textStructure: ", + "default", + "; updateByQuery: { (this: That, params: ", + "UpdateByQueryRequest", + " | ", + "UpdateByQueryRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "UpdateByQueryResponse", + ">; (this: That, params: ", + "UpdateByQueryRequest", + " | ", + "UpdateByQueryRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "UpdateByQueryResponse", + ", unknown>>; (this: That, params: ", + "UpdateByQueryRequest", + " | ", + "UpdateByQueryRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "UpdateByQueryResponse", + ">; }; updateByQueryRethrottle: { (this: That, params: ", + "UpdateByQueryRethrottleRequest", + " | ", + "UpdateByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "UpdateByQueryRethrottleResponse", + ">; (this: That, params: ", + "UpdateByQueryRethrottleRequest", + " | ", + "UpdateByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "UpdateByQueryRethrottleResponse", + ", unknown>>; (this: That, params: ", + "UpdateByQueryRethrottleRequest", + " | ", + "UpdateByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "UpdateByQueryRethrottleResponse", + ">; }; watcher: ", + "default", + "; xpack: ", + "default", + "; }" ], "path": "x-pack/plugins/observability/server/utils/create_or_update_index.ts", "deprecated": false @@ -5618,7 +6958,9 @@ "MappingDynamicTemplate", ">[] | undefined; _field_names?: ", "MappingFieldNamesField", - " | undefined; _meta?: Record | undefined; numeric_detection?: boolean | undefined; properties?: Record | undefined; _routing?: ", "MappingRoutingField", diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index 14e27eb0bf971..6323873410fe8 100644 --- a/api_docs/observability.mdx +++ b/api_docs/observability.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/observability title: "observability" image: https://source.unsplash.com/400x175/?github summary: API docs for the observability plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability'] warning: 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. --- @@ -18,7 +18,7 @@ Contact [Observability UI](https://github.com/orgs/elastic/teams/observability-u | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 347 | 1 | 344 | 29 | +| 358 | 2 | 355 | 28 | ## Client diff --git a/api_docs/osquery.mdx b/api_docs/osquery.mdx index af61f147edd50..7d2c7d8e70371 100644 --- a/api_docs/osquery.mdx +++ b/api_docs/osquery.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/osquery title: "osquery" image: https://source.unsplash.com/400x175/?github summary: API docs for the osquery plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'osquery'] warning: 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. --- diff --git a/api_docs/plugin_directory.mdx b/api_docs/plugin_directory.mdx index cb494473fa913..65a1dd12b0e4a 100644 --- a/api_docs/plugin_directory.mdx +++ b/api_docs/plugin_directory.mdx @@ -3,7 +3,7 @@ id: kibDevDocsPluginDirectory slug: /kibana-dev-docs/api-meta/plugin-api-directory title: Directory summary: Directory of public APIs available through plugins or packages. -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana'] warning: 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. --- @@ -12,13 +12,13 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Count | Plugins or Packages with a
public API | Number of teams | |--------------|----------|------------------------| -| 214 | 170 | 32 | +| 236 | 170 | 40 | ### Public API health stats | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 23638 | 175 | 17954 | 779 | +| 23879 | 176 | 18164 | 1087 | ## Plugin Directory @@ -26,30 +26,30 @@ warning: This document is auto-generated and is meant to be viewed inside our ex |--------------|----------------|-----------|--------------|----------|---------------|--------| | | [Kibana Alerting](https://github.com/orgs/elastic/teams/kibana-alerting-services) | - | 125 | 0 | 125 | 11 | | | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-vis-editors) | - | 23 | 0 | 19 | 1 | -| | [Kibana Alerting](https://github.com/orgs/elastic/teams/kibana-alerting-services) | - | 289 | 0 | 281 | 19 | +| | [Kibana Alerting](https://github.com/orgs/elastic/teams/kibana-alerting-services) | - | 299 | 0 | 291 | 19 | | | [APM UI](https://github.com/orgs/elastic/teams/apm-ui) | The user interface for Elastic APM | 40 | 0 | 40 | 49 | | | [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) | - | 9 | 0 | 9 | 0 | | | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | Considering using bfetch capabilities when fetching large amounts of data. This services supports batching HTTP requests and streaming responses back. | 78 | 1 | 69 | 2 | | | [Kibana Presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds Canvas application to Kibana | 9 | 0 | 8 | 3 | -| | [ResponseOps](https://github.com/orgs/elastic/teams/response-ops) | The Case management system in Kibana | 74 | 0 | 51 | 19 | -| | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-vis-editors) | - | 319 | 2 | 286 | 4 | +| | [ResponseOps](https://github.com/orgs/elastic/teams/response-ops) | The Case management system in Kibana | 82 | 0 | 59 | 20 | +| | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-vis-editors) | - | 321 | 2 | 288 | 4 | | | [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) | - | 28 | 0 | 23 | 0 | | | [Stack Management](https://github.com/orgs/elastic/teams/kibana-stack-management) | - | 13 | 0 | 13 | 1 | | | [Kibana Presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | The Controls Plugin contains embeddable components intended to create a simple query interface for end users, and a powerful editing suite that allows dashboard authors to build controls | 118 | 0 | 117 | 3 | -| | [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) | - | 2366 | 15 | 973 | 32 | +| | [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) | - | 2368 | 15 | 975 | 32 | | crossClusterReplication | [Stack Management](https://github.com/orgs/elastic/teams/kibana-stack-management) | - | 0 | 0 | 0 | 0 | | | [Fleet](https://github.com/orgs/elastic/teams/fleet) | Add custom data integrations so they can be displayed in the Fleet integrations app | 96 | 0 | 77 | 1 | -| | [Kibana Presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds the Dashboard app to Kibana | 138 | 0 | 136 | 14 | -| | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | - | 51 | 0 | 50 | 0 | -| | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | 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. | 3386 | 40 | 2791 | 26 | +| | [Kibana Presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds the Dashboard app to Kibana | 141 | 0 | 139 | 14 | +| | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | - | 52 | 0 | 51 | 0 | +| | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | 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. | 3392 | 40 | 2795 | 26 | | | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | Enhanced data plugin. (See src/plugins/data.) Enhances the main data plugin with a search session management UI. Includes a reusable search session indicator component to use in other applications. Exposes routes for managing search sessions. Includes a service that monitors, updates, and cleans up search session saved objects. | 16 | 0 | 16 | 2 | | | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | This plugin provides the ability to create data views via a modal flyout from any kibana app | 13 | 0 | 7 | 0 | | | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | Reusable data view field editor across Kibana | 42 | 0 | 37 | 3 | | | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | Data view management app | 2 | 0 | 2 | 0 | -| | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | 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. | 742 | 3 | 597 | 7 | +| | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | 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. | 765 | 3 | 616 | 10 | | | [Machine Learning UI](https://github.com/orgs/elastic/teams/ml-ui) | The Data Visualizer tools help you understand your data, by analyzing the metrics and fields in a log file or an existing Elasticsearch index. | 23 | 2 | 19 | 1 | | | [Stack Management](https://github.com/orgs/elastic/teams/kibana-stack-management) | - | 10 | 0 | 8 | 2 | -| | [Data Discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | This plugin contains the Discover application and the saved search embeddable. | 93 | 0 | 65 | 7 | +| | [Data Discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | This plugin contains the Discover application and the saved search embeddable. | 77 | 0 | 61 | 7 | | | [Data Discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 37 | 0 | 35 | 2 | | | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | Adds embeddables service to Kibana | 468 | 0 | 381 | 4 | | | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | Extends embeddable plugin with more functionality | 14 | 0 | 14 | 0 | @@ -58,11 +58,11 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | | [Stack Management](https://github.com/orgs/elastic/teams/kibana-stack-management) | - | 110 | 3 | 106 | 3 | | | [Kibana Alerting](https://github.com/orgs/elastic/teams/kibana-alerting-services) | - | 82 | 0 | 82 | 6 | | | [Kibana Presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds 'error' renderer to expressions | 17 | 0 | 15 | 2 | -| | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-vis-editors) | Expression Gauge plugin adds a `gauge` renderer and function to the expression plugin. The renderer will display the `gauge` chart. | 62 | 0 | 62 | 1 | +| | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-vis-editors) | Expression Gauge plugin adds a `gauge` renderer and function to the expression plugin. The renderer will display the `gauge` chart. | 68 | 0 | 68 | 3 | | | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-vis-editors) | Expression Heatmap plugin adds a `heatmap` renderer and function to the expression plugin. The renderer will display the `heatmap` chart. | 114 | 0 | 110 | 3 | | | [Kibana Presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds 'image' function and renderer to expressions | 26 | 0 | 26 | 0 | | | [Kibana Presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds 'metric' function and renderer to expressions | 32 | 0 | 27 | 0 | -| | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-vis-editors) | Expression MetricVis plugin adds a `metric` renderer and function to the expression plugin. The renderer will display the `metric` chart. | 42 | 0 | 42 | 0 | +| | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-vis-editors) | Expression MetricVis plugin adds a `metric` renderer and function to the expression plugin. The renderer will display the `metric` chart. | 46 | 0 | 46 | 1 | | | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-vis-editors) | 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. | 70 | 0 | 70 | 2 | | | [Kibana Presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds 'repeatImage' function and renderer to expressions | 32 | 0 | 32 | 0 | | | [Kibana Presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds 'revealImage' function and renderer to expressions | 14 | 0 | 14 | 3 | @@ -72,7 +72,7 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | | [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) | - | 222 | 0 | 98 | 2 | | | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | Index pattern fields and ambiguous values formatters | 286 | 6 | 247 | 3 | | | [Machine Learning UI](https://github.com/orgs/elastic/teams/ml-ui) | 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. | 62 | 0 | 62 | 2 | -| | [Fleet](https://github.com/orgs/elastic/teams/fleet) | - | 1263 | 8 | 1147 | 10 | +| | [Fleet](https://github.com/orgs/elastic/teams/fleet) | - | 1349 | 8 | 1232 | 9 | | | [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) | - | 68 | 0 | 14 | 5 | | globalSearchBar | [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) | - | 0 | 0 | 0 | 0 | | globalSearchProviders | [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) | - | 0 | 0 | 0 | 0 | @@ -90,41 +90,41 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | - | 236 | 0 | 201 | 5 | | kibanaUsageCollection | [Kibana Telemetry](https://github.com/orgs/elastic/teams/kibana-telemetry) | - | 0 | 0 | 0 | 0 | | | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | - | 615 | 3 | 420 | 9 | -| | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-vis-editors) | 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. | 365 | 0 | 316 | 44 | +| | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-vis-editors) | 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. | 399 | 0 | 348 | 42 | | | [Stack Management](https://github.com/orgs/elastic/teams/kibana-stack-management) | - | 8 | 0 | 8 | 0 | | | [Stack Management](https://github.com/orgs/elastic/teams/kibana-stack-management) | - | 3 | 0 | 3 | 0 | | | [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) | - | 117 | 0 | 42 | 10 | -| | [Security detections response](https://github.com/orgs/elastic/teams/security-detections-response) | - | 185 | 0 | 155 | 43 | +| | [Security detections response](https://github.com/orgs/elastic/teams/security-detections-response) | - | 197 | 0 | 161 | 49 | | logstash | [Logstash](https://github.com/orgs/elastic/teams/logstash) | - | 0 | 0 | 0 | 0 | | | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-vis-editors) | - | 41 | 0 | 41 | 6 | | | [GIS](https://github.com/orgs/elastic/teams/kibana-gis) | - | 216 | 0 | 215 | 27 | | | [GIS](https://github.com/orgs/elastic/teams/kibana-gis) | - | 67 | 0 | 67 | 0 | | | [Security solution](https://github.com/orgs/elastic/teams/security-solution) | - | 4 | 0 | 4 | 1 | | | [Machine Learning UI](https://github.com/orgs/elastic/teams/ml-ui) | This plugin provides access to the machine learning features provided by Elastic. | 196 | 8 | 79 | 30 | -| | [Stack Monitoring](https://github.com/orgs/elastic/teams/stack-monitoring-ui) | - | 10 | 0 | 10 | 2 | -| | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | - | 31 | 0 | 31 | 2 | +| | [Stack Monitoring](https://github.com/orgs/elastic/teams/stack-monitoring-ui) | - | 11 | 0 | 9 | 1 | +| | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | - | 32 | 0 | 32 | 2 | | | [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) | - | 17 | 0 | 17 | 0 | -| | [Observability UI](https://github.com/orgs/elastic/teams/observability-ui) | - | 347 | 1 | 344 | 29 | +| | [Observability UI](https://github.com/orgs/elastic/teams/observability-ui) | - | 358 | 2 | 355 | 28 | | | [Security asset management](https://github.com/orgs/elastic/teams/security-asset-management) | - | 10 | 0 | 10 | 0 | | painlessLab | [Stack Management](https://github.com/orgs/elastic/teams/kibana-stack-management) | - | 0 | 0 | 0 | 0 | | | [Kibana Presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | The Presentation Utility Plugin is a set of common, shared components and toolkits for solutions within the Presentation space, (e.g. Dashboards, Canvas). | 228 | 2 | 177 | 11 | | | [Stack Management](https://github.com/orgs/elastic/teams/kibana-stack-management) | - | 4 | 0 | 4 | 0 | -| | [Kibana Reporting Services](https://github.com/orgs/elastic/teams/kibana-reporting-services) | Reporting Services enables applications to feature reports that the user can automate with Watcher and download later. | 29 | 0 | 29 | 0 | +| | [Kibana Reporting Services](https://github.com/orgs/elastic/teams/kibana-reporting-services) | Reporting Services enables applications to feature reports that the user can automate with Watcher and download later. | 36 | 0 | 16 | 0 | | | [Stack Management](https://github.com/orgs/elastic/teams/kibana-stack-management) | - | 21 | 0 | 21 | 0 | -| | [RAC](https://github.com/orgs/elastic/teams/rac) | - | 177 | 0 | 150 | 7 | +| | [RAC](https://github.com/orgs/elastic/teams/rac) | - | 181 | 0 | 154 | 7 | | | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | - | 24 | 0 | 19 | 2 | | | [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) | - | 192 | 2 | 151 | 5 | | | [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) | - | 103 | 0 | 90 | 0 | | | [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) | - | 54 | 0 | 50 | 0 | | | [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) | - | 90 | 0 | 45 | 0 | | | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | - | 33 | 0 | 14 | 0 | -| | [Kibana Reporting Services](https://github.com/orgs/elastic/teams/kibana-reporting-services) | Kibana Screenshotting Plugin | 17 | 0 | 8 | 5 | +| | [Kibana Reporting Services](https://github.com/orgs/elastic/teams/kibana-reporting-services) | Kibana Screenshotting Plugin | 18 | 0 | 8 | 5 | | searchprofiler | [Stack Management](https://github.com/orgs/elastic/teams/kibana-stack-management) | - | 0 | 0 | 0 | 0 | | | [Platform 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. | 183 | 0 | 103 | 0 | | | [Security solution](https://github.com/orgs/elastic/teams/security-solution) | - | 45 | 0 | 45 | 18 | -| | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | Adds URL Service and sharing capabilities to Kibana | 139 | 0 | 80 | 12 | -| | [Shared UX](https://github.com/orgs/elastic/teams/shared-ux) | A plugin providing components and services for shared user experiences in Kibana. | 10 | 0 | 0 | 1 | -| | [Stack Management](https://github.com/orgs/elastic/teams/kibana-stack-management) | - | 20 | 1 | 20 | 1 | +| | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | Adds URL Service and sharing capabilities to Kibana | 113 | 0 | 54 | 10 | +| | [Shared UX](https://github.com/orgs/elastic/teams/shared-ux) | A plugin providing components and services for shared user experiences in Kibana. | 14 | 0 | 0 | 1 | +| | [Stack Management](https://github.com/orgs/elastic/teams/kibana-stack-management) | - | 21 | 1 | 21 | 1 | | | [Platform 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. | 250 | 0 | 61 | 0 | | | [Kibana Alerting](https://github.com/orgs/elastic/teams/kibana-alerting-services) | - | 4 | 0 | 4 | 0 | | | [Kibana Alerting](https://github.com/orgs/elastic/teams/kibana-alerting-services) | - | 71 | 0 | 33 | 7 | @@ -135,8 +135,8 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | | [Security solution](https://github.com/orgs/elastic/teams/security-solution) | - | 444 | 1 | 338 | 34 | | | [Machine Learning 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 | | translations | [Kibana Localization](https://github.com/orgs/elastic/teams/kibana-localization) | - | 0 | 0 | 0 | 0 | -| | [Kibana Alerting](https://github.com/orgs/elastic/teams/kibana-alerting-services) | - | 246 | 0 | 234 | 18 | -| | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | Adds UI Actions service to Kibana | 129 | 0 | 90 | 11 | +| | [Kibana Alerting](https://github.com/orgs/elastic/teams/kibana-alerting-services) | - | 246 | 0 | 234 | 20 | +| | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | Adds UI Actions service to Kibana | 130 | 0 | 91 | 11 | | | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | Extends UI Actions plugin with more functionality | 203 | 0 | 141 | 9 | | upgradeAssistant | [Stack Management](https://github.com/orgs/elastic/teams/kibana-stack-management) | - | 0 | 0 | 0 | 0 | | uptime | [Uptime](https://github.com/orgs/elastic/teams/uptime) | This plugin visualizes data from Synthetics and Heartbeat, and integrates with other Observability solutions. | 0 | 0 | 0 | 0 | @@ -156,7 +156,7 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-vis-editors) | Registers the vega visualization. Is the elastic version of vega and vega-lite libraries. | 2 | 0 | 2 | 0 | | | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-vis-editors) | Contains the vislib visualizations. These are the classical area/line/bar, pie, gauge/goal and heatmap charts. We want to replace them with elastic-charts. | 26 | 0 | 25 | 1 | | | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-vis-editors) | Contains the new xy-axis chart using the elastic-charts library, which will eventually replace the vislib xy-axis charts including bar, area, and line. | 57 | 0 | 51 | 5 | -| | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-vis-editors) | Contains the shared architecture among all the legacy visualizations, e.g. the visualization type registry or the visualization embeddable. | 316 | 12 | 296 | 15 | +| | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-vis-editors) | Contains the shared architecture among all the legacy visualizations, e.g. the visualization type registry or the visualization embeddable. | 347 | 12 | 326 | 14 | | watcher | [Stack Management](https://github.com/orgs/elastic/teams/kibana-stack-management) | - | 0 | 0 | 0 | 0 | ## Package Directory @@ -174,7 +174,7 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | | [Owner missing] | - | 66 | 0 | 46 | 2 | | | [Owner missing] | - | 125 | 3 | 123 | 17 | | | [Owner missing] | - | 13 | 0 | 7 | 0 | -| | [Owner missing] | - | 275 | 3 | 193 | 0 | +| | [Owner missing] | - | 281 | 3 | 200 | 1 | | | [Owner missing] | - | 62 | 0 | 62 | 2 | | | [Owner missing] | - | 1 | 0 | 1 | 0 | | | [Owner missing] | - | 27 | 0 | 14 | 1 | @@ -197,7 +197,7 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | | [Owner missing] | security solution elastic search utilities to use across plugins such lists, security_solution, cases, etc... | 57 | 0 | 51 | 1 | | | [Owner missing] | Security Solution utilities for React hooks | 14 | 0 | 6 | 0 | | | [Owner missing] | io ts utilities and types to be shared with plugins from the security solution project | 148 | 0 | 129 | 0 | -| | [Owner missing] | io ts utilities and types to be shared with plugins from the security solution project | 439 | 1 | 428 | 0 | +| | [Owner missing] | io ts utilities and types to be shared with plugins from the security solution project | 460 | 1 | 448 | 0 | | | [Owner missing] | io ts utilities and types to be shared with plugins from the security solution project | 48 | 0 | 26 | 0 | | | [Owner missing] | io ts utilities and types to be shared with plugins from the security solution project | 28 | 0 | 21 | 0 | | | [Owner missing] | security solution list REST API | 59 | 0 | 58 | 0 | @@ -212,7 +212,7 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | | [Owner missing] | - | 96 | 1 | 63 | 2 | | | Operations | - | 22 | 2 | 21 | 0 | | | [Owner missing] | - | 2 | 0 | 2 | 0 | -| | Operations | - | 244 | 5 | 208 | 9 | +| | Operations | - | 241 | 5 | 205 | 9 | | | [Owner missing] | - | 128 | 8 | 101 | 2 | | | [Owner missing] | - | 83 | 0 | 83 | 1 | | | [Owner missing] | - | 7 | 0 | 6 | 0 | diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index f0c1a5198b863..f103c43789f02 100644 --- a/api_docs/presentation_util.mdx +++ b/api_docs/presentation_util.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/presentationUtil title: "presentationUtil" image: https://source.unsplash.com/400x175/?github summary: API docs for the presentationUtil plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationUtil'] warning: 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. --- diff --git a/api_docs/remote_clusters.mdx b/api_docs/remote_clusters.mdx index 085102143d332..ecf9bafdbf1c2 100644 --- a/api_docs/remote_clusters.mdx +++ b/api_docs/remote_clusters.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/remoteClusters title: "remoteClusters" image: https://source.unsplash.com/400x175/?github summary: API docs for the remoteClusters plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'remoteClusters'] warning: 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. --- diff --git a/api_docs/reporting.devdocs.json b/api_docs/reporting.devdocs.json index a640789f47d3f..5d2eecdff0fcb 100644 --- a/api_docs/reporting.devdocs.json +++ b/api_docs/reporting.devdocs.json @@ -3,207 +3,157 @@ "client": { "classes": [], "functions": [], - "interfaces": [], - "enums": [], - "misc": [], - "objects": [], - "start": { - "parentPluginId": "reporting", - "id": "def-public.ReportingStart", - "type": "Type", - "tags": [], - "label": "ReportingStart", - "description": [], - "signature": [ - { - "pluginId": "reporting", - "scope": "public", - "docId": "kibReportingPluginApi", - "section": "def-public.ReportingSetup", - "text": "ReportingSetup" - } - ], - "path": "x-pack/plugins/reporting/public/index.ts", - "deprecated": false, - "lifecycle": "start", - "initialIsOpen": true - } - }, - "server": { - "classes": [ + "interfaces": [ { "parentPluginId": "reporting", - "id": "def-server.ReportingPlugin", - "type": "Class", + "id": "def-public.ApplicationProps", + "type": "Interface", "tags": [], - "label": "ReportingPlugin", - "description": [], - "signature": [ - { - "pluginId": "reporting", - "scope": "server", - "docId": "kibReportingPluginApi", - "section": "def-server.ReportingPlugin", - "text": "ReportingPlugin" - }, - " implements ", - { - "pluginId": "core", - "scope": "server", - "docId": "kibCorePluginApi", - "section": "def-server.Plugin", - "text": "Plugin" - }, - "<", - { - "pluginId": "reporting", - "scope": "server", - "docId": "kibReportingPluginApi", - "section": "def-server.ReportingSetup", - "text": "ReportingSetup" - }, - ", ", - { - "pluginId": "reporting", - "scope": "server", - "docId": "kibReportingPluginApi", - "section": "def-server.ReportingSetup", - "text": "ReportingSetup" - }, - ", ", - { - "pluginId": "reporting", - "scope": "server", - "docId": "kibReportingPluginApi", - "section": "def-server.ReportingSetupDeps", - "text": "ReportingSetupDeps" - }, - ", ", - { - "pluginId": "reporting", - "scope": "server", - "docId": "kibReportingPluginApi", - "section": "def-server.ReportingStartDeps", - "text": "ReportingStartDeps" - }, - ">" + "label": "ApplicationProps", + "description": [ + "\nProperties for displaying a share menu with Reporting features." ], - "path": "x-pack/plugins/reporting/server/plugin.ts", + "path": "x-pack/plugins/reporting/public/shared/get_shared_components.tsx", "deprecated": false, "children": [ { "parentPluginId": "reporting", - "id": "def-server.ReportingPlugin.Unnamed", + "id": "def-public.ApplicationProps.getJobParams", "type": "Function", "tags": [], - "label": "Constructor", - "description": [], + "label": "getJobParams", + "description": [ + "\nA function that Reporting calls to get the sharing data from the application." + ], "signature": [ - "any" + "(forShareUrl?: boolean | undefined) => Omit<{ layout?: { id?: string | undefined; dimensions?: { width: number; height: number; } | undefined; selectors?: Partial<", + "LayoutSelectorDictionary", + "> | undefined; zoom?: number | undefined; } | undefined; objectType: string; title: string; browserTimezone: string; version: string; }, \"version\" | \"browserTimezone\">" ], - "path": "x-pack/plugins/reporting/server/plugin.ts", + "path": "x-pack/plugins/reporting/public/shared/get_shared_components.tsx", "deprecated": false, + "returnComment": [], "children": [ { "parentPluginId": "reporting", - "id": "def-server.ReportingPlugin.Unnamed.$1", - "type": "Object", + "id": "def-public.ApplicationProps.getJobParams.$1", + "type": "CompoundType", "tags": [], - "label": "initContext", + "label": "forShareUrl", "description": [], "signature": [ - { - "pluginId": "core", - "scope": "server", - "docId": "kibCorePluginApi", - "section": "def-server.PluginInitializerContext", - "text": "PluginInitializerContext" - }, - "; loadDelay: number | moment.Duration; maxAttempts: number; }>; roles: Readonly<{} & { enabled: boolean; allow: string[]; }>; kibanaServer: Readonly<{ hostname?: string | undefined; protocol?: string | undefined; port?: number | undefined; } & {}>; queue: Readonly<{} & { timeout: number | moment.Duration; pollInterval: number | moment.Duration; indexInterval: string; pollEnabled: boolean; pollIntervalErrorMultiplier: number; }>; csv: Readonly<{} & { scroll: Readonly<{} & { size: number; duration: string; }>; checkForFormulas: boolean; escapeFormulaValues: boolean; enablePanelActionDownload: boolean; maxSizeBytes: number | ", - "ByteSizeValue", - "; useByteOrderMarkEncoding: boolean; }>; poll: Readonly<{} & { jobCompletionNotifier: Readonly<{} & { interval: number; intervalErrorMultiplier: number; }>; jobsRefresh: Readonly<{} & { interval: number; intervalErrorMultiplier: number; }>; }>; }>>" + "boolean | undefined" ], - "path": "x-pack/plugins/reporting/server/plugin.ts", - "deprecated": false, - "isRequired": true + "path": "x-pack/plugins/reporting/public/share_context_menu/reporting_panel_content/reporting_panel_content.tsx", + "deprecated": false } + ] + }, + { + "parentPluginId": "reporting", + "id": "def-public.ApplicationProps.layoutOption", + "type": "CompoundType", + "tags": [], + "label": "layoutOption", + "description": [ + "\nOption to control how the screenshot(s) is/are placed in the PDF" ], - "returnComment": [] + "signature": [ + "\"canvas\" | \"print\" | undefined" + ], + "path": "x-pack/plugins/reporting/public/shared/get_shared_components.tsx", + "deprecated": false }, { "parentPluginId": "reporting", - "id": "def-server.ReportingPlugin.setup", + "id": "def-public.ApplicationProps.objectId", + "type": "string", + "tags": [], + "label": "objectId", + "description": [ + "\nSaved object ID" + ], + "signature": [ + "string | undefined" + ], + "path": "x-pack/plugins/reporting/public/shared/get_shared_components.tsx", + "deprecated": false + }, + { + "parentPluginId": "reporting", + "id": "def-public.ApplicationProps.onClose", "type": "Function", "tags": [], - "label": "setup", - "description": [], + "label": "onClose", + "description": [ + "\nA function to callback when the Reporting panel should be closed" + ], "signature": [ - "(core: ", - { - "pluginId": "core", - "scope": "server", - "docId": "kibCorePluginApi", - "section": "def-server.CoreSetup", - "text": "CoreSetup" - }, - ", plugins: ", + "() => void" + ], + "path": "x-pack/plugins/reporting/public/shared/get_shared_components.tsx", + "deprecated": false, + "children": [], + "returnComment": [] + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "reporting", + "id": "def-public.ReportingPublicComponents", + "type": "Interface", + "tags": [], + "label": "ReportingPublicComponents", + "description": [ + "\nReact components used to display share menus with Reporting features in an application." + ], + "path": "x-pack/plugins/reporting/public/shared/get_shared_components.tsx", + "deprecated": false, + "children": [ + { + "parentPluginId": "reporting", + "id": "def-public.ReportingPublicComponents.ReportingPanelPDF", + "type": "Function", + "tags": [ + "deprecated" + ], + "label": "ReportingPanelPDF", + "description": [ + "\nAn element to display a form to export the page as PDF" + ], + "signature": [ + "(props: ", { "pluginId": "reporting", - "scope": "server", + "scope": "public", "docId": "kibReportingPluginApi", - "section": "def-server.ReportingSetupDeps", - "text": "ReportingSetupDeps" + "section": "def-public.ApplicationProps", + "text": "ApplicationProps" }, - ") => ", - { - "pluginId": "reporting", - "scope": "server", - "docId": "kibReportingPluginApi", - "section": "def-server.ReportingSetup", - "text": "ReportingSetup" - } + ") => JSX.Element" ], - "path": "x-pack/plugins/reporting/server/plugin.ts", - "deprecated": false, + "path": "x-pack/plugins/reporting/public/shared/get_shared_components.tsx", + "deprecated": true, + "references": [], "children": [ { "parentPluginId": "reporting", - "id": "def-server.ReportingPlugin.setup.$1", - "type": "Object", - "tags": [], - "label": "core", - "description": [], - "signature": [ - { - "pluginId": "core", - "scope": "server", - "docId": "kibCorePluginApi", - "section": "def-server.CoreSetup", - "text": "CoreSetup" - }, - "" - ], - "path": "x-pack/plugins/reporting/server/plugin.ts", - "deprecated": false, - "isRequired": true - }, - { - "parentPluginId": "reporting", - "id": "def-server.ReportingPlugin.setup.$2", + "id": "def-public.ReportingPublicComponents.ReportingPanelPDF.$1", "type": "Object", "tags": [], - "label": "plugins", + "label": "props", "description": [], "signature": [ { "pluginId": "reporting", - "scope": "server", + "scope": "public", "docId": "kibReportingPluginApi", - "section": "def-server.ReportingSetupDeps", - "text": "ReportingSetupDeps" + "section": "def-public.ApplicationProps", + "text": "ApplicationProps" } ], - "path": "x-pack/plugins/reporting/server/plugin.ts", + "path": "x-pack/plugins/reporting/public/shared/get_shared_components.tsx", "deprecated": false, "isRequired": true } @@ -212,77 +162,90 @@ }, { "parentPluginId": "reporting", - "id": "def-server.ReportingPlugin.start", + "id": "def-public.ReportingPublicComponents.ReportingPanelPDFV2", "type": "Function", "tags": [], - "label": "start", - "description": [], + "label": "ReportingPanelPDFV2", + "description": [ + "\nAn element to display a form to export the page as PDF" + ], "signature": [ - "(core: ", - { - "pluginId": "core", - "scope": "server", - "docId": "kibCorePluginApi", - "section": "def-server.CoreStart", - "text": "CoreStart" - }, - ", plugins: ", + "(props: ", { "pluginId": "reporting", - "scope": "server", + "scope": "public", "docId": "kibReportingPluginApi", - "section": "def-server.ReportingStartDeps", - "text": "ReportingStartDeps" + "section": "def-public.ApplicationProps", + "text": "ApplicationProps" }, - ") => ", - { - "pluginId": "reporting", - "scope": "server", - "docId": "kibReportingPluginApi", - "section": "def-server.ReportingSetup", - "text": "ReportingSetup" - } + ") => JSX.Element" ], - "path": "x-pack/plugins/reporting/server/plugin.ts", + "path": "x-pack/plugins/reporting/public/shared/get_shared_components.tsx", "deprecated": false, "children": [ { "parentPluginId": "reporting", - "id": "def-server.ReportingPlugin.start.$1", + "id": "def-public.ReportingPublicComponents.ReportingPanelPDFV2.$1", "type": "Object", "tags": [], - "label": "core", + "label": "props", "description": [], "signature": [ { - "pluginId": "core", - "scope": "server", - "docId": "kibCorePluginApi", - "section": "def-server.CoreStart", - "text": "CoreStart" + "pluginId": "reporting", + "scope": "public", + "docId": "kibReportingPluginApi", + "section": "def-public.ApplicationProps", + "text": "ApplicationProps" } ], - "path": "x-pack/plugins/reporting/server/plugin.ts", + "path": "x-pack/plugins/reporting/public/shared/get_shared_components.tsx", "deprecated": false, "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "reporting", + "id": "def-public.ReportingPublicComponents.ReportingPanelPNGV2", + "type": "Function", + "tags": [], + "label": "ReportingPanelPNGV2", + "description": [ + "\nAn element to display a form to export the page as PNG" + ], + "signature": [ + "(props: ", + { + "pluginId": "reporting", + "scope": "public", + "docId": "kibReportingPluginApi", + "section": "def-public.ApplicationProps", + "text": "ApplicationProps" }, + ") => JSX.Element" + ], + "path": "x-pack/plugins/reporting/public/shared/get_shared_components.tsx", + "deprecated": false, + "children": [ { "parentPluginId": "reporting", - "id": "def-server.ReportingPlugin.start.$2", + "id": "def-public.ReportingPublicComponents.ReportingPanelPNGV2.$1", "type": "Object", "tags": [], - "label": "plugins", + "label": "props", "description": [], "signature": [ { "pluginId": "reporting", - "scope": "server", + "scope": "public", "docId": "kibReportingPluginApi", - "section": "def-server.ReportingStartDeps", - "text": "ReportingStartDeps" + "section": "def-public.ApplicationProps", + "text": "ApplicationProps" } ], - "path": "x-pack/plugins/reporting/server/plugin.ts", + "path": "x-pack/plugins/reporting/public/shared/get_shared_components.tsx", "deprecated": false, "isRequired": true } @@ -293,133 +256,195 @@ "initialIsOpen": false } ], + "enums": [], + "misc": [], + "objects": [], + "start": { + "parentPluginId": "reporting", + "id": "def-public.ReportingStart", + "type": "Type", + "tags": [], + "label": "ReportingStart", + "description": [ + "\nStart contract for the Reporting plugin." + ], + "signature": [ + { + "pluginId": "reporting", + "scope": "public", + "docId": "kibReportingPluginApi", + "section": "def-public.ReportingSetup", + "text": "ReportingSetup" + } + ], + "path": "x-pack/plugins/reporting/public/index.ts", + "deprecated": false, + "lifecycle": "start", + "initialIsOpen": true + } + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [], + "start": { + "parentPluginId": "reporting", + "id": "def-server.ReportingStart", + "type": "Type", + "tags": [], + "label": "ReportingStart", + "description": [ + "\nPlugin Start Contract" + ], + "signature": [ + { + "pluginId": "reporting", + "scope": "server", + "docId": "kibReportingPluginApi", + "section": "def-server.ReportingSetup", + "text": "ReportingSetup" + } + ], + "path": "x-pack/plugins/reporting/server/types.ts", + "deprecated": false, + "lifecycle": "start", + "initialIsOpen": true + } + }, + "common": { + "classes": [], "functions": [], "interfaces": [ { "parentPluginId": "reporting", - "id": "def-server.ReportingSetupDeps", + "id": "def-common.BasePayload", "type": "Interface", - "tags": [], - "label": "ReportingSetupDeps", + "tags": [ + "deprecated" + ], + "label": "BasePayload", "description": [], - "path": "x-pack/plugins/reporting/server/types.ts", - "deprecated": false, + "signature": [ + { + "pluginId": "reporting", + "scope": "common", + "docId": "kibReportingPluginApi", + "section": "def-common.BasePayload", + "text": "BasePayload" + }, + " extends { layout?: { id?: string | undefined; dimensions?: { width: number; height: number; } | undefined; selectors?: Partial<", + "LayoutSelectorDictionary", + "> | undefined; zoom?: number | undefined; } | undefined; objectType: string; title: string; browserTimezone: string; version: string; }" + ], + "path": "x-pack/plugins/reporting/common/types/base.ts", + "deprecated": true, + "references": [], "children": [ { "parentPluginId": "reporting", - "id": "def-server.ReportingSetupDeps.features", - "type": "Object", + "id": "def-common.BasePayload.headers", + "type": "string", "tags": [], - "label": "features", + "label": "headers", "description": [], - "signature": [ - { - "pluginId": "features", - "scope": "server", - "docId": "kibFeaturesPluginApi", - "section": "def-server.PluginSetupContract", - "text": "PluginSetupContract" - } - ], - "path": "x-pack/plugins/reporting/server/types.ts", + "path": "x-pack/plugins/reporting/common/types/base.ts", "deprecated": false }, { "parentPluginId": "reporting", - "id": "def-server.ReportingSetupDeps.screenshotMode", - "type": "Object", + "id": "def-common.BasePayload.spaceId", + "type": "string", "tags": [], - "label": "screenshotMode", + "label": "spaceId", "description": [], "signature": [ - { - "pluginId": "screenshotMode", - "scope": "server", - "docId": "kibScreenshotModePluginApi", - "section": "def-server.ScreenshotModePluginSetup", - "text": "ScreenshotModePluginSetup" - } + "string | undefined" ], - "path": "x-pack/plugins/reporting/server/types.ts", + "path": "x-pack/plugins/reporting/common/types/base.ts", "deprecated": false }, { "parentPluginId": "reporting", - "id": "def-server.ReportingSetupDeps.security", - "type": "Object", + "id": "def-common.BasePayload.isDeprecated", + "type": "CompoundType", "tags": [], - "label": "security", + "label": "isDeprecated", "description": [], "signature": [ - { - "pluginId": "security", - "scope": "server", - "docId": "kibSecurityPluginApi", - "section": "def-server.SecurityPluginSetup", - "text": "SecurityPluginSetup" - }, - " | undefined" + "boolean | undefined" ], - "path": "x-pack/plugins/reporting/server/types.ts", + "path": "x-pack/plugins/reporting/common/types/base.ts", "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "reporting", + "id": "def-common.BasePayloadV2", + "type": "Interface", + "tags": [], + "label": "BasePayloadV2", + "description": [ + "\nReport job parameters, after they are processed in the request handler." + ], + "signature": [ + { + "pluginId": "reporting", + "scope": "common", + "docId": "kibReportingPluginApi", + "section": "def-common.BasePayloadV2", + "text": "BasePayloadV2" }, + " extends ", + { + "pluginId": "reporting", + "scope": "common", + "docId": "kibReportingPluginApi", + "section": "def-common.BaseParamsV2", + "text": "BaseParamsV2" + } + ], + "path": "x-pack/plugins/reporting/common/types/base.ts", + "deprecated": false, + "children": [ { "parentPluginId": "reporting", - "id": "def-server.ReportingSetupDeps.spaces", - "type": "Object", + "id": "def-common.BasePayloadV2.headers", + "type": "string", "tags": [], - "label": "spaces", + "label": "headers", "description": [], - "signature": [ - { - "pluginId": "spaces", - "scope": "server", - "docId": "kibSpacesPluginApi", - "section": "def-server.SpacesPluginSetup", - "text": "SpacesPluginSetup" - }, - " | undefined" - ], - "path": "x-pack/plugins/reporting/server/types.ts", + "path": "x-pack/plugins/reporting/common/types/base.ts", "deprecated": false }, { "parentPluginId": "reporting", - "id": "def-server.ReportingSetupDeps.taskManager", - "type": "Object", + "id": "def-common.BasePayloadV2.spaceId", + "type": "string", "tags": [], - "label": "taskManager", + "label": "spaceId", "description": [], "signature": [ - { - "pluginId": "taskManager", - "scope": "server", - "docId": "kibTaskManagerPluginApi", - "section": "def-server.TaskManagerSetupContract", - "text": "TaskManagerSetupContract" - } + "string | undefined" ], - "path": "x-pack/plugins/reporting/server/types.ts", + "path": "x-pack/plugins/reporting/common/types/base.ts", "deprecated": false }, { "parentPluginId": "reporting", - "id": "def-server.ReportingSetupDeps.usageCollection", - "type": "Object", + "id": "def-common.BasePayloadV2.isDeprecated", + "type": "CompoundType", "tags": [], - "label": "usageCollection", + "label": "isDeprecated", "description": [], "signature": [ - { - "pluginId": "usageCollection", - "scope": "server", - "docId": "kibUsageCollectionPluginApi", - "section": "def-server.UsageCollectionSetup", - "text": "UsageCollectionSetup" - }, - " | undefined" + "boolean | undefined" ], - "path": "x-pack/plugins/reporting/server/types.ts", + "path": "x-pack/plugins/reporting/common/types/base.ts", "deprecated": false } ], @@ -427,170 +452,160 @@ }, { "parentPluginId": "reporting", - "id": "def-server.ReportingStartDeps", + "id": "def-common.LocatorParams", "type": "Interface", "tags": [], - "label": "ReportingStartDeps", + "label": "LocatorParams", "description": [], - "path": "x-pack/plugins/reporting/server/types.ts", + "signature": [ + { + "pluginId": "reporting", + "scope": "common", + "docId": "kibReportingPluginApi", + "section": "def-common.LocatorParams", + "text": "LocatorParams" + }, + "

" + ], + "path": "x-pack/plugins/reporting/common/types/url.ts", "deprecated": false, "children": [ { "parentPluginId": "reporting", - "id": "def-server.ReportingStartDeps.data", - "type": "Object", + "id": "def-common.LocatorParams.id", + "type": "string", "tags": [], - "label": "data", + "label": "id", "description": [], - "signature": [ - { - "pluginId": "data", - "scope": "server", - "docId": "kibDataPluginApi", - "section": "def-server.DataPluginStart", - "text": "DataPluginStart" - } - ], - "path": "x-pack/plugins/reporting/server/types.ts", + "path": "x-pack/plugins/reporting/common/types/url.ts", "deprecated": false }, { "parentPluginId": "reporting", - "id": "def-server.ReportingStartDeps.fieldFormats", - "type": "Object", + "id": "def-common.LocatorParams.version", + "type": "string", "tags": [], - "label": "fieldFormats", - "description": [], - "signature": [ - { - "pluginId": "fieldFormats", - "scope": "server", - "docId": "kibFieldFormatsPluginApi", - "section": "def-server.FieldFormatsStart", - "text": "FieldFormatsStart" - } + "label": "version", + "description": [ + "\nKibana version used to create the params" ], - "path": "x-pack/plugins/reporting/server/types.ts", + "path": "x-pack/plugins/reporting/common/types/url.ts", "deprecated": false }, { "parentPluginId": "reporting", - "id": "def-server.ReportingStartDeps.licensing", - "type": "Object", + "id": "def-common.LocatorParams.params", + "type": "Uncategorized", "tags": [], - "label": "licensing", - "description": [], - "signature": [ - { - "pluginId": "licensing", - "scope": "server", - "docId": "kibLicensingPluginApi", - "section": "def-server.LicensingPluginStart", - "text": "LicensingPluginStart" - } + "label": "params", + "description": [ + "\nData to recreate the user's state in the application" ], - "path": "x-pack/plugins/reporting/server/types.ts", - "deprecated": false - }, - { - "parentPluginId": "reporting", - "id": "def-server.ReportingStartDeps.screenshotting", - "type": "Object", - "tags": [], - "label": "screenshotting", - "description": [], "signature": [ - { - "pluginId": "screenshotting", - "scope": "server", - "docId": "kibScreenshottingPluginApi", - "section": "def-server.ScreenshottingStart", - "text": "ScreenshottingStart" - } + "P" ], - "path": "x-pack/plugins/reporting/server/types.ts", + "path": "x-pack/plugins/reporting/common/types/url.ts", "deprecated": false - }, + } + ], + "initialIsOpen": false + } + ], + "enums": [], + "misc": [ + { + "parentPluginId": "reporting", + "id": "def-common.BaseParams", + "type": "Type", + "tags": [ + "deprecated" + ], + "label": "BaseParams", + "description": [], + "signature": [ + "{ layout?: { id?: string | undefined; dimensions?: { width: number; height: number; } | undefined; selectors?: Partial<", + "LayoutSelectorDictionary", + "> | undefined; zoom?: number | undefined; } | undefined; objectType: string; title: string; browserTimezone: string; version: string; }" + ], + "path": "x-pack/plugins/reporting/common/types/base.ts", + "deprecated": true, + "references": [], + "initialIsOpen": false + }, + { + "parentPluginId": "reporting", + "id": "def-common.BaseParamsV2", + "type": "Type", + "tags": [], + "label": "BaseParamsV2", + "description": [ + "\nReport job parameters that an application must return from its\ngetSharingData function." + ], + "signature": [ + "{ layout?: { id?: string | undefined; dimensions?: { width: number; height: number; } | undefined; selectors?: Partial<", + "LayoutSelectorDictionary", + "> | undefined; zoom?: number | undefined; } | undefined; objectType: string; title: string; browserTimezone: string; version: string; } & { locatorParams: ", { - "parentPluginId": "reporting", - "id": "def-server.ReportingStartDeps.security", - "type": "Object", - "tags": [], - "label": "security", - "description": [], - "signature": [ - { - "pluginId": "security", - "scope": "server", - "docId": "kibSecurityPluginApi", - "section": "def-server.SecurityPluginStart", - "text": "SecurityPluginStart" - }, - " | undefined" - ], - "path": "x-pack/plugins/reporting/server/types.ts", - "deprecated": false + "pluginId": "reporting", + "scope": "common", + "docId": "kibReportingPluginApi", + "section": "def-common.LocatorParams", + "text": "LocatorParams" }, + "<", + "SerializableRecord", + ">[]; }" + ], + "path": "x-pack/plugins/reporting/common/types/base.ts", + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "reporting", + "id": "def-common.JobAppParamsPDF", + "type": "Type", + "tags": [ + "deprecated" + ], + "label": "JobAppParamsPDF", + "description": [], + "signature": [ + "{ title: string; layout: { id?: string | undefined; dimensions?: { width: number; height: number; } | undefined; selectors?: Partial<", + "LayoutSelectorDictionary", + "> | undefined; zoom?: number | undefined; }; objectType: string; relativeUrls: string[]; isDeprecated?: boolean | undefined; }" + ], + "path": "x-pack/plugins/reporting/common/types/export_types/printable_pdf.ts", + "deprecated": true, + "references": [], + "initialIsOpen": false + }, + { + "parentPluginId": "reporting", + "id": "def-common.JobAppParamsPDFV2", + "type": "Type", + "tags": [], + "label": "JobAppParamsPDFV2", + "description": [], + "signature": [ + "{ title: string; layout: { id?: string | undefined; dimensions?: { width: number; height: number; } | undefined; selectors?: Partial<", + "LayoutSelectorDictionary", + "> | undefined; zoom?: number | undefined; }; objectType: string; locatorParams: ", { - "parentPluginId": "reporting", - "id": "def-server.ReportingStartDeps.taskManager", - "type": "CompoundType", - "tags": [], - "label": "taskManager", - "description": [], - "signature": [ - "Pick<", - "TaskScheduling", - ", \"schedule\" | \"runNow\" | \"ephemeralRunNow\" | \"ensureScheduled\"> & Pick<", - "TaskStore", - ", \"remove\" | \"fetch\" | \"get\"> & { removeIfExists: (id: string) => Promise; } & { supportsEphemeralTasks: () => boolean; }" - ], - "path": "x-pack/plugins/reporting/server/types.ts", - "deprecated": false - } + "pluginId": "reporting", + "scope": "common", + "docId": "kibReportingPluginApi", + "section": "def-common.LocatorParams", + "text": "LocatorParams" + }, + "<", + "SerializableRecord", + ">[]; }" ], + "path": "x-pack/plugins/reporting/common/types/export_types/printable_pdf_v2.ts", + "deprecated": false, "initialIsOpen": false } ], - "enums": [], - "misc": [], - "objects": [], - "start": { - "parentPluginId": "reporting", - "id": "def-server.ReportingSetup", - "type": "Interface", - "tags": [], - "label": "ReportingSetup", - "description": [], - "path": "x-pack/plugins/reporting/server/types.ts", - "deprecated": false, - "children": [ - { - "parentPluginId": "reporting", - "id": "def-server.ReportingSetup.usesUiCapabilities", - "type": "Function", - "tags": [], - "label": "usesUiCapabilities", - "description": [], - "signature": [ - "() => boolean" - ], - "path": "x-pack/plugins/reporting/server/types.ts", - "deprecated": false, - "children": [], - "returnComment": [] - } - ], - "lifecycle": "start", - "initialIsOpen": true - } - }, - "common": { - "classes": [], - "functions": [], - "interfaces": [], - "enums": [], - "misc": [], "objects": [] } } \ No newline at end of file diff --git a/api_docs/reporting.mdx b/api_docs/reporting.mdx index dc8d44f12f053..7c9910df59325 100644 --- a/api_docs/reporting.mdx +++ b/api_docs/reporting.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/reporting title: "reporting" image: https://source.unsplash.com/400x175/?github summary: API docs for the reporting plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'reporting'] warning: 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. --- @@ -18,21 +18,26 @@ Contact [Kibana Reporting Services](https://github.com/orgs/elastic/teams/kibana | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 29 | 0 | 29 | 0 | +| 36 | 0 | 16 | 0 | ## Client ### Start +### Interfaces + + ## Server ### Start -### Classes - +## Common ### Interfaces - + + +### Consts, variables and types + diff --git a/api_docs/rollup.mdx b/api_docs/rollup.mdx index 6d4e6d4174a7c..77265782f6aea 100644 --- a/api_docs/rollup.mdx +++ b/api_docs/rollup.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/rollup title: "rollup" image: https://source.unsplash.com/400x175/?github summary: API docs for the rollup plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'rollup'] warning: 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. --- diff --git a/api_docs/rule_registry.devdocs.json b/api_docs/rule_registry.devdocs.json index 78b9493cdc7f0..bf18fe6cf235b 100644 --- a/api_docs/rule_registry.devdocs.json +++ b/api_docs/rule_registry.devdocs.json @@ -102,7 +102,7 @@ "UpdateOptions", ") => Promise<{ _version: string | undefined; get?: ", "InlineGet", - ">> | undefined; _id: string; _index: string; _primary_term: number; result: ", + " | undefined; _id: string; _index: string; _primary_term: number; result: ", "Result", "; _seq_no: number; _shards: ", "ShardStatistics", @@ -148,14 +148,10 @@ " = never>({ ids, query, index, status, }: ", "BulkUpdateOptions", ") => Promise<", - "TransportResult", - "<", "BulkResponse", - ", unknown> | ", - "TransportResult", - "<", + " | ", "UpdateByQueryResponse", - ", unknown>>" + ">" ], "path": "x-pack/plugins/rule_registry/server/alert_data_client/alerts_client.ts", "deprecated": false, @@ -1424,7 +1420,7 @@ }, "; injectReferences: (params: TParams, references: ", "SavedObjectReference", - "[]) => TParams; } | undefined; isExportable: boolean; defaultScheduleInterval?: string | undefined; minimumScheduleInterval?: string | undefined; ruleTaskTimeout?: string | undefined; cancelAlertsOnRuleTimeout?: boolean | undefined; }" + "[]) => TParams; } | undefined; isExportable: boolean; defaultScheduleInterval?: string | undefined; minimumScheduleInterval?: string | undefined; ruleTaskTimeout?: string | undefined; cancelAlertsOnRuleTimeout?: boolean | undefined; doesSetRecoveryContext?: boolean | undefined; }" ], "path": "x-pack/plugins/rule_registry/server/utils/create_persistence_rule_type_wrapper.ts", "deprecated": false, @@ -2396,7 +2392,7 @@ "signature": [ "(request: ", "BulkRequest", - ") => Promise<", + ") => Promise<", "TransportResult", "<", "BulkResponse", @@ -2414,7 +2410,7 @@ "description": [], "signature": [ "BulkRequest", - "" + "" ], "path": "x-pack/plugins/rule_registry/server/rule_data_client/types.ts", "deprecated": false, @@ -3358,7 +3354,86 @@ ], "interfaces": [], "enums": [], - "misc": [], + "misc": [ + { + "parentPluginId": "ruleRegistry", + "id": "def-common.BASE_RAC_ALERTS_API_PATH", + "type": "string", + "tags": [], + "label": "BASE_RAC_ALERTS_API_PATH", + "description": [], + "signature": [ + "\"/internal/rac/alerts\"" + ], + "path": "x-pack/plugins/rule_registry/common/constants.ts", + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "ruleRegistry", + "id": "def-common.ParsedTechnicalFields", + "type": "Type", + "tags": [], + "label": "ParsedTechnicalFields", + "description": [], + "signature": [ + "{ readonly '@timestamp': string; readonly \"kibana.alert.rule.rule_type_id\": string; readonly \"kibana.alert.rule.consumer\": string; readonly \"kibana.alert.rule.producer\": string; readonly \"kibana.space_ids\": string[]; readonly \"kibana.alert.uuid\": string; readonly \"kibana.alert.status\": string; readonly \"kibana.alert.rule.category\": string; readonly \"kibana.alert.rule.uuid\": string; readonly \"kibana.alert.rule.name\": string; readonly tags?: string[] | undefined; readonly 'event.action'?: string | undefined; readonly \"kibana.alert.rule.parameters\"?: { [key: string]: unknown; } | undefined; readonly \"kibana.alert.start\"?: string | undefined; readonly \"kibana.alert.end\"?: string | undefined; readonly \"kibana.alert.duration.us\"?: number | undefined; readonly \"kibana.alert.severity\"?: string | undefined; readonly \"kibana.version\"?: string | undefined; readonly \"ecs.version\"?: string | undefined; readonly \"kibana.alert.risk_score\"?: number | undefined; readonly \"kibana.alert.workflow_status\"?: string | undefined; readonly \"kibana.alert.workflow_user\"?: string | undefined; readonly \"kibana.alert.workflow_reason\"?: string | undefined; readonly \"kibana.alert.system_status\"?: string | undefined; readonly \"kibana.alert.action_group\"?: string | undefined; readonly \"kibana.alert.reason\"?: string | undefined; readonly \"kibana.alert.rule.author\"?: string | undefined; readonly \"kibana.alert.rule.created_at\"?: string | undefined; readonly \"kibana.alert.rule.created_by\"?: string | undefined; readonly \"kibana.alert.rule.description\"?: string | undefined; readonly \"kibana.alert.rule.enabled\"?: string | undefined; readonly \"kibana.alert.rule.execution.uuid\"?: string | undefined; readonly \"kibana.alert.rule.from\"?: string | undefined; readonly \"kibana.alert.rule.interval\"?: string | undefined; readonly \"kibana.alert.rule.license\"?: string | undefined; readonly \"kibana.alert.rule.note\"?: string | undefined; readonly \"kibana.alert.rule.references\"?: string[] | undefined; readonly \"kibana.alert.rule.rule_id\"?: string | undefined; readonly \"kibana.alert.rule.rule_name_override\"?: string | undefined; readonly \"kibana.alert.rule.tags\"?: string[] | undefined; readonly \"kibana.alert.rule.to\"?: string | undefined; readonly \"kibana.alert.rule.type\"?: string | undefined; readonly \"kibana.alert.rule.updated_at\"?: string | undefined; readonly \"kibana.alert.rule.updated_by\"?: string | undefined; readonly \"kibana.alert.rule.version\"?: string | undefined; readonly 'event.kind'?: string | undefined; }" + ], + "path": "x-pack/plugins/rule_registry/common/parse_technical_fields.ts", + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "ruleRegistry", + "id": "def-common.RuleRegistrySearchRequest", + "type": "Type", + "tags": [], + "label": "RuleRegistrySearchRequest", + "description": [], + "signature": [ + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.IEsSearchRequest", + "text": "IEsSearchRequest" + }, + " & { featureIds: ", + "AlertConsumers", + "[]; query?: { bool: ", + "QueryDslBoolQuery", + "; } | undefined; }" + ], + "path": "x-pack/plugins/rule_registry/common/search_strategy/index.ts", + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "ruleRegistry", + "id": "def-common.RuleRegistrySearchResponse", + "type": "Type", + "tags": [], + "label": "RuleRegistrySearchResponse", + "description": [], + "signature": [ + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.IKibanaSearchResponse", + "text": "IKibanaSearchResponse" + }, + "<", + "SearchResponse", + ">>" + ], + "path": "x-pack/plugins/rule_registry/common/search_strategy/index.ts", + "deprecated": false, + "initialIsOpen": false + } + ], "objects": [] } } \ No newline at end of file diff --git a/api_docs/rule_registry.mdx b/api_docs/rule_registry.mdx index 1b5a31be87f0e..ceaafbcfd53fc 100644 --- a/api_docs/rule_registry.mdx +++ b/api_docs/rule_registry.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/ruleRegistry title: "ruleRegistry" image: https://source.unsplash.com/400x175/?github summary: API docs for the ruleRegistry plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ruleRegistry'] warning: 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. --- @@ -18,7 +18,7 @@ Contact [RAC](https://github.com/orgs/elastic/teams/rac) for questions regarding | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 177 | 0 | 150 | 7 | +| 181 | 0 | 154 | 7 | ## Server @@ -51,3 +51,6 @@ Contact [RAC](https://github.com/orgs/elastic/teams/rac) for questions regarding ### Functions +### Consts, variables and types + + diff --git a/api_docs/runtime_fields.mdx b/api_docs/runtime_fields.mdx index 2310c4e8b845d..62d32f4377d87 100644 --- a/api_docs/runtime_fields.mdx +++ b/api_docs/runtime_fields.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/runtimeFields title: "runtimeFields" image: https://source.unsplash.com/400x175/?github summary: API docs for the runtimeFields plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'runtimeFields'] warning: 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. --- diff --git a/api_docs/saved_objects.mdx b/api_docs/saved_objects.mdx index 2f459203940f2..c59b8a3a0b912 100644 --- a/api_docs/saved_objects.mdx +++ b/api_docs/saved_objects.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/savedObjects title: "savedObjects" image: https://source.unsplash.com/400x175/?github summary: API docs for the savedObjects plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjects'] warning: 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. --- diff --git a/api_docs/saved_objects_management.mdx b/api_docs/saved_objects_management.mdx index 3682bce8aa36c..cbca46895104e 100644 --- a/api_docs/saved_objects_management.mdx +++ b/api_docs/saved_objects_management.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/savedObjectsManagement title: "savedObjectsManagement" image: https://source.unsplash.com/400x175/?github summary: API docs for the savedObjectsManagement plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsManagement'] warning: 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. --- diff --git a/api_docs/saved_objects_tagging.mdx b/api_docs/saved_objects_tagging.mdx index 64e3375dd0071..0a319ced3e08c 100644 --- a/api_docs/saved_objects_tagging.mdx +++ b/api_docs/saved_objects_tagging.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/savedObjectsTagging title: "savedObjectsTagging" image: https://source.unsplash.com/400x175/?github summary: API docs for the savedObjectsTagging plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTagging'] warning: 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. --- diff --git a/api_docs/saved_objects_tagging_oss.mdx b/api_docs/saved_objects_tagging_oss.mdx index 061ec8cb2d4e1..19d7dcaf1b284 100644 --- a/api_docs/saved_objects_tagging_oss.mdx +++ b/api_docs/saved_objects_tagging_oss.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/savedObjectsTaggingOss title: "savedObjectsTaggingOss" image: https://source.unsplash.com/400x175/?github summary: API docs for the savedObjectsTaggingOss plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTaggingOss'] warning: 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. --- diff --git a/api_docs/screenshot_mode.mdx b/api_docs/screenshot_mode.mdx index f59458fcd467c..e1d2c1f8f13db 100644 --- a/api_docs/screenshot_mode.mdx +++ b/api_docs/screenshot_mode.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/screenshotMode title: "screenshotMode" image: https://source.unsplash.com/400x175/?github summary: API docs for the screenshotMode plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotMode'] warning: 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. --- diff --git a/api_docs/screenshotting.devdocs.json b/api_docs/screenshotting.devdocs.json index 901ed0e503f1f..686b42fa6fcfa 100644 --- a/api_docs/screenshotting.devdocs.json +++ b/api_docs/screenshotting.devdocs.json @@ -47,6 +47,28 @@ ], "path": "x-pack/plugins/screenshotting/server/screenshots/index.ts", "deprecated": false + }, + { + "parentPluginId": "screenshotting", + "id": "def-server.ScreenshotOptions.request", + "type": "Object", + "tags": [], + "label": "request", + "description": [ + "\nSource Kibana request object from where the headers will be extracted." + ], + "signature": [ + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreHttpPluginApi", + "section": "def-server.KibanaRequest", + "text": "KibanaRequest" + }, + " | undefined" + ], + "path": "x-pack/plugins/screenshotting/server/screenshots/index.ts", + "deprecated": false } ], "initialIsOpen": false @@ -79,18 +101,16 @@ }, { "parentPluginId": "screenshotting", - "id": "def-server.ScreenshotResult.metrics$", + "id": "def-server.ScreenshotResult.metrics", "type": "Object", "tags": [], - "label": "metrics$", + "label": "metrics", "description": [ "\nCollected performance metrics during the screenshotting session." ], "signature": [ - "Observable", - "<", "PerformanceMetrics", - ">" + " | undefined" ], "path": "x-pack/plugins/screenshotting/server/screenshots/index.ts", "deprecated": false diff --git a/api_docs/screenshotting.mdx b/api_docs/screenshotting.mdx index 238fe8da05edb..7225ea68d75a2 100644 --- a/api_docs/screenshotting.mdx +++ b/api_docs/screenshotting.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/screenshotting title: "screenshotting" image: https://source.unsplash.com/400x175/?github summary: API docs for the screenshotting plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotting'] warning: 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. --- @@ -18,7 +18,7 @@ Contact [Kibana Reporting Services](https://github.com/orgs/elastic/teams/kibana | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 17 | 0 | 8 | 5 | +| 18 | 0 | 8 | 5 | ## Server diff --git a/api_docs/security.mdx b/api_docs/security.mdx index 467d61cc2c66d..327961afb0c23 100644 --- a/api_docs/security.mdx +++ b/api_docs/security.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/security title: "security" image: https://source.unsplash.com/400x175/?github summary: API docs for the security plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'security'] warning: 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. --- diff --git a/api_docs/security_solution.devdocs.json b/api_docs/security_solution.devdocs.json index f077b298d7c67..21a9c7aa21836 100644 --- a/api_docs/security_solution.devdocs.json +++ b/api_docs/security_solution.devdocs.json @@ -62,7 +62,7 @@ "label": "experimentalFeatures", "description": [], "signature": [ - "{ readonly metricsEntitiesEnabled: boolean; readonly ruleRegistryEnabled: boolean; readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly usersEnabled: boolean; readonly disableIsolationUIPendingStatuses: boolean; readonly riskyHostsEnabled: boolean; readonly securityRulesCancelEnabled: boolean; readonly pendingActionResponsesWithAck: boolean; readonly rulesBulkEditEnabled: boolean; readonly policyListEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; }" + "{ readonly metricsEntitiesEnabled: boolean; readonly ruleRegistryEnabled: boolean; readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly usersEnabled: boolean; readonly disableIsolationUIPendingStatuses: boolean; readonly riskyHostsEnabled: boolean; readonly securityRulesCancelEnabled: boolean; readonly pendingActionResponsesWithAck: boolean; readonly policyListEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; }" ], "path": "x-pack/plugins/security_solution/public/plugin.tsx", "deprecated": false @@ -887,7 +887,7 @@ "label": "ConfigType", "description": [], "signature": [ - "Readonly<{} & { signalsIndex: string; maxRuleImportExportSize: number; maxRuleImportPayloadBytes: number; maxTimelineImportExportSize: number; maxTimelineImportPayloadBytes: number; alertMergeStrategy: \"allFields\" | \"missingFields\" | \"noFields\"; alertIgnoreFields: string[]; enableExperimental: string[]; packagerTaskInterval: string; prebuiltRulesFromFileSystem: boolean; prebuiltRulesFromSavedObjects: boolean; }> & { experimentalFeatures: Readonly<{ metricsEntitiesEnabled: boolean; ruleRegistryEnabled: boolean; tGridEnabled: boolean; tGridEventRenderedViewEnabled: boolean; excludePoliciesInFilterEnabled: boolean; usersEnabled: boolean; disableIsolationUIPendingStatuses: boolean; riskyHostsEnabled: boolean; securityRulesCancelEnabled: boolean; pendingActionResponsesWithAck: boolean; rulesBulkEditEnabled: boolean; policyListEnabled: boolean; previewTelemetryUrlEnabled: boolean; }>; }" + "Readonly<{} & { signalsIndex: string; maxRuleImportExportSize: number; maxRuleImportPayloadBytes: number; maxTimelineImportExportSize: number; maxTimelineImportPayloadBytes: number; alertMergeStrategy: \"allFields\" | \"missingFields\" | \"noFields\"; alertIgnoreFields: string[]; enableExperimental: string[]; packagerTaskInterval: string; prebuiltRulesFromFileSystem: boolean; prebuiltRulesFromSavedObjects: boolean; }> & { experimentalFeatures: Readonly<{ metricsEntitiesEnabled: boolean; ruleRegistryEnabled: boolean; tGridEnabled: boolean; tGridEventRenderedViewEnabled: boolean; excludePoliciesInFilterEnabled: boolean; usersEnabled: boolean; disableIsolationUIPendingStatuses: boolean; riskyHostsEnabled: boolean; securityRulesCancelEnabled: boolean; pendingActionResponsesWithAck: boolean; policyListEnabled: boolean; previewTelemetryUrlEnabled: boolean; }>; }" ], "path": "x-pack/plugins/security_solution/server/config.ts", "deprecated": false, diff --git a/api_docs/security_solution.mdx b/api_docs/security_solution.mdx index b7544d9b0750e..65ce31d2f969c 100644 --- a/api_docs/security_solution.mdx +++ b/api_docs/security_solution.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/securitySolution title: "securitySolution" image: https://source.unsplash.com/400x175/?github summary: API docs for the securitySolution plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolution'] warning: 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. --- diff --git a/api_docs/share.devdocs.json b/api_docs/share.devdocs.json index a85ad1a605548..9733101e0dd11 100644 --- a/api_docs/share.devdocs.json +++ b/api_docs/share.devdocs.json @@ -1,164 +1,7 @@ { "id": "share", "client": { - "classes": [ - { - "parentPluginId": "share", - "id": "def-public.UrlGeneratorsService", - "type": "Class", - "tags": [], - "label": "UrlGeneratorsService", - "description": [], - "signature": [ - { - "pluginId": "share", - "scope": "public", - "docId": "kibSharePluginApi", - "section": "def-public.UrlGeneratorsService", - "text": "UrlGeneratorsService" - }, - " implements ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Plugin", - "text": "Plugin" - }, - "<", - "UrlGeneratorsSetup", - ", ", - "UrlGeneratorsStart", - ", object, object>" - ], - "path": "src/plugins/share/public/url_generators/url_generator_service.ts", - "deprecated": false, - "children": [ - { - "parentPluginId": "share", - "id": "def-public.UrlGeneratorsService.Unnamed", - "type": "Function", - "tags": [], - "label": "Constructor", - "description": [], - "signature": [ - "any" - ], - "path": "src/plugins/share/public/url_generators/url_generator_service.ts", - "deprecated": false, - "children": [], - "returnComment": [] - }, - { - "parentPluginId": "share", - "id": "def-public.UrlGeneratorsService.setup", - "type": "Function", - "tags": [], - "label": "setup", - "description": [], - "signature": [ - "(core: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.CoreSetup", - "text": "CoreSetup" - }, - ") => ", - "UrlGeneratorsSetup" - ], - "path": "src/plugins/share/public/url_generators/url_generator_service.ts", - "deprecated": false, - "children": [ - { - "parentPluginId": "share", - "id": "def-public.UrlGeneratorsService.setup.$1", - "type": "Object", - "tags": [], - "label": "core", - "description": [], - "signature": [ - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.CoreSetup", - "text": "CoreSetup" - }, - "" - ], - "path": "src/plugins/share/public/url_generators/url_generator_service.ts", - "deprecated": false, - "isRequired": true - } - ], - "returnComment": [] - }, - { - "parentPluginId": "share", - "id": "def-public.UrlGeneratorsService.start", - "type": "Function", - "tags": [], - "label": "start", - "description": [], - "signature": [ - "(core: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.CoreStart", - "text": "CoreStart" - }, - ") => ", - "UrlGeneratorsStart" - ], - "path": "src/plugins/share/public/url_generators/url_generator_service.ts", - "deprecated": false, - "children": [ - { - "parentPluginId": "share", - "id": "def-public.UrlGeneratorsService.start.$1", - "type": "Object", - "tags": [], - "label": "core", - "description": [], - "signature": [ - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.CoreStart", - "text": "CoreStart" - } - ], - "path": "src/plugins/share/public/url_generators/url_generator_service.ts", - "deprecated": false, - "isRequired": true - } - ], - "returnComment": [] - }, - { - "parentPluginId": "share", - "id": "def-public.UrlGeneratorsService.stop", - "type": "Function", - "tags": [], - "label": "stop", - "description": [], - "signature": [ - "() => void" - ], - "path": "src/plugins/share/public/url_generators/url_generator_service.ts", - "deprecated": false, - "children": [], - "returnComment": [] - } - ], - "initialIsOpen": false - } - ], + "classes": [], "functions": [ { "parentPluginId": "share", @@ -1287,348 +1130,6 @@ } ], "initialIsOpen": false - }, - { - "parentPluginId": "share", - "id": "def-public.UrlGeneratorContract", - "type": "Interface", - "tags": [], - "label": "UrlGeneratorContract", - "description": [], - "signature": [ - { - "pluginId": "share", - "scope": "public", - "docId": "kibSharePluginApi", - "section": "def-public.UrlGeneratorContract", - "text": "UrlGeneratorContract" - }, - "" - ], - "path": "src/plugins/share/public/url_generators/url_generator_contract.ts", - "deprecated": false, - "children": [ - { - "parentPluginId": "share", - "id": "def-public.UrlGeneratorContract.id", - "type": "Uncategorized", - "tags": [], - "label": "id", - "description": [], - "signature": [ - "Id" - ], - "path": "src/plugins/share/public/url_generators/url_generator_contract.ts", - "deprecated": false - }, - { - "parentPluginId": "share", - "id": "def-public.UrlGeneratorContract.createUrl", - "type": "Function", - "tags": [], - "label": "createUrl", - "description": [], - "signature": [ - "(state: ", - { - "pluginId": "share", - "scope": "public", - "docId": "kibSharePluginApi", - "section": "def-public.UrlGeneratorStateMapping", - "text": "UrlGeneratorStateMapping" - }, - "[Id][\"State\"]) => Promise" - ], - "path": "src/plugins/share/public/url_generators/url_generator_contract.ts", - "deprecated": false, - "children": [ - { - "parentPluginId": "share", - "id": "def-public.UrlGeneratorContract.createUrl.$1", - "type": "Uncategorized", - "tags": [], - "label": "state", - "description": [], - "signature": [ - { - "pluginId": "share", - "scope": "public", - "docId": "kibSharePluginApi", - "section": "def-public.UrlGeneratorStateMapping", - "text": "UrlGeneratorStateMapping" - }, - "[Id][\"State\"]" - ], - "path": "src/plugins/share/public/url_generators/url_generator_contract.ts", - "deprecated": false, - "isRequired": true - } - ], - "returnComment": [] - }, - { - "parentPluginId": "share", - "id": "def-public.UrlGeneratorContract.isDeprecated", - "type": "boolean", - "tags": [], - "label": "isDeprecated", - "description": [], - "path": "src/plugins/share/public/url_generators/url_generator_contract.ts", - "deprecated": false - } - ], - "initialIsOpen": false - }, - { - "parentPluginId": "share", - "id": "def-public.UrlGeneratorsDefinition", - "type": "Interface", - "tags": [], - "label": "UrlGeneratorsDefinition", - "description": [], - "signature": [ - { - "pluginId": "share", - "scope": "public", - "docId": "kibSharePluginApi", - "section": "def-public.UrlGeneratorsDefinition", - "text": "UrlGeneratorsDefinition" - }, - "" - ], - "path": "src/plugins/share/public/url_generators/url_generator_definition.ts", - "deprecated": false, - "children": [ - { - "parentPluginId": "share", - "id": "def-public.UrlGeneratorsDefinition.id", - "type": "Uncategorized", - "tags": [], - "label": "id", - "description": [], - "signature": [ - "Id" - ], - "path": "src/plugins/share/public/url_generators/url_generator_definition.ts", - "deprecated": false - }, - { - "parentPluginId": "share", - "id": "def-public.UrlGeneratorsDefinition.createUrl", - "type": "Function", - "tags": [], - "label": "createUrl", - "description": [], - "signature": [ - "((state: ", - { - "pluginId": "share", - "scope": "public", - "docId": "kibSharePluginApi", - "section": "def-public.UrlGeneratorStateMapping", - "text": "UrlGeneratorStateMapping" - }, - "[Id][\"State\"]) => Promise) | undefined" - ], - "path": "src/plugins/share/public/url_generators/url_generator_definition.ts", - "deprecated": false, - "children": [ - { - "parentPluginId": "share", - "id": "def-public.UrlGeneratorsDefinition.createUrl.$1", - "type": "Uncategorized", - "tags": [], - "label": "state", - "description": [], - "signature": [ - { - "pluginId": "share", - "scope": "public", - "docId": "kibSharePluginApi", - "section": "def-public.UrlGeneratorStateMapping", - "text": "UrlGeneratorStateMapping" - }, - "[Id][\"State\"]" - ], - "path": "src/plugins/share/public/url_generators/url_generator_definition.ts", - "deprecated": false, - "isRequired": true - } - ], - "returnComment": [] - }, - { - "parentPluginId": "share", - "id": "def-public.UrlGeneratorsDefinition.isDeprecated", - "type": "CompoundType", - "tags": [], - "label": "isDeprecated", - "description": [], - "signature": [ - "boolean | undefined" - ], - "path": "src/plugins/share/public/url_generators/url_generator_definition.ts", - "deprecated": false - }, - { - "parentPluginId": "share", - "id": "def-public.UrlGeneratorsDefinition.migrate", - "type": "Function", - "tags": [], - "label": "migrate", - "description": [], - "signature": [ - "((state: ", - { - "pluginId": "share", - "scope": "public", - "docId": "kibSharePluginApi", - "section": "def-public.UrlGeneratorStateMapping", - "text": "UrlGeneratorStateMapping" - }, - "[Id][\"State\"]) => Promise<{ state: ", - { - "pluginId": "share", - "scope": "public", - "docId": "kibSharePluginApi", - "section": "def-public.UrlGeneratorStateMapping", - "text": "UrlGeneratorStateMapping" - }, - "[Id][\"MigratedState\"]; id: ", - { - "pluginId": "share", - "scope": "public", - "docId": "kibSharePluginApi", - "section": "def-public.UrlGeneratorStateMapping", - "text": "UrlGeneratorStateMapping" - }, - "[Id][\"MigratedId\"]; }>) | undefined" - ], - "path": "src/plugins/share/public/url_generators/url_generator_definition.ts", - "deprecated": false, - "children": [ - { - "parentPluginId": "share", - "id": "def-public.UrlGeneratorsDefinition.migrate.$1", - "type": "Uncategorized", - "tags": [], - "label": "state", - "description": [], - "signature": [ - { - "pluginId": "share", - "scope": "public", - "docId": "kibSharePluginApi", - "section": "def-public.UrlGeneratorStateMapping", - "text": "UrlGeneratorStateMapping" - }, - "[Id][\"State\"]" - ], - "path": "src/plugins/share/public/url_generators/url_generator_definition.ts", - "deprecated": false, - "isRequired": true - } - ], - "returnComment": [] - } - ], - "initialIsOpen": false - }, - { - "parentPluginId": "share", - "id": "def-public.UrlGeneratorState", - "type": "Interface", - "tags": [], - "label": "UrlGeneratorState", - "description": [], - "signature": [ - { - "pluginId": "share", - "scope": "public", - "docId": "kibSharePluginApi", - "section": "def-public.UrlGeneratorState", - "text": "UrlGeneratorState" - }, - "" - ], - "path": "src/plugins/share/public/url_generators/url_generator_definition.ts", - "deprecated": false, - "children": [ - { - "parentPluginId": "share", - "id": "def-public.UrlGeneratorState.State", - "type": "Uncategorized", - "tags": [], - "label": "State", - "description": [], - "signature": [ - "S" - ], - "path": "src/plugins/share/public/url_generators/url_generator_definition.ts", - "deprecated": false - }, - { - "parentPluginId": "share", - "id": "def-public.UrlGeneratorState.MigratedId", - "type": "Uncategorized", - "tags": [], - "label": "MigratedId", - "description": [], - "signature": [ - "I | undefined" - ], - "path": "src/plugins/share/public/url_generators/url_generator_definition.ts", - "deprecated": false - }, - { - "parentPluginId": "share", - "id": "def-public.UrlGeneratorState.MigratedState", - "type": "Uncategorized", - "tags": [], - "label": "MigratedState", - "description": [], - "signature": [ - "MS | undefined" - ], - "path": "src/plugins/share/public/url_generators/url_generator_definition.ts", - "deprecated": false - } - ], - "initialIsOpen": false - }, - { - "parentPluginId": "share", - "id": "def-public.UrlGeneratorStateMapping", - "type": "Interface", - "tags": [], - "label": "UrlGeneratorStateMapping", - "description": [], - "path": "src/plugins/share/public/url_generators/url_generator_definition.ts", - "deprecated": false, - "children": [ - { - "parentPluginId": "share", - "id": "def-public.UrlGeneratorStateMapping.Unnamed", - "type": "IndexSignature", - "tags": [], - "label": "[key: string]: UrlGeneratorState", - "description": [], - "signature": [ - "[key: string]: ", - { - "pluginId": "share", - "scope": "public", - "docId": "kibSharePluginApi", - "section": "def-public.UrlGeneratorState", - "text": "UrlGeneratorState" - }, - "" - ], - "path": "src/plugins/share/public/url_generators/url_generator_definition.ts", - "deprecated": false - } - ], - "initialIsOpen": false } ], "enums": [], @@ -1691,20 +1192,6 @@ "path": "src/plugins/share/public/lib/download_as.ts", "deprecated": false, "initialIsOpen": false - }, - { - "parentPluginId": "share", - "id": "def-public.UrlGeneratorId", - "type": "Type", - "tags": [], - "label": "UrlGeneratorId", - "description": [], - "signature": [ - "string" - ], - "path": "src/plugins/share/public/url_generators/url_generator_definition.ts", - "deprecated": false, - "initialIsOpen": false } ], "objects": [], @@ -1724,9 +1211,7 @@ "section": "def-public.ShareMenuProvider", "text": "ShareMenuProvider" }, - ") => void; } & { urlGenerators: ", - "UrlGeneratorsSetup", - "; url: ", + ") => void; } & { url: ", { "pluginId": "share", "scope": "public", @@ -1769,9 +1254,7 @@ "section": "def-public.ShowShareMenuOptions", "text": "ShowShareMenuOptions" }, - ") => void; } & { urlGenerators: ", - "UrlGeneratorsStart", - "; url: ", + ") => void; } & { url: ", { "pluginId": "share", "scope": "public", diff --git a/api_docs/share.mdx b/api_docs/share.mdx index 3bd65c24a93e8..c8e8681241069 100644 --- a/api_docs/share.mdx +++ b/api_docs/share.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/share title: "share" image: https://source.unsplash.com/400x175/?github summary: API docs for the share plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'share'] warning: 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. --- @@ -18,7 +18,7 @@ Contact [App Services](https://github.com/orgs/elastic/teams/kibana-app-services | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 139 | 0 | 80 | 12 | +| 113 | 0 | 54 | 10 | ## Client @@ -31,9 +31,6 @@ Contact [App Services](https://github.com/orgs/elastic/teams/kibana-app-services ### Functions -### Classes - - ### Interfaces diff --git a/api_docs/shared_u_x.devdocs.json b/api_docs/shared_u_x.devdocs.json index aa8fad30bea40..dbcd1b5d825c5 100644 --- a/api_docs/shared_u_x.devdocs.json +++ b/api_docs/shared_u_x.devdocs.json @@ -72,6 +72,76 @@ } ], "initialIsOpen": false + }, + { + "parentPluginId": "sharedUX", + "id": "def-public.LazyNoDataViewsPage", + "type": "Function", + "tags": [], + "label": "LazyNoDataViewsPage", + "description": [ + "\nThe Lazily-loaded `NoDataViews` component. Consumers should use `React.Suspennse` or the\n`withSuspense` HOC to load this component." + ], + "signature": [ + "React.ExoticComponent<", + "Props", + "> & { readonly _result: ({ onDataViewCreated, dataViewsDocLink }: ", + "Props", + ") => JSX.Element; }" + ], + "path": "src/plugins/shared_ux/public/components/index.ts", + "deprecated": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "sharedUX", + "id": "def-public.LazyNoDataViewsPage.$1", + "type": "Uncategorized", + "tags": [], + "label": "props", + "description": [], + "signature": [ + "P" + ], + "path": "node_modules/@types/react/index.d.ts", + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "sharedUX", + "id": "def-public.NoDataViewsPage", + "type": "Function", + "tags": [], + "label": "NoDataViewsPage", + "description": [ + "\nA `NoDataViewsPage` component that is wrapped by the `withSuspense` HOC. This component can\nbe used directly by consumers and will load the `LazyNoDataViewsPage` component lazily with\na predefined fallback and error boundary." + ], + "signature": [ + "React.ForwardRefExoticComponent<", + "Props", + " & React.RefAttributes<{}>>" + ], + "path": "src/plugins/shared_ux/public/components/index.ts", + "deprecated": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "sharedUX", + "id": "def-public.NoDataViewsPage.$1", + "type": "Uncategorized", + "tags": [], + "label": "props", + "description": [], + "signature": [ + "P" + ], + "path": "node_modules/@types/react/index.d.ts", + "deprecated": false + } + ], + "initialIsOpen": false } ], "interfaces": [], diff --git a/api_docs/shared_u_x.mdx b/api_docs/shared_u_x.mdx index 3842d195dd13a..d1bb3ce87f625 100644 --- a/api_docs/shared_u_x.mdx +++ b/api_docs/shared_u_x.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/sharedUX title: "sharedUX" image: https://source.unsplash.com/400x175/?github summary: API docs for the sharedUX plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'sharedUX'] warning: 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. --- @@ -18,7 +18,7 @@ Contact [Shared UX](https://github.com/orgs/elastic/teams/shared-ux) for questio | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 10 | 0 | 0 | 1 | +| 14 | 0 | 0 | 1 | ## Client diff --git a/api_docs/snapshot_restore.devdocs.json b/api_docs/snapshot_restore.devdocs.json index c16e7c3ee72f4..871ad98b1c9f9 100644 --- a/api_docs/snapshot_restore.devdocs.json +++ b/api_docs/snapshot_restore.devdocs.json @@ -92,10 +92,24 @@ }, { "parentPluginId": "snapshotRestore", - "id": "def-common.DEFAULT_REPOSITORY_TYPES", + "id": "def-common.MAJOR_VERSION", + "type": "string", + "tags": [], + "label": "MAJOR_VERSION", + "description": [], + "signature": [ + "\"8.0.0\"" + ], + "path": "x-pack/plugins/snapshot_restore/common/constants.ts", + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "snapshotRestore", + "id": "def-common.MODULE_REPOSITORY_TYPES", "type": "Array", "tags": [], - "label": "DEFAULT_REPOSITORY_TYPES", + "label": "MODULE_REPOSITORY_TYPES", "description": [], "signature": [ "RepositoryType", @@ -107,13 +121,14 @@ }, { "parentPluginId": "snapshotRestore", - "id": "def-common.MAJOR_VERSION", - "type": "string", + "id": "def-common.ON_PREM_REPOSITORY_TYPES", + "type": "Array", "tags": [], - "label": "MAJOR_VERSION", + "label": "ON_PREM_REPOSITORY_TYPES", "description": [], "signature": [ - "\"8.0.0\"" + "RepositoryType", + "[]" ], "path": "x-pack/plugins/snapshot_restore/common/constants.ts", "deprecated": false, diff --git a/api_docs/snapshot_restore.mdx b/api_docs/snapshot_restore.mdx index d689ed141f11e..748b06fdf1290 100644 --- a/api_docs/snapshot_restore.mdx +++ b/api_docs/snapshot_restore.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/snapshotRestore title: "snapshotRestore" image: https://source.unsplash.com/400x175/?github summary: API docs for the snapshotRestore plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'snapshotRestore'] warning: 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. --- @@ -18,7 +18,7 @@ Contact [Stack Management](https://github.com/orgs/elastic/teams/kibana-stack-ma | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 20 | 1 | 20 | 1 | +| 21 | 1 | 21 | 1 | ## Common diff --git a/api_docs/spaces.mdx b/api_docs/spaces.mdx index 351ab8a9cc9e5..55a04276cce79 100644 --- a/api_docs/spaces.mdx +++ b/api_docs/spaces.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/spaces title: "spaces" image: https://source.unsplash.com/400x175/?github summary: API docs for the spaces plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'spaces'] warning: 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. --- diff --git a/api_docs/stack_alerts.mdx b/api_docs/stack_alerts.mdx index 86e42c4ca9784..765a402c7ab27 100644 --- a/api_docs/stack_alerts.mdx +++ b/api_docs/stack_alerts.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/stackAlerts title: "stackAlerts" image: https://source.unsplash.com/400x175/?github summary: API docs for the stackAlerts plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackAlerts'] warning: 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. --- diff --git a/api_docs/task_manager.mdx b/api_docs/task_manager.mdx index 0a060cebf89a8..96ba8428e04dd 100644 --- a/api_docs/task_manager.mdx +++ b/api_docs/task_manager.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/taskManager title: "taskManager" image: https://source.unsplash.com/400x175/?github summary: API docs for the taskManager plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'taskManager'] warning: 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. --- diff --git a/api_docs/telemetry.mdx b/api_docs/telemetry.mdx index bcf333d15759a..08ffa7a550949 100644 --- a/api_docs/telemetry.mdx +++ b/api_docs/telemetry.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/telemetry title: "telemetry" image: https://source.unsplash.com/400x175/?github summary: API docs for the telemetry plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetry'] warning: 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. --- diff --git a/api_docs/telemetry_collection_manager.devdocs.json b/api_docs/telemetry_collection_manager.devdocs.json index b115d5bd092a2..605df559f4e9e 100644 --- a/api_docs/telemetry_collection_manager.devdocs.json +++ b/api_docs/telemetry_collection_manager.devdocs.json @@ -67,20 +67,1196 @@ { "parentPluginId": "telemetryCollectionManager", "id": "def-server.StatsCollectionConfig.esClient", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "esClient", "description": [], "signature": [ - "Omit<", - "KibanaClient", - ", \"extend\" | \"connectionPool\" | \"transport\" | \"serializer\" | \"child\" | \"close\" | \"diagnostic\"> & { transport: { request(params: ", - "TransportRequestParams", + "{ eql: ", + "default", + "; search: { >(this: That, params?: ", + "SearchRequest", + " | ", + "SearchRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "SearchResponse", + ">; >(this: That, params?: ", + "SearchRequest", + " | ", + "SearchRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "SearchResponse", + ", unknown>>; >(this: That, params?: ", + "SearchRequest", + " | ", + "SearchRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "SearchResponse", + ">; }; create: { (this: That, params: ", + "CreateRequest", + " | ", + "CreateRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "CreateResponse", + ">; (this: That, params: ", + "CreateRequest", + " | ", + "CreateRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "CreateResponse", + ", unknown>>; (this: That, params: ", + "CreateRequest", + " | ", + "CreateRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "CreateResponse", + ">; }; monitoring: ", + "default", + "; security: ", + "default", + "; name: string | symbol; index: { (this: That, params: ", + "IndexRequest", + " | ", + "IndexRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "IndexResponse", + ">; (this: That, params: ", + "IndexRequest", + " | ", + "IndexRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "IndexResponse", + ", unknown>>; (this: That, params: ", + "IndexRequest", + " | ", + "IndexRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "IndexResponse", + ">; }; delete: { (this: That, params: ", + "DeleteRequest", + " | ", + "DeleteRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "DeleteResponse", + ">; (this: That, params: ", + "DeleteRequest", + " | ", + "DeleteRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "DeleteResponse", + ", unknown>>; (this: That, params: ", + "DeleteRequest", + " | ", + "DeleteRequest", ", options?: ", "TransportRequestOptions", " | undefined): Promise<", + "DeleteResponse", + ">; }; get: { (this: That, params: ", + "GetRequest", + " | ", + "GetRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetResponse", + ">; (this: That, params: ", + "GetRequest", + " | ", + "GetRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", "TransportResult", - ">; }; }" + "<", + "GetResponse", + ", unknown>>; (this: That, params: ", + "GetRequest", + " | ", + "GetRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "GetResponse", + ">; }; update: { (this: That, params: ", + "UpdateRequest", + " | ", + "UpdateRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "UpdateResponse", + ">; (this: That, params: ", + "UpdateRequest", + " | ", + "UpdateRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "UpdateResponse", + ", unknown>>; (this: That, params: ", + "UpdateRequest", + " | ", + "UpdateRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "UpdateResponse", + ">; }; closePointInTime: { (this: That, params: ", + "ClosePointInTimeRequest", + " | ", + "ClosePointInTimeRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ClosePointInTimeResponse", + ">; (this: That, params: ", + "ClosePointInTimeRequest", + " | ", + "ClosePointInTimeRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ClosePointInTimeResponse", + ", unknown>>; (this: That, params: ", + "ClosePointInTimeRequest", + " | ", + "ClosePointInTimeRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ClosePointInTimeResponse", + ">; }; transform: ", + "default", + "; helpers: ", + "default", + "; [kInternal]: symbol | null; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", + "default", + "; Internal: ", + "default", + "; asyncSearch: ", + "default", + "; autoscaling: ", + "default", + "; bulk: { (this: That, params: ", + "BulkRequest", + " | ", + "BulkRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "BulkResponse", + ">; (this: That, params: ", + "BulkRequest", + " | ", + "BulkRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "BulkResponse", + ", unknown>>; (this: That, params: ", + "BulkRequest", + " | ", + "BulkRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "BulkResponse", + ">; }; cat: ", + "default", + "; ccr: ", + "default", + "; clearScroll: { (this: That, params?: ", + "ClearScrollRequest", + " | ", + "ClearScrollRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ClearScrollResponse", + ">; (this: That, params?: ", + "ClearScrollRequest", + " | ", + "ClearScrollRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ClearScrollResponse", + ", unknown>>; (this: That, params?: ", + "ClearScrollRequest", + " | ", + "ClearScrollRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ClearScrollResponse", + ">; }; cluster: ", + "default", + "; count: { (this: That, params?: ", + "CountRequest", + " | ", + "CountRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "CountResponse", + ">; (this: That, params?: ", + "CountRequest", + " | ", + "CountRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "CountResponse", + ", unknown>>; (this: That, params?: ", + "CountRequest", + " | ", + "CountRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "CountResponse", + ">; }; danglingIndices: ", + "default", + "; deleteByQuery: { (this: That, params: ", + "DeleteByQueryRequest", + " | ", + "DeleteByQueryRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "DeleteByQueryResponse", + ">; (this: That, params: ", + "DeleteByQueryRequest", + " | ", + "DeleteByQueryRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "DeleteByQueryResponse", + ", unknown>>; (this: That, params: ", + "DeleteByQueryRequest", + " | ", + "DeleteByQueryRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "DeleteByQueryResponse", + ">; }; deleteByQueryRethrottle: { (this: That, params: ", + "DeleteByQueryRethrottleRequest", + " | ", + "DeleteByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "DeleteByQueryRethrottleResponse", + ">; (this: That, params: ", + "DeleteByQueryRethrottleRequest", + " | ", + "DeleteByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "DeleteByQueryRethrottleResponse", + ", unknown>>; (this: That, params: ", + "DeleteByQueryRethrottleRequest", + " | ", + "DeleteByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "DeleteByQueryRethrottleResponse", + ">; }; deleteScript: { (this: That, params: ", + "DeleteScriptRequest", + " | ", + "DeleteScriptRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "DeleteScriptResponse", + ">; (this: That, params: ", + "DeleteScriptRequest", + " | ", + "DeleteScriptRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "DeleteScriptResponse", + ", unknown>>; (this: That, params: ", + "DeleteScriptRequest", + " | ", + "DeleteScriptRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "DeleteScriptResponse", + ">; }; enrich: ", + "default", + "; exists: { (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; existsSource: { (this: That, params: ", + "ExistsSourceRequest", + " | ", + "ExistsSourceRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "ExistsSourceRequest", + " | ", + "ExistsSourceRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "ExistsSourceRequest", + " | ", + "ExistsSourceRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; explain: { (this: That, params: ", + "ExplainRequest", + " | ", + "ExplainRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ExplainResponse", + ">; (this: That, params: ", + "ExplainRequest", + " | ", + "ExplainRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ExplainResponse", + ", unknown>>; (this: That, params: ", + "ExplainRequest", + " | ", + "ExplainRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ExplainResponse", + ">; }; features: ", + "default", + "; fieldCaps: { (this: That, params?: ", + "FieldCapsRequest", + " | ", + "FieldCapsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "FieldCapsResponse", + ">; (this: That, params?: ", + "FieldCapsRequest", + " | ", + "FieldCapsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "FieldCapsResponse", + ", unknown>>; (this: That, params?: ", + "FieldCapsRequest", + " | ", + "FieldCapsRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "FieldCapsResponse", + ">; }; fleet: ", + "default", + "; getScript: { (this: That, params: ", + "GetScriptRequest", + " | ", + "GetScriptRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetScriptResponse", + ">; (this: That, params: ", + "GetScriptRequest", + " | ", + "GetScriptRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "GetScriptResponse", + ", unknown>>; (this: That, params: ", + "GetScriptRequest", + " | ", + "GetScriptRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "GetScriptResponse", + ">; }; getScriptContext: { (this: That, params?: ", + "GetScriptContextRequest", + " | ", + "GetScriptContextRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetScriptContextResponse", + ">; (this: That, params?: ", + "GetScriptContextRequest", + " | ", + "GetScriptContextRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "GetScriptContextResponse", + ", unknown>>; (this: That, params?: ", + "GetScriptContextRequest", + " | ", + "GetScriptContextRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "GetScriptContextResponse", + ">; }; getScriptLanguages: { (this: That, params?: ", + "GetScriptLanguagesRequest", + " | ", + "GetScriptLanguagesRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "GetScriptLanguagesResponse", + ">; (this: That, params?: ", + "GetScriptLanguagesRequest", + " | ", + "GetScriptLanguagesRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "GetScriptLanguagesResponse", + ", unknown>>; (this: That, params?: ", + "GetScriptLanguagesRequest", + " | ", + "GetScriptLanguagesRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "GetScriptLanguagesResponse", + ">; }; getSource: { (this: That, params: ", + "GetSourceRequest", + " | ", + "GetSourceRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "GetSourceRequest", + " | ", + "GetSourceRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "GetSourceRequest", + " | ", + "GetSourceRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; graph: ", + "default", + "; ilm: ", + "default", + "; indices: ", + "default", + "; info: { (this: That, params?: ", + "InfoRequest", + " | ", + "InfoRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "InfoResponse", + ">; (this: That, params?: ", + "InfoRequest", + " | ", + "InfoRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "InfoResponse", + ", unknown>>; (this: That, params?: ", + "InfoRequest", + " | ", + "InfoRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "InfoResponse", + ">; }; ingest: ", + "default", + "; knnSearch: { (this: That, params: ", + "KnnSearchRequest", + " | ", + "KnnSearchRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "KnnSearchResponse", + ">; (this: That, params: ", + "KnnSearchRequest", + " | ", + "KnnSearchRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "KnnSearchResponse", + ", unknown>>; (this: That, params: ", + "KnnSearchRequest", + " | ", + "KnnSearchRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "KnnSearchResponse", + ">; }; license: ", + "default", + "; logstash: ", + "default", + "; mget: { (this: That, params?: ", + "MgetRequest", + " | ", + "MgetRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MgetResponse", + ">; (this: That, params?: ", + "MgetRequest", + " | ", + "MgetRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "MgetResponse", + ", unknown>>; (this: That, params?: ", + "MgetRequest", + " | ", + "MgetRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "MgetResponse", + ">; }; migration: ", + "default", + "; ml: ", + "default", + "; msearch: { >(this: That, params: ", + "MsearchRequest", + " | ", + "MsearchRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MsearchResponse", + ">; >(this: That, params: ", + "MsearchRequest", + " | ", + "MsearchRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "MsearchResponse", + ", unknown>>; >(this: That, params: ", + "MsearchRequest", + " | ", + "MsearchRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "MsearchResponse", + ">; }; msearchTemplate: { >(this: That, params: ", + "MsearchTemplateRequest", + " | ", + "MsearchTemplateRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MsearchTemplateResponse", + ">; >(this: That, params: ", + "MsearchTemplateRequest", + " | ", + "MsearchTemplateRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "MsearchTemplateResponse", + ", unknown>>; >(this: That, params: ", + "MsearchTemplateRequest", + " | ", + "MsearchTemplateRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "MsearchTemplateResponse", + ">; }; mtermvectors: { (this: That, params?: ", + "MtermvectorsRequest", + " | ", + "MtermvectorsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "MtermvectorsResponse", + ">; (this: That, params?: ", + "MtermvectorsRequest", + " | ", + "MtermvectorsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "MtermvectorsResponse", + ", unknown>>; (this: That, params?: ", + "MtermvectorsRequest", + " | ", + "MtermvectorsRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "MtermvectorsResponse", + ">; }; nodes: ", + "default", + "; openPointInTime: { (this: That, params: ", + "OpenPointInTimeRequest", + " | ", + "OpenPointInTimeRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "OpenPointInTimeResponse", + ">; (this: That, params: ", + "OpenPointInTimeRequest", + " | ", + "OpenPointInTimeRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "OpenPointInTimeResponse", + ", unknown>>; (this: That, params: ", + "OpenPointInTimeRequest", + " | ", + "OpenPointInTimeRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "OpenPointInTimeResponse", + ">; }; ping: { (this: That, params?: ", + "PingRequest", + " | ", + "PingRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params?: ", + "PingRequest", + " | ", + "PingRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params?: ", + "PingRequest", + " | ", + "PingRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; putScript: { (this: That, params: ", + "PutScriptRequest", + " | ", + "PutScriptRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "PutScriptResponse", + ">; (this: That, params: ", + "PutScriptRequest", + " | ", + "PutScriptRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "PutScriptResponse", + ", unknown>>; (this: That, params: ", + "PutScriptRequest", + " | ", + "PutScriptRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "PutScriptResponse", + ">; }; rankEval: { (this: That, params: ", + "RankEvalRequest", + " | ", + "RankEvalRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "RankEvalResponse", + ">; (this: That, params: ", + "RankEvalRequest", + " | ", + "RankEvalRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "RankEvalResponse", + ", unknown>>; (this: That, params: ", + "RankEvalRequest", + " | ", + "RankEvalRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "RankEvalResponse", + ">; }; reindex: { (this: That, params?: ", + "ReindexRequest", + " | ", + "ReindexRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ReindexResponse", + ">; (this: That, params?: ", + "ReindexRequest", + " | ", + "ReindexRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ReindexResponse", + ", unknown>>; (this: That, params?: ", + "ReindexRequest", + " | ", + "ReindexRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ReindexResponse", + ">; }; reindexRethrottle: { (this: That, params: ", + "ReindexRethrottleRequest", + " | ", + "ReindexRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ReindexRethrottleResponse", + ">; (this: That, params: ", + "ReindexRethrottleRequest", + " | ", + "ReindexRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ReindexRethrottleResponse", + ", unknown>>; (this: That, params: ", + "ReindexRethrottleRequest", + " | ", + "ReindexRethrottleRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ReindexRethrottleResponse", + ">; }; renderSearchTemplate: { (this: That, params?: ", + "RenderSearchTemplateRequest", + " | ", + "RenderSearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "RenderSearchTemplateResponse", + ">; (this: That, params?: ", + "RenderSearchTemplateRequest", + " | ", + "RenderSearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "RenderSearchTemplateResponse", + ", unknown>>; (this: That, params?: ", + "RenderSearchTemplateRequest", + " | ", + "RenderSearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "RenderSearchTemplateResponse", + ">; }; rollup: ", + "default", + "; scriptsPainlessExecute: { (this: That, params?: ", + "ScriptsPainlessExecuteRequest", + " | ", + "ScriptsPainlessExecuteRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ScriptsPainlessExecuteResponse", + ">; (this: That, params?: ", + "ScriptsPainlessExecuteRequest", + " | ", + "ScriptsPainlessExecuteRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ScriptsPainlessExecuteResponse", + ", unknown>>; (this: That, params?: ", + "ScriptsPainlessExecuteRequest", + " | ", + "ScriptsPainlessExecuteRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ScriptsPainlessExecuteResponse", + ">; }; scroll: { >(this: That, params: ", + "ScrollRequest", + " | ", + "ScrollRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "ScrollResponse", + ">; >(this: That, params: ", + "ScrollRequest", + " | ", + "ScrollRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "ScrollResponse", + ", unknown>>; >(this: That, params: ", + "ScrollRequest", + " | ", + "ScrollRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "ScrollResponse", + ">; }; searchMvt: { (this: That, params: ", + "SearchMvtRequest", + " | ", + "SearchMvtRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "SearchMvtRequest", + " | ", + "SearchMvtRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "SearchMvtRequest", + " | ", + "SearchMvtRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; searchShards: { (this: That, params?: ", + "SearchShardsRequest", + " | ", + "SearchShardsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "SearchShardsResponse", + ">; (this: That, params?: ", + "SearchShardsRequest", + " | ", + "SearchShardsRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "SearchShardsResponse", + ", unknown>>; (this: That, params?: ", + "SearchShardsRequest", + " | ", + "SearchShardsRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "SearchShardsResponse", + ">; }; searchTemplate: { (this: That, params?: ", + "SearchTemplateRequest", + " | ", + "SearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "SearchTemplateResponse", + ">; (this: That, params?: ", + "SearchTemplateRequest", + " | ", + "SearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "SearchTemplateResponse", + ", unknown>>; (this: That, params?: ", + "SearchTemplateRequest", + " | ", + "SearchTemplateRequest", + " | undefined, options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "SearchTemplateResponse", + ">; }; searchableSnapshots: ", + "default", + "; shutdown: ", + "default", + "; slm: ", + "default", + "; snapshot: ", + "default", + "; sql: ", + "default", + "; ssl: ", + "default", + "; tasks: ", + "default", + "; termsEnum: { (this: That, params: ", + "TermsEnumRequest", + " | ", + "TermsEnumRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "TermsEnumResponse", + ">; (this: That, params: ", + "TermsEnumRequest", + " | ", + "TermsEnumRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "TermsEnumResponse", + ", unknown>>; (this: That, params: ", + "TermsEnumRequest", + " | ", + "TermsEnumRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "TermsEnumResponse", + ">; }; termvectors: { (this: That, params: ", + "TermvectorsRequest", + " | ", + "TermvectorsRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "TermvectorsResponse", + ">; (this: That, params: ", + "TermvectorsRequest", + " | ", + "TermvectorsRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "TermvectorsResponse", + ", unknown>>; (this: That, params: ", + "TermvectorsRequest", + " | ", + "TermvectorsRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "TermvectorsResponse", + ">; }; textStructure: ", + "default", + "; updateByQuery: { (this: That, params: ", + "UpdateByQueryRequest", + " | ", + "UpdateByQueryRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "UpdateByQueryResponse", + ">; (this: That, params: ", + "UpdateByQueryRequest", + " | ", + "UpdateByQueryRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "UpdateByQueryResponse", + ", unknown>>; (this: That, params: ", + "UpdateByQueryRequest", + " | ", + "UpdateByQueryRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "UpdateByQueryResponse", + ">; }; updateByQueryRethrottle: { (this: That, params: ", + "UpdateByQueryRethrottleRequest", + " | ", + "UpdateByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise<", + "UpdateByQueryRethrottleResponse", + ">; (this: That, params: ", + "UpdateByQueryRethrottleRequest", + " | ", + "UpdateByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + "<", + "UpdateByQueryRethrottleResponse", + ", unknown>>; (this: That, params: ", + "UpdateByQueryRethrottleRequest", + " | ", + "UpdateByQueryRethrottleRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise<", + "UpdateByQueryRethrottleResponse", + ">; }; watcher: ", + "default", + "; xpack: ", + "default", + "; }" ], "path": "src/plugins/telemetry_collection_manager/server/types.ts", "deprecated": false diff --git a/api_docs/telemetry_collection_manager.mdx b/api_docs/telemetry_collection_manager.mdx index bc2c0f5af00f6..71b8ce22c566c 100644 --- a/api_docs/telemetry_collection_manager.mdx +++ b/api_docs/telemetry_collection_manager.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionManager title: "telemetryCollectionManager" image: https://source.unsplash.com/400x175/?github summary: API docs for the telemetryCollectionManager plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionManager'] warning: 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. --- diff --git a/api_docs/telemetry_collection_xpack.mdx b/api_docs/telemetry_collection_xpack.mdx index af0f47c295473..891a489ed434d 100644 --- a/api_docs/telemetry_collection_xpack.mdx +++ b/api_docs/telemetry_collection_xpack.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionXpack title: "telemetryCollectionXpack" image: https://source.unsplash.com/400x175/?github summary: API docs for the telemetryCollectionXpack plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionXpack'] warning: 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. --- diff --git a/api_docs/telemetry_management_section.mdx b/api_docs/telemetry_management_section.mdx index bbba1f0c8d9db..1a21fba680212 100644 --- a/api_docs/telemetry_management_section.mdx +++ b/api_docs/telemetry_management_section.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/telemetryManagementSection title: "telemetryManagementSection" image: https://source.unsplash.com/400x175/?github summary: API docs for the telemetryManagementSection plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryManagementSection'] warning: 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. --- diff --git a/api_docs/timelines.devdocs.json b/api_docs/timelines.devdocs.json index afb4824423c36..fc58e82ce9db0 100644 --- a/api_docs/timelines.devdocs.json +++ b/api_docs/timelines.devdocs.json @@ -4732,7 +4732,9 @@ "signature": [ "{ [x: string]: ", "MappingRuntimeField", - "; }" + " | ", + "MappingRuntimeField", + "[]; }" ], "path": "x-pack/plugins/timelines/common/search_strategy/index_fields/index.ts", "deprecated": false @@ -5498,7 +5500,9 @@ "signature": [ "{ [x: string]: ", "MappingRuntimeField", - "; }" + " | ", + "MappingRuntimeField", + "[]; }" ], "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/all/index.ts", "deprecated": false diff --git a/api_docs/timelines.mdx b/api_docs/timelines.mdx index e31f0c1d8f6e0..b56abcf7950b2 100644 --- a/api_docs/timelines.mdx +++ b/api_docs/timelines.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/timelines title: "timelines" image: https://source.unsplash.com/400x175/?github summary: API docs for the timelines plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'timelines'] warning: 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. --- diff --git a/api_docs/transform.mdx b/api_docs/transform.mdx index f41e3edf27439..609643309e3c9 100644 --- a/api_docs/transform.mdx +++ b/api_docs/transform.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/transform title: "transform" image: https://source.unsplash.com/400x175/?github summary: API docs for the transform plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'transform'] warning: 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. --- diff --git a/api_docs/triggers_actions_ui.devdocs.json b/api_docs/triggers_actions_ui.devdocs.json index f006caf3eb91d..90dbbb848171d 100644 --- a/api_docs/triggers_actions_ui.devdocs.json +++ b/api_docs/triggers_actions_ui.devdocs.json @@ -210,9 +210,9 @@ "description": [], "signature": [ "React.ExoticComponent<", - "AlertConditionsProps", + "RuleConditionsProps", " & { children?: React.ReactNode; }> & { readonly _result: ({ headline, actionGroups, onInitializeConditionsFor, onResetConditionsFor, includeBuiltInActionGroups, children, }: React.PropsWithChildren<", - "AlertConditionsProps", + "RuleConditionsProps", ">) => JSX.Element; }" ], "path": "x-pack/plugins/triggers_actions_ui/public/application/sections/index.tsx", @@ -252,9 +252,9 @@ "text": "ActionGroupWithCondition" }, " | undefined; } & Pick<", - "AlertConditionsProps", + "RuleConditionsProps", ", \"onResetConditionsFor\"> & { children?: React.ReactNode; }> & { readonly _result: ({ actionGroup, onResetConditionsFor, children, ...otherProps }: React.PropsWithChildren<", - "AlertConditionsGroupProps", + "RuleConditionsGroupProps", ">) => JSX.Element | null; }" ], "path": "x-pack/plugins/triggers_actions_ui/public/application/sections/index.tsx", @@ -756,13 +756,13 @@ }, { "parentPluginId": "triggersActionsUi", - "id": "def-public.loadAlertAggregations", + "id": "def-public.loadRuleAggregations", "type": "Function", "tags": [], - "label": "loadAlertAggregations", + "label": "loadRuleAggregations", "description": [], "signature": [ - "({\n http,\n searchText,\n typesFilter,\n actionTypesFilter,\n alertStatusesFilter,\n}: { http: ", + "({\n http,\n searchText,\n typesFilter,\n actionTypesFilter,\n ruleStatusesFilter,\n}: { http: ", { "pluginId": "core", "scope": "public", @@ -770,32 +770,26 @@ "section": "def-public.HttpSetup", "text": "HttpSetup" }, - "; searchText?: string | undefined; typesFilter?: string[] | undefined; actionTypesFilter?: string[] | undefined; alertStatusesFilter?: string[] | undefined; }) => Promise<", - { - "pluginId": "alerting", - "scope": "common", - "docId": "kibAlertingPluginApi", - "section": "def-common.AlertAggregations", - "text": "AlertAggregations" - }, + "; searchText?: string | undefined; typesFilter?: string[] | undefined; actionTypesFilter?: string[] | undefined; ruleStatusesFilter?: string[] | undefined; }) => Promise<", + "RuleAggregations", ">" ], - "path": "x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/aggregate.ts", + "path": "x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/aggregate.ts", "deprecated": false, "children": [ { "parentPluginId": "triggersActionsUi", - "id": "def-public.loadAlertAggregations.$1", + "id": "def-public.loadRuleAggregations.$1", "type": "Object", "tags": [], - "label": "{\n http,\n searchText,\n typesFilter,\n actionTypesFilter,\n alertStatusesFilter,\n}", + "label": "{\n http,\n searchText,\n typesFilter,\n actionTypesFilter,\n ruleStatusesFilter,\n}", "description": [], - "path": "x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/aggregate.ts", + "path": "x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/aggregate.ts", "deprecated": false, "children": [ { "parentPluginId": "triggersActionsUi", - "id": "def-public.loadAlertAggregations.$1.http", + "id": "def-public.loadRuleAggregations.$1.http", "type": "Object", "tags": [], "label": "http", @@ -809,12 +803,12 @@ "text": "HttpSetup" } ], - "path": "x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/aggregate.ts", + "path": "x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/aggregate.ts", "deprecated": false }, { "parentPluginId": "triggersActionsUi", - "id": "def-public.loadAlertAggregations.$1.searchText", + "id": "def-public.loadRuleAggregations.$1.searchText", "type": "string", "tags": [], "label": "searchText", @@ -822,12 +816,12 @@ "signature": [ "string | undefined" ], - "path": "x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/aggregate.ts", + "path": "x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/aggregate.ts", "deprecated": false }, { "parentPluginId": "triggersActionsUi", - "id": "def-public.loadAlertAggregations.$1.typesFilter", + "id": "def-public.loadRuleAggregations.$1.typesFilter", "type": "Array", "tags": [], "label": "typesFilter", @@ -835,12 +829,12 @@ "signature": [ "string[] | undefined" ], - "path": "x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/aggregate.ts", + "path": "x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/aggregate.ts", "deprecated": false }, { "parentPluginId": "triggersActionsUi", - "id": "def-public.loadAlertAggregations.$1.actionTypesFilter", + "id": "def-public.loadRuleAggregations.$1.actionTypesFilter", "type": "Array", "tags": [], "label": "actionTypesFilter", @@ -848,20 +842,20 @@ "signature": [ "string[] | undefined" ], - "path": "x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/aggregate.ts", + "path": "x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/aggregate.ts", "deprecated": false }, { "parentPluginId": "triggersActionsUi", - "id": "def-public.loadAlertAggregations.$1.alertStatusesFilter", + "id": "def-public.loadRuleAggregations.$1.ruleStatusesFilter", "type": "Array", "tags": [], - "label": "alertStatusesFilter", + "label": "ruleStatusesFilter", "description": [], "signature": [ "string[] | undefined" ], - "path": "x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api/aggregate.ts", + "path": "x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/aggregate.ts", "deprecated": false } ] @@ -1645,14 +1639,8 @@ "label": "setRuleProperty", "description": [], "signature": [ - "(key: Prop, value: ", - { - "pluginId": "alerting", - "scope": "common", - "docId": "kibAlertingPluginApi", - "section": "def-common.SanitizedAlert", - "text": "SanitizedAlert" - }, + "(key: Prop, value: ", + "SanitizedRule", "[Prop] | null) => void" ], "path": "x-pack/plugins/triggers_actions_ui/public/types.ts", @@ -1680,13 +1668,7 @@ "label": "value", "description": [], "signature": [ - { - "pluginId": "alerting", - "scope": "common", - "docId": "kibAlertingPluginApi", - "section": "def-common.SanitizedAlert", - "text": "SanitizedAlert" - }, + "SanitizedRule", "[Prop] | null" ], "path": "x-pack/plugins/triggers_actions_ui/public/types.ts", @@ -2169,23 +2151,23 @@ }, { "parentPluginId": "triggersActionsUi", - "id": "def-public.AlertFlyoutCloseReason", + "id": "def-public.COMPARATORS", "type": "Enum", "tags": [], - "label": "AlertFlyoutCloseReason", + "label": "COMPARATORS", "description": [], - "path": "x-pack/plugins/triggers_actions_ui/public/types.ts", + "path": "x-pack/plugins/triggers_actions_ui/public/common/constants/comparators.ts", "deprecated": false, "initialIsOpen": false }, { "parentPluginId": "triggersActionsUi", - "id": "def-public.COMPARATORS", + "id": "def-public.RuleFlyoutCloseReason", "type": "Enum", "tags": [], - "label": "COMPARATORS", + "label": "RuleFlyoutCloseReason", "description": [], - "path": "x-pack/plugins/triggers_actions_ui/public/common/constants/comparators.ts", + "path": "x-pack/plugins/triggers_actions_ui/public/types.ts", "deprecated": false, "initialIsOpen": false }, @@ -2236,7 +2218,7 @@ }, " & ({ conditions?: T | undefined; isRequired?: false | undefined; } | { conditions: T; isRequired: true; })" ], - "path": "x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_conditions.tsx", + "path": "x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_conditions.tsx", "deprecated": false, "initialIsOpen": false }, @@ -2324,47 +2306,15 @@ "label": "Rule", "description": [], "signature": [ - "{ id: string; monitoring?: ", - { - "pluginId": "alerting", - "scope": "common", - "docId": "kibAlertingPluginApi", - "section": "def-common.RuleMonitoring", - "text": "RuleMonitoring" - }, - " | undefined; name: string; tags: string[]; enabled: boolean; params: ", - { - "pluginId": "alerting", - "scope": "common", - "docId": "kibAlertingPluginApi", - "section": "def-common.AlertTypeParams", - "text": "AlertTypeParams" - }, - "; actions: ", - { - "pluginId": "alerting", - "scope": "common", - "docId": "kibAlertingPluginApi", - "section": "def-common.AlertAction", - "text": "AlertAction" - }, - "[]; throttle: string | null; alertTypeId: string; consumer: string; schedule: ", - { - "pluginId": "alerting", - "scope": "common", - "docId": "kibAlertingPluginApi", - "section": "def-common.IntervalSchedule", - "text": "IntervalSchedule" - }, - "; scheduledTaskId?: string | undefined; createdBy: string | null; updatedBy: string | null; createdAt: Date; updatedAt: Date; apiKeyOwner: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\" | null; muteAll: boolean; mutedInstanceIds: string[]; executionStatus: ", + "Omit<", { "pluginId": "alerting", "scope": "common", "docId": "kibAlertingPluginApi", - "section": "def-common.AlertExecutionStatus", - "text": "AlertExecutionStatus" + "section": "def-common.SanitizedAlert", + "text": "SanitizedAlert" }, - "; }" + ", \"alertTypeId\"> & { ruleTypeId: string; }" ], "path": "x-pack/plugins/triggers_actions_ui/public/types.ts", "deprecated": false, @@ -3408,9 +3358,9 @@ "description": [], "signature": [ "(props: Omit<", - "AlertAddProps", + "RuleAddProps", ">, \"actionTypeRegistry\" | \"ruleTypeRegistry\">) => React.ReactElement<", - "AlertAddProps", + "RuleAddProps", ">, string | React.JSXElementConstructor>" ], "path": "x-pack/plugins/triggers_actions_ui/public/plugin.ts", @@ -3425,7 +3375,7 @@ "description": [], "signature": [ "Omit<", - "AlertAddProps", + "RuleAddProps", ">, \"actionTypeRegistry\" | \"ruleTypeRegistry\">" ], "path": "x-pack/plugins/triggers_actions_ui/public/plugin.ts", @@ -3444,9 +3394,9 @@ "description": [], "signature": [ "(props: Omit<", - "AlertEditProps", + "RuleEditProps", ">, \"actionTypeRegistry\" | \"ruleTypeRegistry\">) => React.ReactElement<", - "AlertEditProps", + "RuleEditProps", ">, string | React.JSXElementConstructor>" ], "path": "x-pack/plugins/triggers_actions_ui/public/plugin.ts", @@ -3461,7 +3411,7 @@ "description": [], "signature": [ "Omit<", - "AlertEditProps", + "RuleEditProps", ">, \"actionTypeRegistry\" | \"ruleTypeRegistry\">" ], "path": "x-pack/plugins/triggers_actions_ui/public/plugin.ts", diff --git a/api_docs/triggers_actions_ui.mdx b/api_docs/triggers_actions_ui.mdx index a34a9ae8bf1ac..23abdccc81e78 100644 --- a/api_docs/triggers_actions_ui.mdx +++ b/api_docs/triggers_actions_ui.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/triggersActionsUi title: "triggersActionsUi" image: https://source.unsplash.com/400x175/?github summary: API docs for the triggersActionsUi plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'triggersActionsUi'] warning: 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. --- @@ -18,7 +18,7 @@ Contact [Kibana Alerting](https://github.com/orgs/elastic/teams/kibana-alerting- | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 246 | 0 | 234 | 18 | +| 246 | 0 | 234 | 20 | ## Client diff --git a/api_docs/ui_actions.devdocs.json b/api_docs/ui_actions.devdocs.json index 5eb77b541a142..925dfa5a64c1a 100644 --- a/api_docs/ui_actions.devdocs.json +++ b/api_docs/ui_actions.devdocs.json @@ -1989,6 +1989,19 @@ ], "path": "src/plugins/ui_actions/public/types.ts", "deprecated": false + }, + { + "parentPluginId": "uiActions", + "id": "def-public.VisualizeFieldContext.originatingApp", + "type": "string", + "tags": [], + "label": "originatingApp", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "src/plugins/ui_actions/public/types.ts", + "deprecated": false } ], "initialIsOpen": false diff --git a/api_docs/ui_actions.mdx b/api_docs/ui_actions.mdx index e29a381c58846..fb8e90253f03f 100644 --- a/api_docs/ui_actions.mdx +++ b/api_docs/ui_actions.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/uiActions title: "uiActions" image: https://source.unsplash.com/400x175/?github summary: API docs for the uiActions plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActions'] warning: 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. --- @@ -18,7 +18,7 @@ Contact [App Services](https://github.com/orgs/elastic/teams/kibana-app-services | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 129 | 0 | 90 | 11 | +| 130 | 0 | 91 | 11 | ## Client diff --git a/api_docs/ui_actions_enhanced.mdx b/api_docs/ui_actions_enhanced.mdx index c0da2c7d4f60f..a3633934b1d90 100644 --- a/api_docs/ui_actions_enhanced.mdx +++ b/api_docs/ui_actions_enhanced.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/uiActionsEnhanced title: "uiActionsEnhanced" image: https://source.unsplash.com/400x175/?github summary: API docs for the uiActionsEnhanced plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActionsEnhanced'] warning: 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. --- diff --git a/api_docs/url_forwarding.mdx b/api_docs/url_forwarding.mdx index aba7d3eace322..567e080676d96 100644 --- a/api_docs/url_forwarding.mdx +++ b/api_docs/url_forwarding.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/urlForwarding title: "urlForwarding" image: https://source.unsplash.com/400x175/?github summary: API docs for the urlForwarding plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'urlForwarding'] warning: 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. --- diff --git a/api_docs/usage_collection.devdocs.json b/api_docs/usage_collection.devdocs.json index 6cd6a743a1afc..0db23a5c1de9a 100644 --- a/api_docs/usage_collection.devdocs.json +++ b/api_docs/usage_collection.devdocs.json @@ -141,9 +141,7 @@ "Report whenever a UI event occurs for UI counters to report it" ], "signature": [ - "(appName: string, type: ", - "UiCounterMetricType", - ", eventNames: string | string[], count?: number | undefined) => void" + "(appName: string, type: string, eventNames: string | string[], count?: number | undefined) => void" ], "path": "src/plugins/usage_collection/public/plugin.tsx", "deprecated": false, @@ -165,12 +163,12 @@ { "parentPluginId": "usageCollection", "id": "def-public.UsageCollectionSetup.reportUiCounter.$2", - "type": "CompoundType", + "type": "string", "tags": [], "label": "type", "description": [], "signature": [ - "UiCounterMetricType" + "string" ], "path": "src/plugins/usage_collection/public/plugin.tsx", "deprecated": false, @@ -233,9 +231,7 @@ "Report whenever a UI event occurs for UI counters to report it" ], "signature": [ - "(appName: string, type: ", - "UiCounterMetricType", - ", eventNames: string | string[], count?: number | undefined) => void" + "(appName: string, type: string, eventNames: string | string[], count?: number | undefined) => void" ], "path": "src/plugins/usage_collection/public/plugin.tsx", "deprecated": false, @@ -257,12 +253,12 @@ { "parentPluginId": "usageCollection", "id": "def-public.UsageCollectionStart.reportUiCounter.$2", - "type": "CompoundType", + "type": "string", "tags": [], "label": "type", "description": [], "signature": [ - "UiCounterMetricType" + "string" ], "path": "src/plugins/usage_collection/public/plugin.tsx", "deprecated": false, @@ -673,7 +669,7 @@ "\nPossible type values in the schema" ], "signature": [ - "\"boolean\" | \"keyword\" | \"date\" | \"long\" | \"double\" | \"text\" | \"integer\" | \"short\" | \"byte\" | \"float\"" + "\"boolean\" | \"keyword\" | \"date\" | \"text\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"double\"" ], "path": "src/plugins/usage_collection/server/collector/types.ts", "deprecated": false, diff --git a/api_docs/usage_collection.mdx b/api_docs/usage_collection.mdx index 148112e4cedd7..094129f39acac 100644 --- a/api_docs/usage_collection.mdx +++ b/api_docs/usage_collection.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/usageCollection title: "usageCollection" image: https://source.unsplash.com/400x175/?github summary: API docs for the usageCollection plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'usageCollection'] warning: 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. --- diff --git a/api_docs/ux.mdx b/api_docs/ux.mdx index 178021f899567..0d917900d0779 100644 --- a/api_docs/ux.mdx +++ b/api_docs/ux.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/ux title: "ux" image: https://source.unsplash.com/400x175/?github summary: API docs for the ux plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ux'] warning: 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. --- diff --git a/api_docs/vis_default_editor.mdx b/api_docs/vis_default_editor.mdx index 39ed269626843..734b98bcf4d69 100644 --- a/api_docs/vis_default_editor.mdx +++ b/api_docs/vis_default_editor.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visDefaultEditor title: "visDefaultEditor" image: https://source.unsplash.com/400x175/?github summary: API docs for the visDefaultEditor plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visDefaultEditor'] warning: 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. --- diff --git a/api_docs/vis_type_heatmap.mdx b/api_docs/vis_type_heatmap.mdx index fae7bb9740083..18e54123753bd 100644 --- a/api_docs/vis_type_heatmap.mdx +++ b/api_docs/vis_type_heatmap.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visTypeHeatmap title: "visTypeHeatmap" image: https://source.unsplash.com/400x175/?github summary: API docs for the visTypeHeatmap plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeHeatmap'] warning: 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. --- diff --git a/api_docs/vis_type_pie.mdx b/api_docs/vis_type_pie.mdx index 4fc45fcb6aba5..cde65bc547e04 100644 --- a/api_docs/vis_type_pie.mdx +++ b/api_docs/vis_type_pie.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visTypePie title: "visTypePie" image: https://source.unsplash.com/400x175/?github summary: API docs for the visTypePie plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypePie'] warning: 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. --- diff --git a/api_docs/vis_type_table.mdx b/api_docs/vis_type_table.mdx index 2cc7aedc0273d..2b248fe2c786a 100644 --- a/api_docs/vis_type_table.mdx +++ b/api_docs/vis_type_table.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visTypeTable title: "visTypeTable" image: https://source.unsplash.com/400x175/?github summary: API docs for the visTypeTable plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTable'] warning: 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. --- diff --git a/api_docs/vis_type_timelion.mdx b/api_docs/vis_type_timelion.mdx index 9c9cad5c2e3e5..8504bdd821d90 100644 --- a/api_docs/vis_type_timelion.mdx +++ b/api_docs/vis_type_timelion.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visTypeTimelion title: "visTypeTimelion" image: https://source.unsplash.com/400x175/?github summary: API docs for the visTypeTimelion plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimelion'] warning: 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. --- diff --git a/api_docs/vis_type_timeseries.mdx b/api_docs/vis_type_timeseries.mdx index 9f5ac15c84c38..466b84e5c8c8c 100644 --- a/api_docs/vis_type_timeseries.mdx +++ b/api_docs/vis_type_timeseries.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visTypeTimeseries title: "visTypeTimeseries" image: https://source.unsplash.com/400x175/?github summary: API docs for the visTypeTimeseries plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimeseries'] warning: 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. --- diff --git a/api_docs/vis_type_vega.mdx b/api_docs/vis_type_vega.mdx index 631d63a22c18e..ecc9a52457d3c 100644 --- a/api_docs/vis_type_vega.mdx +++ b/api_docs/vis_type_vega.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visTypeVega title: "visTypeVega" image: https://source.unsplash.com/400x175/?github summary: API docs for the visTypeVega plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVega'] warning: 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. --- diff --git a/api_docs/vis_type_vislib.devdocs.json b/api_docs/vis_type_vislib.devdocs.json index ad1196c648308..502f92a30a92d 100644 --- a/api_docs/vis_type_vislib.devdocs.json +++ b/api_docs/vis_type_vislib.devdocs.json @@ -39,7 +39,7 @@ "label": "type", "description": [], "signature": [ - "\"goal\" | \"heatmap\" | \"metric\" | \"gauge\" | \"pie\"" + "\"goal\" | \"heatmap\" | \"gauge\" | \"metric\" | \"pie\"" ], "path": "src/plugins/vis_types/vislib/public/types.ts", "deprecated": false @@ -338,7 +338,7 @@ "label": "VislibChartType", "description": [], "signature": [ - "\"goal\" | \"heatmap\" | \"metric\" | \"gauge\" | \"pie\"" + "\"goal\" | \"heatmap\" | \"gauge\" | \"metric\" | \"pie\"" ], "path": "src/plugins/vis_types/vislib/public/types.ts", "deprecated": false, diff --git a/api_docs/vis_type_vislib.mdx b/api_docs/vis_type_vislib.mdx index 6efbe56cf250b..38e6a565d2537 100644 --- a/api_docs/vis_type_vislib.mdx +++ b/api_docs/vis_type_vislib.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visTypeVislib title: "visTypeVislib" image: https://source.unsplash.com/400x175/?github summary: API docs for the visTypeVislib plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVislib'] warning: 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. --- diff --git a/api_docs/vis_type_xy.mdx b/api_docs/vis_type_xy.mdx index b66a01e52859b..22b7747b48476 100644 --- a/api_docs/vis_type_xy.mdx +++ b/api_docs/vis_type_xy.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visTypeXy title: "visTypeXy" image: https://source.unsplash.com/400x175/?github summary: API docs for the visTypeXy plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeXy'] warning: 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. --- diff --git a/api_docs/visualizations.devdocs.json b/api_docs/visualizations.devdocs.json index 8c02d49b762fb..49e78b9d9604d 100644 --- a/api_docs/visualizations.devdocs.json +++ b/api_docs/visualizations.devdocs.json @@ -83,6 +83,35 @@ "path": "src/plugins/visualizations/public/vis_types/base_vis_type.ts", "deprecated": false }, + { + "parentPluginId": "visualizations", + "id": "def-public.BaseVisType.navigateToLens", + "type": "Function", + "tags": [], + "label": "navigateToLens", + "description": [], + "signature": [ + "((params?: ", + { + "pluginId": "visualizations", + "scope": "common", + "docId": "kibVisualizationsPluginApi", + "section": "def-common.VisParams", + "text": "VisParams" + }, + " | undefined) => Promise<", + { + "pluginId": "visualizations", + "scope": "public", + "docId": "kibVisualizationsPluginApi", + "section": "def-public.NavigateToLensContext", + "text": "NavigateToLensContext" + }, + " | null> | undefined) | undefined" + ], + "path": "src/plugins/visualizations/public/vis_types/base_vis_type.ts", + "deprecated": false + }, { "parentPluginId": "visualizations", "id": "def-public.BaseVisType.icon", @@ -1264,7 +1293,7 @@ }, "[]; }" ], - "path": "src/plugins/visualizations/common/prepare_log_table.ts", + "path": "src/plugins/visualizations/common/utils/prepare_log_table.ts", "deprecated": false, "children": [ { @@ -1283,7 +1312,7 @@ "text": "Datatable" } ], - "path": "src/plugins/visualizations/common/prepare_log_table.ts", + "path": "src/plugins/visualizations/common/utils/prepare_log_table.ts", "deprecated": false, "isRequired": true }, @@ -1304,7 +1333,7 @@ }, "[]" ], - "path": "src/plugins/visualizations/common/prepare_log_table.ts", + "path": "src/plugins/visualizations/common/utils/prepare_log_table.ts", "deprecated": false, "isRequired": true } @@ -2061,6 +2090,63 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "visualizations", + "id": "def-public.NavigateToLensContext", + "type": "Interface", + "tags": [], + "label": "NavigateToLensContext", + "description": [], + "path": "src/plugins/visualizations/public/vis_types/types.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "visualizations", + "id": "def-public.NavigateToLensContext.layers", + "type": "Object", + "tags": [], + "label": "layers", + "description": [], + "signature": [ + "{ [key: string]: ", + { + "pluginId": "visualizations", + "scope": "public", + "docId": "kibVisualizationsPluginApi", + "section": "def-public.VisualizeEditorLayersContext", + "text": "VisualizeEditorLayersContext" + }, + "; }" + ], + "path": "src/plugins/visualizations/public/vis_types/types.ts", + "deprecated": false + }, + { + "parentPluginId": "visualizations", + "id": "def-public.NavigateToLensContext.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "path": "src/plugins/visualizations/public/vis_types/types.ts", + "deprecated": false + }, + { + "parentPluginId": "visualizations", + "id": "def-public.NavigateToLensContext.configuration", + "type": "Object", + "tags": [], + "label": "configuration", + "description": [], + "signature": [ + "{ fill: string | number; legend: { isVisible: boolean; position: string; shouldTruncate: boolean; maxLines: number; showSingleSeries: boolean; }; gridLinesVisibility: { x: boolean; yLeft: boolean; yRight: boolean; }; extents: { yLeftExtent: AxisExtents; yRightExtent: AxisExtents; }; }" + ], + "path": "src/plugins/visualizations/public/vis_types/types.ts", + "deprecated": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "visualizations", "id": "def-public.Schema", @@ -3495,6 +3581,61 @@ ], "returnComment": [] }, + { + "parentPluginId": "visualizations", + "id": "def-public.VisTypeDefinition.navigateToLens", + "type": "Function", + "tags": [], + "label": "navigateToLens", + "description": [ + "\nIf given, it will navigateToLens with the given viz params.\nEvery visualization that wants to be edited also in Lens should have this function.\nIt receives the current visualization params as a parameter and should return the correct config\nin order to be displayed in the Lens editor." + ], + "signature": [ + "((params?: ", + { + "pluginId": "visualizations", + "scope": "common", + "docId": "kibVisualizationsPluginApi", + "section": "def-common.VisParams", + "text": "VisParams" + }, + " | undefined) => Promise<", + { + "pluginId": "visualizations", + "scope": "public", + "docId": "kibVisualizationsPluginApi", + "section": "def-public.NavigateToLensContext", + "text": "NavigateToLensContext" + }, + " | null> | undefined) | undefined" + ], + "path": "src/plugins/visualizations/public/vis_types/types.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "visualizations", + "id": "def-public.VisTypeDefinition.navigateToLens.$1", + "type": "Object", + "tags": [], + "label": "params", + "description": [], + "signature": [ + { + "pluginId": "visualizations", + "scope": "common", + "docId": "kibVisualizationsPluginApi", + "section": "def-common.VisParams", + "text": "VisParams" + }, + " | undefined" + ], + "path": "src/plugins/visualizations/public/vis_types/types.ts", + "deprecated": false, + "isRequired": false + } + ], + "returnComment": [] + }, { "parentPluginId": "visualizations", "id": "def-public.VisTypeDefinition.getUsedIndexPattern", @@ -4207,6 +4348,218 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "visualizations", + "id": "def-public.VisualizeEditorLayersContext", + "type": "Interface", + "tags": [], + "label": "VisualizeEditorLayersContext", + "description": [], + "path": "src/plugins/visualizations/public/vis_types/types.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "visualizations", + "id": "def-public.VisualizeEditorLayersContext.indexPatternId", + "type": "string", + "tags": [], + "label": "indexPatternId", + "description": [], + "path": "src/plugins/visualizations/public/vis_types/types.ts", + "deprecated": false + }, + { + "parentPluginId": "visualizations", + "id": "def-public.VisualizeEditorLayersContext.splitWithDateHistogram", + "type": "CompoundType", + "tags": [], + "label": "splitWithDateHistogram", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "src/plugins/visualizations/public/vis_types/types.ts", + "deprecated": false + }, + { + "parentPluginId": "visualizations", + "id": "def-public.VisualizeEditorLayersContext.timeFieldName", + "type": "string", + "tags": [], + "label": "timeFieldName", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "src/plugins/visualizations/public/vis_types/types.ts", + "deprecated": false + }, + { + "parentPluginId": "visualizations", + "id": "def-public.VisualizeEditorLayersContext.chartType", + "type": "string", + "tags": [], + "label": "chartType", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "src/plugins/visualizations/public/vis_types/types.ts", + "deprecated": false + }, + { + "parentPluginId": "visualizations", + "id": "def-public.VisualizeEditorLayersContext.axisPosition", + "type": "string", + "tags": [], + "label": "axisPosition", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "src/plugins/visualizations/public/vis_types/types.ts", + "deprecated": false + }, + { + "parentPluginId": "visualizations", + "id": "def-public.VisualizeEditorLayersContext.termsParams", + "type": "Object", + "tags": [], + "label": "termsParams", + "description": [], + "signature": [ + "Record | undefined" + ], + "path": "src/plugins/visualizations/public/vis_types/types.ts", + "deprecated": false + }, + { + "parentPluginId": "visualizations", + "id": "def-public.VisualizeEditorLayersContext.splitField", + "type": "string", + "tags": [], + "label": "splitField", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "src/plugins/visualizations/public/vis_types/types.ts", + "deprecated": false + }, + { + "parentPluginId": "visualizations", + "id": "def-public.VisualizeEditorLayersContext.splitMode", + "type": "string", + "tags": [], + "label": "splitMode", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "src/plugins/visualizations/public/vis_types/types.ts", + "deprecated": false + }, + { + "parentPluginId": "visualizations", + "id": "def-public.VisualizeEditorLayersContext.splitFilters", + "type": "Array", + "tags": [], + "label": "splitFilters", + "description": [], + "signature": [ + "SplitByFilters[] | undefined" + ], + "path": "src/plugins/visualizations/public/vis_types/types.ts", + "deprecated": false + }, + { + "parentPluginId": "visualizations", + "id": "def-public.VisualizeEditorLayersContext.palette", + "type": "Object", + "tags": [], + "label": "palette", + "description": [], + "signature": [ + { + "pluginId": "charts", + "scope": "common", + "docId": "kibChartsPluginApi", + "section": "def-common.PaletteOutput", + "text": "PaletteOutput" + }, + "<{ [key: string]: unknown; }> | undefined" + ], + "path": "src/plugins/visualizations/public/vis_types/types.ts", + "deprecated": false + }, + { + "parentPluginId": "visualizations", + "id": "def-public.VisualizeEditorLayersContext.metrics", + "type": "Array", + "tags": [], + "label": "metrics", + "description": [], + "signature": [ + "VisualizeEditorMetricContext[]" + ], + "path": "src/plugins/visualizations/public/vis_types/types.ts", + "deprecated": false + }, + { + "parentPluginId": "visualizations", + "id": "def-public.VisualizeEditorLayersContext.timeInterval", + "type": "string", + "tags": [], + "label": "timeInterval", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "src/plugins/visualizations/public/vis_types/types.ts", + "deprecated": false + }, + { + "parentPluginId": "visualizations", + "id": "def-public.VisualizeEditorLayersContext.format", + "type": "string", + "tags": [], + "label": "format", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "src/plugins/visualizations/public/vis_types/types.ts", + "deprecated": false + }, + { + "parentPluginId": "visualizations", + "id": "def-public.VisualizeEditorLayersContext.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "src/plugins/visualizations/public/vis_types/types.ts", + "deprecated": false + }, + { + "parentPluginId": "visualizations", + "id": "def-public.VisualizeEditorLayersContext.layerId", + "type": "string", + "tags": [], + "label": "layerId", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "src/plugins/visualizations/public/vis_types/types.ts", + "deprecated": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "visualizations", "id": "def-public.VisualizeInput", @@ -4374,6 +4727,20 @@ } ], "misc": [ + { + "parentPluginId": "visualizations", + "id": "def-public.ACTION_CONVERT_TO_LENS", + "type": "string", + "tags": [], + "label": "ACTION_CONVERT_TO_LENS", + "description": [], + "signature": [ + "\"ACTION_CONVERT_TO_LENS\"" + ], + "path": "src/plugins/visualizations/public/triggers/index.ts", + "deprecated": false, + "initialIsOpen": false + }, { "parentPluginId": "visualizations", "id": "def-public.Dimension", @@ -4382,19 +4749,9 @@ "label": "Dimension", "description": [], "signature": [ - "[(", - { - "pluginId": "visualizations", - "scope": "common", - "docId": "kibVisualizationsPluginApi", - "section": "def-common.ExpressionValueVisDimension", - "text": "ExpressionValueVisDimension" - }, - " | ", - "ExpressionValueXYDimension", - ")[] | undefined, string]" + "[DimensionColumn[] | undefined, string]" ], - "path": "src/plugins/visualizations/common/prepare_log_table.ts", + "path": "src/plugins/visualizations/common/utils/prepare_log_table.ts", "deprecated": false, "initialIsOpen": false }, @@ -4414,7 +4771,7 @@ "section": "def-common.DatatableColumn", "text": "DatatableColumn" }, - "; format: { id?: string | undefined; params: Record; }; }" + "; format: { id?: string | undefined; params?: Record | undefined; }; }" ], "path": "src/plugins/visualizations/common/expression_functions/vis_dimension.ts", "deprecated": false, @@ -4582,6 +4939,20 @@ "deprecated": false, "initialIsOpen": false }, + { + "parentPluginId": "visualizations", + "id": "def-public.VISUALIZE_EDITOR_TRIGGER", + "type": "string", + "tags": [], + "label": "VISUALIZE_EDITOR_TRIGGER", + "description": [], + "signature": [ + "\"VISUALIZE_EDITOR_TRIGGER\"" + ], + "path": "src/plugins/visualizations/public/triggers/index.ts", + "deprecated": false, + "initialIsOpen": false + }, { "parentPluginId": "visualizations", "id": "def-public.VISUALIZE_EMBEDDABLE_TYPE", @@ -5267,6 +5638,148 @@ "common": { "classes": [], "functions": [ + { + "parentPluginId": "visualizations", + "id": "def-common.findAccessorOrFail", + "type": "Function", + "tags": [], + "label": "findAccessorOrFail", + "description": [], + "signature": [ + "(accessor: string | number, columns: ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.DatatableColumn", + "text": "DatatableColumn" + }, + "[]) => number | ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.DatatableColumn", + "text": "DatatableColumn" + } + ], + "path": "src/plugins/visualizations/common/utils/accessors.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "visualizations", + "id": "def-common.findAccessorOrFail.$1", + "type": "CompoundType", + "tags": [], + "label": "accessor", + "description": [], + "signature": [ + "string | number" + ], + "path": "src/plugins/visualizations/common/utils/accessors.ts", + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "visualizations", + "id": "def-common.findAccessorOrFail.$2", + "type": "Array", + "tags": [], + "label": "columns", + "description": [], + "signature": [ + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.DatatableColumn", + "text": "DatatableColumn" + }, + "[]" + ], + "path": "src/plugins/visualizations/common/utils/accessors.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "visualizations", + "id": "def-common.getAccessorByDimension", + "type": "Function", + "tags": [], + "label": "getAccessorByDimension", + "description": [], + "signature": [ + "(dimension: string | ", + { + "pluginId": "visualizations", + "scope": "common", + "docId": "kibVisualizationsPluginApi", + "section": "def-common.ExpressionValueVisDimension", + "text": "ExpressionValueVisDimension" + }, + ", columns: ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.DatatableColumn", + "text": "DatatableColumn" + }, + "[]) => string" + ], + "path": "src/plugins/visualizations/common/utils/accessors.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "visualizations", + "id": "def-common.getAccessorByDimension.$1", + "type": "CompoundType", + "tags": [], + "label": "dimension", + "description": [], + "signature": [ + "string | ", + { + "pluginId": "visualizations", + "scope": "common", + "docId": "kibVisualizationsPluginApi", + "section": "def-common.ExpressionValueVisDimension", + "text": "ExpressionValueVisDimension" + } + ], + "path": "src/plugins/visualizations/common/utils/accessors.ts", + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "visualizations", + "id": "def-common.getAccessorByDimension.$2", + "type": "Array", + "tags": [], + "label": "columns", + "description": [], + "signature": [ + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.DatatableColumn", + "text": "DatatableColumn" + }, + "[]" + ], + "path": "src/plugins/visualizations/common/utils/accessors.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "visualizations", "id": "def-common.prepareLogTable", @@ -5327,7 +5840,7 @@ }, "[]; }" ], - "path": "src/plugins/visualizations/common/prepare_log_table.ts", + "path": "src/plugins/visualizations/common/utils/prepare_log_table.ts", "deprecated": false, "children": [ { @@ -5346,7 +5859,7 @@ "text": "Datatable" } ], - "path": "src/plugins/visualizations/common/prepare_log_table.ts", + "path": "src/plugins/visualizations/common/utils/prepare_log_table.ts", "deprecated": false, "isRequired": true }, @@ -5367,7 +5880,7 @@ }, "[]" ], - "path": "src/plugins/visualizations/common/prepare_log_table.ts", + "path": "src/plugins/visualizations/common/utils/prepare_log_table.ts", "deprecated": false, "isRequired": true } @@ -5902,19 +6415,9 @@ "label": "Dimension", "description": [], "signature": [ - "[(", - { - "pluginId": "visualizations", - "scope": "common", - "docId": "kibVisualizationsPluginApi", - "section": "def-common.ExpressionValueVisDimension", - "text": "ExpressionValueVisDimension" - }, - " | ", - "ExpressionValueXYDimension", - ")[] | undefined, string]" + "[DimensionColumn[] | undefined, string]" ], - "path": "src/plugins/visualizations/common/prepare_log_table.ts", + "path": "src/plugins/visualizations/common/utils/prepare_log_table.ts", "deprecated": false, "initialIsOpen": false }, @@ -5934,7 +6437,7 @@ "section": "def-common.DatatableColumn", "text": "DatatableColumn" }, - "; format: { id?: string | undefined; params: Record; }; }" + "; format: { id?: string | undefined; params?: Record | undefined; }; }" ], "path": "src/plugins/visualizations/common/expression_functions/vis_dimension.ts", "deprecated": false, diff --git a/api_docs/visualizations.mdx b/api_docs/visualizations.mdx index c7470bc20d9e8..c154e7e2d2e65 100644 --- a/api_docs/visualizations.mdx +++ b/api_docs/visualizations.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visualizations title: "visualizations" image: https://source.unsplash.com/400x175/?github summary: API docs for the visualizations plugin -date: 2022-02-11 +date: 2022-02-28 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] warning: 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. --- @@ -18,7 +18,7 @@ Contact [Vis Editors](https://github.com/orgs/elastic/teams/kibana-vis-editors) | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 316 | 12 | 296 | 15 | +| 347 | 12 | 326 | 14 | ## Client From a7b4af42dd66ad13b6e84b5e7b857262103f0ea7 Mon Sep 17 00:00:00 2001 From: Julia Bardi <90178898+juliaElastic@users.noreply.github.com> Date: Mon, 28 Feb 2022 16:46:18 +0100 Subject: [PATCH 049/102] [Fleet] fixed system integration duplicate error (#126439) * [Fleet] fixed system integration duplicate error * fix comment typo --- .../create_package_policy_page/index.test.tsx | 162 +++++++++++------- .../create_package_policy_page/index.tsx | 10 +- 2 files changed, 108 insertions(+), 64 deletions(-) diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/index.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/index.test.tsx index 7a15276afbcd1..23429cc40c388 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/index.test.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/index.test.tsx @@ -20,6 +20,7 @@ import { sendGetAgentStatus, useIntraAppState, useStartServices, + useGetPackageInfoByKey, } from '../../../hooks'; import { CreatePackagePolicyPage } from './index'; @@ -43,7 +44,72 @@ jest.mock('../../../hooks', () => { sendGetOneAgentPolicy: jest.fn().mockResolvedValue({ data: { item: { id: 'agent-policy-1', name: 'Agent policy 1', namespace: 'default' } }, }), - useGetPackageInfoByKey: jest.fn().mockReturnValue({ + useGetPackageInfoByKey: jest.fn(), + sendCreatePackagePolicy: jest + .fn() + .mockResolvedValue({ data: { item: { id: 'policy-1', inputs: [] } } }), + sendCreateAgentPolicy: jest.fn().mockResolvedValue({ + data: { item: { id: 'agent-policy-2', name: 'Agent policy 2', namespace: 'default' } }, + }), + useIntraAppState: jest.fn().mockReturnValue({}), + useStartServices: jest.fn().mockReturnValue({ + application: { navigateToApp: jest.fn() }, + notifications: { + toasts: { + addError: jest.fn(), + addSuccess: jest.fn(), + }, + }, + docLinks: { + links: { + fleet: {}, + }, + }, + http: { + basePath: { + get: () => 'http://localhost:5620', + prepend: (url: string) => 'http://localhost:5620' + url, + }, + }, + chrome: { + docTitle: { + change: jest.fn(), + }, + setBreadcrumbs: jest.fn(), + }, + }), + }; +}); + +jest.mock('react-router-dom', () => ({ + ...jest.requireActual('react-router-dom'), + useLocation: jest.fn().mockReturnValue({ search: '' }), + useHistory: jest.fn().mockReturnValue({ + push: jest.fn(), + }), +})); + +describe('when on the package policy create page', () => { + const createPageUrlPath = pagePathGetters.add_integration_to_policy({ pkgkey: 'nginx-1.3.0' })[1]; + + let testRenderer: TestRenderer; + let renderResult: ReturnType; + const render = () => + (renderResult = testRenderer.render( + + + + )); + let mockPackageInfo: any; + + beforeEach(() => { + testRenderer = createFleetTestRendererMock(); + mockApiCalls(testRenderer.startServices.http); + testRenderer.mountHistory.push(createPageUrlPath); + + // (useGetPackageInfoByKey as jest.Mock).mockClear(); + + mockPackageInfo = { data: { item: { name: 'nginx', @@ -104,67 +170,9 @@ jest.mock('../../../hooks', () => { }, }, isLoading: false, - }), - sendCreatePackagePolicy: jest - .fn() - .mockResolvedValue({ data: { item: { id: 'policy-1', inputs: [] } } }), - sendCreateAgentPolicy: jest.fn().mockResolvedValue({ - data: { item: { id: 'agent-policy-2', name: 'Agent policy 2', namespace: 'default' } }, - }), - useIntraAppState: jest.fn().mockReturnValue({}), - useStartServices: jest.fn().mockReturnValue({ - application: { navigateToApp: jest.fn() }, - notifications: { - toasts: { - addError: jest.fn(), - addSuccess: jest.fn(), - }, - }, - docLinks: { - links: { - fleet: {}, - }, - }, - http: { - basePath: { - get: () => 'http://localhost:5620', - prepend: (url: string) => 'http://localhost:5620' + url, - }, - }, - chrome: { - docTitle: { - change: jest.fn(), - }, - setBreadcrumbs: jest.fn(), - }, - }), - }; -}); - -jest.mock('react-router-dom', () => ({ - ...jest.requireActual('react-router-dom'), - useLocation: jest.fn().mockReturnValue({ search: '' }), - useHistory: jest.fn().mockReturnValue({ - push: jest.fn(), - }), -})); - -describe('when on the package policy create page', () => { - const createPageUrlPath = pagePathGetters.add_integration_to_policy({ pkgkey: 'nginx-1.3.0' })[1]; - - let testRenderer: TestRenderer; - let renderResult: ReturnType; - const render = () => - (renderResult = testRenderer.render( - - - - )); + }; - beforeEach(() => { - testRenderer = createFleetTestRendererMock(); - mockApiCalls(testRenderer.startServices.http); - testRenderer.mountHistory.push(createPageUrlPath); + (useGetPackageInfoByKey as jest.Mock).mockReturnValue(mockPackageInfo); }); describe('and Route state is provided via Fleet HashRouter', () => { @@ -345,6 +353,38 @@ describe('when on the package policy create page', () => { }); }); + test('should create agent policy without sys monitoring when new hosts is selected for system integration', async () => { + (useGetPackageInfoByKey as jest.Mock).mockReturnValue({ + ...mockPackageInfo, + data: { + item: { + ...mockPackageInfo.data!.item, + name: 'system', + }, + }, + }); + + render(); + + await waitFor(() => { + renderResult.getByDisplayValue('Agent policy 2'); + }); + + await act(async () => { + fireEvent.click(renderResult.getByText(/Save and continue/).closest('button')!); + }); + + expect(sendCreateAgentPolicy as jest.MockedFunction).toHaveBeenCalledWith( + { + description: '', + monitoring_enabled: ['logs', 'metrics'], + name: 'Agent policy 2', + namespace: 'default', + }, + { withSysMonitoring: false } + ); + }); + describe('without query param', () => { beforeEach(() => { render(); diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/index.tsx index 98e96ce598561..1524f9c1745ef 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/index.tsx @@ -24,7 +24,7 @@ import { import type { EuiStepProps } from '@elastic/eui/src/components/steps/step'; import { safeLoad } from 'js-yaml'; -import { dataTypes, splitPkgKey } from '../../../../../../common'; +import { dataTypes, FLEET_SYSTEM_PACKAGE, splitPkgKey } from '../../../../../../common'; import type { AgentPolicy, NewAgentPolicy, @@ -386,7 +386,11 @@ export const CreatePackagePolicyPage: React.FunctionComponent = () => { const createAgentPolicy = useCallback(async (): Promise => { let policyId; setFormState('LOADING'); - const resp = await sendCreateAgentPolicy(newAgentPolicy, { withSysMonitoring }); + // do not create agent policy with system integration if package policy already is for system package + const packagePolicyIsSystem = packagePolicy?.package?.name === FLEET_SYSTEM_PACKAGE; + const resp = await sendCreateAgentPolicy(newAgentPolicy, { + withSysMonitoring: withSysMonitoring && !packagePolicyIsSystem, + }); if (resp.error) { setFormState('VALID'); throw resp.error; @@ -398,7 +402,7 @@ export const CreatePackagePolicyPage: React.FunctionComponent = () => { updatePackagePolicy({ policy_id: policyId }); } return policyId; - }, [newAgentPolicy, updatePackagePolicy, withSysMonitoring]); + }, [newAgentPolicy, updatePackagePolicy, withSysMonitoring, packagePolicy]); const onSubmit = useCallback(async () => { if (formState === 'VALID' && hasErrors) { From fcfac8c21b9d5a1d34e6a0d2bbe3465a1bd62b8c Mon Sep 17 00:00:00 2001 From: Dmitry Tomashevich <39378793+Dmitriynj@users.noreply.github.com> Date: Mon, 28 Feb 2022 19:12:42 +0300 Subject: [PATCH 050/102] [Discover] Add `Copy to clipboard` ability for column name of Document Explorer (#123892) * [Discover] copy column name to clipboard * [Discover] add ability to use it for http * [Discover] remove redundant span * [Discover] update unit tests * Update src/plugins/discover/public/components/discover_grid/copy_column_name_button.tsx Co-authored-by: Matthias Wilhelm * [Discover] import copyToClipboard util function from elastic ui * [Discover] add unit tests Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Matthias Wilhelm --- .../copy_column_name_button.test.tsx | 49 ++++++++ .../discover_grid/copy_column_name_button.tsx | 28 +++++ .../discover_grid_columns.test.tsx | 105 ++++++++++++++++++ .../discover_grid/discover_grid_columns.tsx | 2 + 4 files changed, 184 insertions(+) create mode 100644 src/plugins/discover/public/components/discover_grid/copy_column_name_button.test.tsx create mode 100644 src/plugins/discover/public/components/discover_grid/copy_column_name_button.tsx diff --git a/src/plugins/discover/public/components/discover_grid/copy_column_name_button.test.tsx b/src/plugins/discover/public/components/discover_grid/copy_column_name_button.test.tsx new file mode 100644 index 0000000000000..66bfefe32f6a0 --- /dev/null +++ b/src/plugins/discover/public/components/discover_grid/copy_column_name_button.test.tsx @@ -0,0 +1,49 @@ +/* + * 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 React from 'react'; +import { buildCopyColumnNameButton } from './copy_column_name_button'; +import { EuiButton } from '@elastic/eui'; +import { mountWithIntl } from '@kbn/test-jest-helpers'; + +const execCommandMock = (global.document.execCommand = jest.fn()); +const warn = jest.spyOn(console, 'warn').mockImplementation(() => {}); + +describe('Copy to clipboard button', () => { + it('should copy to clipboard on click', () => { + const { label, iconType, onClick } = buildCopyColumnNameButton('test-field-name'); + execCommandMock.mockImplementationOnce(() => true); + + const wrapper = mountWithIntl( + + {label} + + ); + + wrapper.find(EuiButton).simulate('click'); + + expect(execCommandMock).toHaveBeenCalledWith('copy'); + expect(warn).not.toHaveBeenCalled(); + }); + + it('should not copy to clipboard on click', () => { + const { label, iconType, onClick } = buildCopyColumnNameButton('test-field-name'); + execCommandMock.mockImplementationOnce(() => false); + + const wrapper = mountWithIntl( + + {label} + + ); + + wrapper.find(EuiButton).simulate('click'); + + expect(execCommandMock).toHaveBeenCalledWith('copy'); + expect(warn).toHaveBeenCalledWith('Unable to copy to clipboard.'); + }); +}); diff --git a/src/plugins/discover/public/components/discover_grid/copy_column_name_button.tsx b/src/plugins/discover/public/components/discover_grid/copy_column_name_button.tsx new file mode 100644 index 0000000000000..e3f972ff3df26 --- /dev/null +++ b/src/plugins/discover/public/components/discover_grid/copy_column_name_button.tsx @@ -0,0 +1,28 @@ +/* + * 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 React from 'react'; +import { copyToClipboard, EuiListGroupItemProps } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n-react'; + +export function buildCopyColumnNameButton(columnName: string) { + const copyToClipBoardButton: EuiListGroupItemProps = { + size: 'xs', + label: ( + + ), + iconType: 'copyClipboard', + iconProps: { size: 'm' }, + onClick: () => copyToClipboard(columnName), + }; + + return copyToClipBoardButton; +} diff --git a/src/plugins/discover/public/components/discover_grid/discover_grid_columns.test.tsx b/src/plugins/discover/public/components/discover_grid/discover_grid_columns.test.tsx index ef3e954d41cfc..a9116e616946f 100644 --- a/src/plugins/discover/public/components/discover_grid/discover_grid_columns.test.tsx +++ b/src/plugins/discover/public/components/discover_grid/discover_grid_columns.test.tsx @@ -24,6 +24,21 @@ describe('Discover grid columns', function () { Array [ Object { "actions": Object { + "additional": Array [ + Object { + "iconProps": Object { + "size": "m", + }, + "iconType": "copyClipboard", + "label": , + "onClick": [Function], + "size": "xs", + }, + ], "showHide": Object { "iconType": "cross", "label": "Remove column", @@ -39,6 +54,21 @@ describe('Discover grid columns', function () { }, Object { "actions": Object { + "additional": Array [ + Object { + "iconProps": Object { + "size": "m", + }, + "iconType": "copyClipboard", + "label": , + "onClick": [Function], + "size": "xs", + }, + ], "showHide": Object { "iconType": "cross", "label": "Remove column", @@ -68,6 +98,21 @@ describe('Discover grid columns', function () { Array [ Object { "actions": Object { + "additional": Array [ + Object { + "iconProps": Object { + "size": "m", + }, + "iconType": "copyClipboard", + "label": , + "onClick": [Function], + "size": "xs", + }, + ], "showHide": false, "showMoveLeft": false, "showMoveRight": false, @@ -83,6 +128,21 @@ describe('Discover grid columns', function () { }, Object { "actions": Object { + "additional": Array [ + Object { + "iconProps": Object { + "size": "m", + }, + "iconType": "copyClipboard", + "label": , + "onClick": [Function], + "size": "xs", + }, + ], "showHide": false, "showMoveLeft": false, "showMoveRight": false, @@ -109,6 +169,21 @@ describe('Discover grid columns', function () { Array [ Object { "actions": Object { + "additional": Array [ + Object { + "iconProps": Object { + "size": "m", + }, + "iconType": "copyClipboard", + "label": , + "onClick": [Function], + "size": "xs", + }, + ], "showHide": false, "showMoveLeft": true, "showMoveRight": true, @@ -138,6 +213,21 @@ describe('Discover grid columns', function () { }, Object { "actions": Object { + "additional": Array [ + Object { + "iconProps": Object { + "size": "m", + }, + "iconType": "copyClipboard", + "label": , + "onClick": [Function], + "size": "xs", + }, + ], "showHide": Object { "iconType": "cross", "label": "Remove column", @@ -156,6 +246,21 @@ describe('Discover grid columns', function () { }, Object { "actions": Object { + "additional": Array [ + Object { + "iconProps": Object { + "size": "m", + }, + "iconType": "copyClipboard", + "label": , + "onClick": [Function], + "size": "xs", + }, + ], "showHide": Object { "iconType": "cross", "label": "Remove column", diff --git a/src/plugins/discover/public/components/discover_grid/discover_grid_columns.tsx b/src/plugins/discover/public/components/discover_grid/discover_grid_columns.tsx index 5e4ec7a4f9629..2aee9ae2229c7 100644 --- a/src/plugins/discover/public/components/discover_grid/discover_grid_columns.tsx +++ b/src/plugins/discover/public/components/discover_grid/discover_grid_columns.tsx @@ -16,6 +16,7 @@ import { buildCellActions } from './discover_grid_cell_actions'; import { getSchemaByKbnType } from './discover_grid_schema'; import { SelectButton } from './discover_grid_document_selection'; import { defaultTimeColumnWidth } from './constants'; +import { buildCopyColumnNameButton } from './copy_column_name_button'; export function getLeadControlColumns() { return [ @@ -80,6 +81,7 @@ export function buildEuiGridColumn( }, showMoveLeft: !defaultColumns, showMoveRight: !defaultColumns, + additional: columnName === '_source' ? undefined : [buildCopyColumnNameButton(columnName)], }, cellActions: indexPatternField ? buildCellActions(indexPatternField) : [], }; From 51f2e4d0104d5bff12cfa9779fcc12b08b5ed923 Mon Sep 17 00:00:00 2001 From: Devon Thomson Date: Mon, 28 Feb 2022 11:41:34 -0500 Subject: [PATCH 051/102] [Dashboard][Controls] Options List API & Validation System (#123889) Created API for Options List with validation and total count. Implemented into Options List Embeddable. Co-authored-by: andreadelrio --- .../control_types/options_list/types.ts | 16 + src/plugins/controls/common/types.ts | 1 + .../public/__stories__/controls.stories.tsx | 20 ++ .../embeddable/control_group_container.tsx | 54 ++-- .../options_list/options_list.scss | 26 ++ .../options_list/options_list_component.tsx | 55 ++-- .../options_list/options_list_embeddable.tsx | 222 +++++++++----- .../options_list_popover_component.tsx | 177 +++++++---- .../options_list/options_list_reducers.ts | 16 +- .../options_list/options_list_strings.ts | 41 ++- src/plugins/controls/public/plugin.ts | 88 +++--- .../controls/public/services/controls.ts | 26 -- src/plugins/controls/public/services/data.ts | 1 + src/plugins/controls/public/services/http.ts | 13 + src/plugins/controls/public/services/index.ts | 11 +- .../public/services/kibana/controls.ts | 25 +- .../controls/public/services/kibana/data.ts | 3 +- .../controls/public/services/kibana/http.ts | 25 ++ .../controls/public/services/kibana/index.ts | 7 +- .../public/services/kibana/options_list.ts | 113 +++++++ .../controls/public/services/options_list.ts | 31 ++ .../public/services/storybook/data.ts | 1 + .../public/services/storybook/index.ts | 8 +- .../public/services/storybook/options_list.ts | 35 +++ .../controls/public/services/stub/controls.ts | 32 +- .../{storybook/controls.ts => stub/http.ts} | 10 +- .../controls/public/services/stub/index.ts | 7 +- src/plugins/controls/public/types.ts | 10 +- .../options_list_suggestions_route.ts | 197 +++++++++++++ src/plugins/controls/server/plugin.ts | 14 +- .../dashboard_container_factory.tsx | 10 +- .../lib/dashboard_control_group.ts | 16 +- .../lib/sync_dashboard_container_input.ts | 5 + .../autocomplete/autocomplete_service.ts | 15 + src/plugins/data/server/autocomplete/index.ts | 2 +- src/plugins/data/server/mocks.ts | 6 + src/plugins/data/server/plugin.ts | 4 +- .../dashboard_controls_integration.ts | 277 +++++++++++++----- test/functional/services/filter_bar.ts | 6 + 39 files changed, 1267 insertions(+), 359 deletions(-) create mode 100644 src/plugins/controls/public/services/http.ts create mode 100644 src/plugins/controls/public/services/kibana/http.ts create mode 100644 src/plugins/controls/public/services/kibana/options_list.ts create mode 100644 src/plugins/controls/public/services/options_list.ts create mode 100644 src/plugins/controls/public/services/storybook/options_list.ts rename src/plugins/controls/public/services/{storybook/controls.ts => stub/http.ts} (59%) create mode 100644 src/plugins/controls/server/control_types/options_list/options_list_suggestions_route.ts diff --git a/src/plugins/controls/common/control_types/options_list/types.ts b/src/plugins/controls/common/control_types/options_list/types.ts index 9a6a96e861bed..5561b80b81153 100644 --- a/src/plugins/controls/common/control_types/options_list/types.ts +++ b/src/plugins/controls/common/control_types/options_list/types.ts @@ -6,6 +6,8 @@ * Side Public License, v 1. */ +import { BoolQuery } from '@kbn/es-query'; +import { FieldSpec } from '../../../../data_views/common'; import { ControlInput } from '../../types'; export const OPTIONS_LIST_CONTROL = 'optionsListControl'; @@ -18,3 +20,17 @@ export interface OptionsListEmbeddableInput extends ControlInput { singleSelect?: boolean; loading?: boolean; } + +export interface OptionsListResponse { + suggestions: string[]; + totalCardinality: number; + invalidSelections?: string[]; +} + +export interface OptionsListRequestBody { + filters?: Array<{ bool: BoolQuery }>; + selectedOptions?: string[]; + searchString?: string; + fieldSpec?: FieldSpec; + fieldName: string; +} diff --git a/src/plugins/controls/common/types.ts b/src/plugins/controls/common/types.ts index ad03bb642f798..d8cb073f64241 100644 --- a/src/plugins/controls/common/types.ts +++ b/src/plugins/controls/common/types.ts @@ -17,6 +17,7 @@ export interface ParentIgnoreSettings { ignoreFilters?: boolean; ignoreQuery?: boolean; ignoreTimerange?: boolean; + ignoreValidations?: boolean; } export type ControlInput = EmbeddableInput & { diff --git a/src/plugins/controls/public/__stories__/controls.stories.tsx b/src/plugins/controls/public/__stories__/controls.stories.tsx index ac181f2ab32dd..d75941c818e39 100644 --- a/src/plugins/controls/public/__stories__/controls.stories.tsx +++ b/src/plugins/controls/public/__stories__/controls.stories.tsx @@ -13,6 +13,7 @@ import uuid from 'uuid'; import { getFlightOptionsAsync, + getFlightSearchOptions, storybookFlightsDataView, } from '../../../presentation_util/public/mocks'; import { @@ -31,6 +32,9 @@ import { pluginServices, registry } from '../services/storybook'; import { replaceValueSuggestionMethod } from '../services/storybook/data'; import { injectStorybookDataView } from '../services/storybook/data_views'; import { populateStorybookControlFactories } from './storybook_control_factories'; +import { OptionsListRequest } from '../services/options_list'; +import { OptionsListResponse } from '../control_types/options_list/types'; +import { replaceOptionsListMethod } from '../services/storybook/options_list'; export default { title: 'Controls', @@ -41,6 +45,22 @@ export default { injectStorybookDataView(storybookFlightsDataView); replaceValueSuggestionMethod(getFlightOptionsAsync); +const storybookStubOptionsListRequest = async ( + request: OptionsListRequest, + abortSignal: AbortSignal +) => + new Promise((r) => + setTimeout( + () => + r({ + suggestions: getFlightSearchOptions(request.field.name, request.searchString), + totalCardinality: 100, + }), + 120 + ) + ); +replaceOptionsListMethod(storybookStubOptionsListRequest); + const ControlGroupStoryComponent: FC<{ panels?: ControlsPanels; edit?: boolean; diff --git a/src/plugins/controls/public/control_group/embeddable/control_group_container.tsx b/src/plugins/controls/public/control_group/embeddable/control_group_container.tsx index 65c93e42a472f..b420e026ac1d3 100644 --- a/src/plugins/controls/public/control_group/embeddable/control_group_container.tsx +++ b/src/plugins/controls/public/control_group/embeddable/control_group_container.tsx @@ -11,15 +11,8 @@ import { uniqBy } from 'lodash'; import ReactDOM from 'react-dom'; import deepEqual from 'fast-deep-equal'; import { Filter, uniqFilters } from '@kbn/es-query'; -import { EMPTY, merge, pipe, Subscription, concat } from 'rxjs'; -import { - distinctUntilChanged, - debounceTime, - catchError, - switchMap, - map, - take, -} from 'rxjs/operators'; +import { EMPTY, merge, pipe, Subscription } from 'rxjs'; +import { distinctUntilChanged, debounceTime, catchError, switchMap, map } from 'rxjs/operators'; import { ControlGroupInput, @@ -77,29 +70,34 @@ export class ControlGroupContainer extends Container< pluginServices.getServices().controls.getControlFactory, parent ); - const anyChildChangePipe = pipe( - map(() => this.getChildIds()), - distinctUntilChanged(deepEqual), - // children may change, so make sure we subscribe/unsubscribe with switchMap - switchMap((newChildIds: string[]) => - merge( - ...newChildIds.map((childId) => - this.getChild(childId) - .getOutput$() - // Embeddables often throw errors into their output streams. - .pipe(catchError(() => EMPTY)) + // when all children are ready start recalculating filters when any child's output changes + this.untilReady().then(() => { + this.recalculateOutput(); + + const anyChildChangePipe = pipe( + map(() => this.getChildIds()), + distinctUntilChanged(deepEqual), + + // children may change, so make sure we subscribe/unsubscribe with switchMap + switchMap((newChildIds: string[]) => + merge( + ...newChildIds.map((childId) => + this.getChild(childId) + .getOutput$() + // Embeddables often throw errors into their output streams. + .pipe(catchError(() => EMPTY)) + ) ) ) - ) - ); + ); - this.subscriptions.add( - concat( - merge(this.getOutput$(), this.getOutput$().pipe(anyChildChangePipe)).pipe(take(1)), // the first time filters are built, don't debounce so that initial filters are built immediately - merge(this.getOutput$(), this.getOutput$().pipe(anyChildChangePipe)).pipe(debounceTime(10)) - ).subscribe(this.recalculateOutput) - ); + this.subscriptions.add( + merge(this.getOutput$(), this.getOutput$().pipe(anyChildChangePipe)) + .pipe(debounceTime(10)) + .subscribe(this.recalculateOutput) + ); + }); } private recalculateOutput = () => { diff --git a/src/plugins/controls/public/control_types/options_list/options_list.scss b/src/plugins/controls/public/control_types/options_list/options_list.scss index 3ccd79ee48a6c..53ad3990cd371 100644 --- a/src/plugins/controls/public/control_types/options_list/options_list.scss +++ b/src/plugins/controls/public/control_types/options_list/options_list.scss @@ -22,6 +22,32 @@ border-color: darken($euiColorLightestShade, 2%); } +.optionsList__popoverTitle { + display: flex; + align-items: center; + justify-content: space-between; +} + +.optionsList__filterInvalid { + color: $euiTextSubduedColor; + text-decoration: line-through; + margin-left: $euiSizeS; + font-weight: 300; +} + +.optionsList__ignoredBadge { + margin-left: $euiSizeS; +} + +.optionsList-control-ignored-selection-title { + padding-left: $euiSizeS; +} + +.optionsList__selectionInvalid { + text-decoration: line-through; + color: $euiTextSubduedColor; +} + .optionsList--filterBtnWrapper { height: 100%; } diff --git a/src/plugins/controls/public/control_types/options_list/options_list_component.tsx b/src/plugins/controls/public/control_types/options_list/options_list_component.tsx index 5547618349b94..3e3d950f532db 100644 --- a/src/plugins/controls/public/control_types/options_list/options_list_component.tsx +++ b/src/plugins/controls/public/control_types/options_list/options_list_component.tsx @@ -10,7 +10,7 @@ import { EuiFilterButton, EuiFilterGroup, EuiPopover, useResizeObserver } from ' import React, { useCallback, useEffect, useMemo, useState, useRef } from 'react'; import { BehaviorSubject, Subject } from 'rxjs'; import classNames from 'classnames'; -import { debounce } from 'lodash'; +import { debounce, isEmpty } from 'lodash'; import { OptionsListStrings } from './options_list_strings'; import { optionsListReducers } from './options_list_reducers'; @@ -20,11 +20,16 @@ import { useReduxEmbeddableContext } from '../../../../presentation_util/public' import './options_list.scss'; import { useStateObservable } from '../../hooks/use_state_observable'; import { OptionsListEmbeddableInput } from './types'; +import { DataViewField } from '../../../../data_views/public'; -// Availableoptions and loading state is controled by the embeddable, but is not considered embeddable input. +// OptionsListComponentState is controlled by the embeddable, but is not considered embeddable input. export interface OptionsListComponentState { - availableOptions?: string[]; loading: boolean; + field?: DataViewField; + totalCardinality?: number; + availableOptions?: string[]; + invalidSelections?: string[]; + validSelections?: string[]; } export const OptionsListComponent = ({ @@ -52,10 +57,11 @@ export const OptionsListComponent = ({ ); // useStateObservable to get component state from Embeddable - const { availableOptions, loading } = useStateObservable( - componentStateSubject, - componentStateSubject.getValue() - ); + const { availableOptions, loading, invalidSelections, validSelections, totalCardinality, field } = + useStateObservable( + componentStateSubject, + componentStateSubject.getValue() + ); // debounce loading state so loading doesn't flash when user types const [buttonLoading, setButtonLoading] = useState(true); @@ -80,12 +86,24 @@ export const OptionsListComponent = ({ [typeaheadSubject] ); - const { selectedOptionsCount, selectedOptionsString } = useMemo(() => { + const { hasSelections, selectionDisplayNode, validSelectionsCount } = useMemo(() => { return { - selectedOptionsCount: selectedOptions?.length, - selectedOptionsString: selectedOptions?.join(OptionsListStrings.summary.getSeparator()), + hasSelections: !isEmpty(validSelections) || !isEmpty(invalidSelections), + validSelectionsCount: validSelections?.length, + selectionDisplayNode: ( + <> + {validSelections && ( + {validSelections?.join(OptionsListStrings.summary.getSeparator())} + )} + {invalidSelections && ( + + {invalidSelections.join(OptionsListStrings.summary.getSeparator())} + + )} + + ), }; - }, [selectedOptions]); + }, [validSelections, invalidSelections]); const button = (

@@ -94,17 +112,15 @@ export const OptionsListComponent = ({ isLoading={buttonLoading} className={classNames('optionsList--filterBtn', { 'optionsList--filterBtnSingle': controlStyle !== 'twoLine', - 'optionsList--filterBtnPlaceholder': !selectedOptionsCount, + 'optionsList--filterBtnPlaceholder': !hasSelections, })} data-test-subj={`optionsList-control-${id}`} onClick={() => setIsPopoverOpen((openState) => !openState)} isSelected={isPopoverOpen} - numActiveFilters={selectedOptionsCount} - hasActiveFilters={(selectedOptionsCount ?? 0) > 0} + numActiveFilters={validSelectionsCount} + hasActiveFilters={Boolean(validSelectionsCount)} > - {!selectedOptionsCount - ? OptionsListStrings.summary.getPlaceholder() - : selectedOptionsString} + {hasSelections ? selectionDisplayNode : OptionsListStrings.summary.getPlaceholder()}
); @@ -127,11 +143,14 @@ export const OptionsListComponent = ({ repositionOnScroll > diff --git a/src/plugins/controls/public/control_types/options_list/options_list_embeddable.tsx b/src/plugins/controls/public/control_types/options_list/options_list_embeddable.tsx index ce570fcbf769e..971fe98b52662 100644 --- a/src/plugins/controls/public/control_types/options_list/options_list_embeddable.tsx +++ b/src/plugins/controls/public/control_types/options_list/options_list_embeddable.tsx @@ -8,47 +8,47 @@ import { Filter, - buildEsQuery, compareFilters, buildPhraseFilter, buildPhrasesFilter, + COMPARE_ALL_OPTIONS, } from '@kbn/es-query'; import React from 'react'; import ReactDOM from 'react-dom'; -import { isEqual } from 'lodash'; +import { isEmpty, isEqual } from 'lodash'; import deepEqual from 'fast-deep-equal'; import { merge, Subject, Subscription, BehaviorSubject } from 'rxjs'; import { tap, debounceTime, map, distinctUntilChanged, skip } from 'rxjs/operators'; import { OptionsListComponent, OptionsListComponentState } from './options_list_component'; -import { - withSuspense, - LazyReduxEmbeddableWrapper, - ReduxEmbeddableWrapperPropsWithChildren, -} from '../../../../presentation_util/public'; import { OptionsListEmbeddableInput, OPTIONS_LIST_CONTROL } from './types'; -import { ControlsDataViewsService } from '../../services/data_views'; +import { DataView, DataViewField } from '../../../../data_views/public'; import { Embeddable, IContainer } from '../../../../embeddable/public'; -import { ControlsDataService } from '../../services/data'; +import { ControlsDataViewsService } from '../../services/data_views'; import { optionsListReducers } from './options_list_reducers'; import { OptionsListStrings } from './options_list_strings'; -import { DataView } from '../../../../data_views/public'; import { ControlInput, ControlOutput } from '../..'; import { pluginServices } from '../../services'; +import { + withSuspense, + LazyReduxEmbeddableWrapper, + ReduxEmbeddableWrapperPropsWithChildren, +} from '../../../../presentation_util/public'; +import { ControlsOptionsListService } from '../../services/options_list'; const OptionsListReduxWrapper = withSuspense< ReduxEmbeddableWrapperPropsWithChildren >(LazyReduxEmbeddableWrapper); const diffDataFetchProps = ( - current?: OptionsListDataFetchProps, - last?: OptionsListDataFetchProps + last?: OptionsListDataFetchProps, + current?: OptionsListDataFetchProps ) => { if (!current || !last) return false; const { filters: currentFilters, ...currentWithoutFilters } = current; const { filters: lastFilters, ...lastWithoutFilters } = last; if (!deepEqual(currentWithoutFilters, lastWithoutFilters)) return false; - if (!compareFilters(lastFilters ?? [], currentFilters ?? [])) return false; + if (!compareFilters(lastFilters ?? [], currentFilters ?? [], COMPARE_ALL_OPTIONS)) return false; return true; }; @@ -60,9 +60,6 @@ interface OptionsListDataFetchProps { filters?: ControlInput['filters']; } -const fieldMissingError = (fieldName: string) => - new Error(`field ${fieldName} not found in index pattern`); - export class OptionsListEmbeddable extends Embeddable { public readonly type = OPTIONS_LIST_CONTROL; public deferEmbeddableLoad = true; @@ -71,17 +68,21 @@ export class OptionsListEmbeddable extends Embeddable = new Subject(); + private abortController?: AbortController; private dataView?: DataView; + private field?: DataViewField; private searchString = ''; // State to be passed down to component private componentState: OptionsListComponentState; private componentStateSubject$ = new BehaviorSubject({ + invalidSelections: [], + validSelections: [], loading: true, }); @@ -89,14 +90,28 @@ export class OptionsListEmbeddable extends Embeddable(); this.initialize(); } + private initialize = async () => { + const { selectedOptions: initialSelectedOptions } = this.getInput(); + if (!initialSelectedOptions) this.setInitializationFinished(); + this.runOptionsListQuery().then(async () => { + if (initialSelectedOptions) { + await this.buildFilter(); + this.setInitializationFinished(); + } + this.setupSubscriptions(); + }); + }; + private setupSubscriptions = () => { const dataFetchPipe = this.getInput$().pipe( map((newInput) => ({ @@ -111,7 +126,6 @@ export class OptionsListEmbeddable extends Embeddable(); const typeaheadPipe = this.typeaheadSubject.pipe( tap((newSearchString) => (this.searchString = newSearchString)), debounceTime(100) @@ -119,30 +133,78 @@ export class OptionsListEmbeddable extends Embeddable isEqual(a.selectedOptions, b.selectedOptions)), + debounceTime(100), + distinctUntilChanged((a, b) => isEqual(a.validSelections, b.validSelections)), skip(1) // skip the first input update because initial filters will be built by initialize. ) .subscribe(() => this.buildFilter()) ); + + /** + * when input selectedOptions changes, check all selectedOptions against the latest value of invalidSelections. + **/ + this.subscriptions.add( + this.getInput$() + .pipe(distinctUntilChanged((a, b) => isEqual(a.selectedOptions, b.selectedOptions))) + .subscribe(({ selectedOptions: newSelectedOptions }) => { + if (!newSelectedOptions || isEmpty(newSelectedOptions)) { + this.updateComponentState({ + validSelections: [], + invalidSelections: [], + }); + return; + } + const { invalidSelections } = this.componentStateSubject$.getValue(); + const newValidSelections: string[] = []; + const newInvalidSelections: string[] = []; + for (const selectedOption of newSelectedOptions) { + if (invalidSelections?.includes(selectedOption)) { + newInvalidSelections.push(selectedOption); + continue; + } + newValidSelections.push(selectedOption); + } + this.updateComponentState({ + validSelections: newValidSelections, + invalidSelections: newInvalidSelections, + }); + }) + ); }; - private getCurrentDataView = async (): Promise => { - const { dataViewId } = this.getInput(); - if (this.dataView && this.dataView.id === dataViewId) return this.dataView; - this.dataView = await this.dataViewsService.get(dataViewId); - if (this.dataView === undefined) { - this.onFatalError(new Error(OptionsListStrings.errors.getDataViewNotFoundError(dataViewId))); + private getCurrentDataViewAndField = async (): Promise<{ + dataView: DataView; + field: DataViewField; + }> => { + const { dataViewId, fieldName } = this.getInput(); + if (!this.dataView || this.dataView.id !== dataViewId) { + this.dataView = await this.dataViewsService.get(dataViewId); + if (this.dataView === undefined) { + this.onFatalError( + new Error(OptionsListStrings.errors.getDataViewNotFoundError(dataViewId)) + ); + } + this.updateOutput({ dataViews: [this.dataView] }); + } + + if (!this.field || this.field.name !== fieldName) { + this.field = this.dataView.getFieldByName(fieldName); + if (this.field === undefined) { + this.onFatalError(new Error(OptionsListStrings.errors.getDataViewNotFoundError(fieldName))); + } + this.updateComponentState({ field: this.field }); } - this.updateOutput({ dataViews: [this.dataView] }); - return this.dataView; + + return { dataView: this.dataView, field: this.field! }; }; private updateComponentState(changes: Partial) { @@ -153,62 +215,67 @@ export class OptionsListEmbeddable extends Embeddable { + private runOptionsListQuery = async () => { this.updateComponentState({ loading: true }); - const { ignoreParentSettings, filters, fieldName, query } = this.getInput(); - const dataView = await this.getCurrentDataView(); - const field = dataView.getFieldByName(fieldName); - - if (!field) throw fieldMissingError(fieldName); - - const boolFilter = [ - buildEsQuery( - dataView, - ignoreParentSettings?.ignoreQuery ? [] : query ?? [], - ignoreParentSettings?.ignoreFilters ? [] : filters ?? [] - ), - ]; - - // TODO Switch between `terms_agg` and `terms_enum` method depending on the value of ignoreParentSettings - // const method = Object.values(ignoreParentSettings || {}).includes(false) ? - - const newOptions = await this.dataService.autocomplete.getValueSuggestions({ - query: this.searchString, - indexPattern: dataView, - useTimeRange: !ignoreParentSettings?.ignoreTimerange, - method: 'terms_agg', // terms_agg method is required to use timeRange - boolFilter, - field, - }); - this.updateComponentState({ availableOptions: newOptions, loading: false }); - }; + const { dataView, field } = await this.getCurrentDataViewAndField(); + const { ignoreParentSettings, filters, query, selectedOptions, timeRange } = this.getInput(); + + if (this.abortController) this.abortController.abort(); + this.abortController = new AbortController(); + const { suggestions, invalidSelections, totalCardinality } = + await this.optionsListService.runOptionsListRequest( + { + field, + dataView, + selectedOptions, + searchString: this.searchString, + ...(ignoreParentSettings?.ignoreQuery ? {} : { query }), + ...(ignoreParentSettings?.ignoreFilters ? {} : { filters }), + ...(ignoreParentSettings?.ignoreTimerange ? {} : { timeRange }), + }, + this.abortController.signal + ); + + if (!selectedOptions || isEmpty(invalidSelections) || ignoreParentSettings?.ignoreValidations) { + this.updateComponentState({ + availableOptions: suggestions, + invalidSelections: undefined, + validSelections: selectedOptions, + totalCardinality, + loading: false, + }); + return; + } - private initialize = async () => { - const initialSelectedOptions = this.getInput().selectedOptions; - if (initialSelectedOptions) { - await this.getCurrentDataView(); - await this.buildFilter(); + const valid: string[] = []; + const invalid: string[] = []; + + for (const selectedOption of selectedOptions) { + if (invalidSelections?.includes(selectedOption)) invalid.push(selectedOption); + else valid.push(selectedOption); } - this.setInitializationFinished(); - this.setupSubscriptions(); + this.updateComponentState({ + availableOptions: suggestions, + invalidSelections: invalid, + validSelections: valid, + totalCardinality, + loading: false, + }); }; private buildFilter = async () => { - const { fieldName, selectedOptions } = this.getInput(); - if (!selectedOptions || selectedOptions.length === 0) { + const { validSelections } = this.componentState; + if (!validSelections || isEmpty(validSelections)) { this.updateOutput({ filters: [] }); return; } - const dataView = await this.getCurrentDataView(); - const field = dataView.getFieldByName(this.getInput().fieldName); - - if (!field) throw fieldMissingError(fieldName); + const { dataView, field } = await this.getCurrentDataViewAndField(); let newFilter: Filter; - if (selectedOptions.length === 1) { - newFilter = buildPhraseFilter(field, selectedOptions[0], dataView); + if (validSelections.length === 1) { + newFilter = buildPhraseFilter(field, validSelections[0], dataView); } else { - newFilter = buildPhrasesFilter(field, selectedOptions, dataView); + newFilter = buildPhrasesFilter(field, validSelections, dataView); } newFilter.meta.key = field?.name; @@ -216,11 +283,12 @@ export class OptionsListEmbeddable extends Embeddable { - this.fetchAvailableOptions(); + this.runOptionsListQuery(); }; public destroy = () => { super.destroy(); + this.abortController?.abort(); this.subscriptions.unsubscribe(); }; diff --git a/src/plugins/controls/public/control_types/options_list/options_list_popover_component.tsx b/src/plugins/controls/public/control_types/options_list/options_list_popover_component.tsx index 68284af6bb47d..ab83b868445a9 100644 --- a/src/plugins/controls/public/control_types/options_list/options_list_popover_component.tsx +++ b/src/plugins/controls/public/control_types/options_list/options_list_popover_component.tsx @@ -14,28 +14,38 @@ import { EuiButtonIcon, EuiFlexGroup, EuiFlexItem, - EuiToolTip, EuiFormRow, + EuiToolTip, EuiSpacer, + EuiBadge, EuiIcon, + EuiTitle, } from '@elastic/eui'; +import { isEmpty } from 'lodash'; import { OptionsListEmbeddableInput } from './types'; import { OptionsListStrings } from './options_list_strings'; +import { DataViewField } from '../../../../data_views/public'; import { optionsListReducers } from './options_list_reducers'; import { OptionsListComponentState } from './options_list_component'; import { useReduxEmbeddableContext } from '../../../../presentation_util/public'; export const OptionsListPopover = ({ + field, loading, searchString, availableOptions, + totalCardinality, + invalidSelections, updateSearchString, width, }: { + field?: DataViewField; searchString: string; + totalCardinality?: number; width: number; loading: OptionsListComponentState['loading']; + invalidSelections?: string[]; updateSearchString: (newSearchString: string) => void; availableOptions: OptionsListComponentState['availableOptions']; }) => { @@ -49,64 +59,94 @@ export const OptionsListPopover = ({ const dispatch = useEmbeddableDispatch(); const { selectedOptions, singleSelect, title } = useEmbeddableSelector((state) => state); - // track selectedOptions in a set for more efficient lookup + // track selectedOptions and invalidSelections in sets for more efficient lookup const selectedOptionsSet = useMemo(() => new Set(selectedOptions), [selectedOptions]); + const invalidSelectionsSet = useMemo( + () => new Set(invalidSelections), + [invalidSelections] + ); + const [showOnlySelected, setShowOnlySelected] = useState(false); return ( <> {title} -
- - - - updateSearchString(event.target.value)} - value={searchString} - data-test-subj="optionsList-control-search-input" - /> - - - - dispatch(clearSelections({}))} - /> - - - - - setShowOnlySelected(!showOnlySelected)} + {field?.type !== 'boolean' && ( +
+ + + + updateSearchString(event.target.value)} + value={searchString} + data-test-subj="optionsList-control-search-input" + placeholder={ + totalCardinality + ? OptionsListStrings.popover.getTotalCardinalityPlaceholder(totalCardinality) + : undefined + } /> - - - - -
+
+ + {invalidSelections && invalidSelections.length > 0 && ( + + + {invalidSelections.length} + + + )} + + + + dispatch(clearSelections({}))} + /> + + + + + setShowOnlySelected(!showOnlySelected)} + /> + + +
+
+
+ )}
300 ? width : undefined }} className="optionsList__items" @@ -145,6 +185,32 @@ export const OptionsListPopover = ({
)} + + {!isEmpty(invalidSelections) && ( + <> + + + + + <> + {invalidSelections?.map((ignoredSelection, index) => ( + dispatch(deselectOption(ignoredSelection))} + > + {`${ignoredSelection}`} + + ))} + + + )} )} {showOnlySelected && ( @@ -152,9 +218,14 @@ export const OptionsListPopover = ({ {selectedOptions && selectedOptions.map((availableOption, index) => ( dispatch(deselectOption(availableOption))} + className={ + invalidSelectionsSet.has(availableOption) + ? 'optionsList__selectionInvalid' + : undefined + } > {`${availableOption}`} diff --git a/src/plugins/controls/public/control_types/options_list/options_list_reducers.ts b/src/plugins/controls/public/control_types/options_list/options_list_reducers.ts index 39f6281a11c6b..15f41380e0d72 100644 --- a/src/plugins/controls/public/control_types/options_list/options_list_reducers.ts +++ b/src/plugins/controls/public/control_types/options_list/options_list_reducers.ts @@ -24,6 +24,20 @@ export const optionsListReducers = { state.selectedOptions = newSelections; } }, + deselectOptions: ( + state: WritableDraft, + action: PayloadAction + ) => { + for (const optionToDeselect of action.payload) { + if (!state.selectedOptions) return; + const itemIndex = state.selectedOptions.indexOf(optionToDeselect); + if (itemIndex !== -1) { + const newSelections = [...state.selectedOptions]; + newSelections.splice(itemIndex, 1); + state.selectedOptions = newSelections; + } + } + }, selectOption: ( state: WritableDraft, action: PayloadAction @@ -38,6 +52,6 @@ export const optionsListReducers = { state.selectedOptions = [action.payload]; }, clearSelections: (state: WritableDraft) => { - state.selectedOptions = []; + if (state.selectedOptions) state.selectedOptions = []; }, }; diff --git a/src/plugins/controls/public/control_types/options_list/options_list_strings.ts b/src/plugins/controls/public/control_types/options_list/options_list_strings.ts index 0a6e46c514d11..537697804dd5b 100644 --- a/src/plugins/controls/public/control_types/options_list/options_list_strings.ts +++ b/src/plugins/controls/public/control_types/options_list/options_list_strings.ts @@ -44,11 +44,11 @@ export const OptionsListStrings = { popover: { getLoadingMessage: () => i18n.translate('controls.optionsList.popover.loading', { - defaultMessage: 'Loading filters', + defaultMessage: 'Loading options', }), getEmptyMessage: () => i18n.translate('controls.optionsList.popover.empty', { - defaultMessage: 'No filters found', + defaultMessage: 'No options found', }), getSelectionsEmptyMessage: () => i18n.translate('controls.optionsList.popover.selectionsEmpty', { @@ -66,6 +66,38 @@ export const OptionsListStrings = { i18n.translate('controls.optionsList.popover.clearAllSelectionsTitle', { defaultMessage: 'Clear selections', }), + getTotalCardinalityTooltip: (totalOptions: number) => + i18n.translate('controls.optionsList.popover.cardinalityTooltip', { + defaultMessage: '{totalOptions} available options.', + values: { totalOptions }, + }), + getTotalCardinalityPlaceholder: (totalOptions: number) => + i18n.translate('controls.optionsList.popover.cardinalityPlaceholder', { + defaultMessage: + 'Search {totalOptions} available {totalOptions, plural, one {option} other {options}}', + values: { totalOptions }, + }), + getInvalidSelectionsTitle: (invalidSelectionCount: number) => + i18n.translate('controls.optionsList.popover.invalidSelectionsTitle', { + defaultMessage: '{invalidSelectionCount} selected options ignored', + values: { invalidSelectionCount }, + }), + getInvalidSelectionsSectionTitle: (invalidSelectionCount: number) => + i18n.translate('controls.optionsList.popover.invalidSelectionsSectionTitle', { + defaultMessage: + 'Ignored {invalidSelectionCount, plural, one {selection} other {selections}}', + values: { invalidSelectionCount }, + }), + getInvalidSelectionsAriaLabel: () => + i18n.translate('controls.optionsList.popover.invalidSelectionsAriaLabel', { + defaultMessage: 'Deselect all ignored selections', + }), + getInvalidSelectionsTooltip: (selectedOptions: number) => + i18n.translate('controls.optionsList.popover.invalidSelectionsTooltip', { + defaultMessage: + '{selectedOptions} selected {selectedOptions, plural, one {option} other {options}} {selectedOptions, plural, one {is} other {are}} ignored because {selectedOptions, plural, one {it is} other {they are}} no longer in the data.', + values: { selectedOptions }, + }), }, errors: { getDataViewNotFoundError: (dataViewId: string) => @@ -73,5 +105,10 @@ export const OptionsListStrings = { defaultMessage: 'Could not locate data view: {dataViewId}', values: { dataViewId }, }), + getfieldNotFoundError: (fieldId: string) => + i18n.translate('controls.optionsList.errors.fieldNotFound', { + defaultMessage: 'Could not locate field: {fieldId}', + values: { fieldId }, + }), }, }; diff --git a/src/plugins/controls/public/plugin.ts b/src/plugins/controls/public/plugin.ts index c4ff865a05e47..0c81f4c826175 100644 --- a/src/plugins/controls/public/plugin.ts +++ b/src/plugins/controls/public/plugin.ts @@ -8,19 +8,21 @@ import { CoreSetup, CoreStart, Plugin } from '../../../core/public'; import { pluginServices } from './services'; -import { registry } from './services/kibana'; import { ControlsPluginSetup, ControlsPluginStart, ControlsPluginSetupDeps, ControlsPluginStartDeps, IEditableControlFactory, - ControlEditorProps, - ControlEmbeddable, ControlInput, } from './types'; -import { OptionsListEmbeddableFactory } from './control_types/options_list'; +import { + OptionsListEmbeddableFactory, + OptionsListEmbeddableInput, +} from './control_types/options_list'; import { ControlGroupContainerFactory, CONTROL_GROUP_TYPE, OPTIONS_LIST_CONTROL } from '.'; +import { controlsService } from './services/kibana/controls'; +import { EmbeddableFactory } from '../../embeddable/public'; export class ControlsPlugin implements @@ -31,63 +33,63 @@ export class ControlsPlugin ControlsPluginStartDeps > { - private inlineEditors: { - [key: string]: { - controlEditorComponent?: (props: ControlEditorProps) => JSX.Element; - presaveTransformFunction?: ( - newInput: Partial, - embeddable?: ControlEmbeddable - ) => Partial; - }; - } = {}; + private async startControlsKibanaServices( + coreStart: CoreStart, + startPlugins: ControlsPluginStartDeps + ) { + const { registry } = await import('./services/kibana'); + pluginServices.setRegistry(registry.start({ coreStart, startPlugins })); + } + + private transferEditorFunctions( + factoryDef: IEditableControlFactory, + factory: EmbeddableFactory + ) { + (factory as IEditableControlFactory).controlEditorComponent = + factoryDef.controlEditorComponent; + (factory as IEditableControlFactory).presaveTransformFunction = + factoryDef.presaveTransformFunction; + } public setup( _coreSetup: CoreSetup, _setupPlugins: ControlsPluginSetupDeps ): ControlsPluginSetup { - _coreSetup.getStartServices().then(([coreStart, deps]) => { - // register control group embeddable factory + const { registerControlType } = controlsService; + + // register control group embeddable factory + _coreSetup.getStartServices().then(([, deps]) => { embeddable.registerEmbeddableFactory( CONTROL_GROUP_TYPE, new ControlGroupContainerFactory(deps.embeddable) ); - }); + // Options List control factory setup + const optionsListFactoryDef = new OptionsListEmbeddableFactory(); + const optionsListFactory = embeddable.registerEmbeddableFactory( + OPTIONS_LIST_CONTROL, + optionsListFactoryDef + )(); + this.transferEditorFunctions( + optionsListFactoryDef, + optionsListFactory + ); + registerControlType(optionsListFactory); + }); const { embeddable } = _setupPlugins; - // create control type embeddable factories. - const optionsListFactory = new OptionsListEmbeddableFactory(); - const editableOptionsListFactory = optionsListFactory as IEditableControlFactory; - this.inlineEditors[OPTIONS_LIST_CONTROL] = { - controlEditorComponent: editableOptionsListFactory.controlEditorComponent, - presaveTransformFunction: editableOptionsListFactory.presaveTransformFunction, + return { + registerControlType, }; - embeddable.registerEmbeddableFactory(OPTIONS_LIST_CONTROL, optionsListFactory); - - return {}; } public start(coreStart: CoreStart, startPlugins: ControlsPluginStartDeps): ControlsPluginStart { - pluginServices.setRegistry(registry.start({ coreStart, startPlugins })); - const { controls: controlsService } = pluginServices.getServices(); - const { embeddable } = startPlugins; - - // register control types with controls service. - const optionsListFactory = embeddable.getEmbeddableFactory(OPTIONS_LIST_CONTROL); - // Temporarily pass along inline editors - inline editing should be made a first-class feature of embeddables - const editableOptionsListFactory = optionsListFactory as IEditableControlFactory; - const { - controlEditorComponent: optionsListControlEditor, - presaveTransformFunction: optionsListPresaveTransform, - } = this.inlineEditors[OPTIONS_LIST_CONTROL]; - editableOptionsListFactory.controlEditorComponent = optionsListControlEditor; - editableOptionsListFactory.presaveTransformFunction = optionsListPresaveTransform; - - if (optionsListFactory) controlsService.registerControlType(optionsListFactory); + this.startControlsKibanaServices(coreStart, startPlugins); + const { getControlFactory, getControlTypes } = controlsService; return { - ContextProvider: pluginServices.getContextProvider(), - controlsService, + getControlFactory, + getControlTypes, }; } diff --git a/src/plugins/controls/public/services/controls.ts b/src/plugins/controls/public/services/controls.ts index 83a3c8eec98d3..7ca396b267e14 100644 --- a/src/plugins/controls/public/services/controls.ts +++ b/src/plugins/controls/public/services/controls.ts @@ -26,29 +26,3 @@ export interface ControlsService { getControlTypes: () => string[]; } - -export const getCommonControlsService = () => { - const controlsFactoriesMap: ControlTypeRegistry = {}; - - const registerControlType = (factory: ControlFactory) => { - controlsFactoriesMap[factory.type] = factory; - }; - - const getControlFactory = < - I extends ControlInput = ControlInput, - O extends ControlOutput = ControlOutput, - E extends ControlEmbeddable = ControlEmbeddable - >( - type: string - ) => { - return controlsFactoriesMap[type] as EmbeddableFactory; - }; - - const getControlTypes = () => Object.keys(controlsFactoriesMap); - - return { - registerControlType, - getControlFactory, - getControlTypes, - }; -}; diff --git a/src/plugins/controls/public/services/data.ts b/src/plugins/controls/public/services/data.ts index 0a99317e29a26..f25b3f6a95801 100644 --- a/src/plugins/controls/public/services/data.ts +++ b/src/plugins/controls/public/services/data.ts @@ -10,4 +10,5 @@ import { DataPublicPluginStart } from '../../../data/public'; export interface ControlsDataService { autocomplete: DataPublicPluginStart['autocomplete']; + query: DataPublicPluginStart['query']; } diff --git a/src/plugins/controls/public/services/http.ts b/src/plugins/controls/public/services/http.ts new file mode 100644 index 0000000000000..1e3d7f92163bd --- /dev/null +++ b/src/plugins/controls/public/services/http.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 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 { CoreSetup } from '../../../../core/public'; + +export interface ControlsHTTPService { + fetch: CoreSetup['http']['fetch']; +} diff --git a/src/plugins/controls/public/services/index.ts b/src/plugins/controls/public/services/index.ts index 5730dbf68cefb..d1dcd9b158a0a 100644 --- a/src/plugins/controls/public/services/index.ts +++ b/src/plugins/controls/public/services/index.ts @@ -13,12 +13,19 @@ import { registry as stubRegistry } from './stub'; import { ControlsPluginStart } from '../types'; import { ControlsDataService } from './data'; import { ControlsService } from './controls'; +import { ControlsHTTPService } from './http'; +import { ControlsOptionsListService } from './options_list'; export interface ControlsServices { + // dependency services dataViews: ControlsDataViewsService; overlays: ControlsOverlaysService; data: ControlsDataService; + http: ControlsHTTPService; + + // controls plugin's own services controls: ControlsService; + optionsList: ControlsOptionsListService; } export const pluginServices = new PluginServices(); @@ -26,7 +33,7 @@ export const pluginServices = new PluginServices(); export const getStubPluginServices = (): ControlsPluginStart => { pluginServices.setRegistry(stubRegistry.start({})); return { - ContextProvider: pluginServices.getContextProvider(), - controlsService: pluginServices.getServices().controls, + getControlFactory: pluginServices.getServices().controls.getControlFactory, + getControlTypes: pluginServices.getServices().controls.getControlTypes, }; }; diff --git a/src/plugins/controls/public/services/kibana/controls.ts b/src/plugins/controls/public/services/kibana/controls.ts index 7c33ee8c33527..8b53c62ff0f4e 100644 --- a/src/plugins/controls/public/services/kibana/controls.ts +++ b/src/plugins/controls/public/services/kibana/controls.ts @@ -6,8 +6,29 @@ * Side Public License, v 1. */ +import { ControlEmbeddable, ControlFactory, ControlInput, ControlOutput } from '../..'; +import { EmbeddableFactory } from '../../../../embeddable/public'; import { PluginServiceFactory } from '../../../../presentation_util/public'; -import { getCommonControlsService, ControlsService } from '../controls'; +import { ControlsService, ControlTypeRegistry } from '../controls'; export type ControlsServiceFactory = PluginServiceFactory; -export const controlsServiceFactory = () => getCommonControlsService(); +export const controlsServiceFactory = () => controlsService; + +const controlsFactoriesMap: ControlTypeRegistry = {}; + +// export controls service directly for use in plugin setup lifecycle +export const controlsService: ControlsService = { + registerControlType: (factory: ControlFactory) => { + controlsFactoriesMap[factory.type] = factory; + }, + getControlFactory: < + I extends ControlInput = ControlInput, + O extends ControlOutput = ControlOutput, + E extends ControlEmbeddable = ControlEmbeddable + >( + type: string + ) => { + return controlsFactoriesMap[type] as EmbeddableFactory; + }, + getControlTypes: () => Object.keys(controlsFactoriesMap), +}; diff --git a/src/plugins/controls/public/services/kibana/data.ts b/src/plugins/controls/public/services/kibana/data.ts index 4b4b9ad8afd81..e411766fe0f34 100644 --- a/src/plugins/controls/public/services/kibana/data.ts +++ b/src/plugins/controls/public/services/kibana/data.ts @@ -17,9 +17,10 @@ export type DataServiceFactory = KibanaPluginServiceFactory< export const dataServiceFactory: DataServiceFactory = ({ startPlugins }) => { const { - data: { autocomplete }, + data: { query, autocomplete }, } = startPlugins; return { autocomplete, + query, }; }; diff --git a/src/plugins/controls/public/services/kibana/http.ts b/src/plugins/controls/public/services/kibana/http.ts new file mode 100644 index 0000000000000..2eda2e4bf3f8c --- /dev/null +++ b/src/plugins/controls/public/services/kibana/http.ts @@ -0,0 +1,25 @@ +/* + * 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 { ControlsHTTPService } from '../http'; +import { ControlsPluginStartDeps } from '../../types'; +import { KibanaPluginServiceFactory } from '../../../../presentation_util/public'; + +export type HttpServiceFactory = KibanaPluginServiceFactory< + ControlsHTTPService, + ControlsPluginStartDeps +>; +export const httpServiceFactory: HttpServiceFactory = ({ coreStart }) => { + const { + http: { fetch }, + } = coreStart; + + return { + fetch, + }; +}; diff --git a/src/plugins/controls/public/services/kibana/index.ts b/src/plugins/controls/public/services/kibana/index.ts index 5f7f05705203e..f87bd744b3541 100644 --- a/src/plugins/controls/public/services/kibana/index.ts +++ b/src/plugins/controls/public/services/kibana/index.ts @@ -19,15 +19,20 @@ import { dataViewsServiceFactory } from './data_views'; import { controlsServiceFactory } from './controls'; import { overlaysServiceFactory } from './overlays'; import { dataServiceFactory } from './data'; +import { httpServiceFactory } from './http'; +import { optionsListServiceFactory } from './options_list'; export const providers: PluginServiceProviders< ControlsServices, KibanaPluginServiceParams > = { + http: new PluginServiceProvider(httpServiceFactory), data: new PluginServiceProvider(dataServiceFactory), overlays: new PluginServiceProvider(overlaysServiceFactory), - controls: new PluginServiceProvider(controlsServiceFactory), dataViews: new PluginServiceProvider(dataViewsServiceFactory), + + optionsList: new PluginServiceProvider(optionsListServiceFactory, ['data', 'http']), + controls: new PluginServiceProvider(controlsServiceFactory), }; export const registry = new PluginServiceRegistry< diff --git a/src/plugins/controls/public/services/kibana/options_list.ts b/src/plugins/controls/public/services/kibana/options_list.ts new file mode 100644 index 0000000000000..eb805ec4dbe02 --- /dev/null +++ b/src/plugins/controls/public/services/kibana/options_list.ts @@ -0,0 +1,113 @@ +/* + * 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 { memoize } from 'lodash'; +import dateMath from '@elastic/datemath'; +import { buildEsQuery } from '@kbn/es-query'; + +import { TimeRange } from '../../../../data/public'; +import { ControlsOptionsListService, OptionsListRequest } from '../options_list'; +import { + OptionsListRequestBody, + OptionsListResponse, +} from '../../control_types/options_list/types'; +import { KibanaPluginServiceFactory } from '../../../../presentation_util/public'; +import { ControlsPluginStartDeps } from '../../types'; +import { ControlsDataService } from '../data'; +import { ControlsHTTPService } from '../http'; + +class OptionsListService implements ControlsOptionsListService { + private data: ControlsDataService; + private http: ControlsHTTPService; + + constructor(requiredServices: OptionsListServiceRequiredServices) { + ({ data: this.data, http: this.http } = requiredServices); + } + + private getRoundedTimeRange = (timeRange: TimeRange) => ({ + from: dateMath.parse(timeRange.from)!.startOf('minute').toISOString(), + to: dateMath.parse(timeRange.to)!.endOf('minute').toISOString(), + }); + + private optionsListCacheResolver = (request: OptionsListRequest) => { + const { + query, + filters, + timeRange, + searchString, + selectedOptions, + field: { name: fieldName }, + dataView: { title: dataViewTitle }, + } = request; + return [ + ...(timeRange ? JSON.stringify(this.getRoundedTimeRange(timeRange)) : []), // round timeRange to the minute to avoid cache misses + Math.floor(Date.now() / 1000 / 60), // Only cache results for a minute in case data changes in ES index + selectedOptions?.join(','), + JSON.stringify(filters), + JSON.stringify(query), + dataViewTitle, + searchString, + fieldName, + ].join('|'); + }; + + private cachedOptionsListRequest = memoize( + async (request: OptionsListRequest, abortSignal: AbortSignal) => { + const index = request.dataView.title; + const requestBody = this.getRequestBody(request); + return await this.http.fetch( + `/api/kibana/controls/optionsList/${index}`, + { + body: JSON.stringify(requestBody), + signal: abortSignal, + method: 'POST', + } + ); + }, + this.optionsListCacheResolver + ); + + private getRequestBody = (request: OptionsListRequest): OptionsListRequestBody => { + const timeService = this.data.query.timefilter.timefilter; + const { query, filters, dataView, timeRange, field, ...passThroughProps } = request; + const timeFilter = timeRange ? timeService.createFilter(dataView, timeRange) : undefined; + const filtersToUse = [...(filters ?? []), ...(timeFilter ? [timeFilter] : [])]; + const esFilters = [buildEsQuery(dataView, query ?? [], filtersToUse ?? [])]; + return { + ...passThroughProps, + filters: esFilters, + fieldName: field.name, + fieldSpec: field.toSpec?.(), + }; + }; + + public runOptionsListRequest = async (request: OptionsListRequest, abortSignal: AbortSignal) => { + try { + return await this.cachedOptionsListRequest(request, abortSignal); + } catch (error) { + // Remove rejected results from memoize cache + this.cachedOptionsListRequest.cache.delete(this.optionsListCacheResolver(request)); + return {} as OptionsListResponse; + } + }; +} + +export interface OptionsListServiceRequiredServices { + data: ControlsDataService; + http: ControlsHTTPService; +} + +export type OptionsListServiceFactory = KibanaPluginServiceFactory< + ControlsOptionsListService, + ControlsPluginStartDeps, + OptionsListServiceRequiredServices +>; + +export const optionsListServiceFactory: OptionsListServiceFactory = (core, requiredServices) => { + return new OptionsListService(requiredServices); +}; diff --git a/src/plugins/controls/public/services/options_list.ts b/src/plugins/controls/public/services/options_list.ts new file mode 100644 index 0000000000000..479d1bee691bb --- /dev/null +++ b/src/plugins/controls/public/services/options_list.ts @@ -0,0 +1,31 @@ +/* + * 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 { Filter, Query } from '@kbn/es-query'; + +import { TimeRange } from '../../../data/public'; +import { DataView, DataViewField } from '../../../data_views/public'; +import { OptionsListRequestBody, OptionsListResponse } from '../control_types/options_list/types'; + +export type OptionsListRequest = Omit< + OptionsListRequestBody, + 'filters' | 'fieldName' | 'fieldSpec' +> & { + timeRange?: TimeRange; + field: DataViewField; + dataView: DataView; + filters?: Filter[]; + query?: Query; +}; + +export interface ControlsOptionsListService { + runOptionsListRequest: ( + request: OptionsListRequest, + abortSignal: AbortSignal + ) => Promise; +} diff --git a/src/plugins/controls/public/services/storybook/data.ts b/src/plugins/controls/public/services/storybook/data.ts index 6d4942b358ac3..c26d7c0835295 100644 --- a/src/plugins/controls/public/services/storybook/data.ts +++ b/src/plugins/controls/public/services/storybook/data.ts @@ -22,4 +22,5 @@ export const dataServiceFactory: DataServiceFactory = () => ({ autocomplete: { getValueSuggestions: valueSuggestionMethod, } as unknown as DataPublicPluginStart['autocomplete'], + query: {} as unknown as DataPublicPluginStart['query'], }); diff --git a/src/plugins/controls/public/services/storybook/index.ts b/src/plugins/controls/public/services/storybook/index.ts index 36d8e7e78869d..4eabd6a1bb006 100644 --- a/src/plugins/controls/public/services/storybook/index.ts +++ b/src/plugins/controls/public/services/storybook/index.ts @@ -15,16 +15,22 @@ import { import { ControlsServices } from '..'; import { dataServiceFactory } from './data'; import { overlaysServiceFactory } from './overlays'; -import { controlsServiceFactory } from './controls'; import { dataViewsServiceFactory } from './data_views'; +import { httpServiceFactory } from '../stub/http'; + +import { optionsListServiceFactory } from './options_list'; +import { controlsServiceFactory } from '../stub/controls'; export type { ControlsServices } from '..'; export const providers: PluginServiceProviders = { dataViews: new PluginServiceProvider(dataViewsServiceFactory), + http: new PluginServiceProvider(httpServiceFactory), data: new PluginServiceProvider(dataServiceFactory), overlays: new PluginServiceProvider(overlaysServiceFactory), + controls: new PluginServiceProvider(controlsServiceFactory), + optionsList: new PluginServiceProvider(optionsListServiceFactory), }; export const pluginServices = new PluginServices(); diff --git a/src/plugins/controls/public/services/storybook/options_list.ts b/src/plugins/controls/public/services/storybook/options_list.ts new file mode 100644 index 0000000000000..ee604042a2064 --- /dev/null +++ b/src/plugins/controls/public/services/storybook/options_list.ts @@ -0,0 +1,35 @@ +/* + * 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 { PluginServiceFactory } from '../../../../presentation_util/public'; +import { OptionsListResponse } from '../../control_types/options_list/types'; +import { ControlsOptionsListService, OptionsListRequest } from '../options_list'; + +export type OptionsListServiceFactory = PluginServiceFactory; + +let optionsListRequestMethod = async (request: OptionsListRequest, abortSignal: AbortSignal) => + new Promise((r) => + setTimeout( + () => + r({ + suggestions: [], + totalCardinality: 100, + }), + 120 + ) + ); + +export const replaceOptionsListMethod = ( + newMethod: (request: OptionsListRequest, abortSignal: AbortSignal) => Promise +) => (optionsListRequestMethod = newMethod); + +export const optionsListServiceFactory: OptionsListServiceFactory = () => { + return { + runOptionsListRequest: optionsListRequestMethod, + }; +}; diff --git a/src/plugins/controls/public/services/stub/controls.ts b/src/plugins/controls/public/services/stub/controls.ts index 7c33ee8c33527..0bc1ae9b9d305 100644 --- a/src/plugins/controls/public/services/stub/controls.ts +++ b/src/plugins/controls/public/services/stub/controls.ts @@ -6,8 +6,36 @@ * Side Public License, v 1. */ +import { ControlEmbeddable, ControlFactory, ControlInput, ControlOutput } from '../..'; +import { EmbeddableFactory } from '../../../../embeddable/public'; import { PluginServiceFactory } from '../../../../presentation_util/public'; -import { getCommonControlsService, ControlsService } from '../controls'; +import { ControlsService, ControlTypeRegistry } from '../controls'; export type ControlsServiceFactory = PluginServiceFactory; -export const controlsServiceFactory = () => getCommonControlsService(); +export const controlsServiceFactory = () => getStubControlsService(); + +export const getStubControlsService = () => { + const controlsFactoriesMap: ControlTypeRegistry = {}; + + const registerControlType = (factory: ControlFactory) => { + controlsFactoriesMap[factory.type] = factory; + }; + + const getControlFactory = < + I extends ControlInput = ControlInput, + O extends ControlOutput = ControlOutput, + E extends ControlEmbeddable = ControlEmbeddable + >( + type: string + ) => { + return controlsFactoriesMap[type] as EmbeddableFactory; + }; + + const getControlTypes = () => Object.keys(controlsFactoriesMap); + + return { + registerControlType, + getControlFactory, + getControlTypes, + }; +}; diff --git a/src/plugins/controls/public/services/storybook/controls.ts b/src/plugins/controls/public/services/stub/http.ts similarity index 59% rename from src/plugins/controls/public/services/storybook/controls.ts rename to src/plugins/controls/public/services/stub/http.ts index 7c33ee8c33527..d33083b0641fc 100644 --- a/src/plugins/controls/public/services/storybook/controls.ts +++ b/src/plugins/controls/public/services/stub/http.ts @@ -6,8 +6,12 @@ * Side Public License, v 1. */ +import { HttpResponse } from '../../../../../core/public'; import { PluginServiceFactory } from '../../../../presentation_util/public'; -import { getCommonControlsService, ControlsService } from '../controls'; +import { ControlsHTTPService } from '../http'; -export type ControlsServiceFactory = PluginServiceFactory; -export const controlsServiceFactory = () => getCommonControlsService(); +type HttpServiceFactory = PluginServiceFactory; + +export const httpServiceFactory: HttpServiceFactory = () => ({ + fetch: async () => ({} as unknown as HttpResponse), +}); diff --git a/src/plugins/controls/public/services/stub/index.ts b/src/plugins/controls/public/services/stub/index.ts index 6927aa65c12b8..ddb0a76057648 100644 --- a/src/plugins/controls/public/services/stub/index.ts +++ b/src/plugins/controls/public/services/stub/index.ts @@ -12,17 +12,22 @@ import { PluginServiceRegistry, } from '../../../../presentation_util/public'; import { ControlsServices } from '..'; +import { httpServiceFactory } from './http'; import { overlaysServiceFactory } from './overlays'; import { controlsServiceFactory } from './controls'; import { dataServiceFactory } from '../storybook/data'; import { dataViewsServiceFactory } from '../storybook/data_views'; +import { optionsListServiceFactory } from '../storybook/options_list'; export const providers: PluginServiceProviders = { + http: new PluginServiceProvider(httpServiceFactory), data: new PluginServiceProvider(dataServiceFactory), overlays: new PluginServiceProvider(overlaysServiceFactory), - controls: new PluginServiceProvider(controlsServiceFactory), dataViews: new PluginServiceProvider(dataViewsServiceFactory), + + controls: new PluginServiceProvider(controlsServiceFactory), + optionsList: new PluginServiceProvider(optionsListServiceFactory), }; export const registry = new PluginServiceRegistry(providers); diff --git a/src/plugins/controls/public/types.ts b/src/plugins/controls/public/types.ts index 70438baec756c..92d03c8dd42c0 100644 --- a/src/plugins/controls/public/types.ts +++ b/src/plugins/controls/public/types.ts @@ -54,13 +54,13 @@ export interface ControlEditorProps { /** * Plugin types */ - -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export interface ControlsPluginSetup {} +export interface ControlsPluginSetup { + registerControlType: ControlsService['registerControlType']; +} export interface ControlsPluginStart { - controlsService: ControlsService; - ContextProvider: React.FC; + getControlFactory: ControlsService['getControlFactory']; + getControlTypes: ControlsService['getControlTypes']; } export interface ControlsPluginSetupDeps { diff --git a/src/plugins/controls/server/control_types/options_list/options_list_suggestions_route.ts b/src/plugins/controls/server/control_types/options_list/options_list_suggestions_route.ts new file mode 100644 index 0000000000000..a2eab10cc77dc --- /dev/null +++ b/src/plugins/controls/server/control_types/options_list/options_list_suggestions_route.ts @@ -0,0 +1,197 @@ +/* + * 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 { get, isEmpty } from 'lodash'; +import { schema } from '@kbn/config-schema'; +import * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; + +import { Observable } from 'rxjs'; + +import { + OptionsListRequestBody, + OptionsListResponse, +} from '../../../common/control_types/options_list/types'; +import { CoreSetup, ElasticsearchClient } from '../../../../../core/server'; +import { getKbnServerError, reportServerError } from '../../../../kibana_utils/server'; +import { PluginSetup as DataPluginSetup } from '../../../../data/server'; +import { FieldSpec, getFieldSubtypeNested } from '../../../../data_views/common'; + +export const setupOptionsListSuggestionsRoute = ( + { http }: CoreSetup, + getAutocompleteSettings: DataPluginSetup['autocomplete']['getAutocompleteSettings'] +) => { + const router = http.createRouter(); + + router.post( + { + path: '/api/kibana/controls/optionsList/{index}', + validate: { + params: schema.object( + { + index: schema.string(), + }, + { unknowns: 'allow' } + ), + body: schema.object( + { + fieldName: schema.string(), + filters: schema.maybe(schema.any()), + fieldSpec: schema.maybe(schema.any()), + searchString: schema.maybe(schema.string()), + selectedOptions: schema.maybe(schema.arrayOf(schema.string())), + }, + { unknowns: 'allow' } + ), + }, + }, + async (context, request, response) => { + try { + const suggestionRequest: OptionsListRequestBody = request.body; + const { index } = request.params; + const esClient = context.core.elasticsearch.client.asCurrentUser; + const suggestionsResponse = await getOptionsListSuggestions({ + abortedEvent$: request.events.aborted$, + request: suggestionRequest, + esClient, + index, + }); + return response.ok({ body: suggestionsResponse }); + } catch (e) { + const kbnErr = getKbnServerError(e); + return reportServerError(response, kbnErr); + } + } + ); + + const getOptionsListSuggestions = async ({ + abortedEvent$, + esClient, + request, + index, + }: { + request: OptionsListRequestBody; + abortedEvent$: Observable; + esClient: ElasticsearchClient; + index: string; + }): Promise => { + const abortController = new AbortController(); + abortedEvent$.subscribe(() => abortController.abort()); + + const { fieldName, searchString, selectedOptions, filters, fieldSpec } = request; + const body = getOptionsListBody(fieldName, fieldSpec, searchString, selectedOptions, filters); + + const rawEsResult = await esClient.search({ index, body }, { signal: abortController.signal }); + + // parse raw ES response into OptionsListSuggestionResponse + const totalCardinality = get(rawEsResult, 'aggregations.unique_terms.value'); + + const suggestions = get(rawEsResult, 'aggregations.suggestions.buckets')?.map( + (suggestion: { key: string; key_as_string: string }) => + fieldSpec?.type === 'string' ? suggestion.key : suggestion.key_as_string + ); + + const rawInvalidSuggestions = get(rawEsResult, 'aggregations.validation.buckets') as { + [key: string]: { doc_count: number }; + }; + const invalidSelections = + rawInvalidSuggestions && !isEmpty(rawInvalidSuggestions) + ? Object.entries(rawInvalidSuggestions) + ?.filter(([, value]) => value?.doc_count === 0) + ?.map(([key]) => key) + : undefined; + + return { + suggestions, + totalCardinality, + invalidSelections, + }; + }; + + const getOptionsListBody = ( + fieldName: string, + fieldSpec?: FieldSpec, + searchString?: string, + selectedOptions?: string[], + filters: estypes.QueryDslQueryContainer[] = [] + ) => { + // https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-regexp-query.html#_standard_operators + const getEscapedQuery = (q: string = '') => + q.replace(/[.?+*|{}[\]()"\\#@&<>~]/g, (match) => `\\${match}`); + + // Helps ensure that the regex is not evaluated eagerly against the terms dictionary + const executionHint = 'map' as const; + + // Suggestions + const shardSize = 10; + const suggestionsAgg = { + terms: { + field: fieldName, + // terms on boolean fields don't support include + ...(fieldSpec?.type !== 'boolean' && { + include: `${getEscapedQuery(searchString ?? '')}.*`, + }), + execution_hint: executionHint, + shard_size: shardSize, + }, + }; + + // Validation + const selectedOptionsFilters = selectedOptions?.reduce((acc, currentOption) => { + acc[currentOption] = { match: { [fieldName]: currentOption } }; + return acc; + }, {} as { [key: string]: { match: { [key: string]: string } } }); + + const validationAgg = + selectedOptionsFilters && !isEmpty(selectedOptionsFilters) + ? { + filters: { + filters: selectedOptionsFilters, + }, + } + : undefined; + + const { terminateAfter, timeout } = getAutocompleteSettings(); + + const body = { + size: 0, + timeout: `${timeout}ms`, + terminate_after: terminateAfter, + query: { + bool: { + filter: filters, + }, + }, + aggs: { + suggestions: suggestionsAgg, + ...(validationAgg ? { validation: validationAgg } : {}), + unique_terms: { + cardinality: { + field: fieldName, + }, + }, + }, + }; + + const subTypeNested = fieldSpec && getFieldSubtypeNested(fieldSpec); + if (subTypeNested) { + return { + ...body, + aggs: { + nestedSuggestions: { + nested: { + path: subTypeNested.nested.path, + }, + aggs: body.aggs, + }, + }, + }; + } + + return body; + }; +}; diff --git a/src/plugins/controls/server/plugin.ts b/src/plugins/controls/server/plugin.ts index fa7b7970c7e64..261737f2775c4 100644 --- a/src/plugins/controls/server/plugin.ts +++ b/src/plugins/controls/server/plugin.ts @@ -7,21 +7,27 @@ */ import { CoreSetup, Plugin } from 'kibana/server'; + import { EmbeddableSetup } from '../../embeddable/server'; +import { PluginSetup as DataSetup } from '../../data/server'; +import { setupOptionsListSuggestionsRoute } from './control_types/options_list/options_list_suggestions_route'; import { controlGroupContainerPersistableStateServiceFactory } from './control_group/control_group_container_factory'; import { optionsListPersistableStateServiceFactory } from './control_types/options_list/options_list_embeddable_factory'; interface SetupDeps { embeddable: EmbeddableSetup; + data: DataSetup; } export class ControlsPlugin implements Plugin { - public setup(core: CoreSetup, plugins: SetupDeps) { - plugins.embeddable.registerEmbeddableFactory(optionsListPersistableStateServiceFactory()); + public setup(core: CoreSetup, { embeddable, data }: SetupDeps) { + embeddable.registerEmbeddableFactory(optionsListPersistableStateServiceFactory()); - plugins.embeddable.registerEmbeddableFactory( - controlGroupContainerPersistableStateServiceFactory(plugins.embeddable) + embeddable.registerEmbeddableFactory( + controlGroupContainerPersistableStateServiceFactory(embeddable) ); + + setupOptionsListSuggestionsRoute(core, data.autocomplete.getAutocompleteSettings); return {}; } diff --git a/src/plugins/dashboard/public/application/embeddable/dashboard_container_factory.tsx b/src/plugins/dashboard/public/application/embeddable/dashboard_container_factory.tsx index 7be36a954d2f1..0ec7ad21bce33 100644 --- a/src/plugins/dashboard/public/application/embeddable/dashboard_container_factory.tsx +++ b/src/plugins/dashboard/public/application/embeddable/dashboard_container_factory.tsx @@ -85,11 +85,15 @@ export class DashboardContainerFactoryDefinition ControlGroupOutput, ControlGroupContainer >(CONTROL_GROUP_TYPE); + const { filters, query, timeRange, viewMode, controlGroupInput, id } = initialInput; const controlGroup = await controlsGroupFactory?.create({ + id: `control_group_${id ?? 'new_dashboard'}`, ...getDefaultDashboardControlGroupInput(), - ...(initialInput.controlGroupInput ?? {}), - viewMode: initialInput.viewMode, - id: `control_group_${initialInput.id ?? 'new_dashboard'}`, + ...(controlGroupInput ?? {}), + timeRange, + viewMode, + filters, + query, }); const { DashboardContainer: DashboardContainerEmbeddable } = await import( './dashboard_container' diff --git a/src/plugins/dashboard/public/application/lib/dashboard_control_group.ts b/src/plugins/dashboard/public/application/lib/dashboard_control_group.ts index 0d1eb3537377f..054c7e49dfc55 100644 --- a/src/plugins/dashboard/public/application/lib/dashboard_control_group.ts +++ b/src/plugins/dashboard/public/application/lib/dashboard_control_group.ts @@ -74,10 +74,11 @@ export const syncDashboardControlGroup = async ({ }) ); + const compareAllFilters = (a?: Filter[], b?: Filter[]) => + compareFilters(a ?? [], b ?? [], COMPARE_ALL_OPTIONS); + const dashboardRefetchDiff: DiffChecks = { - filters: (a, b) => - compareFilters((a as Filter[]) ?? [], (b as Filter[]) ?? [], COMPARE_ALL_OPTIONS), - lastReloadRequestTime: deepEqual, + filters: (a, b) => compareAllFilters(a as Filter[], b as Filter[]), timeRange: deepEqual, query: deepEqual, viewMode: deepEqual, @@ -130,7 +131,14 @@ export const syncDashboardControlGroup = async ({ subscriptions.add( controlGroup .getOutput$() - .subscribe(() => dashboardContainer.updateInput({ lastReloadRequestTime: Date.now() })) + .pipe( + distinctUntilChanged(({ filters: filtersA }, { filters: filtersB }) => + compareAllFilters(filtersA, filtersB) + ) + ) + .subscribe(() => { + dashboardContainer.updateInput({ lastReloadRequestTime: Date.now() }); + }) ); return { diff --git a/src/plugins/dashboard/public/application/lib/sync_dashboard_container_input.ts b/src/plugins/dashboard/public/application/lib/sync_dashboard_container_input.ts index a339ec4f8405f..541724549011e 100644 --- a/src/plugins/dashboard/public/application/lib/sync_dashboard_container_input.ts +++ b/src/plugins/dashboard/public/application/lib/sync_dashboard_container_input.ts @@ -78,6 +78,11 @@ export const syncDashboardContainerInput = ( ) .subscribe(() => { applyStateChangesToContainer({ ...syncDashboardContainerProps, force: forceRefresh }); + + // If this dashboard has a control group, reload the control group when the refresh button is manually pressed. + if (forceRefresh && dashboardContainer.controlGroup) { + dashboardContainer.controlGroup.reload(); + } forceRefresh = false; }) ); diff --git a/src/plugins/data/server/autocomplete/autocomplete_service.ts b/src/plugins/data/server/autocomplete/autocomplete_service.ts index ef718af2ab397..071acc13c8117 100644 --- a/src/plugins/data/server/autocomplete/autocomplete_service.ts +++ b/src/plugins/data/server/autocomplete/autocomplete_service.ts @@ -6,22 +6,37 @@ * Side Public License, v 1. */ +import moment from 'moment'; import { CoreSetup, Plugin, PluginInitializerContext } from 'kibana/server'; import { registerRoutes } from './routes'; import { ConfigSchema } from '../../config'; export class AutocompleteService implements Plugin { private valueSuggestionsEnabled: boolean = true; + private autocompleteSettings: ConfigSchema['autocomplete']['valueSuggestions']; constructor(private initializerContext: PluginInitializerContext) { initializerContext.config.create().subscribe((configUpdate) => { this.valueSuggestionsEnabled = configUpdate.autocomplete.valueSuggestions.enabled; + this.autocompleteSettings = configUpdate.autocomplete.valueSuggestions; }); + this.autocompleteSettings = + this.initializerContext.config.get().autocomplete.valueSuggestions; } public setup(core: CoreSetup) { if (this.valueSuggestionsEnabled) registerRoutes(core, this.initializerContext.config.create()); + const { terminateAfter, timeout } = this.autocompleteSettings; + return { + getAutocompleteSettings: () => ({ + terminateAfter: moment.duration(terminateAfter).asMilliseconds(), + timeout: moment.duration(timeout).asMilliseconds(), + }), + }; } public start() {} } + +/** @public **/ +export type AutocompleteSetup = ReturnType; diff --git a/src/plugins/data/server/autocomplete/index.ts b/src/plugins/data/server/autocomplete/index.ts index 8dde502200b16..e822b27549635 100644 --- a/src/plugins/data/server/autocomplete/index.ts +++ b/src/plugins/data/server/autocomplete/index.ts @@ -6,4 +6,4 @@ * Side Public License, v 1. */ -export { AutocompleteService } from './autocomplete_service'; +export { AutocompleteService, type AutocompleteSetup } from './autocomplete_service'; diff --git a/src/plugins/data/server/mocks.ts b/src/plugins/data/server/mocks.ts index c766dc5e5765c..6fd670d869c20 100644 --- a/src/plugins/data/server/mocks.ts +++ b/src/plugins/data/server/mocks.ts @@ -17,10 +17,16 @@ import { } from '../../field_formats/server/mocks'; import { createIndexPatternsStartMock } from './data_views/mocks'; import { DataRequestHandlerContext } from './search'; +import { AutocompleteSetup } from './autocomplete'; + +const autocompleteSetupMock: jest.Mocked = { + getAutocompleteSettings: jest.fn(), +}; function createSetupContract() { return { search: createSearchSetupMock(), + autocomplete: autocompleteSetupMock, /** * @deprecated - use directly from "fieldFormats" plugin instead */ diff --git a/src/plugins/data/server/plugin.ts b/src/plugins/data/server/plugin.ts index ea6a7bc3446e3..ab8e28755cd77 100644 --- a/src/plugins/data/server/plugin.ts +++ b/src/plugins/data/server/plugin.ts @@ -21,12 +21,14 @@ import { AutocompleteService } from './autocomplete'; import { FieldFormatsSetup, FieldFormatsStart } from '../../field_formats/server'; import { getUiSettings } from './ui_settings'; import { QuerySetup } from './query'; +import { AutocompleteSetup } from './autocomplete/autocomplete_service'; interface DataEnhancements { search: SearchEnhancements; } export interface DataPluginSetup { + autocomplete: AutocompleteSetup; search: ISearchSetup; query: QuerySetup; /** @@ -91,7 +93,6 @@ export class DataServerPlugin ) { this.scriptsService.setup(core); const querySetup = this.queryService.setup(core); - this.autocompleteService.setup(core); this.kqlTelemetryService.setup(core, { usageCollection }); core.uiSettings.register(getUiSettings(core.docLinks)); @@ -103,6 +104,7 @@ export class DataServerPlugin }); return { + autocomplete: this.autocompleteService.setup(core), __enhance: (enhancements: DataEnhancements) => { searchSetup.__enhance(enhancements.search); }, diff --git a/test/functional/apps/dashboard/dashboard_controls_integration.ts b/test/functional/apps/dashboard/dashboard_controls_integration.ts index 4843e4e9b1b5c..5ede80bf8eb8a 100644 --- a/test/functional/apps/dashboard/dashboard_controls_integration.ts +++ b/test/functional/apps/dashboard/dashboard_controls_integration.ts @@ -105,6 +105,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); describe('Interact with options list on dashboard', async () => { + let controlId: string; before(async () => { await dashboardAddPanel.addVisualization('Rendering-Test:-animal-sounds-pie'); @@ -113,105 +114,221 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { fieldName: 'sound.keyword', title: 'Animal Sounds', }); + + controlId = (await dashboardControls.getAllControlIds())[0]; }); - it('Shows available options in options list', async () => { - const controlIds = await dashboardControls.getAllControlIds(); - await dashboardControls.optionsListOpenPopover(controlIds[0]); - await retry.try(async () => { - expect(await dashboardControls.optionsListPopoverGetAvailableOptionsCount()).to.be(8); + describe('Apply dashboard query and filters to controls', async () => { + it('Applies dashboard query to options list control', async () => { + await queryBar.setQuery('isDog : true '); + await queryBar.submitQuery(); + await dashboard.waitForRenderComplete(); + await header.waitUntilLoadingHasFinished(); + + await dashboardControls.optionsListOpenPopover(controlId); + await retry.try(async () => { + expect(await dashboardControls.optionsListPopoverGetAvailableOptionsCount()).to.be(5); + expect(await dashboardControls.optionsListPopoverGetAvailableOptions()).to.eql([ + 'ruff', + 'bark', + 'grrr', + 'bow ow ow', + 'grr', + ]); + }); + + await queryBar.setQuery(''); + await queryBar.submitQuery(); }); - await dashboardControls.optionsListEnsurePopoverIsClosed(controlIds[0]); - }); - it('Can search options list for available options', async () => { - const controlIds = await dashboardControls.getAllControlIds(); - await dashboardControls.optionsListOpenPopover(controlIds[0]); - await dashboardControls.optionsListPopoverSearchForOption('meo'); - await retry.try(async () => { - expect(await dashboardControls.optionsListPopoverGetAvailableOptionsCount()).to.be(1); - expect(await dashboardControls.optionsListPopoverGetAvailableOptions()).to.eql(['meow']); - }); - await dashboardControls.optionsListPopoverClearSearch(); - await dashboardControls.optionsListEnsurePopoverIsClosed(controlIds[0]); - }); + it('Applies dashboard filters to options list control', async () => { + await filterBar.addFilter('sound.keyword', 'is one of', ['bark', 'bow ow ow', 'ruff']); + await dashboard.waitForRenderComplete(); + await header.waitUntilLoadingHasFinished(); - it('Applies dashboard query to options list control', async () => { - await queryBar.setQuery('isDog : true '); - await queryBar.submitQuery(); - await dashboard.waitForRenderComplete(); - await header.waitUntilLoadingHasFinished(); + await dashboardControls.optionsListOpenPopover(controlId); + await retry.try(async () => { + expect(await dashboardControls.optionsListPopoverGetAvailableOptionsCount()).to.be(3); + expect(await dashboardControls.optionsListPopoverGetAvailableOptions()).to.eql([ + 'ruff', + 'bark', + 'bow ow ow', + ]); + }); + }); - const controlIds = await dashboardControls.getAllControlIds(); - await dashboardControls.optionsListOpenPopover(controlIds[0]); - await retry.try(async () => { - expect(await dashboardControls.optionsListPopoverGetAvailableOptionsCount()).to.be(5); - expect(await dashboardControls.optionsListPopoverGetAvailableOptions()).to.eql([ - 'ruff', - 'bark', - 'grrr', - 'bow ow ow', - 'grr', - ]); - }); - - await queryBar.setQuery(''); - await queryBar.submitQuery(); - }); + it('Does not apply disabled dashboard filters to options list control', async () => { + await filterBar.toggleFilterEnabled('sound.keyword'); + await dashboard.waitForRenderComplete(); + await header.waitUntilLoadingHasFinished(); - it('Applies dashboard filters to options list control', async () => { - await filterBar.addFilter('sound.keyword', 'is one of', ['bark', 'bow ow ow', 'ruff']); - await dashboard.waitForRenderComplete(); - await header.waitUntilLoadingHasFinished(); + await dashboardControls.optionsListOpenPopover(controlId); + await retry.try(async () => { + expect(await dashboardControls.optionsListPopoverGetAvailableOptionsCount()).to.be(8); + }); - const controlIds = await dashboardControls.getAllControlIds(); - await dashboardControls.optionsListOpenPopover(controlIds[0]); - await retry.try(async () => { - expect(await dashboardControls.optionsListPopoverGetAvailableOptionsCount()).to.be(3); - expect(await dashboardControls.optionsListPopoverGetAvailableOptions()).to.eql([ - 'ruff', - 'bark', - 'bow ow ow', - ]); + await filterBar.toggleFilterEnabled('sound.keyword'); + await dashboard.waitForRenderComplete(); + await header.waitUntilLoadingHasFinished(); }); - await filterBar.removeAllFilters(); - }); + it('Negated filters apply to options control', async () => { + await filterBar.toggleFilterNegated('sound.keyword'); + await dashboard.waitForRenderComplete(); + await header.waitUntilLoadingHasFinished(); - it('Can select multiple available options', async () => { - const controlIds = await dashboardControls.getAllControlIds(); - await dashboardControls.optionsListOpenPopover(controlIds[0]); - await dashboardControls.optionsListPopoverSelectOption('hiss'); - await dashboardControls.optionsListPopoverSelectOption('grr'); - await dashboardControls.optionsListEnsurePopoverIsClosed(controlIds[0]); - }); + await dashboardControls.optionsListOpenPopover(controlId); + await retry.try(async () => { + expect(await dashboardControls.optionsListPopoverGetAvailableOptionsCount()).to.be(5); + expect(await dashboardControls.optionsListPopoverGetAvailableOptions()).to.eql([ + 'hiss', + 'grrr', + 'meow', + 'growl', + 'grr', + ]); + }); + }); - it('Selected options appear in control', async () => { - const controlIds = await dashboardControls.getAllControlIds(); - const selectionString = await dashboardControls.optionsListGetSelectionsString( - controlIds[0] - ); - expect(selectionString).to.be('hiss, grr'); + after(async () => { + await filterBar.removeAllFilters(); + }); }); - it('Applies options list control options to dashboard', async () => { - await retry.try(async () => { + describe('Selections made in control apply to dashboard', async () => { + it('Shows available options in options list', async () => { + await dashboardControls.optionsListOpenPopover(controlId); + await retry.try(async () => { + expect(await dashboardControls.optionsListPopoverGetAvailableOptionsCount()).to.be(8); + }); + await dashboardControls.optionsListEnsurePopoverIsClosed(controlId); + }); + + it('Can search options list for available options', async () => { + await dashboardControls.optionsListOpenPopover(controlId); + await dashboardControls.optionsListPopoverSearchForOption('meo'); + await retry.try(async () => { + expect(await dashboardControls.optionsListPopoverGetAvailableOptionsCount()).to.be(1); + expect(await dashboardControls.optionsListPopoverGetAvailableOptions()).to.eql([ + 'meow', + ]); + }); + await dashboardControls.optionsListPopoverClearSearch(); + await dashboardControls.optionsListEnsurePopoverIsClosed(controlId); + }); + + it('Can select multiple available options', async () => { + await dashboardControls.optionsListOpenPopover(controlId); + await dashboardControls.optionsListPopoverSelectOption('hiss'); + await dashboardControls.optionsListPopoverSelectOption('grr'); + await dashboardControls.optionsListEnsurePopoverIsClosed(controlId); + }); + + it('Selected options appear in control', async () => { + const selectionString = await dashboardControls.optionsListGetSelectionsString(controlId); + expect(selectionString).to.be('hiss, grr'); + }); + + it('Applies options list control options to dashboard', async () => { + await retry.try(async () => { + expect(await pieChart.getPieSliceCount()).to.be(2); + }); + }); + + it('Applies options list control options to dashboard by default on open', async () => { + await dashboard.gotoDashboardLandingPage(); + await header.waitUntilLoadingHasFinished(); + await dashboard.clickUnsavedChangesContinueEditing('New Dashboard'); + await header.waitUntilLoadingHasFinished(); expect(await pieChart.getPieSliceCount()).to.be(2); + + const selectionString = await dashboardControls.optionsListGetSelectionsString(controlId); + expect(selectionString).to.be('hiss, grr'); + }); + + after(async () => { + await dashboardControls.optionsListOpenPopover(controlId); + await dashboardControls.optionsListPopoverClearSelections(); + await dashboardControls.optionsListEnsurePopoverIsClosed(controlId); }); }); - it('Applies options list control options to dashboard by default on open', async () => { - await dashboard.gotoDashboardLandingPage(); - await header.waitUntilLoadingHasFinished(); - await dashboard.clickUnsavedChangesContinueEditing('New Dashboard'); - await header.waitUntilLoadingHasFinished(); - expect(await pieChart.getPieSliceCount()).to.be(2); + describe('Options List validation', async () => { + before(async () => { + await dashboardControls.optionsListOpenPopover(controlId); + await dashboardControls.optionsListPopoverSelectOption('meow'); + await dashboardControls.optionsListPopoverSelectOption('bark'); + await dashboardControls.optionsListEnsurePopoverIsClosed(controlId); + }); - const controlIds = await dashboardControls.getAllControlIds(); - const selectionString = await dashboardControls.optionsListGetSelectionsString( - controlIds[0] - ); - expect(selectionString).to.be('hiss, grr'); + it('Can mark selections invalid with Query', async () => { + await queryBar.setQuery('isDog : false '); + await queryBar.submitQuery(); + await dashboard.waitForRenderComplete(); + await header.waitUntilLoadingHasFinished(); + + await dashboardControls.optionsListOpenPopover(controlId); + await retry.try(async () => { + expect(await dashboardControls.optionsListPopoverGetAvailableOptionsCount()).to.be(4); + expect(await dashboardControls.optionsListPopoverGetAvailableOptions()).to.eql([ + 'hiss', + 'meow', + 'growl', + 'grr', + 'Ignored selection', + 'bark', + ]); + }); + await dashboardControls.optionsListEnsurePopoverIsClosed(controlId); + // only valid selections are applied as filters. + expect(await pieChart.getPieSliceCount()).to.be(1); + }); + + it('can make invalid selections valid again if the parent filter changes', async () => { + await queryBar.setQuery(''); + await queryBar.submitQuery(); + await dashboard.waitForRenderComplete(); + await header.waitUntilLoadingHasFinished(); + + await dashboardControls.optionsListOpenPopover(controlId); + await retry.try(async () => { + expect(await dashboardControls.optionsListPopoverGetAvailableOptionsCount()).to.be(8); + expect(await dashboardControls.optionsListPopoverGetAvailableOptions()).to.eql([ + 'hiss', + 'ruff', + 'bark', + 'grrr', + 'meow', + 'growl', + 'grr', + 'bow ow ow', + ]); + }); + + await dashboardControls.optionsListEnsurePopoverIsClosed(controlId); + expect(await pieChart.getPieSliceCount()).to.be(2); + }); + + it('Can mark multiple selections invalid with Filter', async () => { + await filterBar.addFilter('sound.keyword', 'is', ['hiss']); + await dashboard.waitForRenderComplete(); + await header.waitUntilLoadingHasFinished(); + + await dashboardControls.optionsListOpenPopover(controlId); + await retry.try(async () => { + expect(await dashboardControls.optionsListPopoverGetAvailableOptionsCount()).to.be(1); + expect(await dashboardControls.optionsListPopoverGetAvailableOptions()).to.eql([ + 'hiss', + 'Ignored selections', + 'meow', + 'bark', + ]); + }); + + await dashboardControls.optionsListEnsurePopoverIsClosed(controlId); + // only valid selections are applied as filters. + expect(await pieChart.getPieSliceCount()).to.be(1); + }); }); }); }); diff --git a/test/functional/services/filter_bar.ts b/test/functional/services/filter_bar.ts index 5d189506c314d..ec4d03041df89 100644 --- a/test/functional/services/filter_bar.ts +++ b/test/functional/services/filter_bar.ts @@ -87,6 +87,12 @@ export class FilterBarService extends FtrService { await this.header.awaitGlobalLoadingIndicatorHidden(); } + public async toggleFilterNegated(key: string): Promise { + await this.testSubjects.click(`~filter & ~filter-key-${key}`); + await this.testSubjects.click(`negateFilter`); + await this.header.awaitGlobalLoadingIndicatorHidden(); + } + public async isFilterPinned(key: string): Promise { const filter = await this.testSubjects.find(`~filter & ~filter-key-${key}`); return (await filter.getAttribute('data-test-subj')).includes('filter-pinned'); From 51e1f25d2102c69b75669d26441fc9e74e606840 Mon Sep 17 00:00:00 2001 From: Cristina Amico Date: Mon, 28 Feb 2022 18:12:56 +0100 Subject: [PATCH 052/102] [Fleet] Add component to show agents enrolment (#126443) * [Fleet] Modify status endpoint to check recent agents enrollments * Create basic component for confirming agent enrollment * Update openapi and fix parameters order * Remove test code and fix linter * Address review comments --- .../plugins/fleet/common/openapi/bundled.json | 8 +++ .../plugins/fleet/common/openapi/bundled.yaml | 5 ++ .../common/openapi/paths/agent_status.yaml | 5 ++ .../confirm_agent_enrollment.tsx | 57 +++++++++++++++++++ .../fleet/server/routes/agent/handlers.ts | 2 - 5 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 x-pack/plugins/fleet/public/components/agent_enrollment_flyout/confirm_agent_enrollment.tsx diff --git a/x-pack/plugins/fleet/common/openapi/bundled.json b/x-pack/plugins/fleet/common/openapi/bundled.json index 6b4ba8cf233f4..0107ac614fe61 100644 --- a/x-pack/plugins/fleet/common/openapi/bundled.json +++ b/x-pack/plugins/fleet/common/openapi/bundled.json @@ -1094,6 +1094,14 @@ "name": "policyId", "in": "query", "required": false + }, + { + "schema": { + "type": "string" + }, + "name": "kuery", + "in": "query", + "required": false } ] } diff --git a/x-pack/plugins/fleet/common/openapi/bundled.yaml b/x-pack/plugins/fleet/common/openapi/bundled.yaml index 6af6f93d7659f..9c61006da6db2 100644 --- a/x-pack/plugins/fleet/common/openapi/bundled.yaml +++ b/x-pack/plugins/fleet/common/openapi/bundled.yaml @@ -672,6 +672,11 @@ paths: name: policyId in: query required: false + - schema: + type: string + name: kuery + in: query + required: false /agents: get: summary: Agents - List diff --git a/x-pack/plugins/fleet/common/openapi/paths/agent_status.yaml b/x-pack/plugins/fleet/common/openapi/paths/agent_status.yaml index adc0ea79629af..2f8d3c81757dc 100644 --- a/x-pack/plugins/fleet/common/openapi/paths/agent_status.yaml +++ b/x-pack/plugins/fleet/common/openapi/paths/agent_status.yaml @@ -41,3 +41,8 @@ get: name: policyId in: query required: false + - schema: + type: string + name: kuery + in: query + required: false diff --git a/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/confirm_agent_enrollment.tsx b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/confirm_agent_enrollment.tsx new file mode 100644 index 0000000000000..dd39f8700e4fb --- /dev/null +++ b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/confirm_agent_enrollment.tsx @@ -0,0 +1,57 @@ +/* + * 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 { EuiCallOut, EuiButton } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; + +import { useGetAgentStatus } from '../../hooks'; +import { AGENTS_PREFIX } from '../../constants'; +interface Props { + policyId: string; + onClickViewAgents: () => void; +} + +export const ConfirmAgentEnrollment: React.FunctionComponent = ({ + policyId, + onClickViewAgents, +}) => { + // Check the agents enrolled in the last 10 minutes + const enrolledAt = 'now-10m'; + const kuery = `${AGENTS_PREFIX}.enrolled_at >= "${enrolledAt}"`; + const agentStatusRequest = useGetAgentStatus({ kuery, policyId }); + const agentsCount = agentStatusRequest.data?.results?.total; + + if (!agentsCount) { + return null; + } + + return ( + + + {i18n.translate('xpack.fleet.agentEnrollment.confirmation.button', { + defaultMessage: 'View enrolled agents', + })} + + + ); +}; diff --git a/x-pack/plugins/fleet/server/routes/agent/handlers.ts b/x-pack/plugins/fleet/server/routes/agent/handlers.ts index 504e8ed6e0c66..1473b508f1354 100644 --- a/x-pack/plugins/fleet/server/routes/agent/handlers.ts +++ b/x-pack/plugins/fleet/server/routes/agent/handlers.ts @@ -204,9 +204,7 @@ export const getAgentStatusForAgentPolicyHandler: RequestHandler< TypeOf > = async (context, request, response) => { const esClient = context.core.elasticsearch.client.asInternalUser; - try { - // TODO change path const results = await AgentService.getAgentStatusForAgentPolicy( esClient, request.query.policyId, From b95f891ea2b8032574ea81d30d2de206c81f98cc Mon Sep 17 00:00:00 2001 From: Ari Aviran Date: Mon, 28 Feb 2022 19:52:51 +0200 Subject: [PATCH 053/102] [Security Solution] Initial version of the Cloud Security Posture app (#124816) Co-authored-by: Ido Cohen Co-authored-by: Or Ouziel Co-authored-by: Yarden Shalom --- .github/CODEOWNERS | 3 + docs/developer/plugin-list.asciidoc | 4 + packages/kbn-optimizer/limits.yml | 1 + x-pack/.i18nrc.json | 1 + .../plugins/cloud_security_posture/README.md | 9 + .../common/constants.ts | 21 ++ .../cloud_security_posture/common/index.ts | 9 + .../cloud_security_posture/common/types.ts | 33 ++ .../common/utils/helpers.ts | 22 ++ .../cloud_security_posture/jest.config.js | 18 ++ .../cloud_security_posture/kibana.json | 15 + .../public/application/app.test.ts | 36 +++ .../public/application/app.tsx | 65 ++++ .../public/application/constants.tsx | 15 + .../public/application/index.tsx | 23 ++ .../public/common/api/index.ts | 8 + .../common/api/use_cloud_posture_stats_api.ts | 18 ++ .../public/common/constants.ts | 12 + .../public/common/hooks/use_url_query.test.ts | 63 ++++ .../public/common/hooks/use_url_query.ts | 46 +++ .../public/common/navigation/constants.ts | 20 ++ .../public/common/navigation/query_utils.ts | 40 +++ .../public/common/navigation/translations.ts | 24 ++ .../public/common/navigation/types.ts | 13 + .../common/navigation/use_csp_breadcrumbs.ts | 40 +++ .../public/common/translations.ts | 12 + .../public/components/chart_panel.test.tsx | 52 +++ .../public/components/chart_panel.tsx | 80 +++++ .../components/compact_formatted_number.tsx | 17 + .../public/components/constants.ts | 13 + .../components/csp_evaluation_badge.tsx | 26 ++ .../public/components/csp_health_badge.tsx | 22 ++ .../public/components/csp_loading_state.tsx | 18 ++ .../public/components/page_template.test.tsx | 75 +++++ .../public/components/page_template.tsx | 73 +++++ .../public/components/translations.ts | 42 +++ .../public/components/unknown_route.tsx | 22 ++ .../cloud_security_posture/public/index.ts | 12 + .../pages/benchmarks/benchmarks.test.tsx | 72 +++++ .../public/pages/benchmarks/benchmarks.tsx | 49 +++ .../benchmarks/benchmarks_table.test.tsx | 103 ++++++ .../pages/benchmarks/benchmarks_table.tsx | 64 ++++ .../public/pages/benchmarks/index.ts | 8 + .../public/pages/benchmarks/translations.ts | 47 +++ .../public/pages/benchmarks/types.ts | 23 ++ .../use_csp_benchmark_integrations.ts | 25 ++ .../cloud_posture_score_chart.tsx | 114 +++++++ .../compliance_charts/compliance_stats.tsx | 158 +++++++++ .../compliance_trend_chart.tsx | 32 ++ .../compliance_charts/risks_table.test.ts | 73 +++++ .../compliance_charts/risks_table.tsx | 159 +++++++++ .../score_per_account_chart.tsx | 45 +++ .../compliance_dashboard.tsx | 44 +++ .../dashboard_sections/benchmarks_section.tsx | 152 +++++++++ .../dashboard_sections/summary_section.tsx | 83 +++++ .../pages/compliance_dashboard/index.tsx | 8 + .../compliance_dashboard/translations.ts | 87 +++++ .../public/pages/findings/findings.test.tsx | 74 +++++ .../public/pages/findings/findings.tsx | 50 +++ .../pages/findings/findings_container.tsx | 47 +++ .../public/pages/findings/findings_flyout.tsx | 182 +++++++++++ .../pages/findings/findings_search_bar.tsx | 57 ++++ .../pages/findings/findings_table.test.tsx | 93 ++++++ .../public/pages/findings/findings_table.tsx | 195 +++++++++++ .../public/pages/findings/index.tsx | 8 + .../public/pages/findings/test_subjects.ts | 12 + .../public/pages/findings/translations.ts | 151 +++++++++ .../public/pages/findings/types.ts | 72 +++++ .../public/pages/findings/use_findings.ts | 141 ++++++++ .../public/pages/findings/utils.tsx | 28 ++ .../public/pages/index.ts | 10 + .../cloud_security_posture/public/plugin.ts | 54 ++++ .../fixtures/csp_benchmark_integration.ts | 48 +++ .../public/test/fixtures/navigation_item.ts | 20 ++ .../public/test/fixtures/react_query.ts | 33 ++ .../public/test/test_provider.tsx | 36 +++ .../cloud_security_posture/public/types.ts | 30 ++ .../cloud_security_posture/server/config.ts | 19 ++ .../server/constants.ts | 9 + .../cloud_security_posture/server/index.ts | 16 + .../cloud_security_posture/server/plugin.ts | 53 +++ .../server/routes/findings/findings.test.ts | 303 ++++++++++++++++++ .../server/routes/findings/findings.ts | 131 ++++++++ .../routes/findings/get_latest_cycle.test.ts | 99 ++++++ .../routes/findings/get_latest_cycle_ids.ts | 58 ++++ .../server/routes/index.ts | 15 + .../server/routes/stats/stats.test.ts | 201 ++++++++++++ .../server/routes/stats/stats.ts | 226 +++++++++++++ .../server/routes/stats/stats_queries.ts | 111 +++++++ .../cloud_security_posture/server/types.ts | 30 ++ .../cloud_security_posture/tsconfig.json | 24 ++ 91 files changed, 5005 insertions(+) create mode 100755 x-pack/plugins/cloud_security_posture/README.md create mode 100644 x-pack/plugins/cloud_security_posture/common/constants.ts create mode 100755 x-pack/plugins/cloud_security_posture/common/index.ts create mode 100644 x-pack/plugins/cloud_security_posture/common/types.ts create mode 100644 x-pack/plugins/cloud_security_posture/common/utils/helpers.ts create mode 100644 x-pack/plugins/cloud_security_posture/jest.config.js create mode 100755 x-pack/plugins/cloud_security_posture/kibana.json create mode 100644 x-pack/plugins/cloud_security_posture/public/application/app.test.ts create mode 100755 x-pack/plugins/cloud_security_posture/public/application/app.tsx create mode 100644 x-pack/plugins/cloud_security_posture/public/application/constants.tsx create mode 100644 x-pack/plugins/cloud_security_posture/public/application/index.tsx create mode 100644 x-pack/plugins/cloud_security_posture/public/common/api/index.ts create mode 100644 x-pack/plugins/cloud_security_posture/public/common/api/use_cloud_posture_stats_api.ts create mode 100644 x-pack/plugins/cloud_security_posture/public/common/constants.ts create mode 100644 x-pack/plugins/cloud_security_posture/public/common/hooks/use_url_query.test.ts create mode 100644 x-pack/plugins/cloud_security_posture/public/common/hooks/use_url_query.ts create mode 100644 x-pack/plugins/cloud_security_posture/public/common/navigation/constants.ts create mode 100644 x-pack/plugins/cloud_security_posture/public/common/navigation/query_utils.ts create mode 100644 x-pack/plugins/cloud_security_posture/public/common/navigation/translations.ts create mode 100644 x-pack/plugins/cloud_security_posture/public/common/navigation/types.ts create mode 100644 x-pack/plugins/cloud_security_posture/public/common/navigation/use_csp_breadcrumbs.ts create mode 100644 x-pack/plugins/cloud_security_posture/public/common/translations.ts create mode 100644 x-pack/plugins/cloud_security_posture/public/components/chart_panel.test.tsx create mode 100644 x-pack/plugins/cloud_security_posture/public/components/chart_panel.tsx create mode 100644 x-pack/plugins/cloud_security_posture/public/components/compact_formatted_number.tsx create mode 100644 x-pack/plugins/cloud_security_posture/public/components/constants.ts create mode 100644 x-pack/plugins/cloud_security_posture/public/components/csp_evaluation_badge.tsx create mode 100644 x-pack/plugins/cloud_security_posture/public/components/csp_health_badge.tsx create mode 100644 x-pack/plugins/cloud_security_posture/public/components/csp_loading_state.tsx create mode 100644 x-pack/plugins/cloud_security_posture/public/components/page_template.test.tsx create mode 100644 x-pack/plugins/cloud_security_posture/public/components/page_template.tsx create mode 100644 x-pack/plugins/cloud_security_posture/public/components/translations.ts create mode 100644 x-pack/plugins/cloud_security_posture/public/components/unknown_route.tsx create mode 100755 x-pack/plugins/cloud_security_posture/public/index.ts create mode 100644 x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks.test.tsx create mode 100644 x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks.tsx create mode 100644 x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks_table.test.tsx create mode 100644 x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks_table.tsx create mode 100644 x-pack/plugins/cloud_security_posture/public/pages/benchmarks/index.ts create mode 100644 x-pack/plugins/cloud_security_posture/public/pages/benchmarks/translations.ts create mode 100644 x-pack/plugins/cloud_security_posture/public/pages/benchmarks/types.ts create mode 100644 x-pack/plugins/cloud_security_posture/public/pages/benchmarks/use_csp_benchmark_integrations.ts create mode 100644 x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/cloud_posture_score_chart.tsx create mode 100644 x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/compliance_stats.tsx create mode 100644 x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/compliance_trend_chart.tsx create mode 100644 x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/risks_table.test.ts create mode 100644 x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/risks_table.tsx create mode 100644 x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/score_per_account_chart.tsx create mode 100644 x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.tsx create mode 100644 x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/benchmarks_section.tsx create mode 100644 x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/summary_section.tsx create mode 100644 x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/index.tsx create mode 100644 x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/translations.ts create mode 100644 x-pack/plugins/cloud_security_posture/public/pages/findings/findings.test.tsx create mode 100644 x-pack/plugins/cloud_security_posture/public/pages/findings/findings.tsx create mode 100644 x-pack/plugins/cloud_security_posture/public/pages/findings/findings_container.tsx create mode 100644 x-pack/plugins/cloud_security_posture/public/pages/findings/findings_flyout.tsx create mode 100644 x-pack/plugins/cloud_security_posture/public/pages/findings/findings_search_bar.tsx create mode 100644 x-pack/plugins/cloud_security_posture/public/pages/findings/findings_table.test.tsx create mode 100644 x-pack/plugins/cloud_security_posture/public/pages/findings/findings_table.tsx create mode 100644 x-pack/plugins/cloud_security_posture/public/pages/findings/index.tsx create mode 100644 x-pack/plugins/cloud_security_posture/public/pages/findings/test_subjects.ts create mode 100644 x-pack/plugins/cloud_security_posture/public/pages/findings/translations.ts create mode 100644 x-pack/plugins/cloud_security_posture/public/pages/findings/types.ts create mode 100644 x-pack/plugins/cloud_security_posture/public/pages/findings/use_findings.ts create mode 100644 x-pack/plugins/cloud_security_posture/public/pages/findings/utils.tsx create mode 100644 x-pack/plugins/cloud_security_posture/public/pages/index.ts create mode 100755 x-pack/plugins/cloud_security_posture/public/plugin.ts create mode 100644 x-pack/plugins/cloud_security_posture/public/test/fixtures/csp_benchmark_integration.ts create mode 100644 x-pack/plugins/cloud_security_posture/public/test/fixtures/navigation_item.ts create mode 100644 x-pack/plugins/cloud_security_posture/public/test/fixtures/react_query.ts create mode 100755 x-pack/plugins/cloud_security_posture/public/test/test_provider.tsx create mode 100755 x-pack/plugins/cloud_security_posture/public/types.ts create mode 100644 x-pack/plugins/cloud_security_posture/server/config.ts create mode 100644 x-pack/plugins/cloud_security_posture/server/constants.ts create mode 100755 x-pack/plugins/cloud_security_posture/server/index.ts create mode 100755 x-pack/plugins/cloud_security_posture/server/plugin.ts create mode 100644 x-pack/plugins/cloud_security_posture/server/routes/findings/findings.test.ts create mode 100644 x-pack/plugins/cloud_security_posture/server/routes/findings/findings.ts create mode 100644 x-pack/plugins/cloud_security_posture/server/routes/findings/get_latest_cycle.test.ts create mode 100644 x-pack/plugins/cloud_security_posture/server/routes/findings/get_latest_cycle_ids.ts create mode 100755 x-pack/plugins/cloud_security_posture/server/routes/index.ts create mode 100644 x-pack/plugins/cloud_security_posture/server/routes/stats/stats.test.ts create mode 100644 x-pack/plugins/cloud_security_posture/server/routes/stats/stats.ts create mode 100644 x-pack/plugins/cloud_security_posture/server/routes/stats/stats_queries.ts create mode 100644 x-pack/plugins/cloud_security_posture/server/types.ts create mode 100755 x-pack/plugins/cloud_security_posture/tsconfig.json diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index b09edd73bbcbc..63e335067199d 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -422,6 +422,9 @@ x-pack/test/security_solution_cypress @elastic/security-engineering-productivity # Security Asset Management /x-pack/plugins/osquery @elastic/security-asset-management +# Cloud Posture Security +/x-pack/plugins/cloud_security_posture/ @elastic/cloud-posture-security + # Design (at the bottom for specificity of SASS files) **/*.scss @elastic/kibana-design #CC# /packages/kbn-ui-framework/ @elastic/kibana-design diff --git a/docs/developer/plugin-list.asciidoc b/docs/developer/plugin-list.asciidoc index c79189c1423dc..2dd78be3c1012 100644 --- a/docs/developer/plugin-list.asciidoc +++ b/docs/developer/plugin-list.asciidoc @@ -384,6 +384,10 @@ The plugin exposes the static DefaultEditorController class to consume. |The cloud plugin adds Cloud-specific features to Kibana. +|{kib-repo}blob/{branch}/x-pack/plugins/cloud_security_posture/README.md[cloudSecurityPosture] +|Cloud Posture automates the identification and remediation of risks across cloud infrastructures + + |{kib-repo}blob/{branch}/x-pack/plugins/cross_cluster_replication/README.md[crossClusterReplication] |You can run a local cluster and simulate a remote cluster within a single Kibana directory. diff --git a/packages/kbn-optimizer/limits.yml b/packages/kbn-optimizer/limits.yml index 79308c43bf0aa..3a999272c3a4d 100644 --- a/packages/kbn-optimizer/limits.yml +++ b/packages/kbn-optimizer/limits.yml @@ -121,3 +121,4 @@ pageLoadAssetSize: expressionPartitionVis: 26338 sharedUX: 16225 ux: 20784 + cloudSecurityPosture: 19109 diff --git a/x-pack/.i18nrc.json b/x-pack/.i18nrc.json index 71ff1032819ff..c48041c1e1883 100644 --- a/x-pack/.i18nrc.json +++ b/x-pack/.i18nrc.json @@ -10,6 +10,7 @@ "xpack.canvas": "plugins/canvas", "xpack.cases": "plugins/cases", "xpack.cloud": "plugins/cloud", + "xpack.csp": "plugins/cloud_security_posture", "xpack.dashboard": "plugins/dashboard_enhanced", "xpack.discover": "plugins/discover_enhanced", "xpack.crossClusterReplication": "plugins/cross_cluster_replication", diff --git a/x-pack/plugins/cloud_security_posture/README.md b/x-pack/plugins/cloud_security_posture/README.md new file mode 100755 index 0000000000000..8d2e3f62a3f7a --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/README.md @@ -0,0 +1,9 @@ +# Cloud Security Posture Kibana Plugin + +Cloud Posture automates the identification and remediation of risks across cloud infrastructures + +--- + +## Development + +See the [kibana contributing guide](https://github.com/elastic/kibana/blob/main/CONTRIBUTING.md) for instructions setting up your development environment. diff --git a/x-pack/plugins/cloud_security_posture/common/constants.ts b/x-pack/plugins/cloud_security_posture/common/constants.ts new file mode 100644 index 0000000000000..8523c4b5757d4 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/common/constants.ts @@ -0,0 +1,21 @@ +/* + * 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. + */ + +export const CSP_KUBEBEAT_INDEX_PATTERN = 'logs-k8s_cis*'; +export const CSP_FINDINGS_INDEX_NAME = 'findings'; +export const STATS_ROUTE_PATH = '/api/csp/stats'; +export const FINDINGS_ROUTE_PATH = '/api/csp/findings'; +export const AGENT_LOGS_INDEX_PATTERN = '.logs-k8s_cis.metadata*'; + +export const RULE_PASSED = `passed`; +export const RULE_FAILED = `failed`; + +// A mapping of in-development features to their status. These features should be hidden from users but can be easily +// activated via a simple code change in a single location. +export const INTERNAL_FEATURE_FLAGS = { + benchmarks: false, +} as const; diff --git a/x-pack/plugins/cloud_security_posture/common/index.ts b/x-pack/plugins/cloud_security_posture/common/index.ts new file mode 100755 index 0000000000000..e52b68e2fc2bd --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/common/index.ts @@ -0,0 +1,9 @@ +/* + * 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. + */ + +export const PLUGIN_ID = 'csp'; +export const PLUGIN_NAME = 'Cloud Security'; diff --git a/x-pack/plugins/cloud_security_posture/common/types.ts b/x-pack/plugins/cloud_security_posture/common/types.ts new file mode 100644 index 0000000000000..aa6b1d5bc9854 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/common/types.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. + */ + +export type Evaluation = 'passed' | 'failed' | 'NA'; +/** number between 1-100 */ +export type Score = number; + +export interface FindingsResults { + totalFindings: number; + totalPassed: number; + totalFailed: number; +} + +export interface Stats extends FindingsResults { + postureScore: Score; +} + +export interface ResourceTypeAgg extends FindingsResults { + resourceType: string; +} + +export interface BenchmarkStats extends Stats { + name: string; +} + +export interface CloudPostureStats extends Stats { + benchmarksStats: BenchmarkStats[]; + resourceTypesAggs: ResourceTypeAgg[]; +} diff --git a/x-pack/plugins/cloud_security_posture/common/utils/helpers.ts b/x-pack/plugins/cloud_security_posture/common/utils/helpers.ts new file mode 100644 index 0000000000000..1df0c18ebdd02 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/common/utils/helpers.ts @@ -0,0 +1,22 @@ +/* + * 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'; + +/** + * @example + * declare const foo: Array + * foo.filter(isNonNullable) // foo is Array + */ +export const isNonNullable = (v: T): v is NonNullable => + v !== null && v !== undefined; + +export const extractErrorMessage = (e: unknown, defaultMessage = 'Unknown Error'): string => { + if (e instanceof Error) return e.message; + if (t.record(t.literal('message'), t.string).is(e)) return e.message; + + return defaultMessage; // TODO: i18n +}; diff --git a/x-pack/plugins/cloud_security_posture/jest.config.js b/x-pack/plugins/cloud_security_posture/jest.config.js new file mode 100644 index 0000000000000..eb1e880646e56 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/jest.config.js @@ -0,0 +1,18 @@ +/* + * 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. + */ + +/** @type {import('@jest/types').Config.InitialOptions} */ +module.exports = { + preset: '@kbn/test', + rootDir: '../../..', + roots: ['/x-pack/plugins/cloud_security_posture'], + coverageDirectory: '/target/kibana-coverage/jest/x-pack/plugins/cloud_security_posture', + coverageReporters: ['text', 'html'], + collectCoverageFrom: [ + '/x-pack/plugins/cloud_security_posture/{common,public,server}/**/*.{ts,tsx}', + ], +}; diff --git a/x-pack/plugins/cloud_security_posture/kibana.json b/x-pack/plugins/cloud_security_posture/kibana.json new file mode 100755 index 0000000000000..67143c15e2b7b --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/kibana.json @@ -0,0 +1,15 @@ +{ + "id": "cloudSecurityPosture", + "version": "1.0.0", + "kibanaVersion": "kibana", + "configPath": ["xpack", "cloudSecurityPosture"], + "owner": { + "name": "Cloud Security Posture", + "githubTeam": "cloud-posture-security" + }, + "description": "The cloud security posture plugin", + "server": true, + "ui": true, + "requiredPlugins": ["navigation", "data"], + "requiredBundles": ["kibanaReact"] +} diff --git a/x-pack/plugins/cloud_security_posture/public/application/app.test.ts b/x-pack/plugins/cloud_security_posture/public/application/app.test.ts new file mode 100644 index 0000000000000..d79d5b6922e26 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/application/app.test.ts @@ -0,0 +1,36 @@ +/* + * 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'; +import { createNavigationItemFixture } from '../test/fixtures/navigation_item'; +import { getRoutesFromMapping } from './app'; + +const chance = new Chance(); +const DummyComponent = () => null; + +describe('getRoutesFromMapping', () => { + it('should map routes', () => { + const pageId = chance.word(); + const navigationItems = { [pageId]: createNavigationItemFixture() }; + const routesMapping = { [pageId]: DummyComponent }; + const routes = getRoutesFromMapping(navigationItems, routesMapping); + + expect(routes).toHaveLength(1); + expect(routes[0]).toMatchObject({ + path: navigationItems[pageId].path, + component: DummyComponent, + }); + }); + + it('should not map routes where the navigation item is disabled', () => { + const pageId = chance.word(); + const navigationItems = { [pageId]: createNavigationItemFixture({ disabled: true }) }; + const routesMapping = { [pageId]: DummyComponent }; + const routes = getRoutesFromMapping(navigationItems, routesMapping); + + expect(routes).toHaveLength(0); + }); +}); diff --git a/x-pack/plugins/cloud_security_posture/public/application/app.tsx b/x-pack/plugins/cloud_security_posture/public/application/app.tsx new file mode 100755 index 0000000000000..73dfa7b804378 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/application/app.tsx @@ -0,0 +1,65 @@ +/* + * 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 { I18nProvider } from '@kbn/i18n-react'; +import { Router, Redirect, Switch, Route } from 'react-router-dom'; +import type { RouteProps } from 'react-router-dom'; +import { QueryClient, QueryClientProvider } from 'react-query'; +import { EuiErrorBoundary } from '@elastic/eui'; +import { allNavigationItems } from '../common/navigation/constants'; +import { CspNavigationItem } from '../common/navigation/types'; +import { UnknownRoute } from '../components/unknown_route'; +import { KibanaContextProvider } from '../../../../../src/plugins/kibana_react/public'; +import type { AppMountParameters, CoreStart } from '../../../../../src/core/public'; +import type { CspClientPluginStartDeps } from '../types'; +import { pageToComponentMapping } from './constants'; + +const queryClient = new QueryClient(); + +export interface CspAppDeps { + core: CoreStart; + deps: CspClientPluginStartDeps; + params: AppMountParameters; +} + +type RoutePropsWithStringPath = RouteProps & { path: string }; + +// Converts the mapping of page -> component to be of type `RouteProps` while filtering out disabled navigation items +export const getRoutesFromMapping = ( + navigationItems: Record, + componentMapping: Record +): readonly RoutePropsWithStringPath[] => + Object.entries(componentMapping) + .filter(([id, _]) => !navigationItems[id as T].disabled) + .map(([id, component]) => ({ + path: navigationItems[id as T].path, + component: component as RouteProps['component'], + })); + +const routes = getRoutesFromMapping(allNavigationItems, pageToComponentMapping); + +export const CspApp = ({ core, deps, params }: CspAppDeps) => ( + + + + + + + {routes.map((route) => ( + + ))} + + + + + + + + +); + +const RedirectToDashboard = () => ; diff --git a/x-pack/plugins/cloud_security_posture/public/application/constants.tsx b/x-pack/plugins/cloud_security_posture/public/application/constants.tsx new file mode 100644 index 0000000000000..b592a30aeb2b4 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/application/constants.tsx @@ -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 { RouteProps } from 'react-router-dom'; +import { CspPage } from '../common/navigation/types'; +import * as pages from '../pages'; + +export const pageToComponentMapping: Record = { + findings: pages.Findings, + dashboard: pages.ComplianceDashboard, + benchmarks: pages.Benchmarks, +}; diff --git a/x-pack/plugins/cloud_security_posture/public/application/index.tsx b/x-pack/plugins/cloud_security_posture/public/application/index.tsx new file mode 100644 index 0000000000000..6530483bf2198 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/application/index.tsx @@ -0,0 +1,23 @@ +/* + * 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 ReactDOM from 'react-dom'; +import { CspApp } from './app'; + +import type { AppMountParameters, CoreStart } from '../../../../../src/core/public'; +import type { CspClientPluginStartDeps } from '../types'; + +export const renderApp = ( + core: CoreStart, + deps: CspClientPluginStartDeps, + params: AppMountParameters +) => { + ReactDOM.render(, params.element); + + return () => ReactDOM.unmountComponentAtNode(params.element); +}; diff --git a/x-pack/plugins/cloud_security_posture/public/common/api/index.ts b/x-pack/plugins/cloud_security_posture/public/common/api/index.ts new file mode 100644 index 0000000000000..915881e2ab9b2 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/common/api/index.ts @@ -0,0 +1,8 @@ +/* + * 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. + */ + +export * from './use_cloud_posture_stats_api'; diff --git a/x-pack/plugins/cloud_security_posture/public/common/api/use_cloud_posture_stats_api.ts b/x-pack/plugins/cloud_security_posture/public/common/api/use_cloud_posture_stats_api.ts new file mode 100644 index 0000000000000..c1cc4a61fd7ae --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/common/api/use_cloud_posture_stats_api.ts @@ -0,0 +1,18 @@ +/* + * 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 { useQuery } from 'react-query'; +import { useKibana } from '../../../../../../src/plugins/kibana_react/public'; +import { CloudPostureStats } from '../../../common/types'; +import { STATS_ROUTE_PATH } from '../../../common/constants'; + +const getStatsKey = 'csp_dashboard_stats'; + +export const useCloudPostureStatsApi = () => { + const { http } = useKibana().services; + return useQuery([getStatsKey], () => http!.get(STATS_ROUTE_PATH)); +}; diff --git a/x-pack/plugins/cloud_security_posture/public/common/constants.ts b/x-pack/plugins/cloud_security_posture/public/common/constants.ts new file mode 100644 index 0000000000000..e7ad29937e49d --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/common/constants.ts @@ -0,0 +1,12 @@ +/* + * 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 { euiPaletteForStatus } from '@elastic/eui'; + +const [success, warning, danger] = euiPaletteForStatus(3); + +export const statusColors = { success, warning, danger }; diff --git a/x-pack/plugins/cloud_security_posture/public/common/hooks/use_url_query.test.ts b/x-pack/plugins/cloud_security_posture/public/common/hooks/use_url_query.test.ts new file mode 100644 index 0000000000000..20649d01be8fc --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/common/hooks/use_url_query.test.ts @@ -0,0 +1,63 @@ +/* + * 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 { renderHook, act } from '@testing-library/react-hooks/dom'; +import { useUrlQuery } from './use_url_query'; +import { useLocation, useHistory } from 'react-router-dom'; +import { encodeQuery } from '../navigation/query_utils'; + +jest.mock('react-router-dom', () => ({ + useHistory: jest.fn(), + useLocation: jest.fn(), +})); + +describe('useUrlQuery', () => { + it('uses default query when no query is provided', () => { + const defaultQuery = { foo: 1 }; + (useHistory as jest.Mock).mockReturnValue({ + push: jest.fn(), + }); + (useLocation as jest.Mock).mockReturnValue({ + search: encodeQuery(defaultQuery), + }); + + const { result } = renderHook(() => useUrlQuery(() => defaultQuery)); + + act(() => { + result.current.setUrlQuery({}); + }); + + expect(result.current.urlQuery.foo).toBe(defaultQuery.foo); + expect(useHistory().push).toHaveBeenCalledTimes(1); + }); + + it('merges default query, partial first query and partial second query', () => { + const defaultQuery = { foo: 1, zoo: 2, moo: 3 }; + const first = { zoo: 3 }; + const second = { moo: 4 }; + (useHistory as jest.Mock).mockReturnValue({ + push: jest.fn(), + }); + (useLocation as jest.Mock).mockReturnValue({ + search: encodeQuery({ ...defaultQuery, ...first, ...second }), + }); + + const { result } = renderHook(() => useUrlQuery(() => defaultQuery)); + + act(() => { + result.current.setUrlQuery(first); + }); + act(() => { + result.current.setUrlQuery(second); + }); + + expect(result.current.urlQuery.foo).toBe(defaultQuery.foo); + expect(result.current.urlQuery.zoo).toBe(first.zoo); + expect(result.current.urlQuery.moo).toBe(second.moo); + expect(useHistory().push).toHaveBeenCalledTimes(2); + }); +}); diff --git a/x-pack/plugins/cloud_security_posture/public/common/hooks/use_url_query.ts b/x-pack/plugins/cloud_security_posture/public/common/hooks/use_url_query.ts new file mode 100644 index 0000000000000..69055de1a78af --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/common/hooks/use_url_query.ts @@ -0,0 +1,46 @@ +/* + * 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 { useEffect, useCallback, useMemo } from 'react'; +import { useHistory, useLocation } from 'react-router-dom'; +import { decodeQuery, encodeQuery } from '../navigation/query_utils'; + +/** + * @description uses 'rison' to encode/decode a url query + * @todo replace getDefaultQuery with schema. validate after decoded from URL, use defaultValues + * @note shallow-merges default, current and next query + */ +export const useUrlQuery = (getDefaultQuery: () => T) => { + const { push } = useHistory(); + const { search, key } = useLocation(); + + const urlQuery = useMemo( + () => ({ ...getDefaultQuery(), ...decodeQuery(search) }), + [getDefaultQuery, search] + ); + + const setUrlQuery = useCallback( + (query: Partial) => + push({ + search: encodeQuery({ ...getDefaultQuery(), ...urlQuery, ...query }), + }), + [getDefaultQuery, urlQuery, push] + ); + + // Set initial query + useEffect(() => { + // TODO: condition should be if decoding failed + if (search) return; + + setUrlQuery(getDefaultQuery()); + }, [getDefaultQuery, search, setUrlQuery]); + + return { + key, + urlQuery, + setUrlQuery, + }; +}; diff --git a/x-pack/plugins/cloud_security_posture/public/common/navigation/constants.ts b/x-pack/plugins/cloud_security_posture/public/common/navigation/constants.ts new file mode 100644 index 0000000000000..bde28fa1ce3b5 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/common/navigation/constants.ts @@ -0,0 +1,20 @@ +/* + * 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 TEXT from './translations'; +import { INTERNAL_FEATURE_FLAGS } from '../../../common/constants'; +import type { CspPage, CspNavigationItem } from './types'; + +export const allNavigationItems: Record = { + dashboard: { name: TEXT.DASHBOARD, path: '/dashboard' }, + findings: { name: TEXT.FINDINGS, path: '/findings' }, + benchmarks: { + name: TEXT.MY_BENCHMARKS, + path: '/benchmarks', + disabled: !INTERNAL_FEATURE_FLAGS.benchmarks, + }, +}; diff --git a/x-pack/plugins/cloud_security_posture/public/common/navigation/query_utils.ts b/x-pack/plugins/cloud_security_posture/public/common/navigation/query_utils.ts new file mode 100644 index 0000000000000..8e4e3e50ae310 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/common/navigation/query_utils.ts @@ -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 { encode, decode, type RisonObject } from 'rison-node'; +import type { LocationDescriptorObject } from 'history'; + +const encodeRison = (v: RisonObject): string | undefined => { + try { + return encode(v); + } catch (e) { + // eslint-disable-next-line no-console + console.error(e); + } +}; + +const decodeRison = (query: string): T | undefined => { + try { + return decode(query) as T; + } catch (e) { + // eslint-disable-next-line no-console + console.error(e); + } +}; + +const QUERY_PARAM_KEY = 'query'; + +export const encodeQuery = (query: RisonObject): LocationDescriptorObject['search'] => { + const risonQuery = encodeRison(query); + if (!risonQuery) return; + return `${QUERY_PARAM_KEY}=${risonQuery}`; +}; + +export const decodeQuery = (search?: string): Partial | undefined => { + const risonQuery = new URLSearchParams(search).get(QUERY_PARAM_KEY); + if (!risonQuery) return; + return decodeRison(risonQuery); +}; diff --git a/x-pack/plugins/cloud_security_posture/public/common/navigation/translations.ts b/x-pack/plugins/cloud_security_posture/public/common/navigation/translations.ts new file mode 100644 index 0000000000000..c434ea55a2829 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/common/navigation/translations.ts @@ -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 { i18n } from '@kbn/i18n'; + +export const CLOUD_POSTURE = i18n.translate('xpack.csp.navigation.cloudPosture', { + defaultMessage: 'Cloud Posture', +}); + +export const FINDINGS = i18n.translate('xpack.csp.navigation.findings', { + defaultMessage: 'Findings', +}); + +export const DASHBOARD = i18n.translate('xpack.csp.navigation.dashboard', { + defaultMessage: 'Dashboard', +}); + +export const MY_BENCHMARKS = i18n.translate('xpack.csp.navigation.my_benchmarks', { + defaultMessage: 'My Benchmarks', +}); diff --git a/x-pack/plugins/cloud_security_posture/public/common/navigation/types.ts b/x-pack/plugins/cloud_security_posture/public/common/navigation/types.ts new file mode 100644 index 0000000000000..64db2e59b667f --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/common/navigation/types.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. + */ +export interface CspNavigationItem { + readonly name: string; + readonly path: string; + readonly disabled?: boolean; +} + +export type CspPage = 'dashboard' | 'findings' | 'benchmarks'; diff --git a/x-pack/plugins/cloud_security_posture/public/common/navigation/use_csp_breadcrumbs.ts b/x-pack/plugins/cloud_security_posture/public/common/navigation/use_csp_breadcrumbs.ts new file mode 100644 index 0000000000000..f11b09bc559dc --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/common/navigation/use_csp_breadcrumbs.ts @@ -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 type { ChromeBreadcrumb, CoreStart } from 'kibana/public'; +import { useEffect } from 'react'; +import { useKibana } from '../../../../../../src/plugins/kibana_react/public'; +import { PLUGIN_ID } from '../../../common'; +import type { CspNavigationItem } from './types'; +import { CLOUD_POSTURE } from './translations'; + +export const useCspBreadcrumbs = (breadcrumbs: CspNavigationItem[]) => { + const { + services: { + chrome: { setBreadcrumbs }, + application: { getUrlForApp }, + }, + } = useKibana(); + + useEffect(() => { + const cspPath = getUrlForApp(PLUGIN_ID); + const additionalBreadCrumbs: ChromeBreadcrumb[] = breadcrumbs.map((breadcrumb) => ({ + text: breadcrumb.name, + path: breadcrumb.path.startsWith('/') + ? `${cspPath}${breadcrumb.path}` + : `${cspPath}/${breadcrumb.path}`, + })); + + setBreadcrumbs([ + { + text: CLOUD_POSTURE, + href: cspPath, + }, + ...additionalBreadCrumbs, + ]); + }, [getUrlForApp, setBreadcrumbs, breadcrumbs]); +}; diff --git a/x-pack/plugins/cloud_security_posture/public/common/translations.ts b/x-pack/plugins/cloud_security_posture/public/common/translations.ts new file mode 100644 index 0000000000000..2aeb21ca33c5f --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/common/translations.ts @@ -0,0 +1,12 @@ +/* + * 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 { i18n } from '@kbn/i18n'; + +export const CLOUD_SECURITY_POSTURE = i18n.translate('xpack.csp.cloudSecurityPosture', { + defaultMessage: 'Cloud Security Posture', +}); diff --git a/x-pack/plugins/cloud_security_posture/public/components/chart_panel.test.tsx b/x-pack/plugins/cloud_security_posture/public/components/chart_panel.test.tsx new file mode 100644 index 0000000000000..114459bcd0865 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/components/chart_panel.test.tsx @@ -0,0 +1,52 @@ +/* + * 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 { render, screen } from '@testing-library/react'; +import { ChartPanel } from './chart_panel'; +import { CHART_PANEL_TEST_SUBJECTS } from './constants'; +import Chance from 'chance'; + +const chance = new Chance(); +const testData = chance.word(); + +const TestingChart = ({ data }: { data: string | undefined }) => { + return
{data}
; +}; + +describe('', () => { + it('renders loading state', () => { + render( + + + + ); + expect(screen.getByTestId(CHART_PANEL_TEST_SUBJECTS.LOADING)).toBeInTheDocument(); + expect(screen.queryByTestId(CHART_PANEL_TEST_SUBJECTS.TEST_CHART)).not.toBeInTheDocument(); + }); + + it('renders error state', () => { + render( + + + + ); + expect(screen.getByTestId(CHART_PANEL_TEST_SUBJECTS.ERROR)).toBeInTheDocument(); + expect(screen.queryByTestId(CHART_PANEL_TEST_SUBJECTS.TEST_CHART)).not.toBeInTheDocument(); + }); + + it('renders chart component', () => { + render( + + + + ); + expect(screen.queryByTestId(CHART_PANEL_TEST_SUBJECTS.LOADING)).not.toBeInTheDocument(); + expect(screen.queryByTestId(CHART_PANEL_TEST_SUBJECTS.ERROR)).not.toBeInTheDocument(); + expect(screen.getByTestId(CHART_PANEL_TEST_SUBJECTS.TEST_CHART)).toBeInTheDocument(); + }); +}); diff --git a/x-pack/plugins/cloud_security_posture/public/components/chart_panel.tsx b/x-pack/plugins/cloud_security_posture/public/components/chart_panel.tsx new file mode 100644 index 0000000000000..5190f71a1721a --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/components/chart_panel.tsx @@ -0,0 +1,80 @@ +/* + * 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 { css } from '@emotion/react'; +import { + EuiPanel, + EuiText, + EuiTitle, + EuiLoadingChart, + EuiFlexGroup, + EuiFlexItem, +} from '@elastic/eui'; +import { CHART_PANEL_TEST_SUBJECTS } from './constants'; + +interface ChartPanelProps { + title?: string; + hasBorder?: boolean; + isLoading: boolean; + isError: boolean; +} + +const Loading = () => ( + + + +); + +const Error = () => ( + + + {'Error'} + + +); + +export const ChartPanel: React.FC = ({ + title, + hasBorder = true, + isLoading, + isError, + children, +}) => { + const renderChart = () => { + if (isLoading) return ; + if (isError) return ; + return children; + }; + + return ( + + + + {title && ( + +

{title}

+
+ )} +
+ {renderChart()} +
+
+ ); +}; + +const euiTitleStyle = css` + font-weight: 400; +`; diff --git a/x-pack/plugins/cloud_security_posture/public/components/compact_formatted_number.tsx b/x-pack/plugins/cloud_security_posture/public/components/compact_formatted_number.tsx new file mode 100644 index 0000000000000..bec44a30b7665 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/components/compact_formatted_number.tsx @@ -0,0 +1,17 @@ +/* + * 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 { FormattedNumber } from '@kbn/i18n-react'; + +export const CompactFormattedNumber = ({ number }: { number: number }) => ( + +); diff --git a/x-pack/plugins/cloud_security_posture/public/components/constants.ts b/x-pack/plugins/cloud_security_posture/public/components/constants.ts new file mode 100644 index 0000000000000..e319fba593b1f --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/components/constants.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. + */ + +export const CHART_PANEL_TEST_SUBJECTS = { + LOADING: 'chart_is_loading', + EMPTY: 'chart_is_empty', + ERROR: 'chart_is_error', + TEST_CHART: 'testing_chart', +}; diff --git a/x-pack/plugins/cloud_security_posture/public/components/csp_evaluation_badge.tsx b/x-pack/plugins/cloud_security_posture/public/components/csp_evaluation_badge.tsx new file mode 100644 index 0000000000000..8603bef59122e --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/components/csp_evaluation_badge.tsx @@ -0,0 +1,26 @@ +/* + * 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 { EuiBadge, EuiBadgeProps } from '@elastic/eui'; +import { CSP_EVALUATION_BADGE_FAILED, CSP_EVALUATION_BADGE_PASSED } from './translations'; + +interface Props { + type: 'passed' | 'failed'; +} + +const getColor = (type: Props['type']): EuiBadgeProps['color'] => { + if (type === 'passed') return 'success'; + if (type === 'failed') return 'danger'; + return 'default'; +}; + +export const CspEvaluationBadge = ({ type }: Props) => ( + + {type === 'failed' ? CSP_EVALUATION_BADGE_FAILED : CSP_EVALUATION_BADGE_PASSED} + +); diff --git a/x-pack/plugins/cloud_security_posture/public/components/csp_health_badge.tsx b/x-pack/plugins/cloud_security_posture/public/components/csp_health_badge.tsx new file mode 100644 index 0000000000000..570789086e464 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/components/csp_health_badge.tsx @@ -0,0 +1,22 @@ +/* + * 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 { EuiBadge } from '@elastic/eui'; +import type { Score } from '../../common/types'; +import * as TEXT from './translations'; + +interface Props { + value: Score; +} + +export const CspHealthBadge = ({ value }: Props) => { + if (value <= 65) return {TEXT.CRITICAL}; + if (value <= 86) return {TEXT.WARNING}; + if (value <= 100) return {TEXT.HEALTHY}; + return null; +}; diff --git a/x-pack/plugins/cloud_security_posture/public/components/csp_loading_state.tsx b/x-pack/plugins/cloud_security_posture/public/components/csp_loading_state.tsx new file mode 100644 index 0000000000000..eb89284f27351 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/components/csp_loading_state.tsx @@ -0,0 +1,18 @@ +/* + * 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, EuiLoadingSpinner } from '@elastic/eui'; +import React from 'react'; + +export const CspLoadingState: React.FunctionComponent = ({ children }) => ( + + + + + {children} + +); diff --git a/x-pack/plugins/cloud_security_posture/public/components/page_template.test.tsx b/x-pack/plugins/cloud_security_posture/public/components/page_template.test.tsx new file mode 100644 index 0000000000000..a9be5ebcdebfe --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/components/page_template.test.tsx @@ -0,0 +1,75 @@ +/* + * 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, { ComponentProps } from 'react'; +import { render, screen } from '@testing-library/react'; +import Chance from 'chance'; +import { createNavigationItemFixture } from '../test/fixtures/navigation_item'; +import { TestProvider } from '../test/test_provider'; +import { CspPageTemplate, getSideNavItems } from './page_template'; + +const chance = new Chance(); + +describe('getSideNavItems', () => { + it('maps navigation items to side navigation items', () => { + const navigationItem = createNavigationItemFixture(); + const id = chance.word(); + const sideNavItems = getSideNavItems({ [id]: navigationItem }); + + expect(sideNavItems).toHaveLength(1); + expect(sideNavItems[0]).toMatchObject({ + id, + name: navigationItem.name, + renderItem: expect.any(Function), + }); + }); + + it('does not map disabled navigation items to side navigation items', () => { + const navigationItem = createNavigationItemFixture({ disabled: true }); + const id = chance.word(); + const sideNavItems = getSideNavItems({ [id]: navigationItem }); + expect(sideNavItems).toHaveLength(0); + }); +}); + +describe('', () => { + const renderCspPageTemplate = (props: ComponentProps) => { + render( + + + + ); + }; + + it('renders children when not loading', () => { + const children = chance.sentence(); + renderCspPageTemplate({ isLoading: false, children }); + + expect(screen.getByText(children)).toBeInTheDocument(); + }); + + it('does not render loading text when not loading', () => { + const children = chance.sentence(); + const loadingText = chance.sentence(); + renderCspPageTemplate({ isLoading: false, loadingText, children }); + + expect(screen.queryByText(loadingText)).not.toBeInTheDocument(); + }); + + it('renders loading text when loading is true', () => { + const loadingText = chance.sentence(); + renderCspPageTemplate({ loadingText, isLoading: true }); + + expect(screen.getByText(loadingText)).toBeInTheDocument(); + }); + + it('does not render children when loading', () => { + const children = chance.sentence(); + renderCspPageTemplate({ isLoading: true, children }); + + expect(screen.queryByText(children)).not.toBeInTheDocument(); + }); +}); diff --git a/x-pack/plugins/cloud_security_posture/public/components/page_template.tsx b/x-pack/plugins/cloud_security_posture/public/components/page_template.tsx new file mode 100644 index 0000000000000..4b28671a446ce --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/components/page_template.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 { EuiSpacer } from '@elastic/eui'; +import React from 'react'; +import { NavLink } from 'react-router-dom'; +import { EuiErrorBoundary } from '@elastic/eui'; +import { + KibanaPageTemplate, + KibanaPageTemplateProps, +} from '../../../../../src/plugins/kibana_react/public'; +import { allNavigationItems } from '../common/navigation/constants'; +import type { CspNavigationItem } from '../common/navigation/types'; +import { CLOUD_SECURITY_POSTURE } from '../common/translations'; +import { CspLoadingState } from './csp_loading_state'; +import { LOADING } from './translations'; + +const activeItemStyle = { fontWeight: 700 }; + +export const getSideNavItems = ( + navigationItems: Record +): NonNullable['items'] => + Object.entries(navigationItems) + .filter(([_, navigationItem]) => !navigationItem.disabled) + .map(([id, navigationItem]) => ({ + id, + name: navigationItem.name, + renderItem: () => ( + + {navigationItem.name} + + ), + })); + +const defaultProps: KibanaPageTemplateProps = { + solutionNav: { + name: CLOUD_SECURITY_POSTURE, + items: getSideNavItems(allNavigationItems), + }, + restrictWidth: false, + template: 'default', +}; + +interface CspPageTemplateProps extends KibanaPageTemplateProps { + isLoading?: boolean; + loadingText?: string; +} + +export const CspPageTemplate: React.FC = ({ + children, + isLoading, + loadingText = LOADING, + ...props +}) => { + return ( + + + {isLoading ? ( + <> + + {loadingText} + + ) : ( + children + )} + + + ); +}; diff --git a/x-pack/plugins/cloud_security_posture/public/components/translations.ts b/x-pack/plugins/cloud_security_posture/public/components/translations.ts new file mode 100644 index 0000000000000..ac03b9e9df721 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/components/translations.ts @@ -0,0 +1,42 @@ +/* + * 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 { i18n } from '@kbn/i18n'; + +export const CRITICAL = i18n.translate('xpack.csp.critical', { + defaultMessage: 'Critical', +}); + +export const WARNING = i18n.translate('xpack.csp.warning', { + defaultMessage: 'Warning', +}); + +export const HEALTHY = i18n.translate('xpack.csp.healthy', { + defaultMessage: 'Healthy', +}); + +export const PAGE_NOT_FOUND = i18n.translate('xpack.csp.page_not_found', { + defaultMessage: 'Page not found', +}); + +export const LOADING = i18n.translate('xpack.csp.loading', { + defaultMessage: 'Loading...', +}); + +export const CSP_EVALUATION_BADGE_FAILED = i18n.translate( + 'xpack.csp.cspEvaluationBadge.failedLabelText', + { + defaultMessage: 'FAILED', + } +); + +export const CSP_EVALUATION_BADGE_PASSED = i18n.translate( + 'xpack.csp.cspEvaluationBadge.passedLabelText', + { + defaultMessage: 'PASSED', + } +); diff --git a/x-pack/plugins/cloud_security_posture/public/components/unknown_route.tsx b/x-pack/plugins/cloud_security_posture/public/components/unknown_route.tsx new file mode 100644 index 0000000000000..248d598302b9f --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/components/unknown_route.tsx @@ -0,0 +1,22 @@ +/* + * 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 } from '@elastic/eui'; +import { CspPageTemplate } from './page_template'; +import * as TEXT from './translations'; + +export const UnknownRoute = React.memo(() => ( + + {TEXT.PAGE_NOT_FOUND}

} + /> +
+)); diff --git a/x-pack/plugins/cloud_security_posture/public/index.ts b/x-pack/plugins/cloud_security_posture/public/index.ts new file mode 100755 index 0000000000000..62f00735247ca --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/index.ts @@ -0,0 +1,12 @@ +/* + * 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 { CspPlugin } from './plugin'; + +export type { CspClientPluginSetup, CspClientPluginStart } from './types'; + +export const plugin = () => new CspPlugin(); diff --git a/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks.test.tsx b/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks.test.tsx new file mode 100644 index 0000000000000..c23d6599a1c30 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks.test.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 { render, screen } from '@testing-library/react'; +import type { UseQueryResult } from 'react-query/types/react/types'; +import { createCspBenchmarkIntegrationFixture } from '../../test/fixtures/csp_benchmark_integration'; +import { createReactQueryResponse } from '../../test/fixtures/react_query'; +import { TestProvider } from '../../test/test_provider'; +import { Benchmarks, BENCHMARKS_ERROR_TEXT, BENCHMARKS_TABLE_DATA_TEST_SUBJ } from './benchmarks'; +import { ADD_A_CIS_INTEGRATION, BENCHMARK_INTEGRATIONS, LOADING_BENCHMARKS } from './translations'; +import { useCspBenchmarkIntegrations } from './use_csp_benchmark_integrations'; + +jest.mock('./use_csp_benchmark_integrations'); + +describe('', () => { + beforeEach(() => { + jest.resetAllMocks(); + }); + + const renderBenchmarks = ( + queryResponse: Partial = createReactQueryResponse() + ) => { + (useCspBenchmarkIntegrations as jest.Mock).mockImplementation(() => queryResponse); + + return render( + + + + ); + }; + + it('renders the page header', () => { + renderBenchmarks(); + + expect(screen.getByText(BENCHMARK_INTEGRATIONS)).toBeInTheDocument(); + }); + + it('renders the "add integration" button', () => { + renderBenchmarks(); + + expect(screen.getByText(ADD_A_CIS_INTEGRATION)).toBeInTheDocument(); + }); + + it('renders loading state while loading', () => { + renderBenchmarks(createReactQueryResponse({ status: 'loading' })); + + expect(screen.getByText(LOADING_BENCHMARKS)).toBeInTheDocument(); + expect(screen.queryByTestId(BENCHMARKS_TABLE_DATA_TEST_SUBJ)).not.toBeInTheDocument(); + }); + + it('renders error state while there is an error', () => { + renderBenchmarks(createReactQueryResponse({ status: 'error', error: new Error() })); + + expect(screen.getByText(BENCHMARKS_ERROR_TEXT)).toBeInTheDocument(); + expect(screen.queryByTestId(BENCHMARKS_TABLE_DATA_TEST_SUBJ)).not.toBeInTheDocument(); + }); + + it('renders the benchmarks table', () => { + renderBenchmarks( + createReactQueryResponse({ + status: 'success', + data: [createCspBenchmarkIntegrationFixture()], + }) + ); + + expect(screen.getByTestId(BENCHMARKS_TABLE_DATA_TEST_SUBJ)).toBeInTheDocument(); + }); +}); diff --git a/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks.tsx b/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks.tsx new file mode 100644 index 0000000000000..56d43816cf34d --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks.tsx @@ -0,0 +1,49 @@ +/* + * 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 { EuiPageHeaderProps, EuiButton } from '@elastic/eui'; +import React from 'react'; +import { allNavigationItems } from '../../common/navigation/constants'; +import { useCspBreadcrumbs } from '../../common/navigation/use_csp_breadcrumbs'; +import { CspPageTemplate } from '../../components/page_template'; +import { BenchmarksTable } from './benchmarks_table'; +import { ADD_A_CIS_INTEGRATION, BENCHMARK_INTEGRATIONS, LOADING_BENCHMARKS } from './translations'; +import { useCspBenchmarkIntegrations } from './use_csp_benchmark_integrations'; + +const PAGE_HEADER: EuiPageHeaderProps = { + pageTitle: BENCHMARK_INTEGRATIONS, + rightSideItems: [ + // TODO: Link this to integrations once we have one + + {ADD_A_CIS_INTEGRATION} + , + ], +}; + +const BENCHMARKS_BREADCRUMBS = [allNavigationItems.benchmarks]; + +export const BENCHMARKS_TABLE_DATA_TEST_SUBJ = 'cspBenchmarksTable'; +// TODO: Error state +export const BENCHMARKS_ERROR_TEXT = 'TODO: Error state'; +const BenchmarksErrorState = () =>
{BENCHMARKS_ERROR_TEXT}
; + +export const Benchmarks = () => { + useCspBreadcrumbs(BENCHMARKS_BREADCRUMBS); + const query = useCspBenchmarkIntegrations(); + + return ( + + {query.status === 'error' && } + {query.status === 'success' && ( + + )} + + ); +}; diff --git a/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks_table.test.tsx b/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks_table.test.tsx new file mode 100644 index 0000000000000..ec0da6359eb49 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks_table.test.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 React from 'react'; +import Chance from 'chance'; +import { render, screen } from '@testing-library/react'; +import moment from 'moment'; +import { createCspBenchmarkIntegrationFixture } from '../../test/fixtures/csp_benchmark_integration'; +import { BenchmarksTable } from './benchmarks_table'; +import { TABLE_COLUMN_HEADERS } from './translations'; + +describe('', () => { + const chance = new Chance(); + + it('renders all column headers', () => { + render(); + + Object.values(TABLE_COLUMN_HEADERS).forEach((columnHeader) => { + expect(screen.getByText(columnHeader)).toBeInTheDocument(); + }); + }); + + it('renders integration name', () => { + const integrationName = chance.sentence(); + const benchmarks = [ + createCspBenchmarkIntegrationFixture({ integration_name: integrationName }), + ]; + + render(); + + expect(screen.getByText(integrationName)).toBeInTheDocument(); + }); + + it('renders benchmark name', () => { + const benchmarkName = chance.sentence(); + const benchmarks = [createCspBenchmarkIntegrationFixture({ benchmark: benchmarkName })]; + + render(); + + expect(screen.getByText(benchmarkName)).toBeInTheDocument(); + }); + + it('renders active rules', () => { + const activeRules = chance.integer({ min: 1 }); + const totalRules = chance.integer({ min: activeRules }); + const benchmarks = [ + createCspBenchmarkIntegrationFixture({ rules: { active: activeRules, total: totalRules } }), + ]; + + render(); + + expect(screen.getByText(`${activeRules} of ${totalRules}`)).toBeInTheDocument(); + }); + + it('renders agent policy name', () => { + const agentPolicy = { + id: chance.guid(), + name: chance.sentence(), + number_of_agents: chance.integer({ min: 1 }), + }; + + const benchmarks = [createCspBenchmarkIntegrationFixture({ agent_policy: agentPolicy })]; + + render(); + + expect(screen.getByText(agentPolicy.name)).toBeInTheDocument(); + }); + + it('renders number of agents', () => { + const agentPolicy = { + id: chance.guid(), + name: chance.sentence(), + number_of_agents: chance.integer({ min: 1 }), + }; + + const benchmarks = [createCspBenchmarkIntegrationFixture({ agent_policy: agentPolicy })]; + + render(); + + expect(screen.getByText(agentPolicy.number_of_agents)).toBeInTheDocument(); + }); + + it('renders created by', () => { + const createdBy = chance.sentence(); + const benchmarks = [createCspBenchmarkIntegrationFixture({ created_by: createdBy })]; + + render(); + + expect(screen.getByText(createdBy)).toBeInTheDocument(); + }); + + it('renders created at', () => { + const createdAt = chance.date({ year: chance.integer({ min: 2015, max: 2021 }) }) as Date; + const benchmarks = [createCspBenchmarkIntegrationFixture({ created_at: createdAt })]; + + render(); + + expect(screen.getByText(moment(createdAt).fromNow())).toBeInTheDocument(); + }); +}); diff --git a/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks_table.tsx b/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks_table.tsx new file mode 100644 index 0000000000000..b81065e7f354e --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks_table.tsx @@ -0,0 +1,64 @@ +/* + * 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 { EuiBasicTable, type EuiBasicTableColumn } from '@elastic/eui'; +import React from 'react'; +import moment from 'moment'; +import { TABLE_COLUMN_HEADERS } from './translations'; +import type { CspBenchmarkIntegration } from './types'; + +interface BenchmarksTableProps { + benchmarks: CspBenchmarkIntegration[]; + 'data-test-subj'?: string; +} + +const BENCHMARKS_TABLE_COLUMNS: Array> = [ + { + field: 'integration_name', + name: TABLE_COLUMN_HEADERS.INTEGRATION_NAME, + dataType: 'string', + }, + { + field: 'benchmark', + name: TABLE_COLUMN_HEADERS.BENCHMARK, + dataType: 'string', + }, + { + render: (benchmarkIntegration: CspBenchmarkIntegration) => + `${benchmarkIntegration.rules.active} of ${benchmarkIntegration.rules.total}`, + name: TABLE_COLUMN_HEADERS.ACTIVE_RULES, + }, + { + field: 'agent_policy.name', + name: TABLE_COLUMN_HEADERS.AGENT_POLICY, + dataType: 'string', + }, + { + field: 'agent_policy.number_of_agents', + name: TABLE_COLUMN_HEADERS.NUMBER_OF_AGENTS, + dataType: 'number', + }, + { + field: 'created_by', + name: TABLE_COLUMN_HEADERS.CREATED_BY, + dataType: 'string', + }, + { + field: 'created_at', + name: TABLE_COLUMN_HEADERS.CREATED_AT, + dataType: 'date', + render: (date: CspBenchmarkIntegration['created_at']) => moment(date).fromNow(), + }, +]; + +export const BenchmarksTable = ({ benchmarks, ...rest }: BenchmarksTableProps) => ( + +); diff --git a/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/index.ts b/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/index.ts new file mode 100644 index 0000000000000..839cf37ebf49e --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/index.ts @@ -0,0 +1,8 @@ +/* + * 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. + */ + +export { Benchmarks } from './benchmarks'; diff --git a/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/translations.ts b/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/translations.ts new file mode 100644 index 0000000000000..a422295ebf812 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/translations.ts @@ -0,0 +1,47 @@ +/* + * 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 { i18n } from '@kbn/i18n'; + +export const BENCHMARK_INTEGRATIONS = i18n.translate( + 'xpack.csp.benchmarks.benchmark_integrations', + { + defaultMessage: 'Benchmark Integrations', + } +); + +export const LOADING_BENCHMARKS = i18n.translate('xpack.csp.benchmarks.loading_benchmarks', { + defaultMessage: 'Loading your benchmarks...', +}); + +export const ADD_A_CIS_INTEGRATION = i18n.translate('xpack.csp.benchmarks.add_a_cis_integration', { + defaultMessage: 'Add a CIS integration', +}); + +export const TABLE_COLUMN_HEADERS = { + INTEGRATION_NAME: i18n.translate('xpack.csp.benchmarks.table_column_headers.integration_name', { + defaultMessage: 'Integration Name', + }), + BENCHMARK: i18n.translate('xpack.csp.benchmarks.table_column_headers.benchmark', { + defaultMessage: 'Benchmark', + }), + ACTIVE_RULES: i18n.translate('xpack.csp.benchmarks.table_column_headers.active_rules', { + defaultMessage: 'Active Rules', + }), + AGENT_POLICY: i18n.translate('xpack.csp.benchmarks.table_column_headers.agent_policy', { + defaultMessage: 'Agent Policy', + }), + NUMBER_OF_AGENTS: i18n.translate('xpack.csp.benchmarks.table_column_headers.number_of_agents', { + defaultMessage: 'Number of Agents', + }), + CREATED_BY: i18n.translate('xpack.csp.benchmarks.table_column_headers.created_by', { + defaultMessage: 'Created by', + }), + CREATED_AT: i18n.translate('xpack.csp.benchmarks.table_column_headers.created_at', { + defaultMessage: 'Created at', + }), +}; diff --git a/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/types.ts b/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/types.ts new file mode 100644 index 0000000000000..df35b6ac7869a --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/types.ts @@ -0,0 +1,23 @@ +/* + * 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. + */ + +// TODO: Use interface from BE +export interface CspBenchmarkIntegration { + integration_name: string; + benchmark: string; + rules: { + active: number; + total: number; + }; + agent_policy: { + id: string; + name: string; + number_of_agents: number; + }; + created_by: string; + created_at: Date; +} diff --git a/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/use_csp_benchmark_integrations.ts b/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/use_csp_benchmark_integrations.ts new file mode 100644 index 0000000000000..8508b1bab1fc4 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/use_csp_benchmark_integrations.ts @@ -0,0 +1,25 @@ +/* + * 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 { useQuery } from 'react-query'; +import { createCspBenchmarkIntegrationFixture } from '../../test/fixtures/csp_benchmark_integration'; +import { CspBenchmarkIntegration } from './types'; + +const QUERY_KEY = 'csp_benchmark_integrations'; + +const FAKE_DATA: CspBenchmarkIntegration[] = [ + createCspBenchmarkIntegrationFixture(), + createCspBenchmarkIntegrationFixture(), + createCspBenchmarkIntegrationFixture(), + createCspBenchmarkIntegrationFixture(), + createCspBenchmarkIntegrationFixture(), +]; + +// TODO: Use data from BE +export const useCspBenchmarkIntegrations = () => { + return useQuery(QUERY_KEY, () => Promise.resolve(FAKE_DATA)); +}; diff --git a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/cloud_posture_score_chart.tsx b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/cloud_posture_score_chart.tsx new file mode 100644 index 0000000000000..01dfd837fca2f --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/cloud_posture_score_chart.tsx @@ -0,0 +1,114 @@ +/* + * 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 { + Chart, + ElementClickListener, + Partition, + PartitionElementEvent, + PartitionLayout, + Settings, +} from '@elastic/charts'; +import { EuiFlexGroup, EuiText, EuiHorizontalRule, EuiFlexItem } from '@elastic/eui'; +import { statusColors } from '../../../common/constants'; +import type { Stats } from '../../../../common/types'; +import * as TEXT from '../translations'; +import { CompactFormattedNumber } from '../../../components/compact_formatted_number'; + +interface CloudPostureScoreChartProps { + data: Stats; + id: string; + partitionOnElementClick: (elements: PartitionElementEvent[]) => void; +} + +const ScoreChart = ({ + data: { totalPassed, totalFailed }, + id, + partitionOnElementClick, +}: CloudPostureScoreChartProps) => { + const data = [ + { label: TEXT.PASSED, value: totalPassed }, + { label: TEXT.FAILED, value: totalFailed }, + ]; + + return ( + + + d.value} + layout={PartitionLayout.sunburst} + layers={[ + { + groupByRollup: (d: { label: string }) => d.label, + shape: { + fillColor: (d, index) => + d.dataName === 'Passed' ? statusColors.success : statusColors.danger, + }, + }, + ]} + /> + + ); +}; + +const PercentageInfo = ({ + postureScore, + totalPassed, + totalFindings, +}: CloudPostureScoreChartProps['data']) => { + const percentage = `${Math.round(postureScore)}%`; + + return ( + + {percentage} + + + {'/'} + + {' Findings passed'} + + + ); +}; + +const ComplianceTrendChart = () =>
Trend Placeholder
; + +export const CloudPostureScoreChart = ({ + data, + id, + partitionOnElementClick, +}: CloudPostureScoreChartProps) => ( + + + + + + + + + + + + + + + + +); diff --git a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/compliance_stats.tsx b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/compliance_stats.tsx new file mode 100644 index 0000000000000..1dff4aba203b9 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/compliance_stats.tsx @@ -0,0 +1,158 @@ +/* + * 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 { + EuiStat, + EuiFlexItem, + EuiPanel, + EuiIcon, + EuiFlexGrid, + EuiText, + // EuiFlexGroup, +} from '@elastic/eui'; +// import { Chart, Settings, LineSeries } from '@elastic/charts'; +import type { IconType, EuiStatProps } from '@elastic/eui'; +import { useCloudPostureStatsApi } from '../../../common/api'; +import { statusColors } from '../../../common/constants'; +import { Score } from '../../../../common/types'; +import * as TEXT from '../translations'; +import { NO_DATA_TO_DISPLAY } from '../translations'; + +// type Trend = Array<[time: number, value: number]>; + +// TODO: this is the warning color hash listen in EUI's docs. need to find where to import it from. + +const getTitleColor = (value: Score): EuiStatProps['titleColor'] => { + if (value <= 65) return 'danger'; + if (value <= 95) return statusColors.warning; + if (value <= 100) return 'success'; + return 'default'; +}; + +const getScoreIcon = (value: Score): IconType => { + if (value <= 65) return 'alert'; + if (value <= 86) return 'alert'; + if (value <= 100) return 'check'; + return 'error'; +}; + +// TODO: make score trend check for length, cases for less than 2 or more than 5 should be handled +// const getScoreTrendPercentage = (scoreTrend: Trend) => { +// const beforeLast = scoreTrend[scoreTrend.length - 2][1]; +// const last = scoreTrend[scoreTrend.length - 1][1]; +// +// return Number((last - beforeLast).toFixed(1)); +// }; + +const placeholder = ( + + {NO_DATA_TO_DISPLAY} + +); + +export const ComplianceStats = () => { + const getStats = useCloudPostureStatsApi(); + // TODO: add error/loading state + if (!getStats.isSuccess) return null; + const { postureScore, benchmarksStats: benchmarks } = getStats.data; + + // TODO: in case we dont have a full length trend we will need to handle the sparkline chart alone. not rendering anything is just a temporary solution + if (!benchmarks || !postureScore) return null; + + // TODO: mock data, needs BE + // const scoreTrend = [ + // [0, 0], + // [1, 10], + // [2, 100], + // [3, 50], + // [4, postureScore], + // ] as Trend; + // + // const scoreChange = getScoreTrendPercentage(scoreTrend); + // const isPositiveChange = scoreChange > 0; + + const stats = [ + { + title: postureScore, + description: TEXT.POSTURE_SCORE, + titleColor: getTitleColor(postureScore), + iconType: getScoreIcon(postureScore), + }, + { + // TODO: remove placeholder for the commented out component, needs BE + title: placeholder, + description: TEXT.POSTURE_SCORE_TREND, + }, + // { + // title: ( + // + // + // {`${scoreChange}%`} + // + // ), + // description: 'Posture Score Trend', + // titleColor: isPositiveChange ? 'success' : 'danger', + // renderBody: ( + // <> + // + // + // + // + // + // ), + // }, + { + // TODO: this should count only ACTIVE benchmarks. needs BE + title: benchmarks.length, + description: TEXT.ACTIVE_FRAMEWORKS, + }, + { + // TODO: should be relatively simple to return from BE. needs BE + title: placeholder, + description: TEXT.TOTAL_RESOURCES, + }, + ]; + + return ( + + {stats.map((s) => ( + + + + { + // s.renderBody || + + } + + + + ))} + + ); +}; diff --git a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/compliance_trend_chart.tsx b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/compliance_trend_chart.tsx new file mode 100644 index 0000000000000..51aed6ed4e958 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/compliance_trend_chart.tsx @@ -0,0 +1,32 @@ +/* + * 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 { + Chart, + Settings, + Axis, + timeFormatter, + niceTimeFormatByDay, + AreaSeries, +} from '@elastic/charts'; + +export const ComplianceTrendChart = () => ( + + + + + + +); diff --git a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/risks_table.test.ts b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/risks_table.test.ts new file mode 100644 index 0000000000000..0c750e10f060a --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/risks_table.test.ts @@ -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 { getTop5Risks, RisksTableProps } from './risks_table'; + +const podsAgg = { + resourceType: 'pods', + totalFindings: 2, + totalPassed: 1, + totalFailed: 1, +}; + +const etcdAgg = { + resourceType: 'etcd', + totalFindings: 5, + totalPassed: 0, + totalFailed: 5, +}; + +const clusterAgg = { + resourceType: 'cluster', + totalFindings: 2, + totalPassed: 2, + totalFailed: 0, +}; + +const systemAgg = { + resourceType: 'system', + totalFindings: 10, + totalPassed: 6, + totalFailed: 4, +}; + +const apiAgg = { + resourceType: 'api', + totalFindings: 19100, + totalPassed: 2100, + totalFailed: 17000, +}; + +const serverAgg = { + resourceType: 'server', + totalFindings: 7, + totalPassed: 4, + totalFailed: 3, +}; + +const mockData: RisksTableProps['data'] = [ + podsAgg, + etcdAgg, + clusterAgg, + systemAgg, + apiAgg, + serverAgg, +]; + +describe('getTop5Risks', () => { + it('returns sorted by failed findings', () => { + expect(getTop5Risks([systemAgg, etcdAgg, apiAgg])).toEqual([apiAgg, etcdAgg, systemAgg]); + }); + + it('return array filtered with failed findings only', () => { + expect(getTop5Risks([systemAgg, clusterAgg, apiAgg])).toEqual([apiAgg, systemAgg]); + }); + + it('return sorted and filtered array with no more then 5 elements', () => { + expect(getTop5Risks(mockData)).toEqual([apiAgg, etcdAgg, systemAgg, serverAgg, podsAgg]); + }); +}); diff --git a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/risks_table.tsx b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/risks_table.tsx new file mode 100644 index 0000000000000..fb43a8129ed77 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/risks_table.tsx @@ -0,0 +1,159 @@ +/* + * 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, useMemo } from 'react'; +import { + EuiBasicTable, + EuiButtonEmpty, + EuiFlexGroup, + EuiFlexItem, + EuiLink, + EuiText, +} from '@elastic/eui'; +import type { Query } from '@kbn/es-query'; +import { useHistory } from 'react-router-dom'; +import { CloudPostureStats, ResourceTypeAgg } from '../../../../common/types'; +import { allNavigationItems } from '../../../common/navigation/constants'; +import { encodeQuery } from '../../../common/navigation/query_utils'; +import { CompactFormattedNumber } from '../../../components/compact_formatted_number'; +import * as TEXT from '../translations'; +import { RULE_FAILED } from '../../../../common/constants'; + +// TODO: remove this option after we get data from the beat +const useMockData: boolean = false; +const mock = [ + { + resourceType: 'pods', + totalFindings: 2, + totalPassed: 1, + totalFailed: 1, + }, + { + resourceType: 'etcd', + totalFindings: 5, + totalPassed: 0, + totalFailed: 5, + }, + { + resourceType: 'cluster', + totalFindings: 2, + totalPassed: 2, + totalFailed: 0, + }, + { + resourceType: 'system', + totalFindings: 10, + totalPassed: 6, + totalFailed: 4, + }, + { + resourceType: 'api', + totalFindings: 19100, + totalPassed: 2100, + totalFailed: 17000, + }, + { + resourceType: 'server', + totalFindings: 7, + totalPassed: 4, + totalFailed: 3, + }, +]; + +export interface RisksTableProps { + data: CloudPostureStats['resourceTypesAggs']; +} + +const maxRisks = 5; + +export const getTop5Risks = (resourceTypesAggs: CloudPostureStats['resourceTypesAggs']) => { + const filtered = resourceTypesAggs.filter((x) => x.totalFailed > 0); + const sorted = filtered.slice().sort((first, second) => second.totalFailed - first.totalFailed); + + return sorted.slice(0, maxRisks); +}; + +const getFailedFindingsQuery = (): Query => ({ + language: 'kuery', + query: `result.evaluation : "${RULE_FAILED}" `, +}); + +const getResourceTypeFailedFindingsQuery = (resourceType: string): Query => ({ + language: 'kuery', + query: `resource.type : "${resourceType}" and result.evaluation : "${RULE_FAILED}" `, +}); + +export const RisksTable = ({ data: resourceTypesAggs }: RisksTableProps) => { + const { push } = useHistory(); + + const handleCellClick = useCallback( + (resourceType: ResourceTypeAgg['resourceType']) => + push({ + pathname: allNavigationItems.findings.path, + search: encodeQuery(getResourceTypeFailedFindingsQuery(resourceType)), + }), + [push] + ); + + const handleViewAllClick = useCallback( + () => + push({ + pathname: allNavigationItems.findings.path, + search: encodeQuery(getFailedFindingsQuery()), + }), + [push] + ); + + const columns = useMemo( + () => [ + { + field: 'resourceType', + name: TEXT.RESOURCE_TYPE, + render: (resourceType: ResourceTypeAgg['resourceType']) => ( + handleCellClick(resourceType)}>{resourceType} + ), + }, + { + field: 'totalFailed', + name: TEXT.FAILED_FINDINGS, + render: (totalFailed: ResourceTypeAgg['totalFailed'], resource: ResourceTypeAgg) => ( + <> + + + + + {'/'} + + + + ), + }, + ], + [handleCellClick] + ); + + return ( + + + + rowHeader="resourceType" + items={useMockData ? getTop5Risks(mock) : getTop5Risks(resourceTypesAggs)} + columns={columns} + /> + + + + + + {TEXT.VIEW_ALL_FAILED_FINDINGS} + + + + + + ); +}; diff --git a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/score_per_account_chart.tsx b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/score_per_account_chart.tsx new file mode 100644 index 0000000000000..fd47a3ecf9e43 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/score_per_account_chart.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 { Axis, BarSeries, Chart, Settings } from '@elastic/charts'; +import { statusColors } from '../../../common/constants'; + +// soon to be deprecated +export const ScorePerAccountChart = () => { + return ( + + + + `${Number(v * 100).toFixed(0)}%`, + }} + id="bars" + data={[]} + xAccessor={'resource'} + yAccessors={['value']} + splitSeriesAccessors={['evaluation']} + stackAccessors={['evaluation']} + stackMode="percentage" + /> + + ); +}; + +const theme = { + colors: { vizColors: [statusColors.success, statusColors.danger] }, + barSeriesStyle: { + displayValue: { + fontSize: 14, + fill: { color: 'white', borderColor: 'blue', borderWidth: 0 }, + offsetX: 5, + offsetY: -5, + }, + }, +}; diff --git a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.tsx b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.tsx new file mode 100644 index 0000000000000..a21ac4877f1c6 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.tsx @@ -0,0 +1,44 @@ +/* + * 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 { EuiSpacer } from '@elastic/eui'; +import { allNavigationItems } from '../../common/navigation/constants'; +import { useCspBreadcrumbs } from '../../common/navigation/use_csp_breadcrumbs'; +import { SummarySection } from './dashboard_sections/summary_section'; +import { BenchmarksSection } from './dashboard_sections/benchmarks_section'; +import { useCloudPostureStatsApi } from '../../common/api'; +import { CspPageTemplate } from '../../components/page_template'; +import * as TEXT from './translations'; + +const CompliancePage = () => { + const getStats = useCloudPostureStatsApi(); + if (getStats.isLoading) return null; + + return ( + <> + + + + + + ); +}; + +export const ComplianceDashboard = () => { + useCspBreadcrumbs([allNavigationItems.dashboard]); + + return ( + + + + ); +}; diff --git a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/benchmarks_section.tsx b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/benchmarks_section.tsx new file mode 100644 index 0000000000000..fcbfe47ea6d2c --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/benchmarks_section.tsx @@ -0,0 +1,152 @@ +/* + * 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 { + EuiFlexGrid, + EuiFlexItem, + EuiPanel, + EuiIcon, + EuiTitle, + EuiSpacer, + EuiDescriptionList, +} from '@elastic/eui'; +import { EuiIconType } from '@elastic/eui/src/components/icon/icon'; +import { Query } from '@kbn/es-query'; +import { useHistory } from 'react-router-dom'; +import { PartitionElementEvent } from '@elastic/charts'; +import { CloudPostureScoreChart } from '../compliance_charts/cloud_posture_score_chart'; +import { ComplianceTrendChart } from '../compliance_charts/compliance_trend_chart'; +import { useCloudPostureStatsApi } from '../../../common/api/use_cloud_posture_stats_api'; +import { CspHealthBadge } from '../../../components/csp_health_badge'; +import { ChartPanel } from '../../../components/chart_panel'; +import * as TEXT from '../translations'; +import { allNavigationItems } from '../../../common/navigation/constants'; +import { encodeQuery } from '../../../common/navigation/query_utils'; +import { Evaluation } from '../../../../common/types'; + +const logoMap: ReadonlyMap = new Map([['CIS Kubernetes', 'logoKubernetes']]); + +const getBenchmarkLogo = (benchmarkName: string): EuiIconType => { + return logoMap.get(benchmarkName) ?? 'logoElastic'; +}; + +const getBenchmarkEvaluationQuery = (name: string, evaluation: Evaluation): Query => ({ + language: 'kuery', + query: `rule.benchmark : "${name}" and result.evaluation : "${evaluation}"`, +}); + +export const BenchmarksSection = () => { + const history = useHistory(); + const getStats = useCloudPostureStatsApi(); + const benchmarks = getStats.isSuccess && getStats.data.benchmarksStats; + if (!benchmarks) return null; + + const handleElementClick = (name: string, elements: PartitionElementEvent[]) => { + const [element] = elements; + const [layerValue] = element; + const rollupValue = layerValue[0].groupByRollup as Evaluation; + + history.push({ + pathname: allNavigationItems.findings.path, + search: encodeQuery(getBenchmarkEvaluationQuery(name, rollupValue)), + }); + }; + + return ( + <> + {benchmarks.map((benchmark) => ( + + + + + + +

{benchmark.name}

+
+
+ + + + handleElementClick(benchmark.name, elements) + } + /> +
+ ), + }, + ]} + /> + + + + {/* TODO: no api for this chart yet, using empty state for now. needs BE */} + + + ), + }, + ]} + /> + + + + ) : ( + TEXT.ERROR + ), + }, + { + title: TEXT.TOTAL_FAILURES, + description: benchmark.totalFailed || TEXT.ERROR, + }, + ]} + /> + + + + ))} + + ); +}; diff --git a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/summary_section.tsx b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/summary_section.tsx new file mode 100644 index 0000000000000..db768aa5c7b78 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/summary_section.tsx @@ -0,0 +1,83 @@ +/* + * 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 { EuiFlexGrid, EuiFlexItem } from '@elastic/eui'; +import { useHistory } from 'react-router-dom'; +import { PartitionElementEvent } from '@elastic/charts'; +import { Query } from '@kbn/es-query'; +import { ScorePerAccountChart } from '../compliance_charts/score_per_account_chart'; +import { ChartPanel } from '../../../components/chart_panel'; +import { useCloudPostureStatsApi } from '../../../common/api'; +import * as TEXT from '../translations'; +import { CloudPostureScoreChart } from '../compliance_charts/cloud_posture_score_chart'; +import { allNavigationItems } from '../../../common/navigation/constants'; +import { encodeQuery } from '../../../common/navigation/query_utils'; +import { Evaluation } from '../../../../common/types'; +import { RisksTable } from '../compliance_charts/risks_table'; + +const getEvaluationQuery = (evaluation: Evaluation): Query => ({ + language: 'kuery', + query: `"result.evaluation : "${evaluation}"`, +}); + +const defaultHeight = 360; + +// TODO: limit this to desktop media queries only +const summarySectionWrapperStyle = { + height: defaultHeight, +}; + +export const SummarySection = () => { + const history = useHistory(); + const getStats = useCloudPostureStatsApi(); + if (!getStats.isSuccess) return null; + + const handleElementClick = (elements: PartitionElementEvent[]) => { + const [element] = elements; + const [layerValue] = element; + const rollupValue = layerValue[0].groupByRollup as Evaluation; + + history.push({ + pathname: allNavigationItems.findings.path, + search: encodeQuery(getEvaluationQuery(rollupValue)), + }); + }; + + return ( + + + + + + + + + + + + + + {/* TODO: no api for this chart yet, using empty state for now. needs BE */} + + + + + ); +}; diff --git a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/index.tsx b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/index.tsx new file mode 100644 index 0000000000000..40ac9c5fbee89 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/index.tsx @@ -0,0 +1,8 @@ +/* + * 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. + */ + +export * from './compliance_dashboard'; diff --git a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/translations.ts b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/translations.ts new file mode 100644 index 0000000000000..975c0069f1479 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/translations.ts @@ -0,0 +1,87 @@ +/* + * 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 { i18n } from '@kbn/i18n'; + +export const CLOUD_POSTURE = i18n.translate('xpack.csp.cloud_posture', { + defaultMessage: 'Cloud Posture', +}); + +export const CLOUD_POSTURE_SCORE = i18n.translate('xpack.csp.cloud_posture_score', { + defaultMessage: 'Cloud Posture Score', +}); + +export const RISKS = i18n.translate('xpack.csp.risks', { + defaultMessage: 'Risks', +}); + +export const SCORE_PER_CLUSTER_CHART_TITLE = i18n.translate( + 'xpack.csp.score_per_cluster_chart_title', + { + defaultMessage: 'Score Per Account / Cluster', + } +); + +export const COMPLIANCE_SCORE = i18n.translate('xpack.csp.compliance_score', { + defaultMessage: 'Compliance Score', +}); + +export const COMPLIANCE_TREND = i18n.translate('xpack.csp.compliance_trend', { + defaultMessage: 'Compliance Trend', +}); + +export const POSTURE_SCORE = i18n.translate('xpack.csp.posture_score', { + defaultMessage: 'Posture Score', +}); + +export const STATUS = i18n.translate('xpack.csp.status', { + defaultMessage: 'STATUS', +}); + +export const TOTAL_FAILURES = i18n.translate('xpack.csp.total_failures', { + defaultMessage: 'Total Failures', +}); + +export const ERROR = i18n.translate('xpack.csp.error', { + defaultMessage: 'Error', +}); + +export const POSTURE_SCORE_TREND = i18n.translate('xpack.csp.posture_score_trend', { + defaultMessage: 'Posture Score Trend', +}); + +export const ACTIVE_FRAMEWORKS = i18n.translate('xpack.csp.active_frameworks', { + defaultMessage: 'Active Frameworks', +}); + +export const TOTAL_RESOURCES = i18n.translate('xpack.csp.total_resources', { + defaultMessage: 'Total Resources', +}); + +export const PASSED = i18n.translate('xpack.csp.passed', { + defaultMessage: 'Passed', +}); + +export const FAILED = i18n.translate('xpack.csp.failed', { + defaultMessage: 'Failed', +}); + +export const VIEW_ALL_FAILED_FINDINGS = i18n.translate('xpack.csp.view_all_failed_findings', { + defaultMessage: 'View all failed findings', +}); + +export const RESOURCE_TYPE = i18n.translate('xpack.csp.resource_type', { + defaultMessage: 'Resource Type', +}); + +export const FAILED_FINDINGS = i18n.translate('xpack.csp.failed_findings', { + defaultMessage: 'Failed Findings', +}); + +export const NO_DATA_TO_DISPLAY = i18n.translate('xpack.csp.complianceDashboard.noDataLabel', { + defaultMessage: 'No data to display', +}); diff --git a/x-pack/plugins/cloud_security_posture/public/pages/findings/findings.test.tsx b/x-pack/plugins/cloud_security_posture/public/pages/findings/findings.test.tsx new file mode 100644 index 0000000000000..8678993a73803 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/pages/findings/findings.test.tsx @@ -0,0 +1,74 @@ +/* + * 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 type { UseQueryResult } from 'react-query'; +import { render, screen } from '@testing-library/react'; +import { Findings } from './findings'; +import { MISSING_KUBEBEAT } from './translations'; +import { TestProvider } from '../../test/test_provider'; +import { dataPluginMock } from '../../../../../../src/plugins/data/public/mocks'; +import { createStubDataView } from '../../../../../../src/plugins/data_views/public/data_views/data_view.stub'; +import { useKubebeatDataView } from './utils'; +import { CSP_KUBEBEAT_INDEX_PATTERN } from '../../../common/constants'; +import * as TEST_SUBJECTS from './test_subjects'; +import type { DataView } from '../../../../../../src/plugins/data/common'; + +jest.mock('./utils'); + +beforeEach(() => { + jest.restoreAllMocks(); +}); + +const Wrapper = ({ data = dataPluginMock.createStartContract() }) => ( + + + +); + +describe('', () => { + it("renders the error state component when 'kubebeat' DataView doesn't exists", async () => { + (useKubebeatDataView as jest.Mock).mockReturnValue({ + status: 'success', + } as UseQueryResult); + + render(); + + expect(await screen.findByText(MISSING_KUBEBEAT)).toBeInTheDocument(); + }); + + it("renders the error state component when 'kubebeat' request status is 'error'", async () => { + (useKubebeatDataView as jest.Mock).mockReturnValue({ + status: 'error', + } as UseQueryResult); + + render(); + + expect(await screen.findByText(MISSING_KUBEBEAT)).toBeInTheDocument(); + }); + + it("renders the success state component when 'kubebeat' DataView exists and request status is 'success'", async () => { + const data = dataPluginMock.createStartContract(); + const source = await data.search.searchSource.create(); + + (source.fetch$ as jest.Mock).mockReturnValue({ + toPromise: () => Promise.resolve({ rawResponse: { hits: { hits: [] } } }), + }); + + (useKubebeatDataView as jest.Mock).mockReturnValue({ + status: 'success', + data: createStubDataView({ + spec: { + id: CSP_KUBEBEAT_INDEX_PATTERN, + }, + }), + } as UseQueryResult); + + render(); + + expect(await screen.findByTestId(TEST_SUBJECTS.FINDINGS_CONTAINER)).toBeInTheDocument(); + }); +}); diff --git a/x-pack/plugins/cloud_security_posture/public/pages/findings/findings.tsx b/x-pack/plugins/cloud_security_posture/public/pages/findings/findings.tsx new file mode 100644 index 0000000000000..801632d4915bd --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/pages/findings/findings.tsx @@ -0,0 +1,50 @@ +/* + * 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, EuiLoadingSpinner } from '@elastic/eui'; +import type { EuiPageHeaderProps } from '@elastic/eui'; +import { allNavigationItems } from '../../common/navigation/constants'; +import { useCspBreadcrumbs } from '../../common/navigation/use_csp_breadcrumbs'; +import { FindingsContainer } from './findings_container'; +import { CspPageTemplate } from '../../components/page_template'; +import { useKubebeatDataView } from './utils'; +import * as TEST_SUBJECTS from './test_subjects'; +import { FINDINGS, MISSING_KUBEBEAT } from './translations'; + +const pageHeader: EuiPageHeaderProps = { + pageTitle: FINDINGS, +}; + +export const Findings = () => { + const dataView = useKubebeatDataView(); + useCspBreadcrumbs([allNavigationItems.findings]); + + return ( + + {dataView.status === 'loading' && } + {(dataView.status === 'error' || (dataView.status !== 'loading' && !dataView.data)) && ( + + )} + {dataView.status === 'success' && dataView.data && ( + + )} + + ); +}; + +const LoadingPrompt = () => } />; + +// TODO: follow https://elastic.github.io/eui/#/display/empty-prompt/guidelines +const ErrorPrompt = () => ( + {MISSING_KUBEBEAT}} + /> +); diff --git a/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_container.tsx b/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_container.tsx new file mode 100644 index 0000000000000..0b16f1d877a5e --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_container.tsx @@ -0,0 +1,47 @@ +/* + * 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 { EuiSpacer } from '@elastic/eui'; +import { FindingsTable } from './findings_table'; +import { FindingsSearchBar } from './findings_search_bar'; +import * as TEST_SUBJECTS from './test_subjects'; +import type { DataView } from '../../../../../../src/plugins/data/common'; +import { SortDirection } from '../../../../../../src/plugins/data/common'; +import { useUrlQuery } from '../../common/hooks/use_url_query'; +import { useFindings, type CspFindingsRequest } from './use_findings'; + +// TODO: define this as a schema with default values +// need to get Query and DateRange schema +const getDefaultQuery = (): CspFindingsRequest => ({ + query: { language: 'kuery', query: '' }, + filters: [], + dateRange: { + from: 'now-15m', + to: 'now', + }, + sort: [{ ['@timestamp']: SortDirection.desc }], + from: 0, + size: 10, +}); + +export const FindingsContainer = ({ dataView }: { dataView: DataView }) => { + const { urlQuery: findingsQuery, setUrlQuery, key } = useUrlQuery(getDefaultQuery); + const findingsResult = useFindings(dataView, findingsQuery, key); + + return ( +
+ + + +
+ ); +}; diff --git a/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_flyout.tsx b/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_flyout.tsx new file mode 100644 index 0000000000000..544e3542d1b59 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_flyout.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, { useState } from 'react'; +import { + EuiFlexItem, + EuiSpacer, + EuiCode, + EuiDescriptionList, + EuiTextColor, + EuiFlyout, + EuiFlyoutHeader, + EuiTitle, + EuiFlyoutBody, + EuiBadge, + EuiTabs, + EuiTab, + EuiFlexGrid, + EuiCard, + PropsOf, +} from '@elastic/eui'; +import { assertNever } from '@kbn/std'; +import type { CspFinding } from './types'; +import { CspEvaluationBadge } from '../../components/csp_evaluation_badge'; +import * as TEXT from './translations'; + +const tabs = ['result', 'rule', 'resource'] as const; + +type FindingsTab = typeof tabs[number]; + +type EuiListItemsProps = NonNullable['listItems']>[number]; + +interface Card { + title: string; + listItems: Array<[EuiListItemsProps['title'], EuiListItemsProps['description']]>; +} + +interface FindingFlyoutProps { + onClose(): void; + findings: CspFinding; +} + +export const FindingsRuleFlyout = ({ onClose, findings }: FindingFlyoutProps) => { + const [tab, setTab] = useState('result'); + return ( + + + + +

{TEXT.FINDINGS}

+
+
+ + + {tabs.map((v) => ( + setTab(v)} + style={{ textTransform: 'capitalize' }} + > + {v} + + ))} + +
+ + + +
+ ); +}; + +const Cards = ({ data }: { data: Card[] }) => ( + + {data.map((card) => ( + + + ({ title: v[0], description: v[1] }))} + /> + + + ))} + +); + +const FindingsTab = ({ tab, findings }: { findings: CspFinding; tab: FindingsTab }) => { + switch (tab) { + case 'result': + return ; + case 'rule': + return ; + case 'resource': + return ; + default: + assertNever(tab); + } +}; + +const getResourceCards = ({ resource }: CspFinding): Card[] => [ + { + title: TEXT.RESOURCE, + listItems: [ + [TEXT.FILENAME, {resource.filename}], + [TEXT.MODE, resource.mode], + [TEXT.PATH, {resource.path}], + [TEXT.TYPE, resource.type], + [TEXT.UID, resource.uid], + ], + }, +]; + +const getRuleCards = ({ rule }: CspFinding): Card[] => [ + { + title: TEXT.RULE, + listItems: [ + [TEXT.BENCHMARK, rule.benchmark], + [TEXT.NAME, rule.name], + [TEXT.DESCRIPTION, rule.description], + [TEXT.REMEDIATION, {rule.remediation}], + [ + TEXT.TAGS, + rule.tags.map((t) => ( + + {t} + + )), + ], + ], + }, +]; + +const getResultCards = ({ result, agent, host, ...rest }: CspFinding): Card[] => [ + { + title: TEXT.RESULT, + listItems: [ + [TEXT.EVALUATION, ], + [TEXT.EVIDENCE, {JSON.stringify(result.evidence, null, 2)}], + [TEXT.TIMESTAMP, rest['@timestamp']], + result.evaluation === 'failed' && [TEXT.REMEDIATION, rest.rule.remediation], + ].filter(Boolean) as Card['listItems'], + }, + { + title: TEXT.AGENT, + listItems: [ + [TEXT.NAME, agent.name], + [TEXT.ID, agent.id], + [TEXT.TYPE, agent.type], + [TEXT.VERSION, agent.version], + ], + }, + { + title: TEXT.HOST, + listItems: [ + [TEXT.ARCHITECTURE, host.architecture], + [TEXT.CONTAINERIZED, host.containerized ? 'true' : 'false'], + [TEXT.HOSTNAME, host.hostname], + [TEXT.ID, host.id], + [TEXT.IP, host.ip.join(',')], + [TEXT.MAC, host.mac.join(',')], + [TEXT.NAME, host.name], + ], + }, + { + title: TEXT.OS, + listItems: [ + [TEXT.CODENAME, host.os.codename], + [TEXT.FAMILY, host.os.family], + [TEXT.KERNEL, host.os.kernel], + [TEXT.NAME, host.os.name], + [TEXT.PLATFORM, host.os.platform], + [TEXT.TYPE, host.os.type], + [TEXT.VERSION, host.os.version], + ], + }, +]; diff --git a/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_search_bar.tsx b/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_search_bar.tsx new file mode 100644 index 0000000000000..c4e16cb873e35 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_search_bar.tsx @@ -0,0 +1,57 @@ +/* + * 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 { useKibana } from '../../../../../../src/plugins/kibana_react/public'; +import * as TEST_SUBJECTS from './test_subjects'; +import type { CspFindingsRequest, CspFindingsResponse } from './use_findings'; +import type { CspClientPluginStartDeps } from '../../types'; +import { PLUGIN_NAME } from '../../../common'; +import type { DataView } from '../../../../../../src/plugins/data/common'; + +type SearchBarQueryProps = Pick; + +interface BaseFindingsSearchBarProps extends SearchBarQueryProps { + setQuery(v: Partial): void; +} + +type FindingsSearchBarProps = CspFindingsResponse & BaseFindingsSearchBarProps; + +export const FindingsSearchBar = ({ + dataView, + dateRange, + query, + filters, + status, + setQuery, +}: FindingsSearchBarProps & { dataView: DataView }) => { + const { + data: { + ui: { SearchBar }, + }, + } = useKibana().services; + + return ( + setQuery({ filters: value })} + /> + ); +}; diff --git a/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_table.test.tsx b/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_table.test.tsx new file mode 100644 index 0000000000000..0fa106fda1c8f --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_table.test.tsx @@ -0,0 +1,93 @@ +/* + * 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 { render, screen } from '@testing-library/react'; +import * as TEST_SUBJECTS from './test_subjects'; +import { FindingsTable } from './findings_table'; +import type { PropsOf } from '@elastic/eui'; +import Chance from 'chance'; +import type { CspFinding } from './types'; + +const chance = new Chance(); + +const getFakeFindings = (): CspFinding & { id: string } => ({ + id: chance.word(), + result: { + evaluation: chance.weighted(['passed', 'failed'], [0.5, 0.5]), + evidence: { + filemode: chance.word(), + }, + }, + rule: { + name: chance.word(), + description: chance.paragraph(), + impact: chance.word(), + remediation: chance.word(), + benchmark: { + name: 'CIS Kubernetes', + version: '1.6.0', + }, + tags: [], + }, + agent: { + id: chance.string(), + name: chance.string(), + type: chance.string(), + version: chance.string(), + }, + resource: { + filename: chance.string(), + type: chance.string(), + path: chance.string(), + uid: chance.string(), + mode: chance.string(), + }, + run_id: chance.string(), + host: {} as any, + ecs: {} as any, + '@timestamp': new Date().toISOString(), +}); + +type TableProps = PropsOf; + +describe('', () => { + it('renders the zero state when status success and data has a length of zero ', async () => { + const props: TableProps = { + status: 'success', + data: { data: [], total: 0 }, + error: null, + sort: [], + from: 1, + size: 10, + setQuery: jest.fn, + }; + + render(); + + expect(screen.getByTestId(TEST_SUBJECTS.FINDINGS_TABLE_ZERO_STATE)).toBeInTheDocument(); + }); + + it('renders the table with provided items', () => { + const data = Array.from({ length: 10 }, getFakeFindings); + + const props: TableProps = { + status: 'success', + data: { data, total: 10 }, + error: null, + sort: [], + from: 0, + size: 10, + setQuery: jest.fn, + }; + + render(); + + data.forEach((item) => { + expect(screen.getByText(item.rule.name)).toBeInTheDocument(); + }); + }); +}); diff --git a/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_table.tsx b/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_table.tsx new file mode 100644 index 0000000000000..176141aaebca6 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_table.tsx @@ -0,0 +1,195 @@ +/* + * 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, useMemo, useState } from 'react'; +import { + type Criteria, + EuiToolTip, + EuiLink, + EuiTableFieldDataColumnType, + EuiEmptyPrompt, + EuiBasicTable, + PropsOf, + EuiBasicTableProps, +} from '@elastic/eui'; +import moment from 'moment'; +import { extractErrorMessage } from '../../../common/utils/helpers'; +import * as TEST_SUBJECTS from './test_subjects'; +import * as TEXT from './translations'; +import type { CspFinding } from './types'; +import { CspEvaluationBadge } from '../../components/csp_evaluation_badge'; +import type { CspFindingsRequest, CspFindingsResponse } from './use_findings'; +import { SortDirection } from '../../../../../../src/plugins/data/common'; +import { FindingsRuleFlyout } from './findings_flyout'; + +type TableQueryProps = Pick; + +interface BaseFindingsTableProps extends TableQueryProps { + setQuery(query: Partial): void; +} + +type FindingsTableProps = CspFindingsResponse & BaseFindingsTableProps; + +const FindingsTableComponent = ({ + setQuery, + from, + size, + sort = [], + error, + ...props +}: FindingsTableProps) => { + const [selectedFinding, setSelectedFinding] = useState(); + + const pagination = useMemo( + () => + getEuiPaginationFromEsSearchSource({ + from, + size, + total: props.status === 'success' ? props.data.total : 0, + }), + [from, size, props] + ); + + const sorting = useMemo(() => getEuiSortFromEsSearchSource(sort), [sort]); + + const getCellProps = useCallback( + (item: CspFinding, column: EuiTableFieldDataColumnType) => ({ + onClick: column.field === 'rule.name' ? () => setSelectedFinding(item) : undefined, + }), + [] + ); + + const onTableChange = useCallback( + (params: Criteria) => { + setQuery(getEsSearchQueryFromEuiTableParams(params)); + }, + [setQuery] + ); + + // Show "zero state" + if (props.status === 'success' && !props.data.data.length) + // TODO: use our own logo + return ( + {TEXT.NO_FINDINGS}} + data-test-subj={TEST_SUBJECTS.FINDINGS_TABLE_ZERO_STATE} + /> + ); + + return ( + <> + + {selectedFinding && ( + setSelectedFinding(undefined)} + /> + )} + + ); +}; + +const getEuiPaginationFromEsSearchSource = ({ + from: pageIndex, + size: pageSize, + total, +}: Pick & { + total: number; +}): EuiBasicTableProps['pagination'] => ({ + pageSize, + pageIndex: Math.ceil(pageIndex / pageSize), + totalItemCount: total, + pageSizeOptions: [10, 25, 100], + hidePerPageOptions: false, +}); + +const getEuiSortFromEsSearchSource = ( + sort: TableQueryProps['sort'] +): EuiBasicTableProps['sorting'] => { + if (!sort.length) return; + + const entry = Object.entries(sort[0])?.[0]; + if (!entry) return; + + const [field, direction] = entry; + return { sort: { field: field as keyof CspFinding, direction: direction as SortDirection } }; +}; + +const getEsSearchQueryFromEuiTableParams = ({ + page, + sort, +}: Criteria): Partial => ({ + ...(!!page && { from: page.index * page.size, size: page.size }), + sort: sort ? [{ [sort.field]: SortDirection[sort.direction] }] : undefined, +}); + +const timestampRenderer = (timestamp: string) => ( + + {moment.duration(moment().diff(timestamp)).humanize()} + +); + +const resourceFilenameRenderer = (filename: string) => ( + + {filename} + +); + +const ruleNameRenderer = (name: string) => ( + + {name} + +); + +const resultEvaluationRenderer = (type: PropsOf['type']) => ( + +); + +const columns: Array> = [ + { + field: 'resource.filename', + name: TEXT.RESOURCE, + truncateText: true, + width: '15%', + sortable: true, + render: resourceFilenameRenderer, + }, + { + field: 'rule.name', + name: TEXT.RULE_NAME, + truncateText: true, + render: ruleNameRenderer, + sortable: true, + }, + { + field: 'result.evaluation', + name: TEXT.EVALUATION, + width: '100px', + render: resultEvaluationRenderer, + sortable: true, + }, + { + field: '@timestamp', + width: '100px', + name: TEXT.TIMESTAMP, + truncateText: true, + render: timestampRenderer, + sortable: true, + }, +]; + +export const FindingsTable = React.memo(FindingsTableComponent); diff --git a/x-pack/plugins/cloud_security_posture/public/pages/findings/index.tsx b/x-pack/plugins/cloud_security_posture/public/pages/findings/index.tsx new file mode 100644 index 0000000000000..2905f2af97e24 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/pages/findings/index.tsx @@ -0,0 +1,8 @@ +/* + * 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. + */ + +export * from './findings'; diff --git a/x-pack/plugins/cloud_security_posture/public/pages/findings/test_subjects.ts b/x-pack/plugins/cloud_security_posture/public/pages/findings/test_subjects.ts new file mode 100644 index 0000000000000..06c1888a09122 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/pages/findings/test_subjects.ts @@ -0,0 +1,12 @@ +/* + * 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. + */ + +export const FINDINGS_SEARCH_BAR = 'findings_search_bar'; +export const FINDINGS_TABLE = 'findings_table'; +export const FINDINGS_CONTAINER = 'findings_container'; +export const FINDINGS_MISSING_INDEX = 'findings_page_missing_dataview'; +export const FINDINGS_TABLE_ZERO_STATE = 'findings_table_zero_state'; diff --git a/x-pack/plugins/cloud_security_posture/public/pages/findings/translations.ts b/x-pack/plugins/cloud_security_posture/public/pages/findings/translations.ts new file mode 100644 index 0000000000000..0205a6ee0e68d --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/pages/findings/translations.ts @@ -0,0 +1,151 @@ +/* + * 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 { i18n } from '@kbn/i18n'; + +export const NAME = i18n.translate('xpack.csp.name', { + defaultMessage: 'Name', +}); + +export const SEARCH_FAILED = i18n.translate('xpack.csp.search_failed', { + defaultMessage: 'Search failed', +}); + +export const TAGS = i18n.translate('xpack.csp.tags', { + defaultMessage: 'Tags', +}); + +export const RULE_NAME = i18n.translate('xpack.csp.rule_name', { + defaultMessage: 'Rule Name', +}); + +export const OS = i18n.translate('xpack.csp.os', { + defaultMessage: 'OS', +}); + +export const FINDINGS = i18n.translate('xpack.csp.findings', { + defaultMessage: 'Findings', +}); + +export const MISSING_KUBEBEAT = i18n.translate('xpack.csp.kubebeatDataViewIsMissing', { + defaultMessage: 'Kubebeat DataView is missing', +}); + +export const RESOURCE = i18n.translate('xpack.csp.resource', { + defaultMessage: 'Resource', +}); + +export const FILENAME = i18n.translate('xpack.csp.filename', { + defaultMessage: 'Filename', +}); + +export const MODE = i18n.translate('xpack.csp.mode', { + defaultMessage: 'Mode', +}); + +export const TYPE = i18n.translate('xpack.csp.type', { + defaultMessage: 'Type', +}); + +export const PATH = i18n.translate('xpack.csp.path', { + defaultMessage: 'Path', +}); + +export const UID = i18n.translate('xpack.csp.uid', { + defaultMessage: 'UID', +}); + +export const GID = i18n.translate('xpack.csp.gid', { + defaultMessage: 'GID', +}); + +export const RULE = i18n.translate('xpack.csp.rule', { + defaultMessage: 'Rule', +}); + +export const DESCRIPTION = i18n.translate('xpack.csp.description', { + defaultMessage: 'Description', +}); + +export const REMEDIATION = i18n.translate('xpack.csp.remediation', { + defaultMessage: 'Remediation', +}); + +export const BENCHMARK = i18n.translate('xpack.csp.benchmark', { + defaultMessage: 'Benchmark', +}); + +export const RESULT = i18n.translate('xpack.csp.result', { + defaultMessage: 'Result', +}); + +export const EVALUATION = i18n.translate('xpack.csp.evaluation', { + defaultMessage: 'Evaluation', +}); + +export const EVIDENCE = i18n.translate('xpack.csp.evidence', { + defaultMessage: 'Evidence', +}); + +export const TIMESTAMP = i18n.translate('xpack.csp.timestamp', { + defaultMessage: 'Timestamp', +}); + +export const AGENT = i18n.translate('xpack.csp.agent', { + defaultMessage: 'Agent', +}); + +export const VERSION = i18n.translate('xpack.csp.version', { + defaultMessage: 'Version', +}); + +export const ID = i18n.translate('xpack.csp.id', { + defaultMessage: 'ID', +}); + +export const HOST = i18n.translate('xpack.csp.host', { + defaultMessage: 'HOST', +}); + +export const ARCHITECTURE = i18n.translate('xpack.csp.architecture', { + defaultMessage: 'Architecture', +}); + +export const CONTAINERIZED = i18n.translate('xpack.csp.containerized', { + defaultMessage: 'Containerized', +}); + +export const HOSTNAME = i18n.translate('xpack.csp.hostname', { + defaultMessage: 'Hostname', +}); + +export const MAC = i18n.translate('xpack.csp.mac', { + defaultMessage: 'Mac', +}); + +export const IP = i18n.translate('xpack.csp.ip', { + defaultMessage: 'IP', +}); + +export const CODENAME = i18n.translate('xpack.csp.codename', { + defaultMessage: 'Codename', +}); + +export const FAMILY = i18n.translate('xpack.csp.family', { + defaultMessage: 'Family', +}); + +export const KERNEL = i18n.translate('xpack.csp.kernel', { + defaultMessage: 'Kernel', +}); + +export const PLATFORM = i18n.translate('xpack.csp.platform', { + defaultMessage: 'Platform', +}); + +export const NO_FINDINGS = i18n.translate('xpack.csp.thereAreNoFindings', { + defaultMessage: 'There are no Findings', +}); diff --git a/x-pack/plugins/cloud_security_posture/public/pages/findings/types.ts b/x-pack/plugins/cloud_security_posture/public/pages/findings/types.ts new file mode 100644 index 0000000000000..b20d1fa801bfd --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/pages/findings/types.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +// TODO: this needs to be defined in a versioned schema +export interface CspFinding { + '@timestamp': string; + run_id: string; + result: CspFindingResult; + resource: CspFindingResource; + rule: CspRule; + host: CspFindingHost; + agent: CspFindingAgent; + ecs: { + version: string; + }; +} + +interface CspRule { + benchmark: { name: string; version: string }; + description: string; + impact: string; + name: string; + remediation: string; + tags: string[]; +} + +interface CspFindingResult { + evaluation: 'passed' | 'failed'; + evidence: { + filemode: string; + }; +} + +interface CspFindingResource { + uid: string; + filename: string; + // gid: string; + mode: string; + path: string; + type: string; +} + +interface CspFindingHost { + id: string; + containerized: boolean; + ip: string[]; + mac: string[]; + name: string; + hostname: string; + architecture: string; + os: { + kernel: string; + codename: string; + type: string; + platform: string; + version: string; + family: string; + name: string; + }; +} + +interface CspFindingAgent { + version: string; + // ephemeral_id: string; + id: string; + name: string; + type: string; +} diff --git a/x-pack/plugins/cloud_security_posture/public/pages/findings/use_findings.ts b/x-pack/plugins/cloud_security_posture/public/pages/findings/use_findings.ts new file mode 100644 index 0000000000000..c1b83bc671d16 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/pages/findings/use_findings.ts @@ -0,0 +1,141 @@ +/* + * 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 type { Filter } from '@kbn/es-query'; +import { type UseQueryResult, useQuery } from 'react-query'; +import type { AggregationsAggregate, SearchResponse } from '@elastic/elasticsearch/lib/api/types'; +import { number } from 'io-ts'; +import { extractErrorMessage, isNonNullable } from '../../../common/utils/helpers'; +import type { + DataView, + EsQuerySortValue, + IKibanaSearchResponse, + SerializedSearchSourceFields, + TimeRange, +} from '../../../../../../src/plugins/data/common'; +import type { CspClientPluginStartDeps } from '../../types'; +import { useKibana } from '../../../../../../src/plugins/kibana_react/public'; +import * as TEXT from './translations'; +import type { CoreStart } from '../../../../../../src/core/public'; +import type { CspFinding } from './types'; + +interface CspFindings { + data: CspFinding[]; + total: number; +} + +export interface CspFindingsRequest + extends Required> { + filters: Filter[]; + dateRange: TimeRange; +} + +type ResponseProps = 'data' | 'error' | 'status'; +type Result = UseQueryResult; + +// TODO: use distributive Pick +export type CspFindingsResponse = + | Pick, ResponseProps> + | Pick, ResponseProps> + | Pick, ResponseProps> + | Pick, ResponseProps>; + +const FIELDS_WITHOUT_KEYWORD_MAPPING = new Set(['@timestamp']); + +// NOTE: .keyword comes from the mapping we defined for the Findings index +const getSortKey = (key: string): string => + FIELDS_WITHOUT_KEYWORD_MAPPING.has(key) ? key : `${key}.keyword`; + +/** + * @description utility to transform a column header key to its field mapping for sorting + * @example Adds '.keyword' to every property we sort on except values of `FIELDS_WITHOUT_KEYWORD_MAPPING` + * @todo find alternative + * @note we choose the keyword 'keyword' in the field mapping + */ +const mapEsQuerySortKey = (sort: readonly EsQuerySortValue[]): EsQuerySortValue[] => + sort.slice().reduce((acc, cur) => { + const entry = Object.entries(cur)[0]; + if (!entry) return acc; + + const [k, v] = entry; + acc.push({ [getSortKey(k)]: v }); + + return acc; + }, []); + +const showResponseErrorToast = + ({ toasts: { addDanger } }: CoreStart['notifications']) => + (error: unknown): void => { + addDanger(extractErrorMessage(error, TEXT.SEARCH_FAILED)); + }; + +const extractFindings = ({ + rawResponse: { hits }, +}: IKibanaSearchResponse< + SearchResponse> +>): CspFindings => ({ + // TODO: use 'fields' instead of '_source' ? + data: hits.hits.map((hit) => hit._source!), + total: number.is(hits.total) ? hits.total : 0, +}); + +const createFindingsSearchSource = ( + { + query, + dateRange, + dataView, + filters, + ...rest + }: Omit & { + dataView: DataView; + }, + queryService: CspClientPluginStartDeps['data']['query'] +): SerializedSearchSourceFields => { + if (query) queryService.queryString.setQuery(query); + const timeFilter = queryService.timefilter.timefilter.createFilter(dataView, dateRange); + queryService.filterManager.setFilters([...filters, timeFilter].filter(isNonNullable)); + + return { + ...rest, + sort: mapEsQuerySortKey(rest.sort), + filter: queryService.filterManager.getFilters(), + query: queryService.queryString.getQuery(), + index: dataView.id, // TODO: constant + }; +}; + +/** + * @description a react-query#mutation wrapper on the data plugin searchSource + * @todo use 'searchAfter'. currently limited to 10k docs. see https://github.com/elastic/kibana/issues/116776 + */ +export const useFindings = ( + dataView: DataView, + searchProps: CspFindingsRequest, + urlKey?: string // Needed when URL query (searchProps) didn't change (now-15) but require a refetch +): CspFindingsResponse => { + const { + notifications, + data: { query, search }, + } = useKibana().services; + + return useQuery( + ['csp_findings', { searchProps, urlKey }], + async () => { + const source = await search.searchSource.create( + createFindingsSearchSource({ ...searchProps, dataView }, query) + ); + + const response = await source.fetch$().toPromise(); + + return response; + }, + { + cacheTime: 0, + onError: showResponseErrorToast(notifications!), + select: extractFindings, + } + ); +}; diff --git a/x-pack/plugins/cloud_security_posture/public/pages/findings/utils.tsx b/x-pack/plugins/cloud_security_posture/public/pages/findings/utils.tsx new file mode 100644 index 0000000000000..529b1ca5cdd1e --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/pages/findings/utils.tsx @@ -0,0 +1,28 @@ +/* + * 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 { useQuery } from 'react-query'; +import type { CspClientPluginStartDeps } from '../../types'; +import { CSP_KUBEBEAT_INDEX_PATTERN } from '../../../common/constants'; +import { useKibana } from '../../../../../../src/plugins/kibana_react/public'; + +/** + * TODO: use perfected kibana data views + */ +export const useKubebeatDataView = () => { + const { + data: { dataViews }, + } = useKibana().services; + + // TODO: check if index exists + // if not, no point in creating a data view + // const check = () => http?.get(`/kubebeat`); + + // TODO: use `dataViews.get(ID)` + const findDataView = async () => (await dataViews.find(CSP_KUBEBEAT_INDEX_PATTERN))?.[0]; + + return useQuery(['kubebeat_dataview'], findDataView); +}; diff --git a/x-pack/plugins/cloud_security_posture/public/pages/index.ts b/x-pack/plugins/cloud_security_posture/public/pages/index.ts new file mode 100644 index 0000000000000..55d62913e4474 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/pages/index.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. + */ + +export { Findings } from './findings'; +export * from './compliance_dashboard'; +export { Benchmarks } from './benchmarks'; diff --git a/x-pack/plugins/cloud_security_posture/public/plugin.ts b/x-pack/plugins/cloud_security_posture/public/plugin.ts new file mode 100755 index 0000000000000..d4cdeddd48d92 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/plugin.ts @@ -0,0 +1,54 @@ +/* + * 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 type { AppMountParameters, CoreSetup, CoreStart, Plugin } from '../../../../src/core/public'; +import type { + CspClientPluginSetup, + CspClientPluginStart, + CspClientPluginSetupDeps, + CspClientPluginStartDeps, +} from './types'; +import { PLUGIN_NAME, PLUGIN_ID } from '../common'; +import { DEFAULT_APP_CATEGORIES } from '../../../../src/core/public'; + +export class CspPlugin + implements + Plugin< + CspClientPluginSetup, + CspClientPluginStart, + CspClientPluginSetupDeps, + CspClientPluginStartDeps + > +{ + public setup( + core: CoreSetup, + plugins: CspClientPluginSetupDeps + ): CspClientPluginSetup { + // Register an application into the side navigation menu + core.application.register({ + id: PLUGIN_ID, + title: PLUGIN_NAME, + category: DEFAULT_APP_CATEGORIES.security, + async mount(params: AppMountParameters) { + // Load application bundle + const { renderApp } = await import('./application/index'); + // Get start services as specified in kibana.json + const [coreStart, depsStart] = await core.getStartServices(); + // Render the application + return renderApp(coreStart, depsStart, params); + }, + }); + + // Return methods that should be available to other plugins + return {}; + } + public start(core: CoreStart, plugins: CspClientPluginStartDeps): CspClientPluginStart { + return {}; + } + + public stop() {} +} diff --git a/x-pack/plugins/cloud_security_posture/public/test/fixtures/csp_benchmark_integration.ts b/x-pack/plugins/cloud_security_posture/public/test/fixtures/csp_benchmark_integration.ts new file mode 100644 index 0000000000000..63bde111d5c1e --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/test/fixtures/csp_benchmark_integration.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +/* eslint-disable @typescript-eslint/naming-convention */ + +import Chance from 'chance'; +import type { CspBenchmarkIntegration } from '../../pages/benchmarks/types'; + +type CreateCspBenchmarkIntegrationFixtureInput = { + chance?: Chance.Chance; +} & Partial; + +export const createCspBenchmarkIntegrationFixture = ({ + chance = new Chance(), + integration_name = chance.sentence(), + benchmark = chance.sentence(), + rules = undefined, + agent_policy = { + id: chance.guid(), + name: chance.sentence(), + number_of_agents: chance.integer({ min: 1 }), + }, + created_by = chance.sentence(), + created_at = chance.date({ year: 2021 }) as Date, +}: CreateCspBenchmarkIntegrationFixtureInput = {}): CspBenchmarkIntegration => { + let outputRules: CspBenchmarkIntegration['rules'] | undefined = rules; + if (!outputRules) { + const activeRules = chance.integer({ min: 1 }); + const totalRules = chance.integer({ min: activeRules }); + outputRules = { + active: activeRules, + total: totalRules, + }; + } + + return { + integration_name, + benchmark, + rules: outputRules, + agent_policy, + created_by, + created_at, + }; +}; diff --git a/x-pack/plugins/cloud_security_posture/public/test/fixtures/navigation_item.ts b/x-pack/plugins/cloud_security_posture/public/test/fixtures/navigation_item.ts new file mode 100644 index 0000000000000..74b78dbd699e7 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/test/fixtures/navigation_item.ts @@ -0,0 +1,20 @@ +/* + * 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'; +import type { CspNavigationItem } from '../../common/navigation/types'; + +type CreateNavigationItemFixtureInput = { chance?: Chance.Chance } & Partial; +export const createNavigationItemFixture = ({ + chance = new Chance(), + name = chance.word(), + path = `/${chance.word()}`, + disabled = undefined, +}: CreateNavigationItemFixtureInput = {}): CspNavigationItem => ({ + name, + path, + disabled, +}); diff --git a/x-pack/plugins/cloud_security_posture/public/test/fixtures/react_query.ts b/x-pack/plugins/cloud_security_posture/public/test/fixtures/react_query.ts new file mode 100644 index 0000000000000..2e6eeb5addb0a --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/test/fixtures/react_query.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 type { UseQueryResult } from 'react-query/types/react/types'; + +interface CreateReactQueryResponseInput { + status?: UseQueryResult['status']; + data?: TData; + error?: TError; +} + +// TODO: Consider alternatives to using `Partial` over `UseQueryResult` for the return type: +// 1. Fully mock `UseQueryResult` +// 2. Mock the network layer instead of `useQuery` - see: https://tkdodo.eu/blog/testing-react-query +export const createReactQueryResponse = ({ + status = 'loading', + error = undefined, + data = undefined, +}: CreateReactQueryResponseInput = {}): Partial> => { + if (status === 'success') { + return { status, data }; + } + + if (status === 'error') { + return { status, error }; + } + + return { status }; +}; diff --git a/x-pack/plugins/cloud_security_posture/public/test/test_provider.tsx b/x-pack/plugins/cloud_security_posture/public/test/test_provider.tsx new file mode 100755 index 0000000000000..1bb04128d4a67 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/test/test_provider.tsx @@ -0,0 +1,36 @@ +/* + * 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, { useMemo } from 'react'; +import { I18nProvider } from '@kbn/i18n-react'; +import { Router, Switch, Route } from 'react-router-dom'; +import { QueryClient, QueryClientProvider } from 'react-query'; +import { coreMock } from '../../../../../src/core/public/mocks'; +import { KibanaContextProvider } from '../../../../../src/plugins/kibana_react/public'; +import type { CspAppDeps } from '../application/app'; + +export const TestProvider: React.FC> = ({ + core = coreMock.createStart(), + deps = {}, + params = coreMock.createAppMountParameters(), + children, +} = {}) => { + const queryClient = useMemo(() => new QueryClient(), []); + return ( + + + + + + <>{children}} /> + + + + + + ); +}; diff --git a/x-pack/plugins/cloud_security_posture/public/types.ts b/x-pack/plugins/cloud_security_posture/public/types.ts new file mode 100755 index 0000000000000..c01ec0df41e28 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/types.ts @@ -0,0 +1,30 @@ +/* + * 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 type { + DataPublicPluginSetup, + DataPublicPluginStart, +} from '../../../../src/plugins/data/public'; + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface CspClientPluginSetup {} +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface CspClientPluginStart {} + +export interface CspClientPluginSetupDeps { + // required + data: DataPublicPluginSetup; + + // optional +} + +export interface CspClientPluginStartDeps { + // required + data: DataPublicPluginStart; + + // optional +} diff --git a/x-pack/plugins/cloud_security_posture/server/config.ts b/x-pack/plugins/cloud_security_posture/server/config.ts new file mode 100644 index 0000000000000..9c9ff926a2c38 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/server/config.ts @@ -0,0 +1,19 @@ +/* + * 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 { schema, type TypeOf } from '@kbn/config-schema'; +import type { PluginConfigDescriptor } from 'kibana/server'; + +const configSchema = schema.object({ + enabled: schema.boolean({ defaultValue: false }), +}); + +type CloudSecurityPostureConfig = TypeOf; + +export const config: PluginConfigDescriptor = { + schema: configSchema, +}; diff --git a/x-pack/plugins/cloud_security_posture/server/constants.ts b/x-pack/plugins/cloud_security_posture/server/constants.ts new file mode 100644 index 0000000000000..321a662e53914 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/server/constants.ts @@ -0,0 +1,9 @@ +/* + * 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. + */ + +export const RULE_PASSED = `passed`; +export const RULE_FAILED = `failed`; diff --git a/x-pack/plugins/cloud_security_posture/server/index.ts b/x-pack/plugins/cloud_security_posture/server/index.ts new file mode 100755 index 0000000000000..c0912e68218c8 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/server/index.ts @@ -0,0 +1,16 @@ +/* + * 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 type { PluginInitializerContext } from '../../../../src/core/server'; +import { CspPlugin } from './plugin'; + +export type { CspServerPluginSetup, CspServerPluginStart } from './types'; + +export const plugin = (initializerContext: PluginInitializerContext) => + new CspPlugin(initializerContext); + +export { config } from './config'; diff --git a/x-pack/plugins/cloud_security_posture/server/plugin.ts b/x-pack/plugins/cloud_security_posture/server/plugin.ts new file mode 100755 index 0000000000000..1225d3481d334 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/server/plugin.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 type { + PluginInitializerContext, + CoreSetup, + CoreStart, + Plugin, + Logger, +} from '../../../../src/core/server'; +import type { + CspServerPluginSetup, + CspServerPluginStart, + CspServerPluginSetupDeps, + CspServerPluginStartDeps, +} from './types'; +import { defineRoutes } from './routes'; + +export class CspPlugin + implements + Plugin< + CspServerPluginSetup, + CspServerPluginStart, + CspServerPluginSetupDeps, + CspServerPluginStartDeps + > +{ + private readonly logger: Logger; + constructor(initializerContext: PluginInitializerContext) { + this.logger = initializerContext.logger.get(); + } + + public setup( + core: CoreSetup, + plugins: CspServerPluginSetupDeps + ): CspServerPluginSetup { + const router = core.http.createRouter(); + + // Register server side APIs + defineRoutes(router, this.logger); + + return {}; + } + + public start(core: CoreStart, plugins: CspServerPluginStartDeps): CspServerPluginStart { + return {}; + } + public stop() {} +} diff --git a/x-pack/plugins/cloud_security_posture/server/routes/findings/findings.test.ts b/x-pack/plugins/cloud_security_posture/server/routes/findings/findings.test.ts new file mode 100644 index 0000000000000..ffc5526e2fe42 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/server/routes/findings/findings.test.ts @@ -0,0 +1,303 @@ +/* + * 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 { + elasticsearchClientMock, + ElasticsearchClientMock, + // eslint-disable-next-line @kbn/eslint/no-restricted-paths +} from 'src/core/server/elasticsearch/client/mocks'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { KibanaRequest } from 'src/core/server/http/router/request'; +import { httpServerMock, httpServiceMock, loggingSystemMock } from 'src/core/server/mocks'; +import { + defineFindingsIndexRoute, + findingsInputSchema, + DEFAULT_FINDINGS_PER_PAGE, +} from './findings'; + +export const getMockCspContext = (mockEsClient: ElasticsearchClientMock): KibanaRequest => { + return { + core: { + elasticsearch: { + client: { asCurrentUser: mockEsClient }, + }, + }, + } as unknown as KibanaRequest; +}; + +describe('findings API', () => { + let logger: ReturnType; + + beforeEach(() => { + logger = loggingSystemMock.createLogger(); + }); + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('validate the API route path', async () => { + const router = httpServiceMock.createRouter(); + defineFindingsIndexRoute(router, logger); + + const [config, _] = router.get.mock.calls[0]; + + expect(config.path).toEqual('/api/csp/findings'); + }); + + describe('test input schema', () => { + it('expect to find default values', async () => { + const validatedQuery = findingsInputSchema.validate({}); + + expect(validatedQuery).toMatchObject({ + page: 1, + per_page: DEFAULT_FINDINGS_PER_PAGE, + sort_order: expect.stringMatching('desc'), + }); + }); + + it('should throw when page field is not a positive integer', async () => { + expect(() => { + findingsInputSchema.validate({ page: -2 }); + }).toThrow(); + }); + + it('should throw when per_page field is not a positive integer', async () => { + expect(() => { + findingsInputSchema.validate({ per_page: -2 }); + }).toThrow(); + }); + + it('should throw when latest_run is not a boolean', async () => { + expect(() => { + findingsInputSchema.validate({ latest_cycle: 'some string' }); // expects to get boolean + }).toThrow(); + }); + + it('should not throw when latest_run is a boolean', async () => { + expect(() => { + findingsInputSchema.validate({ latest_cycle: true }); + }).not.toThrow(); + }); + + it('should throw when sort_field is not string', async () => { + expect(() => { + findingsInputSchema.validate({ sort_field: true }); + }).toThrow(); + }); + + it('should not throw when sort_field is a string', async () => { + expect(() => { + findingsInputSchema.validate({ sort_field: 'field1' }); + }).not.toThrow(); + }); + + it('should throw when sort_order is not `asc` or `desc`', async () => { + expect(() => { + findingsInputSchema.validate({ sort_order: 'Other Direction' }); + }).toThrow(); + }); + + it('should not throw when `asc` is input for sort_order field', async () => { + expect(() => { + findingsInputSchema.validate({ sort_order: 'asc' }); + }).not.toThrow(); + }); + + it('should not throw when `desc` is input for sort_order field', async () => { + expect(() => { + findingsInputSchema.validate({ sort_order: 'desc' }); + }).not.toThrow(); + }); + + it('should throw when fields is not string', async () => { + expect(() => { + findingsInputSchema.validate({ fields: ['field1', 'field2'] }); + }).toThrow(); + }); + + it('should not throw when fields is a string', async () => { + expect(() => { + findingsInputSchema.validate({ sort_field: 'field1, field2' }); + }).not.toThrow(); + }); + }); + + describe('test query building', () => { + it('takes cycle_id and validate the filter was built right', async () => { + const mockEsClient = elasticsearchClientMock.createClusterClient().asScoped().asInternalUser; + const router = httpServiceMock.createRouter(); + defineFindingsIndexRoute(router, logger); + + const [_, handler] = router.get.mock.calls[0]; + const mockContext = getMockCspContext(mockEsClient); + const mockResponse = httpServerMock.createResponseFactory(); + const mockRequest = httpServerMock.createKibanaRequest({ + query: { latest_cycle: true }, + }); + + mockEsClient.search.mockResolvedValueOnce( + // @ts-expect-error @elastic/elasticsearch Aggregate only allows unknown values + elasticsearchClientMock.createSuccessTransportRequestPromise({ + aggregations: { + group: { + buckets: [ + { + group_docs: { + hits: { + hits: [{ fields: { 'run_id.keyword': ['randomId1'] } }], + }, + }, + }, + ], + }, + }, + }) + ); + + const [context, req, res] = [mockContext, mockRequest, mockResponse]; + + await handler(context, req, res); + + expect(mockEsClient.search).toHaveBeenCalledTimes(2); + + const handlerArgs = mockEsClient.search.mock.calls[1][0]; + + expect(handlerArgs).toMatchObject({ + query: { + bool: { + filter: [{ term: { 'run_id.keyword': 'randomId1' } }], + }, + }, + }); + }); + + it('validate that default sort is timestamp desc', async () => { + const mockEsClient = elasticsearchClientMock.createClusterClient().asScoped().asInternalUser; + const router = httpServiceMock.createRouter(); + defineFindingsIndexRoute(router, logger); + const [_, handler] = router.get.mock.calls[0]; + const mockContext = getMockCspContext(mockEsClient); + const mockResponse = httpServerMock.createResponseFactory(); + const mockRequest = httpServerMock.createKibanaRequest({ + query: { + sort_order: 'desc', + }, + }); + + const [context, req, res] = [mockContext, mockRequest, mockResponse]; + + await handler(context, req, res); + + const handlerArgs = mockEsClient.search.mock.calls[0][0]; + + expect(handlerArgs).toMatchObject({ + sort: [{ '@timestamp': { order: 'desc' } }], + }); + }); + + it('should build sort request by `sort_field` and `sort_order` - asc', async () => { + const mockEsClient = elasticsearchClientMock.createClusterClient().asScoped().asInternalUser; + const router = httpServiceMock.createRouter(); + defineFindingsIndexRoute(router, logger); + const [_, handler] = router.get.mock.calls[0]; + const mockContext = getMockCspContext(mockEsClient); + const mockResponse = httpServerMock.createResponseFactory(); + const mockRequest = httpServerMock.createKibanaRequest({ + query: { + sort_field: 'agent.id', + sort_order: 'asc', + }, + }); + + const [context, req, res] = [mockContext, mockRequest, mockResponse]; + + await handler(context, req, res); + + const handlerArgs = mockEsClient.search.mock.calls[0][0]; + + expect(handlerArgs).toMatchObject({ + sort: [{ 'agent.id': 'asc' }], + }); + }); + + it('should build sort request by `sort_field` and `sort_order` - desc', async () => { + const mockEsClient = elasticsearchClientMock.createClusterClient().asScoped().asInternalUser; + const router = httpServiceMock.createRouter(); + defineFindingsIndexRoute(router, logger); + const [_, handler] = router.get.mock.calls[0]; + const mockContext = getMockCspContext(mockEsClient); + const mockResponse = httpServerMock.createResponseFactory(); + const mockRequest = httpServerMock.createKibanaRequest({ + query: { + sort_field: 'agent.id', + sort_order: 'desc', + }, + }); + + const [context, req, res] = [mockContext, mockRequest, mockResponse]; + + await handler(context, req, res); + + const handlerArgs = mockEsClient.search.mock.calls[0][0]; + + expect(handlerArgs).toMatchObject({ + sort: [{ 'agent.id': 'desc' }], + }); + }); + + it('takes `page_number` and `per_page` validate that the requested selected page was called', async () => { + const mockEsClient = elasticsearchClientMock.createClusterClient().asScoped().asInternalUser; + const router = httpServiceMock.createRouter(); + defineFindingsIndexRoute(router, logger); + const [_, handler] = router.get.mock.calls[0]; + const mockContext = getMockCspContext(mockEsClient); + const mockResponse = httpServerMock.createResponseFactory(); + const mockRequest = httpServerMock.createKibanaRequest({ + query: { + per_page: 10, + page: 3, + }, + }); + + const [context, req, res] = [mockContext, mockRequest, mockResponse]; + await handler(context, req, res); + + expect(mockEsClient.search).toHaveBeenCalledTimes(1); + const handlerArgs = mockEsClient.search.mock.calls[0][0]; + + expect(handlerArgs).toMatchObject({ + from: 20, + size: 10, + }); + }); + + it('should format request by fields filter', async () => { + const mockEsClient = elasticsearchClientMock.createClusterClient().asScoped().asInternalUser; + const router = httpServiceMock.createRouter(); + defineFindingsIndexRoute(router, logger); + const [_, handler] = router.get.mock.calls[0]; + + const mockContext = getMockCspContext(mockEsClient); + const mockResponse = httpServerMock.createResponseFactory(); + const mockRequest = httpServerMock.createKibanaRequest({ + query: { + fields: 'field1,field2,field3', + }, + }); + + const [context, req, res] = [mockContext, mockRequest, mockResponse]; + + await handler(context, req, res); + + const handlerArgs = mockEsClient.search.mock.calls[0][0]; + + expect(handlerArgs).toMatchObject({ + _source: ['field1', 'field2', 'field3'], + }); + }); + }); +}); diff --git a/x-pack/plugins/cloud_security_posture/server/routes/findings/findings.ts b/x-pack/plugins/cloud_security_posture/server/routes/findings/findings.ts new file mode 100644 index 0000000000000..a5c8f67a41cac --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/server/routes/findings/findings.ts @@ -0,0 +1,131 @@ +/* + * 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 type { IRouter, Logger } from 'src/core/server'; +import { SearchRequest, QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/types'; +import { schema as rt, TypeOf } from '@kbn/config-schema'; +import type { SortOrder } from '@elastic/elasticsearch/lib/api/types'; +import { transformError } from '@kbn/securitysolution-es-utils'; +import { getLatestCycleIds } from './get_latest_cycle_ids'; + +import { CSP_KUBEBEAT_INDEX_PATTERN, FINDINGS_ROUTE_PATH } from '../../../common/constants'; + +type FindingsQuerySchema = TypeOf; + +export const DEFAULT_FINDINGS_PER_PAGE = 20; + +export interface FindingsOptions { + size: number; + from?: number; + page?: number; + sortField?: string; + sortOrder?: SortOrder; + fields?: string[]; +} + +const getPointerForFirstDoc = (page: number, perPage: number): number => + page <= 1 ? 0 : page * perPage - perPage; + +const getSort = (sortField: string | undefined, sortOrder: string) => + sortField + ? { sort: [{ [sortField]: sortOrder }] } + : { sort: [{ '@timestamp': { order: sortOrder } }] }; + +const getSearchFields = (fields: string | undefined) => + fields ? { _source: fields.split(',') } : {}; + +const getFindingsEsQuery = ( + query: QueryDslQueryContainer, + options: FindingsOptions +): SearchRequest => { + return { + index: CSP_KUBEBEAT_INDEX_PATTERN, + query, + ...options, + }; +}; + +const buildQueryRequest = (latestCycleIds?: string[]): QueryDslQueryContainer => { + let filterPart: QueryDslQueryContainer = { match_all: {} }; + if (!!latestCycleIds) { + const filter = latestCycleIds.map((latestCycleId) => ({ + term: { 'run_id.keyword': latestCycleId }, + })); + filterPart = { bool: { filter } }; + } + + return { + ...filterPart, + }; +}; + +const buildOptionsRequest = (queryParams: FindingsQuerySchema): FindingsOptions => ({ + size: queryParams.per_page, + from: getPointerForFirstDoc(queryParams.page, queryParams.per_page), + ...getSort(queryParams.sort_field, queryParams.sort_order), + ...getSearchFields(queryParams.fields), +}); + +export const defineFindingsIndexRoute = (router: IRouter, logger: Logger): void => + router.get( + { + path: FINDINGS_ROUTE_PATH, + validate: { query: findingsInputSchema }, + }, + async (context, request, response) => { + try { + const esClient = context.core.elasticsearch.client.asCurrentUser; + const options = buildOptionsRequest(request.query); + + const latestCycleIds = + request.query.latest_cycle === true + ? await getLatestCycleIds(esClient, logger) + : undefined; + + const query = buildQueryRequest(latestCycleIds); + const esQuery = getFindingsEsQuery(query, options); + + const findings = await esClient.search(esQuery, { meta: true }); + const hits = findings.body.hits.hits; + + return response.ok({ body: hits }); + } catch (err) { + const error = transformError(err); + return response.customError({ + body: { message: error.message }, + statusCode: error.statusCode, + }); + } + } + ); + +export const findingsInputSchema = rt.object({ + /** + * The page of objects to return + */ + page: rt.number({ defaultValue: 1, min: 1 }), + /** + * The number of objects to include in each page + */ + per_page: rt.number({ defaultValue: DEFAULT_FINDINGS_PER_PAGE, min: 0 }), + /** + * Boolean flag to indicate for receiving only the latest findings + */ + latest_cycle: rt.maybe(rt.boolean()), + /** + * The field to use for sorting the found objects. + */ + sort_field: rt.maybe(rt.string()), + /** + * The order to sort by + */ + sort_order: rt.oneOf([rt.literal('asc'), rt.literal('desc')], { defaultValue: 'desc' }), + /** + * The fields in the entity to return in the response + */ + fields: rt.maybe(rt.string()), +}); diff --git a/x-pack/plugins/cloud_security_posture/server/routes/findings/get_latest_cycle.test.ts b/x-pack/plugins/cloud_security_posture/server/routes/findings/get_latest_cycle.test.ts new file mode 100644 index 0000000000000..3036d6d37cc0a --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/server/routes/findings/get_latest_cycle.test.ts @@ -0,0 +1,99 @@ +/* + * 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 { + elasticsearchClientMock, + // eslint-disable-next-line @kbn/eslint/no-restricted-paths +} from 'src/core/server/elasticsearch/client/mocks'; +import { loggingSystemMock } from 'src/core/server/mocks'; +import { getLatestCycleIds } from './get_latest_cycle_ids'; + +const mockEsClient = elasticsearchClientMock.createClusterClient().asScoped().asInternalUser; + +describe('get latest cycle ids', () => { + let logger: ReturnType; + + beforeEach(() => { + logger = loggingSystemMock.createLogger(); + jest.resetAllMocks(); + }); + + it('expect to find empty bucket', async () => { + mockEsClient.search.mockResolvedValueOnce( + // @ts-expect-error @elastic/elasticsearch Aggregate only allows unknown values + elasticsearchClientMock.createSuccessTransportRequestPromise({ + aggregations: { + group: { + buckets: [{}], + }, + }, + }) + ); + const response = await getLatestCycleIds(mockEsClient, logger); + expect(response).toEqual(undefined); + }); + + it('expect to find 1 cycle id', async () => { + mockEsClient.search.mockResolvedValueOnce( + // @ts-expect-error @elastic/elasticsearch Aggregate only allows unknown values + elasticsearchClientMock.createSuccessTransportRequestPromise({ + aggregations: { + group: { + buckets: [ + { + group_docs: { + hits: { + hits: [{ fields: { 'run_id.keyword': ['randomId1'] } }], + }, + }, + }, + ], + }, + }, + }) + ); + const response = await getLatestCycleIds(mockEsClient, logger); + expect(response).toEqual(expect.arrayContaining(['randomId1'])); + }); + + it('expect to find multiple cycle ids', async () => { + mockEsClient.search.mockResolvedValueOnce( + // @ts-expect-error @elastic/elasticsearch Aggregate only allows unknown values + elasticsearchClientMock.createSuccessTransportRequestPromise({ + aggregations: { + group: { + buckets: [ + { + group_docs: { + hits: { + hits: [{ fields: { 'run_id.keyword': ['randomId1'] } }], + }, + }, + }, + { + group_docs: { + hits: { + hits: [{ fields: { 'run_id.keyword': ['randomId2'] } }], + }, + }, + }, + { + group_docs: { + hits: { + hits: [{ fields: { 'run_id.keyword': ['randomId3'] } }], + }, + }, + }, + ], + }, + }, + }) + ); + const response = await getLatestCycleIds(mockEsClient, logger); + expect(response).toEqual(expect.arrayContaining(['randomId1', 'randomId2', 'randomId3'])); + }); +}); diff --git a/x-pack/plugins/cloud_security_posture/server/routes/findings/get_latest_cycle_ids.ts b/x-pack/plugins/cloud_security_posture/server/routes/findings/get_latest_cycle_ids.ts new file mode 100644 index 0000000000000..7af27d79926ab --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/server/routes/findings/get_latest_cycle_ids.ts @@ -0,0 +1,58 @@ +/* + * 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 type { Logger } from 'src/core/server'; +import { AggregationsFiltersAggregate, SearchRequest } from '@elastic/elasticsearch/lib/api/types'; +import type { ElasticsearchClient } from 'src/core/server'; +import { AGENT_LOGS_INDEX_PATTERN } from '../../../common/constants'; + +const getAgentLogsEsQuery = (): SearchRequest => ({ + index: AGENT_LOGS_INDEX_PATTERN, + size: 0, + query: { + bool: { + filter: [{ term: { 'status.keyword': 'end' } }], + }, + }, + aggs: { + group: { + terms: { field: 'agent.id.keyword' }, + aggs: { + group_docs: { + top_hits: { + size: 1, + sort: [{ '@timestamp': { order: 'desc' } }], + }, + }, + }, + }, + }, + fields: ['run_id.keyword', 'agent.id.keyword'], + _source: false, +}); + +const getCycleId = (v: any): string => v.group_docs.hits.hits?.[0]?.fields['run_id.keyword'][0]; + +export const getLatestCycleIds = async ( + esClient: ElasticsearchClient, + logger: Logger +): Promise => { + try { + const agentLogs = await esClient.search(getAgentLogsEsQuery(), { meta: true }); + const aggregations = agentLogs.body.aggregations; + if (!aggregations) { + return; + } + const buckets = (aggregations.group as Record).buckets; + if (!Array.isArray(buckets)) { + return; + } + return buckets.map(getCycleId); + } catch (err) { + logger.error('Failed to fetch cycle_ids'); + return; + } +}; diff --git a/x-pack/plugins/cloud_security_posture/server/routes/index.ts b/x-pack/plugins/cloud_security_posture/server/routes/index.ts new file mode 100755 index 0000000000000..ab8d1cc3bbedf --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/server/routes/index.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 type { IRouter, Logger } from '../../../../../src/core/server'; +import { defineGetStatsRoute } from './stats/stats'; +import { defineFindingsIndexRoute as defineGetFindingsIndexRoute } from './findings/findings'; + +export function defineRoutes(router: IRouter, logger: Logger) { + defineGetStatsRoute(router, logger); + defineGetFindingsIndexRoute(router, logger); +} diff --git a/x-pack/plugins/cloud_security_posture/server/routes/stats/stats.test.ts b/x-pack/plugins/cloud_security_posture/server/routes/stats/stats.test.ts new file mode 100644 index 0000000000000..549e8d45c989f --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/server/routes/stats/stats.test.ts @@ -0,0 +1,201 @@ +/* + * 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 { + elasticsearchClientMock, + ElasticsearchClientMock, + // eslint-disable-next-line @kbn/eslint/no-restricted-paths +} from 'src/core/server/elasticsearch/client/mocks'; + +import { + getBenchmarks, + getAllFindingsStats, + roundScore, + getBenchmarksStats, + getResourceTypesAggs, +} from './stats'; + +export const mockCountResultOnce = async (mockEsClient: ElasticsearchClientMock, count: number) => { + mockEsClient.count.mockReturnValueOnce( + // @ts-expect-error @elast ic/elasticsearch Aggregate only allows unknown values + elasticsearchClientMock.createSuccessTransportRequestPromise({ count }) + ); +}; + +export const mockSearchResultOnce = async ( + mockEsClient: ElasticsearchClientMock, + returnedMock: object +) => { + mockEsClient.search.mockReturnValueOnce( + // @ts-expect-error @elastic/elasticsearch Aggregate only allows unknown values + elasticsearchClientMock.createSuccessTransportRequestPromise(returnedMock) + ); +}; + +const mockEsClient = elasticsearchClientMock.createClusterClient().asScoped().asInternalUser; + +const resourceTypeAggsMockData = { + aggregations: { + resource_types: { + buckets: [ + { + key: 'pods', + doc_count: 3, + bucket_evaluation: { + buckets: [ + { + key: 'passed', + doc_count: 1, + }, + { + key: 'failed', + doc_count: 2, + }, + ], + }, + }, + { + key: 'etcd', + doc_count: 4, + bucket_evaluation: { + buckets: [ + // there is only one bucket here, in cases where aggs can't find an evaluation we count that as 0. + { + key: 'failed', + doc_count: 4, + }, + ], + }, + }, + ], + }, + }, +}; + +afterEach(() => { + jest.clearAllMocks(); +}); + +describe('testing round score', () => { + it('take decimal and expect the roundScore will return it with one digit after the dot ', async () => { + const score = roundScore(0.85245); + expect(score).toEqual(85.2); + }); +}); + +describe('general cloud posture score', () => { + it('expect to valid score from getAllFindingsStats', async () => { + mockCountResultOnce(mockEsClient, 10); // total findings + mockCountResultOnce(mockEsClient, 3); // pass findings + mockCountResultOnce(mockEsClient, 7); // fail findings + + const generalScore = await getAllFindingsStats(mockEsClient, 'randomCycleId'); + expect(generalScore).toEqual({ + name: 'general', + postureScore: 30, + totalFailed: 7, + totalFindings: 10, + totalPassed: 3, + }); + }); + + it("getAllFindingsStats throws when cycleId doesn't exists", async () => { + try { + await getAllFindingsStats(mockEsClient, 'randomCycleId'); + } catch (e) { + expect(e).toBeInstanceOf(Error); + expect(e.message).toEqual('missing stats'); + } + }); +}); + +describe('get benchmarks list', () => { + it('getBenchmarks - takes aggregated data and expect unique benchmarks array', async () => { + const returnedMock = { + aggregations: { + benchmarks: { + buckets: [ + { key: 'CIS Kubernetes', doc_count: 248514 }, + { key: 'GDPR', doc_count: 248514 }, + ], + }, + }, + }; + mockSearchResultOnce(mockEsClient, returnedMock); + const benchmarks = await getBenchmarks(mockEsClient); + expect(benchmarks).toEqual(['CIS Kubernetes', 'GDPR']); + }); +}); + +describe('score per benchmark, testing getBenchmarksStats', () => { + it('get data for only one benchmark and check', async () => { + mockCountResultOnce(mockEsClient, 10); // total findings + mockCountResultOnce(mockEsClient, 3); // pass findings + mockCountResultOnce(mockEsClient, 7); // fail findings + const benchmarkScore = await getBenchmarksStats(mockEsClient, 'randomCycleId', [ + 'CIS Benchmark', + ]); + expect(benchmarkScore).toEqual([ + { + name: 'CIS Benchmark', + postureScore: 30, + totalFailed: 7, + totalFindings: 10, + totalPassed: 3, + }, + ]); + }); + + it('get data two benchmarks and check', async () => { + mockCountResultOnce(mockEsClient, 10); // total findings + mockCountResultOnce(mockEsClient, 3); // pass findings + mockCountResultOnce(mockEsClient, 7); // fail findings + mockCountResultOnce(mockEsClient, 100); + mockCountResultOnce(mockEsClient, 50); + mockCountResultOnce(mockEsClient, 50); + const benchmarkScore = await getBenchmarksStats(mockEsClient, 'randomCycleId', [ + 'CIS Benchmark', + 'GDPR', + ]); + expect(benchmarkScore).toEqual([ + { + name: 'CIS Benchmark', + postureScore: 30, + totalFailed: 7, + totalFindings: 10, + totalPassed: 3, + }, + { + name: 'GDPR', + postureScore: 50, + totalFailed: 50, + totalFindings: 100, + totalPassed: 50, + }, + ]); + }); +}); + +describe('getResourceTypesAggs', () => { + it('get all resources types aggregations', async () => { + await mockSearchResultOnce(mockEsClient, resourceTypeAggsMockData); + const resourceTypeAggs = await getResourceTypesAggs(mockEsClient, 'RandomCycleId'); + expect(resourceTypeAggs).toEqual([ + { + resourceType: 'pods', + totalFindings: 3, + totalPassed: 1, + totalFailed: 2, + }, + { + resourceType: 'etcd', + totalFindings: 4, + totalPassed: 0, + totalFailed: 4, + }, + ]); + }); +}); diff --git a/x-pack/plugins/cloud_security_posture/server/routes/stats/stats.ts b/x-pack/plugins/cloud_security_posture/server/routes/stats/stats.ts new file mode 100644 index 0000000000000..828d7f932113e --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/server/routes/stats/stats.ts @@ -0,0 +1,226 @@ +/* + * 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 type { ElasticsearchClient, IRouter, Logger } from 'src/core/server'; +import type { AggregationsMultiBucketAggregateBase } from '@elastic/elasticsearch/lib/api/types'; +import { number, UnknownRecord } from 'io-ts'; +import { transformError } from '@kbn/securitysolution-es-utils'; + +import type { BenchmarkStats, CloudPostureStats, Evaluation, Score } from '../../../common/types'; +import { + getBenchmarksQuery, + getFindingsEsQuery, + getLatestFindingQuery, + getRisksEsQuery, +} from './stats_queries'; +import { RULE_FAILED, RULE_PASSED } from '../../constants'; +import { STATS_ROUTE_PATH } from '../../../common/constants'; + +// TODO: use a schema decoder +function assertBenchmarkStats(v: unknown): asserts v is BenchmarkStats { + if ( + !UnknownRecord.is(v) || + !number.is(v.totalFindings) || + !number.is(v.totalPassed) || + !number.is(v.totalFailed) || + !number.is(v.postureScore) + ) { + throw new Error('missing stats'); + } +} + +interface LastCycle { + cycle_id: string; +} + +interface GroupFilename { + // TODO find the 'key', 'doc_count' interface + key: string; + doc_count: number; +} + +interface ResourceTypeBucket { + resource_types: AggregationsMultiBucketAggregateBase<{ + key: string; + doc_count: number; + bucket_evaluation: AggregationsMultiBucketAggregateBase; + }>; +} + +interface ResourceTypeEvaluationBucket { + key: Evaluation; + doc_count: number; +} + +/** + * @param value value is [0, 1] range + */ +export const roundScore = (value: number): Score => Number((value * 100).toFixed(1)); + +const calculatePostureScore = (total: number, passed: number, failed: number): Score | undefined => + passed + failed === 0 || total === undefined ? undefined : roundScore(passed / (passed + failed)); + +const getLatestCycleId = async (esClient: ElasticsearchClient) => { + const latestFinding = await esClient.search(getLatestFindingQuery(), { meta: true }); + const lastCycle = latestFinding.body.hits.hits[0]; + + if (lastCycle?._source?.cycle_id === undefined) { + throw new Error('cycle id is missing'); + } + return lastCycle?._source?.cycle_id; +}; + +export const getBenchmarks = async (esClient: ElasticsearchClient) => { + const queryResult = await esClient.search< + {}, + { benchmarks: AggregationsMultiBucketAggregateBase> } + >(getBenchmarksQuery(), { meta: true }); + const benchmarksBuckets = queryResult.body.aggregations?.benchmarks; + + if (!benchmarksBuckets || !Array.isArray(benchmarksBuckets?.buckets)) { + throw new Error('missing buckets'); + } + + return benchmarksBuckets.buckets.map((e) => e.key); +}; + +export const getAllFindingsStats = async ( + esClient: ElasticsearchClient, + cycleId: string +): Promise => { + const [findings, passedFindings, failedFindings] = await Promise.all([ + esClient.count(getFindingsEsQuery(cycleId), { meta: true }), + esClient.count(getFindingsEsQuery(cycleId, RULE_PASSED), { meta: true }), + esClient.count(getFindingsEsQuery(cycleId, RULE_FAILED), { meta: true }), + ]); + + const totalFindings = findings.body.count; + const totalPassed = passedFindings.body.count; + const totalFailed = failedFindings.body.count; + const postureScore = calculatePostureScore(totalFindings, totalPassed, totalFailed); + const stats = { + name: 'general', + postureScore, + totalFindings, + totalPassed, + totalFailed, + }; + + assertBenchmarkStats(stats); + + return stats; +}; + +export const getBenchmarksStats = async ( + esClient: ElasticsearchClient, + cycleId: string, + benchmarks: string[] +): Promise => { + const benchmarkPromises = benchmarks.map((benchmark) => { + const benchmarkFindings = esClient.count(getFindingsEsQuery(cycleId, undefined, benchmark), { + meta: true, + }); + const benchmarkPassedFindings = esClient.count( + getFindingsEsQuery(cycleId, RULE_PASSED, benchmark), + { meta: true } + ); + const benchmarkFailedFindings = esClient.count( + getFindingsEsQuery(cycleId, RULE_FAILED, benchmark), + { meta: true } + ); + + return Promise.all([benchmarkFindings, benchmarkPassedFindings, benchmarkFailedFindings]).then( + ([benchmarkFindingsResult, benchmarkPassedFindingsResult, benchmarkFailedFindingsResult]) => { + const totalFindings = benchmarkFindingsResult.body.count; + const totalPassed = benchmarkPassedFindingsResult.body.count; + const totalFailed = benchmarkFailedFindingsResult.body.count; + const postureScore = calculatePostureScore(totalFindings, totalPassed, totalFailed); + const stats = { + name: benchmark, + postureScore, + totalFindings, + totalPassed, + totalFailed, + }; + + assertBenchmarkStats(stats); + return stats; + } + ); + }); + + return Promise.all(benchmarkPromises); +}; + +export const getResourceTypesAggs = async ( + esClient: ElasticsearchClient, + cycleId: string +): Promise => { + const resourceTypesQueryResult = await esClient.search( + getRisksEsQuery(cycleId), + { meta: true } + ); + + const resourceTypesAggs = resourceTypesQueryResult.body.aggregations?.resource_types.buckets; + if (!Array.isArray(resourceTypesAggs)) throw new Error('missing resources types buckets'); + + return resourceTypesAggs.map((bucket) => { + const evalBuckets = bucket.bucket_evaluation.buckets; + if (!Array.isArray(evalBuckets)) throw new Error('missing resources types evaluations buckets'); + + const failedBucket = evalBuckets.find((evalBucket) => evalBucket.key === RULE_FAILED); + const passedBucket = evalBuckets.find((evalBucket) => evalBucket.key === RULE_PASSED); + + return { + resourceType: bucket.key, + totalFindings: bucket.doc_count, + totalFailed: failedBucket?.doc_count || 0, + totalPassed: passedBucket?.doc_count || 0, + }; + }); +}; + +export const defineGetStatsRoute = (router: IRouter, logger: Logger): void => + router.get( + { + path: STATS_ROUTE_PATH, + validate: false, + }, + async (context, _, response) => { + try { + const esClient = context.core.elasticsearch.client.asCurrentUser; + const [benchmarks, latestCycleID] = await Promise.all([ + getBenchmarks(esClient), + getLatestCycleId(esClient), + ]); + + // TODO: Utilize ES "Point in Time" feature https://www.elastic.co/guide/en/elasticsearch/reference/current/point-in-time-api.html + const [allFindingsStats, benchmarksStats, resourceTypesAggs] = await Promise.all([ + getAllFindingsStats(esClient, latestCycleID), + getBenchmarksStats(esClient, latestCycleID, benchmarks), + getResourceTypesAggs(esClient, latestCycleID), + ]); + + const body: CloudPostureStats = { + ...allFindingsStats, + benchmarksStats, + resourceTypesAggs, + }; + + return response.ok({ + body, + }); + } catch (err) { + const error = transformError(err); + + return response.customError({ + body: { message: error.message }, + statusCode: error.statusCode, + }); + } + } + ); diff --git a/x-pack/plugins/cloud_security_posture/server/routes/stats/stats_queries.ts b/x-pack/plugins/cloud_security_posture/server/routes/stats/stats_queries.ts new file mode 100644 index 0000000000000..b88182a27fee1 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/server/routes/stats/stats_queries.ts @@ -0,0 +1,111 @@ +/* + * 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 type { + SearchRequest, + CountRequest, + QueryDslQueryContainer, +} from '@elastic/elasticsearch/lib/api/types'; + +import { CSP_KUBEBEAT_INDEX_PATTERN } from '../../../common/constants'; +import { Evaluation } from '../../../common/types'; + +export const getFindingsEsQuery = ( + cycleId: string, + evaluationResult?: string, + benchmark?: string +): CountRequest => { + const filter: QueryDslQueryContainer[] = [{ term: { 'cycle_id.keyword': cycleId } }]; + + if (benchmark) { + filter.push({ term: { 'rule.benchmark.keyword': benchmark } }); + } + + if (evaluationResult) { + filter.push({ term: { 'result.evaluation.keyword': evaluationResult } }); + } + + return { + index: CSP_KUBEBEAT_INDEX_PATTERN, + query: { + bool: { filter }, + }, + }; +}; + +export const getResourcesEvaluationEsQuery = ( + cycleId: string, + evaluation: Evaluation, + size: number, + resources?: string[] +): SearchRequest => { + const query: QueryDslQueryContainer = { + bool: { + filter: [ + { term: { 'cycle_id.keyword': cycleId } }, + { term: { 'result.evaluation.keyword': evaluation } }, + ], + }, + }; + if (resources) { + query.bool!.must = { terms: { 'resource.filename.keyword': resources } }; + } + return { + index: CSP_KUBEBEAT_INDEX_PATTERN, + size, + query, + aggs: { + group: { + terms: { field: 'resource.filename.keyword' }, + }, + }, + sort: 'resource.filename.keyword', + }; +}; + +export const getBenchmarksQuery = (): SearchRequest => ({ + index: CSP_KUBEBEAT_INDEX_PATTERN, + size: 0, + aggs: { + benchmarks: { + terms: { field: 'rule.benchmark.keyword' }, + }, + }, +}); + +export const getLatestFindingQuery = (): SearchRequest => ({ + index: CSP_KUBEBEAT_INDEX_PATTERN, + size: 1, + /* @ts-expect-error TS2322 - missing SearchSortContainer */ + sort: { '@timestamp': 'desc' }, + query: { + match_all: {}, + }, +}); + +export const getRisksEsQuery = (cycleId: string): SearchRequest => ({ + index: CSP_KUBEBEAT_INDEX_PATTERN, + size: 0, + query: { + bool: { + filter: [{ term: { 'cycle_id.keyword': cycleId } }], + }, + }, + aggs: { + resource_types: { + terms: { + field: 'resource.type.keyword', + }, + aggs: { + bucket_evaluation: { + terms: { + field: 'result.evaluation.keyword', + }, + }, + }, + }, + }, +}); diff --git a/x-pack/plugins/cloud_security_posture/server/types.ts b/x-pack/plugins/cloud_security_posture/server/types.ts new file mode 100644 index 0000000000000..707002461d2a6 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/server/types.ts @@ -0,0 +1,30 @@ +/* + * 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 type { + PluginSetup as DataPluginSetup, + PluginStart as DataPluginStart, +} from '../../../../src/plugins/data/server'; + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface CspServerPluginSetup {} +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface CspServerPluginStart {} + +export interface CspServerPluginSetupDeps { + // required + data: DataPluginSetup; + + // optional +} + +export interface CspServerPluginStartDeps { + // required + data: DataPluginStart; + + // optional +} diff --git a/x-pack/plugins/cloud_security_posture/tsconfig.json b/x-pack/plugins/cloud_security_posture/tsconfig.json new file mode 100755 index 0000000000000..47625c59eae6c --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/tsconfig.json @@ -0,0 +1,24 @@ +{ + "extends": "../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "./target/types", + "emitDeclarationOnly": true, + "declaration": true, + "declarationMap": true + }, + "include": [ + "common/**/*", + "public/**/*", + "server/**/*", + "scripts/**/*", + // have to declare *.json explicitly due to https://github.com/microsoft/TypeScript/issues/25636 + "server/**/*.json", + "public/**/*.json", + "../../../typings/**/*" + ], + "references": [ + { "path": "../../../src/core/tsconfig.json" }, + { "path": "../../../src/plugins/data/tsconfig.json" }, + { "path": "../../../src/plugins/navigation/tsconfig.json" } + ] +} From e015ca97f47f226c0f3747fdef56e3596248f34c Mon Sep 17 00:00:00 2001 From: Kaarina Tungseth Date: Mon, 28 Feb 2022 12:17:03 -0600 Subject: [PATCH 054/102] [DOCS] Reformats the Monitoring settings tables into definition lists (#126489) --- docs/settings/monitoring-settings.asciidoc | 189 ++++++++++----------- 1 file changed, 87 insertions(+), 102 deletions(-) diff --git a/docs/settings/monitoring-settings.asciidoc b/docs/settings/monitoring-settings.asciidoc index d8bc26b7b3987..a328700ebeb5f 100644 --- a/docs/settings/monitoring-settings.asciidoc +++ b/docs/settings/monitoring-settings.asciidoc @@ -29,50 +29,47 @@ For more information, see [[monitoring-general-settings]] ==== General monitoring settings -[cols="2*<"] -|=== -| `monitoring.ui.ccs.enabled` - | Set to `true` (default) to enable {ref}/modules-cross-cluster-search.html[cross-cluster search] of your monitoring data. The {ref}/modules-remote-clusters.html#remote-cluster-settings[`remote_cluster_client`] role must exist on each node. - - -| `monitoring.ui.elasticsearch.hosts` - | Specifies the location of the {es} cluster where your monitoring data is stored. - By default, this is the same as <>. This setting enables - you to use a single {kib} instance to search and visualize data in your - production cluster as well as monitor data sent to a dedicated monitoring - cluster. - -| `monitoring.ui.elasticsearch.username` - | Specifies the username used by {kib} monitoring to establish a persistent connection - in {kib} to the {es} monitoring cluster and to verify licensing status on the {es} - monitoring cluster. + - + - Every other request performed by *{stack-monitor-app}* to the monitoring {es} - cluster uses the authenticated user's credentials, which must be the same on - both the {es} monitoring cluster and the {es} production cluster. + - + - If not set, {kib} uses the value of the <> setting. - -| `monitoring.ui.elasticsearch.password` - | Specifies the password used by {kib} monitoring to establish a persistent connection - in {kib} to the {es} monitoring cluster and to verify licensing status on the {es} - monitoring cluster. + - + - Every other request performed by *{stack-monitor-app}* to the monitoring {es} - cluster uses the authenticated user's credentials, which must be the same on - both the {es} monitoring cluster and the {es} production cluster. + - + - If not set, {kib} uses the value of the <> setting. - -| `monitoring.ui.elasticsearch.pingTimeout` - | Specifies the time in milliseconds to wait for {es} to respond to internal - health checks. By default, it matches the <> setting, - which has a default value of `30000`. - -| `monitoring.ui.elasticsearch.ssl` - | Shares the same configuration as <>. These settings configure encrypted communication between {kib} and the monitoring cluster. - -|=== +`monitoring.ui.ccs.enabled`:: +Set to `true` (default) to enable {ref}/modules-cross-cluster-search.html[cross-cluster search] of your monitoring data. The {ref}/modules-remote-clusters.html#remote-cluster-settings[`remote_cluster_client`] role must exist on each node. + + +`monitoring.ui.elasticsearch.hosts`:: +Specifies the location of the {es} cluster where your monitoring data is stored. ++ +By default, this is the same as <>. This setting enables +you to use a single {kib} instance to search and visualize data in your +production cluster as well as monitor data sent to a dedicated monitoring +cluster. + +`monitoring.ui.elasticsearch.username`:: +Specifies the username used by {kib} monitoring to establish a persistent connection +in {kib} to the {es} monitoring cluster and to verify licensing status on the {es} +monitoring cluster. ++ +Every other request performed by *{stack-monitor-app}* to the monitoring {es} +cluster uses the authenticated user's credentials, which must be the same on +both the {es} monitoring cluster and the {es} production cluster. ++ +If not set, {kib} uses the value of the <> setting. + +`monitoring.ui.elasticsearch.password`:: +Specifies the password used by {kib} monitoring to establish a persistent connection +in {kib} to the {es} monitoring cluster and to verify licensing status on the {es} +monitoring cluster. ++ +Every other request performed by *{stack-monitor-app}* to the monitoring {es} +cluster uses the authenticated user's credentials, which must be the same on +both the {es} monitoring cluster and the {es} production cluster. ++ +If not set, {kib} uses the value of the <> setting. + +`monitoring.ui.elasticsearch.pingTimeout`:: +Specifies the time in milliseconds to wait for {es} to respond to internal +health checks. By default, it matches the <> setting, +which has a default value of `30000`. + +`monitoring.ui.elasticsearch.ssl`:: +Shares the same configuration as <>. These settings configure encrypted communication between {kib} and the monitoring cluster. [float] [[monitoring-collection-settings]] @@ -80,18 +77,14 @@ For more information, see These settings control how data is collected from {kib}. -[cols="2*<"] -|=== -| `monitoring.kibana.collection.enabled` - | Set to `true` (default) to enable data collection from the {kib} NodeJS server - for {kib} dashboards to be featured in *{stack-monitor-app}*. +`monitoring.kibana.collection.enabled`:: +Set to `true` (default) to enable data collection from the {kib} NodeJS server +for {kib} dashboards to be featured in *{stack-monitor-app}*. -| `monitoring.kibana.collection.interval` {ess-icon} - | Specifies the number of milliseconds to wait in between data sampling on the - {kib} NodeJS server for the metrics that are displayed in the {kib} dashboards. - Defaults to `10000` (10 seconds). - -|=== +`monitoring.kibana.collection.interval` {ess-icon}:: +Specifies the number of milliseconds to wait in between data sampling on the +{kib} NodeJS server for the metrics that are displayed in the {kib} dashboards. +Defaults to `10000` (10 seconds). [float] [[monitoring-ui-settings]] @@ -102,36 +95,32 @@ However, the defaults work best in most circumstances. For more information about configuring {kib}, see {kibana-ref}/settings.html[Setting {kib} server properties]. -[cols="2*<"] -|=== -| `monitoring.ui.elasticsearch.logFetchCount` - | Specifies the number of log entries to display in *{stack-monitor-app}*. - Defaults to `10`. The maximum value is `50`. - -|[[monitoring-ui-enabled]] `monitoring.ui.enabled` - | Set to `false` to hide *{stack-monitor-app}*. The monitoring back-end - continues to run as an agent for sending {kib} stats to the monitoring - cluster. Defaults to `true`. - -| `monitoring.ui.logs.index` - | Specifies the name of the indices that are shown on the - <> page in *{stack-monitor-app}*. The default value - is `filebeat-*`. - -| `monitoring.ui.max_bucket_size` - | Specifies the number of term buckets to return out of the overall terms list when - performing terms aggregations to retrieve index and node metrics. For more - information about the `size` parameter, see - {ref}/search-aggregations-bucket-terms-aggregation.html#search-aggregations-bucket-terms-aggregation-size[Terms Aggregation]. - Defaults to `10000`. - -| `monitoring.ui.min_interval_seconds` {ess-icon} - | Specifies the minimum number of seconds that a time bucket in a chart can - represent. Defaults to 10. If you modify the - `monitoring.ui.collection.interval` in `elasticsearch.yml`, use the same - value in this setting. - -|=== +`monitoring.ui.elasticsearch.logFetchCount`:: +Specifies the number of log entries to display in *{stack-monitor-app}*. +Defaults to `10`. The maximum value is `50`. + +[[monitoring-ui-enabled]] `monitoring.ui.enabled`:: +Set to `false` to hide *{stack-monitor-app}*. The monitoring back-end +continues to run as an agent for sending {kib} stats to the monitoring +cluster. Defaults to `true`. + +`monitoring.ui.logs.index`:: +Specifies the name of the indices that are shown on the +<> page in *{stack-monitor-app}*. The default value +is `filebeat-*`. + +`monitoring.ui.max_bucket_size`:: +Specifies the number of term buckets to return out of the overall terms list when +performing terms aggregations to retrieve index and node metrics. For more +information about the `size` parameter, see +{ref}/search-aggregations-bucket-terms-aggregation.html#search-aggregations-bucket-terms-aggregation-size[Terms Aggregation]. +Defaults to `10000`. + +`monitoring.ui.min_interval_seconds` {ess-icon}:: +Specifies the minimum number of seconds that a time bucket in a chart can +represent. Defaults to 10. If you modify the +`monitoring.ui.collection.interval` in `elasticsearch.yml`, use the same +value in this setting. [float] [[monitoring-ui-cgroup-settings]] @@ -142,20 +131,16 @@ better decisions about your container performance, rather than guessing based on the overall machine performance. If you are not running your applications in a container, then Cgroup statistics are not useful. -[cols="2*<"] -|=== -| `monitoring.ui.container.elasticsearch.enabled` {ess-icon} - | For {es} clusters that are running in containers, this setting changes the - *Node Listing* to display the CPU utilization based on the reported Cgroup - statistics. It also adds the calculated Cgroup CPU utilization to the - *Node Overview* page instead of the overall operating system's CPU - utilization. Defaults to `false`. - -| `monitoring.ui.container.logstash.enabled` - | For {ls} nodes that are running in containers, this setting - changes the {ls} *Node Listing* to display the CPU utilization - based on the reported Cgroup statistics. It also adds the - calculated Cgroup CPU utilization to the {ls} node detail - pages instead of the overall operating system’s CPU utilization. Defaults to `false`. - -|=== +`monitoring.ui.container.elasticsearch.enabled` {ess-icon}:: +For {es} clusters that are running in containers, this setting changes the +*Node Listing* to display the CPU utilization based on the reported Cgroup +statistics. It also adds the calculated Cgroup CPU utilization to the +*Node Overview* page instead of the overall operating system's CPU +utilization. Defaults to `false`. + +`monitoring.ui.container.logstash.enabled`:: +For {ls} nodes that are running in containers, this setting +changes the {ls} *Node Listing* to display the CPU utilization +based on the reported Cgroup statistics. It also adds the +calculated Cgroup CPU utilization to the {ls} node detail +pages instead of the overall operating system’s CPU utilization. Defaults to `false`. From 8fc81f48b95255ea9a1c99aece5b670c5c57a13d Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Mon, 28 Feb 2022 11:49:00 -0700 Subject: [PATCH 055/102] [Infrastructure UI] Remove reduces from Log Threshold Rule (#126402) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../log_threshold/log_threshold_executor.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/x-pack/plugins/infra/server/lib/alerting/log_threshold/log_threshold_executor.ts b/x-pack/plugins/infra/server/lib/alerting/log_threshold/log_threshold_executor.ts index 674ba977e09c0..2ca97c6b8a35f 100644 --- a/x-pack/plugins/infra/server/lib/alerting/log_threshold/log_threshold_executor.ts +++ b/x-pack/plugins/infra/server/lib/alerting/log_threshold/log_threshold_executor.ts @@ -333,22 +333,22 @@ const getReducedGroupByResults = ( key: GroupedSearchQueryResponse['aggregations']['groups']['buckets'][0]['key'] ) => Object.values(key).join(', '); + const reducedGroupByResults: ReducedGroupByResults = []; if (isOptimizedGroupedSearchQueryResponse(results)) { - return results.reduce((acc, groupBucket) => { + for (const groupBucket of results) { const groupName = getGroupName(groupBucket.key); - const groupResult = { name: groupName, documentCount: groupBucket.doc_count }; - return [...acc, groupResult]; - }, []); + reducedGroupByResults.push({ name: groupName, documentCount: groupBucket.doc_count }); + } } else { - return results.reduce((acc, groupBucket) => { + for (const groupBucket of results) { const groupName = getGroupName(groupBucket.key); - const groupResult = { + reducedGroupByResults.push({ name: groupName, documentCount: groupBucket.filtered_results.doc_count, - }; - return [...acc, groupResult]; - }, []); + }); + } } + return reducedGroupByResults; }; export const processGroupByResults = ( From 6634e149ab2bf1af5f8c4bbfc94b1f03c5102528 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cau=C3=AA=20Marcondes?= <55978943+cauemarcondes@users.noreply.github.com> Date: Mon, 28 Feb 2022 14:37:54 -0500 Subject: [PATCH 056/102] [APM] Update APM package version to 8.1.0 (#126477) --- x-pack/plugins/apm/common/fleet.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/apm/common/fleet.ts b/x-pack/plugins/apm/common/fleet.ts index 367528f79b222..183192e6bd1da 100644 --- a/x-pack/plugins/apm/common/fleet.ts +++ b/x-pack/plugins/apm/common/fleet.ts @@ -8,7 +8,7 @@ import semverParse from 'semver/functions/parse'; export const POLICY_ELASTIC_AGENT_ON_CLOUD = 'policy-elastic-agent-on-cloud'; -export const SUPPORTED_APM_PACKAGE_VERSION = '8.0.0'; +export const SUPPORTED_APM_PACKAGE_VERSION = '8.1.0'; export function isPrereleaseVersion(version: string) { return semverParse(version)?.prerelease?.length ?? 0 > 0; From 50e89720c36b7d735eb8183328aef2b1288cd562 Mon Sep 17 00:00:00 2001 From: Kyle Pollich Date: Mon, 28 Feb 2022 14:38:24 -0500 Subject: [PATCH 057/102] Resolve latest package version from bundled packages if possible (#126492) --- .../server/services/epm/registry/index.ts | 68 +++++++++++-------- 1 file changed, 39 insertions(+), 29 deletions(-) diff --git a/x-pack/plugins/fleet/server/services/epm/registry/index.ts b/x-pack/plugins/fleet/server/services/epm/registry/index.ts index c70b064684a96..db6a324352ca1 100644 --- a/x-pack/plugins/fleet/server/services/epm/registry/index.ts +++ b/x-pack/plugins/fleet/server/services/epm/registry/index.ts @@ -8,6 +8,7 @@ import { URL } from 'url'; import mime from 'mime-types'; +import semverGte from 'semver/functions/gte'; import type { Response } from 'node-fetch'; @@ -74,8 +75,11 @@ async function _fetchFindLatestPackage( packageName: string, options?: FetchFindLatestPackageOptions ) { + const logger = appContextService.getLogger(); const { ignoreConstraints = false } = options ?? {}; + const bundledPackage = await getBundledPackageByName(packageName); + const registryUrl = getRegistryUrl(); const url = new URL(`${registryUrl}/search?package=${packageName}&experimental=true`); @@ -83,55 +87,61 @@ async function _fetchFindLatestPackage( setKibanaVersion(url); } - const res = await fetchUrl(url.toString(), 1); - const searchResults: RegistryPackage[] = JSON.parse(res); - - return searchResults; -} - -export async function fetchFindLatestPackageOrThrow( - packageName: string, - options?: FetchFindLatestPackageOptions -) { try { - const searchResults = await _fetchFindLatestPackage(packageName, options); + const res = await fetchUrl(url.toString(), 1); + const searchResults: RegistryPackage[] = JSON.parse(res); + + const latestPackageFromRegistry = searchResults[0] ?? null; - if (!searchResults.length) { - throw new PackageNotFoundError(`[${packageName}] package not found in registry`); + if (bundledPackage && semverGte(bundledPackage.version, latestPackageFromRegistry.version)) { + return bundledPackage; } - return searchResults[0]; + return latestPackageFromRegistry; } catch (error) { - const bundledPackage = await getBundledPackageByName(packageName); + logger.error( + `Failed to fetch latest version of ${packageName} from registry: ${error.message}` + ); - if (!bundledPackage) { - throw error; + // Fall back to the bundled version of the package if it exists + if (bundledPackage) { + return bundledPackage; } - return bundledPackage; + // Otherwise, return null and allow callers to determine whether they'll consider this an error or not + return null; + } +} + +export async function fetchFindLatestPackageOrThrow( + packageName: string, + options?: FetchFindLatestPackageOptions +) { + const latestPackage = await _fetchFindLatestPackage(packageName, options); + + if (!latestPackage) { + throw new PackageNotFoundError(`[${packageName}] package not found in registry`); } + + return latestPackage; } export async function fetchFindLatestPackageOrUndefined( packageName: string, options?: FetchFindLatestPackageOptions ) { + const logger = appContextService.getLogger(); + try { - const searchResults = await _fetchFindLatestPackage(packageName, options); + const latestPackage = await _fetchFindLatestPackage(packageName, options); - if (!searchResults.length) { + if (!latestPackage) { return undefined; } - - return searchResults[0]; + return latestPackage; } catch (error) { - const bundledPackage = await getBundledPackageByName(packageName); - - if (!bundledPackage) { - return undefined; - } - - return bundledPackage; + logger.warn(`Error fetching latest package for ${packageName}: ${error.message}`); + return undefined; } } From 33d85a338418c367cf35766fd75a9c1b7a07ae63 Mon Sep 17 00:00:00 2001 From: spalger Date: Mon, 28 Feb 2022 13:52:15 -0600 Subject: [PATCH 058/102] test to make sure admins can still push From 0fb24a095fbf735a35d131651fd08b7be624338b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cau=C3=AA=20Marcondes?= <55978943+cauemarcondes@users.noreply.github.com> Date: Mon, 28 Feb 2022 15:48:10 -0500 Subject: [PATCH 059/102] [APM] Make UI indices space aware (support for spaces) (#126378) * changing structure of the saved object when migrating * addressing PR changes Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../apm/server/saved_objects/apm_indices.ts | 31 +++++-------------- ..._legacy_apm_indices_to_space_aware.test.ts | 30 ++++++++++-------- ...grate_legacy_apm_indices_to_space_aware.ts | 11 ++++--- 3 files changed, 31 insertions(+), 41 deletions(-) diff --git a/x-pack/plugins/apm/server/saved_objects/apm_indices.ts b/x-pack/plugins/apm/server/saved_objects/apm_indices.ts index 4a3b0d32e9667..fe6650fb356ff 100644 --- a/x-pack/plugins/apm/server/saved_objects/apm_indices.ts +++ b/x-pack/plugins/apm/server/saved_objects/apm_indices.ts @@ -8,7 +8,6 @@ import { SavedObjectsType } from 'src/core/server'; import { i18n } from '@kbn/i18n'; import { updateApmOssIndexPaths } from './migrations/update_apm_oss_index_paths'; -import { ApmIndicesConfigName } from '..'; export interface APMIndices { apmIndices?: { @@ -22,32 +21,14 @@ export interface APMIndices { isSpaceAware?: boolean; } -const properties: { - apmIndices: { - properties: { - [Property in ApmIndicesConfigName]: { type: 'keyword' }; - }; - }; - isSpaceAware: { type: 'boolean' }; -} = { - apmIndices: { - properties: { - sourcemap: { type: 'keyword' }, - error: { type: 'keyword' }, - onboarding: { type: 'keyword' }, - span: { type: 'keyword' }, - transaction: { type: 'keyword' }, - metric: { type: 'keyword' }, - }, - }, - isSpaceAware: { type: 'boolean' }, -}; - export const apmIndices: SavedObjectsType = { name: 'apm-indices', hidden: false, namespaceType: 'single', - mappings: { properties }, + mappings: { + dynamic: false, + properties: {}, // several fields exist, but we don't need to search or aggregate on them, so we exclude them from the mappings + }, management: { importableAndExportable: true, icon: 'apmApp', @@ -61,5 +42,9 @@ export const apmIndices: SavedObjectsType = { const attributes = updateApmOssIndexPaths(doc.attributes); return { ...doc, attributes }; }, + '8.2.0': (doc) => { + // Any future changes on this structure should be also tested on migrateLegacyAPMIndicesToSpaceAware + return { ...doc, attributes: { apmIndices: doc.attributes } }; + }, }, }; diff --git a/x-pack/plugins/apm/server/saved_objects/migrations/migrate_legacy_apm_indices_to_space_aware.test.ts b/x-pack/plugins/apm/server/saved_objects/migrations/migrate_legacy_apm_indices_to_space_aware.test.ts index 404e08a6b112b..71488ab007c67 100644 --- a/x-pack/plugins/apm/server/saved_objects/migrations/migrate_legacy_apm_indices_to_space_aware.test.ts +++ b/x-pack/plugins/apm/server/saved_objects/migrations/migrate_legacy_apm_indices_to_space_aware.test.ts @@ -81,12 +81,14 @@ describe('migrateLegacyAPMIndicesToSpaceAware', () => { updated_at: '2022-02-22T14:17:10.584Z', version: 'WzE1OSwxXQ==', attributes: { - transaction: 'default-apm-*', - span: 'default-apm-*', - error: 'default-apm-*', - metric: 'default-apm-*', - sourcemap: 'default-apm-*', - onboarding: 'default-apm-*', + apmIndices: { + transaction: 'default-apm-*', + span: 'default-apm-*', + error: 'default-apm-*', + metric: 'default-apm-*', + sourcemap: 'default-apm-*', + onboarding: 'default-apm-*', + }, }, references: [], migrationVersion: { @@ -154,12 +156,14 @@ describe('migrateLegacyAPMIndicesToSpaceAware', () => { }), }); const attributes = { - transaction: 'space-apm-*', - span: 'space-apm-*', - error: 'space-apm-*', - metric: 'space-apm-*', - sourcemap: 'space-apm-*', - onboarding: 'space-apm-*', + apmIndices: { + transaction: 'space-apm-*', + span: 'space-apm-*', + error: 'space-apm-*', + metric: 'space-apm-*', + sourcemap: 'space-apm-*', + onboarding: 'space-apm-*', + }, }; const core = { savedObjects: { @@ -197,7 +201,7 @@ describe('migrateLegacyAPMIndicesToSpaceAware', () => { type: APM_INDEX_SETTINGS_SAVED_OBJECT_TYPE, id: APM_INDEX_SETTINGS_SAVED_OBJECT_ID, initialNamespaces: [id], - attributes: { apmIndices: attributes, isSpaceAware: true }, + attributes: { ...attributes, isSpaceAware: true }, }; }) ); diff --git a/x-pack/plugins/apm/server/saved_objects/migrations/migrate_legacy_apm_indices_to_space_aware.ts b/x-pack/plugins/apm/server/saved_objects/migrations/migrate_legacy_apm_indices_to_space_aware.ts index 130070b80ff14..3f97191a5b88a 100644 --- a/x-pack/plugins/apm/server/saved_objects/migrations/migrate_legacy_apm_indices_to_space_aware.ts +++ b/x-pack/plugins/apm/server/saved_objects/migrations/migrate_legacy_apm_indices_to_space_aware.ts @@ -19,9 +19,10 @@ import { APMIndices } from '../apm_indices'; async function fetchLegacyAPMIndices(repository: ISavedObjectsRepository) { try { - const apmIndices = await repository.get< - Partial - >(APM_INDEX_SETTINGS_SAVED_OBJECT_TYPE, APM_INDEX_SETTINGS_SAVED_OBJECT_ID); + const apmIndices = await repository.get>( + APM_INDEX_SETTINGS_SAVED_OBJECT_TYPE, + APM_INDEX_SETTINGS_SAVED_OBJECT_ID + ); if (apmIndices.attributes.isSpaceAware) { // This has already been migrated to become space-aware return null; @@ -59,8 +60,8 @@ export async function migrateLegacyAPMIndicesToSpaceAware({ fields: ['name'], // to avoid fetching *all* fields }); - const savedObjectAttributes: APMIndices = { - apmIndices: legacyAPMIndices.attributes, + const savedObjectAttributes = { + ...legacyAPMIndices.attributes, isSpaceAware: true, }; From 0d75ca6649ee87cec96f0f2a6c3e34a619a9962e Mon Sep 17 00:00:00 2001 From: Gil Raphaelli Date: Mon, 28 Feb 2022 16:52:56 -0500 Subject: [PATCH 060/102] Update APM Add to Project Parameter Types (#126533) --- .github/workflows/add-to-apm-project.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/add-to-apm-project.yml b/.github/workflows/add-to-apm-project.yml index dee908e9fb762..5df47b56792cd 100644 --- a/.github/workflows/add-to-apm-project.yml +++ b/.github/workflows/add-to-apm-project.yml @@ -14,7 +14,7 @@ jobs: with: headers: '{"GraphQL-Features": "projects_next_graphql"}' query: | - mutation add_to_project($projectid:String!,$contentid:String!) { + mutation add_to_project($projectid:ID!,$contentid:ID!) { addProjectNextItem(input:{projectId:$projectid contentId:$contentid}) { projectNextItem { id @@ -31,7 +31,7 @@ jobs: with: headers: '{"GraphQL-Features": "projects_next_graphql"}' query: | - mutation label_team($projectid:String!,$itemid:String!,$fieldid:String!,$value:String!) { + mutation label_team($projectid:ID!,$itemid:ID!,$fieldid:ID!,$value:String!) { updateProjectNextItemField(input: { projectId:$projectid itemId:$itemid fieldId:$fieldid value:$value }) { projectNextItem { id From 908ab5c3793f91ac457489be1a114f6f8934204e Mon Sep 17 00:00:00 2001 From: Gil Raphaelli Date: Mon, 28 Feb 2022 17:37:21 -0500 Subject: [PATCH 061/102] remove beta badge from tail based sampling apm integration editor (#126530) --- .../components/fleet_integration/apm_policy_form/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/apm/public/components/fleet_integration/apm_policy_form/index.tsx b/x-pack/plugins/apm/public/components/fleet_integration/apm_policy_form/index.tsx index 67dfe72b133f2..863f2c6227f41 100644 --- a/x-pack/plugins/apm/public/components/fleet_integration/apm_policy_form/index.tsx +++ b/x-pack/plugins/apm/public/components/fleet_integration/apm_policy_form/index.tsx @@ -131,7 +131,7 @@ export function APMPolicyForm({ } ), settings: tailSamplingSettings, - isBeta: true, + isBeta: false, isPlatinumLicence: true, }, ] From f51131c42c722775bd018857a7ad2bbb59321451 Mon Sep 17 00:00:00 2001 From: Ying Mao Date: Mon, 28 Feb 2022 17:48:08 -0500 Subject: [PATCH 062/102] [Alerting] Adding a configurable minimal rule interval for newly created rules (#125396) * Removing minimumScheduleInterval on rule type registration * Adding minimumScheduleInterval to config and enforcing in rule type registry * Validating interval on create and update * Fixing types and tests * Fixing types and tests * Fixing types and tests * Passing config to client and using to validate on rule creation * Fixing small bug and tests * Fixing tests * Fixing tests * Fixing tests * Updating interval in docs * Updating interval in docs * Updating UI copy * Fixing types and tests * Fixing i18n * Fixing tests from bad merge Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- docs/settings/alert-action-settings.asciidoc | 9 +- x-pack/plugins/alerting/README.md | 1 - .../alerting/common/parse_duration.test.ts | 62 +++++- .../plugins/alerting/common/parse_duration.ts | 10 +- x-pack/plugins/alerting/common/rule_type.ts | 1 - x-pack/plugins/alerting/server/config.test.ts | 1 + x-pack/plugins/alerting/server/config.ts | 4 +- x-pack/plugins/alerting/server/health/task.ts | 6 +- x-pack/plugins/alerting/server/index.ts | 1 + .../invalidate_pending_api_keys/task.ts | 19 +- x-pack/plugins/alerting/server/mocks.ts | 1 + x-pack/plugins/alerting/server/plugin.test.ts | 46 ++++- x-pack/plugins/alerting/server/plugin.ts | 66 ++++--- .../server/routes/legacy/health.test.ts | 1 - .../alerting/server/routes/rule_types.test.ts | 3 - .../alerting/server/routes/rule_types.ts | 2 - .../server/rule_type_registry.test.ts | 11 +- .../alerting/server/rule_type_registry.ts | 30 +-- .../server/rules_client/rules_client.ts | 36 ++-- .../rules_client/tests/aggregate.test.ts | 1 + .../server/rules_client/tests/create.test.ts | 80 ++++---- .../server/rules_client/tests/delete.test.ts | 1 + .../server/rules_client/tests/disable.test.ts | 1 + .../server/rules_client/tests/enable.test.ts | 1 + .../server/rules_client/tests/find.test.ts | 1 + .../server/rules_client/tests/get.test.ts | 1 + .../tests/get_alert_state.test.ts | 1 + .../tests/get_alert_summary.test.ts | 1 + .../tests/list_alert_types.test.ts | 1 + .../rules_client/tests/mute_all.test.ts | 1 + .../rules_client/tests/mute_instance.test.ts | 1 + .../server/rules_client/tests/resolve.test.ts | 1 + .../rules_client/tests/unmute_all.test.ts | 1 + .../tests/unmute_instance.test.ts | 1 + .../server/rules_client/tests/update.test.ts | 180 +++++++++--------- .../rules_client/tests/update_api_key.test.ts | 1 + .../rules_client_conflict_retries.test.ts | 5 +- .../server/rules_client_factory.test.ts | 3 + .../alerting/server/rules_client_factory.ts | 4 + .../saved_objects/is_rule_exportable.test.ts | 1 + x-pack/plugins/alerting/server/types.ts | 1 - .../public/alerts/alert_form.test.tsx | 3 +- .../translations/translations/ja-JP.json | 2 - .../translations/translations/zh-CN.json | 2 - .../triggers_actions_ui/common/index.ts | 1 + .../application/lib/value_validators.test.ts | 44 +++++ .../sections/rule_form/rule_add.test.tsx | 4 + .../sections/rule_form/rule_add.tsx | 12 +- .../sections/rule_form/rule_edit.test.tsx | 10 +- .../sections/rule_form/rule_edit.tsx | 20 +- .../sections/rule_form/rule_errors.test.tsx | 59 ++---- .../sections/rule_form/rule_errors.ts | 24 +-- .../sections/rule_form/rule_form.test.tsx | 16 +- .../sections/rule_form/rule_form.tsx | 23 ++- .../rules_list/components/rules_list.test.tsx | 3 + .../public/common/lib/config_api.test.ts | 25 +++ .../public/common/lib/config_api.ts | 13 ++ .../public/common/lib/health_api.ts | 5 +- .../triggers_actions_ui/public/types.ts | 5 +- .../triggers_actions_ui/server/plugin.ts | 23 ++- .../server/routes/config.test.ts | 30 +++ .../server/routes/config.ts | 40 ++++ .../server/routes/index.ts | 8 + .../alerting_api_integration/common/config.ts | 1 + .../functional_execution_context/config.ts | 1 + x-pack/test/functional_with_es_ssl/config.ts | 1 + x-pack/test/rule_registry/common/config.ts | 1 + 67 files changed, 657 insertions(+), 318 deletions(-) create mode 100644 x-pack/plugins/triggers_actions_ui/public/common/lib/config_api.test.ts create mode 100644 x-pack/plugins/triggers_actions_ui/public/common/lib/config_api.ts create mode 100644 x-pack/plugins/triggers_actions_ui/server/routes/config.test.ts create mode 100644 x-pack/plugins/triggers_actions_ui/server/routes/config.ts create mode 100644 x-pack/plugins/triggers_actions_ui/server/routes/index.ts diff --git a/docs/settings/alert-action-settings.asciidoc b/docs/settings/alert-action-settings.asciidoc index 1b8d467713ab8..e7969191ee646 100644 --- a/docs/settings/alert-action-settings.asciidoc +++ b/docs/settings/alert-action-settings.asciidoc @@ -193,4 +193,11 @@ Specifies the default timeout for the all rule types tasks. The time is formatte For example, `20m`, `24h`, `7d`, `1w`. Default: `5m`. `xpack.alerting.cancelAlertsOnRuleTimeout`:: -Specifies whether to skip writing alerts and scheduling actions if rule execution is cancelled due to timeout. Default: `true`. This setting can be overridden by individual rule types. \ No newline at end of file +Specifies whether to skip writing alerts and scheduling actions if rule execution is cancelled due to timeout. Default: `true`. This setting can be overridden by individual rule types. + +`xpack.alerting.minimumScheduleInterval`:: +Specifies the minimum interval allowed for the all rules. This minimum is enforced for all rules created or updated after the introduction of this setting. The time is formatted as: ++ +`[s,m,h,d]` ++ +For example, `20m`, `24h`, `7d`. Default: `1m`. \ No newline at end of file diff --git a/x-pack/plugins/alerting/README.md b/x-pack/plugins/alerting/README.md index 8fdfe77776b4e..a18c62047a0de 100644 --- a/x-pack/plugins/alerting/README.md +++ b/x-pack/plugins/alerting/README.md @@ -100,7 +100,6 @@ The following table describes the properties of the `options` object. |useSavedObjectReferences.injectReferences|(Optional) When developing a rule type, you can choose to implement hooks for injecting saved object references into rule parameters. This hook will be invoked when a rule is retrieved (get or find). Implementing this hook is optional, but if an inject hook is implemented, an extract hook must also be implemented.|Function |isExportable|Whether the rule type is exportable from the Saved Objects Management UI.|boolean| |defaultScheduleInterval|The default interval that will show up in the UI when creating a rule of this rule type.|boolean| -|minimumScheduleInterval|The minimum interval that will be allowed for all rules of this rule type.|boolean| |doesSetRecoveryContext|Whether the rule type will set context variables for recovered alerts. Defaults to `false`. If this is set to true, context variables are made available for the recovery action group and executors will be provided with the ability to set recovery context.|boolean| ### Executor diff --git a/x-pack/plugins/alerting/common/parse_duration.test.ts b/x-pack/plugins/alerting/common/parse_duration.test.ts index e68a3f479f228..c661eab2691fe 100644 --- a/x-pack/plugins/alerting/common/parse_duration.test.ts +++ b/x-pack/plugins/alerting/common/parse_duration.test.ts @@ -44,24 +44,84 @@ test('throws error when suffix is missing', () => { ); }); +test('formats single second', () => { + const result = formatDuration('1s'); + expect(result).toEqual('1 sec'); +}); + +test('formats single second with full unit', () => { + const result = formatDuration('1s', true); + expect(result).toEqual('1 second'); +}); + test('formats seconds', () => { const result = formatDuration('10s'); expect(result).toEqual('10 sec'); }); +test('formats seconds with full unit', () => { + const result = formatDuration('10s', true); + expect(result).toEqual('10 seconds'); +}); + +test('formats single minute', () => { + const result = formatDuration('1m'); + expect(result).toEqual('1 min'); +}); + +test('formats single minute with full unit', () => { + const result = formatDuration('1m', true); + expect(result).toEqual('1 minute'); +}); + test('formats minutes', () => { const result = formatDuration('10m'); expect(result).toEqual('10 min'); }); +test('formats minutes with full unit', () => { + const result = formatDuration('10m', true); + expect(result).toEqual('10 minutes'); +}); + +test('formats single hour', () => { + const result = formatDuration('1h'); + expect(result).toEqual('1 hr'); +}); + +test('formats single hour with full unit', () => { + const result = formatDuration('1h', true); + expect(result).toEqual('1 hour'); +}); + test('formats hours', () => { const result = formatDuration('10h'); expect(result).toEqual('10 hr'); }); +test('formats hours with full unit', () => { + const result = formatDuration('10h', true); + expect(result).toEqual('10 hours'); +}); + +test('formats single day', () => { + const result = formatDuration('1d'); + expect(result).toEqual('1 day'); +}); + +test('formats single day with full unit', () => { + const result = formatDuration('1d', true); + expect(result).toEqual('1 day'); +}); + test('formats days', () => { const result = formatDuration('10d'); - expect(result).toEqual('10 day'); + expect(result).toEqual('10 days'); +}); + +test('formats days with full unit', () => { + const result = formatDuration('10d', true); + expect(result).toEqual('10 days'); }); test('format throws error when the format is invalid', () => { diff --git a/x-pack/plugins/alerting/common/parse_duration.ts b/x-pack/plugins/alerting/common/parse_duration.ts index af4f1d2c14099..3040b601fd64b 100644 --- a/x-pack/plugins/alerting/common/parse_duration.ts +++ b/x-pack/plugins/alerting/common/parse_duration.ts @@ -27,16 +27,16 @@ export function parseDuration(duration: string): number { ); } -export function formatDuration(duration: string): string { +export function formatDuration(duration: string, fullUnit?: boolean): string { const parsed = parseInt(duration, 10); if (isSeconds(duration)) { - return `${parsed} sec`; + return `${parsed} ${fullUnit ? (parsed > 1 ? 'seconds' : 'second') : 'sec'}`; } else if (isMinutes(duration)) { - return `${parsed} min`; + return `${parsed} ${fullUnit ? (parsed > 1 ? 'minutes' : 'minute') : 'min'}`; } else if (isHours(duration)) { - return `${parsed} hr`; + return `${parsed} ${fullUnit ? (parsed > 1 ? 'hours' : 'hour') : 'hr'}`; } else if (isDays(duration)) { - return `${parsed} day`; + return `${parsed} ${parsed > 1 ? 'days' : 'day'}`; } throw new Error( `Invalid duration "${duration}". Durations must be of the form {number}x. Example: 5s, 5m, 5h or 5d"` diff --git a/x-pack/plugins/alerting/common/rule_type.ts b/x-pack/plugins/alerting/common/rule_type.ts index eb24e29f552b9..e98a641ba91fd 100644 --- a/x-pack/plugins/alerting/common/rule_type.ts +++ b/x-pack/plugins/alerting/common/rule_type.ts @@ -36,7 +36,6 @@ export interface RuleType< isExportable: boolean; ruleTaskTimeout?: string; defaultScheduleInterval?: string; - minimumScheduleInterval?: string; doesSetRecoveryContext?: boolean; enabledInLicense: boolean; authorizedConsumers: Record; diff --git a/x-pack/plugins/alerting/server/config.test.ts b/x-pack/plugins/alerting/server/config.test.ts index a96612beac412..3e3b2569dac2f 100644 --- a/x-pack/plugins/alerting/server/config.test.ts +++ b/x-pack/plugins/alerting/server/config.test.ts @@ -22,6 +22,7 @@ describe('config validation', () => { "removalDelay": "1h", }, "maxEphemeralActionsPerAlert": 10, + "minimumScheduleInterval": "1m", } `); }); diff --git a/x-pack/plugins/alerting/server/config.ts b/x-pack/plugins/alerting/server/config.ts index 8b1b664534379..9da15273850c4 100644 --- a/x-pack/plugins/alerting/server/config.ts +++ b/x-pack/plugins/alerting/server/config.ts @@ -22,6 +22,8 @@ export const configSchema = schema.object({ }), defaultRuleTaskTimeout: schema.string({ validate: validateDurationSchema, defaultValue: '5m' }), cancelAlertsOnRuleTimeout: schema.boolean({ defaultValue: true }), + minimumScheduleInterval: schema.string({ validate: validateDurationSchema, defaultValue: '1m' }), }); -export type AlertsConfig = TypeOf; +export type AlertingConfig = TypeOf; +export type PublicAlertingConfig = Pick; diff --git a/x-pack/plugins/alerting/server/health/task.ts b/x-pack/plugins/alerting/server/health/task.ts index 8d69cbe565136..889dafdfa02a1 100644 --- a/x-pack/plugins/alerting/server/health/task.ts +++ b/x-pack/plugins/alerting/server/health/task.ts @@ -11,7 +11,7 @@ import { TaskManagerSetupContract, TaskManagerStartContract, } from '../../../task_manager/server'; -import { AlertsConfig } from '../config'; +import { AlertingConfig } from '../config'; import { AlertingPluginsStart } from '../plugin'; import { HealthStatus } from '../types'; import { getAlertingHealthStatus } from './get_health'; @@ -30,11 +30,11 @@ export function initializeAlertingHealth( export async function scheduleAlertingHealthCheck( logger: Logger, - config: Promise, + config: AlertingConfig, taskManager: TaskManagerStartContract ) { try { - const interval = (await config).healthCheck.interval; + const interval = config.healthCheck.interval; await taskManager.ensureScheduled({ id: HEALTH_TASK_ID, taskType: HEALTH_TASK_TYPE, diff --git a/x-pack/plugins/alerting/server/index.ts b/x-pack/plugins/alerting/server/index.ts index 63e8df5488895..46f0b7e284164 100644 --- a/x-pack/plugins/alerting/server/index.ts +++ b/x-pack/plugins/alerting/server/index.ts @@ -35,6 +35,7 @@ export type { FindResult } from './rules_client'; export type { PublicAlert as Alert } from './alert'; export { parseDuration } from './lib'; export { getEsErrorMessage } from './lib/errors'; +export type { PublicAlertingConfig } from './config'; export type { IAbortableEsClient, IAbortableClusterClient, diff --git a/x-pack/plugins/alerting/server/invalidate_pending_api_keys/task.ts b/x-pack/plugins/alerting/server/invalidate_pending_api_keys/task.ts index f17ed8bc90aa0..8b3c6716b1cd3 100644 --- a/x-pack/plugins/alerting/server/invalidate_pending_api_keys/task.ts +++ b/x-pack/plugins/alerting/server/invalidate_pending_api_keys/task.ts @@ -20,7 +20,7 @@ import { TaskManagerStartContract, } from '../../../task_manager/server'; import { InvalidateAPIKeyResult } from '../rules_client'; -import { AlertsConfig } from '../config'; +import { AlertingConfig } from '../config'; import { timePeriodBeforeDate } from '../lib/get_cadence'; import { AlertingPluginsStart } from '../plugin'; import { InvalidatePendingApiKey } from '../types'; @@ -52,17 +52,17 @@ export function initializeApiKeyInvalidator( logger: Logger, coreStartServices: Promise<[CoreStart, AlertingPluginsStart, unknown]>, taskManager: TaskManagerSetupContract, - config: Promise + config: AlertingConfig ) { registerApiKeyInvalidatorTaskDefinition(logger, coreStartServices, taskManager, config); } export async function scheduleApiKeyInvalidatorTask( logger: Logger, - config: Promise, + config: AlertingConfig, taskManager: TaskManagerStartContract ) { - const interval = (await config).invalidateApiKeysTask.interval; + const interval = config.invalidateApiKeysTask.interval; try { await taskManager.ensureScheduled({ id: TASK_ID, @@ -82,7 +82,7 @@ function registerApiKeyInvalidatorTaskDefinition( logger: Logger, coreStartServices: Promise<[CoreStart, AlertingPluginsStart, unknown]>, taskManager: TaskManagerSetupContract, - config: Promise + config: AlertingConfig ) { taskManager.registerTaskDefinitions({ [TASK_TYPE]: { @@ -113,14 +113,13 @@ function getFakeKibanaRequest(basePath: string) { function taskRunner( logger: Logger, coreStartServices: Promise<[CoreStart, AlertingPluginsStart, unknown]>, - config: Promise + config: AlertingConfig ) { return ({ taskInstance }: RunContext) => { const { state } = taskInstance; return { async run() { let totalInvalidated = 0; - const configResult = await config; try { const [{ savedObjects, http }, { encryptedSavedObjects, security }] = await coreStartServices; @@ -134,7 +133,7 @@ function taskRunner( const encryptedSavedObjectsClient = encryptedSavedObjects.getClient({ includedHiddenTypes: ['api_key_pending_invalidation'], }); - const configuredDelay = configResult.invalidateApiKeysTask.removalDelay; + const configuredDelay = config.invalidateApiKeysTask.removalDelay; const delay = timePeriodBeforeDate(new Date(), configuredDelay).toISOString(); let hasApiKeysPendingInvalidation = true; @@ -165,7 +164,7 @@ function taskRunner( total_invalidated: totalInvalidated, }, schedule: { - interval: configResult.invalidateApiKeysTask.interval, + interval: config.invalidateApiKeysTask.interval, }, }; } catch (e) { @@ -176,7 +175,7 @@ function taskRunner( total_invalidated: totalInvalidated, }, schedule: { - interval: configResult.invalidateApiKeysTask.interval, + interval: config.invalidateApiKeysTask.interval, }, }; } diff --git a/x-pack/plugins/alerting/server/mocks.ts b/x-pack/plugins/alerting/server/mocks.ts index f7872ba797856..d58630e18cd4d 100644 --- a/x-pack/plugins/alerting/server/mocks.ts +++ b/x-pack/plugins/alerting/server/mocks.ts @@ -20,6 +20,7 @@ const createSetupMock = () => { const mock: jest.Mocked = { registerType: jest.fn(), getSecurityHealth: jest.fn(), + getConfig: jest.fn(), }; return mock; }; diff --git a/x-pack/plugins/alerting/server/plugin.test.ts b/x-pack/plugins/alerting/server/plugin.test.ts index 3716ecfcc1260..7bf559ecde844 100644 --- a/x-pack/plugins/alerting/server/plugin.test.ts +++ b/x-pack/plugins/alerting/server/plugin.test.ts @@ -15,7 +15,7 @@ import { eventLogServiceMock } from '../../event_log/server/event_log_service.mo import { KibanaRequest } from 'kibana/server'; import { featuresPluginMock } from '../../features/server/mocks'; import { KibanaFeature } from '../../features/server'; -import { AlertsConfig } from './config'; +import { AlertingConfig } from './config'; import { RuleType } from './types'; import { eventLogMock } from '../../event_log/server/mocks'; import { actionsMock } from '../../actions/server/mocks'; @@ -29,7 +29,7 @@ describe('Alerting Plugin', () => { beforeEach(() => jest.clearAllMocks()); it('should log warning when Encrypted Saved Objects plugin is missing encryption key', async () => { - const context = coreMock.createPluginInitializerContext({ + const context = coreMock.createPluginInitializerContext({ healthCheck: { interval: '5m', }, @@ -40,6 +40,7 @@ describe('Alerting Plugin', () => { maxEphemeralActionsPerAlert: 10, defaultRuleTaskTimeout: '5m', cancelAlertsOnRuleTimeout: true, + minimumScheduleInterval: '1m', }); plugin = new AlertingPlugin(context); @@ -64,7 +65,7 @@ describe('Alerting Plugin', () => { }); it('should create usage counter if usageCollection plugin is defined', async () => { - const context = coreMock.createPluginInitializerContext({ + const context = coreMock.createPluginInitializerContext({ healthCheck: { interval: '5m', }, @@ -75,6 +76,7 @@ describe('Alerting Plugin', () => { maxEphemeralActionsPerAlert: 10, defaultRuleTaskTimeout: '5m', cancelAlertsOnRuleTimeout: true, + minimumScheduleInterval: '1m', }); plugin = new AlertingPlugin(context); @@ -97,6 +99,35 @@ describe('Alerting Plugin', () => { expect(usageCollectionSetup.registerCollector).toHaveBeenCalled(); }); + it(`exposes configured minimumScheduleInterval()`, async () => { + const context = coreMock.createPluginInitializerContext({ + healthCheck: { + interval: '5m', + }, + invalidateApiKeysTask: { + interval: '5m', + removalDelay: '1h', + }, + maxEphemeralActionsPerAlert: 100, + defaultRuleTaskTimeout: '5m', + cancelAlertsOnRuleTimeout: true, + minimumScheduleInterval: '1m', + }); + plugin = new AlertingPlugin(context); + + const encryptedSavedObjectsSetup = encryptedSavedObjectsMock.createSetup(); + const setupContract = plugin.setup(coreMock.createSetup(), { + licensing: licensingMock.createSetup(), + encryptedSavedObjects: encryptedSavedObjectsSetup, + taskManager: taskManagerMock.createSetup(), + eventLog: eventLogServiceMock.create(), + actions: actionsMock.createSetup(), + statusService: statusServiceMock.createSetupContract(), + }); + + expect(setupContract.getConfig()).toEqual({ minimumScheduleInterval: '1m' }); + }); + describe('registerType()', () => { let setup: PluginSetupContract; const sampleRuleType: RuleType = { @@ -190,7 +221,7 @@ describe('Alerting Plugin', () => { describe('start()', () => { describe('getRulesClientWithRequest()', () => { it('throws error when encryptedSavedObjects plugin is missing encryption key', async () => { - const context = coreMock.createPluginInitializerContext({ + const context = coreMock.createPluginInitializerContext({ healthCheck: { interval: '5m', }, @@ -201,6 +232,7 @@ describe('Alerting Plugin', () => { maxEphemeralActionsPerAlert: 10, defaultRuleTaskTimeout: '5m', cancelAlertsOnRuleTimeout: true, + minimumScheduleInterval: '1m', }); const plugin = new AlertingPlugin(context); @@ -232,7 +264,7 @@ describe('Alerting Plugin', () => { }); it(`doesn't throw error when encryptedSavedObjects plugin has encryption key`, async () => { - const context = coreMock.createPluginInitializerContext({ + const context = coreMock.createPluginInitializerContext({ healthCheck: { interval: '5m', }, @@ -243,6 +275,7 @@ describe('Alerting Plugin', () => { maxEphemeralActionsPerAlert: 10, defaultRuleTaskTimeout: '5m', cancelAlertsOnRuleTimeout: true, + minimumScheduleInterval: '1m', }); const plugin = new AlertingPlugin(context); @@ -288,7 +321,7 @@ describe('Alerting Plugin', () => { }); test(`exposes getAlertingAuthorizationWithRequest()`, async () => { - const context = coreMock.createPluginInitializerContext({ + const context = coreMock.createPluginInitializerContext({ healthCheck: { interval: '5m', }, @@ -299,6 +332,7 @@ describe('Alerting Plugin', () => { maxEphemeralActionsPerAlert: 100, defaultRuleTaskTimeout: '5m', cancelAlertsOnRuleTimeout: true, + minimumScheduleInterval: '1m', }); const plugin = new AlertingPlugin(context); diff --git a/x-pack/plugins/alerting/server/plugin.ts b/x-pack/plugins/alerting/server/plugin.ts index b68ee6f436d6f..760aa6e0050a9 100644 --- a/x-pack/plugins/alerting/server/plugin.ts +++ b/x-pack/plugins/alerting/server/plugin.ts @@ -6,7 +6,6 @@ */ import type { PublicMethodsOf } from '@kbn/utility-types'; -import { first } from 'rxjs/operators'; import { BehaviorSubject } from 'rxjs'; import { UsageCollectionSetup, UsageCounter } from 'src/plugins/usage_collection/server'; import { SecurityPluginSetup, SecurityPluginStart } from '../../security/server'; @@ -58,7 +57,7 @@ import { scheduleApiKeyInvalidatorTask, } from './invalidate_pending_api_keys/task'; import { scheduleAlertingHealthCheck, initializeAlertingHealth } from './health'; -import { AlertsConfig } from './config'; +import { AlertingConfig, PublicAlertingConfig } from './config'; import { getHealth } from './health/get_health'; import { AlertingAuthorizationClientFactory } from './alerting_authorization_client_factory'; import { AlertingAuthorization } from './authorization'; @@ -99,6 +98,7 @@ export interface PluginSetupContract { > ): void; getSecurityHealth: () => Promise; + getConfig: () => PublicAlertingConfig; } export interface PluginStartContract { @@ -136,7 +136,7 @@ export interface AlertingPluginsStart { } export class AlertingPlugin { - private readonly config: Promise; + private readonly config: AlertingConfig; private readonly logger: Logger; private ruleTypeRegistry?: RuleTypeRegistry; private readonly taskRunnerFactory: TaskRunnerFactory; @@ -153,7 +153,7 @@ export class AlertingPlugin { private usageCounter: UsageCounter | undefined; constructor(initializerContext: PluginInitializerContext) { - this.config = initializerContext.config.create().pipe(first()).toPromise(); + this.config = initializerContext.config.get(); this.logger = initializerContext.logger.get(); this.taskRunnerFactory = new TaskRunnerFactory(); this.rulesClientFactory = new RulesClientFactory(); @@ -201,6 +201,7 @@ export class AlertingPlugin { taskRunnerFactory: this.taskRunnerFactory, licenseState: this.licenseState, licensing: plugins.licensing, + minimumScheduleInterval: this.config.minimumScheduleInterval, }); this.ruleTypeRegistry = ruleTypeRegistry; @@ -286,13 +287,12 @@ export class AlertingPlugin { throw new Error(`"${ruleType.minimumLicenseRequired}" is not a valid license type`); } - alertingConfig.then((config) => { - ruleType.ruleTaskTimeout = ruleType.ruleTaskTimeout ?? config.defaultRuleTaskTimeout; - ruleType.cancelAlertsOnRuleTimeout = - ruleType.cancelAlertsOnRuleTimeout ?? config.cancelAlertsOnRuleTimeout; - ruleType.doesSetRecoveryContext = ruleType.doesSetRecoveryContext ?? false; - ruleTypeRegistry.register(ruleType); - }); + ruleType.ruleTaskTimeout = + ruleType.ruleTaskTimeout ?? alertingConfig.defaultRuleTaskTimeout; + ruleType.cancelAlertsOnRuleTimeout = + ruleType.cancelAlertsOnRuleTimeout ?? alertingConfig.cancelAlertsOnRuleTimeout; + ruleType.doesSetRecoveryContext = ruleType.doesSetRecoveryContext ?? false; + ruleTypeRegistry.register(ruleType); }, getSecurityHealth: async () => { return await getSecurityHealth( @@ -304,6 +304,11 @@ export class AlertingPlugin { } ); }, + getConfig: () => { + return { + minimumScheduleInterval: alertingConfig.minimumScheduleInterval, + }; + }, }; } @@ -360,6 +365,7 @@ export class AlertingPlugin { kibanaVersion: this.kibanaVersion, authorization: alertingAuthorizationClientFactory, eventLogger: this.eventLogger, + minimumScheduleInterval: this.config.minimumScheduleInterval, }); const getRulesClientWithRequest = (request: KibanaRequest) => { @@ -375,26 +381,24 @@ export class AlertingPlugin { return alertingAuthorizationClientFactory!.create(request); }; - this.config.then((config) => { - taskRunnerFactory.initialize({ - logger, - savedObjects: core.savedObjects, - elasticsearch: core.elasticsearch, - getRulesClientWithRequest, - spaceIdToNamespace, - actionsPlugin: plugins.actions, - encryptedSavedObjectsClient, - basePathService: core.http.basePath, - eventLogger: this.eventLogger!, - internalSavedObjectsRepository: core.savedObjects.createInternalRepository(['alert']), - executionContext: core.executionContext, - ruleTypeRegistry: this.ruleTypeRegistry!, - kibanaBaseUrl: this.kibanaBaseUrl, - supportsEphemeralTasks: plugins.taskManager.supportsEphemeralTasks(), - maxEphemeralActionsPerRule: config.maxEphemeralActionsPerAlert, - cancelAlertsOnRuleTimeout: config.cancelAlertsOnRuleTimeout, - usageCounter: this.usageCounter, - }); + taskRunnerFactory.initialize({ + logger, + savedObjects: core.savedObjects, + elasticsearch: core.elasticsearch, + getRulesClientWithRequest, + spaceIdToNamespace, + actionsPlugin: plugins.actions, + encryptedSavedObjectsClient, + basePathService: core.http.basePath, + eventLogger: this.eventLogger!, + internalSavedObjectsRepository: core.savedObjects.createInternalRepository(['alert']), + executionContext: core.executionContext, + ruleTypeRegistry: this.ruleTypeRegistry!, + kibanaBaseUrl: this.kibanaBaseUrl, + supportsEphemeralTasks: plugins.taskManager.supportsEphemeralTasks(), + maxEphemeralActionsPerRule: this.config.maxEphemeralActionsPerAlert, + cancelAlertsOnRuleTimeout: this.config.cancelAlertsOnRuleTimeout, + usageCounter: this.usageCounter, }); this.eventLogService!.registerSavedObjectProvider('alert', (request) => { diff --git a/x-pack/plugins/alerting/server/routes/legacy/health.test.ts b/x-pack/plugins/alerting/server/routes/legacy/health.test.ts index 7f0d6c7649123..c5371f6fcb5e7 100644 --- a/x-pack/plugins/alerting/server/routes/legacy/health.test.ts +++ b/x-pack/plugins/alerting/server/routes/legacy/health.test.ts @@ -52,7 +52,6 @@ const ruleTypes = [ }, producer: 'test', enabledInLicense: true, - minimumScheduleInterval: '1m', defaultScheduleInterval: '10m', } as RegistryAlertTypeWithAuth, ]; diff --git a/x-pack/plugins/alerting/server/routes/rule_types.test.ts b/x-pack/plugins/alerting/server/routes/rule_types.test.ts index 752f729fb8e38..880db9b9e9886 100644 --- a/x-pack/plugins/alerting/server/routes/rule_types.test.ts +++ b/x-pack/plugins/alerting/server/routes/rule_types.test.ts @@ -58,7 +58,6 @@ describe('ruleTypesRoute', () => { }, producer: 'test', enabledInLicense: true, - minimumScheduleInterval: '1m', defaultScheduleInterval: '10m', doesSetRecoveryContext: false, } as RegistryAlertTypeWithAuth, @@ -77,7 +76,6 @@ describe('ruleTypesRoute', () => { default_schedule_interval: '10m', does_set_recovery_context: false, minimum_license_required: 'basic', - minimum_schedule_interval: '1m', is_exportable: true, rule_task_timeout: '10m', recovery_action_group: RecoveredActionGroup, @@ -116,7 +114,6 @@ describe('ruleTypesRoute', () => { "id": "1", "is_exportable": true, "minimum_license_required": "basic", - "minimum_schedule_interval": "1m", "name": "name", "producer": "test", "recovery_action_group": Object { diff --git a/x-pack/plugins/alerting/server/routes/rule_types.ts b/x-pack/plugins/alerting/server/routes/rule_types.ts index 7b2a0c63be198..0427fffab04d1 100644 --- a/x-pack/plugins/alerting/server/routes/rule_types.ts +++ b/x-pack/plugins/alerting/server/routes/rule_types.ts @@ -23,7 +23,6 @@ const rewriteBodyRes: RewriteResponseCase = (result ruleTaskTimeout, actionVariables, authorizedConsumers, - minimumScheduleInterval, defaultScheduleInterval, doesSetRecoveryContext, ...rest @@ -38,7 +37,6 @@ const rewriteBodyRes: RewriteResponseCase = (result rule_task_timeout: ruleTaskTimeout, action_variables: actionVariables, authorized_consumers: authorizedConsumers, - minimum_schedule_interval: minimumScheduleInterval, default_schedule_interval: defaultScheduleInterval, does_set_recovery_context: doesSetRecoveryContext, }) diff --git a/x-pack/plugins/alerting/server/rule_type_registry.test.ts b/x-pack/plugins/alerting/server/rule_type_registry.test.ts index 8ba2847486bca..9efbcff691108 100644 --- a/x-pack/plugins/alerting/server/rule_type_registry.test.ts +++ b/x-pack/plugins/alerting/server/rule_type_registry.test.ts @@ -25,6 +25,7 @@ beforeEach(() => { taskRunnerFactory: new TaskRunnerFactory(), licenseState: mockedLicenseState, licensing: licensingMock.createSetup(), + minimumScheduleInterval: '1m', }; }); @@ -165,7 +166,7 @@ describe('register()', () => { ); }); - test('throws if minimumScheduleInterval isnt valid', () => { + test('throws if defaultScheduleInterval is less than configured minimumScheduleInterval', () => { const ruleType: RuleType = { id: '123', name: 'Test', @@ -175,19 +176,18 @@ describe('register()', () => { name: 'Default', }, ], + defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', isExportable: true, executor: jest.fn(), producer: 'alerts', - minimumScheduleInterval: 'foobar', + defaultScheduleInterval: '10s', }; const registry = new RuleTypeRegistry(ruleTypeRegistryParams); expect(() => registry.register(ruleType)).toThrowError( - new Error( - `Rule type \"123\" has invalid minimum interval: string is not a valid duration: foobar.` - ) + new Error(`Rule type \"123\" cannot specify a default interval less than 1m.`) ); }); @@ -526,7 +526,6 @@ describe('list()', () => { "id": "test", "isExportable": true, "minimumLicenseRequired": "basic", - "minimumScheduleInterval": undefined, "name": "Test", "producer": "alerts", "recoveryActionGroup": Object { diff --git a/x-pack/plugins/alerting/server/rule_type_registry.ts b/x-pack/plugins/alerting/server/rule_type_registry.ts index 6673fb630ef59..9e7bca9e94876 100644 --- a/x-pack/plugins/alerting/server/rule_type_registry.ts +++ b/x-pack/plugins/alerting/server/rule_type_registry.ts @@ -26,6 +26,7 @@ import { RecoveredActionGroupId, ActionGroup, validateDurationSchema, + parseDuration, } from '../common'; import { ILicenseState } from './lib/license_state'; import { getRuleTypeFeatureUsageName } from './lib/get_rule_type_feature_usage_name'; @@ -35,6 +36,7 @@ export interface ConstructorOptions { taskRunnerFactory: TaskRunnerFactory; licenseState: ILicenseState; licensing: LicensingPluginSetup; + minimumScheduleInterval: string; } export interface RegistryRuleType @@ -49,7 +51,6 @@ export interface RegistryRuleType | 'minimumLicenseRequired' | 'isExportable' | 'ruleTaskTimeout' - | 'minimumScheduleInterval' | 'defaultScheduleInterval' | 'doesSetRecoveryContext' > { @@ -129,13 +130,21 @@ export class RuleTypeRegistry { private readonly ruleTypes: Map = new Map(); private readonly taskRunnerFactory: TaskRunnerFactory; private readonly licenseState: ILicenseState; + private readonly minimumScheduleInterval: string; private readonly licensing: LicensingPluginSetup; - constructor({ taskManager, taskRunnerFactory, licenseState, licensing }: ConstructorOptions) { + constructor({ + taskManager, + taskRunnerFactory, + licenseState, + licensing, + minimumScheduleInterval, + }: ConstructorOptions) { this.taskManager = taskManager; this.taskRunnerFactory = taskRunnerFactory; this.licenseState = licenseState; this.licensing = licensing; + this.minimumScheduleInterval = minimumScheduleInterval; } public has(id: string) { @@ -209,20 +218,19 @@ export class RuleTypeRegistry { ) ); } - } - // validate minimumScheduleInterval here - if (ruleType.minimumScheduleInterval) { - const invalidMinimumTimeout = validateDurationSchema(ruleType.minimumScheduleInterval); - if (invalidMinimumTimeout) { + const defaultIntervalInMs = parseDuration(ruleType.defaultScheduleInterval); + const minimumIntervalInMs = parseDuration(this.minimumScheduleInterval); + if (defaultIntervalInMs < minimumIntervalInMs) { throw new Error( i18n.translate( - 'xpack.alerting.ruleTypeRegistry.register.invalidMinimumTimeoutRuleTypeError', + 'xpack.alerting.ruleTypeRegistry.register.defaultTimeoutTooShortRuleTypeError', { - defaultMessage: 'Rule type "{id}" has invalid minimum interval: {errorMessage}.', + defaultMessage: + 'Rule type "{id}" cannot specify a default interval less than {minimumInterval}.', values: { id: ruleType.id, - errorMessage: invalidMinimumTimeout, + minimumInterval: this.minimumScheduleInterval, }, } ) @@ -330,7 +338,6 @@ export class RuleTypeRegistry { minimumLicenseRequired, isExportable, ruleTaskTimeout, - minimumScheduleInterval, defaultScheduleInterval, doesSetRecoveryContext, }, @@ -345,7 +352,6 @@ export class RuleTypeRegistry { minimumLicenseRequired, isExportable, ruleTaskTimeout, - minimumScheduleInterval, defaultScheduleInterval, doesSetRecoveryContext, enabledInLicense: !!this.licenseState.getLicenseCheckForRuleType( diff --git a/x-pack/plugins/alerting/server/rules_client/rules_client.ts b/x-pack/plugins/alerting/server/rules_client/rules_client.ts index 72ef2dba89ce7..6d3ffc822a626 100644 --- a/x-pack/plugins/alerting/server/rules_client/rules_client.ts +++ b/x-pack/plugins/alerting/server/rules_client/rules_client.ts @@ -120,6 +120,7 @@ export interface ConstructorOptions { authorization: AlertingAuthorization; actionsAuthorization: ActionsAuthorization; ruleTypeRegistry: RuleTypeRegistry; + minimumScheduleInterval: string; encryptedSavedObjectsClient: EncryptedSavedObjectsClient; spaceId?: string; namespace?: string; @@ -240,6 +241,8 @@ export class RulesClient { private readonly unsecuredSavedObjectsClient: SavedObjectsClientContract; private readonly authorization: AlertingAuthorization; private readonly ruleTypeRegistry: RuleTypeRegistry; + private readonly minimumScheduleInterval: string; + private readonly minimumScheduleIntervalInMs: number; private readonly createAPIKey: (name: string) => Promise; private readonly getActionsClient: () => Promise; private readonly actionsAuthorization: ActionsAuthorization; @@ -252,6 +255,7 @@ export class RulesClient { constructor({ ruleTypeRegistry, + minimumScheduleInterval, unsecuredSavedObjectsClient, authorization, taskManager, @@ -274,6 +278,8 @@ export class RulesClient { this.namespace = namespace; this.taskManager = taskManager; this.ruleTypeRegistry = ruleTypeRegistry; + this.minimumScheduleInterval = minimumScheduleInterval; + this.minimumScheduleIntervalInMs = parseDuration(minimumScheduleInterval); this.unsecuredSavedObjectsClient = unsecuredSavedObjectsClient; this.authorization = authorization; this.createAPIKey = createAPIKey; @@ -329,15 +335,12 @@ export class RulesClient { await this.validateActions(ruleType, data.actions); - // Validate intervals, if configured - if (ruleType.minimumScheduleInterval) { - const intervalInMs = parseDuration(data.schedule.interval); - const minimumScheduleIntervalInMs = parseDuration(ruleType.minimumScheduleInterval); - if (intervalInMs < minimumScheduleIntervalInMs) { - throw Boom.badRequest( - `Error updating rule: the interval is less than the minimum interval of ${ruleType.minimumScheduleInterval}` - ); - } + // Validate that schedule interval is not less than configured minimum + const intervalInMs = parseDuration(data.schedule.interval); + if (intervalInMs < this.minimumScheduleIntervalInMs) { + throw Boom.badRequest( + `Error creating rule: the interval is less than the allowed minimum interval of ${this.minimumScheduleInterval}` + ); } // Extract saved object references for this rule @@ -984,15 +987,12 @@ export class RulesClient { const validatedAlertTypeParams = validateRuleTypeParams(data.params, ruleType.validate?.params); await this.validateActions(ruleType, data.actions); - // Validate intervals, if configured - if (ruleType.minimumScheduleInterval) { - const intervalInMs = parseDuration(data.schedule.interval); - const minimumScheduleIntervalInMs = parseDuration(ruleType.minimumScheduleInterval); - if (intervalInMs < minimumScheduleIntervalInMs) { - throw Boom.badRequest( - `Error updating rule: the interval is less than the minimum interval of ${ruleType.minimumScheduleInterval}` - ); - } + // Validate that schedule interval is not less than configured minimum + const intervalInMs = parseDuration(data.schedule.interval); + if (intervalInMs < this.minimumScheduleIntervalInMs) { + throw Boom.badRequest( + `Error updating rule: the interval is less than the allowed minimum interval of ${this.minimumScheduleInterval}` + ); } // Extract saved object references for this rule diff --git a/x-pack/plugins/alerting/server/rules_client/tests/aggregate.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/aggregate.test.ts index fc38d540e0274..3a11bbc53bcd3 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/aggregate.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/aggregate.test.ts @@ -33,6 +33,7 @@ const rulesClientParams: jest.Mocked = { taskManager, ruleTypeRegistry, unsecuredSavedObjectsClient, + minimumScheduleInterval: '1m', authorization: authorization as unknown as AlertingAuthorization, actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, spaceId: 'default', diff --git a/x-pack/plugins/alerting/server/rules_client/tests/create.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/create.test.ts index 1485d8b639159..6ccc640dcc135 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/create.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/create.test.ts @@ -52,6 +52,7 @@ const rulesClientParams: jest.Mocked = { getEventLogClient: jest.fn(), kibanaVersion, auditLogger, + minimumScheduleInterval: '1m', }; beforeEach(() => { @@ -70,7 +71,7 @@ function getMockData(overwrites: Record = {}): CreateOptions<{ tags: ['foo'], alertTypeId: '123', consumer: 'bar', - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, throttle: null, notifyWhen: null, params: { @@ -141,7 +142,7 @@ describe('create()', () => { type: 'alert', attributes: { alertTypeId: '123', - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, params: { bar: true, }, @@ -284,7 +285,7 @@ describe('create()', () => { const createdAttributes = { ...data, alertTypeId: '123', - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, params: { bar: true, }, @@ -365,7 +366,7 @@ describe('create()', () => { "bar": true, }, "schedule": Object { - "interval": "10s", + "interval": "1m", }, "scheduledTaskId": "task-123", "tags": Array [ @@ -423,7 +424,7 @@ describe('create()', () => { "bar": true, }, "schedule": Object { - "interval": "10s", + "interval": "1m", }, "tags": Array [ "foo", @@ -455,7 +456,7 @@ describe('create()', () => { "spaceId": "default", }, "schedule": Object { - "interval": "10s", + "interval": "1m", }, "scope": Array [ "alerting", @@ -486,7 +487,7 @@ describe('create()', () => { const createdAttributes = { ...data, alertTypeId: '123', - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, params: { bar: true, }, @@ -545,7 +546,7 @@ describe('create()', () => { ...data, legacyId: '123', alertTypeId: '123', - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, params: { bar: true, }, @@ -624,7 +625,7 @@ describe('create()', () => { "bar": true, }, "schedule": Object { - "interval": "10s", + "interval": "1m", }, "tags": Array [ "foo", @@ -700,7 +701,7 @@ describe('create()', () => { type: 'alert', attributes: { alertTypeId: '123', - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, params: { bar: true, }, @@ -798,7 +799,7 @@ describe('create()', () => { "bar": true, }, "schedule": Object { - "interval": "10s", + "interval": "1m", }, "scheduledTaskId": "task-123", "updatedAt": 2019-02-12T21:01:22.479Z, @@ -889,7 +890,7 @@ describe('create()', () => { type: 'alert', attributes: { alertTypeId: '123', - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, params: { bar: true, }, @@ -982,7 +983,7 @@ describe('create()', () => { "bar": true, }, "schedule": Object { - "interval": "10s", + "interval": "1m", }, "scheduledTaskId": "task-123", "updatedAt": 2019-02-12T21:01:22.479Z, @@ -1037,7 +1038,7 @@ describe('create()', () => { name: 'abc', notifyWhen: 'onActiveAlert', params: { bar: true }, - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, tags: ['foo'], throttle: null, updatedAt: '2019-02-12T21:01:22.479Z', @@ -1164,7 +1165,7 @@ describe('create()', () => { type: 'alert', attributes: { alertTypeId: '123', - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, params: { bar: true, parameterThatIsSavedObjectRef: 'soRef_0', @@ -1234,7 +1235,7 @@ describe('create()', () => { name: 'abc', notifyWhen: 'onActiveAlert', params: { bar: true, parameterThatIsSavedObjectRef: 'soRef_0' }, - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, tags: ['foo'], throttle: null, updatedAt: '2019-02-12T21:01:22.479Z', @@ -1277,7 +1278,7 @@ describe('create()', () => { "parameterThatIsSavedObjectId": "9", }, "schedule": Object { - "interval": "10s", + "interval": "1m", }, "scheduledTaskId": "task-123", "updatedAt": 2019-02-12T21:01:22.479Z, @@ -1330,7 +1331,7 @@ describe('create()', () => { type: 'alert', attributes: { alertTypeId: '123', - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, params: { bar: true, parameterThatIsSavedObjectRef: 'action_0', @@ -1400,7 +1401,7 @@ describe('create()', () => { name: 'abc', notifyWhen: 'onActiveAlert', params: { bar: true, parameterThatIsSavedObjectRef: 'action_0' }, - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, tags: ['foo'], throttle: null, updatedAt: '2019-02-12T21:01:22.479Z', @@ -1443,7 +1444,7 @@ describe('create()', () => { "parameterThatIsSavedObjectId": "8", }, "schedule": Object { - "interval": "10s", + "interval": "1m", }, "scheduledTaskId": "task-123", "updatedAt": 2019-02-12T21:01:22.479Z, @@ -1495,7 +1496,7 @@ describe('create()', () => { const createdAttributes = { ...data, alertTypeId: '123', - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, params: { bar: true, }, @@ -1556,7 +1557,7 @@ describe('create()', () => { meta: { versionApiKeyLastmodified: kibanaVersion, }, - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, throttle: '10m', notifyWhen: 'onActionGroupChange', muteAll: false, @@ -1606,7 +1607,7 @@ describe('create()', () => { "bar": true, }, "schedule": Object { - "interval": "10s", + "interval": "1m", }, "scheduledTaskId": "task-123", "tags": Array [ @@ -1624,7 +1625,7 @@ describe('create()', () => { const createdAttributes = { ...data, alertTypeId: '123', - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, params: { bar: true, }, @@ -1685,7 +1686,7 @@ describe('create()', () => { meta: { versionApiKeyLastmodified: kibanaVersion, }, - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, throttle: '10m', notifyWhen: 'onThrottleInterval', muteAll: false, @@ -1735,7 +1736,7 @@ describe('create()', () => { "bar": true, }, "schedule": Object { - "interval": "10s", + "interval": "1m", }, "scheduledTaskId": "task-123", "tags": Array [ @@ -1753,7 +1754,7 @@ describe('create()', () => { const createdAttributes = { ...data, alertTypeId: '123', - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, params: { bar: true, }, @@ -1814,7 +1815,7 @@ describe('create()', () => { meta: { versionApiKeyLastmodified: kibanaVersion, }, - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, throttle: null, notifyWhen: 'onActiveAlert', muteAll: false, @@ -1864,7 +1865,7 @@ describe('create()', () => { "bar": true, }, "schedule": Object { - "interval": "10s", + "interval": "1m", }, "scheduledTaskId": "task-123", "tags": Array [ @@ -1953,7 +1954,7 @@ describe('create()', () => { type: 'alert', attributes: { alertTypeId: '123', - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, params: { bar: true, }, @@ -1999,7 +2000,7 @@ describe('create()', () => { type: 'alert', attributes: { alertTypeId: '123', - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, params: { bar: true, }, @@ -2043,7 +2044,7 @@ describe('create()', () => { type: 'alert', attributes: { alertTypeId: '123', - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, params: { bar: true, }, @@ -2099,7 +2100,7 @@ describe('create()', () => { type: 'alert', attributes: { alertTypeId: '123', - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, params: { bar: true, }, @@ -2166,7 +2167,7 @@ describe('create()', () => { meta: { versionApiKeyLastmodified: kibanaVersion, }, - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, throttle: null, notifyWhen: 'onActiveAlert', muteAll: false, @@ -2199,7 +2200,7 @@ describe('create()', () => { type: 'alert', attributes: { alertTypeId: '123', - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, params: { bar: true, }, @@ -2266,7 +2267,7 @@ describe('create()', () => { meta: { versionApiKeyLastmodified: kibanaVersion, }, - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, throttle: null, notifyWhen: 'onActiveAlert', muteAll: false, @@ -2340,7 +2341,7 @@ describe('create()', () => { expect(taskManager.schedule).not.toHaveBeenCalled(); }); - test('throws error when updating with an interval less than the minimum configured one', async () => { + test('throws error when creating with an interval less than the minimum configured one', async () => { ruleTypeRegistry.get.mockImplementation(() => ({ id: '123', name: 'Test', @@ -2351,16 +2352,15 @@ describe('create()', () => { isExportable: true, async executor() {}, producer: 'alerts', - minimumScheduleInterval: '5m', useSavedObjectReferences: { extractReferences: jest.fn(), injectReferences: jest.fn(), }, })); - const data = getMockData({ schedule: { interval: '1m' } }); + const data = getMockData({ schedule: { interval: '1s' } }); await expect(rulesClient.create({ data })).rejects.toThrowErrorMatchingInlineSnapshot( - `"Error updating rule: the interval is less than the minimum interval of 5m"` + `"Error creating rule: the interval is less than the allowed minimum interval of 1m"` ); expect(unsecuredSavedObjectsClient.create).not.toHaveBeenCalled(); expect(taskManager.schedule).not.toHaveBeenCalled(); diff --git a/x-pack/plugins/alerting/server/rules_client/tests/delete.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/delete.test.ts index cfb684f4241ee..7c595ba500e64 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/delete.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/delete.test.ts @@ -30,6 +30,7 @@ const rulesClientParams: jest.Mocked = { taskManager, ruleTypeRegistry, unsecuredSavedObjectsClient, + minimumScheduleInterval: '1m', authorization: authorization as unknown as AlertingAuthorization, actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, spaceId: 'default', diff --git a/x-pack/plugins/alerting/server/rules_client/tests/disable.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/disable.test.ts index afb67ef47c62f..0716cbf59b258 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/disable.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/disable.test.ts @@ -42,6 +42,7 @@ const rulesClientParams: jest.Mocked = { actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, spaceId: 'default', namespace: 'default', + minimumScheduleInterval: '1m', getUserName: jest.fn(), createAPIKey: jest.fn(), logger: loggingSystemMock.create().get(), diff --git a/x-pack/plugins/alerting/server/rules_client/tests/enable.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/enable.test.ts index c2826974fb8e8..af96097e41f07 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/enable.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/enable.test.ts @@ -36,6 +36,7 @@ const rulesClientParams: jest.Mocked = { actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, spaceId: 'default', namespace: 'default', + minimumScheduleInterval: '1m', getUserName: jest.fn(), createAPIKey: jest.fn(), logger: loggingSystemMock.create().get(), diff --git a/x-pack/plugins/alerting/server/rules_client/tests/find.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/find.test.ts index c0079d7787281..60aac3f266e78 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/find.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/find.test.ts @@ -38,6 +38,7 @@ const rulesClientParams: jest.Mocked = { actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, spaceId: 'default', namespace: 'default', + minimumScheduleInterval: '1m', getUserName: jest.fn(), createAPIKey: jest.fn(), logger: loggingSystemMock.create().get(), diff --git a/x-pack/plugins/alerting/server/rules_client/tests/get.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/get.test.ts index c704c3eec1241..dfdd44a38bca3 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/get.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/get.test.ts @@ -35,6 +35,7 @@ const rulesClientParams: jest.Mocked = { actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, spaceId: 'default', namespace: 'default', + minimumScheduleInterval: '1m', getUserName: jest.fn(), createAPIKey: jest.fn(), logger: loggingSystemMock.create().get(), diff --git a/x-pack/plugins/alerting/server/rules_client/tests/get_alert_state.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/get_alert_state.test.ts index 2bc355343ea89..18fa0278828ca 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/get_alert_state.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/get_alert_state.test.ts @@ -34,6 +34,7 @@ const rulesClientParams: jest.Mocked = { actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, spaceId: 'default', namespace: 'default', + minimumScheduleInterval: '1m', getUserName: jest.fn(), createAPIKey: jest.fn(), logger: loggingSystemMock.create().get(), diff --git a/x-pack/plugins/alerting/server/rules_client/tests/get_alert_summary.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/get_alert_summary.test.ts index 81d98eff0297a..4e6f627dcd4a6 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/get_alert_summary.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/get_alert_summary.test.ts @@ -40,6 +40,7 @@ const rulesClientParams: jest.Mocked = { actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, spaceId: 'default', namespace: 'default', + minimumScheduleInterval: '1m', getUserName: jest.fn(), createAPIKey: jest.fn(), logger: loggingSystemMock.create().get(), diff --git a/x-pack/plugins/alerting/server/rules_client/tests/list_alert_types.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/list_alert_types.test.ts index 3ef7cd6f4046e..3b4c07a775eab 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/list_alert_types.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/list_alert_types.test.ts @@ -38,6 +38,7 @@ const rulesClientParams: jest.Mocked = { actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, spaceId: 'default', namespace: 'default', + minimumScheduleInterval: '1m', getUserName: jest.fn(), createAPIKey: jest.fn(), logger: loggingSystemMock.create().get(), diff --git a/x-pack/plugins/alerting/server/rules_client/tests/mute_all.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/mute_all.test.ts index 76bc313bed024..17df0d655c5cc 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/mute_all.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/mute_all.test.ts @@ -34,6 +34,7 @@ const rulesClientParams: jest.Mocked = { actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, spaceId: 'default', namespace: 'default', + minimumScheduleInterval: '1m', getUserName: jest.fn(), createAPIKey: jest.fn(), logger: loggingSystemMock.create().get(), diff --git a/x-pack/plugins/alerting/server/rules_client/tests/mute_instance.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/mute_instance.test.ts index 4a77bfd38ef83..6122d794d064c 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/mute_instance.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/mute_instance.test.ts @@ -34,6 +34,7 @@ const rulesClientParams: jest.Mocked = { actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, spaceId: 'default', namespace: 'default', + minimumScheduleInterval: '1m', getUserName: jest.fn(), createAPIKey: jest.fn(), logger: loggingSystemMock.create().get(), diff --git a/x-pack/plugins/alerting/server/rules_client/tests/resolve.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/resolve.test.ts index bfa2a10189a05..dcd25f43ff611 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/resolve.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/resolve.test.ts @@ -35,6 +35,7 @@ const rulesClientParams: jest.Mocked = { actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, spaceId: 'default', namespace: 'default', + minimumScheduleInterval: '1m', getUserName: jest.fn(), createAPIKey: jest.fn(), logger: loggingSystemMock.create().get(), diff --git a/x-pack/plugins/alerting/server/rules_client/tests/unmute_all.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/unmute_all.test.ts index e05ea363452e8..794e86206b6d6 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/unmute_all.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/unmute_all.test.ts @@ -34,6 +34,7 @@ const rulesClientParams: jest.Mocked = { actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, spaceId: 'default', namespace: 'default', + minimumScheduleInterval: '1m', getUserName: jest.fn(), createAPIKey: jest.fn(), logger: loggingSystemMock.create().get(), diff --git a/x-pack/plugins/alerting/server/rules_client/tests/unmute_instance.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/unmute_instance.test.ts index fa228478a39d8..5c0a67f98b8c2 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/unmute_instance.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/unmute_instance.test.ts @@ -34,6 +34,7 @@ const rulesClientParams: jest.Mocked = { actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, spaceId: 'default', namespace: 'default', + minimumScheduleInterval: '1m', getUserName: jest.fn(), createAPIKey: jest.fn(), logger: loggingSystemMock.create().get(), diff --git a/x-pack/plugins/alerting/server/rules_client/tests/update.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/update.test.ts index f59b69c0b3fbf..1def4b7d60f4e 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/update.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/update.test.ts @@ -54,6 +54,7 @@ const rulesClientParams: jest.Mocked = { getEventLogClient: jest.fn(), kibanaVersion, auditLogger, + minimumScheduleInterval: '1m', }; beforeEach(() => { @@ -73,7 +74,7 @@ describe('update()', () => { enabled: true, tags: ['foo'], alertTypeId: 'myType', - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, consumer: 'myApp', scheduledTaskId: 'task-123', params: {}, @@ -139,7 +140,6 @@ describe('update()', () => { recoveryActionGroup: RecoveredActionGroup, async executor() {}, producer: 'alerts', - minimumScheduleInterval: '5s', }); }); @@ -182,7 +182,7 @@ describe('update()', () => { type: 'alert', attributes: { enabled: true, - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, params: { bar: true, }, @@ -247,7 +247,7 @@ describe('update()', () => { const result = await rulesClient.update({ id: '1', data: { - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, name: 'abc', tags: ['foo'], params: { @@ -316,7 +316,7 @@ describe('update()', () => { "bar": true, }, "schedule": Object { - "interval": "10s", + "interval": "1m", }, "scheduledTaskId": "task-123", "updatedAt": 2019-02-12T21:01:22.479Z, @@ -371,7 +371,7 @@ describe('update()', () => { "bar": true, }, "schedule": Object { - "interval": "10s", + "interval": "1m", }, "scheduledTaskId": "task-123", "tags": Array [ @@ -468,7 +468,7 @@ describe('update()', () => { type: 'alert', attributes: { enabled: true, - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, params: { bar: true, }, @@ -519,7 +519,7 @@ describe('update()', () => { const result = await rulesClient.update({ id: '1', data: { - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, name: 'abc', tags: ['foo'], params: { @@ -592,7 +592,7 @@ describe('update()', () => { name: 'abc', notifyWhen: 'onActiveAlert', params: { bar: true }, - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, scheduledTaskId: 'task-123', tags: ['foo'], throttle: null, @@ -643,7 +643,7 @@ describe('update()', () => { "bar": true, }, "schedule": Object { - "interval": "10s", + "interval": "1m", }, "scheduledTaskId": "task-123", "updatedAt": 2019-02-12T21:01:22.479Z, @@ -698,7 +698,7 @@ describe('update()', () => { type: 'alert', attributes: { enabled: true, - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, params: { bar: true, parameterThatIsSavedObjectRef: 'soRef_0', @@ -734,7 +734,7 @@ describe('update()', () => { const result = await rulesClient.update({ id: '1', data: { - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, name: 'abc', tags: ['foo'], params: ruleParams, @@ -768,7 +768,7 @@ describe('update()', () => { name: 'abc', notifyWhen: 'onActiveAlert', params: { bar: true, parameterThatIsSavedObjectRef: 'soRef_0' }, - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, scheduledTaskId: 'task-123', tags: ['foo'], throttle: null, @@ -814,7 +814,7 @@ describe('update()', () => { "parameterThatIsSavedObjectId": "9", }, "schedule": Object { - "interval": "10s", + "interval": "1m", }, "scheduledTaskId": "task-123", "updatedAt": 2019-02-12T21:01:22.479Z, @@ -832,7 +832,7 @@ describe('update()', () => { type: 'alert', attributes: { enabled: true, - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, params: { bar: true, }, @@ -882,7 +882,7 @@ describe('update()', () => { const result = await rulesClient.update({ id: '1', data: { - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, name: 'abc', tags: ['foo'], params: { @@ -922,7 +922,7 @@ describe('update()', () => { "bar": true, }, "schedule": Object { - "interval": "10s", + "interval": "1m", }, "scheduledTaskId": "task-123", "updatedAt": 2019-02-12T21:01:22.479Z, @@ -957,7 +957,7 @@ describe('update()', () => { "bar": true, }, "schedule": Object { - "interval": "10s", + "interval": "1m", }, "scheduledTaskId": "task-123", "tags": Array [ @@ -997,7 +997,7 @@ describe('update()', () => { type: 'alert', attributes: { enabled: false, - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, params: { bar: true, }, @@ -1038,7 +1038,7 @@ describe('update()', () => { const result = await rulesClient.update({ id: '1', data: { - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, name: 'abc', tags: ['foo'], params: { @@ -1079,7 +1079,7 @@ describe('update()', () => { "bar": true, }, "schedule": Object { - "interval": "10s", + "interval": "1m", }, "scheduledTaskId": "task-123", "updatedAt": 2019-02-12T21:01:22.479Z, @@ -1114,7 +1114,7 @@ describe('update()', () => { "bar": true, }, "schedule": Object { - "interval": "10s", + "interval": "1m", }, "scheduledTaskId": "task-123", "tags": Array [ @@ -1150,7 +1150,7 @@ describe('update()', () => { await rulesClient.update({ id: '1', data: { - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, name: 'abc', tags: ['foo'], params: { @@ -1209,7 +1209,7 @@ describe('update()', () => { rulesClient.update({ id: '1', data: { - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, name: 'abc', tags: ['foo'], params: { @@ -1240,7 +1240,7 @@ describe('update()', () => { attributes: { enabled: false, name: ' my alert name ', - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, params: { bar: true, }, @@ -1284,7 +1284,7 @@ describe('update()', () => { type: 'alert', attributes: { enabled: true, - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, params: { bar: true, }, @@ -1312,7 +1312,7 @@ describe('update()', () => { await rulesClient.update({ id: '1', data: { - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, name: 'abc', tags: ['foo'], params: { @@ -1376,7 +1376,7 @@ describe('update()', () => { type: 'alert', attributes: { enabled: true, - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, params: { bar: true, }, @@ -1431,7 +1431,7 @@ describe('update()', () => { await rulesClient.update({ id: '1', data: { - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, name: 'abc', tags: ['foo'], params: { @@ -1480,7 +1480,7 @@ describe('update()', () => { rulesClient.update({ id: '1', data: { - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, name: 'abc', tags: ['foo'], params: { @@ -1585,12 +1585,12 @@ describe('update()', () => { const alertId = uuid.v4(); const taskId = uuid.v4(); - mockApiCalls(alertId, taskId, { interval: '60m' }, { interval: '10s' }); + mockApiCalls(alertId, taskId, { interval: '60m' }, { interval: '1m' }); await rulesClient.update({ id: alertId, data: { - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, name: 'abc', tags: ['foo'], params: { @@ -1617,12 +1617,12 @@ describe('update()', () => { const alertId = uuid.v4(); const taskId = uuid.v4(); - mockApiCalls(alertId, taskId, { interval: '10s' }, { interval: '10s' }); + mockApiCalls(alertId, taskId, { interval: '1m' }, { interval: '1m' }); await rulesClient.update({ id: alertId, data: { - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, name: 'abc', tags: ['foo'], params: { @@ -1649,7 +1649,7 @@ describe('update()', () => { const alertId = uuid.v4(); const taskId = uuid.v4(); - mockApiCalls(alertId, taskId, { interval: '10s' }, { interval: '30s' }); + mockApiCalls(alertId, taskId, { interval: '1m' }, { interval: '30s' }); const resolveAfterAlertUpdatedCompletes = resolvable<{ id: string }>(); @@ -1659,7 +1659,7 @@ describe('update()', () => { await rulesClient.update({ id: alertId, data: { - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, name: 'abc', tags: ['foo'], params: { @@ -1687,7 +1687,7 @@ describe('update()', () => { const alertId = uuid.v4(); const taskId = uuid.v4(); - mockApiCalls(alertId, taskId, { interval: '10s' }, { interval: '30s' }); + mockApiCalls(alertId, taskId, { interval: '1m' }, { interval: '30s' }); taskManager.runNow.mockReset(); taskManager.runNow.mockRejectedValue(new Error('Failed to run alert')); @@ -1695,7 +1695,7 @@ describe('update()', () => { await rulesClient.update({ id: alertId, data: { - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, name: 'abc', tags: ['foo'], params: { @@ -1763,7 +1763,7 @@ describe('update()', () => { rulesClient.update({ id: '1', data: { - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, name: 'abc', tags: ['foo'], params: { @@ -1801,6 +1801,51 @@ describe('update()', () => { expect(taskManager.schedule).not.toHaveBeenCalled(); }); + test('throws error when updating with an interval less than the minimum configured one', async () => { + await expect( + rulesClient.update({ + id: '1', + data: { + schedule: { interval: '1s' }, + name: 'abc', + tags: ['foo'], + params: { + bar: true, + }, + throttle: null, + notifyWhen: 'onActiveAlert', + actions: [ + { + group: 'default', + id: '1', + params: { + foo: true, + }, + }, + { + group: 'default', + id: '1', + params: { + foo: true, + }, + }, + { + group: 'default', + id: '2', + params: { + foo: true, + }, + }, + ], + }, + }) + ).rejects.toThrowErrorMatchingInlineSnapshot( + `"Error updating rule: the interval is less than the allowed minimum interval of 1m"` + ); + expect(unsecuredSavedObjectsClient.create).not.toHaveBeenCalled(); + expect(taskManager.schedule).not.toHaveBeenCalled(); + }); + describe('authorization', () => { beforeEach(() => { unsecuredSavedObjectsClient.create.mockResolvedValueOnce({ @@ -1810,7 +1855,7 @@ describe('update()', () => { alertTypeId: 'myType', consumer: 'myApp', enabled: true, - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, params: { bar: true, }, @@ -1827,7 +1872,7 @@ describe('update()', () => { await rulesClient.update({ id: '1', data: { - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, name: 'abc', tags: ['foo'], params: { @@ -1856,7 +1901,7 @@ describe('update()', () => { rulesClient.update({ id: '1', data: { - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, name: 'abc', tags: ['foo'], params: { @@ -1887,7 +1932,7 @@ describe('update()', () => { type: 'alert', attributes: { enabled: true, - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, params: { bar: true, }, @@ -1904,7 +1949,7 @@ describe('update()', () => { await rulesClient.update({ id: '1', data: { - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, name: 'abc', tags: ['foo'], params: { @@ -1934,7 +1979,7 @@ describe('update()', () => { rulesClient.update({ id: '1', data: { - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, name: 'abc', tags: ['foo'], params: { @@ -1966,49 +2011,4 @@ describe('update()', () => { ); }); }); - - test('throws error when updating with an interval less than the minimum configured one', async () => { - await expect( - rulesClient.update({ - id: '1', - data: { - schedule: { interval: '1s' }, - name: 'abc', - tags: ['foo'], - params: { - bar: true, - }, - throttle: null, - notifyWhen: 'onActiveAlert', - actions: [ - { - group: 'default', - id: '1', - params: { - foo: true, - }, - }, - { - group: 'default', - id: '1', - params: { - foo: true, - }, - }, - { - group: 'default', - id: '2', - params: { - foo: true, - }, - }, - ], - }, - }) - ).rejects.toThrowErrorMatchingInlineSnapshot( - `"Error updating rule: the interval is less than the minimum interval of 5s"` - ); - expect(unsecuredSavedObjectsClient.create).not.toHaveBeenCalled(); - expect(taskManager.schedule).not.toHaveBeenCalled(); - }); }); diff --git a/x-pack/plugins/alerting/server/rules_client/tests/update_api_key.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/update_api_key.test.ts index 0b335a13d07e3..b60f0185e0b57 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/update_api_key.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/update_api_key.test.ts @@ -35,6 +35,7 @@ const rulesClientParams: jest.Mocked = { actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, spaceId: 'default', namespace: 'default', + minimumScheduleInterval: '1m', getUserName: jest.fn(), createAPIKey: jest.fn(), logger: loggingSystemMock.create().get(), diff --git a/x-pack/plugins/alerting/server/rules_client_conflict_retries.test.ts b/x-pack/plugins/alerting/server/rules_client_conflict_retries.test.ts index 0b35f250ba3c6..5e1bc99e9378e 100644 --- a/x-pack/plugins/alerting/server/rules_client_conflict_retries.test.ts +++ b/x-pack/plugins/alerting/server/rules_client_conflict_retries.test.ts @@ -52,6 +52,7 @@ const rulesClientParams: jest.Mocked = { getActionsClient: jest.fn(), getEventLogClient: jest.fn(), kibanaVersion, + minimumScheduleInterval: '1m', }; // this suite consists of two suites running tests against mutable RulesClient APIs: @@ -101,7 +102,7 @@ async function update(success: boolean) { await rulesClient.update({ id: MockAlertId, data: { - schedule: { interval: '5s' }, + schedule: { interval: '1m' }, name: 'cba', tags: ['bar'], params: { bar: true }, @@ -267,7 +268,7 @@ function setupRawAlertMocks( enabled: true, tags: ['foo'], alertTypeId: 'myType', - schedule: { interval: '10s' }, + schedule: { interval: '1m' }, consumer: 'myApp', scheduledTaskId: 'task-123', params: {}, diff --git a/x-pack/plugins/alerting/server/rules_client_factory.test.ts b/x-pack/plugins/alerting/server/rules_client_factory.test.ts index 76d09c3623e83..b59cff0f9986d 100644 --- a/x-pack/plugins/alerting/server/rules_client_factory.test.ts +++ b/x-pack/plugins/alerting/server/rules_client_factory.test.ts @@ -44,6 +44,7 @@ const rulesClientFactoryParams: jest.Mocked = { ruleTypeRegistry: ruleTypeRegistryMock.create(), getSpaceId: jest.fn(), spaceIdToNamespace: jest.fn(), + minimumScheduleInterval: '1m', encryptedSavedObjectsClient: encryptedSavedObjectsMock.createClient(), actions: actionsMock.createStart(), eventLog: eventLogMock.createStart(), @@ -119,6 +120,7 @@ test('creates an alerts client with proper constructor arguments when security i createAPIKey: expect.any(Function), encryptedSavedObjectsClient: rulesClientFactoryParams.encryptedSavedObjectsClient, kibanaVersion: '7.10.0', + minimumScheduleInterval: '1m', }); }); @@ -156,6 +158,7 @@ test('creates an alerts client with proper constructor arguments', async () => { getActionsClient: expect.any(Function), getEventLogClient: expect.any(Function), kibanaVersion: '7.10.0', + minimumScheduleInterval: '1m', }); }); diff --git a/x-pack/plugins/alerting/server/rules_client_factory.ts b/x-pack/plugins/alerting/server/rules_client_factory.ts index 1e9a021a0be51..919902339e78f 100644 --- a/x-pack/plugins/alerting/server/rules_client_factory.ts +++ b/x-pack/plugins/alerting/server/rules_client_factory.ts @@ -33,6 +33,7 @@ export interface RulesClientFactoryOpts { kibanaVersion: PluginInitializerContext['env']['packageInfo']['version']; authorization: AlertingAuthorizationClientFactory; eventLogger?: IEventLogger; + minimumScheduleInterval: string; } export class RulesClientFactory { @@ -50,6 +51,7 @@ export class RulesClientFactory { private kibanaVersion!: PluginInitializerContext['env']['packageInfo']['version']; private authorization!: AlertingAuthorizationClientFactory; private eventLogger?: IEventLogger; + private minimumScheduleInterval!: string; public initialize(options: RulesClientFactoryOpts) { if (this.isInitialized) { @@ -69,6 +71,7 @@ export class RulesClientFactory { this.kibanaVersion = options.kibanaVersion; this.authorization = options.authorization; this.eventLogger = options.eventLogger; + this.minimumScheduleInterval = options.minimumScheduleInterval; } public create(request: KibanaRequest, savedObjects: SavedObjectsServiceStart): RulesClient { @@ -85,6 +88,7 @@ export class RulesClientFactory { logger: this.logger, taskManager: this.taskManager, ruleTypeRegistry: this.ruleTypeRegistry, + minimumScheduleInterval: this.minimumScheduleInterval, unsecuredSavedObjectsClient: savedObjects.getScopedClient(request, { excludedWrappers: ['security'], includedHiddenTypes: ['alert', 'api_key_pending_invalidation'], diff --git a/x-pack/plugins/alerting/server/saved_objects/is_rule_exportable.test.ts b/x-pack/plugins/alerting/server/saved_objects/is_rule_exportable.test.ts index 1337c5a70979b..d2310c26c49d2 100644 --- a/x-pack/plugins/alerting/server/saved_objects/is_rule_exportable.test.ts +++ b/x-pack/plugins/alerting/server/saved_objects/is_rule_exportable.test.ts @@ -28,6 +28,7 @@ beforeEach(() => { taskRunnerFactory: new TaskRunnerFactory(), licenseState: mockedLicenseState, licensing: licensingMock.createSetup(), + minimumScheduleInterval: '1m', }; }); diff --git a/x-pack/plugins/alerting/server/types.ts b/x-pack/plugins/alerting/server/types.ts index b2818c670f037..95c1a07e241b2 100644 --- a/x-pack/plugins/alerting/server/types.ts +++ b/x-pack/plugins/alerting/server/types.ts @@ -170,7 +170,6 @@ export interface RuleType< }; isExportable: boolean; defaultScheduleInterval?: string; - minimumScheduleInterval?: string; ruleTaskTimeout?: string; cancelAlertsOnRuleTimeout?: boolean; doesSetRecoveryContext?: boolean; diff --git a/x-pack/plugins/monitoring/public/alerts/alert_form.test.tsx b/x-pack/plugins/monitoring/public/alerts/alert_form.test.tsx index 9f06b452b9a18..5effe649bf21a 100644 --- a/x-pack/plugins/monitoring/public/alerts/alert_form.test.tsx +++ b/x-pack/plugins/monitoring/public/alerts/alert_form.test.tsx @@ -135,8 +135,9 @@ describe('alert_form', () => { {}} - errors={{ name: [], interval: [] }} + errors={{ name: [], 'schedule.interval': [] }} operation="create" actionTypeRegistry={actionTypeRegistry} ruleTypeRegistry={ruleTypeRegistry} diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index c10f30068bfb3..b0c005bb3285b 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -6727,7 +6727,6 @@ "xpack.alerting.ruleTypeRegistry.register.customRecoveryActionGroupUsageError": "ルールタイプ[id=\"{id}\"]を登録できません。アクショングループ [{actionGroup}] は、復元とアクティブなアクショングループの両方として使用できません。", "xpack.alerting.ruleTypeRegistry.register.duplicateRuleTypeError": "ルールタイプ\"{id}\"はすでに登録されています。", "xpack.alerting.ruleTypeRegistry.register.invalidDefaultTimeoutRuleTypeError": "ルールタイプ\"{id}\"のデフォルト間隔が無効です:{errorMessage}。", - "xpack.alerting.ruleTypeRegistry.register.invalidMinimumTimeoutRuleTypeError": "ルールタイプ\"{id}\"の最低間隔が無効です:{errorMessage}。", "xpack.alerting.ruleTypeRegistry.register.invalidTimeoutRuleTypeError": "ルールタイプ\"{id}\"のタイムアウトが無効です:{errorMessage}。", "xpack.alerting.savedObjects.goToRulesButtonText": "ルールに移動", "xpack.alerting.savedObjects.onImportText": "インポート後に、{rulesSavedObjectsLength} {rulesSavedObjectsLength, plural, other {ルール}}を有効にする必要があります。", @@ -28090,7 +28089,6 @@ "xpack.triggersActionsUI.sections.ruleForm.conditions.removeConditionLabel": "削除", "xpack.triggersActionsUI.sections.ruleForm.conditions.title": "条件:", "xpack.triggersActionsUI.sections.ruleForm.documentationLabel": "ドキュメント", - "xpack.triggersActionsUI.sections.ruleForm.error.belowMinimumText": "間隔はこのルールタイプの最小値({minimum})未満です", "xpack.triggersActionsUI.sections.ruleForm.error.noAuthorizedRuleTypes": "ルールを{operation}するには、適切な権限が付与されている必要があります。", "xpack.triggersActionsUI.sections.ruleForm.error.noAuthorizedRuleTypesTitle": "ルールタイプを{operation}する権限がありません。", "xpack.triggersActionsUI.sections.ruleForm.error.requiredActionConnector": "{actionTypeId}コネクターのアクションが必要です。", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 6cd78eb4cac68..5394701a744ea 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -6738,7 +6738,6 @@ "xpack.alerting.ruleTypeRegistry.register.customRecoveryActionGroupUsageError": "无法注册规则类型 [id=\"{id}\"]。操作组 [{actionGroup}] 无法同时用作恢复和活动操作组。", "xpack.alerting.ruleTypeRegistry.register.duplicateRuleTypeError": "已注册规则类型“{id}”。", "xpack.alerting.ruleTypeRegistry.register.invalidDefaultTimeoutRuleTypeError": "规则类型“{id}”的默认时间间隔无效:{errorMessage}。", - "xpack.alerting.ruleTypeRegistry.register.invalidMinimumTimeoutRuleTypeError": "规则类型“{id}”的最小时间间隔无效:{errorMessage}。", "xpack.alerting.ruleTypeRegistry.register.invalidTimeoutRuleTypeError": "规则类型“{id}”的超时无效:{errorMessage}。", "xpack.alerting.ruleTypeRegistry.register.reservedActionGroupUsageError": "无法注册规则类型 [id=\"{id}\"]。操作组 [{actionGroups}] 由框架保留。", "xpack.alerting.savedObjects.goToRulesButtonText": "前往规则", @@ -28122,7 +28121,6 @@ "xpack.triggersActionsUI.sections.ruleForm.conditions.removeConditionLabel": "移除", "xpack.triggersActionsUI.sections.ruleForm.conditions.title": "条件:", "xpack.triggersActionsUI.sections.ruleForm.documentationLabel": "文档", - "xpack.triggersActionsUI.sections.ruleForm.error.belowMinimumText": "时间间隔小于此规则类型的最小值 ({minimum})", "xpack.triggersActionsUI.sections.ruleForm.error.noAuthorizedRuleTypes": "为了{operation}规则,您需要获得相应的权限。", "xpack.triggersActionsUI.sections.ruleForm.error.noAuthorizedRuleTypesTitle": "您尚无权{operation}任何规则类型", "xpack.triggersActionsUI.sections.ruleForm.error.requiredActionConnector": "“{actionTypeId} 连接器的操作”必填。", diff --git a/x-pack/plugins/triggers_actions_ui/common/index.ts b/x-pack/plugins/triggers_actions_ui/common/index.ts index 4989b98e5a555..560d045c0bb47 100644 --- a/x-pack/plugins/triggers_actions_ui/common/index.ts +++ b/x-pack/plugins/triggers_actions_ui/common/index.ts @@ -9,3 +9,4 @@ /* eslint-disable @kbn/eslint/no_export_all */ export * from './data'; +export const BASE_TRIGGERS_ACTIONS_UI_API_PATH = '/api/triggers_actions_ui'; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/value_validators.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/value_validators.test.ts index 2e8c8b00ced42..162cb222b78fe 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/value_validators.test.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/value_validators.test.ts @@ -180,6 +180,28 @@ describe('getRuleWithInvalidatedFields', () => { expect(rule.ruleTypeId).toBeNull(); }); + test('handles undefined fields with dot notation', () => { + const rule: Rule = { + params: {}, + consumer: 'test', + schedule: { + interval: undefined, + }, + actions: [], + tags: [], + muteAll: false, + enabled: false, + mutedInstanceIds: [], + } as any; + const baseAlertErrors = { + 'schedule.interval': ['Interval is required.'], + }; + const actionsErrors: IErrorObject[] = []; + const paramsErrors = {}; + getRuleWithInvalidatedFields(rule, paramsErrors, baseAlertErrors, actionsErrors); + expect(rule.schedule.interval).toBeNull(); + }); + test('does not set to null any fields that are required and defined but invalid in rule', () => { const rule: Rule = { name: 'test', @@ -202,6 +224,28 @@ describe('getRuleWithInvalidatedFields', () => { expect(rule.consumer).toEqual('@@@@'); }); + test('handles defined but invalid fields with dot notation', () => { + const rule: Rule = { + params: {}, + consumer: 'test', + schedule: { + interval: '1s', + }, + actions: [], + tags: [], + muteAll: false, + enabled: false, + mutedInstanceIds: [], + } as any; + const baseAlertErrors = { + 'schedule.interval': ['Interval is too short.'], + }; + const actionsErrors: IErrorObject[] = []; + const paramsErrors = {}; + getRuleWithInvalidatedFields(rule, paramsErrors, baseAlertErrors, actionsErrors); + expect(rule.schedule.interval).toEqual('1s'); + }); + test('set to null all fields that are required but undefined in rule params', () => { const rule: Rule = { name: 'test', diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_add.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_add.test.tsx index 01e459011f26b..2b34cc80ddb89 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_add.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_add.test.tsx @@ -39,6 +39,10 @@ jest.mock('../../lib/rule_api', () => ({ })), })); +jest.mock('../../../common/lib/config_api', () => ({ + triggersActionsUiConfig: jest.fn().mockResolvedValue({ minimumScheduleInterval: '1m' }), +})); + jest.mock('../../../common/lib/health_api', () => ({ triggersActionsUiHealth: jest.fn(() => ({ isRulesAvailable: true })), })); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_add.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_add.tsx index 98b7bfd36452c..2854e652e769e 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_add.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_add.tsx @@ -18,6 +18,7 @@ import { IErrorObject, RuleAddProps, RuleTypeIndex, + TriggersActionsUiConfig, } from '../../../types'; import { RuleForm } from './rule_form'; import { getRuleActionErrors, getRuleErrors, isValidRule } from './rule_errors'; @@ -33,6 +34,7 @@ import { useKibana } from '../../../common/lib/kibana'; import { hasRuleChanged, haveRuleParamsChanged } from './has_rule_changed'; import { getRuleWithInvalidatedFields } from '../../lib/value_validators'; import { DEFAULT_ALERT_INTERVAL } from '../../constants'; +import { triggersActionsUiConfig } from '../../../common/lib/config_api'; const RuleAdd = ({ consumer, @@ -67,6 +69,7 @@ const RuleAdd = ({ const [{ rule }, dispatch] = useReducer(ruleReducer as InitialRuleReducer, { rule: initialRule, }); + const [config, setConfig] = useState({}); const [initialRuleParams, setInitialRuleParams] = useState({}); const [isSaving, setIsSaving] = useState(false); const [isConfirmRuleSaveModalOpen, setIsConfirmRuleSaveModalOpen] = useState(false); @@ -92,6 +95,12 @@ const RuleAdd = ({ const canShowActions = hasShowActionsCapability(capabilities); + useEffect(() => { + (async () => { + setConfig(await triggersActionsUiConfig({ http })); + })(); + }, [http]); + useEffect(() => { if (ruleTypeId) { setRuleProperty('ruleTypeId', ruleTypeId); @@ -178,7 +187,7 @@ const RuleAdd = ({ const { ruleBaseErrors, ruleErrors, ruleParamsErrors } = getRuleErrors( rule as Rule, ruleType, - rule.ruleTypeId ? ruleTypeIndex?.get(rule.ruleTypeId) : undefined + config ); // Confirm before saving if user is able to add actions but hasn't added any to this rule @@ -230,6 +239,7 @@ const RuleAdd = ({ ({ })), })); +jest.mock('../../../common/lib/config_api', () => ({ + triggersActionsUiConfig: jest.fn().mockResolvedValue({ minimumScheduleInterval: '1m' }), +})); + jest.mock('./rule_errors', () => ({ getRuleActionErrors: jest.fn().mockImplementation(() => { return []; @@ -44,7 +48,7 @@ jest.mock('./rule_errors', () => ({ ruleBaseErrors: {}, ruleErrors: { name: new Array(), - interval: new Array(), + 'schedule.interval': new Array(), ruleTypeId: new Array(), actionConnectors: new Array(), }, @@ -220,11 +224,11 @@ describe('rule_edit', () => { ); }); - it('should pass in the server rule type into `getRuleErrors`', async () => { + it('should pass in the config into `getRuleErrors`', async () => { const { getRuleErrors } = jest.requireMock('./rule_errors'); await setup(); const lastCall = getRuleErrors.mock.calls[getRuleErrors.mock.calls.length - 1]; expect(lastCall[2]).toBeDefined(); - expect(lastCall[2].id).toBe('my-rule-type'); + expect(lastCall[2]).toEqual({ minimumScheduleInterval: '1m' }); }); }); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_edit.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_edit.tsx index e2aaa21d5ba68..289db888d6d03 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_edit.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_edit.tsx @@ -24,7 +24,14 @@ import { } from '@elastic/eui'; import { cloneDeep } from 'lodash'; import { i18n } from '@kbn/i18n'; -import { Rule, RuleFlyoutCloseReason, RuleEditProps, IErrorObject, RuleType } from '../../../types'; +import { + Rule, + RuleFlyoutCloseReason, + RuleEditProps, + IErrorObject, + RuleType, + TriggersActionsUiConfig, +} from '../../../types'; import { RuleForm } from './rule_form'; import { getRuleActionErrors, getRuleErrors, isValidRule } from './rule_errors'; import { ruleReducer, ConcreteRuleReducer } from './rule_reducer'; @@ -35,6 +42,7 @@ import { useKibana } from '../../../common/lib/kibana'; import { ConfirmRuleClose } from './confirm_rule_close'; import { hasRuleChanged } from './has_rule_changed'; import { getRuleWithInvalidatedFields } from '../../lib/value_validators'; +import { triggersActionsUiConfig } from '../../../common/lib/config_api'; export const RuleEdit = ({ initialRule, @@ -60,6 +68,7 @@ export const RuleEdit = ({ const [serverRuleType, setServerRuleType] = useState | undefined>( props.ruleType ); + const [config, setConfig] = useState({}); const { http, @@ -71,6 +80,12 @@ export const RuleEdit = ({ const ruleType = ruleTypeRegistry.get(rule.ruleTypeId); + useEffect(() => { + (async () => { + setConfig(await triggersActionsUiConfig({ http })); + })(); + }, [http]); + useEffect(() => { (async () => { setIsLoading(true); @@ -96,7 +111,7 @@ export const RuleEdit = ({ const { ruleBaseErrors, ruleErrors, ruleParamsErrors } = getRuleErrors( rule as Rule, ruleType, - serverRuleType + config ); const checkForChangesAndCloseFlyout = () => { @@ -178,6 +193,7 @@ export const RuleEdit = ({ )} { describe('validateBaseProperties()', () => { it('should validate the name', () => { const rule = mockRule(); rule.name = ''; - const result = validateBaseProperties(rule); + const result = validateBaseProperties(rule, config); expect(result.errors).toStrictEqual({ name: ['Name is required.'], - interval: [], + 'schedule.interval': [], ruleTypeId: [], actionConnectors: [], }); @@ -34,10 +35,10 @@ describe('rule_errors', () => { it('should validate the interval', () => { const rule = mockRule(); rule.schedule.interval = ''; - const result = validateBaseProperties(rule); + const result = validateBaseProperties(rule, config); expect(result.errors).toStrictEqual({ name: [], - interval: ['Check interval is required.'], + 'schedule.interval': ['Check interval is required.'], ruleTypeId: [], actionConnectors: [], }); @@ -45,14 +46,11 @@ describe('rule_errors', () => { it('should validate the minimumScheduleInterval', () => { const rule = mockRule(); - rule.schedule.interval = '2m'; - const result = validateBaseProperties( - rule, - mockserverRuleType({ minimumScheduleInterval: '5m' }) - ); + rule.schedule.interval = '2s'; + const result = validateBaseProperties(rule, config); expect(result.errors).toStrictEqual({ name: [], - interval: ['Interval is below minimum (5m) for this rule type'], + 'schedule.interval': ['Interval must be at least 1 minute.'], ruleTypeId: [], actionConnectors: [], }); @@ -61,10 +59,10 @@ describe('rule_errors', () => { it('should validate the ruleTypeId', () => { const rule = mockRule(); rule.ruleTypeId = ''; - const result = validateBaseProperties(rule); + const result = validateBaseProperties(rule, config); expect(result.errors).toStrictEqual({ name: [], - interval: [], + 'schedule.interval': [], ruleTypeId: ['Rule type is required.'], actionConnectors: [], }); @@ -82,10 +80,10 @@ describe('rule_errors', () => { }, }, ]; - const result = validateBaseProperties(rule); + const result = validateBaseProperties(rule, config); expect(result.errors).toStrictEqual({ name: [], - interval: [], + 'schedule.interval': [], ruleTypeId: [], actionConnectors: ['Action for myActionType connector is required.'], }); @@ -105,20 +103,20 @@ describe('rule_errors', () => { }, }), }), - mockserverRuleType() + config ); expect(result).toStrictEqual({ ruleParamsErrors: { field: ['This is wrong'] }, ruleBaseErrors: { name: ['Name is required.'], - interval: [], + 'schedule.interval': [], ruleTypeId: [], actionConnectors: [], }, ruleErrors: { name: ['Name is required.'], field: ['This is wrong'], - interval: [], + 'schedule.interval': [], ruleTypeId: [], actionConnectors: [], }, @@ -217,31 +215,6 @@ describe('rule_errors', () => { }); }); -function mockserverRuleType( - overloads: Partial> = {} -): RuleType { - return { - actionGroups: [], - defaultActionGroupId: 'default', - minimumLicenseRequired: 'basic', - recoveryActionGroup: { - id: 'recovery', - name: 'doRecovery', - }, - id: 'myAppRuleType', - name: 'myAppRuleType', - producer: 'myApp', - authorizedConsumers: {}, - enabledInLicense: true, - actionVariables: { - context: [], - state: [], - params: [], - }, - ...overloads, - }; -} - function mockRuleTypeModel(overloads: Partial = {}): RuleTypeModel { return { id: 'ruleTypeModel', diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_errors.ts b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_errors.ts index 86a6b025941f5..d8bcb49ad86de 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_errors.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_errors.ts @@ -6,26 +6,26 @@ */ import { isObject } from 'lodash'; import { i18n } from '@kbn/i18n'; -import { parseDuration } from '../../../../../alerting/common/parse_duration'; +import { formatDuration, parseDuration } from '../../../../../alerting/common/parse_duration'; import { RuleTypeModel, Rule, IErrorObject, RuleAction, - RuleType, ValidationResult, ActionTypeRegistryContract, + TriggersActionsUiConfig, } from '../../../types'; import { InitialRule } from './rule_reducer'; export function validateBaseProperties( ruleObject: InitialRule, - serverRuleType?: RuleType + config: TriggersActionsUiConfig ): ValidationResult { const validationResult = { errors: {} }; const errors = { name: new Array(), - interval: new Array(), + 'schedule.interval': new Array(), ruleTypeId: new Array(), actionConnectors: new Array(), }; @@ -38,20 +38,20 @@ export function validateBaseProperties( ); } if (ruleObject.schedule.interval.length < 2) { - errors.interval.push( + errors['schedule.interval'].push( i18n.translate('xpack.triggersActionsUI.sections.ruleForm.error.requiredIntervalText', { defaultMessage: 'Check interval is required.', }) ); - } else if (serverRuleType?.minimumScheduleInterval) { + } else if (config.minimumScheduleInterval) { const duration = parseDuration(ruleObject.schedule.interval); - const minimumDuration = parseDuration(serverRuleType.minimumScheduleInterval); + const minimumDuration = parseDuration(config.minimumScheduleInterval); if (duration < minimumDuration) { - errors.interval.push( + errors['schedule.interval'].push( i18n.translate('xpack.triggersActionsUI.sections.ruleForm.error.belowMinimumText', { - defaultMessage: 'Interval is below minimum ({minimum}) for this rule type', + defaultMessage: 'Interval must be at least {minimum}.', values: { - minimum: serverRuleType.minimumScheduleInterval, + minimum: formatDuration(config.minimumScheduleInterval, true), }, }) ); @@ -82,12 +82,12 @@ export function validateBaseProperties( export function getRuleErrors( rule: Rule, ruleTypeModel: RuleTypeModel | null, - serverRuleType?: RuleType + config: TriggersActionsUiConfig ) { const ruleParamsErrors: IErrorObject = ruleTypeModel ? ruleTypeModel.validate(rule.params).errors : []; - const ruleBaseErrors = validateBaseProperties(rule, serverRuleType).errors as IErrorObject; + const ruleBaseErrors = validateBaseProperties(rule, config).errors as IErrorObject; const ruleErrors = { ...ruleParamsErrors, ...ruleBaseErrors, diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_form.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_form.test.tsx index bda5d27ed54ad..39b4e77b1eace 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_form.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_form.test.tsx @@ -185,8 +185,9 @@ describe('rule_form', () => { wrapper = mountWithIntl( {}} - errors={{ name: [], interval: [], ruleTypeId: [] }} + errors={{ name: [], 'schedule.interval': [], ruleTypeId: [] }} operation="create" actionTypeRegistry={actionTypeRegistry} ruleTypeRegistry={ruleTypeRegistry} @@ -212,6 +213,13 @@ describe('rule_form', () => { expect(ruleTypeSelectOptions.exists()).toBeTruthy(); }); + it('renders minimum schedule interval', async () => { + await setup(); + expect(wrapper.find('[data-test-subj="intervalFormRow"]').first().prop('helpText')).toEqual( + `Interval must be at least 1 minute.` + ); + }); + it('does not render registered rule type which non editable', async () => { await setup(); const ruleTypeSelectOptions = wrapper.find( @@ -357,8 +365,9 @@ describe('rule_form', () => { wrapper = mountWithIntl( {}} - errors={{ name: [], interval: [], ruleTypeId: [] }} + errors={{ name: [], 'schedule.interval': [], ruleTypeId: [] }} operation="create" actionTypeRegistry={actionTypeRegistry} ruleTypeRegistry={ruleTypeRegistry} @@ -419,8 +428,9 @@ describe('rule_form', () => { wrapper = mountWithIntl( {}} - errors={{ name: [], interval: [], ruleTypeId: [] }} + errors={{ name: [], 'schedule.interval': [], ruleTypeId: [] }} operation="create" actionTypeRegistry={actionTypeRegistry} ruleTypeRegistry={ruleTypeRegistry} diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_form.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_form.tsx index c7a87aa1fec11..6ec6a93c34af2 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_form.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_form.tsx @@ -38,6 +38,7 @@ import { import { capitalize } from 'lodash'; import { KibanaFeature } from '../../../../../features/public'; import { + formatDuration, getDurationNumberInItsUnit, getDurationUnitValue, } from '../../../../../alerting/common/parse_duration'; @@ -52,6 +53,7 @@ import { RuleType, RuleTypeRegistryContract, ActionTypeRegistryContract, + TriggersActionsUiConfig, } from '../../../types'; import { getTimeOptions } from '../../../common/lib/get_time_options'; import { ActionForm } from '../action_connector_form'; @@ -83,6 +85,7 @@ function getProducerFeatureName(producer: string, kibanaFeatures: KibanaFeature[ interface RuleFormProps> { rule: InitialRule; + config: TriggersActionsUiConfig; dispatch: React.Dispatch; errors: IErrorObject; ruleTypeRegistry: RuleTypeRegistryContract; @@ -99,6 +102,7 @@ const defaultScheduleIntervalUnit = getDurationUnitValue(DEFAULT_ALERT_INTERVAL) export const RuleForm = ({ rule, + config, canChangeTrigger = true, dispatch, errors, @@ -586,7 +590,7 @@ export const RuleForm = ({ type="questionInCircle" content={i18n.translate('xpack.triggersActionsUI.sections.ruleForm.checkWithTooltip', { defaultMessage: - 'Define how often to evaluate the condition. Checks are queued; they run as close to the defined value as capacity allows.', + 'Define how often to evaluate the condition. Checks are queued; they run as close to the defined value as capacity allows. The xpack.alerting.minimumScheduleInterval setting defines the minimum value.', })} /> @@ -665,17 +669,28 @@ export const RuleForm = ({ 0 + ? '' + : i18n.translate('xpack.triggersActionsUI.sections.ruleForm.checkEveryHelpText', { + defaultMessage: 'Interval must be at least {minimum}.', + values: { + minimum: formatDuration(config.minimumScheduleInterval ?? '1m', true), + }, + }) + } label={labelForRuleChecked} - isInvalid={errors.interval.length > 0} - error={errors.interval} + isInvalid={errors['schedule.interval'].length > 0} + error={errors['schedule.interval']} > 0} + isInvalid={errors['schedule.interval'].length > 0} value={ruleInterval || ''} name="interval" data-test-subj="intervalInput" diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/rules_list.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/rules_list.test.tsx index adee7bd7a3c35..6d6afab22dae2 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/rules_list.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/rules_list.test.tsx @@ -38,6 +38,9 @@ jest.mock('../../../lib/rule_api', () => ({ jest.mock('../../../../common/lib/health_api', () => ({ triggersActionsUiHealth: jest.fn(() => ({ isRulesAvailable: true })), })); +jest.mock('../../../../common/lib/config_api', () => ({ + triggersActionsUiConfig: jest.fn().mockResolvedValue({ minimumScheduleInterval: '1m' }), +})); jest.mock('react-router-dom', () => ({ useHistory: () => ({ push: jest.fn(), diff --git a/x-pack/plugins/triggers_actions_ui/public/common/lib/config_api.test.ts b/x-pack/plugins/triggers_actions_ui/public/common/lib/config_api.test.ts new file mode 100644 index 0000000000000..28563730c3db7 --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/common/lib/config_api.test.ts @@ -0,0 +1,25 @@ +/* + * 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 { httpServiceMock } from 'src/core/public/mocks'; +import { triggersActionsUiConfig } from './config_api'; + +describe('triggersActionsUiConfig', () => { + const http = httpServiceMock.createStartContract(); + + test('should call triggersActionsUiConfig API', async () => { + const result = await triggersActionsUiConfig({ http }); + expect(result).toEqual(undefined); + expect(http.get.mock.calls).toMatchInlineSnapshot(` + Array [ + Array [ + "/api/triggers_actions_ui/_config", + ], + ] + `); + }); +}); diff --git a/x-pack/plugins/triggers_actions_ui/public/common/lib/config_api.ts b/x-pack/plugins/triggers_actions_ui/public/common/lib/config_api.ts new file mode 100644 index 0000000000000..aa0321ef8346b --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/common/lib/config_api.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 { HttpSetup } from 'kibana/public'; +import { BASE_TRIGGERS_ACTIONS_UI_API_PATH } from '../../../common'; + +export async function triggersActionsUiConfig({ http }: { http: HttpSetup }): Promise { + return await http.get(`${BASE_TRIGGERS_ACTIONS_UI_API_PATH}/_config`); +} diff --git a/x-pack/plugins/triggers_actions_ui/public/common/lib/health_api.ts b/x-pack/plugins/triggers_actions_ui/public/common/lib/health_api.ts index 247ac03cd9149..55db8164bae14 100644 --- a/x-pack/plugins/triggers_actions_ui/public/common/lib/health_api.ts +++ b/x-pack/plugins/triggers_actions_ui/public/common/lib/health_api.ts @@ -6,8 +6,7 @@ */ import { HttpSetup } from 'kibana/public'; - -const TRIGGERS_ACTIONS_UI_API_ROOT = '/api/triggers_actions_ui'; +import { BASE_TRIGGERS_ACTIONS_UI_API_PATH } from '../../../common'; interface TriggersActionsUiHealth { isRulesAvailable: boolean; @@ -23,7 +22,7 @@ export async function triggersActionsUiHealth({ http: HttpSetup; }): Promise { const result = await http.get( - `${TRIGGERS_ACTIONS_UI_API_ROOT}/_health` + `${BASE_TRIGGERS_ACTIONS_UI_API_PATH}/_health` ); if (result) { return { diff --git a/x-pack/plugins/triggers_actions_ui/public/types.ts b/x-pack/plugins/triggers_actions_ui/public/types.ts index ef2f02411de38..d4658c3e3f5a5 100644 --- a/x-pack/plugins/triggers_actions_ui/public/types.ts +++ b/x-pack/plugins/triggers_actions_ui/public/types.ts @@ -234,7 +234,6 @@ export interface RuleType< | 'defaultActionGroupId' | 'ruleTaskTimeout' | 'defaultScheduleInterval' - | 'minimumScheduleInterval' | 'doesSetRecoveryContext' > { actionVariables: ActionVariables; @@ -347,3 +346,7 @@ export enum Percentiles { P95 = 'P95', P99 = 'P99', } + +export interface TriggersActionsUiConfig { + minimumScheduleInterval?: string; +} diff --git a/x-pack/plugins/triggers_actions_ui/server/plugin.ts b/x-pack/plugins/triggers_actions_ui/server/plugin.ts index a5751c1a8abf0..c33ce21777782 100644 --- a/x-pack/plugins/triggers_actions_ui/server/plugin.ts +++ b/x-pack/plugins/triggers_actions_ui/server/plugin.ts @@ -6,19 +6,19 @@ */ import { Logger, Plugin, CoreSetup, PluginInitializerContext } from 'src/core/server'; -import { PluginSetupContract as AlertsPluginSetup } from '../../alerting/server'; +import { PluginSetupContract as AlertingPluginSetup } from '../../alerting/server'; import { EncryptedSavedObjectsPluginSetup } from '../../encrypted_saved_objects/server'; import { getService, register as registerDataService } from './data'; -import { createHealthRoute } from './routes/health'; +import { createHealthRoute, createConfigRoute } from './routes'; +import { BASE_TRIGGERS_ACTIONS_UI_API_PATH } from '../common'; -const BASE_ROUTE = '/api/triggers_actions_ui'; export interface PluginStartContract { data: ReturnType; } interface PluginsSetup { encryptedSavedObjects?: EncryptedSavedObjectsPluginSetup; - alerting?: AlertsPluginSetup; + alerting?: AlertingPluginSetup; } export class TriggersActionsPlugin implements Plugin { @@ -36,10 +36,21 @@ export class TriggersActionsPlugin implements Plugin logger: this.logger, data: this.data, router, - baseRoute: BASE_ROUTE, + baseRoute: BASE_TRIGGERS_ACTIONS_UI_API_PATH, }); - createHealthRoute(this.logger, router, BASE_ROUTE, plugins.alerting !== undefined); + createHealthRoute( + this.logger, + router, + BASE_TRIGGERS_ACTIONS_UI_API_PATH, + plugins.alerting !== undefined + ); + createConfigRoute( + this.logger, + router, + BASE_TRIGGERS_ACTIONS_UI_API_PATH, + plugins.alerting?.getConfig() + ); } public start(): PluginStartContract { diff --git a/x-pack/plugins/triggers_actions_ui/server/routes/config.test.ts b/x-pack/plugins/triggers_actions_ui/server/routes/config.test.ts new file mode 100644 index 0000000000000..a7e1772ddabc7 --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/server/routes/config.test.ts @@ -0,0 +1,30 @@ +/* + * 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 { httpServiceMock, httpServerMock, loggingSystemMock } from 'src/core/server/mocks'; +import { createConfigRoute } from './config'; + +describe('createConfigRoute', () => { + it('registers the route', async () => { + const router = httpServiceMock.createRouter(); + const logger = loggingSystemMock.create().get(); + createConfigRoute(logger, router, `/api/triggers_actions_ui`, { + minimumScheduleInterval: '1m', + }); + + const [config, handler] = router.get.mock.calls[0]; + expect(config.path).toMatchInlineSnapshot(`"/api/triggers_actions_ui/_config"`); + + const mockResponse = httpServerMock.createResponseFactory(); + await handler({}, httpServerMock.createKibanaRequest(), mockResponse); + + expect(mockResponse.ok).toBeCalled(); + expect(mockResponse.ok.mock.calls[0][0]).toEqual({ + body: { minimumScheduleInterval: '1m' }, + }); + }); +}); diff --git a/x-pack/plugins/triggers_actions_ui/server/routes/config.ts b/x-pack/plugins/triggers_actions_ui/server/routes/config.ts new file mode 100644 index 0000000000000..d10651c4c252a --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/server/routes/config.ts @@ -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 { + IRouter, + RequestHandlerContext, + KibanaRequest, + IKibanaResponse, + KibanaResponseFactory, +} from 'kibana/server'; +import { Logger } from '../../../../../src/core/server'; +import { PublicAlertingConfig } from '../../../alerting/server'; + +export function createConfigRoute( + logger: Logger, + router: IRouter, + baseRoute: string, + config?: PublicAlertingConfig +) { + const path = `${baseRoute}/_config`; + logger.debug(`registering triggers_actions_ui config route GET ${path}`); + router.get( + { + path, + validate: false, + }, + handler + ); + async function handler( + ctx: RequestHandlerContext, + req: KibanaRequest, + res: KibanaResponseFactory + ): Promise { + return res.ok({ body: config ?? {} }); + } +} diff --git a/x-pack/plugins/triggers_actions_ui/server/routes/index.ts b/x-pack/plugins/triggers_actions_ui/server/routes/index.ts new file mode 100644 index 0000000000000..145b72ebb34fb --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/server/routes/index.ts @@ -0,0 +1,8 @@ +/* + * 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. + */ +export { createHealthRoute } from './health'; +export { createConfigRoute } from './config'; diff --git a/x-pack/test/alerting_api_integration/common/config.ts b/x-pack/test/alerting_api_integration/common/config.ts index 7bcec7b11c10e..094857cfaf32c 100644 --- a/x-pack/test/alerting_api_integration/common/config.ts +++ b/x-pack/test/alerting_api_integration/common/config.ts @@ -161,6 +161,7 @@ export function createTestConfig(name: string, options: CreateTestConfigOptions) '--xpack.encryptedSavedObjects.encryptionKey="wuGNaIhoMpk5sO4UBxgr3NyW1sFcLgIf"', '--xpack.alerting.invalidateApiKeysTask.interval="15s"', '--xpack.alerting.healthCheck.interval="1s"', + '--xpack.alerting.minimumScheduleInterval="1s"', `--xpack.actions.enabledActionTypes=${JSON.stringify(enabledActionTypes)}`, `--xpack.actions.rejectUnauthorized=${rejectUnauthorized}`, `--xpack.actions.microsoftGraphApiUrl=${servers.kibana.protocol}://${servers.kibana.hostname}:${servers.kibana.port}/api/_actions-FTS-external-service-simulators/exchange/users/test@/sendMail`, diff --git a/x-pack/test/functional_execution_context/config.ts b/x-pack/test/functional_execution_context/config.ts index a934b6e763437..e11f345ceaf77 100644 --- a/x-pack/test/functional_execution_context/config.ts +++ b/x-pack/test/functional_execution_context/config.ts @@ -58,6 +58,7 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { '--logging.loggers[2].name=http.server.response', '--logging.loggers[2].level=all', `--logging.loggers[2].appenders=${JSON.stringify(['file'])}`, + `--xpack.alerting.minimumScheduleInterval="1s"`, ], }, }; diff --git a/x-pack/test/functional_with_es_ssl/config.ts b/x-pack/test/functional_with_es_ssl/config.ts index b8010c089ad03..e180259fa55f3 100644 --- a/x-pack/test/functional_with_es_ssl/config.ts +++ b/x-pack/test/functional_with_es_ssl/config.ts @@ -66,6 +66,7 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { `--elasticsearch.hosts=https://${servers.elasticsearch.hostname}:${servers.elasticsearch.port}`, `--elasticsearch.ssl.certificateAuthorities=${CA_CERT_PATH}`, `--plugin-path=${join(__dirname, 'fixtures', 'plugins', 'alerts')}`, + `--xpack.alerting.minimumScheduleInterval="1s"`, `--xpack.actions.enabledActionTypes=${JSON.stringify(enabledActionTypes)}`, `--xpack.actions.preconfiguredAlertHistoryEsIndex=false`, `--xpack.actions.preconfigured=${JSON.stringify({ diff --git a/x-pack/test/rule_registry/common/config.ts b/x-pack/test/rule_registry/common/config.ts index 6b920a6f5dbf2..51058edcb303f 100644 --- a/x-pack/test/rule_registry/common/config.ts +++ b/x-pack/test/rule_registry/common/config.ts @@ -78,6 +78,7 @@ export function createTestConfig(name: string, options: CreateTestConfigOptions) ...xPackApiIntegrationTestsConfig.get('kbnTestServer.serverArgs'), `--xpack.actions.allowedHosts=${JSON.stringify(['localhost', 'some.non.existent.com'])}`, `--xpack.actions.enabledActionTypes=${JSON.stringify(enabledActionTypes)}`, + `--xpack.alerting.minimumScheduleInterval="1s"`, '--xpack.eventLog.logEntries=true', ...disabledPlugins .filter((k) => k !== 'security') From 556d0d026094d0160bd3c6f9b67ac71f2b89db47 Mon Sep 17 00:00:00 2001 From: Stacey Gammon Date: Mon, 28 Feb 2022 18:35:32 -0500 Subject: [PATCH 063/102] Update nav-kibana-dev.docnav.json (#126522) --- nav-kibana-dev.docnav.json | 1 + 1 file changed, 1 insertion(+) diff --git a/nav-kibana-dev.docnav.json b/nav-kibana-dev.docnav.json index 7a1e9ea323ed8..a86772d3ef27f 100644 --- a/nav-kibana-dev.docnav.json +++ b/nav-kibana-dev.docnav.json @@ -67,6 +67,7 @@ { "category": "Contributors Newsletters", "items": [ + { "id": "kibFebruary2022ContributorNewsletter" }, { "id": "kibJanuary2022ContributorNewsletter" }, { "id": "kibDecember2021ContributorNewsletter" }, { "id": "kibNovember2021ContributorNewsletter" }, From f0639fe441857d1bed9ddb1943d40a97ee2c7f1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cau=C3=AA=20Marcondes?= <55978943+cauemarcondes@users.noreply.github.com> Date: Mon, 28 Feb 2022 19:32:50 -0500 Subject: [PATCH 064/102] [APM] Remove readOnly from secret token field (#126535) --- .../settings_definition/agent_authorization_settings.test.ts | 2 -- .../settings_definition/agent_authorization_settings.ts | 1 - 2 files changed, 3 deletions(-) diff --git a/x-pack/plugins/apm/public/components/fleet_integration/apm_policy_form/settings_definition/agent_authorization_settings.test.ts b/x-pack/plugins/apm/public/components/fleet_integration/apm_policy_form/settings_definition/agent_authorization_settings.test.ts index 509b0d13552c2..ed3cf83962df4 100644 --- a/x-pack/plugins/apm/public/components/fleet_integration/apm_policy_form/settings_definition/agent_authorization_settings.test.ts +++ b/x-pack/plugins/apm/public/components/fleet_integration/apm_policy_form/settings_definition/agent_authorization_settings.test.ts @@ -22,7 +22,6 @@ describe('apm-fleet-apm-integration', () => { expect(secretToken).toEqual({ type: 'text', key: 'secret_token', - readOnly: true, labelAppend: 'Optional', label: 'Secret token', }); @@ -34,7 +33,6 @@ describe('apm-fleet-apm-integration', () => { expect(secretToken).toEqual({ type: 'text', key: 'secret_token', - readOnly: false, labelAppend: 'Optional', label: 'Secret token', }); diff --git a/x-pack/plugins/apm/public/components/fleet_integration/apm_policy_form/settings_definition/agent_authorization_settings.ts b/x-pack/plugins/apm/public/components/fleet_integration/apm_policy_form/settings_definition/agent_authorization_settings.ts index 3540fb97fb173..dff95bbf1702c 100644 --- a/x-pack/plugins/apm/public/components/fleet_integration/apm_policy_form/settings_definition/agent_authorization_settings.ts +++ b/x-pack/plugins/apm/public/components/fleet_integration/apm_policy_form/settings_definition/agent_authorization_settings.ts @@ -65,7 +65,6 @@ export function getAgentAuthorizationSettings({ { type: 'text', key: 'secret_token', - readOnly: isCloudPolicy, labelAppend: OPTIONAL_LABEL, label: i18n.translate( 'xpack.apm.fleet_integration.settings.agentAuthorization.secretTokenLabel', From 6e11beadcfbba53b98456e2bbfe0add464d374aa Mon Sep 17 00:00:00 2001 From: Pierre Gayvallet Date: Tue, 1 Mar 2022 09:13:19 +0100 Subject: [PATCH 065/102] [Status service] log plugin status changes (#126320) * log plugin status changes * add throttling effect * nit --- .../server/status/log_plugins_status.test.ts | 332 ++++++++++++++++++ src/core/server/status/log_plugins_status.ts | 104 ++++++ .../status/status_service.test.mocks.ts | 19 + src/core/server/status/status_service.test.ts | 109 +++++- src/core/server/status/status_service.ts | 7 + 5 files changed, 568 insertions(+), 3 deletions(-) create mode 100644 src/core/server/status/log_plugins_status.test.ts create mode 100644 src/core/server/status/log_plugins_status.ts create mode 100644 src/core/server/status/status_service.test.mocks.ts diff --git a/src/core/server/status/log_plugins_status.test.ts b/src/core/server/status/log_plugins_status.test.ts new file mode 100644 index 0000000000000..e1be88fe1b188 --- /dev/null +++ b/src/core/server/status/log_plugins_status.test.ts @@ -0,0 +1,332 @@ +/* + * 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 { TestScheduler } from 'rxjs/testing'; +import { PluginName } from '../plugins'; +import { ServiceStatus, ServiceStatusLevel, ServiceStatusLevels } from './types'; +import { + getPluginsStatusChanges, + getPluginsStatusDiff, + getServiceLevelChangeMessage, +} from './log_plugins_status'; + +type ObsInputType = Record; + +const getTestScheduler = () => + new TestScheduler((actual, expected) => { + expect(actual).toEqual(expected); + }); + +const createServiceStatus = (level: ServiceStatusLevel): ServiceStatus => ({ + level, + summary: 'summary', +}); + +const createPluginsStatuses = ( + input: Record +): Record => { + return Object.entries(input).reduce((output, [name, level]) => { + output[name] = createServiceStatus(level); + return output; + }, {} as Record); +}; + +describe('getPluginsStatusChanges', () => { + it('does not emit on first plugins$ emission', () => { + getTestScheduler().run(({ expectObservable, hot }) => { + const statuses = createPluginsStatuses({ + pluginA: ServiceStatusLevels.available, + pluginB: ServiceStatusLevels.degraded, + }); + + const overall$ = hot('-a', { + a: statuses, + }); + const stop$ = hot(''); + const expected = '--'; + + expectObservable(getPluginsStatusChanges(overall$, stop$, 1)).toBe(expected); + }); + }); + + it('does not emit if statuses do not change', () => { + getTestScheduler().run(({ expectObservable, hot }) => { + const statuses = createPluginsStatuses({ + pluginA: ServiceStatusLevels.available, + pluginB: ServiceStatusLevels.degraded, + }); + + const overall$ = hot('-a-b', { + a: statuses, + b: statuses, + }); + const stop$ = hot(''); + const expected = '----'; + + expectObservable(getPluginsStatusChanges(overall$, stop$, 1)).toBe(expected); + }); + }); + + it('emits if any plugin status changes', () => { + getTestScheduler().run(({ expectObservable, hot }) => { + const statusesA = createPluginsStatuses({ + pluginA: ServiceStatusLevels.available, + pluginB: ServiceStatusLevels.degraded, + }); + const statusesB = createPluginsStatuses({ + pluginA: ServiceStatusLevels.available, + pluginB: ServiceStatusLevels.available, + }); + + const overall$ = hot('-a-b', { + a: statusesA, + b: statusesB, + }); + const stop$ = hot(''); + const expected = '---a'; + + expectObservable(getPluginsStatusChanges(overall$, stop$, 1)).toBe(expected, { + a: [ + { + previousLevel: 'degraded', + nextLevel: 'available', + impactedServices: ['pluginB'], + }, + ], + }); + }); + }); + + it('emits everytime any plugin status changes', () => { + getTestScheduler().run(({ expectObservable, hot }) => { + const availableStatus = createPluginsStatuses({ + pluginA: ServiceStatusLevels.available, + }); + const degradedStatus = createPluginsStatuses({ + pluginA: ServiceStatusLevels.degraded, + }); + + const overall$ = hot('-a-b-c-d', { + a: availableStatus, + b: degradedStatus, + c: degradedStatus, + d: availableStatus, + }); + const stop$ = hot(''); + const expected = '---a---b'; + + expectObservable(getPluginsStatusChanges(overall$, stop$, 1)).toBe(expected, { + a: [ + { + previousLevel: 'available', + nextLevel: 'degraded', + impactedServices: ['pluginA'], + }, + ], + b: [ + { + previousLevel: 'degraded', + nextLevel: 'available', + impactedServices: ['pluginA'], + }, + ], + }); + }); + }); + + it('throttle events', () => { + getTestScheduler().run(({ expectObservable, hot }) => { + const statusesA = createPluginsStatuses({ + pluginA: ServiceStatusLevels.available, + pluginB: ServiceStatusLevels.degraded, + }); + const statusesB = createPluginsStatuses({ + pluginA: ServiceStatusLevels.available, + pluginB: ServiceStatusLevels.available, + }); + const statusesC = createPluginsStatuses({ + pluginA: ServiceStatusLevels.degraded, + pluginB: ServiceStatusLevels.available, + }); + + const overall$ = hot('-a-b--c', { + a: statusesA, + b: statusesB, + c: statusesC, + }); + const stop$ = hot(''); + const expected = '------a'; + + expectObservable(getPluginsStatusChanges(overall$, stop$, 5)).toBe(expected, { + a: [ + { + previousLevel: 'available', + nextLevel: 'degraded', + impactedServices: ['pluginA'], + }, + { + previousLevel: 'degraded', + nextLevel: 'available', + impactedServices: ['pluginB'], + }, + ], + }); + }); + }); + + it('stops emitting once `stop$` emits', () => { + getTestScheduler().run(({ expectObservable, hot }) => { + const statusesA = createPluginsStatuses({ + pluginA: ServiceStatusLevels.available, + pluginB: ServiceStatusLevels.degraded, + }); + const statusesB = createPluginsStatuses({ + pluginA: ServiceStatusLevels.available, + pluginB: ServiceStatusLevels.available, + }); + const statusesC = createPluginsStatuses({ + pluginA: ServiceStatusLevels.degraded, + pluginB: ServiceStatusLevels.available, + }); + + const overall$ = hot('-a-b-c', { + a: statusesA, + b: statusesB, + c: statusesC, + }); + const stop$ = hot('----(s|)'); + const expected = '---a|'; + + expectObservable(getPluginsStatusChanges(overall$, stop$, 1)).toBe(expected, { + a: [ + { + previousLevel: 'degraded', + nextLevel: 'available', + impactedServices: ['pluginB'], + }, + ], + }); + }); + }); +}); + +describe('getPluginsStatusDiff', () => { + it('returns an empty list if level is the same for all plugins', () => { + const previousStatus = createPluginsStatuses({ + pluginA: ServiceStatusLevels.available, + pluginB: ServiceStatusLevels.degraded, + pluginC: ServiceStatusLevels.unavailable, + }); + + const nextStatus = createPluginsStatuses({ + pluginA: ServiceStatusLevels.available, + pluginB: ServiceStatusLevels.degraded, + pluginC: ServiceStatusLevels.unavailable, + }); + + const result = getPluginsStatusDiff(previousStatus, nextStatus); + + expect(result).toEqual([]); + }); + + it('returns an single entry if only one status changed', () => { + const previousStatus = createPluginsStatuses({ + pluginA: ServiceStatusLevels.available, + pluginB: ServiceStatusLevels.degraded, + pluginC: ServiceStatusLevels.unavailable, + }); + + const nextStatus = createPluginsStatuses({ + pluginA: ServiceStatusLevels.degraded, + pluginB: ServiceStatusLevels.degraded, + pluginC: ServiceStatusLevels.unavailable, + }); + + const result = getPluginsStatusDiff(previousStatus, nextStatus); + + expect(result).toEqual([ + { + previousLevel: 'available', + nextLevel: 'degraded', + impactedServices: ['pluginA'], + }, + ]); + }); + + it('groups plugins by previous and next level tuples', () => { + const previousStatus = createPluginsStatuses({ + pluginA: ServiceStatusLevels.available, + pluginB: ServiceStatusLevels.available, + pluginC: ServiceStatusLevels.unavailable, + }); + + const nextStatus = createPluginsStatuses({ + pluginA: ServiceStatusLevels.degraded, + pluginB: ServiceStatusLevels.degraded, + pluginC: ServiceStatusLevels.unavailable, + }); + + const result = getPluginsStatusDiff(previousStatus, nextStatus); + + expect(result).toEqual([ + { + previousLevel: 'available', + nextLevel: 'degraded', + impactedServices: ['pluginA', 'pluginB'], + }, + ]); + }); + + it('returns one entry per previous and next level tuples', () => { + const previousStatus = createPluginsStatuses({ + pluginA: ServiceStatusLevels.available, + pluginB: ServiceStatusLevels.degraded, + pluginC: ServiceStatusLevels.unavailable, + }); + + const nextStatus = createPluginsStatuses({ + pluginA: ServiceStatusLevels.degraded, + pluginB: ServiceStatusLevels.unavailable, + pluginC: ServiceStatusLevels.available, + }); + + const result = getPluginsStatusDiff(previousStatus, nextStatus); + + expect(result).toEqual([ + { + previousLevel: 'available', + nextLevel: 'degraded', + impactedServices: ['pluginA'], + }, + { + previousLevel: 'degraded', + nextLevel: 'unavailable', + impactedServices: ['pluginB'], + }, + { + previousLevel: 'unavailable', + nextLevel: 'available', + impactedServices: ['pluginC'], + }, + ]); + }); +}); + +describe('getServiceLevelChangeMessage', () => { + it('returns a human readable message about the change', () => { + expect( + getServiceLevelChangeMessage({ + previousLevel: 'available', + nextLevel: 'degraded', + impactedServices: ['pluginA', 'pluginB'], + }) + ).toMatchInlineSnapshot( + `"2 plugins changed status from 'available' to 'degraded': pluginA, pluginB"` + ); + }); +}); diff --git a/src/core/server/status/log_plugins_status.ts b/src/core/server/status/log_plugins_status.ts new file mode 100644 index 0000000000000..5b5d0d84efc4d --- /dev/null +++ b/src/core/server/status/log_plugins_status.ts @@ -0,0 +1,104 @@ +/* + * 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 { isDeepStrictEqual } from 'util'; +import { Observable, asyncScheduler } from 'rxjs'; +import { + distinctUntilChanged, + pairwise, + takeUntil, + map, + filter, + throttleTime, +} from 'rxjs/operators'; +import { PluginName } from '../plugins'; +import { ServiceStatus } from './types'; + +export type ServiceStatusWithName = ServiceStatus & { + name: PluginName; +}; + +export interface ServiceLevelChange { + previousLevel: string; + nextLevel: string; + impactedServices: string[]; +} + +export const getPluginsStatusChanges = ( + plugins$: Observable>, + stop$: Observable, + throttleDuration: number = 250 +): Observable => { + return plugins$.pipe( + takeUntil(stop$), + distinctUntilChanged((previous, next) => + isDeepStrictEqual(getStatusLevelMap(previous), getStatusLevelMap(next)) + ), + throttleTime(throttleDuration, asyncScheduler, { leading: true, trailing: true }), + pairwise(), + map(([oldStatus, newStatus]) => { + return getPluginsStatusDiff(oldStatus, newStatus); + }), + filter((statusChanges) => statusChanges.length > 0) + ); +}; + +const getStatusLevelMap = ( + plugins: Record +): Record => { + return Object.entries(plugins).reduce((levelMap, [key, value]) => { + levelMap[key] = value.level.toString(); + return levelMap; + }, {} as Record); +}; + +export const getPluginsStatusDiff = ( + previous: Record, + next: Record +): ServiceLevelChange[] => { + const statusChanges: Map = new Map(); + + Object.entries(next).forEach(([pluginName, nextStatus]) => { + const previousStatus = previous[pluginName]; + if (!previousStatus) { + return; + } + const previousLevel = statusLevel(previousStatus); + const nextLevel = statusLevel(nextStatus); + if (previousLevel === nextLevel) { + return; + } + const changeKey = statusChangeKey(previousLevel, nextLevel); + let statusChange = statusChanges.get(changeKey); + if (!statusChange) { + statusChange = { + previousLevel, + nextLevel, + impactedServices: [], + }; + statusChanges.set(changeKey, statusChange); + } + statusChange.impactedServices.push(pluginName); + }); + + return [...statusChanges.values()]; +}; + +export const getServiceLevelChangeMessage = ({ + impactedServices: services, + nextLevel: next, + previousLevel: previous, +}: ServiceLevelChange): string => { + return `${ + services.length + } plugins changed status from '${previous}' to '${next}': ${services.join(', ')}`; +}; + +const statusLevel = (status: ServiceStatus) => status.level.toString(); + +const statusChangeKey = (previous: string, next: string) => `${previous}:${next}`; diff --git a/src/core/server/status/status_service.test.mocks.ts b/src/core/server/status/status_service.test.mocks.ts new file mode 100644 index 0000000000000..8b860d8355fc6 --- /dev/null +++ b/src/core/server/status/status_service.test.mocks.ts @@ -0,0 +1,19 @@ +/* + * 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. + */ + +export const getOverallStatusChangesMock = jest.fn(); +jest.doMock('./log_overall_status', () => ({ + getOverallStatusChanges: getOverallStatusChangesMock, +})); + +export const getPluginsStatusChangesMock = jest.fn(); +export const getServiceLevelChangeMessageMock = jest.fn(); +jest.doMock('./log_plugins_status', () => ({ + getPluginsStatusChanges: getPluginsStatusChangesMock, + getServiceLevelChangeMessage: getServiceLevelChangeMessageMock, +})); diff --git a/src/core/server/status/status_service.test.ts b/src/core/server/status/status_service.test.ts index dfd0ff9a7e103..0b6fbb601c40f 100644 --- a/src/core/server/status/status_service.test.ts +++ b/src/core/server/status/status_service.test.ts @@ -6,7 +6,13 @@ * Side Public License, v 1. */ -import { of, BehaviorSubject } from 'rxjs'; +import { + getOverallStatusChangesMock, + getPluginsStatusChangesMock, + getServiceLevelChangeMessageMock, +} from './status_service.test.mocks'; + +import { of, BehaviorSubject, Subject } from 'rxjs'; import { ServiceStatus, ServiceStatusLevels, CoreStatus } from './types'; import { StatusService } from './status_service'; @@ -19,14 +25,27 @@ import { mockRouter, RouterMock } from '../http/router/router.mock'; import { metricsServiceMock } from '../metrics/metrics_service.mock'; import { configServiceMock } from '../config/mocks'; import { coreUsageDataServiceMock } from '../core_usage_data/core_usage_data_service.mock'; +import { loggingSystemMock } from '../logging/logging_system.mock'; +import type { ServiceLevelChange } from './log_plugins_status'; expect.addSnapshotSerializer(ServiceStatusLevelSnapshotSerializer); describe('StatusService', () => { let service: StatusService; + let logger: ReturnType; beforeEach(() => { - service = new StatusService(mockCoreContext.create()); + logger = loggingSystemMock.create(); + service = new StatusService(mockCoreContext.create({ logger })); + + getOverallStatusChangesMock.mockReturnValue({ subscribe: jest.fn() }); + getPluginsStatusChangesMock.mockReturnValue({ subscribe: jest.fn() }); + }); + + afterEach(() => { + getOverallStatusChangesMock.mockReset(); + getPluginsStatusChangesMock.mockReset(); + getServiceLevelChangeMessageMock.mockReset(); }); const delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)); @@ -45,7 +64,7 @@ describe('StatusService', () => { }; type SetupDeps = Parameters[0]; - const setupDeps = (overrides: Partial): SetupDeps => { + const setupDeps = (overrides: Partial = {}): SetupDeps => { return { elasticsearch: { status$: of(available), @@ -536,4 +555,88 @@ describe('StatusService', () => { }); }); }); + + describe('start', () => { + it('calls getOverallStatusChanges and subscribe to the returned observable', async () => { + const mockSubscribe = jest.fn(); + getOverallStatusChangesMock.mockReturnValue({ + subscribe: mockSubscribe, + }); + + await service.setup(setupDeps()); + await service.start(); + + expect(getOverallStatusChangesMock).toHaveBeenCalledTimes(1); + expect(mockSubscribe).toHaveBeenCalledTimes(1); + }); + + it('logs a message everytime the getOverallStatusChangesMock observable emits', async () => { + const subject = new Subject(); + getOverallStatusChangesMock.mockReturnValue(subject); + + await service.setup(setupDeps()); + await service.start(); + + subject.next('some message'); + subject.next('another message'); + + const log = logger.get(); + + expect(log.info).toHaveBeenCalledTimes(2); + expect(log.info).toHaveBeenCalledWith('some message'); + expect(log.info).toHaveBeenCalledWith('another message'); + }); + + it('calls getPluginsStatusChanges and subscribe to the returned observable', async () => { + const mockSubscribe = jest.fn(); + getPluginsStatusChangesMock.mockReturnValue({ + subscribe: mockSubscribe, + }); + + await service.setup(setupDeps()); + await service.start(); + + expect(getPluginsStatusChangesMock).toHaveBeenCalledTimes(1); + expect(mockSubscribe).toHaveBeenCalledTimes(1); + }); + + it('logs messages everytime the getPluginsStatusChangesMock observable emits', async () => { + const subject = new Subject(); + getPluginsStatusChangesMock.mockReturnValue(subject); + + getServiceLevelChangeMessageMock.mockImplementation( + ({ + impactedServices: services, + nextLevel: next, + previousLevel: previous, + }: ServiceLevelChange) => { + return `${previous}-${next}-${services[0]}`; + } + ); + + await service.setup(setupDeps()); + await service.start(); + + subject.next([ + { + previousLevel: 'available', + nextLevel: 'degraded', + impactedServices: ['pluginA'], + }, + ]); + subject.next([ + { + previousLevel: 'degraded', + nextLevel: 'available', + impactedServices: ['pluginB'], + }, + ]); + + const log = logger.get(); + + expect(log.info).toHaveBeenCalledTimes(2); + expect(log.info).toHaveBeenCalledWith('available-degraded-pluginA'); + expect(log.info).toHaveBeenCalledWith('degraded-available-pluginB'); + }); + }); }); diff --git a/src/core/server/status/status_service.ts b/src/core/server/status/status_service.ts index 63a1b02d5b2e7..be64b2558acd2 100644 --- a/src/core/server/status/status_service.ts +++ b/src/core/server/status/status_service.ts @@ -27,6 +27,7 @@ import { ServiceStatus, CoreStatus, InternalStatusServiceSetup } from './types'; import { getSummaryStatus } from './get_summary_status'; import { PluginsStatusService } from './plugins_status'; import { getOverallStatusChanges } from './log_overall_status'; +import { getPluginsStatusChanges, getServiceLevelChangeMessage } from './log_plugins_status'; interface StatusLogMeta extends LogMeta { kibana: { status: ServiceStatus }; @@ -165,6 +166,12 @@ export class StatusService implements CoreService { getOverallStatusChanges(this.overall$, this.stop$).subscribe((message) => { this.logger.info(message); }); + + getPluginsStatusChanges(this.pluginsStatus.getAll$(), this.stop$).subscribe((statusChanges) => { + statusChanges.forEach((statusChange) => { + this.logger.info(getServiceLevelChangeMessage(statusChange)); + }); + }); } public stop() { From 3285eb187a6b7c40a5f13bfd0d4d13320983b47b Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Tue, 1 Mar 2022 09:20:24 +0100 Subject: [PATCH 066/102] [Reporting] Make CSV authentication failure a warning (#126358) * added ability for CSV to fail due to auth or unknown error and NOT throw * wording * added warning toast when report finishes, but with warnings * added tests for CSV generator * moved i18n to external file * remove extra i18n for now Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../plugins/reporting/common/types/index.ts | 11 ++- .../reporting/public/lib/stream_handler.ts | 14 ++- .../reporting/public/notifier/index.ts | 1 + .../reporting/public/notifier/job_warning.tsx | 46 +++++++++ .../generate_csv/generate_csv.test.ts | 93 ++++++++++++++----- .../generate_csv/generate_csv.ts | 22 +++-- .../generate_csv/i18n_texts.ts | 26 ++++++ .../server/lib/tasks/execute_report.ts | 1 + 8 files changed, 182 insertions(+), 32 deletions(-) create mode 100644 x-pack/plugins/reporting/public/notifier/job_warning.tsx create mode 100644 x-pack/plugins/reporting/server/export_types/csv_searchsource/generate_csv/i18n_texts.ts diff --git a/x-pack/plugins/reporting/common/types/index.ts b/x-pack/plugins/reporting/common/types/index.ts index 42845297e204e..b9ffe09b5fe5c 100644 --- a/x-pack/plugins/reporting/common/types/index.ts +++ b/x-pack/plugins/reporting/common/types/index.ts @@ -32,7 +32,6 @@ export interface ReportDocumentHead { export interface ReportOutput extends TaskRunResult { content: string | null; - error_code?: string; size: number; } @@ -63,6 +62,16 @@ export interface TaskRunResult { max_size_reached?: boolean; warnings?: string[]; metrics?: TaskRunMetrics; + + /** + * When running a report task we may finish with warnings that were triggered + * by an error. We can pass the error code via the task run result to the + * task runner so that it can be recorded for telemetry. + * + * Alternatively, this field can be populated in the event that the task does + * not complete in the task runner's error handler. + */ + error_code?: string; } export interface ReportSource { diff --git a/x-pack/plugins/reporting/public/lib/stream_handler.ts b/x-pack/plugins/reporting/public/lib/stream_handler.ts index e9645f3bb8735..80932f8ddeeee 100644 --- a/x-pack/plugins/reporting/public/lib/stream_handler.ts +++ b/x-pack/plugins/reporting/public/lib/stream_handler.ts @@ -13,10 +13,11 @@ import { JOB_COMPLETION_NOTIFICATIONS_SESSION_KEY, JOB_STATUSES } from '../../co import { JobId, JobSummary, JobSummarySet } from '../../common/types'; import { getFailureToast, - getGeneralErrorToast, + getWarningToast, getSuccessToast, - getWarningFormulasToast, + getGeneralErrorToast, getWarningMaxSizeToast, + getWarningFormulasToast, } from '../notifier'; import { Job } from './job'; import { ReportingAPIClient } from './reporting_api_client'; @@ -71,6 +72,15 @@ export class ReportingNotifierStreamHandler { this.theme ) ); + } else if (job.status === JOB_STATUSES.WARNINGS) { + this.notifications.toasts.addWarning( + getWarningToast( + job, + this.apiClient.getManagementLink, + this.apiClient.getDownloadLink, + this.theme + ) + ); } else { this.notifications.toasts.addSuccess( getSuccessToast( diff --git a/x-pack/plugins/reporting/public/notifier/index.ts b/x-pack/plugins/reporting/public/notifier/index.ts index b44f1e9169747..d687e7009fb4c 100644 --- a/x-pack/plugins/reporting/public/notifier/index.ts +++ b/x-pack/plugins/reporting/public/notifier/index.ts @@ -10,3 +10,4 @@ export { getGeneralErrorToast } from './general_error'; export { getSuccessToast } from './job_success'; export { getWarningFormulasToast } from './job_warning_formulas'; export { getWarningMaxSizeToast } from './job_warning_max_size'; +export { getWarningToast } from './job_warning'; diff --git a/x-pack/plugins/reporting/public/notifier/job_warning.tsx b/x-pack/plugins/reporting/public/notifier/job_warning.tsx new file mode 100644 index 0000000000000..2ac10216f3f19 --- /dev/null +++ b/x-pack/plugins/reporting/public/notifier/job_warning.tsx @@ -0,0 +1,46 @@ +/* + * 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 { FormattedMessage } from '@kbn/i18n-react'; +import React, { Fragment } from 'react'; +import { ThemeServiceStart, ToastInput } from 'src/core/public'; +import { toMountPoint } from '../../../../../src/plugins/kibana_react/public'; +import { JobId, JobSummary } from '../../common/types'; +import { DownloadButton } from './job_download_button'; +import { ReportLink } from './report_link'; + +export const getWarningToast = ( + job: JobSummary, + getReportLink: () => string, + getDownloadLink: (jobId: JobId) => string, + theme: ThemeServiceStart +): ToastInput => ({ + title: toMountPoint( + , + { theme$: theme.theme$ } + ), + text: toMountPoint( + +

+ +

+

+ +

+ +
, + { theme$: theme.theme$ } + ), + 'data-test-subj': 'completeReportWarning', +}); diff --git a/x-pack/plugins/reporting/server/export_types/csv_searchsource/generate_csv/generate_csv.test.ts b/x-pack/plugins/reporting/server/export_types/csv_searchsource/generate_csv/generate_csv.test.ts index eb3cbd6118eb9..c525cb7c0def2 100644 --- a/x-pack/plugins/reporting/server/export_types/csv_searchsource/generate_csv/generate_csv.test.ts +++ b/x-pack/plugins/reporting/server/export_types/csv_searchsource/generate_csv/generate_csv.test.ts @@ -27,7 +27,7 @@ import { UI_SETTINGS_CSV_SEPARATOR, UI_SETTINGS_DATEFORMAT_TZ, } from '../../../../common/constants'; -import { AuthenticationExpiredError } from '../../../../common/errors'; +import { UnknownError } from '../../../../common/errors'; import { createMockConfig, createMockConfigSchema, @@ -808,25 +808,76 @@ it('can override ignoring frozen indices', async () => { ); }); -it('throws an AuthenticationExpiredError when ES does not accept credentials', async () => { - mockDataClient.search = jest.fn().mockImplementation(() => { - throw new esErrors.ResponseError({ statusCode: 403, meta: {} as any, warnings: [] }); +describe('error codes', () => { + it('returns the expected error code when authentication expires', async () => { + mockDataClient.search = jest.fn().mockImplementation(() => + Rx.of({ + rawResponse: { + _scroll_id: 'test', + hits: { + hits: range(0, 5).map(() => ({ + fields: { + date: ['2020-12-31T00:14:28.000Z'], + ip: ['110.135.176.89'], + message: ['super cali fragile istic XPLA docious'], + }, + })), + total: 10, + }, + }, + }) + ); + + mockEsClient.asCurrentUser.scroll = jest.fn().mockImplementation(() => { + throw new esErrors.ResponseError({ statusCode: 403, meta: {} as any, warnings: [] }); + }); + + const generateCsv = new CsvGenerator( + createMockJob({ columns: ['date', 'ip', 'message'] }), + mockConfig, + { + es: mockEsClient, + data: mockDataClient, + uiSettings: uiSettingsClient, + }, + { + searchSourceStart: mockSearchSourceService, + fieldFormatsRegistry: mockFieldFormatsRegistry, + }, + new CancellationToken(), + logger, + stream + ); + + const { error_code: errorCode, warnings } = await generateCsv.generateData(); + expect(errorCode).toBe('authentication_expired'); + expect(warnings).toMatchInlineSnapshot(` + Array [ + "This report contains partial CSV results because authentication expired before it could finish. Try exporting a smaller amount of data or increase your authentication timeout.", + ] + `); + }); + + it('throws for unknown errors', async () => { + mockDataClient.search = jest.fn().mockImplementation(() => { + throw new esErrors.ResponseError({ statusCode: 500, meta: {} as any, warnings: [] }); + }); + const generateCsv = new CsvGenerator( + createMockJob({ columns: ['date', 'ip', 'message'] }), + mockConfig, + { + es: mockEsClient, + data: mockDataClient, + uiSettings: uiSettingsClient, + }, + { + searchSourceStart: mockSearchSourceService, + fieldFormatsRegistry: mockFieldFormatsRegistry, + }, + new CancellationToken(), + logger, + stream + ); + await expect(generateCsv.generateData()).rejects.toBeInstanceOf(UnknownError); }); - const generateCsv = new CsvGenerator( - createMockJob({ columns: ['date', 'ip', 'message'] }), - mockConfig, - { - es: mockEsClient, - data: mockDataClient, - uiSettings: uiSettingsClient, - }, - { - searchSourceStart: mockSearchSourceService, - fieldFormatsRegistry: mockFieldFormatsRegistry, - }, - new CancellationToken(), - logger, - stream - ); - await expect(generateCsv.generateData()).rejects.toEqual(new AuthenticationExpiredError()); }); diff --git a/x-pack/plugins/reporting/server/export_types/csv_searchsource/generate_csv/generate_csv.ts b/x-pack/plugins/reporting/server/export_types/csv_searchsource/generate_csv/generate_csv.ts index 5be17f5e6d252..201484af9d7d0 100644 --- a/x-pack/plugins/reporting/server/export_types/csv_searchsource/generate_csv/generate_csv.ts +++ b/x-pack/plugins/reporting/server/export_types/csv_searchsource/generate_csv/generate_csv.ts @@ -7,7 +7,6 @@ import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { errors as esErrors } from '@elastic/elasticsearch'; -import { i18n } from '@kbn/i18n'; import type { IScopedClusterClient, IUiSettingsClient } from 'src/core/server'; import type { IScopedSearchClient } from 'src/plugins/data/server'; import type { Datatable } from 'src/plugins/expressions/server'; @@ -31,13 +30,18 @@ import type { import { KbnServerError } from '../../../../../../../src/plugins/kibana_utils/server'; import type { CancellationToken } from '../../../../common/cancellation_token'; import { CONTENT_TYPE_CSV } from '../../../../common/constants'; -import { AuthenticationExpiredError } from '../../../../common/errors'; +import { + AuthenticationExpiredError, + UnknownError, + ReportingError, +} from '../../../../common/errors'; import { byteSizeValueToNumber } from '../../../../common/schema_utils'; import type { LevelLogger } from '../../../lib'; import type { TaskRunResult } from '../../../lib/tasks'; import type { JobParamsCSV } from '../types'; import { CsvExportSettings, getExportSettings } from './get_export_settings'; import { MaxSizeStringBuilder } from './max_size_string_builder'; +import { i18nTexts } from './i18n_texts'; interface Clients { es: IScopedClusterClient; @@ -257,6 +261,7 @@ export class CsvGenerator { ), this.dependencies.searchSourceStart.create(this.job.searchSource), ]); + let reportingError: undefined | ReportingError; const index = searchSource.getField('index'); @@ -360,19 +365,19 @@ export class CsvGenerator { // Add warnings to be logged if (this.csvContainsFormulas && escapeFormulaValues) { - warnings.push( - i18n.translate('xpack.reporting.exportTypes.csv.generateCsv.escapedFormulaValues', { - defaultMessage: 'CSV may contain formulas whose values have been escaped', - }) - ); + warnings.push(i18nTexts.escapedFormulaValuesMessage); } } catch (err) { this.logger.error(err); if (err instanceof KbnServerError && err.errBody) { throw JSON.stringify(err.errBody.error); } + if (err instanceof esErrors.ResponseError && [401, 403].includes(err.statusCode ?? 0)) { - throw new AuthenticationExpiredError(); + reportingError = new AuthenticationExpiredError(); + warnings.push(i18nTexts.authenticationError.partialResultsMessage); + } else { + throw new UnknownError(err.message); } } finally { // clear scrollID @@ -405,6 +410,7 @@ export class CsvGenerator { csv: { rows: this.csvRowCount }, }, warnings, + error_code: reportingError?.code, }; } } diff --git a/x-pack/plugins/reporting/server/export_types/csv_searchsource/generate_csv/i18n_texts.ts b/x-pack/plugins/reporting/server/export_types/csv_searchsource/generate_csv/i18n_texts.ts new file mode 100644 index 0000000000000..c994226c6a05c --- /dev/null +++ b/x-pack/plugins/reporting/server/export_types/csv_searchsource/generate_csv/i18n_texts.ts @@ -0,0 +1,26 @@ +/* + * 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 { i18n } from '@kbn/i18n'; + +export const i18nTexts = { + escapedFormulaValuesMessage: i18n.translate( + 'xpack.reporting.exportTypes.csv.generateCsv.escapedFormulaValues', + { + defaultMessage: 'CSV may contain formulas whose values have been escaped', + } + ), + authenticationError: { + partialResultsMessage: i18n.translate( + 'xpack.reporting.exportTypes.csv.generateCsv.authenticationExpired.partialResultsMessage', + { + defaultMessage: + 'This report contains partial CSV results because authentication expired before it could finish. Try exporting a smaller amount of data or increase your authentication timeout.', + } + ), + }, +}; diff --git a/x-pack/plugins/reporting/server/lib/tasks/execute_report.ts b/x-pack/plugins/reporting/server/lib/tasks/execute_report.ts index 019f128e5f07d..449f3b8da7671 100644 --- a/x-pack/plugins/reporting/server/lib/tasks/execute_report.ts +++ b/x-pack/plugins/reporting/server/lib/tasks/execute_report.ts @@ -227,6 +227,7 @@ export class ExecuteReportTask implements ReportingTask { docOutput.size = output.size; docOutput.warnings = output.warnings && output.warnings.length > 0 ? output.warnings : undefined; + docOutput.error_code = output.error_code; } else { const defaultOutput = null; docOutput.content = output.toString() || defaultOutput; From c7f63f8f8dde8b947aa8c7e272387b14fb36d57c Mon Sep 17 00:00:00 2001 From: Christos Nasikas Date: Tue, 1 Mar 2022 12:02:38 +0200 Subject: [PATCH 067/102] [Cases] Add telemetry for deprecated API (#126433) --- .../routes/api/comments/get_all_comment.ts | 11 +--- .../server/routes/api/register_routes.test.ts | 56 ++++++++++++++++ .../server/routes/api/register_routes.ts | 64 +++++++++++++++++-- .../server/routes/api/stats/get_status.ts | 11 +--- .../plugins/cases/server/routes/api/types.ts | 1 + .../api/user_actions/get_all_user_actions.ts | 11 +--- .../cases/server/routes/api/utils.test.ts | 10 ++- .../plugins/cases/server/routes/api/utils.ts | 12 ++++ 8 files changed, 140 insertions(+), 36 deletions(-) diff --git a/x-pack/plugins/cases/server/routes/api/comments/get_all_comment.ts b/x-pack/plugins/cases/server/routes/api/comments/get_all_comment.ts index d1e47276af1ab..44f8f59550fb3 100644 --- a/x-pack/plugins/cases/server/routes/api/comments/get_all_comment.ts +++ b/x-pack/plugins/cases/server/routes/api/comments/get_all_comment.ts @@ -7,7 +7,6 @@ import { schema } from '@kbn/config-schema'; -import { getWarningHeader, logDeprecatedEndpoint } from '../utils'; import { CASE_COMMENTS_URL } from '../../../../common/constants'; import { createCaseError } from '../../../common/error'; import { createCasesRoute } from '../create_cases_route'; @@ -23,20 +22,12 @@ export const getAllCommentsRoute = createCasesRoute({ case_id: schema.string(), }), }, + options: { deprecated: true }, handler: async ({ context, request, response, logger, kibanaVersion }) => { try { - logDeprecatedEndpoint( - logger, - request.headers, - `The get all cases comments API '${CASE_COMMENTS_URL}' is deprecated.` - ); - const client = await context.cases.getCasesClient(); return response.ok({ - headers: { - ...getWarningHeader(kibanaVersion), - }, body: await client.attachments.getAll({ caseID: request.params.case_id, }), diff --git a/x-pack/plugins/cases/server/routes/api/register_routes.test.ts b/x-pack/plugins/cases/server/routes/api/register_routes.test.ts index 71ec6f2bce5cd..4082ed3f6e6ae 100644 --- a/x-pack/plugins/cases/server/routes/api/register_routes.test.ts +++ b/x-pack/plugins/cases/server/routes/api/register_routes.test.ts @@ -19,6 +19,7 @@ import { CasesRouter } from '../../types'; import { createCasesRoute } from './create_cases_route'; import { registerRoutes } from './register_routes'; import { CaseRoute } from './types'; +import { extractWarningValueFromWarningHeader } from './utils'; describe('registerRoutes', () => { let router: jest.Mocked; @@ -105,6 +106,7 @@ describe('registerRoutes', () => { { headers }, { customError, badRequest } ); + return result; }; @@ -131,6 +133,26 @@ describe('registerRoutes', () => { }); }; + const initAndSimulateDeprecationEndpoint = async (headers?: Record) => { + const { simulateRequest } = initApi([ + ...routes, + createCasesRoute({ + method: 'get', + path: '/deprecated', + options: { deprecated: true }, + handler: async () => response.ok(), + }), + ]); + + const res = await simulateRequest({ + method: 'get', + path: '/deprecated', + headers, + }); + + return res; + }; + beforeEach(() => { jest.clearAllMocks(); router = httpServiceMock.createRouter(); @@ -245,6 +267,40 @@ describe('registerRoutes', () => { counterType: 'error', }); }); + + it('increases the deprecation counters correctly', async () => { + await initAndSimulateDeprecationEndpoint(); + + expect(telemetryUsageCounter.incrementCounter).toHaveBeenCalledWith({ + counterName: 'GET /deprecated', + counterType: 'deprecated', + }); + }); + }); + + describe('deprecation', () => { + it('logs the deprecation message if it is not a kibana request', async () => { + await initAndSimulateDeprecationEndpoint(); + + expect(logger.warn).toHaveBeenCalledWith('The endpoint GET /deprecated is deprecated.'); + }); + + it('does NOT log the deprecation message if it is a kibana request', async () => { + await initAndSimulateDeprecationEndpoint({ + 'kbn-version': '8.2.0', + referer: 'https://example.com', + }); + + expect(logger.warn).not.toHaveBeenCalled(); + }); + + it('adds the warning header', async () => { + response.ok.mockReturnValue({ status: 200, options: {} }); + const res = await initAndSimulateDeprecationEndpoint(); + const warningHeader = res.options.headers.warning; + const warningValue = extractWarningValueFromWarningHeader(warningHeader); + expect(warningValue).toBe('Deprecated endpoint'); + }); }); describe('errors', () => { diff --git a/x-pack/plugins/cases/server/routes/api/register_routes.ts b/x-pack/plugins/cases/server/routes/api/register_routes.ts index 843009f3b22c5..a4545d82efef7 100644 --- a/x-pack/plugins/cases/server/routes/api/register_routes.ts +++ b/x-pack/plugins/cases/server/routes/api/register_routes.ts @@ -6,10 +6,18 @@ */ import { schema } from '@kbn/config-schema'; -import { RouteRegistrar } from 'kibana/server'; +import { Headers, RouteRegistrar } from 'kibana/server'; import { CasesRequestHandlerContext } from '../../types'; -import { CaseRoute, RegisterRoutesDeps } from './types'; -import { escapeHatch, getIsKibanaRequest, wrapError } from './utils'; +import { RegisterRoutesDeps } from './types'; +import { + escapeHatch, + getIsKibanaRequest, + getWarningHeader, + logDeprecatedEndpoint, + wrapError, +} from './utils'; + +const getEndpoint = (method: string, path: string): string => `${method.toUpperCase()} ${path}`; const increaseTelemetryCounters = ({ telemetryUsageCounter, @@ -24,7 +32,7 @@ const increaseTelemetryCounters = ({ isKibanaRequest: boolean; isError?: boolean; }) => { - const counterName = `${method.toUpperCase()} ${path}`; + const counterName = getEndpoint(method, path); telemetryUsageCounter.incrementCounter({ counterName, @@ -37,11 +45,36 @@ const increaseTelemetryCounters = ({ }); }; +const logAndIncreaseDeprecationTelemetryCounters = ({ + logger, + headers, + method, + path, + telemetryUsageCounter, +}: { + logger: RegisterRoutesDeps['logger']; + headers: Headers; + method: string; + path: string; + telemetryUsageCounter?: Exclude; +}) => { + const endpoint = getEndpoint(method, path); + + logDeprecatedEndpoint(logger, headers, `The endpoint ${endpoint} is deprecated.`); + + if (telemetryUsageCounter) { + telemetryUsageCounter.incrementCounter({ + counterName: endpoint, + counterType: 'deprecated', + }); + } +}; + export const registerRoutes = (deps: RegisterRoutesDeps) => { const { router, routes, logger, kibanaVersion, telemetryUsageCounter } = deps; routes.forEach((route) => { - const { method, path, params, handler } = route as CaseRoute; + const { method, path, params, options, handler } = route; (router[method] as RouteRegistrar)( { @@ -53,6 +86,7 @@ export const registerRoutes = (deps: RegisterRoutesDeps) => { }, }, async (context, request, response) => { + let responseHeaders = {}; const isKibanaRequest = getIsKibanaRequest(request.headers); if (!context.cases) { @@ -60,12 +94,32 @@ export const registerRoutes = (deps: RegisterRoutesDeps) => { } try { + if (options?.deprecated) { + logAndIncreaseDeprecationTelemetryCounters({ + telemetryUsageCounter, + logger, + path, + method, + headers: request.headers, + }); + + responseHeaders = { + ...responseHeaders, + ...getWarningHeader(kibanaVersion), + }; + } + const res = await handler({ logger, context, request, response, kibanaVersion }); if (telemetryUsageCounter) { increaseTelemetryCounters({ telemetryUsageCounter, method, path, isKibanaRequest }); } + res.options.headers = { + ...res.options.headers, + ...responseHeaders, + }; + return res; } catch (error) { logger.error(error.message); diff --git a/x-pack/plugins/cases/server/routes/api/stats/get_status.ts b/x-pack/plugins/cases/server/routes/api/stats/get_status.ts index 4cd5bd7eebd0a..c245f435835f6 100644 --- a/x-pack/plugins/cases/server/routes/api/stats/get_status.ts +++ b/x-pack/plugins/cases/server/routes/api/stats/get_status.ts @@ -6,7 +6,6 @@ */ import { CaseRoute } from '../types'; -import { getWarningHeader, logDeprecatedEndpoint } from '../utils'; import { CasesStatusRequest } from '../../../../common/api'; import { CASE_STATUS_URL } from '../../../../common/constants'; @@ -19,19 +18,11 @@ import { createCasesRoute } from '../create_cases_route'; export const getStatusRoute: CaseRoute = createCasesRoute({ method: 'get', path: CASE_STATUS_URL, + options: { deprecated: true }, handler: async ({ context, request, response, logger, kibanaVersion }) => { try { - logDeprecatedEndpoint( - logger, - request.headers, - `The get cases status API '${CASE_STATUS_URL}' is deprecated.` - ); - const client = await context.cases.getCasesClient(); return response.ok({ - headers: { - ...getWarningHeader(kibanaVersion), - }, body: await client.metrics.getStatusTotalsByType(request.query as CasesStatusRequest), }); } catch (error) { diff --git a/x-pack/plugins/cases/server/routes/api/types.ts b/x-pack/plugins/cases/server/routes/api/types.ts index 2b1893ebb75c7..ffa06526dc68c 100644 --- a/x-pack/plugins/cases/server/routes/api/types.ts +++ b/x-pack/plugins/cases/server/routes/api/types.ts @@ -44,5 +44,6 @@ export interface CaseRoute

{ method: 'get' | 'post' | 'put' | 'delete' | 'patch'; path: string; params?: RouteValidatorConfig; + options?: { deprecated?: boolean }; handler: (args: CaseRouteHandlerArguments) => Promise; } diff --git a/x-pack/plugins/cases/server/routes/api/user_actions/get_all_user_actions.ts b/x-pack/plugins/cases/server/routes/api/user_actions/get_all_user_actions.ts index b9b6ce43a9fdf..ae686969974ea 100644 --- a/x-pack/plugins/cases/server/routes/api/user_actions/get_all_user_actions.ts +++ b/x-pack/plugins/cases/server/routes/api/user_actions/get_all_user_actions.ts @@ -7,7 +7,6 @@ import { schema } from '@kbn/config-schema'; -import { getWarningHeader, logDeprecatedEndpoint } from '../utils'; import { CASE_USER_ACTIONS_URL } from '../../../../common/constants'; import { createCaseError } from '../../../common/error'; import { createCasesRoute } from '../create_cases_route'; @@ -23,21 +22,13 @@ export const getUserActionsRoute = createCasesRoute({ case_id: schema.string(), }), }, + options: { deprecated: true }, handler: async ({ context, request, response, logger, kibanaVersion }) => { try { - logDeprecatedEndpoint( - logger, - request.headers, - `The get all cases user actions API '${CASE_USER_ACTIONS_URL}' is deprecated.` - ); - const casesClient = await context.cases.getCasesClient(); const caseId = request.params.case_id; return response.ok({ - headers: { - ...getWarningHeader(kibanaVersion), - }, body: await casesClient.userActions.getAll({ caseId }), }); } catch (error) { diff --git a/x-pack/plugins/cases/server/routes/api/utils.test.ts b/x-pack/plugins/cases/server/routes/api/utils.test.ts index 2614536e3242b..ec9dff072d359 100644 --- a/x-pack/plugins/cases/server/routes/api/utils.test.ts +++ b/x-pack/plugins/cases/server/routes/api/utils.test.ts @@ -8,7 +8,7 @@ import { isBoom, boomify } from '@hapi/boom'; import { loggingSystemMock } from '../../../../../../src/core/server/mocks'; import { HTTPError } from '../../common/error'; -import { logDeprecatedEndpoint, wrapError } from './utils'; +import { extractWarningValueFromWarningHeader, logDeprecatedEndpoint, wrapError } from './utils'; describe('Utils', () => { describe('wrapError', () => { @@ -75,4 +75,12 @@ describe('Utils', () => { expect(logger.warn).toHaveBeenCalledWith('test'); }); }); + + describe('extractWarningValueFromWarningHeader', () => { + it('extracts the warning value from a warning header correctly', () => { + expect(extractWarningValueFromWarningHeader(`299 Kibana-8.1.0 "Deprecation endpoint"`)).toBe( + 'Deprecation endpoint' + ); + }); + }); }); diff --git a/x-pack/plugins/cases/server/routes/api/utils.ts b/x-pack/plugins/cases/server/routes/api/utils.ts index 3536e4db34667..41fe1db9a7eb6 100644 --- a/x-pack/plugins/cases/server/routes/api/utils.ts +++ b/x-pack/plugins/cases/server/routes/api/utils.ts @@ -63,3 +63,15 @@ export const logDeprecatedEndpoint = (logger: Logger, headers: Headers, msg: str logger.warn(msg); } }; + +/** + * Extracts the warning value a warning header that is formatted according to RFC 7234. + * For example for the string 299 Kibana-8.1.0 "Deprecation endpoint", the return value is Deprecation endpoint. + * + */ +export const extractWarningValueFromWarningHeader = (warningHeader: string) => { + const firstQuote = warningHeader.indexOf('"'); + const lastQuote = warningHeader.length - 1; + const warningValue = warningHeader.substring(firstQuote + 1, lastQuote); + return warningValue; +}; From f82a575a548d5187d748aba7f8ba1abfdbf604b6 Mon Sep 17 00:00:00 2001 From: Marco Liberati Date: Tue, 1 Mar 2022 11:13:28 +0100 Subject: [PATCH 068/102] [Graph] Make graph app resilient to no fields or missing data views (#126441) * :bug: Fix broken scenarios with no fields or dataviews * Update x-pack/plugins/graph/public/state_management/persistence.ts * Update x-pack/plugins/graph/public/components/search_bar.tsx Co-authored-by: Matthias Wilhelm Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Matthias Wilhelm --- .../public/components/search_bar.test.tsx | 64 ++++++++++++++++++- .../graph/public/components/search_bar.tsx | 34 +++++++--- .../public/components/tooltip_wrapper.tsx | 34 ++++++++++ .../graph/public/state_management/mocks.ts | 9 ++- .../state_management/persistence.test.ts | 21 +++++- .../public/state_management/persistence.ts | 18 ++++-- 6 files changed, 161 insertions(+), 19 deletions(-) create mode 100644 x-pack/plugins/graph/public/components/tooltip_wrapper.tsx diff --git a/x-pack/plugins/graph/public/components/search_bar.test.tsx b/x-pack/plugins/graph/public/components/search_bar.test.tsx index 58a2996fd1e67..c16e661c85bf8 100644 --- a/x-pack/plugins/graph/public/components/search_bar.test.tsx +++ b/x-pack/plugins/graph/public/components/search_bar.test.tsx @@ -6,7 +6,7 @@ */ import { mountWithIntl } from '@kbn/test-jest-helpers'; -import { SearchBar, SearchBarProps } from './search_bar'; +import { SearchBar, SearchBarProps, SearchBarComponent, SearchBarStateProps } from './search_bar'; import React, { Component, ReactElement } from 'react'; import { CoreStart } from 'src/core/public'; import { act } from 'react-dom/test-utils'; @@ -26,8 +26,8 @@ jest.mock('../services/source_modal', () => ({ openSourceModal: jest.fn() })); const waitForIndexPatternFetch = () => new Promise((r) => setTimeout(r)); -function wrapSearchBarInContext(testProps: SearchBarProps) { - const services = { +function getServiceMocks() { + return { uiSettings: { get: (key: string) => { return 10; @@ -56,7 +56,10 @@ function wrapSearchBarInContext(testProps: SearchBarProps) { }, }, }; +} +function wrapSearchBarInContext(testProps: SearchBarProps) { + const services = getServiceMocks(); return ( @@ -120,6 +123,21 @@ describe('search_bar', () => { }); } + async function mountSearchBarWithExplicitContext(props: SearchBarProps & SearchBarStateProps) { + jest.clearAllMocks(); + const services = getServiceMocks(); + + await act(async () => { + instance = mountWithIntl( + + + + + + ); + }); + } + it('should render search bar and fetch index pattern', async () => { await mountSearchBar(); @@ -175,4 +193,44 @@ describe('search_bar', () => { expect(openSourceModal).toHaveBeenCalled(); }); + + it('should disable the graph button when no data view is configured', async () => { + const stateProps = { + submit: jest.fn(), + onIndexPatternSelected: jest.fn(), + currentDatasource: undefined, + selectedFields: [], + }; + await mountSearchBarWithExplicitContext({ + urlQuery: null, + ...defaultProps, + ...stateProps, + }); + + expect( + instance.find('[data-test-subj="graph-explore-button"]').first().prop('disabled') + ).toBeTruthy(); + }); + + it('should disable the graph button when no field is configured', async () => { + const stateProps = { + submit: jest.fn(), + onIndexPatternSelected: jest.fn(), + currentDatasource: { + type: 'indexpattern' as const, + id: '123', + title: 'test-index', + }, + selectedFields: [], + }; + await mountSearchBarWithExplicitContext({ + urlQuery: null, + ...defaultProps, + ...stateProps, + }); + + expect( + instance.find('[data-test-subj="graph-explore-button"]').first().prop('disabled') + ).toBeTruthy(); + }); }); diff --git a/x-pack/plugins/graph/public/components/search_bar.tsx b/x-pack/plugins/graph/public/components/search_bar.tsx index 57e9831d5a656..0760fb4fd2c13 100644 --- a/x-pack/plugins/graph/public/components/search_bar.tsx +++ b/x-pack/plugins/graph/public/components/search_bar.tsx @@ -10,7 +10,7 @@ import React, { useState, useEffect } from 'react'; import { i18n } from '@kbn/i18n'; import { connect } from 'react-redux'; -import { IndexPatternSavedObject, IndexPatternProvider } from '../types'; +import { IndexPatternSavedObject, IndexPatternProvider, WorkspaceField } from '../types'; import { openSourceModal } from '../services/source_modal'; import { GraphState, @@ -18,6 +18,7 @@ import { requestDatasource, IndexpatternDatasource, submitSearch, + selectedFieldsSelector, } from '../state_management'; import { useKibana } from '../../../../../src/plugins/kibana_react/public'; @@ -28,6 +29,7 @@ import { Query, esKuery, } from '../../../../../src/plugins/data/public'; +import { TooltipWrapper } from './tooltip_wrapper'; export interface SearchBarProps { isLoading: boolean; @@ -44,6 +46,7 @@ export interface SearchBarProps { export interface SearchBarStateProps { currentDatasource?: IndexpatternDatasource; + selectedFields: WorkspaceField[]; onIndexPatternSelected: (indexPattern: IndexPatternSavedObject) => void; submit: (searchTerm: string) => void; } @@ -74,6 +77,7 @@ export function SearchBarComponent(props: SearchBarStateProps & SearchBarProps) currentIndexPattern, currentDatasource, indexPatternProvider, + selectedFields, submit, onIndexPatternSelected, confirmWipeWorkspace, @@ -170,14 +174,27 @@ export function SearchBarComponent(props: SearchBarStateProps & SearchBarProps) /> - - {i18n.translate('xpack.graph.bar.exploreLabel', { defaultMessage: 'Graph' })} - + + {i18n.translate('xpack.graph.bar.exploreLabel', { defaultMessage: 'Graph' })} + + @@ -190,6 +207,7 @@ export const SearchBar = connect( return { currentDatasource: datasource.current.type === 'indexpattern' ? datasource.current : undefined, + selectedFields: selectedFieldsSelector(state), }; }, (dispatch) => ({ diff --git a/x-pack/plugins/graph/public/components/tooltip_wrapper.tsx b/x-pack/plugins/graph/public/components/tooltip_wrapper.tsx new file mode 100644 index 0000000000000..5ab7800e05349 --- /dev/null +++ b/x-pack/plugins/graph/public/components/tooltip_wrapper.tsx @@ -0,0 +1,34 @@ +/* + * 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 { EuiToolTip, EuiToolTipProps } from '@elastic/eui'; + +export type TooltipWrapperProps = Partial> & { + tooltipContent: string; + /** When the condition is truthy, the tooltip will be shown */ + condition: boolean; +}; + +export const TooltipWrapper: React.FunctionComponent = ({ + children, + condition, + tooltipContent, + ...tooltipProps +}) => { + return ( + <> + {condition ? ( + + <>{children} + + ) : ( + children + )} + + ); +}; diff --git a/x-pack/plugins/graph/public/state_management/mocks.ts b/x-pack/plugins/graph/public/state_management/mocks.ts index 5003e550f87a1..906bcde9070fc 100644 --- a/x-pack/plugins/graph/public/state_management/mocks.ts +++ b/x-pack/plugins/graph/public/state_management/mocks.ts @@ -59,9 +59,12 @@ export function createMockGraphStore({ createWorkspace: jest.fn((index, advancedSettings) => workspaceMock), getWorkspace: jest.fn(() => workspaceMock), indexPatternProvider: { - get: jest.fn(() => - Promise.resolve({ id: '123', title: 'test-pattern' } as unknown as IndexPattern) - ), + get: jest.fn(async (id: string) => { + if (id === 'missing-dataview') { + throw Error('No data view with this id'); + } + return { id: '123', title: 'test-pattern' } as unknown as IndexPattern; + }), }, I18nContext: jest .fn() diff --git a/x-pack/plugins/graph/public/state_management/persistence.test.ts b/x-pack/plugins/graph/public/state_management/persistence.test.ts index 2ef68f2198070..9f23fd773d789 100644 --- a/x-pack/plugins/graph/public/state_management/persistence.test.ts +++ b/x-pack/plugins/graph/public/state_management/persistence.test.ts @@ -18,7 +18,11 @@ import { IndexpatternDatasource, datasourceSelector } from './datasource'; import { fieldsSelector } from './fields'; import { metaDataSelector, updateMetaData } from './meta_data'; import { templatesSelector } from './url_templates'; -import { migrateLegacyIndexPatternRef, appStateToSavedWorkspace } from '../services/persistence'; +import { + migrateLegacyIndexPatternRef, + appStateToSavedWorkspace, + lookupIndexPatternId, +} from '../services/persistence'; import { settingsSelector } from './advanced_settings'; import { openSaveModal } from '../services/save_modal'; @@ -96,6 +100,21 @@ describe('persistence sagas', () => { const resultingState = env.store.getState(); expect(datasourceSelector(resultingState).current.type).toEqual('none'); }); + + it('should not crash if the data view goes missing', async () => { + (lookupIndexPatternId as jest.Mock).mockReturnValueOnce('missing-dataview'); + env.store.dispatch( + loadSavedWorkspace({ + savedWorkspace: { + title: 'my workspace', + }, + } as LoadSavedWorkspacePayload) + ); + await waitForPromise(); + expect(env.mockedDeps.notifications.toasts.addDanger).toHaveBeenCalledWith( + 'Data view "missing-dataview" not found' + ); + }); }); describe('saving saga', () => { diff --git a/x-pack/plugins/graph/public/state_management/persistence.ts b/x-pack/plugins/graph/public/state_management/persistence.ts index 27a635d25eeaf..d1e038bbb2102 100644 --- a/x-pack/plugins/graph/public/state_management/persistence.ts +++ b/x-pack/plugins/graph/public/state_management/persistence.ts @@ -66,10 +66,20 @@ export const loadingSaga = ({ } const selectedIndexPatternId = lookupIndexPatternId(savedWorkspace); - const indexPattern = (yield call( - indexPatternProvider.get, - selectedIndexPatternId - )) as IndexPattern; + let indexPattern; + try { + indexPattern = (yield call(indexPatternProvider.get, selectedIndexPatternId)) as IndexPattern; + } catch (e) { + notifications.toasts.addDanger( + i18n.translate('xpack.graph.loadWorkspace.missingDataViewErrorMessage', { + defaultMessage: 'Data view "{name}" not found', + values: { + name: selectedIndexPatternId, + }, + }) + ); + return; + } const initialSettings = settingsSelector((yield select()) as GraphState); const createdWorkspace = createWorkspace(indexPattern.title, initialSettings); From 7bea08f1a4ca2f5b697cc8721a2f116c14a9e759 Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Tue, 1 Mar 2022 11:26:45 +0100 Subject: [PATCH 069/102] extract and inject references for by value visualization panels correctly (#126499) --- .../visualize_embeddable_factory.test.ts | 241 ++++++++++++++++++ .../visualize_embeddable_factory.tsx | 68 ++++- 2 files changed, 296 insertions(+), 13 deletions(-) create mode 100644 src/plugins/visualizations/public/embeddable/visualize_embeddable_factory.test.ts diff --git a/src/plugins/visualizations/public/embeddable/visualize_embeddable_factory.test.ts b/src/plugins/visualizations/public/embeddable/visualize_embeddable_factory.test.ts new file mode 100644 index 0000000000000..814a5996af638 --- /dev/null +++ b/src/plugins/visualizations/public/embeddable/visualize_embeddable_factory.test.ts @@ -0,0 +1,241 @@ +/* + * 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 { EmbeddableStateWithType } from 'src/plugins/embeddable/common'; +import { VisualizeEmbeddableFactory, VisualizeInput } from '.'; +import { VisualizeEmbeddableFactoryDeps } from './visualize_embeddable_factory'; + +describe('visualize_embeddable_factory', () => { + const factory = new VisualizeEmbeddableFactory({} as VisualizeEmbeddableFactoryDeps); + test('extract saved search references for search source state and not store them in state', () => { + const { state, references } = factory.extract({ + savedVis: { + type: 'area', + params: {}, + uiState: {}, + data: { + aggs: [ + { + id: '1', + enabled: true, + type: 'count', + params: {}, + schema: 'metric', + }, + ], + searchSource: { + query: { + query: '', + language: 'kuery', + }, + filter: [], + }, + savedSearchId: '123', + }, + }, + enhancements: {}, + type: 'visualization', + } as unknown as EmbeddableStateWithType); + expect(references).toEqual([ + { + type: 'search', + name: 'search_0', + id: '123', + }, + ]); + expect((state as unknown as VisualizeInput).savedVis?.data.savedSearchId).toBeUndefined(); + }); + + test('extract data view references for search source state and not store them in state', () => { + const { state, references } = factory.extract({ + savedVis: { + type: 'area', + params: {}, + uiState: {}, + data: { + aggs: [ + { + id: '1', + enabled: true, + type: 'count', + params: {}, + schema: 'metric', + }, + ], + searchSource: { + query: { + query: '', + language: 'kuery', + }, + index: '123', + filter: [], + }, + }, + }, + enhancements: {}, + type: 'visualization', + } as unknown as EmbeddableStateWithType); + expect(references).toEqual([ + { + type: 'index-pattern', + name: ( + (state as unknown as VisualizeInput).savedVis?.data.searchSource as { + indexRefName: string; + } + ).indexRefName, + id: '123', + }, + ]); + expect((state as unknown as VisualizeInput).savedVis?.data.searchSource.index).toBeUndefined(); + }); + + test('inject data view references into search source state', () => { + const embeddedState = factory.inject( + { + savedVis: { + type: 'area', + params: {}, + uiState: {}, + data: { + aggs: [ + { + id: '1', + enabled: true, + type: 'count', + params: {}, + schema: 'metric', + }, + ], + searchSource: { + query: { + query: '', + language: 'kuery', + }, + indexRefName: 'x', + filter: [], + }, + }, + }, + enhancements: {}, + type: 'visualization', + } as unknown as EmbeddableStateWithType, + [{ name: 'x', id: '123', type: 'index-pattern' }] + ) as VisualizeInput; + expect(embeddedState.savedVis!.data.searchSource.index).toBe('123'); + expect( + (embeddedState.savedVis!.data.searchSource as { indexRefName: string }).indexRefName + ).toBe(undefined); + }); + + test('inject data view reference into search source state even if it is in injected state already', () => { + const embeddedState = factory.inject( + { + savedVis: { + type: 'area', + params: {}, + uiState: {}, + data: { + aggs: [ + { + id: '1', + enabled: true, + type: 'count', + params: {}, + schema: 'metric', + }, + ], + searchSource: { + query: { + query: '', + language: 'kuery', + }, + index: '456', + filter: [], + }, + }, + }, + enhancements: {}, + type: 'visualization', + } as unknown as EmbeddableStateWithType, + [{ name: 'kibanaSavedObjectMeta.searchSourceJSON.index', id: '123', type: 'index-pattern' }] + ) as VisualizeInput; + expect(embeddedState.savedVis!.data.searchSource.index).toBe('123'); + expect( + (embeddedState.savedVis!.data.searchSource as { indexRefName: string }).indexRefName + ).toBe(undefined); + }); + + test('inject search reference into search source state', () => { + const embeddedState = factory.inject( + { + savedVis: { + type: 'area', + params: {}, + uiState: {}, + data: { + aggs: [ + { + id: '1', + enabled: true, + type: 'count', + params: {}, + schema: 'metric', + }, + ], + searchSource: { + query: { + query: '', + language: 'kuery', + }, + filter: [], + }, + }, + }, + enhancements: {}, + type: 'visualization', + } as unknown as EmbeddableStateWithType, + [{ name: 'search_0', id: '123', type: 'search' }] + ); + expect((embeddedState as VisualizeInput).savedVis!.data.savedSearchId).toBe('123'); + }); + + test('inject search reference into search source state even if it is injected already', () => { + const embeddedState = factory.inject( + { + savedVis: { + type: 'area', + params: {}, + uiState: {}, + data: { + aggs: [ + { + id: '1', + enabled: true, + type: 'count', + params: {}, + schema: 'metric', + }, + ], + searchSource: { + query: { + query: '', + language: 'kuery', + }, + filter: [], + }, + savedSearchId: '789', + }, + }, + enhancements: {}, + type: 'visualization', + } as unknown as EmbeddableStateWithType, + [{ name: 'search_0', id: '123', type: 'search' }] + ); + expect((embeddedState as VisualizeInput).savedVis!.data.savedSearchId).toBe('123'); + }); +}); diff --git a/src/plugins/visualizations/public/embeddable/visualize_embeddable_factory.tsx b/src/plugins/visualizations/public/embeddable/visualize_embeddable_factory.tsx index 2868950867ad5..2760b64472a5e 100644 --- a/src/plugins/visualizations/public/embeddable/visualize_embeddable_factory.tsx +++ b/src/plugins/visualizations/public/embeddable/visualize_embeddable_factory.tsx @@ -11,7 +11,11 @@ import { first } from 'rxjs/operators'; import type { SavedObjectMetaData, OnSaveProps } from 'src/plugins/saved_objects/public'; import type { EmbeddableStateWithType } from 'src/plugins/embeddable/common'; -import { extractSearchSourceReferences } from '../../../data/public'; +import { + injectSearchSourceReferences, + extractSearchSourceReferences, + SerializedSearchSourceFields, +} from '../../../data/public'; import type { SavedObjectAttributes, SavedObjectReference } from '../../../../core/public'; import { @@ -288,7 +292,7 @@ export class VisualizeEmbeddableFactory } public inject(_state: EmbeddableStateWithType, references: SavedObjectReference[]) { - const state = _state as unknown as VisualizeInput; + let state = _state as unknown as VisualizeInput; const { type, params } = state.savedVis ?? {}; @@ -297,21 +301,40 @@ export class VisualizeEmbeddableFactory injectTimeSeriesReferences(type, params, references); } - return _state; + if (state.savedVis?.data.searchSource) { + let extractedSearchSource = state.savedVis?.data + .searchSource as SerializedSearchSourceFields & { + indexRefName: string; + }; + if (!('indexRefName' in state.savedVis.data.searchSource)) { + // due to a bug in 8.0, some visualizations were saved with an injected state - re-extract in that case and inject the upstream references because they might have changed + extractedSearchSource = extractSearchSourceReferences( + extractedSearchSource + )[0] as SerializedSearchSourceFields & { + indexRefName: string; + }; + } + const injectedSearchSource = injectSearchSourceReferences(extractedSearchSource, references); + state = { + ...state, + savedVis: { + ...state.savedVis, + data: { + ...state.savedVis.data, + searchSource: injectedSearchSource, + savedSearchId: references.find((r) => r.name === 'search_0')?.id, + }, + }, + }; + } + + return state as EmbeddableStateWithType; } public extract(_state: EmbeddableStateWithType) { - const state = _state as unknown as VisualizeInput; + let state = _state as unknown as VisualizeInput; const references = []; - if (state.savedVis?.data.searchSource) { - const [, searchSourceReferences] = extractSearchSourceReferences( - state.savedVis.data.searchSource - ); - - references.push(...searchSourceReferences); - } - if (state.savedVis?.data.savedSearchId) { references.push({ name: 'search_0', @@ -320,6 +343,25 @@ export class VisualizeEmbeddableFactory }); } + if (state.savedVis?.data.searchSource) { + const [extractedSearchSource, searchSourceReferences] = extractSearchSourceReferences( + state.savedVis.data.searchSource + ); + + references.push(...searchSourceReferences); + state = { + ...state, + savedVis: { + ...state.savedVis, + data: { + ...state.savedVis.data, + searchSource: extractedSearchSource, + savedSearchId: undefined, + }, + }, + }; + } + const { type, params } = state.savedVis ?? {}; if (type && params) { @@ -327,6 +369,6 @@ export class VisualizeEmbeddableFactory extractTimeSeriesReferences(type, params, references, `metrics_${state.id}`); } - return { state: _state, references }; + return { state: state as EmbeddableStateWithType, references }; } } From 25b97bbac1a4e37feac617ae2a68676f283f1661 Mon Sep 17 00:00:00 2001 From: Alexey Antonov Date: Tue, 1 Mar 2022 13:33:44 +0300 Subject: [PATCH 070/102] [Timelion] Cancel discarded searches (#125255) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../components/timelion_expression_input.tsx | 12 ++++-- .../helpers/timelion_request_handler.ts | 17 +++++++-- .../timelion/public/timelion_vis_fn.ts | 38 ++++++++++++------- .../timelion/public/timelion_vis_renderer.tsx | 18 +++++---- .../server/series_functions/es/es.test.js | 10 ++++- .../server/series_functions/es/index.js | 12 +++++- 6 files changed, 76 insertions(+), 31 deletions(-) diff --git a/src/plugins/vis_types/timelion/public/components/timelion_expression_input.tsx b/src/plugins/vis_types/timelion/public/components/timelion_expression_input.tsx index adaf87bfccd78..597d1a10dd051 100644 --- a/src/plugins/vis_types/timelion/public/components/timelion_expression_input.tsx +++ b/src/plugins/vis_types/timelion/public/components/timelion_expression_input.tsx @@ -83,11 +83,17 @@ function TimelionExpressionInput({ value, setValue }: TimelionExpressionInputPro ); useEffect(() => { + const abortController = new AbortController(); if (kibana.services.http) { - kibana.services.http.get('../api/timelion/functions').then((data) => { - functionList.current = data; - }); + kibana.services.http + .get('../api/timelion/functions', { signal: abortController.signal }) + .then((data) => { + functionList.current = data; + }); } + return () => { + abortController.abort(); + }; }, [kibana.services.http]); return ( diff --git a/src/plugins/vis_types/timelion/public/helpers/timelion_request_handler.ts b/src/plugins/vis_types/timelion/public/helpers/timelion_request_handler.ts index b613379d4d7c4..a8807cfe87b8a 100644 --- a/src/plugins/vis_types/timelion/public/helpers/timelion_request_handler.ts +++ b/src/plugins/vis_types/timelion/public/helpers/timelion_request_handler.ts @@ -54,7 +54,10 @@ export function getTimelionRequestHandler({ uiSettings, http, timefilter, -}: TimelionVisDependencies) { + expressionAbortSignal, +}: TimelionVisDependencies & { + expressionAbortSignal: AbortSignal; +}) { const timezone = getTimezone(uiSettings); return async function ({ @@ -74,6 +77,12 @@ export function getTimelionRequestHandler({ }): Promise { const dataSearch = getDataSearch(); const expression = visParams.expression; + const abortController = new AbortController(); + const expressionAbortHandler = function () { + abortController.abort(); + }; + + expressionAbortSignal.addEventListener('abort', expressionAbortHandler); if (!expression) { throw new Error( @@ -98,9 +107,7 @@ export function getTimelionRequestHandler({ const untrackSearch = dataSearch.session.isCurrentSession(searchSessionId) && dataSearch.session.trackSearch({ - abort: () => { - // TODO: support search cancellations - }, + abort: () => abortController.abort(), }); try { @@ -124,6 +131,7 @@ export function getTimelionRequestHandler({ }), }), context: executionContext, + signal: abortController.signal, }); } catch (e) { if (e && e.body) { @@ -142,6 +150,7 @@ export function getTimelionRequestHandler({ // call `untrack` if this search still belongs to current session untrackSearch(); } + expressionAbortSignal.removeEventListener('abort', expressionAbortHandler); } }; } diff --git a/src/plugins/vis_types/timelion/public/timelion_vis_fn.ts b/src/plugins/vis_types/timelion/public/timelion_vis_fn.ts index adf6c58f1cfc8..4bb195312f3b7 100644 --- a/src/plugins/vis_types/timelion/public/timelion_vis_fn.ts +++ b/src/plugins/vis_types/timelion/public/timelion_vis_fn.ts @@ -18,7 +18,7 @@ import { KibanaContext, Query, TimeRange } from '../../../data/public'; type Input = KibanaContext | null; type Output = Promise>; export interface TimelionRenderValue { - visData: TimelionSuccessResponse; + visData?: TimelionSuccessResponse; visType: 'timelion'; visParams: TimelionVisParams; } @@ -65,10 +65,12 @@ export const getTimelionVisualizationConfig = ( required: false, }, }, - async fn(input, args, { getSearchSessionId, getExecutionContext, variables }) { + async fn( + input, + args, + { getSearchSessionId, getExecutionContext, variables, abortSignal: expressionAbortSignal } + ) { const { getTimelionRequestHandler } = await import('./async_services'); - const timelionRequestHandler = getTimelionRequestHandler(dependencies); - const visParams = { expression: args.expression, interval: args.interval, @@ -77,17 +79,25 @@ export const getTimelionVisualizationConfig = ( (variables?.embeddableTitle as string) ?? getExecutionContext?.()?.description, }; + let visData: TimelionRenderValue['visData']; + + if (!expressionAbortSignal.aborted) { + const timelionRequestHandler = getTimelionRequestHandler({ + ...dependencies, + expressionAbortSignal, + }); - const response = await timelionRequestHandler({ - timeRange: get(input, 'timeRange') as TimeRange, - query: get(input, 'query') as Query, - filters: get(input, 'filters') as Filter[], - visParams, - searchSessionId: getSearchSessionId(), - executionContext: getExecutionContext(), - }); + visData = await timelionRequestHandler({ + timeRange: get(input, 'timeRange') as TimeRange, + query: get(input, 'query') as Query, + filters: get(input, 'filters') as Filter[], + visParams, + searchSessionId: getSearchSessionId(), + executionContext: getExecutionContext(), + }); - response.visType = TIMELION_VIS_NAME; + visData.visType = TIMELION_VIS_NAME; + } return { type: 'render', @@ -95,7 +105,7 @@ export const getTimelionVisualizationConfig = ( value: { visParams, visType: TIMELION_VIS_NAME, - visData: response, + visData, }, }; }, diff --git a/src/plugins/vis_types/timelion/public/timelion_vis_renderer.tsx b/src/plugins/vis_types/timelion/public/timelion_vis_renderer.tsx index 3552f6097d466..e865c3c8d7fb2 100644 --- a/src/plugins/vis_types/timelion/public/timelion_vis_renderer.tsx +++ b/src/plugins/vis_types/timelion/public/timelion_vis_renderer.tsx @@ -33,7 +33,7 @@ export const getTimelionVisRenderer: ( unmountComponentAtNode(domNode); }); - const [seriesList] = visData.sheet; + const seriesList = visData?.sheet[0]; const showNoResult = !seriesList || !seriesList.list.length; const VisComponent = deps.uiSettings.get(UI_SETTINGS.LEGACY_CHARTS_LIBRARY, false) @@ -62,13 +62,15 @@ export const getTimelionVisRenderer: ( - + {seriesList && ( + + )} , diff --git a/src/plugins/vis_types/timelion/server/series_functions/es/es.test.js b/src/plugins/vis_types/timelion/server/series_functions/es/es.test.js index 9c0dac6f6975a..6f718a6ec8e16 100644 --- a/src/plugins/vis_types/timelion/server/series_functions/es/es.test.js +++ b/src/plugins/vis_types/timelion/server/series_functions/es/es.test.js @@ -28,6 +28,12 @@ describe('es', () => { getIndexPatternsService: () => ({ find: async () => [], }), + request: { + events: { + aborted$: of(), + }, + body: {}, + }, }; } @@ -46,9 +52,11 @@ describe('es', () => { }); test('should call data search with sessionId, isRestore and isStored', async () => { + const baseTlConfig = stubRequestAndServer({ rawResponse: esResponse }); tlConfig = { - ...stubRequestAndServer({ rawResponse: esResponse }), + ...baseTlConfig, request: { + ...baseTlConfig.request, body: { searchSession: { sessionId: '1', diff --git a/src/plugins/vis_types/timelion/server/series_functions/es/index.js b/src/plugins/vis_types/timelion/server/series_functions/es/index.js index d613818d7c3e3..a86ee64f00568 100644 --- a/src/plugins/vis_types/timelion/server/series_functions/es/index.js +++ b/src/plugins/vis_types/timelion/server/series_functions/es/index.js @@ -12,6 +12,12 @@ import Datasource from '../../lib/classes/datasource'; import buildRequest from './lib/build_request'; import toSeriesList from './lib/agg_response_to_series_list'; +function getRequestAbortedSignal(aborted$) { + const controller = new AbortController(); + aborted$.subscribe(() => controller.abort()); + return controller.signal; +} + export default new Datasource('es', { hideFitArg: true, args: [ @@ -107,13 +113,17 @@ export default new Datasource('es', { const body = buildRequest(config, tlConfig, scriptFields, runtimeFields, esShardTimeout); + // User may abort the request without waiting for the results + // we need to handle this scenario by aborting underlying server requests + const abortSignal = getRequestAbortedSignal(tlConfig.request.events.aborted$); + const resp = await tlConfig.context.search .search( body, { ...tlConfig.request?.body.searchSession, }, - tlConfig.context + { ...tlConfig.context, abortSignal } ) .toPromise(); From 1bc178fe76f305df44afa140996e454cdb441f8a Mon Sep 17 00:00:00 2001 From: Pablo Machado Date: Tue, 1 Mar 2022 13:35:19 +0100 Subject: [PATCH 071/102] Add anomalies tab to user page (#126079) * Add anomalies tab to the users page --- .../ml/anomaly/use_anomalies_table_data.ts | 5 +- .../components/ml/api/anomalies_table_data.ts | 2 + .../get_criteria_from_users_type.test.ts | 26 +++ .../criteria/get_criteria_from_users_type.ts | 20 +++ .../get_host_name_from_influencers.test.ts | 27 +-- .../get_network_from_influencers.test.ts | 32 ++-- .../get_user_name_from_influencers.test.ts | 35 ++++ .../get_user_name_from_influencers.ts | 31 ++++ .../ml/tables/anomalies_host_table.tsx | 21 +-- .../ml/tables/anomalies_user_table.tsx | 97 ++++++++++ .../tables/convert_anomalies_to_users.test.ts | 167 ++++++++++++++++++ .../ml/tables/convert_anomalies_to_users.ts | 41 +++++ .../ml/tables/create_compound_key.test.ts | 23 +-- .../ml/tables/create_compound_key.ts | 9 +- ...ality.test.ts => default_equality.test.ts} | 14 +- .../{host_equality.ts => default_equality.ts} | 8 +- .../get_anomalies_host_table_columns.test.tsx | 100 +---------- .../get_anomalies_host_table_columns.tsx | 106 +---------- ...t_anomalies_network_table_columns.test.tsx | 55 ------ .../get_anomalies_network_table_columns.tsx | 89 +--------- .../get_anomalies_table_columns.test.tsx | 73 ++++++++ .../ml/tables/get_anomalies_table_columns.tsx | 111 ++++++++++++ .../get_anomalies_user_table_columns.test.tsx | 40 +++++ .../get_anomalies_user_table_columns.tsx | 60 +++++++ .../components/ml/tables/network_equality.ts | 5 +- .../components/ml/tables/translations.ts | 4 + .../public/common/components/ml/types.ts | 26 ++- .../anomalies_query_tab_body/types.ts | 3 +- .../public/common/mock/global_state.ts | 2 + .../public/users/jest.config.js | 24 +++ .../public/users/pages/constants.ts | 2 +- .../public/users/pages/details/nav_tabs.tsx | 2 +- .../public/users/pages/details/utils.ts | 3 +- .../public/users/pages/nav_tabs.tsx | 8 +- .../public/users/pages/navigation/types.ts | 2 +- .../public/users/pages/translations.ts | 16 +- .../public/users/pages/users_tabs.test.tsx | 79 +++++++++ .../public/users/pages/users_tabs.tsx | 64 +++++-- .../public/users/store/model.ts | 2 + .../public/users/store/reducer.ts | 15 +- 40 files changed, 987 insertions(+), 462 deletions(-) create mode 100644 x-pack/plugins/security_solution/public/common/components/ml/criteria/get_criteria_from_users_type.test.ts create mode 100644 x-pack/plugins/security_solution/public/common/components/ml/criteria/get_criteria_from_users_type.ts create mode 100644 x-pack/plugins/security_solution/public/common/components/ml/influencers/get_user_name_from_influencers.test.ts create mode 100644 x-pack/plugins/security_solution/public/common/components/ml/influencers/get_user_name_from_influencers.ts create mode 100644 x-pack/plugins/security_solution/public/common/components/ml/tables/anomalies_user_table.tsx create mode 100644 x-pack/plugins/security_solution/public/common/components/ml/tables/convert_anomalies_to_users.test.ts create mode 100644 x-pack/plugins/security_solution/public/common/components/ml/tables/convert_anomalies_to_users.ts rename x-pack/plugins/security_solution/public/common/components/ml/tables/{host_equality.test.ts => default_equality.test.ts} (89%) rename x-pack/plugins/security_solution/public/common/components/ml/tables/{host_equality.ts => default_equality.ts} (68%) create mode 100644 x-pack/plugins/security_solution/public/common/components/ml/tables/get_anomalies_table_columns.test.tsx create mode 100644 x-pack/plugins/security_solution/public/common/components/ml/tables/get_anomalies_table_columns.tsx create mode 100644 x-pack/plugins/security_solution/public/common/components/ml/tables/get_anomalies_user_table_columns.test.tsx create mode 100644 x-pack/plugins/security_solution/public/common/components/ml/tables/get_anomalies_user_table_columns.tsx create mode 100644 x-pack/plugins/security_solution/public/users/jest.config.js create mode 100644 x-pack/plugins/security_solution/public/users/pages/users_tabs.test.tsx diff --git a/x-pack/plugins/security_solution/public/common/components/ml/anomaly/use_anomalies_table_data.ts b/x-pack/plugins/security_solution/public/common/components/ml/anomaly/use_anomalies_table_data.ts index 05a75a69909bd..f1cab9c2f441d 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml/anomaly/use_anomalies_table_data.ts +++ b/x-pack/plugins/security_solution/public/common/components/ml/anomaly/use_anomalies_table_data.ts @@ -6,7 +6,7 @@ */ import { useState, useEffect, useMemo } from 'react'; - +import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { DEFAULT_ANOMALY_SCORE } from '../../../../../common/constants'; import { anomaliesTableData } from '../api/anomalies_table_data'; import { InfluencerInput, Anomalies, CriteriaFields } from '../types'; @@ -23,6 +23,7 @@ interface Args { threshold?: number; skip?: boolean; criteriaFields?: CriteriaFields[]; + filterQuery?: estypes.QueryDslQueryContainer; } type Return = [boolean, Anomalies | null]; @@ -55,6 +56,7 @@ export const useAnomaliesTableData = ({ endDate, threshold = -1, skip = false, + filterQuery, }: Args): Return => { const [tableData, setTableData] = useState(null); const { isMlUser, jobs } = useInstalledSecurityJobs(); @@ -84,6 +86,7 @@ export const useAnomaliesTableData = ({ { jobIds, criteriaFields: criteriaFieldsInput, + influencersFilterQuery: filterQuery, aggregationInterval: 'auto', threshold: getThreshold(anomalyScore, threshold), earliestMs, diff --git a/x-pack/plugins/security_solution/public/common/components/ml/api/anomalies_table_data.ts b/x-pack/plugins/security_solution/public/common/components/ml/api/anomalies_table_data.ts index 2c83cb2e2d5b9..01ed306d08318 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml/api/anomalies_table_data.ts +++ b/x-pack/plugins/security_solution/public/common/components/ml/api/anomalies_table_data.ts @@ -5,6 +5,7 @@ * 2.0. */ +import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { Anomalies, InfluencerInput, CriteriaFields } from '../types'; import { KibanaServices } from '../../../lib/kibana'; @@ -19,6 +20,7 @@ export interface Body { dateFormatTz: string; maxRecords: number; maxExamples: number; + influencersFilterQuery?: estypes.QueryDslQueryContainer; } export const anomaliesTableData = async (body: Body, signal: AbortSignal): Promise => { diff --git a/x-pack/plugins/security_solution/public/common/components/ml/criteria/get_criteria_from_users_type.test.ts b/x-pack/plugins/security_solution/public/common/components/ml/criteria/get_criteria_from_users_type.test.ts new file mode 100644 index 0000000000000..89a38bf34f9b8 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/ml/criteria/get_criteria_from_users_type.test.ts @@ -0,0 +1,26 @@ +/* + * 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 { UsersType } from '../../../../users/store/model'; +import { getCriteriaFromUsersType } from './get_criteria_from_users_type'; + +describe('get_criteria_from_user_type', () => { + test('returns user name from criteria if the user type is details', () => { + const criteria = getCriteriaFromUsersType(UsersType.details, 'admin'); + expect(criteria).toEqual([{ fieldName: 'user.name', fieldValue: 'admin' }]); + }); + + test('returns empty array from criteria if the user type is page but rather an empty array', () => { + const criteria = getCriteriaFromUsersType(UsersType.page, 'admin'); + expect(criteria).toEqual([]); + }); + + test('returns empty array from criteria if the user name is undefined and user type is details', () => { + const criteria = getCriteriaFromUsersType(UsersType.details, undefined); + expect(criteria).toEqual([]); + }); +}); diff --git a/x-pack/plugins/security_solution/public/common/components/ml/criteria/get_criteria_from_users_type.ts b/x-pack/plugins/security_solution/public/common/components/ml/criteria/get_criteria_from_users_type.ts new file mode 100644 index 0000000000000..4f3fa93c8fe2f --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/ml/criteria/get_criteria_from_users_type.ts @@ -0,0 +1,20 @@ +/* + * 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 { UsersType } from '../../../../users/store/model'; +import { CriteriaFields } from '../types'; + +export const getCriteriaFromUsersType = ( + type: UsersType, + userName: string | undefined +): CriteriaFields[] => { + if (type === UsersType.details && userName != null) { + return [{ fieldName: 'user.name', fieldValue: userName }]; + } else { + return []; + } +}; diff --git a/x-pack/plugins/security_solution/public/common/components/ml/influencers/get_host_name_from_influencers.test.ts b/x-pack/plugins/security_solution/public/common/components/ml/influencers/get_host_name_from_influencers.test.ts index 31edb613d5b25..db15d725b31b5 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml/influencers/get_host_name_from_influencers.test.ts +++ b/x-pack/plugins/security_solution/public/common/components/ml/influencers/get_host_name_from_influencers.test.ts @@ -5,42 +5,31 @@ * 2.0. */ -import { cloneDeep } from 'lodash/fp'; import { getHostNameFromInfluencers } from './get_host_name_from_influencers'; import { mockAnomalies } from '../mock'; describe('get_host_name_from_influencers', () => { - let anomalies = cloneDeep(mockAnomalies); - - beforeEach(() => { - anomalies = cloneDeep(mockAnomalies); - }); - test('returns host names from influencers from the mock', () => { - const hostName = getHostNameFromInfluencers(anomalies.anomalies[0].influencers); - expect(hostName).toEqual('zeek-iowa'); + expect(getHostNameFromInfluencers(mockAnomalies.anomalies[0].influencers)).toEqual('zeek-iowa'); }); test('returns null if there are no influencers from the mock', () => { - anomalies.anomalies[0].influencers = []; - const hostName = getHostNameFromInfluencers(anomalies.anomalies[0].influencers); - expect(hostName).toEqual(null); + expect(getHostNameFromInfluencers([])).toEqual(null); }); test('returns null if it is given undefined influencers', () => { - const hostName = getHostNameFromInfluencers(); - expect(hostName).toEqual(null); + expect(getHostNameFromInfluencers()).toEqual(null); }); test('returns null if there influencers is an empty object', () => { - anomalies.anomalies[0].influencers = [{}]; - const hostName = getHostNameFromInfluencers(anomalies.anomalies[0].influencers); - expect(hostName).toEqual(null); + expect(getHostNameFromInfluencers([{}])).toEqual(null); }); test('returns host name mixed with other data', () => { - anomalies.anomalies[0].influencers = [{ 'host.name': 'name-1' }, { 'source.ip': '127.0.0.1' }]; - const hostName = getHostNameFromInfluencers(anomalies.anomalies[0].influencers); + const hostName = getHostNameFromInfluencers([ + { 'host.name': 'name-1' }, + { 'source.ip': '127.0.0.1' }, + ]); expect(hostName).toEqual('name-1'); }); }); diff --git a/x-pack/plugins/security_solution/public/common/components/ml/influencers/get_network_from_influencers.test.ts b/x-pack/plugins/security_solution/public/common/components/ml/influencers/get_network_from_influencers.test.ts index 16a7af42ad961..9160377b27e63 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml/influencers/get_network_from_influencers.test.ts +++ b/x-pack/plugins/security_solution/public/common/components/ml/influencers/get_network_from_influencers.test.ts @@ -5,38 +5,27 @@ * 2.0. */ -import { cloneDeep } from 'lodash/fp'; import { getNetworkFromInfluencers } from './get_network_from_influencers'; -import { mockAnomalies } from '../mock'; import { DestinationOrSource } from '../types'; describe('get_network_from_influencers', () => { - let anomalies = cloneDeep(mockAnomalies); - - beforeEach(() => { - anomalies = cloneDeep(mockAnomalies); - }); - - test('returns null if there are no influencers from the mock', () => { - anomalies.anomalies[0].influencers = []; - const network = getNetworkFromInfluencers(anomalies.anomalies[0].influencers); - expect(network).toEqual(null); + test('returns null if there are no influencers', () => { + expect(getNetworkFromInfluencers([])).toEqual(null); }); test('returns null if the influencers is an empty object', () => { - anomalies.anomalies[0].influencers = [{}]; - const network = getNetworkFromInfluencers(anomalies.anomalies[0].influencers); - expect(network).toEqual(null); + expect(getNetworkFromInfluencers([{}])).toEqual(null); }); test('returns null if the influencers are undefined', () => { - const network = getNetworkFromInfluencers(); - expect(network).toEqual(null); + expect(getNetworkFromInfluencers()).toEqual(null); }); test('returns network name of source mixed with other data', () => { - anomalies.anomalies[0].influencers = [{ 'host.name': 'name-1' }, { 'source.ip': '127.0.0.1' }]; - const network = getNetworkFromInfluencers(anomalies.anomalies[0].influencers); + const network = getNetworkFromInfluencers([ + { 'host.name': 'name-1' }, + { 'source.ip': '127.0.0.1' }, + ]); const expected: { ip: string; type: DestinationOrSource } = { ip: '127.0.0.1', type: 'source.ip', @@ -45,11 +34,10 @@ describe('get_network_from_influencers', () => { }); test('returns network name mixed with other data', () => { - anomalies.anomalies[0].influencers = [ + const network = getNetworkFromInfluencers([ { 'host.name': 'name-1' }, { 'destination.ip': '127.0.0.1' }, - ]; - const network = getNetworkFromInfluencers(anomalies.anomalies[0].influencers); + ]); const expected: { ip: string; type: DestinationOrSource } = { ip: '127.0.0.1', type: 'destination.ip', diff --git a/x-pack/plugins/security_solution/public/common/components/ml/influencers/get_user_name_from_influencers.test.ts b/x-pack/plugins/security_solution/public/common/components/ml/influencers/get_user_name_from_influencers.test.ts new file mode 100644 index 0000000000000..8e5042c8fd855 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/ml/influencers/get_user_name_from_influencers.test.ts @@ -0,0 +1,35 @@ +/* + * 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 { getUserNameFromInfluencers } from './get_user_name_from_influencers'; +import { mockAnomalies } from '../mock'; + +describe('get_user_name_from_influencers', () => { + test('returns user names from influencers from the mock', () => { + expect(getUserNameFromInfluencers(mockAnomalies.anomalies[0].influencers)).toEqual('root'); + }); + + test('returns null if there are no influencers from the mock', () => { + expect(getUserNameFromInfluencers([])).toEqual(null); + }); + + test('returns null if it is given undefined influencers', () => { + expect(getUserNameFromInfluencers()).toEqual(null); + }); + + test('returns null if there influencers is an empty object', () => { + expect(getUserNameFromInfluencers([{}])).toEqual(null); + }); + + test('returns user name mixed with other data', () => { + const userName = getUserNameFromInfluencers([ + { 'user.name': 'root' }, + { 'source.ip': '127.0.0.1' }, + ]); + expect(userName).toEqual('root'); + }); +}); diff --git a/x-pack/plugins/security_solution/public/common/components/ml/influencers/get_user_name_from_influencers.ts b/x-pack/plugins/security_solution/public/common/components/ml/influencers/get_user_name_from_influencers.ts new file mode 100644 index 0000000000000..da27c10aeaf85 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/ml/influencers/get_user_name_from_influencers.ts @@ -0,0 +1,31 @@ +/* + * 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 { getEntries } from '../get_entries'; + +export const getUserNameFromInfluencers = ( + influencers: Array> = [], + userName?: string +): string | null => { + const recordFound = influencers.find((influencer) => { + const [influencerName, influencerValue] = getEntries(influencer); + if (influencerName === 'user.name') { + if (userName == null) { + return true; + } else { + return influencerValue === userName; + } + } else { + return false; + } + }); + if (recordFound != null) { + return Object.values(recordFound)[0]; + } else { + return null; + } +}; diff --git a/x-pack/plugins/security_solution/public/common/components/ml/tables/anomalies_host_table.tsx b/x-pack/plugins/security_solution/public/common/components/ml/tables/anomalies_host_table.tsx index b4db5f6798860..e8575e19575c1 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml/tables/anomalies_host_table.tsx +++ b/x-pack/plugins/security_solution/public/common/components/ml/tables/anomalies_host_table.tsx @@ -15,13 +15,12 @@ import * as i18n from './translations'; import { getAnomaliesHostTableColumnsCurated } from './get_anomalies_host_table_columns'; import { convertAnomaliesToHosts } from './convert_anomalies_to_hosts'; import { Loader } from '../../loader'; -import { getIntervalFromAnomalies } from '../anomaly/get_interval_from_anomalies'; import { AnomaliesHostTableProps } from '../types'; import { useMlCapabilities } from '../hooks/use_ml_capabilities'; import { BasicTable } from './basic_table'; -import { hostEquality } from './host_equality'; import { getCriteriaFromHostType } from '../criteria/get_criteria_from_host_type'; import { Panel } from '../../panel'; +import { anomaliesTableDefaultEquality } from './default_equality'; const sorting = { sort: { @@ -33,7 +32,6 @@ const sorting = { const AnomaliesHostTableComponent: React.FC = ({ startDate, endDate, - narrowDateRange, hostName, skip, type, @@ -44,18 +42,14 @@ const AnomaliesHostTableComponent: React.FC = ({ endDate, skip, criteriaFields: getCriteriaFromHostType(type, hostName), + filterQuery: { + exists: { field: 'host.name' }, + }, }); const hosts = convertAnomaliesToHosts(tableData, hostName); - const interval = getIntervalFromAnomalies(tableData); - const columns = getAnomaliesHostTableColumnsCurated( - type, - startDate, - endDate, - interval, - narrowDateRange - ); + const columns = getAnomaliesHostTableColumnsCurated(type, startDate, endDate); const pagination = { initialPageIndex: 0, initialPageSize: 10, @@ -94,4 +88,7 @@ const AnomaliesHostTableComponent: React.FC = ({ } }; -export const AnomaliesHostTable = React.memo(AnomaliesHostTableComponent, hostEquality); +export const AnomaliesHostTable = React.memo( + AnomaliesHostTableComponent, + anomaliesTableDefaultEquality +); diff --git a/x-pack/plugins/security_solution/public/common/components/ml/tables/anomalies_user_table.tsx b/x-pack/plugins/security_solution/public/common/components/ml/tables/anomalies_user_table.tsx new file mode 100644 index 0000000000000..f3ee7bb89e4c8 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/ml/tables/anomalies_user_table.tsx @@ -0,0 +1,97 @@ +/* + * 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 { useAnomaliesTableData } from '../anomaly/use_anomalies_table_data'; +import { HeaderSection } from '../../header_section'; + +import { hasMlUserPermissions } from '../../../../../common/machine_learning/has_ml_user_permissions'; +import * as i18n from './translations'; + +import { Loader } from '../../loader'; +import { AnomaliesUserTableProps } from '../types'; +import { useMlCapabilities } from '../hooks/use_ml_capabilities'; +import { BasicTable } from './basic_table'; + +import { getCriteriaFromUsersType } from '../criteria/get_criteria_from_users_type'; +import { Panel } from '../../panel'; +import { anomaliesTableDefaultEquality } from './default_equality'; +import { convertAnomaliesToUsers } from './convert_anomalies_to_users'; +import { getAnomaliesUserTableColumnsCurated } from './get_anomalies_user_table_columns'; + +const sorting = { + sort: { + field: 'anomaly.severity', + direction: 'desc', + }, +} as const; + +const AnomaliesUserTableComponent: React.FC = ({ + startDate, + endDate, + userName, + skip, + type, +}) => { + const capabilities = useMlCapabilities(); + + const [loading, tableData] = useAnomaliesTableData({ + startDate, + endDate, + skip, + criteriaFields: getCriteriaFromUsersType(type, userName), + filterQuery: { + exists: { field: 'user.name' }, + }, + }); + + const users = convertAnomaliesToUsers(tableData, userName); + + const columns = getAnomaliesUserTableColumnsCurated(type, startDate, endDate); + const pagination = { + initialPageIndex: 0, + initialPageSize: 10, + totalItemCount: users.length, + pageSizeOptions: [5, 10, 20, 50], + hidePerPageOptions: false, + }; + + if (!hasMlUserPermissions(capabilities)) { + return null; + } else { + return ( + + + + type is not as specific as EUI's... + columns={columns} + items={users} + pagination={pagination} + sorting={sorting} + /> + + {loading && ( + + )} + + ); + } +}; + +export const AnomaliesUserTable = React.memo( + AnomaliesUserTableComponent, + anomaliesTableDefaultEquality +); diff --git a/x-pack/plugins/security_solution/public/common/components/ml/tables/convert_anomalies_to_users.test.ts b/x-pack/plugins/security_solution/public/common/components/ml/tables/convert_anomalies_to_users.test.ts new file mode 100644 index 0000000000000..b3c3aa64c9214 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/ml/tables/convert_anomalies_to_users.test.ts @@ -0,0 +1,167 @@ +/* + * 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 { mockAnomalies } from '../mock'; +import { convertAnomaliesToUsers, getUserNameFromEntity } from './convert_anomalies_to_users'; +import { AnomaliesByUser } from '../types'; + +describe('convert_anomalies_to_users', () => { + test('it returns expected anomalies from a user', () => { + const entities = convertAnomaliesToUsers(mockAnomalies); + + const expected: AnomaliesByUser[] = [ + { + anomaly: mockAnomalies.anomalies[0], + userName: 'root', + }, + { + anomaly: mockAnomalies.anomalies[1], + userName: 'root', + }, + ]; + expect(entities).toEqual(expected); + }); + + test('it returns empty anomalies if sent in a null', () => { + const entities = convertAnomaliesToUsers(null); + const expected: AnomaliesByUser[] = []; + expect(entities).toEqual(expected); + }); + + test('it returns a specific anomaly if sent in the user name of an anomaly', () => { + const anomalies = { + ...mockAnomalies, + anomalies: [ + { + ...mockAnomalies.anomalies[0], + entityName: 'something-else', + entityValue: 'something-else', + influencers: [ + { 'host.name': 'zeek-iowa' }, + { 'process.name': 'du' }, + { 'user.name': 'something-else' }, + ], + }, + mockAnomalies.anomalies[1], + ], + }; + + const entities = convertAnomaliesToUsers(anomalies, 'root'); + const expected: AnomaliesByUser[] = [ + { + anomaly: anomalies.anomalies[1], + userName: 'root', + }, + ]; + expect(entities).toEqual(expected); + }); + + test('it returns a specific anomaly if an influencer has the user name', () => { + const anomalies = { + ...mockAnomalies, + anomalies: [ + { + ...mockAnomalies.anomalies[0], + entityName: 'something-else', + entityValue: 'something-else', + influencers: [ + { 'host.name': 'zeek-iowa' }, + { 'process.name': 'du' }, + { 'user.name': 'something-else' }, + ], + }, + { + ...mockAnomalies.anomalies[1], + entityName: 'something-else', + entityValue: 'something-else', + }, + ], + }; + + const entities = convertAnomaliesToUsers(anomalies, 'root'); + const expected: AnomaliesByUser[] = [ + { + anomaly: anomalies.anomalies[1], + userName: 'root', + }, + ]; + expect(entities).toEqual(expected); + }); + + test('it returns empty anomalies if sent in the name of one that does not exist', () => { + const entities = convertAnomaliesToUsers(mockAnomalies, 'some-made-up-name-here-for-you'); + const expected: AnomaliesByUser[] = []; + expect(entities).toEqual(expected); + }); + + test('it returns true for a found entity name passed in', () => { + const anomalies = { + ...mockAnomalies, + anomalies: [ + { + ...mockAnomalies.anomalies[0], + entityName: 'user.name', + entityValue: 'admin', + }, + mockAnomalies.anomalies[1], + ], + }; + + const found = getUserNameFromEntity(anomalies.anomalies[0], 'admin'); + expect(found).toEqual(true); + }); + + test('it returns false for an entity name that does not exist', () => { + const anomalies = { + ...mockAnomalies, + anomalies: [ + { + ...mockAnomalies.anomalies[0], + entityName: 'user.name', + entityValue: 'admin', + }, + mockAnomalies.anomalies[1], + ], + }; + + const found = getUserNameFromEntity(anomalies.anomalies[0], 'some-made-up-entity-name'); + expect(found).toEqual(false); + }); + + test('it returns true for an entity that has user.name within it if no name is passed in', () => { + const anomalies = { + ...mockAnomalies, + anomalies: [ + { + ...mockAnomalies.anomalies[0], + entityName: 'user.name', + entityValue: 'something-made-up', + }, + mockAnomalies.anomalies[1], + ], + }; + + const found = getUserNameFromEntity(anomalies.anomalies[0]); + expect(found).toEqual(true); + }); + + test('it returns false for an entity that is not user.name and no name is passed in', () => { + const anomalies = { + ...mockAnomalies, + anomalies: [ + { + ...mockAnomalies.anomalies[0], + entityValue: 'made-up', + }, + mockAnomalies.anomalies[1], + ], + }; + + const found = getUserNameFromEntity(anomalies.anomalies[0]); + expect(found).toEqual(false); + }); +}); diff --git a/x-pack/plugins/security_solution/public/common/components/ml/tables/convert_anomalies_to_users.ts b/x-pack/plugins/security_solution/public/common/components/ml/tables/convert_anomalies_to_users.ts new file mode 100644 index 0000000000000..8f69604fc5510 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/ml/tables/convert_anomalies_to_users.ts @@ -0,0 +1,41 @@ +/* + * 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 { Anomalies, AnomaliesByUser, Anomaly } from '../types'; +import { getUserNameFromInfluencers } from '../influencers/get_user_name_from_influencers'; + +export const convertAnomaliesToUsers = ( + anomalies: Anomalies | null, + userName?: string +): AnomaliesByUser[] => { + if (anomalies == null) { + return []; + } else { + return anomalies.anomalies.reduce((accum, item) => { + if (getUserNameFromEntity(item, userName)) { + return [...accum, { userName: item.entityValue, anomaly: item }]; + } else { + const userNameFromInfluencers = getUserNameFromInfluencers(item.influencers, userName); + if (userNameFromInfluencers != null) { + return [...accum, { userName: userNameFromInfluencers, anomaly: item }]; + } else { + return accum; + } + } + }, []); + } +}; + +export const getUserNameFromEntity = (anomaly: Anomaly, userName?: string): boolean => { + if (anomaly.entityName !== 'user.name') { + return false; + } else if (userName == null) { + return true; + } else { + return anomaly.entityValue === userName; + } +}; diff --git a/x-pack/plugins/security_solution/public/common/components/ml/tables/create_compound_key.test.ts b/x-pack/plugins/security_solution/public/common/components/ml/tables/create_compound_key.test.ts index 8c80cf7901960..c70d38ca51b12 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml/tables/create_compound_key.test.ts +++ b/x-pack/plugins/security_solution/public/common/components/ml/tables/create_compound_key.test.ts @@ -7,8 +7,7 @@ import { mockAnomalies } from '../mock'; import { cloneDeep } from 'lodash/fp'; -import { createCompoundHostKey, createCompoundNetworkKey } from './create_compound_key'; -import { AnomaliesByHost, AnomaliesByNetwork } from '../types'; +import { createCompoundAnomalyKey } from './create_compound_key'; describe('create_explorer_link', () => { let anomalies = cloneDeep(mockAnomalies); @@ -17,22 +16,8 @@ describe('create_explorer_link', () => { anomalies = cloneDeep(mockAnomalies); }); - test('it creates a compound host key', () => { - const anomaliesByHost: AnomaliesByHost = { - hostName: 'some-host-name', - anomaly: anomalies.anomalies[0], - }; - const key = createCompoundHostKey(anomaliesByHost); - expect(key).toEqual('some-host-name-process.name-du-16.193669439507826-job-1'); - }); - - test('it creates a compound network key', () => { - const anomaliesByNetwork: AnomaliesByNetwork = { - type: 'destination.ip', - ip: '127.0.0.1', - anomaly: anomalies.anomalies[0], - }; - const key = createCompoundNetworkKey(anomaliesByNetwork); - expect(key).toEqual('127.0.0.1-process.name-du-16.193669439507826-job-1'); + test('it creates a compound anomaly key', () => { + const key = createCompoundAnomalyKey(anomalies.anomalies[0]); + expect(key).toEqual('process.name-du-16.193669439507826-job-1'); }); }); diff --git a/x-pack/plugins/security_solution/public/common/components/ml/tables/create_compound_key.ts b/x-pack/plugins/security_solution/public/common/components/ml/tables/create_compound_key.ts index c6e0773f0ab0c..f9ef0ff9285fe 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml/tables/create_compound_key.ts +++ b/x-pack/plugins/security_solution/public/common/components/ml/tables/create_compound_key.ts @@ -5,10 +5,7 @@ * 2.0. */ -import { AnomaliesByHost, AnomaliesByNetwork } from '../types'; +import { Anomaly } from '../types'; -export const createCompoundHostKey = (anomaliesByHost: AnomaliesByHost): string => - `${anomaliesByHost.hostName}-${anomaliesByHost.anomaly.entityName}-${anomaliesByHost.anomaly.entityValue}-${anomaliesByHost.anomaly.severity}-${anomaliesByHost.anomaly.jobId}`; - -export const createCompoundNetworkKey = (anomaliesByNetwork: AnomaliesByNetwork): string => - `${anomaliesByNetwork.ip}-${anomaliesByNetwork.anomaly.entityName}-${anomaliesByNetwork.anomaly.entityValue}-${anomaliesByNetwork.anomaly.severity}-${anomaliesByNetwork.anomaly.jobId}`; +export const createCompoundAnomalyKey = (anomaly: Anomaly): string => + `${anomaly.entityName}-${anomaly.entityValue}-${anomaly.severity}-${anomaly.jobId}`; diff --git a/x-pack/plugins/security_solution/public/common/components/ml/tables/host_equality.test.ts b/x-pack/plugins/security_solution/public/common/components/ml/tables/default_equality.test.ts similarity index 89% rename from x-pack/plugins/security_solution/public/common/components/ml/tables/host_equality.test.ts rename to x-pack/plugins/security_solution/public/common/components/ml/tables/default_equality.test.ts index 475ed4f579c4d..bbc2a9251c41d 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml/tables/host_equality.test.ts +++ b/x-pack/plugins/security_solution/public/common/components/ml/tables/default_equality.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { hostEquality } from './host_equality'; +import { anomaliesTableDefaultEquality } from './default_equality'; import { AnomaliesHostTableProps } from '../types'; import { HostsType } from '../../../../hosts/store/model'; @@ -25,7 +25,7 @@ describe('host_equality', () => { skip: false, type: HostsType.details, }; - const equal = hostEquality(prev, next); + const equal = anomaliesTableDefaultEquality(prev, next); expect(equal).toEqual(true); }); @@ -44,7 +44,7 @@ describe('host_equality', () => { skip: false, type: HostsType.details, }; - const equal = hostEquality(prev, next); + const equal = anomaliesTableDefaultEquality(prev, next); expect(equal).toEqual(false); }); @@ -63,7 +63,7 @@ describe('host_equality', () => { skip: false, type: HostsType.details, }; - const equal = hostEquality(prev, next); + const equal = anomaliesTableDefaultEquality(prev, next); expect(equal).toEqual(false); }); @@ -82,7 +82,7 @@ describe('host_equality', () => { skip: false, type: HostsType.details, }; - const equal = hostEquality(prev, next); + const equal = anomaliesTableDefaultEquality(prev, next); expect(equal).toEqual(false); }); @@ -101,7 +101,7 @@ describe('host_equality', () => { skip: false, type: HostsType.details, }; - const equal = hostEquality(prev, next); + const equal = anomaliesTableDefaultEquality(prev, next); expect(equal).toEqual(false); }); @@ -120,7 +120,7 @@ describe('host_equality', () => { skip: false, type: HostsType.details, }; - const equal = hostEquality(prev, next); + const equal = anomaliesTableDefaultEquality(prev, next); expect(equal).toEqual(false); }); }); diff --git a/x-pack/plugins/security_solution/public/common/components/ml/tables/host_equality.ts b/x-pack/plugins/security_solution/public/common/components/ml/tables/default_equality.ts similarity index 68% rename from x-pack/plugins/security_solution/public/common/components/ml/tables/host_equality.ts rename to x-pack/plugins/security_solution/public/common/components/ml/tables/default_equality.ts index 69c67fc4ca2c1..213bd922b51f3 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml/tables/host_equality.ts +++ b/x-pack/plugins/security_solution/public/common/components/ml/tables/default_equality.ts @@ -5,11 +5,11 @@ * 2.0. */ -import { AnomaliesHostTableProps } from '../types'; +import { AnomaliesTableCommonProps } from '../types'; -export const hostEquality = ( - prevProps: AnomaliesHostTableProps, - nextProps: AnomaliesHostTableProps +export const anomaliesTableDefaultEquality = ( + prevProps: AnomaliesTableCommonProps, + nextProps: AnomaliesTableCommonProps ): boolean => prevProps.startDate === nextProps.startDate && prevProps.endDate === nextProps.endDate && diff --git a/x-pack/plugins/security_solution/public/common/components/ml/tables/get_anomalies_host_table_columns.test.tsx b/x-pack/plugins/security_solution/public/common/components/ml/tables/get_anomalies_host_table_columns.test.tsx index 45883019b9ff8..364c24f000905 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml/tables/get_anomalies_host_table_columns.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/ml/tables/get_anomalies_host_table_columns.test.tsx @@ -5,121 +5,35 @@ * 2.0. */ -import React from 'react'; - import '../../../mock/match_media'; import { getAnomaliesHostTableColumnsCurated } from './get_anomalies_host_table_columns'; import { HostsType } from '../../../../hosts/store/model'; import * as i18n from './translations'; -import { AnomaliesByHost, Anomaly } from '../types'; -import { Columns } from '../../paginated_table'; -import { TestProviders } from '../../../mock'; -import { useMountAppended } from '../../../utils/use_mount_appended'; jest.mock('../../../lib/kibana'); const startDate = new Date(2001).toISOString(); const endDate = new Date(3000).toISOString(); -const interval = 'days'; -const narrowDateRange = jest.fn(); -describe('get_anomalies_host_table_columns', () => { - const mount = useMountAppended(); +describe('get_anomalies_host_table_columns', () => { test('on hosts page, we expect to get all columns', () => { - expect( - getAnomaliesHostTableColumnsCurated( - HostsType.page, - startDate, - endDate, - interval, - narrowDateRange - ).length - ).toEqual(6); + expect(getAnomaliesHostTableColumnsCurated(HostsType.page, startDate, endDate).length).toEqual( + 6 + ); }); test('on host details page, we expect to remove one columns', () => { - const columns = getAnomaliesHostTableColumnsCurated( - HostsType.details, - startDate, - endDate, - interval, - narrowDateRange - ); + const columns = getAnomaliesHostTableColumnsCurated(HostsType.details, startDate, endDate); expect(columns.length).toEqual(5); }); test('on host page, we should have Host Name', () => { - const columns = getAnomaliesHostTableColumnsCurated( - HostsType.page, - startDate, - endDate, - interval, - narrowDateRange - ); + const columns = getAnomaliesHostTableColumnsCurated(HostsType.page, startDate, endDate); expect(columns.some((col) => col.name === i18n.HOST_NAME)).toEqual(true); }); test('on host details page, we should not have Host Name', () => { - const columns = getAnomaliesHostTableColumnsCurated( - HostsType.details, - startDate, - endDate, - interval, - narrowDateRange - ); + const columns = getAnomaliesHostTableColumnsCurated(HostsType.details, startDate, endDate); expect(columns.some((col) => col.name === i18n.HOST_NAME)).toEqual(false); }); - - test('on host page, undefined influencers should turn into an empty column string', () => { - const columns = getAnomaliesHostTableColumnsCurated( - HostsType.page, - startDate, - endDate, - interval, - narrowDateRange - ); - const column = columns.find((col) => col.name === i18n.INFLUENCED_BY) as Columns< - Anomaly['influencers'], - AnomaliesByHost - >; - const anomaly: AnomaliesByHost = { - hostName: 'host.name', - anomaly: { - detectorIndex: 0, - entityName: 'entity-name-1', - entityValue: 'entity-value-1', - jobId: 'job-1', - rowId: 'row-1', - severity: 100, - time: new Date('01/01/2000').valueOf(), - source: { - job_id: 'job-1', - result_type: 'result-1', - probability: 50, - multi_bucket_impact: 0, - record_score: 0, - initial_record_score: 0, - bucket_span: 0, - detector_index: 0, - is_interim: true, - timestamp: new Date('01/01/2000').valueOf(), - by_field_name: 'some field name', - by_field_value: 'some field value', - partition_field_name: 'partition field name', - partition_field_value: 'partition field value', - function: 'function-1', - function_description: 'description-1', - typical: [5, 3], - actual: [7, 4], - influencers: [], - }, - }, - }; - if (column != null && column.render != null) { - const wrapper = mount({column.render(undefined, anomaly)}); - expect(wrapper.text()).toEqual(''); - } else { - expect(column).not.toBe(null); - } - }); }); diff --git a/x-pack/plugins/security_solution/public/common/components/ml/tables/get_anomalies_host_table_columns.tsx b/x-pack/plugins/security_solution/public/common/components/ml/tables/get_anomalies_host_table_columns.tsx index 468cb416a2f9b..7ee0b3ca88469 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml/tables/get_anomalies_host_table_columns.tsx +++ b/x-pack/plugins/security_solution/public/common/components/ml/tables/get_anomalies_host_table_columns.tsx @@ -6,27 +6,18 @@ */ import React from 'react'; -import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import { Columns } from '../../paginated_table'; -import { AnomaliesByHost, Anomaly, NarrowDateRange } from '../types'; +import { AnomaliesByHost, Anomaly } from '../types'; import { getRowItemDraggable } from '../../tables/helpers'; -import { EntityDraggable } from '../entity_draggable'; -import { createCompoundHostKey } from './create_compound_key'; +import { createCompoundAnomalyKey } from './create_compound_key'; import { HostDetailsLink } from '../../links'; - import * as i18n from './translations'; -import { getEntries } from '../get_entries'; -import { DraggableScore } from '../score/draggable_score'; -import { ExplorerLink } from '../links/create_explorer_link'; import { HostsType } from '../../../../hosts/store/model'; -import { escapeDataProviderId } from '../../drag_and_drop/helpers'; -import { FormattedRelativePreferenceDate } from '../../formatted_date'; +import { getAnomaliesDefaultTableColumns } from './get_anomalies_table_columns'; export const getAnomaliesHostTableColumns = ( startDate: string, - endDate: string, - interval: string, - narrowDateRange: NarrowDateRange + endDate: string ): [ Columns, Columns, @@ -43,100 +34,21 @@ export const getAnomaliesHostTableColumns = ( getRowItemDraggable({ rowItem: hostName, attrName: 'host.name', - idPrefix: `anomalies-host-table-hostName-${createCompoundHostKey( - anomaliesByHost + idPrefix: `anomalies-host-table-hostName-${createCompoundAnomalyKey( + anomaliesByHost.anomaly )}-hostName`, render: (item) => , }), }, - { - name: i18n.DETECTOR, - field: 'anomaly.jobId', - sortable: true, - render: (jobId, anomaliesByHost) => ( - - ), - }, - { - name: i18n.SCORE, - field: 'anomaly.severity', - sortable: true, - render: (_, anomaliesByHost) => ( - - ), - }, - { - name: i18n.ENTITY, - field: 'anomaly.entityValue', - sortable: true, - render: (entityValue, anomaliesByHost) => ( - - ), - }, - { - name: i18n.INFLUENCED_BY, - field: 'anomaly.influencers', - render: (influencers, anomaliesByHost) => ( - - {influencers && - influencers.map((influencer) => { - const [key, value] = getEntries(influencer); - const entityName = key != null ? key : ''; - const entityValue = value != null ? value : ''; - return ( - - - - - - - - ); - })} - - ), - }, - { - name: i18n.TIME_STAMP, - field: 'anomaly.time', - sortable: true, - render: (time) => , - }, + ...getAnomaliesDefaultTableColumns(startDate, endDate), ]; export const getAnomaliesHostTableColumnsCurated = ( pageType: HostsType, startDate: string, - endDate: string, - interval: string, - narrowDateRange: NarrowDateRange + endDate: string ) => { - const columns = getAnomaliesHostTableColumns(startDate, endDate, interval, narrowDateRange); + const columns = getAnomaliesHostTableColumns(startDate, endDate); // Columns to exclude from host details pages if (pageType === HostsType.details) { diff --git a/x-pack/plugins/security_solution/public/common/components/ml/tables/get_anomalies_network_table_columns.test.tsx b/x-pack/plugins/security_solution/public/common/components/ml/tables/get_anomalies_network_table_columns.test.tsx index 817205ce22808..96917bb8ed739 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml/tables/get_anomalies_network_table_columns.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/ml/tables/get_anomalies_network_table_columns.test.tsx @@ -9,19 +9,12 @@ import '../../../mock/match_media'; import { getAnomaliesNetworkTableColumnsCurated } from './get_anomalies_network_table_columns'; import { NetworkType } from '../../../../network/store/model'; import * as i18n from './translations'; -import { AnomaliesByNetwork, Anomaly } from '../types'; -import { Columns } from '../../paginated_table'; -import React from 'react'; -import { TestProviders } from '../../../mock'; -import { useMountAppended } from '../../../utils/use_mount_appended'; jest.mock('../../../../common/lib/kibana'); const startDate = new Date(2001).toISOString(); const endDate = new Date(3000).toISOString(); describe('get_anomalies_network_table_columns', () => { - const mount = useMountAppended(); - test('on network page, we expect to get all columns', () => { expect( getAnomaliesNetworkTableColumnsCurated(NetworkType.page, startDate, endDate).length @@ -42,52 +35,4 @@ describe('get_anomalies_network_table_columns', () => { const columns = getAnomaliesNetworkTableColumnsCurated(NetworkType.details, startDate, endDate); expect(columns.some((col) => col.name === i18n.NETWORK_NAME)).toEqual(false); }); - - test('on network page, undefined influencers should turn into an empty column string', () => { - const columns = getAnomaliesNetworkTableColumnsCurated(NetworkType.page, startDate, endDate); - const column = columns.find((col) => col.name === i18n.INFLUENCED_BY) as Columns< - Anomaly['influencers'], - AnomaliesByNetwork - >; - const anomaly: AnomaliesByNetwork = { - type: 'source.ip', - ip: '127.0.0.1', - anomaly: { - detectorIndex: 0, - entityName: 'entity-name-1', - entityValue: 'entity-value-1', - jobId: 'job-1', - rowId: 'row-1', - severity: 100, - time: new Date('01/01/2000').valueOf(), - source: { - job_id: 'job-1', - result_type: 'result-1', - probability: 50, - multi_bucket_impact: 0, - record_score: 0, - initial_record_score: 0, - bucket_span: 0, - detector_index: 0, - is_interim: true, - timestamp: new Date('01/01/2000').valueOf(), - by_field_name: 'some field name', - by_field_value: 'some field value', - partition_field_name: 'partition field name', - partition_field_value: 'partition field value', - function: 'function-1', - function_description: 'description-1', - typical: [5, 3], - actual: [7, 4], - influencers: [], - }, - }, - }; - if (column != null && column.render != null) { - const wrapper = mount({column.render(undefined, anomaly)}); - expect(wrapper.text()).toEqual(''); - } else { - expect(column).not.toBe(null); - } - }); }); diff --git a/x-pack/plugins/security_solution/public/common/components/ml/tables/get_anomalies_network_table_columns.tsx b/x-pack/plugins/security_solution/public/common/components/ml/tables/get_anomalies_network_table_columns.tsx index 4c4e131a9d467..44c6a193c30fd 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml/tables/get_anomalies_network_table_columns.tsx +++ b/x-pack/plugins/security_solution/public/common/components/ml/tables/get_anomalies_network_table_columns.tsx @@ -6,23 +6,17 @@ */ import React from 'react'; -import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import { Columns } from '../../paginated_table'; import { Anomaly, AnomaliesByNetwork } from '../types'; import { getRowItemDraggable } from '../../tables/helpers'; -import { EntityDraggable } from '../entity_draggable'; -import { createCompoundNetworkKey } from './create_compound_key'; +import { createCompoundAnomalyKey } from './create_compound_key'; import { NetworkDetailsLink } from '../../links'; import * as i18n from './translations'; -import { getEntries } from '../get_entries'; -import { DraggableScore } from '../score/draggable_score'; -import { ExplorerLink } from '../links/create_explorer_link'; -import { FormattedRelativePreferenceDate } from '../../formatted_date'; import { NetworkType } from '../../../../network/store/model'; -import { escapeDataProviderId } from '../../drag_and_drop/helpers'; import { FlowTarget } from '../../../../../common/search_strategy'; +import { getAnomaliesDefaultTableColumns } from './get_anomalies_table_columns'; export const getAnomaliesNetworkTableColumns = ( startDate: string, @@ -44,84 +38,13 @@ export const getAnomaliesNetworkTableColumns = ( getRowItemDraggable({ rowItem: ip, attrName: anomaliesByNetwork.type, - idPrefix: `anomalies-network-table-ip-${createCompoundNetworkKey(anomaliesByNetwork)}`, + idPrefix: `anomalies-network-table-ip-${createCompoundAnomalyKey( + anomaliesByNetwork.anomaly + )}`, render: (item) => , }), }, - { - name: i18n.DETECTOR, - field: 'anomaly.jobId', - sortable: true, - render: (jobId, anomaliesByHost) => ( - - ), - }, - { - name: i18n.SCORE, - field: 'anomaly.severity', - sortable: true, - render: (_, anomaliesByNetwork) => ( - - ), - }, - { - name: i18n.ENTITY, - field: 'anomaly.entityValue', - sortable: true, - render: (entityValue, anomaliesByNetwork) => ( - - ), - }, - { - name: i18n.INFLUENCED_BY, - field: 'anomaly.influencers', - render: (influencers, anomaliesByNetwork) => ( - - {influencers && - influencers.map((influencer) => { - const [key, value] = getEntries(influencer); - const entityName = key != null ? key : ''; - const entityValue = value != null ? value : ''; - return ( - - - - ); - })} - - ), - }, - { - name: i18n.TIME_STAMP, - field: 'anomaly.time', - sortable: true, - render: (time) => , - }, + ...getAnomaliesDefaultTableColumns(startDate, endDate), ]; export const getAnomaliesNetworkTableColumnsCurated = ( diff --git a/x-pack/plugins/security_solution/public/common/components/ml/tables/get_anomalies_table_columns.test.tsx b/x-pack/plugins/security_solution/public/common/components/ml/tables/get_anomalies_table_columns.test.tsx new file mode 100644 index 0000000000000..3df8d545d2871 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/ml/tables/get_anomalies_table_columns.test.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 '../../../mock/match_media'; +import * as i18n from './translations'; +import { AnomaliesBy, Anomaly } from '../types'; +import { Columns } from '../../paginated_table'; +import React from 'react'; +import { TestProviders } from '../../../mock'; +import { useMountAppended } from '../../../utils/use_mount_appended'; +import { getAnomaliesDefaultTableColumns } from './get_anomalies_table_columns'; + +jest.mock('../../../../common/lib/kibana'); + +const startDate = new Date(2001).toISOString(); +const endDate = new Date(3000).toISOString(); +describe('getAnomaliesDefaultTableColumns', () => { + const mount = useMountAppended(); + + test('it should return all columns', () => { + expect(getAnomaliesDefaultTableColumns(startDate, endDate).length).toEqual(5); + }); + + test('it should return an empty column string for undefined influencers', () => { + const columns = getAnomaliesDefaultTableColumns(startDate, endDate); + const column = columns.find((col) => col.name === i18n.INFLUENCED_BY) as Columns< + Anomaly['influencers'], + AnomaliesBy + >; + const anomaly: AnomaliesBy = { + anomaly: { + detectorIndex: 0, + entityName: 'entity-name-1', + entityValue: 'entity-value-1', + jobId: 'job-1', + rowId: 'row-1', + severity: 100, + time: new Date('01/01/2000').valueOf(), + source: { + job_id: 'job-1', + result_type: 'result-1', + probability: 50, + multi_bucket_impact: 0, + record_score: 0, + initial_record_score: 0, + bucket_span: 0, + detector_index: 0, + is_interim: true, + timestamp: new Date('01/01/2000').valueOf(), + by_field_name: 'some field name', + by_field_value: 'some field value', + partition_field_name: 'partition field name', + partition_field_value: 'partition field value', + function: 'function-1', + function_description: 'description-1', + typical: [5, 3], + actual: [7, 4], + influencers: [], + }, + }, + }; + if (column != null && column.render != null) { + const wrapper = mount({column.render(undefined, anomaly)}); + expect(wrapper.text()).toEqual(''); + } else { + expect(column).not.toBe(null); + } + }); +}); diff --git a/x-pack/plugins/security_solution/public/common/components/ml/tables/get_anomalies_table_columns.tsx b/x-pack/plugins/security_solution/public/common/components/ml/tables/get_anomalies_table_columns.tsx new file mode 100644 index 0000000000000..eb3d7aac2ae2f --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/ml/tables/get_anomalies_table_columns.tsx @@ -0,0 +1,111 @@ +/* + * 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 { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import { Columns } from '../../paginated_table'; +import { AnomaliesBy, Anomaly } from '../types'; + +import { EntityDraggable } from '../entity_draggable'; +import { createCompoundAnomalyKey } from './create_compound_key'; + +import * as i18n from './translations'; +import { getEntries } from '../get_entries'; +import { DraggableScore } from '../score/draggable_score'; +import { ExplorerLink } from '../links/create_explorer_link'; +import { escapeDataProviderId } from '../../drag_and_drop/helpers'; +import { FormattedRelativePreferenceDate } from '../../formatted_date'; + +export const getAnomaliesDefaultTableColumns = ( + startDate: string, + endDate: string +): [ + Columns, + Columns, + Columns, + Columns, + Columns +] => [ + { + name: i18n.DETECTOR, + field: 'anomaly.jobId', + sortable: true, + render: (jobId, anomalyBy) => ( + + ), + }, + { + name: i18n.SCORE, + field: 'anomaly.severity', + sortable: true, + render: (_, anomalyBy) => ( + + ), + }, + { + name: i18n.ENTITY, + field: 'anomaly.entityValue', + sortable: true, + render: (entityValue, anomalyBy) => ( + + ), + }, + { + name: i18n.INFLUENCED_BY, + field: 'anomaly.influencers', + render: (influencers, anomalyBy) => ( + + {influencers && + influencers.map((influencer) => { + const [key, value] = getEntries(influencer); + const entityName = key != null ? key : ''; + const entityValue = value != null ? value : ''; + return ( + + + + + + + + ); + })} + + ), + }, + { + name: i18n.TIME_STAMP, + field: 'anomaly.time', + sortable: true, + render: (time) => , + }, +]; diff --git a/x-pack/plugins/security_solution/public/common/components/ml/tables/get_anomalies_user_table_columns.test.tsx b/x-pack/plugins/security_solution/public/common/components/ml/tables/get_anomalies_user_table_columns.test.tsx new file mode 100644 index 0000000000000..5905a7ceaa114 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/ml/tables/get_anomalies_user_table_columns.test.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 { UsersType } from '../../../../users/store/model'; +import '../../../mock/match_media'; +import { getAnomaliesUserTableColumnsCurated } from './get_anomalies_user_table_columns'; + +import * as i18n from './translations'; + +jest.mock('../../../lib/kibana'); + +const startDate = new Date(2001).toISOString(); +const endDate = new Date(3000).toISOString(); + +describe('get_anomalies_user_table_columns', () => { + test('on users page, we expect to get all columns', () => { + expect(getAnomaliesUserTableColumnsCurated(UsersType.page, startDate, endDate).length).toEqual( + 6 + ); + }); + + test('on user details page, we expect to remove one columns', () => { + const columns = getAnomaliesUserTableColumnsCurated(UsersType.details, startDate, endDate); + expect(columns.length).toEqual(5); + }); + + test('on users page, we should have User Name', () => { + const columns = getAnomaliesUserTableColumnsCurated(UsersType.page, startDate, endDate); + expect(columns.some((col) => col.name === i18n.USER_NAME)).toEqual(true); + }); + + test('on user details page, we should not have User Name', () => { + const columns = getAnomaliesUserTableColumnsCurated(UsersType.details, startDate, endDate); + expect(columns.some((col) => col.name === i18n.USER_NAME)).toEqual(false); + }); +}); diff --git a/x-pack/plugins/security_solution/public/common/components/ml/tables/get_anomalies_user_table_columns.tsx b/x-pack/plugins/security_solution/public/common/components/ml/tables/get_anomalies_user_table_columns.tsx new file mode 100644 index 0000000000000..6bc9aefecfae1 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/ml/tables/get_anomalies_user_table_columns.tsx @@ -0,0 +1,60 @@ +/* + * 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 { Columns } from '../../paginated_table'; +import { AnomaliesByUser, Anomaly } from '../types'; +import { getRowItemDraggable } from '../../tables/helpers'; +import { createCompoundAnomalyKey } from './create_compound_key'; +import { UserDetailsLink } from '../../links'; + +import * as i18n from './translations'; +import { UsersType } from '../../../../users/store/model'; +import { getAnomaliesDefaultTableColumns } from './get_anomalies_table_columns'; + +export const getAnomaliesUserTableColumns = ( + startDate: string, + endDate: string +): [ + Columns, + Columns, + Columns, + Columns, + Columns, + Columns +] => [ + { + name: i18n.USER_NAME, + field: 'userName', + sortable: true, + render: (userName, anomaliesByUser) => + getRowItemDraggable({ + rowItem: userName, + attrName: 'user.name', + idPrefix: `anomalies-user-table-userName-${createCompoundAnomalyKey( + anomaliesByUser.anomaly + )}-userName`, + render: (item) => , + }), + }, + ...getAnomaliesDefaultTableColumns(startDate, endDate), +]; + +export const getAnomaliesUserTableColumnsCurated = ( + pageType: UsersType, + startDate: string, + endDate: string +) => { + const columns = getAnomaliesUserTableColumns(startDate, endDate); + + // Columns to exclude from user details pages + if (pageType === UsersType.details) { + return columns.filter((column) => column.name !== i18n.USER_NAME); + } else { + return columns; + } +}; diff --git a/x-pack/plugins/security_solution/public/common/components/ml/tables/network_equality.ts b/x-pack/plugins/security_solution/public/common/components/ml/tables/network_equality.ts index 080720bd99808..4354fa75f5f91 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml/tables/network_equality.ts +++ b/x-pack/plugins/security_solution/public/common/components/ml/tables/network_equality.ts @@ -6,12 +6,11 @@ */ import { AnomaliesNetworkTableProps } from '../types'; +import { anomaliesTableDefaultEquality } from './default_equality'; export const networkEquality = ( prevProps: AnomaliesNetworkTableProps, nextProps: AnomaliesNetworkTableProps ): boolean => - prevProps.startDate === nextProps.startDate && - prevProps.endDate === nextProps.endDate && - prevProps.skip === nextProps.skip && + anomaliesTableDefaultEquality(prevProps, nextProps) && prevProps.flowTarget === nextProps.flowTarget; diff --git a/x-pack/plugins/security_solution/public/common/components/ml/tables/translations.ts b/x-pack/plugins/security_solution/public/common/components/ml/tables/translations.ts index 20e2896170c5c..e0c7a169bf9e3 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml/tables/translations.ts +++ b/x-pack/plugins/security_solution/public/common/components/ml/tables/translations.ts @@ -42,6 +42,10 @@ export const HOST_NAME = i18n.translate('xpack.securitySolution.ml.table.hostNam defaultMessage: 'Host name', }); +export const USER_NAME = i18n.translate('xpack.securitySolution.ml.table.userNameTitle', { + defaultMessage: 'User name', +}); + export const INFLUENCED_BY = i18n.translate('xpack.securitySolution.ml.table.influencedByTitle', { defaultMessage: 'Influenced by', }); diff --git a/x-pack/plugins/security_solution/public/common/components/ml/types.ts b/x-pack/plugins/security_solution/public/common/components/ml/types.ts index 494c8a522ffac..c5be26fb57648 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml/types.ts +++ b/x-pack/plugins/security_solution/public/common/components/ml/types.ts @@ -10,6 +10,7 @@ import { FlowTarget } from '../../../../common/search_strategy'; import { HostsType } from '../../../hosts/store/model'; import { NetworkType } from '../../../network/store/model'; +import { UsersType } from '../../../users/store/model'; export interface Source { job_id: string; @@ -62,37 +63,48 @@ export interface Anomalies { export type NarrowDateRange = (score: Anomaly, interval: string) => void; -export interface AnomaliesByHost { - hostName: string; +export interface AnomaliesBy { anomaly: Anomaly; } +export interface AnomaliesByHost extends AnomaliesBy { + hostName: string; +} + export type DestinationOrSource = 'source.ip' | 'destination.ip'; -export interface AnomaliesByNetwork { +export interface AnomaliesByNetwork extends AnomaliesBy { type: DestinationOrSource; ip: string; - anomaly: Anomaly; } -export interface HostOrNetworkProps { +export interface AnomaliesByUser extends AnomaliesBy { + userName: string; +} + +export interface AnomaliesTableCommonProps { startDate: string; endDate: string; narrowDateRange: NarrowDateRange; skip: boolean; } -export type AnomaliesHostTableProps = HostOrNetworkProps & { +export type AnomaliesHostTableProps = AnomaliesTableCommonProps & { hostName?: string; type: HostsType; }; -export type AnomaliesNetworkTableProps = HostOrNetworkProps & { +export type AnomaliesNetworkTableProps = AnomaliesTableCommonProps & { ip?: string; type: NetworkType; flowTarget?: FlowTarget; }; +export type AnomaliesUserTableProps = AnomaliesTableCommonProps & { + userName?: string; + type: UsersType; +}; + const sourceOrDestination = ['source.ip', 'destination.ip']; export const isDestinationOrSource = (value: string | null): value is DestinationOrSource => diff --git a/x-pack/plugins/security_solution/public/common/containers/anomalies/anomalies_query_tab_body/types.ts b/x-pack/plugins/security_solution/public/common/containers/anomalies/anomalies_query_tab_body/types.ts index 2d3bb00501da5..ee3ace3819fd3 100644 --- a/x-pack/plugins/security_solution/public/common/containers/anomalies/anomalies_query_tab_body/types.ts +++ b/x-pack/plugins/security_solution/public/common/containers/anomalies/anomalies_query_tab_body/types.ts @@ -12,9 +12,10 @@ import { GlobalTimeArgs } from '../../use_global_time'; import { HostsType } from '../../../../hosts/store/model'; import { NetworkType } from '../../../../network/store//model'; import { FlowTarget } from '../../../../../common/search_strategy'; +import { UsersType } from '../../../../users/store/model'; interface QueryTabBodyProps { - type: HostsType | NetworkType; + type: HostsType | NetworkType | UsersType; filterQuery?: string | ESTermQuery; } diff --git a/x-pack/plugins/security_solution/public/common/mock/global_state.ts b/x-pack/plugins/security_solution/public/common/mock/global_state.ts index 39e65a8c4e364..b65a8ece16c03 100644 --- a/x-pack/plugins/security_solution/public/common/mock/global_state.ts +++ b/x-pack/plugins/security_solution/public/common/mock/global_state.ts @@ -205,6 +205,7 @@ export const mockGlobalState: State = { limit: 10, // TODO sort: { field: RiskScoreFields.riskScore, direction: Direction.desc }, }, + [usersModel.UsersTableType.anomalies]: null, }, }, details: { @@ -214,6 +215,7 @@ export const mockGlobalState: State = { limit: 10, // TODO sort: { field: HostRulesFields.riskScore, direction: Direction.desc }, }, + [usersModel.UsersTableType.anomalies]: null, }, }, }, diff --git a/x-pack/plugins/security_solution/public/users/jest.config.js b/x-pack/plugins/security_solution/public/users/jest.config.js new file mode 100644 index 0000000000000..563491dd5befe --- /dev/null +++ b/x-pack/plugins/security_solution/public/users/jest.config.js @@ -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. + */ + +module.exports = { + preset: '@kbn/test', + rootDir: '../../../../..', + roots: ['/x-pack/plugins/security_solution/public/users'], + coverageDirectory: + '/target/kibana-coverage/jest/x-pack/plugins/security_solution/public/users', + coverageReporters: ['text', 'html'], + collectCoverageFrom: ['/x-pack/plugins/security_solution/public/users/**/*.{ts,tsx}'], + // See: https://github.com/elastic/kibana/issues/117255, the moduleNameMapper creates mocks to avoid memory leaks from kibana core. + moduleNameMapper: { + 'core/server$': '/x-pack/plugins/security_solution/server/__mocks__/core.mock.ts', + 'task_manager/server$': + '/x-pack/plugins/security_solution/server/__mocks__/task_manager.mock.ts', + 'alerting/server$': '/x-pack/plugins/security_solution/server/__mocks__/alert.mock.ts', + 'actions/server$': '/x-pack/plugins/security_solution/server/__mocks__/action.mock.ts', + }, +}; diff --git a/x-pack/plugins/security_solution/public/users/pages/constants.ts b/x-pack/plugins/security_solution/public/users/pages/constants.ts index bb273bf479aec..48c2937657721 100644 --- a/x-pack/plugins/security_solution/public/users/pages/constants.ts +++ b/x-pack/plugins/security_solution/public/users/pages/constants.ts @@ -10,6 +10,6 @@ import { UsersTableType } from '../store/model'; export const usersDetailsPagePath = `${USERS_PATH}/:detailName`; -export const usersTabPath = `${USERS_PATH}/:tabName(${UsersTableType.allUsers})`; +export const usersTabPath = `${USERS_PATH}/:tabName(${UsersTableType.allUsers}|${UsersTableType.anomalies})`; export const usersDetailsTabPath = `${usersDetailsPagePath}/:tabName(${UsersTableType.allUsers})`; diff --git a/x-pack/plugins/security_solution/public/users/pages/details/nav_tabs.tsx b/x-pack/plugins/security_solution/public/users/pages/details/nav_tabs.tsx index 2eff1efb85789..ddff8109daf24 100644 --- a/x-pack/plugins/security_solution/public/users/pages/details/nav_tabs.tsx +++ b/x-pack/plugins/security_solution/public/users/pages/details/nav_tabs.tsx @@ -17,7 +17,7 @@ export const navTabsUsersDetails = (hostName: string): UsersDetailsNavTab => { return { [UsersTableType.allUsers]: { id: UsersTableType.allUsers, - name: i18n.ALL_USERS_TITLE, + name: i18n.NAVIGATION_ALL_USERS_TITLE, href: getTabsOnUsersDetailsUrl(hostName, UsersTableType.allUsers), disabled: false, }, diff --git a/x-pack/plugins/security_solution/public/users/pages/details/utils.ts b/x-pack/plugins/security_solution/public/users/pages/details/utils.ts index d69cac731df3e..f490e3e46914e 100644 --- a/x-pack/plugins/security_solution/public/users/pages/details/utils.ts +++ b/x-pack/plugins/security_solution/public/users/pages/details/utils.ts @@ -21,7 +21,8 @@ import { SecurityPageName } from '../../../app/types'; export const type = usersModel.UsersType.details; const TabNameMappedToI18nKey: Record = { - [UsersTableType.allUsers]: i18n.ALL_USERS_TITLE, + [UsersTableType.allUsers]: i18n.NAVIGATION_ALL_USERS_TITLE, + [UsersTableType.anomalies]: i18n.NAVIGATION_ANOMALIES_TITLE, }; export const getBreadcrumbs = ( diff --git a/x-pack/plugins/security_solution/public/users/pages/nav_tabs.tsx b/x-pack/plugins/security_solution/public/users/pages/nav_tabs.tsx index efe8447b9b71b..beffcb879cea0 100644 --- a/x-pack/plugins/security_solution/public/users/pages/nav_tabs.tsx +++ b/x-pack/plugins/security_solution/public/users/pages/nav_tabs.tsx @@ -15,8 +15,14 @@ const getTabsOnUsersUrl = (tabName: UsersTableType) => `${USERS_PATH}/${tabName} export const navTabsUsers: UsersNavTab = { [UsersTableType.allUsers]: { id: UsersTableType.allUsers, - name: i18n.ALL_USERS_TITLE, + name: i18n.NAVIGATION_ALL_USERS_TITLE, href: getTabsOnUsersUrl(UsersTableType.allUsers), disabled: false, }, + [UsersTableType.anomalies]: { + id: UsersTableType.anomalies, + name: i18n.NAVIGATION_ANOMALIES_TITLE, + href: getTabsOnUsersUrl(UsersTableType.anomalies), + disabled: false, + }, }; diff --git a/x-pack/plugins/security_solution/public/users/pages/navigation/types.ts b/x-pack/plugins/security_solution/public/users/pages/navigation/types.ts index b965dc914d513..53f7c74871084 100644 --- a/x-pack/plugins/security_solution/public/users/pages/navigation/types.ts +++ b/x-pack/plugins/security_solution/public/users/pages/navigation/types.ts @@ -10,7 +10,7 @@ import { ESTermQuery } from '../../../../common/typed_json'; import { DocValueFields } from '../../../../../timelines/common'; import { NavTab } from '../../../common/components/navigation/types'; -type KeyUsersNavTab = UsersTableType.allUsers; +type KeyUsersNavTab = UsersTableType.allUsers | UsersTableType.anomalies; export type UsersNavTab = Record; export interface QueryTabBodyProps { diff --git a/x-pack/plugins/security_solution/public/users/pages/translations.ts b/x-pack/plugins/security_solution/public/users/pages/translations.ts index bfcd29be4236c..4bcfc01e41706 100644 --- a/x-pack/plugins/security_solution/public/users/pages/translations.ts +++ b/x-pack/plugins/security_solution/public/users/pages/translations.ts @@ -11,6 +11,16 @@ export const PAGE_TITLE = i18n.translate('xpack.securitySolution.users.pageTitle defaultMessage: 'Users', }); -export const ALL_USERS_TITLE = i18n.translate('xpack.securitySolution.users.allUsers', { - defaultMessage: 'All users', -}); +export const NAVIGATION_ALL_USERS_TITLE = i18n.translate( + 'xpack.securitySolution.users.navigation.allUsersTitle', + { + defaultMessage: 'All users', + } +); + +export const NAVIGATION_ANOMALIES_TITLE = i18n.translate( + 'xpack.securitySolution.users.navigation.anomaliesTitle', + { + defaultMessage: 'Anomalies', + } +); diff --git a/x-pack/plugins/security_solution/public/users/pages/users_tabs.test.tsx b/x-pack/plugins/security_solution/public/users/pages/users_tabs.test.tsx new file mode 100644 index 0000000000000..bd4ce3cbae1e3 --- /dev/null +++ b/x-pack/plugins/security_solution/public/users/pages/users_tabs.test.tsx @@ -0,0 +1,79 @@ +/* + * 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 { mount } from 'enzyme'; +import React from 'react'; +import { Router } from 'react-router-dom'; + +import '../../common/mock/match_media'; +import { TestProviders } from '../../common/mock'; +import { SecuritySolutionTabNavigation } from '../../common/components/navigation'; +import { Users } from './users'; +import { useSourcererDataView } from '../../common/containers/sourcerer'; + +jest.mock('../../common/containers/sourcerer'); +jest.mock('../../common/components/search_bar', () => ({ + SiemSearchBar: () => null, +})); +jest.mock('../../common/components/query_bar', () => ({ + QueryBar: () => null, +})); + +type Action = 'PUSH' | 'POP' | 'REPLACE'; +const pop: Action = 'POP'; +const location = { + pathname: '/network', + search: '', + state: '', + hash: '', +}; +const mockHistory = { + length: 2, + location, + action: pop, + push: jest.fn(), + replace: jest.fn(), + go: jest.fn(), + goBack: jest.fn(), + goForward: jest.fn(), + block: jest.fn(), + createHref: jest.fn(), + listen: jest.fn(), +}; +const mockUseSourcererDataView = useSourcererDataView as jest.Mock; +describe('Users - rendering', () => { + test('it renders the Setup Instructions text when no index is available', async () => { + mockUseSourcererDataView.mockReturnValue({ + indicesExist: false, + }); + + const wrapper = mount( + + + + + + ); + expect(wrapper.find('[data-test-subj="empty-page"]').exists()).toBe(true); + }); + + test('it should render tab navigation', async () => { + mockUseSourcererDataView.mockReturnValue({ + indicesExist: true, + indexPattern: {}, + }); + + const wrapper = mount( + + + + + + ); + expect(wrapper.find(SecuritySolutionTabNavigation).exists()).toBe(true); + }); +}); diff --git a/x-pack/plugins/security_solution/public/users/pages/users_tabs.tsx b/x-pack/plugins/security_solution/public/users/pages/users_tabs.tsx index a2de4d2f49ea7..2db83c5d75aea 100644 --- a/x-pack/plugins/security_solution/public/users/pages/users_tabs.tsx +++ b/x-pack/plugins/security_solution/public/users/pages/users_tabs.tsx @@ -5,18 +5,22 @@ * 2.0. */ -import React, { memo } from 'react'; +import React, { memo, useCallback } from 'react'; import { Route, Switch } from 'react-router-dom'; import { UsersTabsProps } from './types'; import { UsersTableType } from '../store/model'; import { USERS_PATH } from '../../../common/constants'; import { AllUsersQueryTabBody } from './navigation'; +import { AnomaliesQueryTabBody } from '../../common/containers/anomalies/anomalies_query_tab_body'; +import { AnomaliesUserTable } from '../../common/components/ml/tables/anomalies_user_table'; +import { Anomaly } from '../../common/components/ml/types'; +import { scoreIntervalToDateTime } from '../../common/components/ml/score/score_interval_to_datetime'; +import { UpdateDateRange } from '../../common/components/charts/common'; export const UsersTabs = memo( ({ deleteQuery, - docValueFields, filterQuery, from, indexNames, @@ -24,21 +28,55 @@ export const UsersTabs = memo( setQuery, to, type, + setAbsoluteRangeDatePicker, }) => { + const narrowDateRange = useCallback( + (score: Anomaly, interval: string) => { + const fromTo = scoreIntervalToDateTime(score, interval); + setAbsoluteRangeDatePicker({ + id: 'global', + from: fromTo.from, + to: fromTo.to, + }); + }, + [setAbsoluteRangeDatePicker] + ); + + const updateDateRange = useCallback( + ({ x }) => { + if (!x) { + return; + } + const [min, max] = x; + setAbsoluteRangeDatePicker({ + id: 'global', + from: new Date(min).toISOString(), + to: new Date(max).toISOString(), + }); + }, + [setAbsoluteRangeDatePicker] + ); + + const tabProps = { + deleteQuery, + endDate: to, + filterQuery, + indexNames, + skip: isInitializing || filterQuery === undefined, + setQuery, + startDate: from, + type, + narrowDateRange, + updateDateRange, + }; + return ( - + + + + ); diff --git a/x-pack/plugins/security_solution/public/users/store/model.ts b/x-pack/plugins/security_solution/public/users/store/model.ts index 8a3e4b983dbb9..57d9c4b6c62f2 100644 --- a/x-pack/plugins/security_solution/public/users/store/model.ts +++ b/x-pack/plugins/security_solution/public/users/store/model.ts @@ -12,6 +12,7 @@ export enum UsersType { export enum UsersTableType { allUsers = 'allUsers', + anomalies = 'anomalies', } export type AllUsersTables = UsersTableType; @@ -32,6 +33,7 @@ export interface TableUpdates { export interface UsersQueries { [UsersTableType.allUsers]: AllUsersQuery; + [UsersTableType.anomalies]: null | undefined; } export interface UsersPageModel { diff --git a/x-pack/plugins/security_solution/public/users/store/reducer.ts b/x-pack/plugins/security_solution/public/users/store/reducer.ts index 1ca0cf5cabb8a..3f4cd69d7f9e8 100644 --- a/x-pack/plugins/security_solution/public/users/store/reducer.ts +++ b/x-pack/plugins/security_solution/public/users/store/reducer.ts @@ -17,6 +17,7 @@ import { } from './actions'; import { setUsersPageQueriesActivePageToZero } from './helpers'; import { UsersTableType, UsersModel } from './model'; +import { HostsTableType } from '../../hosts/store/model'; export const initialUsersState: UsersModel = { page: { @@ -24,12 +25,8 @@ export const initialUsersState: UsersModel = { [UsersTableType.allUsers]: { activePage: DEFAULT_TABLE_ACTIVE_PAGE, limit: DEFAULT_TABLE_LIMIT, - // TODO Fix me - // sort: { - // field: AllUsersFields.allUsers, - // direction: Direction.desc, - // }, }, + [HostsTableType.anomalies]: null, }, }, details: { @@ -37,12 +34,8 @@ export const initialUsersState: UsersModel = { [UsersTableType.allUsers]: { activePage: DEFAULT_TABLE_ACTIVE_PAGE, limit: DEFAULT_TABLE_LIMIT, - // TODO Fix me - // sort: { - // field: HostRulesFields.riskScore, - // direction: Direction.desc, - // }, }, + [HostsTableType.anomalies]: null, }, }, }; @@ -75,7 +68,6 @@ export const usersReducer = reducerWithInitialState(initialUsersState) queries: { ...state[usersType].queries, [tableType]: { - // TODO: Steph/users fix active page/limit on users tables. is broken because multiple UsersTableType.userRules tables ...state[usersType].queries[tableType], activePage, }, @@ -89,7 +81,6 @@ export const usersReducer = reducerWithInitialState(initialUsersState) queries: { ...state[usersType].queries, [tableType]: { - // TODO: Steph/users fix active page/limit on users tables. is broken because multiple UsersTableType.userRules tables ...state[usersType].queries[tableType], limit, }, From 405ef9ed151b74d0d910fab966434a9201847531 Mon Sep 17 00:00:00 2001 From: Dario Gieselaar Date: Tue, 1 Mar 2022 13:50:58 +0100 Subject: [PATCH 072/102] [APM] Setting for default env for service inventory (#126151) --- .../public/components/routing/app_root.tsx | 41 +++--- .../index.test.tsx | 119 ++++++++++++++++++ .../index.tsx | 48 +++++++ x-pack/plugins/observability/common/index.ts | 1 + .../observability/common/ui_settings_keys.ts | 1 + x-pack/plugins/observability/public/index.ts | 1 + .../observability/server/ui_settings.ts | 15 ++- 7 files changed, 206 insertions(+), 20 deletions(-) create mode 100644 x-pack/plugins/apm/public/components/shared/redirect_with_default_environment/index.test.tsx create mode 100644 x-pack/plugins/apm/public/components/shared/redirect_with_default_environment/index.tsx diff --git a/x-pack/plugins/apm/public/components/routing/app_root.tsx b/x-pack/plugins/apm/public/components/routing/app_root.tsx index aca6d3d737e3d..0bab92c74f1bd 100644 --- a/x-pack/plugins/apm/public/components/routing/app_root.tsx +++ b/x-pack/plugins/apm/public/components/routing/app_root.tsx @@ -36,6 +36,7 @@ import { ApmHeaderActionMenu } from '../shared/apm_header_action_menu'; import { RedirectWithDefaultDateRange } from '../shared/redirect_with_default_date_range'; import { apmRouter } from './apm_route_config'; import { TrackPageview } from './track_pageview'; +import { RedirectWithDefaultEnvironment } from '../shared/redirect_with_default_environment'; export function ApmAppRoot({ apmPluginContextValue, @@ -60,26 +61,28 @@ export function ApmAppRoot({ - - - - - - - - - + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + + diff --git a/x-pack/plugins/apm/public/components/shared/redirect_with_default_environment/index.test.tsx b/x-pack/plugins/apm/public/components/shared/redirect_with_default_environment/index.test.tsx new file mode 100644 index 0000000000000..469e384a06ee4 --- /dev/null +++ b/x-pack/plugins/apm/public/components/shared/redirect_with_default_environment/index.test.tsx @@ -0,0 +1,119 @@ +/* + * 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 { RouterProvider } from '@kbn/typed-react-router-config'; +import { render } from '@testing-library/react'; +import { createMemoryHistory, Location, MemoryHistory } from 'history'; +import qs from 'query-string'; +import { RedirectWithDefaultEnvironment } from './'; +import { apmRouter } from '../../routing/apm_route_config'; +import * as useApmPluginContextExports from '../../../context/apm_plugin/use_apm_plugin_context'; +import { ENVIRONMENT_ALL } from '../../../../common/environment_filter_values'; + +describe('RedirectWithDefaultEnvironment', () => { + let history: MemoryHistory; + + beforeEach(() => { + history = createMemoryHistory(); + }); + + function renderUrl( + location: Pick, + defaultSetting: string + ) { + history.replace(location); + + jest + .spyOn(useApmPluginContextExports, 'useApmPluginContext') + .mockReturnValue({ + core: { + uiSettings: { + get: () => defaultSetting, + }, + }, + } as any); + + return render( + + + <>Foo + + + ); + } + + it('eventually renders the child element', async () => { + const element = renderUrl( + { + pathname: '/services', + search: location.search, + }, + '' + ); + + await expect(element.findByText('Foo')).resolves.not.toBeUndefined(); + + // assertion to make sure our element test actually works + await expect(element.findByText('Bar')).rejects.not.toBeUndefined(); + }); + + it('redirects to ENVIRONMENT_ALL if not set', async () => { + renderUrl( + { + pathname: '/services', + search: location.search, + }, + '' + ); + + expect(qs.parse(history.entries[0].search).environment).toEqual( + ENVIRONMENT_ALL.value + ); + }); + + it('redirects to the default environment if set', () => { + renderUrl( + { + pathname: '/services', + search: location.search, + }, + 'production' + ); + + expect(qs.parse(history.entries[0].search).environment).toEqual( + 'production' + ); + }); + + it('does not redirect when an environment has been set', () => { + renderUrl( + { + pathname: '/services', + search: qs.stringify({ + environment: 'development', + }), + }, + 'production' + ); + + expect(qs.parse(history.entries[0].search).environment).toEqual( + 'development' + ); + }); + + it('does not redirect for the service overview', () => { + renderUrl( + { + pathname: '/services/opbeans-java', + search: location.search, + }, + '' + ); + + expect(qs.parse(history.entries[0].search).environment).toBeUndefined(); + }); +}); diff --git a/x-pack/plugins/apm/public/components/shared/redirect_with_default_environment/index.tsx b/x-pack/plugins/apm/public/components/shared/redirect_with_default_environment/index.tsx new file mode 100644 index 0000000000000..83f93a0c6d090 --- /dev/null +++ b/x-pack/plugins/apm/public/components/shared/redirect_with_default_environment/index.tsx @@ -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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useLocation, Redirect } from 'react-router-dom'; +import qs from 'query-string'; +import React from 'react'; +import { defaultApmServiceEnvironment } from '../../../../../observability/common'; +import { ENVIRONMENT_ALL } from '../../../../common/environment_filter_values'; +import { useApmPluginContext } from '../../../context/apm_plugin/use_apm_plugin_context'; + +export function RedirectWithDefaultEnvironment({ + children, +}: { + children: React.ReactElement; +}) { + const { core } = useApmPluginContext(); + const location = useLocation(); + + const query = qs.parse(location.search); + + if ('environment' in query) { + return children; + } + + if (location.pathname === '/services' || location.pathname === '/services/') { + const defaultServiceEnvironment = + core.uiSettings.get(defaultApmServiceEnvironment) || + ENVIRONMENT_ALL.value; + + return ( + + ); + } + + return children; +} diff --git a/x-pack/plugins/observability/common/index.ts b/x-pack/plugins/observability/common/index.ts index 3eb59effedc3a..3f31eb5f9140c 100644 --- a/x-pack/plugins/observability/common/index.ts +++ b/x-pack/plugins/observability/common/index.ts @@ -14,6 +14,7 @@ export { maxSuggestions, enableComparisonByDefault, enableInfrastructureView, + defaultApmServiceEnvironment, } from './ui_settings_keys'; export const casesFeatureId = 'observabilityCases'; diff --git a/x-pack/plugins/observability/common/ui_settings_keys.ts b/x-pack/plugins/observability/common/ui_settings_keys.ts index ea8a2f20ea4e7..2557217b2211e 100644 --- a/x-pack/plugins/observability/common/ui_settings_keys.ts +++ b/x-pack/plugins/observability/common/ui_settings_keys.ts @@ -9,3 +9,4 @@ export const enableInspectEsQueries = 'observability:enableInspectEsQueries'; export const maxSuggestions = 'observability:maxSuggestions'; export const enableComparisonByDefault = 'observability:enableComparisonByDefault'; export const enableInfrastructureView = 'observability:enableInfrastructureView'; +export const defaultApmServiceEnvironment = 'observability:apmDefaultServiceEnvironment'; diff --git a/x-pack/plugins/observability/public/index.ts b/x-pack/plugins/observability/public/index.ts index 0fa1469180da5..0ef02fda3fa47 100644 --- a/x-pack/plugins/observability/public/index.ts +++ b/x-pack/plugins/observability/public/index.ts @@ -27,6 +27,7 @@ export { enableInspectEsQueries, enableComparisonByDefault, enableInfrastructureView, + defaultApmServiceEnvironment, } from '../common/ui_settings_keys'; export { uptimeOverviewLocatorID } from '../common'; diff --git a/x-pack/plugins/observability/server/ui_settings.ts b/x-pack/plugins/observability/server/ui_settings.ts index 8d37398b8a07b..866c8fe5432d5 100644 --- a/x-pack/plugins/observability/server/ui_settings.ts +++ b/x-pack/plugins/observability/server/ui_settings.ts @@ -14,12 +14,13 @@ import { enableInspectEsQueries, maxSuggestions, enableInfrastructureView, + defaultApmServiceEnvironment, } from '../common/ui_settings_keys'; /** * uiSettings definitions for Observability. */ -export const uiSettings: Record> = { +export const uiSettings: Record> = { [enableInspectEsQueries]: { category: [observabilityFeatureId], name: i18n.translate('xpack.observability.enableInspectEsQueriesExperimentName', { @@ -64,4 +65,16 @@ export const uiSettings: Record> = { }), schema: schema.boolean(), }, + [defaultApmServiceEnvironment]: { + category: [observabilityFeatureId], + name: i18n.translate('xpack.observability.defaultApmServiceEnvironment', { + defaultMessage: 'Default service environment', + }), + description: i18n.translate('xpack.observability.defaultApmServiceEnvironmentDescription', { + defaultMessage: + 'Set the default environment for the APM app. When left empty, data from all environments will be displayed by default.', + }), + value: '', + schema: schema.string(), + }, }; From aafb7be138d265e1352903b6737aafe9ca0d6c2d Mon Sep 17 00:00:00 2001 From: Mat Schaffer Date: Tue, 1 Mar 2022 22:12:25 +0900 Subject: [PATCH 073/102] Revert "[Stack Monitoring] api_integration - Ignore `logs` section of index detail api" (#126559) --- .../apis/monitoring/elasticsearch/index_detail.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/x-pack/test/api_integration/apis/monitoring/elasticsearch/index_detail.js b/x-pack/test/api_integration/apis/monitoring/elasticsearch/index_detail.js index 87371187c83e8..e243c3a372f7b 100644 --- a/x-pack/test/api_integration/apis/monitoring/elasticsearch/index_detail.js +++ b/x-pack/test/api_integration/apis/monitoring/elasticsearch/index_detail.js @@ -41,9 +41,6 @@ export default function ({ getService }) { }) .expect(200); - // Work around ESTF failure outlined in https://github.com/elastic/kibana/issues/124594 - indexDetailFixture.logs = body.logs; - expect(body).to.eql(indexDetailFixture); }); From f0a7f1f5b139567c9ac7c04902cbc1c76362e385 Mon Sep 17 00:00:00 2001 From: Kevin Qualters <56408403+kqualters-elastic@users.noreply.github.com> Date: Tue, 1 Mar 2022 08:23:34 -0500 Subject: [PATCH 074/102] [Security Solution] Update hover actions css selector to re-hide default cell actions (#126551) * Update hover actions css selector to re-hide default cell actions * Use better selector for expand icon --- .../public/common/components/page/index.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/security_solution/public/common/components/page/index.tsx b/x-pack/plugins/security_solution/public/common/components/page/index.tsx index d17f5ceb4f9b1..c85e7b9f36ac1 100644 --- a/x-pack/plugins/security_solution/public/common/components/page/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/page/index.tsx @@ -35,12 +35,13 @@ export const AppGlobalStyle = createGlobalStyle<{ theme: { eui: { euiColorPrimar z-index: 9950 !important; } - .euiDataGridRowCell__expandButton .euiDataGridRowCell__actionButtonIcon { + .euiDataGridRowCell .euiDataGridRowCell__expandActions .euiDataGridRowCell__actionButtonIcon { display: none; &:first-child, &:nth-child(2), - &:nth-child(3) { + &:nth-child(3), + &:last-child { display: inline-flex; } From bc4c8d63a574cfbd4124529a64fb214b73651aef Mon Sep 17 00:00:00 2001 From: Kevin Logan <56395104+kevinlog@users.noreply.github.com> Date: Tue, 1 Mar 2022 08:27:58 -0500 Subject: [PATCH 075/102] [Security Solution] Refactor policy details tests to focus on only fields changed (#126458) --- .../apps/endpoint/policy_details.ts | 286 +----------------- 1 file changed, 11 insertions(+), 275 deletions(-) diff --git a/x-pack/test/security_solution_endpoint/apps/endpoint/policy_details.ts b/x-pack/test/security_solution_endpoint/apps/endpoint/policy_details.ts index 4e4a1fc61d707..ae1db94292639 100644 --- a/x-pack/test/security_solution_endpoint/apps/endpoint/policy_details.ts +++ b/x-pack/test/security_solution_endpoint/apps/endpoint/policy_details.ts @@ -6,15 +6,9 @@ */ import expect from '@kbn/expect'; -import { DeepPartial } from 'utility-types'; -import { merge } from 'lodash'; import { FtrProviderContext } from '../../ftr_provider_context'; import { PolicyTestResourceInfo } from '../../services/endpoint_policy'; import { IndexedHostsAndAlertsResponse } from '../../../../plugins/security_solution/common/endpoint/index_data'; -import { FullAgentPolicyInput } from '../../../../plugins/fleet/common'; -import { PolicyConfig } from '../../../../plugins/security_solution/common/endpoint/types'; -import { ManifestSchema } from '../../../../plugins/security_solution/common/endpoint/schema/manifest'; -import { policyFactory } from '../../../../plugins/security_solution/common/endpoint/models/policy_config'; import { popupVersionsMap } from '../../../../plugins/security_solution/public/management/pages/policy/view/policy_forms/protections/popup_options_to_versions'; export default function ({ getPageObjects, getService }: FtrProviderContext) { @@ -32,210 +26,6 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { const policyTestResources = getService('policyTestResources'); const endpointTestResources = getService('endpointTestResources'); - type FullAgentPolicyEndpointInput = Omit & { - policy: PolicyConfig; - artifact_manifest: ManifestSchema; - }; - - /** - * Returns the Fleet Agent Policy Input that represents an Endpoint Policy. Use it to - * validate expecte output when looking at the Fleet Agent policy to validate that updates - * to the Endpoint Policy are making it through to the overall Fleet Agent Policy - * - * @param overrides - */ - const getExpectedAgentPolicyEndpointInput = ( - overrides: DeepPartial = {} - ): FullAgentPolicyInput => { - return merge( - { - id: '123', - revision: 2, - data_stream: { namespace: 'default' }, - name: 'Protect East Coast', - meta: { - package: { - name: 'endpoint', - version: '1.0', - }, - }, - artifact_manifest: { - artifacts: { - 'endpoint-exceptionlist-linux-v1': { - compression_algorithm: 'zlib', - decoded_sha256: 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - decoded_size: 14, - encoded_sha256: 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', - encoded_size: 22, - encryption_algorithm: 'none', - relative_url: - '/api/fleet/artifacts/endpoint-exceptionlist-linux-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - }, - 'endpoint-exceptionlist-macos-v1': { - compression_algorithm: 'zlib', - decoded_sha256: 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - decoded_size: 14, - encoded_sha256: 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', - encoded_size: 22, - encryption_algorithm: 'none', - relative_url: - '/api/fleet/artifacts/endpoint-exceptionlist-macos-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - }, - 'endpoint-exceptionlist-windows-v1': { - compression_algorithm: 'zlib', - decoded_sha256: 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - decoded_size: 14, - encoded_sha256: 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', - encoded_size: 22, - encryption_algorithm: 'none', - relative_url: - '/api/fleet/artifacts/endpoint-exceptionlist-windows-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - }, - 'endpoint-hostisolationexceptionlist-linux-v1': { - compression_algorithm: 'zlib', - decoded_sha256: 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - decoded_size: 14, - encoded_sha256: 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', - encoded_size: 22, - encryption_algorithm: 'none', - relative_url: - '/api/fleet/artifacts/endpoint-hostisolationexceptionlist-linux-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - }, - 'endpoint-hostisolationexceptionlist-macos-v1': { - compression_algorithm: 'zlib', - decoded_sha256: 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - decoded_size: 14, - encoded_sha256: 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', - encoded_size: 22, - encryption_algorithm: 'none', - relative_url: - '/api/fleet/artifacts/endpoint-hostisolationexceptionlist-macos-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - }, - 'endpoint-hostisolationexceptionlist-windows-v1': { - compression_algorithm: 'zlib', - decoded_sha256: 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - decoded_size: 14, - encoded_sha256: 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', - encoded_size: 22, - encryption_algorithm: 'none', - relative_url: - '/api/fleet/artifacts/endpoint-hostisolationexceptionlist-windows-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - }, - 'endpoint-trustlist-linux-v1': { - compression_algorithm: 'zlib', - decoded_sha256: 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - decoded_size: 14, - encoded_sha256: 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', - encoded_size: 22, - encryption_algorithm: 'none', - relative_url: - '/api/fleet/artifacts/endpoint-trustlist-linux-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - }, - 'endpoint-trustlist-macos-v1': { - compression_algorithm: 'zlib', - decoded_sha256: 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - decoded_size: 14, - encoded_sha256: 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', - encoded_size: 22, - encryption_algorithm: 'none', - relative_url: - '/api/fleet/artifacts/endpoint-trustlist-macos-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - }, - 'endpoint-trustlist-windows-v1': { - compression_algorithm: 'zlib', - decoded_sha256: 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - decoded_size: 14, - encoded_sha256: 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', - encoded_size: 22, - encryption_algorithm: 'none', - relative_url: - '/api/fleet/artifacts/endpoint-trustlist-windows-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - }, - 'endpoint-eventfilterlist-linux-v1': { - compression_algorithm: 'zlib', - decoded_sha256: 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - decoded_size: 14, - encoded_sha256: 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', - encoded_size: 22, - encryption_algorithm: 'none', - relative_url: - '/api/fleet/artifacts/endpoint-eventfilterlist-linux-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - }, - 'endpoint-eventfilterlist-macos-v1': { - compression_algorithm: 'zlib', - decoded_sha256: 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - decoded_size: 14, - encoded_sha256: 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', - encoded_size: 22, - encryption_algorithm: 'none', - relative_url: - '/api/fleet/artifacts/endpoint-eventfilterlist-macos-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - }, - 'endpoint-eventfilterlist-windows-v1': { - compression_algorithm: 'zlib', - decoded_sha256: 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - decoded_size: 14, - encoded_sha256: 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', - encoded_size: 22, - encryption_algorithm: 'none', - relative_url: - '/api/fleet/artifacts/endpoint-eventfilterlist-windows-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - }, - }, - manifest_version: '1', - schema_version: 'v1', - }, - policy: merge(policyFactory(), { - windows: { - popup: { - malware: { - message: 'Elastic Security {action} {filename}', - }, - ransomware: { - message: 'Elastic Security {action} {filename}', - }, - memory_protection: { - message: 'Elastic Security {action} {rule}', - }, - behavior_protection: { - message: 'Elastic Security {action} {rule}', - }, - }, - }, - mac: { - popup: { - malware: { - message: 'Elastic Security {action} {filename}', - }, - behavior_protection: { - message: 'Elastic Security {action} {rule}', - }, - memory_protection: { - message: 'Elastic Security {action} {rule}', - }, - }, - }, - linux: { - popup: { - malware: { - message: 'Elastic Security {action} {filename}', - }, - behavior_protection: { - message: 'Elastic Security {action} {rule}', - }, - memory_protection: { - message: 'Elastic Security {action} {rule}', - }, - }, - }, - }), - type: 'endpoint', - use_output: 'default', - }, - overrides - ); - }; - describe('When on the Endpoint Policy Details Page', function () { let indexedData: IndexedHostsAndAlertsResponse; @@ -337,8 +127,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { }); }); - // FLAKY: https://github.com/elastic/kibana/issues/92567 - describe.skip('and the save button is clicked', () => { + describe('and the save button is clicked', () => { let policyInfo: PolicyTestResourceInfo; beforeEach(async () => { @@ -401,34 +190,12 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { policyInfo.agentPolicy.id ); - expect(agentFullPolicy.inputs).to.eql([ - getExpectedAgentPolicyEndpointInput({ - id: policyInfo.packagePolicy.id, - name: policyInfo.packagePolicy.name, - meta: { - package: { - version: policyInfo.packageInfo.version, - }, - }, - artifact_manifest: agentFullPolicy.inputs[0].artifact_manifest, - policy: { - linux: { - events: { - file: false, - }, - advanced: { - agent: { - connection_delay: 'true', - }, - }, - }, - mac: { - events: { file: false }, - }, - windows: { events: { file: false } }, - }, - }), - ]); + expect(agentFullPolicy.inputs[0].policy.linux.advanced.agent.connection_delay).to.eql( + 'true' + ); + expect(agentFullPolicy.inputs[0].policy.linux.events.file).to.eql(false); + expect(agentFullPolicy.inputs[0].policy.mac.events.file).to.eql(false); + expect(agentFullPolicy.inputs[0].policy.windows.events.file).to.eql(false); }); it('should have cleared the advanced section when the user deletes the value', async () => { @@ -447,28 +214,9 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { policyInfo.agentPolicy.id ); - expect(agentFullPolicy.inputs).to.eql([ - getExpectedAgentPolicyEndpointInput({ - id: policyInfo.packagePolicy.id, - name: policyInfo.packagePolicy.name, - revision: agentFullPolicy.inputs[0].revision, - meta: { - package: { - version: policyInfo.packageInfo.version, - }, - }, - artifact_manifest: agentFullPolicy.inputs[0].artifact_manifest, - policy: { - linux: { - advanced: { - agent: { - connection_delay: 'true', - }, - }, - }, - }, - }), - ]); + expect(agentFullPolicy.inputs[0].policy.linux.advanced.agent.connection_delay).to.eql( + 'true' + ); // Clear the value await advancedPolicyField.click(); @@ -484,19 +232,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { policyInfo.agentPolicy.id ); - expect(agentFullPolicyUpdated.inputs).to.eql([ - getExpectedAgentPolicyEndpointInput({ - id: policyInfo.packagePolicy.id, - name: policyInfo.packagePolicy.name, - revision: agentFullPolicyUpdated.inputs[0].revision, - meta: { - package: { - version: policyInfo.packageInfo.version, - }, - }, - artifact_manifest: agentFullPolicyUpdated.inputs[0].artifact_manifest, - }), - ]); + expect(agentFullPolicyUpdated.inputs[0].policy.linux.advanced).to.eql(undefined); }); }); From f8491e2573cfc249e24a770949800ce8d25f21c8 Mon Sep 17 00:00:00 2001 From: Marco Liberati Date: Tue, 1 Mar 2022 14:43:33 +0100 Subject: [PATCH 076/102] [Lens][Example] Change custom link example to point to playground (#126345) * :sparkles: Change custom link to point to playground * :bug: Add filters when navigating to playground Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../testing_embedded_lens/public/app.tsx | 14 ++- .../testing_embedded_lens/public/mount.tsx | 12 ++- .../kibana.json | 1 - .../public/image.png | Bin 26243 -> 24573 bytes .../public/plugin.ts | 82 +++++++++++------- 5 files changed, 68 insertions(+), 41 deletions(-) diff --git a/x-pack/examples/testing_embedded_lens/public/app.tsx b/x-pack/examples/testing_embedded_lens/public/app.tsx index 91c2ce5995c15..ba6e1f8ebcbe9 100644 --- a/x-pack/examples/testing_embedded_lens/public/app.tsx +++ b/x-pack/examples/testing_embedded_lens/public/app.tsx @@ -372,6 +372,7 @@ export const App = (props: { plugins: StartDependencies; defaultDataView: DataView; stateHelpers: Awaited>; + preloadedVisualization: TypedLensByValueInput['attributes']; }) => { const [isLoading, setIsLoading] = useState(false); const [isSaveModalVisible, setIsSaveModalVisible] = useState(false); @@ -380,7 +381,11 @@ export const App = (props: { const [enableTriggers, toggleTriggers] = useState(false); const [loadedCharts, addChartConfiguration] = useState< Array<{ id: string; attributes: TypedLensByValueInput['attributes'] }> - >([]); + >( + props.preloadedVisualization + ? [{ id: 'from_lens', attributes: props.preloadedVisualization }] + : [] + ); const [hasParsingError, setErrorFlag] = useState(false); const [hasParsingErrorDebounced, setErrorDebounced] = useState(hasParsingError); const LensComponent = props.plugins.lens.EmbeddableComponent; @@ -414,8 +419,11 @@ export const App = (props: { // eslint-disable-next-line react-hooks/exhaustive-deps const charts = useMemo(() => [...defaultCharts, ...loadedCharts], [loadedCharts]); - // eslint-disable-next-line react-hooks/exhaustive-deps - const initialAttributes = useMemo(() => JSON.stringify(charts[0].attributes, null, 2), []); + const initialAttributes = useMemo( + () => JSON.stringify(props.preloadedVisualization ?? charts[0].attributes, null, 2), + // eslint-disable-next-line react-hooks/exhaustive-deps + [] + ); const currentSO = useRef(initialAttributes); const [currentValid, saveValidSO] = useState(initialAttributes); diff --git a/x-pack/examples/testing_embedded_lens/public/mount.tsx b/x-pack/examples/testing_embedded_lens/public/mount.tsx index 50727871a3545..f3739ac9a481d 100644 --- a/x-pack/examples/testing_embedded_lens/public/mount.tsx +++ b/x-pack/examples/testing_embedded_lens/public/mount.tsx @@ -11,26 +11,30 @@ import { EuiCallOut } from '@elastic/eui'; import type { CoreSetup, AppMountParameters } from 'kibana/public'; import type { StartDependencies } from './plugin'; +import type { TypedLensByValueInput } from '../../../plugins/lens/public'; export const mount = (coreSetup: CoreSetup) => - async ({ element }: AppMountParameters) => { + async ({ element, history }: AppMountParameters) => { const [core, plugins] = await coreSetup.getStartServices(); const { App } = await import('./app'); + const preloadedVisualizationAttributes = history.location + ?.state as TypedLensByValueInput['attributes']; - const defaultDataView = await plugins.data.indexPatterns.getDefault(); + const dataView = await plugins.data.indexPatterns.getDefault(); const stateHelpers = await plugins.lens.stateHelperApi(); const i18nCore = core.i18n; const reactElement = ( - {defaultDataView ? ( + {dataView ? ( ) : ( l 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%0DRZ7D}9?#ZL{Dl7~os(E0qlq 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 literal 26243 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 B`OW|U diff --git a/x-pack/examples/third_party_lens_navigation_prompt/public/plugin.ts b/x-pack/examples/third_party_lens_navigation_prompt/public/plugin.ts index e683305d1fca8..b7a7e4ab10c0e 100644 --- a/x-pack/examples/third_party_lens_navigation_prompt/public/plugin.ts +++ b/x-pack/examples/third_party_lens_navigation_prompt/public/plugin.ts @@ -5,7 +5,6 @@ * 2.0. */ -import { DiscoverSetup } from 'src/plugins/discover/public'; import { DataPublicPluginStart } from 'src/plugins/data/public'; import { Plugin, CoreSetup, AppNavLinkStatus } from '../../../../src/core/public'; import { DataViewsPublicPluginStart, DataView } from '../../../../src/plugins/data_views/public'; @@ -22,7 +21,6 @@ import image from './image.png'; export interface SetupDependencies { developerExamples: DeveloperExamplesSetup; lens: LensPublicSetup; - discover: DiscoverSetup; } export interface StartDependencies { @@ -94,10 +92,7 @@ function getLensAttributes(defaultDataView: DataView): TypedLensByValueInput['at export class EmbeddedLensExamplePlugin implements Plugin { - public setup( - core: CoreSetup, - { developerExamples, lens, discover }: SetupDependencies - ) { + public setup(core: CoreSetup, { developerExamples, lens }: SetupDependencies) { core.application.register({ id: 'third_party_lens_navigation_prompt', title: 'Third party Lens navigation prompt', @@ -123,7 +118,7 @@ export class EmbeddedLensExamplePlugin appId: 'third_party_lens_navigation_prompt', title: 'Third party Lens navigation prompt', description: - 'Add custom menu entries to the Lens editor, like the "Go to discover" link in this example.', + 'Add custom menu entries to the Lens editor, like the "Debug in Playground" link in this example.', image, links: [ { @@ -136,33 +131,54 @@ export class EmbeddedLensExamplePlugin ], }); - if (!discover.locator) return; - lens.registerTopNavMenuEntryGenerator(({ datasourceStates, query, filters }) => { - if (!datasourceStates.indexpattern.state) return; + lens.registerTopNavMenuEntryGenerator( + ({ visualizationId, visualizationState, datasourceStates, query, filters }) => { + if (!datasourceStates.indexpattern.state || !visualizationState) return; - return { - label: 'Go to discover', - iconType: 'discoverApp', - run: async () => { - const [, { data }] = await core.getStartServices(); - const firstLayer = Object.values( - (datasourceStates.indexpattern.state as IndexPatternPersistedState).layers - )[0] as PersistedIndexPatternLayer & { indexPatternId: string }; - discover.locator!.navigate({ - indexPatternId: firstLayer.indexPatternId, - timeRange: data.query.timefilter.timefilter.getTime(), - filters, - query, - columns: firstLayer.columnOrder - .map((columnId) => { - const column = firstLayer.columns[columnId]; - if ('sourceField' in column) return column.sourceField; - }) - .filter(Boolean) as string[], - }); - }, - }; - }); + return { + label: 'Debug in Playground', + iconType: 'wrench', + run: async () => { + const [coreStart] = await core.getStartServices(); + const datasourceState = datasourceStates.indexpattern + .state as IndexPatternPersistedState; + const layersIds = Object.keys(datasourceState.layers); + const layers = Object.values(datasourceState.layers) as Array< + PersistedIndexPatternLayer & { indexPatternId: string } + >; + const serializedFilters = JSON.parse(JSON.stringify(filters)); + coreStart.application.navigateToApp('testing_embedded_lens', { + state: { + visualizationType: visualizationId, + title: 'Lens visualization', + references: [ + { + id: layers[0].indexPatternId, + name: 'indexpattern-datasource-current-indexpattern', + type: 'index-pattern', + }, + ...layers.map(({ indexPatternId }, i) => ({ + id: indexPatternId, + name: `indexpattern-datasource-layer-${layersIds[i]}`, + type: 'index-pattern', + })), + ], + state: { + datasourceStates: { + indexpattern: { + layers: datasourceState.layers, + }, + }, + visualization: visualizationState, + filters: serializedFilters, + query, + }, + }, + }); + }, + }; + } + ); } public start() {} From e0e14c4b47ce7c5f05259876c02cb935daf26a31 Mon Sep 17 00:00:00 2001 From: Nicolas Chaulet Date: Tue, 1 Mar 2022 08:44:49 -0500 Subject: [PATCH 077/102] [Fleet] Support logstash as an output type in API and Kibana config (#125990) --- .../plugins/fleet/common/constants/output.ts | 1 + .../plugins/fleet/common/openapi/bundled.json | 17 +++++ .../plugins/fleet/common/openapi/bundled.yaml | 11 +++ .../openapi/components/schemas/output.yaml | 11 +++ .../fleet/common/types/models/output.ts | 7 +- .../fleet/common/types/rest_spec/output.ts | 14 +++- .../fleet/server/saved_objects/index.ts | 1 + .../agent_policies/full_agent_policy.test.ts | 50 ++++++++++++++ .../agent_policies/full_agent_policy.ts | 5 +- .../plugins/fleet/server/services/output.ts | 8 +-- .../fleet/server/services/preconfiguration.ts | 1 + .../fleet/server/types/models/output.test.ts | 26 +++++++ .../fleet/server/types/models/output.ts | 68 +++++++++++++++++-- .../types/models/preconfiguration.test.ts | 8 +++ .../server/types/models/preconfiguration.ts | 12 +--- .../fleet/server/types/rest_spec/output.ts | 25 ++----- .../apis/outputs/crud.ts | 52 ++++++++++++++ 17 files changed, 273 insertions(+), 44 deletions(-) create mode 100644 x-pack/plugins/fleet/server/types/models/output.test.ts diff --git a/x-pack/plugins/fleet/common/constants/output.ts b/x-pack/plugins/fleet/common/constants/output.ts index 67c45fea37d78..e41e3c526951e 100644 --- a/x-pack/plugins/fleet/common/constants/output.ts +++ b/x-pack/plugins/fleet/common/constants/output.ts @@ -11,6 +11,7 @@ export const OUTPUT_SAVED_OBJECT_TYPE = 'ingest-outputs'; export const outputType = { Elasticsearch: 'elasticsearch', + Logstash: 'logstash', } as const; export const DEFAULT_OUTPUT_ID = 'fleet-default-output'; diff --git a/x-pack/plugins/fleet/common/openapi/bundled.json b/x-pack/plugins/fleet/common/openapi/bundled.json index 0107ac614fe61..46cd3e998ea7f 100644 --- a/x-pack/plugins/fleet/common/openapi/bundled.json +++ b/x-pack/plugins/fleet/common/openapi/bundled.json @@ -4268,6 +4268,23 @@ }, "config_yaml": { "type": "string" + }, + "ssl": { + "type": "object", + "properties": { + "certificate": { + "type": "string" + }, + "certificate_authorities": { + "type": "array", + "items": { + "type": "string" + } + }, + "key": { + "type": "string" + } + } } }, "required": [ diff --git a/x-pack/plugins/fleet/common/openapi/bundled.yaml b/x-pack/plugins/fleet/common/openapi/bundled.yaml index 9c61006da6db2..ae8fdb3b87d4d 100644 --- a/x-pack/plugins/fleet/common/openapi/bundled.yaml +++ b/x-pack/plugins/fleet/common/openapi/bundled.yaml @@ -2690,6 +2690,17 @@ components: type: object config_yaml: type: string + ssl: + type: object + properties: + certificate: + type: string + certificate_authorities: + type: array + items: + type: string + key: + type: string required: - id - is_default diff --git a/x-pack/plugins/fleet/common/openapi/components/schemas/output.yaml b/x-pack/plugins/fleet/common/openapi/components/schemas/output.yaml index 75823d02af865..45f564414e14e 100644 --- a/x-pack/plugins/fleet/common/openapi/components/schemas/output.yaml +++ b/x-pack/plugins/fleet/common/openapi/components/schemas/output.yaml @@ -24,6 +24,17 @@ properties: type: object config_yaml: type: string + ssl: + type: object + properties: + certificate: + type: string + certificate_authorities: + type: array + items: + type: string + key: + type: string required: - id - is_default diff --git a/x-pack/plugins/fleet/common/types/models/output.ts b/x-pack/plugins/fleet/common/types/models/output.ts index ba09d41d2874f..1e22c88f64cb2 100644 --- a/x-pack/plugins/fleet/common/types/models/output.ts +++ b/x-pack/plugins/fleet/common/types/models/output.ts @@ -13,13 +13,18 @@ export type OutputType = typeof outputType; export interface NewOutput { is_default: boolean; is_default_monitoring: boolean; + is_preconfigured?: boolean; name: string; type: ValueOf; hosts?: string[]; ca_sha256?: string; ca_trusted_fingerprint?: string; config_yaml?: string; - is_preconfigured?: boolean; + ssl?: { + certificate_authorities?: string[]; + certificate?: string; + key?: string; + }; } export type OutputSOAttributes = NewOutput & { diff --git a/x-pack/plugins/fleet/common/types/rest_spec/output.ts b/x-pack/plugins/fleet/common/types/rest_spec/output.ts index 40a00e8df2191..071ba69c181fb 100644 --- a/x-pack/plugins/fleet/common/types/rest_spec/output.ts +++ b/x-pack/plugins/fleet/common/types/rest_spec/output.ts @@ -28,7 +28,7 @@ export interface PutOutputRequest { outputId: string; }; body: { - type?: 'elasticsearch'; + type?: 'elasticsearch' | 'logstash'; name?: string; hosts?: string[]; ca_sha256?: string; @@ -36,13 +36,18 @@ export interface PutOutputRequest { config_yaml?: string; is_default?: boolean; is_default_monitoring?: boolean; + ssl?: { + certificate_authorities?: string[]; + certificate?: string; + key?: string; + }; }; } export interface PostOutputRequest { body: { id?: string; - type: 'elasticsearch'; + type: 'elasticsearch' | 'logstash'; name: string; hosts?: string[]; ca_sha256?: string; @@ -50,6 +55,11 @@ export interface PostOutputRequest { is_default?: boolean; is_default_monitoring?: boolean; config_yaml?: string; + ssl?: { + certificate_authorities?: string[]; + certificate?: string; + key?: string; + }; }; } diff --git a/x-pack/plugins/fleet/server/saved_objects/index.ts b/x-pack/plugins/fleet/server/saved_objects/index.ts index e91eaf0bb0569..6b06d28af7042 100644 --- a/x-pack/plugins/fleet/server/saved_objects/index.ts +++ b/x-pack/plugins/fleet/server/saved_objects/index.ts @@ -117,6 +117,7 @@ const getSavedObjectTypes = ( config: { type: 'flattened' }, config_yaml: { type: 'text' }, is_preconfigured: { type: 'boolean', index: false }, + ssl: { type: 'flattened', index: false }, }, }, migrations: { diff --git a/x-pack/plugins/fleet/server/services/agent_policies/full_agent_policy.test.ts b/x-pack/plugins/fleet/server/services/agent_policies/full_agent_policy.test.ts index 67be0b6914537..c17d67c593229 100644 --- a/x-pack/plugins/fleet/server/services/agent_policies/full_agent_policy.test.ts +++ b/x-pack/plugins/fleet/server/services/agent_policies/full_agent_policy.test.ts @@ -352,4 +352,54 @@ ssl.test: 123 } `); }); + + it('should return placeholder ES_USERNAME and ES_PASSWORD for elasticsearch output type in standalone ', () => { + const policyOutput = transformOutputToFullPolicyOutput( + { + id: 'id123', + hosts: ['http://host.fr'], + is_default: false, + is_default_monitoring: false, + name: 'test output', + type: 'elasticsearch', + }, + true + ); + + expect(policyOutput).toMatchInlineSnapshot(` + Object { + "ca_sha256": undefined, + "hosts": Array [ + "http://host.fr", + ], + "password": "{ES_PASSWORD}", + "type": "elasticsearch", + "username": "{ES_USERNAME}", + } + `); + }); + + it('should not return placeholder ES_USERNAME and ES_PASSWORD for logstash output type in standalone ', () => { + const policyOutput = transformOutputToFullPolicyOutput( + { + id: 'id123', + hosts: ['host.fr:3332'], + is_default: false, + is_default_monitoring: false, + name: 'test output', + type: 'logstash', + }, + true + ); + + expect(policyOutput).toMatchInlineSnapshot(` + Object { + "ca_sha256": undefined, + "hosts": Array [ + "host.fr:3332", + ], + "type": "logstash", + } + `); + }); }); diff --git a/x-pack/plugins/fleet/server/services/agent_policies/full_agent_policy.ts b/x-pack/plugins/fleet/server/services/agent_policies/full_agent_policy.ts index 9f522875544e1..5d11c91889e25 100644 --- a/x-pack/plugins/fleet/server/services/agent_policies/full_agent_policy.ts +++ b/x-pack/plugins/fleet/server/services/agent_policies/full_agent_policy.ts @@ -171,17 +171,18 @@ export function transformOutputToFullPolicyOutput( standalone = false ): FullAgentPolicyOutput { // eslint-disable-next-line @typescript-eslint/naming-convention - const { config_yaml, type, hosts, ca_sha256, ca_trusted_fingerprint } = output; + const { config_yaml, type, hosts, ca_sha256, ca_trusted_fingerprint, ssl } = output; const configJs = config_yaml ? safeLoad(config_yaml) : {}; const newOutput: FullAgentPolicyOutput = { ...configJs, type, hosts, ca_sha256, + ...(ssl ? { ssl } : {}), ...(ca_trusted_fingerprint ? { 'ssl.ca_trusted_fingerprint': ca_trusted_fingerprint } : {}), }; - if (standalone) { + if (output.type === outputType.Elasticsearch && standalone) { newOutput.username = '{ES_USERNAME}'; newOutput.password = '{ES_PASSWORD}'; } diff --git a/x-pack/plugins/fleet/server/services/output.ts b/x-pack/plugins/fleet/server/services/output.ts index 61592420e9116..832cb810f7505 100644 --- a/x-pack/plugins/fleet/server/services/output.ts +++ b/x-pack/plugins/fleet/server/services/output.ts @@ -10,7 +10,7 @@ import uuid from 'uuid/v5'; import type { NewOutput, Output, OutputSOAttributes } from '../types'; import { DEFAULT_OUTPUT, DEFAULT_OUTPUT_ID, OUTPUT_SAVED_OBJECT_TYPE } from '../constants'; -import { decodeCloudId, normalizeHostsForAgents, SO_SEARCH_LIMIT } from '../../common'; +import { decodeCloudId, normalizeHostsForAgents, SO_SEARCH_LIMIT, outputType } from '../../common'; import { OutputUnauthorizedError } from '../errors'; import { appContextService } from './app_context'; @@ -149,7 +149,7 @@ class OutputService { } } - if (data.hosts) { + if (data.type === outputType.Elasticsearch && data.hosts) { data.hosts = data.hosts.map(normalizeHostsForAgents); } @@ -260,7 +260,7 @@ class OutputService { ); } - const updateData = { ...data }; + const updateData = { type: originalOutput.type, ...data }; // ensure only default output exists if (data.is_default) { @@ -287,7 +287,7 @@ class OutputService { } } - if (updateData.hosts) { + if (updateData.type === outputType.Elasticsearch && updateData.hosts) { updateData.hosts = updateData.hosts.map(normalizeHostsForAgents); } const outputSO = await soClient.update( diff --git a/x-pack/plugins/fleet/server/services/preconfiguration.ts b/x-pack/plugins/fleet/server/services/preconfiguration.ts index 2e0c3c7722b13..78769e6836b59 100644 --- a/x-pack/plugins/fleet/server/services/preconfiguration.ts +++ b/x-pack/plugins/fleet/server/services/preconfiguration.ts @@ -57,6 +57,7 @@ function isPreconfiguredOutputDifferentFromCurrent( existingOutput.hosts?.map(normalizeHostsForAgents), preconfiguredOutput.hosts.map(normalizeHostsForAgents) )) || + (preconfiguredOutput.ssl && !isEqual(preconfiguredOutput.ssl, existingOutput.ssl)) || existingOutput.ca_sha256 !== preconfiguredOutput.ca_sha256 || existingOutput.ca_trusted_fingerprint !== preconfiguredOutput.ca_trusted_fingerprint || existingOutput.config_yaml !== preconfiguredOutput.config_yaml diff --git a/x-pack/plugins/fleet/server/types/models/output.test.ts b/x-pack/plugins/fleet/server/types/models/output.test.ts new file mode 100644 index 0000000000000..8ad2b14299c73 --- /dev/null +++ b/x-pack/plugins/fleet/server/types/models/output.test.ts @@ -0,0 +1,26 @@ +/* + * 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 { validateLogstashHost } from './output'; + +describe('Output model', () => { + describe('validateLogstashHost', () => { + it('should support valid host', () => { + expect(validateLogstashHost('test.fr:5044')).toBeUndefined(); + }); + + it('should return an error for an invalid host', () => { + expect(validateLogstashHost('!@#%&!#!@')).toMatchInlineSnapshot(`"Invalid logstash host"`); + }); + + it('should return an error for an invalid host with http scheme', () => { + expect(validateLogstashHost('https://test.fr:5044')).toMatchInlineSnapshot( + `"Invalid logstash host should not start with http(s)"` + ); + }); + }); +}); diff --git a/x-pack/plugins/fleet/server/types/models/output.ts b/x-pack/plugins/fleet/server/types/models/output.ts index 7d9232862092e..ee7854ade30a8 100644 --- a/x-pack/plugins/fleet/server/types/models/output.ts +++ b/x-pack/plugins/fleet/server/types/models/output.ts @@ -9,16 +9,74 @@ import { schema } from '@kbn/config-schema'; import { outputType } from '../../../common/constants'; +export function validateLogstashHost(val: string) { + if (val.match(/^http([s]){0,1}:\/\//)) { + return 'Invalid logstash host should not start with http(s)'; + } + + try { + const url = new URL(`http://${val}`); + + if (url.host !== val) { + return 'Invalid host'; + } + } catch (err) { + return 'Invalid logstash host'; + } +} + const OutputBaseSchema = { + id: schema.maybe(schema.string()), name: schema.string(), - type: schema.oneOf([schema.literal(outputType.Elasticsearch)]), - hosts: schema.maybe(schema.arrayOf(schema.string())), - config: schema.maybe(schema.recordOf(schema.string(), schema.any())), + type: schema.oneOf([ + schema.literal(outputType.Elasticsearch), + schema.literal(outputType.Logstash), + ]), + hosts: schema.conditional( + schema.siblingRef('type'), + schema.literal(outputType.Elasticsearch), + schema.arrayOf(schema.uri({ scheme: ['http', 'https'] })), + schema.arrayOf(schema.string({ validate: validateLogstashHost })) + ), + is_default: schema.boolean({ defaultValue: false }), + is_default_monitoring: schema.boolean({ defaultValue: false }), + ca_sha256: schema.maybe(schema.string()), + ca_trusted_fingerprint: schema.maybe(schema.string()), config_yaml: schema.maybe(schema.string()), + ssl: schema.maybe( + schema.object({ + certificate_authorities: schema.maybe(schema.arrayOf(schema.string())), + certificate: schema.maybe(schema.string()), + key: schema.maybe(schema.string()), + }) + ), }; -export const NewOutputSchema = schema.object({ - ...OutputBaseSchema, +export const NewOutputSchema = schema.object({ ...OutputBaseSchema }); + +export const UpdateOutputSchema = schema.object({ + name: schema.maybe(schema.string()), + type: schema.maybe( + schema.oneOf([schema.literal(outputType.Elasticsearch), schema.literal(outputType.Logstash)]) + ), + hosts: schema.maybe( + schema.oneOf([ + schema.arrayOf(schema.uri({ scheme: ['http', 'https'] })), + schema.arrayOf(schema.string({ validate: validateLogstashHost })), + ]) + ), + is_default: schema.maybe(schema.boolean()), + is_default_monitoring: schema.maybe(schema.boolean()), + ca_sha256: schema.maybe(schema.string()), + ca_trusted_fingerprint: schema.maybe(schema.string()), + config_yaml: schema.maybe(schema.string()), + ssl: schema.maybe( + schema.object({ + certificate_authorities: schema.maybe(schema.arrayOf(schema.string())), + certificate: schema.maybe(schema.string()), + key: schema.maybe(schema.string()), + }) + ), }); export const OutputSchema = schema.object({ diff --git a/x-pack/plugins/fleet/server/types/models/preconfiguration.test.ts b/x-pack/plugins/fleet/server/types/models/preconfiguration.test.ts index 9cf8626f5fed5..7b71070a504bb 100644 --- a/x-pack/plugins/fleet/server/types/models/preconfiguration.test.ts +++ b/x-pack/plugins/fleet/server/types/models/preconfiguration.test.ts @@ -17,12 +17,14 @@ describe('Test preconfiguration schema', () => { name: 'Output 1', type: 'elasticsearch', is_default: true, + hosts: ['http://test.fr:9200'], }, { id: 'output-2', name: 'Output 2', type: 'elasticsearch', is_default: true, + hosts: ['http://test.fr:9200'], }, ]); }).toThrowError('preconfigured outputs can only have one default output.'); @@ -35,12 +37,14 @@ describe('Test preconfiguration schema', () => { name: 'Output 1', type: 'elasticsearch', is_default_monitoring: true, + hosts: ['http://test.fr:9200'], }, { id: 'output-2', name: 'Output 2', type: 'elasticsearch', is_default_monitoring: true, + hosts: ['http://test.fr:9200'], }, ]); }).toThrowError('preconfigured outputs can only have one default monitoring output.'); @@ -52,11 +56,13 @@ describe('Test preconfiguration schema', () => { id: 'nonuniqueid', name: 'Output 1', type: 'elasticsearch', + hosts: ['http://test.fr:9200'], }, { id: 'nonuniqueid', name: 'Output 2', type: 'elasticsearch', + hosts: ['http://test.fr:9200'], }, ]); }).toThrowError('preconfigured outputs need to have unique ids.'); @@ -68,11 +74,13 @@ describe('Test preconfiguration schema', () => { id: 'output-1', name: 'nonuniquename', type: 'elasticsearch', + hosts: ['http://test.fr:9200'], }, { id: 'output-2', name: 'nonuniquename', type: 'elasticsearch', + hosts: ['http://test.fr:9200'], }, ]); }).toThrowError('preconfigured outputs need to have unique names.'); diff --git a/x-pack/plugins/fleet/server/types/models/preconfiguration.ts b/x-pack/plugins/fleet/server/types/models/preconfiguration.ts index 960ecbe67d593..b025e6ff5c755 100644 --- a/x-pack/plugins/fleet/server/types/models/preconfiguration.ts +++ b/x-pack/plugins/fleet/server/types/models/preconfiguration.ts @@ -10,10 +10,10 @@ import semverValid from 'semver/functions/valid'; import { PRECONFIGURATION_LATEST_KEYWORD } from '../../constants'; import type { PreconfiguredOutput } from '../../../common'; -import { outputType } from '../../../common'; import { AgentPolicyBaseSchema } from './agent_policy'; import { NamespaceSchema } from './package_policy'; +import { NewOutputSchema } from './output'; const varsSchema = schema.maybe( schema.arrayOf( @@ -74,16 +74,10 @@ function validatePreconfiguredOutputs(outputs: PreconfiguredOutput[]) { } export const PreconfiguredOutputsSchema = schema.arrayOf( - schema.object({ + NewOutputSchema.extends({ id: schema.string(), - is_default: schema.boolean({ defaultValue: false }), - is_default_monitoring: schema.boolean({ defaultValue: false }), - name: schema.string(), - type: schema.oneOf([schema.literal(outputType.Elasticsearch)]), - hosts: schema.maybe(schema.arrayOf(schema.uri({ scheme: ['http', 'https'] }))), - ca_sha256: schema.maybe(schema.string()), - ca_trusted_fingerprint: schema.maybe(schema.string()), config: schema.maybe(schema.object({}, { unknowns: 'allow' })), + config_yaml: schema.never(), }), { defaultValue: [], diff --git a/x-pack/plugins/fleet/server/types/rest_spec/output.ts b/x-pack/plugins/fleet/server/types/rest_spec/output.ts index de2ddeb3a1bfd..21a0b19c0dd20 100644 --- a/x-pack/plugins/fleet/server/types/rest_spec/output.ts +++ b/x-pack/plugins/fleet/server/types/rest_spec/output.ts @@ -7,6 +7,8 @@ import { schema } from '@kbn/config-schema'; +import { NewOutputSchema, UpdateOutputSchema } from '../models'; + export const GetOneOutputRequestSchema = { params: schema.object({ outputId: schema.string(), @@ -22,31 +24,12 @@ export const DeleteOutputRequestSchema = { export const GetOutputsRequestSchema = {}; export const PostOutputRequestSchema = { - body: schema.object({ - id: schema.maybe(schema.string()), - name: schema.string(), - type: schema.oneOf([schema.literal('elasticsearch')]), - is_default: schema.boolean({ defaultValue: false }), - is_default_monitoring: schema.boolean({ defaultValue: false }), - hosts: schema.maybe(schema.arrayOf(schema.uri({ scheme: ['http', 'https'] }))), - ca_sha256: schema.maybe(schema.string()), - ca_trusted_fingerprint: schema.maybe(schema.string()), - config_yaml: schema.maybe(schema.string()), - }), + body: NewOutputSchema, }; export const PutOutputRequestSchema = { params: schema.object({ outputId: schema.string(), }), - body: schema.object({ - type: schema.maybe(schema.oneOf([schema.literal('elasticsearch')])), - name: schema.maybe(schema.string()), - is_default: schema.maybe(schema.boolean()), - is_default_monitoring: schema.maybe(schema.boolean()), - hosts: schema.maybe(schema.arrayOf(schema.uri({ scheme: ['http', 'https'] }))), - ca_sha256: schema.maybe(schema.string()), - ca_trusted_fingerprint: schema.maybe(schema.string()), - config_yaml: schema.maybe(schema.string()), - }), + body: UpdateOutputSchema, }; diff --git a/x-pack/test/fleet_api_integration/apis/outputs/crud.ts b/x-pack/test/fleet_api_integration/apis/outputs/crud.ts index 86ce4a8fdf617..14f2e53949cfc 100644 --- a/x-pack/test/fleet_api_integration/apis/outputs/crud.ts +++ b/x-pack/test/fleet_api_integration/apis/outputs/crud.ts @@ -18,6 +18,7 @@ export default function (providerContext: FtrProviderContext) { describe('fleet_output_crud', async function () { skipIfNoDockerRegistry(providerContext); before(async () => { + await esArchiver.load('x-pack/test/functional/es_archives/empty_kibana'); await esArchiver.load('x-pack/test/functional/es_archives/fleet/empty_fleet_server'); }); setupFleetAndAgents(providerContext); @@ -36,6 +37,7 @@ export default function (providerContext: FtrProviderContext) { }); after(async () => { + await esArchiver.unload('x-pack/test/functional/es_archives/empty_kibana'); await esArchiver.unload('x-pack/test/functional/es_archives/fleet/empty_fleet_server'); }); @@ -99,6 +101,56 @@ export default function (providerContext: FtrProviderContext) { }); }); + it('should allow to create a logstash output ', async function () { + const { body: postResponse } = await supertest + .post(`/api/fleet/outputs`) + .set('kbn-xsrf', 'xxxx') + .send({ + name: 'My Logstash Output', + type: 'logstash', + hosts: ['test.fr:443'], + ssl: { + certificate: 'CERTIFICATE', + key: 'KEY', + certificate_authorities: ['CA1', 'CA2'], + }, + }) + .expect(200); + + const { id: _, ...itemWithoutId } = postResponse.item; + expect(itemWithoutId).to.eql({ + name: 'My Logstash Output', + type: 'logstash', + hosts: ['test.fr:443'], + is_default: false, + is_default_monitoring: false, + ssl: { + certificate: 'CERTIFICATE', + key: 'KEY', + certificate_authorities: ['CA1', 'CA2'], + }, + }); + }); + + it('should not allow to create a logstash output with http hosts ', async function () { + const { body: postResponse } = await supertest + .post(`/api/fleet/outputs`) + .set('kbn-xsrf', 'xxxx') + .send({ + name: 'My Logstash Output', + type: 'logstash', + hosts: ['https://test.fr:443'], + ssl: { + certificate: 'CERTIFICATE', + key: 'KEY', + certificate_authorities: ['CA1', 'CA2'], + }, + }) + .expect(400); + + expect(postResponse.message).match(/Invalid logstash host should not start with http\(s\)/); + }); + it('should toggle default output when creating a new default output ', async function () { await supertest .post(`/api/fleet/outputs`) From c8a206545a99bcd96a754ecfcf9380e2a80ffdd2 Mon Sep 17 00:00:00 2001 From: Dario Gieselaar Date: Tue, 1 Mar 2022 14:49:27 +0100 Subject: [PATCH 078/102] [APM] Improve error message for route matching (#126455) --- .../src/create_router.test.tsx | 12 ++++++++++-- .../src/create_router.ts | 10 +++++++++- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/packages/kbn-typed-react-router-config/src/create_router.test.tsx b/packages/kbn-typed-react-router-config/src/create_router.test.tsx index d29079f37ec12..e0582de320a96 100644 --- a/packages/kbn-typed-react-router-config/src/create_router.test.tsx +++ b/packages/kbn-typed-react-router-config/src/create_router.test.tsx @@ -196,7 +196,15 @@ describe('createRouter', () => { it('throws an error if the given path does not match any routes', () => { expect(() => { router.getParams('/service-map', history.location); - }).toThrowError('No matching route found for /service-map'); + }).toThrowError('/service-map does not match current path /'); + + expect(() => { + router.getParams('/services/{serviceName}', history.location); + }).toThrowError('/services/{serviceName} does not match current path /'); + + expect(() => { + router.getParams('/service-map', '/services/{serviceName}', history.location); + }).toThrowError('None of /service-map, /services/{serviceName} match current path /'); }); it('does not throw an error if the given path does not match any routes but is marked as optional', () => { @@ -248,7 +256,7 @@ describe('createRouter', () => { expect(() => { router.matchRoutes('/traces', history.location); - }).toThrowError('No matching route found for /traces'); + }).toThrowError('/traces does not match current path /service-map'); }); it('applies defaults', () => { diff --git a/packages/kbn-typed-react-router-config/src/create_router.ts b/packages/kbn-typed-react-router-config/src/create_router.ts index 494540005224a..f545fa8ed63e3 100644 --- a/packages/kbn-typed-react-router-config/src/create_router.ts +++ b/packages/kbn-typed-react-router-config/src/create_router.ts @@ -99,7 +99,15 @@ export function createRouter(routes: TRoutes): Router< if (optional) { return []; } - throw new Error(`No matching route found for ${paths}`); + + let errorMessage: string; + + if (paths.length === 1) { + errorMessage = `${paths[0]} does not match current path ${location.pathname}`; + } else { + errorMessage = `None of ${paths.join(', ')} match current path ${location.pathname}`; + } + throw new Error(errorMessage); } return matches.slice(0, matchIndex + 1).map((matchedRoute) => { From a228d608641ee2758b010d0ed56ed8c598394ecb Mon Sep 17 00:00:00 2001 From: Josh Dover <1813008+joshdover@users.noreply.github.com> Date: Tue, 1 Mar 2022 15:17:49 +0100 Subject: [PATCH 079/102] Fix types for graphql actions (#126589) --- .github/workflows/add-to-fleet-project.yml | 2 +- .github/workflows/label-qa-fixed-in.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/add-to-fleet-project.yml b/.github/workflows/add-to-fleet-project.yml index 59b3513c85284..e828a3a5b637e 100644 --- a/.github/workflows/add-to-fleet-project.yml +++ b/.github/workflows/add-to-fleet-project.yml @@ -20,7 +20,7 @@ jobs: with: headers: '{"GraphQL-Features": "projects_next_graphql"}' query: | - mutation add_to_project($projectid:String!,$contentid:String!) { + mutation add_to_project($projectid: ID!, $contentid: ID!) { addProjectNextItem(input:{projectId:$projectid contentId:$contentid}) { projectNextItem { id diff --git a/.github/workflows/label-qa-fixed-in.yml b/.github/workflows/label-qa-fixed-in.yml index 5bbdd5b71ef75..836aa308e92c7 100644 --- a/.github/workflows/label-qa-fixed-in.yml +++ b/.github/workflows/label-qa-fixed-in.yml @@ -76,12 +76,12 @@ jobs: id: add_labels_to_closed_issue with: query: | - mutation add_label($issueid:String!, $labelids:[String!]!) { + mutation add_label($issueid: ID!, $labelids:[ID!]!) { addLabelsToLabelable(input: {labelableId: $issueid, labelIds: $labelids}) { clientMutationId } } issueid: ${{ matrix.issueNodeId }} - labelids: ${{ needs.fetch_issues_to_label.outputs.label_ids }} + labelids: ${{ fromJSON(needs.fetch_issues_to_label.outputs.label_ids) }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From f125202d64e603a0a010ebf8267165b6801697e2 Mon Sep 17 00:00:00 2001 From: Josh Dover <1813008+joshdover@users.noreply.github.com> Date: Tue, 1 Mar 2022 15:57:07 +0100 Subject: [PATCH 080/102] [Fleet] Remove automation for old project board (#126591) --- .github/workflows/project-assigner.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/project-assigner.yml b/.github/workflows/project-assigner.yml index fd745f8a8c1fe..65808dffd801f 100644 --- a/.github/workflows/project-assigner.yml +++ b/.github/workflows/project-assigner.yml @@ -20,7 +20,6 @@ jobs: {"label": "Feature:Drilldowns", "projectNumber": 68, "columnName": "Inbox"}, {"label": "Feature:Input Controls", "projectNumber": 72, "columnName": "Inbox"}, {"label": "Team:Security", "projectNumber": 320, "columnName": "Awaiting triage", "projectScope": "org"}, - {"label": "Team:Operations", "projectNumber": 314, "columnName": "Triage", "projectScope": "org"}, - {"label": "Team:Fleet", "projectNumber": 490, "columnName": "Inbox", "projectScope": "org"} + {"label": "Team:Operations", "projectNumber": 314, "columnName": "Triage", "projectScope": "org"} ] ghToken: ${{ secrets.PROJECT_ASSIGNER_TOKEN }} From c90043da029209fb339dd7b23760bc22ddfa1016 Mon Sep 17 00:00:00 2001 From: Lisa Cawley Date: Tue, 1 Mar 2022 07:35:33 -0800 Subject: [PATCH 081/102] [DOCS] Refresh screenshots in Maps tutorial (#126520) --- docs/maps/images/gs_add_cloropeth_layer.png | Bin 452559 -> 495125 bytes docs/maps/images/gs_add_es_document_layer.png | Bin 330583 -> 571469 bytes docs/maps/images/gs_dashboard_with_map.png | Bin 259987 -> 262955 bytes .../images/gs_dashboard_with_terms_filter.png | Bin 237706 -> 245440 bytes docs/maps/images/sample_data_web_logs.png | Bin 531970 -> 445570 bytes docs/maps/maps-getting-started.asciidoc | 4 ++-- 6 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/maps/images/gs_add_cloropeth_layer.png b/docs/maps/images/gs_add_cloropeth_layer.png index 42e00ccc5dd245c9c13c0691190f42be34256bb9..10774c69adbbaee453528a732401c3892d226274 100644 GIT binary patch literal 495125 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�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 xnA0h@O0yq+JAbJ{>u#;fN zzYVioHuCH2uM9r(Z2HVY?ra81r!(^Sg0Bp;->6whk9HLPO8rU96Mcu;wX*SP#@Sv= z%}V&m4;jC{nORfv^GaB|a_z^T?!2O^rbt5HqhPi>nqAuPY4)QrrM~5gKS_hxeXf67 zST%2NxxsrQ+O;xoh8^E*lyYy64o+D!$Gtp+-(NdD#2iY#I*{xOTDhM-7i2oQ3^CO9yG5P3xM$UG+D)T0<*y)H{yi|F#OFMf1JGb@&4 ziEMB-cI4}SF;huvD=k&hAT);(k5j%u=ybgg>D6hU(6B2s?_%b(t4+P=y_~%>JyO40 z7H#|OtKGCX4r@+y)JqSXTdO;{sbJYa?x9`(%NUFp#JzL4*;hjp^-UekII6kV;nA?8 zLlCV@gLt)kQN@&v5w5%sx({ol=_2=`_!#P%^cnM+^qKPM(*aH39?#k9-l4O{chVbr zw7kR8-10*6z-Tc$Nwun!BqX**#Y1!KXWLOQV7euTgEIQ1upE$Db@qmqN1w}!i(rI* zSo)^jO{WSH@m2?VFY~FQqI_bXOo^*%C&SS#h!RaAWE`E$ru@{Zc2_`@B6px@fuzK( zgi>BNFNhe{P~w_z1N!!kyHIXhuXs9ZwCMw?F~?_eZ zaTmN=zt)GFAnpyjJ^yt6*z?Nd?)x!+vi{ep@`%>IiJd#AXY0y&kx$^O0$>*72a=!X ztpcVEd-aVK946`#rZO@Bs_#A&03^%;0RG(r`EFR>?Hf|^LH}e|N5YP|NS)T zckcxN1OO7kg39h7=Uvd*)>=ASZ#5prm#1yh-qT%A_E#pVD0d9*8Q>BCpi&dSDGvx>8 z*X%i;Da|A0rRuJw=Pj?A2feQ?zwoZNnxnPFq}4^<1zWc`o#xFgUXzE07U`?2O`ks97_YdQ%KL2;dv&A_r!#dB?XgPDsx|96+ZFY>ODwCJo|jSM*;xy|@}kMA!E@LKnTnS7rKdlIdoRH<@Po8{ z$x2q4IeND0M0gEeLxyZE+Re!1tk^OLrL?JIt1E-;|KQW^b^c`XG9)$LXlLCqT3u5v zO;W`)S1o8>Ht^k@`j5FXcCaO;o$ohn{Jn}S=9;d4K#q%TL&3#O~1fBva&nh$N$tNuHX%B`cHZvq9Nl&BW28p~h0|b7;9vSJN+n zkRI*qo8hU#KOWt6?O@6*w9(GG#Fn1a&4S+&HIFj&lGSup;{oFiv(5u!ti<>nuipZ7 z)-YuS?|xvXJM1l$3;LgN7xk9hHrd$DyHel5u3fSb(~XsW$bxLpk1`-2wj`)2S3=Ht zn$uVEo!vfVT#3XuFHAW@#5 zFb2ncku09dMbMBT&=b6z9mq!9eQ9A1-GQqo2q*EF5oa^iKsX#9Q5%z~AX-buG3D_v z#+~u7q%hDhCP=JdNhl4zJxoX-JPlu)b#&mCY3HHb*CrOiRGZF7DO$)^A)LemC(71? zxr{0zA~lxGijiw^t6FRxAD@ZGN8B`ed@g5uNFPk1lroF2Az8i_t_4{F`8sMY6?paz z-3o$S_u_rW^|hlxce+L8RlrtkMGAo(e--IkNSOEPdU7Ka9Nu z`EbeQ!AFfiSq@Rm-`ExMqRR%~0X<)L<~Sg4PRQmLpf z!^<-bD5B2Hxt}s^ut*zTh3^QCm*0*=o4+8Dq5eaz-wc^1pR3JedZW65w(Tr>YavjZ ztW(gHqPb2c=EMdrKo&}pC9z^HA)Wk+K41R2gGrMV>BMWB*R9^rwoqaOB^NtfMF>p> z7wJ!VBmSpU;>dCr(ltTZk_gdh-gd>i&J^|7tre-|9%&mXapjJ|&8axGSP_$(HK*~w zaB%fz2r`~B36dx9MVqq9hNDNt?XSLy!TTwkd3$_4y)M<7NGQ1`JEnFOA*8j}wx(b& zCfq71Mg{+;BY}FiU!*4%4{UKL>70ht^^Mb$s@tI6RwAe;*&Z|=ohuC=E(VNw^_({o zGjbTZ^~%7pnnkt8qfs-+uLQZ?XVdbb2NSkbNjWZSwv?+tIj+)|OpA?6ESnW=&Yjaj zZodCw{Tu}*c}MKG^n~jRqKlrBMEWmZy7!C!L7s2yL4)|UqPF$;8%1Rcu5VO+vs4fJ z^h}A*leZP;S~W|#XRvt0xLrin&%=(AV2mDg*H~d0S4`rONwS;zAQLq-QFhTD`eh7x z=}IU->K0WP@_NChw=^2Q00bwjrJHLDyfMDh*lRi<7t_a3xfN5clBXQprs<5WN4W`S ztYLVDtE+ysnbiG?aUTtHpZ*VNnxHO-J(0fHS=~@E38~4=PWxxbxJyT4;5h|uOA-pS z)nCm;z;a@~7z~9&OFWot1pRWQk>JA8yNaJ!{Ly|AtrnnB3oJfM;3sE}+-iDKO+H+h zH+fk7#YdPUTaRLsXcr`{=4H;DR|@ES((V1~YG#t1&fJJU%7bT6U1{Z}EC<77K?Uj$ zBFc_^Y6Hi{lTSFg8ox6|gzeK2^9efImUBP;;EBktDU_AHvYG>~TN-0(%2BoWKH;Ol z2g&!ofc#$B1Ea1d&9P&H$VJpc*y)p&Sg+|Ylf4l&Hh}z&ArQ?T^TE|c@xD`5%rDHN zeQU#U!zl~*q5B1!oV829Ha9=g-rrgOW8YIR*^azHyeQWEN_oqZ`ycG*vQn?oc8Rpc@re>g^Go@-&@#G89O0Y2JwQv>D1Jsf#}k)5G-wOJ|Qg!rhk`c;SL{H$Hq$?bgy!$c3Upw z{vSpJ4R4EB-Msc7(dHX9r3ZO3Q?cP)wvN?$L|z=IXnbzeAOi^N%6x_S?N1|kRJT>G zwX%7$8{n}NNUto-Sti34A1)7!d3O$Eup!zvhORx5BWCczN|oW@*!5s4zu@acYSc9= z+)#2k9%vYV(a4NJFXoa@wDMMFP4|1x`h)Ma^b90g!b2!d-u>^M!G~#8a}2vGK7^Yj z+k-l02@yC7itu2lA9BLdF0hsFD)st@!)5tO51w5*p)e9 z`?Ousa38BJFFuMPr?z%=lNz;x>L=n2WQ~iDjj~WZ2pBX*%;=L${>T8)dVWx*RFfAr zx!LzaklF>uGyg3x>^Zav7M=sjlK3!9q$-%`aX%*9Pt=~mNVzo|#s%XK4@_Wg^a!5P z{?$!{=M8EvCUteLh+@YC>Ua+q#tMELqA|qQqv_VGh<1I1lnXO7E7Q?|1dzK2NR{i; zruAetj9C6%Lp)u29V!TOlkbQk9bylD!tO1msfV&BtCylns3SJV&I6mEH1c(Eb)B5j z)oIuxmH~Uxs!`PS!is568CP+}b1`E{@AFEqFZ!J@R@vC#-dMhjCAliQqJc^D5j{&r zvv#GWi;I9>8!43WN*p)l2qRS{6mYBC)M*)m^~9fKW;YSEGbdBnt84f(YjS7Jg50vH z^!*$WO%-2vnWIHE_wCe4ePI;vVVFYSRz6hY-(EcvC4HBa#$EHIH8lqzFsn<9KZ0GSPX9DI1#&82af259wi2@Ixz9qgM%@aG z5QaH~%C!IGvu=Z|aqBNX3_@H}*?2yH*aGq~k?VnYWDu^UUaTTTojL`dg~pM`1K}zK zV&Qqxb@~*2*7j)OrzCKv!3SRk{#?x&*hT0h+$$#PRsC|DFqqEUh;bbqbVwepsiTu= z)1-!B(8CRce|Hm#2g^Qg}> zTzzMhw5F$XmfVg~pd`?AO7;^kCF^X$pxkQJ`+{J-9-y@cCAyj;RT6-DE0!H*0>BEw zdG#R|-{KHdX{IBZ0!!=Dmc-`Mg!uWxwwQ7YV2WUD$H3cy*Lb3J03)gHbu-enuEkS$ZraM$`TOi~q^ilGCIP}OI8k0H?Q zfAVyD0##7}&75I3ArsBD!D(WXHqq|ipVj}=aW9&G?o&`(1(>L_No=i}l#AIBs4vk+$Hq|JsE;v(c^l8tmRZS|O1yjSLDbsxhBt>#3kv;>`WKD)x>%LEKlNaKi z?p)4n-+ z%PKq+8$l5N1?4tnEjiG>`Y>2tI8oQaVuC_7foHB5B%=0@>kT`a>Q5ZH^e70DVjLNg zu?8r8)F06!0OjL6)7S@2GDWw0`3v!+5^?U?Y`x&VpM}h2>qOE+OmJD?*_ob;+w=XD z;w~Y>|JXd^R9bFfo~inuX{*@m&%)j)7F~vgzAlu{@7!U8DF`4bLy4q1a1}uI+c%lJ zxcM&ZV8T^W4oVNl-@?(^Q6ms;T%o%g6|niX3l=yEDi@x=~r;W}K+G0aNRgBN-Gd0c3 z%cgwwk>+!QT&~O+-1y6t3}t?67;+8Ab#ao?yB##=kcB_)AbjFFA^dgHP^8&UkMN|L z=pUUmY?r%EY2eNP;uyfGd0*6M%6bXy4|G&&%Q|2SwD!p~k=4wVuY?a(s+MRO`BAg1 zPvV+(2;mHCu>jVD?!*U_Uz^m@yTp!dO{ljiw6YW$AIfoYq?uZt3SMW-V|)zKoEBp# z33UV+CDgd41jKxhln974_FFYkBJKf5J{oiz!I}AJ`F<7oLgku*v7}i<4NGwS6Cr4@}&`7tGi+D^HI!GR!ZgO1z(% z=`Lbht9zC`MLxDasq6Tkf3006d51WKg;%HyVEqXpasqvcjO*$mp508G2x5p9JX#pt zJd*Voa5CWhSadK)Ej9{J*mWDOxg5c z&6FE%zsfAUlWx7UX8Jm3!G02HsNstZ1Z4HPz*615?0@5!eJy2vIZ+f-?DMR3rR`C5 z>cyDi#*LVg21e{EmiG`+FR*!^q5ddsPc_i5i?d@lNJeYROAbUXAV)#KX+pQC%Gh^x zi_-&N`X6J_139!aXXMGV>ia+4`^hDTJ&Ns1{5biZQt>!dcRy0MnUAzH-h&ix!Ooh* zTM5X788YnAF`q8DrtyWZxYIV+cG)lrxIli9lL8LH&9Ea~9y7_!P$nKCy+lD*_Lol9gOYRFVD<_Q&@ z8jT9!c@{PT6d94j8XM#eYUKKos!AWHt<8(ua4OuBsaUY*95;oj)QqJb4H~!!<)-pY zS-EOiSXKr+7EidN1D)V>?<~z+;F>#G@+@@KD&-_>g?@jCzJskivM)HgfVV+8mYae8 zyra7~WiA*bk`CNb&natFhBCdZ3}0@|fejC|#F^d_JipQ~p!ltrgcg^UMFT4L$GS$b zUV({qJn=L2DvNmyL$V9mo7&CRdO1<%MSJW3-^u1Umn=>RhFQPW%E7qJ+dV2{kO?<5 zl8ZA=T0|k{F(m;E-3+;0fR4OCRthwr>}TawYC3VX8^W>(x_1ICg})=AVDgU6=u?r9 z`Ncz>uOez@Tw}qe?W{NPl5f~GF@NOg{yB`mJmwX?g7a_43g%YY!Fs%S+ivJzjP%>OrewV&EEu0!et^COQAkKX+B3h5D4H9 zpc?CBI`HhjvW)+cwhTlaUf@*t;zDlK?^~~_Wz#Hwh@}I3Zh_(QfIOn5oSC29C(u4C zyb>K%WK<3#d;L$MMHBF|btZ57Nu|94Fi`f1zdf7&V3p{wl0G{i3kHU#Ep3h^lMErGO}Ho$L)?4wQ8Eomq}q3t zvU6wN^Xc{exPiM|FB!fCFryxVSQLYXwql4;QZN35L-ww3v2M)m9+oEDUX@)7+LmII z>7BT1WYv#6*BX?S`x7^t&WXse7w9roI?p!=Kp9Sq4EYNc`uWo_q9j` zzss`_kr5)*RUA`tGuxS9DvM^t3?c*#t-$3QdPWdLsT@>vWA*%!qLONqz#y>{_`CIo z!7Q)5uSTzF9dix4A{~6<~_*(btP(hz0CYcDU+ zv?{Z$UN6%rvl=!yRMpz3!#ZGl=6T;alc&WWrTa4B73MJ-)YJUF_L2emnuiGvpt9ky zg3ET$a1{tT4o;;iV9=J}4hl#H!u+7LigcPcBX?7Dk)S-I_}o`fKlt|SHE@{^Vx4;+ zPe;0E&CVE|lNE6yn#6`?t}*0*sgBbsR*YMdfqO~}W$;xyaPbJrTM1i_8vTKB?ud;%_T) zY#ZRX`#zK_yv1v#;+oal4U9WsQIF<|+}8=4>%eeyr@+B7yVz(3920_4?OfY|;dv+|Rx z$MTsi+_KSy7=qg>>?Qfg*5|u)Ba-5>%KMJC;6Nh`eXC+Qd{>2s5)t6vdgYCDkwDBC z!KCKy1GXABX&DkiSo7CueUl;#aFbW6@nS-Ml0lk;!3^Ymdp3ToHSk2_wv}-LeG4|~ zDd*-^P1o-5xiT^nfC-6y`8?8Zd9hkfhXoFR0$)_hsSSYQP*+26u+GrRP~^ZG;kXnG z)yP7ijDrC0qyJY$%ave^*O!{J(pN~vsB^X$EG)ze{UUSdAZ8ycdRxyZIChl~fy(pm zhm)y7fv)z@xXaXHhr)TgX7fE$#lS&diRmRmKv{!&Z?a`)9{btOn zjhf~ad2pSMxo-E{uly`FJgnq+3|mq)@Q)=gj}mGrdasurT7P zl)Vy{&sa?`2JC-Qaj7^=?sbtQZ&L&kmo@&jZz~ZvCu@}mffw`hNiaP5q>?%Gxu9PH zdc52AAq)If12_oOYuSlxKyFJQ+_eajkLyNb1*4oBKYc{8ws7SFe1t%{Vx<1!amhv( zSiBz|X|hrqLZc25{4s3K0KcDESE>SaCx{nk3}|C#UDSK7=#w}kUvjCpRhXF|0?1N~ z%v5w>XXKAT*T!dY$$(gi)0c)awH|<#L6@Mi`UuUM`nYBV%V_3^9Vh%9GY1tEXPpDg zNTGa5Hm<0PZ?Ed*4CLUYg2=Uz+ZdJiE(AJqQj^n6SrUY>YR_BvDgh?!|3O(P>M5=_ z@JIsMRnxwx4mWvzVb25BAw_$Eb?r8I`j!0;DY)&w;MP`8S}xmclMH(%YIbLTqFdDa za&U$+U|BIi7ocu4XPEL5yPE<=FB(zvzFhMKDj>w+gNlyY2Jev2XIGO}&99DM^GWn} z_sqLc)?C%@Ci6W%Ud{^rFVhWKRZbb#8<>uA$W50%a(V|6)+j5=M2<`sz`~cr9Q0O| z^v!_jSh7gm(7LdXJL^nWRGp)??#-L3tU70?ThV!^v?!mdoNYHbWEd~&j-%Byi*-;x zyop$X+{1L^rQhXXbj#-@*G@>EMHsa&$Y7*xxTR+ts$e2dPX1rrBTHF}d3AES8q9uS zBUN7mA5s5@|NS^K7S)L?iaa4fn*eKFe(3A^8`}QYmV-e-^YF&F1_&WWOsL*itN?Ib2jYxS~x^3o^Ph}9%*cZ|IRRN?7x^pDJadIe=P z!+D{aFjYQSNtN%Sk>1e8Wft6EhX{%MbgLNjel<8D7RqNKWPEZ{%> zn6ix8+ko4ls;dQGk1=j=#al(Cp6OCbK&jM+Ob+G{!rV3c*>ebf6Tb^3n{Kz zCwZAG5NAHirBJbe8$b6~MXxyUK8NJ122=THwz1GlaTrTRRW8b3lbzV2l9eVGEnH0H zPxA%vSD~Ntgtj#!NaPLpqWVeYAhLM!um1Ju*cY}(QV7inZo=s~%f&Z<{9loZAJdQd zAjgbcT(iy8q|jJD4sMU^P$5b}9azV_U2QWsWJ)JqsVP6p`~A%6C>3pkK9X=2lyX?Q0KM-;*hqq`(?(vriIr8?uJAfpR1QI`5)5u}ntsy4IQv=-Xe6~B0aTA7QMXtT5xPnQV`yV8nF zN1~3j>I(G~CZx|$u8O)8zSPdH47|B@1R`%?R zNh_ilPVg*CmWLEk&~CPJK|6l?=Q8tJyWR2-ws=L>6xo<`#gvfD*`vseoJsty5TMbZ z!|l6;I{x9C-(2{l=>jKp$G_44pgTB;>A1(axc4s9sZhWWog%QP(apBKM0R^!4NwHl zX@o~bD(0Y)sjU9!bmVngOnU&fGE?UBE|geQoaOW@T#qhbQj%Mdlf&<6*M=pD!CjDK z{Pq4Xz4?C_KnT(JXXGO{`DM@623iPHe2`jvnO~zKfXJ)%+8hLi{-)}etP`wX?QZ{* zh2$RCu!W`hzhq#dJIU_z;C)BBJeE*)z{ARog#kiedB6aQ!fSHOA^Jx%^0MgNn~_`q zcK~RnEO_{cr+8qGbJntK7MymHO1X9u%hk0wnJp|>?;n{z%MDVqnq95yy&+1o8U~}Z zTQNu^=9UVTMTCIg9nhwJSHaC-v(N%rXaq-BHTp915%dizZ|%B;Tdac>r^bu-DkGG# zXrLJ;!Bhl+a{v|#L;R{8BDpGvhT_Q-yBxuy%d)(J~Z%U`d~coDgkC|UyMBB@j$7?iec zQOTbn&D|BG@cx}DRwF%=L2Qhj;skZhi|pXT$Un#N;BfBqxBp=nPH#6&LG?E$ZBznt$G4&x&*8F4g0O*+s^Cs~UTTI=!V@ga!uUhSULrh4s>9a{)_ZoG{% z+;rEJ*meN(LF)pT+9sh~+CgDDt5W31@4GH{Y~-P5GCAc;vHl{T!somuNlbL&%Ae}v z6yS%{NIJ`uTr^*+rO=Vu;1@^)xJZ5su z{QrSLkGw!#PNsWGg0S#ev@s>jO#%sCr>~SQMX_Ga6+nKY8g>L4t&}fHnSHIB6DBaY z!zN&`(Z2sZEKtEkk*;_bA$_&jU))7^`qF$$e$4H!()OW(egeEZ7~ueKl6eZ*sr4fJ zR`eNa1=XTry@6N+H#xek$cvaFGJp3?lWVEltC-EP%O+I_^B|9ZMC`zpR?6C_%YzYA z%$nEGBnTTc**WX_P?4g#i>V@;uypa8ndak(ROZ?~Fd)L)2^sR^+*uV=6@+o`?=KD7 z6k7a>H3tBl1%aD|JudMXC6!IPqQ&F`Yg#OEr^G7EQ>Q>#@wd-lU>V>EKXiwL)rS_g zXzFs^wa;G=|JL408r%e1^#Q9N-?O`thHqlWDtgng*|(p&!w4hAl5PG9KS*8H?QRfN zVuFfdP{xu99jJ&NuhazdyHQj2UI;>i7VrmJ3$(Fx(67JgH}hFTvVD}%X-|iOfeaCk7ZUp_Y*!l^SW^llst+P+73t< z>i$-m2`9}~9FyI&==y|su1aQA;OTeceUPsLE2`eX9PO;HZ}0Zqj{sp!mD`R?cMqJ5 z+|x+9whs$+@{fVm(oT9jdWfF+hKK+5{W2#+qZwS1(#+-i^2nPdzxdP?2`Y|V-9I?$ zhi|Ow-VPC$l7S`lvguqh5;zI##UiEEw&m@w4p0ji)CbVLo%dDj-Xk&C={VDFXMzP!QEk{WOLIuMGsEif- zn!Us{x&=A8%n`lM6xG87id8X0YbBY&^i_)wbd0uvV+|0iL%|mud>5AE6*7kJ&U@H4 zY2lH6MV_f7NXw=L*z_2`$=`b#<@-|5tF@T`EGbk1+8ck6t@jllRfY|lwNWw9)lF;` zAN)&@9Y--(MBj-8@)jaxOe~?))9*7bxaRgu7tUWZ4^{u2Bhk5rI+)zGVz#MDb6Hix z`2W@hnM!L%)9kPf5402m8A#$GF##8)j%mal+NDGQxa?i6J>0LSbu|HzmVxH2Zf|{@ z0Db+UDau~m-Ps2+4Q^Cu_}do`ZIeZ#DU}lN5zp=POz+iU;Bm~42bU+vMJubN%|jm^ zn60KDVGtR3O0rPQUF4Xe%;pKr&Ivu*~q!!&gEf}57nQ}Gk z3xIk$S@p_hu6U|c-O_#SrXKRP z@v*~$AL8+PkU zE3IFaGpdNUA~k?1oGmlNRw+MVV9W~aH%KV@bt=5`~{*~xny{q%tGPhbNbhfgtmz+PC_PCX-|M88f zQn#2ZE#kGePEVIM;lgT#NFow|AdqBCO=QyerOTW-rT&xlRK$=<I2L9s1)Y-s^&e+u6(mq@#eepbOJDJL^9tAxqK;HPo#`jy6Fkl981$))|v z800-G%(;ZzVS|Q0kh&;ccNT5*;Q7Rlb9y=Dt2^2$>Y6j-#dIl#jJfO&IUMp4v1p>? zNnh;)6x-ToIz}5LN%rfMA&axIWY}BgT{UrZgXj0ipd!J^uT^nBauJ5WfZuT>PL4P4 zqr@<@Zn|-DY3;x;wCC0KMM8TMjY`Foq~eG2hgPw?gOZ!V%3wqB ztVAVsU1W-fb&u!#ue zhzDAqy|#Pwzn2->6t3&u&n)fyKdQr?TT#F&?s->OOr8kcd+GpBa+l5p<7^*;E;F?b zCcLBid zX4z6c@VA3+-~?hj5lz*iFQk7YCMAl45UM!DjlMFUt$Ew;`xN#7&S)2=^BDP4#pOsW zC;Uf6z?@37X@@R5st?ufR4>MN$2ZFLbZWMg|4WtuaOsdiCcWRH12FFC*hjU@OD zgAfG_XO|=HVgB5Zp{DfT-^pToj|T6Hu5gy6C;10cCJTYmk^?~eEOI3c>Qa@-8!8Mt zA8W5jOo8kQ+NHU0>BVf9Uf0Kz43nt^j~*51uN~bpD>+EpnBN|CW`wFj3&`LIPXOg) zCb!KSf+f$(J|F`G2Odukh*5!?^wp;jETb33wFF8aIt6a$k?5T)8uco%k;4!FJl%*D zn)IGtVLyJv&5!jfUbMV|CQsk;-~%PpsM2Qm81QN?)`p4xo=Om5QYK9Hp7W=h^QF%| zG%h~zEBg_xW39X9~GF*JJLoO;hFZ-t>Q zWhzA_Qhv)iB{jLE(3DP{_GjO4fp|l3;J;Un*6y6oj>z{s9}$p^O}Mid!*J9Hh{J+G z9~UnKTeJRA19V~}J?zU#WggGUQN=fFH@fsp*MEWZyZ;x0rAh+h%B`E=JTyG?lHCy` z4lA5Lb)`1BGa7r``gV1o7Ypnkpna2E)EbkoZ)kg7)*csIKAUqmol->|hJ)?Jwk+S3 z@?NF9mO3_VN@X{!=s#oa8ou7NdIoj26pX5)PU~LF3?N}ESD_T`buU6LLYMlTa-zL% zU5HQDlVV>aza?o55cfkWeSG_fU(eEQ5TzedOCL8)+8x2_>9<}siSQiZOw~T(`6SPyYTDWAzo-RIgp@-aHzu>_{vYN ziR+*6dt9QW+G54tog*G_-Ac|J1K-)gBCKMJ90W6_^?+VR|eC6WTl#L$C2t9COPVrMEs zLuQYW@)J;8^9iE|(eW&`XK{*wQ$d%*{`_NwZ<*6a$7UOYoZ@Dp*2czANR=joDu#Ry z$RvttC`#l$sV7D-lec0QLjn^S-7pZ{rI%GB)r3mD$XKe|4bU z_$7Ab<<3ljM8j*N)vI^J^BF8Bf-@Xax%h;D=fK?Vrq$#C9zyD@ zbxwpPAB%`B#~m^@uI_sT0LaRg*uO0G{;_as@rJeqRgb3yg@Iw1CEu5E`^BK~cm&9& zqv;FkJ%gJIb8U!>T56VYs~&A_1{ZAX>*Gx8mh$)CTh(C+_|Y zTWG(1O8aZdnL}JEuvr{Zf<{oLIOAmnE0nFI_A61i0$6(TJhTv$a+1EH237FN*7jNZ zEVoGkP+C>M2x-y3A=#^Dwu9GAnv)zoQ7{*lGy(z^&=A*!PzAAU69jF)EA|S1D~K^X z+`jsVNnLy@h5FVhJcX~eeS*j8Jt{38U- zoSQnwx>M&lVe7&&!i5&6%dyYL;I&6BsWVkHpo9uWlNtOSXz8|=^xI$i=pemCEmDLg zeP+JoL)2)J>L3yx5!T<5hy%KEnWglpuzZLkE=8~n0>0d7;f3z3xdC15^a)DU(IgkU zjpcoxv*9Q^QM3;GFqCXJnvkPoVXmPd{mTJcK>*GER&1TVi93KX$V}rdapmZ6*R=`w zSLIA?D34nmXg{ZIR=w7Xj#p{$ym_ev6ONCB&!A_yW&l1D*EeaDyWFARFA=AQm9_&9 z9x}`Rb9u&i@~L7L!Hx<%>A(YbHKH3dpX54Eh*MNT^#FoqLMei78tuTTf600#Bst2a4UXR_BVCmb7YF9}W$b!A2P23*lwNg0Nu&EE?QMH~AZugJ z*Q<2n(O}r+rng#)PXhGV_p14!@1Ur+wY`1plO^_SC4n|&a^U?BV~S+mkui!~;@eY7 z3M#qLILNY?NmM)C%7A9uxh{K3`L3*riwzJoF~PyKmhW2>r%IKwj5v-+=fr%pFuYSx z0PiTdfJ^29*5>_!e6VP3YKj#nyR_3sSvl|bpY-5cy2S{=l9$Kngis?gZaa0Z)^!V4 zsO)>X=>>UsqGsFR)W?NfNzQnhHo+7+AXlOX2%LW%M&)M=^2&8te-x2=K)G zhvgMhC)9UAE$7D^UoZef|6H4F(OPwPix%zjTm?anA4jb7rSsc7eNhAWJ29;jvpP(E zexAUh{*XV}44>fK6_qtCrq?Zi{8DkF%iMEy1`gudYT7`G5P_%L>^eMNqO_bA2o&RZ zXM?AU*|$;P!MXfMHdu89rEcYUH#qjJp>(S`gT5lTr^gR_vQf77?A+EyPdf|fPx0ef zgl@V*yw5&qdwYZJbD}&Sh1PrYnfCc%2LaK~yWYIIX;>g&c=Y+OxWMffyij&w{&vaZ z=N|mTpnj}OFkGds^c>}y-#_s8wUy>{zVS+={ysM=p_spj8p%2etSW+C}FIqQAD zgY(niIyAyJUl&`}I=0?^OxYy;flp#V-?zQ;d+)b8C*69mOYfzx0+Tt_M(aDidY|IH zsOY|xc%n68v^X7Cu5u2Gr68z94knRU*oj3|2nGwF2o2TtKx;aR`ppA}ov< z0ZNPN$Am9DtvWPWWO1gBCZN?29)t8c>6M@_*xw7};ea(oO$eKkA<~X-a#8BsL+XJ8 z)MPwUYENTGgIJ|t5SVIOfJ$YLqvWS1Kn4$S6bs4D1P8fIdtpdZPy-N1 zZ9-Pn0tIzaPY#gaoZM4o3;#(fMd1PuMo$ekPip1pHi97#erR7jg5=fF?Lg4+UTh{6 zNE#sT*hWEJCe%uue2{Ty7$A3Yj@0yoWSe&JV%UNXvHMIad*cmNs~QP5a@raaZ*N*= zBe&1{JVBFBJKf|LXj|iTCALRt&kLNvs(KL1GXV14w(jUqrm7EU%o&(2KB@7>h-VNF zbvA&15sLu%YwnTEv-m~67(yD+rVEO^h@J)v@Z93Imk{eJ)62govU=6c_b3XaKz6xUD$U{vXHize{q=H+t=q;{V>lVw&N)9XZPJ?r7V|Ub`tR`= zvg_&?yXv2s^;+{}Cutbb0+oZzU|oVzt%Qh-N(j;d4&cO;M)7`KvG)L+7o5obW+ z>9%oM+4-KWAu&BEOF=JC$Dhm;WVq~@H4@oCCLb;NUQE)kOuMck{5xCYD(OrV&2R5N z5G@^Cw@Ym=+$7m^r8;HVUETWgZ<1^O`+3~C6U^~VE>WvIA&NTlsESs-j?-$-hx#&? z?G{!md7JW33XZMiEzUS^q<<94YUv-j1Co&pNNIJ=sy=De+LHd#S982xp+)&tud|ur zt+RtMqX(x(fOw-~b6ZMgi~;-}^3@gigDw>^GX+ulv3A#?6exTEyT_>%IS6Cz<}8pQ zI@Jj}xmduOB0$8^MQxz|)NTsw63O|sPVD+1ZXu<&foV|?G#;G6!Ze{+fhoteHyRs? z920M;6+zxTr6p<>K6X<5H;N$=5tf)(nHVpY5`+^L#P|BnZYri=qjz2Wl?^(#`sb zog(~WBTi+VwOV=Y@nqa|x;1Q3vF)tc+mbUXUBHNw!*pjplWwd~UCu(sn5&l49Z&WEsb<986|A)FDrpRT8&nhlNzZc4FOf{NYeaBYRZFnMo zu8uhu9_7Ev6>(6y@3lHr6lxt4;vX9uj4YOCO0*)o0ajGhE3E0x=F(5pxVo6_SmrP# zoUY1_749bm3|CbC)I-TlEFO8F=8CB=}UZE<5BK3rSH{(hFTTmc;G ztS+x9joCIU-56=ArRQpL>pFcDz2)@){1Y3_D*omXdK&0`Z=?_^6?^touRgB6gnkH= zueNGO2MN9KT@S zdeu5^VEZP`KCs^Kd!D(Ldf0njsvcMK{BpX`3C@%9-jjLXR`gmnL;3&rlCU-9n=zxF zFeyFR3B&*Yh0)q_1@asW~1Im<5rEH+s4%DlE9G$5B=q#(nM`|5-$%Zzf@M9l&YgZHu%qeac6pv zoFwM=5^{RP$q<83+L=&+cT*Px*#O<{3WKYKkf4dcgmodl_u>4<8G)~s&TaQEWBDe_ zDNB8_4;9=U0LSsN$>p8I3!7W6+wh|vdbJG-h$ifGjvP}_;SlITkoO}~(?JcsO2LlZ1WW(qo! z=&PVx0{%iYQX58-g4*9(FW5t)8JCjyzPCisB7LuAn3^Sg4tyI#O*D zOh}#LwnR08B-pjpZ8i)NHT%FuSx2}j#s0;v6WP4wK7`Zg1}xggxY$%6fX&il7d>+t0DIZ-jR}0 zgPTV|q%u$Zfa40bpg$!dNPWepNZ;eI!+ttXJX(9479Q_9BBZ}xk^l!>JW z`?Ii*8V8f-9OQiQz~PCTffuuqoZRGXzc}smN69{wuC-~7+mgsAZXr?;R=yhgdLKnF zhb|yr3KV^=)c`~N*Mb)}C))G?P@-sC%CDGg(f&gb<;Mub1X*>^xI<}!a{u-M zACq^k|1`+8P{6KjNH}8&wTL~9MntAbplTwkW#HmGwxMW@!41Bx3h2M*oRZvw5E3w@ zA3$7@ToZ$EPIE%X5vZ33i40O2%F)E$Ugd2#! zFe{|ky7j0v)S{oNT7jvj=MpNRhAA`%Ijq-9HSAY9cg-TFc30RFkXmJH` zPEqRAcB)N5Jf<3ZS2^hy?5fR| z^xf#7p4NgpX;n8Olf>QC_qB7Qi~Y@IcO>_9Pf8(EI5HxIi%VFa+Wl_w$hUQ8dv5!6 zXnXOr^+6!BL%h%UxyzVY-kI8YzQyh8maF9+-6&7BJd#KW>7wRt41sj${(|_)3-{(rLoI2G#>ZvPk9%Td}s z5P1IhJ^3sm@SgwZSp8z|Ia#0GT2IWJEzO=XnwN_RR`sINQQP&hrLZX;Q;vE$K3UdH z(OmX&EFo}-1I;KcUv{?&LRBP5#ktVz6Pl?oRDhjZVCnmLl)a7(g3gZRGgq_*KI=CA z0?Y&Jq&`=_diiFfQM?h$?^V8=Dk99abTrK$WTJi`FdZx)1|?ESKVG-eOq!%*=1nKI zcm+!Oj00-i^G~V45NIyA;y9oOYCZ0(14lT(z9*%9umnzafo75SuNx{8jR`7Oz#HHP zR0B0AlMdkdwDFJPof=K8m%9Jz|>&GhNum^T?LKFfCenY;7X3X!gmM8PdI>`t(6;p1Az>=q7|4!85s0k@y}lZgJ9W*@|T8 zz1$zmPz*PAv77_m>Q)Y0NKS3Mm$uK8O{ICpX=mbImfi_(#ksk7DOb=u5N8gc!RZp= zkmR4!#g)`VG$RvZRPX2e@=-^56X|@+GrCVQ&SO81!CYSN&EK9W`A;e`=SKy6 zcVI89Z9UsRZU}v+b??%%jjHhnn0*devW5Oe6Z7u-?>lC{b$r~OeRVq*0^BX#cLd&k zU}BJ+JG;rTLVf}D-h*|3`H8c~$0d#ug=zA7pSP(OfrRgIe0v&Gy=A9dk5R>ZW{hsV zch>+CF^O+V@xSL05rVZilizVMB{d~p!zp?5dlj&c`#tp5U(5}}cmNSQXE$#T^=c^v zPN22W&$KBwQGeDdW9$WVL5Gv2l)i$4B#q7MIIoMYf2=e|Y$isKI(+s)fY$*MkhDp9 zT92~Y?RSD6K)%4~q%wpuYTmB8WA)WYFV$D?O~40k5zm4|qO|$-obg_bF05%^d9+#Y zH{_`1`L@J%@($kc%ezmPbPIAmI!i4XU-!y= zAkvf|?qU3~k{xTnz#=D!af-pGP;ACQuO&g^3grELMqp%^D+tmp*H{DK3lygP?|wGs zSx@MY1`}&((mkU8xzEs>Cv2U{IG8(DHw7Aj*A}6|stZk|E=$H1U)ZcBmh(;2J3z;Q zn~xqix}-g$8r@&?DQ+<60za~UC2)hm3^n?T&m&Rz%g$mTB;E#_^f}Jhh8$PP?e7gF z^=%OAXV8hJ%q&)dmt^K|Ol-=R>$wY-kmiFzJ@_-uySZT4V^U?;WCJDw3XU+x z=(DDN4(EW(BAoCnK|tLG-6@Qh?*(sj^}E59V{L+IG$*SuQ4bapXAosSe!Gri>EanU z?ab@5VARn#u_^dS(_yoifOoS08V_h}uX9qV>GuC8`2Yb8qM_?ZL3^YSBzqfkQdh&V z$|*MbC*0->#e4W8McsA^N@h$ys~LBkgK!FGIQ4UKp~oyk4+|P|HbIg=#gs23+VncD z3}vhS?|#<^J>_*-YFcx?SjX(yYiDY#Q4>R+lhxpZHb>hME^bJ5&H!4YJPpl|XXzW4 z$r~Ro!4evV3~lWRZ&9maYH8nnQUOQ-t{BfDmPnNxdABO>`KgcPtXGQo6%+qK1@AsDLsnNgvV)>hW}h_%M=h~<%%!|`hgMf z9Rz54)go`jHIqWl8^d?LFKWIJ!*_A@;wZ!S_r(Hch`e?Jmye&D8p0zRS&BcZ$*P|b z8Jp!mq%--w2QzUA2$~2zfWCGn8{w0L?y9fjru;?%*B^{$zjH3yGC6$=@%^NC9+fZn zzaSW$7S#Y9DJd!P;8=B-ykG7%0$(iEpVd`^h+f;V7xmen6(8S8InkY;shj$-tyf7O z`{h1;SzqtIIM)9MZ2PvrD8iscmOqkKdnJ2g5K)itwj>s$xdR?e++X8ky{y(ik~+pD zF^bqsr`zU)U%sOz3JQfHDnxduyPCVv%t@Q->H_4&SB>a-Jd6i7ug3&zQ4`a|oM5`;9n4ZO?B9cRG8MF4S~d_NGKQv!wXVDOB5y}n_8>L!nWw!I+WPIsj7?opiFfk zGObMhw4fv^bdgAg2_DtkGz@J#OYID2Ly_vczxKm3MBnq^G{?>3zz!wWCxHLnGVJas zL5E;eg-!gz<>!?5l=%QNFn+w$;6xhQ>(si*AmK7CZd|+(Vi>6Au(=YjMeNa2O3<}5 zEkM*b40QR@E1N3A&G_j8J;gN}%~>&LKQbl@EO{{o<0=pjS<^%)C6JC`bq2L{x=NQh z5Nnm`E)Bl|mBGAdmtq*TsXxAbwKgfmPwAuD8l|YV5v_#uH%P2XT}BSo>XIu*j4B{5 z9zDIA5s%N!$Cv@~wA1IdjD`jhRG~=fWxD|qI5RtK1&95Oxs07HX%KeG@u8{r=a5xt zWu}@?gX5pEsLt)KhCod}d8x~O50kRx;%^E2g=~|X8FIcF9sDFZ86sbBcvl-l+eRmK z>OaSX9THW}6Ry{4%=Vx&UX}qtVPY*D21^U};%iQ$ySs_AH`UAs@O30BFv<^k7b0cN zoF{s$Q_Kwuy1W0Oi1MxLqm)hMeg!_;t}_rtz!}f-IUcPRb43(3OtaU+%BRp!=Gi92 zIsG;YvyNS=V%o7qEyc2*v_-S3Zn`)Os6msw1C1tu+B|X%z+wfv+$I6<-SYv<5oOf4 z9$s~EZ-hgNFvNg)bhPwG8F-kzbD^(3VwtKZKFG&_Aw$#y=M7mA;Lq%H1QE9Epb87s z`XiudjqIyhyC$D*8AW-150Ey$zHi>`oaa$7*kYct87W@N1_TB<@Zi6E|M41k_2A+* zH+tKF=<5Hqby{#Yw zW>dM{Svl$3YVQlnbB!sFB3hUGV`NOy)2pw~xkrCQuWA0^?mllJAgVW-iXYVz-T@Jvmv%)RN01Q^* z#HAs=N1wO9YF|m-TZkQaw8djqj|IIUOtC-aSvz_NLm12#Nl@7NYI8Sm1Q}+b}c9`hrM+Q zXdIG9m%PmKsAm74!3?NV)W-u_^d}oBKRY-M^B_o_t$Qil+7UeFSo1k`j2x(3K*(=0 z?LQA4Q{3eoe1W(rI7IWJ46$Oc4Avk*eHDNdZR40C);EIcTHTD^1^6k<_nh+-B2%L2xY z)a_og)r#CuEgH`BFBtkenve?QbIUmaPW)LMh}eF8mTt+#m=Q}<8v}=JDcYG&co#!ufA5*fBDsQ ztnIxz$2?>YB1B2rxAu}z6*laAq;-E*%!iak{ZI=a%^;A#@j5$Z>k#?T>P@Krka0)W{TSiiAG_&@&p?N=(KbNB|;9Kq1-Zcs+j zCmksb_1v+gM^CX{T!=kh}*op`HTaz7p z#OU0({@SDr<4k@{zsqa)GC5T_=3VO|CG(;Di=mIdhC&PS`ifgH{UVPbMA8R8ZIavx zKGNsDN)yK}zTXEKgO$5~HPGs}qY-0~c-Xpr_@y4XZ+{G`JVG&RXHfa6xG|vYW6Q9g zlj$Fvh`FmlZ7MX{)gM>9=)?c%+gQt3F!M!ut$&LL?CheRthw}3P7nqvK542+wscLy z(=M(z2BO>%R4_V zuIxHryFU*&o^-My1V8$HpApY7eRdkbJPAF_UR$%@G_>D7nmQjUyAK{0T{oOl%av4B zyWhGuPmD9ZUd6Wl{I?R*(eZsB@-<|9U1Dtd-eW`Rx`S8{g?~W&x3b9i1$v=|fSWA)b|WVim42O^gPIqJlFp6edW&OM|Y5adzZcvCIRi&j!5VtPrC}@`gYSOS}Os$ z=>Gj9qF9d3IZ<`{#>Lb0(LGv=Ia*1xVH4aliCUE{!Hvpk2g02%m(&e5QJZ4nuh%#A0S z3_hr8opky1(;2kGr6zp3%e~T8Q2FrBdEnfsHtI7PMPs=-HafUi^q=jbUk5f~itPq- zV8fl|Hm%$*EW&tn)CyFa^Vz)TIg0JRbv6sLb%l5RnSzn+7JZm)!Dwds9|aF>db5d9!Qa@=5JBmimoCPmT`4KY&8(_>4cfi zOJqD^c`w{?iP25hPtpn+6S;2Zsvg=2;Cmy$YS3lSsPpSE^kdSBV_mUT8wRIoMh?v2 zU{9iAqAxME7|c7Wl+=Wd9Yr0 zf`Qwmed-|P-TqjebtIJSZAasC+>0%=s)|+0D&RUYD3G^X6piKgSf#EMcw3orz7=gH zUikd_Z;;h#a~j!v>Uy#T$x*C;l}@J=F>!UxJCbYdIMhB3W}Ru78;5XMD=z44r^_OE zUoBo8NpxKa<-a%J@qDcKIG_6b_c6({`3Gn?c&_evwiO+v_FG`U!1vP z(XK}>{}*oqE$+ef{h)u;^LaJB2=zTack+(JOyi<<>fSQ1+=-$yKfTBz1|aR2_7 zH|L0+K}?_k_T$E|_M+j>!zeyI89kW3GK5YzGh~bUuXB*pT3ribSx#rSVexPsN?0&U zFk>V_8}#xlAt|9w7Ii}4m=#`Vq917Qp(04QArX8o0gsC0+PXCSldm5qh?GdnlGI$v zZU@6i%_hRW%I66sXLPhJ}F7cs9e5(cE-{Yj1j2tVL! zAcGvb!e;2my`K5a^80jAA^H}UTCc_8iDcdf$k#I)|27ZRRDmAp<6l`^ShKl+vdqr^ zE~=lreY^ESI+F5=U%UuRpMOHvruTgmZq4^{xI5&hri1U7gLp z+JueCAL1QIg5i;I9RvBmwI0E>dy z5w;CsM_lVCfN#y?$G4|V8z>FK2o;+ly^KSEIO?UWI%=W@8gFUL-BW$@d-&|`(h)|I z0$tW4#8c`1SNGZI)oFMVJYv3y=UM0G79g?f3-U8li*|wWBA)Q6Wr+L9`O16hE$ytV zWtqpS`s+Zi;qTw7!_Oz5tEUyM&DV^_8#%8&V5ETkZp&H3Dbx_AkHlMvqxtT%?{hz4 zZ86`+Sqoa!?}%JE-`BZwHQxjHvxk;OKRwDA!sgVDeV+4TpVMN{ywB#3Uc%3KzAyKw zdf&$>UHvPcC(m=)Z=rYOR_Z~w!wvampe&QqzAx*s0Wx3q8}Irbut-Z9bi%io`B6i& zuYcVyI?T9`6y)aH3kxQPX2<0q@j6QQLhO0s>OGY8ur)FDtNYdoy$Bvdeh0kkvr?N! zJv!@QyqN34|69p^To9k$9*_(TgyTW>f%MV15`o>Z>{D8Mj&Wg9k8(QH{A0hT5k2z| zXgd@xuBq9L!PSfz%2Br2d7M$*ucTl6twg98FxX$=_%;|Q;Sph?LLreyL(Bs%SN_p* z(g=ud7YXAuyFQEH;!ZB3Yd4sKaf$S7+tU@MECFPJXh#EZr``&@twK^u(fs5=~TmF)NJ|jUG&~tgrK1Si&1K*rAbBEJ1m5RaQY75|JcF!Ibu;kT_q~>$Hh~ z>?ypLwycBExDf-0HLRRNTBRZ(pAu3KA%&xnyW#Y&eZhoxf@iYalrhZzOBifvzTS3T zd-^YkQGX3Bj)wtQfF@Aaq1h;rO51X1v5Uj09>`WLu{6IK;XDCE3=oi#S6cexZufLK$XmspO%Wv`-l}AB#lAC4Q z6OC40?NpxmU$&xkUG|b2SYo(F#cU<5nbO_M2a4QZs9x2fe`Byf8u**@Qo z1g17$sU}0e+zquUYKrf=T z%==76_u9_y0Cy6E1e!v0!bBg~08o+KQ>b9T%oRqh2V^c=VHiU3TY5w5^@)Y0{C& z*W=dxSlfl;&O3omC`2H7QGL&KBd8zDPchZ(VFUHvKU;H3N{_o&&+Km_*&dCk@)q_` zi818YnVFf+kwR|#?+DyD^;e&lnANDn9Ze_Aug4g3J%s_5irww9dP>^Xr2;!oY}g*Z z!^~F4pZ|*+s)+~8Gz+JII;zvsZ^y{>%m$OMPeD%+Lqp*}{`#v$Y}P;*yb7(=N3M$l zi)+rp04hz7%4h*4KF#RWi%Nt5?=Kgh!#+6xZ1}Afn zn?}y6)S})Hy5b*=I3CEM9}a%ho_LKeqF@$WZR-4ieEm-=8KcDH#bU-qD;OecUa&AA zZyn5ZNG2u&gxyWwAsaLcF62M^)#-bwZU`?n9Fz!<`M6?PPYHXGlAfXTuA*ZtWcoc6 z=8ORm+MGv{)qmvd9X4~cU7FZZ>08Dtjq>a~{85qJF&Qb_7T0P$`oC<%cdZ6Se6h+| zfYwM9Rx7JlLY9lrW(H$rjzlvB9MH9&Mir><^KB@JQ1h(819O-O+Ha33#8R21HPMy}1R^1j8Wg zx-{TQz*w=iRQ?-WpdeV)#>$?s?9noyatT`1T`X@$n6)hdZdBA$f26zuE36s@Io8wD z8ej{16!T)XH7z$YYc8$D^Eb3nb%2TcHIjr=J>@&>=IFZCR4aAnKE*Z4a}KLEuD!)( zJT%p4J`&Xr1Y;yc5zucgw~r~EGu;pG-znK>?jTBGl&#TV4Oafe7c*bhq?rn%E$Ag8Z z83l~9->(sr0`8rgo9dK+dY=QeEk7R%Bu{R-eA|V@G2%F)kMZ&^T!shT5#C4)D@s{8 zxs|uAF9Oqz0(bRMilG>MXAC6=2)CD8m84%XF8jv@JU-`G9fG0mP_+O5PAClk<9Xkf z{q=VeZ@HUA6XvH|0?r`(&4lDF+`K#-RSKZ=sGXgSIFvAR+I;yP|LI6<>$CFP&ghfn z=iPl3a2*2I#R|8-^{}RUuXq&6cIqQ{F?#<<&gdTRy(jP$g5SKNB^a6h3C*gwVL<3{ zck-mV)c@1K`?8sIaxj>6{ODT>xHN`=3X1bD+(fXRc8Y_X=ZZ>3MIk)Wv<;is5~GVT zR$(1)KjcwAWu_m01Y8XCaXSy8G)}t>=Hkxf4PW+r%)Nf8t`Zx?vQH#MA<_l;;S~D zqO48bdS0>!Y8RIjg_LMf8n%Frt4l76>wv6ec=vBIZv)1Rg%6L?26a)|j~7!7sY~C0 zZSs$1ZN`2;5h(t;(;iLSHJy`OSRtBGo9a?6onPKr?ah{eCY62IUZ-6s@wgXMh|e zwyDP@MF=vi%MV zTctT!dHPR!-}Y0;x!bgmO6iM46aL-nD7xWn%}#P*1kMj%ziGf^fGOkeJfLan-I2M- zd&5nV`iyo%s=4?0v$PBEeU3B1=O)5J2E$xLioMtm`mgbXxLqVh1MayvzFaG0Ce-B| zfA+vhmQqk&J@xYl&f;et@Zvt|;#pM~73i7(>|AFmdJYpOub6cFrzaRMYgzBM>Qg!a zMs{5mwvb;zl%&`)I|{~6j!p?@P>(huYDyg#t#7|%mB%~SnBPL0rWKh#9_;#KbVOS2 z3V3m9xQaaVwZefG2WK%h5J>xX(I%0${cRU4W1{{~7O%U*wzE#l+hy-k=O4d7M*xTuzqalfEby@#5P-X9!UJIt^Uidd zGc)AS+P8_-uL`cGI^9pYX)QK(g3#`!rbmlxu}M{Do?n!3TQ8A{vw-Weq#gRBLA4Dy$KIQCcCN5v338N-#V;AA*U4 zF9%uj@H!r+_W%lyMN6YUYSwQQ_|crqSjIk8m6Fz;VOh1r`yIHaic}=waTjs?7Jlxj z54;}0^sIW{6N_7wNaOR+t}i%4{O}hz?GGk46wD2V=OyD{p*|dEzcdlIb589~KSnu} zwKi0gH8f{qNpkl4EtW|Eos=;B12IHZl*bWG;OQe_J$(4*$$&ZvY(>PzSTo(&e3eBR zQwZ4+13IqDlPJ!P+?eXkTWUCJdpMSk{h`GH>4dTo&hf!{yTlh!|6-QgAcW zq~gnjkI@#y-i;Q>gsy||I_t>ywxxfOoPb$%>vpC{BwKf`7x*=4l%5^JF$uu&M@01U z867Zlo>B{KwXT(lJG%f!^nkFFzHIB;cjNvrqbZ_{P`%#6I;agbTN$x;vs_jArOsD= zHbt8WcNADd@a1i)q~HFwETo)3SFX1zfAtEsJkh$tUA%E6*>&yle4)zpb?pLu9Q%Ki z`R^3rU!axLI}*X|mcQ)Q#dXh=y&>sscx-Bw1XmFR?oP8CDEVH(A5)q;CVpr0?^S^8 z=c@=$|G-6X7S~_!e#)%7@;Px`{(6aKbP5>XXyU5*hq2}iU4wDMUw#(C3uXxeQt5L5 ziFu>O3vuZNW0tK(W-~*>a2{f^5oEXN&n+)*k0owjo!25fH=slD4_Q_C0fA|Qd}DZ6 z9>fWxVmSGTt?Nxl#yFX*$5R;P8#f+jTdip3Oc7JTzgX4yUE?~ymSxn~4sTaLVtrUb zW8=h14)u#uF)ka?=uWP^WdN0`UhupOgE_t@YT3^ae*gr+37Yh^3>BM|9CYQHO>YB) zzm(rETy*shXdl{>bj*+a)AE53_K`yuC=MHPq&m*ayO^jF-|@r-mcYoayRnGy!mOOi zXb}3qCR1pSN3a~$<}&YAqG3Z#Es44MXxt1W(Yc~df40>fuOCld=GutV!yF%^T}mjq z|8C9yt;t$225w{kcqlcLg`WZBk zd<}Ka5x{tHYYMKAE4bbevT4>5zIJ65a2LFjHjgdG8FU)D7~~qZs!zbI!)heIpvmXJ z=W8OX2ej&qZIhzrz6W5`dU5N2sa@H=Q!9-%-%+hOs`*fer6 zhbea2n;fLbsVdjiO|MV4H&17gq>imQuvlZ-H_|^XkPZk`f-0Z9B#&8Wyq{&pH@+cd zqw|8gjg?ehR(1QZP}@y>%jIjby;;p~YlQy~#6QP}V5j3!&PbXvqO>xmhe^%f{MBx* z%kbE>C$?q5_#Se!lI^pf503Djq(cIgW7rlIjSj`@7Pjpz*H|oYQ99ryyxKN~7GQen zSi?0-6_9_SS{l5P90%?ZS?~yOagB`nto!d+xgq-0WNKrycU6?=en68j7~Lq*8G!~B zn!zzq{0m)#J|pbwX+4{BZe5}Ui6I890j$Ox*~d2n;)*6t(dk0-9xVFHw~jFFwtA}?Cd6GDhUgpK zC6_>QCm9w&Yp)Hao*hBZk1#A-c4d%V!(n#WcvvSnq`cLuRIH)O^As9*Fl*gVzEN2~ z+%(#c8^w&kL6WlqLuROPe4DoXj5Be*5TGKAOub+RYwCb^9-N|UyfK{W0Ocb}&KTL{ z7a7{|R=tk04@hLt(*PePNw8cqJj6XhOhHRO_w|1bUSCg1&@&M3?A$HnA;HxJjmQE` z44VF*mcJa1IzwtNy7nRi+S=oA$FAg$OVg)^oa%hXJT(H^YPb|KG2ls%t|#+?LM7Ob zKQ-qudxlpssnSJh8Z0dN7snULj4&bQ-vL(n?~84vG>gjAA}7BL>?~Fi@a@s8y(nS zRGohkd);RAF@x+~&^zzgM|4GS1dy$`Fir4H0V8QvT^X7DW04HgiliM74Q1Qeg$*Zd z^}Z(9->|sfAEI11^c_FfT|S1M@k16T7jf1?+2J{Y2j&yJvJo^9$I4I1#UhHUO2I%0 z7a7N?jWvkLAd5Lvih)mDQI;pRJ^AF9A4uucXqE_6LkMt*6;PwnK-0LBg##e#56&&u z{L8(Ecoyjsn%I?3i`lm|O4?&%Z(k@PK#ww$z{8`uf+pOl-!iav`$K?-G-s;wiaMuN zraA+}YQOG(dgr+kj2X332WDrDW}+Xjl}V#viPmz>q!CxG#;nKR-iHcNP8g*As=nMKZ70exj^+lg+O5)9QVG%#!u zu!nAZ`JE_wd5DE74U&FfmHhui7K>05fk-(1f*H$7oYN>a$EC!oVKp+b zPZB*#ti;W6?gwfnct-xTk3D9iITF( z1c;F=j*+0q$iPwI{PlYVkcgUUWnZL@w*x=}d*RnzJH6F(aAdPzvY)hd%vsYFw5;Qu zVk$HLYEAMTbv|W1`fR;D5TB@-E86`zJyi1RxfML0;SGQ?Qx*(kUE^D{dYfwytMGn_ z??dh&{+uQ7#{n-pqV?e52`iQ4IEmUgj;{#vmw?=dbg_e#95!dpqM9DsY^A)COlxFi zn{F}TRI<-ny8W%@+LiWNK4#e~QvfeV100F3sD<;;%ol4%oGLZ|_}iRV)fp9toGXcd z?|-oVi(U2(Oz_rS=QB$?f!WO6v7oxZ5NbB8}vCru{0Fg3fc}T-C8Z%Y{S2wln8;m>5>ItauOZUriZ{(R6R&QoKIxqM= zK`F}19AawPN^SA+y<7T;ihVG5Dv{GBrzvfXd7pGFq+`gvd`o{*_sJUTC(%Q?jjVnE zrToO$`}Egar6En0r#uso7=#tsR(#*6Z(#h`;~%AEr6cvMtmY!#N-2@BO33hIYFY1t z6wg`Jw*2KXjD80z#?SKcEt>!|wr3s6jHDG4yWPN;^;I*!sTA^xq$74z48tcqvgz*# z{%?ME{vSI70H{%?agg{h%aCoqWo&xUTEUA90@6jWLBwn!`KzIUQ_Tl>!wi|~3Z^k$uWI>7j($EmcUWPEUb zM~cJWsL0%HLneFtk>cZ6b9&~Sh+k%0X=Fc3WBt|x^RY3Pq_RX7fS3wP5v*BNxH}RE zv!|P2VoZ_xQc;k9D+FT!wxkASZGY~V*M9pwLjT$H@z*7z?F_D;=Yz4ColiXNro#Yr zegGTrZZ%~h%Jp9ARtNvMA@COo6x^^ExU%HXU1(9)qWox9FBZl>EZuCqE%?0yKZ6&! zmiacy9yh}yATcB$(FnLp<3iw!a2;8Di|GVXlct~Ak9YwWYk!)pFaLNM$SG3}*QZiy z=tVYEGBj>Lt}b?#ygF$C?(=LptIhcUY5U1W9`%h?^gBv!=4ZlG%=X=fYpPGIEQgXk zSR~w3n~|y;>)HN5ron}|>BcJdc-dAy(slV6+ z%=hM?WN*hcMj0yz27VvJz&Ej=JAd{TK#RZ5ma41iTl7CQb`4cw436_eivv4xu9Y_{ zxWq(XO7uVu$ik?d9)W~hAn=+GP*kBzZZ(e?F|6r!f%1H|bZJQ1yIxw?n;}Ia%4ueT zz3H@6U%mKsZ+EjY4;t^kzv&&A-k?%Jn$-h98)*xNS!@7@V;qWaEaCiF^!KU552Hge z`x1>nMu83!9k&cdADPrX>_M62kRoXBe2%Oxl2h#OF9Jl$Fc)4H`hZ49>VPLxK{%;1 z?;%N4SSl$?5hdOIxnX0tqOx;SujJ5#3Kmo(k#N!31hcv3CNjDSHoO^#Ua=;1%h7y` zIy`mrA>xYFM1`}tfWOR2l~N?RH1jGiv?J}(7(mY76D5{4PuE|xihBD>wEj6iO7v+R zs7P*<#SJzYGm>Ou6qfy{Hi_p~#&1<|8{T{kAzCM`!+o2Lg-1=>B#SKZDpOL}NTE{k!? z1~ss#ws)8PHxDAPJhucH5_+-m4mU2-%-R6w2XIO%-;Wn%LVsaY2RocZ>81;+-;j4M zbYUIoN5nIC6xf#kvaOVwI}#$A@b?=2Y_96Y3&a1)z1ODgO6(YCm5clLbbU?5T&h)B z-U)o! zh0uuFy4O`PJ?{1dw?HoO@w0de?zW66z1%D74h;>>ZoINei}tkX4}35F-!gIo#|Rf> z`uuBYSAC-ZVeX{3{9*=@8cCIQG+L{htpKbci3GP?+!-~^N>nZXfQ2!P~GffM}!WAvkB!@_Kwdf>OGJdG?Gx$E^c6PPIB zaaH#Np_!vBhxglY1#*&(C;G`y(DwU08BcFsDkzK-rL;(nji9W3RMDWUqZTs(4!TDh z<0CGe?94I=w0QUT3Gc^5Y9I8lA!eM#oeIC>LGDLHy9$kwe?*c#3=)FASQoCLz4)7U z#tqFU{qK56*mXJrZ`TXj<;AX!%v$&OHl}i{>||9oc<5Es0X-vs^Cc|XEn(fBWK}6W z-Pj%&L89}eKjg$Z?>V8M}N`=9h8~|e`qLnBJQ4S%YPxG!*5SE$ zCa?67@Vz79SI|_iX+s6alIbC`dN@=IH2YVWnY2jIS);VkODS}g@y$NOe0cM8kqf{u zf2j)|8rHnjR(zB^rdc)xSj5Cu>o>oc-oTk933gH!ElhS1x)g6}jJwIj1y#&^|3PM+ z+9RyCgv4CHZp)pzoes*(E-M|pWOh&O9wQvXsmz*N*F%sTqc5wt;e^jdNYW}^k7S^( zPO!CLg$u=5DOP8f`)kOU+E%o-bXZF&2urp}YZ<#hw^9<(#ifDSev0i@KqP)c0#**XuJf43;*2{GnyyjBCJHmj&^*G@L+s(lpR0RY0 zX@VTQ?jY~xg0y~+N-rN^^~=n9>ZqY46dMOhdf5`P^B5_iDJJz&o#DnGx{M`j9Bofgcj~JbDLCVS zv5T*ym{~UiYSUT2L-eDW1&Mk!HZW>T#idzH<55Hyna$b06Pqg5GiWqXjC3{`)(#O0(v$G}igNbw07`$Y}TFkN*g^A7{tS1I|%a%XmD=u)UiI&uA zSr#D^)O%SOOG;KjMmCc(NFK{|#4zJpewuU+@6M7D?^pE)p`-J!MsHUWC|A)L_@Cm- zn`R)SQqDWcp5n273*oCKt7~9%tW11OqIv*E5)2C(Y{^=|GC9;kjF`luq-&&FQj{`S zmND;sa$NDn{0ukr5pe&-aQEC65$OmcVt3>PTL8eKtKd=6{0|S!iGVR&_}{{3jfaF= zHQvf_tIff%iN?sc#6O^dt+kdD6um0}Xj|d|3Rl5Fuao#Bx#{Qo4+CU3CnaKn;7yzU z+tz6eMY`oSyg92kx3~tmGE<#$|J~SJ38M3iKicMX-RZTJrxL7+P4E}UW4q3A{eB`@ zt+@sg3kEheIiK|5%GDu|Cx8NI#SZk&Yplv=Rt|u$89p~q%L9cy;z3@f!PtC|Y!41I z0oZX+ud%zeE%wuu-O{Ie&^>S%-KDXRPAMEY(%plu8K<}O?RR;e3clqs@MlnV@@c%H zND1NqQ_+TWTU7T_EondaSLMD%z2!0O9v+@toH zLKfFZIBKg!BW?8~%z>fG&AC#=;!gy6Vb6}yugzw7 zWR{4ZbPk^_UJzNNlx&zJM8?$aTc77>{zcGNi<>2uC2#TY>wKGVS=7x?#1)i1Dv3u- z$uC`@;V!KK9Z=32Jn7B@Q~Y+CvG4kru-MQz&!WVr!{M^8jzOr=P^x*>l4sO15PB)# z@jm61{{+hzb^h6{8MbH%8E`R{fUE9eQ_Q9BhoYKqME-&ffQzjsL;V22{_f&}yPCZ> z4NwPH^dG4!Yd{=3oJ@KONEbIf@S4M2o(L!lh(HaPOst?iT6{^UVgm2$vJkH=f9=6u zqx5YFNAT9ct%3|M%DW)Jh%#KQvMt}%;H5V$^7;Mo7mgkcSKQmOkjuiI*Buhewxxw> zpKI#i6x~3~N~u%xhDyL*XZ^9(tSh^A!0^rb0Mx<;Px4uIkc6%SOgm!oH;S2#n{jFe zHX_p;TJez*JOF@%nDHm9SXc?Ann#vAqZcNS(3G>FR@JZeI2pK^onBs9m91YaA$@hD z%+vd%U$wQ*8_kM%VkPv6Ko`m)#5+qfX@1I^Nh&;ASjxB)66_mNdYFB7#0;l}waM)i;f=$~y*po&0aD5crc53$`E#;|jYS;d8)vo)xyL+u(-Am6JqY*?*>nGxR2`DH1@>?SU*MkT;9nA)# zO4EKD(vr0Ac5GhO+!JZuQ@zI;<@}}flyBnLVlywza zgv1cSA^7@OXOgoqf+kKjQ=AI<_w&RHaf+QptqB(8d;vDgH!XB-?77f`0;-G0fd2yL z5KNi)ApRS()Kox%eke&N>5Hnhr_y(EW__G`{RQ7F>BgkZco-1faMqhZy5-A>R+y`W z8v2=;X&vP`b`(Ovt~LOYw`0J6`ithh`iSHgGh^HaM`v??0Z<35{)}2tbz&%q8%5KR zhygFu*9FK}^u?;bFtquIyDZ-%IDJT}dT3$B@F&oaXPl`e*sx)UWmp>F6F3nV5pg7S z_6UlbQ01Z$=VN7Xz?SARoL$Y)1y&fGzopoFOS3M#o3sgsDf{uuCC6p9d*S{15-{*3 zyOxFUv3bbxSo>_((7Gv_!UZes>_p^e^8bTnA$<9tMUPIY8_PE3uiVRBW&Kgl%cD?c z0S+Z-k>Dx7WwTx2t1pvye$0P-k1RF#WcisI1Y#OO?1;eQf$vRX8&XpcP8937gyhL} zB+h1s&W;@Mw8ypO3#(zS@VF2Rs6o+Vi`E0W+A09#HBL)| z7Dvet_J{EjLc;%N7r-H}ayavP&Da!woH;jPMsXQtm#NQ`oAn{CJ^A?5&a301Xt2^1 z{B8M4iIMV4ZqBePUW}H0pqd6E+7yU7y7+BmfI3c{cv4!O4jvX!6f)WlQQ_DQH2I)c zB8n6r30$6jb{Grd3b(~z5ynl{L8yw$lZbKEV}yqHfr?9%MnyceQqnWgIz)(MjJO+S zSN=m%5UozY?MbHw1W==?)|Gfbz`Myeu-6lZT*&NLa3ja`Yk6melb>@t4Oojkk5qwX z>3b#)JwCa~jNoS@Bgt{Hf~(%PLMvtKD1x{fU^U9+4PKs#fK!K%v9{xVHht*0-XD3~ z^2s?Lvi`lLtTqVd2@U4fVe9XN)kk1Pd+PxL>Lo$PgFy;6y_6M#?Z|{0pCn#P2x7Fc z7cb}wM-s%PNxx zrU{c(bjp8zV5q=NTYdN1p6}lz5U6gvgyJ?2_I=}sueqN|2{Rr3#cw{ZiRXF z;Q}s4@!Q#i%6dDc9K&YIEXBWSer5aG{J#l{5EzU1knV4Jvi~R9NRRRjssSQ7JRv<9ZGOhVb_hKaW)64uJtUKBp0?(M~dsf>Y*-*D`L$A`t3du*h#>Spv6@u~Tg! z(N0x#AMUhd{p{5)W-es_Vg#4IoTd_ui6Rb0vLOgX=-tUzFnYXetbR^$`@F|7%YIT9 zq$k=rExT~rHKk3iAW?HoGybx{PWwHsNI~#0Ir&e@`l#8P#bYYoY!jlG9UZYXaidf3 zJy-x{SL!oPt!|Y*bk?&&>R^x5H-P0=gw8(Gv%T&(!@ZDD$p~EhRh#qf=reGc(S1!R znByMDpv>Hvt!y3!m~;7bk^y9~=#%dcK?>%(VdILg4?WJL2)_JXA*iP>FcH0BSf%$L zpr&p4rmT;Q7~o246Tqb|a`$*P+YC3{j#^%bVD({YUELL=Sw{4T`<|ex|BnY#E0cxEP~s6#G!DRirMMb20f5+hlG_JG&QQ0EQz zm$uOi5i3RF9(Pe(ul1s{))xP1=D!)1+YW?w-+4&O_~E632J~J=`as>PuyCb|7i3qd z$&e$J+EBehIGt_%p{e!z4noWY=%yM>&7JtidvSVs0aLIZ+^9LhAH1^p#iu>Me}$`Q zlvrg!lDlb8oakz&yI4_J{u%J&s)Xd%&?yZYz$;vzxS| zH`*3>^ZPV|$5K)4v8EDsv{W796_ybJL8lH5-Hj6X)bGt^d`2;%*!MY5VwZJVof+CCw4mn>4EM8`nksDt!Le2{ zL{q>E&X;*&huzUg$16?pq4wF1VM&kR=nB_nHj(%RR4)RQkb(OvVn)(B(!Q=Cao9o2 zUfT!J@@&3N7*aj`$`~qKtsdmJ)N-JyzZU;DI-mveJpd%UBnVmc!6vIQ4pBiQB^E3Z8wPLazXEY&#NB|k|ao;0hOPT-N~$k(JG z9?5;pcP_?PyG&y1d6mf{5M4o-C>e7$nPvLj;ETdpAzX#V&c9lkp*P zni+>Qiu;xhQWt7qq4_*T{gBBi)cCOa{rstcAGUZ|TXIAiI}16Jo|LnDv$-&@5q7n= z{L3HJha1(Q$1&W@+Mh)Za$QwyTgdo`%I@1NXEk7E$>(eFvYt8W*D=Bx%Hkk@D0y8( zARGTei6IL^rC>0g;-4-P(7zn}+v?;yq%8U-3DcvDr;4y-}P;oNKg)<}NrZaBalGc}tPq-yfl?J&K~^ zxyHy?DqX50l-j!dbqhHW>3f!a#A7t-fu8;3^v2*d3%-78oy9ZibN4@p_8Z{)BgXhC zx0cuu^g<>b>U2R^>R^pe66K(6_tLab2Vd~9c2zU-=$!UAlpf-nD5i@h z>Rj5ys>g*0sf?+lb4&N&CiH}euMim_suhd*0~#(cXf-qzqjpQEmkE4!V1gE2qjDLt za;Z-pzp8S)$Q{_o$)qkDdH8~4+P4wf0e#&{FmEAyxhmUpR~k?>P9R%sBNn=aMz%`2 zM};_E3QKiif<{6V8qd_p01m+Y ze(1AApx@9#M8!$cW3VZ@hN}e& zt4QO=yKQujd<5U-A6Ffz&idW#kz#1C!xPQ5i`-#nJ_edg;Y?;Ij<6dwabZcq@$>mP zgc3Yd0LGaihAFjjCP!@qr;T>_$88tk`c}4nN5!}MyD&3EU?Nv>7(gg2MPiT)UD!<0 z0*btmrg1$X{hKb$NAwdhTmegD&Ip!qPTvgz%e;X92c`dqEkyy=_fayaRK3Y+a8XZR z7_XRXT}J%NhgtKATDB%S@ufopDYfG~ABC=j9Y+w*0_H@qH4m&)PXr?vAV`cR`dXwG zhWMBBrwvww%l?Q#LYVqlShE^lW;ci$ZPh)=Rbi75=;mi!Z5?8v(l+F|+AM8McGAP%CZ;TL`%&q^y%YJ~d6QRY>t&joJI*5DP_Lz8vxAlOD9`BRX?W_Qq}5I#2b zQXcLVG#9yfj{>_KuSFkWEup4I(u?!`S@6fv@4%&24>?eC={69$8PN&D5*VSMaHGQ3 zhI*2aU-?&p|B7EB8Wou0TWh}fLoLgs%R{$5dMd5-`CP|&QfX6l;eR6^91JkVtRUYa z+2m%Q{n8kDPJ@6F>*Dq$rS7mm-RxtVI=+9T=<926js(xRvcE4DjQF2|P_V^6*wb0P zdB!jZ#0_{4+jXa5j-X%11s<|ezV0f25ced6V@}s+vII`Uez+j8I_u1yO2Lo1GLx3c zuCV=X`nmgZHdDge#cC3OY#gr0s+CF*Bmr>G<=sXaek(LckHN*^TjvF-Rm}uXVIr?Z zi#hrNA1S7(DE;$t+9HJ(4$Lx=M=-YMmby<#>Siib8I3(Rxcw2J29O!*ESb{WR_6U6 z4vuLG4DT~mk4nr4twP4xIXdQW5OH|xr}0JEV={a@_#8AqH)&tv71nFmxk)y@+3)2y zdS)28=2v)ah=5e$_4G_WP$5ir(UF%I`(>G=N`|CeXn+u4m?bGW`xL=L z9~G1Y0u*wt!1Ne}$ji-ZlTXnL4d_^|vq5ws zQ~EWF(D2R%(R)ZEG3BF=QOMchAG_DR)1%Ap`Az_!l4W$2#GIz9^0mbs%gnCE%UBrh zs>@OD{QnD!aDW+*5`b!!Br&WPwP~S-Rj9IkHHOmh{1s@&TOSuWw`{+Oau(3J7}Cs9 zNCpG>_3Ym(_Sy?}eum3>3d?|#Ca9|{AyU(HjyN?6m6Tt3t6R_4#=$D|Ne8VYtz704 zZ1mn-m23{9X2@ncRmP(HBm_7D%qtkD= zKR>gkwhOh{BE^B<&;urkM zAF^7VjXBI_h+qOXJvy{o7W@gX8RzBw+JY3xNzk!?8$UJ*b$l3&xA_=;F<^^Z4qc?* zLY7l5_~JgOv7lGo`9+ z8Ocvp)57eSarsG%2?=P>&SmWT6_8hKMq1yCv+MM=y##3MrlS#x*$cF!SdR_eNeeXoSeKMTM6(!1kb<=2NXz5xx+aHy4HMg;5F$JV!%)oKYpmjk zTE-pyJMVuu&?J9fY!CBVJD2lfI?e}8Wl*ISx7+wy^fy(JGDVrhO?VvDp^Ljhu2;mF zw*|OXg#K_-&=a;J`>B58R>>`;33aN#5%7?h&3<9gE$ZXBxU?`HBhcl2FQ+dcHKLL< zypiI2A@Jygy#iK+KWeIAA&Dd&H;-6UGI75jEUBzeG(>cSghvXw1=TAkTH%oJ zaf}*U?(JOv`NAZ^{U%D-M37~04||bNyP;HYm>6x2>BB#s zr_10FpWw`++Ys-L5w8D5ykF|TV<V(r21&`x`O*pMnG!q2xmH)QQ&-LC%H;Lkb$*t`ZD4k02*5A*=?_ibN9z`Zwbc ztuJ0h5e9ew{{T^q5YlY6BVCR8ds#J??wCxUfj)f>nkN5NuE0{;K8;EbqdD)uNL`o8 zSeA=eLFh>F1K{f54$Q;uhd3t-#Zeq&o)zL1K@)kNnA-#+j5U9n4Kax{Fi~+njXpN# zUDI!6Cmm^fK@Eho>=;=^ir5g%I#T2H>szeglst^K2I6}r#3=+?3oB3H=z>zkqjw_0 zP6NdWk(ljy4Q*$)#Ojf%$pl#k;x`fKAgr9q;;gvce2OMqVow3I2Ld0!k7<^{oj9Cb zdTsfUo-o)5BWv1Y;cJ9-;99bacW$xa!(Z(O7{;M^WYYJGLyS+&c`IyjW5~TodBN_* zY&u)YmT7^&(Ih%@eU2y|KK{XqUrvwJ`|7he>n~mQc^+vNm?EGsKW427nY}nJhL7 z4{wrqQ{99bTTB!N50@6H>fARqIrDJ?U4jO7 zZ`8OknjNry0`xY*Xpj1;ncc6^pkmYDkk3AkJD|qW6Lsy?nsB-J3l|k0VP_SyAJE}x z1&mCOzKP9oOAlyE?7)$jw>eh=DD3HEP?m54JmuvKyqB@lEYl4rLrZ#vM=rNA>w|IT zP2g7(YM68scmMgPDZDB8=TOx87BMqn88g~bP&e~5mA`?U{zC~ToLZYA*e}(8!U-@v}*uwKo9`2 zHmFz;+i&?zWRjQ9;(#iW8#{NADK9&xs($RB0yQN%piL+?0kL;$BWS=>>ME<0@0Fj@ z08=LHwtw+$$^0!h_@ydL6Rkyx1N7%W=8&K>XW{Xe@lFv0L3Yp~-N}EkTMlv}#dcyA zYJx3_DyaJb^Rtw3tbAL^ltmQZNe=9h+~XS`P@w}2t>9Mvf+t{{RPw*^9@W68ZQGw#R$4oq(ahL*ww~p)>t^z?2>Jps;w2j+L<2A{`l@#DR$_f9g z5rdvf$?m7aaz(RD(ZlaS_O)OLN%Gzr4vjpOK1a%4q2`cgSvdGIyIJZ$aqA2L>Cy2~ zf~W;ZMqU@WHkB}FO5Kl>Cr|O4yfJ`h1VXsDjy4Cal!f$iqcC+Q4cl!g{0Wyh$f>*j zm_Fv3^beE4Xe{59^*PMm04f7Ry-sVNA(_nugJ`y>kJSiH;p0<0Cj(NBpX|$06vQ!h zl?y&7)F!TMyNLv6Gh4L$0?wow)F3J!F}{n3nLG{;KJ#A79tTFxLC_<-NtwlKr`0dJ zCAmh=A)QT-z+;_A%2$87#`a6IyF2%#e@CTey&anQz(D|iVts={JU{o$Q={DC*GZ1y zz_*3v5?s{O|FZiIVu=XfMc`Y$o1D*96jKAq%PTphm@GMsc*f!p+0f*OBsymEne4tM z<{$m8y*;s3Wb$_yJf6)`r7%#NEATy~h#aBKzyr zf0f>U7lZ^@IWw${AhKEw-0AEW!(VO^(1ebR?-}!__2upxns6jVlEeiIXXi9HsYb6i zIM;LQ=1ub}w`%|73I}e0&$dXaJ2D54)BflC6W>{AYe)*F zaKM?=(15w2ACK+`rhfQ!S7<%t#z99QoJp%VjLPPKpu~5)4jFTVys9!w6*sSM%;}_0 z3(^Zm&wSU0T4ftdHdC6mYv(F^9X^0c)Z0xTv`xu&A>ooB-dE9c(9A>%#mG{ITBi?G z1v@U~SAo7$*hEw04ZLAe776+l)9#omeYDJQ()hT;m-VWI^PtnAbD0>1PF>R`Pq}{$j6xy=7PJIi zhD=UT{}egH*02lxb9dT+8Wn?-M+2w@L|Wo-?ItnIKM=34&;ie-GmiQ^mi9Sq3Rj)9 z&HuMj;{p~%0fJ2*x|4P}{z0jTvBOF1$#Yjo7A_+VX^Lv^VC=N?*vfiv?dg8p{<6XJrBVSQo52JW%DGREJta7V@CQJf zB~O0OqzUA$b1-*sXrd$nGZzQGz+5*l5GS-_?J;w@mytrk6LS?mq2nAEtQyg_#VB@8 zPS%UPmTMUEg-z@-pF^B~|4BPR$+w)y!@V=xA_-?(^rQ&T1~aD>Aj#aoju9c;MNPma zicOJ1retAl2p9!K$?zwx&1Ux+mIgKgEBLLc#4AmqiFNeOMmRUge=+D7Q-dWDCK4^^ zB1P_cm9V2OmFw9vtU$)U5ZKoo2sbUoEiq;M#NRT!rA+v_y`)3i?@E#d(uurDVWx%E zP7f}zJ6~m*vA+K=8`NY#2Ew$#-d3=Zr;=qCy+OOhpxud$BjwMGKFD;o!ZJLj|C5(A z`u&&;Ov7AGDuF*9Mld`l`&mWO5Ep}nFTVenng6}bGrb}{r+icVrwKjL8UA8Rmx#R| z*TU;Fdt1QNmtzV-$ud6PMq%;W3|+Qc+rc&6|F2UGMx4`C$SrR#^0CrXpH)t;q_@C1 zf8fe6p3|?nHa3p_`-_$vjtwRv)J zce>H`QtRVe7da-F6N;7xD;o*LWkqsRB#iIYO)VNXhE(dgg; zijS|i;)&Thvx?McWj8rdSQxtYM)Ff!M>)ZoyU{^5a!1ScH2;Qk6S zkZcjT$3NIvdfju53(qCmcedaSJ#8XZvLqHO&g)!4<9Pv9e&2k_Nl6E{of)^=k3CU* z$d}_^A!8$txhwT;R0bNS!!=~%+fefJz4xC$D+98n_6{fVLyC8uz1{(4jGaWU{v8zy zLw6!RVEf{`s;tleWh(jk*~i{KlzFdWL<2ti0XCL_1P*v!I3TfOIQw?~A z5lO4oY$?rz;GA<&OGu)S&e#qi$<)xSDm8%gyRGvo^Z?fy6yMjf$uj1h?du(cAmWhX z-ZT^<(-Ir)?gU-qP$D-&(UNur!weT!2HX2hVjA=79)uZ)vik?Wr3k7}NpKQ`n-`Kr z#WzoZf+_*Qmqd>I9ZZi80zr$H>qudvwxZsI;s`b=KyGCk1W?A`xMO5dPe^OljmGjv zudG?PO--8QzLCdwWGm3bWm0M4V5~{!sB>{ZE;`K$Z!3JSuvu{dOqzDTr z0ldZ~vfOb}c=BQM%DtuWR4)xlH?nt?MQTi$MX+rZZ1TE-gH;E_?fRPtq ztC#HhbTXsI{21~sj`7TVunRWWg!X`zK7(VW6N)pc_6g5dVC8p??1B{rum4NHdM^lS zJ)G?M*`*xbLoN~pY&2nqbK$j6gg-yt+B{uHkH10M3uMVx(TCkd5YG#y(@C!dA039V z^{Xc{JG&dtB>gYttX=oPF^I8cJ!Zn3W7n;Q7{jAUqeq~pt>#Ue)(07EtUfQh zslZ%xO3`7fEwgB@r`)CGb?)O?@BgDEuh0T*=psr?-9npOR}08ws;kxy^Cw(WD1XVv z*EZ#JJ$IV(kQ^1fReIX)p0sJXA@evAmerL&`^5S8FE9~TR)B5-Nx;f1VvrFnMUkc_ zkKp#O>_ei(sLcajN`#?+Gh~jf$nC@GV#tPfZUXls<45K43&nHAl7N?G9rR;y=ts&v z5!K*2te2Vx2{jCwd@=ySbP61%pthARTn@LO_N%_*DxkEv-&Rf(y^VYYgaiCTg`=}= zJO``HQOg58fO_i_@m0T@x=2DGHBR_LIY~W+QZA8UXqi4kL)QiIm&2IH_zW%H{+Ds;f4YgrAaXA;>nRHgTe8?VE)t`{h1Hz)veB551I!u`FpRVw{-0YlGc% zjJsrUba0HnLWj^GsW$OPN#W$bU^5ZJb0{V?(_e{;KKNcc#R0$W_wj}p{7^B zs0X9{ls^zY{U5TYB-q!ImxR{$Jxc)w8hZGFpt|xoeI%^?hGji~o+)5qjlWx_Oy=jt zhWui{<>|*~yQm)h_q0+?AXB?;MfPaN@MPP21?&T3)&?cUYj^p&` z;voBU8QcEkmFE|S$Kkk+k!hCqZHDMu=KmI^HFbz=rIPw^{?0O$bqfe`lGPcnGiSCf z=0V1Cv0$q?cj=b=gCD&A;@MA7xn$xgf!?Mk z(@Ii}S`5%xh4}cjf&P37v}WA=7&iKjA=n-1xKlHSTdo)Rf(JVwEdA^b|F9O! z&=ka7MsV@G(c**V1)hSE?O%1C9xL0temJ;B3f7!?Ai{M_yXs6~$Fhja<%Fj*^I3h8 zRC^<(PEC62kB4d#MLh93e8Lr!!NH>T6MfJ>Ov*<3)RC(5oh#hO?%KT?LOy zKZ*RnPcU8JrB{x!TDXlIp&epc)QIzARq4SI@_Rmg)82#xp}rUNw9j6agvC0hbFNGd zJs%rJC9Z0F#5*sZpK@?d??ZO?>jSRKL*v)DXX7eTxRTx9EBuCOUGKuqeVVW3wstrJ zd;P^tWL?7VVDnvaF(BIQSEl8us&y+9TN&{ zMQg#6?|o_nLjrX+21?ecEcG*+#wW*&M7T$edkV`L&ZkLegg#5S!V;(k9}k0axWYdk zcf+KZD&iQ>3*DEPSxB>bsg zF1s}oDaTL@+apQs!iisA!Z1>k?R9_68`(vz08UL1oEqOP;37-sMf@#s$q@sGS~Fo3 zk{x)EQ^o9i`3{93dLqz^s3|X22JF^YaGjJF^Mp*@3VA|;yJ%8H70N$&SoXWP3ZdAu z6f!AOPr&m0I+NPJy^9KDB6dv!(WkRz2s+t$z;}&N>b=ZqX-EX-w~4YdPI+m3c~?o4 z`|q?COt6r?&3u4>y{+)0u~1s9EjIO0kqlii^|PX%do;&Zo&gm7P!YQbZpR1v@dhf~o`))ZB(h1|y z7|-wxDITA3ewq8`xH6Ug*=GtOF$M=4puYdtVZ4S^BF^FQYWpZ*YxMUr|sE;c=Syd#~q6|?VGz_PjNW1&bc`++-#73%cqgZ@(m3!dTLwf)Vq`z%qjLLst*fH+$+w0gu`3!;Vf6mPo5VqUD?*lAMK=rd7pQ$MdQP%;EfIKfVk(i5 zZ9{6X*Fg_w7s&WuArE5P&Q&te0vFrcwzMzxs;fIYIcIbtqC++J)3j=1)6qcDEA@x8 z9b<@c8F@=+qh(<9UPqqE$2~-N!vRoNDck3MIld2KOv&e4eiiXX>%Ip%+_&PZqk;wD zXQGtC=+zY9Zc5@IBxz*jc2WNKAuDn^b?z}@rI0!b0DgY=`%#Xz1kp8GFng52GpM;x zPh>iCc4|EN6XK%(>5Gr@ zo4*ogc3f#W0O{uEXQZ$TB`@{^9EjGF)XgLnD3%c{QVxSX#^DlE~2vf!i)) ztTJ|#D5&Zr1$G5&tagkFo~aQX<+lT)Wpb+bdW5Klg{0Liuu>4@PIyly^!3^9f7JEY zom>NB#iZT-T;Ncyun&`HSJb1bB<5GN^xm_&q6q^alh8d;C30ac&g0HsW(zyxK?eLG=mx z7u(7Za?EGM_=Z#R~&8Wtn6Ci6R@Qr?v3rK(i zhzc1dP;W7mNA;vDrDMpq&7%{VzqJdCem#4yb5<<2AOZaoiOiDP8gcfgRorjr&bOkU z5Braa)jES%`Wuy)WXR&hSqZds@TNBH-X9#_h~cw87QxY&D|U3n*4wL`QwRJGMw}>X z>$<3UooBG4`+Pozf^mQGYPEe?=cQ~p2f$ze79pM})WCf}SiDN5`=a2nhm6-8Gmhgt zykS3Vn_1tpYRbLPkX64z!WAef>d~(4vRaJh@tQGgIr$PsRb5N_ew=KzT(!9q#qXe- z{cquD-M7E8v5dIM)K9qHsf%^jm8#A5i(J#J-H{nVyHHGZXb|qV(`W(VT1<#%d_2GY zAm50|$)?(_yc$Zw5nOl^DwipfpO5>f$54j`{4}a=X|-lor>Aw+>v&F)7h7I$=ZDqL zk_NsL)ApsYc$k>>xS?IHuC9Ay;p)#w@nq$%cl&*$z<*`$AbowY5JrmZ173}BjNF&mssVFaYS;n?l|gIyVP7?hW*396F`^yGgU z^tfRtqe`Wqq=a1l+0od>YJP+ojY!G>Q**|}LX_24DGRS?QD{gfg)AXCjAdQcG2qBt z!`^QPuS(l6popR6@D~;OGsdVochhFd?r$=>ABLa~tN1(F)krm%WIK&?5j{q@QY|0} z%3!fz^^r^bDX+3|v99%3pz;!n%fK~oKk!cjX@=l*4uaws@r~Y(B+=!hrX3yl2xG!r zlJVv9Q&*fi3Bgs9bw=Q8>;NK;oGUZlN|)Jr~&HPC1K0_C+Iq6#;DV& z`@4!KBlLj$H}IPXAu@+6F@nzK@aNHJb{4ZYxGK<3tA8jW_j`cDJz!4Nv)T-f2rw9L%2$~QDE?xz02!n(KjBMjS2JMnB}~=q z5ga8QTocA#Qoz1$stAcOkfDzPZ9+jKd!BIYs{-|Ado;+-^d06ozG-kVt2wu73-3LDSYsf-JXSV%u37@eymyhRMr5Sj2dS0hA z{*EX50r7fK=<{jeaTBhihY$E_M{_V&)z!Z1@$+kQrX77orp+MHk^Q%2H{-l(r0mT0 zx%6WXy}M!B>oNW@MU>Zpf0-i;M4?QOBz`vOkYupXJrJ(t2$d?9tz zxy~iFRh|dt@?D9dl4G#|Jl!(t_IsYn5*`Q*l@Vc@B;!85hYrjZ9WSjcx?edq_}E0KPb^toymf~n=e0kSU}P(*$DH`Q^Fo^ ztD0n6386FViMaA6gP0EO90_fR$p{Ku$=0YkWiwZQgO8Uh5(AB)`N8p8UflVP0gRNz zol!68G|l%SyyZl)CgTqOp_L_n^dJTB4T-RB;aK{C3Yw{k^1>9m=*V(7KlJ4a5HeP? z9BOXQSUl|!6f`RN(|}?O0Huo}8Hn#)!IDZ;F`V!{qzA!Q)1ydeKNt(3w6HfsatC(N zDzj4lEP{x<#59D<5W&+>thxyC2wV8BfE%?D?)KC*i_h<2fGb%Cwf(`&n2^a>`|Ne* zk;sU48mHyC!3i`CFx|hbLV^<3&*cgPRCrNmu{E_LMnQuqz1GSVIh6T!b6|p72BN^h zwT*l5b@ScqMT_Y1A3ls{=Wy%fXq}!Q{|kRuiai{_A)P({dmr(CUlv@@h2Z94`VoP+ zQXeK$@_RZK6O0@HXqb9F{qlVW(chcJBa{>j6pRiQ{Q^?k&#Ebx5UM^XCVe?!Mx}%I zpZh`f5tS~msF~#5;6JfG&pf5Enb5BdLpWFmZ8-p-_c=5aiy5rM__5-WWA`=L_YgkU zIP=+a+)rD!Uw6FQjl;Z`^p9OnU0y2cm#xPQD~mt?)+1%qV#8qMqJKszJv zTrSrRGr;g(LV~B`z}`2nE?r3CkIsv;?bAxPh$0%Q%HJ6P5nf*qyiN1?4rQ6%ujaqE zwc8(8a9ux_O51RzZ%nhDi`I3n@b$^ADBQ9(o#tt&GiBD*;ko;pY`C{@z1J^X*$iZj z;{)^JewzDyoNcoOY&!N97aAYsTpbfV@H}O^teF?DbbFomy9}N5dabp)c6WZ-ZX0~l z`-v{Qe~#DdvtE8CXMeW7+0Y%Q&R|XS7SiXFv_aZYpr#E`EGg-XS!_E4zG=p*IVe4e}B~;kZbRg;kW^K ztY&xhaAUiJH}STNe;&8W51QFb`M}eEwgXh-a_Iafiiuzy8goWFp^6Rt5sQB zUph!I`Fz5wk7SFqz-6X{$r=hM81gtxe5H`(nXc-5Ojm3dP%yXX2kshCeh5A0)&~+@ z!pU2E{wI;Ah5^Rn8)YoQyz;xT8jZ?4G49H-EFoTas{rtVU>dEMB@SIjgf@s)v`6wo z9>kDr;}F;8;GE&3^ef0Ck5Ol~&Vdeu&g&j|u(dA8$>WL0k0jwlW>pX|drQ?LL|Wk7 zV$ToGfYxhKYJ@#IOPeLKNC?K5Rcgzx&q-QQ-CBpqvv&9j`O}aL#@xggi+lxAQwBV{ z(nDf+vS|GzZ8RH`nER886z3-uc5Hcg&{$X`ck6%aofggXGi_3D53wIxJkFDyt4cui zG8M*mzH#m@w&ztUNo4;o2Ap)lg&N62T2D*l;JeQET)dV|@bj64WfRRNqUBH@Q#f20 zxbeMcjE=ECZ}=~m`JO=UM+qjUNT1V2Ew@IE8NswG&op!{^0 z2Y&gM_!j)2LVRLWQ<=4#W(}Nc7+O|0H-OM0zkt1biUURX&h1-cjSC$48ZoHSkfq$P zrP#;6_SbCd!9IL)9{=heZw(8&0M|%2W7SJ%6}<*So+}zHbFDlH!}JKdUS^ji7x}YY z-8X_^NLuaZ>a|Jy8qlm-dLG*00jLmwRzwvWv#c<690fyBX{D-m5Rkk2Xc&@cqE&4l zbbC8WTyu&r6W|qye@Pt_Awi^87QY1Y`*Vf-JY4rZEItZ(w!yyN-D7>bvp4H)!;~Fq zxAW?aAW&e#`|&RQVwksei{}nMc?C??qs$9UV1GZ^GpvSaKQO{XXF}^knD!mS<86KG zJRz;Ddj4;Fm1<_z`vAF`rY2RLmB+>rHN!i)?mJZbd$?{;2UGz_v(@U)&__7Vucxf@ zsMz7z^zGN*kR{tCwf+uKu7Da;uTMOP$s- z*$zr*zYQC|m|&D)rBLWR+r+QQem@AJ$iM@?xuwPbgy7r_+{fL$oeih09q+oH4s?tt-y_Lh%^p+%|<5m@}7tlD2gV=6+(IZix0i5OjH9-fs9ds)<(n>hZNy zT-5nI$?llhdR=1G8{yFO79QA~xvu&6cAbpee4fu{5AEC9((#zb{tCL&G1`9Hg1^ZA zd@+2q#s3iXm<|7&(XTO`#`Ad4?V3UiD3i5ryDhV%7a3bQ`#h>H8X?Ce&b#^E{NJe= zFz2O&Tb0bDwGJ6VHw8F9EHE{~Qd@`7&Tx{W*pL^>`xdv()wU zfxpJA`^I3j=CT<%=DN_eQX)du>5AesYgnwE)MS|^|Cm%Hev%s`3AF^JA!mx{bEf}Bsoo!@970yel31x7X{GqVi0nT3$Sx8A z_Yhf9sJ_-7R1y6OGHtCnHzF|Rk%YoIE$f`IG7JT*chlH6%l@$jwE;!AAu6y~W`8Dq z;OfeHmf=cTaUA-NR*lpV*M?>eRY0P0QYyrH3BlbxprBX8T)HK<_=CFFUFU@ z$4)wNC`N?U%@Wl_=!d*UVt$j_AyNT(U7G$}{h}~+ov1BEu51N4Jz%S$Gx7L&1a(NEz3&auK5_p5GzY>AhML6p zuriIySQ6ZsnPe-ygY(70(t>TC9KYVg+EfZNWk0nN+^sN4J&g&m8Z0bqG^ZgA2`+WA zxTd|qz*wrh_W~AKyn3$NVauLu*<$CFt6^eqCOfnW^zQ-{v_XyUlLDkC#cix{3B_@OtR( zHn}Y*Oa5m?&E2ymKFZ^9LVixXLo28iYu4R$-8BMtw%I>a1qmQ;HYJz zamQrC-%923^qH60MSrwM^{3A8q3UYQl#;NV#2J}%?P~(GHzn1nnE`SE>^Na}pFg(T zT~rdumYx`VIm9}kCW0xkvN`ivjb;Re?^&7;!6GL`piGtl1j}xWV{-7)!m`##fWAFV zYoo-uQVg-~nK#T+7frzGsHRPaM&*))n>VgdNs4}yD(i0oehS@=m#Y6n_)v_e9~&Zg zSnc0=B!nGI)TG958QNL{N?-P8s_An<4n`<*8F`Wusat{lQGH?_BVw)jokr7!8DMxXk8KD9?}xb<&; zHm;Mea*iH-{9y0QG0j?okcsPgTOg+mO2JAklU0u0P}R<_t_}uhUWu^SSk}PiUD$3vyG9Yboh^5) z#R|st##8Ur4&xbae|<(1bglhUIaE(hHBJX0=!dzHI9OE`G)9zHe}d;4uyF2~jweZ9 z+97(yoxW{fd2TNf4pebeuURXs#BS`oZ9mBzlRgxX^DNmM=v)l7OW*V=UD9ZY3e5_} zP$u9QrriJh+|=Ca`2e`L{C@xjLHWMPF2egtF{6I`qZ{lok9ws2_P2N2op=5Y!tuFy zR&AU*F8s1@f4}Y9*KenqIF?!!P|VM^59$v&UQ)Xn;$qvILtVnMK}D`pQ2Fu4oHT1zh5OaA1=cIO?x zbu4%?nQ)EWe3_}ER73X4SH9G_cFuSFQugb`oSo`zn|+ku;t}xE`v(93KmbWZK~z{v z2#6Qyfjnp`7ws6lQ`(T0YigRGP^rd9L{OdvXU8P@q^ z;MJc0U5-LNmAR%C{P&FE655t^^{-ayQ-MU;IaIPv z2C#9kYlXn7u3t#9hgoTGC|SUEfEYyTkFkog3^;jRjB_gxFhOjneQ8Jv7TW4IVPR%f zpCZjrs(0jA)#kci8MhQuGzc=9CEfGM4p1x+APQun0ljTB1Wa`{}wQpDxZGn2$h zJ%Poj%20tk6QMOeK4GI{6K*gb;6Pp3uEA24>n1RbC=;|R0}Ig85<@x#9pfRLUwyIF z^<8ztanA*^-hhltCr)5tbqkqs@W2|2`w>gcwE9|IC>)yFNanE&@gzCJ3eRM{6h2!U zAU!*Yf%dCC%{IzArv-1HJOUnpBZL4iX1I8!_E3ayoW6TB9Z2i;Bno&?)0fjNH}08_ zP}%)uJpvwqqXq%VVM|uGoAK2!MA04wTqksE0VFVZ4GS8yH#5h)8gFa6lohmo5Y@sS z;|ffKh*#ReSdH-l7UzKhT#!>Rwhg?eGZ@Cn(!V8lg7y()f7VDRV@ajek#7)2ZzZjHD1MU2r+>Tn!}h30oeO!eA2O%k1_y`i zInR6Xlo3sVSk-Dn9^A3Z))5mZP5dXt4ysVVHj?!dj82tA z&PlfJ(n~M1=RNA23L5p&XcU+&Yi=Kj0)pMh5M^Ng|*1I6Hhn+ z&!T{Q(tgR|$+PO-dx_c9;3cSSvsDjyKZV!R{q8|R??K4HJRVR=VHk+;8FSmnza^Ej zWAJRMPLF=n!@=()yxV?kA_?W?rt>bk=)&s5roIp3Mb!pb*wxiBwM}1SjCIRz?r?^~ zT3dP8*~Hg6{uulAcYfs7cSNrGbW>b8F5H?jQ@F%_n$^iL(7 z6hr1Ij^#OPfd`eu{7b`B3z%1Z?V4cV1`FFL$z4&6>nmRIQpXBcH?)n;soowowAI^| z@_p8IYg?S9Wa`iH2&^y!)MzA;P#Zv_b2y{L*oZy)*qAk!nLJ@Z(x88yRZ9(g#t71z z(^!R((Zt`x^`imSu)5wpLk9*TXGh1?p+;pM}BSr)(hsHcXus%rv5z6hB$ZBdEbT>^~I zi+AH+@<`$()&lvIgp|Vh%=V2DUn#TjWj2*Vo@NN>VXYZ>o~iitk_J&4EX5#uRK8Lb z(I(5!g(MBKG$7R^T-TBJlJ2+SNFkohpj~o)5eEJ347i7=r${9{elU8_Kws^@EJIC3cb2F@ap1}i3xNT+}Nmw*TMg_R@{4p7c#1nXpHSRwba*x)` zF+5lDb}ALoQ|HgUR10{3G)PjLaB@$@ZaWaja;_Q7d__G1%Y;C#tgSCGimStIKlDn(O(W9s!TQ>Oer_;7(+oB>_D$Mm$@2))$+to&H{J$EVHRs6GC1?8Qoj5=XO`6xryXw>b z{xK)R_J%jU%@IH@z7maUnn@BhGu zorlzCK68olehTvrKZV&l-~MJ(Y%9e_y6v_*?9$I(X4ih>TgcM=yNf*)9vgmYbf+}{ z-3P4;C{3*iOs*6E-cz4w>-zf0^G7Z|m%NHz``3Sop=)rwJ8AMC-A8#e-F)*cb_X(o zn>KBz-fef?eXo7tKfgp7&$DwLcGe_rD#dhCSyTpRU@&vn)IlN<=S#soVXV4bN#^@UX}Az#%e@?uX~r%J{l*dKl_+x2}$9s!TQszE@_1VeG#Gg7b| zY6snIaR?~J3DZN$S#{Mp^~TFuvnVmfXls$~C+Y$ywv3Jj(tFj5*UC`slE(K*)@>(1rR#6F z$;L*zxvBp zIs)qBmwehD_qfL}AMSEqLh{IY*`NK1^UBh3+qdt)6KI>AeA0=o3|+{5-uTm-+`L@t zsxn@^339@W7UL{eUrym7xh+*A;mKi!K1ckGje(#Q1&*gyW$M=9ek>Jm^Qk+whhAY|2@NFJW$%JIV=UFRhEPde!Y_gnIHk{bL4o=-b> z>~b=SPkz!9f z9*LB?_r3?fIJn+**WYC07!v3ikK|-&(eGbqU;3}F+NVB!sojB!*vnq}CsQ6)wdcr-Y8VeT)lu?5S*S&KLpf(auB8AICZZK~xO=|ae7i%s>vuFtjvofAg zQM`JJkOd2A6Lm~pv73;!>%yhw0entnz}=ma#S>%~M1lsUvP5Yk&eq=XG9FHf9o1w# zt+;Vxt+{=F+DYP_dt!&Rb05YbVd4zj6sJ$#RC6VjyN~cq1uQ+&5P)!rNaD?|Uzmqn zwlmyMkv}N~a+*vktH`B=q(&1kH))4xDnOuw-^2WLjtHteo>F=SWXU9#a>b95*IcTF zI8l&rzuA>R#-!rp8&gQBj6lSRSkuiA)+;rs?H9=?VsiuctD87$wa=hlj56vcw9^*x|84yc}!sBP2uG{%@cja8k-#ZnHKYkaKrk2V&38CElwiW*BSjBOdelegvr zJ{@`l!ntSll>~kDy{+E2lD{|Xe-~IOJ@YF$)z)9(KVF1<+#BEgc6;+%-f6FV`Ah8p zl6NA2jy-mZJ?mM|aMjh~eP3^{U3cA$_8Fw)p8vdO+XmJqH81|ocYol#ZWMFrvM+qm zc|nF4>3X%-4EO0%`!weblj1mCc;WeW&9&cz5V_X=>?MEfJfGhB)_2)o{MGCD{bFa3 z`3Z=wJ$v`sRabn`&L#%b`R6~yuDIfAd*hqlZWmneRN@T%%x-{0(;9+e2`Qa%#zXA; z#BzH3JKk%*&wA^Retf;%fByr{tEmLRBm(N$&$`II^yRPGTi^B`NT&1beh8S4e(Vz4 zx^=5v^R+LVVots4|Gd`D|Gg*K%U}LyNQ;iyedM9oPmYUX{;5kLjW*lU zo)(aOTEBhfGoNnX{oW6pWZp#=J;TLYs+XU(X$|?0Ui<>P{PO>@KY7V39Ff!7(&9X* zku3kFptTUXq-A{gUqqVfA zxc1ZP9p<)e+_>J_kskcTFK@Nqd&=V*9;Y4O`{DI=jy$1!@(3J31enIzR$@Ypu>lB7V3qi0?DjAVJH`Ld}e1<8UeMtclmLh@~esSY_jR{3fIr*}1!t7~+v#cnUN zP~8j}HbDc}6$|Q6Z#bYj6t(abL9-W0yDS9MLX#TW0X!)-K|l>4p|>09k9G_v3y>`> zElKOZ>j!~3+snRt1~iauvh`?!Y;42(VlZR-h6;8JhEro`NNXUhcv_u_78}MRXcz)U zcs5ERvQoHojX`Xw9GpIH5)m|kgkBrouD(wTzw!oNsIb}$V=275CH6!X^mNFUIOS74gO zkm0P^u2Hj-@Pg9)l1JVo$L288dm%5eVlGSY>p0tH_8UjK9!LKAO!i8R+oQ#lPsIBv zxQa`PPYYK*c?3KHhXDaKa&?mW4;dWfN*HITkH8?L4};Il!~|mlIs#Io34NXH{3efp zM_>&gKp0Znh(~jYvCsQhZU|nDCgEWZaGKMrpF7cpyVDpAHQI>Pj?@>tIc*8fJYju~X|S8fRDU zJ2WLZM7cKTD-Y4t=FB#ch`WVw8H51&l9J}QeZ)1U%&Rvu1(pzd857m@89j@`;^b$LF}YyN51pj@7p)N^=()FXFl^8j>HP{ ze)*rj#D4p`yPap$Ew|ii&w0*8j_eYtria|+^LKA>`F|aWy(_Q0+L2>to_U77>z!|L z4ggPo`qLnhUXKLaSM4=_{YJN6v9sR$p0}GkoRs8|b32|npTF#K+qr9(lkEH82j2^+ z_bEr{=sNA~?e@kuyw;xj)F*|-oBGs#{2=)cYc0>3x)Q6Qs<4L)MAVQWAOg7q5P~{mpCtiggz(4oGr} z7#JF~%P#w(z3%nFGjYa4PP2Eu<1JI9nTWC9;X(FuVqwWk?77cmNeHg&(9 zK?2vUPAW(BGjZVs=i7I_^L-ar>v!BA$p9uG4y%u;K3`sH7eK;EPVk}Jn}xeTpY`^!)Cxn~)r$^xMAwWMHq{-fv z-=}n!?Kk_ICAw!#zx?H`6-gwuwP9V&sOSI-mv`;QWxc=Go;BFK-W#Ehz|{ zvo=O7QOUW9SRMjI$0!eV;bbVExF(!+ZXwov3m?J~x zdgTKYs{ZBtEnuZMK0Eufww1ugn>wQm(2^F#67rt@irqJ)wn_EIS`+K;B!6+NyN5?J zOjhx{nry0cOe7Y!k#fQw7$~tYJ_&l&<@8neq7|#p&5(xo@0C1A+0H-`S!7QAGo~|8 zJK2WSO^RcS+@tX{@irFd0X3b=(!a?)ycG|qGM-ntY{AlCjTu z?cmv+p4coM@zr!D3)JHxYv<6`sj9BtC-u2n1PXDj+U>UAaiG~t@l}K3zk384ATTEZ zRPP0=%10wScYf7zZroS(TZ>z57;C9r9Al8Y9#4kWrmXX!m2vF|e;XJhYkVEH8R1-i`crVtTmw+M z6z&hftoo$2Otne%kshPH23XT^)wiRg!|F?Pj*i^}1)lN?jA^UT_POOL z|6P0cSs?1nGfy|){_a)g^>{>m`coga-ag7F!+ufsN%yh?a4nM=r|+k1{i=a5dGg4^ zs)aUg-@e^?ExFgxyW%Y!g!WDpZ##Bug#wP?#8qhw&nW$#z;jHpR2m)`!Q*Pb?O*aP z6NpzY3AmR$RUgS%RCsx)On2_wF-bw_o+lc?XFlio=mPTQ+u!`^3^}^_YTrc*cMd`*#JuxA-fS+o;KlCY zS>J#7lV6%|efLM^X-|HZJ1Q2|;UDDv8e1hw_$u*6Ycst(3ib2|QsPVrl2X(9v}OCPbPF7R(X= z?q|Z+fR!9g*+tbtmCB2ei5B8>flsz98qHWqd!6S}GT`Halb+>aK;+HMjizP1XaYZEWrih9!5WqW&0_MtF@BHIErr1-u?^^I_U=$c9 z#bX$+D7}xtC+NfCJpwIaU$SI6nnTE~(Ht9H9?zHKt^ZQa*S(5zzqhtCNpsKom~VCO zM#iBjfIG2g4C)um3eVeF>5KG)65e4R05x6OMP#y&aY9~Y2U*wbXepchLyoLnue0eT z;`tdVo1PRDhS&&dVyK}2AD_eOxOJO4! z&2|l2i8=mE$vR>gGv>%T`IFAcW_5p}lghoxAD8(<4+<x)0iSmNDMyjG$iukW8`0p1QlsSBKSDQuTgLGLj;&IWS=|^uKiR_{M-oJnVsH z@4kcPnrnY=O*xu3$T&LnVYKHu&*yknzan)d4bvxWVwP2%; ztDMvKoaSb+K%2m~+9VIDtA6lfVnF>bYqL$}2~T)jZI-&6 z^_IZ5EOY;9ySAHu`K5)D^dztZ2}rLwh%PIM0sp;gh7#@Pq*Li+>u~_q zpMWN2Sv_bWszEHn!nRD@i8kn|LhwdukD`~l<2wE!)<}vhZA4>wR=U~7u!Dpp!6Iy0Sw%YH_m;! z@z}t9LwxHE<-AE3eCD=(fiIk({#+vxSsj9-SlY2s%1Ogftc6LuQ64|UBZ6jZ46r7X z$(c=wGGKU30Vn9I+AD9M5(q#aVA^7nhM^1_905&RIvhpM{v_0K8Dbvcs|po4KfpXN^UhVDu`-|i@MdT(Dl)FKFR^_`K%6R9#A|FL6ovAj z%cY^w0MzS1laN-t9{P)||H@QrMN3uB61b~(-2$Z`{jMYCvt!&l@ou~V%GTeYFB%H?RR^Q<|PD`9EYx@mAR8xZ^J1J zTzHmq%o7cGV{h3C1<(pVs2~35C(V_g`;vLpE6+EtdezHq)f9wV0m`L75bz@F>W4h! zL6$nFT9G4g>f@jItoh-OegY-R5MzoDrP*fl_s{zqVnIB^Dy{0tN5@2^^Pwv~X70M{ z?uzwvyLtZeo@-+$I0hTCfXx z?Yct>ua^<);qRaSH?}UyC`O4Zul$nv)Mu`QZfwNv2hTqHEc0*w`p;0poHbe2Tpxb? z)2q#Y|My4D(IY)j*E|)9pMRMv`>elx>=U0dpZW9`&BYgAWL|#ZOJ~hj{liB;&N*IgebC%|^DWjuN*4Ej^W10BCoZ&#&}F;O90h&D4tyF{?C8$D_F>1Y2J0o+idKR>f-hvIAC7zf(y+hm%NpjALmv7 zv}QhwKtbzhfe$0el-*;96-CdT_8Y#+K4!iKYdkt$y@9+-8Yw3P4c|D_*82*{mU#QN3F7y83QQahK-*Os;ZyVh{c;Re7)SOwUC#@H)KRMM|VR(Ah7fuS{q z3!4)Wvwwv7L$Q6=nIP4lo7r!NN*NnhHlGEYMa?IcdC6+Xg$91&F`2i6pIRPJFU02Zr!}#>z#AIv(5ePbEc)*>+K)3y8I11Tg}aEZoTA5 z-~>xR`V*p$m_HnmvyB`VG^^<4Otktv!WyEO;(aoX^;C%fyKyYe6rX4R2(fI&P@I!Ti~ZSB z8uCwV0J{^=_5sGqB6A3@o+0}BIG{~}XGC5=3X!H^>trQA8&${w7Zv}hwywRjNgget z9h9}B;xbjsMxH+M#!}p;GClkBt_JA#94mp^vNSftkj-34W5_TYS}Eh?Z6>c8-Lqjp z8^xVFcWcl@LOwH&vdrCF3rtj8J{cfrV^CuJamV4guC?61Y_A|L2SAf>3`X2EnUe z^E$gP`-{Ig*LvG17QwqNeV+vzUhwySXAVN~@}{@EgJ9X$*g0I@FY*R*)181$7ZK?E z@R6hDEUcGB2c}pNqI!w(`5DAGQ2NYgKW{F1*L!Up6#!i{Ggn`Ijiu%J@|QksJ+|C3 zYv0p&JY9O}<>ssZ^L4v_l+ry(49le^dFY5L$d&a%%F#LU5|d}rN~9jV!v66e-vAxb zUh@DfzGXpu-F3e=@B7dHwiH&c`=@_ciOWta^HZPxJoo;+=0Oj9fCUd_k^ZY+|Hgda z10S}1?y`5k!>*e$?Bx&PA$94yFSqoR)z;pH0`W(Cd#$(Fw8Gcm7p-FjtfFEko~!2c zsR4FjYh10)rp~Dqk-LVjJ??&Yf0s^0&!i~#?J+WhSciAVBjy0(f5Fz#J!|^AyRKE$ z6%$nq6EaBCx}MV}*XpXNHcVAboL8QK`3#k!v`@uewU>|>4cic3hbQ#VC%rN`aVB<`=%_ykm zfV_Sl_3#JTmq6e7lAgo0>U}w1+mHA6rw{|`+;i@~D3IcKuX&=*muJy8zws4&In7z> zSL-3Y@)hS>VZBEwUXuWn4H93Oi8VQB$yUUwE;W`kT^%ix=W1d<5vksF?82?Gx>6kv_KmUu#kvUZ zt;*p_)f@`GIo6HSnozwco%X{reUZdsA^1Y0aIE5YKbFaxGd2*wkmC}k+9k!W0?UP= zt;qX`Ig`dR3Z=w)N|J?mx(lfRbJN})IB!#?-9KiAf;qEetGvPjCKGRjMhS)eM1xgG zPxi*jhw1%bJxT8bwUthr1|(`?VbBH*T9Se0uKuDq3h*?BMKbf?G=QaEtr94Zwl)*k zH=i@dQU&Y50@bg<;gUEwJS!}abvsYcP*bmp_L$;OO<*lo!t-dMV@Yjcdd72%Q5Zhj zF-qU7lfKKl&-HooLoYPhr>isaS@LMdGb4s!fMi{-uj^cHf!Wdm=PD(QA=kshC36%Y zqa9i?!ctkTZdbnHaL_6&1OjT~;A{$1tJ!M7Pb-i#2Fd`!&OMmBXSjTfm{4*jFCmj6 zal)*pTtd`B08?WVrU=ls2|7~|X&g-!Y>crLsM<*>QukW)d|iN0$A}SiH6RpWu*^2- z<0kM>hD+w8)N8d}R94MRk(kMkrz~hWU;P9$2_Qd!^{bw_eNgf3f7a zw)eXyfocgzLD)!#>rMm!nxF@P7PSXM3&o!hz$t1d0Z<*R3l;M-iy^|uES|&F<*t>_ z?wmJwd#2ArNkBYk8%#T1*AvW}m?fAf##}4ChF2Xm|41RCcct%q`}>wo@0rhds(J5a z@3df!;s(6@qKnNR|9HLm?eG3zp7_^~H=n!mi-1qpn(f=RnM>aJ7V|*B19|!itogtP zKWqdlJmL`#vw^p5!Bv00f7K6dY=IZP;Cbd9|M4c~z9w7V+unYu`R;drXaqoA`B$@H_yf+=B>nfi~<(D&wS$3pEF%>Pa1-Iu<-a%{l7=p`4KTW-0P@~`FmXI0f~`bSwVfALHIYaV^xBP^}b z_rL$6NjXi=IrZ%b@g{D)^>#CkVqTO*=bUq2yB1N7T3P@3hMR~7I%3Yb|NSg5bq7Jh zrK~#l0q0CAGTn0&=)0$<*Zk@FKil#icZu>q)7%xhFD7P6*|0IeB}6M9(Vxod7a;^~j> z6R#jfY7zECQ4~62giuUW?Mnncxi5x749-OD&Dxp$nG&Z?OIqL5+cQkdbP9fvsKUso z3)X<)WX24PX3f1e1ucEG-Nq;b!qDDEhISLgf$GgPz`~&))=yGvqjaFg(wMn*KQWJn zk|qqR!f<02in?~Qr#)^`bTWyhBC;h3XQ8yRODfzu$;ODPjT5z2#3G~9YO2Gv(ysa1 zA?jwmyyQvXRF{C(BnJp}pf!ouX71=W=KeVJX-=t5(#2Q+N(UQQnb=83?{=la;)jh^ zHml%kDXiuQ=BXX^NlvPpz?x)w+}wU>(0+ERQ~{l))sJH{mSNK}oR}{NHU#%r3B}<^ zx`0PnlZio*r8q}1V&@c4JOqIVeYigKjr+}El*L&TuDT&>b;0N?j`dgGFud~;@X(k~ znj7{3J`t#IPbZ3omZ;gXxtqbc+1z>eA*+z~`6Dbin*lDI#d#EWa;-3Ph)iqm39K)5 z#7oOB0o}18Bg>)TqT>mL_mf5idE8X?x3gYU_aw-3u(_G|W^ke(9>U`VZzw`Xncc*S zl#))0ISpW|A<2q2)JU8wK+)szM3l^C8-_$lsNr^@n?r#Ro8x73I{;L@WbY3G)L0#Y z<2yzSsMClsv=u;VXDhS|Y+^MrXuPo=MvOgUSZLeLF_j209tH4flhx>nPOd^k?*+y` zSu}^?;*-U$#s|e23qaGC=eO=e5XwiqAyxl^A28aHq2yd&GAFt<$A3Nb34u^?EM-SP zr zF#L48y~ZK%b<1NsS9#uVo&+QTJ*yfq)o%m>SZ=2b6cL zJYi2va;`HB)t&Bo6LYC!1V^ChT|3NYKm8FSKxZePMZG7GM|16~|KSzpF^_rFWEEd| z(fJmD`M+;`(|qe&->nNkiB|1-fBPI8mqFl@QggGTsBo==w{6>MKJwxBnbvKePki#T<~!f{zKWeSedVkFXKCaVAYQ@THP1is zub*Jv4s~F438aX|{C68GFo| z-t-3ZkOx1|f=|kKA3VhrqeBKfMLa83GJPAct3-d7r_z}w za9*)MZHT;Oo|6ga7@LVXJDT%D!;R6KcuOlu*O!M-hU>VL|L$+6{5#E*XIKMm93-$MSrfWkr+0?7AIA#A)3zQ^3Qihs9=iJx+At2eOO~jn}SAqrQ+ViSrGT9pbJ9*g9_Oy6Ye_HYmN<$ zn(cVVgoytlD_3p2j~*K|J-vO;aNbA5v+tiO1P ze4NOSv+)if2ZFw`@fM9qGUL!3N+Efo`^$2PP5oW>P%rg~&KSOIOvs0mW%JX$qKpHy zU9O9*qjKmHHnvlk*brkV_!Gnn7-wD{W!@DC_1Im20X&bc+(iX?%66i4bYD+aQ`Jvw zXW>m&>Y`cI9HHk|h8CNk3KcNk1>zLJNT!6vdxH0ki4bc%0;IzUmBVUg98b;yaRD1S ze|sy+GeGCPgA*tuDQJy$L5<_{C3oJh&8M;bFa|IJ;k)tbjcGA*LX%VXM?dzud3X$chcZNyC(ytJ zmE4T-^3h9_eFCx$9Xf2j2E|`nTbp^&3!i7RJ?x=>;bymGOn%{mDAflChX5nmZE)|; ze(p=wxJyCGpZ2sTnSXoZKill8zrc+S>UrTSF2>{OSN8bk%^RTyd@Z2VUso49~YcN&XwfJa~U9z+H}#&&$mIh<$d+PU;Dbb*S*g&uek7~oX*5oo#+gCjFx`> z^IziW^(+&Q$H@N;fV=Nm@1K8u-D_;_0A3D1`q570KcoOg= za0*C3#_o>sv?%$mL%;IZkPK8)@x_^%UG&B_NRyWqV@is{A&aiUSi$7r$0`)=VWY5_ z$tlj{?N|=GdF=@+_(zKc2Ry>_DU~(9zWI~$v)h2(lwVzsCRO&McI@uM+0xLOB z-YJ-CVdbf~Jl07038uoX%31Qk(#`wVKqmWTo03#CxW{&%`>L zO#v&?LVnEBC&}xfDVH_7Td^8O!>ar_XxfhS^xI9ds5&NCu$N7bX$X%)#Zoi}dPmHD z0^MwHL5YK<=Ef~sO|hY}N?)sjTqW&VN>^q1k2g^XC0xL4XlXJ-j81ZJ;jyqu&#UwJ z>D_thIvS6Z3Iu&PkrsRcYeIpXIlUujZtnG23qn;zqfPCTs$=?1fRFoGb)GG`=j)k> zu|X`Lt(;3SC$OjpWr8*qozb#6I_k=5<`t4CHDg#%hH?3jcT>b)H0exz3*E^va%M40 zKBCRFUQ&V_Pg319&uC-hSh@R67HZfrfT>2L)rJLM8(?M$O3oBk7wv!w8e4mz=#!OW zz58@L^;xNN)fdKz1<+5uRp)az`)nMjzBKW=(C2kjK&ZR0-c-kX(tYu&Wdiq-BZ0C7 zQZ>5FouspIpF4rStq~^>wW#=Z0ECMIRP&AbH(I-E3rMcmTo6WV?{?-B`_qor# z%s>6(tIeYx^>F5?F%-lTCWzrwOC5?8d8x>IYM7wgT5Hq-P;Q%sheymC|Me}_D@jyp zPr}>jArF}jmekvi$-_v;j~(lSBJY2o)_XD@0e}S6)|Nf@8Lm#-sC@$2`D>0!|2aS^|`;m`)nAytSaG_}vbbDX^@@Jsf z&H(zHW9M^G?8#$kAGCP&lJ2$QL%!@~FEnp?(;ICT(e}OhE$=i}{ouz&0F?3w{F1lN zhd%gTn@93}>)S3dqU=*$1^9jA>t7;%Rus>uJ+|FH`teWAAO7$s8$+oKc&PG5*q3N8 zrgQulIX?EWk1`$Yxan7=&t3T?^V!cjVAgA1bCJD%)z8cNQC@9>14B0M)ItlE0gvdg z-u$M2G0%7w6prtF4{^yp%(G&Vi-i`mCi2a-u2utepVfb6OY{9c+j%-Z+qqiLk3ln^ z&o^1>{f;0s*uH|Lo1Tzyt-t|{Fk?}tUOa9Tra#V`^U?WDRo51(jLxP6Fz@&0O-DG2 zr!7=-ctfRd#l5X3YuC`WfHm|-5)doLcnJyk6dM)~VhoE8jqp`+;W>609qcW3M7D+` z;53CUj3K9w_~9_P!wM2wHve7Ug^^d<7FS?N|A9hLtY(A zCWqIYY`g|}67VG8Nx+l9iIafl+LkcucBY-)lrgtM#di+d1g%>%1*0Ccbn2ROoWuuI znsy=PESlJ4_y9|oocf`Z=qK3jhOSPm`8q7$c>v1^cR^GspiyYOUtCV*o8^+rept%WLnB2L$da+6 z;BxDxx=P`-mXmI=7J}VS%_RGdnVa_YnOpBZYBt7LEE8kLkqVw2}vuuoc^(vB|d-K z5T_N4K75}UNSCHjksMDwR`OikN2WM7&bTVajXATkjAd-u?8J4s zH{+vScu4RNY))unT{eF>m^TmKT^svwC2P2P%a-CkpK%nubJdce#oPloaVoDd#u;D2 zSn0GtBP!tUHwWcy=1_qSAn(C(^(ilT5|}9g^`$d61fexje=1vVZrGL0j`pA(lLd$b z$y7pVUMe*?o^=ei(g8IF&VGPt z<`Z4>luC9HH?zjBGFWS{*;2iq+-KH3PiG%tO+AJO#x7T zTzB2?p}YH)`O}|nFc-h}4dx4<|D@Si38bB;AB-i(pfYEGsY;4#r1`Olcs_F(pUE@n zbD#N`jp-w=o*w{`j6;|7kt_bo?!~H#oc2+&(n|&$0%>0G_kU}DSInb-f79E|_pkbq zJ+763JfH;FeEO4DSPw3(Hx$oGaj1Uw^Iup1>f@jIjQPn=e$L$9WXqKY$7eqE;Y9&Z z;c(a_hm+?2ed{~sU;pi`cxjDVPiN7}xt`h68o?L!83AYVE_0KBFRcOOfh4+K$*)9x z&OZB0H;a+CkZAP;UMb0Q>L65uSN-tE=C<4J00c|pfrv31)O~i{$@BQ$%RdM;;%#?Zi6KOQwW9vHKU7phS_w0-h`(sZr03GbC1p5C+=R}#R(*2KO~ut7O; z;jO3+z?IwG#$t|U$x>mrhG@X7X z-vL<}??_|K9%m zoX_cUOGNiH4`o6>gHjX=&11xLfPn}!+>Rh{oR{G`7p;N=KDi!GQr^k(wksAkoe`{s zC#W|Te`TJlIfj{Ks6Jp0mSgA%v0@I{_#9=t8IL4ou}=Tt3VKm(Hj)$6uK}ePqn0YA zALd9oo&aXe?7)hQ>gc;KlHpH$f%F=5n_FI|k^~%=6X)(061s zZ)u>^|Fv0D5~wSAO3}2ON#k<}S|m|zmQYlcpfPmkh^1b~T8pA+5)dWjS93Ec4M|{> zm78WVDEY!Z6n*HLMga3-5iCn-|AAou3U1Ckw_>SPTbA=Q=4Am5b!$3^V=lTCx(4GJ zU|OO~j2J9D?epL>58F;`A|99w9#c^Ol=Ys91*mG659Ugel3c+L0zj$%yU&c|-i(z_ z7VkO9|3%;;+3zpAk8(u{Iz-MOJ8W(+uQ7(=}f(2d!$jYN+eyW? zZQJUoqmFIcRwwDCckcJz&wigjP+#h}=2~mabBys4@Hg4(?U+)b`ncZTj}Y!OhwI>R z0l=G)Q=N2J(7~@v7PT)=q$XYT>2t4=XUA9fpZWk}iK&ujm*~XCg4}qZHPKrFbrruK zRs%CXzx}%*c35bZ@AKsvpA<3GLEQW1yY0i*kU)u|81801ZuNBM`??>tY%9P02z~8D z?&#zH!TE8n(Z_`S^DnWjK)|U8k?r;SP#^RA3o+}?+w;pYoyh&{-x~@qjf;%qfLfDt z`nJv95?*h=dzE~ao32McEK47Vln4v3p$`Jbs};|B>iTgdf+`Z+&NV;ikwDL|tL>hN zo|;!y4F4PNmm>@FYb4F8PdtdI{%DxY$EOqq^UPv|k7hmh@z zcL@8x$#dtN8?0+RB75DhB`Z_`Ym?AWyW~J~K@i=Re$;_U3qH z#x@O`;G8^upF|1#pK-)V1Z!CrX;_j8A{T|aYkz((7!(tTnr4}498;^{IZMg(y%ae9 zmRoaRTQ7&J;kd~3cLZWoz7!N1tM=E~bKY7m`75LbGoD{H$z}0_{i6pp8eX98msQ6@ zYiq-XO%Z2`lmE({{kLMG zX)5etFZK&IJW9+X3knjAIoAYCuLp?L6}K+Pu*%vu-OJa0R&KD0 z*gSx)DUw6B1s}nCod^D$HW%B{v3Sl#u<#MsGi635s2xh*v8>n`$Z*KTn<3<(K|Q#K?fwF*-8ENZ+d)=^j5FFh&p_oPTv8dhRP!~^?Yp+FU$=uVlkd4G&N zk=L4YeJ4IVg0`kKtv6YLwiuNxBzBQ{n9P2aP#B3wAQiztKgSIIv?m77LCSc6K;fQ2 z-0ItHQCT|1MXh8EgEayoEzxh=OYBDWgSD+h9p5uyH_r!Us_3y;mFUi(f%W6F!qleX z1gvst15GqvS;M(ytC?5((=2=&_0vv#;UuSFK`~23!&JZOE97RJ$!w_Qc{?P@Z0U2= z%1$AdOyH=BO{HkoTG2Ke3T(hY1K(_V2FT)eeV2vB$I3UUg3-lg;~AZyhNP^5~W6D znWH){?~yb9gAV*W+c9v^_nL!rC;kp9>E~PEU4>|%Le3o(_-s7>3WAGyy`kl|Z*$l& zzlImfzkXQxx6=;v@HgzS%zL=Bn6wN!erxZ2(mT#F(6iBhK*n~8eXz?T4Ub>#l>a9D z6=OU}P}$u*5hQ&-+x2#C04%v|=?u6X%-0+*T~OFD39NwTyVcdv@PfSB>YmAQU;n|v z&2H}h@-DFcw1RYA`_bo(s5cJuK=IACIi{AQ&&kT>P-uaPUq=|yhcrxA5&X-_E{Xp#S&%>f#r*rnJ z%}uTXYR8QKWi5Wn`z+u!eI-la^UT}j^_|~x6mQI^hkWZ`ZJlq$p}Z)krQB}lkBq7> zv+6|Sh;D$#U)7&34=Y+WfLfszEZ9Lvf;((k8ZOIg9O?{~wzlj@0w}r~9`lQf2ZMo$ zy)T^^^xq*8X8?8|WIfE&9@7}S>f4~y?vf5!(1NrSQg$e-*>t*So+*Wt5>@kNiv5%O z+~jzHqDGd;VorP@$3ftsduj%#Q=-$r$Nvz|3<_XiVDw-3kuE@n`mLfwLn~zK$|J zc~S`0%DQQp{*3c8-};^?epuqw7Ko<^cGrnD^Hg%~xDQ3!KT36!#!5DUbj^oODK}Qe zl4HT5Ie$AFNzh~CZ>@)$OA)_Sjg1&K_H19#vWog?>rFftnsrW4mZOLk+Z%XMO{qbT zu?puX_}-ZW8HvAL+@d%Y87oqPp-q2P9P0UnI?o~99R^{~-yjmXKGmz} z1#Gd%?du!s=a0TiIdAY>vWR%HtvNNs&AR6NW1mVZpSIdAWTOMVcoo0PQUHgxh8Py# zG%#vNQUtD;PP=g$*^U)%zhU25!UC`YdDoam!=WJuF%5Yi3wYbPj)06SGA3z&3JQ?h zXz^fX_7;5HffrBIMR6aKWh`WtBC8dWZuMAQI|Y9G+j`}jRj-w4oENh`Imec3^nX_U z)^+b!#FJr&dH`h(E$jBFZ1${hHQwYOod1T8J^J2@U(vtKMjPBayS(Kszzip{v~PKL z_q;Ip4m{Y}7LA!}@LNv%-3HIF{l{F|F%k|${o5H_##H_D{TKcpJAttbc4+?F_Cx-Q?)yiM%e4*Bd&a}$3t;Fl*LAy?$jH9y zi%ReTRIn7J`)nQ%sp#}*^>w>d)JeD<$4$GV8`3*%-S|83{|l|pApP3W{QFqvxCL{y z{76}$FMi`4o_k~0S2mfwBF{o!W|4XM1$lFx%c7N*%kWWFS~|>cvGe)-a-}U!WV!P1 zRoo^<#jn;o-;Ef8pIWRK^`X|mZ^rinf2V226@A+#s+4@!zI49l#xJe&_HTLyvfdpN z{4U>9r9#sP=Zd~h?$f3B2uq&ve;5Ty1_RoE&u!`t%N+lzJ8v=T8$axs54hh8octb-slR0q4#$fe)9Ur9)cQUd;67RBS9A;@ z4$Tr>-L!^RxGYf-Gp*fJ( z%=%e|rISOCB8{Hq)24=RBXm4z$vwlj(lfN^k;=;=)_^jF0zok&{>!1K=C_KQo=j`` zg6miNTs8WrD`9z@vTRkT{81Hnt$dphi^Gw}(gfcRv34XGrs=VIv(z%1w!j;!x3{4{)rCVr%&B1)iR zIl3ymtR|P@s`rLdRIx2;?g~~M!IUHBU8^d8^Ck}5b8mx`b!o7?pB*72%;lR7397A@ zRWg%Cnn+bm11k>$WSNdZ{xH6vz2OXmR~}DI=;@DPKi`F>6Cs4I__d$S-h#?gm5Z2m ze%$bvL1XGX{b1Xq2l}oGy<;t|U9awN=m2*(xmhq^_XJmJw92fUS+tM>B)*%>BRIp^ zcr1uwR{GX@eKXP_Qm;f9U&Y;BM}jv_wB=ze*DB}Ele&banv81*_PU&W;KyvXM4r>l3)ds+XuH`}@or3ko|>qJpNFIVAP zS8M*!QAw;CFHyVS;8&5ejgnSqhdIDhoC#feIA?8c{2_W}f>2jLtx%?h{-Gp5!hI7i z+Y`dpAg@^-rdu>WQF&d)MMiKYhX6yYvOEKh*W6v!b!PsCm*}~azXn=klr_)O%1>Hw zORzGyBfxv@kIW-pZ1kNXAWHVwk2~U+HnuxTfCFZDjxohIN@xM%Bd>zRE?~a-D%c*t zO@$t4KY3nW z{Ofe1Ikji@NkhW}4E5IVeuZQh*`Rh1irD#k+&(F>=|L4b!}mhq!bBwV6#^bMMag(h zs_~bye_(WK#^1dal2>)4%}!@(=i|y{QpVsuXzbHaq2lc!3A?XvRo^kaju^d4c27zn=8{_I)(T&ui})53nvrXZcZMjtlAa^&9E)I4^as^O)yTaz(={pK?C( zp(G7#m8udxPz?0)U`aBC#NyvB-k=H%F;|fbCH;1K`C$9cy zB#qJnr!JBi;F9Bp<^TSCUma|SX&ZYv!M8V8IH-YYNl>5nkg%$cbzJgDiGGvIHqr9w z>RWqARnVAq(ur!uX?*3{x9^}8SmU6+&HnDR&&-OFKj4JzUM`!RzXM5D$xC^h?C(am zOV5|@UrruWc8F`np-14-%R|2QM~EQ#sA}AGF!$6~YrgstiB6NJm@e*5Qn0WXe!y@( zYA9wL7QqR$85!4#3;)W;1Y26x`Iu#;S#Hh4Vptp_kvLt{H9xayRHo6wu*U{|WeO=# zxX8|SeX`ozxZ9F|+o)*zclb#ts}Hwa%-yBE>=E<;2wn9;1H8voJu3NS%^!gT{_5m@s};ZAPVg zyBmZo0pis5$;UStR9c4;AG;uX`xa9q1R;<1#~=J6bg^`09Bl7$1U}K(UYdMib1<@qA5U@{EkB6h9rH z!U`2O7jtbZQ5d=M+Y^@SyMoeNrNQW+at*2m73lASCwFJ|uryoA@5nthDjIysG^u2@ zIIFsbmwp;~HU>upOPfX#%eFR-%nctP=LF*Mq&s*l$yLoH3yV&B11T_1iP~sBg*;xI zoceSBu7X~tptQHTr}B>1H6Nq^Fb*#$=bV;ds0oUmEIqLz(`$>mW_)=%v%n9M(4e^T zHX|_zK$+>DrK?kZn$~I_rOAtr8GcHBAcOUs=d?tGw-rC}O1xxSiO0gb(q&-ujQK%6 z+?T$b58>HDSFnf)?Kn!PbVEAypb}C>1^!Um1KOFC;^Dz#O4-FV6HIjGspm9xZQ_L= z;oYXUMqUA286X^wC;#0n^LNSojy^-0|lOw_-j;Q`sC@>OTX|ON;qN zC%?QVWwEPj425ZF$6e*talOz7Ek@_vE+4v;yx=E?=*t__E{dx>@AYJCRDG#4 zEK@49TF*#RzZL1qp!AV-J$FSJ~+xgXktL&Hb^0jFhGo2>@ zoe9khQvl@K?XFwNd6@WJ=Z@F?(oA<&RvZSz$K2^Da7jKtkym&|Bx7d44lyPsu6H^$ z*57T|>fVogb-6gbHXXe4`Nx;H|E=FFS*Qo-TlSv2#GN!hOBYH`5=gS4Id~jVEwf2C zV>TbupZ2$U?ai~#@kKVCwGWJ%EsQ)*d%xREkqb&g5oC#^&QMHe|F{~zQ~O(H;V5O5 z_rPkfOsj)&K*3`A{DP28GSW8X6a%kUsZ{os`D|hzpn_}9HNSP%G~Hc%vcP-33I6Ov z^;>&GdvXWuWai6t@L!?(%SFqCHoN{X&2!UWa}BWh!8%O=Ihf%-$J{bg=s_?(X1Fr~ zng^3bPhxTEL{H8Ad3YW|8AL(%o*Nr|Isr1uxPH8r{rM*6b*aIx!SF4_ovYKFeE^t9 zmF%(^T9_>ZN=lk;g}2oCVFvG5Mdg?(0Y|Q<7)`%{a=+1aZkpYoe$;MnY%bYJc{EQ2 z2dPBVX}2s)l}X{rS3gB{OiHI&8^DrQErwA(s3ifV?2dg)ghEy7Vwb&D?dV0FMs2PA zPAgC!&9PODg>il`=I^pK1uctPy~EOds7KM-olKAk3v|1_8N-U%&^Xj8)F@4Ro_aPt z$Av}CPJ5PLz_n_Gzp|x}GZ@n(_Y*PN{3C*zY`FnQH6;+ESe~}rIYXl4m1>IxiRA*S zA`RDK%9<8Keb5G6DlXeo+^>|_jd;76QY@k0nkXWD`ls1zxPe>ltsEKIKBt?h<1$)1 zsE8TO?85&BIUQA_HMEb~rmp^7Gw}sQOL^0fIGf6;YuDBAxFZYfMdqt0%qi# z7+~j?c^~|W8XV$(E1|HnZuMk1aw$vXmSYtK@HISsz0E14*uiigWh5XuW*adKb-F7a z0SL&*$CF0Jem9nG?5->_bE_jzNTp`M^<&;OTYMdkcrrj!F{;-vmRWJ2V@sH?`3?vm z*|!!YmJ7D|?;4PEhbrL5XUsU+F0Ia2>8%@0_0H_cDBVZ~l2B+pg%q>lKw5y zq9o!8!OFNzB%d~QgWQA*Cc7!P1FxLW{aT4SSJZ3X8HWB3mRoehW;itI%j(HI>gi- z9g5K&Y*+HbnpsK^rj%sY6P$5;HJ|l{b=KnQtw`E(OWPsE+4Jgn3bE%=$(hGOHtp0; z6B-SM?QPPWSB%s%WE`I(^yPsh<_9w!qV%LnxyRd;HZxg5-gR2AIpDF9%{T~+M{8Qb}abd*1ctu$y=TDXQR4S{*4VT?Z3mus9CK&@mPl|56)e~|c zW%HPDf3p6P)VB1}(K$!0f%VZYnEKMmvVYoLtbR2K8~FUzOYhSF-;x5+zW0($l3%Ut z`H>F%sQC&%U60#&_;s(-S!vDROzZBE(a_mIhE{eOgWUzF44nN-E~UbT5h!9IsUo+U zG)>575tB=nWD_l$*}2J)y0xyi<`Y8>ZaAaJ7=Ln&DU12~4ybAS9@V(#==p(~m6Ehk zLtrMr_ie#0T+W%*PX5M_FWRxHTw+Y=Lbu0f?0-}zUf3Ke*oeT2%vK*#Btqtl72U;H zqcmbUBko*gj;D#$q;i4bgYpbn{aYb0S2w z{$|TAs=@8iQ)zsld&$6JLx)PUnsf@x8A2(+lsn21i@+izV><;kkWq90?4)reaG+8W zwv`|1KpTgu5fPm!i|tF9)T+qMfmG=%O0i^w4vS_-iaBrDPO3lvA5Q5!5+rW1@^XQS zCZ(6Rd(l4n<@lDRGgg%?F{)7PI#a9`B?`5tAwKW}kMXCQFQ(v#DGP-_9@7*^l`s-1 z87buUw0Oz7BT9QOv|#zLE2IL%UdVe9B+n39 z;>9u5Isw;}pbtM!AX(mZd@)Q5{fqKVJUcpcO-a<9qN*F|?oelLM%pzAl&xjdx(| zhBaWz>nP5fgH1+SASvQ7V0v+1*}AZ^S|{sQvyI_Px;lXAxE6~c2jk5LnWw=wh(j^X z6b{j4>*>jvEBLI9kZ~hC<(iUvIY5D=%iuL>#=932!P{L%nn|;W5pN^b31n7uO^J-C z+eO#GF-@EaXhgh(oWSY&r|-Uvub2x`$J)IEf3-L*{weDvkI#vPU6jMgUfr67>!JoJ+8OfU_l1d6&Wk(OgG{puZ7Dg6nU*jBJunVS;&t z`#M8B70}qL1`b0<*rW|UBoa+#_l&bZkEhPx%DwBny84Hjed+aw?qF!s)u>5Fapyou zXMo4!@l@x=ZJ4r!R(T~bYtazFEXTB504($_BI(7tz{(%q;X+G^fMZazTsHurQ`nUT$j+AX*CL&i^KLnP^`jt&>Ou_M^FFh9=)6_Y?2H3 z19p*juG)iz)tbl4Buq6Ncv)M%u&RkyjM@j87e{o}EU4<^13yA%gdW(-`YVU3xT5F7 z(?R*`8}ypGK7*N6pqy-MgvIcTt8%K11F&}bXFY|#t@RX_*Fik`!g4yD{8ecu*Pl{I zgQyza?>sN?wJFMH;+Jobz;rZONs&cqbqNVm{4kH#@b_4sMmQqM7tvgYwzoIWgTt6q zbl#lSTA#q6_-pP+FsN^7wQ%XfIfO^>A)Vod`-ZN^6wXv16UZ)V^7FkGcnT3F80TO5 zOL&l9LiOTGac`XS?$&V(52aq>BdP*HS=igSBn&ZcgYib; zR;<#l4*A*A*Aq`g)D4Iu3(Dy9Mptn7Ojs9JM!R)%^fFvL+Fa!nFtsZ|sZ7Cg8f}IR zR{vN?>9ne(tC9{5=!hMur*3x9qAnRJ)t%TCVR!hD|=)u>dXg9ZmQ)^ z36_?0iXmOaI|PI{gV905XfM+352_01Gs@nSg_ufBTe2K!={`OWAjM$5a5>&o*2w1{ z6{71?fHFfZtTlgXp{>uc*EWX>SDp3!&(kJt$MY?UZ61?2zkm==VgHo(l^YqgXnP4hCX13Qsk&4P~sLNB>`P0;U=V`j8r0jRyEFS7#Sr`3DKcek5Ppyv84)N)!|JVNnu&u4skIZ`>CtM9}A1?uL z^?wZS@l?jdP2K&HA3iV$iG0|`zY0hJBd^mkL3w%uRTn%PbEF(8O98_yX3RZgwc zni6(zTR5X^m%06-q5+l_Ey_lFOFjO}494*vRZ4U0q`lr`;8lzl+$nz+Uil0sMn1Ff zEVrgfBHL`gq}b798iXZvUh+N^Y=^RbtOyr~EVs?frJZYe!-08LVvKZf=I8$4f}2kE zF;ZWyMm!RBjZ*5e8uR^``4)AxZ#OTwwa3p_E7r6hUMkg|iiB|j5vf7B1 zoWEw~(Rj09b+lPZ@*Qc^5d0Qq@CPpYb3>rb$Z8|so+q5Ki%}+~syM*``!K1y4a%Ok zr7xqlTyY?YxhsXm$-=i(m;-W5i+E}ULzzy(hfJl->aGKT>Z)>d6=CWWb!S{Vhhd(; zldA>uEWtG~Gju$8VVTBXLyH>@1*Pb>&TThrHBkE6|J)ar+aXq)Qw;@^ficL02B>=b zQ{b`Y2<1e$A>CtOigC;e>dbFK_|_8CwX#jJi9rf|nr=LOR!S_T{na@dZb>R}(|LAh zMLRiSitO2~skQ@4MTm%}oEYZ!V6$b~Sq1XTOlBCO_X$l{WgRvr6&Ae0zKLlCXEG0Z zuHGr-Z(J+KU4PR{EqTVbG4$ckHKjaSM-^p{Z=qnF5mTzDgiVU_t?#l;X)LrINz$En z(!_io>&UDz{OpZ{4#`rWm38-kYTtJtBDMiJVf!<3{gplV9)X3nfKn`Yek?~Cl`oDE zFSSTvjsxi8k1_rsQv8S==&f?kBbLotyk0l&GlEPo>!55+kxV*NI+pPq$JAWjI(6u4 zlx*z87l)~-UWe@(q~0Hv$m--&BBm`kZ&LZA1yRN_P&oX~5I1N+$BGoLc}mj^K824x ziR1mfdA1zr$O;Yvrpj7Grc&TCJU-`wj}*OM00cz!BL69o3&|cSM3){K1d-k!y5u=s zY>D z6SC-Na~bsQ2=Zwc%RioUl=*#Kl=&gSO1wj&-Q}DJMbIhx++ZE$KBS-~>|HrSWjB{x zcJ6J3m-Ryqr2yas+cbRmq!zxSE!fX3CJ+a@V2)q~q27?^FX@ID@^2ZKx9Vv?U13)| zx?7noN&FF<-Jdo1kXh9Nr|L8tw)gJRj-T=qDrexhhXD-%n=OVY4dv+l`LTxhCi=LF zQh6?rbL&ir1Tt8YjHwI9$_2eY%i7w|yF)%puL_UhwN8+k5wnEzFq2j+PK+uPj z9vvJ8!CO%bS)wkRsHo$z}FFIYQy${(EMtPL{^s?2xDnb)nBC^#CZM%~H=ti9| z*Iq?;uEL$vZbHF>R=K;NJL;}4^ah9E2H&N=;yhlk=qox~?d%K8LaTkHG3#3gARgRd zccpe!I>G#r0Mgq`5huye{JF|6E?hL#g{dT4ak9kj!J#>7ua7T!wjF`Dd!Ge1C^|%-KQ9_&iH~#ZcYcjXN)9#yI#6TxL1f>y8NW6t0CK2fOcGgDgcq2`c=Qx-h9<$3)esTSt<>quR zhn!a_aU7j&kz-A1qP;kdln~2u&avc$qHk(?01>M?lHRMh<&H>Hm)b52ZKlj?oHHn~#F5aZ{>Gd?cmV`#$X z>SG$xXNgpv)VY^#((Q)m0$8D~cE7a}{$z#> zQq6g^iQDRyeFvoKuWzL99wdWlv?vW0AK31${T0DxXTA;&=9~nZkXZ9XZrD~5JZN!) zO%6?%asH=LI_AFN?a~YRwJ6>DEv=la`$xn!mEef2VHS@P#cs|P@^Bp_%%x^p7(&}+ z+@r}&JMBcyr?pA_DdY@OP?KpGm=QLj=p1?_ZLI4d1ur)2cgnYH(Z$VO^W@604F~4e z?X5S!Qg`q2883HP&La>*Nz?UWaZ~cNQ438BBt1tiDizy980Ag+0$gJ8z zWTak_Yz$iSAj{=6_iNzZBPc2J*(8I42`sOPc-6zsnuT~>XGaSkf9zh7McY+;+*d^- ze;d!xuW5YxIoz?bu3G}|_yEumDi(u4K5I|LIY;s zl+6T<{B_I-B~1)6G6>DH$~0+wO0NCH9k^_f0oubhe`4rE_-b4cUeu=p3}z1a~G z;EJhW8B##&L5YDL<;(9N8GD%^#6sS%td20McX6eVHXtWc%Bl?(C)GGbEX$PVGp{53 zwuGnoxa97&|4;u_D(jfUpKNsW6k{8ez^St7gL*>j;e+c3q09lztcU}t(J+;dm;M5g zPDziJehuj;pWfd*(rIbyyKs(nCX-v>M+F#_#lL0z#J2U!P8E-sRt~cZ1mrWW4-l#g zdTV@&8#yDAI3m(DGvzAJ$<_)ATUFJIj&$t&#}9YAOPlfb7L=~8B# zXw#`Q`Yo)@d0)DCdAAkbhY`aWCf?#-vw|WA*v7e&+`@kEyHt&Gz-2q_J*I&=j|+_e zDG9c=F_188ZLz05{NHN(Uo|TWk^1-lH8Td0ed`$sVy>%{Wrjhw+kk;;OYq1>>d#*2 z3Rja9@#5&qpay~xQh|Cwt z3Z1X<65cdANF>WgcvD#^;7BX{jiR!1F^ycrL`01YUS5=1E>-M(s%5zEnUU=q3YfHVGs>Xf%`++d$Tlkq?vSN zov({X_?~!Xjq6GM_f$lr{IGcMb3ZLr74JpZG<9lxK85RA&+li=wYbfaaPe)#K>4~u zHtH$Wb?dZhBrp0^{|*JeT@Fg-BYnqq(miPwk{K=Atv(NTd19Qi8H*NOUTrc>ev#uD z&r;uKw;OCO0VPShTEHIeAnnsQ!~^`~$CtszS*a&4zxU2-w%a$i@~ddOo0 zS?L9Mgo~uI53o=;q%$H%Y|;#V!n)KWQjM2Z6r);4g8;)~aDt;9T7t~lKZW)YtwfBe zgMMpl>HDeI6pDDd*@g5vo7k*929LM`q(P&rP6f|enYGt4d_>^7R=d3sBemM9jx$aKbKUjlo&96ig#`CKTJd0fE&Z@YAOstF!A5!oSOo7@6x{FT? zVpiW6g0YvUhrsgdI@9v+t~S1x(vD;cp8T`<534u+>~fFWR$z{6R)7y?_!6*(U%H?xCBhIMVg)7 z0W-)S<9AVXtNoaa>W%ZBU?Qeada=h^DV>*i=(qoRtcqTh4NmA7Jip* zA&grq$}qG&05mWFlGh5c%FO~=Xlc&j4%b0rI33-N$fa_`(5pKN&W&kIPsZ9#wJ9~j zzimXX7C$^Z*?ghwNB>t{@^6l~f!}&Q$SCcs(@Y~8Q!|Jl!=Zgz$OHFJlvsPzgYdk$ zqA_OdHPHa|boY&J?e6v%Yxbc+onMyKnNqtrhFL!?{x2UAn3@LS`BDGqCU5>KYqJb$ zk5HC`!iK{x;IgzNGei5ViA3R7v5}d=tckHzV~fVfxB$B(Ej55mEUf52!Z@}dtml-= zLWZ;-6J!oyawHa98bC#O=*T-(OeN!+<^vbQPw#*==|mt>U*>FOmZMkwQI(%0pWNP{ zue~tJI2&!$lPa;t2!+E2urrK$712p+OKV$e!gO3x1w$nn7{2hr=Wak#MT*O-v{UJRj{CMLeEGai*y6j}U*0U=NPK zt*59PMNVqYR#i}qbXLk=(h+gNHuf$e=<_W?=9I3Iipcn$q;`zp zt)+cmsVrEfPuBd7zeWj`?ACeQh?*YcPkXn3A+dL=xEz=6od>bovj4mhmL%_*hj-%_ zQ_5V`kT>NgQbSmXxrNbmFd;l#;-xmz{$O#e^+q4v-W1ctN?G|M%j9O;1E)*CnB%^C zIRS6sa&<;C-C{Ccl$2`s*ARS2m)ZdhYeUpVxn~vLLaAelTSpAU<&%Z}TM1#J(IC_z zfw|u%3+uGz35O0ENxwVTDoZ-!)uNnrU;6*`A2*Q|FiDy`RwiuDDf>v_>O=%-K4G86 z7uW0Ebcnr&d0nnmwch+HrAFe0i!v-sQ}!s;jcJ)IMb!I})CZR(=lxZD{tZebF%}%!)kx#| z{cqW_h62`7Ymo)2dlIJuAsXV0)j|eH&)bsV%;7d|;pf3VslF#Ic=JUX$0ogVb|#ru z4}Xv2pxi(H>Huf?dWyBUDi+z&ObJ*4?C2u`br^Bx@sU;u3C z8pOckeryXq#g1a$3(gQch}=*h7m>GBcTM9F9}<#gMG;{6`3pWX+bti9sk+0mOB<@l zXLBhvVZkJ$f7cvmN`t7?NJz>0!18rU@l8ssDt9vT@d1z*>?qG-0ta)K z3#}N%(ts+<*J~nC(s3rQu1GvJeW(vhDK}&XZf>LN?o21Hkao02^^`_$+5D=3zxl3t z3kHRA`}%KQo)C0V{&LxBTj*O?1lt<-XeP#*Zc48O-64E# zVAr)PWc6jjKL&f~g>`Vn2*zWP3|i5G81vt|%{zkE5%?13FC)5v*FE-|6l zwr|oxMv2opuA^#lrj$#~F`L%`&2)Z+Gcv(>qrSq`Rqk`h`P~lTyF{{y`xL&hED{ED zS@2zN@^geoH{i&DG*7wKQ#N{8{W0%NgDq#W<~J<&cWQ`CMq@^F1mllX3jN=lk5fwh zP3{RT<_PLY`>-{glm8bg(4>a7)YbcP?>4$|C$3c0W{WGYfE0H7&YN!M+^m-yP8M@2 zUTb-1aud;=1@&vP1X5eD9hX0ubsvgtj07SQt>sYJZ;bzO+W3#+uw)133U!SQFo!2It(x3m|bVDK9Y*$gf z=d(}vU5a^JR$XGI);PjdDn`t;xW+hMDd9$Y4czTmB_h5?#~+WIZF~EktLbqPEM=;M z6J>pAErwF-oDO=W6nC%FXQcQ7i1Juv*|F~Lqh&pTQ~wn40xMN%kFW*XSx=`LlJb= z2(bTU!jKrDHE~L}qgIxkB=v@8uxYWz*PG$trP*m!DY$(2N)?F@D8fMC2wagt`&NZ* z^F*gM@GTnSS#C z(~GF?z5~C(X`L2!;15(ggN+BP^EN_2S^aec@DKkQ^hPQ9y@CTqhT)dC0M#SWz`Y`~ z8$Ocw9klfM>13nV2k)qU*L;{nBO??jclS+@xCv`1w1IxxmSz?fL*?u`ujLB7d)-_c z{j~QtI?XH!MO=HKVano@aI0{6gS65x9aZ2vU=As@fWlXVfvKj+F#S!4mc_hqi zwyljf7dzz{JyPt4HWS)aBU)|aUIoP!cytDrn+1bkTgs4T~vm{ zvs)Nuf8qoi^M>d+p{B(ZM?umau)?jN)UIwAB_t~elS(=;`WXsr<1u>lZx-5w8cuZ1 z9Ah=N_W>Zgnl-e-D2M_ePpAsJY^?QH_!8qFnb2;0CpR1W;{8kqF6}+`8Fcst2#yG6 z6xM@7`LL@GPzyck{%c=Z&V^u|VUJRhzKDWs*#=X*hFbCSn4wi;-?HmquW!SM6_=Cn z$>s_>iOpYSMf8NL7_$zhxb>Dwp{R(H6Tl$8s#U5cBMLp2ggcD&gbz_v9S;zN>m5@= zC$^r*zQB8`yC72G;^xSo$Z9*z;PNq<-Sm&)WTrARb7Pii-C9ss_d$=6r=Ao;#1fq5 z2SE@opX}ev7`Jx6%!0;ZEhdSuB;txbOVplHIvd^sz3F~~^KMu*)1y*gDUvR-fCw~! z>9_MZqfxdAf=W7QheN?4udOgkgSGq&4g}PNX7stgxP8{6w&@L4G|8pD^mIy5glKh8 zMcOk3OAca&$*i&T(qhnxe9c&+w#*T%HLV~dZpBvAsE{OWwdnPz3QVzmGw!wXm~o-h zqIeM}7+i1|q5_WV0@wiaDIVnNZ?Ilu6vgrLDJsg~*dYdE@C6~QXc>2b&`l)k^-oiW0e}>Go%nfT31DdB2xVQp2;D0@?J(VB}5>$q1#o2 zVPV+zdWut;!>uCsR+4!0^Ch_9`9OZl6wl*XYVMD+s<|e9SrI!_Q6Ta6-}Tdo^9*rF z`@`Z}?jGTj?EOT;YfX)XRnxVfI1n{xn!(vcM%ichv{(@@#0w*Zke7ew(4h?z= zx`R$pLu%%NYGysw4`R?%cg};M78$l8ekekzu+t3OUH`fFOpj~S($-p#FtCy8+K8z8-kXH5|PB_27 zXT|U0$t5>i(zIex`=q*gCd`g}!eAjCQ(6wLfv*~`o!0qSqx=?Q+M`k#j031iRC);r}!yoGCP7+*<`hw zem0gjn2+MJOo0O_|74-P?ba2pM1{%L{{P*31Cwcih-dCG+?`9BZPhw6STY-gO;B*t zIi-oNURa`#$2pPr9k`}jTQQUlvNjIOf3k{LM@LpSV#?Mm8h5H>(TIU*50!deXohd8EaJs+6(rM#CjoZCI z9S<+TSB!rl!>VpNIb8~JWr&B7#U+?HsW72R-06jp-+K|Q&p!7sqDzX-KvuJb(Alv3 zUygb<-Oi4iYX_IFE-H)>5s2)#k$pw2R9TkwCm<*sqkqs^mY&40`!OOBI{kDU&yUJ! zHg7`C2LaJL?)f*fL}QEm(7q+x_^IbPnKZw^_yQ8fn;zlpJ*uplVYvEaG1bVot2Q{i z7d&nJC@A_GPC4J_VCf12t6(P@vLzKP7k^L%(t0D1rQTI&U=8SbDq1`X6XyA~eA2|5 zc#lMc)Wh$ya;l@`0_e?CdFpWVPuWIMzC^Zvg^oZ`Km3&=apAmT85}Aa2cNVwDZ#-l zcLT^8J^e7KhT#b$$rBq>!*J>5h`LwIE`v=z5{Y{`W;_7fUEp-Xhv3Bzo>##Jp&pS+uj&IxT5H)Wb?x9j zV&aS5Wf;YmW!U3uE|y*@Vr!1b^3R!rH}e7gIiQ|K=~>-&x-Ett2yL@OGaLZ<1O=PW zB`G)aLDT6&1b3O`PuU2ggxoW^^_;1>dSI!P7z8S>A%9^ z|GmK}77oLt?mCh!%YwBA$s2*oe91`#Yegp|>_mB#I>O>bZ6$klgWpIh|^Yu7nGPf{E_M^SIZ?coB}y7A3pJHxsFUvysfzCQy4G$)U}SK`+Cr3Rd}SDU(Fr$srcj& zmQEd{VTbG*c*eE-%e3`Dp5;N01;hW!s2ysFJYPG%{?9GtWNQAuB(IN)AM6Z1Yw!xS z<36oVWDPXrj4rwr+wH^-0c%#i|C0rfn%-Pzn0* z9y7)~8POyWu^*dlsDL&AQ}4lv2hjViV%U6R31oR$;7s@HFkuBqghT zWuUGzuir-^U@a~oeuriv2R7x4Hn`1Nuf(pTh4sOsJm5U^aiMZwI z=6ndo9}6!U>d_yCn8)>aGLlmg(dcoOJZF8<%S+f?%0V+1nhaE2R`Oa}Bc>(jp9>A@ zH3-RICN61)c zhqxm*C3Oo+@(QxO7px?b{F zMHXfKp_B3_=}F&6(W`hspafr-PaGL=o! zl^%_rF*qUp*io2>NubImXf1x5theBP$1 z-}%LtMg!1$PS?$+=+pA?cYOJUXfIvc4cCDf6FF2PQVOy(61ce}r358WYE~*E(nbKy z@5WD5Nx~Gxp%k}xrZcuIt(7hAXXQ49v;@*0on<*7jtpXHb{*-8rj4d1_M2hGgEjXN z-h=0H{FM%3%F_9=i?j&7Pb=J_bl$DBT3_@0# zARWDo9S;8L_>A(Ka|W{^F>Zo0sp4pPG1g63D?BhaFAr#jQknE(F*CZl2w5&)hX4x` z0l`huaMNnsT~D{yG#`r`7ri)DAV``XYKE#p8VG<4gibMpTvoK=6xvm4Cg@7#rj@K~ zf$zsOW%ib+z`en?Np0%S)4T&nJKsZ%=msyX?vh&c!6EksOb&I@$t)L~&ZrGEv1#(G zVLh+DpIH(uwG= zO@D0Zouuw6>FXmTM5nP7w;pMsgOLR2RaO(&vH@j+KinONLfr}~6;zIngA1*zi`v^| zs`C7cJ51+3@}SW86#b1$k;EFPjb-sqM)cB$Zaf_v28aA8KRlb&muz}8pEGE}0=$;6 zq)52W2a{2Xj7rlQkfD8w*AoVbLrmTSY?Ra%2$< zVPptO$Y9b^rU9yO`H(HB-Wi&~ERlHDGg=bp27smU2dw z8A0{2(`|~g!TgpRj!4rhEBVb`>F9LAd>_eJc{QbK2~REnfA`iJ%WP8KCVaInlg z!@H1i6(je^G-)6!C+Q69F*}P|K(9WyB7MfWyVRe~sxwjrbdIebT;QA0t>UUl$YtWN z5`ddegCpKwqN`p#smRZwG?Z4tqe-Z9{GHvF2;wvDpT%-OhdfQ(95oDVMDN}c*kwP; zr_`^vmmJT2Ms+t%r zyTdE+EwQgPIHAJn`pM*x_fD|iyFJ)L(O0Ci#OZ34-ERgqLO#}2OH%}>T z-zxl#IxUIMLFo`u-ltO7)ScKQ3srI1Yk!7Pt*bC;x%+&*Vd1>pCRMj2%XdD#+4W?f z7ys~a^VYoHyu`BvY8(ART+L*qg$!Q6;w4q)F8K7(!f8K%v?H(zclM zZcXc+EUqUz7i0qk4~+r$pQ{{@7{Cr_`@D2pS@b!m1)%%d|3@V!A|;``L5cU}g6qfd z2!C;m>!V5HhBeI>lnAA|&1-KugGL5e^)55KV5oH_;!F&;G#*;mr>@QP5tU!k-@Z<0 zD5vC+yGIhyS_d^=W5i>~4N@=o)4ND!Yx33k*Z8byl!sh554Pe|jI7}B89IJFeKN)v z9&O0`f@y6nr>f`iTb?r1d!;^98S~rfN#1HDuVOfiY%B=wcRsf7O91x(TeS-5+^SBhu`sQ|IeV z1g&^xe|uOV4W@lP4WV|SvuGlzV)XI_X1Hr*MnEh*Wtcjc#Lm0e98F z1O_z?M40Rh}WGhGn?3(CFM90!ewg5u}&~Yp$MI$^cXF-7*tRFr4 z%?!B43atX4Ub7mosp>_0O)BKmMuy%BMCQf_^2w8VucV7&;^k?O!#_Sx#d)fEvXM&b zWM>oKU-$S%2tI%GxPM1_zW-87U*i+DcH3acqm~JJU$V%t((Jk$yWfP>KQ8yY8S81{ z?%Jd4*oh@Zk@tCfJkXJqMf9Dp9a!azl)N{dy7oOs9G{Y!s3_=K`)7q-#-8xiI77AO zgvLrjmolo71_VoC4-xuv*i`!HjMcx)TV^FUq?NW4XTl&BU3aDUpE>zj`||bpnYYPk z3w)_UPMlos&xQHE5$|Giv^H>KSEVI%zyMmgHdLPNR)?uyOp3B9<@_EG`G5EF*P1pY zJ3mPYl36~^G!T(uEbz&N;Lk^(hq|)A4qv+$dwMDpor~PCW=?*M%T$qbQ4c+*b6Yhp z>%~&NIxH=d38uDetrhOJ2;qfq*Q8>$$4)u%PokAe3=;G)cyO!+8n#He2&9*93RxNI zdSc=>1SJbrM6uHb=`axM+Q?H0EiwTK)jF*;vUBH}D7BP=F$VT&!1o%vE6vqpk|tMd z7&y{g*EX)B@^`i!?*~TSFxAn)orh~n$s*QZu#j#aUSCJ~%Wy)xLKq7U{o{e` z0BCx|ymJia+oVBYd|j0~X-WOk_A-GX*(7(>LB)GHi+J)J8GQxQ((PE< zSkSbsq|&9y=}q$cdG6a*qvd0v$Eb-^>eiTjs(;L|+Dkr`)0dL3zPaAhH2B!KGB8!3 z=+ZZYXkpeUxxKQL7u$!MTVYPnutWM#w5MY(i$R|fv|Rv`GPql6t@X@M6vnS-eJ>}$ zN%%?$WUS~)tPo5!2;Vay+mkP$@Vq5Hk{*~YgVZPnV&`wO12vcaCq=HZeHy4LU#jpns zly6c{u|?1$*+eU*svK3U?Na@eFAm)IbLuhn$b%$E_@X+hf<*=ieN4qe_jeP1(Rj0R!Y@q zHgHUKYiT;Z@8_o-VK^=P_dC5|)yLJ%9D6c1DMHKjNeX8;lI^e`Hv&;K6U;$BD=aNA z+#9PuVu&x&x9RuJ4w{H^-aXg2&!FC4&{a>DG&^6+nMNjFR+{ejTRO+M>{gB9eEND% z%Uil;K1#8_EQ^xd0=!R6zu2~{Uh6*J`@hC@ZOLmcFLXOG{wSvM9+72yt)d`7Qxg39RSR7q|k_w^NOtye{<5_VxCi<&x zTL7&gPrIhwd`SS0#7LbYI;8f-8g$v`H|wG~2Aig3tR&3;nScS1B^r?CGGg+aZ{@u$ z6=E-AbvP74cVSE!VoTa?@6z1+o4_B1nEa{O(h_}-OA_ca6i2^m0;KGzszAZH^#_;M1TWdnI|WLlM*@ymK9O z-S<2{9=F6Um}U(bPh;<`X?XY?V?#y8L~IMtx+NfSs{rWylwchNuZj4jIz4eqKa^Qr zVOZr($-^U8v7o;-=PS{vZI+}GEPi_|*67O-0Vk}Jysq>7I55bej*+eM0|2bDYC2ID zQMM4|=-u3YazFTUNWZ1MqEg}=yyFnLgsUQ#Q3tgmrI%TB%%Pbb?*o2-y)B_e-+GD z=l(tNK2DdLBeWew^{03^CMUdjVksW>hZVT+O6$ifBcX#m7%Q3NTHMgDb`li{h8KP_o1cL{3r2cLL?s^D3PL2ITRwGrsb08Sx~t(uv3= zLb3|2hA7L2;?ns9I%hmrKR>l-G0XAv%^(_H>bbj`nijlXO1>XF4WL*)+I3#x;uXxV zz^=bDNv2Xm6`JtFqr3Jh+6PHo2uMyW%*|PS@!04%jb?A=Eu5WszxKS(+*sWvGMTk7 zJ1vKb`3QV`jnRMmE9`7eTjSny0CnGW@lL}6V7#mhQVoQLgjY)e*z!dVduCNjI_I}l z5Q_F-nD~A5W8^>;9d*s<)o?i00_c%#qwP3^8Ox1g!ot0W35OLd&iiQW4I2l(1pntp z{%49cvXwC+fG8@nb8El3R2(tfVt#o}wLKVLyDwApGfQWG&_L_Xv($LxaMyO+_S6~s zW`Cal{ag@H-R0aDQD1wH_c)=~h6^!SniwL#rI8|nFgO7@5~H6z%~mt{F?-iMVJr~I zg)Up)jkb}lXJgHj|GAza9_WD{m<3R4=-Q`1M6^StQ2GjS*QHht`pc|*0&C8mfT;Z? zNv50Cv`!wXh2Ok!L%67Q13ABzuwR3_`dcsy@z5vi0lYsrefYLm?h;a&@RoFiM$smX zWw3cOQj^a8QYxKg#x(a{m;2R}Whe-@LXm+dlYrlOT1IouKW<-r1p<8^xbGi1gK4DxX(x$R^vB?XtFUw-p%62j4mr!*Gte%`B>Ay zo*2kf^gr?#x|ND^T9?xL)dyTZkZKW^`IHnR9||Si73Bs*2KK@RSOBzKs1iD8xV@b{ zkMMDRs&>>~ZoswAM^U5 zSiD{q4UwLbyDYG;@R3elnv21ED)p3D>=4?YE`)O?=qe;^S=qialbE73k>KE9yvGAR z5k|&|<8zhKe28NvmlIxFc%=|yegOe~YKD}kA4MYbrNjUSUAWsR{*T6H8G;70(S|GK z{fQ)Oyq!4nefO`EAB(iU{^%6#`rQtcY2OK5>s7kdBG=B#EX1AxglK+sa^*nyUYa{* zw6*dU8KcG{-9#M5^T}jh?<6DF((8qAl#thzp}z5xDuy*Js>=B&I}<2kj>2mrim83l zˋZS$ANf?~+&TJxQch0nC_9q9#A`z7S_mQ!A8v9a<33NvkT-lgFE!`vMn)#<~IG1{P#%#Bt zHscQ42j!KCEbhK#bMhzb7s@pO?uY74&Hq7{{!OJkuauieO3S0k)E8Qzn0vTP*Uz{g zF|#*lK2wOG1FrYaT!!1A_rIJubvIWqKC|Yi!qWDNb5l3#sPd|!o`lL5tu*pJqCcs8 z-k*VU2Guq=OrjQwt1Pn885X933UWcijk~-pFKsK7j3A=$_y#8N94+(SDW5+3&gXTxq8mA#F{@$>oD9E%zpQkJH zFP_=#`v#{%AP#82`Bp2DQP06bh&w2bX(s6W8MMGq$#u-le5E8$Q;?>GXMR*{W7I

    9AiVnVZZTm={k$@We{_=2TuK1QT``pWd^5ZN z4OrDt##t5QV43x4HM$_!)}(=gzEJDDZeWK?$t$&h;gNG(1ru8qGBP?^I)zv-6=@cV zd4HQI)NHWD*RF=>fR~=~os-q&@i&zmbn&!lzHKiED*mZY>dQ-=vKKh-ktizisy$0f zU+M)#J278CS=UL=D$~bp(@h`e>DOH{3^>e|*m2!hAObeh&Etb*ihf`^S+m3WDnmf* zM{yjkJHW@G=)j3v5HvnJKR?O?!KQ+nTG&4yq@y})MKhZ9HAD5YS1LMiz(%@V?~x-H zYbK4C4HEWZlRHr?-k1vS}-GZfBt|>lp3Hp)~%7z3%ygIIbw&EnT1h~x%JJeD=c#G zez*Nx%sZ8Ae9#&5BMbYr{(Uinu;aA*fZFywkECPgSHPO1&ng%95WMoqy7xRgf)3$- zuc^B~{HzsFBje3sqv>d#LeFb7yL2n(_ir-qUc#Ej1N|$E=e3KsO|E-7Sx@T(VTa53 zu8*YW2Hdx~jct67(jQp|J!+oMXH)8aud;FKI(nm^9Di{>?=j%sLc0pjl^1cuAHst6 zxC3V{5OJM}T{QCFB-?;ync6GNi;NxxYHtY)WuI(Qk30)~W!{7mcfJ>b4>al0P*V-$^DPIRDkdA#Aa>@WWkI4E}Dj zlO&2N?Or$*Xh=;9&Sddv61Any5cWq>Ukfp*v?yq(qBjrTQ5p$!h~9Cm{&c4z0153> zTEe%zd@8^e32BD~*&cLoSJf&^X9h3r8V@0XKO4NQqLLk^%<$u9GFA{PmcOY-a>?Y5 zv@n;U@~~`@Tcr40ik?S7v5oIuhM{d!9(>3jtl<{pXjNckqhd>yffPqMF9Lxy7%Y;M zCVxfSq3IsYirR~N8wk`lS9bEMx^%8OQ-$Hk%gfKLG~r>Wv`1P>KU3zf2*y*Mq&UV0 z9T(EUb&=J`8GK$@R@q9wL@E^P;V-78HT6V2|MR!e+ks#&L~fS*uH@l-R=B96U{`U2 ztEmuAwXX6DMe__uXx$NvafkT||60f+qQcVeaiJ?B9Li#c*hYahi)N#akDU^0Fx|>? z9#3yI}C_ zar*((KPfS!EzB_5&+|}ya+)B?bS?SDn;5Pw;v_65{RReR#fTAduxm z5I%;lKpN-9{gkgL0houHVwfvGvwpE6Q^Cw5RHV-e?nzB4W-Z8-Mx-TX0z_?%YSJk7 z^OOeHyWKfYu#&Lxlu+HHym$UcCc5cj>JqX!AW^5U{|_ogDohsojL-&0Kz54#QPR`zv{E- zq}S)H{%Nv;2eens*GA&cX73*&a}oQ4(lg79^&=U@%Gnid1g<=Gwp>hZbiJ+!DEIqo zKb2IhA55R+oWyj#+F^sv)U+OAugE_NlSnyybU#W#@M^OTIC9zq8b$F& zv4YE`f{o~%BCK;MoW4#uKtR(s|GXms**&9f4ojflQ`7}u%j3LH^{1i3;V@pA>O?0*i21}~GKJ?CJ> zq-P`MW}W#CFomenF$LOG+&gcI%(6+>H8l&6!i>QSLC7ko_67o5_t?UKyKvoJ)4W30 zJCav}y#bZS!$?hsP{g!P%C!Z|X5Oqq+2t0sf8>$s4He*7iV+>lJlqI0edr{*cCtqy z4qO7|O#CJnW9En0$i<^fca8gH8S!lJM?!{$(+eL(OZEHJrk^`zDGGiZe=Yo`PlHSs z@i(&*wIX|$5>#FzN}JjULRW4z$<0K3Nmr%BKM!3#gH^A*ZxNZvf|f4A)w;2Vw6raj zLi%Gov`W~0=Od=0loqs~?s=m{W$_$mj(_6lV6=*PJcJKw{qe47mEd?-rs$jSdJE23 zDiMC=F=vjg0m;Uk00vCpY(YjEFKNqXM_axj4=jT+lktmqq+_b zU;j~#|ELj2_$)~H5W}bGo^F{vYqGs}Y3+)bc&h%plZCdJrs^`TuDf#gW!sO6bi=o4 zi?ct76FICf`YuzC_u*l}qn=Q7HPz!N&o=|F5jQk1Q*qS?&pGpIDL8Opn=+b4M)+Bc zjx!}m?I7Ipc)fMQGEM8E&jtQ#K-=4k8{vZvx4N5Cs%#_^B_|qiz^*|Cg*)*Sj9}0_ z7mBZ(Y{r<67ORy29mXd_8ohGOx0L;!*^Ba2ECEv*3>9SLdGY9ShT+2i|%WAqr<6&WBd@Wc)mtbLbBYXkSC(da5TfHG&zC$ zz)Ee@IzO}c=}Vd&Q$(3D2BtuHyj+j2lq@2IVcJO6KgK>$Vk~Y`6CpzJfl936Vk7S5 z7~4&Otas`S4a;NW-|zN=c<=IF5mdg!PFtNTL>$!S@C5TeLGH|~9o1Ev>2hFM3OKqr zQtkwGe-qi^5HV&jRZa5Dh3l%zLcn^LSMw}FfuYuw?0=r}aH{vT_ERR&`GTNabakvo z(IgH-Iwl*LPWGrFv%aYC0-P`Iau`B5Yb+v$4J}S$KUAzE`9jfcEDXotBebe_QmVyi z&xXs+*v8vrZ?@{xsP4SsWhqH6z+4shx?7WYcl2(R^A&3H2l5(yHJs4FDSK60+t7KZ zbJ#0U-}HEPhkl#A-^@m!f>&Y1eoi$rSQ{2-;x({R(};Z1vG%rW zVgfu{>XHYGi)UliJ9N@$k<)IpLAGUH{`{ng7^*`Kn zTgj36eI<4A2J|c^IdL#T`4{Pf|1+wFZmhAGj*~Sq`oZP01u6q z<2YfWUy;*2y_1@G#4DL*Upjeu{rEmsJEI8-yH)X$VZE95k6p#m^^#1<^q)-w)1#G- zYF7-*qyiHEKlTH_h%vY+=zH)cbfCoT-nCcNRLFR{pp62tXK_w^>t|JcQ$qLd!7J+XYUioXvjk+MiHCSZ9c`WCVPI+-w~IlTZ$$1JlF* z6yVFwhMNG#a{42)l-DSGAh3Gt9G1D<+!yVi*mGsC9qtPDwa*Z$r09d?7J{IOR6dKZ ze!u31#*01-dV8k@BKNtWck&DW{&~w9MJDrWoW3U!co}$;LwY9>;?hSWqf23lSng>3JS-aA4F8x z=0dARDO((qLz!p{n3*=`M#*8&*+06uln9@qA!!XwG2dhEZ->VVrk(D5;gvd};nW2@ zSu^pD>Ykg)FK9+?e9f#X-kHDk^A=6)m`^*uCaqHmlHA*60T(grThqJqUy&&JmN#FlPl zm2j$Dq(cGYGgE);7pl~&S<};K?vA;3!V=Nqhp6dJ-@s0Dl0Qmf&8G5#2JoE2(($IJ zq;(g_+Jz=A)!I`8l(VpH>Sv2JTysDbT7)2n$DE~gUs#qbaoe3@50EnJKCTd&llcQoGT}l z`mY3%R#{l0*}|Nw@k1K#$#${~#|*ajwT>x=@1^vo+uQl7+)0DU4PYz=06k9J7bzk) z|HB?S#Qg+>w7FI1J9`fp@&X=7dL|V*_d1n7^zHo48(5_!H8mQ zmJ-pG^#qFSUGLCfV2;O!RDGK&90Ntu-)SuzADgB1KF3>p-CM?1QEXkNbI ziGVk5oRw%ko=$?xX!jfO#c@^hy!`A)?T-$;j6m*RN{ODdYFS1n?b=B?#c58Wa=CEG zoXEQCstWyv;U=x-g2Wv+7t7Tj*Ukss<|D#`ha{ANaD(%9NV~u(iM_{h|Le;+UGmu% zC#o1_ART4+3AL#|4%EUB1zAp#A_VzknVhwzKoHq5{yZKAJrZxb#0_X0PNu8{CES{* z<(kaz04!*MuDtOiZRq++V>z!M77-X;*Oi_YbfVkkS>tkkd!a3x!^p^3+!LB$;(2J_ zjnx}*+Ua}%c2dbIyPo}U3_c|c2t^5 zxKb#e!R5MkweWmoZYmy8eyv4*1dvROxV{8ffywwFeM=+=&t4*i3n&n1Aza^^ysXu%SG zFo3P1{1Nw4x-^{yz#EEtG3wOGg?;OcZF3OE&L$);x1YE0k!4(e-6P`ccWp(`B;IHE%tKQx#X zyWEJlx0hM%)I8wIGifp?#S_IRAxPS6G4)6$zSc@VPrbVPSW68ng((Y;Fk0U z1kCGYDwVqSDq(y@^e#ytjmXv1*f84PcnxV~y&Z1$+z{dvmmI#0-XnR*oXfm!VrekZ zJaHrjM6bmR)w;6HM+Z}+u75)aOaGl0J-4$)WKKd85TsXK*fcpP^}|umGL5eC3K6Ta zjs_#P^{*ldM9;6Lk-B+3Qg3&eakP9|Cufb&D~WNHTB7AEW7?B6RKVl@?jkxuFiSs; zx<&w4DbFy9C&*GRnY*2c^mbfxu>16U)8fCA_y;J=3oll;A5JOyo!#%NOU<5Sn5_fd z@Ds!<0%kH1j_g7~(Z=hu#%|(}107LQ^M2!*;Ie&Jtpp8I{!C4)Oy#Ye*_8&Z#2&2h zU*#}3w?uCB1ZOaz!2{j%xO=zF!uzfS+tsbLj&SGp9&^+0E#v1uxZOy{qt0(wPA~N% zBnF8$kK3Gx)o}kkluZnQm`F;pRh1^JuOH~N$!DH>PV^$e>HBS5{jH#Lx{2U0loe;t zg9+iE!P^K$pGBs&4PQOwFl-UY}=D4C!lRUNgN#f~k`Il;XSMKxQ0m>`|xX zt3rP`D?B9a2vA6@Yx{}@TnC4xJaUp(Bboo8UK)VqvyBhg&90;cL^c3Q&e@WgQR@iy z@mT~H*V9qiCA2(W)$yH-c&K@))ZWJ$`+SuMH~m`aP%w;vEfGc|M2pmZk1ai{tL7hb z3S?eQE6l1TCMIcN=gZ5@$AATR(#?;`P%S9Z0&Q^?W%tHyHVb;N1`zQME@gPeX4HQE zwSvOL!wp_kEO{)@!8rm9xc_WiTg zzYykf@LQnzaK20JGY~0m34}t{u%r&F-K9d%Mco90`PZ1m)c$u`bWn^B0MB|~uX`{G zn1%(>-Na75z@%4Fo^)Qqwo_rJ`t?T<7q`iMM_Ru5>zw!AwrZ==Z6`dPR`0e=d%q=6 zz|*>RHpUgykYX94==x>2H|VNo<2A7A;+#u)tO3oFaK1x)W|1VfN3$TtfB#Yijeg*+hPeJ4JU<#P8q2`j4ZmEyoCW zmYT^*5bC*al2%P!x}nVM3@O=<}M%C$s}bh@ZAcr>6Xkdu>h@kN3i`N|lsiY`{0 zR`7GFE;WdW%2D9=7WA||T|sLE&za^;6FG%l;yIoAGBug6Li$CKAOF0gr~SmHtyv|| zT34;kM2YDTy-cu(b~wl~3-iEL#3J+;yQQAme(|?X@859`aX@qEe9{3EX+mGdv=sg_ z1(m_(qRg}I2ZWVhm*G42!Vi^q0yD2DXH@+m0>R?as`DXx)e7+&1W5rWEw_eu7PK?6 z$ORSpYaRkW9=um$WFslDR6pJNgt%8a{CRH5aIFaQk}Oa`iF;ugmi(Nvuy4|q2xgfQ z!yX9B#?`0WPtLX2p-#?LD9O53wN#IxO-|^Xk5n}Vrwkv^uN6EP5|#^DikhoId^hWW z=~6Zp+DW`NhI5YG#j(tYq%l8HE#g^|p`7!RJ4^cBxWxeUP7Zl8Vc@ni{mv6QJ6(J; zdQX!?ggI*{F?zhBFKb(vW=qbcJ#m@znl}K5O1BLTv@#%9i@9-Obk**%5fP5rKXaf; zBhygaci%|J@9fQ%N9V7AQllN`W19{+$>*9B9?hVzV2v*}p4WKGuxq3EX^MF&f83AFC6^P;_@>5_b$Hx8I4QvdLw2=fWR zuNhBsu`!SwkLaMPWvnrJ+L(5a0eh*%GUg!(I78i3{37e9`%1umWP+~U7~2&p9U7K@ zt7bblwf;T4C2i2F*0w{kTx&e<%VIl;;2qLz1C00^JCKE@83vuWNEx=%>XslrcJR~`u z`+O&7ygw2z;!oU759eiEtt%d}UhLlUafKF0UJoUg{aid1eTLcB^s2oE|K5&QY#h%U z^*r4%va7Gun>X-RLoxgJ4@Oq$e?vg({&({K%?rOW5&}d4RuFsk*Dvt>HReq=TvNxs z+Zq1G!OS}|S?9{lA z+bKTS^oLCYj0jDt*;cdLQGGH|Lq$wX^m|QGi65%ax#D5!eJGuP#I~<$Ce!2fEPTs3 z4R`XnKLcVgjlk2B+{mFfVr=lbhD;`sKUmDhhI~E!q|jGnzo%GM_UDhqXl#1!ll@)p zbj=hO-Emu}ex0XRT<4uI_8c~NZj;)MdT49fh+VcmY|-LUoIg6Z&kE&GID}T^TnPep zfqq(0KJ5TGla(dwIK@o0VV|UbZ*Nbs?y(B|-Pr&>)XcWQUC8^+3pTd4(14^Yy zty2Y<2r*p0J5itQ_tIgy^wWA6miqzJ^$z!0^be?-+PLL_o*qWE;rV<3;jv`7%L*KL zORdE1!&N)53KF2J7Y~3TjwK~NVifX$Ow{l1!+={0ony7fSq*LakYd#d_}kl;vst}q z9}z_;gSA0Tmp;-ry_=J8=5rmbuF{9l&Rbdkwwg-TzOHXRQxA#qvF&sH%6%$ozcH%o zcMo067AxtqYq?B>iHVivCbKx%rxcBmW?zKk@1mVzc>F>{bGh3jQD`#|IH;j%{~s7w znF8H7QI>SPNQj`8)ep(hzq-J#R=fYVu&ISAT@`VD5u>hH>UZ5364qBYxYtNE)@0`j zHK6N2;}1Ne9P9`VUEaH@PIcjbD$1w#83?Ay@lvjK;I>Uh< zj>Wh!M(l@-N36mB$H&jf23-DePUO0J3+PTlzO@j35dYAi@}G%*@j-nY&5pfr-|(Jb ztlV7~c)Lq%wtt6s{`I`B?bMi2!^V}Y$K5h`gvrPAAm+Iy<5X&NNh{cKdx4nDYgnzK zFyh_ll2@2AoA(<#TRo76Nx7STUqvXjA&(4FBFZ03xrW=EqBRUA{MzSph4pEMTJcHL z$vyvIgn|GjONaRDHX68=VwOH{wKmwyrjE484c#SkT4mQ^I$8e=i30C+?98n~KT4fZ zv8Lk*8pW6kh)cAG3d>3jLo}EhCe{{}Mv^WEro~8Qf49DwZkUk(O4F2r!Hv3Fsa^{)irZr(u~&KpZXS39N}kP{y1y{0 zP5lF}D8I+_`3ze`rF_fDU$CZ?KBLb}*f%S1jC|Ku!IjUanPa!=e_~e<@6=*bP5G5T zR~vh+TQ&=cKo@m&kM`WQ@rAR)MRo5Q_&sUCE92KM4$y>&OSBF{dPWr!Bm)lkdr07x zRDfSbvh1a;G=@@Vvt2at9S`2Ei1?~-0{frVIxR@?p(io$Yn3iH&rUq}ZBLFsvk>X0 zvE}QN0-6R*Z3-aj08BIQ1cYR4RG8MHBp_jA+3lSC<&hnXB6%WMhjz;fLCvCbqS!k- z6s_(W`SUl=4%pLN!}!+%8ChN@AA20@#ut)|#2NC*b+5nssBzBAGnfz*iq7@>gkSK0Fqiyh7gE0{144LpND@ z`JbSu`9^3x!+hbv$q?UP_#lUXd#uOfl34>U9v9PCFAMTP0ou&Y(7VcmhUYE>Mq=2r zq_H2_xSawubXS%(j%^uNJB6iK;^tq`-C@40j%tcvtmAFRe2$KpF^!Bbl@ZdBGmXp< z`@?}Bu>w7qOWya0_8J1ZkSX?x2AtjXp$C2|7u-tb)-5=e(I9N(ok}aas>K*n^;GDc z{P9CXjFu`DYXmq%c~xzbdsAGRSo+9j{ySpiM(fyK5K%dE*q~;SCNtw;C<3w9hUaYt zEAtyZ$Sgo5WAgzzbHYIm4!e}px!~OMlrW)g>?HW6(M28QSzrHE_El%Xm^Y!mtZ9Nt zvhATzfWiG1DEQqlx6_q;Jx=bVPE0RD3io%xpV>0AUXe{jh5q6;dv;@U^ngSlq9C|+2`{IfT?aq4 zP15tDTx|{aKh~Q69ml6J;{Ez9LM}(9v8clgnvqgau23ES-)Ak@{X!QdA>T zVkP#C%t`J4U724m7?W9rynr0Y3QN%3eb#RA>e0l~Z?(i9jD`*gX`9Gd#%#;1v{vdVqBOhlOx zkoW7VVfg_t^Sw=z`OPM;Q!PcM$YvJ7{~BaPok}kx8`MA8zVDTkEWQ%VUTKmXlFN1F ztxrTG9px^<~N-sq{v~vCol`JTfcEFRe_fq)0!MbB9;_DHGcZy^6T9o+`3R z9|W+zCf68t6<~fQLPO|7OFZ}{t%yH>Zvtuh3(IlA=%{|>`4|sXq3cRI0o__t0x3dm zLQ?``Ob{W$fU2eEQ16R-(h9%?LcV4el;9x6_9i^Or-k(Gsn)x zW_CHF0EKshJFQ9Imp4gUbzbDOvp8g-N8ND9JntjLfbIL8naG5Nz=a+D2LE)v#T}8t z?$4^W+)o6CuX;Ncpo?-hddKY9G@e)$;!(!GNxEUf2W_Pn9jtbBG7M_JH}(D>w4?=q zL_E@TA)HCcYdoEI0rblteX=u|Cg|moq!f0q&SizIr_+ugjf1 zVegfE4;_?gP?tvQCS~U^62IjoXiNba|DR7mC=1{CKw3kjzMK65nBWp~VXZ@_SZ`xPyg1pm;1LgDy>m)q3gEN6( z%*4nl{FZjx*tWsnXGQnrcv16h!+&|B>t6mo=lwB;7p9c|qI2YfqKnE0y5)EqMyuYo zr+eRupZqbzEGR!%WG#v6L=)BKmuQ@B^qw&2IBVv2K#N>?z3?~uqab!LM;$r0dm#Lt zTy-S-9-%7KV$qB+S>kMc5*vVaEGBmGp=6#mGu;&}ZrZ_WmsV=3=iQsN1vmzYq7R6Fz}mo1y-;7k&pT z|1{uj0zwau%zPPLEg#&++J)&rEdS1oqMuWNFHBtMKGh~VCv{D=^U9`qerS;DwVeNl zxSSKWE}wg|PKJnpG7l9R*4_EeCH=!AQFZ@#rx|s%Qr8~AFuW7u%298!CB+qdWtGp? zG)mFPAmFqe0T|$hXe3h9rp`Qa!g-4So9_a0f$ksQ4M!#+tY3K~9E)D;;wr4lYg@wq zkgPnG0N#eA{&-!XSoIzzg=#QxcjaPA)=onE>Eh5mxCkBG4bQZFc0M^5*1h|TAN>Pg zK&+1XcJ1~=y-v6+j*^w=&~K=)#7w`^Srkv<^W_N|d#eA`YJTc#>N+JpDM2Pdwn=@G zi9%=@K}AmdIGq~-HfOAPtx#Yfy!dmh0r?L-Xe`}q;ywH#!tIoVAGIi7LM;<)x-1Up zziO&T94l6pvG@kHqj7wp;Mr9v|l>uw%mpsORb>k;r z7zw6L9y`;*zeeciKNq@llzz9j8t0R%4W#`dcX}sXy@<6N?y>e1E?OPiRW>0H8;5TczUDgse;WHelaJVlPLMU8m~S$ z_eFvQ%%mpxp!HYsbyShBSg4Y)fCfzh09(T9!95T;j;7RzXNlclN^>V`cVmw#WRnyi z#;CZ(1&;3C3Mweo9?(h&zcjenhEwP0hf>){yf!UL=u9axLz})Zo93|rRKZJz{7D)B zLrT9YETH?%%%fA+*t-O2$u*{W|9?!q19xOmyS3dNCmnTcyJOo{#YT6~vF(msv2EM7 zZQHg}$(QFm=X~QG>lf4>wbx$jo^xK)NLDu(tU}E0oO#a~zCcxAQUW16DnKv{fZOC~ zcqI8VOZ;XsGQq=_X|4eaQ*Qx> zI0GG?Yipk)1LfzYHZEwFLs5iHpD$Nuvag+=pi89bPb(K-X4fa^!ujH;vZinPNH^5~ zwdE*NgzxOUvhA{#lJCSGUIcSN2fao)zA%_~-?#cA|6*9tbxewxw&N3=u+isp_cIR& z*@SU^Y}&-p@#Ur4r_{f!T&Z*E>bQKcsnNE6$%sostkmDKy7IZ=xrmjy+^c+C8jwEj+A8Yu`Z}LF2yj6#3@cZ{@+CM{U56bV+gjaBkfJ7zr!I80q5 ze9IARou{$$ZVu5$-_Q*}yz=|)GyM?zApHZ+e zY_z!g`39QwS4$$SuUjQuT#UDuwxE_H*8+`rcrxP+#pREntXp8^J@$NhELD2ZBR3cM z6*t~*w<^E2c%Z5n|}1Dil6u(1RByy4N*9bnNzp{k$z&S zW?DZD_k&~OPRxF^8;4=(PN$3>$55yZB?39a=9?oUg58=F`%$w@uDbK{lBVBuLBlny zBXA?rkx5>F&*TSTvzd_ZgE?96@+xADx$73+oTy1vkYGwXYoyi|c>Zt@f{_aL0eRB~E6pHO}N^%P+^>Y8dzDU$W zop^B(zhI`@?#>e=BR6bD+?@2c7E^mbot>*o^s+aKM*vC-Ub_seM-)Fn$pT`be8%Tx0b3L#cs&LmOydB5oUXSlnFeS1~q3133YcyB1^|bO- zo1&uDa}c`pOte_Ka}_esE*OdCA%woxNA9fW%k^@GP~^NUas*l0a$30HV?!ozpB4uX z)?tsAK&~z0IXjLE3rnRGHOu3)wd?3Ejy*;V8CP4bKw|&j&9{3)7R;Vtj+X{1An}mG zbVti}Ub3wrwM$PqE+bANP_8^ZxEEFUHc!6f`7+ID@i=(lCgi|*$QQ^h? zv$z+FmEw#Rebm79`0K^qGT9>qHFhjm8uHMhbNa=fs^5F1Yc_?lhsIFg0l5FBd?5&$ zK03XTH1|z9d$Y6vBbo;jHqSh5mja!pgfB@?wce7gPKlGCm%Weq&W|j8M@z|0(pEAD z`kK^E?~SB&u9P2f91LK#$+IV z?$uxX*);WD#$pc}ns0bV?)JL%MN+t^mH3FU`1B`y7YrV6ecbA@yz-jjIZuu98D4a9 z`ihV~I;ra+_Ad|dKT6@^VeP&zRMLM5HgV^{0`CHsZ;O^pw58tfJ{-&XUFTwt2Mk_| znYZzjtDm|){^31r9*Wm=|NTr@h=3XNjOOUa@Kp6`1lTSwuln^hH4#5GhNk)#2&PEA z>b-g#_V0f6cyAbFfyRd}zT8L*N07vuUI>edA7~!NPnUd;xtP35AGZuyP(D_DyV&%$ z1G%cS+B&AWT9Q8%-K}dZFpCp;4vti*38_U>ag;1yfAYpP$Nz4X-<(ZUee?(~&*dTSncII84>BzFTPc_kxO@JTrIAUcul zF~oK=LsaawMNZ!)gfPuhJ%CO;*e$xjAH0IjJ5DIwZzCz%?+EZuiavFuUU`YXe;$qP z^`rQcTBw3~IaUcRZYs5(sw(;9Sfs1WUYyR3D!cU%RqxmQEkUnNWa4a!YMw-jSQAM zb!XI2`MpYVM(jqPG?2=Nc<2A_hetDL#?4Q?yO(VhbYp9^-(mJoiFU+hCVD_&^XiQ72n4%V z{aq>GsCfC?HyFDQWD|iPI(TB#ZrCW_`J17+fm6(MeGM>o6K=awGh_I%+7P&%5SCG# zIv}T{8AT%Pyd(4JFzzDZFU(0hGZWHFuX)as$b{0QL9|HB1~P2h!s|(7ICEE{047Ph z0*uKVLTCnRUL4qW-Qa z;Xe6*Ty_;0L!&H%_bgkjw7Npn4dZI(Y5*C+v|4TNzbI9mKjC{*@*bmT))5~RXEV-Qdkt-rR z(WI`HwZw}pRKyIYYR#Lm{g!NH-Mu})n<3s58&F9n`c+(%ud$XZjCpL5&IpZK!+K{W z@F3phH%rA0Tj46@rFK`Q@Hb4Cx^!RjpQQwl1`6FV}vs7j3O*Ql{rBJcp= zRyv-M&m4hHle%iYimRi=0glCGHlCoh#SZI?jyrst2Dvoeym;hOhPO2JHJ{I^r}HoK zaMM!z>A~asuS~-ZeSXu8qvseadD-ZFZYlO3()q zi^qWUL(<*!%Tbm|mB+=ejgy~?_8jZBd3-OSNo#wb?|==aoMe8Vi==a`;u<<__7%1z z&ta|s>-Fl*g->6iH2%*(hLuY`kHT<4%#gkp{eSuHGe5G9fT8r)&c)xq+zDAIo4dt% z7ipcG&;P5hQ78Pn$CHZqxIj=mB3p%=8&{E4xpQNHil>0GYCW{HZ!w#^B4-uSD*_B~ zR|$|0Xvf%B<>Y*qJQ1KH9)h&CODLE&kOMg+&&kPJ|VpN>a4S&uZh)m_&NKdhh53XX&;L>;$b36X)Hi9A6201ZZtUVsD z%L!6GF#SHCnq2L>*WtW&*+<2modK4B91QM;A{GQM=OsHDraV2*8qs8tERO*$6m#Ef z_d=)fI_cX-rO52aDl`jNxGlElQ9n2~+x)xa;%dp6$OB#y|8$AfYlwgDP1_K9Y9d|R zRXLDZGw$zgrMr0wOP&1vHB*4kjxWb5Xuj$xPu% zhwxG*sCw8?E8mFRW>>OKm-q~SE9m@c>+m|*?{+7=R|1EdrMjRJKEZ@OAn(Ib!P&2H zrO3U+nGCY}b?l30*DP&Z=vl8gJE&|oX@rMruX5~{aE{B1@+3ce_}$gQI(OG;yo~Aj za7il_0>t`#p)7WP4>x15S_ifVZUD~B-9%7k#3*BZMhi%od1xrFP|fM}5Eo9JobIniD7t+YWl zih+nYWDWw`Ck;@8TWXv@DBsWV3oC(^izRYPg7L8S$6&c(;0EasU)n%n1og^lD8oZ2 ziG#;zN(#Mkcp}#tFQ<;f@EcB+UoA9uJHlX4WD;K62t<1E3-VRpT6g4gu_)hmB#go)^yV^A=WhW&1eK5_{gv z3PDxAls{E=GD&<-h)*+T*RwOqh`v_{QQD^S09gW^*$mn^nWGImY={Co+%)5oUo#CD zRA+yh(NF7WFt4eWw_M@}?*hc3nO66y0eV{ruMLM{#7SDas92e==Zkz2Oa#UiX>RPa zuX>YGUCf-U0sg-+N}nSPQKgyH$Ee8%y~U4B2h=xsW(|jg#ucgq>tpl|q|`4GKTi4x zUz)x4(mo;kCblE;q9VMuK6{WZ1{ko7@YSll-X3{Yq*7fj)~$RVc9YsV4yL?6WIWCZ z1zK};Fu65?NjI;rL%sqUY3r@8SWv}(dxbo)&=x^C6<_Hh>tLo~%Z*mI!RP$%E4?RKhSp=LO4&U-w+);exnct=cZ9gK5`{< zL*jgTM$ZBWG>nKnf;5qN4K*qd%is-fz=|GZ91iV(IppE73jAc7uwB{uCTM>}OF^qmXs%b3DULLfo876Nwk)ffwV{WkQ z62rda309}T&&$%jJLwjX?Zt`hF7k}$Cc6^Ap-}lJ4h9nM2Fi*tsX3HGLbiQX12bx< zjNX$0OFo3j@SzLl5wG0*zVfU(7GPyg+)8l`#CU<~bO|9fJN}bl%K)4;xarps?pf&G z({CZ^iSEY?y<#%|V(mlI`i6zzenSqazGI1VN1 z7~7T5rm+1s<57^G{5=CJJphI)LI~9ff(mz_JWpUJbQzf;msRllR60)1Ma8{lLsw-C z7eKFx97zsWw0c)2R9mjUPwAJ<3f@=M$kgmm!iDr$Ff%KjFeJG_ zss}q$^jA~5)Rcy#XbupC3d4O{3(bIKl10wHc%B6j{AME@vV|0qjVRn^!fk;9GpkCE z%6=*&(TGQ=ITj^3QPAHxSn_C%;#g5qS!g6u;)8!|7OM*KO1$BsoY;`j4mX zR)DWJ#Qq%bAms#IU!Pt%4R%9VJ1TQ)$#`H{+qGsDRMDmWj2`s=SOeOsAP(oguX|~G zPMM{M+n8}6MxhuM7abqgkQ_hm^-EX^9U+bMjkh1mh&iY=^m(5&tV)a!sq~wPhLkCg z{cUsaPu{Kw1ie3$XfoharVHs#0tvXy-w^SeUXjn4sSouR8Cg*4I~B1n1keDIXNp{X zC&{C;S*CqMzcG5}lK5szQmO)6-5=|+{zydKH!nK5RMkQAZlhq4<6J}$I;1o-{W;m= zlB`^7h~NvwDE9!q$C@Z-s%9V0p|%d7vQqNy zKvE%WdPl;L(u`4o8|2o1X>rwGEmhtsf8exW%M=BdVqn63hqJ~M1QIcFN94c{*LPa) z!{Xk&t2{D1?6Fnsnoh3(^LM(HLi$#8fCS)4>Psanb&igD3ZyHX0sc#3`vH_7Hn-vdeU9>`dff9k74pF^NlNeK+m8&!j%ggqM6J@Z~S> zQ9Q}nKkQfnYh^vzSHq^s4J+NyXEXFXqWbM3I*VSKLjgW1>PoQHEK%#J#d&&%R#HOwkjgtLSxKt|RLf6a&hB*apM z92C!l_6i-xd4b{sx7G6WRZFK%yk)P#43^};VDJX83yF0EJ2P*^^MVFj4iDqVbUrYdOtLi-@BOP{z$j)>JB582c2+d8i zdYt*4z`7nH`g}EwHXM!TJC(pQNRxJY4`emVTxwTT&He)2b zJIoa8fI~`c-6Z#1V9WCez=li>G;o>9<8lr$&@k3uO#MLLB@vXzQ}U$%xvZ4sKzMFg z=sc)YV6}35l)`GziFM_j(v{nI>3V;*!Z}VH8eDEy(Avtza#$F!dDV482jSv zpskawcPM@i&Z!ddb(t25VlZCE1CQ4ivNCwslFrV4XHEn;xT81|%Hk}L$%UAg#eQl| zc!ldKTj||)R)_M!Z6-e$QTQ536qUFQR)jAo!cV2T+gd17H4iF~SoG|9{GC#VPS}W; z6(;x^SSy9O!sK25053r~zxW0hLz~$$H<39J1peoA7K(1c3Oe|D5UWwH-yNkxu0k4B zU=DTk8UT^y@&mS59}idLyNo`aCgFrx8W3F6cUA5xc}3F-izojp#|cG_T^|o{vN=yL zSAPh`$hBDbwYrs#7EYkAO^?|C_1tfWRjaI#6u^&%JH}(fpl>P_0f2=6#peoPZMy4# zod1oJ9{$~Ao>~h4!ottGEzWcJTxa=%Es7FOcn>9uRt&kp(rL>K> zTfqcI<0KlwNK>tl0kTZmi{q(Iy*WnhyLE%=m2$ukM34Dg5Th^`d@O_{?>Hr~yvo0AlaRN2*$Mh!85wqG|M zQf`ZwN~ESb)M5deWqfELv>f;8eOzp#xHIQyPqFdYcyUh&}Yms?8t9&RXoRqmo&+$xv^N zm~3=Uis!0^&*uYBXQ-<66SV{2i3oC+Ntnd`g(CS|v?)RN?~|nB`;bGx!{w zS$%$h%9XQkjlFOs5cS_qF&QCr4VSz?+K2;rBtgN!7js$f#rOli?H5$l_twcNzBz&$ z<~>H3ya(z!9efF;=ASdKx$`x*zDUjUANv3T!_OPSt?DZ82X2oK^r^<8&jICgwkof< zj!P$-nlC|kWpQooe+H{oEH{Y+Pt5{$Fb>$IkCz)Z`meW3jJx%#NnN*u+0nq|mZS6o z1^KA&BM&zg{34!(Q?7{N8yk-)K5ZBstH*v&R0~y}2r4H{7SK!VY;0{0r*Z;sEnY`m zU1xYZ{1HrYh~@=Pu;^9KsuMO=^*=)Xke~MPT&|l{xetu#fXWi|ZFT=E)~gAF;an*b zd2uv|!#m+P-Y?VJW)_=ROa2ZI$$g97t6W<#SGt4Zw4s=_0hxKnDH+pIE=;A2>11@I zE;47mTIqt=<U$={f3qZWZF)n5gv<%*{>S@HURT@im1EiqJUT0{sGDNg+r0n^T|=@#m;e**E57||Bm#Sb6=>)jAnF=9N)_aS!(z%cvdQ%bB5!B zvr-QGhZkR09P;8miTMNyk1x|~6U4)-9jG$>iD)H2JT8iZK#swVJbCl?Zw8Bh6xs`{NW zB@z`+#d^ZTtb0r=;SRl1h*;9jbr=fh!uXL#b(XF(f3s>KT4_1{x;*^6GUYsHzmHux z`RyuPKUtFtX)MY&>a3W&f3n@t5(3Kn;D=kaF?7JU%ebzbcbk@X=Li#9ygFVR_4M5B?9**%AOz|3F$YWgc7N3TJk3-~yEnMZXAQST$?I-@#F zBz$jm1lQN5{=!RPVHFBcd8$Kc&FV$WUyTA`W zp)+kq{Po-!;`dGG9m=yfzkysEb{iCpQC``CNQGj;+`a5#{6=q8I}C2&eG3n5v!;ub zvGh7zv148SpU7~xR?@%2O2$b_CJ8wT98E2Xq34|G*&~frOOgJCGeTaZ?8u#DyVE*F-+-U+O6l7$)@7d zRm)`UljZp89zKeznQT7v~cam!@4oMwg{_)XTVfy#Q5`42CJ6HNP zBH4LWt{*b^?q&ZFEx?)LD?1*QD~~xkPNYr7O9}|I*7{*@h>FYw%r5S}@=1R<-tSE& zlO137KF9x~L}=*yba|c5Wi>4s1kARc>O?EpxZR!MaZ5jS{s)NC1lnsmr}Oz_Z{qkO zg%JM!l4pG#p6P3|*X!;4JKl6{>dLCTtGtdyKBWnWP1?<^%xd!Z_|TW$^+3x$bxV(N z(K5N9vM-AUTof?{$_3#h&y}Ue!mrQ4na_@Q^eU%eZtSk05Xi&h+ajA;ttZVX&sNa$ zEADw+)~Aa}{nydgdf9ij+3^=fi)RINT)A+e|>M#VJ@m6TsgVxDf!LZ>q z1VvAg6*bHdXdII(^|7I7i8!nlQl09;bZOoRXP>ItiBMKel!tocRhI=>KaTeGyRKC? zSIjYC7LHDcX>f#S&cDKc800|)@xyPdI+THMXD9^p)QRsnC3s;KqxP zzl__zh0vJnaL0qK;KPy`nPcsR9JV}1krcrYBjjumGN}=yEM(X;Etw5#c0(fnGACj~ zUZUiCv_sstQeUFp=m0c|WquZUhay^1oHV_r@1~x}9h{jZ%^x;I_|ae%8whaKlfhZ% zaG~%b(*<>~SMPvnI?#$R3dTp`R6Sgpq>!WCNf`zhxLH~aI7D-b`cn;c{A_HGU-iaR z7>2W&O{WqT``NP$&iDIgAhq#h&N!r_C@oDpitnj-NV7Q8MF9GPlr8HvI$V{0$jPVR z2#m(TZ$Lv0TH)>$NAF|PPq(KGp0%WsX|)9fxi4j!FU|fm#mB`_>euzJ4Yt!wxO+Xf z3_a*FnYxZVV?&Z8kvhs{Y@B3bG<6>W3mUn74cE%=~|6TxTchM7Re0;w9_5{#>y} zRi!^_bWHyn^EIYfFrF9@4>$Z5hR%{*!VFZhnfTEt4B5c02{=crogiFadN&wqV!$OP=;{o0%_>>R^Q z(rfUc^CR+HZOotu^b!{hf4@yObsZwBeNbaJTDR}KIjp|TCbf4P@tOzvDV!~S;dcuj zRU-aEBNEsjmsV)A8w%pu60^R0iuSm!7$XH2UL`a-ELjJ;ueO`zwQY4#{GSJmI_6tn zmt&_yknQ0>&`fgwAJn6$pNDc6iN@W8V8=>;eW-f%R9aTuByy-eDKygE6m(2;Gnx(f zsi%(nSM$zaS+nh<30$wb-j?t%^~y?Cx+6|{rer!fP zUIK5^1snMb_S_)h0ez!!KO~$%IQVU*Cppz5eL`*eTH$<&5{{H9!alY&Fe=Wr1AQE@w8m&azGKTmUOo%x|7Q% z8N(UmDKQ5bzAICdt03ZtT4|g+=4nKmt1G5r)jDl9L)9_g}Tw!pm}cDXtik92-~DUxX8yW)V_`_r{Sorw+_PBir1U zgYPXH@=wRjtI2=&rUCzkz7I+VP5l4v<}bsRGR60a5+?<~Sd4X!o8n!v0x4-f311L~ zta9;T*N$0!i$LD%D>|g)l}Y3Vq^gTI$`L2>yrtLQ#lQjtjMxJFp=i7td!&EniFRZ9 z(6o&hi%z9Yqc&FZnqQoWD%I+s8a+p=Hm=gtr9}A-Z*rq8UzE$~7*gl`Va2A8+a%gA z(}Ks_dxO3`Q@p6pQBkJh(7GL{(_u)L2uObmP<<#dnO=dVbPFWI>A0QW+yn{*N6zt< z6cnu7A5qTSCKL@0LbXkK{XIJw%B1O%@A|a>2%#J3rja{wOvSo@V5E~`);pO3WZ*lT zRUB2YRh~L*z3H6mV|YUSPbA{^gye5OJM(D1SC}-t!0_k~Md>D}$2?4%cml*=gazln zBunQba-GCtKc^t|FHUcv+`k&YS;pWv917*<4xYQb3}fJlL9S3RKpGLCk7uLS2g+VQ zEU4eY<&>Ka7?hL4%?%G=(qahJGdrAnZ%8MTF=*UuP5NwdNO9931Ra2+~Nuq%k zhItZ%hjg9lZH-Usx2%Y+zV?ce=487qrpckGtS&^q7zEuuU@!I~h1`$oR?2sXj-hgw z=bMeQFDyeT6|PanAWFHhh2NPSn_)muPl>`sM#!>$lCHXl~H(n1NW z*@Zk1QbEp~!p^=&rch)Dh=%Hl@)j@1q6Vg4;HE=N5c?mRC$_g6mz>htt)~|{!$^^G z$p{HV%yz(#XqraT_7vb2R%ut_n0{3CJ^vCZ8yqHDpzvji4n-&r6m8?6uu+XpzyZ`Z z#zH&5#Vh%z+g>Z_R_1@?vLzcxi)qM)YyHm2cToq8xrr(>M6y-WFti3KxlFgJeeVoc zU|ou3Jv6c7m7H@tQZ30L|b)Ooj*A!fh9iJm*MF8<&|gVwk$7u*mYluoul1NnSTH`c6YlmMZ}FAG9qp`=WoYn zx=V(W^Yv3nW88O5Pl)a)r<2LcjQ0d&44pYb(UAK2n)?O+0{@3bAtQxKI|$t26aDUN z`8&XQyI?NR-kM-uwSc*v$b2A9G?QEc_^5#>mU&v#sG`B4HcGO zdENn?Y^15S<<@KbeBUUm?xOzW_=JTOBt&#Ex+iXcg#r6G=PmhbpAkiT77qIzeiJ6L znk5|dH5wy;5e&9I7J~<7ka3*xzP_Zg^3?u>g_N1u)9C!m3g03X@GWhil<#0I(!N78R|BpR4WEDn)lOK`Ca`S}H!w^+PE*pD{a^?OZ~yF!HAq%0Bmpjf6}Ra{^Z1*a zH|yp0IZpSIN_rByVg}YdyR@;#`>dOZC*eMKu9M0%lLeOE4>)a}>|;A~y%UB((Kx1K zW(%O}-)H_SACG7qo?KY>03~QB2_Q5!yheEW5@DNItz-G`u+7=^Ov-#IsP?-(skBrg zI6^}UA#n;Lv5FU(Slpq|f1}ekY+^#hGGPMGyVTqNyKH08Y+uozw~$*S(4dOYfQGSC zsoA$wuOeL**DcI3lf)9}K8yN^e4_A0ElG*n+JeJDycc>Pbk9t@$y?Wh1>12+IG04z zPq-JyzTDRWeY0I#oqpdu2-=B`7dO|Z%cA`e^!s0CtJ>7@&t)3cG^f$Ry&W@`3msjd z;>^Qx0AL)0{mOyjtVToKSrc%R?a7BVYi#w&^QnnDxc8d=LCC#^;j^~OQ2+L+Gr4a~ z7&3m=?%{3fy~@Xa>c;jHb8$z&LwWmd^Csy6;Juo~*aP$W-ye6~t@Mqc=vy)`cOok< zOHiFK*g@8<^{?iEM%&EGjhBA~VJmRbmkH{XD`)zj@Ig`a{!k}gQzv){V5(^rZff&4 ziI{sz0{*$)PwdPi4!@(t2nu^+5}-r2l^|Tm0chmtNy04RU4w(-*Ml3jP}B_-U!_(K z;S>2C()MpCY43fz5~Ld&!|d8&fHL{-eoE9?}P7{WzDQ$7cnbN@Hz1J%5I@( zxU9p-T5PzJYRKUW8K%^IG4n~|Q`^a3JQLpOUs1YaT9uLd1#@-^TU1mA_ z@<)67E#RGXvh-ZMOo#S@r!^Sn{2Oi8);*lMh(#Xyo=fOjED7MY5Mrz5Tp_!2Vw&k< z5F0JRWMw1(I_)D3IMY<#+x(TtheC83$LP0%g2ln&j3F3u@ObzFgqz2nuo;(!4Z>@* zYqVw#NVEixyG1%me`>-ow3!TJ!@PahRc}VcU6(7L&)|PGsSu_2pF%>hHw_wVXc?*3Za`_x3(8!x&C+apM1D)hw#a`D0HdY$HFqJKx8 z^Q=o5l*n2XOOL)HwX#}I5PK`2`I_p0quwo$H;tvnWb*b4=R zSp7#acVtlw%tJAVWS;p=&7}(U*i@6 zS}D03IbBsb=PN)~R>OI>eZ!2HY&OQ7$M`Oxc|mIRnl+46f06<+8N>Pj=BRNop-yf6 z_8A#*6dPRXUt9b4epE&LNghJ1k|2yQ@GycL7WthT1&JH($e$hZnfXrF^GNP-PFdRz zF!Oe2i;P0K^w1hZ>5}j}g55q!cw=o$88LqdhXvTP(HGq(2rTC1q zSvSPxPxz}fB_cqI!{OKwkd9)AMp!MZzal@f1=2E$&pUm)8W{kmW!4)qkV_L3DriUQ zh>$upghPtpjRCkUnhQd*U6jD``n|F9Te&2|y5Lo9>$a#d{OZ{Csi;Fqi5q`HfLDgw zjU{P~{K*5Ge@7ni_YA9o25W}_h|q$ka3{JUQ^F?20FukZ>%}- z1Cx?F;Q^yBtVr?NB4N<4`Erk!;yidx*Vs5Ym)u=b_b^pkNB6qHKLT^}R3$ld75cHr z`Es(KjM77!P#=R-Sra1;i+s>#w;Wr**r2idOCwUjGlS0Y+<-RldcYQDz zW&kQyJPeUfgxadWNKIRU&OA@nUt}H>I>mnpk(KZe8%{LrTgJ{3Bk?SA8=Q+6QsGH& z^~-ho(AP>zjs%ZwE-@q;t*zdi(CY;wY&MLKMM{Hj?(Y>Zk2w;^D-$de%uD&3#-u$9 zqn?ZPU_sWoNk%jn^8^JgLB)zAeM1!r`*~C%fz>hlzw%i1oQT~~9&&P1jab*=f)E^Z z-psp6%93R&SnmU~E)|&-+LpXsQGM7%8wK)xSXD7$k8=no<|JJ484eyi;7R~!!&q5 zFAYhNtP9p%(lFL?6_(Ab%DldFwmih8tUU2AUtNPWu8{j*@H&1Ds@AC<;+~o82#EDhd^)TSG zA;u4yym|+`eGs}vZL~VAb)NBb4P1FgqTz^!w@ zp^ao!%$6ik=lI83i)GH)bIOCqg3Ouzp(gp7vep@w9TUd$Z&wc%*=8%Hl>bbi_vXs% zkpc$|O+;c%?`S?Ue$TITE!b}klDWj%bbAJjz)AOSN*-LKj3u3i{y;z4*M<=0^sT!+ zcTIGx?`!)}8OCqtgZR&eoeY{GQV92xPer>aYfD{oNi*dlp{w z?|)Y}DEFTu!4F(HJT9XrA{%DuepY19Z~ol?q3F3u<#AS{`_=ZKtpzg>FgwTbnv}}W zdaKj0>1w==7|26R^m|Z6UNI!$be7}E1{xI}*w%MR=v3YYF*Kj~-1RZj<(CnskW)-- zd#*@x&ctsQ`HDel zWz)r}{e+uVTaDAY%W~C@!n_){P$dPglX#($S`Q27&nbJf#q%~k$ zCUg^!gp^R-$nMtuB* z)wu+?5k#P8O65dDvZ)hg6p1n$5l-LMvz;N?Vy4I~;Rh^XZQf=$*MkuZ1Dv!!0&e@a z`XwPxTYp@%$XQc-(T23Z=#i>IJt2}6Pjk|&y*7$UL^JiO)XXQ2 z^3bTCl&S66b9bn~J19kVO9PnoFQvZE=qQR|4&5a0?vOp3Kp7(w&{6q1Bgnb~{9uM+ z!?WY}HR7J8zJ;SC#IYf+(EqilU!q<*ZA(oP>$YY)d+evWMf#zB#0GK}tF6?tCq}fi zw&q@G+VUXpO5zwpoHRk~k%i-W(6)Gho0JhDwe#>~5B}5ehYn4|(ZHh#T;BWs(fWaCh$WO=ON|^M>njW9x-J z2_V)7;`J7Adx3pBwE19vJ8$v|@>(=`7vu1Ww-Mt?XWN2MEp?+pLq*3f&hof)noLpY z(sw@zOPibGdx`*EUVU_0?aIEqE(usn@xO6rY*O2Ufu@7`Eg|7`92^`TM{Hh1gFR~; zd_Q-o83o}2+;P1cHPq8q+d^jg@Dflxz(^HQf}?4<6O%A3DH{^xAlt^7M0E!tZw9aj~m zhe;dJmzuyDI502LryMPx(;(C5*=(8FxOY*N&XQP3`$Hr&uaSk@U4E9R!8!w7k8~e z8!`T}vRq}=o1cIg#H#j+bG@dq^q3C(29^!NY1Cj&BQ+45*6=%4mdR1NaJ7P4MaqHE z45z@_n~XbDM~>}mr-o#DVZDuWC5EilLx3pO=+kXX{67`|T*TfG80k*XhcEy)AK1iU<_a3U@WrtWXi^xSIw>#*wm5+)OZlT)YW~J|?y%oyq^-`0WSl80H zg2y$FZEVVEc*sn21BY}pRLq)g?(x&p^fsQ6^J40;V^+z5MIkqu>`2&k?&!K#?Jz&A znm#7>V;9NHYa@3k{aAW%6cm10?$+y-7#)Wv&&fpyF+I!sBWQ35EB!vmBQ>nDS3xj` zMaabe(<@lKsfQE`n{^)ND8f4{pvADjfqhkwwyEseS<{caNsgam>_LyUjfAO~BlqMl zU9uO+=9ysA2RNu;Ne%m+@dIdA`1F2R)WG>L9OvZQ(kWFPN-#&FCq(~xVi{XQSbOgk zxlK_N>WPxRp;clAkpFoSxswlks*(e!VSI_Eo|!@EpP2>9{h?>l(mAiW`v z`6}!_ugg9@fH&0TM>d`_`gI2d=$i*bgyHF|n3zfDGM(pT=cB*WeOV{~Wa33OZ;Ljy zUGGT(W7rK{r-UEMZ|_qcZC(%RpI&b%S)i!LvaZLibEomXCTQM4gOCT1e7}Ls^$P|Y^2j}w=8KxO8mnWwp39eDscAfdHjf?hJgdE< zB7Tr>;yBsAm!kOi>wJwdOl*ZPA(#5O5ARE`2Hh;U8I2~6^__#Jfp4Pkp#K~;|Fit_ z|GB2PKGTd}p2E$vmFhqX4-#0G6kNl{XL8f;0j|@oY#XnWe+xOTd-Zlmmsh zjEW42M(Y1#>K&uwjM}#0#`dIPlQf*zwvCC6hK+68MjNxSZM(5;G@97>a=+hmzt6k& zTJvk>$F=6%``YKBGg|K7Z9J<8wX_{2oE#K7>ZtQ#*>)kX=+ymq@j9mrhoD#?ToVc0 z%@9jnF>p$sA+2^N0VA0}%&`t*Hq`=Nu4Tr0Jv$TreILbrdX+Ln>-VMqsg-$6{*6ebrpzfM!gjrE1_Vt8B}(yM6bp9n(_AomZ%)1cp(09cf6B2-am9KtR@iC zf-4{|GZQUv3CWaS___jzBU8gKn%&aG`Im)F^tz;nA)K@1sS+|w^)@tM0Z*XIa3e8E zVPJCSOL811o%pR=bJnAOnOAmVqCAG4Bc&2iUH@0=MtrsWUrb``Gz3C$i=*cN<8Ki> zK`$vqu)o%|1^W^Rn?fYdJuL=hU#x&9f-m&~{qMbkkC+4m#Eo08=MO84@5LWy;a8i) zZ_+Q|kGG}s2|HgbdkZjIZy|j``H@b5yvl9(BGkExNr~tAko?Q=$1&}Bj2MevyX!_* z1biwdX3_P5!M&S2`p-zVC&un)1HI1fOQcT|wC@Aj%Km(C=V?awX4lT?rz2b0XV}fR zx-$nzV=yTIQ`O};A>P6N{%Gum!jU%K#(jnJ{+i=@#5N3AxGjF)FJAR~sqQxEenk4% zG&?do+t~W(uTWV-CD$fy{vBV{?fVw``D2O~KfiOFbHTUWsnxwShLwkpZ7;ps1J^W5{k}f!Oa8T`HvB&h(C$$Ff_qgp3&{ zG6|zbtGV*$g#}4B*FZ}TJ75y3xP-Fgy;N91B6&3VkG4u2nK)<)>yso`l@r zZ=zgk^A6j1rN(tS4n!|0+fu3kilTMc3xUQ4z4gPUJ-0`fu!#@@R|O?nf?fXr*ddBx z05>|3#!GKbEDQmUXHRWS-MMdA*77^@5I}eCiNB*_srFL$ab-oq{VZ3JTG(qBJ?<+FT8{;rGj_47AzjC5v7?@1a?E@!I+D-23hrCx!?Rx3idZ<}2uJ+PAs^ zaAg4EFaPLT(=E6<9nL7uls8F@bw2jpnsL~pzHQbe%fA7 zy}GTev!tp_3MI0!I)D)k&&%iOL1brVDjEyL?<%K_$RUAHAjbpVo;|B1=^EVIXhUzA zUO2^J_doCz2Qo{dJT8%$x0e;pf z!z>D!dLOXVg0FUpH7zc^@MQ!XVNrPMG9Pjek<}tcgsaU8#bO(BXj>6xf=|zV3%5`5 z7;&xFdM1wUz_cO5$J&vlW(b@Q1`&KsV4QBLz`_|VHGv2Suo z>BoNd&bQq0sjQ4Wnq0g&>X)JFkE8p=X5U2qw|Uc-vFc|k*PU1HmoD%dYMQhD%%tEe znV?yl(aAM%G=jR_aoZ#Z`a;h_X_uK%Zsx2Vgon4;SwYBmXmUocT&XwtX!dQ+_~zK z3It$Q)1nNkV!UJqT{w|BHzv(0nGJ+zR{(IgKkne(3!qyK@+|FhiVfh7Dgm;)$2 zO-6qlm{o0*+fksDtxL~{(({HIX*S0Q&oxVG1 zWC*viSfyr2%YQgRG=piWV8GN$?^U)81W!sw`LhOSeydO*z_ zk|gMzgnBN>AW$E(5ElbxP#aw>K634Vx<_p-hNKt~T(meNNBPe&y`yE?aDwy%A!reP z?2#t4_%temBk2hD&WYejBH#5Voiwx=`o<3a#Z}y*z+KP@n%ew}(;hX!ILgZTLJRh2 zZDK@1cd(}?JsC9)MBWI5F1ZEUGUdIka^xm*g7LLg=J&vz)iH!~Lod#)CD05lD>M;5 z2GX@7oncSLBs0S{@}5w9rozuPkvs)`hO48wpH~e!7=E^U+n7+_xv6vDkcfe(YL~*0_|1=GHeHtZ};3-h0lpLUS4$?iKPvi3Mcni(J``Lrtp z-iVD0IB@JmuY|;~V4!Y`JkR356uN8JX4XhCGd>pJPf3e&|7V&B+M1i+RC|P_=R{c# zC5?!p%*%9u;tfmE=<0f_mRsCm^*!_6zL&Bs(I?peyW6{~M}ZvQ42FIx+`OaT`nh#o zxiyG==^Sm89u^sWbzrR`#0?!5c4JF)%c?xVEPDG}%- z9v5or>}+!6`Hj{l`RvH|J?+e=`^F2m=rC)?&!@A7wYvZ1wYa$Fr?OBT5EJU!i=>`< zLU<%cv5i>gOtfy~An*{|xg|4>{9z$p7M23;7GJcOt+ZCAn{-85X8^Lo0vV3R;J=VC zAB;j4BtLGAd#XDio`8fqVNGdrF6-M|DAjsH*w$UEj>#p60rS^4_J7)Mt+bEGb*L~q zy*vCyK0Dwy0p2wbfp9XmPmzy{c22JW zD4qaAQcaQL2F0%A&IiJev}bQy+^G$Tfcx6Vcrn&hF|W}pb-E~JFK|7NZ&U#3q_8LG zcgG#f?-I=rmL~!>Ye))f-9At;G<$fc&$nzy^JGXCrqN|Ul?qFhNw}O$ae%(ijvm=e z1Tx4JSy*15<%n*Im%%tLGI2VryoEzt>v{$ysobQTJ-E+%pQ)O|&D#x@wfUmn1xaM!3vXvzH$TixWCTS?48gv(lKq_9cP&|{ zn)%#B2*`b&wfha{D|;?ylFz}LQ2PT9NC%iql18?%Y$&kUkcH5IPbWUj<_KYSEK!v{ zjN-`PXwOJtRvd=L<4IBE3KFIoP?ubII4`%LfSN~-){y~gsGIu#sL$Z(%rdJ7)jvV5 zc|*fVc^^g&H6S!~<&K)vEO?`D+!3W*)u{Q#%s9`hmocvyUIdBYby_VL3ikO zG|0oX?tKSb2u3Hc;&!8XsMlCzcCg_YYk%KZZVH@EXw5h1B&`0%(lv;UxMX)6g+Fu) zIf3?+ObQl{zrr>P1D5zV_Zmf*V#A;L!Xt@Ocu3TbP6;R3@!;7$y6#UmrS*$HtfvHS zcwQ=|UZY&Ec0FFC)0!h{7OF5eX@Q#9Z>X{77yauZr>n_y-|7`VZUyZk&1Sys>hQSk z^uf4we;iq>Y-3J)b-xJuZP{*g86WA9Z(O+3rbNCCD84sz9?<7l?$~ewfdi$ zyfotMdR3jN`c50elDwa=#r}0(_Q~G={(IWodCnTamIcLey|&@GUO?$LqOv^?jEDGU z6vZEISZ0L?fsals;Qj?8gMw;)T7A?qf$f^uQ3h*7$Cie&u1R`RyV#z$B~dhM;glM# z5BlXxZ_4;KHU+U+i2VyJOL;t<+48tc$52?=mciNoRZuWlAciwWN_NU1LUP;i=>L%j zoVeJSIH&pDhXU$Zpjd|e)GBri2Hk*~17_LV&lmwez*RmEBUQQUTHVOlJ_p0?R%a2=hez+867+@4vjyZzM8ZJKutZ$QJOmN6)%Bk zY!}0A2Wr+^A=c_;t_uP&U220txLKu+A`^CB<|KWSOdXN116I9mVAxK8E;%`NS_tl? z_E-l@LlKAZKYWly6OqT&o`Wp^+7=kJ>n(>o&NF*1dR|KjutYgkXN)TGZ?qLx2G0j=cE|FAOtf`jwjeiFFjDAR+?eUg^RB0_&C% zYT+fD)7SM%?9V3@!c3*1&xKKOjrCTlrW4K-cv;+dmwq$zLpg`S?Mh3V$j<6ByKD zwBcw-4OaZC=1}36D73Wz0#f`!8qi*`5)-h=RXVX2MlV(tO3{=GW0i;dC@5w9C33r= zJtK^$5N~c_Q@L%@DvS)$12|_g1{DYeKWPDNm%)D9K^&~CHlGnz-LBJ~V|V1?U1T_v zsvH@;@h-jkUgv+t|J}6OeaKd|2|{mz_i&;0A8rrGG{AP=?!Zgb>=(t?f$m1)=e&ni z-tMQ<%q!-zx2g9qgBrI_*5<6(_nLnvFTiIEUZA_i5d6^-cJ{d~*Zi+vbTuAkuj?wS ztHJGdM4E8k;@OaJNQ(%245q%j)s5&RI01M}c2Ap+xbej#h0^W4!KXT%TZ=eoJ{*@%_bPfmh&o_qyh z$XX!0Axwsii@Y-5=Iw8-3V&s$%Dp-WOmBkydqW2dRqqM<=gjaF2arIQ903NnyJ1 z&+^8d8u8PlXePD3hOdj|_X8!*wM)MMi&`N9EHu~wLoIsibpT{V*wO=$l|%okIWv0Q z3*CKaiB3YL;7ISW9f@CZ@#aXzVn^ z{zk|h3Sa`_H8omk3|To#7@ZXN4^(04h-!- z1s~r&9MR|u%{$*;R`UFFi9a^C-hRAjfZxAgb5*XaZM}2k60+WRZN2foToHdzzjz~y z`rS{xSKIdNy#6EX{8JShR&3!0)a z#tu9#I!65-09@jT@G+81MHtt%G#kCXUO7p}iKN+*5{_p{@ybl_;-M@}HL5k_u|9KH zLQquoVvFwl1R&=RG@D{ts-H8;O-I>GlakN|( z@(JqmoL1{I&g(gi_MKOA@B{SlefAuG))K6U>jU$`!s)UtLD&mr=9_xEkh?Q%h}vIj zV>FHao$6G_!dQn=6x}7tL}eKM$z$iS)q|xoC`Nk7od#<=AJ5szsmVN5SjVUvFY38= z`3TWS=X8Ze&_M2&I7+=A7oVeY-HkT{uE#p)v9cT(q5^-}+b`g){duYaF0|YF&8rxq z1MKH)yz2hFID}ja-~Lo`v9M7`NMjbh9rWl9`!UK7Tky6z_kz1gpkJ`nk0-1d@VvmD6QTQho8KdOF4;>ft>BL0E zg#03U(pLB@t>UTT2(m5t<{;m3KO@qxyxQp|93~;XFF)=gn1{L-2!Y)vXQK7$O-DE< z_u4zw1UWpz>!9@t`rRvjBv32PeZF6Enk#cw9PLf*-23ZYPZw>>rRKe72?_c}$<_@< zddM~P7QUrsdHz&6_?GjM79Ob6O#Bg%Q%C%AR<3``83unkTQQ%iD$ z?1^A+tl+sMC&nl9Pn|o*fT0W3Pw9RZTkqetjJuyQy7x8%I6JTI?&np~b^;JVcY`Y1 z?;s(s+&<5lA(g(ID69ygT;@!ZxQ5}9xkYu)b<6!tnC*-Qa;qzuf%oGDit%;bCPfd+ zbzwCQ9XzO=4!b9%4x>bVm8g*m34kOZnbQGT_qXfd`|)$&hA!QziRZYP!=EI=ll95R zWIpFdN6gvr9j_hme*qD$C;)mKf=ml|rg}tD;JL$CE1>u1Qoo|UVn9AC7p0vS+{b=j zgea7vlF`U*+bP$2D&KJ~56*ils-tH2LQ~}S7f1;0rGL8HSKo+`st~YE+g(oFxh^kN zhWjv^@Um4l)-keObJ~yYiME_(gavb*v5ZL5$9CjnF9Tus!r8ygk7YYutW1Zm&O89z zIgEQaHrgEKdg1t89L82hF?1NfcMU5l(o1Oazo7e+y7cPAbMdmheheMBSvKT1HQDzI zIJ&GLh$})iyQKm?^h~%eix0;Lvb|uZmMX?k?6(Ks_j`c359&AGSZFTd<1OHxP=t5T zhjfaPE2>*R{YL{}8=1yQcm^J%?Sjbs(6Cm-7y6~x8&?S@UaN@C@38WG{4eMGL) zw`t{D9OSLRnO~KOoHXmWWnBe;1J)(XQ(!>Q(6O+(-- zCjRJU%Pr%Ea!??sJGz%^jQGL0@_HXAQ0yGz&}7EVcF(n$Cs<^-9D8JE?&Q4jM2C?B z;}G+$d&Gx|aV}KPPdrCd;MRNaN*KHaCwr7G#?c#mQ>HiNjB|Z$Q7QZif6g>T_i>$% zlr`%$P`Zp65*QN8Bna}PLlI#T4j6yM>&CBb=nU`Go-R~AyQP`)h!*a!yumFmX4R?S zPfYOA$KXGt*?2X^y&jU7GnB9vB4%g z(qm4tGCFsy3_L+nycWMlD7wA`ZrY$6TI4A~zt;v1zc4-F1g(3S`r-s^ju)y_^wJFh z#QF5v@6%N_1@GpQ)M*f4a*g)(jH}|tX=yK2a?76R_mU-o72AvP zWs1GiAl2J!-|Zk`S8y7#322k`AN*}sM3}`Z%`EY;+lYp9g-RN_?%w-?AiwOx8$aWT zLrwhzQSn<|ff7lmFfgH>U@&~VmwaWHJZibiJuQ9a;d_3{aH719UW*OwU?jhX?`)`} zaZ@lzrUcEajqFd8;>`MpByCfh`x?W9yf!3M?JR|L6~nTm!=+ks%Pd|n#ePm63Ff`* zkqZMK@%8LB>-4{WnUAHh><-s6+SeflmmWq7?{ohn9OzNWWkg)pqF-U`1XCno=~+}G z2qe_U_mVqF5A8-x8w1V(*4IH`i29RP27%IvY}}NN>R{=dsUuyePS3*AIBib^7hW4ndc{>Z6Zh+q zbB|Y!KM72^;+4c8&Qhe>thnF7lUK)H*n?MPC@W7$IO~T+Eh%-5)R(vC&Fmf!Xu|~R zy7a4ePcDwK5VhiUmn@M9j8W9fgF>| zT*`t3Jy~$lxO?r^`9gS~F(ZS*N~^bA+pDpx1CcqXKn+cUSuXPWj}1vu+F5R%A;6r1 zE+?5^UZSTM6zdho?GjAlT^W3_HIcXBwVReVz9>+hrL-yE_&3b6luhW!~ z;fq>=?J8E1^!2XkvO7g7tpyv}l}RDF-UgJOSjLsyz|QyqEXjvf}e89Ue01^K+G~^J&6vmAmjbVUmTPec=hKU#0IL=7g`L zeUA|ZcRCAJQHw3|XE?&Z%bZ%UbjC!GjMc4pP(bS*LOS1j&w2slkr7KfC@ zH<@0aTWZXCRF;#P{QY+Kul!!igJgVsFmXed2CtO){Hip0VY(VH6Oc94I3nwzVWZdh z_({P3ccC%B?EctY%?zb5Id0z!3%HWjSBNuc3wIkh-jEaQcnTI+XsW3yUTzs(yIgG~ zP_JCb#FihbubJ90H|O+3q|U;*>|F9`PYWLS7q?T+Z$o&~8f}w2rU1${&I+-n1@b5g zJI$;d-@C<#Y_ih!{FRd46f<-hizHgQ=OJgNA+}pls<+UvrCY&Y^$}O8B%z>|j7pv> zn+jsN&CeEeWkiIBRrVvPNI0T=gvP$eMr51d4m28B!)VC$s9I8RO$Xg_Wz4&Tyw;H6 z=I(R<*`v}z)mMpKs&fq7R}!+0hm+#kCfGmtWDc?%S%0oeQs*1Ep>oYI=ESZ*-|A2= z>J99hw3!|aNAQr$RYt470q_Q)wH8~E@3oy8WN0vH6$g@&d&;_(T<}c-2wmf1D6QGj zYEIM#Y?G=j-NQSWZ(U0C+%CP!6s_z^Rcir5jZwNECzePpN*1p5GJxWhCk)bj+&$9x zZ*C*tg4TyzoETbR@>O`}vielP?&&5@UF)^SFIn+xVt5tSs^^{%aM-K7Cmo*CKmWbB zJp-n7XVYs!dvy`&bF$O`@QzaT3Pd5_;r+iX%4rn)40fH}7sePhh> z_gxG-wJLQ&yUIVZPFJPxG+xP5WLoYjh}*((#=`$}qqyfhW=EeE&nzY72UIWp&*AqU zPk^L;+8*AUP;NJRnm1Db`ri5i9&kkffP(uHA$mOu>cPW~%o%!VA!_5U-CsejBuUU~iWn!iGy z&o^BU?vUMBuv$z&9Z8LFRz@&4dZacjJ}mYP8}3uo^TRwSJaOaN9`g{vwQ9v{EHAfd zSI{ro!_B!T5Oifg=IOD-RCjeMlGscNl{eb{F5s`D$?3ITa;MU8!N5bgH;a6!_S?kp z?X*k1drtQTdefH`H}u|^-BKeoUk5jOIVC}d2A0imUckLTyo>5k`1di1^U}_0IlG2E zOMh)TKes{yB>~@ods%|Y$yfUzHG#%Z8>11P(vn77Pr`?03--*|FLqLpW|SXbed_wF zbMdEw#(9$Ft>HBB;hwy0i^j)xKA3xDA+Rlqam}{L5EIcb8PH;NKYY*Y2k>Is5~fq5 z+(?+ah?MG&{AM1@8;$Y6RyDap-S5f43Qb#d`h_3gjIhrd;V(3Lnd4+p88v8ev#`ax z{XjX|LZzE4(YShpEks-fK>SaY|NoB$eg50Fhy(swf6Zn&WU6{=XN(92M_7?(V+?IY zNBSmz4mWzu$Rey= zDFq#c{}#T0AKs7+YivGf_q+3nYeM^u0j?S%{$Fykg$l;g3J%<5Q+*J672CIb?i-@mQsw6`G|wCW25S@c!g#E>VS_;n*|EZw=CGiY>ayh%eBuz5%#lGjzU z8>fySw-2loS#GQf!NtaRlVcJr<)<9?^e$x=|FZN%hBSNXC@#jA5Vzf50Bt` z|FOr(*y&=9cZ41+zP{}A5$-l!W`F_}=_*EICSHlLZGQxOwQ&c$0s7Y)RIRz-yJQPM zQN^>aUaSfY=pOlP+N#9KVChR$WtK3XSr?DRV{T+|ZK&aZ(+ZYQ7tB*j#b4;#>r@4AhnUaie)=LxxB-A& zGGvgd`WsaYOXn`EURV*tm4Y(9>-J!^N8~v5xbATkLq?c}Dmn=18(dIw&eLAx+dGvouqkM;GXJE$1!#@On#^R8b;@-6uURP z$plDNCO|Xg4;A^G4z13HmboLr|D*n?sj~@{c!Q}uJd?1Z2~Kre(c^#c5k6%=e2^$@ z_NN8sn*DJQw=J^Lm5{4FSw5~o&zAQ9zAeWTK0pwKu<{EAtI$27JAb~9RT}8`>9#$ECg@1Be=zf)#of#b$eJ{peTlfZO)eN-*_0(N7e+i zb(+yS>2WHx)i=2x%2m2HSfv9HK8vBh@F?kuq}Oixt1eL<1u_UnE7m#Y>}w&S z!w}8E`3&I#|0-FL*2-rUNl^7Zjn)+16!U8={Q0^Em73I*ljkT8#2G0^lGlNBRD^|( zIW3Gl*%bLlZ70zAg2#u7L*vjcJs^>t0^4;??jPBkhRvlPxfU97ybcul?GcfA>_QT zmipgG35CcOs1l6^nc8==0B9Y!$ul%NRnQq)tMPDob__ovm`$lX5PUtTVyFZFVk{@` zhPRDAfO8{qx3J+o0Om?@^9|%(n%!B! zQ^VW)O>@M^cWx(`9@*bUeYB1QEA7#`dK_lUknM1aGJzI67!udTWUpy z->g~vU}4Mo;lv0q6D}K(CbaTfo-#AOHhT6ZFEJKZ5;DBpyTVpOU#~{Pwo)rrD#)CY zm=fdj5^_IGB!(!30EGHX0sf=(n2MvBY;1Zjyrj-7U=*B~FArN>1DsMp8Lp(x+)X}` zzH4cWLF)7Dvr;^*U&41xZfd+3K@z}^Sra$hS0BeNM(3B&^VxtpFEq*eJ9Jk1n@#3# z$%L_HcZ9iq^Of|SG!>6H00c2n>^LsJpQug(PT~Tk0y*%KY^xWU81fn@dTs0VjbjG5 zf|m}E3Dz-*qID8*{~{Hr7MW?_l+h*Vq~`4+XG{(cVY(8Ksd9>`j~w--NKI)yWtR0| zO``6h3$dxDI8<0PBWC-sNCfV}CqW-iQ*TQ|E&$&)NVhb{vvbgp4UP1CX8s8n6h5VZ z3PmY?+=Qe?LCd-b&k_|yIUEaQQ$8b`BYbKDK4spOXsozd^|+-6TJ&$B`B|&Ds+eL8 zX;~05r-T2#9$3^ork<;jFe&aQvatcA2%XN zr0^E;1#i8uMStfX(#yKu56?aC0F~??u#zpcsHk*2N2w{=d z+(ImFBeSJD;JiK$w+VtXU5MwpEq!BxL&5>|i41}S71aQ=oMtS2V#v}MeQ`U_L6z&> ztG%GHGe-^y+Ib~RyQ9^&mYYAFsBe)&ByBk||J)nUkN{7m(}SGd6!9gMC>Lvt%5Zpzu+SE?Piu0`% z(DAUVj1+`v)9;DaH}eF9x^JrrBLbCCX?qd6I+U7!8y#slR_I$!jwVnPPSw)fa0<=> zrU}2nOx}!^e%GOAw|1!fp(qC_+JTaRMb%eJAv)~?OvJ%nC;SoslD%RY zp=Vg5SYwCWF)1Rh<-g0(meW?qYv*Wkfz>qo=f4$;IiCI|kqKBZ$s8=>*39uz+nMtE z@7tFTfR47Rf00GEQM%N+1Y8~2T%h0gCJmItc%>Oh%wXcI9W*(6zcdqnL*)KrB9;9+a5QHl8nB&~`bgzlWu) z6$S5x0IR-};+T*aj(qN?On4Z!MiZqIH8$e@{Ay*$u`d*4!%1QS)JIrtO{^*n9HU6@ zutT{SxVa6J&a>Nvuw~{Xc70iDDXzRy-Njns{3%M4sP#-hZAT2L7JHBQK+aeQ>BkzD zfzxJWC8M9#dt*qb<+WO_Rt>L+eJ`el5%rTx5%w`y5FCmMz^n40NQ**&QTQS$h66i< ze5C?lbeMH850sv5R3qIFCo)l2EBSabFU}UY#;e>+tV#eV|G4`}q+fifNGYDU*uo}< z1d>LyP*a*of4KaDOYiDIU>`7DUUsJmYvVzUW(1#FtKG_XM?_m!O#F1pz_MyBwH|C27KNk%0zm?(U|I)w@@-H{AGsZ2Y%B?alXJv>!FwHAUdN9bgPC z%n{;LrdhJTF41I3aeN6Aap)H(e87jmWU2EQ7(I-PuS|BB&9^4Moc>mI>n=gF+Hw9zvHK)og@Q0YD| z%L4E|(#ap$`q+S>g>-j-gKQA_bBATYvm3tA zOw>=T#R`-9S>=2}a~u-TsuA!G2OwoORcJC*Sr%woKd{^TW(t*39SkT*Sq>)Q^`Xn^ z0kLH&|{D87|6YBuXJsfD>P76W~yRt#_k)=Kc_ zW2Qe zK_ZT-QuW7@n)@zt3b5jj%8*bBgmxWf$Uw_m9_^2IpJ&YLRbz9IC5A&#{S4ERY)&1r zcaw=HUO}elmR|H9x13l{RnRoI5)pJnJ9Y>-VRBm`A+v(3QMyZQYszwFnE|4_OK8(x zJnJVKK~%0ej}yU4{WJ7i%YQY0Vga`5KGW~-U$(xMB|tkqe0>PWtAkFWW0Fy}$e*=; zo2~7HQg==Z{w2hPG_^6#ROA^L7=VBvOvF7%zk}W^t;^U8Z$nFg9xYa!MX-KVe;p@5 zX?o5wRIC#P(@|D-e`r2rO_x&_GH7ar(Ri7gcBv(+RV0Opa3)k2{h=)YsFI-z5 znI?xP>-G7Um4spZdm_nElkisJUuNc_tPsQTTQ`?TEQX_CE5+$M@~N0M%3^jhHa>H- zBg^J-jQ5wQ>~B_kJP6U8GmeOu{grtdnZu>9!= z68U|`M2@bQCZ~>*NeQ-sJ<65Or$ST7pTV6JbBN|qzQ1j*lG(%pk9|f!VyRP0%?jgG z3gb_mXwSryVoI;#519%RTTS%UX7OnQD@THWZ$?zIN_Nm2tSK?eeXgkD-&71>3g{BO zaJz&BnGJIOkN>#mAE>AD1~*3{tp1Yh{%B-l?2hV)QCW$1nD0P48uBOolMR=4qgM-CG&Y5#RrKwbJ#y=q27-NS8=j3&ligmYmQLry3VMBgTPhp9XY8T6JmKk@ z$8#;l+3Jzs2Zz_8*c@Z`2yv$8ug;ra)6^qSscw=Y z{I}Cc$`@kHUf9#rC3vcF_Vb%wi4Vr2XsQ0*5G(=fu#pAc>3QTkUiL-Se}E6;N}KrM z9=VdT@Fyr+H z=Qe6%3?~`($C&N9`g9#eOE^M<$Qw6pxI^J1r^MBX^S}4b(&v@@&d#oJ=CN6jNpZ>R z9u(K0w{AFB&pUV==`?F!j3l?u+WQTU*w%9;aXL*BwMd?((V$v;cNeHeXL^d8GtW5# zIv>w%hWr44+xdvN>?}4Aqn@dc|MJxoXMqNwqg&yD9wQo;5G22D<*xt6qe{Ld^8sNh zK5@%z$YN25EB|QwV4r_cke`}A(um~Fn!u}4a`IH6Hi3y+_ z)$h+pbl0sra_hU@(&CShDM8EnX1(e0WYufk(#9ENI>mbv;&oSgdU^w|+gB!qb2UD`5@P~jo9XwrnM@Tsm3If60r5zlWcPVrfCJBiPlX};k&fQQ=@wRUUDZzX)=U8 zaJ;I6tC5u=&3GaqWU|*?3{M7z(TeB_^y)l$S{1BR1;y=x1G{iW8V^aU0Tx_6iKGUS zmD+Hz<|}1l0@(OoTf%Rc>t+DsR`=}`?0O_F!~J%?1$LqXd#m^*W2^)T*E;l2#a9&t z5*DE+M^2c5{tlK`+qOrt|CAsaJj||;-qK!Eu)fG?>*Dwat^ZsG8q~Q$@Ru zVmqo{^?-VU(|z|4EudcsVm`YCKun^Sut9PNmHl#;3*V|D^Hh2F<+7D`WZU!>v9~pV z(<2|djbE`Fa=@40Xe)8T>`W!QecSQ4%lS?%vj;T{P;0QjQ`M<5Ee>i?G&;&f{J)UO zC(i6cz1_lX-apm(>EUJ-ItN}h{kC}IeO>ojGxVi~xNCK)k7W(rc&Xg-&8e)YSVnu> ze&B{u@}rOV9s2lTB>%l0#R@*wiZ8DwS25*sc`}6%^}CXz*knaK+}@aDd^<@8RmVN( z8BmzY=S20Sqg$=X%KYQ1(j{$;LY0&scss+IVt%_nP$DlkwQ~K{2L_T3=5NpVjj0t4 z2BgTZKQAMfHG1*G7#PZZdD%GzVh9^`t-pV+EdwEf>Msue7Ti`SI#%SjG7ZkT?@9k` zg0+VJ=N+ED(yf*?t5fB5cP!-Kbihm!Zg$gqwLP-(;)XO{&G8E^{wRRB!SI5T6*ror z9M{ty9^q_J@}!vr{#1-XA746AgYv?nV1$;tVw@yJnuaq6u=1u+-AchFi1B3fr#=}@ z1$ciHW%IJkC-WgUk)08;yx$5!7Kd)B1)ly;x+nhW6~(9Ak*1dOQTidhUwtMGF~M@6 zk@!mTO$)aFYQ%Z+S_~sXa=3v@3A&!TWWWDwgu~wD6J@+_Mv=V3ov5mCGWzCb>k&(1z9^sGXUw+!uAaW2cb@w z$@L_Ha5@%BL#fv34X|PYoej&*sIEaa`#WXwv39k2!%%S#x?dS2dNpD<=Cx;!OpU)L=>{Ot9X3~)lyf3pCJ zypLNX@5s@YQ<(&$xe_%zs47(5^mw~n_Iyz;bZ_l_6Z{>^YfPILCj@o~m0az-$7BZc zV@!?JzehdDYE<#qnax}Y1Cy|fT`y{7o0dn6faNQ%S>k{#py_a!4WL}y$YQQgK_E?6ujKz z2k9Y-Z(zFTP8&w&NLKVrYs3n5~%On#E_MWYe> zrN;d7d@{4Jf+l~A6V9s0YWDL{W@N`q6{3N7!9gt1*x^R*ul*UW&AIay^CNrMe8u%b zX&bdqb`MdI?AJXD2?fd~Tz2^fW%VVT_-cnlspynd*PM45VWm!=@{QD54z2uh}e!?m6eqzEg<%G4ztxpd2S}!V`&}K7+rguSA~TaAi-pwjwvD=k)dzD9xG=c zPLB8ROi_wkIMuB-PUl=@{C{I5@d3xF8V$oPgLn=+xXSLYg}irLAH#NB>+e%fnNzM~ zLH$5<*O#U>2ale}-(hzaggd$H5*{l&;)F}V62Jv4eKNUSXrmn~Aaivk`*P1-*a^+N z8k*!k!W$AVItnwyqT$LAY+4)jvk0dG4&IbTMErP^jyR-2NRX(M(wewF?+b$54tvo1 zJnKXdH9t42Rfu}%ewmf)&3&R?YpZ1|wEm(Bb(CD}juD?pK>-;DyMi+ydw`oXmt(Y9 zNj|5ZvO5X4oD_j15dFS#;@2;dFzjns{-%2MoWoL?uLa79Qh!JzIc#cFofVWMpXuXl zAocwnS2=iWa<;nW^*(Ce_J$_g@{5WzW^`q@G2Fa@jtMy|cAn=?SK;0?p>h5Kj6I@b z)Jof!<6{(aD_~g^88VU$Z8QoMad)tkC^C)FSlU}d-hw}%#g;s7Mc;a2t?L~y|;;oQP9QL2AFOmKjsrwLCqg%7S$cc z&8|xNa(R_N4+numMpGSA6xE9N9(z&)eH=S@=>p>~*r= z7f+Lj;-dKIHRba1dYsJb5<%Jvcx!0u3OFk*sR`C0Qv-7`dAgWjaQ}3EkncXoi}j6M z$J>AP_Zw>gRC#D!3l)vT;HKi`Dw=}leo>4+{TGzIv{w>3^@N&E=c-%9Z$-jpcgocr zzx$M><8%4f9-7xvw|_>EI!c64m_Rw!OzfPI1W5|0*Nees6Y9?&74KQ?D*ups0f_%V zsl{2gpge<>s0o{SEIhI&*?7Qv=|pY!!~m)|L!4FJv5Z5;{qhab=k!oR*HxuiC{%~Xs5Uj}sh$V1vk~<`5w%G!NEG%T zc3z#QH$<%Mow}?Xa}Bk^W`(=(fw$qGMS^5y+nmudD-6rGMmwO0in_w&@!3Km zD!f(R41=oNH!*OW)hyQ<&S7I_V-%>o0O9!F!&~&d0AkLHUqf)@W7Q;Rt>723pw;-t zxwT^Qewq;-a;*mQ4>e}XC)J5S3Q328X_SOVjC1yI41(+IYT97AQeISytUcI9BWh!@ zbAINn$c92>Y=r_>s&~ID#>?602c8>r3x+=)1MS|3(~Xqg7A= z5QIS3+X&K^5sX*d8AJ(N-^d&Vxg3%f+K4rm$a1kDNLBfA1aHh!4d)Z(Av@tEO8;_` zQ`_k@Jgd%*CHGMz;B5=^V^Cz-nnFb=>!j1$TAA=-u?4Aj9JNl1zGf?Ox8uYS_HyEc z4(DpUQPDym5pv-RqduntI{H5JxyHh(Pb%N?gVRU%+5PeV>K}O5CEMpkMbiR;3I&59 zKF@5&A3K42H)}$^<1Y^hUt_&>U;DLwLEkzpe(jaYlTUR~*sYP4a2X8+p~g6AtVnDc zdADmPJcH6F$~&OoYmFE?0<*O zC@*sa-dTfl)ipH@moZ7byuQhWtb{8asWe<`lSRzz@IBY4E@X=+=FIF6q;tnUt71ze9?aLOvGN?EW!_1AGcD_13DY~T4_!Ir=}Rb9*%-GWvdxv5iE8fFh{yIxJ$bG zYF{(h6v>IwHLx$*)=mQN$`4$2;Yj1>Me{n{Pj~{yl1*1}3f!4NGD|*Rqnvv&kKVd= zo_%z#eZ7a|Zw8EX8_|Ww7V-1{ZA?6G04PBcV=t<!cC=loc)`F!x+QL+S*!cV@C2UWtqZOLC_`S>})Z|kfA9`@W!gVSPs|191_ zmrhPkt~@-XEIMqR)%+wmdjem0UpZFV@*|db;B}V^=VQ8s{@+-7D+uINw3xf@9&txd z+%=158Rtok>x$)B@1p1BOPrZ~c?dIjd3}o8zM0AWC5hSlSnW`6N_&VP5n&}csq;(j zRX1rSHnq}i`P!E;OgZo!?B=rafDujJAKko$WencKm(z{|tJT(-9*LjTbBHb|_^v?i z-RRA2ZTZjkIgH108o9eadr*P2vt1E#JlP52K4`9}6dI|*;M)72(thtu!t92{;R-v{ zI94A0Mr0I7OuI!pdmI>^q8f@&IaEq^J~lfJ`;8_u1VvWkT-RSa)JB@p6&EL=49yuL zzqrQ>!&P?RC$w+uHeIx&Yq1S{SNF!6_<(QAI?>+&*1u6WNK^SshZIUxa8gV)E-r4> znqfF&T=2e>e(4XFP}lNLLkSc&laYcL;mY`kd*<0dnj;SaBRxAG@CB)v*oantqxxEP zgFKj?i^d215I1l<9 zQ)9}MKVPD9g9&yJof{NIJkR*ACEb4pLW>YEXU$jyGrQ8C5W*7wxEKk{H5l?p0Gl^? zf}b&~qFFi9GG;nK)N&Tylcs5U&vyXz*&c^dU(Tdd%X(r|DRwE4BjEJ{4nq0VE1jyna=*Y^`&y4%Y)&W=T78?e=48OO>50ghrq*gdh z=Ti|-=b9F&@ZhlLB|D8cmdT&aI*RhaIEw%#^L5hASj=p&oy?gH#^gp5m^1*hDp(lI zr$V5I=X;+*xf7uvAN0?8U`c2%k0(A;dP{f7lY8;AoSuYOai;2~erNl)YN$>FLB_1h zpdf~Dt)?wpDJ6=P$^O%U?%X#KElEv-{OKa)?*4{Xu>~eaT8xiq zUYug&PDiP++Bj?Gj9SG_@gQxssnVeRiot#)E5H4xq;Ln7MK?El+@OP45}q~kV0cn= z4x<_9cTaiQnj3LBDZyUNiD=;L<%h;Z`b=Msb^XiS(>c-)=49B}hVkr;cbEWGrBiW*t} zcd!5A#S9s=M-!ZaoOkHj>b+mx8u5GtzjGwK!2hDjOCe&I%Zw^Ory>?nr1l!KVz-X% zhUyqZ_u)(ZDi4!<6f1T@kP-C-``6mDHgu!!GOYKgV$-Qk(H(JTuK{sn{o9_diko~4 z0o9mcg3NlD$~j`h^_K^Al1*J+HfsGQXX$h8R4bEZu5n zQ7Oq@VMu&@l1|Q$q$Xqu25%gRUSLJ_+y4`TCSrh#yoN*@cxrpy!~|`|zoihb#NXfp zFZ#y>-uWB=+PO^l>bh{28+b6#OHR?WF#u0(?9dM4i=spa55tRwv}B|793}5$LEoVO z%ZtsS{j{KpCk7*q9~#}L%x+KPoA7o~!mDMobDJ`=x^h#-K))QgYqJhn2XAIdYgCDj z(Pwg8ZfE6}ToKM1byfVdp^Ih~Rbbr5N@aZVb52+~w3+~tn&t>lRG~<(NycLf*%i4c z;Z~wqBLwb+YzJ?JBI?L9!*{Q0h_Y6t`780c5S2IKhLLDS;_}FPQ%nwW2s}DQiqxnp zI=f!wEs@>N+Y}>6ckG`9J(OuYZ)$2xkus$<+@UvI$CMnxIy_U4WKR`l${q#oNT;{6 z@xa|HuU{m0sWLOULK3TmnYe)QzM=GJrJl`=7ESQqN^qyw1>Nb-w)!BW*1vd|0Hp+O z@n6(~N1EB@tphjH7D{;&*>$BJSa|Bu)!-aaMfF{%slHr)seB?W!wEPqY;bC)z30|` zO1WE$iO_H?TnC+y@<(0u-F`Om`wR4JeM5ojqvzc55>D(wGqZU{&q|>`UE{hahE6cv!KuD9TSiZs>H$QUDjg%oD^g3 z_E(=qQ}RK?u`3bRVT=K8FpR`tkKLZb7FdVzH#E4qA6VV)?B8hLzBPLfB%MHn4!GD9 z!im17O$DN$o=6KuCZfWzXUbGU`nVNZw#uOT*o&Xgu-K5K#05P$yI2jL5+5uSb5nkW zHvIAdycfTs@#_$t_YCK5yZp*=bL;#6(Bj34g1n&uAH9R}!F;xD3fTEk<^KZXV381n zM8t7fG{oXA%ycA9`?h@iUp4$O_x~+tk>&Rkg1b9ht3`Y*Qmn!9$KH-P8R`t~P#j*; zBIv>9Q96c+O=|5P&=y7U`dwq(4*azwDUPD+T!8cUc&F=ln92cXrrk#6AX_EWCx?kVksy)z_go~3N;Kw}gk#Hv!}?hclTeRj$5*B<1@(V2;; zd*O!WkLVE>(oe$uCaQ0{w+`jCqX_}?BKVicUAhexN2~{ZQG94nfVqC5P&)ze!&X$B ztdp~eV!0qHUhChAF0hl(La^Nt6P&Llj*?#HS(4WN8c3+G6#BIk$I*=HuFWrXcM6fU ztx={(VQc#jYWMnHILfOeES*IMW}Iuak(9kH(tGZ)OXKkM!G%)2ZoE-czvGKWg@~1I zh3*n8$s>j1DEot5y&B}~kw{pIlO{Y6Z8(#8a0y48V->4%0eKX>bqlY~;~0tkE>2Ek z(SH%ML7lblHnnJoU%q8Bkon(Hsnh+REc`n7zOB+5S)15ckgEMS9JX4Ne?t%~b3som z+8CD3mwgMQ<4Zo!;NxHN37n7e)#|pNE&UrI?mciOef~2+%!3D+5~2O8XUe<}TbRF3 zIlvHAKn4s^zyMSVoSOFXYbZZnhiVjvfys)XxMJmbOD|7VWBf+GDT$e}QU;0(-?T+n z;z&fUKz>?yaYl;jF0{pOzP0Q^z=m%DivtLN8SuYLIV)_FMa9j@)4 zYR>J;Rn*)b&(Hp7F!^3r$-&`sdKw}_=wqHfxBNAk4fx0hPhG zf7yR+5r}n6X{j`maL9W`zoJspu61KwP;?bH(2VW$M4$}yW6#jA9}EqZR2lTjg9-JT zzFumb6_Mnk1cg%Vk+H(O@N>Mm7S@5?a?(F@X}Pba21mDXnx$|Kvae4&tYT5T8uzbSg^5BICrsB`ZSUTz0XabuV68HPhTqyqC2RQd|d(ZR-y#6N=T zAls*686f_hvf_l|e(#H3;4Wrp;d#0aczG;r%jq2>{HT9BIQKvg?j*6`Vyys-oYXTL z*?DrJh%4aNR5da1vz&*Od41*=R5gvTbG1;v;n{-^3WcDPrRezT0$e|-WsT|&(kvzN zo4}gQ(8jxYr*Sv`6p>QGU15!)4wMv-G=Oz=kC~usp@g^kMSAe1rh)cRI@o51R8aW( z9XFW&s3pfQH6(y;&>|V6NS;T7{8^l93%7z%M`NhcSJp>H!yG=#k#mE{7cEcEnX{X& ziFk}h<_1{VFk6#U7w& zgn9{Ok&unici%#CrA(QgBEZK^QvM`b()fc6T};4OholD{$A%-6t7+ipKV_31&1gI| zRfUY>Mn~#VVFOXhOn7PT6Bo+dnf^O^D(LWGN|*{_Vdz}%v!8&BVCzM@mM~QnQ(RUdezzLUW|igHLIRu^AIPo4|%l1y45O=xW0caw(E z_gM6ieQZQK&Yy${Ed;xKQZC-GZ9AVSVM!50(%qUWx0^R>zo=Ynk6VYG!r`CJDsx(` zk4SZi8F;iLd}a$13xn!p8gP2u6OPn0c^xR9#InJtNg!YB6knT?PMh>=AIS94;xu>2 z;tGyx{&4&o2nmE2mw8YgsU1!p2jg!oUoR&TezapB!L-lB;u-ez^>+f%_B@sZWnn!4g9;*N$9`(rcgZUCEKVVVnAWwvaF zt*ZqW3qB3pTQ&fDaj5k@3As*3!rAt_&))v^-2Ek@=v$NQGQ+a9h#c^O-u`|^SCHZz z#CyyYK-s$Go$dS7XpjgpOSbj$7BDY`B^ZMg->+c-!%t3B{E=M2S`n3fe||;k~ z+J%xcmk2OnNmUq5PF_kO&v*}U$37D6e`imLf`Ob}!-OdjvH~Y{0OIx$7fy;=8t+qWU&xGSzwh&|xdOwzW~Q$$ zD@#g}Jf;lx7c)b~43m9qDiuSX(VDr}?H z9&|pQCe`#-qi~f@H~`B%Iqqu_@3yZz`mJrXNuJTF{j^j9zdp{1Z3Vb3>sGQlMH*i+ z6x~xvX3fk=0$%wjPV?@wbbw5nHfX+6VtCW$AyJ)VK*o@EZ3 zaokY=BHON5fBi^FI@-?~;1Mi1--{mcf53ghXT7Zs6e>?TXrn~JeQ6!I+upz9eBYCj z5y0v*xeZ2;KiGAHcmdRs7U+$M&+QFB7d1oW1op896U}G{oUR9H(g_Xu?i-Q|s^r4sE z`k8Sdkt9ukBMxa~D*U&O*y&*D$phf(>gON-N-zNn44Kg)>vNl1Io5>K)9*oRwN8Q@aHniIc_WBDw!_*RUTgZ7do8A437pk50BwSYFf6xA6wND&EK4~uaE8R@%(7jZUk$m-5}JyEPKrg@7Zvu2l29JwJlyn_%tp2^=--11?`UeAyg3ra#)}fyle4YA39u`*5+0%5H6M<7D{D%a>pNLoWmPS_Ez1(S zDt%ua7z~6e|F5r~%R=V*aB+bMwJyY7TO@`?u<3d&70i=ePwrtffnLNE0`#{8UT`*K zwP;|(zho#VkY3@^m;$eUV92E)RuDk0YY+He^2+1!!l{*oPnHIwzmF`-LSh0*_!xYE z-e!mcSSw>?f&Y^*CM7_N5;os%NHZl50?GE~yd=vRrUSi`GjY=d5uYDshKX^)qN-;nnUMHCmC9mU?6js!d1_)kk>%Fg?jbb z4Wdz4vTzPOa;mi_Gn4G@-Yq)>avdHt0&3yw1v>}i1J8(=cADI7!icV-Q@>bG4sb)6 zQwj!-HlOqJmfL98^TU&>=eS|eOi+z*CY)fmTS>%peB8K99tbkgo4v3z;9*#w&T( z->N;aA(>m_D{Xj5I>vXdaYf!)z^$GN$uz)*2kIZ1%uz{Wj9)>Ka1IGrm8+0Tp4bKL zK!PKwJ@t1tfCtIx&~ZC>>qwI}B~uEX$|}Na?d+%vPLGVqmiw7B?RCE>7DN)qG5`JJ zGH}<_<+K^ab)Rm*3Vo6_f2T-&(1bgF=Ya2fi(%@;+O%||@4t1yIe3eS7^Q+;5b-vi zAnKXnAKR=MEnCvam#UzRm#YVeO&icPlv-O&+en+(($L?jGHiL(5b`QRY11HwW;H#t z=AG1?U80X3-fZJ-XELuhMiJG?-EZ ze1`uWoPT|ay&~P|KDRRoJKd1oL_Lqi=XNfDn**Qz9mE*4sh@m2)OZ+_nYBN8ZvzGB zXMCm&#vYdgv}d#eKCi$0sfj^-@l*B1ZW2}VasxiSoF7L7is}QlyiS2X%3yZ$1w1~| zAGQQu=i=rU!;nYiM{>a|@@_R>ukpWJu!fAmge{*y1u&>&$s=Xli7_&WJKnqh__E@E zw0>PX9FzxY_@3+%2FCany`PnBkN(Sl!sw%``R8d6`@>_+s(e%-z;{2`q(SRAs;P7! zvJeKx0!0Xh0tq~bCH8RN>Lx@Kq@Pzc6fN4;5C`o`rK6iQi5~nef1DCf-6!L$JL6;( z&f+UaCjv$iPnM#PW0HA7IpHaf3ULEph=gpoyn{hWsFaVv76}>463o&b5_oB%Ywt~) zO1NWHh_lxvW%Na<-)~^Sbh!P&^{fdhMys z%e_Bzc(QrZqP<*QP5`}h64{E_j*^=2#>@N=Tn~?lHF3CF?rF3xJUiAj2=nWb1_;)c z*K3Lst#B}cqeqU#yK%)?x>EF|UFUv?0>@>kccjQr>e+A!VYL=gb7obWx};Eok(1|@ zlekDwr4JBmzbw4Yb?R1>h5D7PwRH9Q;lm;yq>ZWVA#jV4r(&}DZ8!JMI8GbdHryGL z!4^W1%4gesb7AT-hy7)p?#M6s>NFWgS5`7g%Ki2js0tKs$HE`aXN|;&R_k?GCYG!9 zii2F9FIHn97fala-Z;{y4#Spm&cES7^@pIv5MxMaKnT(&R{kAq@D8MR_E6AaL#vi+ zPrKEhPc)yUa417+YbCYVdq!h{6lRQhl;}k3csfwzqjwSod{g=10 zs=Utqm5Fec#JD_E7uH`(A!;{+PfvnT=t6b-AH`f!`+sc(>1}D>CoQzcMilpWcI>hT$%|AXpr_OK3nfzaEytZ7vwDoV^kBhFpegUrn z1XFb!{3gy1l>v49_nGI-;W149hy^RtEeqz~$(fVn+G{())Y4LtvFj%6Ze_$ao%r*m z-1&a0Hx=3UM!NlqO=F_;+7~~?(qQS>7Zw3}#%F*FEsFUwGB+y-?BH9-_GM(EBxYhiX($+A z2veWgH{^WTcb)p^*xm0&|Bn<$hk5EP&1q5_7rve+5=g?Bf{q1!h?XLg5pt)90Z{+~ zenx1V^@duz!X$NZTmV8&ECX(|gR6yYbNTgF1WEuclQ*Ty%{aPx)lDmH_&acs3LRzUX76w;E2Smrs2e`R@`4^=HGV zccI&LuzdE_na^eD!Pxh@5|IOW4HTf6TaX9%^J|E^2+O)wlRtFJ;|!;oR_b7vfK?qI z+Wo2*URrL@%t+c%3)5bzy*B-!3_SP*I?w5FDoz6hhav65T?XK??x3a! zPpOEeyNw$`Eg?TVHKI2$5_VBTeYP>Hrv=P=LeVYL_`GU>JdBnIH zGCSFN=Q|o*n;95ZB!=l-CTk*wOD7&0_O%gx;K;2oTA&vthB|a+aq+Bw0LYCN%;;sf zXhE@ZN<4^BCqaV+nm*!-?BsQR>s9D%HxJl0HHxz*895|OKWy^fq1*hW-7!xz_3FCt zTz8Q`KMXwEjp@&38pjPlpMGxm?l1-x`o%MM%}vQ`eU;-x8;RQ>+BzarF-SE?89a9_ z2OjbY#PFzMhAIJqNj=V>F$;XmmnjPqc|UVkRr%i-aTi;Hu+pDP25YYTV7*>TGBeb| z3+&RS8Br0gFvF~dnL-f_!>fj`hZOv1U!2#mC88l+Ga4GGaTK9Qg(7x6E?gJ_?q)Dk zSz~>4gfTZyOJ}A^9zF((@L|lBUm={lp>y8<@D0lK6(+~qPfdt{CGXGApXGl7S&y-Nt6?w1*u3|+cl3a@ ziv?c{$(p!i<8$Znmg=QF>Wdy|F!Ts&5@GDXEe zbGaq*BP$HHm8_8thw2DmEYk{9tfoK;ILuh+YXq1doIP)n{D2LuUDf#t)CmF$QzgLQ zc>MLOx)*t(bx@N$IsEo}r?AwIpKhbjvYllaD(2Zw(*}x;mIgz~bs<4Y0l_Rd$hvg* z^jTjHGUBl8ssx8}rL13Pq>@mQqeQd28MdZ3AKh+g?TYd)t0WH}+D8Yv2m@6^RI9MY z?PE%do7^2yW=c;wPpB^A>dJnna63pgHy=?I=0_rz5J-G|%FOsZx#Gs5Q18~3eQLF$kXhMaet(zqovoD7uy2CMt7sxf z5tL$&aGnREsjHA=@>DB`6Vc1_ku1TsE)f8K4*4A=%|%bB6c1>M#3O+YYg|e*AI#46{KF+cSy&px0{QKV*=mUnBKhzZElkVULzs0&0deggE6Y z2451$ZTyZNty`?iv@RP=IhL@~(9P{KsIAQ&SmQ_87oJX2h8}50#D`nhmuf`G3)zxC z2f1X(HTtjVcS0PQdn*`=dxz&G!M<=)S@jhockLAVLc zM;8=o{nvdEmHPSbYzda~He^x9xN}xJXT$Tg;X6?vvL-JM{9OPd=EB5vyj z?p#Su->qkd1`9OxBmgUEP$0A0R1VsqhCuYhMd@fD_1-|???#}f~XH=BiZi+Y=*dIk4-EFp?BoWaDd z3esc&yi(vPH7l^0tD`Tc+Az=r4pvwQnm0Un{*Vpl3jqx8Iuqi+G9GN7D~4kVGB>d) zm-bAJDj}B0^J8tzgc5JUDI0~IQ7~(^m@IUKHOyJao5U}#rp@e{Vi;E*>qQ|U!JgSl zm2Pe#3MK!N|DsrKa$x8>F2FwLpjE%MVvCFz=PVlKz4@-GdBvy{R6)TS$xQq_zZ`(_a zg6d&Y8Ec415TOiY_r?XqiyEhJbP+a|d*gZAGLWkH-;$_E#*R}!7dR$#EmI009iuRXy z*~f`RKa%!Mz_>z2B1-ysAOO6`6ueUK-$O^$paDQ5BUSuuW}H8xwQhncES&pYZeMvw zVGPn;LPKxDN|GLX9SMv>>u%*-<~xm2m=zwDIxbpOYbpPYW{= zT_S%ElX+iE@eHek2nI-wB>=SHyJqM!^9V!oBdK7%pyC>{=8o~VDXjCSbdqT5ewXK+ zB@Acjq6Bq=V#tcB9Vnd$`cQV1V^X?QyQ}HJs##7$IShO^hJdknzvKp+5&&PIwyEwo ztEpdC)U-fbx^{iY?%gcR%wa@g=I##?)$rg3uxfyb8tsg-9X8OR*=bl`PonacBkf*$ zz}Z$+u{yk2wX!Ksz_-`^c#x5_i|If((JXCnFQjihTTY4!cbUu6j@V35ux}Pfu1x7JdobaF( zd{b9a&TM2{Z<+#PN{@=8#JMZwZaAJ;d!qseuHOO;XJlP_1?Luyr6k&}%UN~+Ebq%_y?e}MY=9vp_d8M09Uh3mQ&2H{3 z8X{FDr^HPtZDB>^p1}7Dobsy zm+aS4!AW(WL7Dq1WRM5|1HyMVbO_yPmhsP0n>%mCnG6&Q7xuH@iDUvbRAIRc=d;xD z8~?(Ao=ElxXb#-FE|zDoCrm!_%Z;X(GH5d%8o$?=;OxdC96$;t?Dd0KaI$6UQV|5# zWhI&yY9vIItQ3p81bg4XaaXX+nY;ko@)daFh@|-<-~5DMl7>by`S$5kN)FWBjMm0`=TL%9Y*^R$OvIMmADqQE;z9fy zGk~_Q&Pn1(Hl%)htWGkaz)lyV$SZ;p&iQ0j)<5d9LFHaKFos@O z#09v%{h_b_*?>J`eet#V?(_Ow`w?Ng-XX^5ziIQ3%X)=gI69>|#J|mEQmnm)|`48djI8y^rOVoQQv`a~DRyLR_nG;1}Gym@0%gATT`5fQf z=C!}U*4G^8jf6UKoztX-E>A>36KyIVD@buQ`|;mY+YG(s20)-b7}4-J@lJK0PhU`T)G{H| z%zg^JC(V-yt!kOGXT%OeQUA}?aBKsRUUoHvadr|y!o==_@?ld)-fFlpq^fkTvO3~F zplI=)On98kKUeThhYwx^}HkiwWMcP;X|!rBAt~Jxdmpp`L8ZrDw$C>oa30ZgzY2t@(}M4rrlhE zYJzmJnmw4uQ?1{D#+&__>tFdz$hZ(r3p({~-e_|k+;Psfi0cwa#Fo&*+|#%=S`!=X z6noBF8=%PPgg6o4nLr@%dYf^s9d^McK($n^fToyP_kTtf!M%>Sv=hF$ha+KeB zWvzLDo91OMuZ>0U5$di^>{#e?YG^ep*tn!0uT{q%;^j}XF4kg3qgIpFg#l#-LYY3( zp$ao8L^s^WyC}NL?4t$;R#wm}hK9ol-?ve^tXqzKqmj7bc)JC;ivhV9hjYx#e%E7} zeo=A<`x`y_kF&Kb81rAv^*Pc6`6Lhten_z_bXH$g|5Qa@7%fhbOy{WwoYf8lLf=$?7z+7EN zpa~JmoHpOyG{-S#>lbK896i_w=9IGJ25st1Q7K*VJy#Zp9ZB$wO!XWY2bm7WnWBB3H_X4wEgq-#PhlM#zG3Yl8M1bZ95TOyVw|YY@DwLGX1SdO} z1mYVPP3F0CnDI^KP%~NDJLkdTc1uA1Sz$cqG+UW6M&(YNp8RcL)iR`KVdO5U*tIwn z9{EDRGVhF2bEs3`mc*^?Vs;9)I>0R)G;Tjf-DWQPS}@9--Qe;Iz} z>y3kBVxKr5oPUEUz$@8X!fvxe3ur{L6Tv)5?y>EYUjll4JizPny{H3cYUAx^;w!yt zU$tRM{!^aUAh#|pwkq)TuX1*{V)*cl59NQf06tgSU9h{(=e7{>RTC|bT3e?if*kzM z#lxmLuhtYK1HL8$i@k|*>;?riIT#xigvC?uGXfF2 ze}p%L%KhA9mYd7?ixLJ{17BvQ0YroCR^0j3*@TS|#s;8l+t4CwI>RKKW(qc;6p7#r zhz`DNfPxo*kemrK5IU2D5QTQE8@3%x{x#%4XmgGwkC?ytQ-p?Tqa^a#mlqKlC+)G4 z`6tR}jbqA%Q_0TSuKZ66tF&s&(jCr^tVO~eGoXd_&|{_#8ylbS0@3OwqY`tt*-fvP zhNLzh|7u$ea(xsiba=bRWfp&K!YQS8DB3pUU&7Rn;d?^=_2gTGw0UX0ajl9CHiJ{^ z63E>Y8s=lR6D$QR2w#Hk=r;YV(|{?Us|td1g8y2?j)J^|d|6!?UT6saAzcc3wP}$N z6FMg136wM&$ICL~P@(g_IVHU-6`EIE$U6F8?6Epp5=O+&GxXkNls%+i%wLS7TqA4` zg4wu(XZQJCBa8ZNf)?zI%Vqm;NeXWLzp2pU>1#H|pD3H>hmlMl^6orI&o6=>L4&=p7x8i6EqldJs-x+v4e=w11>;>Lqv*Le(9BL^ z>}1sSOjWx`;weY4?&31*qr^vS6_EEGAQ=`aLmeLnJ!f+46t8P}=jiol2?*C1uQy0vy3^l6HZ+J)cRzH_5G z%m4G;XZC{8?!yB8)((k-qmDJ+;fQ64YN}9I>uzX6oKS)lJ4ydw4qj!Waqh=rghEV^ zwPDbw51cq`V!Z{auhVaM&Q1gi{pYh-sZX_R5D?;f@yF(17{8avt}ey@VUCX#q4wAP zjDW`H>5p2)!o?V-H=Wl(V*6Bl`m01+Iz&=?VcMr^lr9 z9`R*p;M1isYQN9$~9X{JJ?b(#X%e~LFpWxQV7V_wX!Q1m)5q9_NWX<|9 z|8ecX`SwfMhTn7d-CE2xS%TN3d;4kGwj@1P@^aTvs&E+Y>u9F81!gO9Rv_4VYd$UU z=jh16yoX-6#}gc^NTAF8^(TqI=h)1D9n>)Myobn{{7%KbFT6bl{En}wcoDBPomaoE zeV={q$~g4s_4NAa#oi*YdnNtf8V$z3&&lasXP8W3xAN*WuL~B7cV9F4kCRlMYsJeD zk?k1j^g(XM!gCO5Z1cq3PYk8z@sJom6ydb!VvtyD+ zm0%)EgT7_h?9Z1?>~M~oeYY-JzvpBcR7LwY=_wIwv<~TFZ%w;742YNYBl>hQ zuazA@Eqf3nN%=VOl6TlC7Dq?BY+L3&tq%L&djd;#2{m)vrSbP7+wWB(D{~=z^oO=FEMzGN2xrE8z+ z`QhSb_WYo~XkYfx`ngHmf4Q<49T>^n^^-Y%4~jtGBN4wOh{KZBHDL!!q8l)V8iF<+ zbluU)2jL|lZ=7hujKp1tTA9B*-U`l9=KB|31gQ)QK>mNII;ZH$!llv1X2*82W83ba zlO5Z(ZM$P9J7&kWZFFqg9Vgv4=l{pKcigx2wqDj(tLm$ovk(Il0dIjd;DaI)9```k zhuq9R)ecZbfnJP+;l9w}Au=K%3xN3X_0jW5&V%~-^Dv#|mv;O-y}A}_R+B*k8+rye z<5qXo=YITXs*Bu8I`YFswzLmA`U5XP3)^YGM^7>M$M6AuvwhBk4&vKNC))}a1!&9% zT)%>4*XpJ<|5ZMrj7*+0Ezm5F-zxmWA9>!!k7(PIww>tTe!*(SDEA+(JmB&;i_XtQ zuzi=LJlwZY)23Y-u-JNzCH6OH8c>=eXvSfCf`?>_TZ=G1d|-F~3LtC@YOtuRSCzE4 z`i|gkoc!Rh?ZJv<rd%Co2iTCnTuJJ%|ETHxZ^C@g`= znj&WK|5R4sxZ=y;x?4R2;(Y^A#fre$YbH2bwtS(kXVWd)hj|w(m5(2!^UI3{n4rzr z$+&TJ@*edW#7&Z9xtKsNqERN7%aan>)E zt5dmq@7(TV%Y-E#1RiM>lUDvd{0ajxq6&XRj(Cy#?mQZ_iSDImMveG_d%m+fc4S%x zN)BTgm0RTvTwUnD$KTHfbZcLC-hjUvP0k(;AR4gP_*3W-9DMrzFln{vCS%s{)D*1ZhAKLM43=SOB6@9=fh1h3Cl9_{=?Fe znF)756pn+5mGXFj%C5+6H$6*JdV8jzCf1&#g%_5n59dnJ^(yP3_mg5Gog7=xjE>5e z-(LjBypHM*J;n~YW->3v#*jCh&-kW|cF<)A=bB~G&i;9R_v7BNDcMhBnuc@1D!chl z>ru;$h?SS%x@x^z8=9TCM@Z5X{bt!B@7T|&qF2or^U)S>eVdwPtHXKYW|D`TgN*>5 z$ezFe&2iwVl|-ATd^j zz-*mKHb+a<<>!{7R?)~v$;B~KSu(812O(lbIRg20#CF0eG{eu4)YROc@X#+&D*s&I z+Riqe+2X`ChQPh)k>quF&Pc-2>ioF{{-K!F!({~jPNh*-BLBgMj>i=}%vNwaa4S~$ zi|4FWISPm{za07Vz3IGUE;s6CDwIw4vYY4lf;{GdoWbuNtG1(c6t~#5K6Ulg7J*P4 z0l3ytFkMj}5zZpyM7D$lBLP8)9xBCTs@%}CST=A1-$yLKkwWuawiCgHu|qBxjA?(5 z+r%H*{&VNs#<&*ChB%*BdAM_b*n$#4QZ7HDN1} zG$$m8`*7RyKn-kT#h)bwwo)GzVdiQrjs73xsDkb9WHLYF`yxyAIzA+w(i)tvdCMlV z{?5?lO*;dNuV8H*L(w#SpTe$NR%vu!eQht47e8i0^erkDs&=$THfaPiS8#jrSaKm) zOu7d=xrdU3|8=<_fdVSxbj|;|@=<*80HLcd-GW>A@nuSCcb>W^goMALeF6*&-1-Ii zPj+|Fx}Mo1dlw^oh2o0jKxr&qXRg{t?{FFeZD#UKgmI%7=XVPTpjCNQPh`}1z;A5_ zhgL7|<+MALryJpNx2NZ4SqqENsta4@yr}2Wh|t`uc!*0MNXU@$l4*~zHifu_->OL4 z9)oW`JL}CYQ#5g~Dq<0vvG4NA0|n5(dG&69vyRn+fZF)d=?k6?Kspc_l&bPV$`!dn2hK1hpAPVn|1d9jTwG&ERc7;3&h%UU$ zB{A(tP0slOSH}QeP$0U7<=6*6y&IJiDtdyO;yh}7UF$F#VGa|6c zqBgm-vmwCs%Phd=E3-eT5p;H>tl4%VV}3;u&%_L3;X#5*3vN~0dk4Hc{}>$10j+0P zSe+6mLVT?`PQeuD;-$@gHtgh4Tv2wjr*WuA_PB!JC8BIp+HBT6sHwd?rwrF_i z^gv>UbDa_(cQ>;5B7{=F+tVJIv|3|ftQ7=j|0fJLr3#W&9M2%2J2U>Zy9o@X7E8+2 z#5E{bW2Y1=t=4hd$P(gy(`$^_g~gI%1a%N{@m`DhJKgf|s~3Kkz!@mpogy4-_XTWm z#^x9O^wRFy!Efh08LwEaFt6T@4jB$m16PUc_Y2x;m=jd~(ZVSM#-i6hgiAJuL9y&p zCbvvWF4{wt3C37yCdVuHQd?452l}{PN>*3A*8JWy3SaBngqW1TIU5~w^z!CEMtYCM zGvjP>Y@XI29BqFT6fSHP&t2Lg|Ex^0bu_C{DIQi{=h6^-dL6;seJ>hzYJsp}@+2x= z1h#;+gj)mIq?Eh`!#d5rB}2a0oFR}uK@#>q;DV8Cw;PmF(;POr0hbL8V_RxMI5VW7 zwc~D92dOK97WjhvyASYexhL<$|rsG@5q`8lyVccZ!kT;pD| zJ!+JQ-b~t4xV(sMEG>o+T8SdEFkYMcTt-f(DH?{vnIEg(x{J4zPLM5OKuNjk=@|!= z-BabjgV|%ITCi~x$K=4{`vslZTLy)a2WLw*3LRPpn7rZyA7HI*AXe2nQ@*eYxVY^z zWtZc#VyevqsA$c41l^ELi`&Jfn?{&Z49@;K6arVapuQM9elMaha+Z)8H=#I&Ncu&v z3<3DfO!kfF0aR6n!%|=mx8Kl24K>j&nPY7C^V)^Mqy|c0%92c%^W&FZGO#QKGI9+U zWl}}4dhDgY+j+A3dGdg`Q?kWYzi1+fff|L|*zt#neCy(QAy}&DMvJ{x-Fz(UBhSZl zdbwvq={21^{w!W}nYCe~H8owhJb=@Nm#(M^f%byaB`-LHQHLutBEoJ>pP!Q(di7aB z&}}0)&ep~Tx|o}?`hjv;(y|vr&?(l#8$CibRWa7fwJqYxx)7XfrQBDxU(RGlQ=vl~ z3*Mw#cVInZ05p7CW+n**kcDyCQ>`S8^-~#n^MO)7jiK$$I(4gBm)#zyOyQ+|Hai(X z%)Z$^RC`fqOo)NHn|>F7zXP8Sl9xx@Zkk`_x|8UjWJO*>)Ky&f6zw~Y=&!Ge=@*&Xb1^t%I7HaWij8Ch)Dl@Vcti7s89qVKCS#lN<3 zqzpEg*f)gjj50Wuu9tJSyVq5Eg1yCqS%OkhTD#1JlZun3_9 zjdcD(RK029xShY58g9tp>6&CI?<*rGud3Y%BsRc7I)gugeMML{&`oCQZlT)t+wcbEQo!r!Q#W7ty@9TEI3g?@jFGDreM8P56+L#@TWX#^KW3q0#Hq zS1>T8+FkE77CjIDweU}AfjDfZh)N4~zx|1E4X1h1yUGm@m0iX47~Eopid1!c5L&c5 zr?PC?`D44%G>bOhhkE{8K?l`he!$x(=<_H|Cx1P8uYsfyaSuusSpHIg>=5CRjPtD? z8>$Pbx&LB(3*w5WniTDUmW6Q;7Ph#W6KM-DQA~rm{;RoKGO15;FrlRo^18lMI4p$9 z0&TfLQUv7U{dA{Kc!0a9EgQVwH;G9h)3weRCkt1Q&5keN<`+iwFbVJC(A zIn;B~sVJga>31Faa2eyBnnP2Ae2}RGjv^L7c1u&6&;qm(Dyt?83CRel!?B<;!!_#Z!NTI@ z$h>|&0UPFMCRpQ$`vuWOV2neHcBel+`j|wFBx(WPK((u4O~W9Gke~am@DR9fFXAjw zY^vt001t=|A6)g&Lw3z2-PzfC`ZQK!c-ynkFa}HAPEOn>=QfSfMzq5hcsa6#ZokF^ z;r6R1ShJNPSk_WcRo-T&2N*!_Es|yO|0OC7j{qW>5Q$2#S0hQ$HJQS<8G7Z(5KvUS`n}1 zE`;nih+|g$QdDd%4ko$~r#rFA9q=PFFkdyO?UnvC6i>nCam{Ubp<)KRgzjQ$X(~ve zQpWwSX-8^57R*?w!ANG6AwD=KzJ8Z^Lr?d@B=aY{i+Z=b?xj;R1{DoUbu6h95OYLg zw^DpHy_(=5^~E2tc{F8HJT9s@O%bQ6i!yW!J7Hr7$S_60IGR4169n)xYvlF&RIQt% zQ^H$DF(|;nt-o=hl{(B#n4>Sc_hA9*BK^4~)oNZ8BuvkrEXK;av-yt2`3jA9u9Q;! z77~`-L6QFa)}5}r)o6defrIlm`fZRD5C7<1=xQBR~rLmDZ;w0T!>) z>{58$`cGDQrhTvGA&3|&6>eiyi*{HAT*(T7{iRHs#z_{EnzI1!9|v1T=n7^S$a-F) z%mk?{?6bGQ)B_Kh<5f7raWd1MdsFgq2nSM^kg!t84R&#R`?CV0l_tM;Mg_PCW+H^Z z>>J>W5U{Y0*|Sl{uBM6zET$Xc?zJZwZT^+3c2uQRRf=7j7+GJ^TjAm1r8_|>K9aF` zaN~mPMY7wp-%JbP@&)01GFl%l;qW z3)cQru1*FUTQC`MIRYI4a7aqOcs~2B3E|<;`vK5on}s+tfA?f~O>BC#k*g}xdu0hG z{l|vxB=MZOAn_qx@f=&cuPp!0t%J4^Y+)FIu_i-e;uNQX>EdOE1ljff8mBS0-}XvH zV|SraCM12oZhJK=On*MmE0LV!3g|LfLG8mPA9|SV#YevqK0Zv!ZqC*Wmi8qANkhCs z2=yRX67~CTffY%?5eblxQfRW+Vf!H-`9%;%7_e}zrXzI+p8djX|IA#U28;&6D6Ezi zCL0((`rv5i!(Y@`ann>uUkpEJ*jWu3vDTXMvxC1?+qLATWM0)(|3vk4r_1#&gj+=! zgWZl52uVNq7V3>RG?+oJB*LAR0~4wusc?hN+uBR+f$DO}IilOr4JY9GlSoylzZ@0m zt?AFB>lk!^drfTo=;OL71MOE4rC$6MEsyXYdji?VUk`ei>y_2*_l}renZp z8=iXlc3Xj7ob7cfRZc`kb-_S~A-vT?o_Fl@$z^4SL;p zoY!%x?8;{sr$z~-zSECb9c+pm3?3_l_p@xsd*Pq`)Z?$lgjP?;2=9q}Kw3FgSX;PC ze&C8YOxX?uEqaW`yc`I#Ykgs+ya($HEn!D51=-_qwSI;Ij3EayS{qpNLF--aT`f7f zR;>7PW@alQNbd>8)&mFk;FT5rv)U1s|kb|DS7 zVCWs>G%^lGrhT&fRtQ7k2c_u=*`#&2`w>Q=$B4Ow-D$e)KE9#6QGvb>WOc(yh8B3* zY}4?wYL7%E-9$zKF9_MsUJuzL$PX5jUa3M+u&#{^pdB6StOo_xxFH-3Zu!cLXrUM` zy5vd?{qlm=5(fTgt^26rH>b#o(jz45guq=Rh?SDDC=Lun4VWy{<6)e@jUiTI{jV3=e0aCVg%R;EtV zBw#XUy2#?dN?eX9n`TI~`V%*r!!Qd7ol-D$@6**b+BC%C&*kmk&77jg`<*RHzMH7P zUHh|+G+utPD0x?Tj%#L%1F66Q`}xiQ153UDE!bB&R#S*j0|i-;?5`pU?&*(SS%I{z zzMk~|#r%FoLd0I}qlTI`1ipg9#D;Dc${$F4zaj%Hhd%gX*C)^~KvFQdfVA!(jFgLT zuoAg1e|KTBga*j@NFN&Yk@ugP$zHEHeb?@$iYqD-z>IBUkF=4KK&3vWy39ZY{yWL* zQ8%&vcO1m}x=w`Uj2MYB#X4+6(I zMhv~xi8e8`Dl}32U;iU9plT{wXRzEZMfFG?x4z+?xtOjR+=7 zn3d+QI9V{<5ka_&andII9Y~;Wte;6)ku>;|4gzt-OM#mYd;lhwy{IkL1e%5S`Mi}l zSXwl3MpG3cr1dwZ{f`h&bwaer1@oO4Nl9k;YyR8x@W*9J`1g zzJ4sNkuW9=#Cj(_c`Zsrvics&|1?Gbl zih$8YMlf;zJ=W{+F2a-%+w>Xr@TfzFkS!_jE(u>l9glh1>;5ArN73)T%ivumI~3w6 zVwsZJIB~i!r=N;`Wr$laL-luR4D)F!7&YRIuzbpclMq|7Ti(fU$O*cAZfZqr5$JNL zBXFgpWP`0{1JGLr=fa9;4y{SB&Cp$jib*rf_CX}ZhAEdXU1qAVkn49C>IKIbvnrBP zg}v}T3zi48na}~K2hScD7Ssz(`R(vW&B%@04!;I)=-qE9H*q3V6bhc$rr_u23>Kz3 zG@li4rzH%kdPNj!L$kPe z-e?}pC{=Ccx)gnkxJYia6x#`!OjTuXbcV*>R=uR#;0eg52r>SSl#R1fB{0YN^JT*D zx(77UL+^Sp%Bh8VQvT|rOj*eh_e{LjDef6ur4JWA#BXlxRD^dEPy(eWBczs+rI{7G zr}MDW3sF%zje5i{fF}!knjY!OlgoJ7J>icasj`oIu<|vQ)eW`}(q4!g8zimX1#yU z+@@Wiw^}3r#a&6hDnD%GTUN{WoW=a*Ytan-@pSrw7e+kpiPTurFngFV@}<)Sg(j3i z@>KWena7_RHS8d1DP1Jl=Jqba;4stG#B^tG zgb}V=?Ac;7xlYJEl+ACk5>%_}j9wlR-y$hS5Y$k@1t)-~Tc4w!RPFn)gKSx(4bfW! z->LZ5{_A(KMQ|j#hBR>A0LA`klAo9aEkHMs<{U!HWzE-5<#=T0#3+ckwbcknmouZ1 zPM0oty{=vPn93Q%*k0O+It~QBjJ^J*YP41eR-aAnuti3hPST!htHEFlO$7o<&^19X z%^p{v(7AjDdxq85z!7mgvmcU4R%fQf+-;eD=RCl`+C^lPGUNo#q_2GcDSqr$Ld+Yi zv$b28v>&J{&>xApr4$A3&72Hw8C;^HnJsTwpGb*Sj3j0ckgZ-(4E3{4hetm|k|@Rk z7l9wu7=q}J13RzY1MBHWgD8C;K6w~_kHRjI_v;rgn#eNRZoMUuoB<>j#?fu zD#2F}Z*f^>QsBFvj9K8xwm21N56WCqhUXR38+uksVgfKcn6)C&9JgHN(YAjGK5^Bk zt%IS8iQWUc;87GBklEetT}p8n4~H^@%Rel9F>?;XsIO{@+3WAc13Rb4q-G4O%7OXp zUtaw+OiL7mj72Kp5*A~^JN`rNvvR1Qo0|lAwxFIVRD0_BfOkLQOew?T`KG-slV$eg zi_`1+ZcJClnS)IQI1#ap)ZGfzOm}h7gYcxXDiauJ)20q%WB#+Vqo4*ssFmOHthL0I zE^$-}xYTArcQ+xO)?b7+Aq;u)sG;GrR~`Y53?E&}m_J(r_bX~Q4h)-J(o8$<3XnEc zZ-h|SuByfJIAY}#ni%Dk^W}L8%V+k#(0`g7cor6=Vexl;43*KSL>3vgQx80wKFvx1 zy5|}M*bwF(!#kc;UE0jy@YOBYT7QK;%Y$O*WKXJ|BN;*ho)U4PlN7%8!#`acpL=IU z{~>55YO~pXqcvg7^ch1f1#nCk$^|NWVKJ+h!laz1!M61L6!s{y@d)(HVC*Z{I`<;O z`Tv`|8>$!zA$YPlY<_%K2Gw^4o0w!&V2S-y7GgHJ%drg)E7v~Bz&Tm7W}heLTD4_+7L0tx z0Q-%v*KQoBnH`=q6}BW?ix*vLZBIxrzFGMCB3Pc^S z$x_!)Fta7CvU)zI65^spy&^~_ta9dRj>&1LHz2>-V&f!A!ewx7h(uJ8GRTha@}0bN z4{gl!I`|bs9b?6a1z+*au$NB+@aM$0zIX?xkEY(Rj~mRg5Gwez>g)p3q6CUcRgAAt zRI?NIxASKBp$<|iPI`nmJQhv0zxI?$rZph%Ry&KU{$HCc@7n6OK5ogFx!2xb6kcfl z5ueriYuhIp7gGqKqr+D5u{3AZoGR=dcWcJ>yF4hfNS>A)E`{I{2xu8twlScDOFWtn z;?X;E`{u2dn{P z@$c?D?Wymqkb4&PT;=c{tk8l}#Z_1q`aJFZM`QlxXn_TU4l~lA|0bAV9w8{e!Dz)i z9X_xcGMAV6N+{pn`1<%m2#(|`!_ZCeEGg`VOoaTA`Vxhv$8|tC(1PU~pMl^% z<0rR#q)pjCp-v8x3OXxfdfnYg<)P>#tKdzzxNO=;4uE(zFN|xNJum;~o+f;z+%C-K zyv_d}8*Dl7bz^EHq=|MD@v`2Q8uM4Y+=%)KYUaVi(XWfVnVJCY=1(*F5| zrz$iB8eU>A|CkNz;c^9f8vY^%lFuMd)mmtLTEYp_! z5yH_6t<~*sO$)qDyt(Y_`1TPIXyFM6FY+@6f4rZAa402^xh}#iW?iTqI(iRjoZmr&*Dm_uzy%CcKMY+&2P5LT~9s#6|6AGgX6OS zrGkzY;8T4?ipB@t;(R$w=JDkp?}-y#e((^AF_`trQ#bH2d+Wu(7q)f1=gODx)Mh`t z%=_9uL5lZ4Xhp;NnOMtT`3X5kR0-1l# z$D+^C!I@!(-B4*d&OJoiDN|u)<(mN`?0?yf1ZkDr=~}|7NE*RR!>?wA1w*FPr)9U> zuIb1V%RME#rvEM#;e*OxWDcGC!V#m-+AalnDjeAf*7XqJC1#0nLM7fKFxd11DcA4U z6_gh^Jujn?Ank9__H}a?Zbb7v=TOkZi~z;q#_(zrFox}E62AF~6_m!7lJjx&_qP=B z{d0a+Am#(ImEMCqoHnDWl>L>Mp+z4atzw%9^a&;&FtCu#xK)PR45Ep1KhHQX9y8Z4y(F+=n{UD9132GifMvwG4$DLBWT=w% z9=)-b@#h$^D2qfY|#lL9w@o|<_k#R0PY<&`x(Q2=Bp~L zm?HV9pW!9sF#MsSm8IitCh_9XO&+lhIJ016sgWZTyPll!W-}{P%B)C~gh|X_Y=jBA zU3R1XE67^7TBi79Ru{P>$Pc(HmhgQ^Pem-(DXocB?zo_8 z$6F((*tkgcO{NpUGX|~r@@+zCWKIPKHUCQP3v#0Snhz34ORd>mV*SD*^(3Xl)7tp$qy03oG`K7FIm}#_wN* z_b2b{UpY^3m!9v|n|-cJIXGcqH0TrGCWWE86x0-+6jkHY5mVSV< znbTMmid27E09mdHqQ^aHRS&$(?So`pu?F2p z%`C&ofY{q1|No(2fQGZ19sk;FcW~>{Ncy4*uF{Q|D(fAq&4Z)7HwZRuPF&_KkT}WC zBRHcLdh}K9!qmr#0l+xEF_iM^F$v9YL?f5+I}M*DMpZ%HanUVAfn`z|KC6Hg5G$U8 z51(*!gI*ljpR?8myMLvW3t}kTWmcBq?C_{J7jMR~>uk*PjGhZk5{vc&#}X6Aqhz2$ z7$@*H-byf^#*Y7%=U`YSx(}ftzH}!=7&1^9$%q>%2i|(~-k7?n*f>>>rqiGp0H5T= zz)t97VDph0ffBQl`0mbfoQ5)%K#u~Y z#>{IfY>X#jUUq;S;~2nu5O<$m;GT(ME22A62UUm$(ZNcr8kbdNH$pTvG=VX*Rx?r2 z{f;u8>mgY9yj9l&n*h>UYeWU@=0Bv_5s2E1gajAhfRYuDLZmUhbhOJb{8@5gpiZ6f z1v{0V=Fx$>mGJ?xJw6A|M@3)8L4DV~uf^?WHJvw!t=*qn3yX`4iazJbNAazj)HnXK zX7`6Q!b(COTbysxMCxNg^`y{3Z?zhe&jqWU=aunehz7S^&=1TsgGVH9+~Z4m zZDOG3&0hUF1pk=lt$+FQhJFuiqq!)=oi6=s?l9R9lO(5pCNA`l4tjY&CKDd?mqxh)ma0%WbWr$5J* z?R#BYBLWll6Cw63N{Nidi)s(S;#GBG3VupmFp1lnKL;NBy}M8TuQzmV6O-kS#Il=! zc^b?j0@`D_q4Hgewpxalyds%1#fXHNC(#*s22CB0`gH^$+TWZyh({5t!_bTnGgUmb z=@w08tLCMrw!J&mKxZ*%*xj^JQq_Eo2n6s9^a}r8?<5@8m9J~&4ZEROwkYGnd5hM= zS}fZ-6SU@j=y%mPh)Wqe(IK%h#qpp$_#uc%+248z@|(;`0GXCro8&ah?;&1_n7+cD6CaIvI5kGA*Sa@#XxIjCEN zS6_t#2hr3xNrP#Ya918}O1PL2vD zVvdsG)nNyA7U8>>N_4LWtl z5*9l2RY;J|E8u{2)^J8=e61++Rku}4%dh;#LS9I7!4fIpGYcq$f=(d_mt_h|Fxs;M&(4<9`I1sRSYb@Eua?{vrlC91E!DQm5 zeU8v2b0YYL`llV4H>O)j zS*p&YQ?aUSaKY^^B3yqw#tiZn=u339OO>Hz#7~pxV9h9{=y#%H!3tw)mwjVs=&#b= zHZNm@pxW~z3_UCes`fTzrQ=r+Gn(6~3|8RD)Mf6vO#-nC_EUq78`r8#$ppwa5^@#v z5zv_E5QEAf1O9N>g|JmZ*Jo23D)XYj{=vX*%c`rmp7t$z@U8v$*$9w}UwSi2AJwaC zFtzQ&P2s#C{kV>Cyldp!frRd76=6f)FQkBjg!k0{kMQZP7_3)V*qDy(3FClhi`x=T zrPa-6PYH5WT^I=`pGO80EI!H;m}3`|7X+Sxdods@#xG1+6i;Wh-#`Tq)FC7)e z?!^L@D-!9mHyEz~f~6$2x*7G1k-C4#N!&$59{1#`&VS{(b+mPa2%0B(Z})Ij#dLX@ zGEwcnF!Hp3cBX#_u>?m7&mE62LyQ;hbF1JP-0Jqrf}>^O*)z>Nr=sSvny>`I_Pfk^ zf)Ailw9NJGr~NK9V=n$`_chcZn^Yh`p@zz4jjPaW&=13>KUe0K^Jnk|c&=sIJQ0UV zc5^Fh>cDa4Nd{4`1Weq<)D0n{cPo9GK}54AA^$d7<&Vb#L?;|dewLQaoucSQ25u?c#0&B=0P%Af5~mnqJJ*Um7l57gYKPp8&Xw>G!y` zF$;12i}-&kxKW{JIa-*F5+txcivqK@BJ`EbKgzwuth>#R+QwMZ4(hxmjg?#h>V5m| z4V9^izUKZan8Ye@3gE(JS$ZatzQH41#+lydGNvROn3_rmb+vmglAD}3yBb~J6w^%w z>_lwd`cb_KOt*!VLI=L~i31@_?E74+{aTd7>5dB93Nr5t8AgLl5_!sw@(Bq-HI$(4 z4h9m6hW09!g20O-A29wz2LlDcP-X9n7)81BndxsAf;o9&^~r%C8djQ)ZvQihP8ZJ} z%$j<6eu0LwX*14n?Fn`#B$p5^R?>L71p>Emz^>$Y)xOP&mmBNXH9u%uL8g(>Qlp!6 ztSV#$K@D|*MIbvf_HN`hiS1!+<3JqzNv-tXTkXxn5lP24>=W?U1)N$8I!^uf4sLPq zMXKJ;SDd#Qz$pdp>LdiOuQ`;T6)mgR?synnJnzQby4Jf7d* z!w?ZxXh0q{zJv)b7b~^NU$E2r{g+Z(>F?h{#3Oq^h5NNPCU8=p_o_+d=ppZ&vg?AY zqID@Xu(I>6Q#e7Duf&fYKW;*}=k4e|joY9K0lQnPh{Sb@pyv&_{knts3&xVx8p;S- zxXhgO4flnx%TGE}2drQ)f{xaqy5I9GcLrOBb_{k*zKq^U;u zbt3$){k{OTM`J*ZDyMm^_{1#TfUNg*`X(QV4YQ4a+dhF_$T?Hs(@L@4+^+3kW8SCo znIH>GxvMuJrUb{(UMJh4IOTqOz{{?9C7?*@=y;mo$Uyi_RODJv>OWwZGujP5 zF49=K!;6PeZg0=oC>xUGes9-7w=+SCvgD&RR4t^Ubk9w%*Y?1i|MBOS_&UfN0ZJeP zk(D{&nQJuvO&~_FG!9Rk&JaQ+Y(eZOqZ!%7S@AdWc44qEL8Sv(R`qYUn)b1Prl8rx z%i>ES!t}kUl$@R(Jw9+qkl5vAiwNwpwMfHvu!4dK{@=BtswjOpycU%Twl4au%>PyB zeW{-(Id>N#BS%~WqYrCt1D%9*rRLovP+N{;g^Zb>8tt-;Q{)3JWkEa zC`^;99y zPNnc2!7%5rFirMQ-M7duD7Xp{+f2NeQm1gyS$3l-XPL}dJ6%QLEVPhUg6#HVoKT|( z4cEciW03tDaXf3EDBlFaCuhLfl9O6>X+6snT&Is0=B|EXhwv%e(NJ6&RfcQ<~XQ16Xb=|MVK+3mH;bD+k})^E^m$cZc2fq zyAM4S8(f5wcT+H5C?KGmlnaCs7En%sWN|->@;5|=`&DNdYs`%6qv!UBdulSb$~ni5GZZ3n&1w$J$6pB47!T{2MAW z^Ys*39ypmnBm`_)~m(>-qUUth?5-oID7 z>4!;!zuJEvdV3%h+ZEdHqbHBamiAvT3{QwhQO)6{6`ZsQZ3C zUO$dAUT*vKXY0iA4+5-)8!G1Z@7tf(trrizcQOB{d*8Q6_WIp_>bguzACdgK!}4rB zxUc_Jqa?X;xx6aP1)U}mblwzn?KKp2kCo@5z1M)FLK03or0*);L(Xz4;_GnR?atSM zNxFb`q=_zq^c+fN0e&cSWK`yGnM9MfPS)=zaZT(#RwENzkeL&@Np<7_V9l26F-|R7 zY6ab_8k$~u=qM7rul~Q5K~Vdnz%p++O#f)I>(wz`=DX>@c!pz;NQ^wS0#Myt@|E=X zS4$N3Lu+z;%YR(}r2~MNW?YjX2HrD{1-=< zp&JI-Qm8ZaI+c-!+sMiE;hUg@5sakyy`-;Lc{8P**WJs301W5M0gL^%Zxtr`E-I4v zLRys_TH=Wgl%Qf_aZYB_>xkP?#H!T9|_QKr>1_|P#BReU&mH)2Cwg^G% zY2O#V$ zkjET>cXS3u@^j}qEuIci=Z!insuh4I;Ox-74wyVQD<5G3 zs0$8JqG!QPuy9r8a>yfA-P-@nZhL@9si(dNjGMj{Kby+6;I!1q!D=Kh<#Q;_(>#?a zq9dLkRG>mh-bDo>`~`=8)bgY&C;iT>oYoXUkZMHJ}rsfW!6o27w> zo5Ri(U%46n=gXJDIKim?2d|`MF-gg=`$ipqh9=*)Q)#9|IiWvJ(ALW}ep)jTC8#EF zoLpSv6RDGGcR%eeTau8Nz*W>PVe@yZq6zA>o`-k!2^p6p*NL_G8cCJ`~em|F)`89`|Y&i zSFMKO1d9JWyj+O|$csr|8U^%ro_Oe1`!R878RzwP=^EjC#f|G5$2G?P!`r9;07CiJw5fzYSt z_o(K`EhxV2^OT8zA_!r4k*cwB@Qf$Usn*}t?ejb#Hgxf}rWnAm=J?}>&94~d*Ye-0 zH%i(K3On7$y@%|1uWj1tuL+}w+ySUUf9g0OYfMO-)r-Sjwp?ZV}&HLlo|ONO9aHDBqHj{@tPH!ggr(8rh8u zh9LR632qm{bXx(22K(lJBgA$?p}4*!eycd<$%rVZe`17d=Wkrk>QfkzD?kW zER1BI?YYd?0x(qSD-4tbkAXM?g0YXGB}ei;XOs+q1335T>xA+*e-1FTp zAqI00A?`2_A_TFW##qXIKZ0+neYQA z3$QKyPX_F=m`7m|u?d<+iX5GACA)}<2>40iEa4^4rvw;yHOsaCkdVBQM3=mL2H~P| zc*Bo&@R9)nh7_%DE?&vtc7vCowywKE@h zI7eO!E{JD{?5=X@-8z_Ia;SETqe7Lz|+AF1X7e`S(K{O;9ITHHdb?z z>A>AhNE^B_-zd8u>q(I{H4R|wxb0B4~MT~4NSe`9ia z34K*=+sJOtsYte!pJfd{0U0HGH{3m6a(yZ1=6ZrbyC}1@`=VaK7KqA?NN`tYt5QUA zvZ5o6bo2Fbq6#AW5M0w^0HSH-Xo-_{)K5;X3?^(gsIyBIf(B$`dHp*h&c1EBM0v&X z+YOD#F+|^1?!bgOhnbcaYAl57kLNk@_;Q^VDmmIugXguV+ zWP!dXxj*h%M6!S2kJ1)LQ$nRn<9DTkeZ{X6+uwUP&aYS+l}8H=X3}HBI6Vf(vw3Bo zsrH|%*Eb)}Zjn*Hi_I|5qHi*RurSNzs+I3iCx@r+#a{PnPws*fqt_7jG^H+`MB=Va}%`-D_PR9RCFWhVn72#Bp3+~#nKWSqCfB@CCnpVHH5|ym>8_8D9gR(|_KmX(EBxcJp`49w0IMVR@W|ms;$BWUnd_C1z6CgV))S z&_J^c-o|7W883&6Zsbi>mT`yiSM%dg@zTT#Lmc;)M?M+Lgi08El8-cN)L#IzQMfzZ zQ>wbBtTP)lxS9HDihK~#LTFpl7*s*gJh<+ot1rH~*y~MMNF>yR462B@p8gKMaA zjL$46iqIXOoiV8u5N?Bzg7<{5p6U!k@QcYH0MM$T1=df9`!pw?3O+`IC@l44L6HF# zMg(M3V4PyiPek+Cp51U8SPS5%9Ikyihq)nOw*x5S`mP%Btf~NLyBu(TiTRFks(b+4 z3|Dy$*@HQ8PfNG9Ri}(tCCRTbEY+n=9$bS$j;6xotiFi27%>qnI>(tU%`qBy0HPC! zYlD(UHw4~&0Dpkd$N9bqB>8e+tp&@d{#j@sRVb+L>6eBKzCZOC7|UzM?Z zKI!N*K<*(kTNfsj0-Wa+M8Wqa#0mQ4uYN0+fAQakeP#~;h{U}FUD~l9Fn$o-+I{A; zmqU4>Lryy3c*F^MFXoR<`R)Jyaj5R3&(iexHbT_eXL zHq{xYpQ^yw?YG~RvS_odW*rm1&Ev!y2^JGjG83(_n2#Wwwl8)8E!E!~54pLya_NUJ z*0IDqE|*j9S+#1VSxm}r8!RfhcnOCM;EtL2tO(u_-wDSwEx^C@<*&>7^=}Hx`_Ls9 zNg=G*ZocJK=H@K}5}(h+`~K@&*9a}KjyPh8TDMhHRN&qGRspgBH(5U>oC0{Q+CTWs z*QVbiJe5iam=dR7LKidY1v_W-(LPux5AKO0RGa-A8=hb%~U_GC&JmN$J-%PfDgIt2TFFlJfdhm=vrD;~~a(T$CQlP3Hax73tkfO_a| zPFB@YJ|`0k=S*mBWkAZwjlMBL4Xes1L2&pa=lIinuqvU(EQJ$M@E_f9L7-|dvRJ@q z6hIAHCIVY*r{>LI{{Fm~(9~s_$%%ptesH(`&!Qzua;Bu;8n_o_oAswfs9Fx-*-YFV z@ESkltgH{+@Tf*U+rm7W6Ln8Gj-5Ib< zLp@PI-{0q8y^Fp?OJI&gj}5LeVa?(1mw6rPpVsMFj-~^0h0kQcImxt5*U% zIxc0&bho%|+YXI!w0iZC3gW!_+B#SXxip5*YwO;CMNy-i^WL-N&O3gpWf0UNAYyc~ zl*PtRay>+=xV107f;CVET-|+BE;#>Oz5dvvPsZ~Ncd&iOPIW7opO-H`{?Yf)N2BuX zZ(l3_`@28N%dfl!H+-eAJldmR%%A`7x4H&<@S#TyYdrML14*oN!0(5((Nl<#>cJ1uG@4+i3AbYqB|WX3IT)yjy&*T3f&V4Si;E*&OpG znAOtKDzB}3T|vNK-tlwPf0kNo{rtAu<7>X;`>o#-M*$C%5@-#qmU?)v(LU@^!J@&o zQzphX^}(9B4z5#(hhk_=tE4VwQ7Kya(&CwJWi^gtI<>^Uq#H^p1fINDm-c`bbP?SS z*R`WfnC_6K8F5D2h)K#%{%p#ShI^zzQ{>=W5BZ7@Eit2MU<; zk@=lmCq{MF4FxAG{$tW(9bwp96k_#v;|Ci44gkj()SQk;43Ar3t41yQvStw0wNJpv~S1>n8$Ic5F`C0>-9- z+T#1#d*HJ>Q>x0m(hY%}0zEp+jd4HW6&>&ZfJ+d)zs{TJC!=PZz&dT>2y`fLsfCb$c{(~ebgUN?A8Bnp(KK*>5bu(LX5&q!6R1C|?S39|0H(G6BR>!GK^4UGdle&}2q!QeHxS zmIKQQSPLOOfP$jvaXnExKqdezpc_3Hn|+Y3T616pRZ-xSUHgO5voGyEuyR7(JrFLI z<^bqNJ)6LD2&na;t^NoBV6OKVLlkbmSQe}@scg{J6;xiI=YSOj+|)8#BLD3LDCI%0 zZy#bmF+~a3VGQ@;8C?(nu?%y5P)_7_ z=5@JT0K4vy-H27ib=%WVKda|1y6}Bk6hR)|LrY^?pIvald2+`ccgv?f{RNG`wP(*> zx$mzJs4Ks}-uDLufXq51f789+k|m2Z2G{4m@MSr2y@txB0m-B=hai_ZgT(#;R z%A6@DrjDa2l{KNl2__e93#Ku3y{40SKU+vyB==SsSx#w!o83Tn2Kr-Ef>1hP-$ij& znj#ADwXyFpm1Y~tYV~j#+zHqEJ&2i2t(Y*@ZBz)r!bV^9Q16Rtkwk9HHOc@!%Nxyy z8IO$rHS_AaW~c|mb6W=%1ty;Y?7Ea~*|DDIx`aw|qhVbx$Y8jCVki(*1|Fgb?EZ{d z&%(oaMyesh=TfF)lm|W<8^c2sX`Qwxa9C2n+$Rs$c={t4m@wivap?zFI3SN%P&_Tb zC$pknmt9U=QYMeSz88xyE~5H3HR&|kEQf7NCx2odPVz&GV9k<;|4uA#_?%OBmG9pU zw=_PlOE-lK_T2#qdNTy)WWZezs_=lv)|zE%-V=q8+0g2y5U!`sAz2WB!C8;Ixer0x zG0~RhWJwX;8+~{02M_=`h*V%7?1eTt-!EOkOmA(j4AgqC_O$aR53who9k{6r)`4IFR zukLNkb-|k`iyvB4ng08!nao%P3l_|iQ}ApqN}hZEMGX|q=kQ~WQwp6(FK*b*IQ?X) zoKY@MJ^8F^DW8#f3W80;&zx=!S#yE*>{iv7&4-qBX=SC96lO~kHjH=$x>(r>&y~Q= zHJ~gvm0ZXi42kpv88i(w=6Rk#brZnOB3Mo|c63XlKMKo(gQuONc^9My+e{FXLMFQ1 z<5rM!QWQWZV#i~Sg5?6*pX2J44hYu|miIjxI#_uphXQ^G&s-3a)wLn+5%_-&+{AgE z0Hf$$4^}n-e^Bc7HArbmq2%Y~X#Br@O?0^jL4!;I|fMmWiw=q2x*CKX7anYP z0D!{)szN*_>_-76MI?ZEzzgsR@^|S8XGtN1$3;G;T1905JPJXIQxCU%QGiQ@a32gA zwgOLVhsn2QqBBA&k#adWtVkzJR@Zy1Hx-xt`>Oa5v71^?7t8Ci5 zMQ;1Wo$|pCUa0F1HvknTJH`~15{^CgC3Z<7$DcwxwH5`_KK04V%0TVjiy9n6CWlw50b|a~X5u*K8gcgQS#rYW^Kp>xa_SvT^AFHo#h_~6Sll47u6rc>zi3wt7Jr>?b^NO%Pz`R+mKwzf2 zj5pW!>?dH;(h93u=vBg+7<-Z+UE5Bt#61e-9d>xO;M`>V8NQC}t4{Esy^0T+GU-2s-HC&arXYfIh?f<^KOqP|q<+A^`NuJ!$q9A_q zeRMBcRpOSvUb#ZO9efDScw=XW@>?@6m844xTypPMmPrNNo`2-$@5tJ%ZLmr;)&yog z>)WEhVM_sBTX5FWRm!mQNyeYo?lsmj7~rO+88-#|^g!dRBHtyauB_BW^mHRAUGZ() z)2P$Z~(LY&2V=^!LpU64+Yqdis?22!ndkoHw0{9sqcc1Zn#V0L`l~~ zbQ_e5fbQG(bxBP_5HUfrWcAz}xbz7_uoyUyZaiv2&<&9T0*W`^d|Uqc@RK@LRihZf zg^MpfPbw>@Q3@#{#_~V^`Gmaj#s*ouXn~x6!8vMCLib32``bgZckjNqpnzJa)QsJ; zXP>mg8j5`D$W_bb%+pU%fdhLi%i6GEqY8rLn)JkYlX31agdr$$WQ%_xkdsoE;9(}C)Lr>y)Z$pTa zCl^3aSl&TZ3EwntC znP-zaAa4PfYAh~6JE87yu(UH(yAsclKhlj77r0DL#6xtTUvNN0(B5tcyE%VS5Y2H) ztCStBM$DR)0LCY7V_&e6MS*lF0QLh{$Q)OQ%hVEk1CSzdJhnO_J`vD@|eItf2rep z#PtVVA<{aAKnfE<9a;(U-OxI%1J*?B%LV!Q>Y9!BDCh#vW*1^8v7Iw!R4Q7uaalJ|f4+3sx;(g5T#oBDfj0y$D>g(&}taC1sAfC;4VkY(#kH;&&|J^TT`Ld-3 ztzd~p`pvGIB_X){V|`gK0%uIk0K*8}HtVq37QaC zW4@Z*dvtv;cTSbABYUtOVB9JbMAHXYeh6!fr2(;lRJx4$nXS9+}SfW-cpT;@=}i@cC+ zV4qjh;8)ky#Q@AWj)zJFs&lfvvau;cEu1;WT50krK)%8El)#c?c5a_~MzGnPvK4!F zT1pSQDH!fW$C`wv3~C&oJs>6jPPmAro>Vu6*{Ojavx^h7&&zhm(^s#C48kQB-?BmOf3*qmWBczj^HNcJ zafL_LUU#(0%})Kn>#}y!KyZm5)l7g?&s}qr?wii}pEu?4w*~@QW_cu1;&?aDC!RA2 zIn*`td~#Wd_nGCHdClKu9_!npz+_Q?V|Cd~uUz|qD)rJb>>39hRV|>5395gR(#cYH z^--BsX2U|1G@+#hCtq6SQCLP{sWGp@Z2%Z4h4>4LK#xqj(9K2zfZ`Tt+^S4#=LIEuoRsnZ6F-If5JC9<&0gL?VY zMHa^tffs&QFJpWSu0$9Je>m8tKmo`lbMpZLYojL)eB$b;8(@eBKtmr~9vO)|U~v7$ zdWP+#q7?xd3eFv{27`oOh3R80)4DHx3J`eWCovIR;m1sLg=Z!L877#)bMxlSF)t1J zCV0V*nTis?pX6sS565<59-iZ~7A>65!+4^#5&@t0o_&TiH8;nB6J{{_W}kvy{LSYq zOuC=v%~VoSEc}=$v8}1HBG*JwSN4R`9Sv)04RV0~K@m?8>r-Wf8* zuEAdrGGRl@j?ZL#V-R3c5{3a2EhP^4pFs&kJoOV~ zSmMOw2~=xMTB~tIX-AwX7$2Pv`uy*?n66b z3~@0&3?(L`n$|OtD8ToDxf$*dd!Z2*k_Dv>wXWfMmfez@D7xrF7JyDRSzPJU4GAYU z2Q~GF zpHluhL{n*LkOdyhbss;+!;ERd| zMLxLE3p9zd8}93R@j)!BN(75@!%?|e>9(@)C_*Swgkct8XTfX|0 zFQ&RQrRO+S7%!3a8+M;Hidxdj=$ik&Y7}=^Sr0`D5Tp;oIxQ0*6jt={CX!D}Z&)pQ zO8_`Ju?B;os)A4UOt_m3MiBE5;6B##0f1A}Dxo?Q#@aA|4~IUE8i(=w|B_>>lzJLn2DLwI3_@}dS0$v zc5<1#dr_VO%$w?h@~0Q~%b(Zo*SJzQeqy04hC9@;GrzS4j>2B9-B?&p~!ARx?pJ!cEL!G9H;1d^EtgF^H zQFuab1VI1^(Z9JNK~m51{dop9mc{Uv)OX<;Gb9jn;N8>z7pu;Q}y$ z1$hlz5VQs%1d1(;hHU@zZ{i_cLvAXv-C0=RdSI;scMEu-4bWz%z><^Vmimy)D{-oT zF$3D=ZLqpBHbiNSn88la9^~oH0fS>E6)LfI1tSUIH=6V~5xl-y1P63Xl(` z#Cm%X55|UflI?~C5CG2Ru3msC6lV9ggvZRQ0#nc=bO_2v*)QluhzrL+Ae2(*OgePK zWmJ1xXRIGl7#@Y2uq?P5gOCGsvyw%Dkto2i)Cm_Yb?rTH*$KcMeuWCN0R|yRQn)5n5wkd?zy%FJ^ylPqLI}dd`N9DgbCF&<`ms@D z;&>nMkfa~X&PUMI9@iSw{>^to0U--kS9Z9Gg)2+eK7jQGU3u}?2e3MfyTYo5Zdg3w zLRyLSqN_eyLWM#>Rk}#)#skV^h;4dxy`%&^pwd#^%z2BJlp0G4FChyr(}*jT{Kit< zZJo0yFuf??g96d7etDZJWmLfZvXv|fj28vC?({=(Lf8Mv?3nBlAXHyZrj)@VFA62L zX6%_Vv3U1og<&B@t@HkU!+6!{fXhKUG)@o|OR%wkZiOnJP{ATGaa~G9I>u$Q1K_1= zXj(bz8a*-NG&mmZT4EYhc~n(kSEF@BjtwsFJGwA`XCa2CNL{B$6ZF@(|K{Q-xr+|@ z5H4;^q79je<&9tom1a4^Ji@wUQDDL;K%nKQIoWayK0zp@-TcrVxUIBlEU0q;O05L| zWhU~*>o1)zUq8!GJf`e&0o>)Cy}V$6RS<`d4NUVFpIs~;KE|-<=5rPTu)6r@B9(27 zW<^blrn8SKls|rPsqX1n7OkJ=6uIP_<@r(pFGN4OcPI8cnQ{_9v(ERF1AuDOYSYc@ z1;>`iSxfSyx;ZR+nnE!8u**G&S#{cC!{VA&RP%~m0N(Os)tnsp=I^#bhR`R+R{6BN z<#11!1J{JCb2DOYTgjrpw50&&omiq=7t0bPp2NX_Nh^&>E>_Oeewp>eHy2*<_QfVx zwdA51`WRCVEQ4s$NTx#J@}ZR2oGdWK${e`s!8)i_;F>IKmzsUBiorz+z4)=x^rQg0 zcnDg0^jXe0LUf^22(9w!7MlNJJmWe+sIB`EtQ`M*n52%J3704sCk+rNHn(<)O$=m! z!zey>CaJm9P@f6Fi7^MBeDYb@S644@zr9J0JMO5Y8o*5fEK3+yhxMde7izfkSlw-+ zZH%wvf+j7km6*a1WKs*=1fU2A(Z~M-4?LpRdCcpDh4~u)iJP=2wbn;L1Ts*@qpC(M zf&OH;Tr*0=oQ|$tas6Xmp9ZhKco_yhLgzQ+zz1j`b~skDU9! zN#K1is4@84#yG!=^Y2S>=kdrI# zoo3C-#=3xlV#-(!HTeqP2Nk5tvZ>%3m3Hx=zu9GP9o9N*EZ)VKmM6T4?{f^v922@` zIDm4-@M!B6ivpvj06o)ObZoK4lzyeAOD&!r-O#E4)cJ7BcjNsv62u;e^4XIB(0uvy zN`1yJp57-nJ-AzD0tCAKlZ#|gS-&e_?sLvRrcA*n0zlXQW4HYFnSHXnDqC)cB~oP` zJP9eI9l5&7QX$a!^m{5)$@{U5t@4%MY?YR-Zu!c&v*oIDXUZqvT_(3avPXXNT)kX^ zwyd6=4XY=&?1Y6BT?L*6kc#QvR~w}fAk=mLHebOfT0MQ?*IQ*nb*G#Ku?&H%8PpR?8cKFC;y)1Od5MtXL*TuEgia+(!^PKhtYFmcdB#Bg)rRFQ>qnh{$R zb6c`$bF5NsxD~XybEHe$va2macDMG(uI6raCpgSBJta+IduA5c<;YoXxYUB%e+W|J zdx$Bi(fB_!6K;j6aML9oX$U#gii3^hyI}h#G8rm>sh<#EpG>z-k-ECp*~5?m+!7Sz zIOMDqh1&Z61L)F+&CWw`lgC(Ui{QHM_=Qj;0C-I~*u?;M2)?|uqeHIz?KatiuoTa{ z*&<*5-8Pj)#7T&}A2`~ueEP>5&GP-f?3DVJusrzEe!2R-UGZ$`9B>SCAAiN&TV&OD zUXzdBx>0uQ4@w8(N&O386jOoEF0+f>^3v9J*;F5t61dkpenGCf2VV^9C0cle(1!Z~ zK;`8-@zes+x-~e(N!`Hn2V$b=tFMuRQqBBl5xvFC*}63j)jL z$;t0NN#6IqbEKkt0$eR{)xr-N$@;SHW+Qc+vOPF&o--R{=1V@`e_doV7zVAN0Gea* zr;ji%5B!cjf8fc9|Ha2bAxfJ++NY6Ppae)fb`)|M4Xt|Y5m2Nfi}>+UI>2Q+3sAl$Fzpx zb&hqGvF2UJOKV%ZyaIQBiS6Y$QXav~X(pDrV#N_^u|-QuCYJHfho6u)-*{Vpvkgvc zXdQSj@Rk){H&8H3>nM27!U6-|xcy)NeIsy*6^839h*@QKI|5&F(+Gn1l7R6RLlBFO z)q&V?IWWy@gju-qPm{p?S90i@Xw+7Psv zi%rcotWP{NUrtIKjnocJ@jm z++v#!9jF919TR7)?fVfEDP~a}Lc^xpdYE;jyYWON=F!lyJDMrmS|DkGl^x6A{A|wE zqbX-lUJ@!c=MTD;aDpJzP;0CBTEVPS8s#MvZ5>(^m{1CIV~u;%ynIA~2c!fT(b zSp^q)kZ;jCX!T65T1P$ddXtW+S$PH{d}33(?loKh>FJ4P%f5irLRoJXz#VpR8(jD? z#uC%tW1tSbN<<;cSP$@OwDH)e3*7?1X$63!kDgQ}$1TW_xrHuxsW5_GlP^25$!ci} z%cC1wWJy`2Tm%s5H&4{csc;YIMLl0e+^3hfwaXD`)64?nzVBT;SH6WfPaNuOe;Hi! zF)e|sz{K=6+DD#ZA3`Z1F|T!OQDD+3fDRm=Ymy!wUz((x6gm5jAwB%aV%Vfn{D9v(x9L*K%Bvzm!j)pO)Di97UI5j;I&;)su>Ff{oa zI(noP=I%og(abxU-)1{Xva@6s7#4r)XOxwo)k_qX3|2aLDZsba291y%G51Wg+M|Fl zF|kY2Wl}?DMD}4a=7`DmI3?4SEg4RaT0e2zPQGI2}SeJ0aELG z!Rug*qy)B;c>6Rv29O4D&<*f1$C;rqX|^;(WIuRha{b$a5SZd!cI#hp;c_ z<$B=~6CEI(`N*Q3MFCKNf}}hEP~6PWZCxjLz60a1ko%DY-a@&kn?q z;(ab`;=01v6hYr0oi0e;M(Y~`$T1chjGaLjs033}CDtP!AeSG^EeP-_7xkp&WQ-+i zoF=-IQ`f58VU1&=%huM`cGMR@uez)o$HG$-MU8p_YA%-pajXzu#B5}WykkAZd6Ju1 z&UgGKZ>5V_w$JGV7zhOm#)z_#MFEQf76mK{3{3&8;F z1eqM*{hZGeW2^EvUGH^4@yi6C#!&pE-a;2xO^CnM05{gtiRR{Ngt1l1vkm1y*3Uej zE|Ivtp{fYi19&~-oA|=hNZd1zl(;WpUA0q;|Jd?`naB@Rp~U^8_jFhvd#D#Oykh>6ScEC^m)48(>MN^l>+ zaYB$-+tf0P!-;t)0J`tx2Jq-UIR>$y zs%CiQOw^x=?)SP;7dJp850wjWj>>!VAVYwjo+fAswF5DtsLYo*q$vSUlNIQ*tUne7 zCY%E7kg+*sINT&A8Pws?ziHOZb4+i-xHPKz{@X`CEZes2ke6P5O-?-FSXsJsv3%)^ zpOZW8xLdw?)qjiA<&-neICWHIj+j~NoREvZS$CxaSpb=jsexk5vx(<41OFtAWZoI0 zWjxDtIPgGtneXg{Z{bb}L(p52lMC~1_(BC>M$pVkhZhCdPrKk=Z_9p>rDaZNU%=ON zn;Br5NQK@32r9Wj!6?Ba$shR20~^yoV-#HOJOJ8E)IYNC)3JHVrlStT_9 zmi&IdL^AsW&vPhq!#E!R)mt0hQIP4mXV*#uv7=_qo~iEiwrtrhZ@slq1*8Q<1u}DH zWj{YlXiN`c7Uj8e|_OURt|p}{MuYo-h*=|0xq15Qh& z8<1Vs4$R3-FV{>YHwD4)ig-{Y3PO7!e6Gm#V6oRHomd!gftZ-cGr8z%3u6(5#)n`z zrFq!!!!&UsjzCb|-rgzMu*@Jm>;MzEK(>-af#E2?;Z*^iPWO8)P$Jmb5QbYF1iHok zg+R8!BN59HU_>TB`Q9FEr@&V-AYd~SkL>7lvx~98!T7C#iwYO4GxGtCCkHY&?-}l! zAP9vkbPJT6c*f&^t4?S_>}dlyjT5;drB(b<)9?i-If zSY=oguqa?r;9#eKT98J2FehPQ-kkw0bgaz{8Kq8AgJ-nq(PGw%pbZsB3Y3#o4*yhuoKIb$T2*ki>a>+}1jY z3#wr%Wr9#Ksosz|jWxy;zmOqoXI(g4C_q`&3|JAJy3_z@UPJt+eeH0Y3V8`R9+d}9 znwJf45KdXMBwy~StA!lGh-ZFGl~4B=%ttV(7)tt;rZp1o4LrLgHl5UsdRCRXPfp?=|x4r)xFT#k^9Fto#1aasEb+CvR1E z$@&_<96QG+pFX8Rfhf8YeC*9;$%HJR6*4?pQ{_Wu^4VW*k>@wJg4f%Wr_)L+3wb(` zCo=}NrBg>Mk41sWqyXm{bFVtwbD1xb!;ByEhOthJ)it~2h9BLe?y)=`w_N}ItL2!Z zSINge`FVNst+ypFFIWEaKffv;yyPPJ{`LPOEiHzB%;74S)-_5qViFD3JzoF#swVYh zY6?LHEC%BDr1j*%nan~5UrGCn!S=X7!7Zo{gIJa$D4tn0p3j58Xi*_FiXA=D*$pcY zPmU}ob;>fBs#d_vbgbs$X;;$9I4vo_K0@tw#)Rr%blMb2yA=lh?$&N;z(m{!p;Z9d z8vB5NAT*6?Rh#1}#qHyA${eThu?h~v4PixjDdIsb(J`EyhoHx-S(S1OKq_i|(`xC_ z$DWbj|L)K7hd0K+NJ zG5Mb4h7Wf=)iu(c0$5r}^O%VnA5-w#h4m0faL^=fa=CXmjhoCinGIl5e9#{BB2Nfz zzkC4Km_Iq6ng4M5RuHNa@o-{_0v1gUr?)@Gwt`o1Q<4L1ILbe$MMu{=w0`1d#0|?E zH`ZPLs9iQT_Q{sUUfJ6LS3_{c%EZ51@Daf314z--7L>}Is4OfR8~CJ!A}&+}E@o2g z)lgknecBLfsz(B_y!BxG(?f>2MB?>sC_NY{VcixxGag?K#FxsLgpC?`A+2c%s5$W- zXobXeB?W{8g$zq2y1X5`;EC40PL~Vs(O47qpc8O@7d5$^zggHYja$z#14!b1wb$FIf8YOsE&-3^ z>F3-VUYDmgwP`axNGmCf-={YlzfVK-bJ73+KmbWZK~w{1b=r}Ix<~S05AyjlXDFx? zZ!-q@dH`BXA3w2FR?W{*V7U{jC1YJeOVs%Wpr=;kM)gG3&lP^vnaj2ct_)C{bSC2(XO% zy&u5>?EbH>l#5O%g~y$AYpBh!{#X>4HWc6-WX?kx1Bz1;7h;@zO%WlFjVU?3dO!a7 zQ*z@?Ka=X}8oBYuKY;IjuiWs%YvuAQzAo2Z_d~ho4|l^&h*Q3F`R9c$`ks918M)*G z7p7PEsB#$t(`=wAdg(8M*NsV7+i1?mqnO0|%NpM!){L51h0weSA~sX5%ZRPw%Zf-C z!t2(MA;9Q`nSDcm?sM$wW(R?sWN&*wh1rJbz1gVot)Ere^rrwpjYhaMU=J9sOGBwb zXhlaEAYCbSLcJ^GK&&3415H>%*~cA-9pXi>T*jTEaE|9p!P2T#%VgiaI%z@dIPxUs zVLND<#e)-1JXVT|3*{YvM*H^Ft2GoWOMrXUtQoQrF_~t}tboRdk)PKHh?5`jLxCU} z9X9|+AAKY&pqgZVeS>V?xK-v<&C6S}Y#M)`L+UzuRhyM#)k+ox zMxp?Z1yR#5q`7JWnp3{g9TM~R#aNL zqEb}=Ybl&FH%EN7A(%;z`PgXfli`wPzfq^eK1}{a4Q*OL)xj++)j*WoRj+ zKnZHcHU%aq?jY;YhXyLoX9FiNkso$+bSe15buMX1r3#vUu^zhQ29binFsvXWdYwQO z=RdwF<{2urw|7ZyUXEH%5^OU0FWu$x5$4><`y=6qy5gg|M7lOSn3DtjgdrXYu5qK! zcGJyZH|AZ&dYmqa^ru^3Di-AD=c#MS=~6eV9u@^G3Jj(Id5L5}xC!9N2R@9|tk^T) zb%8S`{tw5G2bVU9XHYj<2aqw+`ZWwIXwCstZpg4ZAvZuySh=UGyfMOZ>@O9S|yHXN92M9M!lo4yPRgnxNPqu*}MY+ZAMD90vv;Ws}Ti zh7bf?Q^L8#vaRF8hXRQc-cYTk+c#=yWJ5@p2j6eG?mPtLh0C&}Y+;|>}>AS4P1^p6Q=P1$8mi>d=Apj zKGuPUWzt>)TCrc!nl);3Nf1^lja`EU_lG5ctVX9r0kWT3xKw2fs2R`-gx!$@z`xrf zHi0)jsR7VK{Fl7nw;_L?DTT<;Ij`b737A1n5G(%MZaTbFMO*#dkyZ)|`kq*B#6N6lv)3y3sdn z(%jsRKG`j0rA1I&ajOf{Kp-SeTDVPQ2Qmpe!Z%$OfAgxV@rxbtaC@c5i?|!m1nckvw8tFkBGaCxagjM)a-Js)qH!F9@GyYA zTq)+1_NYthp$JALl?j|yr|z{K;FG!f@M7(f@9xIj!I-_hV#B;jx49X8nQ&$7RNB#^ z%#VIS8k*CKhLyp*%4D9?9|!Pe;Yu$6 z_x|_5MV<-Jn2)9lzUMc!V&4;%5}#d8SePTfd7@VS?Y50_`==Md#a*_%7x9%Cj^yW0 z?UPi!WmjEYu&v8N!ouAhg1ZC>4haz4A-KD{yL)hgyE_DTcXxMpSvY6C`<#7SyMJJQ zm~G4&vwHRZ6ou)_J`IEd^i>N=bx7e%sO<)g;O7%0jLW2^4(WxRwJZB5x9!i|#KUE0 zTO)y~x5H&qZ5m#L?mh$_u=4Rkz;nr@WiKHTLeJf3gojv#;r;b&!hyW9yt}&etB_Bx z^DA$Si-(U?TSf;TiDyX-Ut6sVBg-=)?4y*Nt=XTk%VnA+EpAw6la3ul)TMv9lY(zU zHtuHH`9|a<{9|zf!e0N4G@Xit*q-`d=pY8549WXZcXkm1boQE9cWz(o!Xfu3tC)Ds z#^?6I6@?Z|%{tn@(|wBYI#fy-ApxhN1`Ts51JiCD9Ct)4y|k_s{6s8aZ8~}S+2wsV z5*=#wsxZ-G8_}&&0L^KU5Sv6()$T8!(u-6nGGP*f5!m zNl*C?7uCD+Dssd6U`6k^7$Wq`w+;s~n)48d!m4l3;NZ01WO({G5FSlpG{7!uQCNDP zebn-LT_8$ZrB8!YP%N0Qk6X0(mfe>j2;8_0Q+vN+QWJO0Jkgfs+Y{@7s24dwGjK-u>C zj^;-cCH7T}zx*pe8}-u5u`TaCh8A@^F%!CBH#d&N5@3^_c9>LugkIH`0>)s-&$ zJyQZ%f|ED)_ZmJ_(5-p+pue=5 zS3}G~&T#F?{1q|;eYI$wZtL&k&K?R6# zgZ~5`a5a#EpAHme?hYxE?T6}F$AVbA3N}$!635jM15>9`L?oq6GUh|ll#0vjM~_&U zxl7f1UW{Ax6t0q2U1)-Z(H1nMihS6=V)+*k5xJ=QDlJDop!o3C@r7MMAMjLR7&KAM z$xo%@DB%b`nEpOdu&HZ~jj7x$>ikeeVgS26*Ks%+f)D1;7A;+EZlG9X70L4vX1yV@ zWm{jqK@6qY`7Y5DyCz!!njI%mw&H$5WQ^Ws)-^6NFT6r2`XK?w%tXB?=?3ge+Up8s zWc%2YCnuA&bd#+%FH*cGgj;yp#6TC7ZdLpzE$dTU|9c989Ea!0hEby-#ta`eduMz!v;25g|yVbxUU%RYdNxKlr zpFf%O5bZ)PrJ_{SKNpn6$K_I#*IduzS{%#wFWY>{mb|aT%dof|#R}iHUzdc=FcgQ? zEvzi!%U0^gv-dtT4R*||_Fuz=zHn$`%s32x{bMkTz<{Q{Wv+E_A}Lv}(dzgH}e zPsWwKkEMCjNyg#6=WA499Q5ISh^cK#GK}VH#b8Ym(ZlYJabg$siJ$Zs)DmSmwl@8W z5y6;dcXtLU9}ta(t5C95t-2(-G+o1F9azo-NtXl^`PqZCCq2`l!vt~crEcafub?M4 zyM*yaNB!cyceXgv4;~W*xGoMM6s!;UG3IDNCZ`+$DV;y4k1L&&T)t;clHB<^Zmfnq3TuY(BS$lHaf%oYjT8g>hU2Jg?=zjL=kwEU(WTkK}n zOB>+TP-DPj#Xgq9+ZjlSW^@YhWuRwVMB>%PetdkSLH&6h{|mrJ6Y~TGfH{~)y2Rv) zyNV~d3?Bb6R>HNlO8PABfXnDH!rUQ0-0cL@nV|Y7;cvJnYU6zG-!{Y-*OnFHl?~)Hz}noD4^^Wq>{y=! z@2J|gid@oxy6vD4=aN{$2J$3M=^~tA6)Zts`qsS^OK>1IYLdW2MFu!%U&qqgyAFFs zN=5fpr&%oNbT!3leW=gCHCng1Jd=B75%632m^`&#U;ohX_qfzqt{N(DgyHn~T2QK# z2Gyn1gF2){)L3F_sIjwtei!mhMzbvSaz6@xH_HyHY6>Thr}G~|q_Yb4WGpk>kS#&o z>{~qOw165LjV_`C>%tVKWbvOmZ^8y0tGRK@i?Aq|q{w4U{|OKh{`2|6C8Yo%N*VP- zIYahu4pSzbO4}~GRc#+?T)z+wrxLb4UR)j`FYlheJpHI1G_l$nl)3$bqRYnAfUm_{ z6TJLOwxsXdrdhTE5*uj;WB459;jgyduiJp+1Sikc*neyqm=d9o=Xn|P+%rn_1%(JV zQ4n9Is+2E^z4Dx;hwSV%Yitkc|-PI@U%!9_@$D>k*ydc<$GMCy-5ncOji3R{? z!QUdOm>8Pg?r0ZORQv!lnO1C>uAMrmstfUXe)i>MSGceFOW z%>r2(Nsu5W&Fz>Pm^Q6J_54DzEoWmU17k8ORo>|m5frV`N0BgifKLTMlqG*fFR}`J z_XQCrvGgH+&l_>+0AZ+XzsV@9ywUA|0oO*&tO`+uN%!4Ezcb3%H}@|4O}m6uq;6VB zwRr7RUNcr*#K<8w+=f+plMw&EURExc!7mrvHxQFieZii>GsR+ z5A^9-U?F2Cbsn?1@!(T&r%#vG-3H0<+!PGT4lRzBT~>0d^BHo> zEx}ei5?JRSD;*tm_+4jI3yvZ>I?z6f3%2fPxWjrD(szAWue3T7yg)Gayw2zMBMG+4 zF1DWqu`W)wPULm(`~uwm4tOO~|88%?1`?W%nNDr4%#;o(s}B)FAEnTl^=I$UoC4G2AinKYtAlJZd){?H^xi zY8PKf5qkgv+wqH?ooZ5>QSWY;r5!sfVV?x;f+L)bK0e;HmSz+!yTD@veC&GYva-p` zLD%U%kGkv(IlYR(H@1Y;KdEx%c=Uod?f(rozsrM1a9>N02nYymUc`8Py|?r3oclcQ z7@Kxd-d5O1Y2A{i{)uKyHD#5-@UzGhk<9w!FV0_l@r1~5^Ybu)QxWY(JFxw)!fjJrapapPot%v0j7-zbBfgKLC% zzL12WX!e)WoOq{{&N|d~h|PP5##NEhrqTXRNOqR*N|VV%g`YgB=w9HT$8G+;`jro(O97NzAY2a-t`L0cYn2xYGt^R8O zNT_CK^}eGAAV{~(Q8xOda|lIp-taq&+KY~r_K{#`^V1z%%WPnVwBeYoYW!zfRPy7? zZZBdO`T~mGP@Kb!QzThO24GUki{`2Vi#*b{K{L|VABg?n0q=CM+mD6o`psy>4DxMZ zNJqaMUy4KO25bj3Q1s<&nL-x9O%9y{Def4kCsREo`Bxl2k3!9*pK+x*R+87dpHDs! zQ?u;oq(2XKMW&gxacB~m5{>~g>!Q93C*T{6MmG}aQnnTbRW$}m0dfXKo4)-I95H?X`$nV1wItb&Mp`)z#H~a6CLQ zuUDky!&7Yx%tmeGk&&6WZR+ADjTO9UNKC{Wqpz+|qU^Y$n3@qMD!mF}dM5UHs(ljZ zy8@Nltss#8mrkoQnScYsjlJaIZ|_(`7z%R&8?)6Pvhd;KmOx@?vCJm&WsVew1&GkL z1G6d^pyvkQfFaTODkwn+I$}nc;M3+sRC48 z*FTh=K~vgf*{^S49CZaL=9r;1>@eRnDonHi#!byO27*u?iud1RcA^@+fS~?*lxD)p z=!c=aZhs}ey+9j~#hRzFOQ$w`ef{#!!qQ4904fS(UF$j1y{6SH%U|*|8~Z$hHq^f8 zz0ki4wL2VE#>+=akDh#yA}kvVNJ+4ijtu1*94O7ggxq!RDrYlO<@d^?f+qa;Ewm2z ze`qx1%Zd@(h0g|7YcB_5-6jkK0sA{)=ZVzak|A^pdw!_6mla-NDd^p>HW7t{bxQd+ zP}!a=@9=%_WSIhND%QJaoG--+P@Pm+?4S68*NagJH$TZ?&{jjADxcj$?SEXC^2Ad* zUxcXzbYixtv?VRU33nkGBKs*BGp*~uSBfK^QM2n-aG#CkbvG;dc~?wZVi2q+U0B17 zoQt$6W37-KoA!Svc%e*H&L-NXSr-XG9h#6k#PYWU`i)FismgiM6p(bYh`}4ume?V; zz{&m;0o;2Q?;pOzrCeS?Sj}i_jK>Eva0WdG8iv)znq`Wn*u%!FQ~49)7@WJ!D{?7e z!1-MqwG&;# zCT+^92cpI0sSuoqot2HqHdIl$^_tep-ROQbxW}lkmUhV;JaaE_p1AC===tVoQV0%I zaqHaE_4|2j`}^*`5N}|x7ODI;4`G#;paQfO^=KFD{V3^gDdDN%9RUU@+@Vd1{ z0Zv@jD632afWi_E_DEjCCiQQ6E1~|gqlkegzF#MQcO3Qy8`^+cjJTls9Dj-9WZUqr zUkgj%3T2?)mXu0IEol1jcu}>hvdEq8^s#iC$q}qv{_}CV62>7St(t_Skm>C z@v1kT?Sjmi*Y0YS5qMu=j=>9J6K?nrtKknZDTkET5^zA5l{CpJm>V?8B>&9uT7-*) zge8MnZWIkOXu}~*L?9r5pOFImcn(B6384Q5AEJe-Y%ByNFdHcpk?B4CWgL^l#eBUY zx}TnV5!WuOmLWOz6>SHboJY8C701XvWLg`Og(&hes_HFf)0HQ$x zHm(3Vj(yxABtF~C>fo<$;YWs<@`Dgeek3ND$LOKP1kS{%vCalOh}gCe4{l7Ob;8rb z_;-A3_-+Gz9Swh?W-fuJy&Bj* z^~jQ-aC}xEf`I`n-OP**z*%Vhv>)_eL;GUhXee^E>ffBY9Q7}Z=n!WfGPZ2{(Ih*w zV@Z7v+0CE(|DgxzXFhomNXxgizCj#B<#djKP(bMivlhkq>@-*hl*1N-F8G&K;ay_% z>>KyJjZ7PBwUu7E4R%!Ag*J+wtqT#+IXp*{|BQRlHvt=DFWc~cq~jlM^1HYpkl8lB z0@4Bn@y-zc1)kyhm>mrKND0#tlN7tc2>4V@3} z*kS$kAuQWUWwBZ~o2P=;OlX)?nw$)64zmo)ERDhFI9k2Qu5ichX1>5o%3R-AsWerx z|Maf^hka$h?9M2FnD_JCOGpIlA~q)<#^&XTJUR2?MwnPfGJ3KuqgS&d#P}e%6@6`xn4g1aprD0!VQny#Bx})_8y&u$SI0d{XGg z-yFE+1~!y{)=7OB=fUNkR49ph?^oH<%E~2^cxDC-4!Iukh?D17Lqjl-JQ`}K_8?f# z;bs>GKd3!+@5?6~VK8a`dYy9{JW5MkRYgS{9{cEnhw}q*bRBec)1#b40z) zUhU!*T#g@+Dh_`d^2!V%fENmY`#Dp%{K`#rKkv5%9gzyeo{?eXC*eVBPW+6LiX!R0 z1sXh3Cm+B(?GK+Pd{1q{BHjE8)jLG^bTuR&Pr6>*(9;`)9S*K;ENGZHXQ71m!fp56 z5Bb_wE}`=fG=+i=gOv68%;_Dm-fQQd;qS{8ICnSgu-M)|?RNeqp(QO=g}LeRB*{I7 zM~=?fFNa!QToB=_#hta$ytr}TD}bEz{i?Nzq7`+1M`XZe9bZnOTn{%0;g|i0u|IVF zUcX~70s-5b8x}y?d2R*4F1rp7pu{4T2;;!;PuC-5IH)Oe$OAWrySNkY<^m?tE5H)) zkhg3AZEdoJ2RI$NCVFoNH<#)-sG~MG$$||X+ z&{Fj3-|O9e+UtteK*btpJL3LXvncytKczG_j6ozVR=&*rXheFgrp*V*^DLGw7OPEUH`o*;#U0 zhT$cm%$8xD&zCPN4ff@WflL7o4h{ttkBEsAewPq_IU`_BzK;9(Ofl9|UffYhzUrtn zG{e!|mdBa37bh*t53+(7?R9a+!2~%0G{{^@b%TGyN^<K_S~&ol_PQ!Nn!!CdkXj?+7h$D!EEe6OsyJU!(|D%R4!^vzq|7nlU*zg?|lkc z*&9mp(3@#vZt`FDq9wv}w^xxB4=L@Nma-&(k^{ z)ny0)ya7nB1o+OW`vD*>t|mk2xFeI1Dxw95Pe(((^bQ{@S_n(J2y}5J$f1T4j~K_e zr85z@R203LQ|D;|`U(;q!%gMzdx|c-J>V)P7FJ1mmn;p-SBu%=R@b^Idx5XpMuVyb zZBP1I;;jhxp@C)yiGq6nrIr=x@-9fOxP6e-Ar&A92U`J3%mQihUumPKP7-8NZalJD zWJ!@)ibp0U{zNkI>DqK$Aa88(efCP>L%Ck8rWoDi1>bJg%ZW3vWqV!6BODxR`j81e z?L^-e3x2BL6Qs{WMqn$Q>q>*(wmNS26Q+jyV)@95vt1(EKL*pwhU@HhytHF+TPnK# zyNe1$0dxZo-3I)V`K*(5dPLF!B(7sP^fd64FwBQs)Yt*a*ni9VX~U{Ad4|{qI-^Jy zw?va6GxB+gqb%8|lW&+@wdl>UO#XM7LFiYQaUNiFq^6L4-QKKNCGzgt^Nr@|elHQi zo+w(-3x`li+tmvU0|woGr3qo(ZlOKacOOt?b7aZS*OPA+UcL3EobE#h!f;{Wyud*(7g1bJeB8ZbHcm$HqONL4A@3(jKxDKC~f&!S)Ap52-B$dmo*=f6?<_Q?9zpov4^e=Wifj= z#eyh4q-QoWH%|~J_JOx9pQ|&OESY~jUJS<{;h8Qd-o}bj4wh(eSgmzT3D93z(XrOG zw$5y5bdk_k$O81AB+u4#ll^4q6s3!@HIOT!6tnDSLef6omVmp<`8c%mqh_MLF^&+# z43?5qXKZ0Fm^MsVjX^XQwj%7L%=|fihVFHCSBFYM*p{k-r$0GG7 z0IuV9Jcl>U98@zBs#4*`Mc<3oIwZuPEq^vgMk|t$t5o$IeW^MFa{Q!(+z!uAmxS~7 zMsr3G_jYHO#XO>(4Xv#QPRjqzgEe#FbQ3VtpnXbYVMg*fozKEsHpyp#UNd_y$RVs4 z=HB`vhkyC(fr-j9?b=VB=7_(A;_v=(SfB4S6zK>(T;#Z`5t1z7^%)+1F+4V=loAhp z-Q217a*Orp-{pO~1XdM%pZ2m7v#7J&+O;0CbqBa<=J<4a8Q~uXo&E`R<8SY;x zlai+&z75St)9VMwt;0T`*zWgfOu&3(Lj{MILgv(U)8oCC61~>P9k?)8g1l&qcQYn< zOx7`YKYt|hUSc)EH-I~<{}zb&2WCNzK*Dm+APd#nA99%P=R+*;u?xt^LFWoQoG=gD zUUq8xyyahwfLY2#Of*l4R?P=Fev{VV}=Ql>3NA44~t|3)2xoO&(Xsq5cr%-RQp5LW2tt!KW5l* zstX$RO~xFirlGA!HAbsZI!3^wP#Nla^`CVpCKk>p>riC~J#ABRJu+B|5g_uu|MOq^ zB%I(--%CtWGxX9z8=~9ndJRl@(C zUqdG>_J%Uek0+Ab(7hzcs4UM2-e$tB2VX-H10GLd%k>ZwxEaQ_##a0|ha2uzh8U_k zhKlN+JoWyTRN7Mr9>Uk!c5#K1co3i0I@0-e<5+!>OZu)OMU~kcYV%s}y(k`3kyjw%#hQeaWTc#mr>~*s$YpK}LQOICMd$p^w-obfjwTX2{y` zSUfsL4!kFQ8y5um1J^r!@SgQI2K9-;+li#4wMO5WW|9&|KTJ@EN#le`|9fPyDCvf! zhQno+0XY;z<@>w%@f@}5-(Y#)8|L?g>#nzrPqH`h&mGR@qgFB&#%w;#;!uD5;$TkXwacZzN~xAPhy3bZ`iHTpU?% zN$gC&0HKIrDEna|=Gx6Uw3+;u-m7>d5AF%C0>G96;lY7O zq(fHHcvAmJ?ezAm&vQE^jV6wQ<eS`@Ffm}EEG^|+8?AGckWZ11_G%`nf)fS2RW>HKDT?>tS;X+K*(-vZbnR0 zQN;FsOfYJFfg_={M6WNEw%$aH`vy_eyCZg~Zi-ZC9=nLIPq?5!4IjL@%MI79@CS1& z7trPVH5QCL3+tYHDqEHxmTddCh@8_KE2ouWQaWCeA2r0Uu^Mk=TUd)t-}B^6OY`VE zJa7l%ZR6aec`z9iF&U$7=&(&{Fn^0Z8Fs?mY7;N)BBy9W=c(p!%%-D|2qfbPtw4Dg zX%8;p<-WbAIWv@&?M&?O<1i1RtSv7`-Q~kZ_SV|08>%=@mHZrW!R=9uPyx*8rk5}n zqq_N^hTTO9o_t3|Lc2r(SeT}2ZvJ@1Z(j^-j7Y#J#hAlL@%myVsFPjbySTJOv3VgJ zv7mG*d(FXNiX@h;%E|WHV8kB-L7O{a#~PX!1P_FV{%g)SWSli0aYU*yd8EOqEkv6W zn)Q*nOe-zv9xYY4DR85|M|%w9BV z`Mm9VA((kNY1?{_zOMeD-wGD+!2ReEd=nqv(=m(G-DD(xi*`SumcoN(1M)#Z=j^4! z{F=3c&s>z(L8V99HgM6);hK*;kSDX*rE>aBs~gKIxMbJoiaG&8|M$fpLgGPBeubXxIPjZvek1X<%kBU# z4y%NE3qkW6EQ578$L;O<$ZQg6X|of$N!a3Kx%Iux{%E`g+-QDG`0h=KUv&H4$9`1T z)HI`hEOmXl1_*m(C-Z&%?Av;Uxr{f`>SjoB?`ay}4T57#U@dDEM~)PJ(aO*WQDwVssXAv-^mY|vAj&E%Jcsfi7Rh>}3!!7vr2ovhSI zvN$w`H0h1w(wj%|!COnWcFu^D!hXqj8^J~Qem7`XYsK@F+nWJ3qPph;;B@|8P}wlTHpTLY1MXtv?5hC~gPKQmd_ z7f`FWdq=%ILu30TyK9NKeoEX8UAav{aJQyQv98(UjSg9V{ybVDH^|S&yksKhTMZJ9 z(l~>-yvO8Q(BovNToln=LWZQ=iPO9H=)_$7$Jdt`mNY~b!A;00iyw9OIV5QC>;M`B%`|4)LGA54ZeI0Om`h(>Hlqb z@@h_(tZjnoW&-5K$<%~7EF)Qx_%7(&@m=8(2r5z)%{4^uck3-!>%*Q}_sTd67EyDe zrJA5pl&mzs{DG%-()>$G`NpbJUpPBatz?TRSjzcSMc#;4!#J(KayEhh7~Ut#C>`~1 zQN_ckjwK-V?*yM+W_GwYAYR|ukk_dtWQAY}wWb5{*BLd4V$bMX-$}EfRAo8C5phLa zQNV(I6@|jInNQZ@h8J_kBQJk;>Xg9qO{XgS;`;$}SNimu`Ol;6*S%OlINx{Mw~6a_ zk~cKFl_;k`k)p1*ln;@oNZ*~Un69ZFmO3UARBlJq>Gv~|&ym+ZovJJ2{8T7Cn#XvE z3FS1y)&V`jC!1|-aVYGO&3ihlh}F@qp@2#31gT~tn2A_DxX)F+-2g8Kb2;Hk_wGL) z4RwY^s+}TjyR!+GV=`-UZB{ECY7mf~N8LwU>Qg)kj_Et#VQTjF#Sdb=WHzAD|GU4s z=g3H>PBm?jg1R1$bYtJji<6cc{VY;gSFRQR{b(bk?kc97-x_@A-+F!h)O<4iJZ~}- zI;-}2mfETQSlIgdF*X-0C-+ZUFjfLua{imCcL1u@#I=#3T-V%s_nf0C4;wH84p;zf z3bT7Bph^HtXHD_O8ur#JtL`7VlwBU=iDC+c92Z8G)Ndcp1NwLs zjIJ^j6AS5M_Pw)grXLL@@xIoNy5b0nJ5I6JEe?(dh$ZRx#0XM~?F*K|$n9Fk5qQ2g zsafah{J_Eu{f5gSxbI2t^-!)0-(<5vsSeU=jyaf3siBFtf9{DDM2sbtU11paV*C}K zN(o=k8UD(ry`_HG0TSrefJ+gqkQpk4So4J+-}JZ>yGM%UW*F>uyLw0I#f0S8p!eP* z(2cyoCYF;K>a?-$OY}bbVyt7!()$RFuJANp^G`!V2hJC~L|!D)Apuv>)<3S6oI>Iq z#phbb=(6LXgKSIR$gB~6FvL;X|vNc0m>#Ai@mOk8*UY(wHUhbrNVL_&XZ?HC==ev*P< zmGf(HPCn%BIeE1z%Wf!)RuxmFHJQ4-ocZO*a|br{!~~;3BRe7d^zofKIrWjBDM5m# zRlpJEF~4c_rRmuz0{#2rnr(2`tLw+>_3@2zfo~L%dlGJ9EB&P6f0t1)0-*GRh`|N} zWz@!muH@wxW_SDISr6MNF6$=xeGOAusOPOZ7`;oBO#_o@Q;l35&D6o5Ikp2ektKiy z$!xGyQ7`c2`j%yL3+qxkA0pgA@&EUMk#7IKX=KHX6qgQ#&*7#euKk-}oB#k9hSyJ> zr-`n&E3r!DN+j9Dud~NzGbp2M6r|z=2U&|n4;r8KMRR3GzhD0(O_AE+LT8*x))}|h z+8VM3@YcjsIj9E!mdqiZ6_H$xw0C;YtLR-?d&eCp$NL&Q9QjBjSwPrf`u9^lXPz?) zS;R3HFp`vaNrw7fKzF~S2*4wU|&stBrI9;fnpYJ4MR9g@| z9Vs>PFO^#_8!RDXZS?z}JtQ4+6-AzAe7>wvGueGkHP1T~8gp;Vxd4{`5gY4#0Q#fJ)h0I=#A#DDgd!jdpi}vr2o06eh8v zL&jZ^-=VCh4a;mg8_2yh!6LMmC!~vU_zxPa-hSN|uALxe@)Aq4jp{0!A8G+H`YtX^ z>w`$TI3l6s)|Sp?2T3+n6_$qH6!5u0nv=_F`+pQHwr>p7SO@9;_*?j*^m-dGG;-ry z>vjQR8(6i1{A;E3VMY*$#q_>Y_ZC}TcQ~~eXC9I9*f5?cTD$FF!?WQ8E~Z>PvTth2b1XSE}k_-KzLIOCvdvbp5SH0Ysf0R^AwZx#UaV{W{dE zLjCi|Cj*u4I`bBU#hGFU?18$?VJr|S%pkk2_(Je;0|1WnnIRPe|GL(w{%b1BZB|0s zV8MHNk=%iYhYsl#T7uv*U(*k3cRw!RgDgAx^Y`eZw-??M07+tZ^lJ~&{CP7xFYp0h zUdJSlHN)ck_n;ZuiAi;krjq%TmZ@5^A20tst)KX;OT^HGrEY_ymW~bziLZm;{o{jp zO8NWyMs5@@XA(zi?W*lGYz0Vpr; z&?oK=Cy5SLHz^+xf7x&yx(!-0z4b@$>$j$Hner!{L9Oy8wbo0r0o#RuB>?sA0Ue$S z^ra$%9dXq2k>?ki#A^sn)wdr2i~eK)z4HnB8!|u_RPJ zyerA2fD~q3=}j7M8Fxqe{`T91`DnXLHqCBpJ#b#^l7NUf=5j46y;zF&)x55fW1`Pd zyCG{4AYhVH3qAiMbN<+Zs|8!eng~ z?nMQnRwW7M8^6X-AvWt@riUF!`%-jbW>OAgFnudY9pyXnB+^!GFCD^b)p!3jRdM3% zS9NmMYWfMS2#S~(HB6hmPTLr6NQ&kyrIOzR2B>N0e`YxsJzHUw{l0A`APA<5G>dSdO@=S5F-wn*{dL!8bho&?BrDld5j3XzZQt?5pu! z^wG7rSAo=_uZAW zYa3sxE-4fsLb}JdDC6wVa#OMOH3tLMbkBo790=FWsok|wPs!~)dC}JSEvd<)r`k^F zAH`goH8@TGM}RoW-Z@a9H)W_kLTcjtbg(HDevmD=dk;1^1`_p9T>~Dj)3nK%k3{#5L#{ zQ&Ev%M_*W%C9!Vl`57LSeS!3f`^goVo3%+9$)AGs#@Bs*vOVHpgt{Co6b!Z8S2}Rb z>-%Q!c4f-dw;u?r|8kQ*UEhJpbbr*RSuGPJ%yGP3Wdm!$W( zj1o4&xYeQQSep5G;DWM5N|rOVhchb?Ua2q~;keXaUZ?JmU(m!nltskcWg_gR)?R+C7)CYO!`F3gR%6^Z?_eT^ zs>NPvrSx#l3qX$LhHu7-%KEp(8-(V1ZKOaTRGS-G=+qMw-IR?fsu`3&{_3VwKchzA z%0J#}e9K>eFiT0{roT0la_-J;&#UvU_)X}5Kad}r%OCb9 zzW;QQ!O}Frh}>ihk|NrM22l#OuC}@QQmwbL6PX+?*)v4GQW`)!2GW-`BPi3C!_vB_ z;Y3L?3@al}k4iRq?IzRQ8&EV{f;HFlM~c!e_Er@Yg*<4V#efBF-?6c=8Oi##c_I%~ z*}_q1nGJ8UlwI$HQHst4S#Q5AMGaAf-9s5n$>gP7VqeJxlZF4=a%{^3n|*&#FMXHN z=WNZ}tY*lu`!xW~DEP1DX#*1U^T%e1ibg^u8CZgt#DtE&+dXmp1(+Y`QGA-%YL4n9 zPWGK47(Ho9SV;Z9;u|955dq|^+8~10%*ma@|FQr;8oE!eo!&RcR`=gY5lwPhlYXzE3T< zhBe*(_|oXj60hKTa2tFLSd@=c2aW*e=qwUbF_Q(kcj!r&9Cnc z_u28HvtQTKcQ{!KZ8qCQ$ID1UBO5&7Ts`T5gGPg`o8@K&^xHI`N4@t2tSXG`%bq}S z;gD6q&kez_o7@ob5QDYIX5xm+rcIAPK9re$@$Nx4p98f{VjEQE(b}iA?aQs#PahJ% zB4M&#!cIBCl>y@-%oVzRVDX0Npt*a(k-#bpVYjK zje+ZvjzYV$9z-T6dVME7IGe8QNQt7QXQ=CLuAwn z(4dlhIqVN?LA{)!#uo1kNGL#f&+M)szTD;AP&d4af*YfTkzh-0^t0=|)*fO$aZMW7`02kk>KXa;Tvs0nXUY z<|&*}E`_>rpb=jnEqY#*3_oHLw3WLTIw*ct~Pkzj)G5Lqf>O%K0T3j_Obc4 z-`W~3T#}?HLcG*`<@1MX?KBVR#vLX%v6tCC!o8tpq3l;vwuWj%3Z`u7S5gi8_DiC0 zbdlX%=Fl~nwJPNr5m6ptK#OP4)ydDoW-fn6bmQ>;?@mOPD|6Bsc!C}rP>lBc8j?$X zDK+=ngw(&O{zrl{LUp5q7Gl(Ba@~*A?~F&Fr_qrx<)S{>B*J9>;?Wo<$p^_Xe12%P z;{3&*9o9eLJX;*^2h!?+rY*{#B!?tw^q6<>TD*YlD+rPY2njGLD5k${i#xezu2_N zSeo$neq}^`)n%U>wM@wh$lLm;+=`ZF9QzHnn(SHbtZh9f3mU#3$_Ne^ka_K;bYU|l zB_}8Mkzk~sq;H)AyFNX)#KSm=((EmYKj(a3K0|ar8?S=Om#TtXJFi{bSi(tTI_b|} zs6Y3c@>%pXO%4aC?8}&frGRx#B+W=lwbiyP@Yx|@Mu%XdR7$;BTCeBTcP6{y<+|pEk zhjxPfptnU1;-d2Cz4GBE@p1Cx;nOJ-vj(XVaTfFYD8zHb@gbmL?%NgsD5xSp7#Ux) zg;(d4{cI*1HA)lI28hqtHj5%;=|p~4VSHcN+7&dH#VVA(h2Nh@RnDtJVXgjK`qkWW zED{eyT~l~;9MZdteP4;oF~!f{SwOq^i-ga2EFsLWz?YU>c61t6yEfHLwUH_8NCH-T z`|Hz+)YSB&F8+qV&sYHZrp&J?=-!^hP>3ldP`#eBWlFN31)HxxXZly{#;d-YAv*kr zrx=-`5>Bww|MT)9?2$dVu9`W`a8vq9V5N3LeBbroz|x1&KZ=c7ERaPPN;&mOt=$31 zMUlweJjG9|s2IwJc3fr>ar|wb(XSozp+zqbwU^hKt|7f#n|?TmBp1z#bv6Iup^6hq zZ!Gq_Byq+zPLi${4|1E`Ch@&4=bG>d=a_J}+Aumw6J%=+_fw@WZaI&5XC53&?|<-* zz#F4-s{n^N)<&Gk!Y+|qiJ5=;9v}EL;!gO40#0Ws;e;0DXV z=kzn#0Q2+v`dM00gPAmLta|t7f)!Ar1R0b1McL4G#YywAn|p)L`Xe0NTYTEu^wA9t z4Br>cZnKOLMXq8J)>R;2Sm#M&jBG}=5?f3O=@Nq0VRmKSXPLcu+CiJJW?fShgs&W} zEs?5h_A*QMSn6<*60TJoFOM5n9~w`1mjJ={dlz+et)Le5;F{APH5{m~l?QWQq`$p7 zJ)9cjrg!MWZgX?;dHo>2ez9EYwbsHK-PaN!RrHmCq;xqO_I0_zYwPL#(px-H0Lf*} zwRS<1A$R$#c1Ft;7JD@nEbd6ZgHSCObe1yM>sQ;VY6tuCBXKyMdlqukftD|Jy%r}` z0dfJvqvC&J=~cXHa?HHgmr}K3P@Ud^#PyqvKRw~9$2A-E6)v|6=9(+1lXBZ)(x<>u zzai}9T)l-o3h9@GD>PymxnUpCBGOt}8ooXrm#=N?{{b06=Dy()2Jvkumctfvr?y?g z@=k&qfmAUU7FIXIXb*cEM67Q36hLJugTS*wz%%FcDu+p25lQ=rbFQOIU<{0T=HG)A z+^_Tzhm19p98aIM#rEaJU29lndYBv?9g2b{*QGc-S)U5dacS9$fCpj7_Vy}PMp#K9 zC0}E|@$jwdOx*=~P}Oy-Yr00vr>7+?Lp_x5u;yyG;2S2k(^fw)p-(Xm76)7Va9A>) zpl&?1T+(f3bE-Q!PC`HM9~UuU2y)cm3ayo(0t^3*0;m-!e$sB?umi4by0f|{!NQ!-x&nX0tB3= zPoq~(+E4jw!@Y&@Z~dtY;a~guSlB@6W*;N>u!?s{sNIXha=+5g`imW5ec^F<@8gG& zHvQUbec|mluHd1dGsY{ud3TaCWM}xfAot;H~#5A{imXL7=^D z;U5JRUl@)sJhUie z`oZ_#3%~fqP52ns67Mw#tbY8#N3pzN0Gg9D?He~<3*Y(nuf!Ox-}{~43oCeIF~;^c z@%kd)$MgBE+YhMshjETxN8xy8hS;ja3{Poc>C7*D@$>Lu-i@@pif6ZP-3y<5@+thJ zg-F*+N0(4qvc0!I|5o^e-~WD?r5@vj|N3uyCyq&>lReCFHkh4Th#qR>A${)c8z>h4 zQsfOuuODZv#1Zpnkx-~hmE^qC41@IAe7m!p0eOzNad|l0xH^uIuoPxiw}>&AcvwM) z8(4>M0mnQS`2fZ z*&STJD~LS7aDh=5(uxuID>NJ5v-Mh4P7fa55*cvrvB{b= z_QqypbgB8?LmstVbXgQ*7a?#m$)MAsNW!B#3YWaw5w)e&hF4p=$R=pLG5{^#F3I5P zQey@@CWB4lLuO^v1ae@kTkq-msm=zgrc7iQLLpeUWQA+KD5Fg6q4+x)%La_JMTAEZ zfHD$|VPbnpTa{Rk3^$pqR33jj28C6&QQ0uSJsYGknvfo#c(Pjuo;fTza2 z*jQ7-v4t*=MN&8?HEdq8R}|8P{kr?TizvscVDiD-WSn#*|h%Q7emi(@PN0az^2aVf&y1Y}dp%Sg7 zj=!$l$BG<=72d?SPzN>kl>2dCp&o&3JxSlN&O*?(#6e!A1!>ymWEuPJ9+(Qyo1Y)$ z+IMcP?ybVsy-nP?&L+}{E5=3k0QZX_@VR_04Jb^Vs9{N*oyDbg2d+3Y)mKn8(V7Xs4yKYZ`UA=lj(W;eTF9wv%k z@vIL*Nxi11!9Usy6Q#Zt?o6+S>!aNL1t0jn_$O|zRs(Md=~^9@?2Cx+u__I zP8GMyy-{)4u@}hGZ5}$J07^c~QIfOVJzxoeQL5bATFyLcMu;7& zqVL6tVcfqW96=DZflvh9y9k~ugapLNTqH>yELkJ)`KMp)bD~?!fcwM*(ki zWF++A*&y}q&?L3?4 zFNAU8(|eX(TC0U_))!tx<9Zok3Vl4e7G58!6Wg~Oem>1wIH_PP?Z}z_ZiW~gZTXpW zz3t6IM-^558}I1QjE6k*wBA@T=4udHzGS3|paEX!PWYD}Jqq6?K<8lZ*$4=-NnDmc z_;8X*qknyw!t~c!>R8e-I2=>F-56JL=k))^c2B?Bti}uiX95DOAuTWl2K&RiZ(ax= z-kuKA%eV@HJGFr(%jWuOWK_BNc6B8THTx}5;HDpmV!yo!VWEXoLfk0)!3YFmB@!%6 zd1W;AVR2=O<>RhZkAwsUPZ4K9PQ-6xGsW^T_x?ZDA2AvDK^H)#q&`WM1bcc2l?g`Y z;`6;fdxVPhNVvrDa48X0gebZ|fcluM%Kr0D;wfn>sXq$x)3L>Bl2}l^jsC=LG@jec zQIaS};rrB@L6akzYgafR2jPg9_YJWgmRHt@8PvxwcNk%_9{#9ooy(%@?c)AS@w8{&9$o))(&g3dVtcyUaN;+*%uGjDj#^j_S$_# zg^GUSO6i)eIYykwSXU`p)EY^eDFcRv?_Vv!tz0Se4XPLs!h@;B zD99gVpN+WxunG@(Cd{9Fr%8eIeHdd=MH3ki+uNKFn^J+X<~mU>z-+jyz(EqLQ0Hb3 znvgPJ#E*3q4$?{7RQ6df59;@`)|-{jAdo?zJp@vm(EjQ1?uw^%y|-M;hh;3&rST6+ z#yhQS=)r;g2F2EEBe)x9>`7}F(7c*o_maH+GdruN~opd z(M)YCOK+ZHRcV#y@w>tyeyG$N-g$it{>m%@4~0yf2!7VFfLeqOL%_icQ1O<-Y#gFA zigc(nV|+8laYe8rJ*i;Glcsre>)zLo0fG6YclnMy4`@tNQcrT$-7QPDXz9kcG-oUy zbGQ8A`8M_0mIASuyhlGg^>%E7i6PLWSu;jhR;If%xDO%go;?C*<5djzF?T%ePQwca}y|jb%mKIwIJtt?@ z!VUN<)6+|M3c4A2ZkH~O5n|#ELJpLfi+k~`)3JEo&?2qSSr1n^U)-LrhjA1>)e7XcbFJ;o=RP>4H%tP0*nC*z+KsG(H)4E@MS|7; z_7Crd?|kWUxJcZP&oV8nRKg$r>_K=qhubd@W9)qc!298xjNxg0O*iZl6Tf@d=4nl3 z&oc;|O9;5GWP%S8o9WtEKWlF_Y_WOVym==Q4VrGV%|vYjLSY<`ARgEm49cF6I%L~j zuwH-wn{nV#&VG$z2Q;{M`)T>qtTx5|#6SFKbf&paG1K0k-Er*QY8umC6?>1Z45p`) z$5F<&SMZ4|<8o>Flx~_JY6AF0vqZk*m>*l~999NnNWJn{Y)m42GC1}q0YA zeQ}wk3&|^-|QF^I+LN zx#D)h^3rP5epJ&@Vbv(N6E#8) zZr4iMr^KZz`ymIi-94gx)+62Zpp;qzCB0ALFV!$X>ej^|??VQI;}Tb>U8-;YB0_6% zml~%}8;7v)Fz=^89jmomc)XI}t^N`&DY^?d1KmOBSRsC6C5#le!U+3?7PAMvnIjGE z2$>w4F(VZ+b^#0B^Xaoak3eo?yEDf1n+I3+;-aRvP(p5oB{Q36zJsyjUUi1E3Bx+| zbmH^CsrMwSFoQq_f#X6z2J2?M2%V+IwWpKzNyed?>zm-&KJZ|<1ljpmuby=gx|4vTIarZ-O`^U)U}%> z)^k94<_lybDQ$GORO9041Df9;W;BO&Lfs%_a-V2`gDM2I{1t_C!^pxW;IZg6zS2Nx4adtqU5pkC(eReJNudZ_MD`0Zwc=*Yw$L@ zwl~83Y9$PIVer9OYiVIFT)sRWWds$J`PNZF@55DkyCi+T3V+2qOZje;d<)?UvBe)O z*Pn2E=XCSc`i49MTp7ee5{Hl_;uarA3Di z^PDBRqSqO^*mPcOH;OZUZ{NB)<9%)EUUGEvjfvvo+h>(=xN{Q3pAc_(f}tFpTuWtm7~nlbPG510S@>9Xs*leQwtv4j0hUzdy4aelfWigCH6>&;B-l zEF8yR$Ngj}gFps>Q-Oet_ItRcCBOmeUxwL-i;*#e z+^*wwPisxd1Dl5xEn|Ex9jB`eH9)sGeXrvRWFEI1y4N&cZVSOgZ!g-8#M$#C0VY(y zFK$qDTce((<<;nhwFe7+10^SJK){{Uov#0;E*yBNOA|U2U6LFD(H~e(>jSkj#cd3e zL;&aAlP-dPtYlZ{e{{cswdV%zM*9>#aS$xxSA7FliS<;0qNU;#2O8rErz!#Y5-wvA z=y3`Yt@N=MjP>O3i!L6*qIYLK4D@oy1fivSN=uce_){$Ct_3c|O{(wRq$SvPt`Md; z{6FG=z6y@i4fs0y)gl_c-CYV4cfgO71#b72yqDG#tH}Oj5Xd0#ibFsK;S4k|=%0P! zU|{IQp%dJm_<@ zGbQ+@7i;ht=uCy*l7dM}6cN*3?Y~>b8-KRkYhSSa-DfD;w!+hTAE#AM+fMG?GzPOt z%GCX2MQa)M6JujfqZlgvY#b-_7Gf&FU-8}?w5u_rBx&WFDfCdFLQwAT@y&b0+wBb3 zC&t5QAD&MZhz-S=L?vI2Gf$)!G}PE`RP06Qq(>o@;tUZ{g&)zu^-z&`t$oEXgJ4v5 zj9Qq9Tb{;Wv10S7C})iB0u!2u*PJnknT{n?e9j+^ckohxv0BokG2Fo`NmKx4j3E_7 zj*1G*w+=(*lNpqg+23{hCx69zKYvV|$G%+X2jDxz;9YTp_XVHTbksqg)&4)FUy(GE zy(W6oTrS!t5DO)mtaI>l{B>MlXb!5j=En~f!Y7jpFeDo;Ff17l{i<-V(FqiUa2g1 z27%8Q0<1md%|kHe@3Wb9;%X1Q1hjIFLKuClM#iGXg;rRV)IK#Z9yo^FD!%}q*e++t|1K35<(yP#)E3`31fA!ey*(c zIH*1rKE@w$zOllJa2mJZoXU{Zq9IxaBpX0{zD69c*}3^+)V!BfysUNJ)H*Q%V9Ji- zF<<~fQHH04kPOoGT4(slqbdgk`ctSQoWotqSa+|Nk*>whi(}ch}@!#$(Z6mzS6CbWOEUj$7{I8vwD?ZoR`1o)P zkZe$REg2OSMb{t<#F%cn0okgd;J|Z*%3A!0mpH{l%b!t%8fT0`Zr7_`1+ zlp~@ad+IUH;2YO3fgchVcaCRaafLWiy^-FHZX-PXv?S@s=thLYS3-|U11Hv0(w}Mj zEyYguvoV%!*1Hx~og9o@^f|tbO~?hO)9x_2nnSa%7Pe3d^RWAHUTY;>>aizpL4$k9 z6IPB!c$9ImVvN8!EM*^HWf@&f@K7A?rv{ymC*A12@czs?mY+Ka^VHZp*)UF0O4u&1 ztVG}bI~`aZpbYUCMVCdaZ=Dl7j%=~SEicZ<(u;>cGhK

    &)#;n+qCHQVT)w|?n)D7KPsKBb?!7(#q-P(6qE+H&O-;`vgKmBubkuw) zu4#U>d+j7fu~#8$4VQSMoHNSsP;{}UfGa8(*7M;#1PBPo-yg-wioBv#i&a>pwtN6=1M@UX!vN@6c7iWv#jSq_? zAFt_G<2z2A^qytNvu`r-tTnZ{)tcpKzfY~AqcxZ1${_GrLqIH`E1a)?{xW`T2g2jK zx43hhHU3$T;N@*UeG6hd@wvoLD`Aw5-aLb)v;=|{h$+iJZ$$jLxG;~V{Cs%p&DUWR z4~C2Vx@_7Gcb3!^ZPZO2@IGTZ3a<2joN8-X*J&k9!IOAe9bs){9T!c+Nog>JQ(Uhl zgnPo{$5YXzS9WXphW~kTJ4CyHi?5IU1!`t1x>mOZB4FS zUDf$fj)-A*4)lcAH)&fwAp{kp-Jjf*5+GY(R|h~IdGPt&}U zEs*OStWq!ZbD#dK)M1>`>D)RNXNXnoeOK*`EYZVI8VC0qJw^td`WNYvx5Lk zyPA#Zc#<61-wXm71TqMSS&~o083zDF+))FcD$u_;T!h9=gjP9Xa4NvBsq}CPNgOs( z&PPS1o70tqDRv6=W>sVmI4T61&qSw5yBxLsEZ@^1pkSjL>&q|Rmxsi+oB+D2J0~$UwGDAg{Pw8n-*Y?aF^>TWdaMOMKY8)h>T)V zwuRuU$euj8(h=S99f#%@Uae_eH$kL!&sy_lzn>2T(m7;YI|7~;!fT^lm;)jjB&831 zMVi{VD2xXcCnkca9e(F5$V`Zv8P`rQQ}kyaf496|^S7opGs(7X)6$lRzwJQmiwiWl z_B*=mFmEhlIZAom$h*I}mj3L27{`&8Z+X=6GijscX7)3Kz)KGSH{Fl#Oofl{&qXHO zrEbk?6XEnrKlqnyfTH7+kijKx479mXQ^2I@KS~F@?BeWtxCWE9uULv&Jmz=n_FLSH zVMKK0R7XkQ8wRb{1YLi|&zi*T#(e2PGe_%(6@*W^$#Y|fc)HPm*9KgD^mrP}ErYcl zj_2F;%RQ`sTPv+CN?1FonX|MBgB(HB2E@uhcPFOc?0*!#$X=<7KAGYpsNrjMP$cN- z5}RU0KYXW-MgTNjHRQB;uu!`VWD;eEL6dDJqy<8`|GA`R1!lW%U+Pd&7 zUM8S$u?P*xI($4eivVgl+_-T)uKjs@S!`D~qg%}w6#0-Qb#tM={Jw#H4r{E@hGmoW z)?qR#*buMi?oK+jivRK=IHtF!7lG4iWIAerr2x)&g(JfQ2)+vR6E_(f2)O;DfA*~)jQA{Lt><2pr3?ZY1TqL527xx{FJ>2i)Udkj%om7zT9v$vuCE?o zg&AXjieC;Yd{~2xXX2}2Tn)WBQG}_s9bGvcp;(qBgTQlxKzc@!p2*VKfq-<+oyocI z;Vl&@i4k0?p%C<9Ez-{pG|qQVTw3Y!(rq6hi1472SVdLiIfCb<4QSt$Fx1zB_Zi%U ziLO|39)RIMNY*H*u`ZQk6=vzJCawFVP!b2I+}lIkG1Jo0N_2bf98B>;T6YPh zwuOb|Fg>O9)5%lG_BfOEcH#!S%GqRC4WW*Q#m0>H zE2l*ihhFn|KYm*qiTOe?@B8hYM)G%SYJDCje(10E0(Z7U`A30P^hFHOQ!?-r{`ohs22juw8)~V*yj9G_A5K0_6eQZ< zRp)IxTrcxernU^xB8qT+ORNcF?0%@bz;$QzX((M@(|V&j9s^V z3maG`z+BKeL0DudgTQ%)fa}(|ow{>-9&=h6$is!}y2AQhSXhd&kBX&2n7A+!-9T(K zER$UL3YHE^F8MA5<(%e1owa=F@0~eOJ3s#8J`(2HJkQ z7uD+1Ai$r_Zee+u2%lPOru$JlaunoL>=+L7STk+gU&d?P)GDq%dP^hGeQGMGu|57r zI=#E3@TnF);Uw70p>Lcx!q)k`Qy&NJ0xo72*0vCmvFETC8LP#{?b{PwpwkKj?VID! zI>DG#RfJXPxSn^Pv-&d#WDq#V5D@XTr1Z`d!u>gvjUxRfi=OV65Gqsf6|MSUA z;wt{bFwBJ;6Q!_7EXAAC2-q7qZh!ggR|bI>4}tVdBrTSu&mIC|5#0_iuWq2+xfRBV zL7b)Y34tY)_Lhjr?K_pf;u3Q|aiwh|Xi|~v=Ka|)4}ay`Uws4qie3)3!U_VJxbKip z1uebISck5(AFptY&}N5F2xBOVos{;~vx43xx{1LcKSSj+1)jFsn#^lE4<;XRrl>_; zNoyW|r?{l~nfFrMqJpo#bI|TPc(Lh$%X9!Rbos<{)O?V;~*)qw5<)J$Jt z{BHb^&AW%IMlk zLPutA5#lJi1>^aqW?fVo>)#>vO-B`BTn@$o3|)yd230JT(OBw=)=_sB>L_o(M8}#V zg=cGDv)>s6&JzTj$HvE5*Mwlt;hInB@l=Lp}lnt4S9qU zRJ^fW~a>!W*ucNK7hGJxGK|AmKf=2#Du>t2FjU$Omj@Ez;ZB_sDhgXQ@bU&ibme!(ijr2>O`!rG z-}5pDULRfn*ZV#aI=-c`Q~W8+J97Cji_rcS;rg^niwHM8GqkiNe(%Olyzf;Zq_9yh z!PtBwWf;2%{c!VIz zunCaG37cF5zoMXMu)Ppv7Pe|lliRr=!c(k?H)HSaw9m674$ef$+e z73fW(#zCV%=es#G<%q|qn{*C#aii@(dAFxtBhFbTv9RH<$a`V#7ohcf80;oIm50l? z9LE}27vaq?Z0$q#`|Lp=okNH9EYCZ}^~Dy*k5|v1^w1v*^Tri4r7vEIY+M(t2%o0{ zs5qNg3dwH|_{p85VSc!R4oh*ZCJWYjX@=?0B#y-QO*GE#xbeosK{;`yHvtb* zbMQHs#J~TeTjA~NW8n*LUM9FRevEa~w_7T~_X?q`U+tfHjO5hPIqp=63}qOUfsdx@ z72ISsGp5rf6(*TitsDuYs0iTzTatKt76PfKr#oD{Z~;bi9#eOCu2@T~?G$JxALbwk zJ0Xll%AKJ~Ak5X!jXOd1pRH~L<_`86RDk@G%d4d!bM%$-( zVj_*=S5&&#e1lj&X=!=k(ghB2dE_?7>+eBht5y@g>$W>E*cbbt=HUXdo3@PI^dwqq z;8iV>If!x+9qG$+kW-5vH-nA*JPpIRI2^m68^P^l?6@LaUR^_A2hQU_SmzMhjYg$0 z{MzjY2le?`?l1G69<1;V*l2j`v8sdi3CA*8CI*;?We%am;ttkY=Ek2qe)h+E4P?Aa z`9Djyva%TjG6=j(5D;;;L!J%FRV*?A-W)+_G(}trX;$%R8+3apRK%NXUtt0~)d#-q zGFT!C5RZvjVVu3GV_8!j+En&1gTQlxK+5CF1X0fo#D`Was!Avu{~i|$9a?qv@C87? zH|G8^zkcw$Q$bfxa(JB!m-`hu29&Wj!}ou3J50?lhp)eLEvy$iQ4D+1B1!&=mQZ?| znZafCCCWF*=Od3U;jd`<1g`^2EaS~;eUz^Kv?B9)=Fya7W@awBANO8svfR@0N_hD2 zVYqhfDsi+E{z{$wZv*~H2mF<_tq#soTbxn!TmXNi-W@H2IhEl0Zy6p>!e7y=nXb7v zIeQ7CIV_)U&moxNoX~a~Z|zL>`%FNfbuJy&DO{;@c#G$5kzO(poYYP{D@rPJL2*;R zdQe-tZufW|H>;T6yb7Vb7pqFjSZDfk_fETemN(-;-#jq`6EvwW>08=Ie#KT&!Bwm& zsW9Ge{gaHV@W6CcJ4XvB-R|j{%l#z>A(WzK=b`x6z?ApzO_HY)R*5Hb7>>4% zhmWQr1G;DELa22V5W*2}29tN;ptg?IUNZzDsZ;j=ovtv59RyG^g0+^4f-5w2*6`!J z41p;VRUuqE>x2V_nBC4GaIPSr2HGRyf*K1dhmfOwN&**w;Ck=w=^?1?X0%@Puyfob zUa8htqa3Ds=-kbahaRamr1 zOt~d+b@WEilsCQf;JS#ak>-go z&ydEsn-09X7%x{|idOmxi_#>0?Q{7ny7Tu;g$`SM-{b5X4^aHQ2Y=-)`71@35$r=I zc`_>4o7g6-MGh2-oR|CCyT!vSZ zvs;6|Vjs2 zU6rt~Z9q#pNWTYg*EQS?;})~6RhR}>hdRS(93Gaqg;LnUjg`Kf7nUH3VD=gab35Jd z9Cy0`W%n`&yaW)~K|^k7trl)CuZ1^9lEaT{{4|oWpB5Gtu}tg@{pE64BNo$1Qj85n zkXp6Qr5io4tzpqP&Vfhwb*|T|L-{b!gG)~iLt6-Xy1+GE#CQ^KbaW(Un&K9d2PO}R zBDDGzlJusee|}>#Z6Jg;#!^2n{d8YZ!-b#a#7)nVw&{GatD9iO+u&8KI}xxvEp5}M z1>8GzaCj3(=Yd118zCAlEOc`>wYrU<3Ac4f+9O^D*^grG^!kO)@DK!jdmbw*aP$Oc zUVHzHLpZd%`8+z0`EJ~O<60Fn)TiN2_bi2Lbz<)+`}B7_jMLGyukKIr$Du7}4>Jg4 z5Xd0#Bm_X)2#m0HU8#gOFX}qF6z<^4wE~_@tYV)mlio>jr3(>>Jb2yz{sP zjax{XG5gLSa84o6%>Q~;`sSR1;DvNsTBr_9e40vLFQnsHBM}0=KfTASb2b>lJzmOR z@u4)TXA+Z23Zoo3yqA)$?m-1;cj^8$6mN%nAjYkb0a}v{1uKLVHPVWc{NW< z(#F1!aq(e1_o%=Xc`4MI#8;KK*Wj--HnwFfn>JAbHs)$G9D!g5DfjAdny2Z=K^f#uU8Zo=o5H^aq#lzoed+@M3Bg79b-@u;(a1#%*E!WkdH z5kB_20S2qj(iww5>zp`A_o4vGf>xGpFwu%APDbuC$z^iqN0JP$^p(m2GA#8KSf8H^Ylxl*)bQoCjtZFuu} zzk%J8A@jmzkZxeHFxU%$MDqR17+goNrR9^vk@x)I)hgDtzmlY?=D*G*U0^AEx^??b zSjROMH5_SfMJt6il2GrDkBvr+oTcUENMMx*M?$VV7M6(>qwvW9oNrGQv4*II2eVi- zbZmvUMj;UUyFwQhSo$lzzffy1Ba&eE3@aI*1Mo+dG6=lH5O6&!;Bh@i#{VggHHo=| zHH+LjX-67zSw(F47ft+XD6i>8E=GT#%zRc64Rgf{+R2z9@jWg1eyT7`hhc>FjP>CCDHlGPML>_gk5q88-Z%hT;Uio^4fb?~ zOIV4OyDQ=Gd?gBmv~<<_)dR8n!)YcDvH4;N3j^GXa8h?%?V6D0mc|&zoz(y_t~`wP z^>l?R!y(+7T8+vO`}<{0S;`=gK_G*`eh54bGl=KJo#IHXeW!`PcNqrRYeU6w4~3%* z_7v+#`2cPM;w%-eM!>c1Tka`ujbYUZ{=JPG*i|&IVwwG2$$n)JIQJ0PTLMJQE=o7Bq=QNBdcNv{)+DR;$G77a=oVj zYTON`k*r7l3_4|zr(zKw<4HRTv(kJAep5j2Eymitb?Z)4@HKC`mJci!^XP_;hFTNt zkHKFttbq!{x-{<}91ey4@#tP}75d(@<2x5n;AP=aKF>*_$2nRF;n-IJ^t)%F0rqTLwlV)%pmaU zKp#77rniv_zAoheyiE~1$CoQ8Snv$B++LCWuw_S4CXl-87`NnY*YdN#A-cE38cBLmw-8Z) z!}`s46{G980__`bZIw@{6DuD2&{)2^%|r>A+t1#+%!8NZ9 z_Jn)5kzPZfq!>y(GtiAIX0`_D?Wr7X``gh1=u zP51b-*w^#aCs9YD;0u3+A8lCw=V>^vR9~e@<*z6(B7D2vYC}1A6y-3z6qq`2BW{_O`oLm*bWFOIW^I-&W) zQ3EA7_$!>tIFiM^^{D%1tUUYkLLktJ=buNTEE%V3GKUn{&D`vZ-UGUM%)gg6 zx!#>fjSFix?d3~;r)?#_p8T6UPx|KH=Gad5xw(Anb@T6Je0%lpf3|l&y*lW53Wqdb z_MJiCRf0gejt$&yk|CK|%DhT&IPYVP)=r@N^nJpsjqXC!Skd~au@&qN)BJNAXr=oI zoWH!b0h<#73H-i-hN!YD1y^azD0dR;mRX!8c((hhmDuvYK347w(*!#C=kMPM1DzGL zgJc1mJV|iL)E*fb32XIY_;|X5V3x#c;a>$troFIlu?@Hni@07{UfYT>M%-VzN~JJE z;LAI6TlgaO5a2#@^8REcGYGsW2(UDFQ|p{f*W_-7r(9T98P{hWxPV({u_6z8E=d9K z`g#(-O#xIlu06F*yt{-;OkBtHV5QhcOt{V*r?z@6Y*sfzH$thX0odq~W9z~N-=%>< zWC*U|a?d5(yli!uIfb^}#lFrkgTT2Lp?4o`ZDI-447cV%_7m$6TWV_n06+jqL_t(( z9bC7vvL5=%-TUy8c(6qIcRv4mm|xlmy?y<}tRt=z0v1~q{_W^Ug-tmuu+$t(JPXi! zRR6Yt^EQ%vm993C^vCzrJb>nowYj!EEx_(C)^;^7TjxM)F{@X@|K7qj@k=^!$yW~Z z%as^wX&LLO>qCjPY^%VpwVtE?7B^Q3cwFehEk~&*x;0H$yX|XufZ$Wtr=vX`#38GN z<-%69-u2zvr*`mdUsHBBgFps>R}TVWI6p~h#mVAWmFPsaS~6*Mo5a&VgB@JnjVAjI zgitHBJRfj6`9{D+c_dI;>gIC9$XI~!hO5-IWnG|(lhW3*?+gO34g`+67q{{NUmXY? zZKR%l6E|q!CeF|8j8BeMQGp!rNI z2GE9KQh*<^Ohw*T(4_E59*u=9j{$B>)+Z09`5a@JIfOeSD0;0Rsrudz?}U796}RN_ z=#z5C{p;GbYz;3DmoHrmwOn`j=`;!&wcfaoZopq*_U`Vuo^KXWa$6wogM1Wza*iy8 z#abcUoZCUEP#1pLo_XB&@I3P$6_1~0A9gLE(n^~<;arUihM6Z5PYNr_a{cX$az;vZ z`E6dGbKP#EX|6YBZu6%(&+avca{I8GXe0Jz_eOG&=1;#{9v}KMmT??e${>(I;1CF) zWexYo)k*KvX3fEDFJdhf_B@hwVig=9{nd+5rn-|0AJ1)vIfTM?tcoxOnFy9JIfO@D(UNHaYnZEpx-VtBl)h8;*QMQn83F=_dUOd0LHj&O5oBYf#{cPJDJw6D-;e@ZQ~ z9^88riiJ9{o_eAi&*og|fou~M#Ugm7SS0W+u(Da*RtV)Ce#d)U8+WP%ZYm;B+XjDb zY^;+n&%qQtgo}(KQob57w-iR5B*nON6g&=Awn(aLrk_d&hj!Cd%s zhL{#u$Sb&#xtOI40vQAjhd?WDt{tE7@ETtJr&^E*mm;{R2zOSxD@*4G0t%m+lkd-0 z=pGSS=1mXXHWWUo8!JC;ZVh+S@K+S_Q=b9T!=!XToZrAc1@1C z#D3Y`i3bam-0XXv*tUyXU4%41xtGq$FUrzq4}n&k{Gxl*5I{L~_As5D5(&m{p2VjO zOc;r`bf%FnUOGb?&mBNo-s_{M*h(zB3l!^ZN&AFPw%_=eZMWQRnZ5E>_2l!$y+%9j zp6^zbU1Sh=#UbEok~xc+RGLJ!GPu{!^!cL??_xo)77y|1^W%QIPnCOn zL*K}FSjXyVX%i+i)>Ty~v4a=`4RjAvxHDWEEio3f?AP-_t$P{O&hso~5IE})a6LPh zC;Iczby}TuIW*XbZxyMb?Qe9nIE>R~3Duq2eF#GfuE}}_sMi=)x^2PA!gT*kn-5V-9opDU* zB8)f-f!ZR1qXA+s&8^hJGy!Y1x=ar-YK>O0j_N@Ob$zfH-A+74E4?{DuG`i!0`!Sq zgic7qr&iG98_3hQO2kLe?OtP$c?3c-AbWbd!zg}5?L)gH>=ibxZ(s#Q-v0jH#<&_7 z#BoyCaVuzY)K%PJ=oei&HoESsb0EVKQwuQInFk7F+O>Zg_flN9%qh51%Y_U0-uv9; z&M-N(6m}Gjb(IhRGFPzB@;#<5Vr=^)^s?~iD?fIP=Rb`t?q!VZ3NG`>G$S1DZ0 zGl@~AWL|ef3tV&i&UTpdC+WwNtz~yI2xJg=nIMqjg{Ul>ZYUsa(YaVhm&+jGh|?T* zE1IvdL2mKs=-3RExSth5y=y1jUfhYoC-HxlG6-Z4I2i=e_4%~Y(hRRkszZaPN%XS! zE4`b2pH&F>t~RiijW4au-q7w{x`zzMvrHXVc2vN5K&8B5VNdJNa?NE`=3T6!n1y6Y zAx~Kk6^-_+Po)TjSn^jMPA^6}xlMN{^z`J~(__QX*rn)ZZ+ojdJVZ#Qa_`fWbUQd3 zT^%KcF3rqg`E(!UUfrW-`{vW({;WBUid&zxoo6lIWC7(A-J9kPz{wZCc@m#CHiA?L zl<3kny3m+aao{K2FgWnWh0&WtF5O|Rga8s)jD@W#;=Qd+RWa<1sKx{~C$Y_C-Vn)CBnA0+&xq-GyntVRq zo4CA^F7AgWD)UFpeRqn;QstuA-JYm_9@j}@{ls=!SP1u~SE9fw(KeMCo9rtKD;r^Q zZY}8QEMMOYmxuCUm_V;4ne)1RGuE2;yUN&XR#vMrEAb$_Mm1` zvx;ylPpqhMgh3k!Q|7UR+O3WY-9D6wK{Pg4ish;~G}{Z+u&}Tc1_u-MK=DbXvKbyc zcpT${OpM~fbGK88^>6d|2RQv1qiA(yEsoK=d-)R~iSVsq`4g2lnhSGn-ZGX)6@=%X z5Ri8XA=z%9Tk<~7pSG#c{sGL@VO)1yLF-@~7gRZX!T7$qaZf6G)}m`mVH9{)p;U7W ztE2Q!0oF3GssIy({c*4@cwca*?{y6g%KkF$Q4yqS5f$G%)4PMYlBDGORbo;d19V6(86b}-&uclAs{*Hc}n`#k4dX1X@~8p0Sfo#SJiZ5Qn)6DN&rJB{t6v28TAZJTXuqcJA78{4*R_T+ibIdlC1 zGav4I&t7Y<>$gXJH}B5xT9x=3kjbU(8IFg=mRyf@#XhCAa~CG}FpQAnksH5^-??y^ ztncVh6h}~=*r=y;)YBXNw^GGTEaqH$PCAb*;qX%o;K9N9`h-YGH^>cg->yyY>o}}^ zNLQBB*ix>>mv(Ag#LgJ_$Br+0UhBUGu%SYUfKeU!xX!t}2quayT_r~{i>z;*Q`wqR z0>Y}5lp~pvcTcC$=}6CLXYv|aWD45;%BFJzwi8RYZ`2j^P3}Sl|3R}^V9temD7MD( zE9%=Y_e7~3uHDhfm&da7vgKd`1YG^8e197$GqduYmyPT;c=GKS64x?{?MCnxECa{? zo}~`wr}5kf>&AwlKmmV6NFN2g@a5r&`q}w0uXnvM!9|AsHE+k${3*;h_!@Jyqs!u# zG!@sRa(<={@;f~zfOS?&?||)JX^Z>K2H71>^pB08Q8z>I%Wu5a66$efi9x&Gu`_}q zf%xlg6WaT=N0&LUQF-Oi*h*hv(rHSBJE7G|VD}!;ZpeF0QTzSTK`7Y}no2W zDICM$lTz43g@>v77uE519T{b;3~vIMe+nN`!4Qfy-;TT=Sf z)e|_@I}-YVvd-BU%kSP>zb5ws`{2H(y?VnL;%uQ|DghQUnqnHz%eRwAfu%)R3$IGg zHx7R=LmitMLxy&+7!h~jT;RuOM}J;6B9QvLThQwEJ*_JUc3{|Tbf9$!RhHgF?r2um z)KKLI2UauDlTMGiszy+SZn;6&b0qbRc8P%zGjUP7I*DvtPO}fXY4$la5PUFT0%6Dm*Z(rKE?u{5L znFQ3*FcFM)DK(w8UVhY19fcH+$=ScBhByad80P-1KdciX0M^*pA$g37X@R%p=D&c( z7X$|#$U1PCxX7+<`991knCM-5pvr;`7P((%@!E%NfhVd8m>Tq*A!4TRRz?(ylD{^D zW~NVp0d*~&n*aI5`}Y5=G)EF*{nG>Du7*}jGt6rkplxALjfJF7QgH(knESV8NdCcd zJEHZ(?%iSYhHDL|n1+ocWzQJXm}HleUF;|uy_SdSeCl6Wjts(A98{icUQKCK0vAW)5pUmK3p9hemI=oPriK&f8OoN!+#d=feMmS-?JWpIlV?!;#GUXSE>% ze;npMpLaJ>c~hgz#xxrvUa{NJV)Ia+AX<9l3En>lBjj_ej!ovP$A-kWi@hsu{_t=1 z(Y%dENG56d+9LNzZSh;^RGe#J6?#nbvqdV*-qV7u^2m$i`sXHLLy*h*Fnx;Y7osa& zB%nbeW~L|;5|XNau!;$Awc%>Q4Ve+gGjh>nW*N4aVa0&!e(u%@tZHj!Lty3`CDnPj!4D?>2@%ty} ztxbe5(OLz|bI8)WHme0nwtgpHx^QQ%UBxgeO?1#Jw4Z?abSS+4_^+Y|6F0%8|G&NK8>**%&h8ue7+)TCexho< zY@ugWfIPgRmm9lomlw?=cc?`BSFT-QO!d3(r1Y(Ce`aGAVvbA2P))-_f3Kkh3d+nZd^suJj@E|g0E_0vF%MYE+w@azHfqT4R<%c0r z25fK})Q9QI$tuNNmyHRD<~V0(=X8K{-hbd4Iz%wYwOm<-0Xb1ZQI|$&*#TbdZH?t% zb?)JLEn?ialzx~LMQhEQ^1oku8AH_F-)+r*CCt>3whDF%?Ps z&hJ61$)gFAEITIpJRr=LT{m%2wDf&yw&TP-qsq0sbTH>{s=zYc@?*Ig(;~+lvz@?9 zym8V*{TI%E1{oPXfOMLrI@A==mXe*P-er=wCt4M6$o&PPO|VbVMUaJuN1A};9hEai zGdldMXB^;SSs=g;YPmceZq#U0M`$>EaIkM=jY(-TUUQV#QFs>+$qYAj^q=8$te(eG zzt7J4(sMO15U0}&cX;@UP;i=Pw&64(^dDln8|zFRD3HnckIj&d=&h6D5AA)X!p3-yyqB&i*(TPw zJQ~8T)1iMPn9xq-A8{HH-#J5=c6Zj*)AZ-WEO>o@^vJ*CgNV?z)u@+N<2)QtQUk8G z4B(f-qIPgovXdVguRXlT=tH}(w>2aR@gP8R2pbR9Xoe=}k-Q$}Zf?x?{w=|iME34`Y2H-^^g1EEc380CsYe+&xagH zXwj(OX?E=D3JV$A_RmD9mtZ?)S^J@G>Npk~#h3eE8&@fTe}U>&o`(!aaCp0|AV)7d z3&MHaYP2iIzl+LEME<0c-3!v+*Ryq~N;D*}2Ywsc*$G@i8ylyw{@+WD8mPeC^e2II zxOkKlyubXt6_L>^u#ZXdy4?(@-qquNG<(g#e2_+gr|R>a1>Y{pAw>oZ2lcO2a(sbw zvX9(KX=S4d|5FxUU}s$9h-V18ON?i_UB*4VQ6tNpmK<>vErPG~y>hb>%m7XdvJ}-S znYe^RZJ(GS)@G#6xBB9MF17utGMARR>}YcojAu7RK;|IE%ZJ)}M7Xv~^5yh;;ja6w z>u&e#4h6m69Y6Shy^*5pB*#jZyOD<(Qi zRm1rhjJQ_+~jXc~2e>UlmJWsGPC0p-k zMi%JcBsv;BaN?Im)<4K=bI0R841I1B)%~3y@dIP1*Km)=Y(eYsEAjS4|FwcYYuV@z zEfxtp8FYQOK5_t~0{`dIRt?AxX)So55ls+oZffhj;t9g`33BGECXGl@DxD@7f&tlL z?n0?6wweaD6HTWl74ce3(E6NCUWAOSSlzo4hR^@)2x8iG5@ar6QfZ6-De9ivwmVnw zha0D+wp$aPEX_)uf#lrkzN%I3>O0A|H<~?f-N|sg0shkqqHq4!9(3z(9#lSm{JGJ+ zz54L%^^sC3p#tp9(SLV*v|1ZFIZ=)?R)#3sbHmNbe_aD-P&e0LUe8&HOfjU<%@}r^ zKQmL5@L-3dweU_car_QfQpeLKAlkvd>+ro2r-Bv*X2lKzE7o(UK&)Kk??UpzaZ_D; zJ6`mPK1BM!Iccqvv@xDUc|%j+by*Bk1?vzLZ)IlRpa95 zto`wP?Jh57o^dBA>d*eK_jMi~puVX??O{3NWN*bi)H+YBZ=FHk$%pLFZJoMKSL`Yt z7Ur3Ct+8MC=Vvq2uL|pB;rB~~C&O2e8tfAlR{zxHB-#&e40}=DopO20vbVg~wMNe* z@1X+P$D|*wT5WIC6!m;K5OL6f0~%1K=!-4LvfgOiB$vArL%B%_vUisPGUmtnI~x+i zU6N;3G-*xQo11T)%{;RO-cz&da$A-qB{~-jtiT2W)q3w5TnIkRrRfIj!|g>#G&|T> zq2NF?L{h>@eRhwmr5ovK@%bfDm=VDB-Us$l#l*G=Y0TGLdPzF-d2;F0GM#(6RWDMc z)Ni+-5-oVIKfbiTv_-%(hK`Q;HaQScmx}$0%9hqYOs5TScDWq#vW&JJPxSZNFO2ek zc}Q{ym+)qwvyD*^neNGEkD4Az+jkz0=#SWYB#(B>KSbX66Gd6TFyYFAqPHef)jQ^) zQcPuSQMae}f9IW23B_9KTb}O|iBl>uIA5Q1EiH64HdRhGF%s7F2N59254;NyvYD;2 z%(RVWK>lVgkhO7DvvyV*uMCBWol;2+btJNz8 zNO2YF{PnA7LY~}q=O(C%YL&y=5>c)}NoO#3<8;;7`_*J7hoO?k&(pTbN`t90b%*W4 zFnBcaq#G(v7J5s{*qDM&QmEo}wp5}x^_6<0k0JB=?}QYQV-+w*wIWLX3hkuqWoWGs zRFHYsz5t%b0U`8o4F)?0De^)rq`aL0cTp>Trr! zE_W(#kk_kFlim0!Q2WO(;Yw&QwE0(UNB_wzWx$F)NqMS2Z^so{K<$Z3Mwi_KAkuHm zceK|ac112r!kiW7lw%azk|}JaBSH+_R#jm^gKfPLDSD9qym*z~cDGak>%9AO>E9vX z$oEMheBv4TM%8}{%D=ObLOXVu@pG4PdFtPLD$=j9n*xhJruJs7>ter?n6=Sd70N7jDlAv5 zZ+g*u?rT+?0{hnG-omF%F)Ba4r`N)$S%bXs=V&q=2Q%}@V(iLko-bM zntuuj;BJD3U^Up|?iE0kZ=XcI`!X<#GLSdwr$qT;)8d8>Etub$PU3 z#8LbQMK-ad9Y$m4i23NI_IK^DMd2T_;S03nKd!o~=B$vGY}?1!k#@OWQFW{l(5XxY zz$dnVC<~hDvY4>nr+?lvV#DN&!fJv&yS*!B|M31ipj1fbo)P!63$s`DTUQ)%>LDQr z;Lz&*{U;1Oc|Vsf5R-t~vWCxhc=j@H;MEI9k=`;hGqZZO9G)zkp35u|N~jq3&9dX! z6S){q9`d1TmjX2-+y~2edre;Y1W^&oYw-;D9o0_$4u!%b$qR{qQQ>e^VS7H(QBnV z?OIn)$1Sg8vCl$IRcE~qwW4J-awDg8tY2fY`G+46Z`?fA6f7h6Wn9PY;}yYyQk}3Q zqBKy5_(fH_+-Bt#bG0x{lK=(0e491euH|CtJ13#%RGFISlfTH%B!&$l0N>$#QunL! zO($h0-kHgQ;fH}cA4_mSqpQ9?5e)*0Yss+OeH_a2E?SFa8{OSAgTKLf}>$p20b z4y2|L?!|Y|M;(jusJ82$10k5Je@E%bcq{_0aNq2}$T<@`AR#Hu8GPIWeHeGT#p{^n zfFVgfVxMk|B+(I_xV1~ja<7k{|VYnA&+dL zfrpjK9FEMMef}zbU8&k52Gs;#5fb{bQV*D-qg8~~9UeVDmNOND0=VANjr+{orvtuE z>C+m?sKwi39{jMwB?^rfXI3PUZ1bL9JkNPVgGBn}4dKa?4C*E%T$VeWMHuJHb*xjH zuNA$01qOf`5vC#BIdiOGT415BTaO=}oyXgC`c|#)#;I!JFzZZiza0S^q0(aoVLek) zvNbx4+$*TFIQh!oMDS%r<6?DyD=3V?th?OpsJEV9Q?mgfZb)XCD^#jh3!4fov2=sz zbFJVi0V1#AS??D>Wb%m7xtu?pT9f%#qZ28bC3hD8Z8+}N??Qx3O9V1WAOAj<3Ly7@PazVJlZZgwyW0Hfyp@A&#}bIz=Lo{6-rp#+#4<3 zQ%UomY?yhlnOT`_A4YLKEBw;9M0F&M=VD>IuukCv{ozm~x5uJK)eZiRSAt@8g|`SG zw>W1$HXjypL~K@Ep(R&ioHCo~|oXXEJXRo7W9Da8Wx$cvsHBCMS6{nh+q zc`eVWV`5V@=@!qww)xc$$LF@(PzjAT-yKune-AA+{>M2Ru_}U12KYewcTIPnm|aep z1fBc&KGl8jN`dF zM6bR9{5lpmH+*FNc1jLku|~)ES5A3w8gZe6gIB33m#Tly7=m28Y?JqzcN$a0YURPu zGr2t_JjxwV9M!8jECg%2w&+%T-k>-^u`d3J%~cGr#7>yf`@K^?Y0prb|Ej?xCnV?- zCitpvSRoeU{KjcvM90m3$Uv5Nu=!guLPy$Z){62%eBoaWi238W5O_UZbQ|vLlS7kz zGTJUqr62dUzopK)-#>>RRqUHDM%URWE83enx-12sJwk&!E1t*2mc_$V@KqD1bdvU; z?YJ@j&08@4?N^YOYXOhlwPdLKBN_Yik0H6l3ina8hAje#;&u`GGNcgA4`#_=aAh=F zqvHbi;45FA587|uM4dRFSB7cz)bebt;Rp5hgi7FH6l)K%(IPN`z(AlcoFvm?T~cz^ zk5~4mz>99*E{%*)jD303kz@3~g$N;{MjoN~jp3_wxsytKtN4^hB`3c< zYlVoMocflWlpsvCQlr~BYMF;Z=TI(?&8SI0vQ@$=jG0WJex0Z&Sj0bv{*#o7)lCFa_`y5X0!h0_JIgGPsasp3&2WZ%RMZX;Pl#mmkDmQ zIPRWK2MCo?oaf7%GGkE7hMtz$zN#er;ZF94y^Bbdk$Nq)ep+HKrK11_tr9j8w-G(o z+)CFCDdaEkcmb@HTKexuLrQ6+Be zf!!?HsV;r~LISVSC9OQuTUT-rPB0C&sF@;0R@m_6<6$sy0c<5A78D`alfsuC`>;5)!kx$P|JQqM-Db=IKpLh{j@Phk;g zn`ead>DXv@UlMrUCKD=))%Ta4zkd$`=|YH>`=MmJ*0j<(VCAK`p2vS4(^ZR<8pbJn zygbzS&viXi*|TD?#+BH`!IkBqqGZ3<^zg_!7a&jwNek&Awj~2DT&%vJd@EIr2e)l= zmnvSdC#f_M`d@o4>ox2*0a;_q*3J6Cn3-vv0|UgMMW3Y>HAw)j{k-NLS1q~XB=n3e zQ;V8Pyywy8o8>U;2Jg>5sSHu@_J6Y+uc%e%GUNB|mb4uS*#CK9)#Al!ayxhPespMO_HV(+WwICXjf_u)LQ-Ydv5*=q&IPCF4=t1>Dk;8?pVMR`CbZY5{%V;j*5P4O_ObHv)~%t_C7N* zTEUu3UX zuaLXo)PMsi$nSvjgQjJzuJ!;}N`d#KnSJh)VbAs%tZR`9i$InAT@r}p$Y0ldgZdL< z9EYGxo{e%f_0g=5UvOMo@Tg}H?fdYf#@NA)8aZ$LsnbT7U$=@@$cb=O8tzg?d^_E_^-^-5$Zd2AVc9hX@5m%Yse(gq=zcyyj+!r$p8da?_p&9+AQn z@uRR2u)UUY*5gZsI9n~M zE#p5q6)jnV{6SCvV|8cHP!^)xai*ZuI!X^Cl?f(H$%8?ok^H*e$#R9HEL#c$YIzPW zz^Zgt277vINp#ytmC`mZCWI}(BLU1t5l?$wX{$)mSUPEi;PvIgk1BvBzLrPDgTF+{Lo);WY3-@RKNFcLh-;$43~)eS_e$ z=8ieNh6p}Tu4J$Zq3KU?vHUqkpOoo7m2m>lE=nB{HL4a1TnAGR?o=}VzsP`woPG)Q zuWSX^_0#epJV2!Tahpu>EPA8ugL3{MHhvEt)WMPehWuC}_f3ZC z(-(MABHwIykWA&1Pd*&APv=F&EeFEFNqO~{GP^n1*m01YRd;o%f9%zqWMF z&$udafZTHtccj3TNo~zYkTUV$^;~>wb1xZB84_-Q23d;HtKmmXsyU`F`Bcn>AE8`j z1nhjR59ZkK+l%ntz^k*xc;3 zVY=9mC?1rcHImFjm$>l}PnBE7a{Z%X-EQS}1Ak|sgNMij2a+A~btRMT(`asa48Q3QMF|mHZbvLK^^KSw><^ zyzk<>C2XC3`MF$7uluT;EGdw3zV<-gT*{d~P)n!E^A!zy|7Vg3-ga47*a@b57})D_ z)@evr$hw^D$9GbUG->xd8GC15$)rGUFr-^Z%Gj1~dBgO)tF2Nt6LayV9I0wu`M2=} z9CM=XQ7UEv#O@YQWSR2HpV!O-8`B)H2S=FlDV;rr~?MQZL4< zjzJKq+l|cgk#zlDcl&%35*F?wZ8&*RCkB|rXs|-$_>B_uf!HHMS=J`TgXLY0K5-nV zVRoK5lLj?Yjw`QZ6$9ymx!d`wi2j53Y0O>Llaq`8m+ASz-OE=SKqpI#vZW4j3=|ht z;ZJ;#O6F9jURkhC%`;xWsN#>ljk(f$wLKPG@(wgWfg$z+rX=(SLqDB&K5c?$Rkt~j zUQ6Bkev)hs|Kdop`r8%;RcLX{o-f)i_*%FZtav&lc_(G|WMZVKV=(i}5vl5<5h|_P zH^Sh}-0xh}HGcMKD?68N!Qd?L&@%3Zy35+vb_0`%2HSARm*-oP^c_d&(A>qE{W8}{ z`+77(L2i(bhh>LYPgM?lQDRE2ye8|i-h4L5?U&KN`?mqXnA=C+0=p=X;)Cu-Pf#)4 zQy>4zrObrEx@C*2hQK`BI4jtTbfPi;eB?i}@MSJ;r_}^v#s5y81Q>yXbiYJ(;YH=3 z67Cu!t%c=cukwgSZI?Y7zE^oKnUgqW$PY#0*VPBo%a#@1Iu8O@Pf|+FIT%H!N%d^2 z>A(`1yM}9F{OiOMhi9D;4VJt(Pmfcio!kvWk*@feqYf$q?gj0TaUi6oIX=pOq$Sij z+Q9rECwEjEYkG+c-+8V9pP7Bql@FT(*3knWI1jSvuszAMd66#sFRI znW+adwSyx~UNKl}tlEu?VwFt5uvFji^j)+yo9nEU4eVDHf3I4Rw0#dSJs(_n0;c#R zVSG|gOp&G~(*TEw4JEZil$eiaZ#A{f036Z*9%(g0O4109;EbM4sZAeVWn(RWptztUhCs^Vir*eoD$-RvXu-((ahj`4j1uD zua{xBbYj6oz(XUPRbE{|Uibn1PbavP8`TQtRY5hsXoci410=gn&=q?05F8kSIi{@9 za5CwOrVCDie#C4Cowv@EuPrFCkVEKqG(Cl+eeWFB2>}2hr1yu2sU%o|54ZMbZljBG zBMyhy#&Vz}0|Ff^n)ryx?}_Yp9e!GPzF$}69sHHYMI=D?WSL$u0W(OUft8U0b|zD` z8Z{;=D&U#Fhr?&)sjqkZYnAgVpADCq#)oAV`f^N4S*Eu*0S^qpz3-C8@5kRhQKl%A z215h6P5D3wA4OctP&Po5y2jED3i9D0lb$4mr9oAV?fp3Fu1c|%yQ$>zRdC3%00^Kh zz0BCkk|G)mJ6HR|eFFtjH4zisA2l~vCrxi*3!Cx<0$JcdR2uPGq$7|=LCj(cb*tS& zxY2*npJ+kO)x}Ygs;cPMFOI&K81QgXrV0gc1OJaGLV2VJ&qaPQ zJ}hEAzwn;;zvFEAe{6MH6uvYpwcp+7?y3BoZaiB$AFZ%oR=1mtZ5+<^`*|g3sadY# zXqF14Q`ky+?PF!N>USC~Xu8C_Q0RxEd3u7WK*qzpB^xurVfOo>bGB3GCwBMS40Ddb zyLP0@Ra;)_7xXhmaBnpktwI(yLHq7vu2fCducR`9(uUxV6=64~^-+hQ@x-^(|FrZ` z1aOyf;EiKinqlusLS~g~Rs1#f4rQuAs(j9b;df1hsdwTJU7mB^tUJ#fc5ly7FHF$l zlTNt2({)DuZ>8YwEfaro`Gkvjeh8oPyo;i2@t95@&j>>8S6v!pFhyGBifq5cPH}?0Y+uBcQi+NULj9`K#Agj z5S}p@DO?)?iY#6_GMv^t2fX-Z+>O}z#DJTJbF{+=XVvmCCVGEw1Fas%xc&1$bD3~e#i*; zYI0c-DK7pvq>?^a)Wm9wiuMNC5=36iZseKIqsOrAdHA@ zda5-zcBRslJZZF4U&@`*0o-0L`#2wa@dhN5^W7+U9=f(p8lW=oaURS@X$|syf5yhj zLDe54wi@=`>!fup;x@jgG!belxct&q2o6jzLI80;HBx|$nrKF`M2TSg#7juKGELId zxkCGlI8dnkW2k6Ts^6k3K@6PE7754TEc4e0*MoKUdk8p0rpss_6t1ZSqi)~Pk~-d; zA59Nl01KE05T^*TERW-@UQL5&7c|XEH2m*Wi!YA#kE9puIucy_QK%4;IDxGaK@;FX zRWLA!wCddmw(NJS2<#l*q>GlSpQ^tSYAkiOCPjQ)$TP$Nm4oy}vcY#SSu3~9j-)B1 zEpMXOQfS=@8`5^R0)?baeviO^WztGp<#xbh9|KsQTQ)S9V)tJPWq zJAe(ioJqHK+gpwL*p|q3z-=qNkpy3m079}}o7HrGmVXQ=ytl;0$J)lvbq*y8U7}l? zv?fF0U)CcQY+x6*7iJsikk;S*eF|o1CKB)L>m(Zf@Tj{vFF-3@3TN=2Jw^@ykuPyF zxsPa$8u`^kmD>Q(>TlQbpLo)03p+Gd7;-lSd2i#oVV3@T%>seLc|w$prm-wt!rWN} zjCWekJl0x|;Z5^J%!mRHFHHQfJABGQJ~ohdUe?c3dNrlbk7q)uh*@Gj-*fxEdhHx| z$X7rT<0PvdbS0ZFr6OM@2b>br=aRYmx`9Eg2Y2|$*x*wnl4M>>xDh2%`WDz==+_q? zB?5gCv|$v6hQ)0=YR72^6&k3*SEosh2Iz_ll zF#L{u{jzq&%1}E5%|GjN%LFZqoo~}wAp><)MQt-GnK{Lh;`?94oRm<-n}Of_y{T0$f>e zG)4O*O7@{9mJkk$>w@AiC|wh;akSog``c{i0R+$%#N2f~*y*P_{g32&P{$B3P!nW< zQXnFfvhCqq`_i|r>*=T5)9tOn+`*bcFL7|D3G8L7<5v&i7cYdYI%c*EKzz{+9WGqV zZ>aP$m(?}lN`RSx~=c6BQ`-!}62csBo=kc9#+Cw)V z-jB~C#-%5_YaSiif@`XN*%7B@U6Df6GqkTNFKsD{hIpSPRDst^Jn zb-rghTaGTjhvF?N97!A|!4+u*Y1;*-p@!ERihJ%R^vqZiSAr%C+DE+H2YVd#-ik>; zT^&{mDT`p-TJXX=q0T|P+;^ULcc~Ywxt?p)h3pi#qeZ2COxIFLvULtrOrcSIzxcsy zQl*q;Ts3?Y9tmf{?Sq?Ka! zPuq>xyA>7ZQzRs|OtIK3J!oN~-XfyIpmS+_)$aq5IujLRO)Smotn@bPi+ka%E#yfm z$oq*q;X@~0i)q2Ke7&hIQEwvOr+Yk+yq>$F9y>tPEPo<85$H`rTJ|UUkM7_TBV&IH z4uLBFld-3#@E2E0DArY~9mmmSs`hJI#qB<2Ar)`%#`Tlgq|OiR{?F47=*IxG(Hc21 zqH6fH>*?Af5ir;&GxHJxXb`9+CNfWMOpO-C>@Evt&ERaORh0=HmD*v5npoW&9Ux7q zM4_1USQ_NPI8lo4XU1_>Pvy@ed>CUQa&iJi#SUifb-w9#xO>9_6E1PE2h$_oGlrMy zq<%Q?7R){#Wi!0~CZdg~+46%p!VEZ5G)?c;xy{-J(=TAD1cHuc=y9!y8ox0KLJvjX@>@v2Bdx<9@f zcMLSRR{3GovW@PbOI6^xrpG2G5Cx#Kmfu>Ur>i6yl)`9Y+XVXOi1ynQX4f6KvguE| zB`eSqv2CiQ3Au)W1~MQXe$9(S&Vr|6W)Mnb8({P5tse zBLSVFB_>Pyou;guo4e#7QGlL%T7KPYPuIU-qSevSdc9%)47OkpW)yCsippasqYs$B zeS?LZm0=usKW@BI?#Ys6V!oE@MTxCpV?Pg_oOq5*dwj?I7_Z1x{%ax8>(XcIKeen2 z<|?*2mkhj_H$ShctHH|ga5umJyZwx~>1(T(V%@iJuK7jW&ubBwuh#cyfSsF!70DeSpn=OYF2&HG414J4szV8&@w!CM#OJj z`&_M0<7(agrq#Ab5ir^aRU-E-S2h}-eE>(Sm|z`3d}_Cq&>!ww3dWRcjWzS19HkAq z$;Ufv=k||tY^>owN6b;MQeS^du#n4bPRcAJ;x2t=R4EsqeNaJPKq5M5sFQT$_aJlH zz!32`2ocsfmB-WAv!*8fCJg!Q!)v`?11ZYUXbmI~a1e0kMFD1Fgx^VCD76oX16oS? zwAoNW(h-bk5-ba@+QKg~Z{~G@_GI!2NbnRrwVr@1AGiji0QPtQ%HoVZx3psWDL_cf zZG%OEN)8J))7o|woXAU;L5V(V99{jUH|aq2)5&&BI<22>35~u53D3)_{fQ0;7m74QX zK|X8$-{n*-(QI*7A$UOPCDlGW)W>>i6D#ub{jmQ#Re-|3NLM-;0bniZ zs~8}uG}bS9{9k#@u^(>(yvxq9I(G9Jr$O@==T_6GI^u*J=yG4QvB^Zx;|aX|pT|gb z?A{ncq9V|8cBNoquh!@B)>Q_xq_Qo!F7yF&^+!NyzzJEIM5GzYMo~UgMDF-1DWwFK zrV8XIFOgzgH43wFs_$tV-@Vzf&TV|)nKaV>X92v9Q%!fmcN%Oy+PyqndF;;B-M8P6 z3dvm+au>~rNy{P~XvHsbnYb%n9}J9fQOkJ{Q6qmH2V}^iNFG)WLk% zZ~n(i<-xPzU(&-7?%12rPom?=n$w=kxm9Lt%#Ja2eBZG&e?#GG0?8N$^afY#L0kK^_=Qby$ekpV zGQnoq`Lz>Fx_0u!eUSeipRxg}XPj%c5B)fnwL8*26E~>$FZB2gUXh$nEW#4~;SGnC z#W-E2&?70^RGte6KlkP8hVha zW`dby;a%D@9wdz{l|)sVwRV*@lqk0W5b9>K{}H(9^0OU5bWhfP1X{J<@=mopfF7A5 z^~d(cpH>71U~LhDEsgA7*LEgU7v$^gv-nYn4&V7(M0i0LT$BCt!I3d3izMq)go|q`NwMi=WIJ{LwRKk0*%iPV{Kn4Rp z^`9x&l0d<34E2=fPZZBSY*?j5KD9Q87Aj-(JuyFtul^XxegETo#0$)2iDLj>z5-O) zIQX&)>R<1pF4aC?5be%+NN3_UwbgJlL1#7oizPK1K+s?oHAtG7arpY-et$=W&QXLX zb*e9Tp)yu(3HEC-rCzt4af3!xCQhRmB2YIhbY&u ztB(*!TH!JA7To{o?evg*mQRvB=RJq_^zmCaL(|6>k2_wg) ze`$(Y7xJspLcsCy!bJ=xR|E&K_K)@AE*Ho=gT8$|ie>1MPRBAOH8uL3Hid;0h@P&@ zBkzC;Y+Jh62~9d!z#vKWGSzLFSjclAkgB97@Jor1OeP@Mjr(Mof8f>h$JNI%ML&)k zON8xEemQ|Z6M(D3qymmW6uDM1+4kPbz7H8`FkfDBp?0^2sEG;rJ;7qbXc;;f-a{J~ zpLNug5>vwj4xZa3;yU5~P52$*Bug{^MJtugCcnjS=p5yRsH#ebB>OFeVbQs(i1VxQ z1NV^`>|*YZir6?@3OYiYroi9v`*T78#B;v=L2PZ+@+QoX$q+urMj3EK3j4kP^ac3nS6V$Ng&P)K z!06f8GSrz{HL3shN-uFtTV?0uxO^I+E0i4I1|-qZRRqujV*j9S0{~zlWjlfulvNri zV*e6^-rKrxJ`A3gXXvMvr>EzIC%<_*$WG3v6DN%Yf&{W}kFRvd(XZ^g-lhs&f-T<^ z3hBTkaEUxumkYiF^B-r!Zav3ba@mr2^k#p{HAF6ACu1RG_<-Z2^E<#Ipq?`3S)024 zSOBf8&{$+P({r*+m9kk`W5`h<1t2WmbZkafTXnx0oawquY&<&iCsJxbi2m^xd#myP z$gCd0)!2HO^f%)xk-D0=6x;h*deT|;EmgAkj|zh#wbQ9*$RjU+fQdDHaT8r{(7m9tU${gxevm^?cDr*F(A7Bp9FR@QjdYHdP_YVihmlubM`> zN_XIuDWTd`HU~PJY+l`I90GSxTU=2{XJp0a8eI!#hr1&>qX2eN#U{eY8b8rrjSOcV z*|V{^X6yESh%fTa_4eH6!-{;JM$$Fk{|xEvW%T1)Tj!K-e9j){St5O@$-v!GMuUvz z)>a&eAc^>#)#ZIqth{U=oinnH6XL&S9D!0t);31EMv-;{a!5pIp}}-PtFv@21IO-> z+o#e8Ud_pAA871}d`B-N*VAjs9T?B6)T{i}Is>R3y}TZryq*+tUao?rNO#|Ta)_Cf zaeLM&p)a=ZBo`!`9l8l^WnFT8slw$N|2TJ73PHo}ex)h0h#jSL7DN0vOZLrS$SEWo zp9Y*H)K?GsnQJC-#}NrTKMy061g~QuHqX?mC{jpz))O#SmL*hTQX1L10PF%VlZ6i$ z%soH)EUI%u{tKDAyoIOmm$uG?h437HBR$rc6@^QK*hq&C(5`f|MPaR37`nNQZr1ZG zWD1)`_t&x@SxDfjPWVS&ZhQv%GrL@6OY^8;>)Wx|DDxcS^`YFGO{@!Pk`85XLlT@K z4IStK)u872Di)-bjD>`12Y0Oe<^=d@DT~XXT1RC5Ju?~eh8wXUQ3wYNY!#mTxO-x? zq=8p3eFBhUGQB(#<__;*wGlgmzO6)J;4nr0jdACP6~;fKDng;Xzxgr7#!^0@TZi~a z2lGFnP%AJ15^dW|JwRs41Qr-LD=_mFf?(1g=`mq<81><|gz4kmt;Q{63ECKJm+^{f z(dUfCe15Ndt&6w4XlRim=>%n3k z*+`Z)SGsjKpqv^E_+TivI(hM~JJ8O5%KH$F3*E^)hBc$A{mYM!96#?i*4}5X^DaX{ z8qHGhp$Cp7?)DCJigsQwJ^6IIyxcOO*KN9CGU*Es;YSIFrhZw3A4}>ShoVR61Q>)@ zIG@=Yehh6kXgHBs0?VNUq-e6@SO@)i$Di#OWwI0FMwgm76b+^w_6xWZnaNt~TOzcV z(A?sfo;K|~Q(0MJczy7^^ub-QeADVM_FB5vx35InUq9RG^qUJujJR?Bg?R0{mTScXpb-Pzy$}n-W-oqw@?52$SBZe zPqbwKqDx!LK1{fhbep$2QL2#aV!3|dljbI|%j>aJ+;#vYN#7Q-@3Ocj@&CO(Id~kh zmKg7}4?C!HKi|YNC8dz$95t}0@_J)(ydI^k78(1#K>{XmL%7|5fy9xG~t$E=D@^7OM^O1!1MQ(R;={H=%MPZC2Gs|SU1L|M`f<+@}<+1AVgfeH%Qn5 zbgN8PPDEdy^d!1uX%1di`0FM(YFC$B)wg8tl+8aA1)Y9{T~U{iL1(R?F9>&`*O@?6 z#nFdgXYA(567*oFh47ezrbdC3K2u=$WEl{+$TW~M# z?!}9HaSvXs6nA&0XmNLUD{jRd0zrOx-tWEZ{GFMsSuRJz9RcI0c8>*ej3nQ%#16VMb`9D zAOaRiW7d_Uw}dwhZes_oF8=X(5Ejk2IjY=#hV&^4cfM)zr@0O+Bz$5t(^ber<2>;C zm|M9%;6bzrAPZXpN;$BwxB1?iJcE#8G^4r47`w!mo2u{9Nvz)zRCObC?)URyjHUe@uIB-+ zOa%RPMuT_~&ET|429(OPczp50foo2=#HU{cN-dPhzl|RMo8%>P!Nn4Ia2sEpXAQgb zeqZ=q4wF(uGdcazFG0i0K5CDRM0v|rM;lHV=K!L zp)-;kko5C^{6v_VsO_Z`$plOmt(T^Z+azvam#gd%ifg_>bx9AW-Pg83NVF{rL+#Wn ztfIib#Iks3h>NI~yE@53=iSP?hCk^MiO*aj`|t=}a+up#YpF1_4*4}pJlAZ4W3uX-P{ts_17~qBVvQ9g5R0RDM*8IT`;sD-;pkA!)SSNT4h+fEvel zCu{%t<1L3hZ6VDfv#8b`9x?)W?H5iQRzA*{5ZcG}e4bmffu_5wL^AtO8oi4QDV&wPDSLs)D=1>f@{<1b!qm-w$1L)~ey<|Ik! zLLZ)3Nt@=5x80xUer}w3D&sCF>z+JXVMw1sHrtxjJWghL74ew4)2+mR(`@6ze<;Un zD*NHr=l%#CL}P{jAF_|32v=nR%w4q#>+-i>)#A39Y;ZHA$@USxM_OtTwgZWda_pdl1iCKbRpVDQh)b-smkD4bTY^#zk*UhveVgk}a-xk;^ho>%8HWL(6 za=b>H8QYMYncyC7lN}8t!oi+p7xn+tm52}D>6zjX&Kp(Wz|yH-2|oy$((WUwr6;%bGQS_GBS#_OJ1% zqGG<1``uaBiTdL^5Rb+P>qh2=mQ@H??l+&rSU7tAv*^gJpy8nS<%Z5Amjd#K+QE`#nAvQpC$OuD2n9*Ns)O&{EgrO~Rz>n-{8Y6hm0x#YB?< z<-WqoD_H-y1O!}60CZeS9&L`TR+Ri`zB|lISAHk20FA^Uhuq#nzZw5#09cE3{dX^f zshH)eKKauCF{xSPBOxXhHKnM|6!M{jV0Cqkaij*|Ra)7`>XZA~!MAx#xs+{zJaI`? zvYw%yDQgm9^OyO&h_jKFEcz%%yO%rjSU~k)j-&LFq@4-`BCz37;LMJ}k&Fn?ZsC*^ zWvk@+2N0t-<3^Rq+F{dRkI~?XC|imwt@Yqdes6Md+MDs8KJq_>L{7s2K&+s+R#l;? zud~+hEHN|4q3A0qH#qBhax&e&y)7>f=XbNms_lEWtTRFq9Y58VX3O(i>T-JH(RC%A zIA6Z*BO2^8R#!#THigOL2dhA(UAHWP5XwH|K9BsX|CG_xdz)L4v8^#a2|^$CqHr0a z|1DIAMdAE9ztxrgB5R!5=*=XW{Eee;f7-l5}Dz(V6KTe20nUUd{)27mGs3EQV!fEu^1=O5yE3bWY{l7d_ZpZMgeq<_lkcxiRq_tNpGi0;hcC!EemY z&Mvn>B3g~+DmrX1zT1V0W8@3<{hBm`^+C48*8lNW4{NF~W%vn=au+irBV$v0 ztAjoykS->6?Y)`VdE*p^!nY}U;E{T?k+tpde23^&@NfZz&i+>4eoJPD8=?13>{wL| zGf0%3v8?X{|Lt_r6SH%YrEu17U6mZg!P{KNZr<8@vkmkLnaUgY{?PZq53{r0_B8NY zgYS1#L_ga1g^#&eGF%?uhGS3vm2-wzSEcn~8V{vy-bi8`G>Rnkt^MB}K34!Y2|IzN04Q>x zelVYLy88Du7$Kb-_)1`|(2=D2>x6h__ibPberh5gBK#Zp&u5eL_umdqG)EvJ3k_mJ z?Z0m(EJ7xp?6vVpXTiv}i>1j`wRmaCEvd|yRs5)k4N_y=SI~<9V;+aE9=%vGMb@X` zTus;aqT|?aBnN$N@!lZ~tYnD&$+&DJu5KK`F1PrdW|Pe%b`#VO(%LqixxS{9BOqk> zx~A6FK*!Gr*C+_e*i_RgzuIP{j9D;l5D|ye)KW}Ng31>Pzw4t2X>+H8`7P>qjrj!= zxPOM^Vn+kzm$UYpIE#?aov0GzuWj8d%SJ}tuzbwXx@fCBjiqs7N_jA zM=oW|pq!>mvQpX;Ffl)t6p5cu28s`&*$6FeQvE*Hb5UaDVZt6F7Uai(jS<@)o)2r8 zBgG^gk~e)wG22w#>hV_$RdtQ&3SmdM>*vI-`RX(ukb^~uBc=jfrcp*^I~`)lSU;e< zgadwCA195W5{rxe)D=uBYoQ>MV<-s)>!r&cYj3g)s7`luxnm-|65g{+WX84VHj0y{ zjAJv@)O8HU5WV0%+2t+I2Kpop8S~aEd*7I`8MxMX)x>?sYBe8)1E&emdw8g%uwsuV+i`;;J|5N#}-D^}=f`4>`42E>nvWEP{p9AB>2X2mR-r@L=NmCAPY# z{I^he`K;SNMbejzmYR#TbyYQv%m0Rth?#sMMtn>%svV;t>#@R5{SNECq0Ferzo%)k z_W&}qJSGo3bLVaTuC+EyL~XW?~vqIk#cXpj3;l- z|M8J3w|qjzIrkFbZPly~?ln#i-ob1q8~l4_N{l@FzC*}F2-(KE%Aj_ERcB>GCq@=h_v{ufhK5IR=Z2 z4+La88F#)6L~<=ExW6v#L)G~z0LZ4YlQ+CL(na@Fd&osg@;Yxogt&WDpu063#rXMq ztVOb7_5C->tkGpH;AL5#??8As6HgY+gvJHQ%k-F_Vc5=aiY)1%R>`gT=wxF`z)q!J zhwKZ$br3?}_5s4WO~#n=o>%VYS{l}RJQRk;FvW?;8R^7#zzgFkIm`7s*oB@xpmLE8eD z^o^u+R;1sW(z!!*Wl8i-P)I)aLwkjOkV>Wa|2`T}|J(Dpq|BP5LFpdBrF(LmMQyDI zm#EpwtxfcMfup>q;U$L9SL-)-nd{>~K5&p$Qe-VJ$MW`{4oAq@-(Jc8v*ujUbn7#4AOxYm7x?jE1Oz$aw+OLU8EUf@SGRdI2=BP@2cNu*zK7FG zc=BMc5U6Nifto0jCf@70k4J?A8O~wF{g^E>py)@RD4h`5H^AMg%62UmpN7SYOz?Pq zfQw!672(3%65}%x+E);o)kRYtI$hVk_t@gf$w;1Kwk9>3%*U!`TA3gLU*Xof0f2d5aO%^+^!kNIsEC7lpYy zEE1s<>njZ}CO}Cd+jYljk_2?S@e%G)%W*Ehr*4^E#rk)Aoig&dA0624AYMNF5Qg?4 zUPbL7O^5XF(H#o!u257TQ|=@IAhs9yMbf%j@j6f!PDX>jqm0rwp!VmP3tz@igW4zi zbj7sZlcrq7aCCxRscWsbD2E|*8*%s>pnU3X#z2isQFbkn+PG>+6Io5}gogDMNuqUQ zR?tMxwMJ~H9C9~<{gNeGYWQm1_xc!F5kFaFm7boUodi)zj>3s1UTBGz-wH6^@H(j%b3D#p&VRRIAqv6e#flIcTY!pYZ1`;H-9Ws6jFO zlize&qFKjmCJxx9O5Ejctl0XG@VoA>1b-wVG$fJHl{|)w3<+WkATlHYS_-l7;FOr9 z1(K*mWzVqK4gx73qQl)%>0_MJJQebEQ$k-E^waf-hIG5@v0pce^TeyP>bo8@y4=oG z0u1Iq1UgGQ8nm>V1U#k$9Q}LX6uA+B7k){4DG0b7xzh%J_>Nu&r zQ5*LxC_i{EE{0W0*2ojFNgJ5W;kafz>EJ|XAOAQy9eY4K)0$dH+()+YjeWn{JZ2KI zS|9a&UYCND)_*;g%vxw7mgedPwByTHRGJCOl7@qPA|90SIC1yEpO$s~w|_MFA-5X7 z?>?1bD4Ft>@niM>siZ#@;h2N*aI>+Af%=D+UlBK4aBLC&V6PkM$7XrScy80>UOW>Z zTW|R8x`9hF7q)v6cs0*xX04z$j##jVuD$>asi26wf#Uyp2UfFVH+rdWRDIfhZ+z>p z9LD7BQWx;R=%O<@WI^Qf{-Rbe7J6FhCgQ+H0aKKs3PsTaRLbl|9M=Dsa)l&CCDnBV zneEt@%|}&!rGqM{irSi{&G9{u3D-Tgz-;!!ZPBtR-!s&AgiNl}%AHCTa=Uel0P=Pp zFRdLuM~(1-;Sd}vtiJpW&};hZnXbOgYa;!NxA&m&r*7C4aqoqU$pGs8eY|Q30P9$v z5c;hMo{mZJJ?$=;93nE{a&Ukm8_c#K-swvPp1)D#o~T1*M*ag#Ei4uZ<)aCdv+3ixAHYe_RR2 zD+}Pup1RC9nD-mg`94l^8k?W}Yy_IRCOGH{;qh59&|a6+Pg9)Xo?1G}4U$VOPM2^g z2{{lW1?R1m>M3r8^LhpStB^nZ^uyme|2L)6R*Ab!(iUep z0+CEV!@>@*<08hwOTLn^&>101m{p1ovm3T>zkOFO0T+2y z8MWNBcC9qhg25?6AAS@(ZVeUhFgm_i=fI`{@0@(hxwN4CKipM2oR;5h{#vt*L>maw zbzolE3aMvfO~j{8Gu{9;d7?E3Y)zGF){|F6tY9`<$Y>m9`7^#K{cfvP-w3a0qSeWb z8b2N_xvW=3joP?*qv5Is;c?aTZ8gwy5!kLF(!jf&ewd+WNg{LfO&Vnl7jo|L*7i~# zaNotBd&CoP)BJVwd9>y^a*hKUvk5_mBEM~Ygv;r)dOJ3HA-j+2g2=BOvGj%xW&uWh z$lg9oEMme52sB;amUVC}ns!)JA(1Z-FyYFN-wAem_r>!KV!=B&RSq5HUD2U0JkB6k zB&u_dw!XSDM?AKr*N2dQ(>&r*Qcr~^wmj1n$8k#)srT%JCJ_!q9fXfA5s{;>xHZr) z#$dGx=LHi$I(2%Z&^CXL6;xw6oI`xMJod;&$&6L9Ukwu9NZ)MK!v4cFU~9!pI`Zt2 z^x?G_?dn|J&AOsHuHbb{3Ke4%#LK0zp4zsDbC*<`FmbH}Eg1M@jZ9Md({qqQwzohu z@S{v%9w6~}wJw`Y}vQ7 znWR|qoW2NXDi!X&gJ)!y&Up!E=IR%S#hqSdfjcaaRz5wNlN_Uf{J9@R&orCN=M#+r z2D_5Bam_#Ssf*4P4iNcxNE(Z|qJ7nzrYVR^Z$Jm6;C_Lg5F?aw)MQuMtuQOJD^l2c z2wP1%eNhg@6=KGwK1U=+LikZS=MtY)8IJVZ4OPIp96J%IG5X^DK-w8KnM zahW6S>7ehM$vQ88so#D@Hx{0B%1VMu%S;C&)0jclUnBF*_>RT1uFIXVHED{9ofu|M zY3x3W1d)}5%uVx;^V1Nav1P!2i@OJh)HN#2U|U@SC4$q7o1%_kf03=Q z)S31$Uf$>y`N&M%cqi^%u0a(WHYN|B%xb;ORN$x+&fbZL!p773dgQ&CM1oo3enYyLJW9C_t@ zORrZH-R3Ut!7cRSBuMO38NQb8Vsu<(*bV|rA%PRXbk-V2B6pJ6T{#dkVMj;519a%? zrm@~xA8hd)R<4g?)hBw9mPQDL2E1LYEp^^=K_A{;-_B<~*blDgLWkZUWNT+@&1W9| zhaRVsSpx2FuLeFRRa48)&qeRVgk!dmF-conwhzUym~S5+`7+wBBk@WOsxnBVaqu{k znf@?;fU*=TK70})D&VJLi+vPGdno&jDdWm_O1>{X!KKXS5kr%6!0c6@c)R(?+p*a( zbmHzHfMCth)%-K9gKIp`Fv~Pc9&O%!8RQROwJ2!L#mxQ5yBt726G{)cRvu*IxuE?$-(B znty#%6%~zgA!5DxmMvrk|M~30y7!{g>KAL#PjGB0PSZ1_BdafNF2xhLGqh(*g0ou3 zn-4W0k$n*}V$^+Hnzwj>0ttwxE>*P8DZ%_PA=kj=6EQjVxoXM#n|5%d3UC4)bsJG( zoT5;JB&kFcae->~R)!BQAK}~~#>uhJAhej7=8jw6+NU9qKAsdXS7Y!t+H8PKiBOot ziyn8437z@rA(`dIaM!suEjD*WysD?~NwfnJCeK{JNU17Ur&)(8r^7m)tcZjRhYkYR zEeWl$ne11;SK0H>uob`!yLl+yDwz7$T0NRBa!;4*>Nu`)q>I!j!hHcC#8Zo^E!so? zU#k%mirD=mi>Cd(Yrj(Z5BW1i1yE<|%99Imhh5-5Uo;9>IbYERNLm;6Uk_FBs0s8h=nN4X=|``?xL%fo%o{&tZYz1|7inRrK#l!u;@7aTNd#c9Q# znyJB58L}-k2=|r=7|*@_BKAgS^rATfYZ)?hIk=l0&!g(>!%fUtrErq$+yn*C&+1r6o__Vt@L8z%Rd^~HTk`(RS3QOwr%mO>^5Fc9&6 z(;(?l0rbm8v5gy_1bbRA8o8O~vSX_fNJ_s$L6kGYwjNN4fnmN+&E}0x<~>F(cjL9l zTvnh4b;dxrEzV*bhY=L6>tjoH=26^9naGRv6QQ4%*an0$p6Ew-m8&M zl&^>~>T6jfZy!nrXeYM{)Zw^`TI`l zyM@K+R2)^&AQV(zhfV(p)OzaW@jSR+L*IU7Rtp!HKT5b^M8GVHpAnmQaMnJmGP_kw z4E8lP84xOOThd*GRN1Ds`ZmnC`A6>bw)8ZiPl^r1z$;@bIpl^GC|+rhZbbk!i+7He zN<27ZUXNs;@Z>-A&gg7vF+S|o^E@8>e8lfb0fsjv1&sRWGGmn z=~nF4CKS6O0I&X~>J0exrPAriC^e;_1|i7KeeT`~elxm*`-E+n3D)70$Q5Owi%;(4 zj-(jwFmjiIEUnRn;a|Vnn3XHpKNU|JQz}Jrh9t^}{QX|Gw!#|tL#6b4xQ`>_G6lK8Y=1nCR9{)^GS7Vf$>ljwo;S&M;-5hmh2N3Ho+CH75nmnzQwU`VOp z4m2vr;Bj1z^}l^}_h*F;#C)n*ZSK4~w1N|=g>i-Q+&nyo4ZjP7`@hi(Mhu<}4u-wl zJH9o&T(iE_y<`O31i(oE{ej1Zg}J|P5A+>ZnO=E$*qc{vI6e}#&BV7o01ploGx7Cq zAe-N<$Q`&L@P(76O7qA$Qsy>9g>bT;z!DwwG7TMLH(q~?^2>Jk-)h8HumY0z9V7#=c~+5+PzBiatvDAe}ks z)8!ny2KbRECEBKj(tb9QA*TCK0_M&;$yDg_z9V{-TD?D~jmnJtTbH4pIZSJ6w@ILk zUv2aS&5G%VSp1_pYcH?cKa`BrlBJvH=`#$w=MTN4VNATm-iY#ab>9-;unJwDqp7DFGE7 zqUoNbofv)BKZl~|+S`0**w9*kAnd)$K6}(W3B))wP_-(x{dyi@BV7u_2a9{t7^zNJ zkX*6?D}C2@_fP+5848fT?;45kx@>B^bK7}PZjky7<$Iq@d)Xx3A@Z;*;^3014YQ<5 z-|vm6OMAdEp#l4m<|H2t+XI#swG>}-3cbp%ZWn6&C;VTQ-aMdbIgf-qG*JWj9ghdF zdgKLym*+zf$F9qFUB(w357|BeGgj0@d%U-te0=6OHSIBPif}3dJ=+D*z!*wl)XI1C z8AK$%xfWT{F!ry0=6XIwEfxi)2$)Kp#GBG#=7gCKkpvmjJB!)s!S$p!yzK=zWY_gX z9PMVM(RX0lv~hloOzTDkiSw{2ufe5iFMDVWUSE2J{tvho4Lp<#)Lbl2OY?&M&R~Xa zgvXw}>J1s@3|=dYKVRRJ%hMg6!XhwvAAJ-l%tkJ?hoZgW{rbOQkoB}N3+1ebg`{`j z;u1V2TrgwS+DY3!+yDyh%`sxN*4HzyROc>mL?%zqahTiDaQ`^rP7f-VkPl&J+|Oi% z-*3N2`k4RaEyGbd`ub;5SS+}oJmzOI+iqerI&o8MZ0yQy($c9vH6bWhNp$HK=s!x< z^ps^c$1Di`SyRDd4~`4J0zi;S@G&y?0UKpBCjkaMF&0@qN&DM;pH1$0nB)~sYyz;B z-{BYEwoV@YLRV<6NT^jPFM~eh&VzDp!eqT^jT{RolY30mz5Y_Tgv0AZ^ z1f>B*1{Sx}gR1tZnQ%*m-FvL~=3m<)Ty0DF_TIK)r!)sQ^B%9OZ^yv&{Z|&4H{5G3 zTdOJ4{dyvz?;!^?^*t?9$iL3YtN@V~*FE%ls@DJdLL-A;PkkrK(z3*^K+W0T7p2!kdhQhqH9P-W9u9LnK^SZl$4liB-FGu&jDbTzKf!@>VYbeYn@} zy34pE+`XTAdwdH!n5*=Iu5G%5G({M!I-DDJTHhmXbVJ5h#9PiE6 zFGk%WM7!4$?k@+-ZN4Wii!#c)UFTNDuf~mBH{Xu7W(ihPGRIR`i0eAY3DHr&%!4`~Vr; zVMVC)ESPAqLCoo21E8$OH$2I2&yv=d3X_46Ege~vuDxp*cY3~jOxL2=s@c)7hYT1L zOUsDDgMOBrl`#{g5I)`XLQlTEyf5#95wcqOlTu}Jwa*5Sb6=w8`H9X6geJ3*Isa?9$F3!veZ9edzq;5FRYSUSc`^SB`bU8O2@3sl0fVA~H`sus)u|Jq#~Pk9PM z4SY8A%uGFBhqw#uf)MDD$w*h>z*4S8+iYDGcQN^uE9+Eaqt^lOzJg@m5r4ly&d&zlUfvr z&tnq*VYSL6QY6r^$J(h!5qv`QGyQs`y0OfMriv@(E{BhvM_C^%BZ<*IvB&-(>ow}K ze4P78kCVpV&NljWwYN*(j4@`4F%1|kT2+eV^9+4&j^vX_K>B~H*wb9_Vl#gGkPW3d zPqk5C&haYp13n2Gt2{#AVkZebN~7>H0nu zXK9rUCIOLC$b1spn?oe9M8JWay6L-VFJB$TmFYD3?VChoI}q_S1f)+^qs}7PDq~m zUQp5ADD^%FA)CRQRTNp0MQQm#vFGuD^;&yVIBR(bND3#S2vF4?#7@mqTv0ZhT2?lg zT8%ZD;CK0P-REk`UuVocW99WU8Bjm82@N>w@p$W947fE|(|hiRqyE7D85t3^8Aov) z=lrFDuJ`q=JbP9F=Q3V0%A}@qh4CXQm>LoTNLr8XHo0-R+ic$HxQEqQQIjMKX4iBj zPk(hbKUdlPZCKNCkqn}hfKPi~1rigbQ|v>1m9FJksxuY%&lDEVXP6#z_TM8}+j6lF zl_)6}&E98SJd50)iM%OWiP^968jsb2g1x?mK-Zc#yZ1I~)=F~xZ5+E^nqH1_UdvGJ z%FQsYwFB<7vy@AXpp8cLL$PFSP`#=HQO1FsY^kKfAO!1qgBI_F>h}94w`)$TSK^Pp zvpP|)2%CF+?QFU-POYu`3ZWK!vkdYmvz|oE_?7)e!bY_=0)ZoKCO0CZO2VQw%Ek5! zbCMNhHnB5yqx$P|Wi$bhqCSx{zAN9@SY_zhmjuSG0zBMN=!Zt|8aQW0E3F(AcX#>5kXb% zhzMaoq6X%-VcLj?Ol6E8v2rC>vR_ETt$l|pbvTlKL(M_nA1tyPg&yW&nwXO(u2GEL z_`48LlCTu{4vJdkw_0?p1t@xDPlUf1#z^!q;5h2J7n(QAWu$6XILqNri*2C*Ey=#2 zsnAZ;r8f0S?qY~l#nx}uGz7qk3<)@xN;h|UjmV_8EQ|E&A6o=z-Q(gq75rUr)#q_y z)U++2Udsd4pG_5U_*q5FzePjjQSG#RnMuT!2CWo2w{LTH9t+NHag3@|R z?gv<3Z$ooqpLDyA#)~SF)4cG=z61E9kwrq3XE%X)=~iosx%VR~4UZ$yipnzLjb@nJ zXUS}j<#nL_zx?xz8go)E3OBYKDGj=v$_qB@!a4xJUfT^#q?P2Na$xr{ESgu8lkmAN zPG*x6uG@Ym27o5tr)butx9+;?XOnu+hmfm|VWhl25$0Dn%iiy#rRgBL;j_kW1AVSzd#6`H!7lg6gVTG? z-mwhId-_cw;TYJjGiA{vXdr?-o-`GnL2^RKNY|eox0FO5f8ClF12R8+=gAll^Twf= zM-rGL?i6ouPDIURvo!4N$rH{=OKXZ)8Cz63I187jY>FVP3N8Y$l2v_)f=5(>IoI#y zN>PvcAxH-sgVX-$zuFQuFf@TDo=#tc07#WhflYN-UVXz9)bM# zAMFwNGu8-G0-3lWY6gN4NGC=1!QiaV0Hs1VtShG0jkdo%Uw;O$^4nr)!Cg>kkZBcn zm!N{iY^<(P{+)c^(IhvC@;)(uSIj2sc%y`F1;?HyC<|{-52fz5X=!VnO*C&btTh`+ zGybcF_lY%{tItw1E7DF><;ETp|a6@8_8O zx_i9>zf@>7eR~X4l!Y(Pa2JJSCv5#XOJ1a1luDyTZ3{YUmj%-?wXDWwgRbVnBSx*R zoT7f{%Y$0H#b`_|Y`%7A|)9jubzEp?60DaR5`0+6V;MOfY8Zhlym)G2gWwUO5e%MZx}Vu#I3 zeRsb(K=--xUOz_ZO4ep<(i%)e|58RsY;AF=o@bvM;zIG&4o#+;Q<&RkWrom4CD__w z>wN-ETNgYv+{X;=JU7_eS`lt!v+zY@!>%>qW$D8|iW~u*#o@1s+=)80_7*voziL&3 zZe$p3EmyD)VvPBZoViRMmL^#sdq?}a%8g%MQ?eJZX}8a*{96z(WZR5&R92WbI`l{2 zm1369B9fEXJls&QD#utN$hDmdUR7JS#r$wT?w#=GOtrWf(VXsFgzdAzAUNVTCYHY> z*)@7XnWVy)FAfiLq8g}WH_J2HF9HyesBq7f*T+kKNVD|YojFsD9UJZR(_C3r;19dx&8lJz+gyL7%+p;Jl;FBP%R+c5+;T=0Ri1=ix%1JLR{2vjd!*;@U&kn_t2T zpV5IR`{AqBt`^OM|8YsDRTs3a%Qolb)bgw(;HhNYGdm~8!$0np@$6LlGM1XT43wbw+}U?*)MAQ2rjw^n(_36u1`myXyI#d>>ZNbO<81wkS!9}{$VYok zEN1U}D4aF-Ln7E2ph*t`Za%z|OR!ry>!Wq6_$<@Go%DMxDK!nSjS{SEb?rQ2 z?V$7$?3zR{_3o5X*wAjJXa*~zz#hF}CD~SXXDhrZ%dKh#E)=cvu(i@FU6_8b=e2RA zrWj^`_+N*_N-nr_x3Q|ypz}4-pz~|9h5g*(rG0a|YCQ~nhI`u8wGNM@6*xck=UyeU zab`mVk)nmRClw#q<#Afr$`5Nxt)BZFdi@P{L1l-rAtH!UuX{DxVJoZ3V_e_TX$rHCPD=N@r)@UR|Cd?KZ5j2? zvX)zq(medFipOy+!J>!svna-Y>ebdQeJ&RWNUfI2#nCoYc75eKW7l1LK9OJ&sofjqR;Mk ze7y@K5Ryv*zF3%WoJAnWE`8#l+MiGX=Yr?14D|6^^*Pj(c$M$El}~le=r)?STqn3ZV(qQD@Uixqn3!0ZVD(+GDU)rG z^{~w(E$Yx+w6qpWnt8hAJ8KrU<)$XwYqps7v@b}CkQGhaVsy6p9J(^17k-zG*BP_f zl603|b>&aQwebbcUM{(s8oUw2LZ^Gg`VU<%th#>05?IcuTjL)reyk*~JzK7;dBo0UK76>j;Gz(w$G{F$I;!yOckGPmiInRua)bA^Kb|>Hu*L z>q7J+n<9slNRkXUA`Ty#wY$%z5BY>dRoiX(nNRSj5_4cfY;4STRa!%8`si)k**&qU zt7%&aTFN@oVXC%=ob+``C;DJz%{HzSI9xgVjHETfxlM|B@F1b@peq*OUC8OBPbzt~ z&ZaM-0WClyef_{Bo|JLY*h?74DE!~+WoGE73o5nFDw<+@t2WV@1cZIJRPy>%hKfPd z1Feb}MD}hvaG=T2g0MCBLfNicgFC6PukkzOkDuqvka3Hj3-L4<@ag1*U5LcTc*!$d z9`r=#^d0>Mt#w|<0v=h<{;S2wyvSWx(1g;y?d9;^gaV7Tw6so#{7-K_V)&|sKXxwZ zto1X9)wkQFtynAEW!f>@cQ1{wMvT3Ix2qQ@-bI3F=X?mi6+>>?3qaP$twd7afnQnnc}uH3-7Q0h;^WQz|DJbc0se-nRY#B-zLymAPWQM78(u znU0)P#lJzCw%86K!RMV7pvEjrbqaIjd*=_Ea1MAxcNJqtz^L?1L0X{SK~T+_OLZ#2 z`u{9i7}9}Otr8YNyxk6N2w#_~jhbh^EN;9&;)JAhyc5))_*4CmwA1>yIQmzM!Kt}+ zERF+Z@{5y-`Ykc!*q@#`YVfosVT~?PqJioKq7(@YX{No{c3grr-;C`G zGr2;3ykQ=9y5oy_xk;|o1A1Fi;o(rjXoStGzQw~oSD?uav9{YTSX`zQELwUePlhhgRTxYafTP!>fhk-?tn()DVS0Jm z>3eE#?7V7G)v3mW(F0(P8-e^b6;0i=I4l89O83*oht*G?KCx`3Jk|UwA;Pj01Fb?U z%Knk!oS9a1+7|I4p>!H~<`cAnK71Cxd5DeB93K!Xs?}iQXL{VNl`uN75UCN(61bF+8_{YhvT)bV+zBcIA zhc9d67QrHBjcD|N{j~xH9c*06%a`qE9tC0Pqk`ovPIb@&{WlX?^81{(lK?0*uC-D? zz&FOVo9p}*V{IF6+_t^C6IR^>^mc_3h^71C7d%!b<*j?Rs@A_8bi|LelL8cGQ9H3VX40u{jQG$n zf{xome)Ad^lI+0_qr;XUPJ?qt8WV10$n6m^=+EB|&VcrW**Xb8v4mK0rZg}Mc-%r> zzLjrDx)>|jMav*<@P1vsuPaOQq7)kHmf74@9ea;z)Z<*Tx#SS2+=h64`y>c|4%y0X zO}4En2E-p3F-RsNA1?U$Yjq)DCyyceTs;?!ofTxfR=$Lr+2ad@Pp+$49Sj` zYk$i6rT8LzfA`~f*q+!cMb7*qp&N2|Db;)wCK*!8?}kmNo+~D!a_T>>vHGaR*kU92 z?2l*l$KJddO-H_e(>ns^cHIQXSY`9GEzq19MN!+7F-qWeeW{DSQcD~i;J5=WnUO&; zA{7F)pFeDal!My1TfUh|$ZEo6XxZ+C0XJgIKbx>32$%JkdH#|1LW&(5 z40yo4gbjjlgiMA&|JBpDA&!K`l`rFlam0=VtLByHvn0{Gf}KA-DB+GAA`^4cG8(O% zN1F6`{n;+$Ebj*7jc2LY_yJshIq7ZsYPL74Pi_=*E<*f0_pcH1Ac}^-kBQ(!Dz6<^ zOjE6q61E_XGd?+N?vIR?K@l2LdY8k^r|- zsDk^?&LSMsQo0wYa-l*AAz$R*s;!sR8m%YU-+f4+7|Q;BqFB_LtUW)skbXhe8bqvO zkBnyUyA=y_h#Y3?ku+?)3X0`S&eXfS9Wy0kF)JJg)}eqazL`z72?yh;yC5$h(p2q|uKG845 zeHNaN5Ux?uZ^@P_`0GOtFCYg?JBQ*jQ513QVc`* z%Zm^ro_te7!#7v~70b|4=}`7&-CA4tlMWrOoxA%_L7AJq9zDP?qqwDdZCM$8g+}q$ z`3)$`JLE6l-()a?HD-jM+jCBF6|{T{`hGqwON||aCZO5vo1)DyBXtQ8MNXsrS=0>H z5t6QVTU4vLq&N8FZU~VJr3d4kcqY>SE?)*Vx`|%MhtyLyWq0kXD4if@mg@G0mFJt1 zPuryb-jQ71PhLQUZro#E@LAzl1J@V=xs^Jp2WJf19HzKWz-q`6IY?#}yjn*u;y=Kh zRZCX$?$(`)ZlmU$+(MjYWux)-ZpI(C(!ZnnU16unphgc(oIr5cFe=8b_&0xh_Q63( zc=~cSg>)!f9#K;ULzQ# zhpl0JlO@FZTZRo-=}o@#`&36_6q<*`71PR%jpXfnUW0C_ESf)C8UXyw@@r}Ul?asi z=&#z6sbyCFcn~UGk6hmqoTCH5nd^)9R3g>JEv){8R;<6#%S1@ zpL7Z^WN!5C3pB?h6-3~rU+H>2;Mrqa<-1!}$&QhVIw7m?dfvB%u64b1oz_nYH*UV( zdtd+rE;18d+p4W2p6L$HO(&_8eTH!_cDp0f!9|AzBy)_#!slb2z7WhNrI zpQROo7pSfq%vU5iSxSeRy92IvCoi8OowSlLl!7+RP%~6$)be&;+%SM@iM45GWrGK< zRx!zvc$Db>9rc=r2pj%U3IM14H@XE9!TDeHkx_mA2r3E-eYSK;#lFl5jbfDwsj*{B z$HcpOynB~5sj=vN<}r`4>RDX-%JVtrdETw9I>~WjfQpS2a17zw ztS|Zeb(!>{`0bo}i`t0`b=c|Qo5?6ClVT4=jYPTxCL4pbGrc)oulyi3v)X>+TJQ4l zcU1O4$lc4UQTKJE^)VK?1ZC&)sldS*Dx+}NzfA&1TWmTs5Kbv^ z#2Hjs13%72{D9AC67}-1A%R+jvE%4(Xm-;I4Q+d_syCp4CGfY(=0Y`I!y-S6mM`!R zZi5D8zi+cGh7Zne)0AeVe*}rpO)`B-$jr<8<{YAwteW%Toh-B{2RXd#PAMjY zs`bh5nXC4u{qP%B9c|GaA91s~Epd+yIR5MjMZ$!mwmbr+mBUfS9_TuZG#s|yC}>vT zB}>#~+aeu!R{tDG>IyQ4`Nmzmg3qund|Sj{J$A&ygY}0OYg25J4e?^=VGX1`#}OO} z$G)1drInqPiM^7D&-5j(T1Tko>L)!t6j8m8=7|JIQWm7IK6E+u6-`M`z0026u5MtV z$Yf07mGpLXorq6aZU&g#UXcf<{0m!)1@GGoaRrXIC!GLXklW!UkG(+!B1%<8O^Gu;yy2El=rD@j@PqhK*ks!q z9v?ee3?OK#;9PjS?tjlo%@lEKK`)}+J8TP$745u$GBbG5m6Jc=?H%+nA8wVxTCuO1 zTNfMcnr&Tm*f+51*ss;ecpQtz{4;3FzJ>eA%XTZ`0n|Umb_)JIRgXK<$}(jJjPHM% zi|zI#Nhtch)ErrV#M+ncGX*p_+>ZwrhLk5Zmp=gt9+%THIe?(EJ}W_BLM7(J5iH+q z=Tv*V!yB;deD^MP1(U+_hw0$1TY`K25^`#nf@o2zx@rI{qMp|Ww8tJR)zwru#VPv= zjb{9dI>Q>FWlG1k+TgvnU8=yz39^Q`IQQq*i+6FQyyKSpE3p6dvrz&(kJ7}KgqPn& zZ##FH#asogP1gG+leo)`u35zHe%)5A!m&N$t9#x>g`Kjlw&W4)ijv)e z0$1F9LT-C2DjFyLC*E^dcEor-;Y!W({1d+4 zKI+$5-M`1CP~pgM&Fg&a6)7#^6BC}W9X_65*y!qN?P)qlwh~r0UU6ICW-XDCnip~J z+^@l>kB4}?EuC+?A*G;wBhOHFNr6=1O(pHk$*TQTH0p*2dZEOQwce$Z|KzF8j9&tx z$u3v9ev}PP(yz3t#^0g_$RXOPenjyaw@@R+WS0Dg%`71@S909<=d+DE`lVF3D#>5o zTH72PiYmhKXeH||CT;e31KKG;jFB%FbkV)cOh=V}IBDTRH8?ey$M*gytTw|Ar{ z6Me{+jhA5qQQWlyzgxk)Nmj2XthTL+N+TQ&OTD_e5R^G!_*S%*|2`kucnVNsh7E~w zDUsjHh&&hKC`*im1t=S|t1dGL#)NRfKS^4*M=;vq2GL+b&PF+1|B#e7MQ-~>TD%%XoKKC?Wd_K|_Y8~l1&#l)l z#n^7x?mAXcVpG~G|N69+xQ=rJ40Hc};Q~;Nuftrt>vGIr&3}JkwA4m5Cp<6nw8uLv z%TWd!FX9?!uF{&6BA*%N zl|P=bU?L@wrhdyNK*&G+U_y%hdIzxF0z_6~Q=oMXoc9*p)+E7xHclIt^#L)79r5ar zFUzS6T|t;De`ddto+5s={4H38*;e$vOGoWZSg;XeA$Je1>~1ZRhWEwsK~V^S7Xi2r ze7%O-L-}%*-3?#+8CDmGPnKzoH!QI^TPnHq#{1 zVb<d)|cZnGi_!BmVnIT&Mrd z*@K}h>9&x3x;GfY;ws-t#I6HJzsPwcjh(YOB)^r6JFT4tw-w2yea82z>>DO_huwJ@ z^|9>m3H6RfN6;5)BgMIY8)>C741^eMk>?DJ=!;$&th&sFWdN|Fk%z>1ZviQgc4rPT0UZ)uYz>8grQI zcO7KKHYp!pU5{*sf5^nS2$Q60@6yPG6cmI4+C@JUFD5w05|6@*bdjj|U_dj;QAuVS z=*d2aco_hQX2M#9cheV2v3;MuDDxMosGYs1*r06v=OrBeK=M|7f0!pf?Fov*$f&Q~ zw%B^b4PHzG-pI( z^7tfEX}jv`e?O`1sqj2A%-7ABhdc<^ed;H;)-2H$`!EQ%Vv(zq_i0}$ryiAoy)5y_ zONPb#9PEEqUe;on9S;`nYtO!%`KAvh-j)i)%X?m|eXc-5bnU5-K}t^f!@uc=h5faw zo|0tl`r9jkdjH&M2rr(x=8&wfU(-Saz4YelDk}_@I7JtqVW9{E_WQj2Ru(-qy?L8E zpasVe5*2U%O*=c32pF8tz zJXP8I$PP#P?SY?~4+-bT+)!6~y#Qcq$R-T-iVdvDmX)e4lD!HhL%`{lvZN7Uv(-)L! z8aIi{#MwlLs{_kfAn&uR3HJS&I55Q;f=2-!V*1w!=Z?~fq(l8ES)7$KnrQWYK}94Q zeg|o*@FEp8yXjNjuMd5`|0}loQn0>~Z*}+t2n5m>bTme)Dh)s(jSlbZy{%{EUJ(q3b_bEu|V zU*{L<54xFR>KsQYdo<>Q<~lFK%=va<804d|0fEFQ|KgQ8|0}y*2tA(!kJ=g?-;3qM z5i5jLRp4-kwPeWOUCJEEmL!{GW5X-p+N{=X(F>Gms5DqCxB*J?#DCsiD&x889I;ru z>?Kl)A}iFAzB84ji$jF^iAgf?Ln*jkzhTD+VqM@Hjw@4&x>3*NagW1~Sw*9)7fEdXmYU zWC8)?QH{khan6)xgVAx2WPaJjd)r}FikN(>UWmhm0f119Q(eIDJTYv0C|yE;ez~h? zDOi>-xoseLEz;eyS6l$yoz)v%UKA)`ab^_dW$ZpOF-DrKRYmTbS^tWYwi&)ku^!D2 zms`Ep4T$45aAearh&(z6hnjXI)W@LN8+J|#|5pQQiS3EcuvIxa;j2XGL&Lh#E9vpE z)(_9gDhbu#Pgz#?30JYjTmwu4iZ1Ok&PhIhQsAtpPrPuk+KJpSpx?`@jdc09?-xZ2 zb+icjN8~zIVeV8pT4uL6C6k_;0Wpj&>*t$&j)6D)fxBQ6!(P85Oe}L(LxZ=6u{3c2 zHInJc(^Kawt6OY>vmMirDsHy zfR9jko8it46V?bq<=xaM!uNg8J7{h7vc#R9E?X zpY*(Kn=fyX@)f9m!1SEoJay$7Za>%iRJ}PXxsKpH!r}2QOC?B+MeIR#Eq~rI8*x{) zv3mfl@VB&g1u#xY^_9ISZ|1g~ko8p<7zO+zTI{Q-VTaN{luvJ_0ww9ZDN%PEr-Sh+ zCh@$M0$XN%S^GW=M7`r08j%pl?>Bz6IH)0-5b_auP(YeIF}+}vK=d{wkzWv&gp0;a z^s}-P*0@;zH;gD$!FRsyoKXdA+jU5&oBH2WV~Y)Cv``*X^CsRr{6*=||9MFd3MuT{ zS}Nf(qBX~}2qF?Nn;vo*#NN!aL9CWU{q zmpJpB={=YaBn!w;7ytuDljLyDL)Pdfs+P1g98>fwqPiDY=oCeS(gLob9b`{pKN5zx z;&K0j;hJ|Zo+0cYuK2U+_gRfF1g^0i{w-QVMpPE*w^%otutH1;(&yh~J*=k0hFPeL z8C>S=`gcFlaZ4r7K2dJ;G?^H^?b{;R7z_$|v@e@Jvq>bG72G2>sw5Pgv+SL2tP_-7 zGQ)TmCbqQPv1k8aS$!H#znRp`Y(uxdUcySNQr{mNIs_~vNo0Y=3?-83{H}1@`A{w+ z@9GzZhBhZdRC!3Zt|ae9wFBOC5Wt5Wga(TrR1cKLDwix;at_}X zNuu{Uj+f^w*@JX&)W2dSmYJ$Y6%$wh3M*A@VaeHHfoBrZ*EVH}Z;VVPuB7VHDJ}PS z6Z$o+Q@o)JSc%MR+nJTNkb`+s2vwAu!8&a5N^BYU=Quc59(E+=IQ}L^gqGK$$_hRm z=O^ev&2pTC0A4&-L*k>yNd|r@t4X?g>Z~{DZ2pCsbd_fWWfUFIlQQMp4ZPEHxB6Dw z9d{@7n~>-r5zo7#y>MRy4C;RRq#M^sxuUmdHb=X5UiOA^g64^xxkzs#F~`kpb%Lo( z^yYWo)j!ME(KIJQ;oJS@$|_)vv}nYl@N@8AV8AP@`t1xz9PDHyxc0J*)yFs`u?`(L zTagTZhjN!lUkic?BeCUczca1e1Ez=P@6|i^_%{pS;a?^vC!r*b2dUSLmbdU%)A>Ru?K zJkvd+8n`@N_V{{E7m*(Rg3BJRy>@Y*=(#vOU8eM|D~9(_Z3ShERM+M$cnT7mLt?(Z zU-GtB^gi8qq3E~4LzfAUn_>n5t znkqoNZ-pw}oP3v9&Tb$n5$U1v(%~Zef;b>bs$8|@1amu|3ahEsv3E#lqf@JifA>2c z5`z4^Z7T>EBzl;}@&nm_N+2}-`n#LTca1OfU-N^@4}}-Ql)>skLz5K-|0~eMDe&;x zqh>_AIz)70I$&PtGUSdrQq zr+Anox-nvJa6t{;D=1-Thcag0m!8HoDj@kL6z^Ro4w**22tDg+6z9=xrmz#pQYqZt zTcrQ>jOvtM;t-M(D`$`0(%)iXC^WUZ!Q%@a_e z!$tF}ZvTl;<$iQ!G7OD`C{7NINkeVS3oiRN*a$qxmbKV~@IhLALZQOsYGCT7y4SH> zxVuYn$t-MsJn5%#Z%LhUUu}rVE}M{N*Q~4CAQTHo4`s#p7ugdDYI%wI-OXz`h&-Mm z*!8*`)WIS;wPm8_Zh;awl=_BuT$_T&o@-xD~^xxdv+(Wf3%=SoUJKt5z zmDrXJZ?a#w0$z6=CnI{d8!NVKQ@qM)c$8)}q|GZwe@9XVPZLp};T5$j1G}iH8Co^@I0IPB*dmBHRbKYaw z!TlSujNuaxSEco|uXI?I%&t3YDVSiWvju|AC*j$U*bgLYIy>O&&X}I!O&lP>hizjY zDleddMz~hkH2Ft3IE+YqU0ckl_UMws2`F)n1IC=jmsvu zhCYu@g&Qd@_~|q$zM-%94YWSR&V)ZaQoMf2;~?YmQO$Fh7iq99_8`_q~v(h`Z)vb87`j!4Va zt4EeKd@_2w)b_$P$a0qOmCUJfV8+VtD~|KBl0wupEGhL9_OUo;k?Tf3S~|k$?#501DBvcf8PxZ?JLxHVK2@qPtF#u_<&(Xs?1_8T(LYSPKULAfjWvEzT*m zQHSktxBz4Ze50(I)=;iRFK+8boN9l%!&rjpHO$gzs>4e`5oRU-6pfV=UQ`G1tJuM# zxBymX5fx9*`=~DhVn}nc{%JXqWnfpPj^+(slYE+cAeMv_Tk#;+pHiY`1pkxB%=R%gd3EteGgH#SC&^V>SPI zoHV`FAV;9Jq2ZJVuAt7t$|wn#Oe!y-3j4NDEdiK-X)V$H%#g zJEdWACAbDAfGu6uqb{ex5z6O_`}Dm6ZAjdL)x`_@skwKtN#`(0Qpb(U=)B4N16($K z!H*x-v7D<)vdJzyVTWcPPX?ip-u3`E2*C4ZuHtwXIES;h_}0xYE)zjNuj zEU>Z}w4S9{y>7pnchRzxnr#@mLoMo=Lkg4W=_z|s-Zq=3b7v_!`)o<4p(;-TWAj7% zfx5Uym*j8j&?a%~8rN96-tN;EI;A;24?WD-k*N4JkmEu{gER!kJ_r#K7-gdl!oh%b zCJma^9aa2-0#<>6IqU*>wY;+hndnd_Ciy0vHQu+^sog+bt55ncZV zfu3dQ<>;2q1Li-S@^h!PVdQ*x>kf^L6bW5QDA#XE2?M&$=6;It(A@O}B!Z(m0zYGa z%n9Z6?GwO`I*=9$C)Zb_HjbCNQt6$+Fw2?tr!kHHgBR_Eds*x&wJLO03m2i0!7AZ; zE_+R4p8b^a+dPWAYPIj}cVDNaH!(R`N&N1!jM3=9&3#k;Yudy_5?W+0Le#G#WRSms zj$v!x>uO(1;LAv0BXo@p&;dy8I_^klGoQQIcAtN~Y)P*k+?1+0kyur}wrR<7utPR4 zlX*}3*En=J>5$TPI=#k60)_-R$I+)kc=HCd&Y-mlTCHkurs9USclkbABmp`JJE&5akPCDlH8D$`8!*KF&SR3ub(bg4b&ax$l17I%@!8;b2kbb z_!0tK-{1U4254U8Tst?+jVfSw^g#!S4l3UbAIEl)FduDNgWAN}Ul zM$m$ASZY}+?~%x|V#66;%a+J#=_+qcUgL9r_te`|hp)3J`!@5TX7P(9Ctj|Uy@Y$X z`?Du!uxz^cY2S<3`|HJ~7J~dMs!@txlHY0%JP;pcbPqy3!;JKPsgU>UaxZL!T0f%P zx$07Sd)J(%*aJq>qQV;u`OGi!86ggN`IIV__R;>zd z>WIpP_`_D+BdS@^l9K*URwVRgJ61P2*HX{sIjQ<3eKLYVhRuqA8EU!4yHI?dNEPgB zgIBHfYbiC2mHU8MkI3%CKl=n6m+V!e-`yy8w^0bF#FG9u4!=x?pY(OPJw5i;8)mA@ z@#OU6dNQ325FwB}IP_#6hZ^};R6u?B^4z?NZ!r?{#bmkc_f4BU;iZBrM$q@z zVXe5P%i2Gq3dMh*E&cs=-v6NE#Iihn1;gMWZ}=g?Dis1J+toJ)9XWPZ?GKyIP@Ak!MV zEkXU`ey&Hs-2t36zLSQ=QnH2sf-NzW-n_mkr?(p^e~x$_vnmJ}L%uwo53i|lNM?0L z+QN(vG-I*pA$Bu&w$i{?EcJxxldJ53@-YxKTI2cDmitDud59h&b)WC*0`_UNhn+F* za-eL#Y2edi3gD-k)^<7M$zZYVi(zQRIDR}=7l(9ejw?Qn`z&a&M1y68F+acuxv@33 z!N%HpIXy$G{h`1G(HP^RC);6@E{D^PBg7L-+!46n?3S3@qDy6-Z5wbBGn_tnwcojN zd{KCkTwS;LUyUoJFW6SA&>%42R^Ce?4_GYNl^?;ZZ=*tjvA z60=A>>xBx9N#dDFVyab`cnOo7B45O$)kc!>^G{Dl2J@5Wz2l&%%#Ib9ue)|?RJ(a1 zhSy#b8sh{=Qtlt4$EayJx173@Ac|5r_8C{ZG$6z@l?vPzrBaoKR~bm27HumQecqSd zRVEh2pbjAiJ`Vl7sp|q9D;}+}<=hT%TB#*Wyh-Z@tlNMU*%>biEoXrUB4F0r9#@4P zBnw*nz;*`o|7{8LNYmO0+8|ElWG?zNgYa#~ylNNWA||6hf(=Gg(8o_n_j?Wl5yXg1 zE4g)q*fZI)@Hm!xvKjy^F@^JOmF1xG=$0ofL!BxBbDMo9d@Pnx02N1~Hiudot@cE6 ze9JZ@wPdJ}Nq6~#Z4f>z9oLqkHm3%I=Rd4*wQl6`(@!^$9!m@G89(VMgo&x4JBmZ) z!HDPc+lL@{LBd}!Mb{)GX;B;uu;|` z8WIQ07ITtY#z`f)rn?zSmgv|5qL|{^}v+%YiSLqqpjPho*s|D z_c~h#Gp~338*9J2|6BOrXMnMe=e0u}-|X;0{vx`5tQ&ndByykrCH;`{l$nk7^h!Ug zMK&X6P2dF_m>@hK48B8XW~%f>&DumYPIa@`C!lDplgXH0tL5s@t?6mah^66~aQ3NS zdJ@yC)TY&JC2C<}Mgj|1jrE2YAXw^k$^|&9iQkSzAzaRVKw41fF!nr%(H!n|!IodC z>Lf3ERF#6_qlnI{9vDVg4({DB{k__vPPy`+ z7*Dn=mZ&CAgWe(X#(!|VFvKwyt0F}FFdX|P@)>J-+H}%;?G0fs)L^&wP7m*)#G-Mz zaDQV?kI{zjjWnUGm(el5k}{f0UA>R!u6B}C@27eATRF;sR{+aPYy#qWo22SDZ8cPq zD)?BGavS3U8{CCjuA^>n@1HMMjJs-u$Tb^l(RZ${t;^WCNh1F73#;chDq&BxGW0NN zq60t4n7)i}&jkUeKxoFu`c)~yF+NhvWi6W0o`qu7#_Oj$Ki^Ec&b!Z2n94sfX+{eU zjH~`q*^@fFW>UO*_Cireg};q8lS$SbO>8G}(gxX5iehbdtqR;qdyRi#j#OFu0KV~p zIHMfvGc&T0!1&RqD$xklKNFNc7%$A~z)vz^Kc}YvHc0_ z;__6~ps^?g*meh~bcVYC1R@y-|5FRc)3(Jt-%tiCr>Ky|nsR8RRVaanh zBhFuSCzR9vOhK}U@PeNYbDqwvj@!4fyr|(hcuCn04R$X7avR}@Rs{}*S%*Cf@6b4= zopvDF|1mEr2tS!WaH?_Ic&YAUhcAR@tB48<0i&m-1R?WKs*orT94Ou$1&G#d?4Ai; zbRBE)Em_@*R&755fmqQn5XlgpGbnz2g zfl~j2&Pbj{*<_uIp^--2%D-jH{N*x9puJu7s^i;~qv0$}ZEfu`)%&G%Iqua?xWnyG zOvWUM%-yj-%W6g&{nk0V*?rMepmExeFY!J=536o$)z>H>rqWF-%lBY{@ij+?HyE>T za@k*BEZuvl>{o!@H{ef*eE*74n&I$i?k8)*){tr5IX!;LtlH=_@(| z%8K0J>&h|glo41nSbhptAvnarTgFvd-spA7vU|NBOYM&W%sFY@0yZ_x+3Z&B?KkVm zUoHPz%ZZT}-(ZHfS*4NE_D-li_o(jwr9Vz@R|IrQQmcR;BOPPCiq==ThSi$6?yq)+ zX1}>fmh+4zhL0n%Z;nxdCj~;k$>j;P=uVKBDN$rw6~t;?Km9vR8Q~KZHEod@^N{R_ z_@IjB!7P4|=0xP(iR1wnw+LGb#>_k}_#F0}qqS(=cj7h1jd$`{qS;>0SCOBQ3000| ze)m~EeSplnsaBsDs(JW%;Z8Sc{R};u)QBD;ZMM}F5ZCMY)t+Xek~~r<_sGVjuw@|Q zh9LFNu}$bS@HU&0PjpZR+YoY&@$sJJ+M18Q9?3jUV!=WvpD-H4^x6EBXg#AUF!l4` znIK7^8TD7XB&mWJ(zZ=^ECcvdIJ03Yn3CQjLz8s}6mr^v<2J1>0oh-LbwiBj=v=oZcLukwXYxJ>UTv4y zbg9TJIm%}8M9`1Rw(#`AzzM)yE$}3Q3~{rd5|hXthO{0}#Sw@e$Z5Ww9;qXBjsjdO z4V`~#R!|O1sd`&p+%MJP z_VfM)XN5U;2J!rZTVEgbmN3qWKK=FvzQ0Iw@c+$!yJdXdrRsBX1Cu_arr7xUlF8)| z8uQ|m>{a2Km(iThwL)_a+x-VzBisWIFOnn9Yml(cSN*}G3o9fv=b^U34$EfhYpg0Z ztUtSkt7p&IA3_7rjdmSIk?+DDPLR8v4E|44V^D*gp&F{BIhYY7-~QEn>4N0rc(SVS z;hV6)>nS!$TI67T|6`9V&;i6~y&hOx5m$H8SSLdyc)muK_t~{m4h9Kt;`u=EpG^R3 z1Mum#XvE`SGP-5QeD(amd4`}~622GSNeRUh<&^bv-H?Zb6aGEHK6_86KS)u9{YZQB zepIj}I<(FuP^(}kWy8WdaePweeh57c8pJzR@-7>YK8UZXND`SUCbG&2C`q24RWxwTuyJUddD4# z7O&1mFv<3*GKZaNn9BXpX<&_b+ajjK+b;w*2k$_SwU(^T#Mb2^y3uwg`szGC`UOBb!u5zS zqf3R|%D%qB_b2bKtgChB!kpXA_ge0}r0%{gPvdv28512ME+}@dmV)V_L zU0q!l_amMjcNtX(G7N-EnkvLPt7q^eZ_1$Qp*^Aj3Cqgw$7N6f_&swi>*pJo3qLHc z)=9-P7uMBt=3y&guhQ2G8iP(L<|Bi9FT9XYVoyY&5nfls=p>Rm-x3I)Hp}D9;o+oa z6QKl6mVUGqDeHD)|0x=HH250)e~lI%Eeu8be2daLyluY^JzkoO2SBCgxw{V#GXrtGLl`$$j(s?=iTN7e~zGNdkcI^WxT9 z=?lO<0E9Gj-|>lQ^Pkl!F5cG)DUwZ+qh45{IqDc6C%?6k+p5Ymuej+#yyk-fIAa(a z21Xz5r+wm~TkgMOZuofHjD?e;?fHsSm=K2NxhsL1zbE|D8bLxFdcTZ0s4L@>EE(3n zW#gKgFbx!ZR5nqfPpQM{aVL9ra-F%hd{UvuW|IrqIB5d&53$z5w>CM|)FqzCj`{B^ zX3(0bn=T3k1rvg-dp8kMvvBtjO!duz_>J2ps%%}oX#ki+w1bUlkaGPkv+KHI*20a7`-*|@tyVE7!EZVx>QAz!%MZkCo(&9`GEzr z9^-Sa4`gl0mpXKxr!ft;a@}uOwQ4TRTt&P^?S1f}c!s97nM1+8E(g8G9ZEum{wn!~ zFmuS&IQvdOBd3BSbfM34v#MhA8}(MFV}NA;moYqF1=uSjEUKjxMyloU>u7dZ0d{tF zyr|nC*@A=FTE4V7f8gm{Arm+fOJz)_l@>SXCHmd88>qkx=?q>#08-qTqp2(Ri4(j!h z`~Z`l9XO)b;>f`ULQ$ggW$Fy(r!yAsWyGyNq-j-7rD&WFwpe?r;E{RZs^BvqxZnzFEM;g?M37a_T&hbhf^73UmOfHsN24I{NL6) zRXn^I+p`@P!oDHC5X)g{a*zUm>Uu#nHQ4HJBNN$I^d1UuO4^A`fd={0hidfu94n?P z!Wel^eb9K4Jf?RzA+-&u_X*J$Qb{+myGzq|)Z}<}!fU>SZ+~@I54vOKTDdF9v}QRC z5>ojrW$gJ2pO2Sf?nDQMe3d?{_3dG7Sag*{b70MvDDPq2;(8^}QJZF$KkT`c9T?)M zDM}9!1^r!RW7zXA|6~+9_`co--5Nzdqsab!n=74jy%8C5I=bddS74mY)Lei_@d=sg zjB7cchoMrBV@7@wkuu2VB%~98cNjMF**@a?c;+GuT7f&f+ln=L|2CE6oSlRg8jyFP z*II#9ExjobFu;x2okcRy7UX%iN$dNoA&T&Jfrt-vmZQkD;-z_+ex~CoL_IG+? z|0yp;FbJ|4IRRk|SrBeBC297DiRlrE4%x-EFOq`|Kj|O!pa+$1N|qH_ae;)P+b4Rz zi19x&K41UltU<2l73H=SdtO$K)EpP0kR3tA|B+XldAJ3y{k60-C*vl==xwO?3Drl; zB`X(!GVBc7>kfJe*5rm7;pXS^Xdr+65luiA%q#N$#s+-t{+M*%%~x!K?a!#E%)TwG zj4}6bet0s&=-&0hkPWGr262Z^L8g^2UQE3<`)gS^W3-p+mzycaS)_=(nDyHi8` zcHjs$-kh;4uzkY+#{LFZKoPbrI&-&K>gnvi_k}7CzWHP7bxPd5eH{D`cAA*;)Q}f= zFn%<~3I~dB)byo&xhT9iFAB+GbIlq~(|$FtjMdS#a;&P~0SQO3WMMu8bD+Ge%wA8! z50#=!28SghhEUO>ro;D{ph(5;!}_9YvhT%ip{ZO}6l15zCDvt-!<;Q~`Y|0FyO8S!DEKgT%( z+M`OOdXr=+lNE;xZ{(65ve*ZxyZ3j&3=t3g?z~EBQNcU6PZYmR$h|u1a-zmD=#7Kc zWEFGx3d+_8vo1~Y4?o1B6)Si1&S>aiX}fVIizz}tQyw2}radO8CO`h^V(Q8}cZ&*% zUM63Nx4!>6aH=JcX~#EO!iNzQ3Us=@0e5~u5}XWESrfcFPy;nL1&y2f{e|C4ElB-$ zJ!P~a_A>Ym+dKx7s!`Ci3VUcHbg6rDp(wihVYI2E!}|SY>b=hY?oR7|xh#L>!QW~G_y|D3I?CPRHLKl(Z8!8A=qL>JEzeZin$I|&*%D^ zcNaDt#Em@};7@|z^M_^4P5oyD`@=^FVg&vaH@wbCOql57cJ=zWu_ps8ZKoDxou?ZK zgSOl-Nq-GSHL2F=wW<%2IHMj^eXvYAu}!X9mfu>T--0Q(C29~0{?EH+PDf3<;+bub zJsuUp`R!}06=#(}moUgm00OH`8tG>DN~jE1ecT+Ss+WU@Cn3Q*wHce$5e z%?V*KdQWSd9#mn=`{oa<89k)2A>9X-7m3S!o~eRZ>5y{ndhzVibSMeG@!4wyl7$wp z2gi8j()}Rwbzik*cH1ma1{*Qel{ipb(1LrzZ&i_0AUGrvcgZzJ=t=9P9M7##Q->lf zDWg)?#c$#T;qOihW3JpI;Ly7~?$WMwMc%D1Y(FOHmX0;|N>Lqu_Z(gtr99bo?@3x~Kj8mz@jS^t|8CO7* zBfc&=^EmxI5nPiB8~wRO+B4?fa|(m!)4BK0Lqq!f6^EW(K>Kf>GZwIr#71SuBl;YZ zfpkNat3ip`(L)T;6vZQca6l8pDzUEoJkK2lDDrku{9SzR7>au|(({BU(1U+KlMf3z z^gM&6HeV(<&t|89&fb;yg~fi#gP=x;d_lyaJAN)lu1tySxzLdc3ye0wq58@ujGUK1 z%(ws#TL(qLE6Pcq>p}c0!M|dQgTEBm43%4?Ne9g0<;a>j9$n_L!{f%-y>FJ++T4!w zT1etGY&z!u8qRbvv$PJ=hu6MvY}e$)Om>zHv!NR0{-5WuCMD<=e9$FY)$o@2McPjM z>jNxOX^BftPGL3uw4<33^G)``6UGu*bDkDX&m&>EL*m_C>sOT_*UtX<_uU6&%@8FvEac+eW2)^B^yV4Q z&`$@2NDn6>T$f9NQEWjoULw*pVM#2CZW^dQK=#TsBo+<*M-m^_*bd@7-KD>sDzULC z(aLB`H;>VvE_zOVW{G*52@MeWYSyH>x)fm;P1pZ0=14@E1M+2tvyTTEqAI`XwkQRp^Hym+*q08B!(#_{w*4)y zk`yjMkiq71bBmXKE9T+@6eM$qP5x57q##|NKR@B~vMJ=qdt*a$Q7!wfDhZzk_#ycb zKamJ^veQQ1lxw5Lw77&~M3itc#zrd`(Ic|{>z=wcof!YYCnHUm!v3Uc@ysnh=Fx}t z5%S^=qmIH5tMyod$Vu7KPeBei=uB(!qdP~ML@Jo|sOXZn{zUAs+MNb2*y2Qsbf{M3 z55+EGXLj~*76?f*KH()7`VXSqHk*SU&C{l-uAk@Z#~lT+L0dNmLF(D*!zflZl{>d2 zkTGN?thyhQDO);+;=XOIofcKLwv)`#L5bqsgdJu0DD(8m<1likb>(-w;DA(G%*~YD)26!rB#8gM9J+!+ zBc3g=L%Kgbhi@1TF6f-`XrqG3m1#J&c$RgacmRf+?m2pf@|X4v_wpCA4Q{`jOxqFK z;QGAF*J54XclpJXrt!)1jT3J}A)Qp@V~gf3a=)p{-D023A-)#Xj$m`nC$AC{S9OHv z>*dy_y3=j_njC#O(IgIWRuSwwXTZ#vsSysZ2_j(}-93RIr<~_KH1PnJ4qC!x+vR%W zpp8d8JWnpFzS?9Ne8YB?*O43M4(906NR=Sjg$@^x;b}xL0M!~5!0>03;%JPuxR7&;_HLw^nlgV5M{eK%KXjnWlu8sP!ixa2o4;h)e) zL%{JCc~Ffpk((S&WwibfW#CCPxX@*%_W-zI5APN-7>ABAIu6sJ?52g4TkxycaFX?b zwm^pN8&X4RiF4}GaOiD}7P~ZA(JSlTpbf5hd5#)vCkN~Rga!%q=%352lU<^^Y$BFR zdl=C>TfKD_-E0D-sLO#D=vUHk#H!|(<%kED%K+mpVd49`MI+(Rv_nU;)M$XXtmgO$ z9c_|OaX>VUvNzW|e0_80)3`t3{MO%LAq^q2Af>v~p&KITD!Q$u@3R7z-~F=Xy?lQe zo$6mOtY$Wk=3!HR*)|w?28$$U=8@TEgzEj!RfOuVT~GWV;nS7C1@D9b$R$c7Ga5!n z%7C)-1G)F3%i7_=l2@T$@gcw;ohcd2wY*C zKZ$wZ4_iLuls!@3KEMwlLGiBTu_z9cq9BA>wetYQ)CKg7Im_P5-*g;wzc32Y{O3Kj zE64g=n^}L5ay_{-&3kuAV_@3EyJK_J7vn4z@tHb5_LDT?FzkeXb{r7ExN2)aSmVFS zfGTrKxs>l{07;FOU`IPHu=X*GpIZEY+=zzU;<+@1k8B^Jm2FwrwqZO;CC(YXi!zKK zd8+RZI<%-Hmb;&(wa{)(P{V~)18~nFdav@0{+xQi@(g7fev5~iYOwF+w<7@D`(<&ATM4HGlPProPcUU7k+ae&CI&55 zi>vD$$`&KgH0pK1$%85x7vvxD^FV;)=-LLjx&f;2jh2Mr(X=%46PG5*j&m;WpXh1z zc}^+l>agG3FvO~9XurCy@Q+>C>l~n~!0pLof%=7EOaqj}90? z+XBu%dLK>yPtO3tqgbsG&MLsk0SS&`bp)O0KBG9yed||M9bfN!(}Bd(c%oP4B=M3Dkg0J1*wIK}R zp3f9Jtjf~P4`66rYR*tp{p0(-}(-9~tT$_!E zS>neg2Qs;8+;@npLxrUpELN7uYP;T<=c#w0u5_OQOh1VMPYtM)@cjuM_&P(Liip%M zy!%G4q!cW?`B@WzKPPrzZ}{!BWs^sJ-S8Vyco@?}TSCu%I!3sy8+^kWj_mC8j$-nD z+K9GXS@Ie7kK1i~&^jVCTu{1C?ZJK8xSfz!hCQr>$CyGwRiZs@z9&=Krs+Go`n*Q$N0f%cCr7kR!F$+$6X-MfFh{J(XJ z8d(3&Mxi2t%#;)v#Z^?6uh7L9@45~1EU>JbJQe>T4{qm@W4#71FqsCi?&y4rPn5{X z->h#nKf_6PlJo0y8F^FwlFQf8=NOI)cVkPK*p?v8R#DYf7UThKpGdi4|86p%D@Cy? zoPj7RzUU+Kl5@*EA-)v@pucx>vJnvSo>f$ZA6?%WIN#rXE<`~Zo951#5JjLZ0fiJ) z2w0L@|5|L6gH}hcV7Epcjbudmg<&1xQJ>}zN-!`-9Sj`cB;p23M9l&UPNHs{?rv(q zd$F?Kq6d}f!)Jr6{;MLOe6o2ReEr0aeh@Tw%8oH52m)q|`tUzh2`#9-`;(?xBM3|p z$UtZ>RWydp5VQM<6<;Ex0->K?)Vz)4a)zk>LdHQ-IeU1Kb+(1ikJZ@B{8j| zC3&w+7ZgjJG$D&(WS7(4*lyo-kvMO3bzADeeH`zI}puZ)d)%v+H*31B(ST6Sb^K} zON|o^)Hnv4#`L~fGDdCb_?SErskTAtkCgMHqa*tR66K^gnLj({85qRYxjIoGQB zCvPHOSfQEikH_Z6i>GZJ#5Hy9TIB86Hs{R?&%w*`Dcb2Xb%N%yU3A^rtvjUU50tK{ z_2vJm;{GRjY=dBPq4Q94da27fcFbY|YIy6Vu@(@8W4_PxLh6YAMrVzdC0P@w+9OR3 z1y;o@(|PxHj!4n8OCwVyf;a1bXIgVi69_(X_-GjL#3xnKPps^zE@fXLovVR|qB<>3 z;hYgqZX1KlSm8Uq*d#^&nSY}I%>h6CXv^;6{Jw8V5T+IhHzM4sEY#8zBG#g#{krE7 ztY|b!lw#eH9un^1Xm*EtrYtEy$KxQL;x{k#%5z$jArQOAS49}Ye-%7uaqG`Ic&|Ou zB$30N)LCsa(1#UV?BHM5aRDAHb|*m2-%%~mx3@O8XmJqt_|#Z(SmVCQkej42Z-!vi zGD4hr{^114%i+S(NxD*&V!TQ%hsta-L)%}N_bItNi?dLrrTnQ3f8bzZdtEaImUI+Bzq+UyqG;S5Hh4(;E@7b z>i65`HaN2|jBTNwLU2=(?*xdYmg7K5>$^IBfvI1?H_o>dS~e2i8MiCEEEPk8Xkj`v z?(1Ys(QKFRL@MUc<#q$c?V@*}T&rjoAC236?}?PFsLBJD0LG&vmJVr><|A08@w=Po z{TiA>?XScB-pzLG0I>d3BL=E;|K$p~VRMGP5%sy*03hy%oyfc=mv6UkzLDT+DhsjTL|u3&F)ZCAu5?Z=*p z>TJ$%*W;0GTvE1`+T+})Q+swQSHiu+SHs22isFe&8rxgQI$-9l(cUWwH=X~vi&`Gg zdMFP%Y)nnjQ3_$-*b#~9o$yXGubPvpVX7@UTra1N!jX>Gu5zyMgq3FQYhZ{1V@L-} z6vU>GoMRR|u$!T8{tB2h6kTpUZXPsXI|} zqa61tM7PDhSzt6tQKzdRK3s`}s9J&~jgKP}0yDo)b;H|C5&4br15;{YfQv3%e2Kh~jP1X|5u{S_2I7Y>VU z1O-gkFE_c??>j~;S_bYCh>ewhF-*!?z4fy5$Q4~Vc)B5XjB`9Y{-5=|{7C`(;L5@HQbkDedx_TenRE!x`Yqr9v&BB99?{uz5~e~ zaK%K&N-vqtZyQqxIq{%)t^yRDZMvjC601GWQZpK63seXZDzueI%8gn`u^%S6apVh^ z6fXLsQ#HI<4)r^jm{rLsyl;{+pip>EJ_Yr>0ch~bW(~qr+o4O@SVDA5y&c|@3>f?| z?2IiG?$#m6DCfs9E4W#S5)N89ckuY?cJ=-(2A`$K9n?i)atxtJ4VBoB0h0DXi!`W3 zl!f7=5I`ytpH_`yGOVQgX|haFhGj;;5r@nv{E|?*b@n8XnB|1^lh5C>Q`M8|X>B@Y zZzwC+@GvPzcYjsgd9@?(bsDqIEI|focc7F>vO)RCzZgqwSdZZ0StGEhJAfcDl$h-a zHSUa|)N7H);SE!Aa7v`1JSkP(=Fl!?(jY&@PMjnia@ydvwyCyph1)ng@Uv7s*~uMo zp@HayTXRcFRL#`dun z&rnS97OHMF9(%;I`PY-3&+kQzGB(QF66-v7t*;(aN>03Rz7aK^aliL+w`_x?&H2~Y zd<692d5KT#0g^?%)nA+6LNnlZR!%Pnk zf0uH&rS8*0{7V0Rc&x`F2ihm#`8x4=KZs>Z-yxY@nx9U2m-tGHV|r82_4JHB&ct8K z?+`OoSfb3<4s$>t1pl$+sQ zRTyKN)O~KG{9hL(`E>C#{Y-DM*BA%!(J6;+v`{c^qv_dRMehw6tDN!_h^9b+i|{NX zgIVs^74?;InA@BcQUwmsN2@n*d@ScIzzu)x<|E=) z54qiI#3eX-&{frcFO>r+!(w~CSsEh+OvlG4>u7CB4QZ(;A@XtZvE1lB;Ha*c&;q7- zE{uNjIIGs1ZKdt@`ThB*lOal5Spxabu;W0}nFNgoDGEOefH;G~Z=t$GSKgBuomM&2 zU*;~LW|AR%IMB(@dLT(m-`znvL<99m9hWBcfUao>DagO@9t6ZM#%a`b(I<8gzc$O+ z7YKpIyzGcNry$@>Lu&%WV#xa^ z7Yw`7iYEHcFRwb~tlWlu=h zj*z%m(@e?YWSN?>`+BIn!W4p0ysGn`<3hIic~R$ZZCB@FoBGu*Gobf4svH}%+ToP; zLQ^kK0XRNWUcAmjkk}E`VY(yQ>ikf@Im^ay7UzbR;8|g44A8RgL)1SlP~Z+UemP5j z@r0b|agq>3#4PvHGv6+^45cvo^2(vr^m`raWs)lOPP$_e0fRq_IfTp&Lvg35pO8(u zdYDcIf|Rs+7=C)`dJ)_G6=-8)LzYOKnlwZ^d&R)Wz@r753rEVooe~9teK`B}xPCRl zt=2rUJGlI~F7U5&Gh?<{vMS+9!S~ig!gYoDvVISE;W|o&3bVFZ9pNLLm%+cTS|vnE z;;58amn(3f9rSc{Y~Hz+z02y>sQo_se^MEJFq3$Y*Dwd3Ly#Piw=pa$eru|K){Kkl zITj8}U!fj}MH<|^{F@i+_%FF@$0ysit`{bcsr3X!Y2{c`s541K+4pYInSmHc5&8gc zx|$~ZZL@?f*Z4fuX%&z1skUQQRauE<29W=0TxE76FJWR|YJqte%N^-+ruQT)e%AxzgRSk@kC>2O zqJIOy-GD@v#YRPQt&W77&Lqa$3~k=sK`jPNQ^vDd-JHKOJl446{Ow<05d=@0lgF8Y z*PJQ_$^7L;6Y;ZJHIw@2qbV{)n^qK*VI8Sugthf3ZM}Jvtk9x5@!#S82jagg;-?wv zoLC|vpHzB1(m%jD_yd)da#y{DRkV&!dyv#`WmfiJjHf)WU+;xW;XKqE%LfYqSI&UdH47TX9v+-2scDF9Zj{RjPP9TTf!G-*$c9QBa|C=w^#Xm zoVx<4f{}uA|C3$#$#8=~_U-xQ}ZA~0}@_+o&`j0Mx{ zZ{BfXSN(6K{$%3=Z*yeZ$p5LZkj25$Z6QTENpr*~@ak7dcXzS#y1W)^4oeFrk60B^ zYfA*QJ$Y9v)ZXm2htF?BrnK0S}HHBiWe)@NPtf z@<;BTvHKDo(Ay{GF^XO+ZQamWH+tU$WIZrk7YFQ@RB2|52OiPPh6{Zy@q5F}cq28a zN9tKxdm!h1P!xETqNxx9+ipRoweZXd3xEQV#QUY&s}jZ@TE;zP)bVd=yEUPTR2dMNbNx);%JyWkf-3qS)H% zqwr&1@Po{|ygv020mS?Sxox^#)DQBBJBg+3gsSD38{@*fe9_7K6g&wgli)J7%ZgqV zW@_2M8#>tHKO~L0m6a8eqVMx{{N&`cR;6}und(j=>0fzH7Me1)EcsP~uLmZ2*y92O zSg?A?S9@bbQjL_7HQ%+yZihoM_1wF10uKy$G0*GkY=$j&i^=nVi}T$XKlleb1!tpZ{t;tX zINd8%k=&n@x^?y|Ib6sSme%L)?=)TVX+(wzHhM-SURd^1G`NBoiqaCImOD*ln5yc% zp*jpqs1+K*KFmxTxNTdk7KGr5eRW6>D7jc;_n*@oJI(m7M8`m|{hKh}uu3re<=h;+ z%snKK4eme9jA=1um81&h=AwF#=&)_E(IP#IO_uM4kgMaIt59wfUNJAV$$ueBJM#-v0Kr)2I*lK{==3U*%&j*WrxiPg|Z|H_C*3-J1 zz}|1(F1U>;8Ts_>0yMkAK9ha!5z%o+LkIeC)LLlNH60=JtTlWZ6<4`(sg?6>X6~?Z z`M19kj2*Bfz87&f9XRq=lis$yy?x16)y6&V7=hYjOWIGdTUVgR5Uo}Ym{+EVY|DX^ z53H&sOK99b8Af-b%%Knz8Rs{*I>>$Zh%6cQNwtvlXO@VbVa4AV@8$5$xhL%`R;2}p zqF^Ql#hNoZERsR`J8$L&G=jvd{-zIg~^mgS=C}p-K5ZP zn%8nr(o4uA%_bKBT?BV<;8x5=G$-)Pu2^(QRxUjTE@(3-WkGSLPVqhhyF-t7Dmz~{ z#rP+uR`#hBDr%kwn%Zz~b0Y|~SbW~LXhgcpxPhYrbcZDwbdR|@%GD4H-|Er-#y$TX zVpt2f)li3ONW@#P@T|+J!3&Jcp%YbPXsFrEQB)I2b+0Xmh6wS!M>_%YZ4eRfZoK0S z8A#47>2}U-wF|u1`C1y3r@iKL)N6j$Ra= zYt_}R--#^{w#omYy~-Iw|3v*yJwlOtq9NXR)DG=Zoay&icGNdGXtcq1|4CS-69VI} zI8JeBF|wv1D(8*t%RDujGAK`zzi1|dU?q*kX|>2~4HDN7d@_Fm__ePCZ#&ovk- z=#d&PS;5H?GO|+KbN*L4>rPzyjZPkreQVtR2kJx4P(w2)L{LQYz z_)7d&7W~`^U(CSbneU>-wNdY$5QwC@orFxAIH?W)TK5b5wa#`Nr!+C@C9hXK9%YOl zz2A)>N=FIU6;`mDwvNlsjh5gnPcR}XGHXG&g>gJ_Yg)n8=sM^Vt+C$~7eeVRL9D@=h#53d$wRLSg* z{wKb}#Ke?k^YVOCyOf%J8wi6L&!a=k9a^s~J)v>H+GRv!|4sYXSXY|cPpbhq_QD~g zo(}+3^aySaDUo!ZR1x)pOHxi+)e^gK-lxV0x@wzNEe6Sn6?h%-xelCe!NPmI;M^8^ zc*@jOVQ;?r;pVo)J@qDcG=6jwCL;efLRX=20UPN>SqB@;C8yK_v*NtmN+;b2Iq=s`_`|*8;(o<5bXZNTx+IoY|#GHSB**=c#zn zskY+V3Af03_x!;vRI-@PPd03rZ6+7q5TsFCO`V{nv;a(4YNMsElR%hx5(DRg9hBQ| zFt||XRCF|0*H~bBV6AC}c*FqpUQ>D_WGbF~8h*Ol?u4+7gz!QtS$ClD;{9)IUqufp zHxbjH9q!4&)KBJztY7VH@f?G7K}S)t#9iaXvzzeaio-MJP7_YqqJ`IIqhz~Kl{#J6 zP*u~k#R6Zbdwyr2SyMuJzTg>fos<=L=AKO*Q)-=b99<%}|GQpSwLoh?%yB{}Qgu|6 zez=RpQ${L5w^Ib5@BHU<90Sd- zWd+FuTNA=bc5J2J=ij%=KOEAZe1dq|9_eLJFj9Q7hQ2Qr1nPYaT#*Mv^LK+7YN2=M}^e&f82C>~k zYC$Q<-6prHfMgZI@#=T4`7TJ+GXC8c6ISE$Z)lSbR-7Fm)oj;>m z4`+op!X}|TwBAdar0H`aB!7HAh(6c;v*6gihwW3>)Hy7FvzK;!R8)V1gWQ*i+01x< zd<#}5ewmwJ9FA*L50|mov^km&reI=Kf;|J|OzGn@_Cm6uj`=>5h#G@vXHN?HNi;~W z+xXrgK}y60EsasGdDi1A-l_iQOZ#ph$zUyh&Ek`0DNP_rQxOMfaOX(-@|03@DkWsD z*N^$jh)ir!zWlMj9UQ)t7IVQ+x{LelY( zL4Ckfu7-c3DAF~cL&)wn28EAjyy|ejXi-Tb5WpEw{``w22WZvgA5;%+) z7G#Gg%S!zi$L1M7*jyX*_918^ImEFyB>w0q)aw)=c}*8|gAH@3ON&_HSwQEb{KE&X zO-*4u^Cy0N1V=R=d%~P3HZmG|#jZ;xqs(P9#ov2UZ$Gqn0}w1) za_B9j0*mkGu53tw%BgN0fob^zEs=s+xXKGjayFf#9Ehf;Tp3x9_mgPS<2wVP_k`NK#khwn;{iMX$h z)5b9yh4)3FKy-34qCh>6hqb+zTIhSEdhVHgZX6|^s9uLg6=kI5iukt;~tf#uOvj<<5N z-5sPy<5J~$`PFq_jE+sDa|P1|VoYtNK5yUTG5pl;wS0`sfNwV{EOnbm;u6l?QglOq z&cR2bAEgNmvDF*s(Y1RbYx};EgCUbr!X=1^9C)tvA`g^vtr;xVa^HKM7>Ft|MP+QQ zs&wd7KHRj`yxFwt;{Jlh4Xq4!0@X|X2hyyZeMab9&06?c{i%QQO>Xjyaq(s&Dd7PZ zXY1$vs2M8%u@=t0TvI{~k{~V4iMZZ^m+-i)Rd+Qlr*B7UPtErx3**{05(H%A44Ic( z6+^<4nun_T{3`Hr_gO@rG@COTYoDIQm=-w+^H)A5PWw7T$@!0G%IjARmR;Ls??QXK z1xMs7Dk+O&jIe@|3WS}+s4f=$aZRs|k{rb28i+P$Y`goaV=_?L-!aIMrf4(vMqy^Y z{z_Vpv*U{jN&SDtH)?>6+sNyZItrFot)a0-&{@r!mS90h=Opgg*%x9q$jA#ulQIrV z&mG$#F_Ce(HYKh1I7>-7DhtM&{mII`qsmF~Mnr8JL~Rn^8Q#U_@R|K{b_SHD=D=T&;19ridM+!c-=%fXgXutp3v-tySRfEjpM=E$-uefU3 zdOxs~g@#I*;sXieJZnZDF-?kxO2(7yGVM&TVpN_k8BnzzMm~KXx5{Oz=-cnscfAW- zCEaq%+S)R#x2+lN$(31U(3aCQ82Bg41p){kl12HW8U{$%$;B9v`09riY+#nYg1q1OG!C+m;ce*)K8<@5XFGj&mu_p1@ zAs8#`&2co0%K!_?0nJ)M5fnj*cu$?K4&#o^yum0FgMmP_ULn{jTlkS2sE5+6ad{FG zmo$O4?4i38MtxakfD{G5{0XbaxNqnec;GDyp`2Mw_8Eli@ZDC*E}`>GX*`+#HMk%| zKnSN%E=uYEFNfUB^$Vmi1^oc38_Km0Rxd|@d~2+MST|F~R99Dq45+(_q!Jxn6Xu;) zNZ=A*b^wnbS2a21I*5h9Bsh(zQygyW99eEFl9`eFYej3-i}!2Lbu*b*>|Rz4;lOo> zWpgIW*}Yk&VDTEA1tS6VU2rBk$oS8bf))l~;cGeZAh4+;YXLghl?yV0+VJP70acMA zc;u8Whl$qSY=e?WDdUGrJfH`pD1=XwQF-mP|yoh`0X;m2WyXS<3KP`J7!@@Zls7m#I)Sywk$x(Mg-_!bIuu$HhqMqU+>K zuZ!b$Fx|qoNFE5n`jg-3#AhzkYhLF8@-{%FC)p{!ep_ zCaIt#MdFzEPlKy-X^scYROZf8k_1z7X=(z%K>lXPak&oozWe7@Z~LJFV_P0>826^2 z;C*|eQj=4o!Q-;aLFxNCyr0lap=+?YOeZ9Df)Q!_s@l$xL50SMRlWh5(;v}0zjkDU zWrHOa`zt?%9+wpg_xJDUw2XRSEF}??l%4ph!X8`Vay?SY_iXNky#c7+NA_FST z_6n$)4c5lg$9IJqD6XhU_d})GT%{={_>M`5j~D9&_KE+z+4l+1A`53Be^6tb_$}BL z=fgF`yqt#Np-ZC+h$>N~O(CDr&1}tcr?H?d>=%)8z3K2xON;m-hyT1Qn$Z!SaTzsT zqcJ<6U@IjT5E9YG8m0;1Jl$ZshXsf#i)V2Vpqyvh<=oP8L|GV!9peq((FM+|4tfcn zED59jlTRwH^b*V&TXdX6nU{gfEtj_x=HaMucdy>dB~b{AHG^HMSAp9Hy}$Vtkm0l} z|C;|Y%+|P!(Yg}%mJkM{Oof8falc0N?9gh;`Mjkw2dVG*?ARt)c4C)c_Lc6LDO84` zcat)r6?=4+mv@imyx(}|i^$Ru8ks~*J$v%&3v%7@Krl-R2<|Rrxzg5K7p7js1?iUv zJ&eaP>P<=zNF+lE=qPdvo_^{0P|s+i)`6%kUXgpc60D(8$mY@hSLfc5x`vdl;+2r? z&&Pz}$f!6(wh{k$6jsn;8t~-#d`+U5=Y}WXYs=f-K9zAln;(iqcptg_K7@&dmBr!< zF1A;5l%0K(ANr)!f<+GnFyavmRg8Exyx}e5OdV4H3KU zNaZ?Luuh%c`7RuG0&o@=*12i=;Nluba^4zq8BOq6=HHjG1rE-Fo|aq$G$DP zdr6y_EA%Dnu0d|=OhhQ`+reX$8^#N{;6BDP&fkBb{x!fUNfPooGOB@8|M6Ox7On-~ zWscd=iF-B8(bj`LbTL23C2c~y9v}T_iP$>&d4TxzPsdGeFhOfQ(TLETv}fe+^tJN6 zHxyg+wr?C%GUYEpU#()>sL{uxPp#MeI}bQr%Kv^JETtD`0VH6>y4ir8?9;nXTr1a` zFj~XL>p|^)*kb-tK1jw4u(fJ4SX!f`3We+nSL<>C7-OR__!glAL)m~Mp1xGlh)N8g zUDpuU5REaT;^nT+;I)N(xV!(deFOSfG{rZon2lVdO4=KlpWdk#Hen1-pGcyHwMH4MoV@O+=3Z;t((vzm?VnBQ zb-vzRqKQ5WR4fS*%4A_B`D?5y$k)^FA9AQPX!QPzZdB`1ef#_bZ^fSD1UwBHIRGUp zWpBO_1<*hSF$<|vHojY0jnzHOX3vzKrkV%R0-rR0EqqcTCUZ=8Rg67@j5c!GGfxsT z-jYna2c1q`LAMA+2r@tQmb-~ruqe!h595GQR0L< zh(~D1uyoF7wW5_k+y+s;VzIPY&o$neIJQ2NPdZ4#5fd5?P$V*$)4T!>Bw?KYPWY9v z$4nCIJ06?;ugm^G2?0_@ZWY=0_Dx>v9a->e3~Hy89?egCU)_5n#ZOj2 zA>WTjFRI+W;ikh3P+Vl={!qoR^|A1(LidQD-Rh^=SQBz^3<)811cd}M zK08=HfL5O6>zCi|{8|aNneu^wlNkbr7U4f`^vtJxrUS*GI>C^9Fny0$&FgU{D zmGiDSe2{#Q0$y+yI;ki+D%yA2?eDZG1}uCpldl4&6QSF3+kwb&U_9F}m(Ea-NgcV_ zsjrWt=Yzapkq4%jh<#u%0$$-C@2f5VvvZ64z`LcA)m zu3J130$OIQ0OAcD=bR`X-_MAZ)uep)lLI0z3obIwIJAS?iz=d|>ab$Heie79l5L0( zRtz``G7}o0-8v1s?nv05%A&aLg7X`%jjpwS*5ULr@A-)sL2oGU7eBr*R@gdR@$awA+~9OMAhCOUlz>hV4Ghsh&M_{9 zYsTKJKF>8QrVMi}M6Yu?3(~T^5-tJbRmb+5hfmZnUT%}x7XdOR{&9HW4^$yCeZEpA=GEZ52Eta)KY>V-}2@VH6znf8KP z-~F|k%0bPEg1g5rx=}!CA6^z%k=#W4_~iS>`gVdWAPe=EZ+LN=8-aSy8Qkg zu=zQJTww`Gm%oW;xKI}jWa?d;B{DrnRPRd1+PitcmEY@x(Bt9FvG;FT9}o;XZt$Sq zzUDW7IseCHX2yck-kEMc_JFM)7fU4QWEGs`gNmCfmW$r=Z&XDM%261+k9BO9XY+1H zpz<&fJ3IEJV^9OLQr3Xf$?|ais`rmrW!u9X%OLk#zwgIi6$mPLN6c~ARZ5XU7o0pC zNEs)#qDw;CqPMC#3i`WIl^&IyePGYEN140+UR)veKpWvLsrHzYIB%r+%di;5c1C%w z-_9F5Ok-$(;$;+rDV>v&zWA1ycdi#5cI=_ij`>b}CZDlv7T^zG-~?r~m!y3)g-$$> z20a;-iRl#`no@ze`w+1+z^ia=>197_H|pQsk6XVkE5flE_qX6@lH1e0yaFo*gtXy;+%j%wC%A<&;X;U))WP4Epl#Gieh$QW1M-*pN0 zzq%wna!JQ83u=TB>NeO57Iobg_9M21rI69T*8gJ;c=r8&UqIcn^#=zmb^kpm6bZ8p z24TP=ite}WI6P21_w-W8c3x{o!BEkVo{^_%@sTfDZ^Bqf*G3CtP?;GNK-hak2D3k~ zDRmzKli6lkh(1_m5ODM4$yvtG=8`l+K~Iv_yvqq|2i+uAbGG=~SQx{z36UzPm_N&w zAkP-CCe9F1SFsvvf*n z-qR=hvn)f?gZQp!yI-MLb(mO0begP8Gc9>Kkgeg^OK^i7jh1pU;GKUbp`<-~V<{Db zprzl16xaI#JBQy>9aPT7cAKd6Ravr}!E!Dv2bRh}iEzFt7}ROE19qCe4}F7uvXfiJ z7ZW_wcU=&oKNZ+J%u8B7^NanyPtRW(MbN~G4U~#yUb8Q0RJR?AVarXf8#jD1kADsy zh}mGpg?{2`QJ&`E{+;1oViA9}L}X=#SgK~RLaQq|c?V?6(C*m&c#b#@p_=Qzbs%`A zI)bm8C~ObfaS>5vyK0AYvOFdBvUEg;-A3Xe|Nkri|2#RqEI-$Hgzuni{Ko1WY6B&u zpPc>1yJADD32Dl7^Fhu+-#W1Ug-iBaN5B>JRH7lM%Z?FThYKF_0rOi4@6W@IZ4uu= zl^q9alsALV<*y6h?#wbThHNki6(Q)^-TsmwLAMiaIH=!3J3Gohm!KrJuY7L+*wByz zrl#(&epMlTrvBLfw1#$D5-P@%(_u0pm|1%&nvu>of0)>BwMA$iNv6G-cG}X=+uLGM z0C^_XNZ!TW=AuyYbEEvs1I7rQ)s_TK@4)8r`DC@~73^j>q`7jxfB|t6VoowE|=*xFk6!9E2MKY!aEkK;&1x zDFEo2LXA5+MENZ>uEv~^taPO=qe-L3ygTE`otE;-vUH<74ug(_5pG%2CUkJ^Gsf)ZVPGXnGTkTU&0*)>(1 zzU)rL(3&bBs!WCZdzm2@Aa_4zhSq&%*DDH%7jr9Wn|`T^DT!+So{}`D*?sQ7-QR0p zzed`d555Q1fbC0a4L$@5KBK)z7i`zQ&5v;GL~Y*;r3+tUW;V9DxtmZ0VQ~(Hp{Hxo zs`K$yt$nK#BhqZ;elp)}{0#nnX{Jg&3Lze#ywA2Ja z4ZbAdj(3(${l~WzRv7KbRUoS4m%|{S(Y2=~n)(eoxB)2n#KBPzNP5M9lNE-J>mmLv zuoZCFQ7#Y^6HyVt=Op;W{3eA$RO{Ro+C^T*rGSb^B&tOMDboux_R|0bg$QoAGmHz< z(T+&Sdi+I-IE{`HtN}me*rU1#If@mb4gw=-^RTS?umP36w*=Dg1f&}2-Ts}u>j$Z) ze)fT{8vqvtWP<|iXI@+k_ecmLA1M3KFqsg)9vL})@{THV5@6jT(@``OPwV|V*E26l zif05CR!O05Pi1_u3h8X&QvUBV2XoNHctc{KN+SnzHR*!^G;^bx6E^0LoS1YY#wF&R z9`b^i{0$jN)WLKf-R#%m)JIerkm^J*=}zq2G;2h(fkhkvzOz<{P%Q#|GngNV(W`{n zM;=wgQu?h4lwM%No$%t7vlif4m{dj6Z)H;m01tC7s3m| z5L1nE5RCg;n{G@}uqFR=efIf$EW%r{`WDra6Xxr`h>*{8AR8#3)6>(hZBBRpiQi*b zj=hW1d>0W^YbX^NB4jMe!cry3&%LY2v&{Hcpo|-aTM14tkOEFAp@HXCNOVA*#44G- z9&8m3cm!h=U~ERpSf^#INJFR=YR@$>9rVrG zRsj7z{`M+DR?!D^hzE4M1NeYbiJXV=U|wujvo1abQ0m+d#gIatb@Y9|F9Of7(2tfE zri;6^)O{hjV*jZs*B=uY2wO^cw=_91kp|&L^YS>KXl4t1L!+Tj){9w^W*2h&w(D+E zdJR*F=|#60_i`{wEB9+`Lnbvm-vcZedPlyAon6)j3>WYN@Tl=0^g1G4!1~dcK0&+g z+ip3M=oXh92e%I!@vmN$ojm|{j@J3$`ku@+z)c2}p<-^1j&M>Ml|;BXfc+=oxE|ZH z#odR;bBgL`e;RczB4;F~DFmtQ(~>&0>o?<*iB$@uK@w#H;Lj6pvqmKo0Uj*!H+-v) zRANdoqMO_A_i0}yT$_T_k}~(kafZe54oz0F8yx%|Tb7NC<}fbFxc%Ts%Jrq9D^q=B z7o&oIGhpVEoQ!plS?au9gF1Vo54-YXOWkDvnxM~#7>zI6m{ZDvr>elAJu8M?kzNKA zz0g`Xs8rq^E$WtKj$gV_yMOEuSLBrYJGb7U&p_B&j^+19)#9lelcCa&5b{4I-{o8R zhty~)sC?u6@Aj?(f3zf0(F`b=xki~=6bEK79HamkoPUM)T4yIbGlX;lR~b1|E8`a- zmGwk$F$!?8_E*7J6mcQRcvZBy0UY?Y-)Ef&5%pX4?x3)XQ4&uRAx z+{0ApE#BT2UEn+atP(Z?gQ``A*cZ{1E}?#8XC~QkE#$>38;nY^hb~v1IPUA^lsY$9 z?Xm$8$w?unQcEDCmbV;U{nU)0>TI!bV)>m}S!iEwiM)NlOnb;%QabSn!u#D+9+YaB z4mYj_JP~l#jK}elFO5Hl&YAi1h`0h9NH2{`lU1e(LsssvG8P(%hQB}@vdJ*iHAVVt z7b4|TY|>}!;?L~w>mV|P+b7>bXpTVvxgZdj|9K2j;7XGtpeGBqDj{%7tNB|5jM@kB zbGI@?ESY|F{J^~t+AHQLf%1jid$qX051_zV@C_cbfe#Zd zWjUCoapQ4^KW@tym@tD~Om5b#;yr8s27zb3XDk#=N{+MjL-CE#5@vLPFLS3>t#o* zUaU6oua>N*whPNr8$B90JAl>g#Ht`PXb-4~?hs2Rz5I=eto=8%ofmQ%*BJ~3XEO8j z>P>yt_)2>ymZNEU=s>a3uD4y?6%MTBi|~2hC(>^EVNy8|6}VwF)<(FiTmzz8k%cDD zj$N!=@T5d+lh3zdXkCSQ-7_$*6MNf2K4LW3hsX6iQF3vatn_Pe16xV9m|R>44Sy6~ zC0NQ|!1BB#M!fz4aIBnd)zPRmuNzQpDTcyFa-o#j_(X_|1z4=!RhWdU<90TI$^7kz^72ov&Lu`i|6!dF|EGC#fDVR9FphdmXs@f8DJS4{Egqwt zHni?n<%ExdLz3>f?j9@-@FD6uPxemWq5qoR7S>3Yk%vJpI0!N zGrh|CJs$x6G4Uk{9yYHAh2|A!-wWmE5b1B#VxmDM{C-BmvS8CY>*lj5sJ3M)1^-Cp z?@P`oE$sU>K+_{&OoJ4fu!{b;49Q>`EqJrTeG~EmC%^+Id0i9!B!@ncSNJ#cLM{D= ztenokruM!o`q*=yy_xf;`5tpRA2 z>cTVdjsx8gI4UzNsS0^D(rx|oHY~+UnKVkQFU#-;;1Ao_(}q*2j_a#U5XyJ!^h<2Tlgi8?4+qaE-ZA;HnuNguIw4CBROz{qauocIkTmheW1`9p_uo+27zKz6N(0N6 z#4D$CUEofe5hBKKE@O`c_|+N;3n7Q}=gX3Dt?>BNqBOH_8f?&1>Z9Yt&(3>;l9@3F z+pD|kzMlU0Sn8~=KZ5)bxv@}DnQ!uX%SKd&T#6g54u)Po>~@E9gWGU|8u(t`lj%9?*XU&c(c4<>0B z>2htC?ml-s=yufr_{$1}724i$P0qWmV=4y;n2*RYhF!f_MSdabkP4(^|5iv*L_IMA zlEK^SGPj#sf^WD6JTu$nnLinFGvWRQ9ok>f^g@KW<0R{5^Xhr=@Wap_)fq*2lj<^@0!RcbKQCv;4Ft=S_B=xHBt%7Ix5N#7yF-+j|4EG zq$Yw!i+bh&o2ubaBtg*~bcOHs%!v=;LhG6j4joy+Z>xpy(1w)~PefUUD3bo?Fp%t& z%OulXUC_qCU^0=g3cDpqr)`mFO%`6;N~lTY{?yUzZ8eAB`CMT)1&zEC;klx)DH5__ zzJ7j&u#Lzd$^h2pZsS^u3GPDFA<6y3qp(YFwIOeXj#3KVN9&I4HrJz^exkkht?D;& zw}&A=tG7*d{#u<#!z@0%{84e<*3l<1mc`#1>e_W4*`I${6{VVLq0uti`BGmYD+>L4 zDM7I3&d4gj@L)#we&(%~*yplRhB@3au#~(ilq##E{_QmzTV=-*y?PRKGakrS%Wm9= zl5-v4z*kO(H?#oxDslRPAUn$TNJ&_d3rso~@bsIX&Iq zEc^aOaT;~pH?X!tef`~xw0uMEGCxENACE6lcHmKZ>OqIW;{x?S>Ap196L46Yz$VH& zO*yk`aXgNyn@@Y<5i<dWSM9=&=I!y&?$bR6wwrc(_k+0!w@0-lCF@;u>l&+}@skdNJEP>iokR5<48gUcrYu&^S< z1j~8}Br%=m1z7ZMU|s&%=~xdZ$vip!U3x>PeEjIfH4LyUVfwRZ^@kd)Zp_RaY{%Gboa{Ip7>-TJOTL?JGEvs%b?}~2~e8-tVxI0Lvc5L+W`eM z(=}YOr6qg`e%2m!Km3xF4ff1lNRtK0sW%EHXf_(PBC0P&@0`jBj^#ba#$|D~6lv(` ztCugPx{PX1xErEOd!0(SYe{w{VJker8zUy7te5hkg541gm5ub3QD};`*$4S0k@=}k zbffwyc!I^|OA59Qbe6~_(--4N7;_v3+~ZXm(2N9QYy}r37@xeMW&J2h(Ix$<1V6oQ zpJQoxp7GX5O+*mo%8;8o^`^0^B~me!j0zKd)~q9;2tq?ZaEWuh6tX~;Qb4#l;*#=v z$m$`?tZ^E>b@mS5ioAT$rgha!fBL}hxxjkMYVFm-8%C+VP5NRi&S!oN&#>moi*Uhf zjbg4C?Wqdc5bX)DPd+{IdL>1Y$AekO(fJmjWUX_%TB0*}Mj>*srJrsCe{|g>KI7j& zg!`?W3|9#K1j#bQt>o9i-pNquJe^hO2=rF_f*Dc2*I-h)cmnK3V{G5NWuO}k6vBOn zj3@9CI56$zkq0&7nmNQR`i$f)g&K^H|7>47sM~zI?dLZF&J7cJg7s1*@C`fbqo7TL z6g$rMafNYtrLw1k;8>~z+R}R{Xbm@ss zKcR8{`jr5u`9g_dwdZ%orKI(Z9AS}zvt$Job|;W;LKPDTV)_!Cbg*yk%?@ka$ZMed zm7<(Sqgf;+sg#pR0OLw%1;x%1zvYq`doy#b(-YF_qnb}*+k`IFKv2WfspuCH?`VIp zYKZg@xh(ITziN!S=5&UP2%ihe*A)+_`D8Eq;#ElXmLxu86wzcb4pjEVW0rU6 z!R4l>(mR7!?ybx2Meg#e z-+n76h;NE)n-fe)(&IiO_yyW6YZwK)-Nz%9;1F+ZWu-A_fm6%%xn1?Lc!T5Tq>u8C zVK1FvDdyCGJBcBwb_(;Q8?Nqfwy5^#f53~JUp!?FuZrYb;dh6hEC?LcNQU7?|9IU+ zNp^7qn9s6ayl7tI^?(bH_=OL66J~yP_|v_c_$wnVQuX||p$B`IWrGg;cEQS;c>o$y znUwq_3WDS6H7vyd1_wQyiP4BA#~cu9XlK}7?3O7pgKRH1Z|bP#4>yGw{Siu z!)t&pQ!;D}=<3^JaQ~eKvvysA@jf;5FLHm_EQkeh`|MLJBvL~^Pf>;pg`CIjCfaad zIlxfYwB#-N4byGXsk|V5k!5U3v!X!QP`#%rUaqHTN1$u2&Lje#8%$*0cQJ{|3-3Ps z7I17+0)gYk2W~%eO3%Vb&zd%)4rp4eQNLH9BC{D_Vd56x66eD|b^MKEy9QKVVim$| z0-j1NF~F4qH+Z7}%`)=TD@Woa{A2qiYnkd&BLlKdjbuJq zZ?FewMqu}tP;Z4#MWNvK9BeK0yX&o*0%G>gI-xF4QQmQ_WPbFft#7WioGcl{-BMKj zDp(VWNeMoY-1BZ~S`#Tv5+DrXb`A4%O&igp9rVI(5pVsANO9y;dIpwQrzlpnn-Jd=ecDwvTwciCT0mdWgTRK;)&jz zy15MRI1#$~KD|z+0fZ>;-=v9mbU`|0(ffJm2R8;(TY6LaEa$(6x^9-Q+sqm1&-ESs zzAr03yKJdT44{~u-qIiA*P<&mHXT69-3^mclGGqwNDDV)TTfg|iB`=fjI@u za@>}SSoK-Vjpitnur++!1m{IC`c7b$YeX#u^?v0nwt7FdT4EE)684ePB1#je)1zf- zS7t7Us$d&3?;4B#sjX=kyE(8Q1B&um6TH& zMpx9Ux_4>#yJPLP-lwJ<6=hi8pkl4Skx?g0B64;i(2FfjU=9toj~RA>51Oamr*`+g z#ZL!(?-c?FmF@hEI9evF+3=vq!M$=%@%?;@D*pazHl7K$q5so8;ewOgPm{fY7zcI4 zn$%Oa$AeB*Z4lxMkLy|?=>^K*ZjM4>KV)6+wAA%)DTna5;Xv__)I<@tM1cyEP-`>7 zFjvgW`igbQx6F`cR}9WkRG`UiGyE98P`s33njE+Qock9vwOml78ZY60^+7j&0R~e z#T8J&nE2Kq@dye_=%oiMLY24SpKX^V^pUQ+PylXt*jRTvy?4GuVOxbMXf)@uw;(s3 zp|n9jJ{)+H)mzG{kpb4_VKbtg#z7#lIsFrM$0ifZcpXcYz5UBMW=S7X=rC}srWHR6 zC6W}vcCi1-Qfrj05ubPR53vQqy^dzI4L-e{?{5U7{SZ{lW%mp*lRR@M9q zVLS&>7Dq$k7dtEpO@a*lo@EEp1bR6wv`_ddVX`LLv>G*C?70e` zsgkJ@{0LzW7O?Ae4y91cjNF3!0?rLZMlg=AHLH&xm=KqC7K$zjZu1a%I`jkaZC>`f z%e{6}HNnhn4fGQOTqb&pB~OYTfK<^07ls*4$>e180{&xWzqwgAiX2|~x4j<;*zE+O ze|@`MEP)S@OhYm)#&vC-84ylT>8T9wup}e(Uu0FRK?WtqZ)j*Y71(NzxTDG0td=!9 z5(2!qY4pS_Z~HJKZEHCW;50(00Tc+J7jzeiG>Fj(ASmkL72`?OB|pkX)XJ^}}BWr(AGj~jDth~l}g8wj$=e40q?;nB0$Dyx{g29w%)3Z9P z;>p*?|J9IxRKy&;SqKzQR2B}R5ZoVE9V(a3U|Cl5a_^_;OZcrt`^Pwc|1W#A>BDm6 z{lT242Az zT==$}<+`t{;VcW?6qw+@t|agd5zQ@!6tZ}xHQ$?1^2eZsP3!^${44>Wq z3Ecj@stk~CfE^x=DDW2(_^;1CM}+FPENkEF_q>X0U@xs+b)lgauHkIb6Rf!HA%yqR zNBcnsxcGfk0O1#sCv0~>now|7z@kU9<+xM}ylqZ>&_4VwbMiGaZ%8>L(B^&>51 zGqOG}mNbm{l}HtVLRs)f3gtGj96ntyrQfUV46L&Mr1dvz9wX}&L5L0SOHJt2Fy;~59^d7&pv zXHEl#wyL7atxedt;`JDcs=Ku3;8^^wu;mTO+=0TAXXo@?wAkMF0*DGtOU{+SZtK~)*7+@YG`%=BR|z*Dxwu(QXa-)9!mVZ(V+PTY zH>ue-Y0wDg;Zn(4f2GUjgv!&*iwR zNJCDO>qTTQ`yTHf)CP)Pndy2p9@$>QaS_qh%>jAHqT?esjHM8`bjjY3LtKg@j78Iw zQfeq98miL6SG;!AsKYKJpeSW31`v zq$Qkpl45+FDP|xlZM5xj+KpBIv8d&z6kK>tycI5SS41iVcEm}bJO$5;l?#T7#?NTN zz=>p+Dj!roI3+=z>v;bcf_UKTd?Mv&re?y&WY>R0b2bi59hx{cgzbr5U^bt^2oOq} zEN%pa*S>1K;tYZ!T~`_4B@L#tV%VAi&R?Hp%q4MzYj&r-AzY5&H>oT{%7*Yqt$(NT z0%n8usn_WT(6vIO?z#vvq33JczMemi2m|CIA1rm#zl^CM2%r}y{E&U1fl>m1ypYjgaX@LDDhMqVmnZ?|nXO2W@mze?5@g-Wm7FF;B_lbc36Q^3hK0xqZt<+G?t85o^~Qm=;< zxGmx^UfQ6WTw_>t>@r7t%m{m?U)|6*#2Pra88YPvFJ%`C8MvOadu?y;Ba|kqm>281ZoxIm z=0`oswOI%3RF@y5ve~)a^(5j~I-2|qls%F{hq*2+nKjC2e~Wf8K}#qVS$&2s0^)=K4bywrrnX6fb zeiBG>S5q{elWfxGGGk|{7Bk-JXlK-V(iwROTs1L>jRJr0dz!$?stI{a7jbq($YzPf zmkD;pXiHuF6ptnorPR9=rTkXYVix9fZ+&;u+e3;y*3<9E%u0Qgt#DaY`pqyX$+QtBUA z{k2ek2x0X6ahvv9r-0i7u*0CbI9uL5S$5*9@fbPsW(C*|&V1L!%*mnDD|@Xp0EYpu zp_D0WF?8A14|x3svJy1=5K>wYO;|GZDFZ4q>o_%&Bv&{8G911Jyh-lbDkI7GR|Wlha4#y z@ok{}2DSv2oe=QP>!~~)w3cQ{LsU_sGruQ9ujJ;X7s^*YL6`)76&jGllt!Z3Y`D;& zPlYV|t1Z46YWEIoE*fJj2b5vr(y!ZlnjXjpY*2cD*E3!Hit_51I-L|{s_2P^KHl*| zTo2#3DSX}5nt@KvrtL6lR}zkVgF2rW8+5ds-dd(zO62mW@T@Qp1-I-lWD$rm*m#~6 zUx^I_hd(@i2?xj?I-%kJlZ5|>LN!U?3$@j9D%UNwG$y{-TKZavm6qLDxL}GAftc!h z@Q~pb3og{a9~=PW!eu!|2Gewb%W!s;7jaTaU9i@4@f&5K?+c5~H~Vs2_^MClTWaT* ziv$Q;=Lgi{Gc$TmXjr1a)xJ2Q=spwwjbq!9Xi(Ux7_JN`*B1n6lEm1QMDybZ`kF|= zi?yrXO2asq<(YKqFAf4>C z-_hLdn7_64C5M!*y^5@QP!4d?x1Tn~e735;BkAq)(ePUEsWhvG-;^X^>XOoKk22>a zo=kPc3ZtafVzBAyR8{yTqhDBY@lJ8Fp!QJ8UrJS&VT{GNt1~lnukdG7EK$*l87KII zE38j9OXW{vLFEZjt8Y^#T}tDV6z>}PjG~<_IsqU#DQrY4eYMZ7dq?suNMxKiG1isg zK;EW+F-KltCqK@6rOdeksr1Jm(xxSuH5Ah;uwZms_F`fiKE!=p^#l{~$VXO4$~ACz zn|gFm3prGAK-Gu#j)&`<_#>U5G?;M=7?FFD47i6_*!Df4IDegzg5aI1eB$`{_~Z4Q zt$Ig|ey8iE`^+zaqj>zwQj1nsGTvPwE|cb(eaV>{lg^=4XnJsdWh0(0iU+K0FY$P1 z`s-kj#^DdLEGm4tNM(V{LSvlaPQKryQDxBMW~6TD;p9r5%(MsQXus@vM!Gh6@&8=W zJm`|pM=wEN*~s)d#uYHcgEuF*NW1Y2{MEj+W7R~DlOn<3qp zrbDSLzr!M58zx2kA|9|?y$?(WWsBXuuB+3;Ud>MPC$^fqJa&UnswcXW3SQguIwx@3 z`@?B#OBassTL8%Y`YiX2z3Kux)n|8Kb^eCUUO>_b?&-JakmSQz~{H8o3MsjUZXbg0+P6f*Fzd?yka0EFg zxMh1sj*Q#Z1-YdB6=UeiZ@rMOTGg!I)T2nI-w^=3=Y61{^#D`z<(K4VP`;hjh4ASB zx|5W`xAgP&`Jb)Tjtj;NL)O?30cRJJ+pB{Z_3?%1TKcabIn+K9v7d4Hw^x#j8Y7w~ zD0r{I-21eKDdS#e$%$i@%I^B8e`{0_q7wy5=gg}&ONI{`vs2Y_xo;O&adNyF2F(j6 zs;IL1YB`gedKxoy*1|duZ;4Q4itd?xrfgEDB_U>p0@4W(L$qgiIv1jxH{1fg`Gh|bzPkW%Jo z!Q}=|^Uae^uO@M!z3KJ(_t`;`UyDJ8#Pja6?^BdoRXBl#Wpr(1_<+qs0WDvMII1HB zaPPBcIpQxlq;3KEIGh71&OtvT%5als{8}nYzp)mHxZ5IsQAdNan(9CyV!+9T^Eh+` z)4&NpA3HO;@uF9H*PSBw_;+%n#+ff%?kd#wp&%J8kU_}_esrwR9c5R;<9zvAj)M(>;7gGRfCDM`Oh@cQ|$ zbXNs}#vOcaLY$}2UWK0cP zp-cA8MWuasc3Qd!45Ugy-e{w>_iH5fGdLk*9QdUuIQW~kP=K#$QxQQ82LKj%G(g-J z{T`(N-cc!n4iXuSNC3Eunv85~2r`RAte;cP3L=EZ!fMV2eo+?RPKE6vd4a45PPEDD zm|fMBwX}Y4xU1lUPsIc%7(fWF#?_MF9&CILi<0`Ole}WHV@%v}!h3iwv1po^F%kO!mR+E2Ap+U-o$l zKMF_6)zX{XJysfpk#ORzLS8FfS?m!i{JEn55&Z8t;!XDs^x%6M$XE!7v^j+Xk+tEk0_*gb>yjF*hT%`Yrfoqc2%{q$u_?%b{-lV>MY75 zrY@SN7LiR-HjYThZBJ+9&RvH%{{l#Pm?N&E7c5sqr((*AS^1=eO*R;6Vx*5(Q zp$a?|XWg@YeQc7_nf}a8>L@@%J*8yKrBcH}1vJEfl(C0uf>Ym2IIOAekT%jo8`fgW zter9O9P`01VE$*j`u}q&F?d6NEKff(KkjEA9u7&VrqJsGO_!pSz@1g*}biqc?5yV@2cmhQf0>R^p)^U<@_4Qds=;K^ro zaZgmvKYTHC_?-LXU*=jsg97JtAXL+z*zm%1V8n-S5Rla;68ja3YTi%N+55ws@MmL) z6eo@6+2e!kxS^7cmL@fyP0Lda9Ec0z0-oEnxt0?)DIi;*oWbC~n-c2h#dv^NG zob!=@Nu172JE3t;x~U9nu3i%wh_qG=FrmTWnu6#%9Y85U(vxDU*8 ziL1-{TV@~9Uy0MYW01XajVWxUIWa%#2o6j56@JaPM-A4@zt2kt-~pw};ntqHLqi%-}{?7#_z5ZdL?C<&%9q zg`EDh!Wz-bZd}$NV-{na-*lpTw01?w7sBcgT|*sJSB0Q(XHjaBtNLR0svo?I>WpQk z>A)m>;DBaUQcb(Sg<@jfQid9Q>B=0Yh~ZGJrUG3n13D=e`sd#j{Fg_6+}C)i{g+3xK>l#99Lets(MkHc zCU|Wg3V;S!2_Wp$;W0?M8UEN7OjILqqYNTB$IS$rDJDtD!tWD;CQK9pu6ygtHs}&x zd`Iz?qR4%u$$L)gw=&J2ui3K7o%fGlwRLxG|2BYMqb(Qv9{%;js21kQYN7`IJCnac zF#Vp(aHfK*P!_Y}HgyFAP}tAR=u3jC z+jpnj(GGXi74epDt}>THjZpb=2u*l^e2b!G)GqhnQBoIt{RX?Z7hNb9&(!W zTd=w~U~R^7PSTp=>PoRnf}*32;b^f_9?Ns{R<>;lI%jmA;7>9QQSP&3v-aqfdzN)a zq9V_@tT?{Yn-S<>z#|0o+ym~zU&rG~-}6^j1W~dn2TTb%H&^p)yUw*Qq{|;TckWTd zrMSh8AWSGusVaG!x1bCnb?elb%lt>p9MCjlo0IX)`0v%o6BFxllUJkM5Iu+An>z9y3Yf zYm#=pb#aSnl?6w{2kjjy==4G`6oOzT41g39+G_AWikOwJ+D~Vk)FvrB4ZG*GhWzF= z`B`Z0-`wConBw2_96^I}6LA~g!#Z#sx?Z*G7RnNY=;ck2r>@t)q$5Q9q67lEnaICX z!uFS4%DUR8?kTn0LR3_@xTftWvkkAu!h&`v@;6EqY+_3E8=iDLSNp-co8HB|4}1CO z!wb%*`_BzA{AT4f^&dpY365Lt5Tl2^V#p}S?Ns3kp*{&T%pQ-w9B<8&xNQ@t#q)Q+ z1c=;KtOaX;ghK~6$&AF}ga!m147n~Txufd^oV6xG`hl(%FW= zk>f9Z8Sh5H@B&3iMnzwEFipU;7v3W9Mz-Cw&p>FoawbZD??kNJ?)Y4SPg{~MO|rh& z(V+?mlf6YX$sWtgh3_eW^P7x%4UwHXs zMYTCEmU(&q|J?PRy~gu=zb#|6Gh<2BkxL2t)aAI#hfJUze!Vc~{u`+{qP=cpLD5dJbS-h#m)$h)F-@LSRlmkIZGD|~eSh0Ftwm+ilh;ZuYO zjb0UA#*9Fkqg-t^Br`}fnFm0fgpV3b#B4wL77DhgS1#HkW0EX&AwEN`au}ndbfNiQ z;QLoPwC-M_21e#QzjppvXou=VPL)_c|HonUyrE6MS0L?GCWY+^qBJtqs2hVla8_KU z`pecled<6~gJn_SAy8h?Tr zz~JThKT{gw-FT+SdrYp0Hp*pbEtDmg9nl^*KAp7QA7DF9m@$++*lVZ4P_Q|*B{KS< z$$L675VdL#>BR5K=2I^t`X_d&R0ETS#ezN+Ez4zHp~S-hH=!xqW{nU#E`7_TdNrnX zZ&SF|pb{DQPb(zLI}SW47f{ zq5jITss@Idy#ybR;mRq%3c5rjLArv%*u&%D^SDt>QCw*WD6@l4Q$uQPV+TfmEQuYO@* zBq?H>2vtxqe+SgCn6&!7ATQ1EOAqvE`W2-e$UlcI7|2WZ|G{}xu;2qEqo{zSvJ(>N zI09WFdrOpgO3Yy)yyYq`X$1(Y9p!?EW)YO*RH|$G9uLlOZH<#hJYkX{2}a{n^_{+XN?!;e)Tv%jYU!$EK%z->AFk`5c+Ds0iY8s zZii6+?ykOKsHV}TrwR$O;!)(TQsh_&>>eQ3Q6K-t6Qy=1h6Ht4uSbt+2r1>A41g0= z543My`m;8NcVX#Qr!uAb;)x>z94nT^8`O&4{@b#5(@MpyhzFE1XL2X3$eu89?;vVq z<^$(Rr83K-hn?;KwMmvn>P8xS$gxuOcgKX}gZUpb1hWn?J9atoIGYXR%0@O91ps;k z_~KcMwbgkI-Ix~ICyc@DJ&WI0Fcj6*EXNHHICRO8ql)BjyL!MHaxi*4FC3|S*-SF{ z{Tw*%Mi|;io1}IGE>emWFjJYj@uuyb0XdE?dwxK9UVioe2G{MqT;BxAT|u8#>=CtD zXo5!~bITg?!`N!a>nvxn&I~`4xM~8ml~p>U91z=HQ|$Au_-d%WYQ#1mM)P9uRD5BB zAVJLcN1|gC0G9{!EUt%vOVcgS)i86Cr<`ojcT1lsO`P5Te|VgxLQc?iX%JBv+KE9b zKKN^d8V36%FrY-RuZ!-;3Y>7XSyd4VDlAvQhU4mzO|kqJ${{pieZXRX;F!tpNnyZ^ zVumpfFMQB$T()Bkz73&W0S7%=hiZNg`{8%MK|&3dX^@+&vDZ-8>Qky2SB4+7bY=F;EU>GP8SS?rgr zai)Qryp`Jo(g9E9A}h6WGaOSAzz3_qe``f{wL^ zx?NaL!kx{(1U0pwB!V<_qj0Mwhpp{cyG)vGxHL`vYMPPieN*@vR-UOQZhT7({ zM0}_EfBEv8R!RZkfY$oapU5eOw`kpJtFw&TeNJciif z@|@&8XrFI4@)`0*tyFnvRBOO?V7oVQJ=Lf?F|K;Vb^OQkCF(%;2G+k~8|60NmH%%Z z{0R%50i>@7ljDkHdC)}(Ap-0tnUB}lShfPO)g1N{R3A>LG?12jO?CL5jSLw2g~SmJ zqc%YSrDjCPMHwYvA5=N|n`J$uyygQZ8CkD%x;X0I80f>*a_ve+ZlZRMN5UYvPS)4M z4@(40xSm`zj#-J(pK_H@mqG0}^FZI^gp$xT2bd`Pa+;rn*^IcPtK}o<*HpSr3B184_d?eQ6q09-$2sFBuB?J!;qL^j+T>Xm{a z{M$ow)zgF}{;(RBALIx*MT2#OOQH)y@vsJ=z$3D_IZ|~S)=SiqjR?3omsJ8}M+XGu zv$80`1{o1j1lO)l3Go%vZ$sj9*wB)t7;h5_B#=MQ>d(fjv)TiUkVy@J<)9#)!cBXD zc7Cfzqj_57hnAb_7G$Cv|CWTKOb}i6>tf z<^GOCq(nE$GC)qv3Pn{@0ZM|b*4bk3=VR##GYacEIQ=H=0fvXnznv`+CGboRwDEgU z0KX@0@R0_@Nh`fHvkNK~JQd+6bYN8(-J*=#YxuY3lYyfJHsb%c3t+55Ib-|ajq?wc z%j}YUUtOXhuI{u|B5P@2&Be-Q&!y~~DMpbhY7nDW7%2FfudZ#GK<#a3_`#eL&d>Ow zc=~@N*nh~Pi9*kX{o9XB*Lj)U>`MZzf`6-(UdSd;l#@-?@tIy>=_rHebD2(`DcU*E7 zXc%>Bh?J!7;O39d#_g08)d%l?Z(RFU%!-p zUD;kFcfb3e5_BQBLp7>YC1`GaJ{~!mUB_@)-J$+sJ z)PP*5eCc(&3wtQscCXZY-G47@IZN85nwXSciT1wtdPB2C(N@seO8Bb&ytTbJ;(sIE znlLFUKHvIy`x?c-FwL}c*8@e5Ga@+byzBJC&b zVM=1;Z8WfnS`NK(TzQu@1s@B2cZ}SABZWiyz)Q6Uy5Ovf96Lb%+jm-{(r=OM;t82A5le~HU{_Q`6`Jb%CW)=16JFrZ#|cH)D?O=|x^yX8t1?8CD;wRae(VShA7>a^kQC{%N0##W(Mj@;%G%MA|EF$p z(u=bz%yEri2BJQ#TJfzc1wDO{)^9f{M(o0hSQHV)gakR=5R^r3zk^TxBys;+2@Qh5 zzd*g&-ao|^IsFI5L6#_^2^NUWLZ`V;Se&5TW&P*buKiOTgS)n&1B!cU9E59BZ_%js zUh+F+Z|e10R^`Qa7W^<25u9=cWhDV+Io;+Rampbb6`%b+&p$Kk&PL~s9(~@kzoI|3 zL$;i5P8`kRL;5Z!v%DS-)E-|S+PrSk$tQnTXqK*BeLTNCzVW~CJ=8hdb5-oEkdUS) z=($s>l(TA)cg@Td)1OCwJ?pKRQv69$U_0@sM99LG46i&m5Z&}+FO>awJo5Qed))e( z@d-FmU&QBYu{`^+mY~vjG*$liJSR?8cm?#!p*MV+Oz4#ki8s|`H zK-R8a%73(=_gz#%Y`i)4%78%_EVDOOssaOJml3GyT0-{!OGmSE+t+=2q5DPl!6MiwkAohSmf*TgEstxh!V9)H01z{Fz84qt$1mU|E|J z)EpYZ5+Xo3iu)JIl?PESA@l)H+cs(QV?fmHJk#1y0s)+bmXqDF zZwI_i7&|3nvbo9%al;A}2~L=@FXEdT{`0@B2kyva(otQx37ZP!1|sr16IFpXXCwtAgiVUyxgkSKd!+RdOqylWvTo?Zjj5$W)nNqffS<6Fw1;A{c`UOOJ?O z&-Ajnw-MQ2tN82PA-kuL2z-0|Uq{_`Q#&F2&woD3eI8K7pO|92eQuI{gwLyV-VUn0 zjlND1y$!!^_&=v8QUR`(oxpiEb6qzpN2 zc>E<_Eb5(peLlf_NzggExd!!R@OHFY(JwVw7Ym+O%_}H#FPlfDqiu#V8hWs{DIR7T z65!Gp?rxz#ne9uibowURNx%#43*wt%5lqcP83TUe1t5e6+>g>$8b#`z{%H770j#+Y zdKUOIW>#_@`lwJ#ZS*RKO+hS3GAsE*a5}pjrzDNtN=6kJf?1qrn)^<}60}f*R6X~2 ze-V7Mz6aj?_R`>iw(wR6xP%bRku=a!rlJcxtff06aO3Xkf3*BJF&_-FgJ0s+80Kk= z+E0CcV};tEL_vVK3u1m2vfC}xvo=|r}jlPWPCJ3nf+P_mG$ZZBrdY1&xe41u%-)^jjO& zMvdz)^Tv+tRsp-B$Wc^965B8Hs-8b}{g^I3-keC~)4;mTt!G?1_ce*{) z>ej5RXmrFJUZBI|R(E^Lc9g(yB^KRvpv-5DsjL;YAkSyd&Y4c#q^vsj2BTX7@YTIG zi(T1D|9W}ckAj}Y$YTi7Im&-^d*7lNOG6f}(0;E|1%|1Y$pK!nh8$cQt0Y}5e5cX_ z49^t`7^F6E$OrK*@;$wmvPasZC+&97%Bvrq1Q09+idPo|{7Q_*&KV++NV;}o+mpcA zf=FI zW8Y15<3>FPSHA1%HbZ+MBpcMQk(hF5Sx4*rwy?9W+!g^?0)aR8*j0O$c_B@{U-Kz5 zZNG(^?umV3?U!@_u&8NHa<@7tMfD~r8E!Cj5Ztg{$8dq87CFZX86!SRa3NIk(-c59 zp2)Dee83Lq^zKo4TfrMmrqP7rFm)F|DVgf+%0uRNZ+YL?)bX`8$mQJD&iZuZVDHfq z(@@R6Hn~TcEmT^7Wm7?F({di2O0;w}F<{-k*ql7zkq)Y=%m}aHXoYir_&~+DA#Zqs z{qj$v@qf=wi89B!<`3r0-A2_$dequjcXpIs?EL@ z9?Ah0Q_5r}<%1>6_)1zZo?i=GX6O_PBwDGEP0y^JzHol;Sw1Rqr+Z~j33(CG-!}@_ z|L>Dzj|JJa7b2aP<}-*;k_3Z3+$ET=g{vZLaaVxZLxoy%-A*a+N*ySSm3|1KXXK_< zve%jvwSs)kAY;U3f+8b^(jonUQQrWi{FgR`9QqFlLEHJGE{=hx=uaqcqNW+ZYBifX zg`~%0v@Ox&Aep}m)(cwgavX(F8AWVUlZ#G8u@IpV;uY;$wD&dq+xgu0jOMgi2L-e? zk+z|k)l4@Q>GR&6y|VTBz@MXRzFHieqyUt&55z}*f5{onfWmZi1BFtMiN>shM&$pu zT_TQ2oE}<{`kq*}_10@;gPIeufJGPm_2NEEQkok)m3%N-|7@SPv7tdf+vl@%Lr5c_ z4C0w<`^Lg)=}5q_0>^)au7uhRzeGpovU1@j*xuM;VJ-rVj;cc~w4XF6YY}#^Kh9q^ z+sP-z-+PuB&DqlO$K;-Lc(EM6$9~`hygrSa#X6( z#)#l(<0T$j`X4_XX0bHt(o_BJ%|{(n0ige^c9XvfC1J%TYt$3r|m5rPy*{mU=w?gfZeX z(PEtlh%e23VdLeE+9NXJC;1$0*3m>LCipQ@66h51nc*yrXOkn5%SaQ-JD9Ar9t<_M z0s%we789l#Za@~0PS&tq`E)Lmhz=1H_gvuA_hJoMk`WT&yjAEr2GSnRpQyDYRY98w z2x@%HJZf1?2ATGOr*o3KvlCl%tc}RiLw`P4^1wUlB{|L}U(+f673Vjl$Y{ds%53pT zX|t%=8iB%b`dm(~WvykZEeTZkApyKH^&vpF2=CMUpUvVwt3_j;uPYpOGtU~~B#BLb zxqy-yr$wjVaMktZuPdJ>%nm7=8NVeYy*vEh+&j8KD#2DGARb?trJ;#sGUaTmlN>U~ zIJd#GWc-M7H6XU~zVt}xC2#*|UkdOJ$azu9N4v(O+W++@FQ@f@Y$eSXbki`A2i{~8c!g1VO?TWvnll4%b* zTFiWDP&u`Jn{XdL<=rksq8e?Z@Kc+o!e~D$#E;Y^kjB9v%PxYn2uNX?5pn!C!*rlc za|p>IIwFrj8Ct&I;nau;7{LR+{nl#qR?W)&+@wZ#cS^SCl!!X_NYB)EsxK{C`Y+V|3+B_VtZzI~}Xzj&0kvjSg>Y+jctXpp%Ym+qP}z&CERW z&VTK-?w9-VS5^DeKBx9(^*f{`gT06=@P2K?*DjWFWk~wrk412LPen54W`izZDEREctN@dv^Jmsvqb=-bW3g}DO(X`IyKChLtRml|b?ca(XB3NWaFw1I3;-W)?a4u&SiApNeGU$fk!`q-+2 z5>6;R!l$<}9~^G2D0*S5o84+p>ZC1#s3B(B`t#Z}*_5}OfHyU@aUTaBV3^iZue9i( zhHR^xGIl)B_^tAM%?v>g64liM_L5RiY$u$oLwsbhX4AfPGE~of-)>$rOFV0*1=fIdSct3b87{+ZCGqSDUrO=K<4tK(47+pqkRP-PqEi0 z5&+Qf7A?-WcTKjD%pn@;Zs7^CH#2 z=g-;4>mfv*>M~R_IG=^{-V-EOzti1Gt*=S=2@z>caxCkl@HG}SA>>~U-^05zHy2)e zQ~FtNwyv(fG;{L(wUGa%WW2y+#*e6&3RrO_D3l>E>|kxWu@A=^`IRa*4{bqG?6?K- zmtO(thupr)HO}PlL<@AC`C&d-|QlSlJ7mU zH`9Ep7=VY4g_Cdms!Dp}n$&;v+P!T}cPJ#8>f73m4%YAH>LXX{Bh{yG%^CdaS`UrP z5U@I6+Om!4#wX-fiQYb9&pz5$<#2+9p&!k3R>?TtzwYkMt+MA>Nn7$hpP>)u_P%^N zb3>C#ur$Yf)2qBJ8Q;q~*&?U}?=67}`dU*j$Ft@Wt2TCa{nV9n{lWd5N5KhM4R(1l zt!}=qxn^%1ZA(oVF(0#{*Ga|aKhUj|=n-RyfOZD`X_HuMw_G|AVlbmwg%v(%sLMz3 z&R250vG^kma;^PZtMx*i#*GQkN9M2(_|=-f>rO<|Hd1hWw!{g{vO^&@(CE$uH#s51 zwOwgRj$<7Z)$+Ge4K=2mcRM6I7DU(ddmw>*mj$gnD^ALN0WEa~ncNuK72r&Sv4K0Y zY4h%4qvO~dPj6LV&175d5a4=@K|TI14=KlT>>=*@A~57l+XN3!xCHs|5@T@3lj?a_K0phitW* zulZaESHo_pyjzy@I+fBOf}pA|2mX-xgZ1y=~Yacnrv^+=nr{bGUXh!!> zpqEq_1{b>#0P~o0cLP1;hnpZ?oYQe?CXm)OQB9`qk`zf14G%jICgN$^1(2v`ZJamL zWq?C?Tu;6Axf?TC*6S56x4kWFJNG!Oyj%bK{+UAdYZ^X-H5mB(pVDtJ4s_+HILMO^ zI*CmQaF0SVIoXpnMxNy-7_dOGxIi(6A!8g|7ltasD4?qmhhCYX)6GOr0eI-@0MhOU zag!5w%rv*Hrwd*o>=rda(09P(U`w_YDJfPu`K2ZZ0HtcN<2tA<8Y+Fr@ztCH95=|< z5*+%O1TR{a3;UCLx$W8nhsfl?z*XN$c{ESND+6l!hs7T+GZ{6@mP?VcLBAPi3p*@Z zb<{5WmbYQ?9sKb8ZU3oj2B`FR%E}UgkVsPwkO_}MgExpajNacS8}*K!G{{1-F*Bn< zWvkJ6|%}62<*K#G&f)T*pvTARMz@( z+^?T~pA4gReazX>gm~Yi?6B^3^xfN@-{SHA?-puIZ_euUaCf22#v=<)d#*<8;D$7mEDG4U>6-*c1DcD`jq+X0Df`y+} z3j?HzKrD3q($M5dRTnc7^qb(X6s3QllLcz@^-x7grYy8CFeBt~{@JVwyS9}DN8?B! zewK8gU=NP>X+zScc!wR_upNF(5C2)BFqDL5r4}{}N_i6$#j>6p&J z%ToJmNK^8wpek;t$4q9xW0vcl^O`!4Y< z@=Xb5-6J8h0+}K$8{AgTI{92>)zSg{IEg5fFdUQ@zRj>P33Na3H~~b}3)S$nhX=#+ z^N!SN-`~CjsHTR~c;?C83W0X~Z}ZCNq$#S+D)dtq0OPqVI0S`rz*-;s)`$#n7@Cev6BAC>AX`Me}iQ8d9)KOA}$Pz&|&HvQOgr#12)UI(y|ckwNeHmC+U4*;b&6mpf}jmLuhCxF>K@!-9md^l{4GNZoDV3Icxmc zile}`8;qBVG7(ck=E%7o6Xp_X>3C8`!AT*8(Y(bi6^I+-SPTQCL#f?PJoXjb) z7-!KtLO;2n-FFYQYoE0s=1CrjinYmT8p58nO@xA~&>>G~D*E^07#dT%qv0mh!(8ja z=b`}--g99z8-f!}Hdi@kbJyME&c&%Zf!x-yPM(%Y%WUK&yBPnq8>o@!jZ8)67OD)D|5oO&~}Q>dfIZ#QO&xZO4f`Q(~+1?ZgM9iVSo zff?jKmZ^K@Tt=gOLcdDkh2j$!MJy?-u|tdEB!3+0yA2<6eIp`&$w;~%Jm1(dl~V2e z215ooL4e`=kx3T!g{u}Y?_bo+PPtXn_!Jf0ysS_2=Br4c(@etAi}LA-xU!3n*8Pp+D|U>G1s}bnW8_N zcuG=qZBvbDjo-7L03=lmEH0QK+J}jKc4ERO%9Hsp@ex>BhgArGFwDU!j48VAZH*3R z4Y`v4Dd5|pH z8U+{3;bOD#eNOF+@QCjCIBC7Q-F!(p$(0v*WHcpd9*Z>bWqCe!3~f zBH(tp7Oq=8Wfv^F_ASpHiL{zCr_JsYP;;6n&mV=N0s5o!J=g7709G;Gqxmba!|Jq#^KM**CHg73{RdNpfwzNp^#Ku+8^Ve|ml)Tm%ln6&!98&`vxi}$yf$Y)?Q^QE?M#|IpbbOc?wp~AkhYrzV~ZdSu){9xl%Rp zDbBSALa~L8u72#a#Xa`$P79;+)U#~6a;GPQ<=%D9y0}}J(E4g~9{p^<4VJd-Q9dQi zT%AiO%we>&9 zNeE<1QvjSZ?2NdZ+Lb6hv0q^ky`!IvUq{M_*bZnp%nU;rqq~04!1BFDztJNPzd;|a zaFVWv>e^5(6HZ>Vn9oq`5KaMCIn=|r1QLNFndTjnFSGSRgKXd2PIdk1XpQtS&S|fq z&ZQunq%rc3$%{e8piQ&fi|%GSc0OFfCRC_XrWmZYGuN36lIJ#zsowu|=oVt1>C)Ke zgQEiOG4+z>ipl){g~e|m$pqzzHT^-_k^41a!8M?&O91;carY+rEp%N99WN01WbVk| zt9!(O6F6+;IYFcRk5p<@8VU>gbS#AP@;;f!0XtGo#IS)G<5iR6gOZign4WdBZ=U0q zh4sAT999^lAGa)ZxOXCEF3X`Z(j!sp-o_nePCm#N-HNP>eO@@de>a|g18*vb14(jt z#FWOtWK^GZcCmYp;O>U0&=58#S4VNBd=tSZQv4prNH*@o0cBp;uOI#PLQjeEQJ~;H zTdmpIKi%(4LSK1DZGXD3LgxZKb44DNiGNhAavrES#z6a>*<9}YE$^QlJ=&!S{zSUSdJ zWLlga(@!UzV-qmGpO2|8LJQ=8uzGEJzY~bi z^?|Y`bAf4;RuhsEikJb$7+no~^?nmF)Z|4Ab#vhtPp7``k07UP#z4J5{wM2Byu!Gm zx7RxUS2&VPyM7)`-)pST_@jLIt`~;S{Zy2`*Q?&g;ci#jw_V>i{$Tx&o5gMYx5!WS zk*$mDRmWK~xf1@O4td`PNB65O#U<}H9KPqh-m9-)(suH8A)Q2IcOy_^Hf|GWvD$A2E)t5KFOH zmDXBCe5ZdvKFqKfWY|hrGe;oErocormYWFde$xYl?ytDWd(OZSau*#uOgYzHe}7Vp z&8LKq^ua)MnGC7$c>w9B_EvqvZmp&exWRHZ19qd7Lo*}Sl<1j&Nkx~82^v|y;MQVC zMT8|AANTFp-~K)x_O3{gRw?`5m*I7YyBSHDw4fg97iDK67c45RbR$WIT=2YlLIEb4 zU8IbC`83|J36ao{`*S=h*!w zr6|S`mo&)L{IW=*+)I`H-pX%vCnBp%4^$&*gtB;9z{wga_f;F#i8LB|-f$Bh zsW^!&k$wsQw7!RP07Oicl=%XnWNAT^d}Sn*zH)(ay_B!}V#r%g2BRYey75?XEB3LU z=Cym}>qFSX|HgS+vAX?{6ZF-o?`x9=rR#it%e=C1rfhTbeTRZ=b}pGc7BwhS3Is){ zaS`Y<@>gfaGQL+P$MrysKAMd@S6> z2!&Cr7EIyJ#f#xUovXTId9za6vn3QD@?Z`GV$f80yrg=-1x(c_(uBMY?N?NHz;L&E z0eEAD1C4n$@Kq0hGjNl91Nh`a`H_d&u5gU+lt;Hop}CY%-C?zz&+MO!4b~kc{9pS! zl&u<%?{kNpX*28n6*2Er|D(c}fV4Ks?&vX6A+dqviL8G^A5^Sa2|9z;9;B?g<0Iu_ zBA6fG{l}%5Pp|3QqH5e_FVcmn0XA!Z9+tD^58Qjk?JPdAO)fE8LAP6x>!-Z-XGL4Ac2b9+`kd^mC*Z1Cz*?0GwXD^`#66V3QtvgY-mrv^%kbJ5& za6-{scV1$K$e7U|eja-OihF870FGxqmR|eObwsOa419;ET4-)WaK??}XcZ!!;-`KC1%@#{};8o~DZO9AV*X(>MMPB(N@M;=r83N~QsznA>K zYtz|8fK_S?{bp~T6A@I5@EPs*EQ20wHLM3#F-2dQ7e7=Fg~jDg1YC}AfypY;9m(}? ze8%PS8LeC~HLg^__I>XA zK$UP2>m}afH0P2zuce@_M40Q$cOR+~qEU7jzn5B_Vb+-ckTtD@fT%d~i5HJkQMpHy z5*fj|?w7Du5dCp-47f!1OD!(E0?Da2Mb8)<DW>Iu=!NrC1S-rr1PeKN zy%dx&m1>BeZ`rYnewve$rRtd9Ny9+_0IHd7{9=_XH&qGo9v36D=;{#72_o?z^ARQ_ z8cdc-=u#!C0fpX|aggI(I}X;VMwk*rH$_zQM=`c-{6Cf31!ueg`hU+SB%->ke8DT_^CYJ^ZSYXm7 zap(nS3Fx~0-oXAHg2WX(BFBy&qHo^of=>DHF6yv40NK?E_I;Y@z0ncP>2bpr5Nr5@2FJaCf)BG=?0IknGL812F1dIADH{i5TF`g-lqE=nCH`0-K|kB;TA`g*F$6lG z?lR_<*;HaF`q1517R!MjFPSu}Z2L9on|?`n?p*CgYhkmI#?ZNZ{qjO>zIo0hI0_w3KE7PA=A+AwLabGZe?UN{myfA9oXoB}k>8|*A^Qh! zNn~5jECC8j>TF>*%T|Rfx0_xf*s@QGuOps7{ENcWHQm1Q;P)=!ZY-B%3w=S21Br~m zhM6rQ6IMn2Z+WnXTT%3r-ci7u`PswPFZtv?@`r}@uf3L#c~g`@t?~`?d*{`YI`x_6 zMYMq$+RC_$Eo3eM%WC#;HK)+Vft0zI%Ev$b&SuIqV`@8mHZArF46c*hp>i#duKF0S zv(-5}7Gq5|+{r|_;0GU%pEX{|UMGW;;j9J!*{8Wp;05vilmSS=kQp(s(};wOPg5a} zsbSDPL+&cXi$nOEyGxrr#+w$DoH50w(`gz5Q-zMJZD7vc;;=zw7Qk5ZNo9B(8dXr8 zQ-quCt5>-SaXWuS4Yr#wW+1VpcePLjMlvI79AP}T*tcY+tmrG`o&Y>TLEpe^Ho8I$ z7>V|(85;qXh0)N@7i?S_TvfY&k*OM}V~+o-4LbKW)0|hc6tDLmNMgf+r(INbG9nOA>=O3=fltK+pF72zWx;WzZ)Kap!u98^>uJ$5p>KUOLRe+gQa5# z*fAdTY#X()OET;RUk3@_KhR`{Cl`9OXN_9;k6BXZcP%--wC_5I8;;IcFb7M#-B_fV zds0|g%t~~GP-PgghHJ_-Eg^oOxq7l#C<}CiN)-PT*7cv^O~N_=O=x zQRNNPPx&(Cjo?SN`boAwWA5@QjiWUE$WIxpu{zBS2nL~oy@xQ!!1#;dKHgp6)MF~TiAHE8a_svfl@B4MLrbg)R z`m%m?I2)f^iBlSy#&&cNHs1{6s)N1uD4xtJ&=zn-Fq|)8xzd~?N3SlhF0xIZh%1^E zpR8^f*R-fm+l8yZ4nELG(p}q{Wv#KPyL!(q6Bc2^YpVmuut~8`9W~4VXkD-l%2sYj^UOG>e}Ja%?rV zd1Qm{BH?p@6*2FDObS1h3diajz<@7}avCck$42_FzFy$31nKn) zpYC?D)_CZTrc}DRSndpCBoUPb3b7peNml}Ih>o(Cfk>}hk1Q0ZW~Zmd&7CRZ!n@ai zlhNo$h93?MY3RTbwZ)-Lqq#`7nBB>bM zPWBna`;s6xvxTFBuD;ACPr`=s2G1p*FneR3p_pR{3Q930Lt;uD>=9dtNOBSLQ&xDe zgQ7E@(Q|0UltHXS_{f-hm1xu%d4yd94eR86epyr&^M1Jqilr{9TK%;uGqlkSjJfn7 z5~hx}2b)QkmhN?;kp#s`5oog?P8E(R5i1*b&RgV+0-t1q1*H(XfX`Fp2of5hN-Zvq zLi#3l0?0{X@@v?>)}z2Z(E*$!tA+?ql_^NG^QVDB=!Yu>oiIc&ShNG%LQS8j3 z(A#7jdkt9=h|@fRb1*s|JC~SzOmYZ7#CW+6-01=cs|4R`yU+~K2DuSJd-=R~6%>e9 zVLB1=u(RmVl>N+O_S(QET)jxKi`etx4WvbQaekAfnIt7p;`XEK6HvCDQ%ZkRFV?+v zL~;EJk6S3``I8pY&31lMfA0R_7`nqWhu7U8UG*)%BtRcDSuFop^oc9-oYt*e3WD%< zEt332X#hkJpjZlC9ZNhrjM_~b<2rQBOhm*8MZAo&-^9h*Fs2sY7bHpryfb0j5Uq9dj6qHDa3O zvh559AlE+T>xX_JcsPhGEFBNN^y5Nxk*~A!ildn*I!84|(vm)&;rqbpV|K%ERvb+x3(=j)NTS@a)DW{TYlu6aBp3zqg zw8^_uO#-j6kkgv=pVEQ1>f{%?-uyfpl+hd-gL?NQs&2ks1pPWSw;aMJm5Qm`4)W>0IbAg0arybWv6Th{THum5CNGURN{wzylf>U^;6H2Q zrRyT5EB#6av@jYhd!%oJWJXVwBFt82kL>hPVPMyEyXq|3RyGkch2htWxnNgMFXrpr zj_-Ao1Q6{TSG>v5Uqx;mPtz(y09IOAVA9g#*wKaGma{CPDTo=x6bcb@ZO%iZxf{!c zt(uQDQ-RUQL(Q-qc=0@$pn?YN*F3$G#uTMM^t1>?0Ydlmp60GE+gJyqOZ>I)YnXxY z#nb7qN<~c%nJ;f|&Lk}WDIp6PWzuss-K=Z>J13yxFQ zr{8sEV+DHizVw|UlRIz8;Q2+v5rd0`G~9KgWiA9)sKSt~;ChBFS7~R_BAhh9u#rh* z?d8a=cazfSY4YQZKV&~Tx#nj3GWZ;2g6x`bm`eNCTJ?7-hjwXN9<5k_T`CCDBa@xY z-}KYe>`APPy;II94-T?i4TQi6AUtlOA;TF;b9(}1tg;8{t*|KWI$Vshu1NdQV&>kY zFo$jz_9%pW=d>XA!edJQd^h#hqC8}34*v$&%&9GMwjPwmi4k%pCA^itP9~N2HhX5a zLs$C@8Egdpjw3HU=#Ki-rGd2^`9B2kFB;e)M^%Wu;SFmI&YbN#i`>pwA8*brK0 zh-6OOO@0nz4Ui8mcu4ksx}f$jj6HtlIwB;hO3EMojvBv)K(rNaJ+aAl2A8eKz?w2; zKk>I(hMO7=(#4%)LN(9zaoR4u!z|bCquL7`=R31jM`2Aw;w1_*)z62XM_^Va?OC9{ zSGAqb8vi_Ij`oeuFI0(LxqliT9Lk`cd1pd@o#5m)egokv@GWo7Q4|50uL@IJhIKK6 zcWMk+9VClgtc!^cVXCN^nZw2|A}$~!Gayp)u$*?V*zGr*Mq`Q`^d);TMjdzv6ZU^N zC~o)5s4Q(7_|ecCA03%ipo_1b5%olSjdyP|&n&E7v*Y|Sk()b+&W8($%aV+pnGh=| zBJa)W9IA163n+CEE^C;l!(wyKf>%$Yp+OTe~Tw2-L`LjwrTQWJ=0%*MR zQ&*g)Ojfp+PVqijAVSqrunOYLx=Ss0M;58@oY%0^$)609VluNh!Z`)Hgr67ksI)gV zqNlk7)Mj5wUE9xGaXn19K^^y99v&^ubyZ1j#%{hS|EZMRXD(n^?y+%Jalz>?(3b*;qfljW`vI9%^BWdcj!3( zAlYFHJA>Udd^&NYq>Ja@`4}+*C+BYOtx+QgeZ2aXkTGc(`G}{h)y;JL9kq8KGCStK zUtR*$9Sl|Bai#mz0oZ{LU4+QJq&@PC8Ux(Dy62l#m^uR12#o{^`s>7KiqyqW@YzTI zq(5*(7sR?w?-VYYTmK9BDse{70qK>cH8L8}(lWP8=pDbSuePb`tDeeb(wPVB=La=n zrdlIGw@&s>(LXa1K9P*|na7;*uuuG#7S5&{J(v2Qvb|9Tl<%zA=^0@wL67+aQq-Ba zi|K9S#oMA+{|!9S@UPee26_R36J%eHhb@mshWjL+XMLdfxgynXdgCNAYOZG$`od$2 zwRuL(P`o9HGImXs7}geZ6_e%~v5*NGou5*WqS0zXF*T$>-+7G&l02VZw6)#REH5L`p2 z<$`>!$u-n4lswJ~_pEoO6H8`DHM8$w_1?2+dbjU(uhNll`B8&80)v|Ud@V~!-~x=l zV)H3815_ynA#x-9wCXft^OUul<}!kW{Ne1TL^iP66A4 z!4${Jp@I+4NKj#dC{Nb!nOp7un1?{JPtB)vvXt2x=!!c!t=! z3wB!~R&Y6VR09&d!FxlC=$PcuwE9ilo{tVSxx>Te^XfU~IN1DJXK6+3k?5|+i>UGs z)`{S6w+El2{)IYuC5u+^^xSGOsNPYo&1|(p)lTP4lWS4D(HASyx!P~(^4<_oY1Iw^ zAKsbxrIOQOPM)csU#(Kz4$tySNzi|xS`d^50vG%{-{XDNx`^S7m&QnntWfW*DSV^@ zW@GqK*8*Cswd!ZzL6R3Znv-JcR$@yGh^5|NKNMj+pY_+|lBIax^pnL`eEn`n!Is!yY|9V!U~ z-ju$ow8-Sx{Zg0#Hn;)GR2oER%2rj@)ozazHQjE0m7(v$x3jEiz?$T9RIC%-OmZ!^tm-arPi69@c=FsL6}zE z@K7t4M$3^O2>v+|JMV_X#EQ3ags_Jb~PvS%Dr!lVgdIruKcZT!JVD(Kg|&>*>BSJ_UEs{C;4odS1AZ! zli)@F14<>VpRDwf`h(%n5dk;q^Gm(#M`^NDSv+XB&YE+fT^!RRvnX%dCSKoL<3Zw| zzW0sm4ypAwt_M-9^F(GUp-tctS5ylGtfhpk_~ zTRZ74FY%S2_X+4L)XN5Zm1MHebC=d_3ySL4oCC32mnB9HC~$ux)F)cR&Zq(g0phsZ zKP2}#?=E0l_{iuPb~0Io>7RNJucId|N0$rw)r&nZD^eQTnnnauj1i7)ieSo~9-YbY zndyX1bRcPyiS`wG)gqdMO|fADrtRr5`vpL+Wk=b9+$ai%2% zSaV;u7$V2b1!?EWuJYy0%|5Tg10_pzwvl(}6rFv->#WivQgP>C2kUZFM8MZ5$fI|Y z%mir{n{TI7yS)%0<*LgB9Cp<%=lSbsOyS6i23hwZJ&Ln@nBU8RpTsKSCu5MUTNtsa zkK8G`cLwR^K5<%R0k$WHT%S%FC3iC4|5PwCm@Hay{7+TqzpFLdH z;}ghSmxqdHWg-BjyQp|EQaM4*Z6H& z*6}1UfUWf-VGy5I#CJ$jCz}+H%~hhj_+~D6V-o)dyXM&~vic?rOiOW8Mm5@ts}Vi~ zPk?Gd5i9dAQO=?SvMXj71NJCMi&l+bFB>{o1$jF{vwCssF|5c(y>OYoqs3<6`q^%F zYE??$_L0TRw)Z>uo|*(3g9o?M*jeN2Q7Q5QG?;o>Xa|}jB#BwO2a?Sz;K(*w7Hmcr zwEi5t7o&HNVG7Y)0`)FglPi41w-1HzVeAnoCWTAY%80GC)%XuPJv=uALBC5|4KV=Y zA9~53{VOm;*J=IHIi?2DES&n-R-o*I+AOtOX1ktJB?QaRsN+A@pf!eJ5g z#u>*lnsDCHi_sqgD_5H(JlmidkBR-i({T~Vrd9jz4j+W0$OJC8eyd*mX{aRp9|HQ< zuX>!{q;BD#ztvBA?}NS_x!?aNdN;GcJYqTT9n%Lxalaq!d4=jk6Z%f0p3^eTgG{UW zDLRYjOKRGAT{ODnWCkW13+R<((hJ*g9QYQPmbGN^TgdUwyFfu6o&wH0IFsGvL7#nZ zhmH_fi(v^LKI~NdAnPr^Tzp|QGUyBAvga8P&JJp<=3os?Ya<-9z%N;#UN=lG z+;H9LL4?j-!e_b^&|X=bbv!fwMSBkd3{dXvKf>=g{V>ZR?uC*8xHeI>NBb8gU2h5p z$4#(H$h>Rdkz!hS=9fFOUKH8chuHq6uPBe8Z$FTf5d(`3Cd`ca=n{7apQ*Y`T^6Wt zU4DNy-Il6 zOF#bk8b%hW7kN65a3_v~kY`L+dW?MCA-2VsHN& zN$@0AtMta*kPq28>DfM)7?dCOEjz3c-9r9*7HzQj?_up^uwN|T2L2a|`+L70!&(F| z?|)$N>3ri#FxjlK?8hI7VgCGu^SdmBps=}mW#Y7nTjvk$)WNzoT@XF-qi~cw!NF2{ zFpmK$N-#sdyo+c~Qy6Iy4f?RGlZ=G2g-feb#3x6Ipq)JCTFojU=t?m5cebc$c@D;! z2Hv$nxJ=ItGtKsx)A*JD&ag?KHo?F=@$hNB$pOW5P1CcYLvcz=xLRnwGElj8LFyiBYCsG2dDstUHje zuKLbUF0DAgx1YXfRzDG334G2P)y0b9Kk8;Foj-_F`~g1iZ=~?76GJ@J_$J6~@(9QT-BJ8!KYt#4HA9} z40f_Tov#gO!h6pBPDLL|xfwL}kT%bRUXE{AuHQGjd}#P}VPx`%mI&kQVG6Ir3WLnO z=)M24KwtLy+g33lgl^2Db;(krO6_U2%Ft6?HY1`0swOO{4UNu{_Z*pu`t5FQ0piLf zS*5ez#0XwQi!i4p+7|?mWMK2ffz9~w5zb@1_|1Y_=((gl1{Y;mQgLjuq~w#<6#%M+ zrUm$MY^K@X){S$d4~Id;IGMdvF%*~y9FVy2=Uc7T=gq8HrQPOc)Fu|@(_fse6Q{qe zGxKs6huPW&SiBl<<=W#nb@1*BT+RadVn9npN@)_Wb(naj!oDNq2^9?86B2q$+8I2zFBhWxUv#&iBTGTk#&jPC@}gHE3SkE5p5y)QB8W! z#e~FmvkzIX-`~IDM*o2W z80wV=uY%h_I^j9(6B;Ts!4jL9TtM~Ify*aj4@{iEp+uqWNgxkm=!L2G#c0GfpEcvr z0PnNkht6>H1^Eb4~Knq3Y1~s>4?^=Fw|BxnQ-+Uv7otLtx zYA4F6kB-X-Vq2Tw&PL|b>Txbl@plS^dNr(S5uitplCqE+^qi}2xqCrN^h@U{Av|tm zVuj@aN^bmB<@oaX+dgO)v>JKZSYn;(M zEUTA4xXIT@r*s>k@`kybK@5>D5gsCd2kDCf-=iXdEfFQ({7D0-ZiIouhi}>*)Ga_{ zKIu4itgC+L9V#WcWm5tp43wWWo{03!Al$9E)$1ZvitJBk{c?Bk;@2fj%FRn0_Nfp7 zKbBlNCXU6UGA_U4s8p4=I;dnwN!S;knCLH z+(-qLJxI|83tG8|311;FGuWz71@4-|b)ho`9KBcM3;B(BeP|jw#9W$ObEit&3XboV z-9T$?{ot{}8E!MI#&yvu!naRRcy+HVD~#r(IW9OD z3Lh2*jKx<^RDh2~iec6bNR*pkC@fV2$@?j(7egDUnx)n7+|D0>nA{v?g%P$7&$uaY z%T6MMNEtXbc{t}hoBBTvl>}v{1R?5n?CcljS;f-x)ecZ7Bk1=2eZdq0=K8>SF|QCh>nY5QY+a!7MHCjcFqtM2)ua6ihn zRGucNeLXM^tms6JMgg8kRQIw-j#b;&)3**)0x&l|!akq#-_1Y=LW-(_Yf#nu%Elt6 zU*S+gcpna%{yoG@yzob-ENOw6Z|B)7^PTZb;9m!(jL=xIz+_hAQpLRTEXy%wqET~x zUk01X=-yJ1nzFupB2i5hcUU~?KhO09kP3&an35+5z!(nXWzI9c%q7#xgsxY-x$s6Mx)13gUSuBe%HYs z?-`JN@G+6IzzUG-N!DVEX3+$uK@2Twp*$2Hq&Hfu=UBR4+MwA#XvHlHI-(1>0_61{ChXgGV*Z@{VM{>l;{+~B*&H@dsW_8@8_!Z)j3cLOuv@10 zW=!_L14AvHN5dq5SAcUEi4w$<4N^L=9oWx27snU7Nr*i1!xe!tXh$)$Z%<*zVR~b5 z>JMKm9kNWUL(X6RK1=(d*0-Q@BfOrrl=eX%Pw8h`jb4-vP{~dari1!myAi7)O zWJNsow^5m+J)z~dP%O4+c+v!O!JsKSr3%ST4aZL3liuE5FtlhyGMFY%}8NFUyBnD28~=acMkRZB)aH`yd2i?9(nM0ypqJnR{aT_EYhj zZYaJo0amKtV*)zd<~c&|Z!^9%-SQyYg4m9AqTpA!LI*%gQo);p~5 zuw!Ib_H28?L;OmiAF9-cd6$7RlMWP8C)IpK>DN_HzlGw)%Lv6>FENn)N=*;s`Aa!|vqIw-J!l{V$tTBee?=8@x@0*O9WutL|58$Ski{;Ywq^$rfN>(I zck6lgY6Q6vGqfjC@4};sVW_HZ8+aYYi%<&Xs)hVsNW7!D8@Y&w8w=$n5eFHeCG-|7w}!fP}mkcXXhOS)TmttzpeL38;bNDU1aS5fNY-1*M)2+k{)w z93q9CQG@;RzAwUq#b!(^nOq>SG%YH(R!X&AT2;_N8|5I_8pI>y+kgvpV)3rY!O4EJ z)haUnpM6n|W1nIoCatk7r}4pTLewZoaQp?JHh)=_%EMzUU^+pU{=HW1;7b0YqjPx66V( zo>f!R@8!Nc-c9{_hm5RY85t`{CGQ4sm>4UB@mf%ODpi7bzO1;&{k*Vvd#yTo*`1yw zV16<LE_xcZncO5?zV8t$*I6Y@_rs$0|jAs2Fvkc;=)xShuK>eO%0ZQ7*j!VnP zK-V+-(IW}8$~T%b65<3W$BTWydeXWeTrB57GwDP@?Vnn45cexb$3n8SB69;o7tQ5H zkZd+0``z@$!M5rk*9FLZHi$LWxJ;~a`1dS>Y#%N#Fh0PKy!{nC@B5hokBT(wq8JLG)vVcSVsveaZ*-rg*h!*qX%sL|FrZ{u%b^ zoalrgNm*-Mc4-Lo2wo}g;*u(os@ZrSXPZ6_zFH3q1t?fEsGJe*$$#Ga!e(Z+Za4aT z2x{o0nG;>__zbtK#k(xa$W3LM{JQ3ORQ(XPh3D622-dexKUEHud7NTkP2^k4`)WG4 z2KLCR{#WKPL7nnr!4ZD$AFRMm{u~eN@=2Tu7bc1$-K#39tem-1BtIz!eI9qlNwk265QZySjM4pEF z;6=6I?kfs77F~Z!?|QSX2v!H8j8GTk!>*0~KdQbtEVFlQJ8QCSyC&PVjj3m{?V9YG zY#UFun{3;*J=NFV`~AK9{f_m=`uASzxbBPRd0t35+Kw+YMySy-9KHj)FSwpmhAN z(E>-b-ff31k|ix^;%OsKyqXv#7)&dalpSXgE&BEd*&QJs{!|iH=SGMOnot#J9p_dH z##F73?8i!Pg$ zXQLTws)V?n8sVlUn5FF^em(2GUO|R6)nP+EK`(jeF_aQ+98Kzi)xp19J|~sZzx<0gYERXqaQ_j)x0*9;V{M z#XH}UT*GoL6Z3ZV2wmknA*)UzA^jsdWG3}HJrtO0;6O)+m%`fM`w+grz-+ z&g)(8xnigjdxQU-zjL$lUnX3CE8qB!2@`{UxlS@+LVhvNt5JT*bNaUkSuq$eAeU>z3W9@ zVY{9_X7}FxJMb?E?_-qE*X=O-bH9h?VaN>mCcFEdVqD#P@U|n@LL*O;{W8)q@SVIL zj_kw@s97OQC@Dl0XbnBXIT)+*jp8{*u>pi<#NjvCfGkwFkXbQ5|LB=ee7@}9MxXNi z7`iK5pEo*RcQU!Fqb{}Bk0*}iR?BxD$srD>9LrbLdhWLyA_+J7;h(9e z-*NVLO5i&_=T9a&{;9KjkP2KeUG+X>V$ZV?j%;^H>!w4{8cXAt550yf41d;w?bXox z@VoOd(045I?{#Bg$ZuQ{jK4O?hOj^zv94mtL`7S=Pw$0g!~&YhVmNbD5wACD`912; z-WJT~9q5NqU)x4`AMa$M?CFyF-QKS25+u(7Lphq7uME;g!=z7%t<7EY@HviCzBk*% ze?vN?h=3sFXyB_h&3%Kc%5i&+?w-T1gDi7ilS=|@-l>!#38k|(i-Mh@W-e$sHR1qXo-mhLqh-(saf zJkGc*9_1suPmqL_rH8QiF1r(4T+~B%0 zbX^tDt8@K~V$lS5Ok>gEa}9E!Q-vcF)%p9ePjsfEZ5u-Pg3psBkh>5W3qUZ!?K@(o z-H`B8CelwmWL)wk#&>3QyBl3t) zsDfUfycvHt^lVHxutm5DNb{3H+@zf_XvIjA9FP24<|Gt4+O!=m)rJE}hk4tD>-3kv zEpQ5>=429?rhLG>yDj~R$xHI zzWv=F7fnDSAgxIp=gV#IkIkT8N`!|Ib-mXta6-ZDt~8XOn?QMR7BZ}Jp^XW4h{5KC zK|MnQK^;!>=v{wK0{Inn?082_49L<4v0JK*eppz(e0)UQcIT|DW(@uk1r@3gUZy%i zbjOr<^Q>e_m`LmQehgG5_gM9w2BSXcli2&HH=N5L4;Yi};WkA-N)Qz;m3U5^$^jSg zfrNS3VYPyV3Q@2UT(97?_b!9*1+x|`&fnK6$-Jj?$!<>=VOCjK=pCx3@@}H6B_81Z z{JWO&H0R5(;Ao5hQXca$1BijW9pe7Hoy#GpmH8;fL97fQt41UU})OHe++EpW~ z`Pc{?;wpnl&EQ7rSB+Ar6zP-{qdA+?`?$3cu=-1Chdn(>;)!HMEGz#7Dg5sPR0b39 z+6eV-QAXIZds;Dz?&}=Lxaxty3y)%s55dxzqWO?t>=wR zfM)h)uD@!plxRO6s1C7hJJn={By(ja_D`R_J3d{t=)Y%^5_$*0QMcOP2>lkPa99c_{7va(`mre*bKtWvDy(%Di?w{syK@c$i_4@J+^~KAw1P_lAMK87XP|^CTPP_byFTK~ z-zWi(*o_8^2dGkP74e``oa4iO8kR&^P0@t5c33YIZ>5p!7w+xga6xLBa2Jj4B#N=r zp|uz3_k+OSGTX#7DF#$UFELIr+?;Ak*MQOw-AE$^As;xZP-FS4(ZGMS%j3KO$kb&2 zN+sM*%3VMRitgS1ZF#`m4ET0pR`dlyF<=aE-*O^*8i8(&FSbIa^7>FgSe@OZZU8C34CBHiZ~nTLQ-%epuPM2a&KwnY`>j`Q zxjjw@?Q#wVj6$_$_j6BN=lG~6ZJRyXkU}!s+PNp&xoD4%kFiU+^qdD5(T&VB3;mN} zVKTR$Gk>EoD^eut`;F|{s_+P;%K84c$FNP1@HHmFp&VUCaV}gFdD5kL*_V7SlpTGqtsRHs za+m^+Gw^xnwr1;n-<_kV8%fn5>2-bU9>^{d74@c$|fVT(UWk{5k)&nWF|(O z-Z!Pf3G$)uNoV&yM;2Y(Z=I>mFPigrp7yz?1QYy1se^SM22$OU`V9YmP|YtOeZFq} zUBYH?(0EI4jY3prNmq}t7VQW6@CtF`?uu8TR0Sz>l}Swjg*=~ZrMKlWs5#l2#?4z6 zmaT%K2Dpt8*(@qEHB)G81rQOV;C?WI`b&wIXl5E!bFV}A9f2gSA3KLTW=8+!0cN#S z>ot8pQg>gqi)viD8jzAZ`Uun0P8gw%ZBcUu73Kit!otkhsedZe9SLS~1DnsOB;bm$zB&(9w&JZ!Y1`q5 zmo5TxBRRrJ+i$B^qPj&se>u}f;1NiAPvh?CCY@RzTW`o-BkP{;UxZ-hj|>thS`&O8 zb*M2l78(T|JnFOc3hPJYK47NCkw4%$z&&)(Rdm}sT9LsY6LowgKwNP9>DSu&)MS$L zC8qJ;s?6O7RS3gBgn&weT7~23Z67i_Xl=hvO|s>t&&e?6}CF0Om*^~3`M7%mD!-8xf{hui%TB6Xr-*ez33ND7D zFFqn^Qu2%9^Ccl4&P62<|KxS_tI$-$-Pv5<6({NlXMK z8NXq&nVad{CvcR}mk19N{1Yg^eeYP{Zed>An#-0sowQ*^+QWH)Fd|7Kz#}e6f0f{M zaW!v$0n&W>S%eU@`|MfoRtvV-JJ#H}h8zP`;i?M*!u~F{B8lG$e)3;e4#)^7MP0RiOxje05<^-kc-Dd38(dPF zliQ?EtQXp32IdoKozP$Yb2>wxcj`J3Ie@Vb)dd}x_J>!~({|?x;yRISuUbKtxTKhC zfD$`aE@N40;drJkj1%7#ae^ES9NGwY+J}==`i*r7y z2puiXElke6Z_8iJzBMI4P7MZeNnI-rhzG{_WeAE4}`?a*vwA?w~-l5aB zPL0Sr0ag!tB^TGG&1f8MJUb(VDDb^q7^1<{pi?)32(nJssDc}tk=)vBnM2+T4JPjI zc#ZVj*I%jxwnAW&0~YAN2UQWeoxDB9^Km$tsWK)eNAgn@ev$jSe#ml`%xLhmrZNW0 z?7rG}kcB&?Ku!4FHzl?p)|}MY9j3QQvDjtZ=PhBF?Bnh~ge3-Io%D>eRF{a8ay7RF zUk`Ag=)iiX$18Yx>7!C3XE~ddVf%jivR4Z4ocKIqBbUPtj8VCT2c_@-xTMNS6Oimo z@!AhA$0rbrXa_s%XJqr}EYN$l@5D@R6nSqKzb-U#;Aq84UPKMOg1W@h`w-<5OCPkhPpysu*fp$7cK_fD_s{+2Xe*iN)q z;eK1^nr&_MxSZh$j7rQf!p)ce|IpC56h;aQp4?c;wZL(#p}Z)H9W%PLxlO=BVudr^ zDJkD^wErxM+bO(L9phWRe9?&jo{;On)5dEC*6 zp^cU5TSQaRhOPU!6;UT6^n^ilW}l^Dc1q|={;+}4Tf{iZ;$G`zPICEDqgVQcji;Xq z7!CBiba>&^KXDC64ob97D{;keAWD(qaW!=WZQKgq5}4dG#c5C+VjeAjP&X=xP&DLC zQ-YVOE>z6s6ZtLLd|w&ILwh8#97UQ#*BFr2@`N_v`OfJtSh;W-cT|S;sI%{UeDAR} zL~UydE>TpP3o5p=pxSGWR{-VuNM?AeR_i3E5|VVovr6LLug9a7^+n!{RRFUEg)2~K z*&=6}SK(f_tV?F*yw9#cUZA#X=8lU18A8$eQnzw91Q}+xl-w3oTH(IvKe)Mht$PS;$wPwlw$5JwZlBC<|5hd7iVg0VqGZJZgv z!w6WxJdk=0X1F{fx({%Ux~~G~%5R%3eepF$)E{;{+0PyH$5C81xl0xjx@7-vL{kPk z1qZ;>TrpvhQgpZeuyP8l(c$*AdBpJA?;2fS;aRaXROaLw>)O4U>(oMflY!-z&_4or z1{}o+ky!Juz~P;_Gv!d93VtLE+PO7j5Fq57G|vEdlRkz{5XDYQ?75u@kXtaSDv9<`gGlCk z0zesBR790ChX-AhCjw+p_QW%|&*A%hEAYCvwyccDi~OiXi)50&f9YxShEjj=%{wfs zP**P$&I5nY=dVvB3+$C9K~3K#GKU=W3HxQz$kam@JxPOIwLzpx-rYTb)VsMqw;%QsX#cVwu)X7$p1$8=B-c?^~joD7kHDRew;}L{G<|twUJHW9WGRR0P6_HndYw2LL;Zw5ZN0Rf3ND9@fg@z7>f|cF*Rra_6PbpIT$PgcdX!S(g0H*DgM2bDx;252i!mmyRjXRHDU?NH zy-CIy@&RD^qW`8HO+zz96rrde49+IAEob4kJxTzZ)nET1++N7VA|g1`i3tZJ(j z5x&^;8Ri3qBj9(XmH8KuW_ySXloK4+|EWz$gD~z1-e!SXq^xJ71LluhfT`gDD$zAl zq%G<1fR{sj)Y1qi#QqDgY`5fuyH#$OVwd8XCwZxbn~b}Qu;D!2=436y;lP15=enzs z2YCh8A%S}IY}e(1E?xs!CdZmH_3Y@~O=7IBjW3m4Jzm9TqOYFMdLhIvKZjGn$#LFg z-p#hM6?~NpgSV$3k?+FGTnKVbIch#|9!`cOdUTzY3>4(L9$mD-v(GDBL*&}yv1Lgl!o&rOu!;xPfwSVGqbw0d zeabf%{@RaQ|DBtya?!~coVIV`QO`YMLQ>yC$D0acS0`F89Yk%5?Cvi_P38yl@QLvW z`~Mc3Uo0iKFKmyE*b}svpoO4PH%rMQo8Uf1x%UZ8IS#-YL4tR}mUi9vc>3*nCZVRI z137)aV=-Ja_h?^0Twi?10IZ0VxWR8ahG%>Xw>g{S;b3&3=9`lo+CbI9Wr)CAJ_;g- zV)Ii0VX_IhCdl?Iw{qv8Z_GvLD|C?_1LS&@vElH*WRc3-;tHT_BeJVh>s%@%8?0-INLzcGkbowrD z@P<)!l_qyoE(PV!4epgNfRJ>Um+CGIdb3hQ9pl(2XoQ9o}&9g!QvJ z>tH?+ABsAN?sS9Rd-m@T+bR`jkR3hy%gf-%-bXR8XMYxdO5u^b{8_ESIB&*+&RGYU zBndUp1okX7Qyxomkv8qMgTsG77nn8Zrszs;HO#BN2|~egJqc=4Y=I1>RXsxBw!zLw zC=JYi%hRU1EuC;8gqLO>$cMg4C~1!;bj#x=(!f0GC!JC7dx1Gh5{2jcR!JjQv~|84 zJ$CoruTE``^xa=Q>xdKpTA*w@kMOw@*?)Z_!C$F*gp%FV3hQwKx1eM|t`lBLO<>{r zv^q0WI8$1WSYE3%Z6V@zA%{ApR`KC+)nK8%_^E?xNW;2j(Oa6Q=QZbP_j4e!Hzs?3;DRlCTpi}}))OceYs%)%Ba zIm}5Uu*LF2jw)k?Z0_wJc=W&Cky1TJwSa7xy$1=xP`>O9t!u2XeTl|x4726>3AmLJ z&5sOmLjJ+7Ut0)mq5`MT8fLx*+D1I*jq~5>C4^7tkA3AswL!}UzQE0XO--)fw~tWa z0v6G6Nt;#a&VLxqa1Z5`BVqh-MpxjwALGw_6Ft~|!y3Ig8t-!K5{>dy#7ci;HP4yZ z7awGiqDN#3yWE?J;Ygr)ySbJ$}N64OXzZJ9WTIM6{apzdN;YvQW z%;8f=uDBnkrk@%^2@$|C(GsyJ%a3~(LWyALc+G(`p+Cid(7b_A-219VeA!Tqgl7tX z5P(g|Y3^Wd$ASqt8PJl10eM8-n&$@r=Wh$;o32Ur?#mvorDv1$@7e9iD0oGztq}^~ zP1#w`P@8JY&+{%=nP}F7I=%s@G!zjB(?7>!j$Rj+advW!L(lXATx|VPk&qr^^YgaY zuhLVV(5i}KrNPW(d)|Fn_}%oRIIxACuv#5|Jfv`5e8vj}A(YRrwY z2<`ru0pmu%3_m94Bxqp!H5e?y?RjsT_f>P+uTagl>M)pG2jF4{hOu!z-gW!{-ft$= zsWN-^X=RvGh7K1D2nLpqVLL=oUodZO1S+(&i_Ir_>|HYw?x|Pa!E2X>?Q&dU#A{Xx z_cP{V%cp21G{tAl0P3CAF~BAmeRFvGxI>&I5@e1^n^*QG&%C|{J^vy7|C{sK3Ndds zN=@5563B}*SdUco>DSlgXjhBu`-a%`%^CBFyBHyLRg>@S_1-V*(;m#4qi=7bYFOxo z-VXKRS(iv=yJ|bqi+! zJ&ALZuD~MANAUfU6`0Kw?Jllw7AHQN(+S=tH*vD8{iPRaseyaq^G^<1MB#5Bb-<+X()Vm3E^?C( z&!}qy=IH8jAkAqB-5ht`Hc%1)za0x3kDV=w>{86xfkxlbg&>q*)ffNeZTlrAz(_yP}b@39Hhdu0r&i{TuC9I>z!dk#6b|MA0 z8CHaCX=rX9(;FaxD#4)<%W77=mhBnU-hW~^ek?v9g`$|EM-zW=hDmL->w?k@DOmP< zYZqZFo00xykU`*_JB{?Bobv$0i{_JvZFf!WrwPq2c97mEL&{~-G=$0E>VVHY;$Ty? z7MIDadRKV9l&14`G$T=~#h!35aOO(q=IH#t^tzT*h{A4$qnJLd3?FMO$uATfGA>u+ zeO^05f=&-~9s2%Zlm=6*qK`Aqii$y_9FF$lV)Aev8&Q|n^)a-%M7dFZP}_Z;m;v?O zba_8L{rH~L9Hm`Rq8ISez0!xGgfk!fev2K;q?^v)Y{8R2zeHqG(R}*iiM=_YoJ@rg zmgJu-awF0IalyR8J#Yidv@9`qolI$mM7qbTWn|G_E*y~#TM!CF09S>US{iM)`Cz?>lTU(nXqw0Y4Z`i zJfF#*UMB1uhjTO?I)E|G7zb0G(d)p570@i7oxj-644F|w^p*pW!Of+ltKh8nucaJVHXil)e8RHW~ z*JjLH2R&E|n^EeD=ndC7fq1%~4gG5>?7g{RyytqDS(a%rA`zJIDmO%NjPqk-9UX=W zhSJdGrf=b#D(5WAfoZM&TYYCc)&rFdhGMhBVK0Z1HvggN29tN!Etf&*0W?vi#!xrz z_S~LrIDTI1b$j#3cSxTb&SPd}O^^Pkek7iEM87Xh2Dj(kqUwJEAO1E_*!$InJ^6+~ z2~q5T-^)|WBKRXCbTibsR-~+xHvi(zDfavY_d5iWEN~xc5#$GXqMEx4;bRx!@44Z^ zHI|tJ48}8L;AfyKZ_FoPG{%6D&?F;`Wt=Da0fF_r#vt_+&M z?<8bI&;A*ytMBl<1C#MnSFeBL1Z2^wMWE{WLYN6W8xi!t*)cOzpkj_NqJBMToh?9?DFWUi~Zq)H|aKzkoS4b25S!0_r?8 zcFudfPb446BALic9e3lN*Y0C)C)6YM+i-(8=Ghh7q`q;>Pt{h#)frH5CW=pcrr`Va zo9wio4>WTOzMXj7Y~NG;Z+zTlm+CQFsQO95M$4td2ie2zi`?~ShWcK*!zF^xYE8v8 z%lx<|-|h8bts!{w!!RE9Fs!tM5wUSqr<`kIeCepbX8?cs@DD~cSL6*N3d5z=78%gPEbMO>-(1lUzS^l> zSx5T6*yxtGvS$B5)pVf1mLkD&bTkLCfbyhOEyBbi@TuR6`9<@Ony{PiX4P-u7%357 zfsHV0%Ik{|d6!OMMt9Om+}$mdrl!UYm=|f_4TNotQ?TN@epgIbK{LGFY$A=uWaFSn z3>!ngFKq5|uaXr{-0_42{_xHC}EkT0*PG_;4&M(7qX^5A`MYXY9h>Qb*k8 znuK)vw=yepWPk~1T&Rl)5y&a&Q$f!A(3aIUFq33n%P~!Xsf{N@_%(dxS zp|+pE;4?j}z!m&DJ@Pb99LYcuHebEuWlqqlIde4=!@ZZ<)&FZ-Iuu6e4^YI3Q+Zcz z_US(0j~F@aksu@&o6NJvaC|n~+g>{H@)Cy-PCB|j&^aG5dP|P)WyKOXQd$~YhQWP` z(q!>JixHDNTexFI*_!CbX?7m}DlhkS?LOTdvt4l-o%U{-OBsw` zFn)$bcoyppbS~A$+F8O}>9xc9dmb@rpW6T1tAd~k1uP5T=Mf*|anp#6mg6E#8S=$cqV%;&^z$RHj8pX^X~$M{i9Bs2YpI9<}-NA;wd?L?kn^g6AX&9^T^|Dq*6#v5e{2> z;!cCux_oVd6#HjvT9?~ZAj~f zU@*`Pe=mxL_y6@9nmN=!fbP-7UX0X%`sa8avjulO4%BD)akL9*LgGY2qEK{{oaZl- zIq`@R#(E9TNHOF1C*c9ny56DhN9|2lE<-zlf)Kg+EKaYjT~qPA4GWh+RsF(RuF+RB=|K<2COtWQm%z1x?JR0X=;nX;kP)!D zE0`p+HjIPrO3yU&(}#Fw+j|_ta3T%vhowid`83}|(EgB{17RzAoFz{Dm*XJ^ElA!K zv~{?eYM++Ry~=6dNx$gM2p2%lsTPiwh+dk*Di9zH{?&F^Y}KeU|LF>%q;Qlfl`1Tq zw^J`fJCOXH%~tuvw-OaYH3-_^~k{f0HA{Y^Q=HGun-( zdBuP@JI+Grd?A^Ow#nbdIxrhYRhG%pzugSvbG{PXj}O8jYKdv_=T}*TR}r{9XO6M( z^L75C#`Tq034sZecw;i|!Zt(06x|)VmJm6~cEy-Q#@6!1ke(r|5&hoWrXDZIsr>Sw zgUN@`CfDC=NP_t|Kr_AGe9r0kRL|~kVAydA`g2NJ@Rv%ngxAJbSAPuK>@EN5zltqt z0nUz?ThxMbX(I67lev2;nbfW8sJ00M3`EUVL)(_ulM_CSpC=ZTTbikLp+9pk=t#`& z#HFXKl^cM21|FI~@sFIpbAFFgTMLsVzW<5Vf7QM=AIQTc*}w;QmbrpZvQ>6Wl5*Bc zcMx3~FXVYgDd$EI+_QF0^HRlXzN2tw#wdlsqc9mKjodI_fh$-<`C9BC3zzc6BSG@H z@rnuSZC9pfyip=4g+QVg{47w|ED>+XtS~maA`Y27tNI?)_S1a$z1CZe`GBeV2k}?} z(&_d#GkPDhnlz6<@3!hFL3}${pz7C#KYWwT$ns>Li0sL$wvJsP4?*eqf3yH*bKDHT zXkWejPw*yw+_T*Yq`2GTC35naq|E=F!#?paeZaV(?< z*swi~`bQVyNfgAaRzC1Y4a{x@6rjNRrx4<)(TLh6VA+SS+auie9VoDX82V=JZ{;(M zIwE>bN!q}V^VxMMSWL8Zu+8BB4Z$`m4jrG3a1?*u2R?#GW`!l~lTP`a)es@@&91?T zyqsqxn|li*;UIV#vmW2BLj+9-e;?|&`v6{Rg9iymt`baUps74FfJSWTRwV%AJ5uE~ zWqLh$Y%XqrxJq&yn_5~hd%Jv4zh#zxkq)vOH?2ZuCWUPDUys?z!EI8EHedr(xK4wz zE;g<=IG~CpSSow-ywysBf?wdQCaL)bTBVOL0i}9D?N!`g3Li`C3sW%$xnp|hx)%jl z=Kk;O+5I^>X;!r=5jrOQemVY=3`)DI8KH!XwVjsmwr^-*To&|V8jGi zCZ-OSzo`(YOd;B?dtpZrHc3^c36;tzom}Ci^dt&9W$Dp%`%at5bC3F8?0I=K1>(|1 zqh`+94oZ$wwu%ft@Q=6v%9pbc`9%AEQC zRcs%c!P4&jE=orO%w1-sG9tlEIXWyCHj;mZ2RJX}^GR|+C&~cu2@3Z~QJCKO0I*$_ zXeS-y0eDINZOYJOJ)k|0q^~0!yoR=W_EPh%;E|J6fZqykp-Me~)?5V%ikC{46BL+7 zoQNqoH7`t1PppXP5o6R8((Ry_V znK@K9v=K+j(Tp0eqZ7A66fVZC1LU2d~WOpY>jCe%X(-JfC4T&ap zXe>*$w77mRU2FaltJNlINUp$7(g0838{2M%j>>;?6!$U+@8ZUv=XAh_mz_I=PEjiO z94}04OB36r^SQB4%oWK**5Ld11C>rR4HEPqEqCQDJk8GK%0zG8-l?9-yJvnb%prkZ9~BfqurJf?rd5q{3o z;AO?phWwRpKI(MKi@9Gcd_EmQRg)Z9t=v>W+&L4hypR7B8Oct|O%#duW zCh4zh5IasX`mN+$9$I2UaA!9%wx1hxbtf~=xSZb3i97KSoCTELU4yj>{&~`0lDgem zgrFR}zI->STfrg>5&<}{hiwikyEuUk0?u#T$JHS;I=6LTazou1sK`Ofr~A*)*pS!c z#XH_S$5X*YKl$0*+Ogq3{2n*YCF>Y?uXI_aR43UrH}dSJ&VMEpOC(jAP+zb zqnh^klbrSXVnB4KPWiGzXfZtoeuCq1P^XhFkY^NTm~d`bKiX_w^3GSW)H{ZG5dM98 z94W<1QWZCq(2)3f>0_rMA(2@>wYe2u|F~-PtTEN}@>k;WndA&-RO!f^0F5t+Q`aJJWKgZ5tE~Z*t}JTn4I^#{jl>+ zX(9i*qJ@3$Sr@U-N@|A(-CnJyUWL@Bq`Vi)dEk9`vjaXr)%dM9fg??wCsZI#H9vmR z1pYhzk0}tAA(nD8TJ3C#cXmXB=f(9uY(r-A{c&XUqKP+Oi;|aXOs0klU)`H`NPpXv zQ_{AX@Wh}Q#BY*qWEja!mJMjJxo+`+5rW40OZJf2C0bKlEAAOLR(o8UUe?X$077th&ZJl|x@>lF!`9y;kL! z!bv=>|1XV_0Jh^c9vx>MiU|a z-AArUq^-s!{SCiMlvKn3e#@kTc)I3f)TYSzJ8mf1Kap1DZm0ngKh9Z``0UY9R)wyI zOXDgnv0UsM6q;a$!aeg9d>VpBy??}|i$Wc#7O6Pl4Z;un0_Y`s;|b+)`@%Gy;8Yx4 zY9HzWtdWh5%zFvd$1kxQ{)jIN?S`rB8$?ByW@_uRrtOa}-3iJkIHX>ru;=!8>V+Jt zOB`4z+z+`!U?K;US18}#Dm!igxCv%*@=OxF;wMW;)4ER&z~NXR`a?_a~f{WE1iCQ`7S$u)bdR=Xg>+Xem@b%n4Bs z)tO49gPlmT@`{h~y+qNrQ_BvjdNc>4;duBfV49XeFC_%fM$uz1*hK{%3@^Sw58b#o zpWzGQmb`gyX?_3DHCcE*gJyQUI{UsqN5u=#WuILt3ND8Yer2VH`*~!0G-4USlWt_( zPc65aiLYbnDLMZuRvL6-w+B!8*wU#!;I1q{?<{vnDKxR6929tF>MBlpoHE}pqtZ@? zkhDdN)BH0hm&zG$!bykwm{Fj_kIimpKjZ5vY@=L%Syqgw5IcGjcv6xN=VWxN=j^Q;lwQd6K`BYSy0;x*D=T!OBT$7=1h5htd3A{I*12` z0DDIRnz2<28a-9eF3lqD$Ef#_C;}T#JEV0~8!f75xuz069OVZIE80`x6Zu)X!W0^C zhDd?BfXQ1^sa)hX&E%eR9-fkVAQwSUq(9wf_pI|p;8mw%561Ie9JowEb#GZF#cksI zbsp0bMrwV|um3s!IA{O?9OG!J<2N`whRS>mkH27|;tS_LH?6aNrR^05Ydfo;MCGk1 zRk5*n?>o^r6H%lQZ8U_nOZlo4Jw4Jg!ilHxuJ(+E%F|rS zN91!LSce{N)AOG#VW?>(sRwxAm&qQYg$=m+@BIZ z36KhCucisscnyHJY5UaFS5Al2^gCZcnSPQEnXh`C?s5-2;#+AZ60qU=a9ZH_edp|7 zxgt(U&O%5BE;PBiu|cb_9JA5t)DL*JxMQ>JE%u*4zco8wCh%*5>27pT+n_zt6CHF3 z%a{GZyl|*^pQayG?)hk{G^jX^^!FZu>~Ln``$+u4^x?w_>!c}8+QJ|n3HRMWO~Rev zY*k{hdNxfI}2p&=s?@|Zo&ZBaR2O_kwbjY4o%xon=I0KHz|t0 z5QObRTn<}#*+nwsgwB{jGn#etl9tLrIxd(AWeo$W+IY9#o8wBM40!dDfJ|iw*V1C; zv~l5?XE}}||NOlc>XZFp5;Q*fkofEw;yn-gW<+@Rx&&}wnSc1@-Koy_tej9d=4q2n zGWh#8l!7;8dLgV14ht4{p%n!1&oGb9)V_Xn^WL%hkeX}TJ1Z5%X0gp1l-q6g1^6&c+%zpG&Vqx#P5}!Yr=dkc(|G zM7+Z}H^Iq_7#oJ?n&8hH4-Q!wA`iO8`5WjCSzQ%&CR$U&p=!Ka0K}|>m)!R=RjO<* zkg6@`*46hc^^Rz(enZ#%l#=|N&3du!lIdK5`Irc>d<`L6R%#=#YRKiI^zuz4;kDW7 zBBeE7nS^M}C0Nt^0?!_`mD>|J3Z2MOK-yODkpG}IeL**e*y^r$^|`zI=L1xUi4Vlo zX#16iZ4=6_Q`4bx&ihg#YkS34EMJU-aq3!%^R#9h+I4vqW=2Fvuqb7;A}^)oU6c}s zkbB$8b*Ocgi$2U9>~e*qcT@^LVD^I0%lD$nsr2{id^pM=q#gbkaNKninV)=6FmH#3 zSK~I|*^_WGD443HSW^S!5}8Gq4t5JaB&%lndj{SkQBMeZ%?s}DB?O}qh{Grs`EMr3 zn3*8%eN=4Xi3F}zB?RCZRR0L{*1R#Qd6VE!D4%}k$~%Z75PW*^#(g3FumY{M=)Vbz5>cO+m*dL!Q5eJt|W%a~nm=I|}f)884TJ;2?M8ppg}IHVRXY zz_6;I<<6})usIb)q~hNHp`5A2w^aQTzfOG~6*?pHZ?tfqzzW`PgmAe7kcW#5$?bCD z+#|7vAdcLmH}eXU_KVUDExKDDqGgSui&J5mutTGSj+G4>=onJ`9g;dU@o#+awFL|QfglDE;Is%rc!LVLcyWq+pk1Z#wICUdz@hf!81-|yr~W1=f*ea}f}&p@#Pf5g!~wb1^fSMGHsAYDr_i$1|pt>AwkWcKZ$qbPF@^F_$);CXa^LU>q$+ z^2B_9Wf*LGJoXqMv|Whz``H|6Bx;7+pI3}zPG)Kt>$M;`1iN>wJG9ambXhuXm+Nq3 zdCoNCTw3tbkp~op?9XTIgb(fRD;un^P!{G@(PBM zLxB@ROKSf0;dv|&+2RHlm%7#6XSA+Xy?t`W5W2Vjwl}5t%0TPBQi6Ic_^t#_P!AX} zp5mzkB3o-20X6?9aS)rA#rPCmozopdO?I)?Aqul*%ptvXxlG(rN5o}c<6qA z7(w~=hz@7)n+O9%y+HvVQUg!#zj-EexIa4aQCu$Ad_h*zcb;`RW8|Vq|0u>X(+K+D zLRITkY?XZ}73Yb{NRM1>pJHrtcuz%TLHP*lL8Yd2MpY0<8%O_-hgulwHY(via|W%a zq`t&|9ihl^h70*C4}D}4K8Wxd8P=)N(@QOJdg`x1oRt%K-cV);-%NHM ziN?eH6K!d>$VE{grT$<;Oj2y|GVRePM2=z^m}g!N2ZsumPmvWr;_7?;IGSlH!DO15kMn+ z>YbQBlsVR9+Bc?FvlsF;wLfSpYcr5XdNE(hFlZyXUCSX*Kd9JDh^VDc{s+AfTPIVg*=k;eF$mzs- zHOrcD=-#~WIVy@OZCny2)6_{K&v42TVa;Vz62K+LzIlw3&~}g1o;4okL_S=&f(D5B z&~W!9jbKP3c`5Y?4Q|=&YjvyFFC)K4MaeJR(`~0lk~X(v>#`9pF}s&dW}1WiKc>Ed zE6%LxHn;?LcXt{I?(Q`1BzWT%+}(q_ySoPq+PG_Q_uv5nTxQ;xx!)h?XRSVUPVL%z zS5>0QrL9({Qp#qJjuXre{)y1a_qKNJ#NP6ys+4o|Ca=+No>BhLV9`(x$&Xa&4a+G` zs$O*jt(hzF*fSc*bc@?UR@L#8r{DJsvmU7(m+6HHHdGw~0O#L>vv&?2#s7!>o5e-2 znj+Zllh?Vu@*u43Miz;P+s{akU}AMb1$iLYoTwrsMIo#kInU#6o$Jb37oxCy+Cc}A zG23OkC^>HHZz;Y-1Zz4+&k`YJ8T}G{JU$A`(D%vRW08o+d;vbxkdzbfRdCFNce*SN zrT&w1v?^uPvF}p>`S&)ulirBZA*dylo~D6(5~JT|KSb>Pn5HV7cahsD9{7Q}`VW*e z7ZEuXg=OqL{DiSsoTCP{T2}0`JR?FsM;1Y@rmmxS1R`2MqLuM*9LmJ6asK)4;G-sJ z@1}@X{c-!mz&t%X;YD(JDpY1%;v3sRYC^4szGRDJm+y0N2sTMh$PFbqKL@V1=&^gj zYNTE~pnIMPgq}UOg~A_oHZApzj9tcH#J{?Z7fQ@p017HkI&4O*jAtG+VK-j8DTF6@ z?Vs>?hcWQ_o(;@EpNrn7873UoqTqIxaR$RsJect}3)R5$NB1HW5Qf=A(pbrx;o097 zwlF@SvMLyTIXC(%nip`m3}M1*a~NqYmQRQBm%I)&H(s9-0j^U?=TSF=CUIF9yWEC^ zcddq%p+IB{F(^0{RMgNXPffy(GlJ^ej>SIBVxhIML#?GluqO1`6Da?6xpp z(7Pqfq}^WCl3x;ix&J0%pqxt#Wkhr{pH=n8_ipwbG}ryM-bEG^3MA^W!L&lf^-w;I zBsa&QSZr8cDG^4cTwS;zd>z9T%gyWJA|GANP&2gk$_{wJgVw-4nshRls18LRNIeNr zHLG}6DW4jz$|H{>a&$=JjUWnDMU<9Q9$5RXS0fu|C*R|o(fpox{P;(h4ddpI`$u*h z!Qz*V<7FOCVVs)lsgU>B7>4P>uGPOc=mD2yI>2kgQ%wKk8@~7j(_uE-lQJ(82x81T!~MpDcF(F7ow>IaV{ejLfF%s*^Wg znX?eRpYJ=4ag~9={TeQX0K(|;yfj^sqw%`;2V#a`@sU3zfVAWe+Y!%IVCVZ}>6;B_ z_&VwOBbU*cbM6171-j5hgdJ78TR)X~$A%uKp-L|Eyp zqfsPE098vW@O6b|1&f>^${!Cd{J~^Z>_WeptMZs^m4ayZnaE`nCE@p!qeTn>PPs}f zwon--ZRbR>1B8sK`~a61c`8+`IIAZ@(1{_JJ&`H7IBj_okkV4l$W9n|?K~AltL5?8 zm}T_<6fE^CLYBzHE0kWSc*P_vN_Q6P75WGYi!^u*SLD~`cjxO*oEyO4S>kQ8{2`13 zDlZhp29P4P0}6NrNY>FLp;!!XrPc^D#lcvMy1W7WW=Bx zC5+6c<#)A|TbraS%_q(}MdY3Ot;6O`3|70j4P8YZ zK@qQC(Bl9_I?u4Pp2K!whml4s>iSyC+-aI=)aN(#*-}f8NK(L ze}a0EzdN#I6~x1p`*yc^>z-ICV+Gp`20FANv~#pB76kD(Bz{AqwrM?QGnUwsW4aQF zWU9F62Fy{si)$6W;)wY<=eOBJN4=b@J1zNE@evn9R$|6N)^GX|$_kBX>9}oWh zIswE?^#VM8w`!3w_uzN44~w2NT2#WJ^V#QuxLt9BzZH05)W)#e35zcRunL`uAzJNX z=!h*V*tF^74xLzsEdr0klvBF%kRlP$f$8d-7yEN`^3zvn$<>!5MFpIwP?I4_i$;IM z&>S||yJb)vV@Ixhtm!{zO58-1$m;Mrt)880>c8MDgq$Yem+!Pc(PIH)QAC@QZw>V4 zX~MeZPoYuntFtpQtx--wikRj=GSgkO`X{MFj%@x#YVHU5zOBNT$6!MGs5e6J~I#h;eYasTBW(N3HN$S55f+52G7gCJ;>Ot##-kWh^^ zH(!*uXxS6xSR)Sm$6tYZNcq>?*z|yRyOxwIOAN%Uo>fk<@w<+(S*hA}1?0fjw zt{$)3bsR{4iKdSqH+1gdy0vWXvYyHZ#cJ3sGzBq{e`!Ljl2O%d56XykIgNWjk$yXB z^dVLZd-^w)w1^<^(bZ}5X0(Xo;pgcTqf!H9$9SmnDrwOiCtPaV&FP%O!Yt&iW*l1QJ6>Oa9c}OW- zPuwkE55NWWWk!!0kRLsLbcL=~Rv;pJ{d4`bc`ROz$GYL8MPupnY-8P=S?)iCOP9PL&Yuu9jT-620w{t{lfu*TNxV$-?WY=dNh zgQfRQO@Mf4zRQ2XR-!Wt>mu5GWwUsa^dngNy#emNE+e>Y7hX^A zxPkNfCsYj2_n*Q zoiYe*d5xm2|ENcv=KY-LF^3z+6cCPhNfs$EE8^xH@t@^D^f1-z_t;oTTJKe^yTu>5 ztX(9b)2Cu6xgf2`?pxI%rGv!C#@I6wsX-ftGbCwgdVOLnT|unbhw1!(1&IJ_e}5dF zYQl2&ft*X%d`o2R;{w-&0*YdDl6c+-Xx9%8Alt-sw0V039IaY3=8IGX#M3;@{=9_% z2IG9jkQv*7s-zh~}kRw3bbWFKyeX+Vxt$`k|=^3jj;vA5gf@C)5|2IVNF86<{J~sq#mA1;>}5k@Bq;Y>k8c zxbpoe9B>LlhVpbvFB4*))+bgj+;I8S;y(hSHsGCz*|12jYpr~_ zeO1j>oE+)7{|C!d2KlFar%5050Absu@IwnmmqAfw2a|Cf8LP4N4IsQ~NZsh@3eb#R z2A`j6R7?6uE_lxhiCf3s2IVpPV>qP98sV9j^eMN{QGey8}~7CknNh z?(UN~44lK2Q{dZq3n72uhgFt0kQ_>!*>5T zODNzAu*Ry>#QH@ON`QT_SV3#zkMyHaBAp~814l(w{9FSh(ZLN#iD1w2^uu#rzh=z~ zm~=Y7k4O}f;e#exylN0aCAl`k`yOXmun<<6#8E3Ot}2?p#!Z0;UaHo5SbV%(K8J`Q z(Q8>?e9tld=KtkI9>Y zZu_`iY7r5>aTIkc9}vY)U84eS^^bBqs=F>s3g%yhFzd60Ldi&ojwN_^THK_+P^y)4Slk_p1AU=ePljVMd;{hzJ;em1thXZ z#M)y}x>nYMenxgd04c3VeU{m1PL}fprMp?o^41x*ybDMc_a1AJ0#MaY$tgR>>*2bb zLf`uTDZXnyKo+zZ^mP|x#7vd@Xd5%n0ocg$YG5k+b+VNM=>jP$HLZ2it7vh9e~9fa zWemPu%dpytB=T4p&6KH~g`}#%V1(lc)6;dRkuEE5a6Zq<<#AT`+B2VYLFy<^fyg71 zU?b-pTg9`+I^9PkS#~!c{)t9Ou@8!LLl=6Zkx3Nza?PS{D|Jk<7Op~8 z6_FyE9rY=*@SPq8!>waM{z;V0y^G>LgcpYn)BR{1b>8=Gdm=LWNS^O8eK9QpPtWhd+`C1za#$<16X zOk2=LV#B95LuU~-(M|BxO-Ih<5~afm8eJ}Its&dM~o0^vnLfp5qi?z6x zBJ1tj-XrSaFrpb;t7r_CS@tMX4tk>wrqU_sl-+tozQTl&`~5GI8S~IS3fa?cWyq2V zuZ&7`in0}$FlaMxtv^ZK?`xQyC!7a+ zV;{IV3cO6%E&oQ$cHdmch4fzg8KnUksLZ=(tnzB~FKNmNA1zOy7b?)n*Phq{H&yg1vakp(mcl;Uzg_7yf^|7}HQd}>|1yEQA zn=cNQpKi>JR@k14h+2jn&|6i?O7MB6AnEsbDo4EoJb;M5q~-grC;p8#7D$HkB;`=z zWO*z}dd2(12CL@!++mEZBo;Ag6D&O<)+R07iBootbu~x1(gdg@$1kiOEe+#Vo^>WM zA;4*9EAhlkUTFc<67jKALsEw>3FOn@d<5A6d7rmcJQ~T&WE#xc_xU!?G8Px|4UH(I zY8Zli_-Y|7ZDcdOALw7c#aVEE=1Jt1<$Use=)EDTRJMCTPBuD z#)AQ3DdYCR3PDWy^JSmC%ub98;Ht6nNTl#jcCb=s%IsB%_Rz~XC2cv#A1^w|S>D20$5LaliXNqA( zQ7Q_Phfb+GdWAiLV}hg0Sxtm?kftkC4SP}a0tN4ShT`r$?n{2GW=SWkBN9H{nTThN(`|AmY6Cf z8zPbeokHJtNTyl4;J7GnW*v6Jzn(;mC@rZIAG(SX_kzzJnwa@bOpDL#rf~1 zUAU@z`+|4%J7;`1%IWd*6-OF61ULvVxMierUoHmk*|^@?nwn46i~c%0&40B%D^GuP z=b5PM1l8$mv0hL;Qm>jy1I&`?;LMG}mD@T^Q7e zPAuU$KN`s~*c;JmM7=-m^NjLNgTO!t=DNDGTPw)arn*aUA!>t5y!QaC+$k|#i8ai>edbwar?O<%F7Ibzf?>a(g%wMxG*hDMG==L=5 z6=;+bEUtxE<%Xlbx^{S8%2@wZ61Gmr>vV{ioK`cS)dVDlwW-rY`?@U*dV)0p z>2=V;o$sCfP?s5#GM>A6Q9jf;O}4kCsb1SK1C;+0DqQJjfho6Me>hIH2eoRkoIQT- z`6q~LplhvufBvrqK!vcaB9u6Di#Qwq@<@#C|BI-YzS4$H@;tY}YR0D3D@Cp}f~iI~ zGu*o;B@1I5MnI9v;!AxS$MO;XUUM+aciB{98K*$$`~#*uXS*d&@7zE>LN-!j>#Vt} zPA{`D(?)N&LY_jDun5^jsvU<7^03k54vl=L$OJBG0+l-^s9g^*PuOcCOC(p> zZz@XIg1y3bjJdgAYGHN4x<9fdtL8@^vqT{&HH9%*s?ur|_i4;MeN9vDcKwxCzRfv$ z6-gHtvnYdcPCq@OV4#yl(HVC!;k<$REJ0D78p@U+F>ucri*f)tQU^KD;lkvb>S9L5 zUJJmu@Q7^Co6r3w>FtCM^>eg`AHR*VwX_AT)pz~Tm!mt*U16TAq#v7)+#}r-dQne_ zi9i$upPhew7w>#>Q#WUxYX3vw* zaLt4Rrlb`Yu4~k0|9Zej&`4H;T?EdIy8yXb?ZOGN1!o(u*Wd;m9WJ9(K=$r_454%J zovvZ_uJXV(K#OHN=Dw1EG4D0`Im^m=%=PeO{=(|N=8H|@nwQB$jf5$ zW>0>UD;60?=Ca)?sYdsM4$%#8cv?a)bg!nT`FKWP+rrf0wKeY4yWiI!TZmF_i| z2pSQG47d4GE^oSXE~nnpH2O4+QS2%NzLE|S@7QCoh92c}<{@!u>z+a1uPrdaPBy=>O>1@<|1?(T3(mkAoHE;0CXiTptu$RpMV5XB`I z7?;B2(c`!(J&M17$|N2$%@d%A%2yv>1=34PiEn+IdCW&! zfzQTi!mG9l<-K7S$J*Ddw0hKET+G86Q6ZCR){)eqH@WrTS_rO25SEG*R(eQo9i;GO4asL3|*AS)ZqpYT+ISNvMLZnWKAs$wo&_xGc~Lsai;nGQ{PGViOjy5ajae3wvb)y_yu1V&ZP^^z+vlds>)pG`=cyl7af6CFl+xj24 zmBs;S7h`s{Qh|DA$PU}gc%KZ4J2S=`uB&h3atgJUYn|?>Z`3pIDa`A-LIjA@zD^HH z`mf;7LXtzd+6ifTECR29{ss|M__y42WYkS32O=`jV*H*G@fSoIYB7 z!oqeEJ74s|vvCxm=lg}%M~PShWVcV2o6yvf=gHDt1c?_fobysvWT{-akLym5JLPB) zO~B4HiGEP=v2(WfFYhi^xY$+s(VmyxpS%~CjW!fE4|36{wBdBF!tOJT8AGmh{V%(y zud|M=sXMWebto}6`2j=%+gyIud<63JN?#dO*Yy_S%@&>S7oC9`_B)z^?(r}H} zdB*sp-}d|89GZ#?QJu*?FSwSJV;hsSPt z95E)+W^6!yOP(;8R^ps9Guj@LK1-p5t^2?xlVaB8bS+ub-;<;0)x^+Eb?$Y;FrCng z9CKz!0iWND+ayF`o?)WGg^1ObxSIFq`P-T~3_t#T_$8@dz&h295`0D0s` z(su$~)A@eU5JEiZWDqWXlMj@c&NW}K$hRzALxzrMLe*=|M^&7Z90PC-#BdqQw=^mB zD4n~)ukm3{GDmnQj$g#5JP3v(PN3*Ia>%;JrHr|=I9b$j;fpTGu$<-YSH8-DB!mqPd} zx{GJHBx%*Xdk--&`91@@q^Zf1U)dG$%-b)YNFrl3YcY8++cn<#%KwS_)KVhX2G;hF zh`+dw%v!egSxRO;hKJ1YaoL{MrG~5Rer?yT!(HpV*^pDv^{>#{<_#}{o(rC%$G7*1SJl~r9BDCOFQ0qeQ&xE32orH%Vp?l(+FS8zOr_-+r1_>`U3qM zqrJ=?DRz{~5|ds#u;RiMARVg$#-=|j;2;>o!}s&T3)HAQGmb)2d~Y}cP(6$QGoqj( z*>Ce#PsQ-}k^1Hz&=yhx8#|^wz7(vXYq-@3Xx*{X>*7DIRYU#=tW4eU8Efb|8uqpOZaqGz+*a+GKL=^EXwTk}9~jJ{#TMAHssL^ET zajlFaot0%j1)BG#5WP2ysAB)&5%seIfUkyZdaHlH$=+gR1dvGWqlxV1Mlc#xniE8) z-u8DjOL^uv=X!DcSJ8fjuN&vh{(|rN7ADD{0yi+Es;5rSx`$PkV3h)@i*sim>`bJGhWNX(Ng- zsOK76{DTj>_zW$l^r1I_g}zdu)aXi4bP4!iZ=9VFz?-H1OrJlI*^obwFXVA;WymoN zF|=(%^ZC&R@({;)o43#AtbwRPfYFCLvvt-0pa2f62(hKdb#4N7{M64fw)-iLYk-eJ z-@na?d3E@g;wwh>jlA}YZjg3>Id7A>84^F|g5bc`I4w3}2?Zb-ayMiO|`>ef+V z`(mZP&$U+Kv(qkg)~fYO`Z7 ziIS4%2O#458AB9Kw}LfalxCi*P(1CF4Tn{!ELP3it(&DXpEMcl6c3cmP3^b6>1W@} zDNXBGrsgM^KGD`ny?f?ZQ1T!qTOjV9b2RdK_k6$r@N}`ukByFI(-+Ntk_+yttLX9K zOi|h&hQg!EQvp$B53vNfu`|zu@75YJTh;!TFxGM3r<5!~bGIAHTLamPm&*@5n=W(S z$q1=IIkL5Pl!s~|#&yY6sMkJo5B)|{f7kWnP!QFEh+pEXzXxN=t#q$J2mB1h(X^gy zVwNfoW>9aIY{=td6Kw)VUMrPZ&FKByy?qG>?#ka|!vx8{>CEFSkm!wqC7Z6yu-S^2 zB4>do?qTzO*tEoczUU@5OSk_}f^+0~T#~Mci)CPpAlMQyA85(-$=NUUWn-|@Vr2a? ztx`O+wm{j0Z4IfdM|@)o{CweiPWUn$aZ)YOkJPL0qLBa^nyq?l29;MsWJ0q`PuYjk zW7jp=^y`i*nMHNR)wX@&DX}n|hF_?(x4OpmreCb%dXq&(yso#} zKN6|gF3OrUjO2f#pl;AQy~#vUcug@(4py!Sf}%&UC4I#v6uHz2!mzhbjV`T@t;8>V z&Enk7JrB*gGX?DD!R-YRKg9*N;c(#-@;GFeW=1(F2e~&9&JUP?rG&^y9TbMeHP+7e z%N4O3JLmnsz~9@@?$tPN525s`4W%EP`rgJFUcPCzEW%&(-Tj#s^6jwjd!>6{YH~8< z+rl(_H{wkIIsQ8UCcNW{`R4DoMbB;lk3C@WJX6I$K& z^Vf+h_h?TQk4QJTcs@uOL{&(V-Rx|@3OwM)P$@7WFvhK}VZ@R#M4k)HoM5@QM;w;} zVkWhC&I(Ce6-m;0gs45u>USjz9%MmW;)Hq}dw|d6G>*3Zq44xoNp)C0x7gP}`sXbq z#Rj0dfAV_dUAU#fD3E6c(jz2xGT0P8wzME+Fnsmc!qy(u8URq>YcfsGQe9_pHMzBc zc^-<$DRGauVd3~H0v7eo5GrYl79M!NM`2qYTQ$@V&0!1b8THy_b;oFnbI?VbFUrd1fyi<_fSm^wi zp5}rxNb~%T^8PzI57@M@!{KmFi0oO7q~Ce#({3ohz7^2qz-Ry9G-80nwdsq5P0_;@ zRs^DPTm-+=y^nOFSEPqHLT|0t`E#(D_A*Y~=$10k{atK=3FY^O`ErYc1o+AsUC|Z% zRE6Bp-B|mryro}T@|*!SW2##cmz~c~@!uK;8{+uh7K1CJN=LFGhqND1xZF9ArfM^a zq5;PMoBjI(P8bG+tKi~;RO9(QN<;0@4S=hy-$r1sC}Rxg-$uxfP9SBZpOd zGAoG{NR+jouCrbvU&l{_{Y@2v!#ZUoI!=k9k<{$s6KFkD`EAsAudpUOU;dED! zAdb6tr(dV??!hLlH)ge<7|TL0o%;3@ddu2(dEjy!0!WoRdjihMs=lww(+sf%ZVuzhjTE*9O(bf0eEagBkci5MSC2vkD6 z38Xs}Qs=lPIu~rvo0nZ@qV_>!PVGpr%8hYf9TH|VxP=Ui_~dS6L@ueNQxKOay1Nvx z*xm~P7JA48^n&8bhcYM_Y2_6EJcjMrQ5vI(;c7U8v9y+pEiC7R()AL-b*p6%`RB3X zEZc`2(+4`LqlVT-x$~(5*31w&c)F+)RTzFm(&TU{I6$ZPc@0V|8O);-;Rc;u!drV0 zNL2M9iv6TBuNQ{&=krR}P3`~64>R%JbB`tqe{={G=(K*=>2GQ^{=b{8w74ydK3}pA z49!ZC%1|XtUKMTqgubJMn~oZO2s%@0h_jq3_7~vIYMN3u&Wz^}^#SG1AG?+}o)W7Z z-VrA{*Qt-|I49A-!}>sVrgf7>Z4_+!O4I}CKJmHdhSJHxBqcMHKiW4S(76<*D#9}I z{wNao|5qIo!s2%?p8f!W2K7e}9E$H~mO?d|)nY6~=$&Xh*Sg&rK1fUF1eIeAGnDe-KN+PyC+>&Lp-0*j4}F;!9Gw&^~-K`wK?-&a~x z&5waL=H{8j!mE@HK4{;N)NvGox_nsT>-9b*;1JwbBgEvCd85b?M<|^47tV+3j+QdX zB2S_>n5EwE7kq6GoVJ=Q%}$-fc0REMeYt~p{=9N#HDQB5t1g6&6-`UObPbKm=^&B4 zl;JXO%lkh3?V4FSt)bEM%gpls1?u+#`z>dT>>%`eo61;mkW@;#qb3kiS`GC%@?>gM ziDE6{!~qpH-XzGmn9|Y*Y-|LMr!NkvUP5?M=@BGSMl@GLzHDji)MxQ#?YGppp^w^C zeqWV*iScu6r^d?(U$-extbL8#DNM1_#{G}epI%%(_ufi0pNRgXTd|o){UggigM$C- zz1>QJFVj9a7r28fqgFY%%P4$z6{YN^KpDw7mlL8tw{cU~XJp(Wr_WGrkev+E9<1JppQ5q2(?EUz(x(s==m zUI-R$2_rAcqdr=3LH=*;ge#^^r<86(uM`XVKpZtHBF9*#1>ZbIfb5Bcp&Fmf(#=z|n%g!zyyG(ya_r5p{Z)^wZ!k$f zWr+V?e6)N4oo(Hr^1x1Cw~=O1M2WBl-0@_>34HXKV^>^Np%YdpGR$k1v@_*0=}?uE zv*B)pY^o_zjqf5o-@-4huM3)ymlm7cGp^XvYx!hJJDFJCA=#H-2u;+%P%*MxRT6?n z|0xD6&`lfjb>&QrhpOhz_$NUONS;n&R?L~jimOWVwT-pE#A4}Mp|-jL=xiat%M6mi79i%D%S@^onl?E>?D>hN!L^G28lRUi0*h2?=9_x+a55O z55M#}XCCpO$34wj0Xcl_r}igPXH_7t_ZQOsv;B;P`46~dmW8r}d`qQEc?|!OJ{6AC zWt26guidPlG&u?cs^1BUQbRF84V;s3ZZq=qk6V(N**m6AuJZeXfmqkGpZg=d=mfpOe(E z&ypLZR?_3cdFH`PTQAks#D=s?qp;-R6v2~9o%NU*mTXFtL7r^5dmlYYhaVgQHI@T# z5~x#&S8=;Su{>S9gTIj4uxR8$|6JA&&7W}~x+qU720C^IP+m$__R~B#sqkfesC^rG zM|U3}&dZaF=d4M0sScg-zZLM%@Kpya@IOnH@)ndTC?CT+-SZd(SX0NZKoRLryclbP znIfuh>^gk;NLpBJ@=DRDZY*ovXgY&18=o6AwHu*%N|Vl|OHMs;*AeLhYp20xZ||*c z|LekKp@pp2rfUh?w}~Ez=@zUM@AQmZtsR~)ocA0nPFSP74KJ7$DhVs3hm=e|>Td2+ zai|ScEBX|jd5^Oy?$Uuc9<(hQm2dAXD#9m$#j>u?VxgD4S8SHzp%Wv{H$y=uwcA;E z$>6nFct5@?{>T0wpr`EsZTew7=+%r83Y$?uE*1nf8CNpU`LmD+&`^ZXoIy2@iUd)?Z}zBcgaazNO{ z#&H9s;{q+gT2w;o`&RtymGdT(Q#NfEjnspLpTd$5#rSn4oSuV0RKmDx${dBASZv??K?4#zu6}^t`p?BAq!S+_QW^@P5FkZzWLfPfm`(N!|2ru)- zTXB3&lU^k3jrc+XdE2%d%lF`VDNDjgc++*q;{@A}-yn%X3zLOYrZzu>u;I_$6y2>o zcwAk@h;S8Tq9Qzu^yVtgbK7oXE^k!^&z=;LPlR>X6pDf24Z{@(_h(nw1|> zr*Wl7NR=cEp}E)VMcn#vO#CG(9c`rH%_asTc3%u4_+~cDoL~SS)%Vz+&qVmp=?U`K z`Vb(zS^l>{pzQ=+=2Lkh%|<@ofiAgSTnm4T4x!H1<1-E|s@M#y;+$w)i8qNt_AI&T zmq{}LK|3oPX?FDPn3C!mRyY*8naB5GRK9VqOJI1*b*0Z~q@la_kQTc#p^kCK;JioW z!_W^90ZPPL4V3doeK+1LqkAJWO5vWhF>_K{=PrcgCHi2b* zTcUV?5w@mWa-KvOVF!_)69I8F^0_38*|a4zdN{~~>L+=9|FcO-(fUGteL{@2t6vXL#Or>1+TC&ySifcZPo`W!`dkL~`NRpa~J zM{;+zT~V8&DUIQ@{ZP}Ur!HszxxfqEA{S4&jY$z8K0%vm|90Mx);CslL(o!)pC@gIkh67W zx3gBE$kOsdHKzWV!{@5nJzLvme*+D5Y*YOob1byVT^k}lWnfZwD^3eu9vGOPJ_5MK z$%W=vE`m#{6nXPqx(%ZO*@pgbJXQ%7!!9OD&GY3$JFy&CvZ-U%irAL!?^8Ijo<~Br z>MFXg>V3cHauGUCNC=7u2S6&3^dt0Vo=|R=bkGyRaBHYI9t-_#Qhpc9sU)99XjPxU z+w-A(P0|MzF+KGB7NoWh)9Cri2WhCE^fW_PZ_P{WFIl9|`kbPf=q;7v!*q_WyInY} z9#VH(Lg!92*$+%NtoA~)wB*ynxmJBDIX!Vuko^%}9%*js!NnP)O9_E8qLZ4#>ggF3LE_Q(sF18N@5l~+es+N@^WyG= z*7Nzq(cWdXW2q{!gEe0JDJ8)nD<%CSq%td-t+=aySg}DVk+1VO>Wr)eP$|YcgL@?s71$iVAnsJb%k7rbC2y4>9iydQUn{TP?65wU&7m&p`;$%jd538ENmHPkYDV&@yE3Z6)kf%RtarlRY6x$b67jstWsWk$?y#lt z)&(rsiirU5uc;|pj^`7kz^d@f=`cFI>UFjIJ}}^U>+$uk6tv|;M#g(xh>M5;I8^C~ zkJCmdnHB@c)ghwK9if&Vg%jXFV+7}&_H8BiqUVa$ME+=BjNyy?P7T5V>)!~BIkBnXA>Bo$Yu#Ru`TOF@3VLcK4YuLsA${r&0 z=?!Vn%?)VN?u!xnZge1T%3M-I`VC2$e4QRc^4H0lJ|Umtp^Ya%F&ns z(%m)e*hDG>w%rSqh}DbsWLNlfR3Ge^SF-g^7s(kbfHgYtXGJb4KN{9Ftbv8Hgky;r z++@~-r>0!{2Dz#fzlry$U##a!quI2JQEY)F@m74H!9`?Ha=3h@Eg6(+{uyd(cmd9) zpXkQ={^By;tx0S+ln*189n!FB+2e&4{LE3vx?gG6n&CnMunUO2EO^T>8QNK1sy0ux zd)Axu@fg&s^%@Q9WqLl(_>NKZvrJkq%=0rHDv7DAD37}AAhJx$OnzNB{fNv~Ckm!z z5Hi^OSH$`S&jf%3W?Dn%Xq4x-iJD%1sP=2*enYnw#L*Lr2Exs8o>LAe6gI#!6Dji& zsmd2q>|4QUnon^|7@B6B>hGIi(Pfim0LJa>#{}%9^kc@yvR;aw_lZ@s9`#NS|EJ*M zKtrTs&lu=exF^(Q73(8O!@$%ce911IP{qp}}i5FYdR(ZI#a} zy*0UUQGuesgnQi4>fe1!OlXk!MB{F9?3Tdtk8-1lW#aaSaDUc^MX;eE%1N?0TY~^1 z>4gSJMo+5j&e$Tj)GESQ(xrPG*l(HnR_m6OP8iTgNoAiFN{2!UMha!76kJB0*fU>w z`io!k|B;>ENl`{f%9JW*KrY?WNuYPG8fNBoqjRy<+^Zz#c9_;tVrhXOdcV^>HoJ&` zyTh1Wm0DTkg5iteMU>LTv8NA%{@$5h2)9prQfn-=ZKY6VO=DTOA}&RDS>eO(zXL4f zgZzmUvp2$FTr9`5Wis)UbC=-mHLZNrzERS{3d)m;4^}B2%GCo6u zz09Kf=~N@d;;qEEw7fr}h44@Uz>^RTQz&S{QA)3_vcX#|B^tlqV@Y26r6YPHAO%A#~?(0JK`s1>eBfL4N zD%=31cl(0M*BV34Ew-3n_B${J5r8nt(2_U(@b0ExJmFM?HR9b1x%A+g5S20lucJ6= zQW}AS&s8Nk{XHn7LwnKhHb8XQ(T{bVacKg`3*$7;hWFL`1{Yd%HlJObR z@QK#w4;~tJQC(En>#^Z*WJJ6fW;A*}7I~t2Y&j;ai$d<}|49D7YK-qz&`qxulLaTD zwjz(&^2m9q=i-k1J@F$K=yBqH&l%US(guz;9IC&+F6FS8d zUeBZQf0m69EAuTw3DMKc>hk-posHKXuYZl*{@~AJnOna$x%>NpO(lY0&RR(M9buyB z4{6p&G#^NTZp{2+t|$sq~DF-eh2Vvht8HsP%t3r4pal80?!m{eq@l67HQ=c2_MoH8ZjPZSx>W zDb>oHP4kcBOcHv?9QslQSBCuu7y}f*f2}MfsW; z9Y1uYC=43pfmOY#cAvUHm#4lZ#z?^SNa^KKb&i*cBkBzZ*M;tCU!lKmt8oDOw-}L7 zX?#)wI=QE6vGf}iK$G@x_~gpQhDkgLFWihya!q|f5nU2SBru%QviyT*kNiX`q7uDo zpZ?N8wCJ+KKwh!e@%vm9Me@A8EF_rIF^PINHmaImmfZ-5pTJm$KU3~@UBoA%6~?#amT+f zI{hL&J9G6*L=bVJoZ^~wF}&H!px=A*I)z4LJ8bADw>*e|ZTe+dBrNPAd_a`cNZzk>hA(>t(d7A;M~ zv2Al=+va3q+nLz5o!qhQWMbR4ZQJ&jbI$vGzhLic@71fTx~r?zV@+7>TmrdHFqtPH z8WjRGY40=R67&Ann@oz&Yfcu!Gd)nF>uAU?w~k6yc`(hE7vt+3XLvv#(Wk`?ygczTC5tLiP{_A~F7C(<>RPF3TXR1W zhBOJ|wi2X?GVzM@Sn-M&qwuNAXd1KDY^v&8Wtq@&t11Ty;u&L2c-(~#D|JV}AN_5$ zmUCI>91dxMvEDZB+86kGnw3*N51{Yk~?;f>@7zj8&S7s^n3rz^JH+ZM0Sxq63q$9>4J@6n4>PDc=T5xkA0u zl4aC;2X%L+_u;>d-vWsL0gcooxfME#tGY%?$~I3wUGHPT5J~Fwa@Dws3PtpPtGobs|rES=*Mc|GI<_-Vhw#Yx=egB|9g+^a1-^= z`=n5Q!i5aIi=Nu5a&zWE{H%tW6y%0Zih>3p00y~}WaV3!j_|}1h9~ZwW0U+26D7aS zH-g@QNMp|!eyNQC?=?9^GmWN`EM~kygGllGv+qsZ zBCd6&6qlB+MqQ)!kV4cL(?JB#{mrRs^>UG{PH%Dw43?n;R*>gRpiAYn9C=cMXE;Bg z;%Q=~v^!trxBW-J=YKFix3Ol7J4tS=D?Y$H*C=M(yIlwB z=%4d7tITR2-vz$?i@8$SK>@Zwtj75jO7aJWlvY1Os8SwWs;-d>EG~# zHybJobhM)9oaWVBz1DXZctQ~Ylm9&8$5zW(ne|JK+FMIj!m2VgMDw2|PbC4XCMOH0 zzN)j4m886~OYS$`5B~vzA0?dsL}%a^1?x&f?By z;Vga>3TJ^~nYv#%hWFBKs*Nn&YfAfHpZ}q^`YvD(AExmJ;|0~hNG)=%I4-1{%^(0@ z<*JnF8iF6oh~zng$b_WTk}9pBH-yeO=Hd}n652%lt(4(u?s!Tx!CixqSy<<3EOgpd zQXM53qy6vC5TotIG?=doQb+U)yTGVV^2bUKJTDA)&aN?&ce)PI61R4=X7n?kvMbg0 z;m;0$zIIc_@$i4pg*Gl&Lo#3GgB2BOBN>Ld$*dI{Pg5p$miHiVXzq1AeX>-mU)vMj ztTK@O0=gj_kA!lHU&{T4W7fX%)QWRY3#!<1nkn5D3xWlGi5?#$T8$M4L{t3kpK*8* zm8RYxO)ks@FN*(10_@1a8q6;hj1IWsD$D~Ql1o7Q~vZY)fvNf#|frQc78vy?)!}PL+Z!l zPqz~rE&$*YZsjUA9~p2h!)8KsnkEoKo;Kf$y)BLak%(z!=3odKAMZsnK6FK7nA|VbM+}01^I=3F>(@SE_#kh{d347C6Sigkg$2ij z4Z#?FNEwqH`=kI4iVCLDv9`|oe~GdoGUc9In+$%5B74YvnKigm1FfuYd=LT~I+~ix zLhiZ?;)~r1X+fN(0`H7{9n)~#?o7B+2h)j>sL0Z=s^QFDu;y}HCPMrF6wox|P zex&!`X?K4bKfi-UP1Ll_DgdKd(5Ro3W)fw_OD-s)fD^@jV1S6;D~BD@?uU>9w55pj zLKKV|dztUtaVHq7tRf|zN|aNi;GkW|CRB(98{Jh~*juav^T8VP5(4_+SVZ+RX<@** zriWgdtVo0~f*bzwyIZTUx?%zG0@K!f42eoWt;|2wYPc+ZT|Sqc6J2?q4L7X#eJzaR zx})4%GlCEK3dcCKUk20_B%E+;wv*#O3N?3R7_M{8vZ1^n!F7ZXJ|W=74?)&#Co2d92MvJp6a?WR8Y7q*jZ zCgma9IEHzHjCq*Z(Ceb2dr=K@IN5^L+lI_0h8m1csQEfowiq1)PWus*>d&Et@kq_S zh4IOU5qXjQxlze-^mnSk&6(=4-r3MkSMq0XJQT=4{r}B?*W^N(O{zp|FZz!mnJD-{ zH2a^Ig7Uf27q1Bq)4RX3!&xCsLG*cG|KTJL#CpW^B(0^3J@KCuWk;?Yf0L7WkL~FS z;1kR!`h0dGW8ymD1HUcP<4QyO#j%8G3^{9h<+!R>Q>zbGt1kS6eu_BOlB5&jf8XCN z!R}%AP7p0Ne3E{~!wUB#?(c2V?duKLlyHeM&;taDX|8}|zn%j4mZ0fIKjPH0 z>wsN+rT^S?Js>1RtF++a9fNd~vJRtRhg4^ZLf9jsZCG?M8Znt5BJ>~_@i)1qgkCp! zo9cQ^l_k@c@7v!!s>{ijS&**Q&d#e;bYmKGwg0N`ZujLbf0~?)7L7+}c||`vQQoJt znwpyS&?s5a#mPt`RuQ+pd$Re~9X`DXq$;2^Glt5=$N~cH1Fyf4*2+UReeI@~I8-nD z34N_HGPD*rxz^mu9j`ar&#NB4-US*U5;dN$wj0}BZEIC$PbuYVvUz>Run6;C1~32U zc}&-(HT3e=tG~r{$+hv}H0l0~1#(J&J>W;?35MU*u0pfRi;>(G$(_dWULVo-25;O8 z3`d%aC|5PDt_)t>^PcC=;BqWVQKytog|#;%HXAavcN^dmB7Y=X%^yviCS$>nCEP8< zq&rtIorv)i1o2hDRSx+Gl9;BG7uW!PT((uH+RMhXg&$OqBek-l!ZqtnHO~6+4!sn= z*IXOgHkRqtk;=F(olCGY1pZT@PbB~z<>HDHYh5C{a0%-*ht8hw_E2x^L&-VYb?SCY zj~nc*#~C4@@O$A5@WB{4@SaEWm4ux4HRBx4E=h38K3ExtJv|gnn5DtKTtBuKUX1vi zDKAnYAO%4d{^FAsCoACaV+pKgN#kY)X05-FZ15Xf@Vq`Tye2zHhh0r_!_Pwd`7p}u zQaqBFHdNlzlICF!%@d*^wcw=!IxArd{l7T+jp?M+oX& z(8xQ|P+pvbpqU6IphEiKT;LF{zFCaoEVg~#=6Eef6y>bwZx!0+KfO zNB1e7_7Me|Iy)oI+tf!^c~;bHwl;{u=p(AOUAg`6yUw)L!pWy8Mh_n=#mt zxS~-m0)0LT5UovJWBfWYo_4@_~Himab+ zl}kP38Mj*J7aU9sWx3CBv+wrT8>Fw1-pfb()4jm={F0UOrNHOY^F{Tt+GWniTD3eR zI0f4J97Rmd>hSPf%M_s974 zI;8J?-e#xkI>FA&SYd+KfT=Ml8LIvJ-tl&^`rm1o1*_2lvtaqEG0*m=N?Y%B6IQA| z32VGp(*04nZ&S2Z@`Bx%?oUkBGG*;aV6I$Uc8tgveh)L>2MJ%R-*tU9n{CKZr-#6i zx5Cf*VJNF)b&_cYKP~1TY24gB$RO{Cj|b}V0^6?w6nTXOTx-g(k+li1x*ghOwaz$9 zV}9pQEUtTvHXM=+ZX1>q!LE(A#=ovtRzJHt&Unf&lrgbMDU!0g?Jb+vMruoo=Bd;m zsRQB0kLH#v8iztVo?P+%Rp?S05MCo#$4EX;dkB0fZ$e_1+X~ln2Dr&%G=xNP7JG-wKr586R#Ljbv6Y2q) zAqa-AD3rrdYLE!nsWH?Y|ECh1Aj5X{E0oPXMKY zQVF*mI+P1E2cqg07WXt6reaNq{)y@BvGr>A6>O94ty>y@GqY6@_r`_E2Kwl!bfdo& z(^yRB;H6Pu<}>N@ta5IIJ)=zxlZ)j4Nv;3G=yXsW|Fi~s2NPA}H6Vj79Va@|lD)&^ zbd%6)w1fP`suy_a7ibdrOt@ajTIaYR{2F868T;J+-n3oS^P#Zqevb{TkuZP^Fm6&-4d-*!e@mcPCUebE5 zbv?k>pMxB*xZi4jUVYza&}O$BrxAlSGBsm6d-DC~B+eDML}bsIFlmmNP9r{EJ;9+PMHW zh|kAAwq3RTM$9E4IUS!~c5!OM$P+s`GA%hh|Cl7^0str=W;_mXI?=Ob$$4O>SW0J5MTC=tgwFemg z&M6f{he^&nHOjPR$Cd4pVPPF@*QGQk-1S;3S{h!cVSZ-iZgR;*bk&?NG1k*&i(2%T zo^jfkwuC@FBFc55g{bCQ@V)qi5*Oy#fPW67Ff3_MMtqeoT~ zpR(lUqGuFDPk&}jY6!h=;;gSPxbY?YS)QTS6y&GJq@dmNrKvrRuo3ZCkS&SZ`Cq<5 z>F3)O%UZ{&QQnRwok>!;VoDD}5ee6Gz6bS$WA4uge8Libzim!`Rp$IcqBL-KYT%69 zB=mkL`)vPy^%XjTyUh8T*K5pqJFV7Y&L%g48D`fh%s0UM(t7gjezrc&jJbQ3^ZBHC z!srzvjnb8^A9#5xAoLF6e*wkpc&HbUkVgf4T>Bh<*W3EsYpIs0X35XveZO{p96vSM zdPQ^XJDI}C@p~J8e{Fwymb{PpJ(YJq#awp3cy?PsTOmQ?sXN3zfIpF0)3Q`e^hU1r ztTNwGU6DE}xhyPL4rLx!Rn)bW=DpZB@KkPaeWvps=e=J2ug}~^M1;L*@I7OVBsmj< z6eM(cp@23liz%T@G(YU=4lc+0@euBP%+PfVBFb)4p%vE|e1SR5(QJ=FR?(pB1SvgrGPxGEx~Ba}c-WMRLGOrDWE z;?Vln_eH`N;*T___YU2AYf+8^u*>t+W^dPB)#X)^wWZ~HuOyeV&)iAoW!7)kc1yA z?9IBlsiGIJyGu}Uz1*7Nba0B^wmN%YRthN&H zf%b2e%~z{;XA$1VJiaE|A9CH-Q9}av&0Pl9ozDQ=`Y3j}@CmLBteT9ET{(<9{2^`_ zG3}!VVZb!v*%%3tH?>f79-6=SDB2Wig!8PYT5R$Jg! zg;?M0m-)}U2g9K03`&7o#(zP?q{sOFcqeEe%{XEzVHgox=rE5dsON$XQV!H>i#~h2 zA&8XJsLW*^q(y3bMC9G_ai{pmRQaA^M0`3#rD{RV*9?{n$vHc<9vw z`~L=YPl?6-v>CTS4SQ%8HT$;xKL5VTl>FZ7{;IYU2KRt@Rgiy69JToFG3osyPV>hJ z|Lu_V&S~Sj-ZX>0{EOXR%E9n*M?Imdq~dw|Wr@(<2A6vw{&P&=4gKk1foRZ^-u(^I zc;)-Z_r*6;I=NOx{bPgS0}tE87;bl`pJ2#q6OH~-AmHscnf}DA<+F23&+155enqDj zjMr;~Q2x$x3~UGC*W7=2+a3wyQssFTFgK60hQ|Iq^pe8|F!9p2q3{$oK6>47%@8Hj zRk_}0z-M6h^B)_&cNAs!>#lnMtlPY<$S~FUX+mhs#@4~5>(#oz%X>E*cncQ3{-lofW7nm5&S#D_w2UoA;MS8 z_q_mT$&y;vomfJ&7_i&ipMwVOg^k3adVz;ikS>2&V3RyEo8Sc#oY(W7sH*D90^X}Q z&F2zPhimm>dBc54V7D%}6fPMrUVE`aNhZaFsedC`9E(FRY1s^32C__ZjgQaJ(;FE$ z+1-HuNdwWK!n%FSF@E&s#bHOWR;8h6{aYj0<_EN6P*0xEHml3sPw0tB6rz*#Jfu$P zBLvOHq>k;KRo+s+Dx+W(Bf4%A^qi+COyJBkVsCfPMSE>*x_V;QzP?vI?~hyRX!$M< zx=2uYdfsnA~c-D^Wb@>BHUW|Cl`EI+v_JDlcA=)Zh1d%K6iRO zXL}}JkH|p%e$Sw~O%{w0MhV6j&{h80Q@#%ZyK)`R3`HdOdyP01&;M;bUM6?=uyJt6 zJ`-@Q+@|C%Gp$4u(xXZ|12K3)aPTV+vx9IN|1?>W@c3~+C2eH5q;(^y^(9C#X_fK{ zlGnxGPXv?gd)0|%>zx4V&ESSQpD9Xa7KnGN#MsMFwd^)u{g-nfJxRpv*;Omm`zGHm zYm{6XNR(LVABmcz2%hAcXb0>#S@kF`h|+c=xb<9Sjs$U5e*oXr>ru08wIDe7_U=pMbsG4Q3yR) zoyq*PbD7r6U~v9yL_NE8gzgETVJ}_G;gXIA;VX;K9tynSP{PX~M+9v2_ps4oiKb?D z9>@0T}Ct>UB>n2ECq*$vOeuk&Z-R^Q# z+O1WWGfL_1SgC{o2x4Wci8D9-_Wt_>1&Qhi1iWB4L^iI*rC=SkTvwL8xl9>jW2cA$ zp`lN}ucqH0sUHyHr7U3x`nFpO4N z0=~Lcx?R*U*_>4h>OxrKQmNHAF06dtE*~PQn1K1rzfKjyJl(cGdwv*XA$Wel6-PtxTP$B0Qw}Iz{i}P4g<-D7^N3_PG*-2}2?~z}HnC8D(`= zKBt^03z;G0oZ)lSzIK0hUXN^lJ#LTC1x5LO>{8tEYIsPKUCy6-O5TcP? z+RN(;y$Z$5iG)6h^n{ZV{t^A!W7r0%w363#`@&ugwzD7OKx360mXOn&+QY{mSp@SB z`%PQc@|TRk0py_%N-WrhIw_ea_q0IKO-2|7#Z+;IN(2~BgePhwSCGA0-li`AyQ)Vs z<-PPImxO%$1m5k_Fa{%}A|bFfDRNzaMX>QsXHCPqU=M(nHKFA}p%Mpr3CL7|aAtKR zCtF`%n7N>}d119jN{tbkZxeGp2>_oa%XwvvS_A|nv}cys*V^YoOp{FZA0Un?|MOE* zK*{yrX&s^{J~+B*fg?B>UO}5LCE!11bx_Dl8%ttLR>?hqFU{ocb}fHDqV2<|*6JaN zF)`?Fy}9d070??dafFBiiVZ*2872--X+y%a(JdQ5@)!50;8p$2bP}+Rt$fzgG?(Z2 zULF>u-z9*Pi{ol#ljF_!6MBWIAgwZ2!i zL#6=J{e7d{Wo$(XqPZ=v@AqzaaFzBY9-j{d%Br?l$9wP5zmALp+H<_=${m~5s*%?EW5y}S!^LIYBuBk$@T6@r zF6X-j-md}ZB2Hx-{t3NIfhNaZIYE13Ya`PM2Bok}llb??31Z7Z{~-p&E2cRY#0MI4 z`73Kj&SeJt{0!~e4vU6rz=#@6?-zS}Vqt`+z5FBm(%nF@ybig=_~$!&}` zEpT_1>WA;curCy1QT5Iz3yJOL8=X5Uv7>=qt7R(ZQZ=lz={hn{gd3~im}>m>YrHxE>d z`lJ|v01wRfoBvUmjNwM_`*FKGVE^~bMd!nvBT9^fO0Bei7zj!*fj|L%y6lh_u(Ga_ z(1c=;ePjf@!&`ObLf(#`GCKGAW}0&U${Yw_9&{;7JiC+$%EVC-m7nQ2(&M6{5>!j| zM@UTcER3OmWF>}(lU96?<%N9&< zt1QmU9R{se?glWICNBa#EffxO%eT*nkfn!lL%?Zu+p^=N3^&FtC9gZX-GF3RZfO2$k z9{aICe_K2|ZvLNWX< zqFub6x~Cz(xiW$25R&Ah9P(>(n3tgsCanUaR4tg(EtQq#iKb#$WiSPMr8NoEYQ;F6 z;KYKtAw+TdB{3Jaw_#gv{5rnB%n!0!s86MJyP`L8)0a`RNOf@ENA3wZ8FOE=C2OCd z9e6u$hd9tcn>uT1rdflS#q&a9>nZNvW@3nkS}qux<# zo#L|k!);B$^q&CA6+_;^8*jZ}&wP{0Jy?ggxJ5bovN>?@D0o)U(ZUY}9g+L`Fiq|D zr5;AA{W!B^Ag#lG{k!Y6Gj|;liy3kMPYN!R2*-#SUn-R)qA2R8lslzWdYYZ|Egu8w zqkr1N{jZ+XfBxoIB)Tcjvhb>vY8S7g?6Fld`LgH4Y|Fu}%^>6>01zBNOyzG7LMuoQ zK>Wvp>#h5p7ubIIikX9X6!7*^5MzS2>zp+LDTc#;hn+$+(|9qdL571SNzRO(HV_H> zR2eJhhTwpFZ;(9}>E!~c-WM^Fxx)w)=i_`B=Eho%gi7RQ^fOd=G;<{*>+9qe~IG{=}^_v0|S+ z$Td3A{cfP(?l47UW(>Z8zjU1QakWW%z z*0WkM`yiyvCo+UYa+}_XBvIBK6N6DQuo))!h!w&j^(4)IxxQ|>-EaEREk6MJ*g}Kv zf<-piup(otmUOIdhk~n9O;^o-Ecu#$?p6X1u$zgy(fjus+I`?cUa~M8>fUgN*#Pds z&Ai!=A)-0_grU@Z)93<}FP0QkM`~wR=RP23Nb%e#oLmw+p!|OL;RQF|kWc)xivmSN zKp6)FIU8-6e>P|Y3w0*{XSlfHEidmd6Xig*&s&R2+-t5)5740Z=g9DCce%t93HA9$ z@VL|~3xE~$)4S86CSL#u)}%`$%ww;0+RI+H3&e!z-U$H#ffN1cQ!Eia6B%oB01wS| zhTu@N4s^*NF+D3wtZ<%6r2?PJLm806NzNg}_Mj&4Ni)geyju=?Hv!8aSf(6D^hh&P zVEtT*|E2oZQRVePd}+3t)h-Kio!rY{N{Bn$7>303O8=|!2g#x8H<82tBphN9zxqqo zmA~AArZeGeaEcU$Q+LFMlyvX0$$rRVB?2GH{GS(aPW0xlyNKQ8=VY$!>CkSp%>=3@J6&KvK%fCY4GzOoIN--CjL_BjG$a@Qhw>mP;cP- zVMevD_m8MT__*CZY0S%5x`B*b`5;B&x7S?T1e#6Zc3y0kQf{@Ug~;>2lDz zco+gYoCUJ%FeUAra!_AhKN98uM&PKc%S;Gh2D}y`B-CdTt$@4te&OkEQQmxS!|XVZ zqTJS4MXZdMD9BivaPQ*YGan38Ue$s+yF6AuuKnpbwaRJop=LDBtzi~~&xOy-?pJB6 zjOTpS=iYikSTaRMHZ}D@(><-KcQVj5hOtviJ|Faw8tM=~;uz@%qr`p1mUHj}wOv2efhcC&OoH@I744;GwLg=ED?jbtzJ&l29CH*snQ)@Q>a1;t5;#d)|ELz7~-|l ze)4TOV0&tFxjN%66rs!hfGT6YdZJq;!$H<^;pgzc`DX!uj=2y{oMOX*dinxrMH8rI z;z>D_K>$wOpX=3SyQe55k+vIHipQGb;$(66;mWRs>yt!#lp(Cp7RGxYQNbw9Od#ow ze*eV>k{IwiodZBfi$#$Fa%S-rG3 zt{NN~7-&Ir_bo9}+4pg%{L1WLdPg3c)}rp!Gk*T5J`}Gsl%3V#1{%mCWTy#iYP}P0 zXgpgC6sR~#=fhk*wXwWp8u+p;-Vg7IM5+U$l4uS{`duMk~lkr5td`d+NDZ(tIlQ=8eO%ZmjrUCns&2EiBdD(ao+E zo?{qlCr-rnIQ5OCHt;Oat)bM#HdnKfr>JQ$(x%& z*CK*J{%UQpPRFpIIVjrZIc**BwUVR&1{D7!*=pENk@ph8dJY~I*z_f!LVVAx7(V=v~R8GDX6$q^1+PceMH((2UgYz1nbqlmqYbP@XV z@zih0@jtJA;v@{lA3ukq+&;n?;ev3673xBU7D7Vbiq!kpQveqt@)1rJLlv4 zTgB9#dclpQTTpUyW|DZd{u>A*0S+~^1f?REr;Kq{6Iwu!=D+X%!`(4~*)EKHy6mnx zHaeVtk}PirESGBPpIrPcPGYydc!-c}u7?3GFEjb6%vY&`%q@>|zF*l>WB#Bc_~85V ztM!-%8?CVaCWuTXviaJT&4q-_kY0r`FnL)&$98qrG|G@;)90;2~3iF=3%^HkG5Z5e1-MDi2n`QeWbT^R7 zjVc$DFaH%qa3#Tkj!CZVP&c|ETWhbB~*!c5dh_w4EI!$x`X$cw!jD`h7MbHIRnJc zRe&CI%s#iz_c~w%U%+F2)z~&stmNQmroNur8>#HgJ7gXL5G9cD;%DL~1ARY6lucZ2 z$x-%URb&!+GtJ5N&##<3O>l(y9Dj0?`D}k93*W#jQ~-yQ8g@N9Fy|x8%KrNJ{&Y0W z7WBqhKRNKcTw~*MeWH0?@qw@?%#brxb4%I(Lsl9;j`WS(@Y5rGH zd@61po*lCH5Ew32!8qCAjsZ|m&%;5??6_xv7bLHt`nz(y?t%wKWy*HlHsz>}kb(5y zGj*lSa7W>RfshA`Eg{&W%0aPCw{s>kO)|h2(YBq%Xbf3dzkdt9kQDvFXMnLm4}vU0 zW)c$`ci)U;nU=ZMmcYvB){D_F-2O<{`i`DAg%4roK2c`^Yr+8@vvnd*r+YyHM^8j^ zU^GDzN(dFMj+U0k{b)a6x%8J<(}Z2-mNH)?NXU!(O-TZKb6_d2QrTE5?oDlxW*b2e zP-s45+!gKp@Z~z3p~y$%GovJZbjF-ae_r24Wynw!7qMVGktdo-zvDG>ywDs$2}3XV zPoCS z*BUF{{8P{``q+JScjHfiT%4xkWHdSGblpl&)AbhX98WvyIVY~X@7uE4zTP(6y zFU|PfbGO%@<2Bc99&pgP5}@gV31;mSMvK(9r0i^Z>l7AFbNd)VU$kS+>bHdPlqyM6 zwRYxduTM*ce-nb8(w_0MGz%$yZy>>MX=qDAtQK@7A{riq>qOv0gAo`RL9-Nls%58; zKCAYF-zC0J*UGtV?)$|b^S*c6qa!zA9iLC_cl!cwOnn31J9X8pHd9lrE~rs1Q=JVo zKYZOk6chL)NP!opvH?*l`1aPGl70*aSgd!C%B?}s%)p6(6zxR*{ioFRThF)J>-A7= z?0dY%)??bq)wQhmY~a>tWxGHaA&FL*H$n57XWK`lS;1W~z*G)F3j7FGUp5d5#hQi5 z8HZJC;x^wMe&;q_>R9Esw4A0mc4%+T1iQvdN_H)@xT(;PKJGmXSiYMU-dJK`P;JZ> zf3(Q4il@BZ$)I*+|436p0|g?CG|zP#($2mBpftNz_P|GEN=95%rsqaT>`Xl6T_eXX z4-NL!#MQS%TBc;T6A|>$f|LZa6^TCC%?mkEZFk1Y)(1d^cYSAqv)C!A4@-)V0#k3b zrU(Jg0s>;z(AS>^LBI_u(_{8{Q7<>9J40SSgEW8~ z0#S*wrZkM-AhH^vpr%&6B~OvhJ|eySd4-#+wN*5G&1(aJHsO1V=}XfbM|$@5m~r=U zFJ~$G(NR9YRzGQ!`_k@q`)|q7ey3#=v-*`izhEvbGbcOUfBDH22ip1N1~@G%8)T9t z$};!no$#x~mw5Z-$np%U=e*VN9q=*kdt2SZc;D&;BT-h%V>Aa$ssaVaa^+n6nI%s- zuKC|`&rg$L3(BsmNW_}s=(M+22%7*q4#tVl>4a$Ws(?|D55XJS8M8{^WFXvV&i|x{ zWu{s?v|fTgN6kF|;+Nus{WnmiDkV>@^QJ`FPIK37gx6)#v5K7VCya(ssot(OVGyd$ zk0FW1iMChR%F$cMTPU6rMT7SqK=l&0!4ELIvv$!Y!^&<4&45R#EHAeR7e8XU6*C}171@t*XZ-$4{GXFpSCS<{R`A>xqod>@haZ0i6U z^(Yfe$BPT0#~znf&2kpTt+~D0eRe-sH0DQaOQF5y-t8!uCJGv5YS1Vq`u_e*4D4;^ z!(I-?7^cAh=$snL+XMg@;jf;Aq2sj9ub=+4s}2f7n}S$#z)8tl^lvr&Q>8?vfQmNV{$Oqsm z1onPh#8esW4?0+`f+uEbO}L+%l)((VJGQ(rCSR1T41vPN`x9}ntn2;z>k8A>`~c-N zW?HYMqE0UDQ~2(FIBrE7p7jJR`ib}EV)fpRfV-Nq##@oH9#KT3xdFlC-_{mAAE1ul zn~B?d`HCN_-KHElLYx61g0~BS0_Qp1oiFj&?8Q(N9sVQnv?VLCUyWWbCFkqn7%%~K zxU}*T^l?BTkhHA#%?+?j@O_*9(t7;xff!!SQw~G~0tAOXZ}Htdu*i*;gw2@Rl*$Rw zJY;Qu5~%+bRBZt_y2tTh)>LT^5}>EI zN{9GFx+}&jZeel;xW%6R#Ibb0EH8)m3GqRl8WQLAq@H3~Cs9?!C+QoWlB zO6y}-z~AoFZG;B70>k$@R3NtOchFb?>VfhDXb_Omxcy_5qE+O3^U3K-H)|qXq6De| zl-&?V2c>M&?EhGO1Q5Q+-`;mHNTpN38>9kz;o2b4b-p=pI#_TdbSEOSmJobd8)r^! z`Ip=h3le0JAmj}ng_GY(m3{Te-!q(grIiqrb1zgyxdQsX=b~uR@qH6dc>h799it)B&dhYKI-h%y3Y3xWY7T@dVF3|lkcu_~iz84dpWZgYPg-lgfb3 zg$c1fMX7V3&=k<40uu*0hZteP<7CWF*j5Ng>r%VTZ+iTW{#pe3N8J&A$JvA(djKm> za@cOoIX(uGgvAvp8$Mb(@kSdUEGcKsl4iy!5K|87dK`+KUP($qJd7)89L+vSBI3nw zx!pTs)l`-GM?kRag03jxAI5uv);^{RS9Ur^J5 zdveSgymxds{J=Ba?hx%c0?tBtlhLrD zz?eR@OylM&Xj}g{BNmG!_mw1o@}Ib7jH4P~tTh}zbSK&z9)Tl7hp1gYuurGwPcSz5rn< zb~X8bm;z|ngND0TQ^j(why^_dzcvVRGUKG_Lw_yK46#Qj#eDHabCtWF<;RNth8{%D z#eux7G}oJ7qWc~>sj^@s?l+I2rcQ6~KFq2`#Q_oYn^u;Xpx{%d+{^@$0p;BwI3?dq z;zdhBikdnoXVo&ax)`rlMfswqP2I#XET+i8U}K^8?2=U%KWMqJn}4b&F#5#_NjT}?fPLxI5! zAdP`!z;W-WQJn#r8X=|*NzDOdk6{58wKS7{|8v?ypL1W}0x)Bgxkz^QTk`^#QHL>1 z;rx{wPW1P*p<`U1M5+u+?5?QKm5_t4t>y!tRwznprmeK5bDc{Y48K=MqV>TdAm}mF z(gs%t_=be+zh1GurH0A(DK_7E{I>ohl8F9aPVj@IA%VwW_@xse+dw24{VBDQO zG|-S`Ya-FJ9Ivl-J~Ab~ba8YH_0vX4QVtA5&!oMc5#b~h(qv49%=ydj`m`fUMexV| zJ<#x$wq`^d9j~qJAtu5L3w6JcTrwx#l2+eNMf;F6d@=IcjUY}F;smRQ4BrBJ5GBWu zA{2Ak?Zuktx-iGH0eR=`@w(U{$QEumUUT?0PJQc<3JU*6c3t>E77%B!dnZK(rcI#4 zqm1)~f5o&$k41@%g9w?;a<51hfhQ3w7bZpwhJYBBt+_VOzb{FcfE~|^O&#K-Gp^EW zI(?(OWAN$2vQt0mQc|OW&-e<>FVePK_nuy&h4kb@$y*iGY$4cwSGfs_o5ng3xa{e2 zZqwbJ(5(%r+8pFtE?3dF^0QV+$$Bhps{rV?Q3*2o1EMpJ9$Mr`)Bm;FjogT=;zw__iJ&s~8-5(RKkN`y-<~zfGiSUCkz2X#wHb8}m68ab1;u>W4WW+IDX=|1f^2MOY7T()g-8h3YhcXubySaA2?7Mx&> zyF+ld;K41pJApt5?(Pn+cg{ZdydThG^r)|D)ta(qL1N3U@Hsl=NIoqD9B9j$h7zh` z$;DHfM!44Wcs$vP{I}~ShAB6u`2M*<@-f?0@Rq3%V*pZ?fNI~dj$>(kK153eHwB&^ zNt%)(miqJliSLSjU65%7Oc%G&Sc`hhpt#g-i=s%8I~TIKY* z8t9JcY`;bt>-DGPhs^3s$sumZ!AB|`9WN~HM>MzQa`c{}Yw!bjX5~g*?GQdh!1oY}b@O9Mg zW`O5>f;1GSL;*Z3`KEy6=q;Q2wK5=o2mvj~d- zk^79xJx^Y;|A41w#=_o3my6>)pyhtb12|%H$>RY&nHQ1FZ+LBORC|7?~7 z*--;4`cS*v&?Re7UkT?rH zf#&5R()WG*H3j0znCnw3RCtW{^%-ZZ;1%?Zs585fJxbF=0ZUu-^(SWHv_d}0ZCzPK zp)FaZ&!0mCcViznc%lZWZrqO;6r4u)@FZ+@`?}8^?-}>szax101vMs3gZ^9Da)Kbr zD5hj?Msy!sTjoR3@^sUoFh$e}bj7>hL7*|?Zu)_8^2R#JdCxO6N%8itHjTFXoMgYy z*iss^mR&P_R;}=MKT!Xi!o@I!Q?}1q&8ac<;oo_xt1`n z-o*bQnVFG$OQg$RL!B7H3OC(TaoF^mxILu!j?0Jjz7uIWT*|^nkVa&U1k)*cs_2hh zjedV2J8n4>iqZ95?3=Pp(U_Y~vMzr;3OSDvn)*?F9utnCbCl|}*f-53F!_!q1m#!! zu$8b7TV5t*nBNKg{m!ZRc*o8_xWYp%{+~7#`Ju zlRh~6jc#7^2>M4yLVRJ;Absptk&jjpLd58p~K%5}25e3*#rDecp@F z!pQ=hk_k!o6d5+JJk+mI@co2uDh1`bUTdg)sc6zL2p{j=y?8LAB-L?DZ@86R^8WjE zPop7n?8~KHhKT1D!;oqg2;2*|N9P&OMUG_jt&o@hdEuJTsv@H*#oj?%9 zFDZ=JF%`m@>15Z7>Pw+wHWgEi@Nsng;Iqtru2!!ZDiOKBSz}Q*022}!?#rDHN#F4D z)@!gT98M~7AI|ew=!wDWDr6ixi9)7p->Tn~s}Ft~pcVyQ;N0`r@rKSr^VfmwHxVh5 z5cG{JOQ=8Q&?5*-xR4+qA%X)2?4bM?*2159a~t? z=v${X4m*Dnd`(JBbU8dd1a1oqqvNv5(oauK6q|ZQDd8alf7yRlm=+tm%Jsq7E;Ody zH+a`R7!&-QOePAs(yv?-;iu1Y2qRnt`W13eW-tgXWooW$F#LFmF12AQ9!LpUMDX}0 zFYpD5!@|8CBE(l0%yS2RO5ye;vZwljpTE{*r-=cUSRkd*C@^vQux^<;!&gf#2=NiV z6S@0o$VaF&6R0bBicdBFBZGm9W?dHs@JRn)ro!A*^wjDVaS3ArUOq<=wHotup*Bf#0Rqg3HCAVBkCVDa22OL>uW_vW40Np0MLG0q`%lGhhh57eApB6NOPk+oRge z);hnUOZQY5Zx)95d)$&4uw7CgB)+*>8#-=&@#nEOtmgQ#xMdLi)0B(3T=J9Q>j-F> z7N=R6VCwLlHm4YrB@@VBosmx;wM81%tHp_eh{d|ll1vfR6OK-rZKx1G0k>HKEfFc^ zh?S&wkZxu8_fj&61pq$+q}a`j(x+ODw=k&79Fah5Jts)g%>-Uk2A7u zQS2@wD%IlwvmrgYI@=|e2ESFeQ}Jdc5$K~=FI-oK1!lVKF3kE)IakV@``v7OZFE*%=?a&E zo&50pkiim=O_DdwhMyWbv99LWtFua@K*|Lnt&wx; za1$o%jU5MSwc6~=%yc#G4CV>v#_*PDf)7ECjO?zhokY7#qgH|pnwYmU-}eNszS7$? z;%m|6+6C8lgOGqXn~~)A-w>ht0NFz`@vzeIkqT+VqO{}lB$6$sm=Y>PJ4WoZhqZs! z@vozL2mmY~2o@jk`!buL+WoM@_1N)#g@p5QWp#CT`29j|Zf%}MBSJkNH#w~AQpntO zcMj*9+s#NmGU^!~8g{F4#s@}`DV$&S5>vTd^ThReQh$ zK;?`qWW;{K#b9?#{D*^_wHBv%;vo+~sO0TyH?fv%D7@%-(rZ!Bz;?W1DPc;ayP+$( zd`qH@vlwu>eiZ}qg})3eBc1nh!E9eiw=<9ISHhKlH$uf@FlBB%C?14W^vA*__nT@x z$of!L0`VkHd+*@niOG<7r%EPgfEByX4P))5JACX6ir$p0!kfkX-mcnB$U;APhZtUM z%QqYd7_wxgR62Oq8-ihN9Xrs5L)868I<7;8@~R8=Ive*I>I34Yvct(h7caZVsOt3T z+p59PS0y6eMv6#~47+KexjJfFxR)Y7R>}x<$+!H@(}BvpNEtlbF&+GeUjoDGXG#bT z;$uoVYf_2w<5;_;U9s04v3@U&fp$8|FBjorN&e8!y_6d2R389#1ve)#e(rx}ZBIY} z!B6NJQ4mnsfdwrWCX*?0qRZF&Y(bNoafEJ3rwHDAhuh9Wu?$569p|}8?zBZu3I5NY zM{5kbD&t2j+^%jk=rrlvaD9^N>s=P5W|n342#-vke0+uP+VSj4d{Mad_vTJ_qSeeJKOff-@gklO!^jH{}HD;(u7<8%lzt* zJbr$ib9L$si#lJgjYU&lcSojyiGp3akl6)cPYW490M<&_CspfR`z+YHtX z!8m+>>vl#hre_7?Ib--yN8U{>LEUln~iLvrx zu$xvco-~Y3RY4{14LlhhnmZq>R|p|XaZo|0I>J;dTpK(qbe@wm8foiw&##8viL?Ix zM&x?3Z2n0nD=6UxtgkXHk-sFKMLX03e zIH6%-VHCZ$L5}Qkc3~zVkxt*Cl8Rt5+0KCEQN8lArU@E0^q8rM_UMV&G0deK#cPdX zVd6@Zy?Jyw6;>FAQbpf;A$VZDc_GU>Zn4J_4d^ev&w`>8lzG`S&|ACmlK_Edjfjj< z?mhu?KBD(K`n8flqc-J>*o0xO0KHM%D^nRmr}P_N6q0>D3M)NtL>T(mHq7gT4@s; zFo?EKM~IH)tezDVVAg@F5>)I{Jm-p4+JA}|eY^UXVs!|I_+>%-ia1Z?wafN?J-ws) zzLr-B84>-i!%X}B((_Ko`9TQs&4t7j9<|%4=M~Z&QtJ@JVFPCQ=7N(GgJv~i+$lW- zVwI_iT7nP?zx;q|1be{w|Ik|6fO`xkkeS+Lq0x^1`b+x>*)mHyn{oO}kqmw*<<+6J z_0CZ$Q6+pq2SCUQlxRzBBP00}(AHmjVg^wbM7~#iUYlW>IQw_LmqJAXo8$#!5K@ z&~f(KmiGv0|9rxV^RoUAIIR=G*x14DmE?norR{PH+vvI)+_!e`J3Bl32zhV=U#8h> z0^o_&x-r`1R+RvGe?99Jci-%@#L=V#ES9>27p(O67coMxhi1!CA(CRl%@NRtlv!i5 zpAiM#qfwR1$_{f=9)iVv#A$M$MnThUZcG}JhXTBr0;!N?ypKim74u}{yH!gVqX{YJ ze$Obs;HmKUsY!?1;mMoSE((7fYWMiau@=S`KOcuv91f=EChr@2={-F^Q)kNeX_T$a z9=I9}-L7?VAP>5tCMuZX43*9rBl=)}z8Fq*``CGSf>fKMX2jij8@y6g+oInG2DX$g z2tzA0_#foEx6<7qH3Q41_rNQ$3JE#(@-$J<$Wl>0*qEY-XJIDDwrPWmlmkEpqJDt6 z+`T^RZY^iTj%q)n5E=M{6oySN`Z%M`_-DEAqZ>Op&TIe_HmLwR*50T}YZgaeGzaXl z>YUoQ(x;)j-+Ejy&1g^t@fr%!gdb#cQ!bR}YgF{OnZCtCBsXdFs6&z1%cMH4>c?@u zDjvV@Rfqp=Lzu%Mb{+RpivwtogUqZxDXMgTQTM<%G&KCw37+Uku`pFOd!iC^=Qw-H z^Fb4Ym`Au9Z`}7NzyXN{gKS|BGK6?|iag5A^F_nj)44OOOE;XyZ;^9OKcAl^%aMsN znr|o1{CL>ySbwFB;gU}j55ZF@RcRer@;_Nt^LQ!2awa{_R}~YWvhIFSe0~yg>W=dd zzxgeEHuD3z(!8Jm{s_~1e=S)r@5YbBB(=bCw!9(dbqXaqaDF*s|Fq z%)|3-f^F6Yf7Sq&AAWt|tvt>$l?j)3^gCfuchU@ohetEjRwbUwAP4`gPjQk6otld5wXg|p67QW%c#J{U#X%Q)J zGB&gEp!V4xqZu@2is;Zn(C-^(=x?u-rYkq3f+G9m3Rx;w=K+s<0?TkHGCj{7PFpVl zk4G;ukB`$|b^$EfP9w8a;XCZe8r)v7g|*y3k=Gjpd_PR|13ys(9i= zr|vh8UCq)hf%NJA){hJ46XyfMYBcohHHJME`)jbZ#6Co8?L5p&6yzkL!V#kC0$su= zWUE&C64D0j25Wc#h3+8(j{N)n**40~h(H+}Y+dCW1($qzH0n<9qBJ8x8TgfNT5dbA z-J?L_5mwkMsMoDD(X6@`?2K(F@l0Jtdhky<3+sJw@p}cjC9`id1VxvrI1j7Z787*7 zXh(1tB}4p%<$lKsqm1FGYQwBD2MGHCE*=4W57;oUHU*JSpOZ=V!_hWa+RaLw20s)T z>|V2D{+ac5m_0n@{<~lQxkrhi49H*$PORT_IVb#F_n0Z;YCbK@FB$u41-yEc^^2UX2R?4bN`!5xTjuy}q)oC&H+s3A+$iAczO`@*sL(gL9uky7Rm~uSyx$(nT(bL*#P9G4tMMfU-4a|tO}-XE2>rc0?$>|)1>cG_2&9z^ zHQKwu{Rxu{sfXYKL5|lJzB^}EBEjI>OAd{T z>huH2+K6AWtV+FRR$P`OdfQ;9TKl^l+9cVhsy&?GVPVBtaxC}BRZHW)-S$7uUKR=Q z{(ho9HOQfid+|)Ukhx8&@ZE5+H;PVOL7pcDk*^p(En%=N04&+V_@YyQVr#zt^Z9E;q;20cy(h*8+8qnnd$o%&7FXxcOAwgrMNrzA5p^8crDuJI6l@}G=3ai)sQ1?6v@`wC&FUYx=vkNv z<0R~fb0y6^hZX^M_`>0F#3B*XqFvqC*9vM;YBgI!Jp9_6_vzT7H|$4{?=E0#&WFi>xs%t%_`!fHdTkaof%r60qOASt|c<)-kjDnt;W`CIhn8haE8G zF1$9m-S0~Bjn_t6fcBdvzZJG=*_M#;S9SIY8&UKaftv&iO|0od)Pm@oUbxh#8UDKO+^w50+zw76cPDLRcpOHvqCTu zB|F>5PJ;%mq2T9dXh$NmE_`XV%nc~1pIxkFUttIVFc4Ok7ukfHj*NC31Gino7~Tu> z_qQKyn_P1Ozb>g7TqjP3<&07pJJNn#?9D363xJv$Hyq>E7!<${8hlY%IIUYhk%JS& zCT!Dz!%*;e;h(2|;K9RjbL28^5qxB&2&|7+leYKx+@!$g&X;N;=~xWyYTC&tHILKA zp{4#hrc8QsP!j-~r$F$|p4JASzuy|Kd-)C$c5M=(Pp7SyANb_jHdySN-Sw~Djt@l? z1hIb~NSG&_zkWSh;)a)4e3eaG==TP)-aWL=O`(dw&&th~CM_d~Y@xCs4u&~pb1bOC zivH12BFLywE@uh?&C1*2m!Oh~mUDY;Z)2TNxSb29-Kyq2=}@J#hG_DGMw*mEOq&JF)r|%{W6$;fN()GG{x>Wk0<`g?y%=6 z;AK)v*w7F$vSqp8B8qm{cu|8F7UF2oLnAQLMopeQdmS!3h7lUcmA=RxW1mxeOag567Ov!D*PMm&8B2ATtLt zWTd$9BqpQFQpxuVnINF~@RTNzItJsY;7o>+Gv~~F`D}=K2eXham31&Hld_w9Vhjx1 z{R#8u1XwX+1DtGA?BgjQU@p+*OqM5uJZk|@T~p=qd`2uhrN3hJc%X=T`hOG>pCOJe zGQ>;*MP0K0%W8rD3oKN&8&-*7f=?H{7i!8z?(#R%az&M_fb%1Xv1`fm6n<)bsO=E2KI8(CnxcZ(F26 z00BHx3&Oy-9e9(ng5DecD_Kz8A4aBB0bX%Aa5T2&mrl4N`LJ*&JH#;Z8;+0===}ZT z1pu?rv=;j!d!Cn+KnUO6gJYx=8dgXgtfM3+%IlbPC2ga!p*S=#>x^OiACW%MwMONg zN$Mp({c_fL_wd~@Y6jj3fTh@fxz=wIfq!^S>5WEIm0|Y}lglhIgB9rtbB(+%y=}vZ z7}mca5Oy;-s*+se=TNAshI`*yLSv|`cY@=bnTn5f~n9iuWctibV z5s{HMd?+CZ$XEYu!G{yp`)sGd5^&aL@SUp}Z9MEs)6Kod5r0#fo11XO$HOi>AX@Kk z-0oI2TvYgEoYBp8dxizx9i8DMmDoeEp_ncF3$Tbhcp59J{cdKREwh^0m0>!2X+y68)0bnd)=3uos)T|_^_ zm^tUj+yyfNJ1>vp(PQk~Ks9;-VqtO-lqr*szhNoDoX{x@4$7sl1 z)HNS3xJ~@b4CQrF90>SY11RUXG*|s`kOe>Kg^g%%wtCd(lCO6!&nwd&WqN4iG=HGv zXsl#x`5v|+v~s;Z*JuwY$%^%P54ZE>pV zXF(C=OQ`a>KQnCKo9PxuKRi8^MJ*lHTDmy%Eu#r=kpE{Uamnd-68gbCzQlk#ywY-n zCSL>I5D8(uPAl$8h+C^&;kdS=xY$+qkwdP`pA)Cfy9VK)7ZpAyR4UJf?fe6`gID>2 z7M%i)lZ8W7wfD4>UyVv{$L~k+Ce;0U5m+p@j4!J2#(uQl|1dxKAkBVsUq%VCG{bHu zZgDs=prtF*>~Xu;2srqXQ5Z2bNXY?&O7nMVi;UPq#^2`mTz%kCVa~0pqnb;DV!b&~?pEnMesae9*s>t}5nl@aVN3uwR@l{EAS1c@^O`W~)*z zwQ+xXc$QZCDLw6^89vIu=a(>4Rwp5*RRfUU6_y&2h6Z5GHP28Xz6>VHvEev!TdEqR z#v*#>V6yMCf7pgBc!Q^>JF_LxMV!ab;m%!=rPx2ob7=}2hQq5A=m4Kswtl2*95K?D z{8*nb(8fk)Fi`VClqpK8k+Xo=+>oK)`M}=3Z?znj69EzM?hX9tZ6@mV(&0n5@06#z|n@nFA)D*MQd?m0`V(NW#gKCq$XBA@rS+xSjFjj`wy5SZhgmlt-H7Z z_h!mtJ0fG=-Map+)7Ix>c)x{dAtE zY+eGz*g{TC@e5uAjm}lb&2Y^3_|Lxo?;A;B^u81#bGcv0_=L5h+_qpvYUPD zm=W0}gk9W4V$i%#-WGV#*M|4GnfRwfsc~kAy%yO>U!(md%ANMLYh6E;?+SE7SwGuo zU2>D%FKCCd|Inyl78?~NxOgKZa3FIp|-+cqXi4Nq>ZkMB!&ro39Wb1iR^lg0ag~(wZ%zeC2o@BWjws@sMz#Ws-9#AWscnUAmc)X#CA-O=sG z!c93}r8hcFD5+`o(Wy!>=e+I!PfPvEv_ZBDMN=IcDLwljSz@LupiTcce}%c~GLqkZ z&`m6{Vv7*NV+A9{{udQroz(=NtE!7~sp$k(gkmLT(jiV^@yBS;A{WeOK`3s{#5o$6 zOmZmih#>?RHOEn|uK9Wg&~cIEga+$~cp>YvAXEbrfp~81ph&xZLC;V4e+^itu@Jfx z+)#*9-eg~H>Ss12yCjkA877}__G0$*%s>0c%8I8B3o=_6ZDf_{FjKKeh6@gGxE>{| zP8~e$KwRl^8A29?rZL&aAJgRa`?FM&$qB)up^nWKh3_^_PmlGyqrIyIJXU#rC%gyc z)7cuK3FMKK88rNv`Mm(wuY*zT=ng2QYDB}{dm}ems1<)#uh85bTeMSzl;4aJXfu38 zT+a#cNeN@)`8sE?<1ka3^5R0EC@@546rTE>qRt*BWfeQs>&?gLj@De!n$s?l%h2Zk z?rdm`4e6{2SDg3e^ zV@(PCn0!JwSl zteb%_IoJP=;c>EdJ+%r(ff91)Y6TA0K?tNN=p?L_Ucp?*>awZ#q#eiLsAlVZ$FZ_050}4wJ&{-$pY=G2}PgSuGC8AZ3zgwi)@LOTd>`k%+0Z`4$S4e z%1hZdR!$(Yla0T;^6)6vzgIsW4(E+46zk^)lwhF_BOD}*ksfH1$LsFQyLx&*`d4v^ z*CQ}4uM`$TlTTArXN|u%r-@aa^88181v44qfpF#WBW!tjqD){ZLCvR~F3(3j*Kdy@ zmbP4C^hhp8G}J8bX#*QsQwzATmhd}z+9p~H-%_4}30?l6qR$VwZNB}f*Ytr`YWVPn zR8UBtVxxLSUd}0HnTkJinZ){VA1{N>>l<26ZQrl1;h#MBSkEr71uN&>zIu1TzWfO7 z)yMgO;*@^x8@!%}*p!XfYwRo8S*d+X{EFo=`HWGPV@3mxO`2oQEjx7gAn@F9VB)uY zs1*sn^Ar0#td)a7w~Lv4gHA6Q4%1b`e7uQ3+7=_Zi1x`vpZAk#sW1o>An?ynLF;ZX z6PgsWdOiXaLhBzLOP3)6)@F5r+NNPsollHj28$0nGAhk)h9dZGjGO|=>9+XAee9hV zv*X2XTXMx#?5&?%Iu4P&{OXem@Bb_>H|-=yr^C6k)}-J{26HCfLksK~{5K0=6rVC7 zV?7r1+}wVV&3$Jmv7^PkkqD!Mxv~ny9=v4f)j<2p3^rOX5affF@2igzo->WU%nlB8 z0s0KQCS6nI5!qZc>U@dsJ-##956kHz^yvivn~|Rr#L$Y&E9;(q9YT7psyO{?REb63 zI4Q&c>cszUb%h;DRn@|C-8sPU-YmhZs{>Rz22DA*SBgA8;SWyE`eCb{H`I%6_qaCT!}lt#!zAni`&c=@IRYe!k%JT%`bYeV1jQ22tk}!h^#eLZ zZzq+J=~Nj7aCuQY(PQUAf<6SAk+`1q@H{CpG)z~6hXg@rwY=o>0PQ~8;djdXox+WQ zgcBHHyDN4?0Yp$|f)}I-O{w-m0rhZX#$GJo1ht%yOlH!+PoAgB0o2i0~CSOmo7$7{iU<_R2 z`qM|DB!lolG*dOUzT#qp^&ahB)TO}eSKvs z@hx8Nq&d+LsiFOxF-p$%_&<7eH7R5qS22DZ zC803PuA-B^g1V@*LEj@k^m`UB-;C?+2fayLnZSlalHUuRb6w3gbl>#<<>yy%A)_|A z#VtlH}7p5I|hpfOYsibXb_tPtVK(PN~F52-?s zEV0HOz}(N(VjI$knqd-^9GZmZ=FS$aIr1$NNrX{h5%V#ev#4X${H3;<`Zak_gyQ(y@_`FSpJnd5^h7{Lvk;M!cnO`7}n5!lnVFGsZP>wOm1rEQ1)b`Y!_s$9^ihKwew&BJ_dn zLx?RoLsBKwy>`O<{AHOpJReF1GB@~?wYU6G@{yoZ#hO^WL^n_vBbZt5kL-oGO2g$a zikVEYKv#oaQ}ZwW2opl;O-$BWHyT(|5V+sa!W3n_7H^G_;-*1B{e2J|I37Oj>bAKx z#A47}-BOoB8Kc@5Q7Fhh!=xq+GV1igLaGWxK3Na30T^hLBDj~CBpAKh{#+Finga7B zya2%Bn@%!+p`DUn7>lpf`^T^Bu0e1)`l+{6hvCAmcSI#oE<|C@^r$R zjR?y!$N%X>a{%Yex*jfiUm+=V1{`;XejY@Iv!g$O$`)gN+(HWc4|miF;e>H+<{Ato zWKJOgAPk`Qf#w!F=PU&u^fsC_)}os8p`nnrY2-^?-{0xyVu}2jwR3?o=7g2r(=3%PmARmXo34>oM zN3PP8VB_Z&h8woX8`#tt;rU2mJfMfF+3NEqdxP^dnp%hl4!33c%F?SQK#S3Y6En~| zu$@eV1>2U~@c6`fW%tbeWwEobz6n?#2G}e0Sz3ns(9)oI-9zuP_tksJg6E>h1 zJrRTOTjz+!GVNb$XFOWP=GFu>XrD@}x(f0W%hD7DXqqyD3Y_u_yKq{s%dRDT5fi>I zvgFt?Io;mj&~<)jPdXc80Q?b>kb;(*6||Fhyhj&B>;h8+qlQ?#?d<9gG zLdcY7zAXRiEdqmL0)RMaptgc8E&5@Tb9=!lXv_o=2KM5mPeD%oSK)-kxGRjSCN~5@ zaE_S>K4Jt}t zZ>}5qE`rK%M!PpW-NPoiaHs&rUj_$5Jx;W+jYC^dw{B9)k2}Y0HePtb!K@~@F-QY27ki^8HPsLw_mSI2dHpy*8Rrh&L3AZfZLtOekFzO)hiAKkpmAdW ztc!tq|4LO{_D7JU5n^uL@9b}2Xdc&t#F2em)r4<@#+wYwBSZfz^HP@={=z zUqh|`ijj2YIWVsu_mB!PfAed`l-VqfIBR8goD;EjW&Q;HM%KaP629Kqw*BXFaG7et zgd#Si75DDxS*zmq(g3Kq)NhQUxKJz$e>g9ky!aGgzo_IK_|8;VIwD^SH) z`K!IzrWLvnmZZIlZSwy}rHX!VE0qRaKn~$7lRi@}tM6DvSR#<|Y8< zIPqlRdK*wPI(A*1X6l9OsZh22W~k&4Go~76lMjKe)$HeUPpbZTs!c#>Y9*q0C+ggn zS->EkRQoS6L}?nY-I@M~>_KFlvOtYOjK~80Dth~``=+LE^gK?O|x0&{hz8F1#!yd;*7bUpHL7i z5R(~mLxU~dng4xULie}?qA-%0?`DCC_v4VTZiN-mHI+>ddFO=;TLC9kYA=;Ch!d7R zHVrXsp@SaYDOWg@hH&wtK0P{aMM_xUVBbAuVV-hOf%7t%6ht)KUP_gc(?pe#J(liH zkYr#nVS&kw7F##&aOC6K%1X9@SDZ_hnxWT}1ce?{UdKON!*V9z;xHG=aOw?}dJ^^7 zLQsE}I6nLN+X*pD2C)bRlp*ukB@8jmM2OA)Z~YF;zr0y93e-#qb%I6*gg>kY!o=&& zvi$}*Bs6xcV5M;os(BTXhv1>I>@Ab~L5YivN)OZ;63T~(%nxAW3WtQWgbSx-lO}7t zCOk^`+TvYD)Uh=y6K=ENa8{zqG_P1K?vIk=Z-0;@cx@1FlyrTz>tbpwL=B&^n}`2% zvU<^V@Srs5!znO0Ou4*cbd#K8fK=Eqs)XMlZcjcHMf_Zhv_vfo9H1{X!pd-cBzD+XuCK1 zH*ZXbZsW%YZdLxxjl8ih@bE#l^oM?&TbB80 zI@Xyko{BmR`A7f1tFn8{J7Akz}w)e31Z1{HltCj)Navl#w9W6Are$D0(-G%whCj2L; zxvaY8v45LPqCkkEyo1rc3ujqTj=~^Z{9T$bPef2Lyly$ME5m)(v&3#99x1oWPPrNX zLrx?^ri7&Oo}-@KrhwwbMM1%bScheC)f~#~qyrv@e+(zYFp6~=Xw#bFv4`p1#m4Ag z08em0g%c#sKIk+EA~Y6oc%LtmzfEcx69?!}sT3*| zDVOZIGT}kS_QjpAZPoPS*eSpAdFA94r2%XCS?0bX8_DfCphFa!nX3(wVj*YBpObg{ zq8K`jkWqX&_o1jiX`lblJ$-KdPe0n5h3uW1oVO+k-@l(j-iwZ5k;?zCgf0-euSSQ zoSmzeaoO)FFALl(gT0t*s_hzC-26hOCH0>Ub|IF&NXWu5I>;c(5#4a$lvWCajqtqX zjLQ$H+0%1I)W*MIk0=-$T)FUzR;U4tT@C@j-Ux%-feb6zatANI^fT9x!{JDimLPxI ze6Z`{KYr~YszC4X8()C~?Q*4vKGoWgam;cYe6P7V@R$S#@|Xx3?Hm!GTfB#Rxi zY{#DQ<16j3Su_s3J(i#lr_yZJNuJfzvidQ@E~uZBnAsq!&Pm9K8?Q)7kd7at!mTJ% zq%u`vzzR>auvg75Uy?q#V+w&}gIxqan`q=kz^ZM-%(M`~nO&J#?=6sT4>m}H=f42l zsZ|xf(dDSENr%dLO1YLLY)&SW3Iag)nTM##VXK+<%Qa(vchpBP)>Vagf+<-CgQ#&* z!u;TX1N=JKt$SA_p$E7G=&u5m;1u=(eTi+pjB^FIR`FkTfBGIRD=zMm#xZa{jPKxix^hkAI>D8{FNSsje8P+lZfn zDT4OdaFGOMnT7dw&!fVJ=n~z36z1V>nXjV+DrHyQ@}VA?b0UF1}p**7F91Fj=B9XD%?r#W_7f!NlRRD2t&Z z{}4|Zvk9Oli&4AZ<||){w?l*TcUFl}Y9~$9Z(I<{g#1(#0A=?xkfVtuKD7LQgu^%4 zUif<~MBJyoQ3-_@KYHaj-H`o*kX>3ML?oYP_4@2_yafJ6XJb-sY(yrYQTh)Mk?aB< zsOV4;Kaqr|WOz5=?}P|HRE$-Y1hoWqXO1Z|tJPQlLLbD!PdG$jofhbeJErug<2@AP zm+I@5xdiDVZ%%e0cWx<1T@@FP(v{B7jy5wI`f}Xz%(0}sR47%RZ$EbSnzh+$?1~?mfon#>c zCu-Gd`oX8Ku8!t!k^Eb+?P;Mhyz)I01z}*)aigKYI#F(P@XEw|ZObWnYsjx*cUs@| zG1w#8s2N#}A;m!67}L$T%hA2v+dpJNXPXj%4R$p!Xg!s3f?JT2Rl(x)v9!qHA??fU z>#!59Hc4h|xY3kjjBzg2g-Enw-39#^e_T@naJJ5 zW6fYf*c;$HWzE_lh`g+ZKV3mJMs7AVb|)9;hI(!{+n3k;KH0?dpK%)^Fd#4VDI5feC4WWGUxA@R!M?tiQ>^E%3x*8_JO*KXWQjC9vD(enAY+vxM6Q(4Ap`_?IA9|ux2<2 z9}KGo?-=6B}A)x?w36pxbMw|a9=0szdh&p8DwX(W^5j76*EjhKo zyQAYhsH-Sm*`c>nHT4tht2ydm$E%TD&xmF}?^V8ReAozUa>8Z|e6^F6pB__MRYec2 zLk7G>0<2eTFvCEKVU@(v(Z3_~_ViFOfra5wOjhDwV*1WKoN;Px6<22hSbpkgU2{Kb zmPdy6&n4Q=ho(g@8csG(-G#b)ewNqgrZgl`AeerpMp7i@68#1z0yZ}D17?zAr#~Pd z_Dp#JUFF}oW9iGkdBxojd(b|BTnJ@p2+N><eN6M^KWdDM_3EXBPw&@~-TohzVKrAQkG@2_-RuQ2mIaM$e`!*~u>#NUa}Fc;u5_xL z-U9~|r{3oAU~`}#6%=u8^<6!U64MJVVT6kqx#G%OM6ifcII;5rNVvQjeUiaJFrCFW z!uv3)ho_GYSsMM7VSzf%04SmJeYi1(c_7#>8kcC$Ozn1P0#d8i*Q6Nt@JMkgddot) zGXQ_2Qj|bdyPn-%g8Z8j_#oGn0I&e?r5Ycg*DNK&}3cfnjmq5Lps@@;r%J1F`w0*ATH!C-|k%0W__E$G@KT>?i)f~bg0 zV(d`RJ19vp4qcmPmyF)dOt$@Lv(YE4R~Y7j-x5)4(ryIn5In&N z?(Xg`L4yQ`0YV^n@Zc68xCI-6yX)Zah9viX_pQ}y{>@CE?y6mTS5=<|k3t@sj0nIl zItg6@Q{*AMIZfjEgM~Xsj9c94ETRRz6geDJnHAP}gMH-wkG@vMLD7=$-+VPIP}dhm z-Qg$n*c}EMa&AljHY_P#w12hve1+?sr^x4>r2cSV#F$UAb8d1;Od) z*AH(`D)E~=X5Xhk55dCXx+yQUDjDu99I^j*eb5lqR1fxTdjk^zu!GeAuUuC}mvlAV z!_6|+i+68*^g~}W#zjXx!nR5jr>BmY!#o=0Vtp`_$3oN)4&>HM*~^KDtX{J+(?kpL z!vvxe&fsGVP5!1DfW!bnXkf(MCr%xGy)xsE zvSAtJMkXsm?8z>_xy2t9yy)JMQEOV&zU%xBE;Njo@%!j3PU}iZ#ZWVvK{u!{@q6w` zlNjhtUe<$154qEVt?$VApYM23bzOabhqaM=kxY<)r5SGg{CwE1>qe#9SlkrQKPa$0 zI5IR+25Ks|_+9(ylH#Y*$=z?x=`bahgT@ZC-(@7G<^Y7GjDT4^1ZnE9S8)`t07#(+ z=A4KykQQl#1gDkWMeWJQ_Hz~gwRlv~Q5ZFHzUt47oOK?y+#@831B1-xkURc**ZJ=b zpQicuCG+`Xqz+2*+9hpngb}YJ3?_#uDPVRmje#~$7_6y%4n^^{R7++@uMs__S1Ri= zBb2~pVUb6w{z4?CjzU(?SM`X|T_V)MNG3Vjv%zlBoc^g8qd*l`^^l8U?2_F6fQz+B zlkM{g7yi(v8b6(O!|pYn^oQ?N#X7Kj$?imCuM1@Ii}9?h>UJ4^sZ3$W-r78b40JW=ag^ zJ_9^nEm9H1(qJ08U&S#}l0_4{&)ykb8tAD2UVdL3P?ZRki&v#Vq(W#JUn?w}TZ?n; zigvhl;u)<%sNj@VG23GXj!;PMYvkjrm^%RB2AGU>#4irpu_s{j+tmuzrz46guleg~ zSxujy>#0U}VdJc7pCM|hfs)n^;*mk5T8)#^M&EC?Vc+&izi&m)YRtczpkSkDxN2oE ziLtSrgG>QmIe6}gffjyNrtvM@uil(rQg|~(V}(ur->#-b-MVSbk$ntz!72Ac;$r)a zSj-m_PS63u98Cq$ziq1}PmAmE+fYZLa5!@$z4w+;)1|i_n6CFqPe%8Cg?tExY(*|b z*QU^Br-|AR3tBhrg7)rOv|~^SJgma>&%WE}QhuBPo(HDGAEeEmh*pnGsb^-VU#AtA ztNr~J$|*)!pNC534X@n@(8VW_JfT)}6b9xzP9kRMAXk~c3<3)AIRGj9g9$!6S5T(r zd&wc&On3t%=T3j$bQO_Y%3a)nZ%6i2h#oUd-PW5q6aG~34Dfj^xwM}#R)JFQ%lEJy%aMp8P_REbuUT zXnHK>@EP%b;^ceHE_fmNwVE(V>{I zHmr|eMofC6Z7WurE?3+xI+SZrIDCrK1^3kA425j7J$o?D`Dsj}jm7!8-uC4mAmb*! zYe{^atJuv_W48#G60<>==m&T3u97AGq)g=SOpI-6Y_-6Kjr$Z%q%5Z2dk!iqufqaL z$^Jkn$caz zI2kL6R*3r)HLHbjuVa5Zyx?bFsxq1qE8g+TH>|xeO0U6_` z#!ndmiM1(#pHhGA{V3g+yokZK7hI7_V#(HHqSu#UOpFGvFrvAhK47*Zc0)67>uc>n zF5LZVA;YS{Kbcuu2|6=Yd!81d%PQJYlf4Kot(foVed2Sj0$VaT)PORu19y6$$777h zW1Za+h6QwJ&cjE}S|fDM!Rr8i|E7v3U6K$KIN&^W0J1^f#v6`jeOAZBddvT;9%{(< zHqucHB1|%0s<$os_H1e66{ZDjll+Ck#)9qMUZ<#N+%~5URbDJTJWXOG>+=)&@YuX; ziHv@+LnVnh{3s$YmHL2V0%(QblU>D9UdJ=-3@})=r?wiR?ZV*0-@zA9o?BmdtB#_B z5tnpfa+vt(E%;921^g^Io?FONYE%{GX`<9u5~db4`7NB!*@HPxa=UI(rXgjh?B}OG zR+sO$=5qH|(W}4MW#DiP=dIxyGb!lBGV~CAW(EwnWvn>C0%m!)5ER^XTlTe6Rfj2M zhX=0SCWm<0?MM(q%pEi2UL`o4VtefTP7!39gP%m5m>XoFt6{l&V6rvk9vYX9f(~CW zALdsH>hXiU(U$G+GrBPIOZ?oKKA;Yl&pLSCf`4xc^?|QHB7Z)XDs_Dg{r9Wbxdx9) zxqnE=D$!-pHO3~*oj!z=sUM&8URuWv`TTAO1g6rFCRmM6_ttslj35+&hR_?CT^ldyCrDAm zFR?@Yac|`7#-|@D&SD+B-s3<#grm}@=317)Le8~ahagMX$L8C;@0r~t4UP!V?3d2L zzx%HE-@7!n6hEYQmk8P~mWLo9$z0{?45fU|#eP{$Kgr;^5u$)bAE!R7yHdZN6x7Ak z1=o53V^_B7YxOy)`*poNyhU!MkGLdq-y9q&KvrkRcmkVLW+^aJ zE)U%2i&8QFOekCozYjpo-Y^mZR7x?0L;A#tgAeVP+%KUi1*%iMZEfF}?3K9J2_l-J zp0^SMQ>pm(xhglmlDQuaQO>*DhP{Cz6%H7@jgg2iOAq0QgFUylSYa2b7+>3$6z!e% zy9t7!FsSV^l$D}J3v+nuuZ(5C2Ww#$aN;G>$?HU7#`3JWWszS$WH6ZMQ2+*@a7nEL zG%PD=F0|86_`+0wy*b?@rPj`LP?;tA>(P|XOaNz-T%-34Z^&LlX=>H^rC6wC78r=% z8qt!ePLCvSu0zwGk4#v7E2AKfJ8*)^T#+CJap;jS4<&q0bMuzt9SZ-dif)-gFfycZ zx|iaA`T1q;(OsiBKo@DM@UR~;(02g#)6{N42CU2PM-o!~M^vbv5#h%y`h~r>ySvsm zdYtC5KI?A7uUX6%TgZq5I+Q4+ES{H3YgsvuQU;r_a&i!;+MGmx`upIe8-|v%zJ6pc zBL=HizdPNV0$jmkHRl6#OmNrpp(5c)ImVWuko&^%IsHFrMZ`S%>VwAbzhBW6*C{vu zmO-x)m0P$L0<<-@#E9r6E-gJcAtb>`7VIt@&FvP|NBI!T=q4R<4dRbuBjLAYYfFmn zq?fEtr_Jvv|6Q!u*Im+xWtD0t6(RE~IPG6QKA8w4+gv<=Q#LK<+%6p@gMLzX=%2>) zt$qq=K~2`2XemI?@?_t3Lup%hKVqX7(-6oB^@HAO3P{$@n6I_Yd_eI+T#RK9+1aJs zLJ|mX;tZT4@#GG(>$xKVU=GPUHQ0B)>95?C+yxyXmx1?lh+Sux5sSos(T8iDLG7OO7R*sJN1835sRVO&C=F zga?hKg9TIXN9gX`@oEtRwCfk+dkRg-dKg=ev^P)KOcbxBK2$Zs~9R7KA%4S?^+&|wT_uxp=oL6>tCi&yOc46*l+@RMDumbP;2UKT&n9rDCEo7U?ADeJ) z&UjCUfy_^1FLqNZ;lVDUWv5fiz<^$y%l(au!-9dbUr5`lo-u*w^STOOY3Yy@_}a(w zL57G=8$C_GMLBDnV)k~xs?{+NhlIpBF_^a5M(om`;^&<`KWysY;JvGu73;CZjcm1~ z*t(4=zV?W6tYvs2dBx66v7s%BAZgeu57tRsLuckoL^WF%CbI6&c z_8$k3J*Zu{DWf)-_^()j1wCIvcm~d@{!&~3${GooilSZ7T~=miPQIdkg=wnUy)*m@ z_|#>xVzT$=_nP*pK$*1Ol(9Dr_?`*(e#?kqnCRqny~e~S@Ks-Le1`XZAVzLS2?fj6 zbKMvr%eZpLjk!8zA6|;PL%6&;f^Z}r*g1*&gORNsb!D>c+{G+1Vj_bT>2-EY45KWM zB>K1`+>Uifeka*4&v2zD)Qi;jD?bG-)W?4AH$m`8265tcePajl4gVPW{@5V}ft(U$dNV#PHPa5(n_>?0vqX-%Gf@9l20XMMKQ0V^j^5Jm}=y(SG$TTpRG6ZyUU)g!S z-ASDLbw9R_FP6OcM_}CdKE$_Fupc=IwL9SQMRqH4{js zJHd9e6E;QG(>W#6gH%mNvXd#HbXs}39CiwQCnMVr;*AGUowh>ZqJ_ZFd8Y1-u;T=j zgkdlQUQd3GTb$!ec0B1VV~K^>ffI}!QhoGVUoNH84s@*>zub70Mw{zv9QYKT@&ZS< zQ=*R&V@y#Yy^qokCJ|^X1v!y zlYXUFJ>or4p`}&Ej)`<)K7P@_X2IMYJ~-nO>v&T=?wdUeMdHam~ntTziP(TbVLM z$Gk{Ze8g4Xz5`pdE&MVrW7|gX8?~r1R@CG0*T+E%~hw@x?GVbX79rZY6ynRNxfY3*AL${`Iuijf%pTg;F%lh%~z1#gi-9F zxT=yBmRtAZ`|^fN=JndPjmvIis>VLyzA&2z9AGA9&v%fl&ka_sn>C+(&fp0L75^Jk z#p%P@Fjc_Y8uw-umac{(bkqA@DGiBLUteK{!_|y?!v!<*LwmkSX_A3W&a7Adl2_Bm zhy#3UJhG9KJz^S*!H7ASt4$6V7sx^Cp(jWr86Z0}`Ms@KaV?RK(%C3xo-h?y{$U-g zF3U#835sy_jId|Hd(7w4>%)bWybaDj!0W6DliKfta@$yoGk*cwbg+|=KGLyL z@w#BglA_61%dQ`3`x|rZ9K@_YZ?<_jid%}B7o;NJ719dYmEiusvA6_3^x<^g0_p0P9yv4Ane&e!Dqu)p9}N zZNZ?Rx%C&RHOrB@%b{I82bFl?CF%`OzsT8Px!}18N7&@nX_60|Nh?x4%sZxIgO}B~ zaP|rN;1qzujp~s5{)2=rA*jybMmq_>FFSDvcSy0EEh6c9p29;7yAG8xBcynYcIZq* z0Zli6#Zp&L=bs-hb2NDZqvjqt$u4h0@e|uwaP&8|q^#yHV?m(6$fVWhegxmQCDI3w zF#93~qoG*klmYINgy^Zc1(#$zPXg8?Y4WJ@T<#@?$#$Q#y9YzmTTZhFdGoFU_X5px7V|ct$j9d_Xyw1oZz}z_s*By@POk<4M3xJ9BQB*C(458#=JB z&W6x%+3-rJN}KM+c$CZe&852k(cudDr#aY{IW#ju&r6-WelxJ_k;q3}dKZHkEpZ~C z5&2$CBEeE?4Ywc7j}Pf^&hYqnFa0ag?o?F5&(!u@dW)8X&%sz_T{=jrT>EEwyUEhG z8R+z;h?5clP$@O>U3#4EyB~W6t!2MATCnz*Qj=?c-|q_}4#v9No2! z#4Zr_1HXcP@kC++dhRWw*s0GDxOV)=oAd4_&+4qz;|YJ2y_>86y9~(#sh&k%ggR3i z{Md`=iLS|DJN(K!G{_?SAV`a%3K~>^@vIOs=k6mwex%%S{ub&3-47H>{tQfBhgf0jktv2j+G)HD|4vc~c%Y=^VFmPJ?NJ^0k2=yyfTG>tG2f{{PD@xNy-fH# zq6wueL|&^SHxMuc(_5p1J{@`-K~%h7pln}0S;Hqa9w-U#3KJGR(Cy+K2Ygjl?8;AN zO_Ix6>Ws2W4)IZ9x~^B@qYf*;p>wg(eo1KkIgJW51&EEMJ*w*rufkK{2Cn3D9& zYu^3^Fyk{oOLKzdX(hXaCt5chxU*QDMwaHxB`DgCi7DQyBlgG1XnK=)P@7Sl11y@? zG^O}COp9QFWY!ZN<8a%4Z)a$k-Xh||+G^+ZL+t@S^RO5>9FUTizM(Jex^BdX&K4Xa z0;x|fBYt#AlxG^kd46a%dA?)yfHg8I&Y{0266c#h&J)L-V$YV~%)&b1sO}26i6*Z({m8qr78|X;&&1mAm1!c-l zpwN*@qaWifob1XEH~CU9=I-s2$#kA0kbsW*Bg1QV&f=9JpIAcwb5jTc6vTfnx_w$1 z8e{$`>m!=*akVw#LnD5nT9}PV(9)Yjys0fvXN6xnwp!q$#p>{sW^mx0dbXp7S^i=u*st zwk5^G^xmmlX@eUpx)_q15ZSl!I6~8j zxPuQU+d21JVoamRV4Sq3?u2v4Zxu>6^fU0Q()%Q%GKMe65vdYr;2YrEJBoGVoQ8oJ zEEt(Ud6kCefA@%V12Wu3Efy0y(TP*~0#8y{lm4QiAp>7Nc#i6mX5xf-a%K@JcdD#J z8CNu6@OqJDN?z0!Nh;iD7ilTg^tdfyxkaXb2_+pk7&kdc#+_JrOiUdA`4&D@MIO_@ z$vbHS<LxIRThbmMi(XDnTzvS%^|+3u*Y0_&E(*EbZV?njGa3505d<_Mv{&NLTB9 zXjw2GBQVpuu3pHey~NI97W^9O2bY|Pp~0zGfa3zn{$pulgQYq1Q&27be2NFRRqy)4 zlHJR`zx*(?N+rjpIUytf4X2?aTrNEsTi*_fBjBTt%{I3&!IusoLeFR!w8CZB(>mD$lh1-Pc~l#3Lb0gnqEn` zAMOJ-ql5X5Gy4WjLK0@MsG=@>bx(3aC}#+yj>;0Awh(-Wn05UhHTWl)txe|~O*ZPT zI})bQhOuKNDu)1a6!X&k{n}pcX8!P~>oBUa-06hzq=Et`JR`&H)L`qe{D~}&4SaG# z{J?~E8MJ8cTa{Ire#6^;QGc~Z^6Lf2AfXh}R-pd=v|2ha{wb#T!i@@{E1n3)G2B)| zOQKlUSDCo&=~wE!7+e1Q1?vNoru7Lz^Pt@l5)5mF0N1jm;0G_$Y9|{y8>n{3duKSn zYGlVCipoiXp~Ilts+cbhm{3U}?uu5j*)I}Z2BwXp_<=0G2vyM2E_Ef0D&#nVS|tf` z$*jAe!QD`ya8#pfE=aHnN6B*H@8teXQ4o4j{bCho&K2we-RklInHcs{eLi z*dXA5z^^1Km-(X?H9_}n+o0t&;h0p;XT-@Ktg*KVPlnHXKD}g84zfrcJ9X1cFIwFh z4<>ab`*VbH!TB#qCWmPMHNgl0{)96ey{y8Z^<>o!rSr<+5nhUJ#pkyE-xRAbYHg=G z6KW$1rIH(U077$L1Opp*;Owb`1Eud0svSYFpuar0gt6S7By9K_uYgP29$wi`f9i}!CxqVd}`&1BNfG7AG#}Z zV1|F*BPRXvrs$IR_b%!0`6r4f<&ypf!X}q&Q6mS>mvR^^Z7yo<*NWttZ=E^U*W|)NHg3n|*mg1gpihV@wlVgw zr%+AF0W_zx8d1XOC`R`7_WQAK7uy-b70Uj1T|Mlzfe963N+M7yZj)yJFblGiI=IkU z<8-M+$VrF**yLY4e0v9_A6FGKpH>7A@jbe{JlgpgYz#rh$?xCdMiQn9sU8u2KtQC( zQ|`;Z*BTQI(#9~lXL$((d=kcWct94Y_k_S8N=9IZ0iRzZZ>#iVXHUMxab-Xj7L(;P&pl%usj)E{e1X6bXnfBnD69#RvJP3 zj3@&96mYtz=UYIUz-Y02G=h0(TXt(BR*f4-;fnqo0?+18s?3woWKQvWo$i z)!fN_0_Qpr#b-V+?jJW1XWlZbLVPH2nHVJ2NtR(`p_U^7M~v_MgvTtGm0JHLD1!4{ zvf-WZ`*y~c8BuqAcY}4aw2pYJ<-4f1@9j)(2E*r=y?vtr-0=k5X3~(i(R$0D{wDYP zR6r!{2&NG;De)Z7_htd*_JQ51LsdBAxO3apy+t3B;3r&5IN#&p*Gc>Y@I7+seSXED5R4uJWqr4K*#2QgG4c>&bV zt!mI)1>FA8`*gG{yLWeMxciXY`5)Yed@`qY;cD`weHNFGwo@I&*f)}W{%F@9$-;?{B&e-T1`^$Q>c7}t@c|)ax*Mb)RAghCX{F@ zRM$Mh5R=S7puLd?4zE?jhS)zI?+0KXsAZ#! zRpET-UDs#y$t6P-zYVOpgeF}vyHeluKQFm9N=(lezrkqz5jExfN{&F-gq@P^G_nu} z_cG=!zGJb4Zsg&^R9*v>-@K&$cVuH>%~^7l%23#b{uMJ{HH%B9EV+A9m_#elmUu4k;;(LC;G&LQ~A9NUEPM z`)Gbg%*aYWit*ohzl-BKhP* zpMIIyB=k)O&GxbdN!u|csMi-qpN;+bLN&fsisCctHz6xQ7XmRmZpb0Ql)*L(gZhlG zMlJbJM)S0sUt9_E?OZG{-iCGxZ4pRsg%Ctl&_I&o$6O(}7OL61l?Z!YySPDzgcJls z#B_D+Pl89h%_6o-D2CXQBhS#BCMbZx1a(`Soff{1_UXcxyw6|LS~7zpUcA%b!xRe7#ePvqr;XsnekhWGu6pus<9%A@+SQJA*I{A z6jFa_buo6jqY0%u%;yOD$jcb{z(gnB@nGlpv(BR1CWubRF7x5GCZU?6%Ht+7{^{m-9R6xV)YP{Z z!pdrAcY*5#%x$4L@(HMvG~~>yan@-szVLUP%D`~1&6oP8u6MMP&TouHmVbV= zabl=7Z>?59R3^Dzx-dPed%CwHMV-vcC}eDE6E2E_=t%-x=~E$2U|;+aXo?`u>H8~N zQ)m*2R&Jg^^~WvBDoKMW;2uWfV*zfN-3Il=VPSt#-=4 z_~nzVsVW1P569_GS4t~l04?*ZAoGm;bfKU2L%3+2_h$5gNuwq6R$G!fBpmE0cu{>y z)ZG!1b?>yX4xEt6Z^Q+ahpN#AkFte#nO> z6-guQ%n&idh{lI*iS82U6;KLH)0a&4Q1edm{Cb4w%4Q$^^D*7TeUwhR9OCr<$V!MJ zw(}U@(%=agg&NU^b$(Lf`szx>8e{+_Elz&p;Aa#4fmTb2BL-0p$OD;B_QhYee^Ga*DiNl|^zF^Kp#e2+JaeQFu%NO-pal|uk z*KG8uTf;p_+82`jM1#>_wlK9P?tU_>N96Asw@h)XwCY_W48$8>{Ed#jJ=53PC8en5 zpr49J`;7w+z8ZGR%Zckh?*h22oETVNE9ny!V}%7B%*_&OR!w;y8-2732%)nKDc6G9 z$9BFoIpOv9Ye7dd9XvoYp$LfW&$xLCyu{lgn3qX9+X7DpKVib#4jtww+AGHXY3m4} z4F-_RQFDb{BJCIwDdk9U?RI0xso!sGAbi?NY7`2vYJoD&8Rq!-ew*(stk&r=kMSFw z0B2Zp;ym13wJm$`age})Ttt(z(GK4b$~;TuyFc9Ok7SZwO$JzJbNpnGl9|Cu&Za-= z-JGI5REGZyMkq~{T(xl=m>l^WzEY2Pi1EIlb>MmUe&n6}L7m)J`*y{=V6NEd(FK_M z0XyT^IR7CnF_}{&8QYrgLGN$Ef+9xVK5~y_0wdwP3;*e}4v0SEGJG~2`Az}{B3b=T z^b}uIR1om|$ft$>{h+gHH#R$EI#%zK)@eQfuBwE7sSB<_G6MgR=`tTB$R0J@qwwgNCFs2@0>WP9VKWGCao{^S?_8fu6I&8jIrT?opeGY){0mYo{|E7euE zn67&CIzNbPqoH&COMcpI%J-Qkf9S^!&X9P^;LT+ySKsePWX0gN_aHOs)#)f#Q^Qsd z1bO&!sT*zQ4+=R+W;fc~DnFT=^qu~sdHrOKLpNiTOMT!PnS$(2a$SKuTf%Im#)t~gOB+N|^M(+9dEc~#4LKYdWi6;a=}LhEKu$gOCT z(Z(O*AfS-Hi#PT%2L~cPBO6-{Dr^iN^K?}GW05j2tj&o(Q{1cwj?joMzX8xaM=C7+<}EgY5q;g)}7Lw(IHF zg0&dry(pgIxip=>Kz-Di7^DbTx+z;9}#CT!SecPx&q37YMRaxAR?PaU@q=M&aJVOor;%-($uLxaB z+9qh;*r(X+FA^_}}Dq0$TAjde%r(9?K%82Mnn2Q=wi%6v_^h)Rk5`Ve0O z%gt0o;oBU0C+lXG*9X|GYoTg?Fy;->e`rA#RGr(q!SpGLMR6!wQAX~cs2>^J)O$5W z;JzK1bd=D3`6{_zMM!(? zx5lAP(TvmCM4}2YQu0qniTk>(S=oyp#QhfhM11bQvdS`$>);ZGo_T99L)opziQJB@pL(N@%ZdSDlX%@O_h{Bm{ zVh2rv-~20}Ap>?dcHaeJJf&ej9mIcetL8W2eNPNXN@<^U844P+qiGT&_h;zRY)CN< zOb@e2*fMx0Y>2{^s1uA8{yxGK@uh`NOnR*<0PL^Wh25(;gwK;x@|Ih;^YswJN>2Rw|#T2y!(x>bzvz{d`06KfY-lLWaS zx{8FXi&T&s=tubYvp2Ny&z9}0>YYlSzZCi9vx^f4h&E_mYDFCKSVOu9D}OlZCpk&b zr9k)e#Xx>%L655@*E4uv*k5D#o6})h!*m`TSQyOI1yP`2?3EE!W-s^&dzEpHYO#IODml}TsIuAXjV{C2b!o2Ub5>afJ8!KG z{*N0|z|6@6gK5j1;gbY(rKaNsawmLC;{>xbJwZ8KdYFtD)EP2F6>aKfI zE$@>W__M=&GQikaJQ_2G&M2GtNA~eXS&CBG^^+^~afMD3fmvdiV&yM*$^IxBx}%J- z0hd97@>2H=eC3|){qu8IWRbI;M-czI!+q!fY>mhP`@GdX^Ypk88PJ5cAo~vF$=66y ze9LUGbRgx05jj;i+SizLb@|*Oc}duh70(3ex`B{_kYSvRY%#cLMUKU!j*WQHI@cb0 z=`brx#j$kPSpQ#Qm{)GP0&Iy4O`*iA)b*aQwPo{t#)oVD&9a(I+n$GsU%=Ipm3;pd zWYJycIKka~P27G(OUtAs;2pVwfKGhfFXWe$v}znAp+(i7tyV1&o79v`%EHTZOEU{a*?ly>oRAMa)2 zH=NL8-KlZKu&rUAWAOc%$2vo8X}}AuW7I}fcA-A^TO4|H6br_r0gsLB<5W?-vN%$S zGE$s!d&%*Tr2P5!_r)|2WOC!Z{b7EEqu7g3gqo>pJ*ZU-E`{zz{Ict2F zdsg{4T?D0j*6|orjp83;PLkXGRScqCrB_`6>_`|%G#3EAn;_q*$jNuQtvEV}U)yT; zH{h>)olbmGhBYlQKaqb))y#e4f9ivNOcxjMHsOxRjxHRW+pZd4woc3im)fPEH{Y-_tSBBZA%PND~>l=$w=403h`kzGNgpq zrG6~qtW_)b#yZG%sTLKf^SSx`q96CyPRr?Mulp}_FD%md7ZR!qDJVQ^?iwSTHKq_P z$Sa%|@YoHdVAM%tppSx}kI)OH*{5>?Rc7+YP@PB@h-beV79=w_WY-;#u2l#%vrq?@ z?SdmX#w=srKaG*iP5%}gZ%7@tN$X-RLptx+Sq~}YlNXQ#IcYRo7IRnpBhghV!F*sA z4Iuo)*8HZ^NGC^?hPrvyl(Pw3DwkeWM@-_1u67j?=T%H*#7~b4tGsxw=f|_`zryz) zf^{)sud)OnYo?HGf<0%=mUhxTQFjc;MVM#b(mV?Z;i}%0LT<3#oX&?oH$5rA^aS6V zIF7drc3>nuqCX?c5dxBWWPum~d0_a8Kx6~X#Wg}wy)C0#ZVeHp7aBr9EgmFGTnXnt zQg?9Jjqt1x%8PLL+~;aE)_oadGzWPd1hG{Ron!VK)YHf#86^e_KLdCCK@ zu291W6ggv7bz2I@-=3R^xi+ppjU?YICB&P4SM9>SD&0h@-Ds5hO`~M07*NIS- zU9j}|pNp+9C=ldUmX@uzrG*s3RN6hcWLK;g608;`8dcSfr9pRyxx0He{_}U<40qah zU!$I=lX#_9Pc+%`uR^fL5+(N7Ufige8sbKmcJ|`%)y%HAy1?WnNmI7G0e8Q3?U4K} zL0Gj@5c^FZz{s&P#I6e+nU7MR>b9x>kp_rds=kwFG%{c}Lq297{qD3A^u%I1{KHg3 z3@vtWxtn3giMg{LRnO+{7V5)7kCdc}S7KV5p6;!+IJHXE9eubv$#D6|upk~`i}bzi zfCw+H5-`eQ{m~{UUd1t7VEkY8=zE^ekna~moOYt1k zU`d+9fl3PF6A!3aKeebB66^~#k--5~R9?l)?_<|}-HqK?O4_~b#`-A(6Yk6;_RR>) zL|Dklda^`kAjAwQKhPnvL*bcp{I)KdGc1Ha?ME83C%^xf!g2{;1 zweJ1|56VS+LdSrnFAaRXE1mC!RiTR>B>z#l!;*=-J>4znQ!$v(HE3zjUD#d0)DBS= zjl!b*W?HWK_!l{<^zwbT{WWb)yb!5$SR$8piA3|bCj*PzfH_d z0)3}V|E4(}utEk@HW?N>9x2OjhPtJR?*r43`HH;`E%~d@YA|7PV)u-YPVbdFdw44A zVene3F-l7P&RKGmR$)6kP%kG}EWQ?m`cXy~ zh{UTG63`lR-t{KrFncL*>8|-M#wh1HrE3{z{+|{G4gldr!ADMGMjK5^JM4C#F)Ha= zf0~#;_=jv4=Sp3!HfYw21;I=~-LyBk^W*J{^EWyir9X14DmDL)-+s!4Iuh5~zI^Nb zjAnkb$o_6ciipUvh$mYaq+?V^FA2tmzbCL6@n@o*l-ZhY%ElVG9YROQOj-7ucv5a* zk6i3>AzO@HuBcVwZ4woE!K4~Om^Zr%-g=U6zSLCW-ygm5XG%k(RRXhAriIV#Uju`R znN=T{I4pLSz9%Mn>ipkQRHZ>>*F$n{EhwE+O&LJ>4eHU#f1; z3gI297MP$|SV1wGcCQsNKEXf;CxXKc4uU(QDaZ5};#hGsaas8_k}Cm+8*nv2xt zI@+hS)jZ7{<}c$VMS%5d-~!wIgtnj3cr-*rB&K~ZrN&E;e1mbpXp2NO=Qd>il++5M zqzP!K&_|zylii+?n}QTuot?zk1f3!4kxkXr$Z4&Ln6I$Odlwi^f&0K@lLdlK21G{M zy)UWd&(ypy9LN)h(Yw4RPW{#{opt~@XSRfahSjVMO;03>#*H0Ni@%`vuC=Vh;L=}D z4sIr&tX2Rt(Em0Zmu#ino)quxXrJ80WcKL9npf&8%_TN1sJOEqf2!0WnlxRmr|IoW zSszcfMV2#UCs5G~zKvH5Sr&!Be+p^;{kzGt)kKtTpqdbR_CO8|6xO$I2gv8t{2mCW z-2Ojaqm?3#@>ob*3b|0ZOK^~EB_Alq(B?}+f{JrFvl?(8pk!PaKo&Agr4jAGD{|0X zaJx-kXQ>0~3}R226(#jYe*4%rs~f$civV42rt$H&J0Kd#>GIoY4(CsupH}6!xxd~* z!pVra>PpY}B=Nn9&6h-hCTYznqHQtooFg@suLBZ_&o(nef3b(0{P2*_oWanB!&M&PpLZLE_wFwvc2y;HzaDR<0=Y*FjTEvD5rN(h+wx<**re5 z1EGBCw%w2Bv#7T-2Uj19aeAm!T@E z2ESVBB->_{U<|Gfo~2WsxF>WM45*#Oiu0=_6X*I;pML+9G)@5|?Rt_3LR6ASa3b?B zR8M}a%oE>e(;|!huEZEZ zJ3MMf6hA|0`h|QbfEwQ(XzMre9d*s-^X4)-j9Sg>T&y?CtV{^qC0@~(osxZ@luwE% z2GV!7Ei$cZNaIobW@7X`(TVeHUxG>(BjgO)h?`+xu>BB=xq63iMoXSrcC!g{lK8}4 zqcMFzu1nv0LvncRprWg3Wjdp(bB393e@VojuPa~y1BL=WtJo$6887Xu;$XSI?Y{J< zs_Etrt5t%3-_m$8YnAMWDw=C7Ie`vc#^2b>EiEgYlN>B>q!fuW@alqwVrZ5X)8~3O0IBW@~t(H;<8Bpy?c0pB2ON-Y9)Z(O-#o)mY4F zv=TkyNkC@R5CF_5md+h+Vvk$i*hw55l)!j<9buegWhwbC6yuZHd`-UZjL%s7N0Y#S z)swa~HjJj+Lh_#|yOy&aCPl=bpoFgkCZ%4efet@35yPWRJh7B5j$iY)2#)%X^Xd-| zAF?&aVxY~hXIn5+28>WCG%s2~ipQjLTdjug>O4-J{%Xtr6i4_IgX;(^xLW|r%G5Vx ziEe%Y8H-Jb!Xn{5$Jl;*MglH16SLr?rF+-am#!AqIdjFdOpvPzXLrUF=p-`lqB_T` z>ZsyyHYpym7oqG_rCk2HSvbs1JlLzoK8NrKdH*2 zTV&S|0+7&n9~guKDaFWse{6=+6}ohH4Jq;2+yfw!W``}+c_E5Ueidk9aT?}dcXR>C z&B%)S9Fo0sLqeWk0;Wy(ch~4)QNz4p0l`dfg4Iz??NM&u)qZ(wjL`nkkupkH7j4Sd z_>#Jvs?f0hN$O{1vQ5T=3BMQ7_204Dfe9opMtN2sp-6H|1)=*hC9bt@UOWhh%vbY7 zEnT%j`&Q;vd1ndfsj&G=CGHu$0**6#r9pH3SxFsD7)aB=WdG_(KKCKP;Gk%aemnl_ zp9JsxMr&*q+~Y!Hr#wA*^_jAShaK373|=9;C)tFw+>aZgR<+5tyQCqqbJiuB<$2VF zktrm$gpi`UaqERqT~Oa#ehmY^C0katySC7!eIG819rQ=F8K)slsMts*dZQJug=k9! zjyK_FnQZ$w1`0@!mv+55;o!20TbOSsfA#p zoc6kf>#u0f3LnH%qBfTS0gaF&HEF7lpyMpuab6(sj6B5et5z>?lI6UWb`Z}bVNAmW zv?e)=y+n+Bi=+I@GqD6;<9k42p6U)7(d#sV9`R88ntyG5@i@TA^Jy~1{MnI?g$8esb4MTB9<|Och2y;azS@^_-YQUcT~>0JWt$_xAf;NiLzAr%6h^^P4tQZoJcmL-Nat5XMrT%Md{_ zRMtbI0!C#LK6{-=UKX`m?yqY`UmZr4f1iJSJ{I0Zk|MhKfObcTqrgw&&Iqs7n|b>= z7B=G7<#*05qTvM2UCmly{~sB<&M#ZD%8D6{Y3*A}wh(md5jv7H@pMfNR9*__b-|y% z`Ai~=XsM|NSL@D7rW+mpeKyEXYsg6BWOF$+q)UFUJ; z!znQ%*F&}g+RZhB-yM$7*6UlQ2z6J52IyCye2UK{FJCbJ2H?LEUHNd-*_p98+12!X zAqG?{TByMs;_O|Ua1a)+7ENb|dPXK;CRi?@h=UxeJd(kXU@^yPJ%C<;9BGeuwcG@! z%?7nK2DDQ99X9J6iS5GO;N-u|pVdxN1I@Xn=x>Kx+3sWnOIi(ySDcvh5?j-Z(IuWS8Hd2T$Zo$EaX>Bmp{tnzz=wbL#;`0QvTK}hp z@NY-E9%-G|)sz&uKjn*OLcK0UIAWvv`i*+gnW_7FxU@d}WgGQ{p!<^{he~|f5`Z|q zVjh$uEAps==P=m*Nnrx7ay>!l7>R2rY|P=*D>AZBol3_)z@BQ7mJO~VSNeG&_dAq! z6P(u{p~}B%+fIDFLETzYzC>R**unQnD-XO|lJFJ13kDJlI+s1E=5Ks{dHcYNNVFz- z+%xG7{D17dWl&w&7A^_|*|@tC+$}(GCxPJZ?iSqLA-Dwy9xS-KYaqC@aSQIQcPHuY zlRn+&z4!aot)i&Oti_hG#vJ1t_AS>KH6N|H=(IMzBQo@U5e2ZpuJ4I5T2ZZ8H{E(u zV$f3E0n~MmEaWP(A95pFWQYDz)L)B_e0yX<^rz#RJk=evs*gPlQ*PbY^YG;U4;iWB znf-5mw!3uX04h|kI14@Rh%-120Ek)Mb5{of{D`3DjuKHYizD5&tJ}F-RXJFv*iIZp z0;-v`JLhkoA)(S4{iTO|J9@j)TwpQjvmsdBOAwDaUI48`v3l~PshE>izwy%beus%Q z*6Cippu66ZS9#Fpo?lP}0qbTNU!go`BgN*igyZb&)9OoghYbK4F@UXc`{TJ`Np_Ls zM&bOsnCt*?8Ek^NKswm(w(}C$f%(0EDJN)g#0P#S0cSziiDb(OVKfedmA%wyl*-*m z`EVPHK^*Vl(5~P7reY;zL$U6<^%(&B1Lz>4WsSZRtvbTG<0nL5^_V(MFQ*WSg~mhg z$Yhl|F=h_WrIw-^O2$sPzbAV>iIdCm4rn8|9b*!HHxvURfcfMSiYf3=9&PUttf9Px{p2C1(r66XFpccyV!fg3te22m^6<+KC0g`?7~%5If0#rx zdLv_hkAI|8%p24RdCNDjou__f2L>0S)iDuf7&@Z+p81|iijDkbmH-JWN`v&@5e150 z1ga~taSCUDUSh57aerGYUeHWA-jyY&aZ!YuWmorfRX2Oa4CR>wC+bm!BwwmuOhPQC!dXS3?9Dbr6rP#F|g zVeT-R9zI-BN9kL$x>ooal0U83>OL&5ddRT{Lm<;)^>H0K{2uzVWE>gTrKZOVn<7zr zTkz*0_ld^MV0l#h&6ABD4w)_8M)DSq<{L@qELRTmgE20PzP86xp%2T%ukb!AA2kx_ zR-wHLpvN_O-6#qD_TA6&m`xNIo3R>n+oTvS7ZI{v!;O4*aLhFzqDzNR+8WU=A1ge4 z+kyT2C0CU8{EhKdP2V@-sn>XvA#*)ZcK2H4HXoQo6o!7aq5nF$ixLo^ARXb- z-*lj?0J9bT84lgMNKUXF?uBw0VV4)=XTzTi1e)Z&yR&2%n!G!KSOyvSv}%E$mua|< zr``;B-4Z=vDlya=V2GsK`^#zPi>3t(A(ab*!HuLYb5(c`cFcUMXT4t1a`w{jzJx8Y z0<-Ym;~0anK$IB)6kUbnE=2Xcw;yS@y5aNT($#7I{QbuQsp}!euGM9qckda`!<@cIX{2NrP4RABoF@7X@RTS-q-Luyw{i$7H6y6K!V42ah2x+!WOOfz&2>>?`*zrWI2V=8 z&Eacn94NYC&M$S0Z#3m{W1FmF_lp=oF{4wRJ*-)`BCq8B^Vk|S|SG$ zI$j;jED1+W6V6=8M3#R=@JvuGhZy6F`l$<~_Bx7Jc3(U!D+5zzcK5yz+~Wqc%G?`a zj}I1wFCZJe`Hf!D>;BPe{@0hhApoy~D~fr0g~jUe4(lF-`x`lTU;R3p_@vC@D4~8? zw~GfN;Y*$&1;m$2ZQo>M)^uS}0~f+xc+83B*b*)1 zUdL|2heXApGK!pe(>MS4T5CGQTXirSp`BFTFD@t=h>5KT^FX$5iG(@1(=f&yp=j#) z!TJN4ozWzTCP|^EDiUZ&IofdG98n?$#LMRc>cb6>Zt7RTo;fjinD+gY=`X9QUv&Mu zZvmyFYk=1z`;G`96p09CV!Fe$?YfJOH9v6hdqv3YCrq2@aHi)|H>=VLf7{;b9*Ij@ z+GMUca-kENTJzM@W8G4PfLXAs-FzR4Fgh*d)vrQj6=m>9l~1ol^zvTF@v3-}<_F#J zroTSEQ~Yt3lY+qv1=*EA4slMLt^$iz)l&5HAX(j4qdoUm%3~BJTa(HGvIWQ-AKvet zi_B7|%mV(~fH0whs=DNn>CX1vx7t4%7(tG9H6Os-m~59Va6n$S6zl_KjTGZ%>4YgF zZ?fmfFtXyWm(c(9fldM^cpC;44V`xu`-D!lpuU{iFA-Vrw8iUj)?93~4N2~VB=qKkedh<~+C{`T7?70ip0 zO{{=mhW!i{EFb-ZSKk% zop9)KU=~5LWk}LLC6*2rAcp|idn3KIHh@CVh0Y!q4w2e3Mj;c215TsC#$Hs${}G5D zSQ$AuphJ{xcjkz-+H{9^Df64m{xTpSSK|eW6)PZULLf6kp2_I6{B4nfQqaJQXxwk) zS6W#B_(LkR`Ot$2YyO<6(oNjWUiFV5|B58_q zi-;qlLI&s+#MtW*_^=SyH>)Jzh9wH%7rMT=)DPPJY8CgFlsIL5r(0*=kNTYRlrj8n z%IT@Vxzu)a&3pXv09<*YpsF#%5d3Hrdr&*YGm7IEy-<+l_%UsF zzeg@tN}dK?-8B9z7B}I>70I`yBO~|DgUsS|LDKD`~oVoZ98Ep?ONw> z(%JT8NAM5dAm)oy580Z@!IMofMq73w8vLaIfiHEtlQJpf+%Dresnj9mQGed8I(9BA z^bl&WO9F*5zgzZKi-{nlO+?3dLzQal1f{yQHO4hZ_FJJwjK3e^1~^brBd4SK(8dh$ zMjgdl_)^i>JQeqz-wsm93^hTYm3l-=*}pu6oWt*6nW@4!kA9szHCo_L&TsS5noDk5YCM6!DKs-lio>E|>c_5Rp$R+ojp1>Nm+ z*)y+2R$JBQjAUXdZAY}??-F*A0h=UI#Bgk(Wi}; ziMK}j71D8%5N}j8N;zmV$DY7CU)FICtQs~BW(oA3ivS6gI3(#PW@#lZQnrHFz?n|px@t6LP2{;C z#fPFE!`@SsP^ln$m|GaL{o72jLQCecBGl9)?=kmJek?UO2&;XJY=Xs*Swvb-YS@0{ z7Q11SN$Bp%OZP{q>pnf2*G`eIJxkvEZe~EF2(rc`ttVLiEXNB%3i_&lK@gRehjn5W zLV;^{N}rJU^TYpCMoCCL)rmGMvdZLkkp~f6e#%FV)Hg?BnTL-7-N>-**h_upAT;FJ zpBF9ZeW%6P1kFGNal;Ge|3{R*hy~8Q5;stSXB%HEX+JM)eph{I3us45_Z zuT;D{I5%6FnvIyOv;UPxvY(@Rf`-nogMbIS8u$GZ7;+Q8cN(E_#-lEii66CgP8n*A z%5Noy>lncx!>HJ)=C)WhM5;IH%2?S5;kyl}4|GqM6Y1;JRWi+p&x4`3Z5$t`sv&i8 z%dbz+oi9aHpr)qhchi3M}KR_aVC>WiOW|%4Lpf_%eu-{Q0ofmeErAFx=GWg-D zI|wNRp9i@Z4vBRX4My2EuZ8s~1$(`$C)q=6DQc*r7+oAI6z6l(+EO?k=u&!TWX(G* zLOZqq)L>4pbu={ol*bJRb>W-+$gEMbeO{xLuQbN5~nbaZ9RUVq6%TGgeYyTUP!vjyL6 zh3ov>x7E=R%Ze9ym?co>O*F?O@#=viZ}XZ_LS8DML-Os(sdyA>Z3?{N_h0&}mjXKm zJ}cu1v~au9)ioLTR&+3r7v2?1G;%;NvJ1{04hNa5M%qhD$zl6^&@r^}iDJ!!DM|r9 z_b%+N|8H#tpnCzT9~EmpB}SZ2#Qj7sX^|MEt3_Cqj0E2(49)5?s%n*GK7c{L^8!YDZd zBfQAauQnl2Qfg$Dv`q9E=CwONl!`n12NZVU)vqB!7{ay<(`Fh4lTPjJH7*CYn?Z;? zII|o=%88)51X=#<-^|MDH6-^NjC+@8{2AeP6>g3{JVa6&*t%31492uE*`3muZnOAm zn6ezmA&xp%k5}0=8(P2FX8~L`%1>w9+I2_eo4gpfr@6U!t>J#?0I5O=)~j@D^YVS< z7|!(LgX)gMn~T(+s?;Hkl2yv~F$o0tS%JHdSKUd`Xr~KHt1~+<5@i(ON&7=gwR8*7 zj5jm!*$d4?5#{l`xrEhkzGKZ;{!;V5erJ+1E7Ag1tu8)!F?Qd@fBeNTMUM!w=#+&j zIiTd3z}AWYoHjA_6~0&!)16@D8LU3oyAui>({cQqEQltaZr zERTeqG5O7nn8)YhMoRUx!)-hE-oWr1Bwwz0NWyu5!3u*|)}nKz*Mi&M73BRaU@XIHWpoMo`Z4L- zUURVY{mvqD zLzPJ#!P0y|#uMwJp@DY$W%VY_(Q+B6DOeY%%%d3?Igg(&$)Z3yw;zVc>N9U@f`~x2 zxaCfTg*4QqzNA!9Ir%zZ$Oxdewc8WtOR@c(-ZfIz0l#Itf;j@53Hp=$!TPfAnNPK3 zndRcA-!0W&;s-6hqX9^}u_v#9!_k#qjnFiPi;UAqQZAd#5f$zEQ=t)-KKgmy9-;|ASn}Q%1Hm;|E+kLT)@$p?A zpT+b{*f5A_qy$w7tGh!}%81O1!lV^M;Pks6{k2|&fc!{uUx+{N^HgSynri($bo)jb zdPUL>K#fuN9V;Y}b0y?Rn2bVADJlxdqxK-78 zSnu^;cw-iBWGOaSzrqY`>X6Vg$5zLMZOfx5A^bJh!j%k$7>Syy{^V|ULxa*&WStvk zg`W_@nI>Hz|1RCY0waVuwTiu-I?S8tg?}i@P&dtVeekL*NU;d|x_IsLH8{$IwvzRp# zl7mNt=zLH4fe@8r>%&}C*7Q3RHMp_oFf@=YcdB2<=(zzg-8=YhgXlaQ^9ITSQljy+64&u@E70Cl&eVOyVK$T#ZVu`RQW2 z{kmq#ts0qB^%RnaMA>ksNyPD^E6?mDb^@3+c4q-X`*VMR339Vlr|%_N%63;5g*gv@~SAoP{<2=7rpC;37eC zsUjILKRA2J9P}*S9(}H93ff#f-Zi(CbB1tJA*z+)!`)QVfFj#mPnEn2eZ$$4)qs3f z+LC1?uYKc;(ro*E-R163OOGoYAitmqQh+6V)p*$&bq(CVg)e@}WF5YU0dh>prrvRI zu`fZRA+$qsJ!SsLLEZ^uqoqscq#MbDEY%$tiDozMz5uyUlO+W1@q*LOhR(dOCyF{A zBydpbZy3d8ZEsYUqgT6Wc!6e9SJ*eI3zeoT$F5i2p^x3(Ak*U_Py{EqwB%60_k$DB zFOkIe2K6G;^8UV`{!x4tS~VY{GtV<_oe4)eW;r*JEnP;|Uv@;C`?WKkB9Xt+PBY|C z?^h7@!F15H6W6JgqpwnmWu3yu$n%N_1QHxu76b|vVM0AkV{uUClsZ+-WIBlM{ z!0lGC!5 z{Na5ss($%0f7p(=LcLRj$*wDyfwszlrwUv(4noZr+`TN4QB??D={bODnSnW>MpwUZ zYG{ueerR9b9dsDGZfJAs`^T{TamSA%5W*329^^0d1x));XGiICZ&$tl)}Qv5K8JQh zqGe@5;uE|ZhuLco1*54mf>~glhvch%A>}`3f1@}zkyV1KBh1S5NJsENr1CjFBplSR zNEy=$a@4<9ddhdPdm$@$EfbF-Jq*xS7|>6GdeqS33ra;K}lP3rp>HoQ21EP|pW*y~kJZ z1RgF#nZWWh%GCmB3*rK?D&0$eCR+Y!dKusOJ|(skmU7Y_&T~V^kUr4q7zs@XA6vD- zCF0&_X_QiCn2r^I*nKw1?;r|CF?7r(C+ceo4~EBkQe$nA`-^5hXtC5D~*z9vkKL z;G`}^UTRIgN9Q5h0u@=Kgo|3Jt*XIwr69iYzgEL?-Bxj#j$74SawvZJ!`1omh>?h4 zP8RE!w1ZlVJ=yAriG_=C&^-4KdoJDKcsCDj0F3&L1gxHui`602P`0a$VBkgHHCYC` z9UwpPf<_(BBGi2fdBlWxegc@^(Z;W}DkxlDUNWS-#VXVZKR71NZRdcHUox@6^`s?& zkhSuW({F?j=$;xIBoP$0HNFS1j<;9MP{&|c?O-GM%@$pf_J;HjV25%GQeZ^p&`VIg`@A&v#=y@tsNWj{ z$O)8I5@&e{Q=XXjD#oA_EQ!@IX@}fW_1^_919pU}^ji69MOXIV`DwrBPO*kt@O_w9 zHF5~lQyD{m`#WvY2FT}d7+nO4Th;)dEuo>W*W>MRhAET@Cftb1f(#FzOLw3#d^N_= zi@Sev+cryP`DKkyMuJUCXG{`#&!)}c;PtYk>RyRM8C^??ylNO)Fc%N@mZyM_XAU2u z`r^OV6Z`TF=2VJTeHa`KboLP~!r{-s*ZW#oCB7? z|Kis@lM?e~`5c*Ki$8`#WSkf|IYAkZf!Evi3J>*5I@!Lomq#e;8F`rY<>Wadt8;i! zv9~=;K&WD>$qX#3M-!1o-~=sHcG4cZrRl#*_l>VNiVAO~#1#vgyZSCWfh_8Wvo+Z; z`oPq0`gLZZ@zMxfw6j)g;**Xz#q_A>ahH6B3es zfwcxy2&<2;g;sZ|^NKdr@x|qiddJAFta5jO?(iBtrDH_d&y&E72_)#(HDR&C=zYY8 z#Cf-HMu%2Zjb6=|!f~=fh0$QUzlc75LV~{%_8|92(V+sPE)N|4T!%N3M2=K?fhIME zY=Qo^egAMkV@LPoGyWW@21yI=J8MMmWa_86cH!f9NY8^BF~IAS@){-B+N#VHF#;TJ zBeOqlT!%fXpzJ%K#ApEovfQP$M=o5IN5)Fz$jZ~?T<{?rE0+mz7y;k8A-P!h;4gSB^m z1tDE~7&-j(-8P#RU0A35Y*iQbAUd+6?a<`S(bfuV(p8Dz)}$v%;8ucZ-8$Y=;+*$x z_7@9?6n=V==fO{L-XL})2)WFhobSJGr%fUlB94mCX$T8BNB=`Xi8yBb{6^cr30?qcEF*R!&Qu+!@(xGIJdfBJv0cJ*BKGQHB4_bwzGr$ zbTMXZgdLH?+6(MGwSfWV+(9L}#sXFx2Z+l&fh)nvDhbyh)}t~X4Xo;CI6;Qs;+dap zB4qESA#qR^e0A)?@;|bhxSQ*Bve%b#NcKx9iL8YTvv}dWWpoYP;=`7{vxfOt6rZit z64@~wodzNaJxRf8iB`Ahb?d;itE2h-ffl;6PKl0_p!oHoyYor2HYQaH)i&a0*Ne12vnXK550WhcPmYE?l%?O4i`>IO> zYZaqD5WYEc8sb;1(1n`Ea#BzwYLr)lHLhC-r9j>0?4md6=Bms1Dy=06YK#@l>R=D%JL_b zMkl34CymUO_2Z)VFPJ3A%1yPEWUULz3gM{?#2<9DA)j!P6Vbh8- z({`WZlHbQQ=*L6Mb8iEY@GOy7k@tmn-IVo~@*?HA`Flb0yPRImwS1^3tN|i~e{uo* z*O~v}71KyMNHFdVIdjx|C+x81yCcUQxY?1F<-i|kso&eTW>>LGpfNo#?1Z7nj7Q@~ zQ|&&FE~|shC>v|L_SYUA9py1t(=1?xbXxo3YMFTJz5l3x(z›uWxAXnJjY&p?D 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 diff --git a/docs/maps/images/gs_add_es_document_layer.png b/docs/maps/images/gs_add_es_document_layer.png index d7616c4b11fe0ecd13f5e8bebed067569b0412d5..4656933552f26b3aecbcce719b32e9101ab0c4c6 100644 GIT binary patch literal 571469 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 z

    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 VbGs5h+2Q~I002ovPDHLkV1fswADRFF literal 330583 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

    ;YEwK$6v8dZr^NT4E<{DImb_kF{ICKH74 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

    nBPqkG97*9=tAVX2&hvUW-iTLn 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

    ix{ zTG|k8x!_FCndgbBsfCojJvN0aA8c6rb~)9TR;;;fhb`qPjy8J`6H&8*#Hp@$ z4Xs%m@gA?ORx2u)HebK>(~v3lCnE3FoZ8=21om+(K(0a_S;TzRx$CSP;L<0YYKmX= z7s-lD0lNL>rbt;=8cR#E)qMM8Rho*_VKb2MN81&VwOMgqx4+H-=|;bM;y1P9b}z9G z=D>)7^r4Md!Q{DlAZyg&VoMHQPvY7vT44nry3gbZ=Bn^Q?v6Vd*K1YW3TIb!$DBFK zD9=)XU_R=SKXblAG)~y&6SG^ z>$;N~7vs9K#=Pztxa{>&#taug#k;V+Nb#9GYh=W*$Q!8`!%hJqBE!KPkx=j*Sq|qD zT4o%T%+Vm_!DPmEi;i>*P3(3T`klVWPUI!yd_JtaqRs|&60_dV{ND3nnD@_)zYRxs zbpr`yGJB$Zu3zud^ix73>C-1(O`n^DUYj^$XkLs9C4uv0^Q_}hRGe9w;q>W`I+~h^ zh8FY*M-4EyB`aN41g1ON#d#$YY0Sr_slyWFueo*>`u7VQMNZ@!$mE5~e?#+;ut?7| z7|$LW-p3V|d8Im#PojTOnW=RN#-X60T5L*T{elRU1(Z;U%fRDQ*_VoH$!#f|Nhbn8 z?4psRuE-g)DS~%2%xLC1JdVm4d4scFWAM={);{a6wX`2(NnjojhH>V|r*JV@RvJhc zI6!LI1}Pb@>z?+?sPmvhs@X{zalv(gD1>gJESDLihs7IiH&+fwa^hCt^5 zbmZ?<>=Og%*P+I;njtuzK~?Mr*-k)*`tc~zsggerv!3R797Em)Mc<3y(xzq@m|D0HN8^f6TX zLPCTrC83JH@0zBt2zeL>FcuS#O|{cnV;jONsm86w2>~XtM1b_@BS{?aXA9El6OSvH zLm4*t4KJb#QL|(^9oV@NW+y#$~r_I7pza(Q;h;IJP;u z$>U>PSWAwrE)qs(7vgq@X-B;Vv>jES{ThxYz#K3tF)((g#k3rO!_&WwDB~ zGL4VmyqD59^nbg(iKl<+CenJ}Oc!-ePES>nJOo}E1~1Q6nyz;54sX^kKOl{i?{EGE zpgT7e?+04mCnG|VtVDx8mSC9m%0Sac3ZDZo27<-a-?v8Ms#^=H)k_x%-xG#wYI)+&r@vZuKsnw{-Er)At^KgtUI06CLM48@gNVxyAdM$qjJnRiM&@lwRTEB2xM!vTd&J8Vx+Y%FPO_amSlm5G3@()BG{?Rv1nVHRvLm~}59TBCK z*>O#GE980zQ@;dv9O937&Oqc+Jk1Dk%0T#kQfLKHn{A8t6kLCbJoOL->MVS1%=^E< zQj*2Ad&@7&&u!_G;`Ts5*GxsCVu!ak4IHJhlbu${kD5)bsvz*FV^9e2ElU=b)-5Y7 zW%u~~G?YFl_b9{#zKWG>50{(EUmD3T<1L55$2vCJS-Hvi?%9sZOXyxV*gc1O?$aN= z$koKMpZ7NJ4;nO| zwiDyfay_&g>PiI9lP}-MHvV>>A8Ut>?7QyF2;=B|J^1A))m*}4RZ^^oR=K0Oq@%c^^;n65 z1xsjt1u|YpW&48CtSd30#ffGdRG4e*8Gl~P0xfs%|Da?55E@HJ7jYH{!m|Xs^%x-zgqfG{dQsaQLC9<7@Rl-)l=7#p1zq4v)$j*07F-rHFtUD= zg`+=ozA8g18v@ZCFz8e=aog@hDP&WO-hB3$LO`%amk2J{gWl9=( zu9w6IuP9ycf%CC_ku;g*xCCVcUtO@~-GyMUQT}Er)nvCnez9>m*rvNM#Sv{(<^Eqf zoD{LSaNVSBj9#fB6!5_5EWnF+C3tA4z!(>~b!EUZd5E(RLTVP=X-BO(fE9?za7HKs z8baeIgLN>xs1L?frKS$8BuaWPh4kXNF2&DXgQ`*It@T?KTBE9dTYw>oYnA3%%D#r* zzQ&&S<}2i995r=xRQCHg^e62}W4Mv>zmrOoE!i8kW|3jVUn|5GXCy6ZqU#~8 zF4=GL`^+Np9^%%dcBeJhq?+zrvOtuM#MOF=r|l?F<1|=RMK%h@^pV@6dWm@t*6`J} z!kG{CUwdW{I{7~=G71l!D7-)?s~9tZEZ96Cu2KXc23t_GsX{uvOdZbxO(T(DCC%() zk<8bsM9m4{@$r6jhOpY-$H9nX^$@4j=zup^#P0kYqgKb?Oy zl>->yiL->Zp>)8M3?tiMU!2MDYgY$HZV19YnP`IU_)LEaQK3tgQ5;?NUn91RGt_# zLNJMC0B2&FPr&;Ds>Y_Fz zo8UrByUnPzE~b29@_9Coc-!wga4N1S9BT8E1!qcH+7Mo-Mr*vj>}UFl0}WwDcME;T zJBIEiLfdSiGe$K?Kf_p&;OLS+Nhn{l-szxX|CiWhWf(3jBsogVBoj(BGO!`iv*E~? z1T@)bukm|2nc!?GJOsc(98w{a2AE(P8AU-2Ec&*H7@oC+0D5m6&~Q{na;D?12k`7D zQOUgR7vmt$4flR}>se6Gu^4rZRY=&uJQO#&G{~m5ZH%>F%Oz$H{jfI62UUJe%T)kwr)dzJzF6v0n0+vOp{@y?sFJbW%qQQoB zDV@)huVDld%W}E z^fr=H|LB}*a|4VmDjiZP3wBDx$?-8}?@Sc0galkdbCw_%7rfNv@>$S&80nT;NYhI0 z1zJ3~8$p=O5nVp!4DfSN7D<(ueRSn5IfMN*7HUJ;9pm!FNr~aP(2B!TOpm_oa0m$a z?E)4pYVX&p?Ad%iZ)KJ$A?>XBCsNilN(6BYKP1``vXG+6p$Lu%q-(RrVu4Xd8iH%< z=x6>Xa6zUbLV%`-fx>jV2T6a3XM3hq(J=}mo24Ut8*7<35KodiJgnzQZH&I*7>(#} zeP6vaeWxeigAMx?dF&_4Zp}7Uhc1Tx$0Q_vDd9utW%0%@uv=C1us3z_BO@{mlgGa$ zCT?zN6Elfb*~7kA@Lr3lhIXjoJY_*(G!tUBM`0v)q6u(izd)lGl$6(1g?9h5$N=Ia zKfime>n#w+=6C&HOgM)^I54yuaZ~FDlTm`h>i%mRSx8co89&a@nau$$(@m z`J?^(4Z-D2s?Ql+er{g+kGg@X@z6*a85vsbuBTLIXR!>9DnX@+1mY6}Ps|+;1D|Av z%2Uzl35VRnu^d#0(i+UwGG>0}TjC}b^D`-@mr*$m3p1H~-eRVdhl^sf!iEcmj_0^K zHbJ<$?e^pM>es{Y!-$nG9Ec&@7Jfma!)f{wR9fe8+l z-GVjXiW8q+UM^qjeyz~${bf*`PV(vz`;{YRR4{q9Tv=eokL*n^zqbUwZY98J+1=WH-x;}Yqg*R(C?O?q zuv)vM(J%8q!Ztv}Knl@eZ6DNpcgMq#PWr=&bp;ma+}A;itti`Uk63zJuNUFEV2h%f z%9|2vGzu|BkeUEj`zfT_ML2Rn z*aiFUdz?i?6;Y%;Ect0ib253##=0x7?JZpXDGT>(ei%!uIH^Qw;>Tm1NY~k6(pUU+ z$YUnO;6k;Tcbm}EhVFw*kY({L6!yO|#H+4S#B-yYS;nQ)1 zno@zuy%gd2?z=g;)elCFwye)3r} zSb+p)`Vv}GoXbcAXX`o^s;UgnCkMXygG6*8Z+32;H}Co^LM4YG?@_Q$j=Pb?%vg@3=dw^p?s z{Pg)(R`F_4yJpK9U^vUlzYn)W<67ynj;3O4WhPiJ(^cz>d&3(%IKX|h=2pzqydl?A zI4EqZqc*PX2*}GXtn1`_-XSm)ggjV*5>O^VVy`u?VYYMi!O{@)my#OCu-Qk@y&4jO6)Yqsx|2jU|Q0oUL)|4cIA< zXX!)PFxJvcmm)RA(5B$^|L8hsIk#15oS;flowq`}92kze+3JVU($!8hF{k~NmlkUh z4%re0ZXyhF!^R`Z^G5>)Sm+bFdWU)4KRgt4*=6KqCBa7IM@AxP$<#?}o;pGQNn}kh z%vem<*M$w+O$5|ZA4Z&C&DMJ~^i^za``jI2g87DLQxl_OVh75S_3@hI=;dU00%jb!I1;PTB9O&$x&2H~sG`yxy@lBMrfitWjVf;x`lNi=D?XVt%y zh=~LoVzVG_>Y+JGt}=7E<>f%}0YH?H@rwuN52>X(H{l}0?8k(GFVs`pMj)d4;P1++Ye@IFyF9(VYB=bQeX zxb_xZTw1=*fl5}Q^<;gbq8cHqU`Qf!>$UQ1DT9(1{`^(*Y*|?JyhIXIBeGRa?ob&4 z3Yx~t&N<)0+eoZX+?XdY-i*>8x-g4FL+-#I>@!&2FS?1y^dfeJeVSg5y7#TB>Q4L{ zP7qI#^Kf2ETouie$7~Q~C5X`gJ_=lxF1f|PIs$j@w+c@ih{8ZDHBp43Jh&P^_}t*F zOZQ0ye5ld$)tqrx1*xTu+KvXZ$i}Pcx|zTFuFJx%zu(28prZG4t8kBHN<1GejV@bi zr~!Sb8*_#HYd`W{Uc5@6grvCb{pgNev?D33UZUe-f~7MO{^ z1M$5xP-7zsr1{}WFCxgAMiX-zZLE}5aS_4*l%aO8scmP zo(`D2K{3o8P`dG_Hn(eMH3~7`uYJ4b%Be3+As7470}Eh{!HX&%u~gIuHzh=0m17n! zgfCyQSS!tP7+X=n707d!DV3yL&vBmcL7QHeYjlHn102`NgqZ)Eiy#UV6|4nKg*LOS zmzC(-Z&>hF|35}}3?cA#C|{@JM|&bFiMbUan5#d;@qj!iJj-8G3Pbyj>Koh&^@7tX z0`G*#!attmf>n#3Id(RQ(E}{NDGJ;k|u%WoSTItOX_L?5X?6;lEr3UMI5)B6hNBPD=z@Ac+GaNf1Sr+ZAjE9XvF- zu*gVHlDv3oRi|$@EUygh>xd!CkM~7lMSMW=r|P~CJ&j_q={wUsKT^=0u;6tAn_(Sd zp8!#FAY_N(f+8>y)oR{_I!Tsz|CX1)n~#BN7TfE%Bu&KYr%3JH*kkX%I4h?M;;}Mw zahZkQW0q)f58;BO~Vd}v#~-S0Pp zWFNvHVQC20A5vN6^n7E=>-|v8l}IRd*~LvJuL}hw3?(Bj^6i~UOIKIP{DRs|4`D@u zGK}nH%Y*2TjLNn5t#Fg8o&~tZ;%n{q&eBySm|&RMt`}l$EeQ+4dl}46yj9a~3aJ(R z=xz<`Kd<2ydv<(`U0hItCe<(;sho~?;F`6B{qD!n{Q@4q0;)TfE_W4~j$ZHgEHW6G zvSXSuREd_nR@eBMZZ_F^hmE#uoI^?e@jMc;+~GiB z6U2>?#)90?F zS)~Q5{-q7%SkLjI^nUM><1gY>>npO4r#tA9+YQhc988Vuf&rytb4-p32ntQ!!WA@X zEll07&6IX5#D=I4JkOG0zVj%1NB;SBg)oQ_w8Vyl zpE}z2GK)g?j=S=hTRcZOhQCCM%0%&E-MDLADCvJiJiEcgnS`IVX?YNLPMg4vI(Lo* zK8CyM{6K2*@mC6Fh<-_}&lrZ8qHT>d8|LHZ7gk9z%q^pYHi!?|q_twK5q6&75<7Yv zWWk;{lrmylDKWu{Y!VkJ;4IN+v|>q-gSx0Pz~Pj(m1>W zXXR!k$FAXA_s21f=1X(?E)7hOakCM}!zVSNRtH1gh0OG><&83HE< z$Q63dL+)S|3F_v}He3S8Q~%d^X7WYziYD)E@B1;_DH)l7xzrb_|DX&JtWAGd_s>m` zmv!3tV*YNoEmQFN@J4Ke6{m)nYV(ifjU8uRrM~H!>_1!u8u9xn)ppDlH0H>lX!1(Z z1`KdZH~bWNrfVk*1VTd#2G++L(HV#5Vaef3-Fouy%}Qj*h0SCq=vkc4`oPEtv%m&~ ziXy@OP!#SipP^-5<3hjyksAvvZO;Y2~VSV%N4=0SDkibCBr8Ej1BMHS;R7RouQx1L1vDidRukG29e z_r=G0=2w(@G~ZjA<5{_{jSMZE#m|HyGKlb3h6p<)k(E7d+UrZCUjM-Dz8ME8%JAn?LJz58*-q~%|hnCKRg^9Pfk zi+m}c4I5m1k)0LbFN1?-ruu@wNi88(?~K!HPscOXn{z#;p~+%% zR%OuL%AD5gy5P%8+IY3+9QlA!F2I-G2NJ8+NO53$ygXXhR)vVr*>;8F&g?C?Hn>l` z3hWc5Mwwzv1aruZu|;spREU15qJ|`ml(WyctaxL)?gi$dI@K&hwW#wktFZ8ZXzYZXk>?mw(GMiEgH&uNP~Z1L2U%kfHsxe2qTEKP zu3`>Dx!9x?PzcwQ?Y#O`uY@@)DM?|p#@Y?kGn`{V36qwPKODqoO_hIZg#p&gD=y6& z|IY}N8_e6)-^6fNcIp1I>)7AycKAGjbxxup^i|5%uLu_IuTg_Z3uoZEw6g#!tn@>m zN3m(m(-z`Ee|p-&!9a6y%J+JoHz#?GU*`YO*^G(;DHsu@%Y9k``oWw`w0p)ZA?VdN zrR2eV)0nK{NijI;B;&UlY9%iJY0FF8blog#N`~=0Z>wLNO}`gwfXC z&veF2>5opR$hRe506yZWTW`E8i&QWKPw1J2NZmOIr7VUBHu-wbCWi#sv*|uFpJ(-c z^lc7@My2g-nCDd>bwi@9nNCGyg}J$;@ya6Sz#j{;PBpUly}Q@=;4}I0t*!j0Ye;Ih zfZpQMZ+qn;VSj}p@37D7BO+1n?C4-1e5;kNzvSfY^Jd%1uVVF+FMJAm(d6 zLvFg!a#?n%!3?|1KvQq=v(iHnNhBh8w;(RusLGbG&P?W>qu+RS6&8AWzr4h+V!#P}7vh zsL}5!cUQvhgvkvJGV0nXCHhRI?pQ03RProJz=qZkcTEAm(^8zYz< zREgvh01!mERzmqhKTAef6&b~%!O|(wi8jXHhZWbg>8KocF}4_p#>J_jvAxi7ZD$F? zGGfMDM8j~Y#mgT~XQv#JiyXBbPuTa+|IzPaCiC@C^}Bi}la40j*IbTI_S!!AbQ1DT z`9|RDbeh`r@537d#Z4O1FXV?NR04HFFq1U3jOfkD&HiVn%i9?fCo7d*CMKr9<&(7S zZNt48nNEprp3ab#u6TrZUS;6%bdF;3RzalDuZ|++r|627aprmYP$w}ex}51TfDhaE zpAnt_;$QP|b7yM+jta)Z8(-gd@=(y0_m4faMzJ2Z`kQJz>uX)8Aa^UR?tlHStGT=w z@^>r}z+j7L-3}K_zgm@>4e!gs3mFU}-f>}~vy(;Za%XYQEDY5C9ePM@&@j__@QWH{4>S@&gF9oK%Zf3h1N0H_GIATj}Mo^}KfhM)!wpA1%I zPPHymD!yd&ye1^d7l@akbUzrU_IkO6frwFIug((sikDRUOtt1zcM}K75akF_vLCSx z_X~Nv^iy-ch8aP+c)FkXOqL{z{WW#dMpXpcQ+`$nh-oGB}Ptv*`1{<>cHP@*8`Kk`Nh3(+dq+ zV#Mlq!5_K0)E!VktiY;t+j#G^vcpA7av@`T#TV}V4c=*>-` z{9_sNgpdxmbGRB7yk;AsiBnlO%S?vzzM?|Xz0LJ?DhdpRYIlTFxVI|0zyB+S=tFZ` zq)D0V@({h6hm{|4;$vbadqMNR60UMm`PB5>E_Z)f}rErK<0%$e7okgmr-Ny#bUWvj)SrY?eF#s)x z(Ld0)FM2W$RKgkfW?Lp0xTRI1khB#9Ex2jIB$Yg^S?66TdO8g$jmR`eB{cyK!k)DX(l4bJzPT!xTRkOjHP?Yrl3nmUGxF0RhKISc44GM$+;;T2( zG?y31k}@Cg2rZu5g18`;^5m%ZVCu+ZELP5fH1kZRehCApRurV6WZtl2W&&EqtpTY7$ZWi2%s_ zkWO}MYS24iZB?c{A+_$1v(FC`nZqzS{iXJxp_Qjun(alIXuXq3q_xlgL72L z8ev}BR`Rvpx<`|)zf1)h77c9fLX-SfDe8=dL0)e+1l2<>9m2c14HwAqVIz960omnq zlhQ_wsaTC9r8UY4ZZOE_O3Cu8w)zywa6sBM{o>Rh-QTU|zVs(ItsZP-$i&5H%Xa9x zGz0k}p~(Z>!%J@%KIO^Pb63uoV#3pcOdc#LVm_2XB}GBT83!B8e69Ao zJ7=xJ$S&-qFnm9r!?q1-wGvat9XaNS#aRnf|~|=O?>A);Og}tY(k{K^qm{IF?#zQwx;H1e@v?jl%n#^ehBSG{VhT<^ccFQ$GZ3>Yd zm8IlBrDF%`N_rlAAQxqTUcf3?WU@%+=MLs$2#iXmPKfh)*UyT@p(IdqNS~Xrx?BcH z!`K<#iXcQF1=&ai^`z~P??GnQ@F|od+Lp^9O@rKQD!1EJ-5e16(^Ls1dZpRtF1?2rmcKfW3L6hMh8yy4UFU_-I9f zq5>*tGamG;_?^fx7rc6WqAdVFKo5*DEV*CMHBO~7v84#1W1mZcs&R3Lvx*~e~r7MFLq_9GtSxz@U+wWl`u-dMXWQK@v!m<19f=V39cW~(0QKP z+Me36db&BbyXbK*IcmDEb3c2!CZF+SC>8pjQEWJI4oma*0bGvcesHDyybA2{xZdDa z`btN*Nv;2U4JPCPo=Brgc4qSp&8<(LXbeh;i1cMy6-TCN)>eY$_tO}s;*I54wc4V0 ztGMwKw*UC+a=$Hu{w*O!BsrQZ`h2$WY(hBL+zqDk0M|e#3|UZgSCg$E2c4ygl6(J4(?De#$CviJvo9ZwFjR zWY~0+I+8j^T<$)ZKIauy^iE|e@sE!VK`1+0*rO~tR z1_nwk1%mD%Hb#h?Mh4&zQ7=F*9si=0L6~;&xlU7?0^c|Y>FI@tkEMNB>zKIRi4qZX zNOG{&4_5<9v;aXGn;p*p7r53ogE^c(gWsV!xtTf+15-9x9UYXfrXRHF?-z ziX7n9Xf{`RQ!2cgmBK?1FK#3KbZbL=OS}8e{PJrbV`nYfZ&zou6jhDGe6$mF3)A{N zaw216pbabQj95B1Jh0c$jI_(9e%z20K=!)e{X|r0Q6QB!I@+r?Dswk=NKa+fLRBIBdlat_Hq}m_rUZhfVKdr zjaykWSfKWk&Y(#vYeovz>Z-8DC-CvME+qv{{B*5D6AfHXXfe0;H}AD((i7VjcUG}a zQ>{vLbla>gX@zrGaS=10c1Tl9gp^8HI@Gkb+ht9g@SMMADI-ZX6#Zej9-8zfqHNH& z)ZHr{?P{l(u6{i~MLo9Kc=-D8yn3B&$%e|md~H4YP_QA$F8`WaVGF%CD-3CE#X=jW zGZd$aP&Zg&M0%k7ok0O6dNw>ZNgx0>p$Y8)=s36*5;vx!i`k!vGG~qFb3+T|m!Fop21h076Qr5b(#8Se zKQv_|$}XlHu6jyW0bLk07NGqbf`tofb~H!!l@_ngC)6hgwDw{5-h`I&Srg;nwR6~ zR2aP}DcpBiFF|X+uaP3zHpkHR^{HjXIr&x`KSALK{U{POfu3io>7(4=-PIfIlAUhd zVaPB#ym<6-pMTi*ICM&*xipJ2@iY9{Ly6hPB6H?jhk&C0Aal&jO=6;BK{aXd#2W|H zKdd(a*7Xd4bf=xR+2>Z*Pm|-;yq@SkBy0pcdg?#NovMD-CGCM_K|RM0y)ZwmSXdwI%SnhCO11gfg;9spp$U2cFnk zb7-V%2>5h>8;FxDf$2)1uxH8`97>|CeLMQ!`C>)Pk1^%1@o)H5`1=pu96dcXkj?WQ3w-9e)%&UVb5F2=T&ExUU0#RY zNFLEkw`Tt@qQYa`{xYjVZtTQ001~Dnl`l&G9}6_R3L(>Cb=syTLZ%GD!wg zgyvHYs8nQY8e=Qn8sPSp)lgVg_VsgGZQL5G$VeW+H#)Z4V%}UbXedc0&{#I7aD~1s zpK$J{_2(q5 z8+7+0{Yd@B((z@G?~9&1CnV{yyjz&UIGA%_8+W|GL5dj93f>()@}?&Z-lXY;&F>z< z3wHiI_H{`--;DH~wCj05&S`tu(bCF3DSYFZdJL!QFS&eeHXqe!?|mcj%Y#&j`KSWH z@oAF1@4aREca}h+N@*SUG=aNX_wm_9>zf<)8EL6YQ2W0c`v+*IQ$mA@7_cLq`&y6m& ze;Lrb&TV-vLyl$Rh+hvToZbf{JfHY;lMQ$xoXL%DBzSLH>VB1yKl%Po8I9~6TYd!z_IagR(hOxF%@aFz-|74}< zjQCntBtj&=^YjV^Yoistj13FD!$dAgF4p&bVlLcco!@P2-QE}BjkevCTFXe4q6V|= z>;hTV>nfA@^~AY+o(3s|s`31y({%LfqZ}{k(679Zu8;lRaFC-gTKB!}4#GGNI?w)` z^=9&CTE#5_0W|sDbMnm6Kc?El5K|ST9IFRIxKnIJmp4s~-NP>(gGzbkgAUMS$dQ#s zN)oRm7tV2i@eOEX<6Js$S5$Fp?H!k1ECs*EhdZGmvixdj#k8V)!fboreZLwU-S`S&L2)tjk+=VMKR|Hl&l1Y_uag zz$WztoaJMi zY^xg#f zVMHkUUBTRJ>%YY@OxEsgpm>;|2*u z{Of(!aoRs4INs=x_cMG|usmL-psGj==~7r(!A$Tvo8nI%qweshJE z--pn@-p2c$*W!OW0X`S*{u-3>@{PA22ty>6s%)2`{%=yA2hMpZaUW($Ym42^UJ{cD z{~dZkOkw^aSYR{vPmFB9tq%hQNj(oXLIG@9C4+FBhH1u_u~0~>Jryk8 z3oyU<6F$SNB$F60#ZJWKdPWk;plAtm6W*8W`VT;UQviIlpR7rkc((V`>P5N7Hpbq7 z4=YMlATYlNPe5a`)bwnCp2jqIHns4Qmbv=BHY_R#nscFYv2&20!Zw&)51Rflz0kFt z?jg)a9~_OI2m&t0SNTr1G=eYT?>W;@027f={G9M&JWRAFMBFSrwj2eApN34GHCoL? zXV`4#Barpw7@^d|7c^(7jw#>nwwB{^n@OUqxkorkFcbc+mq`Yz@?};w64YujX!e5x z7qyXn%u8Do)stFMD-C{GVQ7lNvZ95x1`Y-`)Q_UiA%Q?r`R(7_q6QIw8LXQ-(q_Xe zSeV=#Iyc6~5%V!WS=(DgUF6D-G0%3|lDCC<^L`T9AL)x#o zwcpV5gQn@@uF?W~sZ@%+jJvaQtDaZn&7CiM3v!#uQbNsAK0g(lJy#O^p4TqlQc-l< z8882hN$od0b}Om?foy`T~gAPE@ao1iV@Lp!+X;>A@$_|qAdaV%dl7I!c|2kW$itOUeV+K{& z;C;t8PeInA$<KAgD3sJoG)->kt+;T_{H~ou`fpdID9ZtiP=9CGJ*EB@+-O`WUH9 z9kv&g)I4teEo_}%-e+HJQzgpG49syC(j1i-<&PM>?u>=wKH}*?i&#W0DBN(z?WynQuZgodb%oeblo-&2PXRc?cK`l zy&F%~>nUj(cII0Aw`?vSwNsLgkuTHQHJ?Y#s>AF0IrQY%!MkwpJC9zojM@VN3K^xV z6D`_*E1XoJfcBPQ^j&tmw`mdlPjAU1CoCu^%(tIk{)c&{$x@}-*Y=lU8vQG?sG>=v+=v) z(GTObOy8RXblpQ=^!`2v5A><0DHGS5NoA5H?tW{j8*l5mQG0%P?Dcnh3_%z;6cLhK zh+lQvvU^u!pn1BKwj_1_2pkt6%Z_-wSPS(dT3uT%10}zBRhEpuJ}C@ov*xb$z?kU5 z{rQ@hO(#dag{whNYcKFx{S-K=BLsPcFO&(gryFZYBJUxM zfArg|u37e&UIgH=>C2k-Pb`~_RY1mgT>MXYv)B}4+H z4`%)3lVDBon3LFE?lAO9_S-u97{v;y3tmKPd-7P>(GgF=6ZCG>#8!eIH@KH*OHYpM zDaGu|>RW7V*}6fXMwxHhejr8B`h{ONh|PlQusn3`0c`fJ^P~FCDp9eCU)xZp zh;~$w25Cb6SyzNYRmDdgKi^0h6DnvAtZrn+!t#!-j3Pk#v2u8uz zIbM$3rOhoO=oZZ|b6p5&_}TE2cCSXF)$WVGEvzsHCf$x5QxN6vW)#iq0w#4~$MXjE zr0+w?cvT@FlHfjM@&GOj?e|4d6bF3i;%6dvq)LqB=~mhF!dxw zWR5&MyDCdFMlqdwz!>YqNW&yD&US25%cucqd>Ax_EN1%uqv@QZLoiyz)f#6YB{>n#v604L7WyB6*HNjlH6#Oh=oS&-CcU z?a2Wje4%-L67t+fSV`b{0A(_T-9lZ~`ZEOOU{fql2Vun;?xU!6>hRL9?rl5ov*YcT zq`zqIg}`OPBl)HLeCGk5wGh{X&4%4iUT$lNo*NJuWzK)Bi!#zXP56)R6}7);XRCu) zPCak#_4S+d$J=q8pRVAiPal*^0QmFO=SP4nf`)LLw=SFWadkG&OQ!8kk0g=TuE*3l zdEMl-LoW>^&aCw2Y{-F=hUwk`6y-qc-))#rJ5nAWN?JV2+*czF=C}b39ZYem8)L8V z{QEmT;%BFOz7Z#JsuYOuD7CW>}V1D@$LxmD=;Mv39u-1A#d&Gv*e0 zr{96P3BFpVJ*%a1K`OYtNVOo7Dk#u!P)9@UoKf+g~9q$ zL?-1aScM56rKwKicc`kB9+X*T;N}k^vfy*=m8)c64qD2pIOmX7nx9Z+irXJh``h#; zD6bwGcPtxl&+|NK@SegO(6&232TN+L>36pK-i@yC`Bb4erJDC% zoz3ek?*G8$ujfw03nq$Cm8neCt{P%x1e<5L$b=H@jdirUwMfT@3_2pa$ukiNQH>dR zY31TR*;|FVf5RHam^y@LSZVU>8s6kf=Dw8_%?$r?ITy{`2XMBrpzAM0@V=2qH?XxNPRD7fZ2hx|ayyn|AXWXC%8Nb22 zL(7*N>we8&b5G6Zu?ZH*M+46)ugM$Qqv*Bj8t!bX%n-2VSG9@U#e&=QHHI*M{OXps zs|D_S1u=?35hTr$U&nv{~yTMwA6Oyo>TfWQO4t^JOlpTbn7On+QAjRbOJr@b3>Qa%T^c@m9W13%m zoS=M43BLU9tK5(q?#0NI8E}-UHRz_WidR|Cc)~#|`*D|-q6`9;4KWyW$7ryZz9=S& z=*I_Lg31|%WUiln?#JdQ6(iw=^=KlNV<)4$m=F*y@2!A1F=FRl;rY+yTdnUkdtTUX zDf8q*2#hI2v{3jWGG35b3F4bF(OFBU)I(9%WsjoZjZRgOAV^KO!2KMXmrw;(K;Hvh--50DmvU|o2cW$;pXH6~oJ(tz_J zk^3}{BHc`hOsuXGScKDCJR9Al8&60mvcek&%|CBTC({||4$Vw3wFJMbDfH41CyOx+ zpJ@7eH}=7d*Z#&MzY1!pgVw7cge~92vjAw&>ASXEs~1zW;jd&WOBSdvu%$@HAy(jV z8Eam``X%x~N=QfM0RmJ7lo+i&Jm zlscTVjtKD^7TjHvJ>>bPIhk?nsaT*x zT;@EzPe~I7)md>?W1)q@aaW4)-*1O<|X6(>#W=9D6eG1!EodrjXtja#z|Nz zJe(dLveB7wn3b5(@{srJ(kv4QbphJ>@kPK6bu(wCsE4=3-4v?ROV;@V_yk=osn(Fl zZ9-B;XO*&&7yU@m-bk|E(u+l_D&m8zdgkxitJ)tBF1~0uVVPsi5V3a{mE~>7CeVPC zwIcLrz`oA}%%`_6KPp_lKu#f-Ib{>6Lb8afc&5%#5AjF++W_;sgY&_-4T)>@PQU-D z3yY%oO~glh)HDAZP{amBV3a-J7SHQ`{q$&C=q}`@An#S{nSASW3nwoT5=96AaRy^l zSW2VwccbVdLqT-&?DAtOZ=%cpDFP%X7=J37xms!x`JW~&F0QC^=~#p)43^;d=j=Q~ z5+~1n2=y@^l9Qtk`l|WRMd&c)a8p_6`^Y~CT;&f7tF^ceHdA5;##3}6BV81|D{#Qb zh4^sK&{jj+H&qnt^7)8-t-YUc{Nz~Cbndqh!^T%sf*9)(DR6``U32U3|A3dGO5cba z75?5bo zK{4QD>E_C#7pB-%gQ?d^-TRR!kjk_vFs*emw9l7#Y|-qxYYisLe@%4sjRUsY2{6A` ze@QhH@F0Pi=p$NjTOLM3FCLVy<*iAszGMA+fW7m2-AXH3qI(V@jzfycmCer;aI z2b_EjJnS8P1ibz=)Z|4W&`9!rUM`;R);G76YV+-@)D*XlOPa#{Om0{cmp|WkJAC$a zR#_x}ml5_7Lwg^c>Eh;kv$?1y%}hOrToDxB2s@52ZsVCK{1;5f0QiGkixy`^Xm$wI)VGheR~$}t=Q{u^ch(}q8=c|;g*a>{J;e{(aE>C< zx`92_NwT_$EXxZD4uiq06K(I5f>FrOB{}UQc0V|I z-i8lv?gBn9E8oo+vmM8uxpv}(UXSBsjeT`v`@F>kpR4+)gq|bgrc##5jvYRa6!ROF zt1=}QesVrZy*Q;8_(%voz6OwNK3s&sb%~KQWFEf;{3^OJ@PGbx;mHKly&?+lEP(TEY7;7ZbE0HvM{B=P#ij@K=j+#`Asu@<{_^9ey!@6mgT^xiz^=^>|;4lOY-zt)fg46T4Xr zxXL@auM;5m5O|7rwcVz>e7_E$&wK6JO`Ustp+36&Jc|3w@|Yj%c?q`9iz< zNuMD5(g2!~C-C3icpyk#D<$mg57N%yw}*Hp04#_PaF|(t z4LPTp!?){%3C-zo4$L$%d+NLaFhE>Vd1Qes1?#Y9{J3?P$u!H%7;;A=ZGTkQeU^Er zW8(rn@io}fC~|`t-}JA0_kBk8Bviy!P0yB$y{ zLy-Fv3L0#jylqGZ9*ICu-Dw*twwDQzrCs|h zTjzH$j0I(B2Ba^!JZ0st0O3`A^jEAWhkp9B08Y12DHum!+^GFNorgLIo}KuII1crh z5Mcz><0 zkb>PXj0<>tJ!VB!rO4YTC>e4Be`oW9nf`goFaCbx$VyVZRJ!qMJ@Z9GOH$FpvgW4IA?%M&HY_WlevB##8Suh)tmnpe= zKFtnCT+_wwzw*1GovqvJP&B`qtqMF=LVv?Qa;~mC@(1aO;cSsX|`1#gi$I_U*D((t*qEM0a=q=g6puYG9Y)v5hq;qCkq~nG=R&uM9Ty@ zb7cy2K+Ug^=rcfOp(|l)&VY8SRvy76=i-UIhLA*DE*TX?YlfWon8Mv{A0~DPCk5nX z{$e+O_&Hj2@HF`Q&^MEcffnK|9^U!A1?P$tiRN$$C865xGzbQyFGDd>H~q4fCJvI` z`VY*oMFycOhw;Eesg|3}e#$g84$%0uN#zueP0hPJ*)X@S#F3f#j^(C3^M|IaVR}~c zgt&RgY&c`UyzI~Ik0DDbsawEQP+AUMvrrW{YHf?MiJ4J&Mxz&=LBH7yB z+Q_9Qlqy0xyA@?&>{32-boP4!?t1mX6^VFhi$@Y2$%wMhY>b)28{HLR8=G19iK{>U z$Y>s$vt^QgD46A2{1IY;EvI$O!kYx1bCjL)ABC`SnDXEL?1*#9s@0a{IeW@p0daWh z6VUb^)&B&j`Z`hjvOH68u|*y?Z6DbGUAgqY=Cq`yTQ5%js_?y!@rQb>!UVE>6nV4! zRzqyZWk$+(9;Yf;O;fl{M!6l*tvFGa3OH?x1}UjR7NhSch!=P`;OSrOm}~_|6t??g za!_YBu^K$%2Y#a%#ah(t7gyY|o%rioDMs9>f}1kD@WHFpq;z7rkS)<(Cge2kXn8fpETY~Cf zLBt5rFS~07P#k!G{K+-`OvdcM+>}T;<Ywb(*}&;Gz)V4{VUbPTOvL z-fxR$Mjsmo9AcpseCxgck-1v5wM85gQf?iR(ZgAgAwWIKy3vtj%Xzp`;_cd&Qw#D& zeCgEbN+A9QM?V#A$ji*?hz02gU$TdYM=UkA^GdPNBN6e!?PUX(we}xX0;IBp!g3em zHKq@W_hs`2$U8d<_cx$JhLK#8gh~OiLa>Z%d(XS^sZH5b6V+-Nh}Lq?qdG=nxamv> z@^jz8!&C{xmFI_p1mO@`KjbpsAqlO1TeA-zUQcto>%u3b|JB6+zyM_bnBZFKheNpz zMUX5tN#nqm>1s~QPBXF#r%#KpoCLE(1~aDyiCoYYxe}1v_?MdLnMhX~9!K0IIH0`~ zenamfQ8UiPtX_9Jk>TAj2#>7sg}SfiHgj~;Btvy}cWt%SH6Hfmc0B5-riS{4l|I}6 z4%7cUt_zj4;0>6S0U9Mou<>5;8InWadMN@*Q3R2E;DCST$8&> z@ytxKu>v1TF!k#MQ)M#nwBc?no`QRxb>5J7*p# zulR!1%OuVxnYC7jzNh-Rq>72q?rY{bSYMl*lfu=6!X{|=q151)3aY#6Q|BBD;TM{gnXvIKi&_< ztcTGTZ-mF!1I`<>eb2Lg{Wdujc$BX0!O#>g*PWbNIL#G%=Nf39dr!>GPA-}gDpT(| zWpohHBd0NujvWwrdYWg+E)`;66xeRTiqp_?h2k0S$_N_PYT@-6$xZa@FJPOy&p2Nj zlL;4D8|l!3`}L_?GUEc`Y;aOR%&Xw`P|W_Sf6^&bk+W!U#@@gre64A?0Cf-ZWsqel zo%G)>l(E7sV5mpdn_&dAGpkW-dwph}v&j1WBQFxa6bFDBFM}+sKes^eeN94m=LvZT zVn4{k43Np8-iO>>_RS~<5tx>bmh3(*KKp_tydk_U)yJ18@PB-fWAVUSn8`7!+UzAL zs~J8P^YVu25?heX863{z{ujS#CaM!%iF2~!?Z6LiUV*bo!QA0Dk#adClUvY@tVZne|-#Yz)Du9G{(#f8D~ zI9RVIT1>C|(pv}vcqyo?nP}(>WQ41}rHI1GfT;Po4b$Mv4j8kjvx%U)Qf7s}i9A8$ zeb}k84t#)NQ`$W-+k{%i@UxWJ6BFHBPjWqlC0 zka$)X=POv8kqu}QLGkQB9FV4t=eo&Dr%_1g0(6a=%>`@pYTIV<4{#=iBU_SLNz2O(GK-<14{Bk3m8%U%G-rb$aZ(x5Lf| z?Yea|6@)*i0W5yE+I@VW9>GDD@dlET_Xi8&aIY2bLJ`Yh=J?!}znHDP_CqcPJhKs0 z_tDDtlWqZ2eF&5|5izUoCWNotXsof+IYv)NGCb8`@_5ghp-X=fa(&3YSut!=DTC;<;>2)9{XsKUb(=U|7 zA*>&=UW?RNPc=>vhN+0L6|xmZ0z&k?JWi^BKY~FBQ0lPO zJ*K*ATbQ#PSV01)oz(AGEW;#`K!}(U(*e>$t@I+%v?+_(o!DXY!z_Cnc>!Zp&5-_1 zkw9&PFg4L|#XeH$=@i}cG(grS<@{o;iH`@EKP1=XyjN^O4C9W;Dl5c^_|F^k2MEx5 z*FXiI9k7^Qc#ehE;WI-3rozYT9HE>1s$=A1g^#Au`mSVX6c$4G!`PCQlARY8@2eX9 zz%AwQxzJ0ZHl5RJNPN)z5o@cZs%7|`gv&5RK8u38V{WjIc}Jts3(`#(mbj(7x!w2D zV}IKhQuPw6TZNVp0a#V<5nT-^uOvTIagZ$?X8kBkRj}&X;4ehx+y79L|1@c2(4CBq zz#yWetx6rPkPhfD+xL-q)MUkTwRYHe|5uEzp7i`EC@;*Ei0X_b=qB*89bg;^S!xfm zvG@6co6e|HO8;5mBS2-1ON~|VIuf{qVg)kIeGcK6UQJ?6l&E573=Sas&)8kutaxZXev-$H?+it_v7|r_45eJ)@|>@oFGeQG&|E+UHC+}& z>^BWSmTj&kvvj)tO1AB_sTMcoql~?)!;%`8GFz3<=x&bZ(No7s}C#_j+kZEun z$rBviV4rFj=cbB_cINZ;Ha$yMuF563KoSZB&(F^Ii@gcyRQ@!X+IuJFZ~PVGffh zNd|&apmz{=D1#%v{N zJPNu++v1tqd;IU)&IdWcnzFBV2!9&FS7=6SikJueP$7%5Q=u5xz{cCZq$P`EizK z?35Z3IjXPWreNlWtrtRIgBGRb5ur$Yma>ex5<$sCPL2RrZr1T&n$D>1?W=;Lkzd(A zYwc~6mgmQkxF<>%**Jj|B2Rm3-9B7WI4@>&-%%(uTR8XVgu9~fB|n70v}L;L6X$QH zmKV2?kjmwqpO>X6V-IRbR{t~%6T}Tlld_N3DqE5zeBWrcp_bxFpMV4xk149H*#zb^ z1o@}`*{lp!qR*&ocGy8=_f9)nj65VMXr24@Xh{{fVW4x_DXT#2r5-EzT5ZkGI-`(I zN)ZHHrBDm2paH@}-1QV|&MLci<>d%?W|QCWm$?ptFk&6{3SR&}g&-_RT`&%c4fK6o zj%|@Iei#t!KqZP>9_sF6(-y|$N6J!9+jR1?q=45@l{rkkL|h_UmtPR$6QjI@l5Bvm zMj*DKiYA0V3O2u?9e`>~Bg+#8FGJ@W6vW2d9*Q*iB!78Ja(EtP=1^8BPdDZ$*|PCL zi`8)APCH$tA-oZ2o3u3q(3~-rCjAPa3h|4Dy}y+tr;()#g7B(pKC5d8_Y{=5${4oGmd|^Q-f!FUbr1A zfRnhO&I{e-+Fw;q<8hRm0l0xPjk8QfHpf#GyTYV3^tp$GrKR>Y5cMaBqyJV!)RN39 zry3n*=Yai&s0jqMg0XyG-Yk6=sLnesS@F0Z8Yy6E2WW|H%N%xX1nNg4I)jgaT3`M} z!UV;{f|&tJ*kFsJzVU8un(htqpwdF2($3&!`y^{l_OFYiBBP+v?12*Fb^vlSl=&-7 zW|#iy{=XBbEE$n>`BD1himc%k$PZCqI53KaZWdJ)Cn)4j7pRy1`dq3D$+f!Zy6*uM zAAhapF3k4y_$2XzLURV9vd{H8-0w&dqBLhPf)&ZFHJwmL1Yw3CW)jVBqco3I1F>sx z2BnGpmw)Z&55%nSfjmDVkkz|4=3p^+O3Sb4wj!?wBF4L8$Hj-Xvq*A z83i+(TqiAa&U*dQ%~Eih#;?JkA**)~_1#x2i=f7iXX*l$*gP=*_(#@ZGzIap>_EGU@6w9 zd;Ec<;K3#UZMiVS=6uq6@zYw9u+p8JMGz4lorvHyt6m%wj2CZMc!CRK+p7f7CWBh} zTaGZEMq`syEwUGj)}LLtFr7<{i;l8m1f9Zqc2DQaDN+2IE4j=ek0w|z>u94CiiK}2 z|BFn0lAq=aDQlRIm3CaTqFn~Up*i&^#VNt6XY(NX-~I#rV#SOZ7GFuTF-bM6VSynA zVvdq!W=!lIr)$Ec7HK?2nvb;$(l{OmTJGc_5ZIr)Frz8t{g20@6jpkAmO^V?$81?nN@9`@Np-eruPVFIGIm zJIpfULHK&wr$e3dKCw(66Q&u;!q_ggo{QzA(i*gCF;6t(p8W5`iwj6a1?L>nN)Nf| z$6Scb(GfWaWi_PD?-}Lc=E*mV&_O0zv*_A`F~QxC!+N@uMnswVJ?E>QXrk$s#5}&Y zLN5bcheRrsH;_M^7rhBN>Udp{G<)6l5VI6ta`+hp+WGe?B;H`eh%jzqN|WBm36)>cOI zBkg8K>Y@UUP4`1H)i_HOti|^Y7{k(;UK{?8M0lOfBDL9qC86JHJlz>qQsKEq%x-f9 z*x-U|ZKgDy0)Dmn5?D{(m*4);G|To%xIZ*hp82)y{HdLSI{o10(JJNQq82RjIej$K zAYy1j5_nmjC|h(fZnQ!yCsmk3H{@E5u=}S5`WxWn_A16l#?0xt$C5aIB^eLr8)k1V z_Fc`cb*v4&;HG=4jv%TNsa&l|1FSEz1O+zS0Fa2Psb7jZ+)`)#B(wejbb+Er|N5s+ zn!zkzUI0-@78n8|eHWv*q~iV>PV_5s+xSm>LWHP-28Y+CZ71aMkwbs~)|{tOz%+{B z&(LYV>7o>Dr$_g@@sz)+^y+sF$(hiyDK21m`6a&v!QSn_8XEccg;m|_%No86JH3pH zXF@F_uQ`?1u)9PXUD-IDwCG?;ADNVcklg8dbbC7XCjC~Z3--Xl=%cY8#o8VptuQ@1 zJ7?$}V@D*T>RzgUm7ZYw@sfcsmh?f-=6$+XJptuYaf{?Hxe#qt_ZJ2msNE93A35vb z&uc-^<}2L>7on7^>14m{8mD3n)NNRX0c>9w*3=31mZEy=q==MbRY$#u*zdL;?G9pw zo7=I*qtE`1CEmxE$I>a!ys)(^qv#0-^5PdtlWMIC`L1UhN}p#%4*WHIUX021QzdrY z)Qebl>hiNQleKl`0v(DFA--S)u|dP)-MweEIi$VMbMxLDfK&xfsf{-KG^u$6qpB4r zljMSs_=Mi7v$veeNO3y~bQWM77vNJC8W+^2aWLGL3@h1Z`Nu$AfN7Ow|o$ci(0+}qK>ibCX#OZ!$ z%L1cUJsz@u=yoAvxYdwEcVATjYt66tSqxSHc}neY6$(g}QnQX`aZ3}<>Kp=Gzi=HK zV1nG$!)x`DVi|P|H<)Sev^cg_%OHDBVv%e5Qix<_Nb$y-O6&jdw;SlczuY=s55rOR zaw}EAz<+ZRz73%$eM7BxrWAtV<3f;&FzZon&+$)*A3hX$t3F-j=I&9}2hA)S3XmyH zP+6Pb8u}-h-vTg@n0t}z_^>rihTUGsEty63Eb^`3`YdYW6{G(7<0QTq*ZAriTK}fX z+-~)prv}XbU3ye;QB^A>NgF(Ksc!{mS%ociQ~e#Iiq=(Tk~U@lzKtJAkvS-fL%;^@ z;t8BV2(zX{L277r+CfrP4e9q54m`Y?mg+;y4K&!iE2a!J^@(uuT`Ij;>~_gx>MWgK z3OyDEi$>##2q~3-iw@>iXgX1KcW5RsWAOsjCtUE@Xd|*XbVNR-*1uQn!>88+(?nys zy18Nb6qqnt8n#R%vF;9N2HbQb_-GRJrmCw2NKnqHCJr`#MxkTUYJf6W@mwR>{cbgr zrc&Gzdu$P=SZ2aurlPgIZ%D;KBmGaOC}USC$!#heOU6TiZI;aj*`r^MKKb1FpAw|8Q02s^;Ma& z$$D1nH8qqW4bDb<1;Z)kv0nHmWE6{)5QT`3G*)4*9GsPx{Vl?(^gvak4AD#001YB= z!E(G3+%8Z2R#L^vO2YNgSii^M3qaN+&cOfnHjw&<1{iIqZg1mZKTYDrs(l;kA}$gjfv6IuaEV-D){1KgKB$B@I8x(;3&Uar(#2T-- zTznu5nG^Q`y{9S-BgtKys=^G6d7J;c9{N_E;`(sE%EB^L;ZOpOYQ4&=my8{6StB68 zJKpeZ`z#-tmhGJ=`E;XWYSClgmobg!g$MD?6XlSZLP@>{K9Ue7=oZSojNK`h`S0|t z#<%G^hxmc%tZ7gI?;#DmY=HQb+o_j0OLe(wI0_+mXjX3H*B>dK#0%F@J>Zu+g&HQj zl7_=*lwqQ+-CL$`=n>&=5_I2`65Wmy4DwGSBT3!JJVb~09Epx>1i>ZO<`&du<>mDj<33%PUt4_EmaQ59F~dCCs8RwO=h;+9dK@f8k%x(k>#_JH*p6O z2xO63Z*?Gs7J%yTd`r*veb(7HXU}Vu@A-}_Pl4##>2Z1A*ZUV+J9viTvQFH9Oib5{FP) z@E!c}u>b4?JVZ26o-58%hgFIt;ST?cq72#z+UDkgrvd`~x}BM&JsWH_C*TR`$cVEp zF$k31nFZ72Ax{!!Po00^0(Gd88*0Flo>D(fmHrs2kwowKyY$Jv43^#tWiz0aR3G(e z**!+m3ZI$oS`(F?g;n|Z4%aEQQBP;$rEax*oxa{??;U|&ET!it zQgQP(tpES&4F!8;A@rzH!hT%~*XCP>c|Kb|MBi?f(Doqe7fp;mpVBxRa2_yd_Mzvc z!W16E%ywZ~v9$`Lvufmk-2#W82qclu;Dc&*0-4O60xb*q!|ezTRoUx{PfjhvnP5a= zC@^7(k-=6}kW`k82!SOkc{Ez6Xz8TFBN8nqzHqdd}lt{Ye=Ky*s5zK>_QPB1AlTjh&K9XPX5nej|gEK z++!c{=NF>XvR*QV15sL2*<2wDizLiJ7yz{;soYO(Fh4|FbUjL^9Bu{u;rpC&BAM;0 z_nt+_^*J$Zi25sq*;(F1YmUuoY^z5HK1-5R@LD+4{<;k&T|b$cAn^cC}`Z75exQ6AQkK^3Bp6`_=6UrAu8O z%`Y|Tfh1V-$T0J@5(`wETqDbuD%@vP8KX_pTGfAsI6Igz!E-haQ6eeFi2ydLhR!%t zE(I;gB5e{bo_7tyHa}Fel9+*B82^h{sFnfH)EDQw{dt4SL23T86-Ns&N3=ZR?wu<` z|CJ>DZR55Zjy^7M8$9E*;bv|y+0c$W&_NoG!hZeaI*SaB<8ZSwpRxEWS{QBjR|Jlo zdP)ycFp7$sZhIK{2pEzU{JCqyS}pBJ-5+CBz!@&(E@DWzqst*<3;DeBeBJd0QoAy} zdViC5VHy$tqG&TM_e4boq1!>?XwyaVTrEcy5T2kw`{TPQn`~G%Vjgd0r59Rx#kwt- zEc-pg)=P-N$3{Ac(e-bh=tU&3h6zf1hO``27Ua|IBpWi3z8hP{EbL?jM5u*)jhJ)i zL)he|toFV(jBMOJOg_mM<5x-5Rt8?Slh*L!{5btsyU`*26CM)Uh=>` z>(NR4&(w6=O?b&sP=Vk?hj_w9fTU&#q7{9mp&5y!0J3KeZ?}dZP1unIIS{nYM29#; z^>KhXPmn(+z*Tg14TIX=$csHQ2MhytwnMn>iSr0Z@|mM1uVtmz!c1NZl9~vxr5opz zG~v?D38?e>XaUKZgGG#n+mfwk@kXe!ng)d%vJ|Oj79f{C2t)LbeOO*=c4>Mhc?Y zyW9RwbzBoNnKqFRw@-Y((LZ4y30Y~#cppz|15j~+WLDBZkG{mYep`KPla+klWZGky zgQ)G&^=@x@;oc#&kfBwI5}>cpv*9f1Q5rvxq^hKL^Y&d$(Z|eVO|Wt1%JAM8c32m% zQ8Xj3Y!x*q89aw{LD@=e+mtqYbUH~^FX-HsOCKLCKH1FR!ISfep!rd&pYQA?>3-HF-3Bo9b4Bbs3}`U>H+a)7|T`XzZv znHavX>2Qe6_e9>3v;U5@8L#v5l{0-(J3#wzDyVE?h{VwbcB`0iSa(1_-reS0yCKE3 zGhr(NBHau&+)^7l{*neE#gG-M%fx;Bsf3+Pv=A;>+M3_(PtU6JV2d2{4B^VymhFFk z*-s3Jc%qU9=MEl%v>82G9uG5E`j>(Q*AU*DjT_f%E}G#egJ2%PC)ewzBJ|mQ3WJHF zXq$tN#;5n}com=MOe4(hjrZLs9B*%M{HPJJM~ zbop;8X%hyFM7Wpf6Kg^}oLJJci`T!{se1J^x7 zCOfKKK_+m1q}a}%N-c8A|EqYJ5`hrq=s>?j5*h8y4KuQg)PaQJ7GJMiZDpmD5T(j9 zjG(aMk@$((q$N6`7%aD1r7G7H=I=r$s!hQQH|fa{`vCS{X{euGp7M_(MMfOx3aNsb zVXR0{+9=y{^BT`O7Ex`Quu4;`d`vqe7v5r|=o{aW9SDjs@LTz?)b{)>NFXq>jc7x@ zKL{U=Vckiwa!|}VMz_L5tH+c`jbSg(19MSIuLu7jxuei_md z4G@-9F!Fv}Z8HUH2H)%81<`g>d@q4}(j;pTr!+_eEpF0WYwm5QS*m{_E}&x6iI(q{ z<4nqYz7GzkYyyYvxpoPq&09=}kY825gL<(ZEJz?|J|lXz^2oB_(BUVzVn`?2su_;5 z&Gx(IuvW`lIxkoQKUIzb+i9&zmsV`Wp+= zaj1@WWkn5EYL zsyPEdiY=uP50C%4k^<(X*y~l_s_S<=7K)!?vriRg=`V|wc)6x49VF^@rCB&6;0FNV z=XqCK=tbd=Z4EIfdAxr=IhG`7Vbg!W+BblucfA_VEV}HPusQz0l19>BS|Rh2>#gg1 z2zLD|#IQfRv+*lIBK>UF_*%~Of4@2!+Frf@6oxnBK)UTO%OJR(0T6zMd_jqUZ}@a$ z?*jOzl~0T?k+_R)=Y&OL)yoKw>5v*myqtSCDrXwbDQ6LY@i(A;B^Q-#Sx>(XDGHg3vBX))`>K@uAOtktP@VW*d14 zX?$gD?fy9b)bRWkak~;$24|Xrj3bV$zypEQ3Nb#c|HiLCA|4F*3)CDnwdvIp{nZFC z6ndE!BW>=x&_*%7oD7qbFYhI;+o54grA^f7VekXb454-s!JP*Q3Mj|=p9UBm26}9; z5hl#!B68X{agv!VIb*W@#i(j?zwN8T(M`WQbW<>9Bm?cX?Ph++N%s9v95poq6-Qe& z08JpBNry`z;+JE)8WN&KHkL#sk)OKh^;WZ~;v`%-2dw7e&EMqbxO?o8rQOu>;r3%a zWbrl-I`#$Syj85Js%TGAfB?S^2o3;2qLf*QGY_ebiIo$d&DY;xyiR%8p22W)-T4%; zSS}|eT22=L4r4}llT7Xs3t5rjVjvnNL%Ipn#z+ z3fFZJxwwGArZKT=DkWOY$TvG$Hr@Uh3_sq7W0b^z z-#Z&T1bagMoo3QCCb<=Pc}_8D)i#}6?{i3Fn1Bk>Y3}S!5YeH6#@xY;Jm375Y8az_ zTDx+cA4P7PF?_vyG_$MWfODCw@60U38G~EW^=va*oUx4RJfbN4CEkm;12d%TB<3r zm_0oWFQItw^mQL$z#h(!Y)>UBpsf-yRR1@_ss8SH!c4&DPOTB#cG;!q#~zdI1&Q9p z_K{|KcBf1mXlosT-!vpaTYAoMBDtvhZ*~f_T0+2%pF7CLp%?&X7xob#WMk%ns*2%P z>>pX-5OVmzwH**y7r3LJGavXBY~PAGd}CWm>!Mj{phn)2BZF+6CA3SDaTB*R`^2}b z*0(W|tBM4ldKv)%W@VDyc23v3<51IEj%00K%rsG4z1oo8UyErJ;)>oVrmFXp3QRpv zd>h4ktkj5l&l3=>fMo2rbB zFbJq3zx1v=DWvYZ&f-~#Li=_`KM};Y(ys+qzZg}bczFtt6fLPp$3!({h+p17zhfs* z${#`r`$~|{>j&?aSaQ>lK2amA2oQ&1a(c@uW@H5GrVai!b}f zXKddB)VwQi8CIfB{qv<}>7?$z>-X9otl^LE(9VsQg^6;Ki1{h31HH z@|t|Gj<|o3Lw`Xr9hWbder0kKo{j~*(NPjK|8O3=r?a1B1Cf4W=Mniu0T)J*D9Gfi z`-cKv1U`FY8FKn!7Wz%KqnG@{e|x534tc-&A6nQZZE{AIg0$2oE|!9_p=YnrJKLR( zM(-ZzpNw!?9201X@_4AOb|P_}nVbWz`Vq-VEOAhb;ps&*N$5W-P-xLM(CVC6Rp*zT zDlg^qY}Tp_YA)AsYB27XT6$M{D>o~my`{8FWx=Yp`3h#l8{=0SuDx>5q0ux(d1gC8 z)^<0JQ8lrXbQOwg*1>CFw#LkEDD1{puf9@QzVFXA>-`@7(WjlOT~J?fLAux+f;Ywi z5#{u27`rI&$~ea@I`~(wyvF*u))>VoejUBqlj?$xqdfC%E+YL?gQc;*SDO)AgtYgps7sNR z{#3AB82)NrhlD^zm1W5~WfBXSfP^Ry^&s4>Wj5~l5*>xMLtx3o<14Q+DL05h^hOZ& zmY7E%!8afI7=#}t`&w=5JQ4ZGh+6-~B(d*Ofkf;KOWZy-!<=4vO^3bSResME$%qN= z`;2cr6ND~H+5Bx;(>RYG+BlNxdhPTohILp4iKXd(PwXveKQz{1X#+x;>Cu+cUDw$o z&)>m1vsWUkbuX|(%^#bH6F}nNs;6!-et(9w{X_9GO}dj36}l)$gmt&9TU)5l+4a&s@+|2YH^ATBXDO|1%XgY%=LY<}_bP zOOYOxs#OOkx6wqm8!(QarTnzrpKdu8f6jzh20{g(ydT8xr`K{&zR5j(;1uRnbE3V9 z#!za5qMnZh5Cz9qh}GEr7K|P;2R<*L?W&}e1pNwRy1mL!(3-QI}xh<8u%USLHe@uOIRAv7g zZnizy=7h;Ld9rJ&$+qn}*|u%lZnEvkw(Fjm@9*Aq*V_N?bJqUgd7t-rg~gX;&eV9$ zOU)1N7^V1$8O=cWHoL_tDTU~v#^Zx4|aPXR4O#-0;!TD(T4L<%hKSCJ$O zQuSr^qHtXJibD&3p=9{R!kA=3Um|0IGU7B}-+puyn@1!V?~RUi6zlqjdh2wjJd$Y0 zi$!>2%xUfc*7>exec0mbw?>S9b*pihto(Nu=wb7S;JU3Wn8`HrFvU!;y-9t zM|YcpT3#~kws0wTymQnlW2M-4!*ErpUC)CbXAtAaP|%B+BD^>iDD4WTYP8iW``X?E zpfv#7r5b_RwbT;_pt5Nb@a&p63%yz*5HYYUF494PT{*n5#N)?qda}qG(K}eD?^*?C zcYHz`*3Fv0o|-c?Y{Lf3vCuL_IXYTTNq1`n#`~oEW^q3`!5S%ljFO^BxUqTN)w4lV z7KZY&C)3O5aujmZ4seVtEEm!9@}STC6NG`CZ#XaLjFtKz$4hfhxd{(b5^$LbUN4h@ znQaJOoDb_UR~6}!?YuZky1go2!v9EorJ2D%ICXX3P@YvD_?xtk`WJRcYnWt;Flt<< zxneALX_YW_N$9G!WwhEM%mhXA(wlx7fJp+|ivA-gP<|BOefug!kRHZ%bP5O9P_!{kPYc9ymP{CC9xcsB;6i?u zvtRXE)HFSiyi?pfOH4k3{I z1rZv@MfiaY_)R_7jX}N~3*SW=V zX{ev&C07;7?1j8tUN_4Gs4+^{>HD}#yFdtjxURyvD$?`$>6JN*m-;lxg@ z8>!ED%iBk5p^@T$}v=Cu* zGfw=U4XEBM61QE-5w_9`c`Z}d42~A$#gw3c4yNt|DUjo`zaAYhasni16H0#-QKGBm z*@{X+f=zf*(lGEmkRhoa%l=S5kR8wXTebAppSiZPAN%F5r^TgLQ zKT!v>r}F%8wTmsUrnxJ)Y8X{ZU`&apBdh&dU?#dMe(3a;+oZ&=6PSY-h&gHEkV5Vo zQU_SacvcfcNg$yvhEhTG0*SWD3-bbL7)pKJGYZQHnOz{$3u0Q3*5Pe+&jXJ6 zQ|@z_zM(ufqgQZ57hUt3<3>X$Iq-(*Koni;Vxe3nH~Ep{+E9TzOfiu4$VK>hfp*)Y zNv+`4CQ#Nw#FyW-4*+l?##|A^3`YBU|CbNs;t#Sf#y!-#%!Xo<*t7wyM{}qG+vqI$ z+Vwhs7pA^f$1^&x-cF0M-7*A8bjg-IT-(HikJ&t>gJ)13Mw%w{_h?w)fO=qc1eNQC z@e6>Z#ON9IU6n2^T+n8+M`iHjMt!Vawk6LdKijaY0gutY>BM#@#Af{oXI2agG&>Xz zMM#cnfDGIzinX-un#2xtz_w}As7whe$L3Ig+3`<1V#pw8j0QwyLFBKn*KnK%VV;;d zWSM9X&*W8>R;Bo%wB}XwaKh+@9ohU25j&pDQW1_A$3d z0A{P+PDf??p%4l3(z0T!A^l9U+K(aoCr5npsG&x!Qy!CQoWaU(Z4ao%$i(x8fYP{e z2Y1>&Esql2cfZBWZuf>#i+gIN*wb3aVmoO?pK1kS2J}zq^HZZVByw1JvfLVQShmoT zRpdj0_2EU*N(uFq$C!pbw>YsEc0HmkoB&ZlyWrQwXdd261XmUo=+WIEEaVUhShc}$ z>^8}IGUij&NuBuFE6fB?yAD*l=iOZdp?uVXA0pUK#J|d~#?8+m<~uWR6K9vXuEjQX zqXL1J$A{7+XAP|MV?3!ugIVP$FvygK9YjDzn>qnfKFh8Yqh380Uf%}vdF?zDek*6| zQf-1FPD){(3fCX@i%H}iL}_XD2Aawsxdn-CGpr=e4sop zOH@r^`qXbD|5dV(f>~J`vxpCiB>ZbiM*QMD~5t-B^8`0LmnJDdg8-1xAgl=0#V>A zc}Yp5Qc+I!@zU%;?S6b2!g*Dl2+6#OR-BSn;-rPl2b?s720&hbyU`<+YEMxr+)Z&T z{HF!}fdc%P)ar8U=1WqvZ(~Lwjl=1W%3L0K166m86sNv6?y2KaO+VuA14LcWDBn(f zEVj6(x^atS7q>(iLJoQbo)#YNoydNO+Jjyenk&Q(l*OyI1f62W{3wJNZ|oI_or}Cq zL`HWoUF1vzt_#%(W}7_acg@~rg~{T=jPw|Nu)_@gaMwH^s(p-%~7C;5v$bujWqxsGYJx*DzBJa9_25|uFFfSzUufuDpCW^;<5 zpa+(#Y&Hj~4*t&Y=fP9rbFL(zgQR7h7=C8F=1jFr!G1o;O<6dgQ_6fDZ^WOv%3I{KRJ-+2RdN6cDWnPo=*k$z=0-8yiK}r-`q>*PMawiQW1nnITU` z7SEcLo_DD06zL|yV#n-Yghg;+CIytt+Aq`@ZalN@$fA~XHr%^3cPV*n*(C52fmN>+ zU@og*hb+H1lwO)M zCK%u&&ysBYQCc8g$Q)(g1{Ol(7bJ@g6VDt%Wn)EQCevr_Rl`aM8QbVHO zf1xajC%fouu_p`}n-)QqJg9(!;Ulg*nn@e7)raG$qC&cRz6@%`FkkOIb@m7A62XzX z^D2Bl@&{KuirRX9SK3XeLa7+f_ZZE<*i52sF7GwMr#QGEe>BkE`E`tVU@wJdFIQDv z7Fu$Y(tYE;IFg>F_-Z^K`8*ZGLIqQL3PJk6xztG#^tCoh`mon6?0;)b|8h}a?j75> zk$U$RE(dAKYMlYsLR#VCC?N|@>fQqmf^M8IGiU+L<$v#A+TjntdVkdBU8gDUKq~QWMAl#y=I18BB98%=VYpb3c`x%)@kF^Cm zvFhCu>vn!qbu;Eo4-yWBCs%9{^}*rn)j2c- zxFf#y=!#sz1+LhbK?E+&9_WHjo{R?(hFtU@$jjAnbq_ITjeAGd@Y~2M)cFfuv+B;g z3+9%^rf|I9{H*@-)#Po;t9!*#r57FJt|@<`$3g+|oJdq5?+Mt~7Cxx2}WJ4}ph z76RB~)>J)DPXGo1m$-2iBo2>~o)3)8D;c7c4WSYk?K+a`72lH951sHf5NN(D{L1x@ zUxEgJh}QrdCF8)=R`!>KF%3?Q&eu-4(lhtPe5cxCCL}<;*QHi4#wo1(g{bMhH708} z?A2EP{Edv$a{-5ZXxN9Si9?a6Sk z3$qsf=M6a!%L}n~VFebbs_BOgbNM0mt*e9NMav~Pgao2weu)=U%nS2(9>@oFeR})3WR(Zk=bcgP z*4=@o663o#t1JWpv^F@wfvT_ti86{S1E|qo&gzyQ*$L~B#`6iWDKcrhMY+sK52kRx z`!eBW=U|#bO=0@^WJ};p?r~w?5NDw&4phg0(U8%Y^7it=YFnep-d+AddRZ8bF+aE_ z2&~SRBrKRy7hrqX?hh}zPl^248P2moXj*(#eFc*T$!OLgiJ^Y!EIF1s)tt6?k-3V) zj4g`4*J04+Ln`m*e5=+x6OOYlV2pDBMJvQ5HV8jq& z)^*}kWkksKl=(f#3jrtlh5H>!^=m;PurqlKUC)@HjH~hBH=lojWT2I4B8Ys__tw5$%vAlA4dm zgG!VUni0VC`mr#$+yQN8>0hb{kfST;RRSOh$?l^yWd z6gFLTk4xF9KQT}m6M*`f2nco<$r6q4J_}9`a9_v8y8foUR`xySO_kn-q!p4HDP84c zs}|oKMHlmY<9ygXQG6jTi|4!AXKS?S9GuH)&#IfWh&^d*epC2A;AEO!3GDJ zgHcvq?$PFM%=j$Cnl|$^RQnA62K#624ZmwT0w0OVD#*da)#ma1VipoZeww>6DK_`3 zzXbuZ90VGT9|p-HC~1Fx{~%X(doa<~=~-uXFF1mbBBj9(80lZ&or`l@$d`o$6tEg@flxehr75?(?dO>=&C&7@gzR1{ED6u&)6`N>22h%Pwz%Reh~ z*gJ!0%_2=}dB+iFf>F|VZ@s<9y%*R$^+~7IU*RA+?tTee2e!Fd3I3A7@M|I_&Mjp? zx?L3e8tSy}&gf~Vgptntl0=4!rOiL&xCzDI7CPVy>-4orf6nCZznOx7oxQRyK@#Ak z9dr3MJ!L_3q>-vjj97UN89GQ-Uu}p}02&@wt7qMkefP7%k<(`*KnLd2nfc z@d{(l3q>1i96u0%rgOt2*oc{yvb_=T&QYP0Z>Gj0y#R#dne2uMt`g zw25^h7+?@V*CsJ!#-=4p=rzQ&(-!6ggba6SH_;`U(OHZrwA8AJc0Ipf1U-$Z*}N~4 za+!PUd#-OY2gU58` zg7CDWigZbHQW4=gxIUH4VPoI%O=X_Y0^(?5V9W92!-@cpSb~%o4EPL7gS?}DXa;tg zd^~$0Fn)~Bj%-YL@SY2<#MW0u=kyK@duqu#y41juP8q|v35@|dJPxR_?Wr`#&b1&! za@b);DyDIVuQN4bxtu0RB^vmh9-+so>Gd6*U|8J6Gn?mn8ky)fR{|!3zkPknbk0c> z5rhCfNSPpjXiNl7x}F&9NBzJzMw~W%9;y={`zg%o%frXrbIXRuRUd&R5>5?1NsjAQ64>*Q9`Wpa_Krs3@iF^*evM1e1vritMm5I#7UY8;FgW^8B(3~pz z^`Vp5x_9@(Sc|<@hkob1lP~aOhmoug`8%8L%ki3!LYTZ7)bw`Q>n<~HYQ4H+ZM!

    IjucDshye_(UWySnBD73w#C)Zmm$cSX7RVyB^vzKVDVO2T7Sx=zUq8ND z8?2KdPjc)tV6D;5J=CxFR%ViO_8`1tNgGaZn{E3oX=U}z)nO)K$D*4-YVR|@fIJ2^E|>WPBKt9OXJF6T-gs*LH9P>CRS8g$EkPwh-H<3m;i|? zR1LL{V^Q*J0X?T?K+FHmc()-8Cd3yeq-PXWSHPDev(@C$>SDB7wO6;q41ohlG*3H) zcin)3IdlD*tCX)^Y8X`3&QaE9-_+cf zY4NK-`jDR~RXGHV7(cCAU(D1neZ1yFP4+3t=BHHB;jL(_Xq5fpUAArMrw`!@xi`kj zif6Wjs*2udH+S|$a^t8TaTBv^hlaZf}6$GIv0vIu(dV?K+@4S`QKJP z+Igrph-{*GbWZtS#|U=XeLm!4WXREyMhhzO+>*b-uq?+)szbV^F4}C>N*2NIylvZI zPHEcR#11lf@9**Tt(wiXqi)mihu65>na52x;L&(d{Y3~?RE zS9Huk2|Db>Xy?OK_W<-BVpar7+_$IZ#tTY9{iE>`hbGsU>9VowKSphRl;7(-&(~df-Vi-ScL=Te{dXF(AaJ6NE)Z@y zdH{Y0TgYEk@QzE|3eH*|Mj3kCT}YahIaHm3Qwfu!}`GTcNhv2c5MSUpLo~0JK3Lw}G?*0+?Opuqvis zDPTk7SVAO>mFB*W-KG6H9tuu#{VtQM&d9|OL5e9#NeEpf9!=~1(@iLeDh)H-D7iZ9 zN8zvUD!;VpLMSkbTlo3PMnW>)73z6lRlI%reYSo^lwqrN{Q9=9lZ{791S852SYx}E z%y8IqFgy`@uC|sDzR!WZkx`P~+`1hq^E8~Xq=N63%*{Ou!=Bo-c|otJK1lCBAa!?N zrYt!!7l{7NZRlohFR3l2X+XZ1p}WImft5&;*#C6AJw&#Gp|Zx{cdV1iZ%r8?a(R=6 zKbPFtfAD<77MW4>afQ%}RsI8JS>WLB`UHDA4!1`S&CFCmBE~;2y0Ic~;9)kT>-10< zmoq+msc9C~!#{d1O-{8qWlvUU{^v5DbZuukq%pzpFQ&63etE-$c^{am+cPF=QIRIYp?7} znVgLudw*lXA3EZvm-aZ`4=>hxl5OL@%8key`}3zmW{O@na}MSdbH!O63Xm$t-)d^- zIpv3cM`^Do9d*TdPN6(ArfW~3%W9$0z9{7fb0{N2McR*pj0U$BS@3<6r#5UlMU>MCIQ`_vBgtU?k=q%@qsr-{W!j-UTbCN) zCr?AP%jED||on7%Px217zXc;kB8``s;Bd-$|_ zXXnp$*PVp&Lua3sY*+e|t~_}(zxElsP1$3o?ScYsPtj#8ZH53o^Tda;2eAdO*rCcg zO{3GM(ZM5`L9}q&u`cn%W}-((UE4J_4F}jqXlvDk6wlnST{OO;j{O?Zfi2qa6?vRP zM$|%>a1?<`cO8X`w~$m~t@S0UMD`E;?}@~U&(EbeV6j)NR#j6@%*Swto!)jykC2b8 zUS=Y>=C5fSyIOU|u=$r?qy`w)X7n;)B9lc;JEXahY-9*&-Fp^7rS1`XS&&?^n}llC z;BLpThS}4Pn)mZBc zr?hJ1=`Vzio$j*hF5roBu{=!+NMPhrQW7lA?FezsrT+512g)mb7G1AU-$K-+$!}Sg zor~8@-*4^Fc83JZ%%>Dgx?P3*KSw=^bp?e5I)hV8Mvzq=4-|QPZbbcGf+>7F4FB*Z z)o?#L9PiS+o{U9j#Ps439RA`Iu*AOJ^@`TVUecrPHkqP4dnF>|6xV4A9=lL&kvlNU z8yQg4$=+D>$i9?Fa;u@Hb|Q&WhdKnvrRV)ob})!O|qg` zqEE1g8V1pGL3;+T^5pxu?%b#WuXn`XPO;(Ehsmo43kI2V+y7>_ww}a;G%5W1wrI8I z&YjQ=F2g0EJhq%kl=`69UOx%F40xKZe5wbjFH>HZ(jG4s5a%k;T*7v<11^L&vNI2s z7-sF`KiqmxIkCdsa<5}NN{i_X%tB;p(;njte(~V*2=@qYB%4H`ZRC~X%0cR z(SPGI-Y=wqcOjWC60^9BunD%YP30sx-m#oMK>3L3wp4oR%;}l;+lrAzK*JfZaY2xa z8Am*V^@ni?+Z)`%#Cp`cD7q8>yCovquCU5h*Mnr~-nMwng6`7}zQ{LrS^PHdMBe7T zw#v>Kdwj%*o!_#E2H6AEI&K4aboy!oow7R51|+(P)}|5V_kq8H8wUh}AYOVZO`0$X zvk2GF!g>j|=)k>($sXOl8J5;oGqqO3DPOU^j5EF2O;Oc)fk6v5k4ei7wtpks#O zaL?tc!_(+3rwAcQIWP$$l_s1r>xMKMAKAZoIJ&08Dav;y$i4G4V8>c(Yzd|cEHyY{ zuac?_Gcuwuc@{!NRz^W5W|kki66(mM1UY8dw_1gT&bXrs{83l5j1jb-xHY#I1U4WG z7~Ar>>a%{oS%!LTM-{t76AI8{Gm{BfHtT%Ml*@WN^yh%f4Hetv50QLlLlHi8Zwf?l zSq2sUH3P2al6vN4VSjb+#X*>txw1%vO+>|B2J=EkZ+LlFY;S_af2(d&6+E@+&UwKp z@HDlb-PhX7ZToYo9nNCOYf9dmu^M}_5}&us^OE{vE))GoTw!3BOZ8G=e-&WWrln#% z%$^H3XGzihsI!iBdbYal<+^9X3aes?eu@_=LJydB9q*h!7uqZQW!k~KJiBHoep&cU z$krkUFW=`RATiCvtijYeB42>nDW*sHo_`ls!xq*ZB=x(4Xmr;VP@ zK!MaOwu^WEseUChq-yMNV;Tf3--m8DZ+oXOS=#>`Ln>ikaDNAfcn+^mte3(@6w@Q* z`>fY#MEoKK6V~j5QDp@WD>kqr&!FjV@FbC9jlSMEx8+GFlzWlIxnkuFCuCrx(?<~G zZ0s+n+_^6bmSN;(Fv5@-e#EALebMx{eN7xWNeSX-fD=OIVn_-)H~(toUoL1#AsBE6 zA(nvb0+I0;_WHirCLiEg#5f0tz5dx@+VSTW!Sd$8m0vd-p~n^B^Z+U$&gZQ-`|LVi zfliQFABU&OPT)LG;T7l>ypC;o*Y59Uczqljz3v_a%UZgBc=mm~C9hRCLTM<~-hQnt zdZk|Xf!XOgO8lN{9)N7rVsfGUElgf6D{AHGsUk9ZLIZ_#fyn#wn*ZU>JDm5IAQDXm zas?A)haFB773xWtn9=4c4gWpyJSORq8|$Wx3u1kfi+2s+qjgutMzgoAI%PJP$n8Qj z#S{uK?5I?-%O*Sj4M59;L43FbufV8G#4%)aJUYaEo$)8U4--HeRwDYRkDgdSrSX7f z@YHuM>l@}&C1Ubcm_Ozei%wu!wsGa#vn2=xo%h4VND zG-O~zb1>skp}G;!rMIC=YLI&o-o$SQq)n@60hy|qu+!V( z;H2VtI#yuSlyC$A$7$1nZF4AXAY@dLS!4t%e_(oD;OS%y^Gf!DTi1|%!gySKyo{BU z;3r#r9yeK&#Y@}U`x!|^Hu+p}WMo;m>Zqu%yv0FHeF{%*eoqUBp)P5A6nAuTtU-A7 zghFU#2?clz=ZU|=xOA1n&DixH^d{t1tA;UC=6A`e_kEbL8GBQ9y^0++YfgJR@bW~s zIGz+YQz*EgY+;nWy(z2HpOm%>Z>5KU(d%gYAZiOQZ$mAXbArypBTGc{!zra7(sWm&SE|!hU25~vJriaBY}q;= zdjLyn#&z&;&%K^KPB4mnt$+qo!rfIwpe1CrKWAdweDLtLU@XHWco~6nxmX_3=p{v| z>#OCWljW;>dS?3Nv8hpvXnZwtO?_ZD!5TgLwaSN(=;T-muxbOE+{>%|*(iMBjqJ>O z=CuA$FTJswh5^+4Kv6m2z}{GfkU1}xI$WUpQBOM^!2@)JhG5tT-pMYqJTTf9IW&Di zCR1(6frtsKNyC$y?c1UK4?nK>fmgp1xwGkKbC}2xsw;Em_qZMklb#Y=h;Iy*AMuuJ zHS)s$_Sg>g$}L`-p6uB77V9Q5I8xnUF;ZK`?hnjw1LaN+RWZ?2r4pv&4eh7tJ-l`= z1=H##TOPIoY!t%iJftPfUq4-T9=&e|RRS+0TTncuq%0aUl^NoX>*$hYFB^|1E@>p6 z@9jutk0@&lzPE4(UPu{q)0K1K*prwN^moRCq4jGziIh9T_5C7LP|jk6_(h0WcNz2z zeGH=`<7j1owzNY4^fK+1aB%~@{n2Cz(ShI-Axyzf)NYszWr&C9gR7sF)NSq1q{IC5 z8dq-wKkHGH8kUX2O(^jY6?35Pt|f0|9{_cCBZqmU05~0}W~FM$8dCu96N=Iv)~el> z?7Gn3HP}ODa}A@HZo^^)>CvUuM6n6&Ihj<#KPT@>9Q0Fi*}-$gzd5_(aRzqFKlQDE z(veT8d%O239tP8MB{c5O=v2C&7{E`vDwaQzoK@0r^jc)+-53P+;0?d~3dOyKl6ra$ zvqp5sd+*#_c;1*C{rY!_b9P{vF|_TRRt~Z^>nD*JxojxK3iSw!`2QH}%JD!umxT0G zK@dv@?MWQ`W`%l(pkgC%H?dm6J(2>-!B}KKO?MFKD3%>su3+P^dY3Yx2I%THAoLyF zYqf-J)WQo3=a}FqtZ$L=fUVa21@^NazTG4EwX)TelvXBY^Cpms;X)%I9ckM1bqAXS zfZX&VmK1A{UFc5cbwK|Z!|Lp?K$k4Hb|oKefZiA2 z&Wl=aN`8iL@Vep%19hKMKkxo}b#lCce7aQZmHs#^;Qe08y2`4ig!X#FCw7v|7iM;` z^^K)~GzVwB*^vrQ0!PS}{E38sc7!0d(dcD}y6>P8g zw*n$O(QRPj%T3^xs|0HF0`SO1uk|R)vBrMGk+;7-$bJ04EtSHzWn14B67 z7{~S4x1{v!+P>8~M6b6*(Rj1!=+N}9mt(Y~HQ1mJ=%k_Z2l@z^hmWG)Ow5J;?md#A zpwJwsZsTj7^lZkLj~@Nw3IO`ZuB;ubDtuJYPn{H}pfFb|1Q+&x-S%6>*T2_vn;gd0 zk=ud2kn}rG=Jzf>cXYNRaH{jH4IGh2IP`nu0gT^uSB_=bUsg>_d2r`i&z5w2^jFq? zcs!ZT?*qOZUE1p-6J=3rI5|1F1{XJ_zw;~Gz3Nq5!s}qvJGWn6gEC@8wk+AiQ2l0z zw!(MGRRbR!7AXjOqXjhybXGN0{xhT1!%rY$O~1Jq-LAj7m5X*YW#EGER%fl$ajEUo zJLs89I~flGIAoY~luNK@twBh>{WfZ`D5Dg3qdndnsJz!gh*CAB6Lm`H^u3#P9X`6q zWJ5JWvv%1wn&JgLNqDp9XuB|f(?i&D>rvkwtXk9^5Z8UHY#y>&iuNBN3Kj!-)GA_5 zX?g#qsUw1O1RTCsGgu+rF(9~Yu{>e7>5E*cvO4_(wdWZl$|fjIaB|gO<#!0&Oc3D? zl@m;Z4yq|TP$1Jd4W1iumvf!-@8;Q_BL6#!gWkzCF=%*nsWYVxlqnj#p%G}GHlvIw9@u6eQq zj~sneZH)$q$Ru%M zwjG-B`+eHMJgbDTk+nb=g!In#Mblyp5-?I*UWg98@Zox<^FmRW79@m9xEl4u+tW#- z_LesNeXt^yI^*Mg1Cx1 v`ZVAh#9$L*zIkAffOgjJuczfP8^Koz!qkOgbmLoJ z1FzgP$L8GX8{?9BLI}}O!+5IS>6#cnhD@3=0nKH8euSr|r#Hs09yG z_Zn?7w%Xhl(|2d5nh941$i*`C37GzDE>c7vvi6$*C!>CPJNW#;L}UqEO~1YW0g(m( zsqQ_R#-zhUQx*DXB<_0>WgSsrb8h~bX1ndKC{5d2}<7FR(5%|Q+U!S9jXToO-gR_z1Ns<-9BIZeO)GU17$(>FEnVx zgG5GoV(LbCcHuN!QVOBiTvQI+lHO#Eo__1t(0I)r=AIP}y#)8#c-Z>bz+OZqDerr+Ryz9OboyZM zD)8|xup;obL}ckkargzU>E{Ed@l1Z`t~MWP7Ma-}TSZjAB8r|Guh0m{c18_v`%!i> zmSwX zq@$Q-7FTg_=|(P&gP<`3Wi35$q79MBrBvQJyV5Hj!SZAl%B$vgp5P+<*?s zPb)9Iee~F7>WJv)>o1N*Do**(#$CbGX>vM22ZjN%U!6 zEmn+tzq95hOME!H^to&BO7s~lu$nk#l5y3blu0c(6JM%Mzp|l|z48>8JZB4>WoFMG z?S*~AHn`LI$AMhdofY5@7h{)j)_86}ERU$}_>_i;g<53KU=wTko3z%6PKIwqGnYT; zgkX^|#U@f)THts1aZQXl&tFWNu7Nlj9e9&65P1Lcka$^{pgHJE5ruPOZ*==QA^WSp zNeI(I8O#$&H-(o^XC_sxUrEdJhQrDWn7|igz%cZ1Yvl#?pE|w;lGBo4q_1lZPCBNI zu{N5#*H*#_t|*pWY1YDYQFYCtPnt(i#oAP~)|Ta}U$Er~Xj-Um6 zfst{k(C9l_7qj2@92UEI$<%-!2|p%yHe>%wcugt6Fk+L2vsUJ-aeCn8;@5X8WXRkj z;H@a5r?vHOFaBw<#(%^pq$d}Bd!$i}4ujV{ zhNlFN2>dStN%BCg<`CL6`M& zs#7^>u2VyCzds(UYL*88z4e*M<7k4dHjl23W>Qo|@h=u^27m~EXXEk#i1Yl!G~L+B9{OH9p#eUX?Z<)k%W`tkjLEUfNJUh7BXK=3KlHv ztFKg%KNlqM8X!Yrx%qoO#i5g-s*-c6=p&lHIjWZx_p29YOXELLl9L(qgusET9_bIf zaTcLBKOE{o4`x3ce(C3^Z}OojzfR+q5Te+6;fEan36G2Q2%qkyoM~P%Qb&lV9rPMv zfBjC)*z8T(M%(@J1)r;4ck6R5BI5lr)JA|j4sA3P*yDv^S{e(;t?X)k==~mxTn==~ zZ)K~Je)L^)_CHJMfP=H$pvR8UTTxL6+$@l)ciT&7Ro6|U!B)(0L?_J-ChJpl7y4PB zuATC3O-LH8Y78*MWD}ca?o*!sB-H@4EBjK$E?3JrWE+x*FHl$dSIW%zPR}WI#gq9& zhxgx*+l&~Pz<5w|7^e8(bLxAiBe;j1NeiEWSJ4ACX1W2J#LI^mtm8Ytzz*-_j|-N! z>l&60pYu?YqW8ukw((Ao$BW?FT;KoLh}8D65Xz4~}1aKa%E&&+CQpusziA`@GCCc-$GzTk&Kw zt-iST=8bHKL^(K&CH0%QvobJMa!t{{K-RjE49(j3_PNjU_yep~H8^bwacZ(D0~X=s z>Z9E)kaIM#=S@&eslk|sMB}jtTZ~VYJ}qng7{ierH7*{c*3`3V<*9^Ddr!N*z%$Jy zlG;xzyjcxFl}!Hk9UdrGB1O-K$W{+KOh@91hBx*{cRKB6sky9hW=+uFz22iBrmqiM zhiW1U?=wW>XhPD%%HN~d8q;7J*nvSOE3YSDu08@4225}yq4bR5Y7x=8y`Ai3zPY1Mzu<_?U!rn)-v@>|==?V#`2)GZ5dsD5rfEXyM!i20<1waO-? z))QC9oUmzi-x@riNYbi-sy|%bl6!o2AvE{dzeH);yX}6&>Z5#1+d*hH96SCY+2%r@ z(98osC`;dqJ~{Je!T7Sf;+%ALwIVsDA2#0@F9(+MmV9o+6zOLRfDec*tV0@#o%P!UNW{jEwrvH=VBL!9h%_6W7MgcN?R*d{}*yKw`NZ zZu}nu-)@4)NKCE@U6df^5H7`MLY@7A(bsTdEh5OTTX^C5imkHrzghT$m6A7TI<}g# z6nJ2!n#*oI9S#w!SLR2b@^Dg^JT5PrsVW)3f~7%(l$ck{dMAN0R_hT*7S3-CqYFP3 z`!RVl-0sWK)5vai(d92vuGcOUYKqGp!u(1NT>p?91?(wSJfwpQMw&I++l~|+`ch2) z2VTc@p-2%Fmn4HGqT^R;#!4AEb#J2?4milemHE1Jm3|=VMJ4$1rbS^?b4(&Bmf64{ zkKxlyq0UHLX{$GfW`CX_*aj?h3-=3c?{sz~h4WlMi ztLFwK`2}_Nj#fyG5!-g-`})33(|>6pf~P3D0(NF^fLrPvw%3~2K&r2W?s`&YvoY0` z4uKl&6uetPGbw;Q*fn(qAxGL)za3+*$_?8_Aa~rB_^a%pRjiuwfgV`dLuM99wi+tA zbTzN<(i=lso(=mnfezrw-XnV~mcL-K0}msRf!O|mxSF$s{PTvRiL{)kEtkP{lX+1K z?oP}yHIvCBSEYpzq*qpc%wAVDGT?7 z!AAn(TX4UE<_a<>FZrz=7Y>}Te%~HPMf%{q%GiV~cXjc*rO+6VdjcPPeo#30cxFo^ z7YKTE3xsOQpv=7z*)VQ`)B@2R)B%qXZ9v}&RA2OTc_;;hUGS#p>ra&+2WK%y7Uia(Th^7Pu24%A?!0EaA6-Bqp*jbG(tUhZ0cI~?jOAj~T ztJqARQXa(j(g-8dY2#FJLMEShUIF!|#n4+a{};ImC@agsiOu`yZp7jICd8_kL1&yK zCe_o>wwLoZ3NIQkXmXS=b;qN$%I-HGdKTq6b-5u`oyebVABmz+jJy6lgLVjjCFJUI zUYB4Ok?96%?T-1A>ao?rL-PTrr``Mh=Z>i3i2|U9^OwhxLQJ#VbSAs9hL9_A*xoxJ z$cCvOLMM}dZ5+`9){t+%!S{$Qx$L7WV=Lf%#Ssk7IK}5J{`W341##|i&OpPP2a2F; zro;dg|HmxpG135Wm&NhNU&WK)k(F2S)@-d=d@vt#;X;f zmbhFgD=<)yP<9UDj@-Ngnbkd-2iBNx>!&5old5%KheJqF`^}z7Q6UQ}jWD;csYw@X zimgdV@0+_@xhXSZ(^W6p`Ywx)RC?Xs>i0b+H*NghOeT3~e>TQOl@+1}MMJr&VK)c7 zTmKjf?LmUrUcfl!GXWg_Qq@wgT^4Mna5n&k29`*@4qeobuZ(YTcT0JrPd_1rb|%O$ z2nCAsVR&G36StHsjbJ1>MKll&1rDz@?%~@95ptVjkXvmN-?aZT5;>!=+u}apT;;%) z!s^CtOR z`2&?QfguqOgVgl_7s8m*)yrrvydM|}LB+EFTx!|I(QRPShQ`1p;RK|f;lT?GbjX)= zYp)em@-iKexdy2@^@&+i4s(v+VD`W;r=F+H_>yH^+*Se>f+1d)&DONjXqXN>KM=H# zN`a4Z$fQs6%x{xGEq?RBC$)ZH_%j|*$6PYcOSENmx>mgpL7B0H0gTMM=wfa9;kA5t z#g=>kCq+y>zh&P0IPee)bqZ0>i3UyfyIj-_6Mb@TdRM2>{dd|CAeM(2_LpL1w|O*E zaqB0Q4z+0g;$e=W0u{<&l-79O;N#aOwD7#SCl7wjUqm0!O3KG zcSmfTTYdwa{`zMvrI1!vFEZgp_11=RN{up!|JVj4rJ%tPr_hm1p9KI)7Wb2fd9@2Y zPwCsu4Sw>~z^f4U4bd}+=#w^U^F_L~n#pR{%Q<_9icxZY=o)WTA0G?G4qQj*QEAVr z(m=jnsz0i*>GP1$R?PUxf?Dj@WMz6K=5>qO+K}@-6|Qynm+(Esa^C(&1}y&v{V$t@ zoQFX>`}5E?RPKDWocx;wA7MRRuvcx-2-<$wbC0S)NBENk42uf2y90buhR_e4neX&R zRYooweF0{uZU@xNJFJJd`^hh6lY5PmHLey{)JCwoc?SvI8R?qMU78aAL;^vGv?yPu zuQHn-LyHHLs9E%eQhR^%RIPrQRCBIL%&|*iS`&aBv8u%2H3!~dJr}xRdyTlQEePZ^ z$XYC*0nI)cDG)hAdd%xR&~rRm=v;F)sgo^FE|8NnQ+g|WBR{T8LS%H*>rCXyXdc8$ zDgG)G+tV<%fqd}UG+4LB@XSe3eISzghpIcFtwA^!qmk3YH`aWY=bfLkg7^cn@PN3; zsLADN+i3V;H71-+Jr5@$-JHR8DruH(rNKULp#qKf&1U`eE}av~_n)%&-z6yz3zfR* zv5EV?gt$6zk*|s(N4SMi3&wH{^1{(ubB*Vh3_n-#SzB9tUPqqrUSe&J_F{MPx)a+z z2-)twDul?c5%v?v6V1{z^e?i%O2G8+@F$$q=|1>Z%JJ7lS>isYaa&!_c$EVyJ9T*@ ziP|-M?g;3596}DE0EHV6MH?JbR!`lX?F_}2f4>#Dz{w!5oaygK(ySss+kBS4+?~EQ zPpkZQE!v;Z_>^43EzWSuwJ^6v0qa9H#!+W;5WfC{*{%dr;0HmKWk zt>~FoIa8C^71pBb>qi@GS2HrFINW=Y7kX3D|D&nPFr0fn=b2k4^>wI6=k=zVH|M~kQ9*a6zNXs8oC5&q*Fi| zK{}O?l!l?ZyF6iC8c@2 zd%fU>%@xWuqAdo@dJ5Vvam(4w0-10k)=Acv^p|Jb_&ry>c7eK>2K<;>x~A!wTOw$T`N=d(=+?Bc!RVx4et#;%ZEPqtFei zRhKRM7)Wmnm+K)4pO=2K!Oe8Z^7z>Dzq|Hym=l zu`j~Dno@&BgrY>37rh(0k<8sKSe(*D2R2VSs9~3h3%^!m5_-uWp;x^;6Z8>KIaZo- z%Q@z0*wD}k8YtkvM|9`$f(HV@=K1Vy(cnieOq61Cxd+?p}7 zM`#l3JxXprK%&~|*n@v|AF8JIN7B3H2+!{!rgR?v9@p@ z50Up2>1P_&F>;<$0orx5{rqa|uYc5YGNAwTx|UeBdR4oR^75!U16R8~71>dr>G^V+ zP%XSiV^3%jYO7*mUiD^k$h{oLJ_D_h9Coq@i&qC}KbDws&#-iqfPP~^Oi&ax1e(|? zPsi@ekJ~G{ui0w2_-ub%vWETMIM0$@squTRmo?bU6&QcbBrvD|cS(T_vS z!}aZz$4)&+B_ENKpUB(qWJ$*C&ZpysyDDS)#?bgUMk|wvmen37B2V)&mdcs)?RI9~ zgo&_Y0S#;6QpM`~;mL$3*oN<^9y@Y<4SS5LhCbg>n5)t8n@n^!09z&mTI~KTPZtm@ z6q>#)7bLvfV)iT`mp04}MG;k^=dA?CUSqFy(FQOE{fJU1(JEx&t=8M}yZxiPxw!b5 zZ?#wwv|D!TY=zj&FWH^?BOr$Yj_uQ?v_)kNCdvY%xeZTV%3G8|#%36Dg^ zgfP>;@(GcB$vvmEn% zCHGs>#_Las#MSW6iuE)7W1??C@C$PiVWWRKcqqyOM9A5$hyM9nw&3x_fE@mG%KeA0<{M!(+2GAp)tM zfNOJn8g3CNT5iD<&+X3RkVFj*YrXR!5zEvLBr&AJdM2NK&e&Q0z6~VY_`~wii^cvc zN>GrVxrcCkTAS0vkV{P_Dyc zmvR8=WjxkW)cu5y$z?myrf5)`ZX(F9@=p23AnBPa`D&MwzK>_FrNuu}2XT~bx7+i- z^Ponn*2sF~h-W$uEB4bUXEIhdb8%L61e25C+1gWon$j1q^d}InB%w>L>Us|j9Efo_ zV&_KMM(mSEeYi?|%d=X0KBsRoG+IG^e)ED3sOx9&dF<}E#!l)as^)(65e>x2Q>ZT6R z_KJ{H1v>J%DD~BT&^IF3#k={>dDIh?v3%2Oz*f&n=WD}=-tl4&rwS|eHG2M)lBR7X zpl|iL&fN==UyQscE>vrmJjUH2*B65M*Ti#KB!7rK8Zewlpje4#J~^ciNwFb_l8JVr z>#jH~0xPq!%+Dv;bL0}eczfL0$#je!Zg*?bBROQ_1cIPN?7V(82`VK@rDbJ1DIVjhgd2JkoCRn50J9N5S zQ&jr-9<#_m5l|l_ofV#uG$(!6%wsNI`+2^2yyCJ769uhL+bSF>)mly%0wXB|nQ@*~K45MWsd0 zX=M7sYj>HS8wU_Z)=7&n#h*Gq{6?4{pL3g0=?^}znJn`N%y^0ovQEBjyf3r?;Ee>r zxUT?EG7NmKQGV5MEp%NV*hkwRZ`NoqA_8QFzaTVl{WdrH_|=SF0`^qTP{4)ND&`@1 zau5V`K;9^gv(ZZWWPJG~EzM)Uf#N@~|3Oq0hjK23JPHZ8>T~4DC)?OYQpw#ehC*T> z$Ol6ACOkxel}Z0x1`;Q%R~8jvoS&Y!L}L74e|Chzfg}gC%};7y;v+W+l`hdAAQ$BL zKt(*)EtW8gwQ&v4_{jNKTd@P^o~l2sbOAp>_UhSzI}ZqZnt%6P&eXL)3DSFGv6bJg zKxrpg-L$U|MKYYqgjD1MPi;x4+kblXkmeUpXM&76S|GdS%Z?;g%?LmL`svZH^i|SdQf1xed&+`ozmaa!Z_GTYRwv#gK1Q0BxX^(Z60M zMRe)|`F?RuX+GdHYw0tAl=f~W9h9NHz3Zs|-4Cx5&eoQ_M{JdnI5x51n` zrY|m8+xDruqR`d{?LM(OpLlt22ex1e)=maGS*t41WeUFO=gb~LV;L*bi!FTyJI@u+ zx5#Yd-*HDI<)S8|Pb&xFc$UmUd}E6v?~KMW(3vnmuB1D0PvQ83?a3C1y>b*2xI9-6 zD0L{0;58-Tf1c)Tk3#eGOw+Jc$uq-rZov}< z4EX_Ie&Jz2Vif_S?Q;uH&X9% z^N_*30o-DhzKV82(yn&nDc8eS_dMo)I$fAJ-)UYO0l-coDwbnMA151JMH#70{i8h#p!{ zh38v<62txH`_X-5He5&_by%MIOViLlgB58>@Xo6gy6f>koBv8r2{g$8)Lp~sUbB7= zSkVc}MH8pz5q`tB<;M5USRF6)^CuifVFz~GaE9p&hax7FtB?%Wr^|AhHeTx!&9fHj4>J``FKC4ju>ap9mE0NEF#^ z1Mi8)9WY^<;@_0Sy1Yy-kZ=2ry70=)b0JCP*^`=@zj?9y)YvHaEnRIAez)ETo9G@h zMVb=EBfHt>q3crt7@psyr>NE`OZq>l7c!5$Sz1px9FO z`$sHwU`5UEgBJA>Pg7s>j#H+k$g*GM@7&m%g@KzxA41q~B2begH~WRSp42x--TTvC zx1G?>pD`q8B2APqeQ9V{k!-S_Xua+a6+uW5`T%(_5d%^HA`Tx#<60PicKW7Vws`i8 zevT3A5PW==B|g<($NJ3EX@a6}Wz#VeM~KF%QB{w}k5N#D;hu zcgi?z20kYdsxfIX7%O>(BKYxL_pTW(zZbFSMBs*q9gH5hO9WHp!ScCie3GXn$?Yc2 zKT7W0;vry`&C#|}6v#?3sgVRqNt;-1U}rlg=`GRe*xC*Q47Rwg!o-WzJCsf|r6RX_ zm|Q~+$onG`br`QlO)C=O`QBjLr?gVohE8ZbSyl*UY~jE}#B@0jm?V$@_ogGIzJAmp)n1umnZR=}NdjS1g>{Na-{me=A) z{6NXdF`h^M>?^~Ap+CIV0BkPlx*zZ&)ofzl#T}1$%WD7ZGBF@i8QHHZepS6|M*fvS z7UOHePAd}LJlqr4;#PVdUgo?c>FQivDx83g@xbS~KY_}#afbNdi7__r!9`m~zJd;Y zf}kFRkGw>KT9f$!zyaXL2Hm0|552q1k!G*~U>kS8ZyrvoU*9BO!Cdvde)QRpxLHt? zk4CPf%_9)D;+@)v&w=@&{lSzZCJz;mAmpR^GB0n8VSwK(O%b86a%6qAtXLy(Mr5Sg z)^G2)ofj??tdL?h+-cv=zthsi|*hVnna$qvGC^*mzaN?Dfk9C~e@6wtTXamVCF zkuV_mHBTE~RF&dw^|HwnUnU95_UR_HcDb-7Z=S`K z`SE$Er0%QVPepeED3s%K^CKX6`M?<*$%v3ZkC2rLxhW9)q%+ELt^>#DQRf>R?SMat z5KPrg_kZ zE3ml~-TE?%+qDj=wr;J-IRe4q((9ceoX{Q+s~2cyM%CX+{STfUfLvXK~CqOs2JiKxf4d`?rq ztZ>E2UPA!C3NCbLey1`h?&xPwUsd_W?eBmGG9$8&X-_e+R{^~}DJ~uw(XzF8Mj~%9 zfSS_Iqi%;_wO_5xgylN}25x!SM6#*uRV&UT{hbsJ11$cG!lw<3fnqchY?;z_kpJtI zH=85JSRp+I>fHE_W3tx;%1hKTk-UFN)4hKoLezI%zsLe^eDLDNtVn}>*#OWYK}wmy z2kw>;DTIgL006@3iPE(Y0=qjvFvp(_zj4u7znxURpU zBYLXswAt_+w_k(lE7Lcqj{f`QaXIudK2fH^zq_mwKn#@!Qp<#`r@6<3`=C znoji^#!e13A4vccQeD)rq&y=Q1qYj{xlw_S@FD8IL}CF8^5?{}gs+~UiU@0o&EG%F zx#ci3i5@fr^&#$kFJ#7kZuh2lm0k`#^#ifgQD8`uLR})?kb1wBBdPfm5X$}sh0g%q zO%fNGH@9m&g%m@m(QwnM(_}RqO^T{*@qU?P1${nd;%=H@jYlBOlF_wrw=hj|>_2w_ zl>Su-6wLHu126A+8t=7+E(>YFD(cUV`q2jz8PcFZmluOoYu#*!^Gk(;s4Cj&e%kIFz-%r*S812&g9vjnnVMWps8J`kE=S-|58Snk z6l55=W!wj)={xM*x6b8lw?GYX#6v-(%?aquYK|BFkP3wSNo&#tkwFqZ zaTOQ`hK8u)Ff*XDgZ3fuJB#i+1m=_vmK&pwWZBGRSHCu@Gnz}VKD_qLdzTdJFdV(Y;!h7oN@tmmsYp=uOo291NkD5_iI~4wILZYE!EHyJzg6yz2S115!bNau26u~2neWWo z*}8I*Fe_|)@-iNT*#Z7m)MbC=*^Yz@xTT|YwEcQlVp0PJRsR@Vp)1RITQI%?8zx=?^fmGD%#j{j%t~a76s5SUTM@-U|5qc8SbuXu&d zTZMKFl?;MZ|5h;mnq&GDvcaM)ixK;qmBM^TDXi#}dV6i^H$sHe&Xb2z0$PD-+U(t4 zqK3r3xJ58LDbb=M0*Yd^(`a@yBXz^%vjD)hfIE&iO*aNEPr2WJv-8eCzCWK?Q3ELy zKD)yF;Pd&4NTE;>Im|pGuqstl#hT(rvt3`+QoHn>kHf;3Q`E1Wbd@8FZ1Oisdj7)H z{m(WH5D-2&F2lk)o%NtETsdzLN@1LCoHmbPBM-9T0PmzISFg|a?-OjiXx(3Y&VSQQ zTKsEJf>y{dV`jxl7Cav<($;|tfpYk-RVy>BtG88EhX3Q-3_gNC;3U=Y{UUpo^IXX8 zBVDx`J2o84^8~i*%&^vL;@tw<^$?!_eUnz)u=c~ja_d9E&-=Ij=V`>ubK`Wr?ZNFO zd-=nwlxE8^T64m7^LNU|Fe>YJNb{v9`| zRHVAX5a{NbAI##{c&lHXcwJjm*KqJ+oSdtE`xa&y#lQ%Xl1A7l6~izPTgzLJc}xQJ zlriHI-I}k0R6%@o184$9tfI1tOo_q~_>$IK`>%u>EXLG=_MMPEk?W+o8Ujtd-9Q%@ zR`N4RHMzf;ru%~w!Mgs@jEg^$Hy=HvL zYy{sCV}C{!Q0>W%qt)1{d@W(11KQaYG0&_e?SyJ@_1lh~)`VHY?u9&wIje5I{{Cs2 zrj%TajRe_}uywAjw~b8Qm?Idc8@BkTD&huCtCO5)pSJKcnBZ?E`{DR(M1Az2R*5KF zx&=Qh-8&2EX-i>Tyy%niKp+obv0aWUY@lKI?R(w?itn*#UMD(oPV2m+l1_j<_;Mq| z3m_6k3f7sUT~>JsI$ni`l;gjl;t=4z_W%nbk`p%`JqZ4R{ulA&;}%Y7=aO$SW&>T!o5EyrU~ayh3{ zZH^R&WvCrf;fs5PRgxn6qLZ|wD!fkixivD-x;VSt!})+?js~275LMCvIE@?ZpQyi*+n&&6}tMC+~4B#)n8?{0_?Cr1ifu2|n=3;&@MuLLiA6_q~~**NcL z0*)4Z6eq%f>~bS*!pAlYjFwel`FbHkt?e}zQPO5)BQ$ly4OYPRsyVBZm+kKe8;)~; zc3N%*2K-3vChRPJmVUAS2e{P`FiV*^lj9gHOiUv|k43BmcCZ_M%5-DUj<#vJKI-}p z>|#@|ruH5;weVbZNw!`~>7=}u;%Gm_wUH#iX zc?R4bzt1C>*syLI!lD~~KA+u!=Q~ZURBWx)JNks{WRCPDkda!Jn|bLs(y}kO^qZQm z`X_MX_P-QnJ^}%W@G)>7cYx+ZUVI__^n!)gZ%ge@nyMm!@gMjpC-nejN1{Mbq!#kS z)4;X)v)$Sjv+KdQslfs!TYdjB_X>$s>o>@|kT7q!AQZxZ=?gUF)nC3y7NhG|v9+1t zFAGUZF91?3M3jiqQrC>AX)~YUZi-uexZ_awkE2y;07bs9b5yJ9-!g6|9noUuv{i9j zO-6j%!xw0N@uY#8JWu(5w2}r4lEy!3O2RcP`=(blyX!rW`bl%5lhm5i@lAcw{HA~s zJ3#XY!Vny3>~K(Oe(!}0QOcA2VpDc9Qo9ym@mbkL!N+&+>^SyM9U|Nx&F6xO_^h4C z?pwV=r4FER=k8{m3gqs%%yqNa2!HOt0<4gqHZRGsNBWEn=n2^Nk1q4nb zr|G%U{TYZ=ekVY0t|%EWMS{4G_-cAJDGz1-2dY=iA#H{9IF)n5%+?0Kg|${ha#=N1 zS9Va6-*}r0ETyHNYYHXlS{44?q#b5Drl-w^@hy^-fZA>jl6F=C0%oCH+KQ!V$K#}& ztH8Han8T_7kL1Be#2b7%qsE)&IP<);{=FeFp>jf@U)1C{#i$A5f@+T@dt%?>4WR#yEDSRoFfq*94$tEAA<8QDnndB!gd#TteAM!+;Xv3b6H z#OmBe%Vv-qlL2feT@rzNm4&YYnEGrWba=d`{>gsh^H>f(MeN@eQox??O}Y|0Pdh*l z`bu-6Kt1eT*mxnmP{dp4=h(vhIrP#!W*{ju3*JjB#3W&kmTvW)?)l}~U^lC<^k*I@ zP+GT}54ss}eDG5P`jT>zq!CUQ3EhGL8}1#ktHj?<=hfg|fQ2lczx<(W4lw|wsRGj;!Y%%6bc_b zO(w$NmPvYLv-GZJ>j_#b ziN(x{>S~PSj7N&M7oQKTUh?BV6EjfxnE>M{DKMG9*pY}O(eogO)E%t%!KOHZ6rMl# z#U{t-V;Umav4HqV9582*t6nr=^Xko8_+cB&3d|r!it9oImqU2%-2U)3rDVqKkxuUv zAPEN+{12EOh^G@k-t=}5H^$wy79ahZuq{s{)t@UZzZ)KyQd2L1rOaBi+@AnZFoHPD zvfdhK+?ZVtlbUwhqR0&P+;LM|ZIsRTA3c=_qncP2AShG=u;y93&k;0lf8V~|(&|1y ze}=>N85LisRDbQ4_HQSp%H?i zdi1RN;l1~V4?JzRmlhfX+7rMA#LQCaQ^xoBK9}ygUxByS#K-Q z!t0Wnex(cvHW>E|mvzC!KqW)}to44m4w&%woI@sd^WzUNyYlYlm|l*FQFFq9`0*id zO$v|@a5WP2is2D)%t|P=kmj&Y4kM|UdoSd2J+hq4&UrtMm;f%Q>v;+cs+V)=g@%hP5|2Lqy6emTyuM;ANJXoMQjr;3VyzO6P6=PJA z;-Lzrnv!uqJ38}0$KS(Py{J59B>!vsK!3WA&o4_+1)7mUi?Km~^=hq*qvI}q(VV~} zo1pO)WwU~L0QNa8@13|=#=#Crr zix+4EOtX1f->12z+&5Au{n>Nn{#rH>M=YMQ(Js^RjOtEWkEvfwxzRWtw2Z=S_2h)EaUomo}qp2z*jh8w_ ztrJ(qa7%4>>%onGns>|4L9TjRzw8}s<^)L<|C}(rXMVoq$RV~)?eWBBv+|>1XWC7B zwBQZFVH0|`wmA4%7y`5h6>*Na@p6%QISms)TVl)xh__|ayyUDyV%OGj@SoF8`JW*@);RlYtZD4=n*wszs(L#%XT0L(yyFoKgOy(0`?(E(YCECbT=%}^e#*IPYjR{5_QT%BuvH5C_DYu zYAMFuGC%0BDDAANE1ph_TtNIby&Lv)z|U%L3AxU~Sx_hp0-I!lo7e#^hi!fx&ohL5Lstm@!hh45d1B{-)!+~NIV26z;c~$rmDkH2ef zKl49~GI!L}6Ph*zIDpIg4rIuP6ekZ<5&f%Q&P(R6x>5YBhv5RYYR(O^ds9LGN?AWi z8>Mc>)(E?E`;>>hiaR;LI(U1b>ylYOr_WD0&P`Fqh!{B?>f$tI zyQs|V&Ilx(`!^X0@7B_a%Q#x;MGhOtftiHA9Pj?8Jq5Vtmt}vd?3UKT*R`@3@acv=>V-zOm?Y`_J% zA1Hjt$8n!ZMS&=`I^L*9rR9Iq?_EFPnGH$Y3KQYShGe3z`e(ZRQTPLP2%(sG*+mm7 z-RQ=SIgjM6=}yi8WFAUWM#!sg1d&+;5Zu?fTyMDJe!dWw@_0ll7N_&AdW`hWx=_`) zCp-WDDRzW(+qq>!{q7VF@ySaf~km%&F+ zTT&Tcbp0m?ZgdqN_kwpDRXO}51F$oIqzQb6 ziK~uiMY$q?d=ySX9`wjeDWqeY*953`97!SI>2Rc!-{+PRGtd|FN)TRksR(U%>@YQZ z9z;O0*oywGPy^B)RRY(XS`sK|pO4$1s2#UeTYU=-vj|&?dKh z8~|=BseO-GzXwMhX#bjji%D2_l?aR+bJv}ue8~I?keSGM1Z#C)CH#zEMjA^ZACdgh zsWC{8$VZp&!*>7MAFVg~cS{svo9*6*3uW|d0j%(!o|;2C7V)^sv6*Jrj(nH)HX?_8+)|06x$G4ha%HQN1@ zKU}s@KjC|c^Le&sGn>hOJpErzV zBChW&z5VLOsyV9!w;J157V|8xL~p;*vvd4W?tK2PWg$RR5FubWxY{xSMd>G@w))}F zQ))~kU=+8_^r8uVE0F$7iJOT5bSTvpfs6cx*>?HSjIA~ck%L<@z5*~>vB(t~aAur| z`@iWR41lL;pG6OqI%~OE41q%G-g$uHbQ>1H)tb-mdB>^&_$>*|rjb!bFBYX!_LD$z zdN;}JNMFn_mk*8GbAC2&?z2lA1iru>GJO2cyJ_^U|Km-H31YD0hD{1Syb7yJzDA87 zfV21;_GxvrjKnW$z$UpQLayYQ6$kZjhwU7`M6kF!SL2$?UJ8 zLm=(|=F)S%xVWxf;k|n4DXqs?N)kBpP#|4E3Z^cgE!51Hr}I zb$6Pb3bHIUJs4kwUU)Y?8YGB`bXW{M>1~4L(_^{{gPKBeuYwM7#9>d3)&NDYDz|q? zG3?TMA)`Tg>@OMIOlk^@F8&K9L9zz)9#gnx-ZhbLmpc+;opZNeHvgH$^{^w^^R8mO z_wGCzAWmNk%2wNZw*IFw2(nMoWzbjDU8(!?4QJfXDpl^*8Ut_?uYtijdod7ZiCAGk zz+$g*#Jp|herTgeY}hJ6t*R7?@Bb@QQ1WdgPNF0ko7bcZOVsyL|E5GwEO$KLPRh1O zH((gMyW<@XNHd)sxVg)qwB@F>CQ{j?Y3`qr)L%;cO~6;gxid7xI~m2(;1bC8wnLIh z_R4-v@#D@KKupjE`7g7w3GOLmun%^Es7Ci{@7H5IuCvZGo2@mQ!q_m4;ce@+?oMuS zjtCuayZK7Sz>|UqT%bvb#};&fmIrv{^9wu=Wd6y4)*C;jX7|1KVWckVRlSWUz3$D@26-6+3E;ou!xdWf-RcJ$r!h7%b z2~S_BLUZLN>%n`*HMK{2O6Ew3aZHs{_XmPu#==_j84x0BU+uc4KjR=I{*hJpQl8SD zj{fKqPGV{o8y#@c7m-oC#FF#YWLoTnL0fSOm1>9yqceRH{H4;@Zu6@~;_-OWXa{N}B&{wa#v)9O-hPnH^`0Jqg_Y=eB`q$6HD?Pix=K5}M#PTkt2i z+JVr==a-$>Kh4tX8a_$$qc7RD+wSiIQ|rEG6c{A3>W4iZ!SY?*WgdxnZ*VZ1`m0<9 zD)XC%DXPydAn6k;9=m+kr@%c2-afz%8AvAEJ&Os%j# zR+#I@cVF`tn;j$$;g}ZVA65F0V!8F&>^$@g@F0RvqtqGZJ1U>laNGhd2E%hMpmu~z zYj_B|PuWkwY3Hj?IZqTlMl$+4oj^}y8*zL$s707z;%1-UDW=p;eOCr9MFl2Gy24tr z;2OOiELGf?<_4fO!bk9MAC_z)IW*5$HBL-8GF%i5srcx`x#{uSTUhKz$6hu>&)%^5 z0+e}L*nO_xpNHoIh~@jd>{bPnf~Rrf*KYxQ(bH4B#>8^y)~}X79-NLnyFVra4-jNH za$6P`uY`Cc%2#Cc1QMb?SiGKyU7u)RV9F7pW|#JkoMo(y2vutF#5?%>u(r4!(6M51 z9~DQSbqN2!^SL3raf!thnt2XoQB82$H8!MD(SeT3!aB$;={^jPOh91Pa_7=*S^H4s zX58EK;}{PY`a!Fya=}B1XT8Au*T0Yg{9^&b$FK%xziJLHv7hW|zH2=n4ZvZ&%Ls0N znhy0hA5Cm1*8>jQvw`VI)Vca=xHtpMdeQtl_ya=KQi3OM+TRV3~_jz?LN)d7bzvM^ckWo%W$)^)lippPvh&J9Qv#L8vq<2I7(f2Qrgqh+Z z)otp7Fkxee&G z&Y)gx&YVXapK6)3X3%Mu{(M(IyUuPyBy2!wVZK+t7~8jpS|r2#o#kYlo}h0!hjEnn z_`0iixWQ;9N>l*c_0i1j$FpG&OXR-xos@R5MxpLu=vZ7L>jzZBEsn)(o9GrUi~iCJ z=H{AGxQeMfy~PAlG6$Mt=Vn(VF?&`*^?2yootGKsiEJEdITgwq|z&-h@nfF#=>_`Zk~Z36PpmbdxV195Tv+L*O+(G{4Y%vB`I@-{r7&=EqiNsVye z!$D+iAt6cZz6)zdXIrNEi#4zJ211V|ayf$bvrUga+$1Nny!BwQi*{9=IL+EV!ch4@xX8&kW|{~ zdeWYp&q#z@h;wWp%JWj^K`3Kjd$bU-NE$u7ZR@T4WrstgcTXr<`Xcy5zxKgGl(y(i7R+y-q?M{4U&@dxlA&O`oiisO@SPqoLxDh zW?hi~$!y}O1!wtgpU?dCzv2c&i2))W|EUmN;J-Vr6b^TDHI*BDChI=H6=GGwS_(rn zvLxkH4)-85Tv45EXJ)Ar3v@F3&fH!1(sb7jSJ zE*>4rf>nvpQK}LjMU`lRF8y9ly0{U8NtYJRQ3xs*BEB;ni}Sc&MUhgdMk~!@yJkAh z$NV|OhQ(zn0o3k1)tmw4y0Ps@AFb+|c8-u5TQpjLqs{U|C=sN`hJ`KcXMHHHUn%%t z+rydTL%ssw9tNUZPaD@*4p553!_>yRbyvrERL3p@_MG%8$J}Z z9se#C5Qh?oHRW*pU?@6t*3*I^NE5qh^kz;bTDw)xXg;~TGz9wOu{mRe59Ur90%|j{ zO)=Id+ShCS@!5c#sc1GZ8|?&?i67Gs$B^Y?oAvp>Gn4Jle#5|bs-IrWdT;kcB#85A z0=Mbz5-Jv%3B<3M16Os6*3Z|z8tL4_N)n{2TGZUsHYbml>8QnvF6iAHU{Y=6l<7vQ zZ@-OJhR|{?#qZAHNM87_SKG-hJJ8C$#NytIjWO1Q@>l$;?|}V3L&VoFc=U@(tw9y* zM7ui$_e<4MfC|cGtb#iN3)tuvnk19NAl))zr8H7L=Tx_miofN^ z>_DPA&{$XfXx!puIjQ#;3)2q@g8>>m$0g!^vnP8dgIy|iNUYNAQAh=QCoBJL;XvVu zp;=*gn>iK6!k|kMB3952$&Yh5n{gPhw%%xw+F1@WR=t-rtEMZj$}y6g=yyL<3da!} z_i{ae;yuXpQ2FA!KIgdll~X~lu3adKwGk3;5GSP~x^L*eiytFjG7l`gC=Fey# z@^8&u9O^f69<3cW6ti5gk$?Fl6BI^8N+Q2Iv6a6n?)zPwrrY!mP;{0rU^2^IYS$^N z=yh&dUT(Gc&Vl!z-FeV9Gm2gU?+q08ogI!uR7o7wP)L=LX`_s!hjzAZ7YAmgid4;Z zvAEM?=Wa+Cmn>h*xuRvvoJO?9jBz^Hy(kM$}a`}OT7|H1U^ z>Z7;|*wbBq#JLBNi|B*Z3_3h?9P_mMYm1^_Nuhm>M5xTE*(S)F@@vcrGg zv3c*la6M1X=+S?kFeoyCr*S>}*Jtd93tKf&!ORNNp)vNSKW+N3_3-L7&_*4K@c(Y2 zZu*&OK;TF2H)s)Ujg%Oe$%}y1f4?OZ(Bt44$gXeEcx(SIQck*R&gSS@>EXNo@kpIC zJ_Z^pcnPnjx*4gIX2?pY(z2=IY)jAjx3%Kl`kkehTh=~)_n<`So|4a`$k%PG= zun@&vl2fj?HxTC3QRzlWbbVV+fbW|@fq^HDKl>%|w3HquUW(nG-7S z%&Ag!#hLOWuF`-PtIHi~{T^Y??p}@mIRaE9MEs9Bg7hkw-0Ey{HKD=@R3W@@%lW!D z1q--xQs40EldQ2;4bp4bBHDt<5saU9Q!C)BZM?j-wLz7GTq@F$9qX2~Wa6)@R)@;{ zrn0BR!**oJKaWP1r-T(2XG$7yV6L9hV(NX(k1<`6~*L}Hx=`z>B#(hbS&{&5UR%I4)3P}h3U=@y&`3H~80|VO=%ZcgLg(sq@ zIfXjZM_M=^tls-QLEk!G0jezc<8=vvx;T!i%uQdpJB}|?RTbfF3Dj*N4&^004jx_! zk2SNHnNiy@UNOgQBCDRa7KOhNowom9>5~9vOT}?{l3l?jHO^?&#r{eRG$$mp)Tpo* zW47LglWg6;yn5>M)fya#hq$Gm**7_l6W6frrJ_?Or@d!MZQSE2lOiA|k)2S-BQu;< zKq4}7@aA6vaQcSKi`t{yq{aU%S$X}F3X z3S8MRh3xb*V!2{P{0V~KZgD#AF3z*2Mj=GRh@5Si!EyE}{-I|(=y#DXQ(P4n7!iYI z3D$`ub@Vk-FDiQz&&S6MYnuT)z^4GE9NLT%6~r`Di0+zO#h|+KDRbmX+umbfR(x9< z3KXO82?xo_&O19Mc2KWBf?0IkBFXopW-Y9V3aSM5*UjIY0+G#xFYf}wFzxuuC|q}+<(Umlq6SDr4~Bf;=8X!Xx+sc zjUgSkdO_cTkzR9;o$kn}b)#Jd=(iUN`BtyP*Tx2hv`xX19Edd0&g3O7Pn!}G@}iiT zJn_v-3Zv#f=}NEisIFr*ZT;ZL^q6C?`>%~E{^c{WN2uRldFz1aWug;^V}Dm1s?5Em zv`HmvN_x4{4?o~9{EF#%4!(Fct@Y+r_4Nl?LDBfyS}rkz(1=Z=j)nxDTB@9F84TWp zrUZ%O6)#FHw+JZ>-r7H`_{NAM@O~?us-A2Zr7s zfKt3lbBc;ukg&W3L4kMG2EH#PEe0oJWaYN@-hQ^pl8!3|UCeZ#`}fpF9HZFYE*K@P zl?Nb*|Det47qF=B8x_^tNGeW_5XRM**lgM3pc*-7&vDS=4A=cqOfb_8tBv;E^Oq~p zjx=pB;u9Ld!hDFMjJJbtk+-1H{+k@n6U_6}_Ye9kVN(yTH68pG-oFXn>PdRq94jHZ zJ7wNt-&iw8#(J+dJ}A&Eysy=RkZ@a2bpXF}jm%5a@u{!4=EjKw-vhoWTxGI1B-<6U z|LaJ@+rD5Lkibms;?%k}_Md^i#TY)N7zk z`=n5~+jYd`BPVgj9$?+Cffh-Z;s`V>hIv0aOy_7;W8bdvy3o5nFX~mAU4q;hs3`^X zREAw0Xs^^&xg0FM@b`pr1LxC+40liXCj7iNB6xo(Rh|RCb710r4U(k3hSubZhZhF!6FY<))0xWB2;7%EcA2Ao`6h=?yHJ@!gQ3*dRpoPzWL#sF-@9PSvzOCU z|5Xt!3_$vlci{XY*_haZFI{H2GAsj>-@Eszzj0h@seO;M0Klt}8ljUuW>J$8UFNif zn1QXkt0%v1bA%+f@?xV&=zIHh9O03!L!YXsSRu0f5pLa~8So`(vQe*yPENL-ALIK} zojcui29aFl7F13dQ)3V!OvJv|j~bms-ae%m_v;OK4^1c0s?$iikIFm|f`3s-pZ&?X z675n#-QNhgZ>8@CD{-!M5J{M8q{WbR{%wp2HK76mc9>Mp38TwbKg_>`j3spP7QVzy8FV@s}Rpt$nX zudf-0NO@p6@Kp!N3GPW+zV#~5lkTl zswgyA739ZWscb42(naBJ8iXp!M|Vxihn!RA$47JXidC4t!ckip$Ks5U_-!EOfi+b3)E(KB(? zpCiIzHbW*j#7P{H6Z$wjuO=-Y0w9XfkS`g?(R>zx?ySHqx#cw~mTS)~*M3E+r_DM< zw5?*`$8zJjv*)-UE4`DQSpA*!)e;=&<3q{yV^IH9OO>@@_;J^!)1Y{w0mTUhyjJYL zSZ?emg4&dnbmOKnmrBX>oE($8!|vTRRkbZ~Q{p^AyQoBXM3g}>5f|8?&)gyp*hT=O zeq6Ji5cBhenNAk%rLRpS+f>6kp|UOEL=M*=LDS7&g8g8a;Y6|qCUDMyh=_XFUWxU6 zPnN%CB93rzdeq9vd8Oo-;UnD`tFwTBxet5MZ8WvRA|l|^k@SdC*8QoqY78#cv9W*h z*JYl5Xy#!>d?or?NtsLiGT|(Sc=4ZP48SzLgIQiP_b^S#I8v#d#G07ohSE~fS$KqH zS7m4=d2W#NRDa$?(q4*agHwx)P*0ZdJ7EjWJU@)8U^W(Oh$-nYPUeB~!%(Ri&Y)j%jZ1y_;Id1DNarczQ$BmX z!ax$P>2UtrFTU>L->MzF5Kf-ZhjSV^+?r*5V%A7=@(SN%5@tTrv{<}D{KbwDCNtH@ z2^FUNL1IUY`}1sQ%9BcyisTXl>Z8p)l1%(Ho5&R0yCXLOj~9l7t{Y_8jQ4l~X=*oL zpPPhVc2-irXA%rrq`xkV^e4F??C+kKnJej6u~@7ZA)=J>&3o$j#DLK%J3Ux%jeQLc z`LT)qryW+@u|&2rI#dvGg`~wUGHn_TdTg3)O&@>RB$$mGGIPL_m}D!O+8cvE{NIcf zNHIxq=Fp`uc)1@={Y{RP#dc^OBFdH>hdrlHZz# zOs`KBVl6Qpzzr39Dz5lo>)f?#j=;Ce zLm{K6cK8TN7F80;H#Isng{BXscYOT3#t&qPUT>qeZ38zT{!`zWW_&0P{>D{Um_X5dDDM{gIB{D)(CYJ$`u?IMVoG8NaxILzR9u$BwcT4fSYc`P45gzYCKM!vFqb z@G=ueLI|hmwtrH?NMsu~Z=hsNeQ-&juJjM;Z{*UB9-tA$me6yAPJ$SqQHb49hO-!5 zpy0-mqOpvSqJ|Z{Vj9>ap1CKm+lbVsAhEaqO}h=G>%&hkNIabN8K#|aud5OLyJcl0 zz5-poc_mT@mJ(c^&cvb@X$~Q*&#zi#Bg(v+zvF@G``Z1}liRxOk~G*U<8Sf24DSRR zDM~JIohm<-zHpmM?(@nCu14%rHmpu;ZR7qIOADaiZ+WSbWYXnMlO(WLNv)Pb%DUpo z$$~@>;EE}HvqMe@r%`KyV(6icTcD{VWo*m2L(2*}>s9)=c&OkK;b0Z_VW(c?J#$Rx zg^YBInz4MhCrIN|ysR081W<~Af6E*2LmXy6T(3GuD2SZw?85G69tOOHSIY#P zJa4;~yuWXl_~3s)+~x73JH|ZVTZ{v*KE|gdA3WcpFkqn3{dv=Q?WW)A!gNPxj;VXK z=BQH(`F| zOVM6*s2BaVOMW=zwqE>1oe_Ce=(JksDNt`&F7k6p+cfPfq4?$c)Y3XDizi+fQwpSV@RWc>P zQcp7QnGyviC6<1t%XQ5nTn%rUy=1FZz94*0y79uD7u72lr8(vO$1TIK27&V%;%fl~gq9SJ=55Y|D<@`=EfNYMpIA`bw==l16ch!%X zxR?MCMa(4qscs1Vfd5Qp{cR~usAxu6c+_#g+mprg=z~#A(ZF8hOwB?l2dSU`-MycY zJsne+fg1sFm<^JH!~At!wIAGge#E+hmn?~zR={DDk`d0|;E%r!?b+u_chx(Fgx*iH zZsvqhz1T|1cZNHh>7{R`WlY9bxV6Svp7r0;0ZxuMknQMgm<1!E+Pwp8vc49z)MnK3 z-aQVbR?MmU{R*Bux59nbI&+J$w$P!O5bJ_gD%)*v66-t~DRKtZf!y;Nlr_H8W7IL! zPySGl41*+L=!y*J$*VT}&c`bx?qcd+W<)^E) zN+Dl|xei997W@_3qYHu#$nj_q+OG$Zu6q0Kt%TLSuWx<3U!%ve919V)=^EXIKVw|`vfMtPn*wL3UBQ5IuKafLy9A zcpcqW9=^zwjR{cL8Pj5m=K0(81PvFPQPtDXf$9b;hmt(WZh&XbK)_q)8D6dB3M|g? zkP-}SbYS8{n|?~>mrlg6YN6Y&6%P}p(~Bx>0y}i01Bb<9t1qOc-#*Xku?aJOqirh!DPEC$s$VSqaW9b%DE)Q zBEl+SD0g?7MEB-J6#SFF1#^cMk~D}|+0XAHymTsg`x@tQ<1ICZp|0HFDUaF{3u8)9 z={TNuZwc;|0!FZL2#3$#(B+DbtlMESm{tj1?mDu-Q?Rghsy#hVaQu}QDnA6mvAOxo z#?>>hY`I3Z?2G+;6u+Y!0T*8SBDe1Qm1QvN@NX*;0n(dg4yH)neF_mFn6Mw`QdUl` zjXH!^!fJ#t;r*gmboVc+5BYfhR&)7jvnrabw=~Z;9!$}}zI3X<2q^4zd3=MOpieum zV?r;xtSa(uL>YdRYPTTc{PHYCV=S z5uy+f-8MT6|E9aLD`95++VHWvxC?b65B4^6vk^lz94ZuPrAbcSuR{s3`96hA*1CsO z;H`s9i{qfC?X}=bk*x?&Q~$)Eb}y@G_k08NAtlQ>Ug1ZbilP5DWXr9LQQ`z>GcF-L zKED?RsJiL-^18AYB6E>^UG?-ml83vuX-mXqDNM9H576haN=c;M$%xnSmaj3W!JWtM zyr*cSQnSYpPR1tkg{;5yBqR?Y5%89^dV7+wXS(t71CiV#mlQ_|#$|nuOzRy8>wcYa z>q)oe$<#>Ab*b;|L3kv-+I7?p76?Yp#LZag!?ukpkYA6=XWN9c_I6KA={hXr9$4RLWmeC^X)at z@ucRE<_^3z8itG?z5TABpB_cv-T8cve3maxB@kl|j9i0M(q1NlJVrXY-g13!PDBMt z!U3JeAb#FFJkCPnfshJ;*A^D3YWQmqR^OA}h5_%$PdsAb6DRUhccjxo3l<`Z|ATTrL$#-g15s1)jugM4At0&$TgIInXQJsUI^{4F# z!mxIEg6-Z@Lspy9+G`8sXnfl|aGH=1`+pnqfU!?j97UX^-0N zm&FcqVd&5%lkm7?zZJf|P0%l99sgF16daQks2_;&;nFW)cw2y)2$#ME!hZKoK$yM? zbn`ZJ10&Dw9-xaLpQ%ghug=R1L55jTT46^WxZ66$8pp!E8Ka(BC`M-k?owq+8&7 z0wWh5YhqHg9S-(<=VP8m681>u0G+I+SH$U3tEvmFLdw!5p-XPu@rexuZbf3m%zn7& z&<&m+SyLOU&O|4LDC*6>vj8Y%SRI`5n-dW`ky3IXdvdi5ySLayWrVULV&NJ~q| z=2DvPx{W0ExccOB?jstE7y+$5vx~+Tp!#D^DYNVw;t65LFSPVc;f5~*QSfMsvn&<$$~E8odHXO84{G8nFox*0;y|tYx}Y z%ahjR9?XS$9l@hY9ZaIz3A&xprD5z zSBW@QNBT6D;MN>9dIn{$dKXU(&Y!-LK2-D2;8sy0ScZVzQ74|hr8G={H0RR@^kyKy z&hT{Y{qhHE{M(=YgN8mt&q5!_*$+qqd3YlP)2K@g@g0x9$Qc|9{dO19fNWg<^QE4F zn{C1S7u^cyPqpGN*s?Q_Ua7xGbcert8U_!_ju6HLU;RMO@U^MWMc*4MB5h%>*#C>D zx8%D+WCu0T^P~Zz+ozx_s@37(@+EJeqMiBkA|7kc2(0E{mOJL%&Sd z9kfpPs~1tNl6ADscRbdP>0jnK^!ch`&#?xxyJGat2*bpYg@qqK!y4Z1JoA<}{vcmcE9TAsH@Ey%ha|cf6{e4syIaj5Q zZ*owJ`;BA)5{&V2SFWPXQUeUdWJeh8IPI4So9_3F;>a!)*8%(QOdr}ne;}cMi2pG} zSlCt#pUJWvPWoX7Amm^(;=qtL0zLj-EKNA=qX78OFzxgvZahGU+we%2+v)$+8{|ho zuyG^H#s~di8ers|J4X79(@$&oi?fK0y~di`y}4oFe>sX9YOHVebToM+l32F71Y_a> z8Gj0k#(v^`sd9FRB~z!~El5qsD!KMsOgB1)RdG*EEp*)qQoKhgRPI&!?GU%t(IUVO zJbtkC7FL})O;FXb?c>O#x(r>DC!@sGL80wgiy@R&D~F#$s>5%!ArAh z5fFL1Drw5S{u=`Pd%-Qpo9|3NM=)8(+LZ^B5*EGbI=H3toSr-$yv$OP|N^lD4mk>k7MuJ{EMW zpg$;p5#n zw{6pe6HknmrDmsat@llS!J_f##U|i0AA}T#Jo921N0w*{$nD+=S4JL{zMw>8z=jo^ zl(`w)n&@bH(FtLTjKI!YJfJgj3h}=F#f_7W&x!%6Ar;r55eI5&rws4huQD$9?-Mav zv2WlBhn+v{c?=Y`l)O*6eipgq`Q-BScs#d59Hp@1$?UnN?*gLRE4XG`FjYl2v+9Jq zc&ZEaVghjW!-?Lr-2Tc}5#R56{%yHuY1AT{aQUJF?|d>sBw9>r0=j)iSN>4L;-xlJ z8df~NGX&6#YS)ia7M1~ksNNpl2@OT=Rg6{zIeAe^mgdpu&lONy%=XS26M5*v{fmdz`dKE|%A;$0#o@`43 z9Mo$TaDU}eZWuoy14MeuIeb^L?TIvI>7@@Vo0~mLS=r`%WeHk#cy0(_Qf0Xg%JH2Z zQF1hc_y-WY&H8(=c+7j?G39XyL@DP9<)Viba9YysYp$Ya{v)`LQ~DrLbQD8h18 zZ>MkKl87TKY@$>iFZ&j^TA$$s0i!|pu#w#Q4~|U+g!d`oJ;W5N#(>YHMBWx0U6Zo{ zfKrGL6D381-lc)XbFv49lm}eY1c*OV!8qobrCk=6oO=yBc<=caI1O(O~M#%6n~ZE>$5j)*^DD@T14+>BW+7qfo(RZC6w|3+OHr!fvTT-V0>$ zd?)cmv3^02)aWIqh39ChCG@WVyjs46jZcdT2RM3E-6wnMB>j*vZluHRS6G2Y56ev<3 zCz>nTBhcxpB@VlNqf7d{a(RlUMw2-%TBN z$`-aj8fB)JNl2^%UJbHxcV}9G$=lQ&M>=fTrgpA3y%*2APtWU1T73$=R3`}G0SAU& z!b0g5TWM`>%+Wll)BUk+srsVx03w-XR68Vb>d-06r`f zyd4zd&BIqP2^=0?&T=`hH3(h#4#519+j;E&9v3j(i42J-yHx-dZJ>YORq5z2gryM> z)=DU!myZZo?I!M*0#(Sp9bK3b3nonu zz!5sLsHlwpYQdW38L5C?)_mzr`T?IGQ9)r89nO)^`$wkxQUhafh0irkaLh9Ly4fhn#MBq_Z*$$qXG!hTG{&zHtyO*TyP_O=2hVscYQs{~wC#M#F~sUlbR7iTCbp<0g_S8ik!FjCPah$dY_LgAJVD^|Ssm=kL;rHkr>6N^_0edRoLGzQ-mR&bYPI8C*YE zaTfXIvx;7KC^k5uq{Qlt-q2Vt5A~#qcVlFx;O*us_}OM+nRJP6*-8MLo>#>6ZKDwK z0KwI%qi)-rVX;9|$^@~UYoBf2*@M3j&09#Y*IuU5=e;Y5(wrR;ct1%qLgHjNNlb(; zV#g7|Cr$w6^crmIH0<=kCY~*oqi1<_|Hz#Fl~S=cL%%OvJ4+o2CYV;ykHVW$0$R|> z>z;f8OOyivGe5gVP#mr+Zfay9q)`Zs@Nr8wEAh-XM(_<_iJs#!Quz@>PE)CQ)|Y zFau3OeSfzXCUl)Lw`(&8;bB=ca}}T>i@enQr&5b0fsDk+O2fY1zgGUp(z|H@5tnoE zx+nI@ZTk~@6`9qwi50i^bP1fIYT&-r=huQENwe2T%^;uQ&a5ksa1l-OA+L90ksFr# zF=1lu>Jo=Erkvu4=NMz3B%K3cz4xbb!w@C%oPE5FCh3(YD3$CM8(-~lpsd<0W2p$= zjzW6v(?k!I;3cqo9A1vmzQfVIGg+ski2SioOmbJQyL%ha2ckpGeLj5b522W2ltbL* z4X3e2UreJqd?^<#Sf{IacVCFp)xyB+0owP`Ehg%^@GC*x*^8gBZL5(#%X#!4(?v z%+0*SiEn_J$0t`Ip`0|VD8I40&ZnC`myr-{o3-H-DC`vl$dGl7^ch4@_mc{QtfZ$T zj@~a8DXG}FfR`)5p@Dh{S6yHmp(m`WhKUZ}9gIY$b3kOY+4xRvc7+~eHXQxF#)s7t z5nLBqpw4b@P49~)hGT2EGD;ukv`=|wqqJ}y|NPs1iHNV^c( zAL-^K#FyUoDVp=dF7_U$lf-q$o$ zG2o);U-)dQ^c4&C&`(S(1lAo9^JK$Y6XpD5-TTu?F{xnlK35zDFSa+$TEyiSZU0>) zmkAcp;K`fx)td&g-nw0=+sQ4ZdJHd_NqBR)n;% z_R}$>z0!bJO_Uw(eJ(a^VQG9^d%8Qn%|@e98nTyyG5ueXv0rXH`VFo=<`$UaTR zkJdwCRPiE55Yz_u_yx)FAvj+&R?|wp3*&rJR^BEcg-^1Qs zea4Fus!v zGrEH&JdxdcQGJ~3y3WHlqzUhicZSjDr>m!1zmfOmY|@pQ;|r0k;Q+6KXZ75YZC(pP zLjQ6exZ+=EuFCFxdM;{>nmb&#KeAH&D)Xn2jnX6ISlDZ@LVoC{yzY7i(7^URyxSP| zJ-tAql~9mNLYO(on+TxC^V_7w2_+qTI=W8%z&xhu9KQ1U+-Q`C%ECCw&ZkK#ju%^8 zjJ-U5b@4FwX7Uzy-0TUgc@{V|+m03(vP@z~RC$$Xded5-R5BtD_mxyeybe~(@n~0a z^E%(~_#9n0oTvW#{2Wds?3XfG^R4!Kt<}p$@Sw&e=hd!@M5E*ox-1$tQU9FKx%}@9 z_8=Ra)RZj0n*9M?&)%cUVDAs-FLUDwkUef~RcIq%OdQ)8`D@ny0IoJ99B(bo*MHkG zQ*u+Qu-5{nUwB_Nozur8&VLr_675-i)UEUI>CAT`LipyY?H)}uWi>*bCt$82=ka~^ z93>)ZNGDIVXtmd*i0d_rm2GQe9X9+Y>y$O&-`*sqR>4Idg@^n9h!O_T1H%`Srn2fH zA|AoOdh$~w$RKGDoz%AMzX`$^8dZ)QcJLP0u}Gs|DJi-Z3aF%n9T00Y-B^{Xax8Qd z9Rqlc$D0YlHDihaYZkw@V89}GzBEw_eMXDqfdMX2q*y{K_ zO9SR|BR|x^Bj#JXya(5(0d0wJZz(x+wMvA|;bU=78`iu+diev4E2U`nRSe>Xi` zlDSCqd3!JwUVk`p-R(1as0!`Pw?w?g28vw2NZfZ%uIIHli`)!ckoP+kdB+BC5=i)H z5Fy{()NdOc$-=9@#C{tHL8r1x%=17K&ZiHZ3JL-g*9b#qzh9tuQ(rGAg?GO<&n*Fh z`G9T;Q;oD{{AYDDc}e`XH}MWq>GdMP06(sF_jdN>0QQ6+1c1fkjkjDF{Y;&2j{e)D zqZs$~uz85Y7R3=MC6F_#-i-8fIC-{t3}CR$YBH0Oy?6bh)JnbT>=GC&=4bq!+%5({rj&8kQl=m9Kg$@Gk3NlM{I< z%!p??!EHh7r4SS%f!Ym=pP(lZ$H_^mwh+yG36Q|=JHOPIPdpL5@8ZNT1v|Pz7v?1x z<)rW5g_P~@OT!1s5}wD|qiJf}h;l?zoJc`VMfsa`GKV@)2XV3b<&1qD8V0&8g}v(a z(Ypvs$ySMCoiKcxE@xs9)W&pHYE~hA4uQfIZpZ9S-bv1OeNk|Z28@Z5O|LM+PY9BB z-S=|x!)pALAbT%Aaq(lKTybKBI~oab;O5W;7qRwcR?bpH;f4g@ZPtqh&}@&j3`IP( zB_80O)j~ebh(OA!WrN;pW!BPvUOAXu^Z#RMgN0{TvU%sgUKt)kG?Xo^;0 zBLb_UgY|z(Eb!?3_on*WbYSwNhW2N+yyyPK z*R4E)!9wrg2!vETSuXKycXDFXYt}s$5tzqh%=$8xt?#qvYqe_wDX^%z{&s(H zHh!Rq@>f_V*7iHDb`qEb*xh^+fAUb?d;r{nls`HxDi%87cf5#gn7)On592D<*yXcd z*UATy^%mq{)Y$6l>unAjhDRrGMa3JeS@WuP)GCbWTX+?0j6FFKp>JL`Ijkj%?_uI3 zs08BV1EV|$*rG4788dk=J&Zia&ig|4@;)MP^)tQxZ0=vdk%BhZz=^Dc+P&NeUXMzNc+b!5Q*GIT%r&GhS;6!ii1P)S>-EcBAsm-| zz^-H*L8RR(pp;6$bpv)!0RzpNf09;4L14B!m&b3LS+z&j=7L7z*gpr&_X1_I@f;I#XB3xW~!(U^-xBOjjHY1#@F5K($ zQIjePeg7*jHGpb|2f`$H92`bj84QcW0J6ctyw=|10jJZ?wJG3D^)Cak2?2FuV{>yL zZ?2hMpfM-wtCS918=u)~)e-zo9d&WN6HJ&%LrmQLW?sO>*P&)X-8c{v61zDDVVJHajH6ClE{Q&t1iv6WWgZ3kT6F(B|PYLq zz~1$`j=E}*SL~pBNPz2|v;X}rzO^fHhhq1)dqqws+>VWJ1~-^%%DdvQew=aZ49AWv ziBK4KXSQ1);-1HP6#a`|E{!qgaA8<|(02pFOHHD`!``Q;cj7^5f=4T@f&a@q0Hflt zvN6D~95J5RE1dtdr*e}2{4ow@i?x*~|2Y}- z(`)qCR?k!X^9_A4jA_K{Iz!Y>$pnn~;hkT_slmaaqQ24Fa%vX|XyC(}A|&f9F_pPV z$*M5m`2*R=2w1ys+>GVKYTRthqmlG+_^Ii}yq<*Owmofc2>KzzR!xEKR-Uek}EV{xyn}G$e5II{X6s(#K8((v72`S?+kY}yLsNhg2 z*;P3BY}o@MAJ9>0akrfB*zlWvKli+{ow5D1f$-y@Vb4GH7n-!AFIQFQ#Jt!yH}&@= zesp~#aoWId-XSHqqpE;g#=s+Eo7ra-PpcDJMMXmnns@X=HJ-dk>2n&uaPih=;h*KW ztEQ7X3-gMiVZk!Fi!C7YUN}<$xs=>?j1mRrjF$;Q367W9K})|6L~TyI3aPIw6&ol# z{zj5^yU4n9o#Gau_{{c1)lsPx@ZX&c=C)V@@!Qkp;r^$uxRI4ZyuuIWm3RF-KZWb~ zOcW@A>10vuQdGr?pNJ#K`*D2z>?uB5G4qj-W3s>7beOI4#tzu$xi95%rbCUr;BMMI z@AOmb4@ za^JN@nx^ZlcGv{%m>2d(**bsxui#6sWZywdMS?N%<`6u4i{oHL2w|e|wiZcP*9@h@ zBrnzdkn#U9`hvOdNs7vBv(oS!#u%E0=q-x%)2{_Q_PE+iE~t|};7W@f9vXi+Z19&f zbr+a*_aF=0ifZrSCW(5GY03q%eNSX-K~nzy0=ApZXAan4&vK@X_DU8x_}~3UA`c!L z+`F-roxo`w8fvs>s-#{bXM^;G^L3%;3$f}6y^Ca+2a#$rnN)IvKYsIX?zo~rQ)?Qq zTGOc+`ZD22Q7LtGM=4<%rQ9vWbR_tQJ>e%rg`n}^?pBKJ%KucO(#Erx;qmF4`lXet z^qqsW&UAFLWga;XVA7G^T|{?{>!7=2z!-&y5Q=@515vERvv@Z3JZMrQ@Rt-MLDK_v zglRUCU$$~0^w^+9=huQ$V0yqXiZU&oqk7Z*%;fB1>|ZY%*h3W#aY4};tq-)^C+9v9 z>1digU4v9!a`qNgV_Q<4HMEVyz(;`|%eUsf$pa(0=nqi7R!(%}OY6N@H11c-iiAhu z3YjdQjMRRjVN(6F)-wM;TML;#5P!_u{%%jsTn}uB3YJ`D#lOd*;i)(L{5}oY`)2Ht z#K}`@vj^dW#>#?=+WDlm;-5n#pVmvhM+kqLEuLKFcmY4=pUoximG@T9^9(I{TZteM?xd@WB3Q7EUWPw$z|as5x*q30EByzw|21S|Dy36u!a&MaRi-xA z|Ad~=Ptb2LlzZ8cwkoe!2In!hJx0nc4;j6T`q{98s(O`PbE#>4?Ir zT^dAHu<^>;);jcll^AhcXR?xK=4r$fUj9lbVK_&{fi@ zVp=ag!XHG2wk^THr+|hvu%ZlWjKvV|EBoW!;h^p|i~HkAD2i0{&E1P~+KW}3o}Z=v zQ5QR7_C0gzuSw?LWf`OmRI>JXE}RyWsFl}}CFdbuXZGYtc1VrfCj`sGkt9yRPVYPf zehOfkYbn9DT63OcZ?ZYqMVN9oZ((-~uTnEKpux(5a=R@iLQ8m!$yEzXBm(MgFS@k< z$U`&!!{hu-{rJpK%@_U83G9$wDN2!>(BZ)!MvO_uM|i-Yh#np}VsdufQNrv2R=2BK8 zs@G6yXBgiE!V>HNtF~D)=A)WIKX$0BaMKMP16b!$e2Ov(*0}{R^(Yk~|FI0Zl0geI z;oGG?AzKx{2X#Q%_D-9x_Bu@;_$~fzByQrP|Gc+zdPxe`W<58;$WYP7Uocf66D$CS zV?Qi>FlSXP+;{L}cGd%Ku?hS}Z>T3B<7mh%N_M^ehNXg+l+g*#Cf4={(2SDsAsXWWNLTPvw{SR|^60Rk>&QogHjaox-hU_v@ER0H<*B4x}q6}i?#^9t?{bTC?iop*a zyg{3Zu8`a=MJGG_l&of?6^>_$Cs~ZhpmU4ZU$g@h&y0eLyz66~;pP56=i7>665*Y^ zqH*jjrJ13)VN|m^h8k_BN@U+NHF0L>rPp0Fx9-!^uVqLkJw4Y%5vH(F`TjU3kJnRQ zAtnziD;r0-R&L{~6y2TArqt^vsgk~_Y1vfkN!(zcFF&$HxaqS){P8bTJEDIhJH9U1 z(0VpKt;4i+^%(^&gV(*PpYF*Cjcez6@-CQU9G>{2@nr~Y2C_T3`|}@5o&@HmyaTa? z&ia%6?7j$>q>HO6R3YVtq4p(W z12p?jzcU*qg`C42n?8*XqC-B-qdk4L*c6kog9GQA1PG&_2Iro`>1~qJv=fpxBQa(G!3BQ0&%>SuhP2Dbw7-Q%r%QubJ%0B1`t5OD-UhB|jKq zfbzyNdKBFGqr~uzVJ~o_gQgK7Qdii%cCpkW3fezvL{3~FMzt;x5>fV<;iL(8{E-mi zTl~trYkWoR=Ec@?J#O(eE+O#q_}`!(?GKenyaj}Fhl0@?^)a>IQre}A4h|y$L05!G z8+&5m`^FV*t@-~|Quk#-tmQmjeitzf485h_xQeAVSN!hQEOR}eYZUvK5!FF2!@t<| zZ^-&%tws+z$bRbPE@kzWfXan+hVe^Cn2zn@llA&MU*h;y;_x$49s{E^AIvG_J4uyt zgO%3mEaIDDo`hWw*s>oU1Vxy*0<6W!KM~gaPRuOJz245$mxq`;gMoRMH9kW)M+G1R z8ydkW;TAegi^6>xxm4z`y>VZpsSi@Z}OZ#wB38ubS${oBXI2SL9t7*Axz0nSj@nI%3X zg0{y|<&Fng)aJa~>)Wuv2D|nynK6E+ei~1Ph9+KlB;izYRvtC|-VN|{4=cI;ww%Ag z7!w^aZeqB`**Ss34^ms+SIuR?l~ao5juM6HL~&e_ zU&s4+S@_}?#Im$Bm^Vjmoecgy>AU`q^2BKt`eAcZad;9A{&jrmM;avPcGv1~hdGfcyvWcCvYK(@5 zBB^A#)GAYhEUhV1z{=#>NT6bMcEKTanWK1S&-?=%?5jyTM~iOPM5yPt=qP?%mW4A&XgO`JC*D98IRWnAWd`2F&%uc zT6M62@wLCq3Y-j`Xn(TJR*ox67%UYw(*29uQ~ zVf)rm8ri}iTfUVfn5ySg(L+3s`g3nG8GUd9l?w z;)e91aIvw--xQ&kUq4a#sV}D+14$A4hc2*!D9$70U4K67tt?EDQ}k(7MEo&r>%Hm9 z)gkv@IvE8rT`3u~Kq}01eAwzT4ryMk{*Rd1VOfvP*zx*lNy+F73=#CsM)cB*zew=T z|B9rfjk^&xa|78{1dvkXmj>t5)SK16wSWud?PyT;v_{L>*5~diy}*A@)Zlx_TRF&J z(m{WvuSZZ=AitYN*4?xMmC4_}f*`w#U*@mFI-Z^NRKB`yUcbGI^&>I23WmYNchc^% zcZ58W9Qzv0u;xi&zv%js??-=tII)S9sig^j2CDZiv6=HS#@b+K=R5W}9UYCEMmUC6 zKw0N#^ztq_XzTREj>M~7NGBR?J~zCvH?zkCNe%gU8WZwkEb>oL4FsrJ324ts&r0HRWcnXoRcp;#7*}->w5?JBwZb7 zqr7O+!dW|)tp|~=Ti$C`hB&|P!(RO^Ptw&bQ@AEUUk+QP8YgXA4S%;*S%$Ukv@QOg z+l%OZUa!&lY-+H!6ATc|^wDt>Zs_vN>hmNzetkcyBQX1P_=WiR;;{BI9dPHp*T+UtD{-LURB< z1kWZmzBMIVFIHmcQyw1XD^eRA`F|uL1!S*eUtQtGb zl^t$F$2FZ4y~xBCi&|5hZ=5CnF8+2asqa)MZ~Ktz(W9SPwFHQ0e3TxIpq&N>=+&!4iN6-rUFXG2tW{iq0ucZR?|Gsztd9f zVsNMzTkTQjq<`tVColr+A**#-_M|pH=KoA4c~+p`Q(9IbnZCJp5WOK8@Zlv;B6_0= zNT8YddZcfZ>Azr0@wB_fhR&5tv9exe?})rGd|r8CzPd{Q*Rg*qVnHXQw6a3=*_U|T zHh)3@J9?s7`4ayj?ljCL*Ep)`yR^Q{;)bE8&fu0o8_GgWkIv%V8PPhf@;B`(TBVcW z&k$&f7tMV@CTB$l2fIT;4^|)z%q5nPnSl=N8750}Cm$cLoUiz|#-RI(AcH=*U!S~5 z6DTGKVkZu3uv`4EGY7cf=C9Kq&hess8q0H___YMSAOhQGz8+*naP1!p^g8?A07Nc- z?#fSW?5-lH>DBA4Xld8VBmfk#`KpLA-Bdp5(vK^~sDcP*J7X-|jE7%nr2#^K0ID4O z?wA9}`xzgJ4MCKLruG1pu}x6SK@Q*~*;Dyjeee2!RCU+sHR`IV%0iEB=1G8H93<>Z zgnr$#7i(06P}9+El<9d%Ra?*;IE=*z8QuDRIqaZmDixP3oc<>Kq(33Db-mrzLiXOA z?6-54J=_i-fFGcDljj%RS=B9B3cg5L7|@JzF&yzqElifzBx(mv!KzGyYEti52_K$~ zcXo_V^3WXqfqt4L1Ueg{=Fd4Uq4jF)ANIs6!g%-1l9Q z7U<0j2cBHgQj%S}<#)HPenOV#ico`<&oYL*bLh(qJI1rh!$T=N)m`L7+8wOt51vak zK$77h0=hR)fR(6Wrw@^v)h~LMMV7bL+tlq);8iWyVNrWcSGu(uAMj%M#leut($Kq- zS>(}fR#4i|?^w(Wv?N1q`6B6cA=6c0FOcbd9g+j^hiY%EGGI99x}f3=IAWMy9!NBA zrl4$p+3niBwIq$FDb8XmHheMUQ38gvHI|8=zntCAI$gk{aC<9*?QKdTZ-}yoobNgG z(JVC=w39wc&`4%4GlHjmeXnQ%*z)`k?M;nm%H8gG&%wySpx)l&R^KH13R*Ba@oYWq zdeyrs9*^{FC&_bO#&b9D3*@9c!zK{*YNa-Xnm=C1P8_$@vRY|$)S+71p&csjde%G3 zSoiCxrB4?QuF-Aw$tW;>D;Iq=m%V)Ij{TM+FSn>2@EGF27qDdQGDvfAL0T79QZ^qW zJt%Yj5Olg;uf^JWx5IheT=>r6*B2_}E%mo{l-n1Y-%&)n9c0f5kvUr`F@%y(4AwT1 z{$MG=_OnaNHf(GQgMqlwgw}VuRJ!vP&BjVSnqqy=WM;wZysGyeL#7@e*@-TsjW^ZI z9J*V4WnnpSfy(i5c4NG9VDbT(7us&GGhtb2f{){4Jg(0;T_>g9x);*UqY01F^utid z&cez4sE^}Q-dzn>w)>vRi$suvfJ?;G(Ac#wB;_&KL$SNn^=1f@!sPI93VGlaFpwbT zSE3bpXSd*L=$xOvQ~W!LT(Pof&7Z*eC{%akT+3LFj(cfKfWr>j=)Q2cg&_h67&y>(${} z(=q=woZ4X!0qE|KlGy@~i# zC&q%|$!90)T01~M*W>jNC^Ym|1b2OukfUaE0C15?(rmeq{~`&mQHPgBPM7WTBNi=^ zB&gw1cYvek+Uep>5mRCOdpY~Mz;Mt3|B1G$KK=dMo~1V^qsF*2GvF5G!iM-r7~=@> z{CQ@AI{G>_=dmvYkOvW;om@WgApms5cia4SQQXw?!GIp@x+oqqaH-97oeMx|-u#`Z z;N0whUFFTgNda>ZU|phwoB2oz-16_(ZUMOa0yEb_4~j}%aYq2J2gS4TPX;%n5RHyq zPZbsY&71vX>qxG2iitC<-qpKGnT%&a)UDFmk$~O)_ye*|y_F9XNee+c%7V%%Iqva> zu0-T+VT?@Fq)^z^;}4vz;gF9R_fD}?B3PIB*lm$cq-$|ClaM{WBH0oX?WfD<2Y4dd z9ap>Wyp`gw!7`b8g=`+j?u+Ml)6Iq z9jr+z5btnF^;Fq2!UJ2Z?zXXZ2ie{r^lphA!)Ulwb;@k8m$YDDa28~K)&CX1u~)#m zi3V>&&4p$-9)&h>TVh@FHuU{Jp1v`x(x`2F?`%()yt8fFHQBDows*EU)l`#f!lcP= zGIw?}*|xr(_kEx5_kI6d$2!+_ok~jL@=I>9-of9BoHvE-rT_35{MUv`4-}S}ZW$#A z$k_;#xT01JH@!gV;BEfcHPx1jWlK|k{u^3xSnshezx?Y;b7W|Y1~o-NrCZc0ayIGr zo+c8|Ngge(z(1#mt$bA-UOGgI=6lJpD~%+|U(P+}LCzpITn1Pm5+Y4+(r#bXOvZp> z#ie5E<-DIHB!$w)zrNUEiR|`!Y)NIMeBj+K;h)ImNaNRC5tE0j0|iRddd`c>-3*p~ z|GJZ@s1dyB2xnQx=gYskFIo z=CnXqhmIGQvr7b5{Mduy-hNF{?>d6nPS>Tj{+o zKOUgO)iZWTgJLLqWOwAjQK6^VCS)t^4yh-rtx|m+T)y@TksTDL{L_A5mNy)g4=m-G zGugkSKDy+!d+0;=mkhBXz+l;A**Ea%6nw4?k|j8js||bl!i6%w+{Sc_-zd181=d>e0 zZSAt7o0&nibihbFV&A_=q2_;x(ysX#0;U#})btv)ty%V_3aw+f{0Xb2$xA`wxi>`N$Qwfw$$64nqPKeNmJ%d3?4_PoFbQo-r~K> z5BMTIuQ`Ue;F(dkIGL|rC{tx0vmVB}dg?&?j9>M(c`bTMh>txB&OcaqMk`%)`$7cq zDRE{Z72zEy^&+pu%kOToV||MDj@T8*opvoMemiYp=%xrc&94tZ#ZYFmR*r9-itu)y zb9{)p{Ku;m?q=9&0el_Zr--)4o;mvT=btl-%buL37sFIkELRu zjm>DIvhGBZ?_9Nww%s*J)BtbAh@^qND>#@O;86-_SHGtMBowZV4 zo?P1ToaDc%luBqaew!L{iIaTnOMHicHV`eH5-}Pgrh#S6#lSn2u%G(KGlW0JGW5#O z*VjY@<}PMNEv^woWlVOJU^Ey7Ty5H3Smc062r$oiBM!H@#GjR>LSM~?ZDKc6yp5V> z>_+)&m-b{uq?#GpjMi$c&(R*Q(Yp#sgnm6DG=HFIbJ2_nXmJ^=K$oNMP_YI(a*btpHw3M0}8z!1x5KSMGuk@aOr)o>I zMp*Q`;}F(?_g#OxE!*tzImB&_+!sEh;FV!%WmX6$NZ|AB5c0hL&`4_~9y8KtUl@Iw z80Hf`UIbtNyUTxNIa95*{T8U`UINTpj5N$y9P`M3Elv1THl-u85dM5+5Z85<^l?z* zgcI9p{qSXO99^>N*A13LI<)^3*vD*+O$DNZIymh}t9u7RJ)F9#_UVSO68lT6-ucWM zV+HUpyS7-(o*!F@x1;aJd=*PgjK8pc)yFz~q-qJ=y160y1Eg_CGM1k7UjDEK`<|-w zH>hk5B^a;}53Za)*+bmo>`MGz``I)#wP=Ih*U??AZY$s2D#&hxAAUqu*0$T@%1LEahq;ula7_+ zm>mq>o076W^Ny31%b@L!5uWJ;n(3>@dre^6pU3Fh_956>zo7R&%{TnLPglNLjaFs$ z;UP`u%u;w|#<8}Iv`f<74JT>9E zfqDO0X&@)z)-=djp!3|zFy9;9qO)4qlh=O|X#N*3>Ir3Qq9%8&~r z0gI*m0~!}w5jUeWhyeCzV3{;NQiuli8V10frCu0CfOQ{PPH(c^XT!|I9Ww z4$nfhx2~1Kluio{OEAfL{_aI2xv$aE0_BuolO7cI-RPwoxvjT=h1ZC$&vi-jE!FSV z3LwYaJL2V@y*HeaT5_b>r+BAaSRwcZY;{P(tz{=qz`_rh)50IS9GlO?N0MxjroJHk z-@Ol#!TaBWHh*j&oImeq&xew&fH4iJjVo=wm!^8vM`e064%7=g}mvJ4`o~?&I39r#0l1}3V^Y`U#QyeK{ zPLsmfuD$@QJ`^1!BJ3@nbi{sria1H9e!JkT(*9M4#SA6e@_e=+HWX}xA5r12Rnn4k zv4e;IQKbIRQ6pEJFb-^U#C}Cb{lRGgv6c)KdCr$cEn~6H`aypC?b$JNp7uB({{;!f zKImYvXDe;OcbYIhV345g{3% z^zi^e@9~B|qM4+uP?q&CGIQdFrOe%vkjRl5rsMf??oY3*h=ZR=@FINt*$abv}t<^zEA$+I`U5*_oj`PP5Dor)my!geNW2BE(H zSl#cCpIt{!!Y?AS(BbB<7GhQE{Xj_G-+N9#k%)0JZ zeD$A50yys);!DCY^nSgiA=iLKp(Su7&yc)jXQ0g&T*lhNMDQo4_kFvPnMVKi*^Ovk zn7GCjaNel;{}WJ$?UPe|Fke0R!|it&O^-kOtMzFaONKe+zgYn9*2cRk-{=T80}ZJa zbC`B9!jD3a}=fs=3MSXZHGX5YQ5cRrs{EG9E1^siZ~4!B=a*8VJm ztvHcx-YaX{?t-ec{~qPfX%YyP8HYpf`>LeIF1nphYTfm zBCNx@Ox{nITBM(a_TQVmNB~-&Mi!kQN&T`U5I_n?C?yaUM^!Se1r7tltuGfB7DqcS zmJd+a-d6Jy)K-oFDwIS7!HG(VviD)Yz+pU0)}9^nc#$|^yqpIj`RRYlbUdi3sX6mg z)@+(At0gC?3+VcSegm5lAC+eb`ffL8XKxNI0B9X*+4hZtAHOou*w($)T{8WI1uaHV!qR9gzVAP3`HvD$!Gk>jj++>O}Kfs?E+f>sn@ zXRxIxxr@nYvZK(8q089fdT3sP1pSHJf`@9^;Ho^3JFg6OTbGBu z)dl4$G&ejq#GM=|l$H?!TeIN*9KS$;At71MlyzHCXf6M_JVAX#)9YPxang?RiQ|5) zz)imGt$DN7BkVUj>v!d3HzlcKhE%&e|F0_3#_i4S@L2he(8M%mg`P#YUz?*$xO+&5 z@hX&jnNNr?A$b}Nu>)@=$J5X~X9`Z8Q%w1Mayrwvuk;Mf4h_pbAd1bvL%AGuUwX*x zYfu8@{Hsr2W=!|c8!Jn|!`|j8|2lKaI7rXs!h{4YNf~oF+Dd0=P5 zhs%|A%4AU7f;ly8aadT(s7BZ>(VdFRR|`32e!gRv{d?3zIEq%%B9$NX^>EnP%*;Qi znh(YGr$I?&&E|xJq3$8U%mwd_KZjGq&Cl?`Y0lJj70_B~$8$vWZj?o7mrSg+#3b)1 zXDT#yf)K{wa8@~^#aPxl!#cvzqh(cI``XNB6)ufM!+MVc(qpy-Wp$c34~IJs9>1_x z_V(gO7mORptag;(2NZsH-8p7G6ALprSM&& z%NSZs-0)}j*I0s7ht3U2H_BobO!3(Hh?tlI8l;)c%%-uMXs34RA@?LlygDxO8E<{v zYui_44c=l3W&CRor87e%J45$WE|%9W_e-dTdtSP&xvv4$t^5Qe@|&riSyq{2@WS>U zC{tsCvCfG+GHA^R_ioIcGfGJm>h&oMGsV~IXvq=CJj34h=9mP@iX$-i0eEs`DLteL zP>hfZtm@nuBSP^>&sCn9SqVkqW+kHlhJEGvKxKm8m#*yFPeZnH8ac91$uJ;9NvtSJ z47sgDS|At=QUkCRowlek-d`B0ux#&HhJr=PUZgm*1Aw)dUN;a@vu|?_$@#~k@JQy! zwY?vTFTh=zl#sFhb1svPP(TGPv2s0pOUcKftic(E+2V9vBF-3vXDyf$sMTG;0)t34 zTJIPVQC%8DzLg&&zFgU+(OAj{dJVy%8kUUCuJ1GtErq_!%Uj`s1W!hipt`DM~OWn8{pJ7qy~RF_j;mZ zclZ|M&AM;uodJPdfRVwyp`07}f>lnKwD9=AX{4ptfa4+3*Aj7@@kwDopgmot%_?2ZEPrLgul z<0l{5i&03?TntMV$pWaow(_@6CIN8at@AE{6HL%)f;29WMqqweUVRiEw}nlCA*3B|g*h}V z`(4dzc0;FW2}^Z+EDf792|tWw_2GQ<)VG)`j*XyovN2GG|VqX-(O zi^34uL=~|_x-eg^`eFM%)^LAzii17!Mlf|VP%~`h6t1fKwr^X0%In)a9>ym#EC@jS z;UI#*g)ffawMB}koSz$Rvi-<&v2uF^*kk53^%m;rf4i)4I8GR&BPj9){Z!}n?CFz> z&JGpF{ZCWTSo}AXUUDD`20T{UjiaXRf}2~Ze?gkfyYs$rK>Ki$^wrzONjZ9jC%`ZH zu@QYRo0uGel9X4+F7IiQ4w(=u2kMCL-E`juQhfiHj?@{f5!wiQBBfLg?_r)BALw0B zauo)!c#*)liIhz>?7hwx21JFv@HT7$VyDB#d(JTE2ED@$`ZFBn9{m5E**SDT{Z0uv zNfC%32u?@9P!p={K1jhCvORG?Tny4~1G;$Cfz54-kG!0p##(??usy{_cejAWVFAj$U;uNP;Frw0t%x5^sIvB_pKZkFilUviJ7694X z;ejz~ZX`@wHyl!cx8v5xI2{wPiGUt$-*&Eo)0g#-w6rea4l``oZn(>l7bq}NMZfnA z_iz*tQ($V-D|Yyi^dCO}bLRcd6i&LUh~ET;fFVf~9GaTu`g02P9{*w7nBW zwyznMDs(*H=_t+dH==-5uKEenX684P;Ju%`|SyWsNNrMptFM@>1L-oZu~v%d7fXq z18eD)Z`#h7fz^i@F{dAuiQnFnFq72{Cy%NR(iQ%l{=$~{C`V2}hI82cbCS1md!Cuk zww3MD^I&G+{TRt??(~=!g$6ccjhc+v3#Z&D(I|DG_reqF7$1BVOcr!dJ~*R}B?7$E zGK%{*5fM$3LsIh=j^#^;1U7T!j8sS0SiUN<{mXcU&NFuJH_4%qof^}rlJ^zCEI8ma zZ{N4%S-uT;1-t<(GMV4>1`HJVBo&hb1D&?>?9{FpT+LR(yw*OsizPa$G-GDbvoi zIo=?=-evmzS(kEPh%}xDkRK?8mkb?{r*Dd8Kq&(|XxguJ>R>P{?S9=DTeI-eFbu(| z`P8bM-$kyg`B5l zh@p>`X*PLa@Jma+ZAPHG^cI~smUObfg@JfSsyb85H}mphjM%=G3LkTs z6z~PJ(ulW6oWLKhdJ^h-Nq5`rSi5A*kJXfTnrFV<9hl_wQzq-ndRmYv=#b6~ht;7!f57J8RAo&-#t3S8by zl@)Ko^Va3MsEztr+cmYcQ+8xn>ckZ+T8>Ls~E{_ zidOIskP2V~#7e7IqFk)XuRdlP)n!azV^MNd*Q=)nft*Fz=6m(im?7mw>R z0RnbYoKQ7Jt%E{*rc%(XzX=ADk5tZ8In)EmOlld_1`W7$0P(}0)o@ZuVOi_|&|qNC z!do*c$HjQ4dSm?Cx5vM{&_&B*P*aL(V+8ob$ApF3JS^{%4zqa*!vx^n^Tf?#BOZiZPQ^FRaE4r`nEu{|px-hEj%ReMcFLKQfkXIZjQ)^IJ;fKS7 z>uBKV98!YcE{}gYMV}O?0Mv!^g-3eKWzl>5pws8b&Kd%awXR2pQtwj)NLj@Jg&t>R z*oLKd<=K3PLQ=5f4UKY{2x-=u~P%$>c#Abqp|{i9j7Rlfx(kXXNre?hXJ+ev?B_P&9}ijkiWV9vTF%z}s-WHQ}L*J8jf7ob+$Q zRbkBw=&A<)Oy@^|;3fv%Nw=PLS;fI*m3Pr#{rhs8;1i7SNi>KEM(vZ5o{p;4fgz?8 zfZ9#Xk`a{1RBv|zJ@95G=~#d~9DYEL06oZhjm+OqTS7{1Dp!a6_cHkg$_hKm^2Dm) z?z@BX8C_qV3oPrz6BO}R1;9?YLv1ask!%M6_B)dg?0{ggumwM+5%1?Ocqcsff8;{z z#vV4Q`a*p$3J619SN!sDX0+!)FM${rN}E3vibd?^>vHCsJMJDsTdcZ4?x;Dq8OZ1T zn=_tIvuDv}72uIyT0Z+FWezX*oiVT6#Asu^$mR!>oC z2r|`M{4zF?OH5fwJE+dRY3I`XTJb~hXWcL zwPnOM9D3NurR$^SK09QHS~7w@V<&tFFZ78P4BPS3MiZ9&YWM@8{1_)((H+^wfxvjY zdKj^uq%gbflGp+z4A&P1IGla{M+UAH-sy;8D54kFRC$i$kh=~ZqlTBeK>uVmYV9!S zrZI6xF^0#YPU%UOo)^+`wNA9m4-$y33bp`M?jcE485a4b+nZ1Xy zqSg14->cGPPF)|kj2WIu9PIjRe4R~lh<*o*jD}-c!RM2#+?2ZhYV*pm0{V+THQrx# z+XVr+MLslF-&%)rbUmOrP6%7VWj$sMA%+9kNM+T+;k~f>@&3x`D@MPV~kj|H_i3y{>V- zsxpFYUihsgX_1D#l1bxH-1@-+CX82%azQ79s>keM$YBhB=(HJ&?g;Xpd_)U3yIhMU>u~hkaZi3&f04x5RsR=}XLSNS(Z~4x{{i@=nW|?6 z=#1QB|3fVoQ2NhM`6!EfUxaexQgwe&kqsZ zSqC6NTLcq>y%Vq`SHjJGzNiI1UE}qn<^8F^DH;sm;?uUg5>fD26QC8)I)nKQA}F?+x3s?Chc|N#hy|V!H%V>h+mUyNfC}3fRtl9;M;sniQufm|d{A%X(w|9Y zH%`!>BsBnFT3^LBZUhJPMpN`fS|qnl5HjEl7*Fo~4O&(RNjE__9Jx(Wf2K$-W;{n^ zo1!7o+nivnjO-dA@FRn{8`51Uaf|8!0Sp1I8MoRbQwC3(dtIb_Z=-mw12g%O(Ys&+0h z?LhsQ`#a~hWA7Sqdo5nFCcYUku({FMz4WG7yld{D8l**7jlHK6!?~woK_$huE@YU@ zC%OGAki5@2a!+n>d@6-JjL9Qhkn9tc+i>{4Tb;sMi{&%TJ+vqZ&`pP2}?;U z&U5F-jB$Wu{wXD?>C-h0CPDFdRiTSZLgDXUn{$UfQVz5Hd*w$S>y<2DTL>CT+cY7s z$dXl}Pv;v=`gVno?v>iL{!NBN$lIxQF$br}1L4ww9_UzLwC1CS#awa@<1mXVM?sSE z)G}W#3L#q8#*=5oV8}r7nf#fcIR}T}wdpCEFO3UoM_D8}KR+7dNgQ*k*l^$xL15-I zM1f1hz;=fF0AxdBx1cUre5YQ>Quk;$c}78#)quk$BC}{Iwn z#YFt3*VeI&hM?qL;g)zkAs5EY;e}nHC9!F~PZp<)r7M0UOk^PJZ})8?xMYmZvUrcj zp5t_2w@fIVXvPS~+{jfYTKZHd4DwHS(7W>)NUwnexdHq}=< z+;%4)ibxv~7~O~FaW^weA6S>#y~O&{C3CSy8-pEYl_CA zLb4K_aTPwqMxqBDLY64ya6w=a0`IrL4=x(J1-zbg@(>`ZtD!INCeW9dv!iCwt96Aj zT=sjBk$dV!p@VDX%#G{Z3Be^N6JYr2Uh2xRUfdNaoY@nV!6DgFGAdGVAIj-ps0)DT zA87abzI#9tKo)EY*eK>XcD`Evtu0e>lYNztZ;Gk%M_nBjjgw9Hc*KaE$%Kr4i^JwX zXX@`C;x+k#uA_*!rR^bTX)X9B^b|y>BH22#-@ zky~H{Mh1XcQ%{jq`kQ6&k^kCY{8_sbUfW`x&$K9F&zCbLQlEn4<81h9iw*_`z~rNl z0f3Y7dtww5*j99~N1e0vq;LN!&u{X{I`@wFVHix*F|`~=^d+Z@%#~vL8?^CMC}nYZ z|1;heLZVrR>Afu}GYrZWqBGl7umB8Bpef0;CCr;R`!pOFq=JMI4izOGmJ&R1BybbQ zCIK`7rJxzY;gi3j4EbC{JpF2hQe_8x>=UGm9gip1iDr=FI3Scz1vsA$#y$N18tll6 zE!L}JAjN4M(TY}nUts}2;=0i8GrJ>#N>IUqCu4x#vDO>90?^Kt+x@zI7>o(%nfUQ- zzbg)&p+oz7pT~}usB1zqcVuLKAoR(g9Z`T~VnrQ`u+49nT3?W8xtrrH+>H}i;_-D& z3llT^Q-c0h$>bYS9K{`PXw@*=TM4zlc8j$tp~M2(2v{3QmDlLEKevjz;kV6Y6>+DB zrvl_Bg=fGvldP^c&Zq~xjtaF&_FCrae*cM14&?=ByF7b zN;yHyQ|J~H%vTbzA+pYC*g=@*7qLng7WqIaK2VSace;VR-0Iq?blXe(J$aT zDGYJ_8p)t#sUb3|#y8AGhIq?=#Y-2XGsW;)@$RXb7>c2unb^3ajILmiFm3Y4_CMbs zx|;i&9+REO?jrEUp*doRPWl4miWeQMha%5Wr#tmkf#DwK19d9zKn?8Ot2$7(5viDO z+XOD6DoTjH>(#6DO2<^%5z5dvq->T05&4&FTjO7~d7z478Vr(`jFLz2Z5)kmpU3n3 zecffRhxK_qQQPc-J)7IqqxNQnhJ#Z!1-fqvh;iRSN_N{Igh}|zk9aChZebs%68%=! zR)LCZI>-A6F30x5!Q!}uTBgPzO<>8mV3H7Bj@I&Co29&IobZqCr3B3*(mNK4@1$`dAvTeSp8P@LEv?;zQ=M!`=%dz3Uqho5hFA9^)YB8rn{c z$O~URt~o`KWTt#eK<`ZTrwFD9}G%in9f3Tm%Vl5W+V$;m1fO6T^PLGZ_sg^KAYv(>B5!8#=KC z4ONH%e|Z+DZ?InvkzY?85csi-1e}%h^+&0fVYXFbI$Z_r$Oq9p2J6B?#$WWv@FPb_ zX!vw<%=XWMjH{97xlcHc#h#GskqpgI9^WjwOj#I>S&p2)b{{LEyP%nUmmCl|lzXNl zrcmbVVy@Gt3HUJ;#co^?F#HsC5@u1DP^DrunQKp{l5F~qceJ%_zJxrJ`+R)c)A|Gw zsT%#kGk#E%rc6L;389X3zP29>#;KjW&YUx=b! zC<4cW0Z_wG4OX-FR?Go3 z(F(?06`Y7XKa(kdsQ|hioIvHDi*^@};A zSl%0k)6=N@%U_-wlUR6LwqX3ZefZ!BWa>DV;~NZA-6ZXy5`;$D@<{KUbYn1-Ul4@4 z29~eh&}PXqDy$yff5a~JNKo76=r_I8b;T7m@yiQ7v?G8UE4DT<=(Za^|9bfP4oX4b zA->R6c#Z@i2_Ig+T&3j3z9;Kh-N|VGC(DvV+!Rg^($4oPd@$|SKK^NgsBs++yoox6 z!&g)}xgSOVRqt7>CYPb@T3V)cj6<`evxH$@$hor!=sby#j8PR+OumC`CCa7O2xSp9 zV8u|xK1|^EF+q&Zfmx20AFE3(<`+xG_{E5(pG;R_O4T{d=Vqrp*MyzO5Dm-wfXUy8 zJJ{A|vkH%!{vr?B?*aANH$c(58)0q2ts^noVQPpWaDbwLoMNM%mXC!Yh-nAum&9k0 z9zlvs7oOr_g8+X5D-KzieUQZ)~*gbbND-~7|9QO+Cg&bxzcHbJ5+slJ%z;$7k$M>elk*e zb}No`pPJjiiz84Q#GJ4!C_WKMW|$*PLdUo~+u!)2@#R`ns}5N_tG*VcLaUYfH%w>f z!SGMJ0;fZd&n*m0T)2mj%2v`H0u_tcWo5(2*AoC<d=$;wk9@#F$!Ho^ z4@OExK%?XHu>x+VRE*RhsO=MuP2h>pHF_8)-CC4#7W)}j13|nViIt?&35-A;6-(jMq@|*%>qLVDBE_1vREn{XKp0JXe>3$Aky8o z_=u9;?zQq0u7j#@bqo+PZq6j|{oe->tf*FytoBP+7QLl8vn=TL_OdpL5Cq$oEaV4h zb9uUe;o0J*lZ|%oQ8sovPla5TRR<+ku$(AGOjsJzek@PunF!2(8vLP884CPTFLDa5 z4fJ=$I4)9XY+kBP?4o3EXfD~WswgMP#rt)LG3X_HiN07jl+Q^2EnqVwDhYa{FK~^9 zZ_#Oe#zSCNF*(wvMs}HVLP$RN=bMEvXT8|amubH!;HHfK(3<28G3Fj`FDt18LNZkR z0S{=-g%K1_$u3qZc~!T+OI?!CB-Che9bE`gBJqXu37im8q1D_f*U?+VM!C2@?)MI= zgnsqATPn&YA@y!Ll?j^&N&1(4(@Ro_&{QfWL$`$BPWxbCyxfG3F6sIS$25$jL1pH& z-&o6HvScqzP210yE#nt~{aMsOAZBlWvbP`gc@w$=~^Dk;T3g*+fvQ3r$CaQGyG9 z4ybftlkj#RzmEMF{_GcJxTXjGnXF0+MS7C7pb7Y6RBU9#hPWJ?>CrFDG3oKxJ+V#iar}taK@n zUo3bIeDau;uu`nBw}>|pc5KF2)v<0c6(5ercfMF(i6FTkpI_T}omBJO%SdG3rqM-Y z*jZAWfP|SkcOT#{Te|mmy`DvNr9;w1Dxcy*)xyh2)nic|lQ}n-e^)ho(n zT{Ofhd|yL<`*0%Jha&#{?Cp?BU$pv|c>r|%kxXpAvnFA}jh-wx=fXTgsovx@tevm) z>A|Z+(4skNV5HH`S*Zu5N9B(7;e+1!*8JuuG+k#5ofl@qHQF-wkIvEXYbjv~EzVtV zU+lY#5BAi{L4XvdqV~=-C$xg#feWkI_7W1*E1h6eBr>2Q$b0WqQEDDAkW>>FU~ElF z<$Y0G;ZCy)v%sR=nI^A-$q0b9e-YYU=RuLJSpM}bSgaV;6g`%1d&4wW2AXnL ztiz+s@h&M*v0NW;z(8-~mjRIU>6gbn#$|Elsw{2Sz|XhF%|<=2=AAHYQ5PEf&#IL5oq6fiNfqRp|Y&-|JTb=}NYZ zv2tP=^X?7>R05Eun_URL7_W!EYAoUH!uq@@Yw-7dmUqyq)wP>t5V!;cwP;HLaMC6F z0FSfWPtX?ug?F>!B*lk_&}d>ppI}QiqXwWUp{mMf)7&*RQNo&h6=>w};7s!9Sid90 za)Csaui?PNJzYNS*z4}Md=)!@Dsti({X6mkwA-8})i4?2)v4VI@8-o(Ne2cqP|@(kM_oJvaz$z z1{BjQyn~@qmv3J>v61h$eZh?%WJf!*m0__4d*bR6OcWgx7|l7FQjoRjbncfxBf)(>u?<2rCk4~wE7VjnqIs5|s=t6BFA>IM1^3=QlD7dpRR5rT zNM2nT0_?MRkXt|xojuwexYJ^ZmgvHkiLN0n#HmKs3PAv@HCeQTUtd;i|NW1CcHq8m ztuTjT0gEaDU2w-o>Qhy_;f3~_Gg>jl{QVsy-|UI-8Q{&UnT%Ha3@Z6-5%#@!^N>Nb z1F^Q-;tp&1N9-;`$?Aq@7Yk4dsA9x2FuNUHZ5B*5a(n<$~yu$uTGb$RsYvQI7CAqwv9+rGlfb z->}gMG9%w46Z7lOO3|*(GJ0X7GcRqyO`plSL8r1HMf&z zA)o3mnsI+A#9#L)$~cnVKxv*uVYgzR5>jaWG$HE86HB5+r(|?V9c^qE1yVJ5`&N}E zh3_*`3v?$xxWtMdl4?#-Qq|a*GM9Nk zgy}l>zKC?MoSCYUv4=<`eRW8hK)LE=A(z>3A1^@~U2mG-j<)XmnN`K_LECV~f>`A_ zRVpYUxsxV@7z7W(%K>0&eR+N%XE_lm?oADa!}pQT=G=pom9=;9{XPhi{MudykM0aB zWrRtfkoLvlknNAf!O$;Zzh$Y`e8nVeJVArJ8a$YK#6%f9u4=#C%*3gBe0896kYdPv}#IQ(lAh}HP2bgsUbN|!hHqr<0(5X zB3!ip?tK;L#&6O!&Tu6xas2R4&kHo9Io9Rn)P0kN`BbGqi6f9`ml3^w?>2G0*1d1p zoQ1tibKY6QRa+P^OFy*O;h=K#!w*i`;;--DI4(oK=D%TDGH&<|y$eOPRXKgP_ouRV zF#!V!50}S@KhXQPhl9?I?Hc=iJliK$oh|K6#9Abx-_SZwjxMJA0W9k zgJcpu#9Kgx?jOAGsk>-Mh>JZlV8jNn6^z3Q7fVAxf7~|;jO9*!FY}50&=G8iR!Lpy zu@oHh*h7ra*NpLX;+jF|5Lk6#4@;!cV~s7>Wp^K@e9cXv=QmplxF`%WkxzwKvd?Ni z(&{-ZXc z2B|}ri|i>Z(cgy8qE!$h*wsM2?JGoo1}0ag{38R|g4s)A{?#{B{onR3>7T@Abhc=o z>u@p`?dxJRVG~3(4o&sQ;Emp;i2#xa55TlPc3taoR`^*1fjj^r@Fv&<5L>JP69-pS zBzyp80jvk?go0s+#2vv}!d^kwcQiV4Fwb_Pk{FmWpQ$Z~nGJ^SVG9uc>{M%S;z{y2 z2fdnfi_rsV>*=^uDQIp_toB_T0x2Bk(0u%#=UA)L@*HcQU_>J=**BiS>fVLez}eG| zH@M;LA1d#d4$?8CH=(blzDB;OAH4+cn1`ZBFe-b?C`cu1B;F3Ng%i^j_xVO&gUvhTa>lqe)%48$_wCB$RQ{7uv?{~6qpMgtl%e< zB`E+HX^+V*P9TJFuhG2>mF+F1763CM4XKi*ep8$B`L3A8u<7@j9$o)Wj=i?Kqp+LE zZZR1JKU4A+u;BrDv;8Y>JoEJ~_!0neSg`SAQR6C!#;38xdMv_QQg~vMNOm{2u4OIs zM3NJ!YfjQRArI9SRCOnA&$sjQbM8&G6d8IyhK;oj2L~JU-fV4SU_X(q->`V)V?38buxzWAB3T;fSbVNzBn|pE*ltEJ;6|#3eFr86`bFU!Ayd zNJ_p@0*HM|kvkmL<#Og@F@OLenQcO!8*(4@|T0rTN1_OxYLrm}$Mr?Bl0!2bH6l#Iv2_ zt|4h%H$^tXo^)_y31312vt~K|#X2ZbeUhDU%Gf#hfTygtxnq1m#Yk8v5KvdItq8_NkDo)|GLn5|0zTG+7HvB z$@5c z?~gY+dfBql#f!i82OfwFGI^$$2W*BSi**FjL;bcKa^&7$-815srdfK^C@!ar2Vus< zaYX%A7MkSnVcq|7cQUh5^5~MW7ytOHwD9iNV&gZ6U(fp4YfwCUeJCG%JEBYQspZ6w zi@|C$G$^+#)V)HjGvV0l`pc}y-7m?^QEmBVzI0mQrx2n2wixjDlJZ&)kd zINg218N}I!yGrJ3tG*Ma(jy`+RmNFa(>rDyEpzQNbF}IV53r{QD9fMfe9>C1MGQ$8 z?rNLRt5AU=>`WNcr03EqBNsJF*j#B?IFz@08h2&*MdiIghQ#kWJq6pJ6`qIza&1pY znB*(T{e9+KFaF0r?#)!aZys!vwBK-+jFY)g{i^<7Rc9U!1=s)Ku}4`3StF(<*;AGn z8nTVGC`;M0M3Q|QrZKWaWDBW~y~r}Q7<*ZVJhmkJ7)#bM7|SqY{5;R|{;v0W&)?_I z^F8Of&gcGIx55}knN*jcu*y4dGdVZ;NW@gbW& z$zTw?Y^!sT^bAMk8L7$-tj&MFgHbId?Wl97{~MBBNa3E#>*nJ(b~WY-ohhgsOu!+R z;@rix3R6*H5D*iWlGJ}O5*==G5-ePai8F8?UKWGi(&p#vR2PVeFNf|jEpLZE9W1FD zRL9WSFR6E56fO*&NH4M_(9;>T(LK7L&dav*v%!{!_yoopPDMhLn?6W8n7J6*XS4+v zWbCz=HGC4wpLbK@KOwJkVvGv}JCh7dZp4Sf>f zjA3TtW(;Q+BH{mD-pL~YasP*r`t(&y-4~{54o|7%knONiV0cRfg zusb-cu~spJn>1c@;iYAh4qwmuc^;(@n>RMvtDv?#A$QMljcupRg*H2vtwNB*b*yUG zv*gXQ*>ufI7vj(o#8hO))B#PsTWlek_g=FX?$fqJZp?jUfFm!eEQ3jn?a?a=^4{;$$v@hMC5G#zHtOtUGeCs~l1mKyx=hfvO zziDy+T6M}9CADfiU$)&k{z1+ij3m_%BJ9-nC2Y~TAFW0&2~&!-eU~wW zk}vRS>G-{e#G~;^3j!w}oyq!$37#iz&pt-*eliL2DoYZ3Ar?R6d<1@fJU3a(G6bK7 zeymqLhdz1c@g1n8MU1^F^m%2zH2p2Qa(~CBamC}{8+*%)Aiskfg)y3N#ZBBQ7TL{2 z5&`mK=^IL_KQY|F`9}hMtfb~ktISiJ4pxMBhZ286x|vIcV7OR&kpE;K(Q(4(jv={e z3lT>0+efQ?_+qUvVQ4v;Q6~mLT{H&_9=b&2%X`-sPYPcYz}NNqM(%4Kk!kD|X*C=) zh&|6b4=t-4VpG=E-nc-?u66D&!G2Hm2;(?|W66$s2A*+7m7Ag>*w%9Fevd%YNn_t_!<;uv5F=xbqcu3XkXSG{pt3a{gyxOwDA>u3Sh0uVS;jF z=MsX9ukq1mdM%i?e;!O>Ac;2;0+nQhH?zrtE!|_o4p^p;N)&MTJ>7fJl*jV(;TOy%)^PaCJSoWu+o{nPp!)W@s;X-j}~{ajlDrNC+F6F;URn~PUweP%|{reBkhtcqxu+tSDwiHw0+Fs{B)m>gc zCeK&gjyz{|Us!{JOVR}Dn8f{0s>Hy(#hDgVGTzwkpq%0|j}QgboaIcP$N}8l5Whiv zyg#__b1t_Xdh(5cW*PeSg?T8vy<@pGZC8N1utgk2TWd;ru>kxE*%~qA0;4)TZRyT^P3svUh7W@Ha=eWncQpaAuf|M& zLqw8Tp2x+$1{FzT^8KWwil6W_LmNI1Qrb?ABOivU#;l)vhd-N32Tm^1)IxIP@PrWu zSyB99#Hrq3_-hI2@NRfNw}`?KzKLE{LVd+w6sgsD=SGP1f>~lap8YJ)AWGMX_4lQl z(Bw8W&oUx?2?EFj1e`siGQjE(i8DCpg31?c5owS`zG?Ybff`O$6vlySE5s+gO?*z# z4qW7dDvJRK{$#a%lPw8~TAuu#^2C9?sJ#PKV}9XIV+!2fnlH=yq)=jFhZ2~r5K@BN zRzQep7$s{DSUO&!j~I23PWIj>-zjT@=8(k30N9$Pxv!v`QuY4FN|j)XbmsWt>|st$ zMNY(C+KDQyZ_l9TU7n&BpvE@iIAVOEz+`!od6ZVIl6m#`E9E8XAUqJT%W{;ta4`Pv z6Y4c4gMB+!^t=uSV3PT1%-EFFHzQ4IQyT|jVV4&AfJM#kzb&xoNHSuQk&N*0&>&=qtvRlq^V zbq&P)fr6t3Qr+x3aM3tYCi*j~NPO)RT+7mzB4bws&(v#q4O2qqCoxb2Hyu!Uos>WO zNHXTxj8>~^V9$}DYHXTVU*{s%h$9Ml61VXRYb0wmJ5rcps8r?P8${NP>im;4)^tU% zJe|#?GZ*$I=lpiFfmvi>To>??8LCW9A-e+@v3~SK8HKvVa@_dSMKn3`MZ#8(%lgxu z200nw0R!sBde^&`bB<+)+r8VPJX3SaJh$8i$1VVQ|9sJKZ0Zy+Qv3AgcWS6+@{;RG z16rPj#K_v?cnB5H?j+zyb@iAoQJ}t;?YBO&YfO500`Um|z|>`+qji6TQ-k$KXHLwq z-T@CGvdxV;Inpt-MgGf!1!cDj!l*PRd-Au)353Ko?+zwG*5-fng!K;(z}u?+oPW<( zC!e)I>_s?Gkz(BU*a~i_E?+}sp`y=}&Ro+@spOe~rS#k5j)~trG~>K`r;Cr91{Ar+ z*Imh&3qTXYwkF4ikEc&S~Ojy}VYA=(2DROZ#C{nEWHFtsmL2d^6*LrTfZ07zKyk zg%BJqIpd&bH`tZwOv4l(u{2OahL$g=&s(`eQ`rm;%yk}#a5l%>r*=qkE-?#i_}b{a zduB%}_z_32uqZjK`aWp_IM+G+rQzPpzR9|s_^*N|@8dx4`Xu8F+{+m`YGxUV@q0e9 zt@7i!7kpIfosi-~+(Rz{iB|}xh8A%yi)8Qc3#Zxr)`<s^jm&19T( zV_O{)f9+96M`@8F_k{1zx6cEt-wMRKs!pAKOOjr?D%PYWnR){Rh%OGl{oo-*AgyFd z(KO4&y~AtYTB;c7w1Z{HP@2)gL8`P+bAvIH{BU1}G#ZF#!Me#gU0wY2`I1ro1lqWbc2Z0CFL&%HH2_t^a> z#S>aS)}~Yed-}ktBFrC>K6+b6($i8(Q)9D{Y6u41mtpZWzxlOR#3S&0Y(U{#ZNk}a zwK%q7k&^4LC-*1@b9eU+ay@&AzYB4M0qm8m{MF!6tfS9@_AiK0#~vz6|1}k2{0X#3 zil>Qqf$PJVZpvGfzx^>HY7m{KSNE>YK&)|M!{BQ9gtxo5;%6FP2^hNU15!$@pTm-s z>wN<%%j0=W5W9tyf80V;M6gPPM`$6DzdQb?SWJf@Jsh*?50IX!PK_0|{M#~)Nu z+8QurIC_*cvwY$w9{-SAoVj5)eq`K5@-a*2$bQ25w48DsABLZNv=Ur2C!LFw1;nsP zWsjMy2HJi%FVVX#IKlhn3}@ee5TE}CcTP(Xp}9U!1+B^h-8w?Yd3v(qBD=ay>U{FY g^ts8LMsp{023@*_qEA;Y15THLuBlGN?MD&+2dL&cNdN!< diff --git a/docs/maps/images/gs_dashboard_with_map.png b/docs/maps/images/gs_dashboard_with_map.png index fdd4cc976d1057c7c93a264cb9caab7875f82541..b7d4a7b63ed304f2b86c88dce4fc03c0a381e05e 100644 GIT binary patch literal 262955 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

    v+v9j({lZ1O_}v+D~mQjkWfku@!?5l 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 z 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 literal 259987 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

    VUsA!Um74VYy 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

    97bO#zq~ zlp1JmV%e**dNjVjXnt6*xfr?umS z6*R(rm8nj9zWzHd;Ghtn9#hlcE>Ty+;E* z0|XFDRNtUKSPCxmFb)Rn>Gf-;<{`=-vSN&xA;{*TX(w0I$1CdDAywLt)`3!ns> zu0cEr-&P5I?}&qGZ?I4GcImW2FE6K>u))W|RreqKtXb2zabr~t9LAAT|LOu|x$;E9 ztAR)V!yx$gU~z$#spvICEZZ@;&x$A0!?)mV$-IsG?spp{AQxTlTREODoNjtuDy(M; z!)6>QZf8S7KI=TWUC-F$NE@$Ff+w%^XUZtSa0aX<1l!=yPM)n99;Pu7PgS7i$KP)DF z2tpdO9`ws33$83{h3UX%C-OiharNt*(L5e|j>i$7=Iif#uHtgiVrj(ylQ&ZMYRlH7 z7|;p`*t5p6UJ6Cen(@3_v%|65$4~QrLln)r#&7s^`#ijZM*TeqjDiV7b~D{ZzbKSs z({Mk(#ZoEsZ=meCty;4aUucg_@h45hk2*I4naUq11YZj%0E3AvSPBifCq7!w*zId; zYZx3?mP?P-9CX9}YkXftSGT?8dtgqSdfs3chP_BinRw)f;%!nY_4lrgsjVwo*7Vvc z>0hFC7swpZFUQCA$^821<|%XY{00ueUk$5g?6JYUL@2_Ty)}kNgcla*5#Jc;(oY^n7%ZwtUK?8HHgT`s~5~G(6e=S_CEN zJMuw%^KYvAo1|dX1&z1Iq>cK06%6@WxWFeF(*xl)`S&AG;v}O>RiJEhX({9n>9P#LGy(rM0aNwSh zJtrCA$u*dwSeVW3aCk^#f0$pfRMurI?uRAvMeLupyRTrBvdPC;6)ob`>?IRtm~fXQ zGK2Q=;7mLOfXnOh+3l+R-dm)xKzdSEzPOVe8&fUc!Q73NOV%{1x`}AG?RiX6RX{x< zn2=SXJIs{s$2V|d1wP5su4a}M0g9XqgQcYK0^jL1f(1yfg`f4=1-tHIM4r-y*6SAExD7h!G`_-<~ z_pnLYugejr=Ry;S0E%Q^5pLW@jc4|G3c@!M{RPUD5yLV*19>h0&Qr{QSMsN)*q%>? zDzIe9OtIKD2wr!!gJ2863kCH-ka#nprYj_h<#s}2GQ278&3@ZvcnL&i`x^l%fV2)P z7}-yedLOD*E0<7di)H@HR}7;5DL|Wv6pAVacxxqyAOg*(|D#==!9Ai zK^yEf7Q$KebV{SMRt#TN?z~X8@sLS^?^c(c#-mDhUVPT)Qj;MceN6`;!obp%L92LG zi_0z(5VeL7`Xq>`KF5!#bh4MVaDjCz3d~6hC|yRchJ_u=CTnT4!DAf8G7#QDU=t~F zMpPoyeV;ZdcxHyx6hUC9gL5`^+AGz^Vp3ejJMCAe=Kz+ArlUwSk1xo`qAsBg63T^ZkvhCW|4z@YD=8s~uU_hI zMg5AM_C0yBmX(=Q`%Bp1KYx5PBJfB``Pkv@>8qpb8C3fTBE^?N#0IsRY{0o!Nq0_) z0tGm(WL5e2rO@1W`(ZGI#6@2}A3>7Z+JhBId=OL%dW?`dRfrgJeP$vR5qYryq{wo5TsLb$^g&*pf zm#n&dKlN2Sy8)v%6_fzY6a%xWb#_;WDAgmJ)ioBGZHZ?~JJVBpsf4{YIa zkhZ$b;EkEvm{5wh?iT?SCO#L_6w7gv7vyb&F!$Mv$P!njPY=iY;&z}Hlcw$cIW7Of z3ev6CXA&%Csee+)CyVBH+Y5OiVcxl6#~WSee&`UsImS`foV1X?lyD>RjF`;lpYR0{ z-rb!cfZOs`TpQQcy+1dYH+fNN;!jM>gn8fEQa@?FsY7g}jNU)sJCO>4<_MW?0(8AF z4Y;)y1hFkc18m4PAK3NhbT+W+0)qvmY-HW7jgE}>qjt1373bH}FWOb%dSz1Y4A zORDV5=Lsmk3U$gWQzUuHy05ue)Fg#ft>|rWb<7Z3U0ZXWF+*%2PVYil%y4HRc8!Nt z9CTce*(bF)O>5(IF%UBiD{zbEu!^SPGyhi}Ik@qxFZYr6o_Y1Rg5Ul=5CZ_Rf~{zX zn6LztofMgtJAV)hxQ(2XcZNs@-@C$_y>B-PWFH&4AKjPu=NB6R&c(_i!EZ#{co zGBWXQtMZtMAY4z~tBZtVPvV2UNV$vkr<1STNq9eM0eNL_NYQ?<{#1T~NrDhx=a=KpE@D|`URr!d=C!twvLHu5)qGpu>brx1#Jj7u0Ph;%MoD>4J_B1n{5bXM^;G9X87R3v)J$$1{ z#(#Z4IYR|hLLz$HppP>R3(@lKiM{q&&P*=7MdtA*-bMuy@Q|^*@DfVTmNzeP9Ljjk z+^rA|LHE1>snaZkuW-JD?d&EL5bISpnK_6Td#C~INlEJO z0Y)yCz_qCA0HjVbtnRT@$5+0L_B`1uYD-jY4p4__{61o{8EWOw|Pky(pszS zrM^4dP;5=CM1ejFJWE25Od9|sW$I$I9_M=gsHLTM!?gbX+?I@P{WTC5W?R9q`Z9or z+N1bQs1$d6hf(J{U{+;MhLNdx&=*$Mlcm!>dm#i+=plfwUAIo z0!3{Tcd+T_C6eCTCL2yiuVxS`2bCW%S}gj12(W8vY{`33+1id0#7j;5cp8ZjM}-?k zt**9B-6>oTG<*N587^m}QQP{&yJ14?LwCU#Umy#PiV;p4 zTjjbiO=D8gl_9r{m9a5Z1#SrP0lqpJZSHTZ8V)jA>DkYcDdprdY zt*w4)5I^pG~0HVIJpSSABMkB*z`49Yc@`L~66kYn0zb-~Dy<=Q!n8r1a zeXtRU9Z4nssXZ4$oitsX{g&zdSHkbEZ*mS5j) z@jO}jHv1vI%ND7~qpZHE(m>MSEDpXn@@$6j;stevCZ}H=gMjuV0b>hO^3;YB%)5sg z&cZ@iXZWPS-DW;xTiIvZByQ*!p9T&i#zAL9I@hbw%eE=puaxnp&%Q&u{S55!rbgMQ z;m+_!4z5R1VYN%b6a%|cKe7mrvMTM2GC+C!=dqN7&nd?+yXMEpzm(?phJ9)nGx{Di z_Zm+jx48xNKzQ=)bIMOS=qfgmnUKQ3^Dq5*^XNEi7i7CPuyyCnMLBcs%1%W^mEuZ< zeSFsUjzEX_C2eefzX&l7jYFM~roBK_oz5hNCQRMy%W&HqAgUJJG!S}tuR^kB6$~)g zw8)HvrZIZldetrWzGEasYmpOvbFxn`i022KTENQgEb+=ODfw;Rn7#bThBK~&kPoK# zs%LP>E-c9xLJ{rj-);Dw-(+!=M44wUd>NXm*x7t`19%bk9~g<%Zv7ue-aP+;_DaK9 z#0VCWa*^ZeaWM3EKqF6LX;pksS4g=*t!{RTpP8E42;Ap}Y2r8wl)_Y9S<1aFBv%#A zb~DDZ<{={s<&*KI8*@Jt40mDg<>VHFY`KYS5P0m16pck=9iHUleP=ab{NSrKD zjW-S*YMh58vz#IpRSDG%BjeFo)Paf^SuD$X6jY5+%U)-V4TO*)pI1nRh5Uo#bvQR% zjKSD|b;hN$yK{|~{Cy3wjT^3hKQsLKe!bdsN7(319T9|miPU!R3-FuRK9lsnK0f)Y z0HlIje)@iJ5KmPcbJ@7^vkvHP7JNPF$2T}%N;Z|x`sok90Evw*g&dCo0hx=I*Dpw4+eM@%_-d`*>gpB9 zeVP2Tyi`^?^Zj+Brt$JPO39&gxZ~x3ccvhsEmb>!AzSJK$Jhn$MMle~g# z?(uU0Z%V8`7ZeQ1OdF`Z!G&&z&U2KoPoKRh*nQiGG*HS>Q3dW2^*KGiprNwTs?nQI z2!7Je4&cOrDb4}Out83sn9wNZ-PgF2q0mJPp$!scwHWZkT}k{QSIy1!z$Cy)Gtxc(`{ zs>W@vk1)SE=X|zn_-)OUjzML=(BhxL+vGPCZR2X#tnfvw}c3#y}k=#2hOl( zeeb@RG^K3iQ3f*4MTibWOSHM@sK0boJdjw5`JQkV+n5+-mU;|(_DpIrjyYTQl<^G}KD_fNcql{x8C{~R}5o=NddTm8q45N226bJbZ z=%_fcWNySwKuV{EGAM>M&JmL4tF;T;9V11Pt>A*?E+HTiYeOVw+(7zBu5De^Y;~Fi zU(_2mtO@+t7h|~N{3fVYEgxZud=w5EGR+MQ7fru!`^uHEe1a9XoWDcep0u9Gu6&Pq z_c+}-06GN?`7G$T^sL{?SDx_B109V0o|2^?$M?W#B><=y5e@OD_p5Jbm_L8XBWw;UF zaHaEATq;`|iPV_t#if~2$th@PXldcJ^21bXFa;=Lnclu-prqk;LBj%-P}zB3%y6Jd zjVV#iT+xOEV(RF|o2mdfordj~PgrYYgj=9mhYoA%OUKGzB;G^Vz~Pg0vNskNmX=r1 zLm4fipHxf5sK+-I$i;bGeTPJduvE&yne_FsH^dB>#5M$~sHh6$qC}#QBOL9j=&1-i z;&3aXGI11<7+rjUjA5iM53e{gU>?rF762w*bV!X}zK(R}H+YR!8I%lLU4=<=M_NGD zk`F?Nq8_=)fYZq%nt}|S!C;dc3uwFOeETuD>Oa@B$YNPEjXfBXnqNJUg@B@}H1vli z#W8DW=FRyJ7;r(zv_VzxgwL0$6oS;{-&}O&4;h{?QIzll7lYHTyJ)F)b48vkHApIZ zXH&@!$*_~~P(E@iH`#P_WO_&oflpUN85%!iYh6j!e6Xj-z3ysOd-h#@ynN`r&lgwG zY}b#K^^H`@yU855IekQAuTg_ud`}9Ecw=Q>^FyP80e>6D7)K|yu(HUhC2Ur-=n$fF zibj~HN1#@S9Rk8x;_HJp(yK7U-Fss863AzO=?c;5rdIP{A&Wl>#t zy(#&w1t3lSBAYe7fja2;d89L=gKKoSvkmbr=7K)ze*la5yS_-)zb={I3W*ubd5rnf z7J5uKnypiTT`O4TB>ggP4yCd|v&WHb&ZE)8z|N_J;xZ*``JOMdj}k7K`GI2ki$Qe! zl$(fD*}}^F63)VeVm!L*9(hKxlNQ1K6&Lca~fZa z`t#IFd$T)~0H^U@0mp=&7t{BL-r71(n56!vnv&7Hkv zn>)4$DZB8>x3CJ~2{XH=q#RVcm#a&6I>Kot>uX{8%iF<#YXcx4I<(6as}`LPYE`Lo zr46MxRK*YOxh$E|Cbn4$lPT{-BZ`Vv5;T7DTg>WDQ@s(P3AA#J5De;;iL9ENR6#XB z5UZ1_^JNbpuP%bZPe)`fWT7x>SCk$Z2OQ1>mol;hrm>^Rp^u$~nrA8N|3olhl< zE7t*_2<0j%pcjng(f(>fBx9aIR`2O@~D zUO13zthzmfodYB>)er8?pW97mc5ySgg)@8`I7dU3QWrpWOUg*Ek`@VLL2pyeiYP6< zhTF#bCTQCQ4<7TSAM0dcqdU`n7}&;@%f~eB5>zw{e_4yz`p5=?GVNVj!d(iT&*c*~ zE$52zM3jm_O-$b< zYXe14Bsg+x1I1_*Ev8V3JanbQ^_|=uB*}3idk6zz;9K(=pjxcU$}O6uZq0P(9Ie0X zgS9na>P}TE@(K87J#M&1ovVW&)2l-sP1!+yIQ?w+Gz6T2JjgvjAK$f2p4ERK7CxfN zp7^8OI4M4B>&z2X~3MB9GZrO2Dri!I1&>@i@Bq3OZoJObo zh5^a%ACA@xU|h|617J-y0xmk2c%lPwW26!uj!LhJR{uj!v~TC<)$6%)k$_zv zGV^efN>E5#r@hJPAPaxGe7>PGzTaMc^>8{45M&oU@^>Xbm zpVGZ|xid#LyOM$8G<~P<`HXLOL_^L?sysePe3vsi`X*=1qDK5gt+E3lFNnAYSh7M8 z0LTEztXj&z0{thM-@hq-jf2qj!ahLR6abzFG(^JCn@I>u6qRx@q9b=}Srt+x#BPg3 zZ^>JrC*AAd(l3G-i8{3@)FtW(1Hj7Aw*7Q^pD*y4OC zdTR@~lSO_tx3{-9HGQ9^;L=&Xxgiz=PFix(z@Db-Jir-u7zk*c2}*h?5QifKjG%t@W6ROETfu;!Iv{n|-)%ozi#106qlm`KlPPgQl?-{pGqfq@D# zV_Mrur15TXK0N)laYCA=QjPmH4C_8Iqu)*Yy#l$?ujv<37Y zT8<9kTrY}Xx}CPu#KA8@*{BHhUp=Xzc9SYySKE+K2FJ{3;IM#vIcVWZ8}~|BN~3Zv ze)Wcb*{&{wo0KO`?a8t9#UJMxoE?ppU>7G7N-dBe?2`vC@(w#eM0L` zfAP(X)?V?oj_l#!#ddXpn`a#6B zn=(hklNdoD#Q3#b63H66dh(#QrU2JU%{3;Y=7B4~yMTEa3L?CLC#fxf50KxbBogR;`j2$%+H%kXmKbZ6(c&Fc7OD^( z0GxlEiNVZGU1iZHnGz{2h$y~a18pio?9Y4`V7N=3o|)h>iBgVM6=~$|1nmmBMF2T>oTMS|H*NB2JVd9n6iWcQHKt%%jO1&?G%6j(5*Rh${?qfIG%~Q zTNpz|<}8W3x3p`Kj&=PVk*r&_=`}*Wk45vgVe2l?sECd-V<1(yLiLw={zjC=lQRQE zG2M|z4M(AN1GBHv!xO3zlq8OakTa39Qu~&D=srx{W#PF8sZC8KBh`O=4EAZuD`^7K zVt8@Ul~o-5eXM|;R-5C}1#0o#`MLMk)Ag_W?jw`iAzgT0_4J|7t%yJL__XoYUBkbQ zWe&m^5M=FkYwgS0Js)+fFJSKN{ptTm*PiC!b&CO|rlt%W`S!hS)8i8quruBroiv8v zA{Z3aK0NdK-5vp+@-}~8%wL^re*2HWUB<011{cu5M(BImiVO^?D6(iMb7*tYR~HvC zQM=XdFy)+?AbPEeny{n-I&RaA(cj9aU>8NE1=i)?Uq+t}V(RL2PE@6ZxI&Yq3%Lf$P0I ztJM^R7oHN#hwihheBKPDO5-Q|Tp4rr#d6AAVy_@1@IAU5C@)V1qGIQ_GxeW}-6$aGC3(&*?CE`rpzf#1*vv`1jHfR_GOpCL^ zl66xT3P$snLXrgN#7csinmRNpxT6VS(8Qx=`ci^CN_pvZ%&;o)QmaGF}f)S z@Oh*JLg*W0#9NO0|AHbVU4D?Mzo(K#abYf#Il(5*!)9+oyEB$U$!O?aTbP`MRw1qQ z817iscgxq-6dzh%+yQRJ)HM@ew*z2RtNt?uLV7g06T$s$9F>ZB zbK@ht%u!jf3L5`LAuw{Z4Wm6UX_}at5Bi9QnxJ7+air=8g%2K*zEfmsyJTrC964ec zl^0j|-qMN-!y7MOONVEun=7O6BnDO+vJ_C`dHVP?HZ`qV2wz{~a&gxI(*wCJG)x`? zBdoz-)dhF+WMBb^6~+^QW&Lk;O_tZzy#HJ_N!>pTn>^lK6D3UtcmQF;2m5x|P06*? z-4niX(CE`mp9GM?`r9q9_FvW&$Y8tL?F|xX4UYSr+GmZnw=`USc{*S3G%>jwk_I|>kfp#nBnOIY#-q!ZSy?Udw@*Ey zdpFP;^%cQ*RalzFO61m3?5j4?v8pgUOYRwu7wP)n#_RL$zIKE}?Su#T$;VFV2z1Gy z5QfB99aMjOyHtBNvo*IiM!UNHd4mD=l8T1r+NO^{8ktW;umZO-Vdw>WlL>-=uMOfW z>(*>hBJU24){um80G+&|?LTUMw$#bDll@r>scZw*4^vCAL%QmkgfYLqp6t9F@LbRRp7|#3Du!ks{h5+8tj$-U{oiv2c<+??vD0k@l$E#x6@jvOGqWo zySyHmaXWXT;nI2-@W7Yc*A{?0AJvnheRoDikL7~s9lu;Hadl#&-=HyKCdky3Po)fLliR3{ zasdFDjxIe0O)hQ8_KgRI<)b(xjG+|q2spQf4MRkQUhxj5=qp^n z$dY2=GQ5X%ae*6>KNxX{)~;7IX_$M37fK}dwWme4am*%IFuCftWCl^rkm)y#5XQ>t z5`Y>Q(?8R3p&_gYIphy`-tBslSgUHEoeLu7B6{)Jwigb;DDEC9Bs6 zWBWtNaKq1^KkMoklh~u>h}H<7I8qf*I!y&BrGE#Fa<}--;zQ_S%%a>YGEh50RDcM4 z8rLzHs>85ck1L}0ZPRj+N^$w@(tlH{Zt=&Da;_959NhM5*um8e68Mp|mtK_n-s+4#pmD{1feQBBit|=Br#VItUD8VW=+{G98ghgJ~_nAGzchVi}HA z-OiTB*4kH+P^t=`N*|1OMnFoF$C#53;y7E{Qd(yHTheQvPZ$;Z4VD!~tN;jS4%UTP zQPYO1RtE2|B`9wqLBq@SEJ^0K+~!f5xlzEr_ zNkyjL)RJ=t7N7hhUl;J35-`&igR0iw{GFr-Ud?x+?twFD+&y$iY7`6#i`Aj_nu`9t z3;{oX(XR~!Vj=i(s`(CO<_$mP`>m_H(|eg?C(Y-nxC5e6mgJzspPviHyC#|HHH+1C z%k3kyJOG)i^Q$v-@sIo|4K{cM$m(K{=O z0#2A^I}@UeOsJHbwjTeFA`qdQrdsmr)4xt&7Ike7%*>3WdH!<~HTph}!TE2k?cb@7 zVTE9vyx_}jq<{6JW0k19R8&;|9h!kAo<9yFTutOaJs#?ZELjVfW z1(&^FAWclKr{}f!%V(tqEJ0D>7uW^XbNv1p(!g5eBMO{HajZy!=QTU9_IUdeFR!q7 z9W$*kaSQt>Gz!kJi|Ir~3L^1*bi$&94D2bUHBVVq)kkIO**NkMpJOmEM1b@k&U%Ey zSczi`7J_?S1&mN7g^m4z_-7)sZ&;Tw;Ub45?=4)PEj6n$R;3E~bOE8d<}MOA`hO9j z$={BEy$4VGAtgIpj5=)GklAhY1IUPfMWG(U`0k2ZrTAMLOR) z*?w6j3e>gQzz*L25S$RkPIbU+M|AiKwB;vskhz_lmfO&BXA_M~< z9_y&;XM$>B(?yPcwVJ6nc@BB>5jx<_-94IcfdD1vo} zL0)_?F_udKW4{o^ZHiZ}7r2!17>fid%(=sZH8YI36UvaWvo;yPj8h<>$|AY@Fjz90 z#nSZ+SFWlhR++n07H6>lnh7-M?3R#NGsBm~a0DXJC430vAovr8(7Ig)dfuYRv+YNu zv`%IZ(}jFCYcq1peLtM58bPZTac|8We9nKsA;49$v;meST!i;huZk7x1*pGoSX!a|!kO-T``#{UoeYeE+xVTnqF;yNOT&_S^1Fqz?Qy!UIuwiW%RoB6 zJ0uCp)x}jbE})R51r65hT?DhS3OMmW%G;zw`oBV)`QNFTmjqmw!d)g&az^$QqcJ@4 ztBhC8gdoLB6KMrRPP{49A(X+$Xp5^_XODD&D9MenKvSAADY%;mMSA-&_&gvuXj zNxNI3m$+y-xD|;Ql`Ui?9uzequ#ey*97amXqeV*3^F9p5R2;8QSH5XN&GqKz{*#f~ z;WKbOqClsrM5`9L$tKFy#f=2tFm7&n*OIjo8u>AZ`A=5L)mT2U&BtUNS5XWtiaPJ{$Soc@U^OdkgeQ8EC9fk zMShKzU}}$C2|0USt^?1PaWd)C3bFXhC`$MigjIGHTGI883}R}~kH z8zW1H>;w4R?8+Sq*6CPYRLpUN0^~H0KKbS^&*26-=nmnV*^& zIH0aEK|~44rjQBwmwevi5|K3CQlQFpx}YXZKeKu$Vd5vDf&9#2RJ;)44t^VamJ4S&!3uxjo=rl#SWqMGD=B!#k~`XNsDah_Jem6sU!a)S!NumIRSO)bQAccP2lUDCWBaDVC%FPx z-9&3cUZw-Wm$>H=(P-Fv+lDc5Nlsruo&YHnHt;*AMD3FGVkDxgQ3cvJVA5NTG*i>t!eiByd48W{$CjIOKJXn^Zk zJgu+b@>tEx-@IsN`D=Mo%gR1%?mb>5H2*~7BL@-J?T0YU3{hNMvv?lJ()XpZ=#(9; zP{6nkpr-*Li%^%eSyibpJ}uw(rJEdqaOi8X@!ZqNTq!c%3QkEen%AC`ZR=GFm4WC$U{|Dg2Vq+8zfKLn zL4L5ZIs#FHIrqupJA|>LV8IBdcs|nJ->)5bm5}mw2m>JBvXJ(XX3?#f<5+rOmPDv$ z$n*3&+tdsuQ5rVWg2`&7klTJ0IWfdr7biu)vYKU_2%?MSRdRW(8=i7Wb$8HMdKCpG zGAso}fgpI}o%)O$6xq@~@KTuxKJB(n7#no7sIbg-hXF-nBmYSsq4;uIfiwKi2j1ZU z(vQjqRo^&hO!HLokfpTP8k*OI)gXt`hB?DD0?3FAMDruYK;K%1ydIMvFRZD`Z~^w|Cc$mXZ`*% z$Jyg$>U#Lwq!l?^$CAbt-PM&MXv63#P;$Fl&>cJBMUFq&N(|(9CZZ{0G#6G&?2R@Q zbz)=$Wf{WZ0**ssvc#GMW+Y;cLyNuQ(VOx3$-UuQ#>qLS<&1I~*)`=UTZh{nE(gC! z<{Q5q#2$CN5zEXqLC~08&%yB6;faM8J?6E)-)O&!u&b!9X>8D4{W_Iq%4^zU>hXpQ zMyna~1~UOT^qO6)Yb|NkCyPa+N~d0WM4m{ZPuZ7Ev7B4B2tr4+o2uU(M1sV?PGmo&0EDkwYmeVj_oJ?ny6|3ddPCn}a}f{!y= z83wXwTp0#4nOF@jea~BY#sSF^s8Ay$uL)e`xO@Av4G}4UzJ}%x!k7;6Sg4;6t7J`|-V3YE9LF9U)Blv%u>3D4wpSuz z!d7}gS~<%r5O&iC?uTqsZiAE~KOjS+g#u3;O8D8%P$%~pCvSpTrIQ3I@+K*OvXU>u zPkDozH5mZS&8}fi^573x1%Lb1XGoGtzd06t&J@WQOwlWVGE0# zv0SjM_~zl@5QF3X9dl;>>3$yW)wgs0NZEO?AMEu^dk~{e-eLjLZ?@~AK532o_hKp_ z_}-tVe5AaosF?uPE4xa%Hf_K(4rEr|y@s&?rK%31OBbR;2783%aMgEUQHvV&C6Ug* z6owR;Mj7ebBiyc`B`q(BRt{y?uym2$>gK_6O06(Sk1KYA+=D?~H`V?+AoUlLaU*!I z=m_dW!*nv=A>)YV?2?#GpN_aVZPLEi62|}bxe%YVCm`q%@iUn3!0K{ zN~SN%>1BYbXK870G)6C-UwxGh(fQ*3j>$lZ(h|w_MhfF1O}+4QM-T@S;Q2(AkDItu!k*Pr|lR}UF#K+ zPftvsD;gGGoDN>4Z2WlafNske-0+-o`A%TA9YKfX5b@?#<^maTo9>s4J~`go@c~x| zv-TfFXM4D>Exs>vgcD-#IY)RbL|oPZ9m|0yY(!Wuh=jF6-tf!R>@BVwdXFW&7+c`- zw51?PTWn<(j%(}sVnT?cavo-N!_^o+OcZ!>!&gg&jUenoi$XXgEpn4Unh0u4UC>}~ zenH;AgbT)iNPXaFc{<=LG8q&u&1PikG9D}KW%OZi3(Cumgm81f^njmxz4fgtAt2N# zaEJ|;n%jaBDO0U9#V@*E4b35qO4)<4?O_&O{!L!X5^BIjpfk*RzZLf+1Q?4Gq6wumFB)i=IQT)m>BN%n*u*L!3keqJ+N9VV$hL8KEm*^rYaU^p z+EX_?V2s!Ih=j!1D&8yf{=#LM+@Ef};!uVdc63M#@7zS&+1>q{?&X6S)0)7U_Sd^y zk}#}V`g~q7^_Q7`K;AEg`vM{wyU zo9`%_k-`hyisEkRE>qoXE~Y)@-0NlW1N0fEqcRf|S>1 z(v$0Fh&aF>2)H#znWn>l_aGh^RTi{JK*u!;L4oXrNHTcuA*`S{7!ErK?n|!PT zaC!koZs^)U(8VBeW@Xsc%afmYh@2Prf~E<K3Z{Y-j+!CGJZ5=tX2c#=tF0#xBhy4si#r^N$_e4eHRA1=_Z58_5~s+ zA$c%KhP3c0d(tyso`TpLZl)H9c%NZPoDNxx0;=Wukioi@8nMC_E+HUfLP#bA^7r_- z%iiY0v*{Nml>~Og-(t?4Xs|MU@2hS zu50n7Cyyk?lGQ8FIwDpYbz`WZ?I|0C}IpqM!t9`R*Ub6z@F%7rS3v(fDynqxh`|I&QCv~oe1_mlV-8VhwZ5>)cy zwRngXM`Q}AKi?i^v3rNt+H`BQRlO5Xo5ygup-2grH`)%5cta3Kzd{)nj|4ct-;sNF zzmg+wX@o!6ol<+LRZbdIdLY5WhPTgd9-d5@a#I%s)=as)6M^I|w8u#n0D`FiO|HZd zyPFEfVg!Y>JB^vq`2>6orYH!Lp>L>N`(Z%ure07^c!oyaKP?vHPD;2mW5t(*WU&Ih zG*irPhk~OQ{86|i{KB>8Qwpp8>=q7y;1)ByQ%w~5{xu$NUbrCQ6wqW14uPUU^pJlC z(LeaZfCC5QKXBI%q_dy);w(LJ*aw5Z_o%yafNbt9ZrUB|3;HVz#w};r_ikNJw#Y98 zAm5PDm>%=0BZA)G$BZgX%*aT2urk_eAfHk>hntI4Q&}{FEy7Rm`@J?G(}MxwdkY^+ z7?J$&S=1#l7ts32QGaLY$@ocx?K8hY!^>^aogWyDFdKGyjUDF9Aw78yp5%Z=K8X=m z(grx26|L>DAfFvo*+ckvE06?~YZ}j&%%@gB`>tKe#i4kbFQ+p^slz&IW+p`+P{9X}#i3$GmqDm^iF+`f4IBeob0))W$ zFOIoFourXsVBa8CJy_a*G^FF$5jO5{`Bf%dF z@7qhDXA2|t!r|F%Xm=-mrfKZ#gY4i-h-Mg8Wt zJq8ytzcO8~KM9%%F42##MHqxh9N;tKR5kad@KfigEw~H%phM0s2vUToG38qkfVR*F zv!NGDF>6;Iab11YwrGThl9z)7|H8Y0j{xNvcZ#C`PXUvv#UbO8g z&Q0xBcGua6rMX2(+*f~St={>-7-XGwwD#yQfu^-bt#NXEOGAn0Yw$Iqg zGrT08QO#>P3%K2DH>HF-e)Y-^osfBGHvLl-dV&L$>_ZSboMRsL#5=HEy(sga< zjS&r;#DY#a!gvWHb{p@pD?ASm+-6Q+GkOUb-!HLwA`y?T!@ngc#NA8=I^0yBR@ z)nyC+Owb#_^sU-2gcsw4QB?iR-QdhZiC>hH<(_6UH-C`c@Ewm!!o1SPAkP_o_C13( zw1-v*b6FR&?^gnv?KlqMu{%ONFrPt(UMd3~ss6X2F+aI;_G<-y8?vCn3V-vPwm-MQ z$k0Mt0<0gijD#Bh!Pu@$!a9cMrM@BwRV9ryvF@ z(V7%iEn;7c3+ZR5?Z9oQkkGCKQ#Kzk;_!IU4Sb|`^Wd%aOx`+|%t13#Ad>#?C1th5 zOU*hiuk&q2sh_eiucB+bBC6$2qJ=+q`Q*fumf3-R#Lr)4Ud4JaHC0{gsbQnd#h&~r zBT-I#U&NHkG@km_%N0v4H$HXbR@VR_mW~=iAomPRaBUS25VagJRW>8pCBtZ6M^u_ROaj1zuF4(j4KxZO>Oek7>W2cUI%l zQoYSHTwTroUYa~O`Q>t_mi_ZRxn+owcp-e>_x+9}%aE^L}{C z72yz!At|4u;CoNn0qxM5gtGqYTrdG02ZoRQ+TG|kPU-|b29qsnbXyw^Bnj8rE;4t` zrqEh`)y z47ZD$Jo^K$PETuvrxMKj3hE&=BTX(V?H8nNG97_dW@@2PCGZm^uX&WJpR{lvloyHw zhZG5Q&4*a@0jLAdpKTwZf&xJBNdyx-OG!fkM(K3sBgT{mKyQ#e0M>6kF2}mJ6=6|B z>)gd)q74+?x;eP!`r4FkkRojoP${?;=WGcW1frfot=&G+^=(~|*RCCFQOgi_3L+!) zekqS02xgjme^#L5&`5Ar+)+T8Idx<=4h!-mSeX8{CTXeRb&lBgG0;g%bzYPk*K&1q zi|dQ|%6=f_^zZL-zLt1m;LrX)x#OV*VQk^pYK<7*DSt+*B`sH{qypk zS8;9EOUr~AnVj*DhqFz_Pk-a?KZO>#UOv>4%k`<1s3XvywB>C!ARMo+B2E1gx>51pQl z0@eCOAL|J1B0Kvv6LW2M0>};#x24F~oF5&{?(^7vN_z48(Xc@=-83g*gmRwnZ4ll_ z_IG-qfyWlttpT~JZ{OXUMiro00lm$EeDin^xMMKmbcf%zCU%Y2)b7>OVK*-t!y?r` zKPy4~1X6P{F|rV~-%EEa1@y={wWvTP&)k+3iBi~k zi+-d{#(2DuQ#4j%;)-qdmm4u4z?QAuC7E3Q_4zR+%}+?E#rb;r)Axs+T~>S_g!%6G zU(ZQpgSXl-E_QaC^Xs1!*)(vk;`~nfU$tFk&EI_rmGV7*Jk=;9G%_H4*eo(Z-c#K9 zElW!FB>qC`9(avUQ29mYK7DUHAN)!8`C<;^Q7uf$Z(sVW(hX+?HAN;87qMb8;sZ%x zQLDik)KrlnVIY|!M$THx{xyzk$XljFb8E48m_70yl6BQV3rMoV&1|(P;mrIkzS=eA zS{3CxKqBo7jZihrquMtwx?zNsI%bHcvu=2I+BE7p-G>iTAz}o|juNM`PMoqBjFj!! zKk=Yf0jc7Q*)PhOXGDJO=gAtPRw9$HUB?S?!3aMLs;cjd3gnwDr*}XwphArr5W3u* zBn@h%r+R;Qk`@8hUfl{%UAaiDn%2L4Iv>cVg5Fivr7E~O2sy0Fo6Lxb`9Z?adeS?k zJ%D747c(l!%Af{xY;`{wE=vHmZC0qSTnjEhS$7BipaU2DcW-i>hNO*znf8=%sHAZ1N_ zLIUI+0bjm$KNt)1EG{AQKY#qv`V_T}42!fZzxBTQXL2_?#cxtRfp-f3-}M^suEy7ZhU&rfs)e|k;q*S!&DIMqO3)(qowTKKc|L9H-#F``bI_p%Jq*xKFYE)R0$4dikb-2$J`Wi)Qk)g-fd;nE zx^#}!wc%f4#@(!=ay;=4xvIM09;ARCi$k_V5mW%g+5AJK18ruT&b-zMlW!qCF$gH` zsCzo)eQNw=eejeM_NDEbJ$`vQ?DMauwYYzNKG(pTRkpA33+{OAJ#)Qw^lw1BFK+$z z!2bDey_<)yg)-nocm0Vzi;-}6MtwZ(%gVdW@K?Z#hrjM)!lv~LH0K-S z&K6sYk8E6%j?B6a7p5V9VfMw$zS9V zAm{0A*Bew?Md4x`S^@ph1hCTCLq`u*WP~3M0-zb-AqI;>`G6H2(Yt8juIYb5qw@51 zYN+`gN2f|a`KYcC;?qJw1P~q^o;f*paUvj>BVz+xgi{dV#|qTAJ0sfyuLG^n>_%M# zP0Kr14z~uF*QKiE6@Do)eXIiJJiW$>1+9uzixAA~jJhjEU>^eavr(<>p?~vEdRuF8 zr$Ry=Y^i$UOpK zn^DgEjxmte`lDh?jmc$)@gfRGmQ`Lh1?7o&nnJ~qfyaa`c)6`(>*K10dqxyI)HF^a zj)mDIHd5CM*eJfC%r;H1iRZ)mldFUoUKPQM4F65#X(X;eN>;G8Y5;n+T z2$s4s?WTrzQEKXK^Sf!iv+hEy5T;}>a(to|o)9+=Xl}iNkj49X%Pw3hW_6!mo=^oN z9(QsyPKlLWU5q_4Q}f?Pg`J}ZUc^&6Q)fiv#+V@iPk(%i2oH;Sqyj4`Gtoc;m(LyB z2$dum7!&)gLT?<)P4_urL+4*?naY76!73MIYFcD?kx+g$LQm;e-`2U8B;Xq=5s}HC z+*^*(Hy+vjn#BFWfCh_$w%(+04qiyQuqs3(H-?08QlkM=UFEwdB+1;oM(SchGP~1) z_GEUbu#{*WRy(P)rM_R*z*9rK9E$Ir6M%Wy*C$87X~679{m0V<(eFF^*jb!3m5)za9rD6 zK@)H+dI?DRh4d9#`1=rHA&rHoK}CTEbqnw0v&_IfW~Q`4^PR7?fz&HLJ>HlE_0_Zy z?Y8HGjuks|x^vUruTB;1Z*H1(4>h$|G}GUi1&a`k>cp^||9U8SmZ_X$QvR9eywlcX z^1RXJDfM{M{d__9ENwErZS+yTOb8pX8b<*RXJFF%9Ko0;8He{JYHUw;DM{(m%9o1X zTIj6lkK$TZB#>n)Q01h!Gar*%kG0T|FtrGBz5U%HWmP@MmPdbF+jg*%=$^=o%z`@R z%}3uN;t@#M_1@UxcP{+C7y$!j@K)!vNo$AH;g`M;55NLd-lg?ur*EqQ<>Xa zkp6E*0?ybwFa(4fgfph-V=aTnTAV)8bQyFH z8nd;T_!=qwoPJXTyYLTwm;RZ5j2M_cy@vK7Kc1THiu$S z?Y-we-;2(lAgNag--ftfcsc2&lv~dE)>gAL$<(ly>3ooy$4dqOqPOBc|LOO*IMB%@ zei}j|6RNxtb;cQNJ?=VSYyp0L0o*Ivl7fgds{OCRuP4_O{qB>{|HUfOMn`3hua5B7 zV#x_A7{2rphsbLcA#RmPmIG;cwqh>|=MtFa32l ztiVee%%3|jjn7djs%UgP;r&EUu#;v~1y|Kcx^S8ImyPj1HGlA28m9%KT}rpgFlYo% zR!sip*2xj{gl5@n?}58NDlTb1-N1UBO_v zh`~kyMXb!AiDzjDa@TSmJt|Z%M4d~<@WQS~NyW6F_kHKLd58hy?zbNS^RKJFOdTO1 z#=KH$-EyjoP{k8W$)T;zxSM4x1$>mb@b zD!ZdcEq)QYn&E@fjzx5Aaldr1Qwx7+-PX9Om z&wujkmw$=)&>GVqbWG|jUa>@W?hOS7USbO_;;eZMzcM(zpc{=Hdt$>>g34q7cs&z* zG$#;G5p0;Pl68IcBAPwOKU+Q6KUWWJ|9DC=G$$EbkSueN0Wi10y<>|e_&R$sxf;5QHwXRYK^LFz=Tn*E+jXhp}E)V_jtSxhtp!U0~4w=I=MnAk;=sq zsZb;q2t|B>kjEEtc>)fXzrw-7W3O5M} zI0GpQ?il~Wk3YNj@QFYq9T*zx9~kCKR;QOmpO5nIPYCZ(HZsvYZ>p$s%MZa zEH2H>vwC_5|MbBpAAJ1z2Oo7NAASsS=c7;Vy!XMUz5T<`>Sjk`ukfH>LEE64!MSkx z0_b&ofk+?}3q>dtkW{8ntg3Z-gV|!WSnKLR@&rOaJES3O0mAe-Kp0OXr)F6AYuY~tpLIj1B46^-bf&X z&)X6Q86~!(fWk2t3?{417q^FU_E4cN!JN$-)f>&g9=C-FB|4+kgd$92)Xrq0ur)F= z41-_*LcKewb0xEto&LVwcX(ZlXT z^U|l&k}rrkkaf5{+5l87u`v)M=FGm?x?Btpih8F}sEnsm!uzA#sU@k|>hc6)T6+{v zBjoEttLC89>DO7k2CLidK!&3xv&CRE>-0vAR&HY60$_R30!I;vr98d}4tfcPJGl)~IV>EZe0D`PvMA*WWipvud|5|_7xk)A zGcYvz);sS_PR&kD&;RNDkNO8kV5JP*DJ5~0R)MA>(B5<>L$()<5bD8b zi~zz+E=vN!gQH6`4k3I&x3{-Hzx&kX_N}V4a|j^K*;7vad?Avylz_T9%~?L^kq%HEM!1T zzKkW1vjz*+V9sE1+!7|_i?s#|0z!XQ<4hz9o8x1n7zj1axIJ8q#M3{2=?C#t-V)5C za1@>x3|THhLx`4;*f<$)Ahl zHa-6E8?XI7k*gg7p(DDgRG*8ue4&iZ5rOc9H|!QehX))&jy(zX0~CBh#1aG)1d7Ap z_hd@)WJ=89NS3*E=sM&y!sSdO7`>#$G_;@CvUf)Ma1u=sTv$0dq$G!Mp95Ro8y5p} zt`LT@^DA`^s{95dxYCMzjmpd+nK2;J`(|Yx zx!&b;y37_EjJb^_GmO6h3t=D*WT?^T)oQJZ5GBEfFj%is;wm9T29M^?5`rWNIi8^| zP%|*0Kq!U`{n{u95E)mrI>%j|UQzVVD;9aHuw2fe0jS{OizV_uzWEN&8r&}su~Y#? ziF|cxW`2pyRcW-qasxwSGKESiS3Y{ud-wjM!QnBr)(CfV5$OzhV-u6J^DMa%C{Z;s zHu?D%_krc$ywn;U)BxLm`q`I|k;|1meM3)sfa`{O$c%SHhU(IHvh?;3KYrRjJI8`9 zMBpFlOSn_1R2tmP;JB#cY4vbAI)l+*G?~m6v&Cw)Ie-Rn_(8Alh=0)r5GIny2sW3^ zAs|d01HvP&aR?@aE#VU>5XrW;cXIhcBALP;R{&1zV+McV8I#dlvk-F#OLjaJFxn7u zzMUd1DWeI5!6K1T5j2O;pV#;c4at+zbBidi3s5_HbFZT1gt?KO$%)3a9a-LXcFUqC z35~`Z8ydnZTmT3iu`2z0LFXc*7$Ce(8p7(i8bW?!WIRF)M){{Jpa?9H7%dJsYz8Xna^hOI`AmQHpIfN>W&g@M!fN*PkY>Y1u0XxYp zkxXT0YHDhDcnC7^S70iWBOsAnAPIB$6s<-HAXFX#p*;>XSX$ft;`2{uXQor7Er~It z^JJ_}@7r&@dPGCmHV`f@@lap7AwXE4G$@cEhoW;b6f|N=@N|p=fCMZzG+%dP^I!r6 zgjnVxQ)-cjK*yODt(~kT7(GV8r_+)?6z>559yt-6U6x=S@A1CDM<$~Z0K$h865upA z3ZE2!kx#_lfWNlSgzW$!(t;8|SZBg%Veho?v;Jk7(qQ)`6qbm}8UZGh8iP`!U!wOJ ztX`MfV{^D*%x$sS0Siqg3y>j<#X^E;zQ|&KcITc>Z(1cNU2imh{>8oJ z6<$x@;Nz(%`GR4ds z>)wOMI)iy&Xtbw)2zGh<-49sH9HCgISXIx=E}Q2I4S6LMx)tivJfa}gFb1qI~`6p&>;3D)0{ns?L{#S5bgU+S7*L4_v?H^E-y#sVR0SI9L?TnLyE>w?Y>S8CQN2S`> zxY~BHDHUh{9WfJ*M(KztT%y&0Na@hkYP^xQWR6^fK`Ku4Tw3ql5?1WU;o>*W1(A*PE;E$Sg77TT8HDbNSzS>-9vAY%&^Z(`0mk z#k&Yw*^8sW6|T5{S_pIpY3~HTZ%QyQD?u8+S?QB$WFXr7eS}YJ4`4PpC+(Y&9GOWt ziz3tm7B<)5ec?G`^XlfH0%6@34)=6>V5oeNgLdH`+YI)FW(>9+s{V8!Y_%H2hNF)s zK?MCXg2xm5Ikwd0k0}XXqjF1lNforXU|1dW`uuJWFrgR5+;)cxxgNFJ5g8IXLlY9j zhgdKrB2dI)I3&hn0;7C`R&T({s|ylr<0_M@FtT2nz^N%Uh9!x9QKV;y^$SA%2wNvr z8uW%sY5<%y+@Pgp&fWWu0Q@jnnannTx)qLKWNdP7ehF^ks!Dt3%Lh`K^3Av3>mL}A zud4V0(e&)%;u7b}dk^8}!tEX!83%go=^KKo<`1lHK*O7@986KVN8yHz+ag0Wbp3wdw_G@%4On}fNVy+Q0lN1HgR9!z2&%w+Qz2-BwnVbf&P?eUwf4yfcg5oaP8jM&l7B2G98`CEHC zfH0QdfH9mmS@U!*?nKR(TDw9f!~-oDg6l&?OBArA)FS3HizJ~1W0r7veG9t7!Oq^n zE>+n%NlsgTitH28%pY`8B=1X6=$!lR{=xR{KHMOcub>SekEw(dHT8TmbGrD^j+Aer zHCi@=N|D?;0M!oFvw(e*#Z9PnLBSeEJKZ-->iHjidokw z5CU?D2&Xc@cuHG5nO_?i=>PQ7PvLP5C5w?%(d11TeR-?X_sZ{o-Ov!mQRE4Wr%mhM zYbILn1{271E*NX>5EWQ$FusC zUqQOTp?N7eGQ`tyZXaP^iYE&8&LH=p&3(ypAkVd2DA)H0uEDCu) zFo!bGs)mT0@^nh{a9sF!LO47toLv$wEDL(31btIHyDOk|CR8>Qky307o1G!O4UMop zUcbldg8?^;yg`5rVIU5Ib%uw0SeH5_lErAUkVf|BiLt9&fX;sg+; zNI;l56$r6YnP@Ej(Ps|~M(e=vq(r9N-ro7(ll#EWYOTRybCAFHw*v?R=`~{ZSA~*R z3eCIQziJ@NR<`8sEbxHZpQj=|!dfy!$zqe(OCK!4SCz56rN6+Hl)7@O-n_z-J5%zc zv@UWF+L5x&Ej$HkUm==br+EsA;s!7+HsYlqT7PjJM|FSpjOh;y5O!q_VJi@BoDPIo zhUO$oT*-06Q7&OMXLkCnp+X>@D^;pWm3m@)EMC}1NNSY25-h4Ejc4aqc;r#(CbT744#w`XwZ|;Xmz|xA)?_q37gk> zka{BQ#Huyw2$x)L_gB91mDgT<<=uDQeEH`uvF4`|*{aTyb^AgO?|lZiD7VCL*a?l^ z)Q-**ddvJG_d1x2LN6t5nN+c=g3+y7XN1w4Ql*i}6wn(vjlh_*^D7*#SSXS~S6|@B z0JmnAP|Ot$|Ini;s)__`6D%~usvb@dh^u#kH#m=qk0vF3Gbm6bn^!jt<#v0n zBeHI7g9!=urxGIMpybgciaj_qCnf^lOXk_)nPu@53yR|DCDGKPa0xJ;C*tu$^Gm{~ zQ^E%$D>{P>`9`uL*D@+=grg0qEWsdB5(ajN-t7tS1tPgZ z>Gt>qLhPC9pjbP-hjMPt$+W+Phj_@72d4nkpnb8SCnwg2#HDlu_KZax$r4w}-$LZwk@W>=!4xOuRt$K6%U_nPXN6`fiGwl>1 zHP8;hx3yc>>fpGD_4N5w6ra&3UR|3BZTvGss3>#il)gNm9R*SO@|16)DO}R{i;-M? zl5o9+9i0(z8UTa?t~M{fu);RbCWyz(2$0O9j%8;9_0AmrBl?@LDKPY8fcgf5U; zTtQo?VDzRk)qSBzGB!36FKj0AYwV?kci(>V&SxKg^ufD{bj}^G7;RqI;1;-+fm4u3 z`Upr8Nfml@}`3_dQTd;oN-4qT0LJV1^0w$e$vqefIvijGt1K9 z1q6prC-^K?MqYrNK>FHwMGv}*2OwIYygt0IIh!bcg-y<^$m>t@vV37e0d*n zlsDk1T8Ju$Rs5nqORg zO85eWhsEOy2*omiNb>$ipM7!f>CD^`L3DEfb%a1>Zi0~UhD@9-Q*)Ek^P}U_0EBQX z5&@DS(9={2l2H%@x~M-8K2C#JJ&1uYmBv7rC&(~&HV}rx(Iqwye@*8WS6psiPyg85 z!pZ`R3s<$N7~I_2SzF({1wa_gtWg6(94x_k#X$JH352?u)-{CG2Jm<<079t86sFh=eV_|K$Se#Ho-&7U_YepxRRRbDCuj(v2tc^Z zZ4LWIm>o*Z&VU_&(36T}H=sB=I+7}F0UafC)mWySuWUYk(lgN4o2~BZ%q|$6-;Veb zKpH}k6wSb~d(ECWax;S@X?8^nW`r4+8GR8&DVUcmbsm2L&O)uxYU~lEBc*ev^&SA) ztihYry3;5wxg(*pCvaQ}>`n&As!g3Ia?rvPFD~(c46o`Qafk_@db0!YPv_3SNon11 znkj8v(mGGt;0SAV2G$a9g(oKCA6IaWPLJDo1h8c_9BXbxIy|{DJR?|GLAPEglwRmB z0{FLpMUJ$G@M_af2+oj!aES0$`o*Yda8|U!lOPp+!(x_G7crL*$Z&Wfc>F;iGfQX) z`(}`mP@y#V!fB~Fx~vJid{MtY;BxzYzM#qOcY2BVgmo-L(j1q=7@f?AWJGLX#VZgy zO08Ch(PYKOu2CYIWHO4Ph+5DVE5_$H$VTEqgGVE^m92waU(O7;t~~=_mQxu3Bfg z1ty~>*&-^HD$S}=qg1J}A>t*^ovUkc7bKmkm|2u{XAAPFo@gHp1zjO^Q&<48$ITy75lq1j@`-f>of7{#NMLp#WgeyHSq@IZImkA*u*S=9N^qhSv*mu&y<;2*2L6203m>A zvm-&K*}(|$H)#<1;fXYe)q~ixXdMWVByd!E06fT$fw0B7=>9&M29{1|??3A2a77Ou z55iG^5+C&p%`LDOSSv!Y97E%+G8xUTTf&47jA(~KC>5I~qjmd33epV?As_@Y89gq6 zHi}&_8Lc}4c}Dp}9mBA*`LM zA;j=AJa>Z1i%>D??17BYn~oQ@czi*BUr(yMoy?U*0xpUWrPhA`JKwb09N~0Du29}| zFQcbnAzZY@B_7tgTov(-%)@YB%J01Wz=UdzR&Vp6S%S`_%5g+srOxJuyDaED+Tjvg za3yyfM|9ActiXPHcN*9a&dcP_X~| zhs@=ido!p#zLhIH=`341yDXhtLQygLX2kPs>5R)1MdaK{#=}xsymsciNjZemNvS`U1Yi5o$ zJHG@lxvg#+vTt$~6~8Uz$H*w^UR*4F0cCU!dd z4Cw>+Ha6gcy0N*rg+J~1`+hr|%J@@j`asDXE}J?O*agO~z=T&m@XAy+C9bRrQADm& zQ4*;(P{4{lLx}7xhLky8B&~-*{O&&ERHh3H0HM^4oyv49at~51Qbzit8bTUCSU^B% zZ0RRwbfh3@%TP(jXb2e~yci8(eGcJH8%|}g{o51^1y5_C0_?2P?C@Fwd0)H?-(A1o zA52xF>55jX8yXxK8y$g9c(S;uH#`3S?EMFrBuRFd3HE(=d+NLI?)LZ{x!mJ&NgM@8 zf&dR7395x42w(sZVlV-X4Qm!ue{7H&CT7--NWto_w2nF#$I&oe7Oc~*sdMMa4jf83nU|;<`e1+ zW`otMcZBuMC=y4+VDmyD{7JZV&_&Y-c@hRo_$<2x&j1vPNwr#Q^u!Imtj3kJM`kiJ z3yD-VkSwVjNl(0-&Q}a(TOb@y6c)9Vp3rFbN{OAhKjD073_jcvVyXNYf0z)8&{RON z1WyPgvF&cv9ge6eAjC?-s^KUS36C#GD!*k|{3*GV?&TErgx}!O;Rz zrDZsm?A8Ug%9NL(E4DdkynFv)4z9)An%>_0D$G5;5LFJ@#xcw;-Gg?Tzxu0I;aD}?criDJsZu<+e3Mfcws49h99-Nq3ojB z8Bi!xFP?g^u@eA(cJ~-Y7*yCgN$WH2gp>uWT%lAbRSKmVG6aDPKDQG&gT)a&v+FLR zOeiNgG8&gOSe!;*R_9JRBgJH!STqcX>7gWxa z$(sa*+>sa|$lVKH%3_P)QNnyElE|K_a~%L2xGoJs22e1O%EF&0OVJs4FE(ljH&PG6OVna@3=B^Wj!YTN zHvC$JM+4_;YQq-?2)Cc`NP4vjF|z4uO~+^qm4lguT|b3%Y1u;A&0_DV_2uTPjfI9# z3B|z+mbNOep(Zc`2+{JW5pOrYd~b!OH?p$ZH(8CK3!x8{wi8SoZxzWcR*xaF^~1oK z27jBa$#zUe;c{%>sSE(2h4RwW{Eg&ju*9~rs%C6G4I1 z&lYSKJaD|ex@=QphLwaY%6{^hc#)9}G0?2JX&%5z(BR9dovA`)i9R)U^3>^LM-GLO zGx6f`K!5MZ=-AwyuLF_f2k-ton#`I51%o%OH`zoxH{B7QBY!>9)`r!{iY~Vg#AcvrFLLwg2Cbg#XV7`(UQaA@}-1Kp;XJ{N`X+!U{)cpE_5c3 zB110RKgg@?S_rHO;y~p8_OW7c1Kl73!d!mFWN|oM9-zTBK)4PK;`xEeWct#zuG_co zEG;c}_l+(rF5bO+_shd)A;0Rq{$k7_+{V1GM|kw`CjE3VaIoAQfN~+b%CRVLc6v@z?oNXNlspZ1$`#_Z~Tm^g~ zfCLJ2cUos5Y8fvq*`h5T0~Ty)X|CB%uF7n*YHBFob(7Idc^R8hw z_YMFq${3Sm^45tCva80lGN1^A%1;>x8)LP1Pmz47%It~hy;+?nZ3|{g^S4u(+_57E z!>LlDuz2FwVY|~E%HJ+6KDd10oJME#CTF$ow9)3F90Kj6Eisx_Dj=W}=u82i6bKM9 z6z&um0>Q#V=L)4A;i4swbA$`7NYROxkr`{SV0DL8DoxeNO%p)KUt>7Rqm+b=OvvSn zX>8HJl*H`~5~ippn1F$}#t~CkqaXl>a!bVEjMzL;w?7JShz9H72$oQ&iiov*7|SZP zkAF>ObMXbj7I#Q)4k;`lojs(ohLl#6ho#J1Er&t?A+9C}l{adK!i=hS9FNy;certI z1*gl4RbjYJpt+;kBNB!mbY8zJ3gZiP@IN@#a>6#6nFQgMoN; zdTOhu06++x+1kNVBvvWR-fnsDinjrpvb1^(^={lP*(s+o+43^}xX>aH#sCN(Y=AB+E-9Vz`Y+%Ad z%y1fP`xeM^`Z+03n?%zBMW|+uSN^SYbs&aJ?&`w8d4n7?7db z9#hz2a^OQ760IX@bVcpnsL35QxFQ;RL~D<@{1K}sVsu5+wy@I&d4F z#}%46u-%ma;=UL_pvsd~xlx=InKcUcLo^Z%?C6f5H=t+ez;8_mRAY1adZXDN&4d#9 zOmQ|hGY^u?m4orT!xIpR-~r(?SXF`g6I1L!FaprkI7M(>6vVM5C>mTxH&~xQ2tWwW zo!#M@DV3WCLX+7hAr$y+YInHj=NATsCr8F;7q4_eYZMUP2O7M458kSG+CW$veYV6Q zi5CY5TQ*i)1%%tt5Vj742{?WL!tH7Z0SH?TVbTV|IuLH(Wc0ayB-=pvtTcqRIE0&M z2sa191}wz72$?|q;-g?)Lx`Np>=ur$)Zgwgk2^Bx8B9LUfC;NJU5ToO(BMt$+$mdl z#^aA1JA5FXt!Uhtba7rR7GF4jPAC%n{LR;$9={`6(s?pQoBL@1;aWJP3`z+!&yXX+ z?q}9$3(01Td!>ZT?he{Q#Z2jTC=%na7=`kJBV2Sxind_BG=GQ1pm}}%SbkA&w2G*} zm}@x@&mDyfn@=!#NYL?6aq2f=LY_dv;s`}jMKB2H74t@Oo>0o=kGXs?wJoY~BmfIF zj<}kFL#3@sh9JtCQ0l}82x*BB=7`=IF}WgUcf=ity8KZWyWGbCXXDE}=qQ&NNdwlRld<=wz;zqt? z@ccj^z)M%VyuN_N>getpb$NUP!&3l(#hKE%OC3wg%P*M8=-Od@v#XDGa`gGACXGAV z(&~1AFtv+77)4G>0SF(~9N2E@^jB#Jo!bJ!#~Q*%Te%94YFo8|@G%f3wxc1u-*_Rm z@GLxP17RBoo7NCkfpAlkQF;?V_=_npo`%6a$|Fq+xpGXuD${Iv&CYh!YOSPU6-QYB z8mwL&j5MOA_bZZZu%nIk+uVuNYCcoHGL(x^QYJS#gBS?4?v$MZ!V^coisvdCSIXqi zW#{h0_%2tN`S_#vQuzwhGZ?Gam zP>!%paq9})>O8*C=?#XGc{sLYCjZ%|pAZB*vP!SdpUBPx;@Mz4BUh-HY#xgvz%nt# z@&_XEM6z*y;QA=IPOw1=1(WG;EbR=XP2RLGlFnvx$#f3Nv5V0f5Y9Z>IAJC%6lUO| z5KHCDw{HUnrcxRFat#E-3k#3qR=1tXKmv@xGtlg@3XEkNmrq>90I)|igr;yA564%X z$mXlIn&99QEeLF=56(E_m2I8~03mdyeZAg(;wiw1!(m_`+)hF!qY>0veJZBCVfp0M z7@k8|S{2o!`Bihc7R6!f0=w1*c4iJCv}UK=!!&;t>SBpju$R%N@knld81+Xo)CR&A z8wi)0HW{V!s^RI|1h}rrXw9Fbyf&ts@{!CO@~Ie& zojH9nkty0kg-CWG5Q>~Wb@KA%%L=73Rk~yIr_>r9AUYMaki;USbc0+0qQR~yvUeH_ z(KAJKP7>EgrCk$J7LO2#2(Ew_qD%Xxq&G&y6HGCiC!upBES`kR6Co$G64i|XcE_mT zLcieJ0MBZ3*gav5Gl66!6KZRjDhfKP_N8lAF+B)Sj>H3DgkiyO+#iZTK8Ex{ zal8ySSPZU`aCEc3wk&nGB|aZ=MFW}0Q`pP)4>FT2L=rif84-0nUhS)=(IEhYKvtwo zJu$`P@I*{DzYcP1g~38zWCGDtFrJNNW}yF$A3K^%W#$%^W@Z;DBhp+rnKzg$6c7rr zj86g(hG8$O9L6*f;CiN^k0qW=Tl{IIGcC5JBk^oH1Cmc?a=Cn=4upl`W3LUT4u;_P816N(-*s0X zJbbiGAcR4@GcgCp)52L`!5SePf?^9oZ34q_UwZD|{T8nRYzRFtw{*|l(p9Kmi2Uqr zXy@*I)L>O=?LS_wyL$g2Y<2(PqiB8+pu$x^8Q=GPjaD8>n)HIhT zAb5N!4DMklPkHJ`z9k`p?E|+|UT=r{xLl01G%Ly_wfabb!{SPYXj0CK@>)BB#&)Xp z8{6U6>#tKTeq5jOkHY2E>p!6!pWqaY`;5H`0oMWDnLKD3q27}+`g4iQjKgk=W-2;Q zHdm}LXj3C2!@fW`o?p;7lRF!Sur>EH__G4^JnDR8mWd5Y1=tDAdeBRlZEkn8WDDe? z`K5em{^0)400`Z&N_l?y$f1KUy5(}YVzDGux@+~PwK_eMN6>jl&p*W`;8`AFA{6YK zM!Lbi>Bm3_(g#8#ZcRup3`wWiQaTs%ME4|dYaCHx*QDguxVUFh(l;d;m==%Fgn)~k zW8z_&gv}Fi1=2tyDYGRE?xfzG)VYwT9SM~^p|B;i&Z_8~P!cCC0EZMSI^(b^x1vlP zAQiT_+7Z{g(9-Be8PXE7c;cZ*+#8I${0I?aap1AUTCLGD5I_;PCxG>14Zciv=U^HI z4ki{)sAC#o-EBToG&nkU2KN^!Y=;jjJ4oHid$TG^B7mWAtXE zwzSck&StZzOfHqqg48vHROSglxU{qk8$f1xc^R(z?ChM&jiQwVLy-q7gO9%$KnR0) zdu+BAHf_$8q$JVAY7&LugFz$=LmxhR1Vh*s=etj zDin^+wI~;tTpAFP0N|% z3NH>xd#8}vutB6igMfvd6G$M_H6aE>gv`}Jp4MP9`_dv)!Wl^E+)1e=VfQ5?u~amk za`=G^lhEhDhZ1w#;z_sziC`pY@g|^zZ-_hn35Oq{V;vf`l%^4uP(ed2>m@R4Tx^O5 zBZ+t-8C_{K_-q9B3sm6qg(xOLC4ej8NG!G+2h%8U80l<2kuE50vFNkthm^+~3U zHizrVjb4v8FiGR!^13GR#Q?%^ZlP-C7u&Mn@%J`|kIQ!-Q2Lp5cTw4NwL0qzNM@UZ z_&uPfeONVEjW>V#m3k+@6~wlV+ew-7lEPQehh}uaqAplpHosalVr$QEdHv-^tMz<% zO{Phc(b|$SnyvLuyta%tv0A&AwiB5CDL;};-3&YONVZcO2&*#8AbCQWs7-+DnT)cj zXnPx&R&Lc~RKC@6Xjw|g$5A7| ziPVGGlyn6dPD;BcC3WeYl5~uTCOL9%Fs^bYH7=mRl-8Y6Ig%h2Z_*t^Sm+KV&EBNJ zgFq4JE|Ewjlc``d=?NxnK13IhSW@poy2LsbHj1tx57ht&<<>ZcvDoe~VJZ@hyFCHm zK*;+8VV4_4euw<70bwi=Po}fQiouhz`{KzY@ZnSE&tNdBGgufbph3|lGzh}th(uzk zFBFSrW`OAs__I$x&K1j%bTOJLsI@v4M@Ypuk>IVMSAp&}nj*Lf4FdJ~ zqgi(-WA$fZ$!sQDrNJ5y0tS|6N|jB3@atO8dAQ2sQ>^a3QIpvYt9pZ3q0-_BgrgIT z#&_+D;Z!D)qa1;>$;rw2+YfE7zyzD@nU?j_szA7k0Q)vzLI6TwzwW8( z^2R7Y;0i44Mp%fXXG(f=RK%BR!?Co*msUHIK!d=9dTOb5r3fpsAaw;(R$tQWNjd{b ztT}856PKbmDrNK}HBLnAP+tS>xEjQ{A_ITr8xnw;K$WoJT1&#GEr?H&z=VllDC+Zv z{ecLa1z_P$?jo@wp57A<2JuolU8q4)o6VMdX+Dyk@%Y0+k%S7`iGp4N8Hyze=wv(Nt7!npi47c=Wv4f)MfEz5Bp{ z@N!*PTz)Y$ggY|&Y<=AmmAl%0I6@XCbFBpEY zfpCv#2wQg6y3I$joqi!Sgij1RQH%Objxou-JapdOuoE-}e>drix<)KMIm*~8*9hnZ zx@DTq-$heQpeBh_rqvmYcCX1DH+oY>Z^r0N19AWg8Y~W_QjOiT?(rLp%a_9Vm6P4 z2<&%tL^{GCrr5+76XD=l3de8&^leDG-tvLiBu+$&L?vfSEL{|p=pGPr`#=gQeQ9>qrQj< zkGs7krEGC75>L9^-c&YUs4PY^ZlYlD}azjULKZqj!T79OhTcEVDN|$ zCQ=(xp($3)DkK{8gyQZAu|{tXMUqxO!asvI4K%3tRI#uMhn|$ekyJaA7GKH}O5qrB zNot56h^Bp!6qI9<++4Kol+c`XhX5+mO_~utZHdK`VW1qqvn_6jDGLEiDpN;IXbo$< zaE0|YOl5L~Orer4&d2ie;dBWg+2&8B)5xF7(>qPrtv?X)2T(|QYTmM>d4V4XiIlWC zT%mY2RhY|_my`LqP$KUQMBq7H8SzpIK&a7~qOnvk6kVkQd?E@qC<$}xN)-q<&=A(& zofrs#ekD>AnBE@<(V08|LZjIRt23qY*d+5|!$|7|F&WJ-+M+ejkXsT;sp#1QK$!i- z2Ew+6aIa|yQ839?1zT}HcGmiAAITj#h4uu-=R-qS1;ULrgd+@+&6kPVF()?gGP)}> z<<^o^X?J`O;}RZ!Zx$66EcMD-ux}T@;A#IlIk}2`-Z*Y-DW6D-ywN!8J5k2f~|U#I=<`2>I({NIi%Yk|Kf%fI$Em z!V<@?#|p!>0!-M8f*DG$4GS3pmD?NghEmAUs0Vp>G+^Z~Y z0Vk5qvn8||VDImlqqw8o0*L{~`GNh32!TtO9AJkUw-Mjaw7Crpy7saVeFf(rqA?J`V z8m>yTCY!8M88bEh-Zl{42O@222)CmlwCoHJZc9T5TN&#i1XoFT)76@oDX%b3sJzK) z_yy4r2D1x>RgYx-(c5HoCmzXmYHJ8rkOsf48{F7rl+G0F`eE!5Pq0W=NyVSoQ=boj zrr@Zi>3o2kU76FkBSKk?uJSla3MF#2-s1E{+@Z8PoCR?OlQvgCp)riHW!+Qcx-?j4 z!k#H4t4v1E4N8If#9|c4UO+{t=Tl1|MTTNAG08?gNY}+ekp!ZFq% zBiLJJnIw*!@tiUt44T(o^bw{Eh>pgS^9hYqp_eH1T#0IeLcw({MK_vE*eGWQq~idD z5)6b@CTt`_7@ZH&u~x9^b!IISLizO(5kshPd&AyfLhFnpRiQ7vE*9bpRM24*^foJc zZ`$Nb0~3lZsc1ZtLVT4;Y;0Bd3l5vJ2x|% z&J}}+f+w7T-*8Vf?+#}ZiBvq51(LKmJYIh&lPm7v*-`kKSE-FOCJ%0dbrG&f;R~Cu ziKC>#{Z9sh(P%8WRTRX9m4*0mbQCIoIpIE(Fvb8G|QZUP~UIO$w+oP{u>&3=1aL%4UY z6o3S9S3T@QBl`~?R~dlC(<1;U=1$>_~7DG&Lu!9chg3$ZCFM?lcH)#w!6>nRNTrpb;mF=RAGXE2_Ez z6z*F%LWNR~wRYP9!X}}S(hU-n>l%^HU`?lUEld{#0?g*}%>dy>Z*fRKgT>;^ojZ5$ z-Me3@%pN>?9@wv3uE23N)_*bP5U!m3^QeW@HW2PE5IS~x4q?kCqt;eUfANX$A*^T@gklUf-)Ock zF5OjY4NNv4Xb^BLUo4$vP@B=#g(0{Hcc-`&cXxNEc+uh%cXxL$P>Q<*cXumZf?Ltz z_T_%}&b+^vA(P3G_nfuYdNzG|)36fy@Y&>{HJ5?0_xJfTjQL~c{CT1TTHoi0#wU$h zwF&%5+E`K@PSEbX%F(sAxJZGRUz9Cyah)jH(W*ti7?_MGi#3;8mE}y04iT`UOd(AZ z%`5y)8^({HRjhctVAryr+yXb z@C%~6%u4c58K(#>ax~h6OXHK~3Jt%r!R8&s97bD=wngV3rsV@@(A#NY)mn(hGyrdy zMQ)^G_?$b4CVMbZoD!m;@t5HdoDb=xBGvpNI%k&s; zp8*2h#X@akxN<=-{6fh(PKP(r3M~apKo~SvF9{x9L_;*x__C((Z{{oq6L8rBfVmhN z*K`9mDNUtlYv!wn8?R6#zH(DlOMa$`}HY6+#gC?6-tm(WguiY@=a+{ zDqKMTFHm!rQ62*e+aDeRmfucyqJB{#o77w2?w857%jV#Ev@o`m@ng2;2=<;5F@h~f zt6DqJ6v#=R63qpw) z@J_3+R@WEz2`&sGSY8s)h{IU?s&d}3#gm<*(p%W(K^?X7Bo6gNu0XzeYYpV;RZdD< z4OK5Isdd3{W@%|Hr`X}Mg`H=;DB)xP;Q|OY!Tt|@6p}5?+(|kmW#Jscz}UB`uR%wX zP@hkQqAva!s?$;B7t>L*mkWcHzF$I{mCT^+;XzT(Mg1o4@G0Ren3_rZ%G87s^j-K( zlJnpxxq%^e8szshP*kj2|juFUIBO zcRM<%Nzng1arkxV{M6x#u()Q9!i9K_6HVLju;ff*=II5l?-s#HzyKlnx6&i>66BRg zRf_et`u`y@5jwTjmQZqXU3z3d}M$ za>eGwcc2>aYuy3b5EO0gb}|A6S&u1g353KxHfb|iGAp%rd^>-;f%I?zIc|WIDK@{5 zNTm0gZpy4i-;)fGLJeG9z<}8vsh_Bz%|LLe^EvuNxKl+nl$#qWR%&8!$cPUH)p7(= zF5Xz`i%_6eSRXxR?I4F#q+$kmL&VWrDJGo?B{UDQA&oNUS$0aHP_d>tVmYVTw7Z3U z$WC_Qat$RJU=JYluKi9ac>)iO2#w;4net68^v!*(MI9#uP(sm)S>v6yX0*~jKq+v; z)r5!gVk76x$IfyGw?`W|volTPj|QmX{oopPl<5-Z);vf!!^@36h+z=3N)sHl-j~ zCS-P}oxS)6NN#MGFyr<^p#qihsar3wCb>l_y3Ean+)$tVvp zo<2m@#wpE+LwV4e&X9R|B&8iT@yROB? zYHLIIox#Y1hU-`F+^sA|7JC@ZAPlvu(Sr;f;3F1Fsr&mbeNipmxjvpH-=$GDPzyJ z*02uxp~@uxD41amJ}e<@jKQf&WH0QXzGN5pbNsMjT$repcZG8w>jeToz7*TqE^8t= zRaCB3)l7&t?6=JCz3!9B)_ONBHG~1}xu`gmih)ULsaYHe<(^-J=$lEX;aX}j9>MjM zEO|Jc-Da_(okWPlQYTVM1j_r!Pe$w+%T7ja=>&cdds&q$Rn`;$mCIVY9lul!7Alrr zOQ2>uPtNKVPD(J_2vdiJ2mh5DOA$5%tW`@ANAnH6O_Ts`+!94?6nvwZJ0)c+8C1XJ_$-9qn(&Oc^GWB}G62 zd0GW!wAdM~w*lY$T3~=PY^;){=$S6UAb+p*{da8kv-uYW zUX6NCHsPd?d3*-XGdAMuI3b&pD=DvN?ANe$zfKk}9vkR)*ar=}uh-y8-;;o*M4Ho) zNQ`1QH!t{{Mp=gF<&2g%>Q-|PZEpKgu3q;xAJnrg-71I%(OtNaXsNm3=!(qk{dhco zzPafp7^xQbW1|5MvINe)$W)2R{c)rGtxnTG7yfBTKnzd!=Jf2+;~^f%f#x7R(ULDL zsYXS+)YgF@*a2T0wy@412a=JXXD}u-2p38-bsa?J(o0XNT(8Vast_O2;4k=##0{=f z3%OTW)}Q~W_4MAumPIlTQBMXAay2T6NU+2!&^(7+Jq&q?6_+A+5wL>1-%#P^cFN4m zv&7No7!Wv_xWk}K^9Q@Oi3kDjW|IqFkO6{p<7XCQ|8VwC>0RvefZXh@ro@(fVuSs3 zE9zL=MEHgdU##iNZ!LLt1)4;wT&)m^+0A$gCb;E8J(Aawi*28uip3qS5%mCm8hI6# zZsE^bl8?(W&U(Kr89nnFVwlpxIeukN;s-z5&8REr*}@YK6xL%9Q{=gVQrK{sp3I*c zdeYX7iI6HI6xASon>f2lC1yuk1h91}ejXw#F#PF?y7!EQZ-^SANu^e!_i${ZgXNWV zX%!0ebv*gv_?49)0c7NO94X|!Gv&u@tb}_gR3UBepmJEF28=4JzADy+8ZdW>01SNP z4#TKe{l{0l9C_n>)6*72Jx7>&b9(IwB|vhr`M9StR}D2W0~Vs;|)u z+WX^3$Gqe6m*-+6yeu4lH`xes(CB=Y6M4ch#gCozyf|+}l8+5O8OB=sf1~L&hr-$t zH|s&mfI+mEHs~Dbj+ZHuJELy%C1ZW9+Ne4FO@uY_lP6nNoPwoLu|rf(8-S6*iQex7 zyZkS-98}!A{s8&gzxX$V#Mm;%YO>e;TS-yxgCis8@k4oN{Nb>e=~U;(h4*540Y!>* z+n`_&0I*XNXahJEqees-zJYMm7>INw00Rt<5^H08{x+6G6a0Q5!??F$`;Ry%$i?D( z>?rdh}^+6!e9s1 z%&ME&+rcotT1kHaqvaY!GoB=U_GhBRl3+0z$qup^{^>J5{z z8Y04lKgDbVXbS5@1tP+>>+GHYu69&x5!=!(HpP3aTT9|M-$|ssE-!Z(iq>2nE+nZt zy^w8GmTvO@`j!59XAttba?V{D-VlPbMDTi1*+X5m4n*GQEo}2f{wv$~CU;RGdqZf4 zXc!~OH$n4BLw|3di|c$((R)dcoWrOm%r!PqhoS9VqsxGaPABu0hu);^eeWJ=M&_Vv z^Z;$N=?Ce>*SjhNsPMCNY~r+%XXXT(oS6*|wA1Z4g6IJu=TE9!gu`Nd(nru}0WLeM z$FQ2k9H@!&=wu>yPnojN?seP8JpoO+O27UDT&7Zw&VFg%ygu9@S5|Thx(K*Gd?}wb z=J&ri6}$|b*pGrU9}bqJV>RxE+xYH|M!)oPrU1-&RF^N{doWq20<|SB=+xbLxv;FV ziqG{)lPE%_T=dmTwE5}U+T;!`Ar*P6M->Aq5FJ$&@*jjn$#(U(j}@^H;JHS&Pn*zm z)Rp!jr@DfE1(n%_;roi8S!zovuvOOmxeP zZd*i%T48@#2w^S$Wr2j|&0&_*5B4YOs7T7&`6Dky1BUUpqWv2w78+dgE25?{bG{;|`4eYwwmt=e^knqQb>`rT4;j&DeOc`k9S2lYS zxoxOhk3kyuB0hHI^-s{7y&tB@favME;dN|3t&NjCO|O5Cs`kDXsbBFko&I!wn5O2~ z3*M_s(rrqX2Zc@w`!ru`>jmDa{|)%k)qTHHxVltg(92ygP!jQ-$EmU*eB{NuWN`JJ z`YG+=XgP8JH`@U9+B!_jn`|REz_B5mu3+Fx&@iMVUoy>?9-JahG=4};TPoqpE0v8c z2OZgt!z>Puhz5U5kgdkwJE7Q4#J>7`pyh8Gk$zx4Y4;vr;N-K{{8KE4|Uk!y^v|*n@dN-?Q=Gdebn(H z)9EYQ!{@BUxCrR#etzx*G>|}H$YEV5?TFbRuk(97mTFj}08bx8Uj1Tb-fpV)Ul#zX}?WdNhEN@IO>kh3{NGFD-vpA7?~&#VCvtnF#Eox-ZP`G#t6FHw)`O(V5Y)M%j4B4Hl58F|YQ!q{Vp_1Wb;=f!k!#|x zG`1-?(C{3T8l?GHBWUAQG4w2J`pUOHL^x~$! zCdMaj^*pefmrgfG6uP$B3pB_pRZufr(!O3Epl=N-KbJ3263IluUY=Ofy;lvW?=)?|0e!w*z7GMo42I7G&@bJ_g5fI( z!9Ks*mLVSv(bnv1!UZ-4S+-nx9glEM4f|p4f=&nV41!>Ls~*c+!bOGz!-A?d-9Y1{IrK4SfXfD<`^B_Tb=b;P!Heoolo1=<@- ze1Ksh;}5tWI#KjXem#x97#y83>i7?}OBB+v1uf?^VyjIseom-a3@is|{(aU`e5COz?!ukUR@w9GQ^}*dLp&&m@wYf7C=q>eoL~|gX z?$BY(X;l*Vh8LU6WPy9?qyXrts-Suo1OIavK*-ULLXc zsS_n^jIWUGb2c+)lOhEuo8QYq_Q!ni`@7%+IW#ci(CH|~s#}=iVY;S@pc;Zz0}Sl4 zX2q?@GO}n&`Ij!-0R6W7>{%Ro$yN*uAvtdks=W?+)o{mzaT5zB+diUd>KYp43huF?|Ne#rytqU?p1m81=81Z z+P#o35(rHh|1un0!chi(9VQm_zpF9ak_$4zgM z&tD{E zIRNsu4P@VP*G5|vmR5$#qjiGF>Zj#(E70E)>#_v&?x-X)w@B#f;(%!>jjJhe$Uh478xvY__Kx2beZPu)BNiHhY=9;ID0-& zQH>-==4YifQEN@-zH}8-fD)qsiVo850atz`hJ$A?FzUA{7d}%gR9N`U!0U~F<_4z_ zmlQM@0Af$TcIo^)uV-%SJsCXjd{9Bn&v#HJ6 zKoMaFCdMD|SGh9IX^fIHkJFcM&7cj}s&X+~ee%e(tlZo`r}{U?s=A!N|DvJ!s%2f;P*Rp7-#?x zLO(V8TnwNP^1L32H}p4`=)PPGEuZdih*x;Wh4f?iD8qAAs(GFd*Q zA-xVMclrjaxcwgcTsb`qTO(4?2IFh4`U8abw~(+o1-plcj(Gwt?+6uEpC+h&Aci_m zn+CkE-jmq>12XHJuo`(zUJW58hp=I?hn^prG)MSidJ ztr<pw zJmgr;)Z|u!hL1J=@8C?>`PM;uSe^W#uWpkjURe6bAsy-ZVv~%VM6|hRo~ZXHs+yr% zbSdZBTjb16umcLapj`CYwmW;i=9n z;2~)7fV9vuL79CD&(}VmLepkP0unw3z&Mz}et4uy*KMCe;ulGgwFLR5N{jsLcuoPA z?B)?KzzdnN!7*p^oEB~PIbs&xPI$^fr7|aX^uCs$KY3q?Dgu7D`y)i)Euyks#EjeW z{EH9;+8u)WSf*yCAJF57m3544TKMZWk8O#@)lp8|?-!P9Es=}QapI{nCR%(JyL}BQ z1QL0jukG;b=eB$wM#}YU*5P75>XAq)r@cGtw9b50A9M6x*)(6Vt53Jh% z0WhJxHEJPc{!nVozOrc(#J+OKe(fwOSunDb5Vr_6*aW#fjF+oX+YyBJzrkeI85LN$ zgb!M95okGqU$j6A^W3n4;k7V%JXzIqFc?*C_T=2R>;s`tL3Wj8yaydF(rxIhDf~Hb8feLF6BEfZB>U9Fj?YY$I0*Rs0!_ssd|T z`GAtGWD&I|37NYemm;uOOBov75CaP76YPNx4%u+QyZR$Gx&`6^&)Q9s(w9V{1{b@<3#!tuWN<^xDB!1W`tm)jKou9c>Omt< zBD2xL()z}Xgu;%fE$ph4{ZVd_N!xj6ekUqP)`-a3Ax=bK<}0F> zrjq;zd#KFOz#^CQqR|EL_eMVmn^)k z`rmAgv^Wq{_XBzAc>$$=$${fmNm=GBr`vEz4=sWjIlZ-|L4uy7+xba{w)3DEUL?YX z8J!&_n-kx0%0aqBqYjC>SEItAsS^_UwI6lnSmKVKx=#QfZrNo;2xktZO~~o&EbNBo&bxBLlX& zWgtlq=N%YC^qjvle7myYdJ6v$K$pvMpK4v#uMZOmfvQD=gx?Q4uV?ZFuc$75)>5cw zXhf4=(I!Hpdzsp#ut|v_zCk#2P)(n=gdJ+(`U+4o1;LNS6)3s_#bM)^I)Jx@)TO8P> zA`z8%etAF%-z~G>QWjBu#KvV7{vsMDl<&wURN%}8S5dMaDyHWMk4T&sSiKT_W%jBJ zQV;&zmIj5Ka-V<{Nl1?+fT&wfgb3FQ#TBJ2Q*2m2e!SS~V{9cHUb3J*61Gp1JES>q zUj*Nh%@^iD8}=upQlKLvS%Wan&n8`Kc@Hm!A+Ktg=93mFPPGyh-2stC?XU}+8G~k# z5Tov~N@1t#wL+wU^@t0iOW>{mpF8EYpibA$NHOi5?p-Zx9?ALvjd~8?~h+E`3VKYy!QyXExV>vXag;!=6Ie&|Ih6^Li&J#}z z9m|x=nWB1N0k70(tU6nmzKkm-Txg(|tioBwN*CwjoY;WExl zO9e@%qdwK%>*;Hk4karg-~E4rqF&jt=FPuU{XKU35DH13y*}n=G5WvJQffttKHa>L ze<&&a8j&ea^mA2X);1RMfX;b7PA@d!^A7F^{Jw(hZcoX|Z-8WwHGs-|pUmNqmkX+?*z5k)t)KxACc1DXy;wgt<>lz39^pZc6qZF?nf=uih2}DyLIivx(iurT5`{Mxp!+shh!pp4;QIKhNgD-?l()6o6C^5zi9k=`((tjp z+Jb`+PhMOcXT3M25D}?yXckqDEi5@yknr~9ZyN!Z*D8x6n0~ob_xN!L8xOqE4$*rH zAR%bM%^4)OgTvlu09K~wJKhp7Jt-Um0Zy2 zUPVaZunCtx9@#zER8+=_@G3R58~xSb*Y|br*?oi@9xG!z_KF&U-q& zv*ZI?Ufm_+L=lP-Pa8EUpZ^xn)xqoiC>69pY6P7_qvKlaW@y(bb1;c|8 zqGoWMy|BFC=Q3@fZ>$nAA-i>oY8I0wDv;??vE* zzz7Xs;TWU505MEP;e^huNDhmjEa+G$Id8bI4607R$ywT8bU+$JovWnF5A;n7F5`_M zz~VvB*_7tx6boH5GW+_odL_$wD5oY{8M!pf$al|mbgjf1(jBZv_m8=olso)oiEf~X zfI|6aX}IKD&w7?!v_Nuq+A2e z0fq1lz4(-?y|9M8n4E>P8S3xGar(HY zD}=k1834TB?JWvqv4Q-$%bzMl(CijE7u{JS+14J0UCIpp0D!D4EH5x)E9wbp4$mxi zlFG_C1Y{-RUoG=iN(~&0ammTLT7N>fLtamwqA}hFw-mp;|*ww*n)dk>3 z-v&vrGBb2k&nMI*rj{!jKq6Y=!jAjBzY8k0)vXxc=jn*O$TLJ<-0A@+7~)+XZ~lv| z-oPe%#0-e#D3C_LvjS#z*FNQE%y4!=@Mj}{s?IHb!}SI%{JWx)wId;Lqhj5s^D1|6?PyfEh(57=7ZKrMRS=fi@~^KC7u#*OSj1l zq68R**wwLlz3GS+gd&&Et#P7?x)`29KXMb4(f@-~>4hjyl}g4VL|cS-i3V`R2x0)| z*N+Q6T4E&D7;Mmpa1y85EY%$pkrEA3D|~bKOSH5u;T(A6+YfAA5o$8Fh{M`w;6)gC z1|yu<2+J?T3l3jU`|l)kJ-P(qX|`5Gfi;0w0l4i#pEPLq>2d1 zA3ZK|_wV=!@EGD-HPJbaY8u@SE78JonRiMG;wu2~vik1IW7BQ8;FO-MhrYJ%54Yrn z@O4u@tE;a{!LNtdh{4x1t<3dCA|`N*)en;zSgHr4#iy_m7Rr*pt|=nIFawRT5woQP zFaj66lY1JjRXeG|&Gl>Nl;_*iRD36IkLPgU1Rk#F5IO{(69VpWE9O*Hn?xT^h$BUX zy>5Ll`tHLyb+#xLd6YalTgM&zV)t0_1Q!H zH%cL^ZWxRDO$ih&OzJMq;eZhj+lqi#D~>?TA(Ax3lEH!Ri7jTx7rLHCP@Z z>ykO3C#D+}uVKYNeXy?qrZOPcz3(_nuiFg+Ml$-OgH9a(C=q$YY~Bf=Duus%{9ck$ zD54-J<8mXtHUXEPPlXfzN9stL#Rot1b_U`wb>|N8b3NVqv?&!IUP%R6&cV3T_KsHt zF*!f&27{6K9BO9dtZ!uKj<5J^JboU2!`nF>)DD6P8YR3KFaAuV_IU+(A>PZ8UYR+6 zrzB&2L8Z@O?VN*DAgqor{RWurDS!qm~ zJq0yw8vR(7Q7CC!5?Vy^>=>m2whLlmLou7xN|YH{y&6Tv!~=R=?PZoMy~VA(p823@ zHP5+zVta>7c(=WTvR1J3?wW9-WG)n?@rtl?Tw{8V>D2iw0GPuId`#ue$`nkVob&4m z8f>XcA^8;T-j6@IA+cOjdY>nZ_^LN%S+z{@WZ@l(k;Pu;dZblr#2CsmB_i36kSgPD zP`|zj*$}L*mwyymLd2UG-!os))01;u8zpS)IMslA^js#Z+XEqqz}>l%No!W>fJn4jvkr4RQUoIpfUVgj%yq!phN|s6I{}5RhhpG%940w8{TU;bD z9oBu{H>ATL!`CnqV$1JwzgX3u=w)rNXyY=WqFjEr`5ISM>{5zl_k}5L-UB{Y#tBnS zE7bvO%@$k1p5jb-`o#j|)mn-%oxB|b@J1`^W2;w7^%jy=YxufN0j^lxy*XSU zS?Cf01wY?n12upQ7%)H4?}@u?Bl%a&gStM``f#yjXatGLZ~4#ZSGibONo@j|QjksoUy&`L)`Ko@(^NP($AtdROgQBVzuVZDEir>T9< z`?XFzY>@=()#avb4V*i2nF5Llg3j=i4a+mhHuA;D^Q@fx79x9S`CY)4#(s2$q#Bna zAE%~cG4WYGl;UIXRwWoJ?-5I3`I6{heQWjg8b*cp{b!4*V&KsXsSR|7mXeX5ECyqb3XyDU&Y(KR9pbV8`Njf!$d7L z%10S+9SqEt3K3c^<^f26?)!?d-$Jn!;wzk-UqcgnpeXWw+?o#2ep+_N``BH+2*!*^ zbFGlDMlx+*TjLxuMad?)9^>nV&>WMf7ijrTMixJWOu+09a25Ixnezzw-Pc3U;| zRI5r_YMo~zdS_6SMHI-Q?GgR#z=7L#{Gj@PUu1zxr?YBeSsPLC(BQBY2l|GP3mr8b zQj}YI3`+vV1Ig>x%86vl7G*sEwt@q{Dvil%(R4Wtq|QJ=lRXhZ6+MGwo)<21(9CnG zOF@GO`q^v!SfZQMO}}r;b#dh6?{zge%UaOGoI%W%587Otr%R(3{dhv?^Y!17Y^(Kv zMkagR;VcN^>-j*;rIz_#t}Afg`*QvMAkyP^A432l)`o#qQEmXMnshZ?PJuP4qC=z( zD|qV)dTFKKJ)-lU^(idv@|Q2K=-~BpTxc7KJbWbKbN`SkNH^ievJF%GrB$U$p3tMh z4H9#6r%cQK4R4Jb|CuIW4Pg>@%syzi|?dGp@z&Jq`BqQ=TIUpeR_&P+ndDnba zUf)!VHh?+>U zj--jhtI-yHO_jg-I8O?5R?qJSP6ulxe_|;p(yvm?>*|U@Ot5=iL}YmVVH~J_sJ0&ijO0&i%z%LRS4Mp1Yijl zG=NFFCLGHc2auS9}q@gsG z1a6KtmaW7Ay56c&f+8cfRH2x_8*lj2m|=>Mq;z<43Nj1seZH%pls9=9Nz8=Z;ux4v z{2Iyg@B$Z0Aao6{pkWwaqM}jnDA$zft>1=2H~OnJQvL?flp)q6R?Wt7!VzOzi#U#! z+C|M+*O}%Y8Nl%`q?wUe#s19{7L5jYo#X7n?(yRem^x!ZYoW?AW1;YG7E|97!Sk)N z=CVGfvaAQ+|23mMNS?7cU{jKDm;QCWt2Ldfgs~|j_PoF`=p}6RM70+Ht55dIZLD=2 z1b8)z+dUC{-^af>DKl7&9$wi4);7ZISG$lh{O~jFv%&Qp6y=peoujv=`vFPQAp~8` z&2#p-X4ZLh-@aS-d9ZiATM-@=6P z74~Dp8PB=xv$GA=$xWHl8K5k(0Nz2WHFV_<2d@pUi!JE>)wtDUVpREw!{BaCzqLfP(V{o?}SxOj2UScgS@i=xn)9fRnp_ ziJw=gc4UZjXHtLpzQ`sNb|9t)FNm(TeLPm6WY%sA_<{{|FA>XNDGH@Oiul5Q2#d&L zBnCZ6;22ufku3ZaTkR#Y@koqa(H`|sqVNz_{kKFeV^hfF*Vs)D1)lzlRNQJNTf%-} zV#SR73E5iZX#8&!7RIkBY-yINEr`HcIEl-XliW^v?^|6~s+C3nw|5f4ndceN_$4rm za_I|6io2?u%cEL9`c@m$g;|4xr2%Xkw9$3Ch?l(CpxvI1^DJi;U}A$V`YpfqZcUK^ zqik9V``bkp5>iD%+0DgL$R`b+Ck~0S>2t*wO*gLO18{>3_fVvo!3$#AX6CC7BFYN4CDMN9zQ_Ni6-Ur55T9 zs*((3uX-HgldR$1OMGCLdNKWjZ!Y2gyouWK4oS`?YTw0Y=hp+KkE%30RYGs0-J$CjiKjcMyyNN0U1;~BQ4Q^cwpog9 z_ccxykr!inaH94Hx#WMhTc)k0*}?}15i(P5KB>O;my4V^eDEFk1rM2GJTA~16b*56R(c%MOsd`VpD02XRxM(ve%H;L_z^y;Nx-jcCd@y+wRWiVkuT#yUv#pmAsxIoXXL)7^IG!y;<}EA^&U0 zOjlD@0MYpK(6;z`ql4FLBZyyYP3ES3Pb9h{{dzSOVN`5wEwy!G{60fBCj_q&j(=j6;>i#!5S$OC)nG!)G}tKidj5fxEg~k zOTvn?8s4B8)3}Nz&70}8FHe-4&hYZffS4Ym_5>p0>PgQ|Y!mMqnOfGuISnayIV6^otC<4P_Fa3w!P-`19H zifvtvvfAw%8FasR6za8Ha;ri~5QY8`%Gr$yzl)Aq)?>ShrJ<=->7|9`;=@+Nj|cN> zTB_hn!4fE?PlFrda$d?ek&>zZl-}OkNbk)Y-q=H&1!8&yESe*nAisujv5~(^D*t_E zjVnj@>1Wb*hTH1vyPEy1z2EAwaezD@#h$8gnZ6B2Ky%um3v!~-Z>x=%OwVfd;@L#x zGSj=5@qNw(93nK(_@jJ`wR)eDCk%Bk28uG+sFD%o^K2o_;M_c|7>M~PLmBiAI`&SU zk4mdq8&dx6vVR^if_7cCn&gsQ>E_uPN^7>)601NM#~t}GIJC3qc^>x7=wx#_D@MKE zEd`dW{nIc4(y- zJ%ogqQ#7jWSjLN4D^{s>V&#gK$rfx)PWI^$7Z8k^$i}1BeY%s!V01m&*lMbS|D`@W zmN8HtT&Q^gMAorT@k(C)#i^sy*<_D93>9{z0cq*22sNM~c~!-TD^mHaUM(1BUnlZ+ zc_diTx21di%eT5#-P|u*=eo@Whllt#;n{1TaBrxAG6)fPv(xQiThoQ{HWndliG=^X zsh-^^)|p9I4Co;WMB}#qwCn{%qbt^zl-$4N$_Iotr&%JJgOi`I;($Z6M3g|EHs|vr z+XFhfS}~Xq$#su|MN9aT*b@p(sVSw5p+woz@d0Y_-w%2LCMlss259N;`F3H|ed^RBLp+zuCfqF*I>xlB2n zBo|Tv+j>{07ZLMW#Bl5*$QdfT%r6>(9Gvzuq?=TIzA zM+8D^^r@RzG<{;gQzjgRbQwC$+#!WnH8b!e3styuB?l8Xe7XXRvmEBhx)VamkquMyJ#v_JI{nmLJD$DdD8<$-bE^H3v7l{0afIF1!3C{z9nZyBGq0oba)b3 z6iXU-XgMSQmPvL^q4PU8sZ2&nzFc&vkhuH@m+IrxI{yV{Ou>9IoCi+gQ92atYs|5> z`MoQ2U=ztb>xL>^%$n9Qjn{*uVrbjoUG7j=9@c|;E zef>TCc^pdeOD<>hj^9m%^!qQnME#V{@Bj(3#XomD+qI&(0ENF8f5#3K(iLj7Y}4(G zwY7*U($dCp=A34|ajC|a(PQW-m@}E&t}d8nXEbZAzG|E>BOZLB$KchbO;s-EtU&v; zmC@Q<#`4W}(sA;cjlnCh-;g;q7#i!DCP!tEm<55Y2YI*u6n0=#to`3oSKRxq4Pv1< z$v{3Sw~EV{t;($cESHiNqn1K^GE);83W+hvsPc*hX!!fT8xl<{!K7k?l60&aZSYoM zEFT0lBirx&Tqw$Z;{q!Oy~;2Dg@h`r3-^`c%eWRd<;xi+;_r5XzuC0V%(k2Hd|^gb zlI>4NiOa&&84YlEdz8fD|908uMdO)iq+2=>owN(z5J&y&jTn=1--^SwQ`Z=QkR&0P zu1YJLNgc*VZ;KJQJBB?MAb`>w6g8s^3M;0C)hSa5vLB>@pD!#5naNG%cde%c?(Ag| zzB|yTkXSKvl*{d-W^h3Da4DhAGo;R!KXV5&k(NZm+tBFB#pL|L=mk4F?GZz4w_vb# z6}M}8!KcrtuK#|Q-yMy*AC0)zcYUrQJ|tSzfO*xf(NQe@_1^LI7fFGh1ies?n(g;~ zYz2K|%1GX7lxaH&l$F)4i4UA>r+k~R_cgJv1syWS{#nyC7-8ukxKq|jF?k*nxt|=@ zQjA23Qa`SpY4DI`Hx~XoSl&Ib+a_0dp`Q9e$zcyfU5{6WPT$ch5OiV8HZ1==WlOeO zi1GDPooqtV4Qvw2TtuWMj(@=dj_jE4(7^A!h}GX4tDN~*Tba0N!zJ{sCC=TCydOki zLk|yy?at*$dJ|k419Ot9_ao7Qoc$9ys)CYoxDCQPo|Tql3ds}83sxHH`>zOo5A6pr z#g@wH5A7tU1v9NFN=78FX56jN+(Zo;$Ttyqo^YelC29N)OJiMlk#q^AvqHzoft9c$ zF=^lzGOsWyUSL@A8Oy4fk!Z-1DePB+OR|GkIQ3?P@o-(jX%u6&M%%CM?^-K_sdbZy zNp@euV?FlgPZhQPcSK)fy3!Q^uZy%hvc4ekl!Y|X$k<(CVZITy6i%J% z5yhr-1;!UX89AQJa*?!|!75CY0wqK}J^GBBa4L?^Wsbz{u^J~NI%KW?S!jxe>y1Zn z#Hz)*1UX<0dJVITiGv#wZeQmLN45?^pksf9lA$Dh%5qnn2sv#@%PJI2ESoPCaQ7sH zDBn!Oymv-wNtdp#CFBEE3DG-xqEf4p9ebBQBkzb39efDTeabdAA((D@qVYV)B7?z= z??eaQt6&?K40sH@seh4SL&Ik7F$%lT4v%tGVFISuFr-|=!S*O&NqnN!O2gBl%wP6wZL{6!&ZjRZ>CfC>eA?T9!*9Y9R#xOT;BHJy(8umX6>f#5x@ zpam9%_9KGJ21)Cif(v}s9NyS-XhXod#fN~N@M?8Q=C=__oD|dq%bZ(F3LH&QBcmQz z6a07`UKTDA@&&TJ(N#+DyZ5h;5xC0E4q%=qUBSmW&Tk_6C z;egMSI<%LpK;+7Zx*9<*DVjk{(OlawFG~zxoEmF21B6OkY(%;;$ely`{ztbKaG;8M z!7<0x!Tou#u;(-Xcv@AwF|Y4K_kF7vJu!KS|J5RIZC2kBJLMVU1TM@CPMRP!>E5~;uFQ@>`>Z&a$%Xpp(6E7Js5%!NR#6AkUS-sC{@xn>)T+#0g?mr6`zk^`a6; zEtx062I-s7przyf5<&6dHv9$kuRzExc`!4~;zW#Qd>8RQ!Em6$jM_>u2zPgqa0RLnGbYUD8VT00JW2B`sYd-QAr^cenJ+ z_q^vlXMJn&4-9KP*L}s_zg@JbrK~`54r^uIOO}adeSlFABVo!ZbAX~I`{YdJRz1pS zZc*5h!onehi`KP}Gm?cdP}%&xgOZ8TILi#g9d!r3O*JTH0E?iS7DntS$D!zbyfaH7cwMx@-ahn>kr@GZpG}>L6UnWvl0Wf_;iPaD$@E14XJNWL zvd)2$mXGB87f|v1TUdV9MxCDR3$^PJ3je@{ApBh!l}sz~h|8qh=S1G976gx6mnYzB z>egzOD=Vri&KmZh_r8x>t)#_Ot&_%i|P5Rn$Wz|Y$4 zjA8TfAa0zzCn!pM1A5>MeUA(XSArgIvWsZuQR9w*v*Z+o1X7Q3nJ4TXdwy%c%@!A9 zchK=r;xs06(?Kt!K0f##{||DnzV_hT8_?!gg+ed|Y?prTdk6NMw!2j$id>1HFW_nt zD<;(--y`|pt3yzH$d5V^2YBp06Fn?bwWp3m!(7RBfej+xLSjngl15HPBoh3X(H-S? z2r#bpUfhWj6}-=(+x2s2eUJD>uI2-TUuiX4Aq8BiL)g)FFHysMeoDNVB42jCX*%7= za|?*PDC?H>pGS>_gq1tH2PBowW&OCpkF)u;0-))PI1gj+jS~x5487#-M7d~z`6Zq4 zNiu04)PO#&;5c-S=B4Dh{Z}l@ny?*EKxzwK>{>BSDR2LX3Ee`fc^7z|11E_E^&A_k z-WMyG*BWcH(_O-k+lT0gSVx$sWu+^)nvIu>&81~R#ZpMkTvW>&9UiCa6kQ%SJzSJS zJo2jJIzzMDj-kW|TqVLzYLtC3`W31RORqMyy^1agjMw(J22w6dMYRkG~ZV#v|{SU{Kl zhYz`4zHnDsx;dHeUeV-mS-*qqI5)dIH_tIJL_M!bGga1b|ePPwe`N zgdGlz+pmB6xXGI(*TOtxLQ`GN_be%{dH1iO;W#w&%UQc zJS!lLf6v4=*Zfh(jIYSA*LU!>eo2b9T=i20yA#(Y>Dd0gzw@V7g;$?jzH{x{3|k$N zT#zlvezq&uq@Mi&TJphd@&U{I0cNCchTTCTeX1PRuVi5TML7w&|v z#}^#j;lG6EcT8<7wz=MSJ`^n%bDv+$3}geMq-ze$-iB^}^%`#TEwJ1Mbhh&Fdu}y+ zf!jW>0!-g`_h{`;w^8bQC`xYcup{#k!27GdnNk?(h_Ds~KnDbCjMQy4m^rp}OUi?AN*@EpK*@^%Xw!X+2>lPl(Yh_CMw z_4!7n9`DZADg8@LT!ME{13=%p#zl(^$&eT6w5~GJNF|V_+?h`o{;ELz<&O$0n(#Eq z6}F81x?4|t`+bAzaTouU+ts6%`kvBgz&u);na{{kaOMZ8s8E%3oxo2aaqZNhOmLZ; zSDl|V2*ab$)&P|b>7|J^acw8AJPZxh%%;|TtAY_9a@R3y<|aG4tOan`S|eK55c-~; z2AjA7{*>pg{m-9ihK%Iq9NZS4+G(9t77H3pY zh7P4FrmBAzygCCvowYo@f}eJZpXTs!M{>$gC0)2DjOVH}okEbV4(ht9!oBCkSlb<)qwiG{E^}z*^*w6znbI8I6}!aL67Sn1>YoIa`hlx6w;VF4G0OSt zkH2kighKMR^8-(#oWCQ_U?!ORWxbu`2OW;JR(dqK|M0fntaQzNyg5p3)Z25M-{(o6 zCKoH>6B2gyqIlWiOfd#l%J^*i+CN0uUA`Cv2mo?8ZOoIW#2`}& zP;-nN*xkuFxk9g$ZGr-lTpCukYiF&yyv_Bk>SQ$s6R#a24D~WH7fF?wb3YmW5c9a1 z%ZwGUcfM9L^Y;&k}{d*73xW#DKf^63^0#iBq>o0 zUs!DASHzr~O(*;vGLY=?R9NwBNGlhgCxe=viu$5zzlhq=VxE5hs(l7gBu%%c{)CH&px8_bTq_q8aunoq3~}_4PM`^2 zL$h+M9xOtgIF}qWF9KfG=PP60?gS>bLsTAp>8~N!+M(^<8t&>Cx}jF`bPdQ z;)brb@_(E>i^vz_TSuQ;Y;TdmM2f@;|GUukyTFCq2LVpySGafJ=F6HHZ1zw6<43B4 zR8=1M`_CPDI90~g%g$i-UccZ9TSs3DD+}q#+%SPNGbB0lX&lmBccBJ};zeh9y)~l> z?JTC~P8{U+R?MCbi+TY8o|j39m*jL)KNQ5(H>pdN(tG;xyj%l8-&aQbXE=*UVYshf z%gDcYkQI+1NSiWm@rCxA?oJI?PNwWid@}CN+D1VJ0Toh!o-@Bd@aiVz>4vu{rvi>@ zYPSz4r1QH6k~Ib;vq~l0H6i+o=7HTS4fq-PI`f_vX^w=`UHvhVpkAs-V;M(qF(&er ze)rBB=^m-xS3M3KiS}=Me9X5OpKr!pR^ylm(r0J{B#a9{RS1T7A5%b)ySrW_aWqMc zA*&h6z2;EH@KK~+R`sFH?{K9e#J_M-6(RcN5S78pDJty6ds*gitws{lJ`)iM7p)1$Pz6Q$n6UNn3=9$!%x2K>C82hYAi zVQLqh3dPDloC78ri`dC?H*DdOGGS~D0(JcC0;$=DZWR?h{q4tCx zDf9k|N|K&@G|Kx190H|^c+$VB2vmB73738)LyXHAHYANwR$vkA7;ElUw?Fy{5tAtz z7t$r9PRKT1rRwZ@GlM`oUWY(pT?t>WOqY>?LZ?*st#~}o{(3Iu*sa?yI6kQ?Hgc{J z=A>SGmUt|mT!5@ZABPF$g%>?h^>Tdl%~KJ&p@UoTYENGvE}GB8QFKLDl9jH})7KiY z`14k|$Iiq@`scr+?eCZN1gGNJpZ>SPI=C{S5T*lEH^AU$)JU=}Xa3woU&Lkvl0>tV ziiXcEKqo*lX4Nt8wdgG%DkH(UdkEBLaZz3l-hM zXOI_Gx#Teen978K)-Nvu8ws^6G5IW2nUOlt2s4Op&wSku9Y&|2Wo6a9`9k zto|-x#oJMvLSfQ#Wg@@h^~C?OWB=xnxMGAa>zzN{yW+j^YJiZU76+_u^WHNfGghj` zEzJx!<$S25-Yj7lO?4Om=d#8cI;G$;D(BmWuW!?FZr3n|lD@@Svci&Bqv&Wxbj6lF zUm>ELJuK<$gp=;c3ycP)Ebyp5PVvb^x|&i=eP@(KEs`rr{eh&2IIa3738IoirUQ}R zGn_b7*jB_71>OB1dw}Wr09)B4p`k_$tMu3KtyLP!>K?_!T{s+_*?1eQ&BznE)7s`Y zgFj*v?wcx7=Cz-N!fwWxCh5i+W89_BJZ*E!Gl=Vf6WyJ4IB1d=L7sirGXG7WwTQTG1lh={lm(uLC^n_jP;h?yUv^W?!e3QWeK0dIEtW4j-tdL zGuUrerL0Mr7zl6-@#I103=)sC58atx`u}mn zpLSh9IK<7gjE4Kqlg>>L=XRd1ovRvrwsL)Ok+;9U|MGAt5T+hjI#i)EplYVa;0ypk zU?5%(7bYvib90)V+$qxAK#1Z8Q6J+l(ppy?yTKuHF~i2qVMk?N353ZYFnNR&Rn;Q6 z^aOQkc=+jO8(M|!V{boF9aYZyZYQrjCaDHCcfEdJYeOzWo9k*K|y)KBx& z@#G!YN)T;6ksXM9TQvhJ=1pG|x9jmuSlSB!g`%(2{lWcD_7iC+j0ovB+37ga>VhQA zav$j1L(=F1R@Xzd0=0j*17S9G>Uuc(PrY%2>@LIHK5@Q>~! zisCesmfmI3mMqacYM*`PH{+j_jlxJbr#a3GD^+L_z5>m*7XSSBRT8U*=EsboeX&1i zj~LqzQ8teXn~RS6moR7)VVjUTsdvN`tWt$GVNtqU-LxD~FWRwCG3>OD6%j9*0piTdopY zp4*i}VLwvhc-!oHct?ICa#qbz)O4pu zHZ&fxqobq4VL)anpvQfEeHAeXl9Bz1L%7`%SBJsZ)tcpZCr-6aO=~*-4u8q>ITT9f z6MWC@Top@cq3HE>pS9U=eP4$sv-?#h|< z@n+Nue2*342vlTo(3&}P1z4}dXqR^S-Y@Mp>d`Y0sjD*I*~RA-9Pklywe;N*AAM3RE^lv;&r?!06%9X{FwS;>i+_){R$u@^Msp^|FBBw0k7`s4B5_`^ z`sw7!X_?(v>t|d~a(?&QcKtLK`DQTq#;fqJ_~11YN7nSNm!jn4i?nH9Ad6?$-q zCUF7xXMVw?R>eln#Y7+OTi2i`3R+Fh751P*j;?Jq2BblVa=}fmE2MtPyyIbO*1P-O z4hB3QGsEYnBaIAFNMB1;VT7@%)eKCQtXHxu?L(E6^ zVI~Z8fI6wUi1$6SOvbk98D%({!R$I>&qY}$HLij4a{_Mbmy}A$gCEPt%6=5Q3=|rv zX05bh5*6A`_qgRb9Ba9rnbzZNr6T~73tzabVQ4uzxbvZ87_pY*kQ-ZF*-NqQ74NpkFLWI%KV$4*;_KeaihmF*Nnw#uLV#rso z54iT$IT4DW#{~w0`aO4=9(cZ0>>Sw0ThD`*8ti&tDGQim5pC*^#C7wpqC3hz#8)~r z|H!(!ZYn`vpj?T{rmY?X25T>`ew`NX?$^EHND1!3CK8X?-ESqqH{&xT+L3f;jLD-r zpG;f?Vkf^3S;igNG_9Rs4vSoNc;D=mXKFfR$wh^O5$SMIJ|?-XM9aW^x!drk=wWI% zcBx%&Ip?UUMif;7fN@W#bFKCZz~h7h-&(EP5apykOA5o=xtBjwGI6Z!dhXW`tJ+wSK-cu3zz zQ=aQJ)(9`p!X1GX`}l)+5Oi3gNX65|wDt4;UxJ9C06@tb!jIDWog)QS?m~e~ifrep zbsoDWP8Jq!cTfkkGWy%Q?re2#F1jcxMREV8zqbE+!bt*RN^QhEA#rqiOhQ3w5_I*s ztK;s#Ndi@N2h8U0I|hcwwWLfLPgPTs{;HFO+63Eju|ul~1BcPa6{~_$PWMhqe;!Qt zZrBr+(Op4+@#aL-7kh+^e8EC&o6b>@s$43vD4P@a2PJxw_xRuu5gOBv0q%2T`P&;= zrXTB30+qr&Y@@^EdzIkqm*i2s>1GtEBMS%Sg+Iy`!qY&e=Ti=1I){bT zvs;F+^xw)*fv`;CDIhW32-%`+D7o=vzQ7IrDTyGtux-P6zQ4w4LH4t><;T>w8CJ;( zY&!(Lv|TM;Ms=ZQFlphIAvbu8wN*)}yvm4&I3m9&E@#aAtw38*75Rf2B?6`BN)cFI z9Q!+TlmepnKH;h5 z<4)q%;2;h)nku8Xp?TS!UJsiZ&CF~j9mW06Ay-S)Q|V^D1l-h#N9oYPT1!eWJ~Cox zqN(pbpMD>msj=a6doYyZZR!%zEb-RZ9g^fG*m1e5*7c&d3Ec{h-w3>fS9Vty7cp8N zoSC_jfTnk!eDTL57x&m17*(d1KBoEv3QQm-&41j+3PvDik`&IJN;iED1~ozNDWINP zykV3-UME&PyZ^aDOc=?As_XSx8DF1_E_)ifgL`b7r4jQADc+9CBm$on)6IhJPZpi7 z<}o6=??t-pnnnJdzaZSWcHeFc>@7fFv4WW1$96xjO+%hIpr;g&^Y{YMR7DjPHK-c& zRw68|*0}Xw?qyJZ|F+aq{_BH8ybN{sn@IQYzDEJ3@S9#RqEgW)0vIJT|MiYQUy266 zaeU&j_^-?(Pi2I?lpE=;84kG_FG{^=(O>FV-LHnzUm&UGahC_;GfS8a#Cm>wpJoin z&@A5wXko&}1^8OKH

      swRT&kk@O#x@U}tDKlH2`h3jvZ#?*>`r^BI>eSq_n9o-D zG;*t44Zo?N?{?qlEe!bZd%oB&SLkGAvoN40eO}cA#TQEn@C(1~zvL_0kRT=p?~E6X zsO%g@)#P--DI=$}TsAd_3bniZ3%VI<=Ou}1prrdP7Io!LCPjpNLm@I)zLqUU=qCll zs7%qy6DdeD>JcZ5GLjOHYV+Me$Vxp0!R&auB&suxKs!wHR3D@QuU-BXCv#LAjd%P7ih zm_AJ#CqOO1MbvrU$dtvNOT={~wyI4(yj|By_Juol-nW54{w@WFX)Qq6T(_KG8`ttu za)sYV?`vR)YJ&`Oss78F%}!A@Bcgz1-)S;)weG_iL7u`av&_Fj7uOYHrmR}S0t+{jQ;l4M9#g&(c5MLKj6YP&{ zTKUo|jGyWEm~ufRY{ulT(T)J@aBRRtD(Qv`f=c;XsKmv5{RB_tQ)m`=znDCXX(H%9 zw(EhAOsCc%%DeKg<|MIu`(zey(`!@UZ%$$LXgapR-34bN&$+r_S3c|0^x{x8J`y&aVA%u;r*- zyWcLFyKnWp5T(nOrTH2M=a9kuG(~mKiv={$i%qD!J*wirOK3x7r4g{RJcQo-sq=ff zN#*ET!OFyv`1^nq{3u`N{WJJ!Oy}`DV&duwi22UR&JIU)Q-CQXZx*J4PIkZko6IK1 zmxknXubz2#y>tTKKSoe8EY5aqFoZC8)SQ#@c9#Nrw;L}ZD{sRu?G#efecRqGz{Q0^ z*9~zE_H=e8BY{qNLr`^LIe`C=osyCgbjJ)r@*DrnADV9l$KMt7hPcIEW!nDb?OtGG z02%dMy*;R0+mQw3zoY&?PV6ZSP)iFQ2>BOHI!kVsy~n|q0^UmP5zoOG2@TW|=Ehh6 z6SOm`U07%R*{5V~5XJTh&rvt*8~yyCp*_5PQJk; zrq3Z?FJC9e0ZS6&>(#yhup5U(jt}-NZZCS+ipnQ1kTR!$>?vi=adL}39g|*CsYSE) zLcIT>48~}g<@%gYcl)3E5%%o$Vo7ud{NpwQ1wGCSL?R7`atdTR&wG(ch22as51S(B zFvscI&76EA$<-*IQ$P_-M#UIBDL8j@zujA0#2DYlNW9*gT;8lQ?g)Ar(L$!8uo){A zD%P#MEXx^#!OqL)e8MBpWcGP$N|%6Kt;b6Qywr9>#e7bolUQBB_hW+`641TyhmGgQ z@Mbf}aeUB|*{c#`bLRc`tBF<=EsD)(X&gmb+9-xVLozyQ9mjPxdJh&8g2xUm$14-O%7bCVW)I$!II- zwo2adh>y2?Sq245u>*Uh7uF^1a9}sI*(Z-g- zz}iny7)Iyq(Z;jND8DMoB>Fuu{*D=lhV=pogF<)&)>7MWg7Ul>e;i1vJhsLb1GPMxhv-!{OrZl1n z!*@bPXy)}p|NgdKisb{NmzuAW5|F0MWx$0c#ML15(Y&3+CYNg0IL|o2y24mRA|h?M zAGix$-3YqxAnY*=4F`nQ&F=%>%8s62yNevRC$MzQC-Kb-tJ25k-YAyseUWIya@230u;Fb_dd5F6uIK{cHAukjV;9G6) zaVE+<0SO8U-Z4PmrW1$w$c9K{V;7&}A>GiOc*vvL@X&C<>(w?*9ok68{gOzCwQz2b zxw%4#F1!<$fiuv3D%Q#;qhJ1Qz0HPhci;WHmxM$GztB)hH~)bT&dtyF7RFhdG?3Xc?+RVxKCwGMP2X)5m z&7pPwbMSD$g5M4>k#1QR0&}7+6Hi?K4dBjw+qqQ>J`R2oskf%j%AKB`z`T3tW9ha2 zZ9VP{g#E}B{gL^o@B~dk12?Fd1~*q0r6-(<2fy??5!S+&ZA&f!-rcgYRa{LvD(&VP z@8IjHF5t|$_qVs%Nq8hX}cRaHv<+K4St(a8AsH-(;`sO%m6VmfI^q%hUEC%52LV3D%U#FH6Z?n>)H9~6HW zQ>VH!s$q=~W2N>IjS?o+fnT#cEMxaie`$?Zl|x&M+kWR>xYsM!6f2#Fc#0VhtCYso zAj6!z?8>_Sf*};cRf7D1Zq}A^w;KDd60$s64w^TJYUM$PC|(7k=5yKEuux2z_5WQs zuAtCF(F7+Ap(X1?aoNe;OIzmuA$-1QhOnBk`dZReN|37R_^i3{io8Jn z)IK~s5FT9Y+g_?DD|bLn;_+HrwTk4(zVG}68!!rd;zg+S$C9d;vU4H*hF{=#p6b4T znm*gntCLpv^}!`cqMOzCKJ4f|*78i@AaJboZWnXafB9>^34VY6Mk{l5GOf1HrSSDJ zTc&Xdo|4V9W_%n4ap&xN#i^qXAtg$}uZNx~zIOD@x4bPEqWu7RJhqHJLuNC@E8#mm zPiKe!{hR#M2_b*cOs! zq$k7oE&bT+H@`WpV%LUC`gCpSK7iWlk<(30E5;Y69vE(+Au?~N6;=)K?H_1yQC>6P zJ;;Q;9*?%eOCny#ouh>GZ~Ov-FN1xU(k4s_jJi*>a*38Kl4mt)mbO$R1V9<=6ENnf zOq8rTiX{NF{geS{4xPp-QM1AyAi(<MLUoqhZdRNhhvF9>p`EFq37K%@#;Z< zv2^pTwi_$r+J_8}W{;1A?FXebA`%jGy&I~A7!F%^-W+`R;O951v}Dh_y)-m5bc*D; zf5L}W5~oay3lmhPn*X$V>I!EEHx_g=T81AW*Y%d$EgbN8w5;PQP&bU=MrkenY)`=| zT~OD*9Wv3}^`=+%`p>%yiSub0m^^`gd6O>bBcla(<_xkmjDbbDc14|Koo2at*C#ca z|N27K#vQ(tg{Xrv2@T0NWGt9)<9tOo#?v|8^-0J z`qT#uS>eGC=~dvK8bgL!f~b1Sazg=VsLQAEgR3DB-kb_nk~L{I6^#a z;Q!V6hm_2UCF%&_3sIxiHZ>Exvt~J0oFXMVPuF(j?5;o(XY2fMty$;U{Zm!w zYcXrWMCvN*!KhUf64LWdIjhCTe^+EhI`nsAyt-kiUmHp;BJ6xkCQpXjGHu`c;q1PH+ug+jnVD&Y(jkW-_#}_+`9MrdxRuK0Ta7nZJA4igMTA{6 zDjJzRhb-Og6@lK7H_Or;Q4yvs=rtMWSNHjhf$fY2Ev`W|{|I~@1_l;soE)eM(17&n z;^8H)WMV|t09$=&5s){3HhBVi54!I5W8>=C9j^*4t`+v=zK1hEX~_KU_10wUAT`Hk_=?_;Rk8d*aSE#`D4bBiU}30W>GTnt>TZSWZ&ChMuY zRs&L7nmW{_20tbD3P-~G90ETtXC`;949rACvVa}8n#Ja~aKUEX zD4ET)LGyXBs)1(HI}-;ILyq$5nA1w5icS44kM5ntbIMrpF6GiWEEF>G43yT9WqT|` z>VAGB%5)}e^gJ)5@r`~@xR-VFHQp(Fd;kH;SdQ3WCoH4L@^K_2C?8QKnh{#q*Y%t%;^Uk&QF%3i>TL0F{&Dz24c-ahWUgspBgDdvJ*!H;fTYP zPzOB9hawll!=;K5C-%k#YIDdbCC8^_7=o54`A#>Jqwp}6Is z=Wy#UwqfY#$R;$nSk6;Af~lmN38aCAg#WH%^fsu8%E8uG^?p~C;-3YE z)7Ynwv>J=q2A79XZyz$1hiV~XwLRng_T13<;74c{)AaaRrvCPCW%`$);FoIcE724 zc0E8Sf_CH8as*MpOOJZty^p}VvR$rKRzE!3lz4P0;Zt{MRor#!(_ton=V-Z0>6ZadS}i=LmT!c=Bm}*A9nFY`HQCsaoGa=Mz@br7Ylprxf}L3rP@;| z92%j$-oj?TBTzx%pb^f4I-$;EsX_AEBV+g6jVogx>XL)6%ma$27^ukYx?>oT=kG}+ zw_>E|*?)O!-WG+>Mn!z7R#mgQ67cY8p@C(9LC)0N!$pMOF2{MJB?c@zf$QYq@PY7e zoxxZB-S;=~!F2(LHRI<`{m^F$>1)xMtyOm|YJr#L;5Rl+dcy1^d8DT0BlWMZW6mFF z;Z@82>D?HZpzUcyYM+Q-rgZv$iimXER9TImM)?fnIVAv*$Y(&;VfJ(o4DAoR>@>*C z732LO#8<&G$yScv;0jr#2tJ+ex^{xTQW$INr;pK4#^8`Wuo5;jG`#T<1&*d4%z{24JPj>f<-3XcjTFxxXK|zr6X^0q>{7VkW^|c4 ztkcNA9+$sXgxs+3o8j4a)t7&cKRM+KJ^K@0{a;6CXAX0t=haTOnZ6+`m@P6FJDER< zA%XS9k|*M3Za?;r6T7YNX|AtxW8*^{CTsyi67a46$tiA5kKmw2(RA@Z_;rDPC&!5U zve68cqQwVudv5rw+BRRlT&arj`TFU5%}iB(4~3$c3_4BX>Ehjddj%w^AYJ{Vwe9`Cl2B}$|Hf)d+ zYyH1T78d)fU89C>F`6GNa8G0&I>9#s*FK`KR)71HnGzVg{H4=a*#15I;OZQ;SFl5i z_UbauB*kerZKbRc$y@bKeqFUGj4ky`(=8H(rP4dmJPxp$=t&bBSU{^k!SaJynZ}b{ zuqzNBsy<)<{n$YLeVbp}N z-syo~Y2}wBRNMv})BeVV)*WaJ39(`6!@YCuz*VvBzJBRGy?>J2@Y_w*cE7HK&1K_e z!ADig6FgDTcB#j~#*7iQ!j0FoS~*!pLR3;ml4AZPrz6IgR_I$tRzozSSFIa=Q!$UM zhI!g`q&u?*(H8!*`R8phJwF(7EN{~6B1es5)^T^u_7u`%z&NcmP&h5|bo4kYtr{hk zl_|#c&F4l&>|o%QC)CY^l2wyub1CW18t0wbLPk>+$jNErzcp~}xE!8}z}X>?@^8{8 zBV?#{k@T$|4xJEne~`v3kQjLw8#~ftfAB@G)>xNO=V|ptHTX3;ks;4XQll(1(1gp# z2XRPKk3BE&^xT`Cp1!Yj(C7E-YS+U({pss^ZEL{xqS7HxiA^<4g|3q~U4t)LX&vYH z1^as|Y9!8W=GQ+8oETr~$bq_FqB$>snb4^P!mJypoTM7Sc{i<=VV?1F@%gDNH>O*d zsSd%elwr7A*sH~u9oiWDDgm^!EWD?{>WDY-se1Eu*)-Vx8*7BYe7It$a%zL^!;+Xxf)k-Wg%Jv(r~e|s+`H8%J12}n z%C1zu!oNiWp^tAZQpG0Lw>Egr2AjOI^2ztgu-J|n7$9V?zqsRk6}!K)_~+>U zzj7I%wZasKT$#dS^V=h5qltuehzS1;GAqnsVQb6zr`!c*RVa#>m`M6_9>Xwy{TeoF z9jN#_%pVaMC3nO5uJnH6n?P23;6tb~JH^qZTIz*g`1Q1Skc3{AH{C&F#27?P;u|d* zy_s$$k2nXjmUGq5S>jS!1vTX2sKAM;{?I0my{O1jY?f-yi(ymcW98m?ajDEP7&4#w z(hp?GK1okP^2M~gg)4Xa5&o{PXN%j38a{|Ym)(#&WA=wKLa}Jy@YzR-;9b3>)ww~3 z@xhOHS9?z%8}%)U1AIg+UNKU}t%3KISX4eb>WvFQj1Nv$Gl zEs1?ZpBv?(kKXw)_7@%lv@-79N+Vk~FPq@8cDLZ&{iYH-3Giadv`5UIW*?^VL<6?} z9!os-OSCPz_mi_(U|67mzP|e)+?CK1d7biLzGqEjk3FmcOAn@tWzl6!u?px<@66Kb z$6vs3dhll1>{bn0D}Ss~dg{ekwaZ04i@e*byKw7%?$73aoCmZ`ZfN8bQoKIS38;dz zWw~1p=y`j$g&&Mz!F0t`6NI+EQNaJ-c~6eLqYkc)%KcGTuQX`ccODPcOf}wDrR6z| zpYEBNr{J&|Z^nD_t?X~qf%;6-VUtYAQQR<9e4)3B_(R6-YHcl;V}d|0^!fE_<&hTM z;^i6XKMT)g`wH`$!(WJvS5F$5ny5&`G313m;3gYq_IjpBV3&lh-jf!XBmLo``d#^p zo~aygdm}Qu6BXyX+xwco;SCELBmMK-B76FKcFimsU{PE$m#n62YZKNXsWvPUa@!hr zeLKD!PBQQg(5;<^6Tf~6h?YSm7GkQ8im4mb$=ZJfAJg|&X`W_pQ&*Ah-6VFEgnn4I zt*dDgK2)bP8;30nj6jrU)nQ zF+Hc^Xq54cBy8q@+*SH!t=ZLJsbm8arVnHB9|0E44T2V!%a2|Uo$hACe&d6bCE5X- zB!Z8w<1uo!b3 zQ|qe<=@4nke#tg;b+;sy?~Q<_#dg%>GX|A{!1U^9{p}rBmv|oI1~CN%^kjS*Zq%Se zj3CD5{{6$;xj!L$j$NaWT<~Yi?H?mNA6ru0)Lixn;Tz40Dyy5se>!dyTRT=m#)>c0 zCAi7NW!+Fpg?ee}2}D=jJR6P+bWB{{Rwx z0P?w64!6AyF!r+HrFe0^4&sawFjw}UW0r;>hL56hGb&EBz@dbXDypQ>n3PHTZ5(k^wG9eZ{dyNjsO;;P?RnXY%Ka1-xO?A+s0OX-jjci zto-S{I}6#lw%OzR|Kw(<&@d-2UvwErcJfA-COc>Ah|_<=^jab7^p= zLuUF@+O?TK-#*Y1*s9<8WSvHS=%|>+lw`JM?k~qV-wt(D?z57Phu3hX9d_jP@d0_; z>Q~Pg@IsPye82L~{@?24%X0)$-zxb$_ENX>?hiEP)FJx@!!sA6xnm65A2K*|Q6r|# zBvsQ?ynacDuJ1#z1=T6Bs{viH90FSDkhLaISIe@`7jl-KYwxk|&%D55;Dv1gVjZ6)m2?VIa zx%H@`9KAABNvtwOIN__kdMjlBrf30BTx1@I892j^)fRq zp)sk;@V&W%!)&vohV(vv`zXxt6&47!W^Wf#-5_It`SV4_2}6v3EahG~(F6}6JSt#9 zxh@fdIR(#gJb?(-f?{)YaS(S@`*5;SQ>v6FLryLdI-G9WAYzhuX30sE#Ii_+`4Arr zZB9ic{@biChD-{l7Nh-T4@P%E6kAggc{x_7-hx)GHA$Oz`r8SnCZ;V34W0`vpFDS) zCyis~Q1LB69*xy3KlcB%Q>4fMDInHVjwxA#Xv7i&5kSRZYr+vjVrz(;y&R>eIf^8S z!Yjz5?SrC6t?#|OdZxf4mgk)_5olm4_xKnUF zh|0pSi;bCOpD7;aD^A%<>2+se(aLD0lLM}`8Wje@4HNsoVQR`$u&*KuwPNB`68s3n zlbIU*sSe|GCu+bhK|ab$KI%>$@mG4OGNb-r%F|s&rZn~aR+{K1%}}oWkWceo;sn1x zOfH0lZ=)1zmoodLW{pK~8#_AEja^mlHz{`-_mwdheM>NRA9VZDT&jmaB}3Au6_ChP zI{P#DMdD5Fx8Tdv=bMt|;k_^5uh6IN*QNFLhoJlAAd}kpuPWE+8^pnvh?!IAL2r7H za>Ww-%$-fK-j}E@!f*B&tkNz*1=MmJ~;xmc$(A661yyBPvZTkfS7M zu;nhK$8OT%_tZDD1!5#yY~?|8o!bAEE9_p}T|2ys_K3T0+U1ndHv%w*t3R@?_6;|^ zm$JEG6!?wWwEf;B_y?d{{}B_xu(aEQH$qqbZ-g>Sz{kn3ntSC}*N&%r_-9JiDHvSc zHPFicGK#td%Z)SHrc&~&sQ%6=r9i7Kv4U=<6I6lML0~HP@Oi{koTFp#xBTuXV76h(RP_8cyD8igbC3?qdR=ep zm%Z@N#e)7^a)E|akxik|OT0FV5j4Jam+2JItN!^gHAYG>;%0}GF_CP{W?6B|P?gdM zZx@I+AxoC`D&l%m?BKAu7= z?xaN&S5N2&J)Sye(j0N_uCwoO27-E>zcP@vj4@*)Hs1hr)Rb`v3fJJF+!$~)mz{>Jgi4Ynu5t1wR~-f)m=qy)?X20|klov;fqe1A@^E|Wcdqi~Jq`p-&l-DK zdu1C2O(9CR?@D4lV7y|iG|GNz!W1mj+#)bV z#*DqYCJ%fiyEGdtzRd<+LD;Pro6k8?7Kpz3P}Urt}dlZ>c!_C2nG| z`SEwc-h^qSG6x#`4+5`{WTP|Y4K0MS?)NVfY^SXxqM5pkZ5aL> zVoT2OOaZlZ|INj=ruT~`)t|i`s+$z6d8Fm7i&@zke=Qm6>3!C_|9~|;Ha5qs^yS}e zHpg7Qv=7)WCD?uHNiDt-n12f2mkv>oVzApWZrhNw0RaqtJV+UWI9L5H-bV&9ezmAd z_3=lM?{quaWqj!uw9D7G|8|cemu?A*`MSL|tmRYBeZ72!e=VM^4*NNxQ@{PzkcP5B59P#eYj)2 zQ2I}u8;mFGPna6RI(PpMWkH(0lr@bwJp)R<9+=Quqf5s`0cG zm)Fs}TWuC|)Lcptl~{;SFjK{6syI}XY+SY}wt&r3vp7SE`EW-*Npp5*37}n;#DqYA z(kEKTqdd9Zj1;iEQiGjEbI3ZuS;n%$Zr$%y8uNbcqhyU_IbN{Y?1Jc|1sBD;2+lYg6n`V7(*ER7yK9e7yK9e_mKkOT9?tC#}E=;XEqK8 zI|W@vu~VGRK*8+I=`Jm)ZZ7e3W8Kl>`d(Nrscv$)OKFDxctR`JhFVda-o$3hEX1K0 zB&}AFw-x7`kw+*{9|FIk(r_6nuz+hKrQdTS$McWo$ue*9Lpw$yF9Vco20I-UM z^UT)T{JlmmNsgmmy&>dW{m|Gsb<>~k341~|}%4!)?S3rBH;`Wx# zLA%4HR;wwB24b|=^k$f<%&xYM{)v*ZO1WI&bUGS3h5?g`n0jY%WqFl{vsdUTXTFwC zlQW5hbWD~ZA)iQBVhBW5!AvEh!4x?co6n>b5_&V|H4Gm5>lpaS18LiwrND%l7O(X$ zck=>kvk0`nJIV#Yx?3k+Xs^*(0%DZLWJuA-{efY4C{C#AOsEvR^`J?3X`%#sBLb)7%ID9fyCxI~Tlwr|%jDZ%WWYxH7pnSU8=DH4HwI_orfD9jo?2a6x+K?FlAH<#Ga7$kv=XXtm*lWXJqNM(^0eO`pg$jEM)|5ih zM<(?0tGszoXk4Ww!`CCq3c8FQz?3dH2MhiS{tNyK{tNyKFc40zu@G*Mhj0_dLv|iB zdi5Ti$7Cp23&BV+gxp6Dgouq{?n_GkkT`1}5FkOa5(l#8kJ2!>zGTX2rIrk&+aAT! zoDC-1Bx6O$#EP&C1uD^Gni5#vCh%5=(`9#-2%^*GEVVg`t)k6pwLvvBFa_Q$29t71 zsWu&ikU!rr`o_39PWlr@h!>-r7$<|4*Z$kgks9$IjvD>&>F ziU?4}rxaMyWE84Va_LGgu7FJ{VibCmRRVs4DvkNbpAROfF7yT z;gU&sfClAEEuga9;iC8So&v@mbQV9riPZ{5{#h>l3b)}`-)R$@dWi5wGvzF+bG1zJ zenvu9%Y@iCA!Q>Bx{PjT9bEj-Hqd9Ra#FP=WNq<=g{mttR5^OahOs$u>pjlTFTfx5 z0G{I9+xfY-3jy3AoZkHWy8zl(XJ+3nyn7$09WE{|!9?i&`^7-*5Oy^^`xbT^s2xIQ zq00fZ7|$=f3-p*-fMFBRG4mEq@;Hwf*kNGD%*+WGGjEUkbLJx(Gw|Tr!oU5q z4hWmud|sgDWthPZb!Lfh6b3e3!A9mX>2k&_sf-dq)L9l>4H`?gk-M<)iFqj19x0_N z3B*2ypn(9^8Vd=N}%l!QGFK%fQS?P-?qQ}jwgLVqm0k;Gr~Lq66hfeW15*u&;lps>Y*WkmRPEtp_GF zI@|0ueZ}>IK!o3X`5DWL6EpLF`5*oq=IQM{BW1O%mCZwdf&hd?Oudq?XT{?D(+Y_+8J(u!5{uZxLN;H+;;a(*9CQY9^`mTWh1;;+vPpa2^V33bzOV3wT-lq(+xtdad&kRKN3AD; z36Ic1xCGOT_aFG$%0I|@{JX-)UlxS@?YaV$pB6>_e=;7Gb~K`C#L_ks2>2sDHa-== zlbo2GnV6ah;10(orr;z4I8hrJn+zb&z`SZ`WMUx@Q^}>}sWVKs0yy)7sWWtWF>sUn z<3DCb$Gu}_DR5&3BWpmeBHY~J(a8Yfhcsp;12SfC2cfgWW0Ok(9W$eW9Wzsbe$I>s z@;S5UKW07zYRpXFF%ys-!XpbFTzeQZV;fos{bL9ln_3krBTAnwWz9zEvkjy)u^?et zqcs<(sN_6zM5Z~th*T)`3YF;~BBoB9%P3CCC|L-D#=y;`WhhReXES945r}+uaH$#I z5gQSA{?o5b7PS8>-~1dC9-Eq&aqg3^bb3OiGG6)SCyKQ_zJ34Z&zC6H9&-L#Rz{xH zQJR*V`SqXvW!TddSK zlu?)+Hqmx4;-bhVmaC$wYMX1@hg|jj4o`n&^FT%OpsTD-$s#Qo1y`R#)K)`fSxI(Q z<}d&HufoG#&n$eXtZn#{KmNB#NlB4!o?SZoy+NmL>mAFdJVjC>3Pvo+QXwG3vN5ob zR6r#a(iut?Mwe*?1-+*MPcwLw>6ag9fIup>86InJkJQWcfJ5GTiJ+jMdNryC#9CKx z(&>S?NFQ^|*HZV3-|I0v1P#BQZfygV+Xjjgb+%Tmf?3Uy09bJ7j zUDJMuHRf!dC}|pUSGB+bUw@i`aB2D9hBZ=f;L7r5KF99K@Ijm^}(^F6?k2a6kyVf*l5M%)C8_F*ETIK4*^c zn0Y5XXBPJigfm;YjKXwb?F@kMDT{I%BNA+g&SMHRtl2`VgDRt5mr(|%9Iy~U_S&;P!>s^6Qo_N3d!OE=H8hlhY!|L~iH)PWaNuWY=Vd zSiN>tau*ohYkdCwQev)nhpzs*vKDrNg`>T>F$or!cFpzl89WK3I$BfOGAb-17V8-= zX&GF9J!lgh@?gM2Z92pBR5W)@vY9S2#m>HWm-p`q1 z{}KT`XRw7Z5VvLDK)B}^LMijI%E%RJS*-~sKx|ND)Gs9?8D!&~^^~z z#Xxv{9T0{*jEju7I!eP|gx|k%J1!zFF*fIjav9AfYqKmhd}TNAUfyqB)f#I9V=Yc9ViF74Ts5mPvXYPw1$Xdh zm1Fjkx{&Z`Q<<6NAV6;%GD!=|PZd^rpCUjp6O51XR8G+YkZX@_sO3 z!cKfpw?c^$83IybGDJbSj8$hK3`Pptn|ypq?>Vo zEre@SMt7Wc0{ck@Erebj5mnG-bcf0M%v@%X#j@`Ug<|AmF(yfLmPfvdynFFRVWA3`@ZQzi6l)83 zQc8`E!1LyVl591zT8ovox)SB$Ptgn%ED{6dO2S$Q^w!6-=VO`gBbmpUyqR^{MB65| zL3USn(`Q`r*Drw|LXMJ7%r#{y*;EC`+ADwwJ#A7#`NqMrnr5R=1wdFp*STtYnz|?W z%3ihD(lIozQmGz3dNe;j|5yLKxj6upI zK}ruIDIAVI1?pCq36Ynk#C|X`wOX^u%y{XGv+MN8haVPj0Id;ubMO)(B9kKt{H7-j zMw((osF$Q}1&j2ch7E!1kRLB&B^eQRYlil;6)JrNb^<$Bqcnza2T?PFfpodc;Zo~O zG|Smp-VUpbCI)tbbd|Mctg znw*->El{?1bit3MuYUlqf?vI>xV)pYdundw{jWv z%R@-)z|@0Y%$s4JK?YSu{X}JgmtrRtBt9kIY>-0i_Q}sM-%W{6i+mXgyvGVowZ;U? zVNYMnD56Xw zB~J8@uT!c`s9r}Xm+O5hoj%1B9Gqre)*ZnyX+DJ#sFbP9Nd+WI3@D`pOe&-c_14Pj zhStvh%9f$xx-Q0EkxzNlVslU5U|x1QK`~BuiBhTj7ysSZ|y#_~XF6p7{)jTgC8yAI>A|M+V4%IsaZ>F#fP@}Wp5&Po7^N{n`9^bqV z!x-Q&;zh*W3)k*jvfZe`)@Eq2LJqv@iH-EbL`td8Z+H~i__4`*tOcwZM zS>fon&R(%`){3fnot|>?HqljCSg3w-`#wR7nW@?7u}P0_-H&|{R#IA3)jCw&Iq9nJ z7t32HYe{KEovV4AKXpKemE4+|TQhTt?9O5+@85g*Aw8=Qeg&f44K-yI)%iv0I!~kC zNG>ca>=_7Q)$fWT%Q~8T7DAXzynFv1if@PS-=i9=kcq54OHhLv_~r+&A>PDiS$e<8 zPJDI=sE6f=$r;~7ZE**iyxZ)!%kp<{dQ;PL==*j%@lA-gI4+*3&Ay#SZQcc-zj!W= zCu;lZ@A4*Z=NHzP0`}bBchWG!llukfsQc_MK6AJo*g^>RWdHqzovaa++0Xs;P41^= z(3lB8f8nA@;ahLtE})us0qE~M9y4C|zomVSXP<=-cI*4q?76?tL0G^sgt+hf>@U6x zQ!^_sp7wu#KVVUr$(aE3cll8xJ!fX|R{QNQJQm))_gM(No9wT@c+9}VArSpt+&>U* zpNEjx6$J&YUdzT(k_uV~caoNk%aBn4GU-TZCpbGvTd{{5!#ki*tcY&}5F^9e;S=r= z%1$A9%E4rsWUM9&a*bm+TL3`<>;7Y>yMqs4WAc<_vWzV`E#r=4JI1 zukHwZ#X=@VlTV?9*62y4fy>vTe1Is%PsOLo*~9|M!nzuoJ6gMkt7|+8wx)n-Xzm;$ z2un;G(qaD=~knVOQ+($?wr^ygS=lzfBDSwc{2Q+mP? z4QLTP zfnsdHgs&dGfEreCzIgB~>UFfuT@fFZ0MJM?VoPhsz{q4pX+=>+u9k2V6=~o!3`V-N zqPD))lOC6%(jt8wK@iK!tKeryF$mXPr8VxB3I5c%jN%E0r@k>hDf8|8yhdlPs;R@P zs;X;;M@9h=VJPC60VmkYD{B}|tgNcto69Jy`cxL>YVk-LEaAxn`s3}VT0STJ`JQ_# zDZ|0MN)kzjW#5DY=7rOW=;Q*Xx>oKrW*@ z1j3-p=$cD`y##|mxDyLuMxn(Us&pWU>6w+gu(EbdGuFEng<}Oq@)Y0w4OJNrXvpae zgxaSC>%2RYX z8jYlpz6(+HeWbQyj4tcS zC2ETpPaak0@(k8@j@5OH5yc(31foaUUM&b~)3r-yNE{M`ABs;kKsCwOp5A?w9G}M9 z+)&9`T`^%XfNi|!25ftHBQ!lFi{>4VZ{LrLhnE=O2&2Pdpd~a&OUig0 z^1x_jG#V2i+`TKeQxehu2m$keEn$ZQax`T*(G?RO8}TxNvpQ+c4m*jBh!dUVaP;`d zgvz?+)`8jHvA3Na-O;b34TM!8*QUoORn|5)4a~MQw@1H$I+1#PID*O^eB#I zcm@iKKB?tZXf4U@)}9aT0k=#@vW4FX6|YdbA3CaxC^-bS7Q$yz5uH#-TNoSTsL7@3 zv&_|5mYQr!ZKk;zz)#NA%h`GvTc0h}!`ghZ7HH5U*4pjP^#evqzIU2{kk=bYgPDtd z9rYySAuG6GT)}5%TJE*)&rysG81Lfe-xU?9f#2?2ysp=i5icUneezZ0t4P6K8umOa zJvF12idz&@cR03ph(NOG*;h<9Y^J)l@%5vZqN_rsGE!2~Y2AWB)8uhh%0>U)l*gwW_SD&CDsH7%P0W+FTP8@TapiHM2maHDN6o(dL3b z{IIOnnyaeoKCJ%ZA6S*qr2_)O6C^4Vh#em1v=d8yll#Tv41_^ZnE;HLps36-0>V|I zG9LmpW{$t8j1)uI+|p*U&_1=m9Y|{u!N57MsEp=g7nQ+%XLvizGNEji&H)%hY2ecG zO{R5vwn)l?7A*%R#}asE?f9KtftpxIVycepltC>h`k z&CF@~9U0B6T4TO@@y5d&cc0&T3fG^Y1YkLUG^l*@!s8g;A(v@y{&ex-jnJ@XVK6p0t26pdG%WKr zw@yz2I)+}l3Fruy^y+u#GZRufo0_U?8tR+cQ7oxKB}+{&5$(Wx^?kF=4NdyI{O*xi zzF~s*i~(N>^<&ohF-Oz5?bu6j`1cXC@Nld@(^lPU;sM%%Oi4y{Z0iE2>2X>-% zJXJ%*c-ScnBa zq4@h!9?m<6LvYxJ9!ZH1n0$kZAWaGjKJLX;J06bc>CAa>0~aeyRG zu_7$!^`xX3BdLtCHWMJF+C-qBSzfI+%4Hh(YN1eLqlqcVQ)rMXGTN;X`5wczB4DRd zX;3KiaGe?64wsasgwCEJPiud5$5_wMbWKfDb4&N&BOqSN~W|wWnoZ2I-6X zffipse*BXV?msd8hjq#5*R1-mQU3aaun?X&AUvL~T<;fyKp3*-F;DGaJPTvR|>hof8}^?~o=#R!N^d zAli~XApCeOr9gxCAHBSN_i<`QUQ}%Ixr;Xn}nl$t$b9MA`&v>+`JC0N*mpFXCF$Tip=rXztgdcBW`hbp^ zz$O_#ra*XbVy0FK8I|T(%sQo$Rl7QsA(TMc zSvj&xS8ua|6P86sX-azDtve5a_uy(LrRF?*@;W*$6%g^o>!=5hU&$0YwUJk7%r9O= z!K%2#bk6F|&XwN^c^I3J4qyqJ06H2iY*=K%qo;3PhsQ~3_`-3xj9R@ntPZ=32FldD zyY%$tL&|gljInDvCCTXm^TsmuPcZtu~fLCU?`8cl1H5Qb*(!Xf!$t{<`ilvPvWtNyz93!Y8M++!DsB(M*{vG%C`9&OnrwRTY<1z(up$ z-K7<^j*{xqss@U8lC0fXQths8DXs5uH6ce(YrPln1kb2YKgN2-YdXe?E1T?)tpcumOJpkeUoUcA=3t_-rMguuf3t%3?poQ?5 zS_tPq1YJgh7Q(%ZnE(S}AoCEu-y;xCtg#Tz`dJ98JgsjsNfU9rY!rb}fFy;G&?mR= zK2Au^eEjTF zd1UVbbTK2-2amVK3Jub>%*rOqxe!hz5ORX^#p~#(*c4bW7?H75Z=x?;zNI(P=Pq6c z2!yXUZr}g;+*P%Xh>S_PdHcSBw9C{MrP^pPGv_bel&cIya@{At|28LIAy*lHI(tQ? zGyucr7pX0j_2H9OQL)Le^P^2LfZu~ip|kuELjIw-j3RGOjTu`(_pL6wRai1Sb4d_AH;&NE)sF;U;vE0#4>)iqZ%4+;$v))NPWLqQ-60%71(Mo)x= z@aQJ@OWXeY;LR-ZA?Px?*S8Wu3t=F~OyHg~IEFBgDx>cMVIiDf6GPb8_A-OaQ==%a zZRIFVN;Y=0gezf@33u;5tml64z z5=Re&IK{}3L-^r1Y{PH-m=9XG4yPs$q5o?vrP_p_uK4W(a4+y4em{kP&_tD0)-|?t z=Bj9uR0)mcN~6)tSSaMGU?CW-fns=Pb=yc;>sWE~SaItVP@Jn}sp z<2+-5fWddm-+@Gk-#xA3t#0_gtWV1`~r#j;GN==m3ho|LBEiFM%51?IMN#^0hkzEn*;q znwYrMi0DLEP-;w23D-IF;fu(aWMJl-ArIj0!JUHZU_>ZLi*|QuO^aAsU)nTiYo6ljCxq%Adu4NRRimr2(OS{QdqzrH z#>$$9C3R2)c$^2xgo;QNW}>2Xq^);sw^lynU)qQu^Z1(wPoT@_()K_Yj3GQ8K=|PV zSqP6PhH&BiyWy#c(dmhiO$u5yHPJUbGCMaP=rI$FAq)cH(Tj-a-ER^RRw&p0c;+%T8-DfenT+fr zAkxzZgg8XgXkpJ?ydIyFVK6fawejMW+esdqU`WUV-N~j(B_}R-y4uH^d^gw7dGb)Yw2t{QN z(@?3=S@s`8c(8$X`cnmjxJTNJZZ3YZ0VrxDFInKmhURt)>r9uCdINy~l4M1jtE{%Q ztYy^EJn3#hWlHmLNQI&9B zll-@ZVTKCV`-Q~-83=B4z)M#{vhx%GhdKEQg0?<-`Z_CD4toH$fi?g(A)!wIept?)lc#{4L*ug-u0tEx z7MArU2EXQCohgp>m!CPgOh~b!T4#CsBK*$%r*O5Q%lO)cMI~tT1aEc1l}yVlfCb>^ zi0CAeu_dMD-njkXO++L_NXMe1aful+r5-LOG($$l1BczXK=MyKYd=a=5TTbi1kAD?+QJU-LV&{$sIS<^n++B;g?Io8@U zQqevRn}`iw$q+i;IhErdj?qi_3qWH=K$EfiMV!A2|?qjP!pgkGY^uKC4dL zVDPIF;dk-7q6lM!>)pWsVc_Dyj;qUP5D0@nxE~;#kbp2ei2+t<;!xdX%e8tu^Bu?yw9S zDy7Y(dP|X9kEQ(AtkvoXsUAsaz_Pa<A6G-+>|ur^Kr7M8Y7I4hgl zJG#cE7sjXF0`ok$e~;t1x9>g-jn52^PghhRy_tr#zPgT4N7D(&CVw1&(0_KdCjH=Y< zROa{q;ZzU^kEMmMuAwcykS#FS^L1ie0b8WE-U@k8q|n1eA7?SfvYA+N(FRrS>Rdh`isk(OC-Bjmx|`_FFQeWW#zd4(z{sG@=yD5e6R%07KZDQ#t>qc(Zh(~JzDhr*erz55v`uwVN047 z>l<4%Cf;3MU(+>J+BR9&Ia<@))7aiu+R$6oGGJnh9j=m*31Gk3*|+a(HZe3b)L<~q zFMb#pnH-;`(Td8PG9Vn?3J52s z$Hylcn%iNHo{^)-D$uD+B0-A)KLCV+=tkx~BgG0%rN)$%D+A=i@pv#(XL-l#@Yq{- z9s=-KC_$qq2-*tmO#}~(FJ8Hwldn{&P4E@dAj-CEq*u$Uum|sh#{&BSxa!b>I1(YQ zmGl~&5YQ47B3_1f!091!V?@u@EWRC!8D3nPI#VW;iONB=RnjB0d23*q5*N6K=!le{DD zlFFu*4l`F$*FA~kVcfOlHO)>}3H+cKM&LNnXriiW>P9E$MkZ#5#?W7Jx4T%SQo|H$ zV03D9>TOTopuMV%ZdDC|yb8cOw?GL6YMk!U zjO?O@#%AC~xk^7jzgE?7KNiCEQ#-t8e+%K>W`9dtPSn;McMpev)0@UBqg(E3?b>yX zan06>k=yKKX@leX=OJ9$Yk&Q>nqLQm8yP&1nlA6Qzbj*Ad2+x1{w@RI z%+~$I-qaWfFYW*c-z_XIt-Hg!@2{6dHybm1>+c#MT>7xb`}<*4s*(+Wa1Y~oqcO9u z{`$tu*y=H}xBmK#nVI!35%$#I6(IB~)2@2t?!Lbt{Kw3KZ-@KrufNLZKKr}m4}^iv zLpU`)KH1dV{`_@pSakBuJC73*(|D`<#_b1M0|iV7Tx2HsjO@a@_n$>XC*8UCRBvKP zNvM$or%8 za3`Y+4}gZ|_Wr@qs-~V2Pd6nLTkwk~^y-SkG1$=xGuU7j5;efre z#o9O-1j3yFA)Z$O=_%F5-oF0Yx`w$qH1n95nN3Q~g@vl>T80yOs{{V_l~+{5LU&Iu zwm$96Lin4)h^p?^qp=W9e_R&A#l@w-C8l5UP1Inwfpr-T;2jCP%jgcq44%gV5PqfD z8VJ2Hgzw)i9rrO4U<+Yj$IP*}5Khld9b*e2vZNizbLQQL0OdZ}GY~FY2v-9k&O->8 zI5s}f)Y_pjix$?ImQ@G@NU@Ilk6y$kq`{{~PXf!GyLclfU&&fsx9&U)k4nJl*Hs$x za$SRE7$L`ywgGn7cSofbOgM-bTz~*+1&gIN_TjnO6>MCLWG6Z zLb+D1GSDchjXmgtt`RKx7=X}Ba#?Z$rAu&vA?2JnV)Gy-2b{J15a{>t8ObNMw9ZzxB6{pQE1*GSu$5{gNnv5nKiHMmJx5eD zI$|fyP}URLIyf?JD{oekC9dLf>CAboS%vkzc&n?Vw4%DYW@v00m=J*Q?fVbBVD$pw z$mH1cd}~{WwW`b7_>o%(cbb?UPt@Ec-~XCKsY_S-`_7D&#(zpLYJjYP@8@Acm5qb z7T`CBJrM%ZU-*Q*!LZqXf2HHT$1k3w2SWh*i;oL;`h#rkyV(Ip8F~+hFh0V zPOCq5h6qXS^6*p1v#O87LI@)#Pf2R@6wL_BF`v9Npsz4xnc|GwbT z)v=}<2BY%CY7~Uys*wWF(dXX8sV~;#sXH|mLb$xxm4M+L@FbCH1jzxL_ho7KE#RAi z-=QE;77Obqg0+or_L`S92q{TkGO`^_vQRA3we>y4(A(JD?rH0gIYqWaH znlQqh1L5zAB1_vFea1=ns}Iu!C_WETm;=o(pb0LH`+(U4Zs40&%;(d%?QwxUV24n#>2a5L;+x!Tdfa#KuqzkLW8jcd zpys~%3twSA~5S@ArRyVHK=LV`kYxxWE4T z90$-_iIq+Eaewhn@Pi8<0tkh0C{KGAG#Fg>v2PyN^RcpU9N@HJ}B{D)q6`t~jbZ5L!KP z`pts`N79@^$7B{5bOz+|r;`+7ae6(N-|HovSSkJb+Ik!_h80<{whGST4GZ3S)BtS` z`-D|!KSl~FHMkyW-jc9N*Ny3D-6n@0LrBshJWL)x3w!o5GBG6^9xn>D>G`WDoW;aK2^12zvSKk?xW9!m z9o~=?9PvpRVUY>&{8^=Dw9ZzKGiM^Cv@kxy8a$L_3jLjXPq75<;s5;Ma1!M6TPB>K z%d0$|rq1ThLDpHDqY*t#?MjP_6H97pJk9Mr1EW(zlkYGdEWx*TR6wEl^BMOj;;zc6Lq> zoeGscJ6Aq1Fa&KBD#OU=SYKa%T4n*<)-|thgD#_|-DUJc&}DSrE~BY|cNzU~5Mw6r zqB4PZ8T}A+89kmZqk$MRfmIpxSqLYmW=cxSFJ1{rPRqS}|JluuhZJkS8S+34GeT1M z@yunF)|{4^f92Yp_{8)VucKs215BYz78*X48uR%}Hy=KE6%n2I{B;z`*q*%zPtC}K znc20Q_W%y%DkCenZrpwVh34$*Cu(S_ed;o{2Z3-)eMr_w@TmnBxk8Vp!cdH629ONs z3nL;-f7jIG8XO-51*T=vS8qL*TERYquojw0Eomt`C2E5kU^}+-mBnqOJeIzC2A_{F z0RVbop)pH*cwE9AalcmiU9bN6U=yg1YJ3(^FBDPR#?G;LbJd}$jIzioO9|&L-bhZ% zDN^VzUb!8ckOt3_Lb;X~-N1VZ$(is}kty|nh>}hfoFvkfFK8KEZiqFc$9rp#(>PL!hHb1utOl z==FwQ=!kZ6Phgzwv#GViSyEHlG+0{S-Q3aF(LYhvJk-`d)ipfZH9GIj7`iy>F(*PuJwpjogXa??o(y-?c4e0mbO_*x?pU40vm3d|a^V&%U2Zv|p<~{^aRA!S?+P|pGI=A#bV&YoO}f*AVhrj zGQvdiuz6Ty{H;5W9!u0y`f-Ungxpu41^qkp`(b%Jl0bhS*Dw@-i z3t<4$PIxVZ!90W;0^!o`fbam)PRxG@<{>;j7Q&A>?Zk1g5Ke5Ec0v-BnQU%pgJ~s9 zo+!o&1!l$!D^d)P(+^S%^7Euw5gM>kDnfsO2lxt=u!`YqQetr{cDsU4-s&=wJaFcf z>vv&}MN;b~)&v&>!jDi?2ByUt6PH#S^KH2}=Z5;8DBH(D6A)=W^x0toT@7llH9 z``p!64_`36Gc_^e)|tydAOILI?ma~oGp#xF@~sEg@4kHaLaVdToIUzY^o^e`G?mp&4cY0RAne*3Z&Vf8gSzBUC7JP+e zz&}7c0KBI!!jn?71UC)=h3}~&q+oEfc)v~6{XrlGB#Kh6`KrOefGuo zMG76mIc|nLNKVUTdB+~Qj{>SG4)9O3IY{2AAsvM#N2b=ErL)V-4lU_q1gFjB05~M1 z#{N%H?CrdvEgJdfv(~cO*3#zT%J%X0{z)Ej;3}vSH$$MtDWMVCBby;ok!hUxm}zi7 zKw=0XmJcI!O!pWlpLd8xkgu%r0ryK}_ ziRq7z%cwsPHZ`~DjigWF&tT!y23Da*E>*r5B!ENgS-0lJIhF*3Vzw~;0eB`9rDM&> zS3Y|BMxi!tCesph8C^*Q{?V{85C}!{GBuGcCt<;I?Chd=f=XW|c`cV}fXi7xiljR3?hXFiut4+VuWiz;G)Fgog!$OS=NXU}E~?HfBCb z3*jjQ!qM%4u%!(JN_l<8IJJ>WQ*e>FOsb68XZCQ45n*bDZH&i9-989}$3t$E%Pb-a zGz>*^8^%^0t)8dJ%)sE>BzlltRxV*zNtmqGBUyeq!djMJwfIY(_}2P#cm3PoBq-}F z>MYIL9^Sl{k(zC_mqfjaih3P&|Jt3b^xQ``?*SGn6uMhyF0ob@kjAAiegF=Hn%n2D zT1X!F=jokCu;HtRFEZ0|td6qi*U_+t``1D;({dl*egGH=L=<}YR$g||!<(TpnFfxv zMiclzFF1A?RcXz<)rFLPIa`qe=}`%`;-@ddfbLwym8lu|51+i|MYn|%IIA0*5CQN~ z((|4?4-;%|Ai9T7US;LVUcHF{EOfZawR-Zx^ueR7J$=gF9!UJ zj!OX`gc=}HKtv!(z)@J(IS|6trWxMuKqz=8O*k9JT}t2p2ydmVE!UIyiwPVwc$8^X zlTL@-K}b%d%d$EGmPFbtW))iM4VIFMI#CIe*5;0*| z4x`i~Cn)oN6gw@<7Mybo(@q?j%cz0;sQQZ{;>>hvoKEdKN8|ZvcJjIGM zXD1mE5CXUbitN1w=u10%>Uq zI01vSx7DtLyyMZW`+#twt2~`$P+VQpwQ&eK1cEyRcXtTx1b26L4bI>e+#$F_aQ6g) zySux)zvq7HtMC6*&8a#wdw2I*>+09BL=D_B9v&^&)UMa9_c_pzNNM{M8&qFbWgnfv z2h0y)Vb6QSF&<>f=WW2x|E>otVlxzh=({{HIvUbyT@p|2eud-)c`BE&zP_Gp2z9xA ztWp{Lm87Z*>i416FIZoIOmcjmmJe{uXvCApyzTs64ZDtE`xSjE0+`XWrlpIto*%eq zKw$3CLigm2ON9w~=47QnpFRv-bdNEqitZ^|)O>EhNlo)Rlb{CeL@i9^`rj3V)InYE z?bGqB8rIBm5^@2O$uSM`6>h`nS)O9DxT% zM0W3~v|L~-twbDqhHBkT73eSpk7 zg8NTI`hV}53sNK@@d$(hg(0!a%2OVkU1@VC213vPYPMooBmJDsVr*?!^LtB|E(hw@ z79xbNKkJJq%^^7U_J)DL=pC(032;zBTp}W=Mz9QN7Au!f83=ek?GM=?(Lj_4blxBY z5ckkClId48LfAl-cltcOUY)%h(P#YHcJY&;k-0Y`6V@R3ug?py zUzs}oOahzexB>Jr-9HuG=j|Uzy^@`=k#TYXV;A~uPct=w(kTs5@A{2e!X<5lDnAu7Yc$3q~XUHN*AQ{O|pY}2> zNrqBu3JQ!>ewF;zu@tR0_KSxLa0yG73WU>AfPm`GCC!RU{m$&Af~gxEGWjS+|H7+? zdB$kXfk7r;fTBk$6`Q{p`OH{rb--BA>%1IznWi{fY@U-?*FEn4*2uqqlV3VvW;3Eu zci27p<1R9#b%j57B!9xeRm&0b=c6i?l})K05H1u9bR_%#uigU!{G`n&J4A`eiih!| zCk0a7>-8E$q;_TI$A+Pw8F4#Qo%TKDPGjEZuEIiN;e{+|QLQ*_5B3HRBW6RRGNeU0 zT&-8Z4}N*GV#BEwCGI3DoK4y|8WvF{HYf=8rWQ&h>8B$!NgmFKwJ7yi^vdZU~3%%B{OH^s_(EH;(^rmpHenNW6&5F?D&hHWj&0e>c(=Q>)iY!ed z25)JgY-+mcEFh1VRS9K@b$`pjjQ>;LR%|sJX(34l8iHs@)0Yd|#azF-qx3thVWB0MFv8<9HFc=-jdl!G!rnwyKeLARJghr1Mvm(dJewmtR* zv6CnSoA;LiMDxCHxSc&+7gYNm_cu&C^(oSDh4JHE@zganL|2$(euuAynDHG+6>uTg z`En&$D6*QpWn{I?oChG-XtOw-T8mV1LECmFzl^UawQ$snD$slph~(+5!SWTYcSl z4&!JX3hs62plMyN83<)Wl>ZWhfXT_xnlfna^;dLzzC0ifY8eDTcB%atKwRFw_lD?0 zI^Mm>gfbeosH0v9)I@;hYemyW;DQ(N`cE1Lq<<4QFk6MV8M2>nDZ3-AHm3&cOm_dz zd1R=(3C*@F<6a>QXxiQK8akxifis>g*B=LGzPaW@hu@S5My}`0{`zQc{xH?1q1#D-rtH{a*b1Xp7TGac%wQo-Zb*&_N;gC*(94m-KDQl8IGjL`N5@;{-Xv*Y z#++TLat`;7m-gAM;gDWdcHGD5<7iEm>)P3L;#?4J7G}ErevM}nqoRQQ+H7|ujLEk8 zx^OWm6)guE7YmEJ#^;8Ole4;ZiZnmvRn_TVy5dx7if8C$TfH|%CAqTpJECF4qVn}d zsEq608|NT57&A0a!n%NsNa|kvXbdU}E_tl1BpVm+hi2C!Nx!$ynm5xLUIt~y@D~*| zca$R-8O*ADSSu|rat5b3!v?A8nt%C>URpnP*yN|JY9jmpa2zIHaRkG*1aB!t08TML z+#ag)q2j@_NNIC-B9!HkA={$C}H+)k1wGPAF z^6V0=sF(eFrWYa!mpL25vaZ<}xlg~?cOr8G00Pg=x)0lz2fU?>nPhikYsxGoUvfb8 zmj+aS-HnZ#<6S1Rsi}_TPCgQ3TjZ^-YY?L%85#nDqS$go`dNVE*Rww%@`21(b)05V z{NR_|Rrp<2I6r6N7M6NJv@IvtzVyUjtayv6U)TA;fpUCTesTG%0e(0L2m9FbyQH^J zc^`!{7KOZ)TYn6fKN-Z+ApfKNYGy9UgEq?Ub6nJLibn{U8$jLVy*6-1QN57wZ5{00 zY4C&lr$MKx^k*28`X#T-mC@AlBi64Wi1a-grC>G8v18<<0f&!Jw->FYZlhrD{xL^m(WP(FQ&qg&thI z-)m?C(dySz;^Y=gq_LJ%Jz$B#m{C?`qHF>Fpv@!*n>=!h9d+B_&zqmP5?U|F!zX~< zBgo`ko+hoB6HqWYQAI{iNM+X}Tq#jb(X*fJU^}~#deXJ9rCIR=T0?%&_D8G<_?n$1 zW>HB615H(}9^}@u>1P{fg-S&kbQqCO2y+nN02h2?h|NG4aK;*xk+69?1h}6LqtWgi zHt>=H+9-hPVektAv@NMFa3_?(_1Wo4plL}9A%OiD3$R8V;0&ptKOu#~#b7GL#h$p0 z+<6;xM!<0<9^-ZfE_bb;YB>CPF@k{26PVDU>D7};qOu$=NZwP5OolSZtLsr#(20WW zrOk$jiAT$hb29sYb6wS2I6)Cp4}?sc6uHJ6OJw)oWh`)P+!CpR7s;rHe)I(psxflK zq*f<;O#Ys4k7_=uWF)%g-sevfT@i6I|D;ApsZW5D9%!=D@x#hpb?xPDEyZ>?So&CP{*lG@MFX&vu=-tsJ;PaY+eW`WX3%&UJ_ZDJqGq(+RBfg%B{Bn!k);OC)R*WQV~im~?$l z!oe;7Jd=mR#m%Nw>VSloA>^`TcSN8bDg2t*f#N9X^hHRMbe>1_oSCVv^>h)XuJ*9m zmTuM@&34BDW-~GUt(6|!Pq-@esnOPe+iHqSk9nuf=b#}_%a!)$8q#deOq6Ok(66M< zwTfqQ$SpybpAXNwfj_7&)xT`inMONYbx#}Hw5Z_8mfoH4FH_r_g;xXtIGU0rU)a$SC;bdc}Cntpj$;rJB}J9Le|Bs=g-?AvhC#E~*-ah0txVFF$KBqaZ9^OP zGj&k*6uVoxx8j#pQ!N1}=}|JKH6%J=k)^)Puj^z}Z*-+!4L{o_6r~JNlN#v0LgUrt zY)MIJ8fxhed$p+G;~|fuoLG$yAfjS=go(hP{YL&BCVGuymA-Xmi5ro@4LV^}rzs(h zx=}P72v+PMZKMwhT9IW<1OApW+l+LchDix)OSbL_9{aeu=pnI^T1}J4D`)Ii>g6~I zlbH_F6TwT#A-~IC!s)>?R6Qa%!pTaH3+o#nKeT3`7O9)3mgkKz@y)$x|MX?E#S3 z2wJ-QAQI%wG#*H-z9S4$S~lWI7K}8_J?L5x5mM@u8T@Y&lxf~G_WpDW#yHg^ zDr?XM>CLZ!5x$^gMm~} zsg2fr3v9YouXFY8*7o^K(dRXfaWs+Oq z)I+3VL@6jc(&@hkMUhyp61LD-pTT|0!CxO-YfFBnU)1UF*c3nLbluYae4rBlM44rK zjyo|i_RREN@u8!k=&v@yY%rxa$D1Uty3lz4aO--9s;J(8yx<}4`fv-0frZ^Zln`6f zM=xa}fk-Y!Lv0%?k7@SvUfIh|R`kM^Ip9(%z|q;7mzDDi!p}WB00~f!2{`)cX5q5q zvvP8*Y^|pb8FHQ_Jb?rb{pp&SYU1@u{y)SaqQ(}2_?GbZD!EHTTzTSDbyW#$jb_bt z(;{=H#O$6D2aHE97LJ|FQU<&3h-UMsopWRalYE}Wim@A58NS*tAip+SQm|-8Dr$Z1 zdzYk|Ea4mUf~%FIw?<=GDi<{k*X@y`@v!q%Fs4gO%brth$Yr(xQ4~rX9idlQVL{++ zQXR?{IZ+S0KkjSGT=|Rhm=x+-?KS0q~_d zl!(E@!;FCydJHZxh|&Awtf;%|ThQR>`^$+93uAgm3jCAca}?9gOEN&zdhbdch`zY! zdw==yQ+RPTG^<9+kB1nd-8#RU^fzqyc2L9-z}Z53QkF_H0+7Y%6_&rrw3YA}=|Y48 z(Ca>HhASs+eWpo9@UklGfZ?2CHhb^Y3#`|?wkC{EaUgTQfV6Ck>>+{(WMMTGZqGJv z&yIxngh;=tfI)1rV!Vg?Wvgykw-1 z2uw>cf6^mp9*TWk3cVkRFnSJU!L(TpM;M6|8LfRS{?~7VNP}7wGEBKf{qVf*Pvl)F zRGT->{74{Ay7Uj8$e^0DImo3SN8~m(U~{<*Zg{06NEnBNgka?hXncH} zqq(6sDBX~@!se>HcwarBANWYoK)B7OmXexE30H!<#n5`dWdc}W+lO~MG+mv8OjBu3m5zW3OZ z9`^P`0if!qiE{9mE^eT*pALfm)z3MP)^4OOuk{93Ok&8sccXl`gQmYuCFbTviOonz zMp@VXL*CC;O1m{*RdzG30p?uyzaMT&nafOSNJsD`DXiVcZJOTbgv<7cH!h_q<= z=fU|kjdT~-RkJmL&bzx0TW0Eie>%SAK4uk6e7o}?>i%}wDYgjMI7*}QEE~(3fzNh6 zV8_y}A>d3qhPI3ez5wQ;Zet(sL#6tOcSc6}JQlX2dLsZk;HcvZm=ck}7%SQc&GUwf zraXtNc)y`sCi^=unU4xBW1GLc@P$xX(~_BeeM%~+@~G^z05e+E*yCEB5ZayN*#}Mw zKp_$Onp7_n1xQ$;WvaLah<_Wy;#HBLMIp$*y%?3pEDg^0YKKmT%-vhAMcR8qW+HqV z7Bv;EH^N_z;%^Ui?xm#89@tOSi!3ImNF6Wu_3a3T0CkrfF#uj5NT2`Ts#0LeA(`p& zXqL|ESB!0acrY+aWoD_aNB|?d!^7frkqOFUI;+Rc#V1U(PeYj?|})^_*Q|8I(xD zxXM)=1=x_3%cfU05}uj3MG98Z2Tz_35L;)eTPp}6jO_EXv+vm-YfKW7lK6O;)RDF} z4j1_83bV=n@5`TS7_H6-PY!bla{Ve)X+O3$KA76QpA&AAEsTFQAj8R$$OXBuB6ph$ z=NmxwssiMsuo7`hVVvDIazF`{Q?R~Exw`t4Jg_*uyuLmKyDK*BQBU9B~DBlcx$m$yy1z5-cD}dlc|BYp;#5wzi+gg-!}$9haYG z(9trgp2XJT5a-TAWQ$E(LkxXlnTDIy!E6K?1MHi!;qjFlu0ZLZ+re40+h4$q0<;f` zRU@Tbonw6wPPk@;m1D0mdEZH?AyZPn3j2(7)UZ<1Vo3RB_j90WSLH`CMk#v|ip4ue zm(y!&%?q&-5@X~fU<$pQi`vy6ltS=KVd65Qu}oMF$)p}ZRBz|g-)c!GTOR=tKY1xtH|H5~Bg^^lNi;KhMI)p{{Z9Jb|<*_(e^&G@usy(-^~-jRu2$!F0gTox@;>wfRqdgdIo zpoO{g{JBL^>wciR_IzEieh7q(FRvB72E9WQI$RwXQCw`UrS#2PyKZF
      %noiJk< zlW)OZieEtC+#}qPLn%shIej^;rjgLsb>6+m^B+@cK_odr+^XUu8 zA4sr4M{W3=0J41kV~@?kIpAEq)JLGVD5OMg%gc_A-UGk2 zDoCE1At9s|ew-m9cu=e`cf|-Jq{s$-d=`7d zt~*3gda86a^ZWiMB*O(A1jlH7z5Aa>{SBB5{2D%Vg6_MDD2pgN8jd`cY$l$p6kwrz zI{%B0X20s|dXpnzvtL>LSo&vDmdi*&+=VlF`H}uMBFQ7u%ljaHT{zzFbNCOs-UbXw zGt!2im2>-YGpU2+9c1~^%aInX3W|d`Bj1@VP&$8IL%X9Q)V*}TjWDh6v#f*p*S#X_&!-%yb;+6I+ zXidH*H>4&svftzI?{F60u&-$Tw~h1-1HIRi1tybQ-z>WwaW45AKE>9qj|Geb1cpJ) zY)zc~CN4Zs5y2^8PO&sbbZzPc(MaUAJlxpj;_RPMA7$NLp|`LPHD_a81$WBIPHbnw zz@Mf!>!4Q2z{qTKX zlBdXF`if?9+>MW5in6(ZCcwm2&CdgZu>b;`IKyUEw3piTJS0K}Z73o)UB#9LDBVp{o<{x$O}33C3XGcu`@<-fo; zaok#*L6iYm_D9+c@nm-nPL8*IuI||ANWZ67C%Y5Fgf49dhnesyaod?ctJ60YaWQbd z;y3@I_$~5_p_+=S{<;QqNQ@yMcooGCC*uwgF6P!6M$Dc2C0n3Li?Tl&rgE|`!Z5Su zPa4&?b4IUe$KU>D4zr^Aqqifr&`*zl?R%H)*z`7KEu>j`W#A?x>O-w2cx%$PQf8b# zZPd&s#|PKwtjomZXrd%q zLgF@E20YUr7CEi3?@KC6h&Zfw@cx(Z=~hE1dL{;;=-i=~-k<&1LP|VKK59M*f$&yd z=(HudCoDk+u~-OB!XMktIHO^6Wus1&|KNr0Vuc~LBuz(sUJ$hU??LJ%brF2%Xu){rCoOXY0w`E1u?Dls6Xgtfz3n?zi$Qge8}ae+@hR#-vaAJuyMzHYrX-zAj`_;me9G|g^2d?ED_6EaaQeP>soZ3e zB+bZ}56$3J;IL5Os0@254f(8h+lHCeLAf2w(8G~x0#*a%O!_*4URFoA8P8YkHSBm_0CYr|Drg3sTZFoO z$NG;@)eDH*4-IOlzKs}Lz2Z)yy^J$ThvkU&*-8v+H z5OLYZw8Y!{)s7j<9FtWSPwl^fXd?N(#TKl`GIvFb|e zfb@fogih&)1P8cJ+~^WQ&sfoXLL(LoDhXG2Ky39YYV+E(s-_dyxGL{Ksb5)O$~7}D zob!kknsB4ErZW^>1XemrIpJaCW;n3g(YS&=ML~0gC+5eIl6#`2C>YgWofj}#ZIoN% z|7=WL;!TRoR08uKq+045{8+ZztIv+9flfCaZZ6Y?zG6<35+aH0Z8*Jd{*7@b+3a)% z>yW~8%Y5tWVS?>&RI>b?J$`w(`QMk;*16V~1z>Wk+qwpMPy?t}CFz+l=sXrVhpZhz zj0FjyRRRk3?Fl_$Qt5|GgDhKh3FA3|{?};lXfZMJZ_vRM(wv-}s4-)h({2_8M;GM( zDn8M(%g(Cbqau^i8JiWYuRn{zMAUsR{KbD)b1n9(IJ+IlZGp#ym7@bVq>7S0+h8ae zLV+2fUyM#uSqZM`?(o>wCl`qPUM5^BQ!!dIHO<&l{Im{rQ1Q)fK@Y2Jr7hq$>hly3DbWwnb_^y&bEQ(<)oy zgCG%Bcx+K__UoN%LJjka^pf zP+KXq1vK#Hq*-WCMga6Xl?8*FBnz#jbo9mdYjJ9TqY(oLt39&cKy11aC4iZZTxj=| zBh=#`Tp?dnBoP%bf7ap8Sx- zd(P_-(bAKY_KKOa7G-z)j2x^?>7gNRr{bpKpf)0`cJkfr#L&&fpr~X{PkDg(b-hKw zfdUO10oJfpO57`<=~b<3L}>*r@xsNzFC)`msP!^%?{S5zCT4i)?e8_fc`j5IXwy-G5ic;e*#%E>dB!|g;pL7c}d2HfmQk8}} z_RP`|vg1v*u-n2+Ya*%dt~5Em@fYe*V{jHa30=p|Q1H=L)FXZd+eLg<|D0THdOs5r zol?B5z2EsE%2(@*R7MGNiHEDFpdiOk42bKtJ8z9w*>Kh9wfVkHUrv(TPR$6a>Z$qN zJn!Xpy<89fWn&COSbZcJ@naIb#g)1+TclnWzcBQHLWTWfrrNMXj%2H8e5+7?cR*eK zv#h4943?nH=V`bKUn57L>p>Bqz`h;&{hK`GUTw)#&hJBVI^F!^qio#wu;ItU&gsjg z2O#Z93zO)b73qjLfp zyHe5fEk~x8CkC9FzrGMb%==GOZK3fYHmM1! zALd351`i>O85Bz>Niv%yNP?`2Y*a@Kf-`Jt$3mD}f!=aJ>gQ_ra9p-fixBo$(LqR6 zAO?-YKp|kf1v(xH2RPDvPkiaAh=zkhNQFWI%fiEg*{I+Upzl8$;UYlS_6I<0jd~|f zU0n?g6k{dA%120P2RtQ;R2RfMBQww`Cr1B6M2#7!RK^AL6Al;@(7&NbcJ7$RanfNm zUG4oNdOIBI``hH%8cYqnnw1$1^@V)|*Zdpk{NC;9>*Ia>wAW;gdyPh95gLbMCc8sA zI|Aye3mTdlb1fq@_rCrlhHvwRp;RFWnqQQ$gruo?6xurdW{39Iu_2zWez z@~{x>PZ7c)WW+m8b4MR7iqaY+7gv8KjO3+yw)xLf&)3Aw&R4Cfq_VEKpuVCb??MjQ zq~`nxACHcK&VyU;EPIVXV5bIY%>#tNh>^Oh8Zk{_oA^6tu))z$E*$0i6sx3EMzhDI zmq0x9pQ`dQ==FaSOq)C@B=r1)uJ@?RHZL|d<$3Fd%(Bz6Jn%gT(_Eoj|&eoa5U7wc(|whfBO>-w+zp6C zg0QG1{-8Qz(wUt%{ffqwnR#X6PcljP z_6`mPWD}1c4quWJKr6ygpe@5VY)Kwk_ih38|aKbvha`7fsMSm`<06i zL}p7h6u)KiJ_X$WSDuy}tZT{es)>-RO{164R#_6kEqdN=u0NhmugMK=?!JuP&Q9_* zXSNNF57u%Ue)eD%KUeYzB+Y27Q*UX^fKUuu*v3w8@1Qf!Hw{YC$v!=Z~O1cLmnZ`l-N{na>ZRm})(q zo9X*UIA3VniT4(}QK|H?TSJC(GMeJs?&Fv5mC74#oT_&QsU6@%7GG@%QY$d%j`;{U z^u#6FwG~q}=98O@6{miAF$1H+1`x0v_Td66)&25c(3+^uj38hfO+_H1dEHBIZzb>;!Y8tkPZE=tB)2r{<0dUbhs$wcTa*8TPU6vz%I*6AH!B|aHQftR>;!xM-hlZY> z-e8ZI-HVikN6nHgCr-3>RdHuUbFGVJ!&!!{QMDB%8XJoMtLR?Fh>7YR%dm3a-0~z3 zT>av4%GOmY8s?bK`_lz>ir}H`7%)<_vMR$Kf1l-G##L9{met0oqMu+%j^Z4ITw~fK zi`@T$Cz~>wKj~skUcuF`CtP6}x+8vo0hXh?&IHbz@|3NlUGPe?=m2H0Ht)+yJ3PE3 zW!iL8)A|%~*Bd`2XOq8aTY-OmVFU8dg0j}4fa>my9>Ij4H0+|lo!`8iwUSZhWSTK0 zM+}3J@%1Dz#AQw103ADotpjH;ZH-W&yb12GiV+#6-B8uS|bfN!O$ArOep%?3yDuckGo7&UZPjxTYVIb-AoQ!iaP+ zZc7V2*&^VmY}}-qz7dVYtS4m&`G-^Ze=NWL#YajSxw4hQ%i_Fwvbni1(CI=X-@K7k zomf@)QeE&U`tD5jK@nV^Iv*~tVm8(v!TPPZ8Gws{2c&H#wQhF{v$ zt|NzmQv74R0(-(cv}76H0wL(}HgO{!lOdIkx7{1>2c-9tQOdpQ2_nV|D<@OUvPzu$4e|gd@uC?JOJ55$5y&y>U*HV3^?|yWK@)sJJ zn&Nw{`3U>aP*W??ocXByWom4FpZosyQQ1(bYhu%iIru0hd10~qk5Fu>YRFy^=D8Dk zxPGurWLn)UlN(zU7=(DnLh5_pJaf3JR3$w;JoHZ-D>W53SZ>da92oe#{|FoNrrK2( zd(3>_8d?ak&#gwLT*q!*!C-Ple3Gzcpw??o?~QjuK=LT#i{vvl&R$6P*-WL3E5FY) z;L<6olFFDB5gUt_>!-2I%`V9Ea`Ewq=HlYArL^bD4Jzg0=ye7bjoDmy9&9G{uES`4 zUBZbUE{$}wFMF$hc|c{qU8vxyXOJ@{CnYmwgGS?0YOtbSSmH*d3)zM$^q>Ns4aIj| zmy<|_V;*!-zUTdkyoSP=;=+9vO*^w#*G-^?jh@0ld5UuYKEzZZ1E6EM@{Pa9&7fZ{-m=g^h-WQ!`3+~u%Y;Oy{qyEjq-GkiM^0K0Wa<^GMby-;I z8oeHjhvWtJ6fQK#`L-<7f~ll5&;}3l6bFBadc_$kyzWU^2pTX0+LI4fLm?#SZqFiE z79ABmBxlTAOSckk>Y`xi>l35lW?s`&+Ykf}Ec@SFl0&kx`~tw7doSjVWw`Fq?8Y#< zj=w*kK@E*pEp%%15IIR>b&d%=E5nu4Ur7jk+(z2RWZ`h_XXX%1S%1Nfyxkfg@A!xx zpeeb!OnADRFK@h#ZQS0YDadt?jgG$FHv6v#@xK?B;xPB)OQcx=3Mt#h%Ez>oX)HJ#M)+#vAPJ9vh@%_LWmPH`7+X7fyGiJ9Pyiasq z$SN9FS@clMFZ$>YRb=kIPfECGuULO=nzB6zfBsjS4NjY}|7X?)U~GUQZ1gL@QOj)h zgw%KrgkExQk`!G3V${Bd-+k{OLlfi$xsgzh5P8y;Yh@;xBZibS=EGmNbCxo zFgpAnVwoly?#OA$M64iVd{hg%2&KH++eK_lnaVnPUG>kTbTP_FeHxmv%1I$#k{>NW zf<_qg>ce$GMx@^I_VvI)4E-+pemnFx}T#yb~c{6Qz-`Jn2>}_Z41Kjg(q6PQM>s^7QN`^EElPB!nRd|ACb!4fcr-T_T z$;K$sTTFj%%4lB{g7`fI+kQ#PG+LpB+R%$Ydk_oSn}|Xagn^%b10~?-=#LkM8tf<xnRZt9e)M^9U+22= zJ~=RMXcQCR_GEJT)aPHA*xpr9g1cm};u-U@SZhvgr0$9Kx z`1Ze1Nf~@4tM@R_2IR92ZkVzE1ehogWzpjVks;re@m!O<+hmVl^cn@eFp!U(bv|6I zTVLSTsXfSzG8UH<8P*GHX=!aNc4*G&sjqk=_alrc=fJ^$tNQn1d~>R=60XY^OT%-v ztP}@~ z`;38MWXaLoq}CYI*y!qLZj(u)yO- z8CrIcVW@TQ|9bIZWpOcC&yRhN=Sy8QAD&!*BXW~c#?g_{yxf@49H0o%(-TQCcA=|} z)AU*FpdT54?h2Y};qMPhAxbDo_Z!;1ly(+BxaGZsA;=7P2RQ#dCVF(8zhg@6qOf~v z6hjR|pN4WiT>Icds1FIzshmxt$UIn=Z_jx)Pw~K_9z_l7@8KpkN3_@h?Qh9_=1N?^ z()HpA3^oU5cQTGzuz7`bc`a^{HMtN7m;su2L0*)xsUy@m8Vrn#xIbUo{u&ljm2|ii zgbwWAR*E!^zn-tPXJ{)bbk$X~!ykXj$j$uGK0t=P*nr_VQG$rD;tmPku!RRZslTC4 z{5CO!D8X8_SdMUkk9Y553U#Cb&8!CFu?0%=#bauc{1NI3Mo;Epv7)+PGU?!nPT$FO zhf;9WEcbUUZt1GAGb}E0 zX!Cb2E2wz54q^MQrN2Rguw89l9p*rKD@$Te4zA;trW!y3XM73Hd#D)5w1CQh6z-!e z7Uj_iU`z|E;xRJhB;0FD>>3WerygG5wL+7{do&!4-NV77347 z3?ak>_C=DvVAjKiduKbq>+6lvJHQjr{<28D-X;lcP{B0fYZ7?9SMlqfR1w~ z(Ff$@{8ez2=GMH~0b^nTdUC|lH{?7tgpJ9_nmv{SuI=Xfg!@tKx>B)BCvQJ{Q*UEe z^XcyB$JC>tsiU&}^&B7v7tk7Q-N{(6h(Lpq^YvoQpn55}RE`?1ujdV^Bg7Hj1kM9D z;F9idtgggHH&U7#5-Opl4ccop8WaLHHuSt16UdKy0QmByG81~*;2xSD6Z20o=^lfF zBHS*R`K$>gW>)ep(*43tdWt}^DJ!{gGx&hN^71^0O-A0w9ZQ`1ap`{4pSi$fm0?Ag zR-dXW+qxD9Y?Sy`_t#8qu1XXE;iXt+xPn3{{b+ujC267B#n91~vgQ{xi=exsab8Ow zkR^$7ohI-`-oneocVHSy6q78#q!wdV*n{okrVyo7D<5_l+v}+MLrc(NHz|}Of33Rv zw!u27jMXw3tp>*)5cxZQ+rn#{X#=z&3G%-gon>Km6S`Hm*UuSL`SAF7=*A(+ZA-NO zz;0IUG`Xprig(cOEVUtS1r2WF^u6HziylB=4E;7(WI3MtF)4&jrVlY5f3j%%Rp*zH z8>NDSc??XdlI1*3+M8sHbhy2u8lQu#7S@GqJ}dT4>;Ab?YBrZn`2PI;z`lB`Zm9eT zk}UDHi;H1vM}A#FMRPIM9xeU9F~CgO{TtYPwj$)V_{^%=7tx-5gCp?}LYb-|iO zqg>fDdn~k=wK-u49=C6Yp0q=FbaweJNwk3{UW;h2-|*^7aId|d;RhLwGiyY>O|2z{Vh8xloq3sPGAT3TsFY8iMC@kX7ae;h^qjff}Amb(U# zAqu^i?2v)P!CV8-%Q$(?q1bPh^qU0E73jeMUh$Q~^SUoZ{LioB0U&ozzeK`5*w;#G z*0paSx1wA+qv=<{&b=T`SZjh9x4ePV3rr_S^yJn6dN6d9AOFq!+BRPc zk>7nT?Blcj)!VjmzU5-zh^79nCx|jgjqy5iNd<@9 z8}6c!;}kgEV^U`yJW$2}Bmx9pV`C!w%$@_-5E5+A$=oQSwxsNQAJMmh-gSHDoI` zKNCd9T1p+gF$qjVg%u$!gS+3;l7s)_{)2(YO8oY+<6-dj zx|X`(f77a8fk%)Yu96DrEif$78H{vCzc3!fnB?NnSiq`l^!Nnr22I0ou)5RSMWbm2 z*G7Nj@>$bUrK(XFML{Vz_~aMS1@SWU_*a^<9&IwC8Jy(;K3zpw8mF&Mx2Y-!Lms8rYFNBhj_SwdZ(uZ3$?uTw86Hhfgx}%s9N4 zNqHmB+~N7JM$JuiVJW#@5_~jqN-7Eq+PhoKfUN7_ya+cN+sfP;5|VmmeM{kMaN$OF zI(cx&e3Lt{)iq|TMD@VxC*2*)*u|L0A#7h0hj7bp>%LlGxpUD{zq|0Ekfc_QBYh=Y z-_X&JnsCc|OGTh#`_B0vk?_DtqVFW5j-Zs~X#;F%Dm!CXLAB0=3 zaQp1@oKzep{_XDmSslGySt@H?+8T<;i}+NU?#+k9fl<$P>1OHUV{Om4Wd5p))rdg? zPA3~(-%K%q-f4fh*rLPK>}itZr)cWxo_=*k0ol9zr@DLkvw&jd6<)|Vx7Z6KiXT*q z`!{a?S-e8??qTqFwFI&E=L-(sM;0}WN#C71M+F##{ z2Q+md`SvIG!dNwIpYQDg65#X!u#+E7ETHiTzLLYnaJKbwY{3jc=k{K^XdQKgj?HugPt>;qGaFS`dEJ-eL_!)j9j z?0a!G_THux^i`$yxRtgDfkc$sAvIMw!qP?WZ3#}0uJ1CP3*4`R~dXGGCi09!fU zoj?IcRu|X=F}1%d#zluE8VGAT1G1wg?2CmJM;$lAtVmw8y=RYE2!)$T2McJe*Pyzsghp5i%AdD z6ZzFErjNrv+W}2p(kbElc~KP84X{?*;GjoLc0pKY;=9fUx7M^1FkKRe074S#>}ZV- zF^#VG9=9>-&8U(zGAt;moG{%RrlqyHMoa<%hYB7?r>9x!4(Mmq9U^K# z7^OkUN6%SHhMsZKr9fy>1Rc*Jvm^m=D2| z`TA7Ji!OK;69_4?cn~-I$TwhHo421rb5hK5lY;IWnpSs_R= zI?J%Ax~~t@4C&A%jdXXXq;$8mbSToz&>`I+-Q5j?Aky94-Hph5p8s{dU-W!FoY{Nr zwb$>y&q zC<<-u&;wZ+8(%iXFHD(8%P%F28Ay>LUFYrV#W{b@x0b5&mX>2(+?6`|k2uM7h;L=E zIfW@qwZ4gs_Kai(pd=5VPSPYZGD85w2grovYsNDvaIPcCIt(|+xyfw<2&AY7Q~k^M$?)D5@v zrjV#!T%zIPPo<`Vq5d;>-_k|5BCgz-pW(V@_}}6455zd!+_6wMcekDFfd9Yh+l(ly zh@D1@pG0ay9w&E?Qf0Y;LlG#1kUrcnG}gJ~e^NMvKCilL<*?e>*T1yMo@m@}DU6zn zM|U&(yLGIIcNp)6r(!=cq5Q3~V0(EYfPq#-fDp+o^|c@~Th5!ii5(&w0qXp$FobTl z1L<7s9p^U~Ar$SIg3mX1_sm3rtVh>~_STNnM44UnYf}K=WUKmu&S4Jy!q(PyuadQ3 z*SKP8`-JIQadQ*QCK!NZ+E&%Iv)18$sY5hWTh)cr zLwA05^1J4%$X!hTwBrL6V}pXFtBrSH+#byiZ2D^zV5EE#bZL}P=NTWr%mnUt1K8(~FvJO(5B zk3Z6L@st%RweZ@+l^q@~k1tmwp3yLz+5ejQIMMKf1xNC;;XqMxPV;ff zzvFpI!}0+16Cs6R##_g%58X%={LCDGZb0AgoR%lY^xpD^H zysZPv2aMp_NQMh94NY|JL$04|%6K@*n2VIXwVrDftJ@VHgXs~ay(mp7pL!EI*UqDL z_#KNPf25{^y<4^?h4>x*;sK2fi>Ul-GK=t1Q9Eh71DVKD8pC|8TOA9Dea@-@ll*%W zIiV7-BM~^{pG@JHMFUt`*6@EjsOrcsDRFgMvwGpdz*L$gZ3)G|a(ZFaz4INAY4MwY zlTAGxJ$!$^LC_UX&stGc>JU51eXU($eG`e&k0lc0(Acy%q?6R7vPANG#Nan`GjSr~ zhwp~*PDYpuka#3>gRk{_u3kX|r$sD4UlkQ?YkXR{QnKT_2ILL}Wr0tqv=Jxq_h(B@ z(zsu@ba0>x!iFjgo`VmFnupgRF{oM7bRqFR=9cFv;-EVqHex)3I7qhRl;)8s*PHt|-+RUrm7Q&RMyu$szKmH>%*T$`3 zJ+l{NDoR~6)}*}zV6LJF09l6|NMYu30Rz(=u>Yy&Zo&>Zk9X)3w%;oQJWvfiUlkiE z{|L=t;^&c*j*;?XQ&vaHC3EHA?rz;eW?W1i7Z*J(8%rY>Po7(Jt9FDx=X$Ci$vu+Q zOoS`+QMdC2!VHT;5F?xV0(UtvBv7zXF2AwVWt;01Gf)eOjhMF2J{Lu<)c$98B$6mRA zyV0%Lf$rEI_}-2U{FtXq$_I~hONR0_GilUt{%!iRF^@ZxsuID5Y3ie`s^+u+P#hU& zTltdF-Jv<5ueY&OiBd}ZHn8*~u=L@^$fpeYcqC%JRQdc#SVF(g#X1xBe#Nev&THA3 zd|LLFb+C*nlP*je1|&pLnak~3_{bWonsXtAq5bu8$*^m(D0X_>Ib-y+`0QG!osFB5 zN-?njfv)B>ZBtmnN+=dza)TN69}JsUgDUfOhV)S`+h~7FEi5sCYD)+} zM6RS^|K^t{j4$rh!+?%VF}i{Y%Ik3=EGjBSUw-=;{w9O>%V^^&;8TXt(d~QMKgz6m z`&*N&0N=mTBslU8n2{oQ$kih)!eWE&Q0)NvSiQqUAZ?$s;axtTrdxqyeOV#)G%}>4 zHc1A$8B1IMJjmW;&mRGkWAvO)ZNw3u8`0g^xC5_u_Y~sj4gbgpaB}^(m-pGs{qr6$ zmr=mn(F3dG=(6-nq?kK^DeePx3JV^N6Evv0xzlae$aq+s7y=q2AJo_tHeAaVC1G4>huCLd7Ic z+rXv1MUS3qzMbQCn{T{N_3#=si>WA7FSfj;ZEr2iud7O})4}8Wk=z`eGTVqpcUq9Io`<6}6}PUtV40J+Ob-QLOqi&jiA3+0=pC#i%G0*D1kfXp~wy z|GGHOBYE*`=aW7iay@0Rp3USBwdXWv!)!tSdVl(U$8g+IX+6MpMx*?SWBChUAc(^jM4;$XJI@#!kgEsRTV@0MfBG5*M_KCMhD(AK--kv&i6WaxeR2a2zp zCoD$2gw9iX6))erU#%j;Cp_t1+fyl_Kq!wt5J}$a1JXO>yE1O8ZD)VlNrImepC7X> zYyyPoiny=3LwrRs3ef}YG?Ec6=X=KkpKV2yXzU0`i!j!9&NG^qpZC)YIaQ=H6+h}p zf0vz5)jKI&;6`8wpVE9VbIz^WnDHg9%mR@Cl?#``(q%loykUB*T z2bCg77J&Y`4a84gLILNjPy=x(M97^eh2pXpxH~V|!a;z!_sD_M3Onyd4=bqVY@G}g zFL?ybFCYD<^Hc+*X8If#Qk{0|HvX9VYk}7}R(qr?S_pfs{Gf^=I>7FE5V3+og51Em6Ny9sb<58rHagu}1mRFH{MJa=g#X{Yl6Ow) z)bvbD{9Nka&J9~ra5H^QMlCZMDrRLi`x|#h0sKWE_D%sdqCtd$C3>6lnckuKA4|>F ztDO*lk^}sH>$z?ay(47oy50BYcUB%^tdNk&$(+$Cm4)g;gs6~56Z74SRj|lU15$lL zB_0thh9!aQ!Rg!r0qujWNHz-{z2M~^t~_`3Wu(wOgsF2l=dMi0j%3F5iCR+!EoSj! zrdCdFBLr8U1oIhH$3x;e;;>s81p<$QT~g1t<7lR%(}haZQ)vxyXCwl`L?oOL<9sYv zsZTl%53UX`>^jpHyG*nA2000n29WJ#Oz#^SBcXlA^ioF>MhBuQC-PCAR@B+sj6BJP z=JwE(!F8KrM@4i_gGouiPlXOpjNqVE0|Nd=t<)5M0|G9)s#l+ysP@ZQF;)l{@LB4Q zd~2dF-V-gNfXByJ5HLaS79~BFjby~KC{m}60C^vX8B!q2%J|Jb@q)AhE*0v^&RPI4 z<0dXdB0R8Q`H?By54P_Bj@*IhlY(~PJPAF8RD#Uv<6Q1*$!sCIu8cml%=5wLH)Glv zT)gs$*YlBZf-Qhh=J~WK@F$%3NSMv<%E(F|vwvj_;TuH!@Hb?fiVJ(OGy8ZzvXZ-D z-8EDVY^qhPB;WcTGc05^RV%Xa$*`?RE+(D5H&~CUNWOPH*{vgccP*fM5|Q8k&_*u9 zgU+ZklXYEQYNVwwBh_;#M!U9+5Q#AQT7FF~h@Re*Vs8epIp6%u%|GfxU9<)SqLRPJ z57puxgq+;lM=3{hH<&xOS7JOx0jxQ~;%xqNfC@bz34o*e;h@qEZ95O@|N6(U8I8qL z1@Ymxn$=rio4`oGTP98gihAH-;ZwgskhllCC+LHv+6sW+K||Ao@e>b44Z#cmhbz0L z3_u2G2WjA!MLJ#xGi)07KYjiimmRO7I{&-ne51=_XKZFcm7Ii(gdm+la74>?ry%pe zL@XfIef+cc>tpiNFEF?Nr0}~htpLs_)NhCv3#Ff?EbD>Oo-pQI-sZ#?vD?fR4p&i2 zNUwtA11cRHrRB$3q7d4qctG5V3I6``QC^;L=D;XI(%Hdn{&+gB8oi23`8=HQ>qlIw zra6xg>WNKm&VV3gYjbWj&LXuu&U|+fT_Yffe!=!Snce6z2o3f-L0D`X)Vtkmm*SXj ze@;m_PEq{uck(p3DJGUv<-3Oa!lnK9m$a_RyjIVoid=ffbZ0(HJieHu`3FrNSH@^# zJTrcIegkFa+2(hAZZYB56$pW6z}E@*qIXOwg%b#&IJ=x)E_SI?P+%&*`?q*2QI9Fb zUwyKbEdaD$#PZKqHzRuu16=+?Q$rDauaSCBA)&hj6fx}?#R(nbd zILF~Q^pC;=;g<}06!8S~`qBo09Fv@VpSJO}XA{J27)>OcDCA`zRikp@*ewLk-t=Bc zD`N^|wfWHmk)xTB!)p*qOkJ}o zAzCK{C06Ry2lNfdv$2=C(wwFg!p*p6_t~9Z8+}PEY^JiQ(+#wO{acwY1t!fO19DeC zfhC4vO}I)mlU{~Bqw9%`-LEv|>iQDxJeG}eOF~#tHAO7jatu#M_ZJTsZ|?4cmeSM` zJ}!(673p}w@I6YgUwyNAVI|&&3}m=EKBeVM+SMuzEu}67)QWlfy?R*%uIP^TraJG+ zcG5`>IXmF({?OMfexx@8sU(Lu%jR=3{l~0T4QAzO20Oku`Tg_#pQ;-e=EP%}ySRi+-B&+Pb&@NxDi+qNa~QNOx2rYu%;+-iwV}D*a_r1PIX{cM=9R@Kg^Ca)VJmQW-dB2{%4+|XS{J41UsTZRQbu3Pv9b`#Me&L*J-sGag@Hh>QP~ZRt35=QS?2 zLedg}M%#`>-OODwNGj<&X}3aBxH|JAb1xDDiqPz%ho6Ay{-B(bu}!bz;NQ%1(}HJG zD-ca7OaZN{Ub~?zy8;Gnd1rlfk)5hE{sF*P!-~F?qCMQMCwAw$CT`+Wg1P8}+hEt* z5Hhcy%QL)Bnw;dAFKJv{V3n z6MyV0Ag%*|@$>AaCcx$V*pxm9nDKS;x!#GQ6lSLoZX}fS`8iy@|FUn`s*qZQ8*cYY z&LyaiZEva`Tf&&?uVWZKl=L^4l{7qrJ zhw>7y`d4t+En|2+q>(~840R;=eRZRW2Ibz}KWU*P(bP2!z1-aLiBu2EccRGVoma}+TWl{dH?V~gG2?J5*w=@rxiUD20AYu(*pw*%1tkIR?7TQuLKcS#tO<@$Y$XXB zA%31!43SYund9!z4~jrm2@L^HpsaU!KOA~m$hhUzAo&#n_8U8c-?Oug>vH%*+#ibY zYTZMIYgJOG%4f_dv$Ar~gea1ya5g!;`13hCfYN@kEu=QT;;EY91!!4WS)l2h0>=iZ znK7##2p$AU2)Qh9c{5lnXri;G6y{(ph+;C|=ij9?M1fo|6xa>;(FQasF{(2W%U~(P)Ps|J;N}&u zLbYeniCEMyDy6MtaANR+74em+L@xYPQ-sGIIk_g$9pt=EZ03=Y6F##dDKpJ8Eu*kV zu>l>LSS$1)C-Re2vODpR6Gb>2-tV^~(Y!^m`~2ONb)W4suBiZ&XO+#g(MobTII
      `an$SqI({_ZfZd(&L1$Mv7}hfqMKn9jm7sC~M+y0MIjmp((mTaDqu zzU&79dVo)+=??;sKupKjjr1lnM2{5(geHccseph265!+0RFS zNE3qKNu^rfu1-m-E2>1iSN<^O`@OAiNVYyHi`u^mUC)^SBhzkOPrgnik%7)GzccN9 zv!}jUS&bt@UM^~Gv(oj8{w};h}}2KOF?s8*Lst`zi!nGhekBcM3@I zfY{L?K(Lqe4s|c2wdy4U4i!1MbS1hk!GMU0jSDd4ig}^Dbb4PQN$A~t+f$JwOOX5H zR-z{e*r1v$ru;^OA?tQug{SFI21t}Fl1qxJ+-Hr~nFU8iGLb7|aI{fCYLd`-o9=uO z)&;W$0o#?($50eIsYziExB&1QtfP&?#JI-o9mXy}89shz-G@EAIrv~H?MyVk@AF0BP11x%8<7e2?8HGwuRTa#YSFM(zMSW?l$hzh`VacD`q*mSQYx`9)cclk1Lpw~ zx8FjNJQ0=u&tV=%D_umId#BPp6P9vPnZKZ(SKI%?((64uB(1>jGj6(7OPXzDi>jc& zSBhO?MmR)>vqG<0Q58n7S{jqdX7B63H_^A3sPo6u&T8n>5(kpxw<2#xH&bld#}|@` zR#?T8-?YW+!F64J!u_F-VMrazeHWnYw09uB7g7lfKc>ckiy?PIbcnh?!Tr-q z2&N=oUc;p2BFTRg7XlFr;8MNL&P)6mZ356rc+7UL`TK9RPR9`DW(9Kna=2gm>|@x= z;^XCPaKEv^z->kA%RBmd`%vY&Dq@iAo)LC=_|XzrJ}Cfthb)JIZoj-XS-!QXj@2}A zdiFuSZgZ5r8(C({DbFx$+kos~m~nTRDsVaddI`wAJhJ+J!BmxLhE{Ckv;l#BS~QX? zPEJa}2t31H2%mp{#nRFu=Vc#&6W8%*a4;dXYw}bM6>1a4a{uLPOY?MxC zB-!>Ck^E@)_L7y6IoRKSUyYrH;c=X4g4bA9eI>3WCG{;&QKN9O%lG9zIG1xU#~hR@ zYHtIqzs7IVUIl!UE1ikP%XPr&E$Jl_27^~^tHI`Es9t?C4Qr0Bb#5_r`;;P1uLqjz zXa<)9wGIX|1kjKfe6*^QZdGdSz0NNTW%BhE6MH*PGXN8OThx_6RkA&mXOP`Ki#h9G_o|iMb5)L1OP?L!4dv z38Cg&oWzPkb>ot92y6p``J8l#Rwy(M`lZFYf(VfP>^xHA#W|IJWXQYfjn`w9H_mNo z1iE(l<>%|Is1va)Wcy$(g`$50T_r%fu0N+M0wqc*TFDfVuCdMg$jUTOy*3qhm*L#F zGmse~I0E=A5*pL8+hIfmG7*XQDD{+){T?Zd<&upDCSrf>LNot~R7+Uhim zjzYYsi>4LM3%s$%?~3?7{;QKEKONpwRXL0r+j6`hV|L0#IPU+-sg^GhSr(zYg@vMuKyeiy+l!`3qFw*S|B$(Cf>=mb7_ z8^C7u4)?dYyXyKrE2E~-(=(lQnISwC1_FzyFAg2^WU}eOjT_a%~G_I3mlkCdohxT8j82RJX2LTPfP!ibUK3 z_7Gkch8TaEvXWNF=ZD2<0%)-ZTw~|cbBWJwSg?9ZCkBPJ< zm;6E-dZqEU@?~4^17VRF3ID0Y%(Qj?jF4|?K9?hk;UfOLyZt!vVa{%DeqU|(B@U(mR7uoh9go#6%>M~ z5F#mC$LlnY`bQa*tedA<#gQ(rS*A&J8Q3U@rVuTGCgk1F|2(Nv#L;ISRu~_mR6sp% zpqiSX1z{GH5Uw|0HBC=hjeM;);I<@G^fi+AyKh_dCuH_d4LHbf z5IU&j<5na5R#+lDggklVu&x1&bOR>)hGxqCZj1KD=`{i`xeo;;YF4v*6#;FZWh_`c zSiDE*mU*o*E*h@^XCQKsPUGuorW1Y~5~=3lrf2ex=mSj9$7*z!HLueEpAvOkTBO zO>K2`U1LL3cV_X3@c}GJ#DvepW7W~WwkBq85yjyB-R4Epo} zRy}Xi?8u$w08B20p+crRoh`h!XYxxw@Ao`?mw2qE#n&Z%;MgVAK{UT2oQE$d4$6)n*WPUOt}xr0XYPezPb>A!kG)uc5NzV4#>_j` zqNDvg^Tps@>VF<<(LmtIUmUs z5(_JxRdtzvxD)XdoRSkdJ1;M8CR14v2P%IJK32FuZp9?-AB3&f%PGe0H;=Z&9}~Fx zc5EN^$=whl*kd3*)mKMd36{{)bf8%*2vS&eLJeJ;q*f@n%b^zc%}fB<%vB}tHY zDdKKNqkJlxJc>Yq^bKZ!vzFO2+Ho(iUjyi=|F{r<7<=B*Rdf>{`tX9C93SAk)mj=2 zG$~(s7&{pYfR4~yDx#2jj`fvR!uB+pqCUl z%ICNsHd~GHQtWZhGwJSx@T0wa+_01_iePb%?T?m!nIS8%dG=xA9=})%kS!?DS9kxV z!EJ>B5%0Pml*0Nz2Qf3vPfwFpPPDXFlYeNiWYp4CU^iN)lqH>0!DjQ$YCJm0T+ZGt zIJ25Bj+pdoUQ(rLG4<~pc+ML}En4#ZGjUnhOnV$zHQiIelb3kTteC#}1JIzA zyJv=wq1IT<%or-mmRqW3BYKB^iID8R!87giZ!6$mhnPhg{&VXLYw`>S@+_Of%pn4)j%z?xFt+-P*^M%_*~r5^*28B)AB4Au&1j7EtD^0q~IK~@QNZeRXy`O!YXnXw(u7G-I%T$w$Cc_lNKM z{xFNpQ*ooPR6JCUd1TP!pTuNTCso2qp)LVxb5PD?o*YNMp(TBs4Gpb@oD8%2 z;Vo@OA>yz5p?@}R$@8-h9|j%GlmIFq!oQF zHQme}+oEEyvhw4g7OCoT|25AoKNsDrPf2JBTvP}XrcQktlJo!qV?aw}RaXQx+=GVGIi%6%^7YLs z9Xr12uzS_uQPO{R2}B4B{dDiqj`3_Y@)VKn7EbXG$_F!FvQB14O6t5?GIK-c-HD5p zl>2*fuEj*E94ltl^NqufQQo||W|cPn$bGTvYo@S9r`znXmi{WDKE7z{l(IH|(o!Ky zxB1!0uQm94=PSmfjo6QPc<|@@8i8${8@umMgU}u@a!8I?^H8>1DXhT%UXo`HR2s`-V8GSpWz7Q7SqW^9hw~C1ag8xFf>ILUU6~Mkj4G;Z>j3uS}rZx!1 z2WYn~5tNDon}pCJ7^U+cRUys{KxT@J3$_`I#Ci7X1&BU5+E7~POla%*|LKdtpXW1g zS)Qmz4M{iA*)yPaYkoqK{lX_!!Sj3VP}qHHEc#6G)7`bOZP=wc%6PhrM8roDo+n&@oTAuM- z))Hl@l~Y*wD=BF=G9$F^=^bNL-A_3Vo`-+WcPH7e1@JrH6pHFg{7dWYQmRNWo@2>W z(6%y!A$~{5sefnQIr8JJFo11?08mqivlBja5crQIb!x_u65V4tq9_;+nhso$5$b{X z!YPGO;Rhlx->u|@AngCLt+LELLJ+n3t=4ZtL_?nww~acNq%aXT%Rqjw%W1pB>#-de zhx5Ls-&}+18c<;Ui2Z~`YMJ*g2XDBEHs}R#5LX%!G3WNUYE*N&1aa|*L~VU^m$&rL zRQJ$?W8!D3uS{v8oh+jloDedImle6ITiCNm;~{scUgz%7+XD8RoDy`*;G5>-_r3VyOS1L^32 zRGhXEOrR9YzKx6pcGpb1Ow7dazWM-vt(%I?vTDG>R3*%o6$z?i$^qEe@Q0tz-W}Z0 zKL2T8ZyN^jsCKeAD2ynhK38-ZOupKp=UXmXz;mjz1 z^~3{yPV(%LLs9Q&J~0V=Xn^YFc3^aRZ#b~qLnS>FwPbkOHFDC(_KdlvO8S+*x_W{l zW=zSrao#IYQ)nI%ChU)P6f(b^qE*<<^Dats^_0h?cDb*jx%o;$@xH&OM&SmbUu=wu zF>HtaLFZc%GuF*Ei{Ip3N)b_|u<-ny8UFYyiMgXfn3wW(yo*jHCya?_zi>7y)hXYz zBC18u9H?L3-cDcLok`X*_EFZ?VqzA>+^A{Yyv%runeu=C`snT?>)y1oWNWatGN)y< zpVIZc;&^=`^Tqdhx9eeDH9x-KquT9yZ^tbPjj)7@htvg1P!6vAS*E8Ps4*W_E>2+p zi^|1$I*WVrY0GosMR91vT+9!92453lgO^6hKGpA<&pqG!%IK0je_NW>!ZKlqt|RG`E|Hovk^LiBpXNk=(I1 zrb_bDE*sp!%h71fhDlIcS5Ce(2v%1D>BT-Gw$A)SszR%wuX&d-Fx;|m$y7e&HVe`J zB!OX%q0Gr#^Gw6KxlJW+hGz1|_hu@xr5n| z+tEr9$w&Np@Ym7IGu36vRXnl>FH}LrvXPD=TCBL_0AvaB=H1%V7q+kI zc^+?XM^mI^JaZU6H6X63rFcI$;)l{|XmF`PvvNFYk}pWeER|Ubg6Crq#`?=^wcfXxT08a}v#W->w zr5*VD%j*Gs`{zP1)GAe^C-bbv`EsTK3g=418`a)W^$(SVh$ve;9#nDRp7ou?|;nQ=K{`^*L3%JYF90zCSZL6Hg|ZLj|vJ=blnpTT}qgSYIPp@AJB zh{24GmVTd`8Cz}_BCe*{z}#b|S(9d;p^QQTj2Wzd}6 zuN3Lya(ZJR#DV1G73g<_s=0=J@FY|+2$9&PLfA_|h*Vh?Ib;M4QwsR?Q>?T7$CKD+ z%Hpc;uS#lvvec+*YBH!H87&fUgGC3_L=8ShaGYEV;lX@0&6M;rXAwk7vd7nA#is2+ zJr;6Rdc>9Gxpae#4*4fpWLvj$nDvt@;Ag5Bi@t&`1tRvon2|PH07t|kp$jKtt)i-- zmA0RR3!XA@fd1BLwtzog0NCWh!T1j#gw2CtJdIN#`ax$N^znEx@_xj-^TGZw8hw!gRE{1A#Pv(e@A1l_x8_b&Nk#Zjh+9TJ@{ zc5{a@#@29c=EMDO4GDwxpk4;{qd>ctDj-r8|L9YiS0oqHgMC`_Iz@JX=3YVTjhQx$W zXQ@tz!xYX^=RZ4D#|%N;W(w@^fRW-yb;8=oO9}5ziejhzNgP;<5s~$23qxWp=rN)a z*zC2Yv?kr~dsQOX;PNm@rEqblU@30!EOg;=QB}*Oe~<;qBed7;3l433C^oJz9Qa6g z+>k$KQi)_-x5`|=aYuNensrxhPMNH_%> z>*A)e#zLbN+}JEM>!;$Tq)t|pTiwUp^4Y7KamX5An_1nDqm22oRXxZTj<-x2~& zK^90ft&4iP3ay2!Uvk_OzhSDwvU26QRO`t%kg0W3O<)||Q3s!bwq|zN)%v>V<3vA8eVCr{0lzl2ohr{1Q@QGAa;l z7U}W*WA-ZhFye$9Wz0!waBaf6%OobdM4J9RDeQsz^Cp=kFnd zWPHlWL_shz#(;$_`nW4^m6*t=lb!XH z$2KzFz-x71AU=*Z`aT9x7vh)Yz#r%bEFFI~as**`js6Xl3RI+&^6BFUWiHIJ;)%R8sc`j`m7Qk*q)16f*oKfFEiJTU<8bh4z4U?bpj=uOl zP$Cwnj#`$G_8+aP$7o7#A-rC#1bpF5u~6hMla1k!RGA$7aJ?3Z%Pj7W%9A(EnkG`| z_302KB6A!c7ow467-Cn8c)fH#CO`0jmyiLHDUh~TVs@t@M)AJO_QgXavwdz?+m&lF z8kkCPbC2;9415U1Aj?ryRXwbqROL|TwrPll*22U&5s^D;mw_GVL^;TzyA9d&I1Y68 zT;RxNoU5KM>%UKOmV}ydI*P#8Pm-=LK2)oiVFRcQi%rtoDyvb3nzw~qd6xC3iaI&(m05ksSEAI>zl@nLqiXC+#?7s-Z3kGg#=#$4&f9JN|Y*ZRWq; zj2Eo_<&5SoZN&XUxJ8}CeVI8xB#MG+Ltmi@Ze(crc{+F|3j_JWX2@2f9>+_ly`?JEbkN-jZF^ zJb|Xm9~c9@r_=mizNK#ya<+e<@JSpMx5kM%Y9ZldB%ZlQTTZM*-SSqW#KnV-F+n~h z3_rU4ag&sl-&^)2=PXw}tCehx8?+*aL{sV6OSr9|DHNMAgxNJ(n1(bfNL?NZ%!eSM@-q< z^KS6!lAuLx?vc|maPbLUs_+ig8KVkVN->?SK|8scv;x56M_8b12R=sy4+6h>mF7ZDm`^C* zlaxcTd5+fqzz7#*Eb?J94fCcqqUQZPDx>){rmU1sS@()!1fg62*f zH??Lhnc)gPOc`qDnT*XJR~SPaJ!QgN)siFN-c+iYaK(&vd^bqk6iZ8VGbZ#S;Dml& zT~i&yLRXy?o)e*0qcnp0_e5DEx2D3bAS4wAQj3)i2QP|nZGqklO*k%~8$Y?sjv|%z zRCtn8>l^TkS^6Pw%YgD(k9#a*l-EuvyQ=xmzBRX=-7yKVUT|A0@o$vDGnCmmKE5W8 zE$YG5Lwj;Jw~xe~Yb<&H#3xD#dD;)6kK9!#aSy=fM*@(V1V>EMC%Pm}nJg*#&}c_; z&_lW;f1`xC*Hjq0sd(vrdA-;5EO^J?Lx72@#Ip``*>Okj^_a8qD zcvy?Sm*l6>{7U{O9Vhr@qmHKlD;Dgw`>Di(GNPK;?9NNxnvX?A<3^o+SHox1sOjt0 zJuWAdn)OIb0r<0aF8ABX26%JjS%0Tj9&%v#t`SOqnFp$t_vRG#2zzZCDjY|Vw2+eu zd6K!se2p7?rDFZl88kIy5B{LN#)R{+U?H4>D5`33>V4^V_cR8%%kDNtcYJ*jx7+Z;6YNGZo<}@9Ci_ovgsJn1Lq$ zQO?4(dMe>V@^L=ndZ=*&5e331d_p0@+QsY=Ad{K+4%zy36xD`k*|?5+`f#k&J*EEX zgrx}YIu|pyJi(Ss#1jcdzJZos4Olb!8P31EZFPm&v|Na=GM1U4YnS2%)Dkx{j8b;e z>R{QZe3pU_;)OFd`#by5Hz+`l8X>IUvy2I>vRb9yzdJ9IPx1v zngTaa6+sf~e-G@KDd^VdN*po?`=ZDF_=%P|`u=|vRFUX?hB4H8Uc={)Np&Q!B+kg4 zyaK5b1oH9p&=?U($4ll_*v($Cx$D=q8M{(MA+7o`7(`>Ga$Rj7L~( zj%TKhzCPv4{)?2;jRIqN@)E!!;XJ$2AYh^?7kbEr`M~LgcDY-ZNDv^`MEG*&j;xZ~ z5t)dj`?^?$rjD5MS<~g{n6zuk@Aj8xuiWComid<(RHn!gn#&9j1w{D|ZraBoQpAJ8 zdi{_^zli}v7>sQMhZ={} z9FpW6eT5H{xRNpt@$XDs$@Y!YuLwyvGYpE8%RDGnJ&;ISUt#`k;)k@*I50Dpc_nIm zJYlg+jx=y5@9{{6=LvArQonnZJ#s%Ufg4h*{7_T--WD|c6H7ZxN0$H}Sk%=*r%zY0 zn_}aKzDs&@bt1YJ5^8uRUrP*YY|49tvx{=r2q(LFAWF(KGyPpFmGWJ!=ut=;od-ai zV{=9aCnsbXhvy_;n=o7Tk)=pQSk~i4HumpZn%r(1?_w8Ej96G$OI9Y{R72D-sbYRrp^;_wc3OF;~!JG5rEV)JcvJNG~<%q#*9`pOwL*_>)m zH;)L-ZqAnLoO+B&O6vlTZR^j*f+_QdTi(YPFC-ab%kED9121oL`mUY#tDoeF3yT^lp ztxVgt6xg)Z+B4O)85XdfTRcCM5v4~hgUD@Af_HAe=mEK8^24eiDHkF4~T$UB|?#!hIox6gHGI}==}u4-o@FNn08QZ-?jtNh+N+BMr;m%pZLdz!qTe4a6yyx=sr`dVB zHhuI0+pM!nq3K!P)oBg|0coJ0Z9yb0RWURa-c>9r{NA(YP=Y)n+M^S;WJQRBLx6{8 z@2mHhFJCs$(pQU%Q<<*Rk8lt^^F&79G-_ul_eas3}ZOmT$LRm0UAFZrB zK@)TKi`NGfpMjj_etc?4!CL46%5xd;4B0zU`TV)_YZS+#cx%Pao!d-#M0;oj-t!ih+ zFtgo-%g`^R2y2)Nh$YAZVL2Fy*M7g=Vh6UOX+s{@dl#k|9URlOgE<7F=TE7#-Kc%T zN|4S)S`SQ3-$u>m5+pmVTh`WQ-XETj6Q7+Qb$mOK@m5*fKd$R&k5S5A+d67-YWPk# z&%tivcvS9iuYp?=&&%BbpB>z$&f0;_*DnJXT*zg1hw&naD2heNaunzsh(t|&`RY`^ z$hCosj;08DKlM-dwzoq4J23+{&|Gc@{v|84KjT=(hbT ziVW@I3S-9-=VyT1vI=BxlazTH8g%HzmLcS9xCZJA=evF1kPI08emUjx%`bRlf?h}| zPHRe@_na&CRT{RXJ0+~xjaaqd!`Qt_$*0YT2#CTMKNdwzFgfhR3w zIbF`cYjy*wR9TfASb0&oKm0Bk8&Inw$1n%F?QN+cDT-XiM1t1MLKq?qZZvp9-9Z%n zw3I(LdDhac!+ExcS?X1>e4~qq9_vLmiRh^6(mfx4Hgdek{FD(BOCRMGZ7VJLy?<(J zi_zgz)#79bOHp|R19syp@Q|qT?r!e#NJfgg0GYA6%IW%93YCRP!|d{I z`|@4wd3Yb`ee=7tE>jL$?xzEAzRTR>BY!2YprAI;VMc`JPuq@L+#pNVDo%&~&5s0_ z?<_K~BB+ephUy{F=X@cmij0XC;%R?@lP|x8>uw?%(d+F#cu>s3)zLpB+L0>@n_4%L z13T$zy}uFIcuT*J4luQlm2|;?g#E6AV%b-H<1!LID{#=3NxI)dF<8cpJ3Pt%*>ib~ zoSX&$XFwy&8 znqQ_UggAO%3FMq%dH4QH;hj}9Z-ra~Iu{eDA(j`Xa;Y~R9SM`(m zx|Qy(`S<&+^`GtInZ2LqzOR&ikPs2z`SDP5_OP}l^g%4A5}otf$xE{`6j5`IoI>FH zoo;{@m7!-JB%Xc;4J;<8GHTaTacTegeiakDI6lBQJ>7A>I_IQMKS$k*9Av9vL>7u& zpEtIeE3F0iIcp{iG9`R$c|%k+obz%siHUP`{{=-P%uGgoZQquIr69r|?wFq+B(->Y<1PQ^9H@-Ul+PssHi)1jpJMhQkDVnw{SUbhOia&83*NqB z%_*r;FMfI(DIpqL@4e>}tN>jkO#co3%PCFt(Woa+N7sp+Kj`7mNAAb3zc#&|y!#u2 z9@*R_iL)&g4U{55!z8thX#GVw-s<^10rqVRbABw!#GU~W=yuJ_2gX?v-)KKi^?x2= z;VO^i9Bd`Kn`ikeN$-9_7x+SlfkwE|h!u0=%SqEuZOx^ISMysvYDvg<4sIRuP4jX# zTMJEj22so6bC%!2uVRA@hgt_TYf>d8Nn)k&8pR?%k#cWj$_=|L>GJ+9?KK;9Fj`JXE44qvM)|K+xIg z50XFk@SR|`NW-yACFLdO)K3T68T|V)E%7XQd1%#GIk7eyIJ2cqM(T#{ff@-bSUS5yxEgorFJl`Gq z8bf|&Rf=~cX=#h}HQ_T>p*Ifr)i@OP1z01}XW`&MZ0_6VOl}U~KS<(3PH%XhEQyH8 zBfr1CN$U_3fRK%D9PcuqUU{!B(?84lTwEVNl+1ks-b}kDwm?voqs3OKOEkP&m(Tv) ztpOIW3cOFU4}CJ-UR)mm_N5;Ir}gpdVqt4v-9m(ap!NaXxl~`goW=%dDzUs=pX_Jz|GOFKyXzS7c!F zSp`)N7Iini*^7I8KSomPmXz*eU9fA}tLBQ=h)8?CiqwULXoEY}<`)*VSn?$Ta-gJY z%kF|VS$y09UsQduH?Bo=1Q9{QHo_m0ORloLfjKOKQEP9w-C4#Z?-?xrJ2f>h_Wk?! z47U7Rsd7Z$#*ytqo@_@FR?0ne!YP~Yi%-ZlOOY+bwK)Y6pa4c@usCL{;g(;Ws+LPWi#*mLUWu8ynxBBRRz#sU8A1D$N>h>`PmMWIDAACTgi}Xb(YYaw=M9C_)5SLH{ zmB9rqsa;J@sYiF_>Zu!n7sb#u)yIpPQ?CQrBjyf;gGrb$y~vbLtFE+J!P5?-*XM5) zU7RbynHKACp+iBXH2bs#;dQXO{yOst9vQntGnqAnSfeW1Uw?dKyhx>&DqduFqRIMa z_>zS@b&64)&K5mU1RU`fzC6BV0xDz*gR*Gv`3H}y{r&|G1Bcf9dJ?P)V`sp5uHdd= zfQ1D%f;U%+!x(6*FP|w~UpTzD6C@FyRBlgilgB5TbSXM(q+=iNfT)q|2@Ss0o27W` zwp46N=t*yj)2?yv)HYw4G;C)1qDeF6stuZ>969yv;J%QEK+<`P}gD28pJdcdw;58IOzzu+a>9P)BFcq z(Y;H#rksXz+Y@;xv z;r3L*bZ%H*U*9@M^GKNY^S57n`3Vu5wsE)VKRc?vy*agKlj#n0n6oNa}R&kaEtvyf&62n!XW^HLzPIl0 z`iLJY25nL{nVHmZI$3San*1~6CTo!`yyB5WG+Nk@Z zmT4MJn!3al^|(N%e0k__KUh^yt;`S)9ntu=dT!_-@%13w-{X-#I!r>($v&oDnbnMskyTj^s@Bv>P7N{C0kx+)~UW)bcQs1JROQ~^=x?Qv+yv3 zQfjR9EWhcpWMyX^lmZp%Dn`!ET3bBclYn(}+kSM0zB(wuMwTod5t|CrAgTO3Af5G> zh7m`Hiv}H9M1*1)Il@o1QTwpqtQf;W(sVm8Ve19(6s#yAjM(XaGTpk~j-z9nuiDuK zM1K_Lrdz`!Y|N%{c_I{VoB<5U6iktgV3Gqd&3$0H+HB-S3JfHTx}=L^xR}=M^sTY} z?Hg+JX+XN#y0o~o+1})LBt$d*tFO`;2pIz#Swr8ybGH56AX`?)vCC2n65XSI%3TtJ#8fD)01C#S)>v$sfKnC#v z(yJw5itIPTW9519I6I5@!O6Fw?8h3dc|`b*49U2lf4j)wIXP27j?|xWmTkup9Sq|i zAF+2xiPv`!rqMILFKcAoJl5{ddyB;Mq}D~cU1G%8O<*QXw`cukLi8MnxXzhJz2YC7H=I6 z#;jG*{q=8HM#J^lhRXi0)~ds-e&A0O`uarJ;O4aEH%jE->=vz(|D$w~WAoJoVKng* z|3|}K-~GQ5E2{8ZK4&`^fEZz9%A$AblfIq%mBMs>U->{LWstxWX+{>g%5RhM(q0&w z$aI+KK7N;$4#jHT#jVoMG@~n4&HOd;(3;3jcw3>Z*VNu0a0fnnOm9Op>s1*D1KD~! z2i$F`^)#`4aSgHZxs+Oo%?OVT$x8$IPDs$nAQ^GbY5%@bw z#Prk;SvZH#!6Sp5QQAD0TH}&fDd8lEml_91Z9$kwU4yp+?Egp*I7^MbG#=#3F*nzU z@j+dw$f6|FvvjGzkS^}g#l7}(X2Ot*i!->Q1Bs5YMBq~e7zd^IKyf{(2>4l%dTm++ z++{DoK=pH^XRCDVNa9;LW^X+YMbOkVsZg_p8x7xifu7%j$9uTXq zxlWkCr5el*pD-x^U+eRPkKup0qYS;dZQNMqs zo7vDvr1Zi8FH1w!4a~{nO8J0@vbw*1y&G#nr(v@uwenn4QPllyB`mc<)%SVB91juI zI)_^qn3%hNF&AUpT`?op#%m1!kM6CJ&DOA!wb7Nh%GWy^nhBA}UGR*OTuu{;9sY>)#;#pqE(Zg z8A7z$hqJ?O{soFCcu_*+MTdhN$o%;|++-l3gVC#7U6y?%Pgh7amR*o>7z*F#7yC+& z4{sNaNf8M2DZ&m`h?bg}pkYwpv+J**Tf_6Hs}GOtT$yN$Z95Dg_g1@_iaR$NRe!?Q zKH?(D{iN?$?^NR5LC+qWh!wp6K$jSN60Za%2!I|3q@FY>8SXNI5AlIBo9k5t-KU&_ zL10Q9(7hn`6d(>5N}R=j-R`}nUX#+`{QPO#Jsle%Zo8ZLyE11iIRP)vfdmLyF&TYI zSGiCBBf7EAAVrXLKu)yf`0-^nkA%4n-EPFwxq4HL?=bV?#JqQM>uEz81~Ml|Op@#L zB9;n=!cY0%SX^$X21{`HqF0Y)MNClm{ieNR0PJTAoZ zCrG%F>w?U7Gh%wmXsehj0L}W9kXP_kBK(FI0c%ViOtznw^#*B( zHUEVqS5GXR!C>d}d2;kse*Gi}V7?X8MoCOf?u5>=KB`N7Qy&%O0zW2QH&qeY7Tyy4 zS&8|TJIL@cdon$M_}&}K(*PSO1D|SaQ03B@!rYouZrF6u#+PSTX-|vqgY3S*%^>W& zSkh?Ag?9Ot5@I+ad9F(tiA?#miwx}iXY-a1EdxccToQ5Nh$8K*Es=h@*j`0aq#VRb z_#|_{gebW4!bA`=?BYQY4!IH%yat+ z=e=XnlF2&CS$%)Ec==@dXJO_1gsko|GAeyLeR1Gv3wt{9i@2H^^_m1~kw*#Yw%I#S z3iU)~C3dtJBU}*(OqwT=nMz$ESP<%-!&r%1Jj9o>U{S}tLc(WIGOO*}GEamq{nc>Y z+w5P;xWms#?2t**Ew|EcAtDR{DXs?%q&LMK&~1E6t9LRjQ;OW`ihfjf;mQdm;1=QK zs?=hRelIA{^^&)J?7N1NkD^D5lRsYC@UO9Upmxwk$uQJ~l~TOaouI~-q`SuqFP7CC zf&N#zUaT~(bYs6m#gs9%t%g)9P{n${rodtmJK%S8vL9`irWp#*qTBn&Yrvs=6~nwu zMj_~%ufjf<*{~7taHJ&C@`1Sy>4L@v*I^H`Zve1s2?d=GC;J8%!xX}<6spmsaSa=I zLO!W#taJIo!Adej>Yt1+v(5DX?vAJctJLub(Kx}ih96lb_UO^IOlPWi#BQvMPNAN! zSQx$*b6h%(ozHL>BA#um9RlW_9wv2xVdwyJHwHk_LRd_uYrINlaCpR-!R@N@6Z>`+ zS_!iu9eP@Rd=Uk|o6M)dV~I6ITjOq;A=0{+X0U_Ath8gyOTA4xLSN>me)5^}8Eu~2 zw%q!6jX1EL#?=?jtuCHm^7yX`orYmJ(zIwOQqaI{zo8QgzXxbr)S~~VZ=abh<_R^= zq}8)JEQr_TNJ<$OEt*K}3{z>u=392eLlM8z{}c$I_lGwv+G1)qL|or4<)pl&##4>^ z?f!T5@hK(CgDV4lW^170r-B}<(2Fm>9`qb~8rx)LcE3Yx zsZFgkBW}Z@gf*}dn)Z98FW@F>u$tQxGM1tcN^LR~`Zit^YdKp)DWWfz460$~>h=|e zmP8abGKJO>6bp;~x``S7HoV9dL$zRbTo>--)A3Q9fOy=3vyag__*IoK4z#WrN`oBn z@?OeYFp`Jpv2nvPX;1<4T;jvA_^a}d?k#ltmZf>yRw4XBGj_j}p0c_+=awR^mVA}J zA4<$9K+n7BmN$dq>VWiseZpq!BNKSBCsmW)9l1GHJ4liG*P3bita*+sbIK1nDvRAc ziOjUd4<+JXu{o-KrPGe6@K4yNGo)q3)tvskD8?#s^Zp)tmQ~8h9&4o+R#hHVi}FPX zIpSO9*HsA+<}GH!n8N~V-e(4l11}s9Z?Y!RP>dbZ^`XwMEFH8lsoCT0e-<*(gBWXD z=taScS7Yns633nsDXK@foQ!>C-Jn_f9Y!2N=ld`k4b*U)%*K-D=N~O+GjoXa;HAOo zL&L1uLf)V6Ksp%23m5blE&0ttj66mY`(aWg#RV?xH(yU4qkCVpgJT*jO44G`ZWhSk z^)ICTv_m^F^*3MJ!Hr_B0t5co47XhN#d@FInl>8_g6mqc&Xo@)!leJGL&(j6|%+?{Gza3p0IzVS@$1@;&-!W@#7woH3{p zN9J~!RtV2rsBFyo#(;(@u9W6Q4G(lOqzd%*(dW!s47pYhFAyJ*ySH7ZhrJIw#iEM+ zx_N}q@x|;|tfQt4x9s^H2&)bYd=|JXK_o-9=8&%DRnmr=y#75eGl)_r<fMURJ}NS|3W=RcHlO%9$K?DI&aODii!CuIJb#_k9F zum8NYOv(?cb=!NJu1C?1tVhPL*sV=WM7ivpoS5iyfq8?`4zJDY1o5>L!Dj}q!T1>L z!N$I0!g{ozTHW+>JgnbS_4`5`Vn;K~uEM)*Kl-Ykm&FV1bi4c3N%X~VMG+sWRWrtza!nD=qbq;Vp^RqS-L$fsV~f0B zbb%P^O8p@jJBaIdU|bzn4@`JC?yAz^U6}a-8+${T2AUZ=9DE;;~>TKGX z#YEQrNBKv01#gboEARUS6OrE+iXGy#AGBQk(x+k3Wa!ea(Q##nl`^~K;UcI>EcANd zcmuBy3>1ijUOb9E6i9Te+yHA0-jRSvixpP&ub{S~xuY}lqt({7 z#DQ&YqS)C-uwcGsgqjl!$gJDAm~%*(3W4f{Qwoi|NOlJhrXa2f^qLwp&#em*akP7U z4r`z|{>@y=o!{#R?Z0?XG&VkiUb4NpdP8S=zDzXz+xsCEe(|92q}*#foz-$l7Na4) zcbZ(OLoVHv`=~aC?2BD^W=LS~czAMn8b;&n>YJUXx^`;x8d|@-csDg{W!n;#dp8c4nJBcc5+-X;HArj%7M zK)UZ%FE8tLU~KHA_XpyWcRs!hv_F=)m0{ZH=bjZOAH`2ORWdNX{`|SeDfLCr9rSOB zulf%^`1(={Wa+92;wDuGg`uc|6hy1|!TIZmkX={a@&Xg7x|OZf%C=AKKO5-GfrM1*Vl#u+xS(mtP?w<9S0e@LHT7UonC(B&4Qq8b_pcFWS(A6X z+SF^x!6mo;@E|oLWg?Y1u8Bq@?dbv8jA9~mnZAPtbmF083J}wjjTISe9qTB!XGCY@ zan9NukWXF@D@N10EVI-K2+8$@KF9PdlAgeLeNDIWr)h%0pO?3_M;4b}n&w26EnFgX zv!LW02l0z9JLex{hruuFWr;$Y`+S~m4psUdkEWpy_iuYx!PC1=u0DQ20rGd4@r`(I ze>M1fr{hw5EAXNL_ang%&y9tN+S0=neM&l*c9r)Je-tr@G{x2nuFGPB}ahBB97Onj@UianQ z3Nb+s-Cd;kHzb6{ud@ze;Y-WmK!ZUeyRdNHW4Y-Ux8MDGTQnWZz^Dd@dyOQTOWMrJ zWIJ5{XYz`O7wg7{%&s@*J@8?RD20g2`W^*8GBJTY9XI~Po-94nRQ>wT-{q>~|M%}- z+;^O)Ij>+mNK@1-tv2Y9?U&@*CvlLR;YWqsl<`^w$SI30iCOFvF)NY+xw$Ppt1@J# z_ycQfSyVG0-;`vsq65X$-aYl+{^zee%cP!d*czJ~i_6bkr?b0}_Y@mlfjgtH&V>u} zzj2R9Mgwy^Z-4)oPepF!ZcAUJE*ooTxFtp>J6h2{z zpkG*C*kbxrTYZp;y?0^H2<{0P1up> zgNKKw4NI}j+XLdJudmO?$tfTrl|y{X?ob_gf zBICqX2nr~grU2CdT%XC}9ijYS(CJo!pP8K2XIDCs&fB}&46SjqqSiWi3NxPxl3$ao zPOQoa@$o>Bs)G_WIN`1SLmmA=6f?NF*?n&Ayxe+2Dl+!dxmCsX>&b@#kf{aw9o%_g zw?8kbuqlv)bwKna6OjN>UZRL`_Ql-33&mz*s$lSD&k%%KdVD`+FG3T(az~vNRYL4C~mPBsHV1e z^Uzyu$hq~O_gK(7z{_TqcY5cYef~EU2K>VO>AY=q)4O?w;(_&PaPICI4f>vDmmMi5 zP67zTLNf_-NqmVfZ(lX>Aej{&gkH3tzClptcZoIt&ua(XJVSk+F6cEBGDCM-H ze(jvKv8q$jZ`LupnfO5`WqV_0#cN%MtoS=95w(i;o?5aQ83U8o3hNzr-G8o>=DAgl zKZIFh0k_OFH0Ew+udD6O=j&a(?3|~kWVRRgv#oU*!FJW2hE{Z1#c2zpBtJY zjK|39+lq$8f`ctkLlFLyR5cmfqXk~;`fp?STX9(2)MIm!Y#tg+ymu}_Lz;T{K8}t| zj0maWk6^&(ep{>;eGG%nFRUvp-j{0fIT7eiSst=k9G|D@Qf4d(F*k3rwPM99l0O|H zr>PsCQ}VsUb{kl9QWFsYNTT|LqR?c0;00q=9A?FL1uj&KzS`ydv!4oHsVJkTVk^k) zC>zNl7|$a3$7l)Ai&tKiISrYLP3Ya@(Y(B1ECO@{dIr^2*GEn8mXbm=3{RSEa$9ld zSY>}admTdiS8v!kLz@5al61F~EL8T8!SrWNJ$;wJMTh>y0^2%VRbjTpI6kM>h{GTI z;Kup9>RUE;V~u_ppWDTV=u<=A^M~8*t&4-KC5J}A6E~g$LHDbS;Kzyz6|(UC#f>ER z!#^sAl$BTCsBj2Ix2(7-d9uHM+xf>;9c6ha$9vCZ764|YWFrB2V#VvhmB_+KTGF|F zTWg&TQGI|H`UDH5XV_=XTOt$_ZT(A-Iw(%{hgs)H^;24ejgu?jeQ`-Px~^ z9UM+(Q)6bWN#C3uIB+G6vyy;gGr5a>T|BKS^$Q=i)uq@$Jxi=gy4qWDfL^}YU2CaE z^7O>qlJ-$D3}{IM^eIWavc6qesh2d;->>zVc%fhBphy=zHaBuLSlow^AmY&7y%M%X zGR$AsJ7CBi!O>Lerf{5V%aC+IrL6K0yw7{wgN(e+PF2H+P7u{(uK0Zs2nrcRxdZl`Z$m zkt?;TmmtloBbt4wDSbRm2ET4Z*mi~|*I*+~-r?x)Qce@$MIHnsH}~%vl%h9Yn9yc- zEg1aMp1}g>x`{ovU1$AnFu%sFNy9|YdG<+ya}APAIo8YH)vqsW0?wO+Oe--k;07Nm zp{K9PEaC6EIN|~GluSCpz>$v@Yuy?GD6*Dj>sFoTS%3N93JC$Wj%jA)oz3x`Cm5~C z>R>%i2y?usqGOz_wx%YG$EXKhyqEa3E;EF$+b%wreLRo$EG2-$zroN5r68wJT8rTiI+$m$pn1U?}cvF3z zp3+==d}<{Tc?RfPxNpz5G^a)A?@_@fWu{nYM1$|KwH3H?6u3G$sP@p;j^$sM5=3E& z5}8sT_KhrCH-!2AKn0;sz|XPy(mG~i^n@LlB$uN#u;W1VxS+7n(SGFGtQP0Kk1`#_Cy;#B(K=95aQ(dui@Ltz*bi zLw!%?w%8lu!XIEba0m#$i0kr>1%hS~#8=++pNjLS$;et>ea9fr>)B=tx<#uPp|m@H zd)<7VCMG^yZZOFe2};~WuWxHyIiVqg0b__eC4&+EI(~>c{z^(38;1CSw)E>9Os@MD zi>VK}BaR_40XhRrRgO(7|)sT_U!Vhsruk+Ht1#W z^DFe_b*b;|6?)^GUnUyCVS;!nQZTf^!f7j=A$2s4*ba~cWFj6UGr*^M*iKX!G@ym z47o^Pc#C>{gxSxms@8V?=%p!(W8cOnE}Yc4sP^4b)}mU4XTrwbKv237F!1Xl!3B&& zGANP85)_Dj3%Ut!kWURNZ>lP5Zx98(+r{znMkezoVEC3*R42Cm{)F9$!yS1sGewuS z94+o6q)c6M`8`i;di13YFoG6+C}9B%2+QUze&XL_hgZG6D8fKGwiXS=&$9LbLiPz> z1|56K$raPgLfHJt5tbU!BQi@^ER4CNJ=u#DZ@g+t(`?GWnV&ElSuspQc(^zEkt2^}bWNh50>7^{0P{tWuJ11sE1pDS6# z(lK-+7%FPm=ZAPk8>gT3^zcqo-_Z+hg6hF8y>&tH3>4^UR7k2bdCPsd%%g)-r@|E~QImJ(Ho z_n%@6qRppAZP1VIRT^U&J;gzsa}}MJFVoN zlN%HNRBqAZb==?T2QFi*RTk%YbM*aS$cw@l+W|%>&mph6S{oi^hAV}Q_ha+>7bf^= z?FB5UVfMPGKSl5|m~Vx1j9pKVv%AL4a|K_Y^M|B@_?Md;G;0-D$~&wGI=|_JL%!N? zHWwE3fh<^4S;UhCu_Z|nl5Mnf^y?D#(vRpG1fYDn^+Xzehq!Ln+@aN_X!7k7cc#E z^rOWB@7pX?x82UIo{)w7Edc3yMQ1b(rz@(9=|cme9x^bNNh zNT2qN7ECs@D_LRNSHm4>Cq{wDV>}3pGeWp3mDoT7=bM=9_j2Hpf`$siv36b*>Nu{G4RT;p}QqeqI5B|6L@3hfzU-v?>rBU2D?rtXRzM!yY zkJF8Xu;-(it%b6?4&QVkgBv7QqgYp!Y2iS-)|~k*sM{N`5H&zzt~biahNa(XRVcz{ zh4!@a)FNQCk|J||wx-IA@3=1EHWj&S(1kpr#cav?a($=6@v$|kKt)#9updLvd93mA z(Fk2<7i^5pU39mx9f@@&?3;{g?rL2)fqz0wk<;t*7ONkF6+5*;hOrs==v@>qvNkKd z@W7vf*mQ>ZjO~<&0^7tz^3`HeEX>-N6=s__6a`C!?u;OZe53bnBdKjeHm?DymW5vl zRAjGmtgYbMo^G2so^9MzlT^y2-+XmN1Q2qgS}p(~I1i%G8M(HUCSk1lWgqpZu9!ZX z1BY!@L+ZSjQ%G1K`rCq;#9;L?aY?Ka1N)tb9qxP6b&7=8>jIoL`r>1V*T;V@)6BnE zDk_UiXPNo6HH!vN=%?<9CdZrh>A{hl-!_G2^L#$XDgIjPa=(sY>-}%Aw&!5y+;^~z z_&8dM!NX2f@W@kXvI;(s;TKXdW(*V+KQ zD4DRIhlK;@A9CX8Sj)aKak0wg@VA$AAylwT{#8%q{6!FtK}unX!1j||EaR}Q&gT5i zouK}Rt+lRXmC9lyd%SxV4jf=@7YCHM#o`?t;Vymf+t0!XV1F^{+~r`gj?UAc$%$&4 z+TUZ}DfRDmY26(HcyMNeEj8nO6q*sW?3p6(PZT6s^)G} z`PHr3cR#VfdNj-7E0!5f4mN60lvR#|`Q5@3G6~615sl7Az+QB@_BbbF(kDwwUJyaO zTjtI%S0E(dcYqu-1X)$igqMyaMXDV|S9-4?eX#EycjWWjWterjzdm2;61PM9PThcw z!!?i@f9*v`8G`L{)^Ns{R}`9ivNS{3HM#hSi{c=finy_*6rtC9dvzBJdVK!Y6?`p- zb++;Jw%Q;9eL;JutY4(w4G1PK!G^;Qx<;t^O+;*U%rWM|Wa(zqsu@;Sglp$PE9VZ} zw=(CA%cA2Ql2mIZVt@J$0aF<=`1iUdNWse$bK8j#oRcr1i^IDbg#o`U(;RE{5pG)s z5AxHBn03APRPwKz`IAqLuxl=KwXIa_7 zgj%x5DYY!TK-lI=?uH_=OK^r8GVdLUWMxm*8hlw1%q75Y-Mn<5SKe63$i~*dk5^xs z2kbB#+2YPs8Dk4aK=%#M|94ya*<`oaZWW&VHMET)qi_At9)9LFyz{6>m`BIi-usX7 z(w_4%EXlksd@79vju69)OR!D=h?g$_`R8v^R$ljITsBdJ`1hS%4-vu)lA#c|C(xhs zud2Rx+;JpSj_jS|+y7e7KQ-3|g&kU`{xQa@UyR<7NS@*(^la@{BQpPy-yY)b9iu3d zpAs>wT$A;j7yOuDBBX%)@^E)N9els}dVJTWT{Z@7>1=DxDX7sl(NW-AiAOuM_!5f! zaN!oOCa3@C^0RCdnL)muzBzhf)%(QoR0cVFF=xsud2{3e_`lwE;yHCz=c#40L!?9V zUHL{U7UGk}e*9CJdkgNnf4=ZJ#z1=DBExi7T1V8q{&n(V-S@We+SMM~5p*lotm(EF z2twOKdW{Sa?S=)?B+UOLh|i&M{0@2dgz+R$n=9e-1(?0I)(SSY`3#UvEJZ|pws_%b zG$Qkppnr>hF5xpV|9ZZBcK&K)R^8^v$GI{;FFR*pZJjYOX|3+)c?- z_~OZ2puRtjwiU4WH;r_QGgxfpf=I#sv7s?=6?A`A4ll4~i{rpR07AAnU*9#VSrqUn z72as52^!)D?~sWDDwz{9$OA0(1c_`6+A_L0EPd^@2e<#KQSVF~Det_UXHRhd+C0bQ zS)i2V!fN|6Yu%t4RVwLgZJAol&~Bz5t=XXfQ_8aZ(nIT=Hc{JePjc1FC(P=4@@8ai z0#PfhEPcN%n$|4dO7;aV^_UVZYGy12<2C$BV;KWw3)Dkt^URB1(TJ(ZT>8WY!PGI2 zhs0?#pRyFK{?JR;hI?_TKVq+3n$>*0YI`8iu^rWFQmvydx~wjzng-i~+rbv>8JkC+ zEL%^7CE{1~vlR99^vt-j{E#6}5%KWElK97%STcrFf7|je>fq+$gq(;mj3@ThzPnjkL&u zcSDj2{HOVufov)AZ#N0hLTi_s84Xhf@|9E<12xZ2!<3#Ho`LN?# z>4^P#62lsrG-mS2Z2d0eN#j|a|4iRHlvtAHNMy=V38mkNF;4v# zC=s;d4jPPt6Q|xrrG_aQKS&`K@^JL`R#90gF@WxizSKZpgCFa9-#)v$d*^o+4bPbv ztL3L$Yr}}^;DKxv=JH|0OZ_wJyoR@zmc=t!LrT72C2~_Uf`u!apEwK>Jzy|+nrlU> zjZOgd^KjfQI+AjHPC`$qO5cvT%yjRDBy5Bb+sxL4JWb8NJ$dxb*j(21B67;oYPxOZ zFr*7qcmRBBK*f(Yq@(4mGYqF@NdDtVI7H^KjHCrO$qZt-D(_2*%$#v)AAQe@*irtm z(4)4TwQMcu2p1LXrIPveL6pe{tew3(0_3hzC`pL-9B!G#%p~udzSQk$Q(1t#lcPq0|hcwen<@Kzb zLLPTFD5)VgCT}sDPPWzO6eLh4cqj+HVCLn(-~4ID6sbeP3K^%lx&OUGvp410?58CP<>1=5}yCV!G#iG#Y+Q8Q&qMOK}a9`XlPqZ_$Vz6?EPwONj z#Vn+&L582O0ki$O@B*opgbYK2mp~qCXg&vIR)mNDni9Gj3`6f=OFllwwRN`$SNns5 z@6XEczs%WB7Cn8zSy7D4Yl zx*+m18k>$jP0lTx{ktHlSxF^!&|2o3=WkfEWriATMH7%;HwodjVSTqoQ? z8O&fHhXU-$`_!4&dnab#{n>1GVS-SWpwQBwhHXK`tdeAmy z8NzQ^x+Tb#itQBnI~v6qmT>aUPh=_lBhR<^dmq`WjZ3Q?vI?Mm(nrSRLeb~UT-V1+ zjR+w^=q7inng=pAYabauNAi;zbzpm6Hz1p;pz59U&4?GVmf=lLVGZ?TrY| z4on<|23ro#zcd%Kify>K`@|62Ffz1r$GGk&+^} z7Yxtjs-iyWrzauFGicBjDb%zG#LBO+VYX}pTp?bt_3S?|F_dol`!CDc88DYa)jAEs zcWEf(AQ#3k9-dCn-M+KahOee^St`>d5Cp|$60EALYgoh)m{uGEM~!pe z8&G<9K$)hQ4tv71$C)$vwC=t6x(L07&d;qXEVg;y-sso;%_i~JLn-i~XJfFp`H#Q7 zl{kt#?T6?jcs4NKxO7#wofd-bY2)W|tA-cxs!^ngynz6c%m5nI*xuQQMOpLXMk2P( zhJV-*DS?hF(C6a2Ip zv_yK6==$adHPzD6a&l5uu;KHn%3 zN7oqz4!F(W*4J4%*IDu8lb9BDcQ8%NdwXJ$!k21(NXNF;bA5u*OsP7o{Sqgz(Ttp7 zG5M}oy151;#IgJJNuB;>h@9?1OW#rnCKuKU#39AccuJG zH=@A9bxt&}VGZb0ew7M8m@}US$vaC2ow=~uECxW;q|M|!0W;NEm}bu`CYp>&E|6$q z$4ByeJ_LJqxZ?i(8m66WFyS$=8Q^9+LzjKm7K z-*15aeOot}oK%`QQLEaIiL~Q838Uos8e9;~gfi!4^wE_M9>JcS*GJGEZcus?1i$qU zwK*ny+e9khiA!9X7aa^5Oy|d#YOoS)I#P8&L*15%^k7GlPZjSlqgtB-cJ#PIZyF1( zPq3)l+R5WT2Qx)n+i-y$4M3QkGF{bS%=kXH;W7>hiIEprrg|C}bV@j$-YPkn_y^lB zZPnDCxK|{!-=b$=vnmz2sJXgY0Z0+{M=N42G(Bm$u~Uf-=FkK7jhL^N{P5O)W374y zM%n%N@F85)3yRQWK?|;Q6uD?_l1VN7x%Gh8ri_~;LLuV(prK}ymfT;Z3B83_q7`i2 zX3ccc9q_u+So7@;i*zs)5OFcVpn9r;Ve=F@)mB>5QpHdd=3?!}JX399he8hw$DZT~ z7VtL|XQvLTstbsLaeXJG^W^QJ<$n$#n9p>4CV*ib^0;FQj_A_^N+V^ROYx0+S? zkiiB@TTD^9;!*D#;!BC@vxaj>xQ@nr4;jDCUbImwcSdu_(SsV zTzcyd0me_cn~HUkJnuDW@vKN}sd1P@=ppq%K&m+wsn7rG`cx5riLIas$-!bVQT@P@ z{Y}E`#}EXLC?MIXv#4NWX}c#Os1uPY06F-=w`TB1nx$8KhN|=k!wwLY=(-vem}q&E za!vh#Fz|n&M=st#49_*0xTIk2>{q>R{Fa)jrSr-rO2M1gyd0f+V*z*QnUYE2!k>99 zc`jZAB)y15+XbZoYBS6tmElLGn3M(5m0kY&qdoiq&y@vz}@j9t0Gu`D$U;K-YfnS97;oqhDRAiM^&icl>!)7SG#CS z368*hK{93Tr*fF4+M>PhFw2iMPFR;bIM#-Jw+#2#h0KLf;w7BCjr2;w3Q6@S0$Ubt zX=7SLc@NMF3|wdxI3VX|XjuUqH@V(!$>7)5tyTvg%}GWQ?S5)p(+wauiL#;x>~=9) z1-Pd>YE<%jfcS=F9yn}mIqsRiK#m)bzYE+WuuxF%8$As5WOm3aaA%Yb5Q#~`072z| zm!MoYP>Xdgx67lsu`-r>0T7!Gnw0#Ieuw*(Sq-RBuh`UEL`!#rJ!Kwwz0&|+fb&^Z zZ{XM0Oy!qT;oE}Erb(#SVekUNvbhA|T%m1IBDVqPMx` zdA)1dX7c9OuPxP%zTk`XE^jfXMx*&4Kaw}&zEu)z$id^p6}tP3o(+u|`s=sa0I}4D z4_Hyr2Aw-(xI97vZ$ax#?q35yq*CTjrSRene332{NcUgT)qvGH9|5x9$T0kWM7?ED zl>hs`O}q5cEg+rJAk6|xcXxMp_W~jzjiiKhD&4Rs(w)*JT}s#IzWo0FGxvqRbzRMNv-LD4(c4+W|SwYsE8z~ zF>;tKGehO{cAvXp-S^u!U{}X0mSv}@(T^=Yger}cKM%1PQ~7ri43u)Ye_@R#tfNqZ zra)P0$+`HaS#5o3o~VqwMO${XNR&_}GEVdWo7#^`DkSTk@~mAt=3UL2_=MV0^z^2| zqib(@9PCXgjN`crquNW!uUqVDTrS3PmCN>R9?ZmcnI?YlSP)*|e5u#$J(7Dxtd#*r zGL{l=Kd_{Z*qAVFGu78D75v4rfW+tjG6Tf3q~+A~wAs*qc|V*GNp=Fj4^f362d;Oo z#X|woj7}MyKV=8hN8 zO^3b6`<*Pms*wI#^7Au6EN?i`*Alf$tN2j-Cy1~aI#n#%*T1;9e?D)Ul^zrjazjfT zM)`*R`%XijQ0stW`1A(*gJc^mjm%C}Wo2dY%u(d_$cQ6@JIw>A2W!hC{IROFenVF) zE6wcpXiv3~5WgsV#g8HDdwr>;I~7!(6dkp^`%R2`vP?9>{RnlqnhgRh|j6@iw3{?c}6m z6q(VaG|~YGEOJblr-SGN-?Cra%fFLwBGUA5tYjU2jY+nK0cNbm-ICjqVMwM`z4+RX zG7LsR#_ag<5kE1q8u~!X6{XjXZ&cZU_? z3qIIm-3IQ9h6yI_k5ihsngy)#>68dwlTMp)y*?!o})U-we*twv*n>VM2)c`0~ihMJ7OO^Ba+NuEE zs<}rcBPvn=q#ty|&`-)P)bD&xAzez#Z&+M5ZG{O+Lz9)nm;SfcZf$MFlo9I>4YQpd zok>w==#3nc=S&mtDpG+?sESctkXt&cNUx>IL`d3m8D!rR*c9y;X;0ft5J zd3FjJt+REgUIbU3P&AigwF}P*SEHQ872CV|)y)Vb=J)nsA|f+?7qESDi}1UN_fQ{Z zkD(VdcsD*z2TrNIIBaM}WGupIIEE+MbuS;;_?2Hte;?vI?L+pr)nm8u%8P#zvOI}L z=8bo{-^?~DdbJNi4ml`)S_pL~ZPUZ1XWT|F9V=~}BIdGD5tDzG!VXHR@De(+O zlW*z7UuqBM5^rPmyUF2Z(2uLpeV0c**N{5W=%H={@0+GRhhp@W>MYrOuqTu#y&KT)i2UjdNp;(7dRLpiQ{St8C>w_r>7 z&NVVMPoR~Y-R+dR|0o8nIqs>eKST$ah03UeAz>O3UsFNB+8gPHM}QkWY^uDBau(t?pNi2y-s>_UH&dIU0@bY}} zG&=(1mkEg+&907(n-{qbc6p#nsjJ%^*zu?~EseK?tIzB-6v}^r_nFbd^228(Hc@+m zG_5Hb;rE~O^P^g)5Dej)p&veO7ewn6@>Knhvhv4dE8Zs*Ks{XyOe%h)qRLH(`LDLw zY)M`lCo=l_HvU@z+_rVY47df$bdLGitvv7X>Ln)7^=j#R1g`*e^S)7cYd+3r*+*Hq zp;odD*RW|9WIby|^^ECvz<}@m=3_u!uU#Rd>9fg@vPc%60W@oGfGfMU3pILr(yC~> zwT3xCJUt=3SwPMKJW@6A5P}N(C6=ab>y~lEKZEChQVDjI&zz?aB5>hya)|$6%uJ3U zG=+5?*o`x}Fwu6=WWQM`g|zM0s_gDQc+ zb^JpwE%=CALe39s!0cdztw%6|G+3KJB~qA+{2k+{a5|8r3lBJK`c7$&SoQ9kShTxE zZ>d87F_z!_i;Ke%Q!yA$*79mi&Ee3_#tCT);Ph0~HBKo1^*cZL@c8a%482u&BfS38 z$D~ghDp%;TZbcW~eEb88T}J-Q3x=rkW3{at_YP81MksI{!N}KxxYZzR-DLn#4!4!4 z`8NOZM*?AdQVku0_UKXIaWqUo@Kpo3ifMEH3$zz&%LsEs;E|%!tgwIjQX#a~Z{_s7 z#+|&xVz8oL;E@gBm1uzTH*~}HxAU}Z1No!fA2YEe1JRtsY<-dM5Xq1bi;><}2;76> zN9{fOxJ(-7nnE_%V1EE^<7&KY5qz=33njdWWY%GZepsDQN#lu4fjjaX4wW|LkBo+v zYU^p1uBbL_m%Z`HaHOQl9kxzAQrxf+>YJgh|tu><|!SxrtV#GGFHf2=PD~2a7Hmh|839{Q6t|oxCQQB^@x719ZO~ ztRBWf2zhdv+MI`bU>>8fsreGl1vw4S$$&0MVfwTbe^Pb8&ag6G>NBg4f z(0b1y^^RQZn#uy3xVTyG?tWL zT9p;7_r%4;xd4SPAn?8PASn+p^o64mRLEw-)Ip^{;)Jp7ztoZUEd8VS+pDt8-rxcl^B zL@Qbm_HWVbEl=Wm3Yw*#ON$?UHYEDZ$uPK17eC%B>I>y6^wiA}BrFe+`NV5UxAypn zpJj0yoiv}}q`Ap>QxQhEV@kHAcq~2ooMN=1!G12{l9_0OcI-toz9~uCuaLA5Wcgx( zMu86bM?12_QHg2aH{u3R35IB{_oti!)E^ypQoKUkd zrY`=HOwNB$5)&N&g#W?X=KId8k&97OaIgOH$3p#ls7I92@fO;|Tdfkp!ZWZOM2wHFY9Bx(ahR)-|_SLUyYx_I1yG^ z(Y5O4k~QD})90;?MwV&X;)bTf4`<&D(_&s8wDs*&nrs)wMp^CwN9=xb_M$qeTsL|8 zH+Y~{d*!#V=fW@m6MPZrn2AT@*l3A~jtal`N8EBztWr3yM0k44|5d;7tpumAmwDA!Hk^tDH zhKj7SM>lOlap+(C_Ct>V@cicW-mxghAcSG$9Xcj69s`sdAWbl6S)%^X0f=8{t|)~N zM+-hVn*@J(msfdJrR2;{YLHh*^7T$uKTt?byb!}8LY+~ORvH5Mc+5+ zmLfG1r5TzuFtqM=D@<{&Va7!O0l`a=&v8w4NwqJcGRsh==7SFKG)^IL;!+*mg;vLw zo4U0o@;VYe z8z^?aR(ePVhCY5I|4X1BCQm1lOvk#v^^Tx-r~|;Bn^VKz6azdecYo)n|IKp!Q|1+^ zlb@$|WFPsP3leq%_sK>YeOuKPu#eZgDfcQ_8YJM?Wk=P7VhPI>&RhGPA5|<|f*Q{W z9!m{;(<0@a!Ejt>_K`qYHCwfq-mfnJ$z8kfARib>eg0#H)JbdO)WBdzq$iflW>;ug#Z3077)b(Bz6EmR*zOW)apSEcs*})hU|-fgU|eEf&t402ywiN;Oae?8!V>y8TO-T8Ub3U0 zT)92tmuYLS_HNRCFul<+mO%&tf(3Vcf z*6p(7>C0UZS#75MO)qW{{>rh5B*s>Iyr4JCw6vdP@JjUWX?~Cz0*J^lm3!%%S3JPW zhw|8((h`PW{LYu-bJ76FWfoK057KgzKtc&17|91cjF@{e^Se*C{&+3I`$!lLW;);@ z%QmVSB#?-8Z@sd<8jUuNU>LC0vrwh`8bD*MO^zSlQ0+Hl?&94h%n`vo?WqoY7QiIz z=LEgz)TLMb^guLO^>RV)@#?k-?^Ibpr+n5UAU*e}ND15DPb} z1@8g=10Wa^4?9FtC7Uz>IO6a1Kn4@Krls-*Zl+KKz$bAM#s%&xvnduuyWA` zr~gv5-%ENZ#;NrvDVp(P%o!* zJjzdWDS>>dV8;3&ivpLiA#+hSq)B&qQ<)$X3k=AC0h%~m?G=awSPHlS%UEl^BwUIA zbFYU4ECFyW#4Z?-c9YRzOCWCQ4DmMpsWa|W;wg*VR_v3F6fkKECJ5*1t-yEJs4T^y z64TPC{mycB673YtFb`GY;0w*w!?^B)2~}?Vncs*IVPd3Z)zPlw%)B@hBRDl2o=jY2 zz#{N|N85i`#pG)cs87{gv;1fDt0$dOOM~|{QKAOdy&*2noE#Gw+(c$3Pcbo@;|8iX zbaskNZY@JjIEoh05azy90;|~iK9XZIDuM_j%5BacQndY-P4#w*O~`Z=8a)8!dV>Q8 zuZA&ULG+{cPw)higu|V0{T#6gIJH=0`Kn3(*e~w&^ch!?ZLx zqcru64NOag0=K(l>eg@o2j&p7l!rTPI{uTH$|YWdQnVCR|Ir=FJ7wc!De1|*@i?NT#J8Qy-NYAE}3m}#Mri}v`G#D z{UI+RGqupI^!Olf_f+&i9A;uZwM%WYW{E-e^#lfKTkv-pfB24Mu}TO}?cSDV#*>Er zZC*fkpd2BhXnbxua1{c3&S>JS#N8j{0AL zT#?HeW(re?6`AFkTit64gP;c1ov)cfgj5uta~c zVx!xkxnvh6VlZ%~Ic@!K2VsleZ3<@9i`**_^U$SeG^>aea2F_kg}k8wNSy#ota?My zGQrV_;CvvdQc3r^!Txb$?4ZM911TeG=6A%RHI2_k>Ss51>zE6FFMe%E=l|`o;{~9^ILxX@3JkQ4|xE zhE~mfj3k+*D1ElQ7HO%Qr33c>M(mzurg`;}J_n^`54g81PHyChxSuQlul9XuQ-4mb ziT~wAWpz2{dWXA7(RcgqJ=wtD%hVrD#RA0tE<5#mz(PF#8{XToDoim6D?I9k$%ga7txzvDjGGgWhwd zI8v&cO9yt2Uh&zJx73of#}VcgC;^9F-Ng>drM(+Hm_;F-)hg&PV;uP;?!`gV)kJT7 zHJ=1auzeHVpsEfEqxzgYJqE~|UdKxh*)K#w?l@gN4OV%f@F;4#W;ulaSLaf4jlKw3 zJm{VX|`lTCn@Mg)rZM!r5WG;Kj|>jvWTS)J$1Tt8BwU{$r(}t3=gr zhGtx;#;*U?BgtqQl_CX@gFX^91z;);>T9cqUj044+u#R987d*dZN7+hd)+fqH^+06 zQ+Yj&ZtU(8YSrBTs*JD1)qJOPT4IFzSv=Ixlu_(LuNR4CY?xE%ejL%Z;UUF_ryA+6ogzx0o z<8(oGws&UnKYucLVvdxR-$wufcL3oBSmu4(WFwG)Bue>cwfauQC1CvPt@3xg;4hy} ztrw^OPYm3d6DxWLBkbS;X-NC0X^H<;HVE~o;r`JHNWV*G@f&+l5$=X=2;tGsnPq#1 zT&st7D>HLnbp8ixCV~hJ+!P+Oa6H$rhj4t_V8bZtm=Na0_B-#?Ip43?MRF@r@b-UJ z^~XGxdFO8X6%FkcPz*xGI~l6SCW@PjtGkRI-x)5QuddErDQnZhfUwbdXS7Z+g@H#! zBW86WIU-2T9EftR9Mv~$_%(1bAkh9A9TRvI5qWhE{mB?Z65)RQY_j_HDawt*Jhffu z%Fm*AfX>Q2*}nGlhQ!f!U6u&mcI6isxP|Z5+k3#M(1yEJhp;7nOZ(j_1eo%HhlraL3LrR0!+T?2Fwus7Rmb@7cxq`6?y3$*z$6pYAO+S#EA-9SVoz4cpNJlk39jvr;G!llAE;azC7=~#{q1I2VWffmo ze}&pJ8*3YOgW0R*iWJ*4C~^$b9ao(zmwCWQH&bUZOxo9rM8`-Ls7Ua*`}X_GxXQ0_ zl?UO-F*sHbYza6R-V+!TntDfgwLx#uCEIY886mXVi$+XLc0l(s zYh!XpYg$Sm7{zU?MNZn$Ux116oiFTNY(^Id(kD|>n_`d6(Kr^ki5#}nJ2>V|}lCv>X z0p6qk{4ZoIJc#V7SUA)2M7`cUA37n(e`wAV4nid_?5Y8fSeY!`g#c(yv1A#*SLOA3 zOUE~UJ^E^?hw4RG%97%sk9&5OJ7{lVG(j(~`AqgfX;TbqaicTv@oau2 zuT+5T@98+^B9^V3hSYMASxCt3pIR%k;QvHVQHOK*H0X)L!Q<63lA!$&M>l&M>;?b8 zlXXPyumt^WFpqFUQL@Gza^3?Urt7G?zrUyF$mykuvg&UVou-x+Hf?cr%k~dXgCXhEc{ZjN8kQZg(^EcI}RyZu6Ncuml z62%$&9iQz0<-;ZafQ;>#d65oM8W}A|zcmE+O8buq)Sp&J+*XBx?vIB5empO0fIf~U zjA?DWpkx4BdqV%sgX~TF=cF}Jzr8<~UYgl4Th3}{;-M)8=vV=Na*^>X(b`BBxI&OJ7XWkFVT88lQIiOzuyeP8}Is%#;$3C^dgyGJ&sRF zqO$+v8!ra!!y`83d%T2U=MpkkYwwytKnN&?osofGx@;H~6NjD1@#NO6HB0~bUZ9OY z!KUJlDT8ILl)c1KlME1Z0(^xo5}?0vOJ7Wo8UBT52VI_(mj!s3Twq3vp$gaDNAQ_; z=JWx3&l3B8@o}6bXdX(&o0e*isXn*zDI?A3Dy+y2uOvU2X#+dy_;v2BLzLKaz)gho zPefZzv+lIaOU2SsYsDJi_Wv@Y5?%~+?t1()O4JGP+cOu@CXFZ9YW#tl0dOS_M>Dh8 z`}{5}!*cweP>#LM5_{o~;*Ux%y-dWd5g4b4aTP<3{^YHFlEDGQrnIXVQnoNdS_#a> z9ytI#SwzCqBwtmnA>nfZ7}r ziPoT!$8!McPXEl=Hj;*<2F8aOtwu=t!Hl@_Ny>3P*u(;bULHny=gjGkY_Qy>{N#V3 zr)l3}WgrDLDcNR62=BHK;ig&)Vq|e$$UNQuLOY3dPRBWoZs;MGrHD9wK>V#BXm zR8zoJMGRfXl7NAbrZQdhWsN6yer*OCC3>{uM~gA251d0va=B zQ7%e6rW@)pUcZ%k8}f9yMy{0hM~)7>Vk7PNw{63i;31lD<2DHr6AV2{1nf_>vnf97 zue+OaH4Ec+X+A|=*OQ>1osOeO%hg&#dUTcQtdZJeSG|$68 z4r$7dzJc&soEz#_)aWvKr@!6IGi9AmC)Cr`9g2@rvr?k^c}7w#nX2BoEdT?6;^I}=S# zD{SJp4=Jnx~yNT(O;_~Z#&F1P*-TVSM1=ndhkgz{2y5jjd|jC)>5G@d zz=ExSvTbppM$BccFFdDbrKEdq6bzqxY=G{KW7!+xDe!+Rwa z_JBI}i&NNE!nAe$t#58H-n6qiy9h39xB~17K;ibKN!4iPPN-?viGcK$BYv^bi$yE`{x?kk{~GUDgn^u!RA#hPM!wBu!C0NQ~S6W$j2thj0=8gQ6J4=7(ZhM zN2cG%lleC>YsWK`Y1T3%kCZ1}k1LIt8&=aPe6S%EBaF00VX&5y`wLw44On{pcL|}S zq!Tyn*Y~x57pqu_Fc?%RY69HiC#Xe3Pv>OcNz}$`ISqAYxs{5^tF))VNoyLm)xw?) z3@Tv@Mm{LjYjnKmsIEn<)$?&}Z4j*5INQW|j5qbh@muKs@dJd(FI?vUSgdZ++*pSK zhDl|A?22=<+!Yn*CnH1t_2dKYRyi`PGeg^URuU)&E|>hj!S)Z5pPD2Ou2HQqLODMd z_WrOFt->p#M@+c1Ii-Cx6o)ZWVGiWv7>}2)@H(r$ zxuq_p>{=wVM7D$h{R7+EG*iH8G!<#7^7eC&@by~1oFKJ!`Y7`P*3;A4WSGZ)4<`DI z%+d}D*TD7Ix;r@N_fI-SA{2qqv{lG42N?_5ZQbg^)|0hBq`+Fc z_us>v@KVh)v{Gp$AXOrK!@zufR?v5FP@!}u)hM{6(uA> zcqqVoRAO!1k4ToM2iF}-AN<0mhGPS+iw@kan0;`M+R+yt1t$?&B#S(NU&jxg08->g zFU&|h(UANI^Pu=qr?2z)>4=FcBut7fIcO0G&;1Jp5nB;kmlp@xYGF&K*Nrt6dwqsO zMD4<0IQPLjHg|KQpv7$`k}lUTl1hj)MczK%zQ|B~!tw=t4{OLl{ID~+_Z2b0f*zze7~)!VYZ)>nS^>eIxKE^ z?aE(&rxuT_kklb_14`5E^u`4nn;w<0Pn;PJoK#|7*SpbrlizMKA#L`5D-uNpK)v={ zr8>VnS#U5#zz7M1kl{MUjEJ=MPW-(Qf|;2U*tt!o1bYY02U(zG#~R(Bp$(FaR{!_I zeNnB8!p@(zo_8FqV1vyZVKV2@Ojb-+%g&6;!V7BunK+o&0B{NfEo* zYT0iq5MA_!_JF(&)66%yu9`lFUIU~!0MxMt~0V&!&3c1F<(dLw(2JDIg5-b6qnOFrb;{c}fa_(-s4QnzL z?V*EEJ<$IDzD=!MvF^bv;5ry*II}sNhFbC0)(r|}b7I0e){ZuzVn-Dd3KsLbl1e|W z8S2-cKNYyRx`whn<$fwS#{Gz$sO)od^>(!7TV}U^a706Gx6!BICFEeG=~Y9MrMV`t z&XU*D<`qGo!cGCnR;Ze0y7n8g+`#j5QpaN|bYC1K!K#3;7Ai$S@>~Lj!T((1CRcb; zd@BtoyGgRu0W;KkJRNvjD8s0#P8-lZ_-Ym+fBRvdV>?dV*|@6}N)h@2yVB}R2}etLf18i)w`v0H4p9AXu?b^dVDx2b-0I&`263Y(t!-_Zk+HmYzCiai7fP5Rhx^omkO2KK1f{bPNfOX!V&$9zUZQmQk^n@w)lq$fq#z%Go)Qi!%l7$G1@f==7AMbMTXoFKxO#Hnf42!=YuN?>A{TOMOG} z*Wq{X-sxy^hTOXPGKF(h0p~kxkRb5rlByy0*k|})MlNe_yVQ{`MSo4QVKhScOdEZM z0TOJ~_2~XK*PnuF#0~J~h5nVio3>g3fhXKTbJ>7t2eAS(51gNt;r|0kvRQkxJ)0oH z0FBy%;O$pxJb{%B9e^>Zw34SLqnS;Fv6VxKs{h^|L!A|T1VUMPj_|Fo_i4s=bap(X zphUa@zMYAx6Z|43^*m-6l0s-1Ya!B!i5#Z?#p;OmOp)hqOGHvNxBC5zMk`TX`n7;ULX#;qs`HhBdlhZSiZQrYT@VePE<_Sj)^@tS7e;SB=fg#V|S7~ z7Qr9mT1IvKyE-$KsOcl``y8Zhw2wnvmdnq{)2L+_xPq;1Y}FZ!jg1vO6-~daE76-< zFx`iC|A`)34nT~QuYb!CDeVLR!@Iu=d98SX%Z=FG#hrbyG;}9d`?o_^+6bXO`iRzl zqiQVHO?Bgsc`47r;*xi)5nlhm&A&}n;ZzpVm*b@G1O-38e+O$=7GlbX`}{&27VYkA z$rsm{(4#gb_Lp-V0ED)bg6pth6v$OLwCRKx2w##X8-qNghEA84XID>7PRKwXRj;uV zlhh_fObUQaiCt8H%JJM&cn#nLaUc8E>zlp^BuT!%BX%ed4+ABNxAwvM{L!Mgr>1e| zNRD3PT+75j87B(F4=+&zW6Mzj+}mpX<_PSWSZtZ1%hYt}ckS?9H|D7{vXy1`vK+ic za*gHW4V_TQn}j=$gS)Aa2{?)nbE`)ei4H0AV6DMqc~^eeM$SnxlmN+e?*rAhSTTjlDsPno18!Z3=lhT_x{t|T3uB0w809V3oXSu}Tu_)E)d=|K z_TYQ>o&s``A4y&OhkWBVKGxM#i12F&^q+!|2=XF_Vx}a_aNi{wQp@QEJiqT6wCSP7 z{|b`jjCO;JjC$RlHL!tdWD)u{vp zP}M@Kp})C+PMcRu44G~p`0XY_OTL3JD{O0@-$a82M7mF3Ag?Sk?6Vd(&Y=&O)Ka-a zLw6TL`dts0^?h!VpJp%HdhC1M{RilF{wE`JL})ETi3Znx%YT^|pB(Usz=oH#Y?#sW zy1v8H@J9qKw&ZUD-!j_oKEBrv&$M?&q_6W|lfI_T&GBj%tLHTX?#$RSjA(QOD&rIC zP9h_wjq#;c(phnVu<7fAyL59?sYDSj-z_vr)Va{0PU zBT*tK+8%M_vWOM;Hjbw_s-;m;<@PNt%WghCogy)vj|21(t-d#CK|fbr{anvh{`~ni zGn1OS{l>oy=`@6pXdg@Rzzz@4BpA5(;(?~`?XY#r1+{mMxcud09;Lq0OKXx{m52BX z{cDY$2oB)BwKK|dtpL8soa~h`s7svCZx_j#Izv_TtbD848=_z&60%?who;?X>D84EwboHXLFzdTd?8oYw{C`Wb1xs1?8EMIlg&-ga9oFX5LKK7I!x zh;SVSZJvcuUxt*D#M^iY@L9tt>|ZNG3=??+Xk{GS=~rYYzWhdNm6(%}TLL=eXbnUK zNoBT$45BU7b@Io!r(iyzW%YgRRma|^Ymo`URKzjUI>N= zPNg`P_g;_%1L92XF5pUD--~G$gFvrdTn+rYJskqfJvlhbu4UfLqW1|}Ok2Xca^Q9~ z8S6foAS2}sbUQ@vP-zl6xu1o-K&^ZV^^53XxFP*TDZ^Wr*+U24H`V>UJ&Et84sSZd z#KQ;M;zNzZf3@7WlA6CAZTxo0%{M^4`XaFYvBwWZn3U|Z>+zn~Sf3HI3die6!o7Z~ z=31?{6PVGnb;LYg7-S-XRQx$+MOuG-srVjB5p3)d%bXK!9Zfn57F@^5_M$}Xzb@xf z)!n$$%!Qtf9e#d3u^ZWu${d^hBA zv`|GNq)xUI^wsHJc3wusMXSPY>3|9dUwx$~0w*OU4W|q1hg0}4i`MLqy}P#we}78V z^_n@Q^5@{7MU=Y2*HvGDRwZWbZQls+)0~w5<3kjOrI(*+VUmU1OeaqREqb8QSQhLd zNcK55cZC8d80Xn|vsWe_-g*ojuu2Mbzp(}sh1bHuL3yfv@w32kcy@++ivx{x$yXUy zE$mOKTep_%UsA3LkLGMOLx9(E0Rx#iCOtIg65RMlh&Ys}gjn7H53S{Wf3Zk`lQxsi zLGn*D)hWX989vPV1}u^+rUC4-Hf;+xB|cC7(gl1){-T9cMGH?V!*D%)T?bh7-ZhHZ zWSC-cD@9kOH>pj%OH+GCNIqWqC=j+vf7tb~iZ6f1H%CZ$ahuSLt9pwKbv5l>T^7+k zrf66c;m*@^U}>UjdYgD5&~a?vol|cX`o#U}spz$0K&j>@{m$Ghd>k55XUv;~8C4Am zLM2bK*#S~a6`H()0;wI2C9ovTL)`6JXEgUVAlG%wT>8S3fqqH5N<_1&2$;4$g#xhC z8xZ(|0rUrZi4iiqZI#apz1g``a zH+p1&m_)|vb9cu0qttj^UF#<)9a52gDi%nODzw{dAjsV=1hjGP1JEEP+f1k-=RJt< z7C@9HD;sIpyp; zGfAlo=3;!}hElhzg|{rE{jm*5#G%?Q@km7jfYIxeo8PbH21_E){Z)8Fsms#ulbYMx zRzF-y2~V22^;s}!#pRVy&NJb-Be9kE^y`w8&++`#R7`k5$<Fl1zU z1_3}XE{?(Y4-5{$psY(B?*@jkX(Lojpw5fGD=kFn7TsW-W&p)K&xA0?5rADsVjHZH zB}wgo>@Y9~x*W@uVgOwP#LU_9(OeS+o*uYliD?j0I~wIr5FyS7@E{_{ZYSM_uL#4! zJ9YhA^cN0ym{>QmtJ;*aM{<*e2ywLKG7a2Y`=Mq3Q(|*))Y*aioToyt#11>>?P9vExW>`2|?%VgWPt(b)-g$e)8y z>BgVS;$!?RKG-UwdmjW1>Vsm-$H%Ffd&GmHFqsbY(F3{3eTO|b#Wr)Z z8aCPWS^2+_$p4!aBEi^t&E5yg&+qQ~QQSN4?8B`6X$TfnT;bD&3bOKHMcLK*3qBwq zCT>vIzd*kZwMSm9SfrSvwt~Mw*D2cEiQqRHcaO4sEBHnTvw)z*&@XFX*2&Aq=PGfv zE3~w3de4~xP2BnT_0!q$8Lr*;|Dl3I8_J#`kS)S=-iKtZ|j+U zOnR0X^Q;JvB^LIQ!q8i^ntlC4YF%7R7~`ccnjgP^Y5DX`&px@#AgWfw0)zRT8_`atS8$g-|8dHp z7`d0E#g!DpoIJKT`mrvi^3XCl^M`w80%C2g3=AozRnh$m7PaQxK_bhBQrqPP*IqI)&*eKDP*g^Lw}U59)jK=ns6`a(x@oK`f`Jo-YPG8jYv9Q8w1(Qb#Uz=J>-Is*9c z5#b?a|H?rC_OpWo^N&0V&B?(@vk18kIpkIWW<2xMU@CXWwMpI67YS{h9?R=|U+Y;s=1D|E67w2+nCa?$jy31@f2e6oKny~9cTuq zJGG7vzb-rNVNiV_k*$=%hO$Ylc~shhNVFU8=@qK?p1w?(-u0=<)bB3 zDo#9<0FLZ6LNN(YBKW`A&VOUmE`W@+1J{Bw@sNQ66@IHA7R%+(m;ltKPrN{BaAg*9quWSvLd z7>#t=je6hST5s0ja|(YJ5e$jYHHS;?o680aAMV6*ngJH3sijTov<7I4wQ!_02l3BdcER*3&9IBxB-2D!A3Y7mxSfWk3IaEIf|EJ1GsLiNYFGyPJ zlQ6Ebge2@_{}ly2*UZf?n;oYQqN2$|OPLYDYeih2_jl`N!5pZKmsC~ywMUuMH-1xl zEg>v++f)4QsPAKM1a0BE{d2s;%i9FdR6_Q*@$p_99oGK6nR_R# zn;Z2-KO^&vJhJMMj$=*T@;>%;o8e>i@B@jgq%I1^A-w}~9*R-El3QK10|r-FV0+Go z#dGp_bf1dm_7sERL`;D8BwwL^=}I=`SNPrLYx6}*PfsN`A3d;F0|U`q;2wa}9QsMR z4RIyTL>I&WypSFEKo?{&T)l(#-@8f(uYoPAzW>(%0HV@Tvawbq!#Kp z|D+yH{LA`VgKyRX`HViq&`G^jzlpfV9))N3goDyf8G0_&$JA)z@|*YP5SD32%lN#w zrTr21)ws}Ffy9$ruY`zT*zV940Nnf`MtVY~7V-y3{>(j~RU5P}Yzuy>p>PL%*^{UL zzBr3)AtIc>r~oZt;1k9-k}0gfL8F1;v0vbFY{+(N&vRf1=&1Woh7^#Hnn{X7d*jW4onL9rDQq5%e{hTz}IbrMWW^ zs-<}d8|s-fuS+b$&j7A>J#{%9(C&WkgH1JP+B;F6m;3scj^Q6nsg-}R)3dVdY`T4$ z~nirHjnU8*Bbx2xKh;Q!U4ZX=XD}g zcyRjK=ge{jhY9-@5%Rod74f{UF~W}>@U*q460zs4vlscGb9W~-`X%0@V=}ixQWw{F z0C#peUR#z!oYrknXTg900li^pe!2upmM@+CfD8;HKA@5t-@Bu4v${6%8$Qulnv#8` z#|3i==9mpcy$t*b{x(h<{8xc=c2oe5hn0Lbe(>rM9XNN=(hve3)mNaOvNWro>_RG< zXC14J=CfVgC~nDAn%1hn#&9`FP6X_s)sJoJWCxStMo8(0x2m(yJE0>Gke^I^?BG9X zfXD4L0ZbSkRDTI{AyuP_a<>MW+v~$Lxv=B&=g+x0`4{qGH-5eDk1L2E3M6U#%9FkL z{emPsL{Jn3A{^BT1v|s6S=2GTm2GY+VE$?pKe9oHst9jT%<|92`TM~1wsvJSdId*s zYn^7rLd8Mn>RL>!1+0&juW@)~y$C8nt0Z<2nLl?s(r zo}2bL8UF(`7ZRl-T-|?iaP;a3)9YHQy1Km7>Pve_6DObLrCh=~UN;lcoy@xdb^HCu z>ds-3uXk`pyN~T(iL9Jh_hej5thh+OEm1&DO;DVO*ag$veVG*~oCUb2EA&&*KqL*U zlsEp!)2##qX?#xJ?I8`KTwK9)WzrJwL@KQ*ifSzK6o_x zxSX{BZ8MGd@yl|F|4QoW&Hxq8oM5L-UhjmUy0P(`W;S z28MT7f1dPDz09G5F-^_kIpm>!Nv(6FaCGFTU9X}n&S2say>nqu+ z)9;_863pWjtDPvX8~R5a_XMP&<5K%&gz%3gCwB+sWnj$$H4WOQYgYgUSr55$OE#bc? z&5wVH6}`q{n$glS?F|I#p3Zdzn6u}P*T6o<~+k~n?erUT{) z>-n4z#S$}zEB?F3<0olDBZ|e<4U*T7Z~r^oxV^bq@Adm=i(NMnH}U`RbXHMuHC?yH zX&^x3uEE{ig1dY0;1b+DSa8?i?(R8ii z^B#r9K3=K0VA`O?&ICc2Pj3&%IvZh@Er&@$89*ru+QMXe8G@JqCaX-<4hpN{L~yvu zdx&;LZz}0qFLS3-*(n8^!xQG%DshZZM}Y=Zl$UpNf7X;+yx!^(^GVav zhC~W9qTiSU3(j68lEJAgA&7sn4F+Mo_eEYbB;bzi6$>Z{v;Ygur$-I#FmEmew5fh3vuq#Ke}s zmLls~ni$zhdr>)}x>>J&@M}5{uU+ z1v3d;Wi7Or6;Gbwfgq7gQp>5efK^>^0j{uHF=s6nk}0!y($tXq_tNv}jmroQdl34! z-lJUZ8q;3P-18z|GS3AYc94nF0vnx@5nXESn70%yoyAa5Vs~Y|WMg%D`|5)pzF=F? zz&rs!z1~ zkTAlaFsX0BAp%E?iI4f?ta>ezvn=~x`qA(=c0)D&ri|rE!A<$UCuK`UNvhEVQO#>q zIip)fb~n74cCvGtO#QI?vXTv_zm*Ma7Qy(?f{;CH2QkLtn!ztk!Feg1Yv2&4c?Khk zss^kW%?bLiDW*4M;{I)5F+13NaJ@ANVzVu(RE0ybvm-*}jDd5j?7Jwnn{hrm!d?c; z*&)3x-TN`h-_9eVap#pLrYHLiooUn}6Ag9%D##4EUr!KFiFDiYSNpP3@gpn4$_@u1+Rk zKDWu@|6)fv8=eL*@k#oF;KnVZ2$1K%mi=N2P`rvqmM1qq*v1pYKFfluDLzeWi)d%s z^`ST&6{Fw-0cv{Y@1h|CfmYi8N{9gdL__tb{6!)P{&}ZQeAFS(eEA85+2;uP^IN!< zKcp7~bDnJvIDG^qHmV;jpKHCn8{{`kMdj&-kug}*DKfEPiK@%J=K1x9-1h z4e@2q&=}W?_>)~7El`^UBC&kmEBcnCLm1ekI7Cy>w>45lxZz?o$>II^%k? z&EAOy4RYa@#lEF6>!<2Ac7D~+O(=d82~h1y4eZhHdjfY;*ydEh#j{XV=DU`#Ia1qt zXeHNr|6g}-HN^uoea{k9?UJ%X!DWn@T%AOM9kxnNVM9V_Oq#yD>HLRDjQv<1O%b|afdiQJMY|l?8{4;$z_Cy>z4{!g8Q0XjYcN#0zW(e zWeD~$gVFDd*}yh8p2i)bX~U}&?Eeff57D~sXo>bP*w*jHV@I^f4d|4CdvWEa~oKrmbt zY_+hkuz-gP1zVRIwy>j>c!6^yoRODJ7M-h zHZE`NZ&KCzZR#pIm!&oWzGvdTiSu)F1#EAPOL1FE^(i_0nIsXcT|QYzK@)Rn5v`@@ zzXqAwm)qQ`9buRCp~|0};@&ofbrJO|%b?SZ_)9?{5(iK~|KyfdHSFSB~)w6P-8_7_< z#y#CDkc@wWuaUfVsI?e4_{fF7GJ+h7XkGhSxT?dj&pc56OrWQh6?4E7IeqNjbUPG4 z!;r!Z(H^Msr$bAUFM^VQt@}7jk!8)2&F10J6F(aw5YCv)zpmG*y8V=~H?O^o(4Irr zrmC7L6txK}U70~9UftZs=NG#!B)}C0x^sDLDLYFmUwxmQ{oQ^Pv%gR3Ye4~)2BMT* zzuOV;Cs@kb8GUM&e>sr-N9<%3TBNlD+(GvS_tM?S!>{pX-AoKy(LlL zm)qi_%Ki&=Q)>$Fj%i%(hn%XgC=wJZwx?X4ZEl#Hm*u9XZ?Qxy= z9w^K7kSt4{OXt%ANeUfM8AQ5m17)2(v|L4;L=04pG`5{o%VtR7J+4I(s(VP!-2poJ3ym z;kIZzK>!?d>);PIoyJIgk<7BAVUJJ3Q$lVu1cZne^|T&bDKv_J>(f|JQd9#@H8`%`^h-1S z@^x|&SQ;1j#$?!2v7iigsCi{R?ST#2U|s+!iSS>ry`b!rnML*AnF3_xe?IBX^2S=) zi;-LB+A;!nRj@Yv;(};k;))!>itRf~qMQ{<`6OiYY7LsQGK~N>=zFPF+Ao-y+*LXr z7(}LDy6ClpVf{@@iyiB{VI8#@%g@SdY0;*9(IH~lsNo?#g}6%LNpaqxraD36hr1Io z#Y@Ih1m9TWSXej_5cB#P=n=_CN@V%_V|Jvawxt8dKAQ=LVN*rFlxQ#gMysrv(jg&a zdjpeF2S`_REBR>Agq%FQvr}ix*b+$7nkY1dlH+G7VDZ)c0(yNe;i1GiVb{z{#VNJs zzsQ$z^G7iW-D#SN)=@wMhjgczQQD5QG^+`tDF@PoAQ6p64YUA>0DvK7mM9oK5s3(P z_LBpdknpg40o;`6Zm!Rq9POrvM3T1glMrX>_`ld!JG__khM{O;ULl}!#JwPK{H?94BzKT(p%Fum- z>PoCJ>?yCTJi*OqY7GNlJbOM5bH06zhCN{&&>{HEnMwT;r?T{)@8sMb6>3wz=kW$~ z_@{^0K^?6B-&F8?BPaMRO}-2@WyNwd_Sg|ZsS(wuYCzlLbE)W=jIKMD+)JK~3SfTj*J{MzE+fvLY({((bGWd|~5_iqN2bC1}N&LZI zkc@3)9sNyXaG4g8TR7s&;mGE z%^IhMam$Jf47HR?!UU$*w=dtp(X?52o5i%ZiGR0u32~zh!s(WoI0;7NPNXTQIWJEGDo82si|PB zRHgNQYRJ*4T51n9Cn~$XxN=@tc)!E(*V#UJg5y`4pUW{Tgli{vnvz=iCE0+i@cvzj z%;)8$ECm&jvfOM<&4PJccWkbH;TGl9(_buFM=&Mlg)3T*g5if;M94< z$LK$TLFWHxW+L0lkaq%`I1-A@Ck__yH*XNfy=)4aif2vPY+Qp`z_XYPED7hlB@`(Z z(GGI(vh<~an$RRclmiT(*Q3Tk5f5TmM4)p(d3))y^gy z9k89$XG%ZAMK&?M$bof|VK{#7x@2TwNU^|4VJx^h7K)Rg`$LU;fdl^SE@Y@ywz*uV zpND~w$YclHq5?KPKE3$^~$XE-fw)E#B{Pp=#FbGwZOt8_Z{>Ytx za%guUh>xUlr%7Kt2m>F~0p^+CtWy;Ia=b^ zj<}|-e5Ix^wS1ojpXTm#8x~(b;lV`p42WIw@Xo5BDs?MGEX-AXp~(LGR||s5z%M+t zd39yw#Y=cSz4L>Gy!4OZlX!JzX}`pfxK8W{^I}TOmUfA~idxBQhpQe<5mTf2c3l3Jc0XRtchgjDb<`O^1jxk#Jb99=<-_>4N z>XLVH&Ty-UxrjOqZ3O<{DDCA9xyB5H+>HW$hR(}mol_z!6JPMmLZjHkB-6{Kl7ml1#bq;OwcC zX}y6$Nc~8N)5Y#wUdeN5mZ>uJ4CP9Xem8qozK>}hzsy3Es#pMNu63w0d0xjkWW!QB z>E|j`=`${*rl7A`QB~X7O7Whii>?kUVr!{$JH0-D&;?|yB#3}@Wg*dO7e5`XBtB*_ zLa-JU^f$>T1GY{PIGP%K^MaXip?{;`P2_nD;RzoDC={^&Q1Yml^I`@rtVM&R9N&oUL8USY7+r3G3 zaeeb#a8VZ07_UhrB%AU~3m@9Ve1Qfdg$PivjZCVSEn`-m+RgIOf)7abB?3h+I}?G- zU_goN0ky9L-@|U!6zJGTA$G^0Km_)y;br!K8hW6CpRt!e>BT*)&zEb)H5;j4A~g0t z&D`rf8BqS!&yPNozI{uOb3#4x>jOKOHj-Lc3c0m)`FZpSKQ$BuWl;%}q4jy_xTOv+ zB$bum7Z(h@4!v-~^1u0Rh5S8=$%Mf`$ET1QY5x_B1#1FpNHbn7jw*}!8*@i2le_{m z0l+i9A4!z0Y9Eqbzsai=%m{ygus!wr?IpM`anmw;$45SPur++*@WV8Md zqfbDPVWg22OvI^}kI=B2CgHJ-ftQOw@Hn3-N4&HbG+NMC7qd#Iem1hzlld>BnAY7Q zvNhN=BS==JqH;mAlHJ6e_!bPeO85#~b>cGq!yZjGM$$!Wp4UL7OQQ-sfIb~HR;dPj z)5|=qSXaLwca|r(Jno*gllTbT0yA>DOUKQb(17J zi#SipJR?vpxhn;L$k0&eI%P?qrJ+4tV~ytG>WCFV+%;L_F8OAAd(NLa!D+D0f3gjpF>Om~d+Z9cHf|OLy&NsCMzT7doEV>;Qn%X0c^S@h(Y5MY+fH!$*h}k zVv?zgVjkJIKyWRp5e72VOvyv;K4zJ@tcmela|a{%^UPYv(YOlr=3VQn;Fn4X^LR1iO0|k8Rla;|gRqV=t=blmHVL0CA@f+2W;eFUDTs z>a|e~{@OtObY1#XdQYESa;uv&Xqr^!B$QQAK8r%FW94;pQ<#EP$)v7P-g2EA1yf=E;oOvFL2#2>xvbSysHeW3d(Fo&w#imAlP7U3X;76 zGTB;9x<9Q$1#iEFoPJLaIZby3q}v0)1wAV4CPE;%TX_QyKLr_<@TWB*25P^z93lUi zizj55<{vpawZy|I3&)IN@QBLuBk*Ri!#F;Ee191wy)W1#eDCZdcp<`*5Ymt|znd=U zc?8oMrc9m|TMp8q5nkzKa)vZ`i945|5w7xcAWm@Mhn(TFjQGG&(gv5n$yC6(y4aLr zcYD^?Lj){FJ5o_f4-LyHh(Is>uXJiR(!5fIC+^}y%1&q>b@>Ac@jC1a0M+mL`TA44 z<7JEZ5>6fbrH@}CI&R;)49`gGr`1ksE z`=8(Z5OR*+`>sOI>txTX`@gd0@&yceVjJQ{4-=c^PEI61Su*v&hqZH@j^{6gWmrH% z3Kn^y1q*BQR2F}#tQq>~!t4F<=(ra8PnbTiPPH zN)*s}Y0O;ZTp`hJ{=FooRB1YVg(}-Guwp7X!nSqo!Q>L&7TkCYYkhl9R-rW8J8aP- zl-V-xoM{&#Ge5J_x(KiMjmRn@iMwRr&!F4vfv_dVW@smukoLCf*TtHb1-?O}$pPG= zYO>ZcHXA$b9yz=-1^VBCZazxU{cD^^_8!t>sGJ*9EmF=CB$Y2 z=LG9I`tJ@rYs)o^bX8z&GtbrnC?gI3r^_u}pu;3cWF!X;Irm@d*<+_a-R!S*)g zKM;G=yV_4MbxuQvh?lnJ{Lv>J_<^W+IF zr@v;rWD%&P#?>->T`Y^0H0oV8YTo`L5IAv}7sLG5Qln&CiWi|sP^*?^F9JzV#UeFe z9Luum)9<5Wi=o4Yc9dWaPQ*Q zT*3G_Zj!+N@Rb@<7OQ32y}l?%H!QBG;%rH#FyfQUId-4_T+<8`q3`w!7bZ`+urVKn zfUsJ*ggZekdNM0WEYw3F@N(&?x_r%Cp+}QWi&vj`43PHPXn+o+%NpuWeFQG4iKOKR z-qar|MWHbNftpwlkFt0jt&?F#7P$hBES@+lF!%-?9d4JPM9>2Jw#ZVIc*MPzYGc^c=PCDN*%v+ zX>VVwp0^8vy<8*n9{AbR>bnaUUsNmheXEFnzU+q_T!?6$2+iW!*TxN8DpL^mF&Tx3 zS>0Nj4=Y!r7#t}Hug3Pu(Ai#U(z1?S%W96H4-~-xK+zb7m1#yl>I%wYm=^lk)-9B}97$d|3u@?N zU_j>~g!N6@?T%W!m?@p-&m-mD#Y?6ihvZ|yy^aU8$ALW1$OH9*H*`2v2IFN{(M34z7*pWfLpfUM`r%Uo-@` zdHvkj*d;H`C8g@3zw!vN2`P#uBPLcblLSlv(I&MFGc=}{87$rXx=Y3$gO8N238{c_E>n&U6k~?$ zDDnIy5y@*J;@aWG(B3h}$W z_mLiLkPYzr>nT#)_f=v1Ek$fxyzhq}rXFMrQm&+797ul&1KZu8APG>v;Onk+w0myL zl2XvC)^>OZoIj!Hw8ua=$w>ZcM$*Y-+q{l(wN6VCP`WB?`2sS?iY>i=CO}U)) zd6?sb65v!)NiCwGq1ba((k8dfZ5E|e7s@tdBOcYqrk5&c+h^=(}r?LyT1 z6s90o2+`PO!}Xa^lDFZ--E#2j43%j&R?yOL=Qe z!lDcyf!z&2AhGIdbXdsb^b!*wcso?aOdGn~IT0s!5@*Vy-3$5T7jE-jQzH1XQ2oe9& zlKG>w>t%jQwec%x_>z*O3Cn-O;0xo&Fa1E`h2wgIP7$l zM;+c0HcVr4W}Vz_q!xQF!@^L}1RkyVZVE$~e0I!o1tu}yKBt|Q%JJK?bMIu4H1_e6 z)pTNz2OD8Dax0sUn00T~Y@3?y_mxwGN)deZQjQSHLye|rSP3(}0u6F4PL8H;G=WA* z;yZ{GU|GHq=m+(*$H%S%#kWppj_5YY2%KU| zeiphWqds9_%AhY@9Nh~p{W`nkYVFhUSBsVep3os#3j(Y~^SdtVq@r#(@*d@`0WWZo zI!RJ0l`}W6TZJfvSp-XlvM4Pa7CIcy$Im#LEy4=v*-UoY<21^_|^oZ({nmo@9;DZ-geW zGz25>CY;Gxad+ArDON<|@_iLtEf~_fTU*Hr5|1sUjrQJMGLDPg&`1Tttxm$%pdUai z)VV2^;_toKP33 z8e#Tcy==v%U@qrMmI0x=cMwWTj@xPo5tHy<036yk_R?WWQW*+WJx#NEK6qCu!eL5c zy}i3x8eF&b4@K1MJC(vHIeBa;QcQh>1V^=maAfP~$*POP41IGQsK`&h1m?J#5LGr| z1-GL`MXsK#K{Hnb7}0R~*>(G;S(4Bqim32^Sq8ORCo=Vv(E3oG70OyO-2{wYaZy6D^Znwt{qs;W9+T9`Wrm;s>p-CFl6RAt>L<#WWuzLb z;#rTBdeVw$`{I#q@caOGBwj;n10i<3k!r-Wy>>qqPXN}|n53xqqC z-tk9oG5MF9O@@x;GAp1mQPTDGb{np`an$hd!_x*C?WcPJ82NEBW>nNTGO?c2CFynE zSMQz_Jns0rox;tEP1RZD(#!*17X7q*%IhaMO3TEe82(ue0oK_*rNMWblI$lN7vUAQGHs0g zQ4sG}-*=B(dIUAs%4uv4%DlYz27@RUOwilWmoV|np*c$|sa?xsxG7W~(C{e=BKdVT zh@+=25TDNoo#^)|I$0f=cq=wbieD#rdAO(QC)oJLu~@cOVe=XP)nhzzKhZfHsk`6?D(;8V|TY!)Lyg3EclXazk zS$6S$7vZl{_dJuAp-B+o(NVUo=Ud(M36zG5SZ{jH?K2(!65HbL)b2@MwWX&s4=fC< zt*+Cc(i%+c|BW48Vr;p@-2~U~$Z`;{6o;1%-Ze;N3Ida4vrSK%z-P zT=1p(!8Sii$6w3?;C(r2ozh;IJ${HliB4-&qflD4qr5MQ#Q!M45CI)&DO7ok>{tZt z)Rr)egNC2!Hyc3j{h-PGXM5fzT$;gZsKTdUHW$Pi5!YokqlR7Now+}EiUac!Ne~&e zrvGV1ZKR;r>cGnXi{tN_9~1IX*0e7ygM1Gr>MnV}P1d2l8|YDA#|`9CWscV+i@KW( zy=y|1tWy}~&?jS7ED$W#HRy!WKH9z{+IZ*f3`GY}@n6&z^!texDWmt!mmyDr)^fSC zc)81cF@^Jlh~MI(rS*(}!w!Mz*Q{HgdbxaHTO&gQ^LoF3gL#Z0p(hJ6WUq zPYF^yn$e6U_823}co7fPH59V|&7M@|ZvdcnYuK`b4ryWg=p!u1eiZaD&IV#%7HdTh zjY3B?_9JyUfXG|OM8{R*yLQOoq?&z$f?Shw@2VRniOQy>J11Fy?$=|g8NWo5!Vs+K*Gb;!~wur4vZ!p!Wz34-K4>G1Ohx!s{+}n&TM42Z0FC?9tV^tq9 zVJ%En_ej7W-4T_s-_PHH3A}(*pi&Rq7~iw`H9kgzVmxU}EQj1Az-iqfAAM_wSIgI&Dt3zsD>-sqwH#g zz9BIm3je&S7^5ZS=lKj>hf6tp`BSBxAbZY~ve%q$tp}+9nN`Vg2A`mzy;s}r$ z)9YJ`vNrpUVq$XCN;#6kz$s|FA}9A@VDW_Ls=IG$u955QDj``IwIu5shi)Q&abpo| z=s~Xc3bDLR7D8@r92Yzu|L4#iq;vZ;zMwvHwcQ~!tW`V4+?Ft8EHfrRoK(cx7$LCq zkK8mD$MkY71DE~CLDFM-BV5NI1_pb*{w?GLoF8-vT7(+UkjPKjVO-ZSE_u)Qivk|e z+iW|Sjs+cRtg!YmzDk!ErB}Gig0OKup|`V}w@G-VWu#iUXbaW>p>6M@3NbSqt}BzW zO?AHFgRe?Geyx>ihuJVBe#3#afsmqbfYeqN-^&Ptw9kaF8z+&MHPrx?40+$aYH?>V zHXE8Ay}k(t{9d>?e%i~Cbb_OEyz{nWh6_b#D7OIfQEh~G=JS&YJ(hpM#>oTYBf!n8vMfEZ7w1WSAV3{fOk(kIoEX>Z3b>9 zqlwVuFV8l=%m>A^&f>Xw2KoJSh0PXOIYa>CRZ~*5pbzlB^Vy=*h%e30Y!Js#LG{r9 z6f7F+c?5vD>o|OVXHnyqu|sMrb{3AEfg`&=N>(i ztbV*g#qXCO+M%E_LH=FjZh{rP#VA2s=i`N{^I4zj`c0caCpT7}boQBWcNTHx<+YcN z1sReZnD@sJbd%~^=2HJ#9px8_;20*VrGe< zj@p!J(?}&jGs&=qs+_KgOsac%t~BRHpi&D7y!=z^klZ@fAJnAUznzp-cZy8}K#$r& zWD$@2P^9wrD`?{@aCXsKXswYaPO;$@S;6=RGMPOr#4b0FY2y|D4e~B03`n8Usc{PG zHwvWyla-;Vp2i ze}hz9w@H;q<7pRu+5_LsIr!fL0S+qmjeCFz@rq64_IcIB_|VcaakSw*fCM`BpGfK? z@XksV*?%=KTB=?xTD!8zBf)h0A}Wn+0jZVeKzNEI&ekLuX56kb2*FJ`qN>$ph9@W4UKhUd%u}lmh{7U zQLK>uU7Sjq4pjd_`?`RyslX|r^UWuEbJ2HXsl9khHgttJSEy4g zK#BR7+fqrN zmx+3Fk9K{!Ex-T{`B^QHZEOR>?t=o#+*gXJrMxy(wG$y;5^sim!1etbj81Ykl2mF2EZ3 zd3pRd_zkyj1U5D61sh`547^SY^^r3wL5HxSi)_$jv3P9l=sje%2E?R3u5E!p zEZXzkJB1Hn=2t{S1nqWA>tZh8aoyR+^b*k#9-PoQgTHSZ7^cvRhRArw<)k;)Tq$B{ zC||r2qHgX&sYI7ZOuRmAPepGxp|zcQ9{Y1&of$jF1YaM{1!ZrwtgCJ|V2sS&5=iMRZ zdXZ9p;y|IZv&yokh$CFqCP%Nju2%#Z0pqaYbo4u}5oAaY(nF>%n0WVYUo0T$(*JOH z8*`Oaw3!yclCq{LldHMbwr(G|2knTIsaG$iFLZt2XSwzgCtFQ?P{poE`U(uC4Q?Cb z4=D8G<2y?XXU#fl*+Thm);V_BQ@E=FlYeM$SZscu+Z;o8Xocc>gd>{{W^I!?k{sd7 z&s+b{E#OWv3UDY=VziMDIEhJW(5%vZ99mx$2_JjTC1rNc_; zn^bH;t;_~pOZBS@PJ*v}|CD51T?)7M2Hii?^I3PHEhY}1XE1cF^@ulCnF8Hfnu4F$+&phu13yd6Hx&$?U1ZIY8cFvxp zb&{KD(PU{yjk5|`5P@EY+TrIN)!Uqi>*Br>jxpDrC`t3-v`*{s0u8pldA`!jC|l4p zR#yQAwf`tJIsEyxv>UoDR45*R?zfO_h_Kv*U7aVa>KX=$BsBK{4^1t=`71d4XS6k> zod3csRxk*-UnB)@9lOc!q!qukhDwCGFbGoNe>tfNG;(tkz5e1)Dl$tFfub!+C)SHo z`0h#%Oz&O~1Xhk;UZ0cX3sJpGS}N0>&+7Q{d9NHjq!WIAYe=QP)FSwh^$x9D?wK!u zRP*r_J2>a> zwIyrMA8N_mIQxt@CZhDM!#hg-*V?!Y8}Nj~;};+IVTvifNr*qc?&hX{XNGfW<-UU_ zb<6@nXfsJw<=I){x)ed27JKwYA5e)v$Y7IkW_XOxE2HS>iCD_9qOxGvvohjq zu`sN->V?qtC&(P8n`y4-Hp>c=marh8*G`K5CiM&X<-MUuBUgz2DIo^)Gk36an8aZd z!chYkSiF)`#jj0qZhfk?q1jBtno}%@t6s{Rwi#*+c_1?5!C+WRZ(t|@^xFp~Y-o%t zX6kL!W0drukqUSsQzi3yRt4PLC5~Mf9>mQ~W|oiMN9wLHrpWs@^N=QKH(A=;ahX15 ziqO9!j3^ip>M@Z9dvLp@+<$>S0V!*_taK8+4z_>op?j4zx?(=xHF-V@1VRQ-xZ^fE z+x*k+PHYccm>6w2BE`H;nX956B&zJo{v+3tkE=8*RJ~CjzjI5-QME#?A&HD%4jh-sT*A7RBYx(?6l|P?e@tJj|Krq(nZ` z5EWA{mudD{{t2ZR62eA492{zN+(|C zks+at8$|dP(8wQe5XM4+YybtKxdl?ul13Tqf*$VEG4F{D{YVAWY0gcoG-}_MnvVWD z6*mPuSt%2+TnSsG_Dp#Iz^k}sHEz~^P7I*1GHky9tGCz%(v2=v{5nN&#i@nLwrV`F9rJ zuq9(=ax2ad-xxCd%~$f@Z+fmNJbCNP{=fxs7EYaQ4ElKS{C*2Z*+c2`O_|%==}Y9d zUn*T+$(Lav0t1Z(j!`|KRH}!@=U+Pe(u9Eq=|Ob%aXSuPc5d8JryH(aslM3hOc`8Q zg7{(cc6StuOE0;rQqia!CFz`S_PCKb89W2HZI*6tJ!|h~q`YNrN-*gAoSch)QHi%& z9Sh{kA}FNXF9qjDkFYaobviy9y5M8%*FASWTyuzpG)Ys+P)Yb3JkPJPyiscYTF#gK zVk0ao{rPS(&P2G;{zKRyKAV$UDw>w$s}h6SD`-?mO4m}JRW7a4feI53gF?BZZGFCE z*&&(AL`Q zv6OS==?yAN|6QFf`jRZmF^VA~IWnF-@Fwfk$~Zo83`lx`tKKIv(e$o)Y}+aKV|sm( z`Y$bM=Cat!)Esp(naIo2od+NmNb2L~N9yB_0-UnAF!(_#P>V^Li7Jekf)Xs%GipY? zrE{A&CZaL(t&nTe7po&DPpFdb#ijd3?=sJu&h7T$!-yho4ul2%xt06?hdMFI)ktX3 zZbzV*cVuzMB0K-x*=chSdcMavN-%uLq}QvinQS9TBYRQ(Hr12H89YYEMAKjJ}m?wol2%zMYzghov#; z##ou|!9-@f>D$K=D6HZszvQ3_KnIR3vXemMnl61+7+rcjizMH5dr-gp7BBO6^%tL* zxUVOvEw2J&u2Ydnn%)b6Xr^3|T4i4$D4{u6aB{vSb2@{rlLF!(bS78WUk%&K=XZB> zCvd+73H?o}E_csRs_w!xcI%cdsn*h4ruWSIWck3;`1IMf<%8^yy>|B#@mJ+!pO=HA zCGA70LR@$ogTk^Byw~lo`?1$-kouY&`orc}CfcVDmM5^tTY2VTsBzxtr$iic)RZhI zI1?cA6SIWW{#W6RY@{)Jm-J@)(mSO%;tuki9qJ_oZLst`6~Ort$t`4|a{7(wPErg} zTFQ1&^BGZj;guq2zw{dN8^$zCK=f-wSQL#}sW9J8U3Off*wKB{W?17?X1sfz$_)AW z(daX@uEmYkc|*{i=5ztOIGza6W7po05UmS%#_1b5mwsjt>&kcgj+G}|z&Eh?m^{{j zqbYhaf#zrvI}elob^6f#Mst>h_8F<{?prk zwrmBuW48hC9$mL94|Zfq82%!I0(ma@WJAmNF$&aa$NkMXmZ)U-unG;?Pr#|pQTaiN z;lBb)L>sy+sO6b05<*tYepR>HzBS@z+$~?mwA-_%d?1I{n-IIpwsBp0`1h&U<#^QB zzoqBRDchDl`^f&TboAzBuyq?2wbOm|d7aa#SZj4$6?xYb1vs=HZb`mc81wyC zfoYVbuhIlTj`G^v=KxIet^17FCTeOhzxph>0f?=eM& zJQ<@mEnwU=HyRL9lM*NT+~Zoa>+{b(b%dz($Gy=JR#$gHVab6*N4IX@VRiV{Z`j<; z7dw2hp58&BNXn56)VJ|Bezuv#5$)Q0#wHr*9_Rj9JXV1+yWK^Ud{AKA^Pt_iLxO(3sa{>-NQFGvyvTY)( zc58RdEv4I@tUd5ZzL<#i>(Z|d3tJoeWWOlcg5A8)9;?~^P}N=}t8$s%X*qpQN;qG>ca-mh<=XGIK3cu+fvUZa=8J}a6niVR=Dc$<`Jo!FKr-==<%k)sCZ0?Edw%y|5msOyYuM`5u)OE`jg@|xMT}Xtt$AmWkC5ktMYec+n$)GB2Um2 zIW6l%NB)=MFNpx>MnmCo2gVJ7Zy3PM;l2g#z_jw$;69@f;fC|{JWBXDrG$G?9Y-K| z#U8@^Lq=1XkyI*ac126X5qE6d8XDDlMmjWcZ+yJZnX!e&8dMYzlG#C|)PnU%g)I$q ztdvJHu@FhYeAj9X zdT&PI811ts2HlxHJ7bsMxIozJ9s>|={$i8GpSH&@G`F;D-?ew_+}8s-)5jY=jU_V` z)eUEgtL*MTPwzlWODjvNFRkNzw&_cDw`9leLx+wQ$drBEeCbCUzAP=TTldjt4b7bb zu@bxGRSkThJg+=QjF0*%Ic>7l|M#RD?dRn_G+A z1g!!8kjEi2U#hZVRypbV4mho@NQl%oH|yMJ(~=3!m5gFO$;_8vp|9- zt;z2}$Zb1C9)auBHj^tHR?HNB9#NaL_K;uian4u5tYlDGdnlN#?|iL{2<}LDz;$`a zpgF7o-+T$?9`QsYYMU{yWOAF>R)fSeXbE^NelIq#o43jcL^4P)n|OY8 zr6uDCK{A(mQ+`oXlCeNCQ@v@P_NB63L~laLkuRD9jWVC|D|2#p&FM|bxwi!qr88!~ z2hmhEV~@=+H>hj|#O!mJp@ex0HcR=T(ok%v`7%0#`waTKV*Y$d)(WfM5t=QT*=j~B zKf3TNotax->T)6(n^7@+2cA#)XWeJ!RYHqCH9T?!bK5Mm4q+-il1ZmDrchIF+!G(S zhQ~yPl*~*apVm9v?;Pd~CcTLXfgvfKewyNMFg4k%j&Za};G&9lB$~ZRr9PlE1VZ5m z;~rcge!^fV>h*geYw4@llRV=k4nmGi%M%=eC2H%&pTw4b`o+2^%hTbgn1Le zgsbupMi&Kyz`w$h>R3EcQeGDd;W6hQ8yknB1_B{g7q3?{h&WQYYCx;A+8hAIx`wui zi3zeKG4o@7%#ZmoKjwGcf0vn5CXq<`Lh(Rq(%>J_c}KkQ2>_nnHxe5@%Nt7eSkw0K z7=IcF$+Go2-$*Dm+2CA4kH=%PznDqv4+_^@nQ3J!SU_#U1?+A}dEE!*Hl*8p!R8u=xU!qPnhi*WM#V zrPVd{ZEc<0yc3OfbyLe%2qitd2{g$tT~El!P(k8`*}v&EKo#!)h{-i7Ju?B)v>bEdqTKU|oOwul73 zzHDmOGr@~XPH_1ua&fsOvz!Sovc6L-vXlhB6FRd<$=p~va|M$5w(HDND)RMrMQ5%W z2uJe*p(hw0^o#)cWR?_QPvgu0^8km1qA>Wd-<6qVZ(&z$Pn(0IKtZV`9Zrt*TSA>G zuiGE>`$HZE##R&)1|u+ij3&ESqMR{Xi8@u}&I)q#vMRYuYR47(%*|zsg zaivVD5s2i3{m5~?P|g#`aAX0c1ru8A9$RokU`#UJX(n8wZwME^N+I+5nfWn4=EwY) z--`DT=9^_SMK4Tm^G4Z2Q`2^HbP0hWNlhf<9?lGY7_rz~SGih!2a5;moD4nfV0EiCI?a$(+HX_XhnaOIZtwsO z>#kHIqoTC;VJbI$2tg;>u2<0T6KsJXD(!*am z%>N35o?51-chDCdmNHYzFyTr(giBb5kjyTVU3&h)g{h?o=dMSeUDAp%KA0c#V}8t! z`K`<$qj@}p@pvK-NtlCUv{99`(koARJ>$HLo_AF18MgTn za$Ueprjzl9K!&+1PcYNWtOP7{IKAX^EY6kACDW_XvbrU$oqR4&1T54V?5aVF+7g>J zUX)%3EWse+QkQF6E{R<)$xCN$OQ()d?~LS@WHdR_De7 zNpo(5g;Q9J9F{l1Ty(!iGF+fYixgmPtYxY10td+$)2nIX>4R6IGYg3N%GzZyc`Zqd zxtT5~#zoaSSL_#-LyR-y;$`#i4(gdB$(wAu|eZ3f+ zSxkbLt;LneFh3BE<_sBi1>*kXq|%z!`KWIQYn3sLbJ&-dU~8w`h5|#9ynq*(lEeu> zW*o&q*kL{Pv@MVp>%v-#KNt+T{n0*i&>M(kQPAgK5k%zn_(@pI@kI{EB!PJ0Jf6Uk zymr~#b4#*}&ehx^xjg~9!;_t#V*$s@v>`tGcqf~u)teQ4hNBf->VCt(pnkyU=+!wD zwzSAJW6fx(H6yo=NG+M!rkL>(C1%%^&J(EA5=(vSKfOwI9$PS*Z~n83HrBJYrifk$ zTVzZuXm?H}OBKwtz=GXzM37q2keJMxnd65~%vgzg!E!Dt!nDk1E&09FMaCD8H{|7! zz?ia!M-7h9nFdi8XQ3gWBw(A%m(b%y^Xn&Z9&)&%4ib&NEs~>|i|UWd%D|VSwWMU}2H3>=;HC_3Yd^MBmJeO`KOxuAqr?uKjvRI+IsR7o#}~q z3)9CFNq;C7q~?Yhjt);YspC>pIz4_)?;CMM#@w-SSCk55P?jw`7D!EC*BKcb@{Sk- zqyFSXBt4lPI~yOKP#QuGchDb<>K!3pAVM#Q7xo3CE?*=NisH!iTCkpsnT$je;Yd6b zj%A^Xln}=w(Iie~Q7sE>(^%!t@>}j%ToR2XakP@#%?1agbt8y}<(O8Adh&S%_kKgx-t|7~-(AXPqKID3$kG zT|tG;WAvu1-l*2>>9d3-mJIALxot${o=~|aV2$yH!t7p;&=8l*^c*UkV>nAJLWO+< zyK~)%BASkH3V-K%8fS4G&LWzW<|u`IlrF}w!Z9kINi0g|I9Lk@5l1my0P!?s5%V!8 z&17z%>2zuvwx-fChU`$h9@hlwOEM+poZ`~y$W*d)!AM6tF` zY`T~wx9P?rg%KH(GD}+Tj21LVYFqi;T(DoB_YQoaOdyiuFSeUnSS@W`bAgb=K_FkW zLM?ehnJ1W_UrbOqk=2x@=Gh2pLJuk^gMo%T;*NFY@=t z*#eo}2WO`|6?ujLskcJ5k=!Fh6DUo#kBD-z$W2F)(;4TsOE!1O%<>>jh#F#q5V(Uu zcAuB-Zt3M(c4B#HaBO`1Dia}p&tJGOF*%vt9Uq^_efp1$jW3)CtgE>t85u$2B;=M` z=G;2Y659CqWn_r>q()gI@7%d_sAk>-FQC09CKn(sNC$->D_CA-eY2MjPftugpZeuC z(B$MKNq@d3#^2E#4VkNH7xL)j#mhozZoboEJU>H>9KlUdECJ)?iLxi{XZj+q10n)PIIqWpfJbjUB!`i;(TAb1_-ASDYh==7%Il8O^2&q!s;X-uMM z(B^QLl~-@wzMI1pU>5;r!D(5#Bb-K(!a;JDc6)}nJkeL%c2`x`Bbw9Y)$|V$(#yud zMwa&wpYR@n(PY&d%s5rw&{AE~Kw_$U2aX&)HKa3=s|dJ~)UX=}gtLf9STtM0Y%aMa zL@waZK8@Drr)oskD_&7m|M{2Ot7;l|?Kud;8tg|1kho&7fl$}b+Sb7#r*h-K{zhsh ztJCU@JAxUswaF1s+o?%JVCr@BI18I4XBtJY#@ZCN?Z>K~eDR%jrJb@kX~qK|;$UgJ z0w@Bzt*Ax1^F)n67nM_%=y=wg1^jUO{ku-q@w8zIy&Pi%;fRq<%yC4P(eZnI=Zjio zTMw6`08J7T(y8w5KUUdAn}#FAZWiieyH3`kBrq9IHwex&iD|eRp)6@j8W*Cpd|d=7 zqa<|Vlru+0J2^>q_)7w^I9Srw(c{>DwDR-4XVz~yRNN{t!_ zcWHcT&)JzYn885^p`byCm;i?Th0TvW`(_Py02#rYMHx66-;U$eU+gPf_vLz>&AP%brq5jMLMW9f+ z@KZvDU`gRAex9a|ECS(R_do!3|9I;WTuz!Gd##MVmgGoU6Y1dZx-a&($SjnhZyV`% zk2Z1pj#O}XdwY&}6kMBBFw`uq3gQaa{9X($iDy`)W9xm@B?;v`}TLxOT5CXx=sX%Fa zth`fI&?u_m4)TX0Xyq5)T#qKE-d0S54f5(xxi%jtMn(-HJ>hvG|7>@lz|}dH^|~u) z?V99+c1eU-8562N%((S;q53A%7Fe@+$yJflXbYHRSsoC zCzaDNa|KAf1hHhY#irj=T&lYQJ(R9gZV7RgI~ZzLI#2-8-=Y6VzpzORNum$-de0FB zMg&TpG$`V#R=E{rpx$fH?MQMVeF_msc1pS;lIijwPP5dEG$9JmV57*eX-~mRt3SbZ zwva0U2#JLOr7b9~(heCG?<^wGoG#Caf-*d;$-#6wQ`^v5QeKDSU(;(O7M0dCwXlfo z*w)#7rlfjMtDo;Rc08UauWC4Trb2HpW$jd%Ty>_niZ7HBqoJy%3F*5%KJ4PDbf&nv zrM+u%%G{rwU@#aitE?|Bs~MzMXe7tcTalo$rw_Y4Fk zr#U<_a`5OGq@1;fT01x>hE_*O&+GN0c$GEHiDU}90+9@PN##BBrPkXwSliIn(#|0g zqlQi;l2x_Mr4@BPUjVx*bw7lLyAa8%rHx%!T217WSB7|kBf+ZLroeOwQMHQd# zJqX1^9iblQ&V!3Dbg+46N~*}zxGuN1q`bDKz9p4P=S8^8@Ni9C3#vfklY?kn)Ulf{ zCOTPDPju3q)yd{oRxZw{hxoM&~P8U`{KVgVNGBB~oDH!M+t`J9h)EXQ?&!5{y-8|7O%N{~L zRajxOJFyM5KXs;@^b2yRV7$nKk-R zDYEhn>C1AZ8dc^AB-kDu9fP!yquFYwFEk->sCOK-xAg6#U zon4ny1qzQkB1cpQyAr7q_cVb>J`2V90x22`+u?8o1wfmU`yS!RHcGdv2IzZ~-Qj{> z;f6*ynQE_+Diz&cxlQcx`i`9{g&a&~8w66<*p53MIfeQbEV{l^`kWa?rns{aHGsa= zHM9}sCpWaxih7ip+^?WKNFNpmAwBfv!qOUt(@g}PU6<&@=`wP|WOeaT0N5?rv!sr7 zjco)Jai5v1ljL4UT5$60*;Y#NDv08F=)d zBZoLaZ(_n5AGd|aEWyz|oq<4dLTSykYZCF{30E*F*9ZGd)R%<5K!m694OoKyP^?+u zHoE|Xp>G%n2~$B4AA92YXP$fY5MaE076y zqW(c0QUC$=59pw&#Cd3UdPHKm* z@)e0?ND3R!R}>z71ATxv6)6{@FNkP3g`{v0MTJ7+xXbNB;c>i2)fWgxySc)@{O>;y zN#wY;uV0J8bg;S)9XYx0z|ni|d!)Ly3GBxcNbBlb8=E_zpg4j%(VrfCV*MwZh>c!W zQCr{8hB%0TK2Tm+$71tZS~>~}D>OQ*Jv>In>A{}ce4wPDK?G|LoC6~gw(shXwpMoa z!KxF{79Qy6FaNK=1{Psav-JDl{|S|j zeFT6+*ajw`Kp$-s8*w>oUzXYpo4ZYEFKJW2cCTQm|F>1EU{&uu)AY=%AAnAA73Gnj z^Zm0`|MtbVKL%>PyI}`HpYJ>@$f~YBBn3qhPXMMOi9 z@Rw8s=Irn9e5iue`yc+7|6|*ciruH{kT0xZ*q}At1CRr#qg7@>6;Q&*pI`myjuRlR zAO83zh^19dVJGn!5<`FY>H4D;Y@~pURIZ8RRh)M|-Ud)XMu1pY;mr~=^Z~#Cqy&n9 zXP$WB9pE35LV3W_NTj~pzFw>FU z+v~r=cB9yU^mjh34OVuVo^Fd#p4_g)Ile( zX9UVt&FM$kP<|8ur9!@tJV)b4eII`MHCiP?-}~N=Zn^DVR0@a-0fM~&MRdbC>jgRp zv$#e2$+n~a^Z)+d8y|deyqW_!oUGwOyY74Vc{C7GKobBt2yvlxkPC6U;aU)8X}c2b zRo&f>3&BE=(z?(0<49HkfJxA?n{T`Km3Kc~`}w~A^Z)bbXbU9RCbvP!DNv^&AHqj@ zAZO~7!iLtt5tVyl+tJEfZ~qgR7TQ(8R)g*Df9xf+8bpm~s5s* zZolhcC{_1B@NfR>-`;lTg8(p;85@7~7k`6o-cXp*D7pYhrvm~J>TrcQ&1hM z?hcCOP;3hLp^5`R(&8u~nj1=T*ZohTE1@qyupK>)BjueC)VeSBzqes$dyk{5&xiDJ)b;NPS6EEbPB!E zoX!lxn8sNctgr(Rr+;7w4FJ^hk{d2>ZewEu)>tx?h9!h#VM3v^ zL;5hka0>WA?5DhP!2MzKj)TPN!cX1Xj{?A+M!jI$;aX$|(;Vg_tZ)>Yn8iMSAa4m_ zZR1g%poy9sfxQKbAFU700nEUDqOAWmHkb|1TyPW;LB(@@HQ5aa79<%AQSWwP)sRy# zC|zz33WLWeEK8WzI9T7*j#iV(dXOe;P#A6VH9CQ9l!}nNQq^~5^(EVgiF#q<*r^i2 zTF9MP{9K+GKxMHyh@KRdR6&to`$9M-iw$DWn;?tBhjvl%ORHmamx)B8FjA?CH@10w zev}rr$1I(M{X@Vn*T-eGIT~9!p<~#F*kPd}-*#3v$*!TPgA!vnf@A?ar!SS6vaG~X zCHMptA-)lkESdvWNQ(1)?Jv!G;EhK%-{05xBxa!$Y>#c%Yzb zKw*#|d2IolBeh1Qz>3fc^abdo)9D7R;y7RcrEO~IM2mQRfofX#Q=XiQ7Zp9ds0gSY zm4z5_6zLP=9$7%mXh`5gGBDN1k~S#Y*|TRMOhnKbOr){U4YTz{jfg(OF8%zgeMHXL zw=<-FK}7-Wxbx79rq+SDz*k>i zuYn=~x6pR}KoC6_!h}qU%W7~6IOn2Yc8~;dKSB2=LI9qj6+9jvRE{J_-3bNMoe;W> z1X0?|@Gu%zB2yw+SexX&K?I(CiGVT}l~xmyCvDW)(M4W10p1o_-)s{@S5b2GGHf3> zQh+W7^dk2+{D5abdZ-Gki$`^w;!1LJK=EV>m1aOo-aAZdHC0Gh>?aG#p}Hs!>3UsU zAz@$uFsd^;I*O*3Db%>b5LC|9No0raoGl?#6snGmBPWV+|3rUBTbnI5L?$I9W)Ha$ zL58F-T)r5D;+WP+^uf9Bck*}$Cua^B4Th-|%uxcXFJbUzoRRTC_i&#h(>0hFJ$v2} z8EaI<%)wDtbWCDQ$t`Jra)Pam0|xQ{HuRj{qDMd_~&0jS5)f$r=NZKjW^%hwdVj>>o>RD`Nmso zR;~K0#-=vl7EH|MmJZMtZdE&W?!|6RZDV0kDK@^^x~sOX>6O>se(~iu3(l0-9q#wn zevI_rdGAAsRQbY7Z~Wsw|ANaCAz4H&Ew2W%{p9Dje(zs?3DQG+!~|z@x&=p%pZ@XB zZw1Fb`owd%JpunvqpjO^Kk(3#|MMSy#utc@$Q^e*@ZiHw9XWaus_>Iv{EjN&zx&(D zs=70UWk?)#FD|LX#>X2z-?4N52kSN*Jzns`pWOWH^RNBrXSY;VH@vszqfa+&!E@;5 zTmQIg&!Jm?fA?K?KLm4p{l}Z`y655BZojXnq;l7ugRB0{e}D7s_YWREiG$C-^w!qx zdkmhW$do4IAz{X01FQuDZo~HDus&hK!IXr>3=@s^7z7`9;uT6n+=0rjUTi%1;ybVc zL1>`0dmelS#_sM@bwB#?P0zgg{vYmn4A$)z`wE|a<^4yWeY2!Z4kH-W;mx<+jg-M8 z?|r(nq*ea-3#<1OG{BzTd7_4r`Ju97m0iEQ=?_o6^xltt@*CKWO6NFdAn?#ruTpZT z;eN6A%%(jBIF78Jc=4T&zB&w4`_F&=7ck0kAq-_u!3Ur3+q}OB#w#uX(;^0n_uvyR zZ#h^Bqx13S->&M?fM$zYq*a_gkQ+9her3(0&%6N(m~iP+FTH!Pr0w=UK8#9%9+A`Fy z0+#NM+N?v^tbdW!M5aQhtZG>E z!6&fcPM;|yak{wzR=4QB2cKH=$+k*X-_{dN|MH`o&J>nE{?v=N-}T`4zyH%OcO8=$ z<8Obo4LLsg+?$Xd*aNMAV!X6^17vmg15eWoY=q`uZ%e@9umM>Z*%Vll165#E^W(lOE30&;+U4ZmH-*W~45B+py#1cQ$}~A;5P&-VVjM|M8a~BK}aAfF*PfQbJDz)a^Q1cl#e7 zfsm0k6z_lj%|9TQzyG^`MQPvpcpK6@RmWSu<Tgivpa1GM6!_t% zUPG5hPY1w5R`)*i?1}2`zxvC+LGEBVstk`j{|MbKQ1$fhsTu;+9GvVP&Mk9HiZ zBJYpTq0j_qmmb#yZaz@a4>s*Z$)R!(OV&Mpl?&4^7Z3`?GU6bDk&*i{c#)TPbqfhT z(I$91@f5+Z0M!ta*X8yCV_;2^B@kgcczuBdzCVQdC7$-t!8{^{FP?g^Gk5|qd0P+i zgcVDSQIFS0-oei*Hra&<2&)vP5;-W9_Yi)7nKd}1M_-1mIXX6m1d*4jS3~SV;{M9D zS4e6gOmGowM2FLrHGqigsk4g*i-*{Pu+_S{1+bwNv>#F|RUpN@KnN?dzOfx9m)+qa z5rAqi(Quaf4q0dH=81`wiHAN+F%k{7EKJPY1hWpG-TO~;^TmXpi5(2{cYI<3#$P*& zYcQInG9_`!K@MELguHiv-8?cfGN0EmnMx7TBi7{A)EB&T{B-HAeaApM$pLo<~Iy0_07_(u}&(+r{vkjAck$BF9i-L#Jyx&)yCL+DA2I@;e(?u3LMxqK1zE}*lUc-X)*=zYYmm0ik}NRKp)NFs+ukwmI$n+Ol% z_OjIalGKbQ3%Ti`?RM-rdhkdALGP#n1}le?y+-qlG6Oz=IjV|QciSy+=3uU(oLv=A@!}~ z6ci(oOcFgo3CS%Q8VEH&XCy-#SY3Po>a6=i;Hp+GR)ZwUqyV+P;Ikat+) z9B$}|jZB_r4<+MYq2YIzjLEum3MaI{h$^(7{Z z{*gd(qSqR?d7}!wA3zA~{N|?{CEw}oKX`QYyK8|=AgJ<+nm68h4}CbENQ0(+^V_>X zYnkD(mex-28vyUNKimgA-tg%chYlYzp;_%krxN1uH5>~pV(C2|f|P*hy@(8EvdKX4S6fBM;% z;J{z~<_`@`t*P_~y5GO~-~SF8pi*m)>GLnX1`0)Y{j2}+LxE8GvtQnZo_V^Ucq? z^4jV{M^8f6SFQSQ=%`z^?nY&|?bv(Y1CQg9lc$Ss{_P!~Z`obh*rjt)^NUL9ua$P6 zs^<-b2_%%XDZp<$Z74gn1AvgzA9(!v)vtf>1qcv0_sTn;g34fk!U*1aq~ZrZ`W1}D zdmefQMspp1=$6~=t)wkiFy8ZTez<1iE?DO<0pI^@53GEci7+VN`DFXn!{s2iSKi$S z%krl`yM-D@SINHn!Dj$kf4u)mP#H{ZfX$yCeGwKUjQ%_Bc?|r+QoFYws|2_F$tm|UaiH@DsmT98^Zlp$-UoTva2 zfCth)Qo#ZiQln%kiKU4P5h?%Rhrfa?4xXFY}NT(_Ck>)CO<3WfaXFK(^u>O-dM zzC5t6un8%@x$aA_pV*lA?d^X$T`vII0e(7qoIqCk^Q{bM0qFb2+Ar2`If&xj`|z`M zf}x^jDGKnrJ0E~dHf%ozXhh84{O)crJ;V-10&G)`Ci(*~P|D{0#ejshU+jYs|Gn@3 z81j7X^>sk&%?C=JdU*}y)RLINRA`8Yo_w`MYJph~I=bce_X0d1?TSv-fz#E%{_Q&t z0Cz!vxMOm;Li{Z$t3G)6q)@CVEw6ch?I(EHkWU0bgPd+*8(Ub?DEQr-4}ZSvL~WP) zU>W-tx7>5`RMFk{J$n3PVQqc$Z*KkL$+G5u{=u(s9@wzwbUn)d*{)Nqa_hhT;FoCP zr(a(4>U*C7Syz9&4b6wDK{p^VXwg4_rs{>L2nZI6O12Z$V_s9#VIF9_+|M=g&*n8&HHJ`oz+3wHxoFbT>yh$%AATO~1=&)geCd(Z-2*{X8G_{w1|dVBAVf+AoX<0>&2^YmW*P|P z!~}=2NHSd{5RxA(!YmNNEFiDX%c~k;WRO?OR+~diTc|MUuv=Z*oE^6|mpy1lq9A+F zJnb3+zriqNckzjBRM*%RjmE0$nu*hipAQJhH&HNUV4qb~H;^HM%AP)Ap~7s1nF7p! z5jHY9idvwYTzZfpaDoVA)|4BF3F-jt6qVJGQqi`fm>7uQE>sx>BOrl?6bw5;s<4Wt z6P#T_x5rCHXAx%t)e3bj1bP8!FuaI?4vQSplPlC@P-01W9Wnkc%;Xtx(UIeYWF#2z z2H=O3VYKrk`5J!Bp3!>G~s(pY9KE}a?1&^ zlg5J8o&`c&MFuUyqyb+6R!2rgXSER;oj?fT1X5H0GjTJ<;t7;3`}ynG*jO2@LXau} z@?M%7A-6y<1X3lRx0P1Z%@QD*%k`8C?mGBW_sSxX614l-cJGKw&_<6z{dNprVAhkQW&)o*g8KHmz^!!0!IT zr^!9x;L$TgjDqQo-$47%(a>ZhDj*P~B&9(Vk|grU^(}*-NJrMv`bJ6)l~`(hNt$SM zbOiLr;<8$(#GqEsrQZr6P9g2dhcsH-yF6YWxj86%dZCB7Lz35dWtH{W&mc*H5?K#u z92@~k-O?u-KDtks?Oa@XD9BmQ@6QgI@gGo<(LhBti`bWjalrJ$ZG9~@V zNuzIAp%03+zJ5z6NUc&B_~ut;4@cr{9qc>rerUs|U%pLw-k#XDeK+U`l!b@lU;g)h z1*h5Ut|y*)Veh^}T^!yIe|n3-XaztXKY8Zx(UVU<`*KGo=jgH1e7^X$+wVnZtFEaB zZZ$QxgVvD#>UTbPcg=dh*nj@(f5Gm){fBq#+8>Ljo_+q6&%fLX!YnK*udZ$U=O5nG z+QvF`_=Hs6bNocXduu*K!CrXz&8q799Xt2I2IcX^ue|yexb%sqUPRV!y!qa~{YMTS zKK}j(9|8aV`3E<(w05M@!%AiEs{h~LseAhYr~ulxSHE9yrUZBY@BPcK@O=H%&372h zw(6RO^&f8>)EZW;`cFoa?Mz|myK6p7XU0H=&piLyp(Ce$_>-G)e*v<7_W9QJAAR=5 zTWg9+tNzdb@;%%Uo_YS&t=soBHh28_fBO5Hy5tGxkG%v_753%NfA#xnPX7;oeAB)&O|ZNV6t|K&FizF+At-PQ zu#h+#k5;f?akk2=|8~_XcAppK>~n9d>v4?(8VL|`1_D3)$!}m~o~+^GlHI540f&!1 z^9KIH-0$dd+bv}3kESv%s1A4+2=d|-iDp8fAIOnU8kOU`P~!M zoX4JhtAf=FAp;lyz^F1<5ivmpk3Rb*iifIEg9e@B&%F9RXcorw_rCXI9%NDjj3|p$IBVjc}vCx1>CTQp?}}-M^q<1QdZ@Fx*k>N1k~D#{Ex!ek%wB zb%e!C`FXnfU}s|+>D+ebLqJmiQdwsYpb;V^;}2o+Lq6|)x(o3E?e{5bHJ!; zKi{kNOroVgTz~QJ{_~cDC461vcYk;QdEI{ZBL$73TJ9j)edo#AKl_jWy#I9lp1lY0 zNV7V;9b9E6M^aW%1I+{wf(&t^6iJkakDe+itHE8qrITM+FDP%7z4YdXci#Kh>1xip z&-eZF4}M)$+w#Y|AKbI=2)fuEe|)g0vgwCEyY*OQ7s#QwRsQ<>pF_2vlaPD`yZ63_ zpD$^ZL#e=5Cu+K%dF=zx+OKcE17iR6Eq9%+rnKnGB}HiZop`O!~)1NP_- zd=2G%;f?kC&NRNg{wq`#AVg3Q;w@^CL3Dq(`_cD5+e3K>X&{821DQa5Xj}*ZM-G>D zv?=W515uGN4rsx($cP>@Z2#X^{TU9mm_1 z_CKThnkI1ZP-)xm?sxzo4L~jH=(*{ZyHE=dGIX-AN%F@Bo66##3}6%zkP$t1l2g z8~HLEk&R|6bOuO?ETAVy1h_@(UNfK?HARsF^k7IR8_GG$jY&p36AvMZ1f(ZrMm%N8qy*I@j}m`?FGeEN-F(2 z!vF28Zp0^VLvmq;#o>c+aO;7%tX2p90-GTmz!E@<@-&oGClW~*_o$;-qG)L9Ak2@Z zfgbAgrde}=5*Hb@On}>i8ljp{46Dt7K81Ec*FzQ{I%EpF4p2vYjP%!=%1XNMvl_aP zep`Wlfvj09~~PojvO=n{uV5(xmUBEzrb} z82%y-?jh(e#pSg!g_`IdIt5Q4#Z3mcBQp9C36@sWlL?k`m9T@=4T2)$;nSH6p~2yi z(WTaRY7D<-5Uq^T0)25ug-Hzch(-ZoNi=9Dn+sLxqrc2V^@*N)OTU^HzCjOaWW zqkqJgpe7UzBqs*l!+b;178(nuCvD*|JX67Ymf&b8J?V^$IU>|?YiLwzPI+SEI5^~` z;tzU;Bk4(tC+?(Y8TI_~tj>dhgypJxZ;tFsOg??e|}Q=H?4?g_VU3WiJUQvrO{QeJr!t<%NuIbZ_U%K2r znsN^p6_+EyWNNsox^Cm9EtOUEu!E82?RVZ^*U(x}SpK7*-tycFuOpG#`j$QW4uf5R zg22Mx-G1*q_dQxw)3jsPfj8cMAIAFWGi8rI^}_1+H+;Nld!NBgkAb9yz`+EBi3T2^ z<{G8p0rn`2GY|+&QXnFZ0G3+iwlDV=!GLb0(W|OU1CILe%L8}Z^B9a#K*-O2@w?~W z`0$~pUgJ_P{u{tBPrmqWQL~iHQ~{gszyH_&r?gE0bMycH>%SA|qem;*uonfo=;JS} z{^+a2hs!$OT(=qU^ZXm@a0)<(d|?g4oP|*iQ*y_NYJzQRKi_xXBQJFI`CxGZY?>w1 zD76Qkc==C{zHqRl6{b1pi~3mWNX3&czVr4+Tfsu7>iI9P-ca2=aNAuEp@guEksXK# z=IQE>wgNvWugJ^q0m)#D?k#A5!3`=vHCtqsDvsuX$6pc}C?FKmKnRXP*-%1=3j_=4 z?KoZqd6Ky|a2!{`QU|Kta@)Nq5&#l{I#I*D|M8cAUchOj`P!OIufDhO`8Pjg_jyp? zpZ(%inCVZvu)0ZNfke9 z-5n1?EN`y+k~X&@^O94@CIM&wqQzeUE>zX)lO^ZlL!bd+yD0mKsJs zil?Aw;vw8#$Jc_6z&0q%=>{Q$_OoC94&_JIuf6-p{SQ6!+B=^N+CoCLd2ewSS0FDg ztvqtPKrHPMh^dK2u>n4;sH(53X;`!V^NLnUag*poMF&v-*SFkx({JzkWM^Sh2mg^r zo_zSRXMc6`oqKlg*EwUK>^%M4YacxI(tF4hQrcJ81kAYa(dVH64?X#6hsycMwxeJz z?1E2fd4r(hbzdI1>;9)eMDKjE9kRXiPfvcj;{?P7rGh9>wO-$aBbD86tlhk?xE)Fc zP=Rhd_xie*-u}2#<=T3<{OMQLAOO7S;l44b4d@rGL&gJx5~2S<8bBt%e%%-QK!9X! zn4KqT!BnWrx-a(Q$X*If??m%KXL#B$(CCR5-g*4_w+|M#f?cr<*}lJN4>Sj;|AQa? z>aIUM31njRdXU#Y{^JipL1@jBwLB;f;ym-}2S^9?LWCFIT>sn~AEKebioi=~6yO{w zH%W{rKbo~!YDN#L6AVGTXh)#ksaoFp%?HtU?tS=K6pwrf%+-dF$gO|4|Dh*efncFy z=sRd)U?Ixz;FGUPEg66@vVdg%;qQL{kp6JJTe{t)JZ-4aM>uag60e7GN;{#8lo3H(1A96vL1bn{rA$1{A0QUmsaeqJ`p(l)) z8ZwH?QnSKR{b+)89K=VTx*QNDzxi24L3AqWo%Hw>EIvV|aDYKi-u}Yi=pP&+LzN~c zCjlqq-8mV(3A7s<8=ucTm`En=4yVy%fptYWVQ4^wodKIKM*CQZpJ7m|C-wyFLKuJE zIW(ASuEAoK%2n8aNlHvH*t;-FvXf!J&@|9)H)52);>`V`FaLyi^an7o`3OgWYETR! zJ!CXEq&JyuBqq!lB$!O4=BqNP0vWUhD~b$NMS1WzCUpca!R905Kgn1}Rd0XZc|oV< z^h1Ju1H@qk&?4q0(nmG3vsNHM7}Mk`7;yaqLwTq1oE|TlCX)t1lEj;FW%bSeKrbSR zA{vcdxIlS4KylC$*v-UgMV)n2RBgM)rHAg6jsbM2p_@TsXc$mJKpF(3JCqotVQ7ZV zp+Q0c5tJTq7^OrcWav?pMiJCA?|Z)Qoc-_K>sf2x@vQyqbzi?ri+pJ0mWZDSi?3FT z&?54XqJV^kANZ0+X2(LGMTo1sS*S##!xSqaP?G4yg?X@Tq$f;FH+5trs5d8R?kd*p z{}RKSP5%w7jBIc)&oGE;*0aHR@jyG`clCOjY8s?eJ4F{BhuxgrsXRxDF~u8d5gmjz z%m` zOP`4-wrqiMEJCA`69uoJOj4;&LW-K1P-k!J*|P7=OZVrR(r-C{0`#KBL$|}hFFJ@;g z0DRzh6-JXdE(DH5Egl|I0%+5cK{r&G3!J4N=l$;hkj!2E-<<-d)H3%^%YAvnrat-2w1EzSE^|?Z*bA(m?*_}cxOFdL zl=bvdy8zqN1Ej$se51UR*F?X*fluCA))KdwAWZ73+6^ZJUi_kXaD(1Sa8yai)v%j- z`M5^_8R}gUQN<%a!2b;j7oeL*V1Uyw%hQ4Fb{zStU@8L1b+pp$ zake*Qy~~$KMzd06q+8Xjm8Oq!f2zr(HrKe#^){*YGq@c8FLA63tltXRI-u2fO0e7O^&l5r7}nmksXXrq^g_v?6C zzaRen+L2wZL^9~!+5cOmWm;wx6;c(7J`-(3_Ym8|G*8&cgnsFnOu42&=)$j$tC{aQ zFnQliB$dCScA%a;v{Dep9iPv@Om)K|Zz`IB4@T_mw;H$^Ax{Ac z?`tJ--ooagiFKk5@4REm9AAS$Qbhnng4EA{a0dVYI^ww+dL6-FjQn4dfrtnK7+w$ zvz&BZHL{uqY!kkH)~S2yg%F&oQ!jx~<$*rI2F)9+y1F{~CzhF}hAEa%hUc~6vnF!{ ztpLP3IcnC>h?QLAU6|*sz?ZUu8fRrRR6CaK5zSJT1z%3z%YM&rYf#f&T92tJ{;4hS zjd^kH!GQ$GufU?ayIq+7)xoX%>DLxg#rk^e-HxAQ`Y|eimT}cbdiJ&n-H!CP$I2PxN;e zFY60G7uyhz58~a68X7X4P6HrknULb=%a@M}?a;4MNhEd?mKR$C>G`Ly$dK`Gxhs~N z`MvK4FtN&9125YZUD;X6%POW$zuXi-8ao8W?%i)EArEf%3_8}GF5MU#+g>dK84W&| z`6aP=@!b4Z>Np1c#Ec|GOr!apY=2tVp4J zoe4-n(I31nKRS)h5kF{k@1s{5-L6i>h2 zMg2TyhgS08LWrPSVk?oB@hCn7yzP5IttYOYt`6bKrB+}3V`6k4oUw$)T8l=#ufOY6`gIJlS625iU=p_>rRc!X-e_j&d7M6hBajxP^Si8}0+Srq2c8>}N zC3Y~6=4Gkk@IlTiyp(yzvPjvVs+1TprCPXhL!tQ&fe*npG8EyAzw5|9d^-q_(ufKbNz_nqQsIM))BH%H{gPe;JA2DV<(5GQ%wyp~>!00W z4bKJr6J+H?(~XN5x02G+ho6$YTqlmIP)vGzk#F0Z^;Wd6Y8N!r09qKcw)#w#9}s`F z7?ar*=O|${ncjW%nC(1x;5uk+2$h_Xg`t2qX-OM*>i`hsR@6F{Sagap`+?%+=rL#5 zI*cUaR+2m|P%g^yLTj4+W@xhPE%hDRtEb3-55(V3xf?dpTA?!3Tx=Fr z`9~vjdXL?^t4fW;g|VhF!WDKz|K+(qq z^U6-;$(AI8fWK5}uO<^&tsd9A7@j=qoiW*+7~3`U=UHQFFH>*lq`_*%_7JBVbOSM}?_>$l3a}7k@d4q8JYk1v>Bg44l-?VhJY9+J*%YY! zkF*Scw_7-wjO^bD##&}3MH6fzd-@Z(@lFQa3p=zQ!q2Vb1C`f^@3EgZCy>_o`Y@5Z0o^Akpb z%^xu&LyG*}ktk6zD(x$iZYT{63x~FnUUtaE_Du)vuE(5Y5uB~4=VkvTlKjK*SUN6x zg5KZf=Eo!A9Ln3pyd8T8i+>0!|8hwVqka>p z8tSSmcR0!@;g;>fPY_|77L_e{HO^Tu=Wn+z&P0D3H5M-E%bZ_|ua$6_-29KEtEUd6 zOAa3KEL@{`e0f{aHPb1bQ;h0@($_fC+`(Jy6WGT*?~Ef7I|a()M_H+KVR@pGa-N`d z_;dx6j20SR9|f2Z9~8yYO$^TBh`Ng;c)WMe;zt8@@gtI1TEe-_(eeZq7Tj?rPDgMn z}^vzU6+MHLKfuFcv)j*<116h$R#z4V-@3yOp(AIB{IK+SGF?^?2 zA8z1wk~6R($xV!P)r}uyL2|(Qx1?~W;oeN61Y;7`%!AK;B$P8%Mak{UxA|L9a)PNf zc{6VxivSYu3m2-a666B6WIe$5qpZF_K{=eN>}mA$_{=r?_Xuef8|0Xr`EC4V^wq>v3b`$Y;SX?|yBqW2{rsz9AfTA);D zzv|D)Ik}~n23RGq+PY08a8t*}=j&dn0(k;%?8x?sl7RIY!QpY5=qp0h^#sUCPk@#E zG}5llp}M7y%270jy(6RO+DH06SE*GkKGD;28Qt3)-8)h&RKA&#J#dG!cG*-Ghe0B| zlB_<0mwt8kf*3xWkF5%TWohU0KZE%*#<#X_jzH!9ff@e?g|o(>Rctu9IfV%rau*Gd z%P~&Y&Pf_HSl0@9Q*J9MTK%RtL~mjhmm#Xs9ISI7`TE^EhEL~#Ot~8&m)xe6!(O_G z+gCa+O>f!LgeON*bI#C87PTZ-KU$)%^njA^&C#gD{=6C1l;~ePlr5Sfz0wLY%kyWxDL^{P!%(p~QFeE_^dOODqpj+~j&`^Z?1>ouDt@V}{YeSG^%5ftXH zeR>18|B*BcHOE<`=^ajX{fDd!F3_zh0j_TkieU+)Cop7l7Hm3@cAioUfC1~d)(S;1 zA2GEFTf_X$5*>c9Izm{PD}&Z^0(;>jN6z1gG<7<~C?Pp}ZCYVXz68OJN4mUx zltLNz^N$X`bPt3JOAj=V4Rq&cm97FRN+@e#`U8)HdJa#VDcNJArzvkp;5LxlPF;e2eV1=py06rb$t{pmC2UnI`y z;~t?Af=!)XK_L;oK@r#7a!uWYV_AFH=ITmOQqtsDgsas zT9TP^Ljkr9F%?=ho#Q(ByugmT7ABUT)fLVr>L>a}3?IqP{Ez^+G3MZP14(k+ZWWlK zz#&y-@OURBrc4uKQ?Tj(CtBvm20??hb*v-JktGVlW1zhJn8$j>hVI%q@JT-MpZ%+j z1dMigpKn+L!64p_hpmO@CR?eIe_+WY)0VY|T`K1u6k&w(QPCekvhpd9E`AeLn8%1A zwHJH$IAMEj3u9k+^X>Q}k12c@(l+ds;HSm;ta|=ta>&mmmlrm)z}ss>S<4dGgLVD^ zYd#De&)KBgq8BZ>5X*by%`(Ys)RQ;xQM#g}m+Tf4jMRq3v{8w(UV-*=qwZ1y<*4CJ z9c2m{y5!M^J&vXJ#m~k(sm>K|29>Nk1#-6e<;^?_i+CjYdj94KY0V#V!NME#9x%K! zskC$1pIm~c4nZ*&)ma}m`87B?#;8~j6})O$q+X26*i&ymAeC~I zQSDE{d%4xGWs*{}y-jf|Rf%(>c-mj+g?68)rI`cA#qYk6-~o(e_uB*T!09&+dQ;76 z)J*6nSOSmkvTj7pug0xKGi0;&17hu z3TOv-08IYQJgxr@cHW_A?z}Gg1EctTs_;N;Pm0-3OavKvr*C>~L(MbsRG$vpAFymR ze$als#_1g=${q>FK{&F;j_gP0C333t(wJDr?gU0eWcY6JM_%KQspvkqeQ7MQhkv56 z6ESl!ArY-Th*fxm*8;YeXpyMv7ULZ)G za|WG-u%Wgz3++=OD}XLa0ez7hZlE%2zyrR*4 zGkkDlq2suJ%$_EV<9aInZ&V4v9avaf&VC(mam-%3WK)6~e)wZ!n-I;~xTD;>fD+1X zdfkMivsxL>dK`lCf8P-9Z}H|dT@8JtV`NItJfp$b9si2no%hLq?j9a(WvgB3H9TbC zP}&i|gfeCA{-m5o;tqmyNOQ&hjS!(!Kc^vLAJ1q(O33vmf#_Z)w{6V6nEc9xJ;?3< zR`UP7B{iuCSbZBvU-6n0zTB@jC3p^}Ob&kf-rU*S&+p%oCj@P&H8T{`fBfZ}#q0IId%&FpBb$l_)m%5%LI1sRoH&cj|dJ=kT*$nhg z;{NF%n@a)N-z*qi$VuGWIsV^iXLE^CMo(=)WmFkz|LL;Ng_95H28edh%o0}{Z|9uY b0Dm7uEovN4NTL*P5H15^ZZ~Y^=2xKYK#tWJD3*u;IYKz!1d6gcQKQAaB6HAhcmVzTa`v;8J~m`(UpiDgah7 zhI{z_f!$C|+(=p)jOx7(1NI@v6b$lTP2Ml;_X`XRJPZ7` z3e!`f5h?efuIo{;mFn~Wl)ey8F8ExeiS~}FwDc)BUfZpudNM>W8TyyXB8O7sS3`2m z|D4wb2y#a4`s(JJSQWufzvm6hHlkXKrKP%(=8yUMB%c#GbsJPeDnw1o46hf${=K{# za->-(VQZ8(uQ(fpcRJpXP>&pSiJ#X5%Ac&QOwr+}O624hyAY6sH}IWCu%&T!jw6cr zaels-cN=NRWM*g>+qZ$H5FCIwP!mR4ECq2^%3Ko}-;_2W>@Fqb)HFYMH*Ng<=|M}+ zzwgDla2`$Qeg6fG_0N@fUkr9I$eFRJpu9%|9&R46>4h4}>YI~Dv+6sE-47LbwhY-- z4=!wvN()PJ?cqu)Dn#ba)fPIGPC3$TN%wAj4C-+fy`{VWq+j$Z6;3wPtj4N;{;@sx26ICzVSQ^qjF{IJAu{d(HInUcmANwjWxFfwqmjYK zILr{1t?WcHPxHKu?@B^h)s$Snee+pub@}_fTs)(nLoUAli~l#G2{)j0{Gp(;@>YCD zv;r2=p#ir7!a=4dd(>(>ujZ8{opanRFzzg|GSbR8^@yTbx3z|!l_f&p=}7~YdjR7v zP0T4;B+w?)lEPe#tkf#1iHWN0a-^GRo7ui~vKCtIP7`--6VlHS4imXswSTiSC&~xe z8sQ(jW={bDkVNfOBc^WwP@#i6UO7u_?L|thpGp9fFH-jFbtLKNOTl=@7Pj^O+F}#g zuxbsX$gn`^a0Foyrx=$L4k?Ep25W95o2OJ2Ld9C8S#$GtoXp{Zj+bt{k|oFh((J}d zALWe1lsUOV^G{KrnQ2Srl@7+GvWOdH!LJ^cycfS*bbv)aLk*3gW8=HnYd!c=^Bl1 zD#8MHli7_YZf}JndPSj~$ZA)n$*nGoJlZubSv_)ETD;-YQqimQ&)gB^Sokg|2fYje zx%?x%bgf~E*!TC%{RHi9#FQ*^rRR$iGb+&**fAl2B1rMnf40=+LzXL~8a*z7D#W%V z{xNW>?q$Y(maUs>zZd!$@Fh;}sJ+B)lv=gm(bCaC5544mu(8knoG{ks#$|+|4u+O1 z=6ync6#iutxtfx(HnTNt^X2pgU1o#ZVg$7(o!nFt0)!V1wUeIjI3Qh)G?8%})ju9_ z!TnGN@8Ow-G<5xXT)~kzmqc9Ds@g;{W1FaazKg10y&4Iw+Rp<@AB%N0XL>GjHIV&V^!-V+|E}M|fB1Dw^Kwd0ovKc_ z*+461p-Fwl!lV+U4s5969Qk0E^S9{6m*zjEAI6`&%a}VFAAf<=nChR7ENyylx#Tdl zI@6T>w}hXlhCOM5X33x{TLU&25YQQ)3-E)R+%+d(ECbh4aAN;+-2YuaaRy%_ZvuI( z(>ja&hqAEwf+E-64wmW+MB6w^zzel-8Toreq!ZZSYtae=7XRG&*Cx=0WY!$e@oy#6 z0bK38jIg*~#FR8WF0L}3mI@Hy{I!BU#wZg{wGC@Ci-=!7q)NEC;otstvs&Hp{1IL9 z8FA~F#8X)6+JR@XzkeB5$5FY?H?Oa7tfe5JUmdy-VclgI*USOYlASz=`0oYvy(P~2 z=q+r>(zYBOrPYgwrmVDC&B0}RZkvw0wO?BYXP&r9G5qs~x@bjlD@JT$=Uwi=_##F&dRxx|d0>_Y*VcxqUqF4<|z;S64L zyRKmcLRYLOM;(SWY(^@6OujJ^W@`5^bXR>DT#>vJFqpJ;(0EZ+R$Qg4|G5~1N%YIj z{$|6dWc{qPI*)iYto?`HQ0!{aBonE$HygKumI^ID`E_ImPd`}-MZKG?i~e+&(c;(DEt60*L4NI;_^u8-qz=z#8T<6=#d1Tq|MI9cKn|P>pAfw z1^*)81osD)((o50bGqWBT#D{%SgC$ZkmPP~__j=}}XY>q4_*>h*;7Si!unmyGyf_`pE0(SDx2 zHd#M17QpxZzR~Du{w$FG4+aW?`G8&vH*|7;Hja1is`YuwUUFmq*zYw2fXP*bD&iFN z>jsf#F@>Z)c+Eeh9it@uH!l;C;VqRx`(CS6OWvX?i{cz+B(4UCqI((NkHL$g-k6 zY0e+ZH}g);zNiIN2p$MqVFf0DTSXLa$N&0ekUwJHGx4o2e3}=bpBZ(N{x7q^7g3fU zIHUdGh>>6zzm+`Qob+{80nl^y;snhYitBO|KX!n77PN>12ihZOsd94W*!t;d+Zk=5 z$xJE%$z%B7oIk^eAza7%PG$e!x$X9NBdvf5m z6JQj0PM3X#A1Vd;(6}olKtVt1+J1)}Oa2XL!2LxS_=@jt$|tjWS}}uPTD5HZ<`<>+ z4BNk*QcCxWp2)Ia33#DW{+*i7+@=q!u*>MGm<_3pL$&;Sgy`E<{K8N0dDEXMUm{zd zJ)WOB-EA&Iwo}sL@cpzRHz!3idlsqJt@J3 z2DlteFdV|*1x*9GgH0<(v?Gez5zsq_3&-p$Ilesd|6Vxj$Yn~&F*XczUs#9c!RE?5oHFiaO>ml;YKU%*r{VH#N^EM7|~Ty z9jA_f4g4tDW8X*p%dQhn9NANOt=mAFX%#b!ah_^|S;QIFmKxN$OgFM42ss`Z=h1?X zCAF*w=`kFOy=|o^?&Z}+uFHqD*9#7xvDP0R8L zTkyiV+kqCQ@47`lb*Ealsx_FSzqUOeaV_py<~bamB>Y;6HlsfFa-cJl<;4AU6Pdl4 z<^Y`_U3z@2rb(cE%y{fui;hyZZ9eU(wwwa>Ec}NyC4xBs>Kl7ep1n8#`Vhss&~x2G z@VB1twBIZV7D*5}M4d!~UFKez^%7U+%e)^noLr9bF)#rBEiyQyNZ6&-uBw2w0yzZ&A`PCus1VQS)OCe8C^Tx z4+)J194^N-bc(!>O(XJtJ#si}Em>SLuj`yN67-#u#Y8Ah@^AWbYs;5Z$QWDHbjj{A zMRoM^sw@Xna3{gYL=19tjgKTvw-yiXEHg7U#U&L#D<`9Tzd<~0w6$0XRl(T0flBVy zQmwtiM>VFyCknRKDJdd)lMFNKE;uT zcZN`eTip;S4VzX`{AD3&fe@<`*68lLK z$2Rqd&ISB4+0ss}qU_J8h4MLugTxdBoQ5P0%e7W?J-uvVs*Ld5NX(Ga%Zo>EYuV0# z{Y*b?U~?+y=EJplWxFBq_c87(G&FSd?JHBJYKuh)5}^!-DVJ~@cZ=0lt^Mx1KXh=0 zB)>UXD~B`BqeEy%UH=UOxJrNtqMNnkFy-fJ>*^InDq(w&K(YUNhL@T|DWb@^oZh!s zwg&4Qz!CW;Db}Tdu$lyebe9b>;g6}zc+;OPyPxZlMT&3|un|r%P`9GSUl&57yjMw^ zL@kmiJ?o7ywo4d*7h@|3Ic&220R_oFynmHyQW5sLr{FEP@uxr2f5;uKJ3(39=9hO9iK zMnhA?&-v)vBqU~!vpl4T(Vk_)bp5Ub7Cl1M2+(9=73m+5qL(4Ud23gJT+j_GZfuvA zmtUP$Fyj;Aw>rJ~%-U+xzJRBP{%DYSEEIC-*{s?W+|@fhZxn@Wo!4>wtd~u6iAv>} zuO=q&bLTYfU0Z}Z?5dLy7qg;ow>{iKTde&?zgu-L1PM&gvs6fXqG!0?8hX4wNZ~p^ zn?OQCZMMs{`)IZNjxZ_mWV2fOd0dg{pOwXrYd;c0EMc^D%XQXEP0tf?wyIdI+i6W6 zq-zbhxyGEX&)cR2Jf5}O(QO;u-=oSJfVK>iY`WCY&^~XqJrOWG6h-mc#Xn5#aT2sq z{M#wHkOD91{_#0M?JbON5dJNgqH@aRG2WWg%d*dZ9Rtlw{cp(%Sl~v zVTPmW(ex~IKiMYZVCFtE$B&5CkZ4>=@kdf+nWTm^XsyDZ`rQSxm?Zg?yn0@m8T{tI z_X|m-*c2cIR#j51_9y~3f`)r-QmPRsV_x@6Yq>VZEha*BsKO&KStl@A`9@#RGs7kd zh)^lDVr}{;DY8_fDi%^Q0??`FHv|AX%|mvM&^%`gBvn5aGu3LGasf9oe6BPy$u?tL@F}xL0Zj1bSqbuoX?&>8<3p% zAW=%vlB_!Mfollu3_YEk9gzK$;-QU3}Wu3kO?cQS6 z3boVrH=4|ozNHuNj&rsKS}3J$jKs{N;K=pPXCbv=K=6kr@^hbh@c{;bu0>D4R;P1> zKM_GP%1?8V-cVX~odYwE8Bd*UGKzz|IGJb<$Nm&(Ag8{J72V$W8x++MtwudK6cm(; z{U!XKFQ_MEf3xL$9}~&XAd(k6Ik_d8PI!rY)eQ(Z#fCRfwk;P@sB2~0C5gkSw9eEX zyE?UlIa06I>oyum0+Cs@ZhqHv8-y}CwOGuAi<-;d+}{s^r(?%4emQk8s62ACUwcU0 zdY3L8(VY71I(1u+MH2t;KOi)z2PCytv=X^My-Hwfr zkbf$@Ki%}E#vh&x5_wj}YBGvj>0O`|)m#%dsluj|{mre!CpJ;S212yZ!ZiuN)FXu` ztH8=!PsarRHTrqS?y~*G9+J7u7+{r5$hm6p@NTa4 z#>MTCkp_A5%nlY>h5m}7fVOv(0;vPQvlUTQNSu-Ryh5F`Jqg^F&g9~IhG-%_06NVw zV3I#P&P-n%vF(MKG=At0Dcm4Xu*j{Qi4>({A91;%MTWzUX%GnSrg|HP1qVgl#Y04|YiwhnJ8wF2o$UU@hxFbi4?5$NUVCh@D< z!y;PF|J+N>N0mahlh3+cTT^;i%A^Nl{n-T07qZ^7F7`;5Og!v}d6sT}qn1FQ%@OSA8fx||}H)aLA`TV#?9 z&S&5!$i7ymOE#<_{NAD%AYP^NMf9J%H1;=tjm|0A!!#S+3RHr8DK>1yo-D<{lbYt7INiwNUEP0(> zS5J5O`g}Fkm(wemwb`&tM&lBc=QgRtv?LR6Sty-q80r#^$si;IbnVNPwdYD4@hdE&S3d}UY=K^9hvA+D^F`23*9B$a% zpatxZ>v&47+ReY7tvwAjYB0jvoTkE$_+?^;Fa{&jH*(1m_@9CFT#R2o&ID6v$GB_& zU#Gt_1+5CB@9pJpHc=os73@z`-+YK?ApmBQ_4#8WaiZVbg;H02gR_HtT>ff(D)ZcE z7F7Hz%NghZ+dIopcOS&7?%}a#N0azflXk{-_1-Jz+hVkql2z-LV%}wWXhMo;rME(! zOF8sl{q7m!sShnvj<%ouEP0%~pkQeo59zOwDR{g_7d7SzJS^i+rH_e$PpgM%GZ!tw z0#daHeR+q=HnTIMNghsYJ(4nQ4Wz0g($fuFNmhD&NnyXttSyNSib31a+|J9>ze!hE zz&B$Rg@8Me!T3MvV%v8>h1z`u<;wut^gI=_Y!}F z#5On}rLKSG(YfBWTHQMdeyDi+0iU5A9Rl4?uBYpf#n9TWof)P0C?s~XfVU8@=nDdN zud&LG6gj_C>|V>W6X*0GL`Lmp5gjv>v4Iwe}6rF=yJF_SP*-b?!2OTu4k=iKl6en zsaENB7=gp}@vQZ_>~wgTD!kAa&RqsUmIuj03bVp6sN&f^0ydeJnp$+eLQ5*6eIPiP zGq=Y1JVQ)cy0i5G9vKTg#BzDcW?1^|YYR*?t|tX)!V*Vt!_g*R4H0IwNQgCzi#3m>N+z=e zNeE`2=*4>)xMc81DTSymu2rc4l$*b|A1MaC%zM0wm4pGQc|IaWUdh!4%x0UxULj&L z56nb?MIZC;zT=5@JIsny4GWG1pa_`b1?`=LeY$13E2w_i)plIdyVoCNmC|ZNKYy-8 zd{ON2Vt4l6dAVW|%{t_c4?9!wp2@hZoim!X#=%d*<-$+&9}Cg*YJ9FzTOpH8V5tn- zTQW}?XxyxyGY%;DHBLu>Z~j?2_Um#O?^1AXbKsWgAho?_)Yn!gCn|l?o;+Gep4E_0 zBjz?T8YWOXg6z|wj;4Ha4chC_V;$T7ji|9%yz;|*xvR7FgbsK z&3qXe8|!V{j_L#DBC#Fszx^JdNtEpLaC*tdP`9v%hc#3qeEE2LZh4zZM1)D;#i*DO z9T`K>KIR`$u?*t*+wJX?&_l{Bx2_`=~Juv=QKf|qcGY|W!R{}(2XRD_~*(3Ciw6tjM51Cm^F z5S-PzHO<#G*C1!un7aVtA=gf~%Fk1<#E)3{l>s$!lQJ2lTkVAoeeRMFoAf##>2Pyc znTLTp^JZ<+^k&=Sy&5TPh=UMWZ@V%81e{E8L z_FC@Rf*9Pc<@MP(;WLXD3Xt5DTWc=&o6fpj4hOxQP8LG?@tf9zTM&TPWv{TXpuX3Y zj0AF1oyS3a`nYpz;{tL*=P}PCW2SJn9xm&4szc2*r#rI57p>dVvWwDy6&XzDG&In? zf`uM5r=vs;fcrP{3XiJ>P~%ngZkfV>l1`J;oZ$8 z3PqwKRBx@4w@qO16nfVZY=Mvh=N7Pw_*_c`p&EI(TH;>6mM93}$sp3DQ)ijb>U{oI z^_eNJvDYxyo%oyGVn`x79ZxgG7-j~sb*a3Z5gWQIYJRk^Br%#Jf!^;ZejVG!*ffty zO|SStjaYA6_#zVcJmr_AYt9rBpfF-svN?`cc6+Qg?P>@NyhZ62oS2DL(1uQd zoQV6VY?u}|W!N+vzyL?BKt*SRwT*f=0tHljgpv}Qgq zN_Tbw0RgsaGYFwKoW8AFaU3IC^bSqjEiDY)yW&@2DNnZe&+Zc z!5EAnGHMm^sm;}c>C#ln@EEFI#w~8Fr0Ib7?6hU_rd=*9;`y@(flaRP-gD0$RaaII-n0k-p8dN)_MC)DkZfwwQ%kdg-$jV>de7sKSw zbiZr};so9!Ddfy8)WFOD3AkXzK&L+H^|G$3^@`Z4)iJfqBPl-Oa^Zke< z%3rpXeARr2$DcJQbW137M9ofP6=gpZ0c^`j$-RUGzG=U(z>^5C;G|(Ts)DCwT*HZj zdAhB`L-Q1v;MK2ABl5v9$QvuI0^zaT$H$HcMsvws>%~qs4h;xDcSXmveQl(2gBLa*puDv`O&G;`Oi( zes>v*>z>~E7uSQ*0LB@`akom8X_t3gKwG(`napXW0UYu-^SzPEi*6+QG}h!3O~op1 zP!EZS$+Q5<{HhI(Krb&mx_pKGzD(@7%=otmkV`6sFq2i=E*;4Nx@2|D)i|Fr#{Qy5jM;1{wE}FtF57(`C4{J#>+;F8l!o;C#;m zo_ur;>00lVJdZh)v^|=jBd&L3#P>kIB(xcf#BFWYg^<8gcG+nK^l7ZRT`a^3Isk#C za!E9sE&G!4;fd{PzOvry;i=@;{ep~V5Ses+q?8ib0aP=r?03Odm{Tl63jm`}54)Ty z-JV=KzRP5yH~ejAL-%Szoy7__b41!fJb4rSZy^|2yo6ltLaJpl!`;)rt@#FX3*AOS zh#4aZiUQ=)MdH@%wNkxG+It*NeO=ED6BmbG)-0zB%}udf?R485>{APsG__L z@Xk0{KcKn^V|L3w6>Aj0*#yMSlPL=bfbaOLF-#bx&d+b1F{G2;g((G;moM#EdCVJP z%hJB3QZ+`5_Sdzy-03OosiE(QAog42?2o~TPdvML5wDp}!_T2?Ue^R_9g&&_jx zUyI{b$lOY48seli(M$Kh>cSLPX$<_eBHur46j8jDL+&~QnjKXd4`QsVpKm)$IJEl* zkTgz~Qa9HOsef> z^a-ygzxdR6@dsVl@mh&moQ_;%{LUAH`?+!(*Id@g+iT5YJ8Z%$(<;9uFV1m`o_TrA0;jtwK%*7-$GB zTJ*<~q)~RicQTJx7S$&Nh570TSlTc9A~d9+)M-sN&D^PgWm;qLU#VJ~D$GBHEhQ|X zIR3VsHUd?_^V5UQhU3r}Q;^=(?m-&!UCo%fpeajGhL*yZ%OGrcWGG{Oair&R`dzlz zBk*}@x=YLsW6UB^cO_bNr;&U;$AmB*WhF<-zkU~y%J42$xF@EWP#+Ml%hw;=Y*4>d zBxY4_wOAGw5?O5zP30`G3r>7F;GH>}H2lCQd!sO8XgP~!kkroR*3ZgY!CPd{o+chN zt1>V++TA5QJZZGqAaW8*GPV6XQaZ61lt4ovv98*TTX!pOpg^&nGM5roz_QJHQmR<@ z2_Q{w0kmEi|6Uk>>gAIFMnrL_2YkhxObFG z(aTKLA*1mn;y!krI__g>eaIr2a4)k?hT`?IPJLY6TVQ4Or7pXO-RmmF!!M+BY+_cu zZu}d*u$S;A6uLB&O=JH-9#NI{b>GLlTXkc~jDj>ARvtF9H>i&v^^^R^%v}5z8tLM^#XCV_d+AgaK=KMX_$+xCu?$jFgN>r z0M-nwTl+Mi^M`)H3-u|!rRv&>!w45r(c`$3%&+%Z!PpYonDTH?5wkK!ln`d6Ez6cZ z7hJmL-KLm?Sw-y{eGy44-2>2dEnmzeE%AHADxNzyZ#aW#5fN90A4^dk8ZkE1)uoO-RGbd9_kXFAlV_;jU z@7j#hlf9N;cKK#oIdls`qDJPjJFt#mem>CNO3kNxHBG4_{tdKPt9}paZ))7xg133L z%{}%so$@RiUApM3Ic|H%_;*4(Ya1{T#6%U^8={)xR$4rfE1(|WzjkJ6?<_n287F&aJoAE!X$DtThp+D$;2BWtvgYya&t`_6-MQs`RuL=q&F`CDV_j9Uum2>4d{d7;`sH^7WoS8O zkk;Qg#&>e0oOFRC8I2R z_@+0Te|ScJ1H}0IiLZV*PE?|B1c(`w=i$W&!>%x2pf21`dSa z*E7fb6k&@0H$aYTqx|9epu9iq4*6x6zf=WoKnW1BQo3Yp+Z^ zMbAHzd=kt0XlUqE^l{oGPNPElto^aO#X2{ha|g~l72{T9&Rk^%9`RBz00=irs}#;f z$|IBV7lz_}m>tLy(7lGch>%eC-vV0tQYzr#u7#VfSBHa!BM?S+|1=|Q#NKUH+Li;l zfZq3xNI>ycQ91$Kd<69V_pW}3S5^SWfdDhnfG0MhJyu&Kks0$7{h}E3Z{J=o?rO4& z8oNFT=9a^zX#Rm#_%{|BFUe=gH9z0!N|=b7xoVLF775-z5bjrk!h-qd&s={}$p;6V z>VSiklhNKe1{8|~ix~Z6v+d>LRvC!|a&$XpSsNYAXdFO=Eqc=w@xXjE8Q9<-aqQzG*%x8_BWmVWq4{OT#b5=>oN7!n;EwXiH z=vBIzbsQ~Xk4=)F5pdrw`81$Ovi9Z2wUS&8978V5d)R6o{4Psulvv2XQvph_bMR91 z^|7&VN-EA4e$wrcRR5icoANO$R*!g9eagJJ7K=JOW~F^C5IgqesXdNscztkle6wU&g5zzhH%D@6OauioR((0-024%fW;tIyc|q z#{KOYXV~YZ7}y~4zj9*lFxCZVa5JR(8FGt89CNN01%2~LlI=i}3#PwzVhUv1-8xXw zvFxcb^MH9`-wyw}>SBUBm6qGAt|_k+&h2T*VorD>#rM`IbuN7TpVajGjPc^YPJ1F< z*VxVf%~igUl36l1CGOLb0&%2PSr4a z`w!Oqj|uz>drt`2I?ENOHxKR4^qbTqxCztq3 zV?BXUq|{$g>HqGys(4yM6f~nqU$xrwASOF5B(V?qp14-vzKjl2tIX}%Qm~L-hPAe~ z783CXt+)&{Z8HA}qyFnW#vdOMdBO3<6zQ3$p~XY0#lph`lv$2h+^5K}KBGXk08v`( zE&=FRGVy zGx=tsn|$E#zo_sxbvnKYbf66_BpQGK`J?OeIJ|4xa_tOi%n*dPT+R z0ji;k#9x{=9k34Za%T{Tp{V~8FHPv{NmwPj*+8{oh_(Pa47C_pSMs54LjPi`L_{=$ zB#7c?+t*=yygx#bP2Xl8ncML@TTj4amwf&u{@+OEzo+_lrK1gbq4cPM z>VW6f0DJA87F9NL4WaNh$}VtS;-q}YiG(v~>*O250@2o5x{gIBWt{5f)$kKBM;E~_ zwA?IKt8KF+MLuOYT3?oR2 zbVmk4ZKZsRK6Zz>54Q_qS>>=|5~6Ya@|EKW%+wfp&Zro9l~Frk@gVG$ALX8AyyC~A zPsdJ6Da&nSS3d~;N6+u{uo2BNgcCbWSetTp4uOdB$P5&fmFS$$tsRqz43D8|$PrfYsMkHHsNLO*53ehdCmR zJ?HLtX>q-EA`QH)OSiszsgoI%4|TSVLXGLuN=pd@w1#)Vji@F2o#;b5JOxT8mJfXC zWHY~#BcHeJRxCXZJDqjeDs)IA$|!n!b>gbuOV}PuPGxZS#J8Bz6L*6(svH({HH-j! zq`YLw8yWvE9{6kHxl3j#Z#J|MV|oHvar9n!*{#LGVK6nm8o06wb=tIhhx8&`T=mrs zKW^SK47%9KVAJu@;2)7Wel?s|tUh@n*wZ{2Fn5M_1>p^@Hp+MQw!(nyNzF{|9ce5rnPQz^@Hcv3QN|Ej!^?baWXMJ8r z=%mrnrz60cTue1wa4)@S7#uC zX$Esgx&#^Q(6h-8MGm&+%J{OcwRmqa7neH={GSfc!W~(NRW*X!OT_-(m{Ouc{E#|c_(}@ur0^$ggJN+Dq_$r-)E(z4@`~ zZdMZ}pIS-;ERcjjt>?EyqATl4CVqofS2JJyD{?WrP6>lInSf@y|Bnw1`}fbJq$)wx zeJJe`r`naK2W8rckC~Tp){46eS*dYNG|wun_gnhl3{TD94k#;kwEK4RC8 znfEur1GU$_Cj}7fobPvKR|g~3chWsgJ(x#I?5_((_@8hJE1PHRaVB^^3_Ro6y&QS` z8CLuMs)&v~vMu3=u=`2eSXz$VtpGIB_{cGZdjab8616Eg3%P0mhfi0zTOyjlnXuv` zl;uL6;-i$&rz3Ryu1%}g))t6V;Ytg5Q=+2I>q*8IxbC%|R7eD}*y^n$`$yDu^zP1959TY8WVmif z0gXy|i`$C@PpUDeVf5|Y1n?Ny#!+WqC}{)Q+uM`l$LQV@6;i3Z@X5*Q2kY$wGMu)! zKY#uldCVVvMT@aO3=Na~YBmESh3U<$Qm!3@#ncx4+H!HtM86puM$i942{M6JBP1pW zA<+_Ily?;Da(I6JW9ldxef?)FIz%G%%I#Lpm)LE0e0+3_ov=L$5WZ`IU z1#X4O6E%nKC_)cq%Mw=e%*gp$7Z zzg69Pr6XIo!w9WO1-Hfx<6+jVxmc|b-_+T=393f3+eTOnHoj_^67?xdr!`dm2(M58 zGYwx{Bt8zQP8urzAXr!Z91U2ui=Z>>PDMdcD6S_CEYo(q@lLvY?I&Kq3oO^D*IRwO zIhe|aALF@`DpPOxz_#v&p>Loc9gQ6HMBsv^s%;Bf(P%+jUue8hpmD~$eRr^iK;L?S zJy*VL0!fz|Y?#oH2FHI6e4~5^0+NMe@}hAG2Wzx@K@gM7`b}zZuff^g@ey=XoUCHf z5LH&TgAzc|Pj?W`sW0m;S9rwNH{Wb*susNifZ$rOaq=qKR*+fGKfxDOS@y=X2)DU| zk=DFXNdgh9Yox})qFEDm%(VKKt^eZ1~vdh?tK7Dni{zFBdR95_dq z*9ySU$q4T!YrV@PJ}KVMgmZg)+&>kQk%;Fw0kGj@WY*u8sRqF5*~MTnlr}La_q^Ci z(+vp)w|GjS6ucz+IpmAlfrb7xTeI?e^&*)WXB_l%G`m3y96! zzS_x{@+Y{*glv~bIWex0!RtTAvi`&FX8!@ZpmZ(g`As-If%#@^nHcIrSwX!hU`P@#xaH#jKGl(rk-a73K%y;&FF5DtU|rq}Dy2JW0S_Pe&9% zyQ=GvkD%>pi)wI=WGJz5PisrrE(AeTiCG7Xw_ z7YwZV=_1K&nYZNL)j{_iR%Mgi;ON~7(;E`d?bbxziUU3&)Xi%v#${Y9?qcMMemnE+ zkxf8Qkkr8`$tF2?4cIIRbE+fTXhlIr^r?Yu%>#pN%`S0-1oLjy9-0$2>K5hty0%ow zrPJNKTBdb<$ZX$fo$WpJmxf3Fw(^AP9;RBfQ>QrJvQ#i{8RIhQ`P+i6IoQRc492PX zr2GLZsh$`*SD`EX=yq!yYk`aiIIc4R|AtK8Km)jzaeI+1lcHu#Oj9xRayvs55)(VQ zE`8j_#4>&@08gWW`WhZcsp$~8#7xRY+!5G7e-hDq*lWbASa}ds#gF3^%k6oDU$hpe z5_h&|ecW#B&`l1qdy((5UQaMML_zm4q^&uS)@Vr!8Kg%9s7^YFzH8cNDW4j|;x}(RsZFI70Q`VZ)U6e7=%R+w~BO>22LhCwQDUGayyCDE0aAN=)W#hm|eE>X>XTP)kwa ztK-opT)KXA>dj%g?i@sAc-Xb~_OxGN^@%pstjV$@_)>SYyO zE+z#+__sC~4_l(PU_hru!Om=pxrMQRSkSV-`_bl5_%2sJgYbUMSj|cdgs6T#GF%lP zT|jJbHJC)R zH|q;S8zvjbgTn zRf#g>PiKFUS*K@aW&&2rJWVp#XZNJW`-XJC<>~QHq7pwbTijKzFOTeS8Rrzy8%X!5@;CtN{zrCH~ zDY8Kt@9jDa(x5f$=i6oC*83@QV#WeVmt#wjJViYj`&}%nI=^E^$)cKD4D8Q8(^fQ# zq2v`+?**f3gj!*4*zK<1zCN`Od^H*|xjtN-eiw+cKuMvI8RVTY;-e;Wx9}7}S$o7b zqOJ9L9q*uieD6Nou)PKQQQ8BmC!o4fh!TCqY`4GZI4XUUfsUrHct81OsQebumz+em zfhM;@^`~Tzam66)!)Y`3CpWtgj`0VS&{V~pj+|Ozl0Z{Hs2t#KW?P!)T&PAUPbqVj zoHMy8P}u}NAzH`ME*ZyGrIh=)Zdud(TcVqw+6%SP>TSt4qij4rYf9!P^ydP*GZ+NC zxyZ|H>bRM0)zgWk`Zb^DzkIF#a=>f`05ksMNJ7=81HJ#JV?KSFuRe zXU{qeyMD6O8~f{|&nl2SgJFgEjwuwf8c|loNevsuAl+0wyG=aLYk=C#KK4k`Lmg<( zeLwxqkPGku`dZLPg*79Nfu)R98?t4lg3?8YYPLeV1wSmYq9YNd| zy-V(uH!`2+jUX!g?i+Eh$7#GHAcV*rimn&hVfLsYg&~Mbg=uER?KI7!!kdD0?Ja=b z&cC;eR2vBx4RCbo4>l_e$>_N}b-JjID~ZtZhj={X*=%vgbrQei4>Ju<9{p{;ri zL7mz@v0k|33TGv&Z9;|zFjA_IU4k43RSJ1n)fRpW)TCR=U>664-Ej9; zPS*-Aj=s(!(QRf*KpARGatk-)*8$e%e{qcel$Ue|36}9*JM)b07i@)nB)wbKwmNIv zp^-_F&ZHdxQ0OGd?o@;tV$f1oijB*V`1SkB_Df*j3gwZ%*eNjbVfoev97Er(+k|Vp zu_9O{r4C6+s(O0M=oLiS-@ma8_&IFWj2u_qFuraEEc>_VLQs~w>4i70F&p(jug+p# zbMSXzLX$g`@@lpDd zlJx_qvb@y7<=YvIG-%}0nB?29@|Xo_H+}9VRdjrIUHY7uczKbM^=^+XJ;p6g3R!@fM0Pe*cY@qm5&6ev#AI}ntW+qT~Lm+|=C zhDxg(AKn^UsIuHoO?4h)w4(qed3!&!?F8-6U-0(&mCtDvcu|w9?l4~yX`9p(k+9C+ z`j5)0x}pk{!hrQ7zY&O3`E3?e+NWxiDZFmNSlguJ+rM5eW)|<#G1weUHtB{-K5gHb z@DdBB%(9KIow(fJNh1JGzMsv7#e*GQO7U0NY%p!n!CkW$HxHZf)(Nljd<5HKSDzU5 zeh`Io9?B`X+|Ilxrqr;!KX(02EIh|P=d5?Sx3{$J;!TD7hRs7&$&kc2h4iLaw&auV zsK1KG@7fg=eJfOmqirU7$_gtQJN5r0N%SBY{^B(34=~P3Cl*94j)Z2W z3X^z1q@PzWXVtuFC{Zy(`nGm_;tptokOIiRDI%hOjw6KvOVz$Q!_#{y!i48rinwUE zq5_{)+_Y+q_*x6diNCOnz=a_{9vT8r+96&cL?c2pt9NGF_SZtcXOe?XV+;pzqekEP=$6VJAw29Zh_?4e<_LHJR&Jc|+S`1_Cl;ZOHRYVFG>BsTR z#Z@;{lov3DQ`Wv7=T`&^K#k=s?+Wu4%imQo{i78Gm2Umkw zc~B_;@f5OIUiNlZPrV@Wrz#F%S-)?L!4b_sqjgCgZ&6Ys@{x%h)Mbh2(J&8M{u0i$ z)mJZwvib5Jnj%?24=vceQEk6;yG|5rUHeA#_WJDLG)v_$QNH!^xrHxQEoH=ozux}F zxOk4VXD-V0x~b1)RbD|5bQ-0eZ)o0ZRvc*$M^$UJzFgYwHSqT`G(>=1kHD@qC*YX zWC7_P#WYhj12VRxuM&S@PR1`Y>o$VP#aIKL+H*;DYdR3<>T@CvR-iEgWl`FA2gm0% z`{qfp=I+KiAS{#=)wLa)KZM711+jRtyM9oST$9unm7!QgLa(1?RYe>;aG&8e3*YEa zE!_|gxy#kAcUp5-!ZE4%_VO`Nl|+hG{5CF+aO_e~*^a28sC$V||BsmTzdSw)B$N%q z5e;jSI~$VH@8C>QgAa-7!UV6vq7xAb(uF^j0Nsk(J2~_?oK#1L{3;q#Obd4AuYMFV z$r1fo0)3I(c>P42OCNp%s7LC5w{rz2biaJORw19ZQV?qn-d9zdg*T>kwG=S-rPtc} z+@AX@wS-c;t;ROryB;@FeeH;fY#{AzVl}<#QTeTiS}Qze4)5N07tUQjFGN>v}E4nP_yqCr<4%dlw-_IM2F{?$HffBjGdJUo8YSUILxE7t}smC6m zqU8nM#`_2*0J7TSlKrda&E|=LyLPK>;c%%A_JHTJHaeA%h3B4`i$yc4759IbT^lHl zYX&7|BmMM``1biyC&$&E4IK!co=}#zmTwN@S6F86(^}FY4LejYSA%1`1wKj z(p*f!s`4)x*M=;lc-V%A%hbHVVDRV6Aq$h2_J3=Pk_N9B)w!+Pp+@X1^WU0rRJdqs z96=vN!qe7XIt{s7xs{mPHdsAL@8}wZ|?MV8-`; zlI^iy~Lz=0Cf=Ha(~?&%hW9_`B)dAf_~!Ha><6$Z|o+aH{a{>dI~its)fl z+ngYDX5qs6TelYY-4Ffx%hseK?@_3El+z#a+CL&`07R%YJda`Vzcb_in%xNpI5%KM ziQ|99%><#OyS1HWCbeU*|A&3?rv&Yv#X)EMf3Q2a_QP5KGrL2?FOQHB=I?IjpGBhs z1DMF-B9i9+(}V&c%GO;YFMBorqqdPC0c5(z;iO_!^!xRHALoBx@$1K|2CXEadYWRD zmeGLRpBA@Z{@zO7n&JqcNayeG?};f%(U7P27mf0JB6H^Lf9HyXNc?9gnNT{XPz$D` zv`cnu&+1Yr%Hz=e*^~hLKaL0j9$yejRaMWPYbDf!b}zMCTYR0cd%8#W?-7=_Nf#W3 zcMEK}(vpwh`%goc?1qMOD+|oR7O~^oP_ak&_ci(7S0-4X)|R5gShQdxI{xLZ|N7>Q zn1rJ^j!F58`~SF$`ba-c5j$nMet^~{HDbT&VcfO?b^tWr;p!G7{?SEQM@n$^>( z(rYlywK7@mSnwi>F?hA93_0{Dr(dkQ;nb;TO`85re2nH@ZY4BsBZF5J`2DL<_8bNP zZ!Fc;*eDp@c)u8(h1I+# zdq=Rn4i`Cs!%q$}@h0b5TD8QaWknq=e}p#ZXz7-)q(!) zNY91ej~c^xZx|~eECQAD`knI@JW28`B;?QQ>l)5Ym8&^CA@-l`Qi@ZBY{4+n^gdm=q66{eHaXm%H48Qpdc1@j=2-`auQQ;j=Bmu zz>4Cyo=_I5YHx=c42$bC{xLZQsyFIsw04${L{l7Z%Dma|(ZI5+byOLtC!^t4g6ZtK z86IJX4Puv!jzLpkQ09HC%5478gE=rn!$N9TtMmSJ%&D)^tA)UA&;>(Cv8gB9W}FuS z>y`zGou~1_H+3AFS7V+ZaBkO|JYWNlZu8(D_qEVfgsaM z0*omwI+iB?u((+)>In6&aKS zPPK=&l>KsP+G&B;%j&A?*E$IY|DQ_@dqKqOEJ&pr4r!V~D zEaL>qV6vIi{e#^%-EboS`nyJvK*5}@QJwdyTS@9bf`Q!S0)Xt-oY!1Pe+l<)co>+2 zE{WN_eLscZzc6l4$tKE&1b!0e zIYn6#nJDtXe=yQN2e4^W23DOi%hzY<$%1xq=mlz!^#I7yohZ4FOb+_XLVJ=R`R)dc z{Fs=EvFQfs(%+WokYz2}`@6fyL^Pt4SryW>VsisTsiS+-S#6sOe>>v$v2PKZj&o>Z zX86&k(v7fS^b>Gk(-+d419-ZAwD*gXyjlRh z`1Yu7yvtJ5#_s-B_I0|Du%M=9((R_?m6)8|%~w9`@vk_he_()Lg)R&qx;2#8gy(I5 zis-w=vy}kZnStA8)58LJKrKIM_xoh;b}Yc z@NdKk5~CULvP`v^d8%@T<@j{|uVfCal_jk^jL9-PFXB^v21qdD=uO6?EM* zrY#_#wI}!LckAyNEAS;HGzT*!olUy3vd;PG5)u+5T57<7}eEptuofj--D~G zzh0e8%JC9>+Ml&A`ow7~?jQvZdj+O5{QbyoCD>DP=0pd7(DHg-c z!h8GTvr4|RvqMVU-DTU-Iq7TYeS5*1{QbM(Y$-b&91_!fL^6L4Aa8ef*Z4U&>R`6) zJt-OK%8l$BEH^Up`3+g00Il0;YH}CKWe15xBfPxcu0b|0u&adB*nja7&eTw#OOQsV>V^oa6c4}vkZ!b0ohCc`3k7bIZ&EbpzFA s*;=B(8DYP;3?$peKnT1YXHi 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ð} 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

      {I)F68OW! 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 literal 237706 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 diff --git a/docs/maps/images/sample_data_web_logs.png b/docs/maps/images/sample_data_web_logs.png index e4902c3e896101dea9b77a07f249dcb251fa832c..76ff9c0d16221dcbae5e63d923bebd403e1080b3 100644 GIT binary patch literal 445570 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

      v&NWykIT6Q^So9j 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%0D-^?3*DB$9o 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%0A=@lM{~ za9YeNt@Y%i?1wqjSJd;k#lmMP6*`dipn9VTXDtuV^)GxM1{Ag14a7Bac|p0f&ePbB zbS1K~&59_s4b2?I7@g@Gt!`)5K={DjUU&2L#k2SCA068-_YL>vO;vBo{nV}M7K)nc zuSWRJ8w&&$-jpvtTlri)U!aQ-+t^Uq;n_Dg_FGN_LhU59C8iEj({URa8qqCXn;hR4 zsSA+`+nRngN;Enq1}3mtvafd9z9e7IUvpz@VmNZwJC|=<=}}ml9MM&2HMBW8VO_kx z=5G(ZxP#xb{7(CwbWV0YvGL-ebKBXNox-oA0#w3K@!X(a-*O~;?G7|MIz9DYg<+r1 zVU0`k6@m-4`hL&5{@Yxstys3B@(~s<7SGj|}%91_d>Ci>vro-p>MT&>)S$-v3b0sWmb*<^;xh}*c+O3(F-h1pFBxT)Wzj`yv*U@?E z)%LCk@eaYRGwwR`qHt?xSbgbyu;tv&xb}8|x7mOc zjL7eq{p7VTG$S?<4a3LC-{2Ybw9a08iEtvdqH0oO-HaEy?a=k;mvCK;(p7|X~2etgof04Ok2 z0K_K+_W1(9Z~##Mq5%L&Fx>y96~HL}BLfZq1Oow(|B+GujQ@FJKEo&aKQTmH5CG=$ z3-vPus zCxA&PkY0Y8>yE(Rst&3$(p(1CmUMcC*7`n9_9Xw#iNJ&jy||5K8c{eRT@RFM9k6naKF2KxUS%mHZp z{{#Cc<=?P>>Gkj8c>c+ZOUd5IPRQEQ(#Xnz?|)jH=U*lLzY_nap8p2Q16_8iP__SoGO}=R{BP+0O8Q^Wf0W>ovjcwCRPUcwO@M|J70d9tHp6ehvdZcpm!y9#VYpi#5jb z0Du5MLip!z7qGJqm=wbir6czr%+#JqATxe1QDYY7v>8)U$m{QI;BeFtr2Xf90Y_kR zV;ZVp;V?v3s(dKoFHXq^FS<|&umLf*fXFXyIX|8HU6y!3qbh}EEEgZ)>AxJQxyxEh zTcwp9g`E#N*sYfBNn|q~heFXH60ZecHebFsQe^X(j~LFbf*Q5Z2ei@)gLG-F1D=Zta3Ik%+;fg$gXz!VcoDoQK4YHHbW9z z!R5Y4m%(iy*&B#U_@+Dttti3maqU+3d(pU<0<;-CwG!*mXO|i<>iDZ9iFddxw_ma_ zFETn(gDAU3Qo~ycj+-;7@wZ)fS_Ng*fp}|f<%B5jImWqj3i$Ky#p$M$vWA84;xaMkBa(qvkFcw_nkk{e(ZA^k5GI*7Sh(u0H z_T*T0W~)o62X{w-S8LNow!?7<-S3VTTJUH)cGnaTpNdP@WynNkj6YIWVca*6rx_|N zX;&3M+hQ1;Or7xPmVoJr-ID5sSGe@s?U&1So^(G&Mwv!gMJ;Ov|3%vkDZ#6vzrR(v zZo4T`frW96-jjo%orglL_Skn$9Y>}uM>I9+!#HJ)xUH5_3CP;NNG4j#fo5~xyX5Oi zH_1>?{nwP>#o?QhI^B&KjFw~zK;z?aGIT67nd%yR)}@~7E~I~ZW&Wnm9p3l;vRb{V z*-2P9b##{o9k12|L}Ea%uNzoPHee;dx
      !a$`6eJN73!UKlN^=t7@Q6-I$dnus2 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

      O-gCEb037bJEw*_ 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

      RT>VtIjQvU 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

      V&??B)kt0y!F3W@q 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 Al>h($ diff --git a/docs/maps/maps-getting-started.asciidoc b/docs/maps/maps-getting-started.asciidoc index 89d06fce60183..a85586fc43188 100644 --- a/docs/maps/maps-getting-started.asciidoc +++ b/docs/maps/maps-getting-started.asciidoc @@ -97,8 +97,6 @@ The layer is only visible when users zoom in. . Set **Data view** to **kibana_sample_data_logs**. -. Set **Scaling** to *Limits results to 10000.* - . Click **Add layer**. . In **Layer settings**, set: @@ -109,6 +107,8 @@ The layer is only visible when users zoom in. . Add a tooltip field and select **agent**, **bytes**, **clientip**, **host**, **machine.os**, **request**, **response**, and **timestamp**. +. In **Scaling**, set *Limits results to 10,000.* + . In **Layer style**, set **Fill color** to **#2200FF**. . Click **Save & close**. From dc351ce4d9842e7f3887bb71a32d9604f6d0d62f Mon Sep 17 00:00:00 2001 From: Giorgos Bamparopoulos Date: Tue, 1 Mar 2022 15:36:26 +0000 Subject: [PATCH 082/102] Add config file as an argument as it is now required when running the command (#126577) --- x-pack/plugins/apm/dev_docs/vscode_setup.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/apm/dev_docs/vscode_setup.md b/x-pack/plugins/apm/dev_docs/vscode_setup.md index c7adad4fd0942..9be3a53b52176 100644 --- a/x-pack/plugins/apm/dev_docs/vscode_setup.md +++ b/x-pack/plugins/apm/dev_docs/vscode_setup.md @@ -31,7 +31,10 @@ To make the [VSCode debugger](https://vscode.readthedocs.io/en/latest/editor/deb "type": "node", "name": "vscode-jest-tests", "request": "launch", - "args": ["--runInBand"], + "args": [ + "--runInBand", + "--config=${workspaceFolder}/jest.config.js" + ], "cwd": "${workspaceFolder}", "console": "integratedTerminal", "internalConsoleOptions": "neverOpen", From e72dafc03814c0ca5a7f1c2b0d4837975f477085 Mon Sep 17 00:00:00 2001 From: Lisa Cawley Date: Tue, 1 Mar 2022 07:43:46 -0800 Subject: [PATCH 083/102] [DOCS] Add anomaly layer in Maps (#126397) --- docs/maps/vector-layer.asciidoc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/maps/vector-layer.asciidoc b/docs/maps/vector-layer.asciidoc index f70e4d59796cc..cf6dd5334b07e 100644 --- a/docs/maps/vector-layer.asciidoc +++ b/docs/maps/vector-layer.asciidoc @@ -33,6 +33,10 @@ When a tile exceeds `index.max_result_window`, results exceeding `index.max_resu *EMS Boundaries*:: Administrative boundaries from https://www.elastic.co/elastic-maps-service[Elastic Maps Service]. +*ML Anomalies*:: Points and lines associated with anomalies. The {anomaly-job} +must use a `lat_long` function. Go to +{ml-docs}/geographic-anomalies.html[Detecting anomalous locations in geographic data] for an example. + *Point to point*:: Aggregated data paths between the source and destination. The index must contain at least 2 fields mapped as {ref}/geo-point.html[geo_point], source and destination. From 4e3d2f62fd7ef9488e6b4c97980aa014233f979b Mon Sep 17 00:00:00 2001 From: "Joey F. Poon" Date: Tue, 1 Mar 2022 09:46:13 -0600 Subject: [PATCH 084/102] [Security Solution] add blocklist list (#126390) --- .../src/common/exception_list/index.ts | 2 + .../src/common/lists/index.test.ts | 6 +- .../src/index.ts | 4 + .../exceptions_list_item_generator.ts | 67 ++++++++++ .../management/pages/blocklist/constants.ts | 26 ++++ .../services/blocklists_api_client.ts | 26 ++++ .../pages/blocklist/services/index.ts | 8 ++ .../pages/blocklist/view/blocklist.tsx | 10 +- .../scripts/endpoint/blocklists/index.ts | 124 ++++++++++++++++++ .../scripts/endpoint/load_blocklists.js | 11 ++ .../services/endpoint_artifacts.ts | 10 ++ 11 files changed, 285 insertions(+), 9 deletions(-) create mode 100644 x-pack/plugins/security_solution/public/management/pages/blocklist/constants.ts create mode 100644 x-pack/plugins/security_solution/public/management/pages/blocklist/services/blocklists_api_client.ts create mode 100644 x-pack/plugins/security_solution/public/management/pages/blocklist/services/index.ts create mode 100644 x-pack/plugins/security_solution/scripts/endpoint/blocklists/index.ts create mode 100644 x-pack/plugins/security_solution/scripts/endpoint/load_blocklists.js diff --git a/packages/kbn-securitysolution-io-ts-list-types/src/common/exception_list/index.ts b/packages/kbn-securitysolution-io-ts-list-types/src/common/exception_list/index.ts index 54c9ecfe40b92..2f59e868c354f 100644 --- a/packages/kbn-securitysolution-io-ts-list-types/src/common/exception_list/index.ts +++ b/packages/kbn-securitysolution-io-ts-list-types/src/common/exception_list/index.ts @@ -14,6 +14,7 @@ export const exceptionListType = t.keyof({ endpoint_trusted_apps: null, endpoint_events: null, endpoint_host_isolation_exceptions: null, + endpoint_blocklists: null, }); export const exceptionListTypeOrUndefined = t.union([exceptionListType, t.undefined]); export type ExceptionListType = t.TypeOf; @@ -24,4 +25,5 @@ export enum ExceptionListTypeEnum { ENDPOINT_TRUSTED_APPS = 'endpoint', ENDPOINT_EVENTS = 'endpoint_events', ENDPOINT_HOST_ISOLATION_EXCEPTIONS = 'endpoint_host_isolation_exceptions', + ENDPOINT_BLOCKLISTS = 'endpoint_blocklists', } diff --git a/packages/kbn-securitysolution-io-ts-list-types/src/common/lists/index.test.ts b/packages/kbn-securitysolution-io-ts-list-types/src/common/lists/index.test.ts index 9bcb11917f7dc..c8145307153f4 100644 --- a/packages/kbn-securitysolution-io-ts-list-types/src/common/lists/index.test.ts +++ b/packages/kbn-securitysolution-io-ts-list-types/src/common/lists/index.test.ts @@ -86,7 +86,7 @@ describe('Lists', () => { const message = pipe(decoded, foldLeftRight); expect(getPaths(left(message.errors))).toEqual([ - 'Invalid value "1" supplied to "Array<{| id: NonEmptyString, list_id: NonEmptyString, type: "detection" | "endpoint" | "endpoint_trusted_apps" | "endpoint_events" | "endpoint_host_isolation_exceptions", namespace_type: "agnostic" | "single" |}>"', + 'Invalid value "1" supplied to "Array<{| id: NonEmptyString, list_id: NonEmptyString, type: "detection" | "endpoint" | "endpoint_trusted_apps" | "endpoint_events" | "endpoint_host_isolation_exceptions" | "endpoint_blocklists", namespace_type: "agnostic" | "single" |}>"', ]); expect(message.schema).toEqual({}); }); @@ -117,8 +117,8 @@ describe('Lists', () => { const message = pipe(decoded, foldLeftRight); expect(getPaths(left(message.errors))).toEqual([ - 'Invalid value "1" supplied to "(Array<{| id: NonEmptyString, list_id: NonEmptyString, type: "detection" | "endpoint" | "endpoint_trusted_apps" | "endpoint_events" | "endpoint_host_isolation_exceptions", namespace_type: "agnostic" | "single" |}> | undefined)"', - 'Invalid value "[1]" supplied to "(Array<{| id: NonEmptyString, list_id: NonEmptyString, type: "detection" | "endpoint" | "endpoint_trusted_apps" | "endpoint_events" | "endpoint_host_isolation_exceptions", namespace_type: "agnostic" | "single" |}> | undefined)"', + 'Invalid value "1" supplied to "(Array<{| id: NonEmptyString, list_id: NonEmptyString, type: "detection" | "endpoint" | "endpoint_trusted_apps" | "endpoint_events" | "endpoint_host_isolation_exceptions" | "endpoint_blocklists", namespace_type: "agnostic" | "single" |}> | undefined)"', + 'Invalid value "[1]" supplied to "(Array<{| id: NonEmptyString, list_id: NonEmptyString, type: "detection" | "endpoint" | "endpoint_trusted_apps" | "endpoint_events" | "endpoint_host_isolation_exceptions" | "endpoint_blocklists", namespace_type: "agnostic" | "single" |}> | undefined)"', ]); expect(message.schema).toEqual({}); }); diff --git a/packages/kbn-securitysolution-list-constants/src/index.ts b/packages/kbn-securitysolution-list-constants/src/index.ts index f0e09ff7bb461..43fe3ac47f8df 100644 --- a/packages/kbn-securitysolution-list-constants/src/index.ts +++ b/packages/kbn-securitysolution-list-constants/src/index.ts @@ -76,3 +76,7 @@ export const ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_NAME = 'Endpoint Security Host isolation exceptions List'; export const ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_DESCRIPTION = 'Endpoint Security Host isolation exceptions List'; + +export const ENDPOINT_BLOCKLISTS_LIST_ID = 'endpoint_blocklists'; +export const ENDPOINT_BLOCKLISTS_LIST_NAME = 'Endpoint Security Blocklists List'; +export const ENDPOINT_BLOCKLISTS_LIST_DESCRIPTION = 'Endpoint Security Blocklists List'; diff --git a/x-pack/plugins/security_solution/common/endpoint/data_generators/exceptions_list_item_generator.ts b/x-pack/plugins/security_solution/common/endpoint/data_generators/exceptions_list_item_generator.ts index 90bd928cbd1fe..5789db692eb45 100644 --- a/x-pack/plugins/security_solution/common/endpoint/data_generators/exceptions_list_item_generator.ts +++ b/x-pack/plugins/security_solution/common/endpoint/data_generators/exceptions_list_item_generator.ts @@ -14,6 +14,7 @@ import { ENDPOINT_EVENT_FILTERS_LIST_ID, ENDPOINT_TRUSTED_APPS_LIST_ID, ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_ID, + ENDPOINT_BLOCKLISTS_LIST_ID, } from '@kbn/securitysolution-list-constants'; import { BaseDataGenerator } from './base_data_generator'; import { ConditionEntryField } from '../types'; @@ -250,4 +251,70 @@ export class ExceptionsListItemGenerator extends BaseDataGenerator = {}): ExceptionListItemSchema { + return this.generate({ + name: `Blocklist ${this.randomString(5)}`, + list_id: ENDPOINT_BLOCKLISTS_LIST_ID, + item_id: `generator_endpoint_blocklist_${this.randomUUID()}`, + os_types: ['windows'], + entries: [ + this.randomChoice([ + { + field: 'process.executable.caseless', + value: ['/some/path', 'some/other/path', 'yet/another/path'], + type: 'match_any', + operator: 'included', + }, + { + field: 'process.hash.sha256', + value: [ + 'a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3', + '2C26B46B68FFC68FF99B453C1D30413413422D706483BFA0F98A5E886266E7AE', + 'FCDE2B2EDBA56BF408601FB721FE9B5C338D10EE429EA04FAE5511B68FBF8FB9', + ], + type: 'match_any', + operator: 'included', + }, + { + field: 'process.Ext.code_signature', + entries: [ + { + field: 'trusted', + value: 'true', + type: 'match', + operator: 'included', + }, + { + field: 'subject_name', + value: ['notsus.exe', 'verynotsus.exe', 'superlegit.exe'], + type: 'match_any', + operator: 'included', + }, + ], + type: 'nested', + }, + ]), + ], + ...overrides, + }); + } + + generateBlocklistForCreate( + overrides: Partial = {} + ): CreateExceptionListItemSchemaWithNonNullProps { + return { + ...exceptionItemToCreateExceptionItem(this.generateBlocklist()), + ...overrides, + }; + } + + generateBlocklistForUpdate( + overrides: Partial = {} + ): UpdateExceptionListItemSchemaWithNonNullProps { + return { + ...exceptionItemToUpdateExceptionItem(this.generateBlocklist()), + ...overrides, + }; + } } diff --git a/x-pack/plugins/security_solution/public/management/pages/blocklist/constants.ts b/x-pack/plugins/security_solution/public/management/pages/blocklist/constants.ts new file mode 100644 index 0000000000000..3fb68e4171597 --- /dev/null +++ b/x-pack/plugins/security_solution/public/management/pages/blocklist/constants.ts @@ -0,0 +1,26 @@ +/* + * 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 { + ExceptionListType, + ExceptionListTypeEnum, + CreateExceptionListSchema, +} from '@kbn/securitysolution-io-ts-list-types'; +import { + ENDPOINT_BLOCKLISTS_LIST_DESCRIPTION, + ENDPOINT_BLOCKLISTS_LIST_ID, + ENDPOINT_BLOCKLISTS_LIST_NAME, +} from '@kbn/securitysolution-list-constants'; + +export const BLOCKLISTS_LIST_TYPE: ExceptionListType = ExceptionListTypeEnum.ENDPOINT_BLOCKLISTS; + +export const BLOCKLISTS_LIST_DEFINITION: CreateExceptionListSchema = { + name: ENDPOINT_BLOCKLISTS_LIST_NAME, + namespace_type: 'agnostic', + description: ENDPOINT_BLOCKLISTS_LIST_DESCRIPTION, + list_id: ENDPOINT_BLOCKLISTS_LIST_ID, + type: BLOCKLISTS_LIST_TYPE, +}; diff --git a/x-pack/plugins/security_solution/public/management/pages/blocklist/services/blocklists_api_client.ts b/x-pack/plugins/security_solution/public/management/pages/blocklist/services/blocklists_api_client.ts new file mode 100644 index 0000000000000..fa0451d9363ad --- /dev/null +++ b/x-pack/plugins/security_solution/public/management/pages/blocklist/services/blocklists_api_client.ts @@ -0,0 +1,26 @@ +/* + * 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 { ENDPOINT_BLOCKLISTS_LIST_ID } from '@kbn/securitysolution-list-constants'; +import { HttpStart } from 'kibana/public'; +import { ExceptionsListApiClient } from '../../../services/exceptions_list/exceptions_list_api_client'; +import { BLOCKLISTS_LIST_DEFINITION } from '../constants'; + +/** + * Blocklist exceptions Api client class using ExceptionsListApiClient as base class + * It follow the Singleton pattern. + * Please, use the getInstance method instead of creating a new instance when using this implementation. + */ +export class BlocklistsApiClient extends ExceptionsListApiClient { + constructor(http: HttpStart) { + super(http, ENDPOINT_BLOCKLISTS_LIST_ID, BLOCKLISTS_LIST_DEFINITION); + } + + public static getInstance(http: HttpStart): ExceptionsListApiClient { + return super.getInstance(http, ENDPOINT_BLOCKLISTS_LIST_ID, BLOCKLISTS_LIST_DEFINITION); + } +} diff --git a/x-pack/plugins/security_solution/public/management/pages/blocklist/services/index.ts b/x-pack/plugins/security_solution/public/management/pages/blocklist/services/index.ts new file mode 100644 index 0000000000000..002093007329d --- /dev/null +++ b/x-pack/plugins/security_solution/public/management/pages/blocklist/services/index.ts @@ -0,0 +1,8 @@ +/* + * 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. + */ + +export * from './blocklists_api_client'; diff --git a/x-pack/plugins/security_solution/public/management/pages/blocklist/view/blocklist.tsx b/x-pack/plugins/security_solution/public/management/pages/blocklist/view/blocklist.tsx index a48d6c5bd8377..8d98b401102f1 100644 --- a/x-pack/plugins/security_solution/public/management/pages/blocklist/view/blocklist.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/blocklist/view/blocklist.tsx @@ -9,7 +9,7 @@ import React, { memo } from 'react'; import { i18n } from '@kbn/i18n'; import { useHttp } from '../../../../common/lib/kibana'; import { ArtifactListPage, ArtifactListPageProps } from '../../../components/artifact_list_page'; -import { HostIsolationExceptionsApiClient } from '../../host_isolation_exceptions/host_isolation_exceptions_api_client'; +import { BlocklistsApiClient } from '../services'; // FIXME:PT delete this when real component is implemented const TempDevFormComponent: ArtifactListPageProps['ArtifactFormComponent'] = (props) => { @@ -39,7 +39,7 @@ const BLOCKLIST_PAGE_LABELS: ArtifactListPageProps['labels'] = { defaultMessage: 'Blocklist', }), pageAboutInfo: i18n.translate('xpack.securitySolution.blocklist.pageAboutInfo', { - defaultMessage: '(DEV: temporarily using isolation exception api)', // FIXME: need wording from PM + defaultMessage: 'Add a blocklist to block applications or files from running.', }), pageAddButtonTitle: i18n.translate('xpack.securitySolution.blocklist.pageAddButtonTitle', { defaultMessage: 'Add blocklist entry', @@ -118,13 +118,11 @@ const BLOCKLIST_PAGE_LABELS: ArtifactListPageProps['labels'] = { export const Blocklist = memo(() => { const http = useHttp(); - // FIXME: Implement Blocklist API client and define list - // for now, just using Event Filters - const eventFiltersApiClient = HostIsolationExceptionsApiClient.getInstance(http); + const blocklistsApiClient = BlocklistsApiClient.getInstance(http); return ( { + run( + async (options) => { + try { + await createBlocklists(options); + options.log.success(`${options.flags.count} endpoint blocklists created`); + } catch (e) { + options.log.error(e); + throw createFailError(e.message); + } + }, + { + description: 'Load Endpoint Blocklists', + flags: { + string: ['kibana'], + default: { + count: 10, + kibana: 'http://elastic:changeme@localhost:5601', + }, + help: ` + --count Number of blocklists to create. Default: 10 + --kibana The URL to kibana including credentials. Default: http://elastic:changeme@localhost:5601 + `, + }, + } + ); +}; + +class BlocklistDataLoaderError extends Error { + constructor(message: string, public readonly meta: unknown) { + super(message); + } +} + +const handleThrowAxiosHttpError = (err: AxiosError): never => { + let message = err.message; + + if (err.response) { + message = `[${err.response.status}] ${err.response.data.message ?? err.message} [ ${String( + err.response.config.method + ).toUpperCase()} ${err.response.config.url} ]`; + } + throw new BlocklistDataLoaderError(message, err.toJSON()); +}; + +const createBlocklists: RunFn = async ({ flags, log }) => { + const eventGenerator = new ExceptionsListItemGenerator(); + const kbn = new KbnClient({ log, url: flags.kibana as string }); + + await ensureCreateEndpointBlocklistsList(kbn); + + const randomPolicyId = await randomPolicyIdGenerator(kbn, log); + + await pMap( + Array.from({ length: flags.count as unknown as number }), + () => { + const body = eventGenerator.generateBlocklistForCreate(); + + if (isArtifactByPolicy(body)) { + const nmExceptions = Math.floor(Math.random() * 3) || 1; + body.tags = Array.from({ length: nmExceptions }, () => { + return `policy:${randomPolicyId()}`; + }); + } + return kbn + .request({ + method: 'POST', + path: EXCEPTION_LIST_ITEM_URL, + body, + }) + .catch((e) => handleThrowAxiosHttpError(e)); + }, + { concurrency: 10 } + ); +}; + +const ensureCreateEndpointBlocklistsList = async (kbn: KbnClient) => { + const newListDefinition: CreateExceptionListSchema = { + description: ENDPOINT_BLOCKLISTS_LIST_DESCRIPTION, + list_id: ENDPOINT_BLOCKLISTS_LIST_ID, + meta: undefined, + name: ENDPOINT_BLOCKLISTS_LIST_NAME, + os_types: [], + tags: [], + type: 'endpoint', + namespace_type: 'agnostic', + }; + + await kbn + .request({ + method: 'POST', + path: EXCEPTION_LIST_URL, + body: newListDefinition, + }) + .catch((e) => { + // Ignore if list was already created + if (e.response.status !== 409) { + handleThrowAxiosHttpError(e); + } + }); +}; diff --git a/x-pack/plugins/security_solution/scripts/endpoint/load_blocklists.js b/x-pack/plugins/security_solution/scripts/endpoint/load_blocklists.js new file mode 100644 index 0000000000000..46777ae8ccf7f --- /dev/null +++ b/x-pack/plugins/security_solution/scripts/endpoint/load_blocklists.js @@ -0,0 +1,11 @@ +#!/usr/bin/env 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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +require('../../../../../src/setup_node_env'); +require('./blocklists').cli(); diff --git a/x-pack/test/security_solution_endpoint/services/endpoint_artifacts.ts b/x-pack/test/security_solution_endpoint/services/endpoint_artifacts.ts index f36c59722de77..f304e110df266 100644 --- a/x-pack/test/security_solution_endpoint/services/endpoint_artifacts.ts +++ b/x-pack/test/security_solution_endpoint/services/endpoint_artifacts.ts @@ -18,6 +18,7 @@ import { TRUSTED_APPS_EXCEPTION_LIST_DEFINITION } from '../../../plugins/securit import { EndpointError } from '../../../plugins/security_solution/common/endpoint/errors'; import { EVENT_FILTER_LIST_DEFINITION } from '../../../plugins/security_solution/public/management/pages/event_filters/constants'; import { HOST_ISOLATION_EXCEPTIONS_LIST_DEFINITION } from '../../../plugins/security_solution/public/management/pages/host_isolation_exceptions/constants'; +import { BLOCKLISTS_LIST_DEFINITION } from '../../../plugins/security_solution/public/management/pages/blocklist/constants'; export interface ArtifactTestData { artifact: ExceptionListItemSchema; @@ -108,4 +109,13 @@ export class EndpointArtifactsTestResources extends FtrService { return this.createExceptionItem(artifact); } + + async createBlocklist( + overrides: Partial = {} + ): Promise { + await this.ensureListExists(BLOCKLISTS_LIST_DEFINITION); + const blocklist = this.exceptionsGenerator.generateBlocklistForCreate(overrides); + + return this.createExceptionItem(blocklist); + } } From 49ad5846ae1bf4352baaad6411934db2db02f633 Mon Sep 17 00:00:00 2001 From: Tyler Smalley Date: Tue, 1 Mar 2022 08:06:39 -0800 Subject: [PATCH 085/102] [@kbn/es] Disable ES disk usage threshold (#123674) --- packages/kbn-es/src/cluster.js | 1 + packages/kbn-es/src/integration_tests/cluster.test.js | 2 ++ 2 files changed, 3 insertions(+) diff --git a/packages/kbn-es/src/cluster.js b/packages/kbn-es/src/cluster.js index 4ad7329752347..22ff9ae3c0cde 100644 --- a/packages/kbn-es/src/cluster.js +++ b/packages/kbn-es/src/cluster.js @@ -261,6 +261,7 @@ exports.Cluster = class Cluster { 'action.destructive_requires_name=true', 'ingest.geoip.downloader.enabled=false', 'search.check_ccs_compatibility=true', + 'cluster.routing.allocation.disk.threshold_enabled=false', ].concat(options.esArgs || []); // Add to esArgs if ssl is enabled diff --git a/packages/kbn-es/src/integration_tests/cluster.test.js b/packages/kbn-es/src/integration_tests/cluster.test.js index 5633bd32b9ab2..271942158dc94 100644 --- a/packages/kbn-es/src/integration_tests/cluster.test.js +++ b/packages/kbn-es/src/integration_tests/cluster.test.js @@ -310,6 +310,7 @@ describe('#start(installPath)', () => { "action.destructive_requires_name=true", "ingest.geoip.downloader.enabled=false", "search.check_ccs_compatibility=true", + "cluster.routing.allocation.disk.threshold_enabled=false", ], undefined, Object { @@ -389,6 +390,7 @@ describe('#run()', () => { "action.destructive_requires_name=true", "ingest.geoip.downloader.enabled=false", "search.check_ccs_compatibility=true", + "cluster.routing.allocation.disk.threshold_enabled=false", ], undefined, Object { From e5591543d093072e3d9e67b01620771e185b99d0 Mon Sep 17 00:00:00 2001 From: Garrett Spong Date: Tue, 1 Mar 2022 09:48:48 -0700 Subject: [PATCH 086/102] [Security Solution][Detections] Replaces remaining occurrences of `activated` with `enabled` (#126554) ## Summary Resolves https://github.com/elastic/kibana/issues/125465, and updates any remaining occurrences of `activate`/`deactivate` with `enable`/`disable` throughout the Security Solution code when relating to Rules.

      --- .../detection_alerts/alerts_details.spec.ts | 4 +-- .../data_sources/create_runtime_field.spec.ts | 4 +-- .../detection_alerts/acknowledged.spec.ts | 4 +-- .../detection_alerts/alerts_details.spec.ts | 4 +-- .../detection_alerts/attach_to_case.spec.ts | 4 +-- .../building_block_alerts.spec.ts | 4 +-- .../detection_alerts/closing.spec.ts | 4 +-- .../investigate_in_timeline.spec.ts | 4 +-- .../detection_alerts/opening.spec.ts | 4 +-- .../detection_rules/custom_query_rule.spec.ts | 20 ++++++------- .../event_correlation_rule.spec.ts | 10 +++---- .../indicator_match_rule.spec.ts | 6 ++-- .../integration/detection_rules/links.spec.ts | 4 +-- .../machine_learning_rule.spec.ts | 6 ++-- .../detection_rules/override.spec.ts | 6 ++-- .../detection_rules/prebuilt_rules.spec.ts | 16 +++++------ .../detection_rules/threshold_rule.spec.ts | 12 ++++---- .../integration/exceptions/from_alert.spec.ts | 4 +-- .../integration/exceptions/from_rule.spec.ts | 4 +-- .../integration/users/user_details.spec.ts | 4 +-- .../cypress/screens/alerts_detection_rules.ts | 4 +-- .../cypress/screens/create_new_rule.ts | 2 +- .../cypress/tasks/alerts_detection_rules.ts | 14 +++++----- .../cypress/tasks/api_calls/rules.ts | 2 +- .../cypress/tasks/create_new_rule.ts | 8 +++--- .../cypress/tasks/rule_details.ts | 2 +- .../cypress/tasks/sourcerer.ts | 4 +-- .../rules/ml_job_select/help_text.tsx | 4 +-- .../rules/pre_packaged_rules/translations.ts | 2 +- .../rules/step_rule_actions/index.tsx | 6 ++-- .../rules/step_rule_actions/translations.tsx | 12 ++++---- .../rules/step_schedule_rule/translations.tsx | 22 --------------- .../rules/use_find_rules_query.ts | 2 +- .../detection_engine/rules/all/actions.ts | 4 +-- .../all/bulk_actions/use_bulk_actions.tsx | 28 +++++++++---------- .../detection_engine/rules/details/index.tsx | 2 +- .../rules/details/translations.ts | 6 ++-- .../detection_engine/rules/translations.ts | 8 +++--- .../legacy_saved_object_references/README.md | 2 +- .../detection_engine/signals/utils.test.ts | 8 +++--- .../lib/detection_engine/signals/utils.ts | 2 +- .../translations/translations/ja-JP.json | 7 ----- .../translations/translations/zh-CN.json | 7 ----- .../security_and_spaces/tests/create_rules.ts | 2 +- 44 files changed, 126 insertions(+), 162 deletions(-) delete mode 100644 x-pack/plugins/security_solution/public/detections/components/rules/step_schedule_rule/translations.tsx diff --git a/x-pack/plugins/security_solution/cypress/ccs_integration/detection_alerts/alerts_details.spec.ts b/x-pack/plugins/security_solution/cypress/ccs_integration/detection_alerts/alerts_details.spec.ts index 7e07693cb078a..3fb239198a65f 100644 --- a/x-pack/plugins/security_solution/cypress/ccs_integration/detection_alerts/alerts_details.spec.ts +++ b/x-pack/plugins/security_solution/cypress/ccs_integration/detection_alerts/alerts_details.spec.ts @@ -9,7 +9,7 @@ import { JSON_TEXT } from '../../screens/alerts_details'; import { expandFirstAlert, waitForAlertsPanelToBeLoaded } from '../../tasks/alerts'; import { openJsonView } from '../../tasks/alerts_details'; -import { createCustomRuleActivated } from '../../tasks/api_calls/rules'; +import { createCustomRuleEnabled } from '../../tasks/api_calls/rules'; import { cleanKibana } from '../../tasks/common'; import { esArchiverCCSLoad } from '../../tasks/es_archiver'; import { loginAndWaitForPageWithoutDateRange } from '../../tasks/login'; @@ -23,7 +23,7 @@ describe('Alert details with unmapped fields', () => { cleanKibana(); esArchiverCCSLoad('unmapped_fields'); loginAndWaitForPageWithoutDateRange(ALERTS_URL); - createCustomRuleActivated(getUnmappedCCSRule()); + createCustomRuleEnabled(getUnmappedCCSRule()); loginAndWaitForPageWithoutDateRange(ALERTS_URL); waitForAlertsPanelToBeLoaded(); expandFirstAlert(); diff --git a/x-pack/plugins/security_solution/cypress/integration/data_sources/create_runtime_field.spec.ts b/x-pack/plugins/security_solution/cypress/integration/data_sources/create_runtime_field.spec.ts index 1b9c63dd2dbcb..152147b1844be 100644 --- a/x-pack/plugins/security_solution/cypress/integration/data_sources/create_runtime_field.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/data_sources/create_runtime_field.spec.ts @@ -13,7 +13,7 @@ import { openTimelineFieldsBrowser, populateTimeline } from '../../tasks/timelin import { HOSTS_URL, ALERTS_URL } from '../../urls/navigation'; -import { createCustomRuleActivated } from '../../tasks/api_calls/rules'; +import { createCustomRuleEnabled } from '../../tasks/api_calls/rules'; import { getNewRule } from '../../objects/rule'; import { refreshPage } from '../../tasks/security_header'; @@ -29,7 +29,7 @@ describe('Create DataView runtime field', () => { it.skip('adds field to alert table', () => { const fieldName = 'field.name.alert.page'; loginAndWaitForPage(ALERTS_URL); - createCustomRuleActivated(getNewRule()); + createCustomRuleEnabled(getNewRule()); refreshPage(); waitForAlertsToPopulate(500); openEventsViewerFieldsBrowser(); diff --git a/x-pack/plugins/security_solution/cypress/integration/detection_alerts/acknowledged.spec.ts b/x-pack/plugins/security_solution/cypress/integration/detection_alerts/acknowledged.spec.ts index 32ce0bebda225..06ff1938d5d4f 100644 --- a/x-pack/plugins/security_solution/cypress/integration/detection_alerts/acknowledged.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/detection_alerts/acknowledged.spec.ts @@ -18,7 +18,7 @@ import { markAcknowledgedFirstAlert, goToAcknowledgedAlerts, } from '../../tasks/alerts'; -import { createCustomRuleActivated } from '../../tasks/api_calls/rules'; +import { createCustomRuleEnabled } from '../../tasks/api_calls/rules'; import { cleanKibana } from '../../tasks/common'; import { waitForAlertsToPopulate } from '../../tasks/create_new_rule'; import { loginAndWaitForPage } from '../../tasks/login'; @@ -30,7 +30,7 @@ describe.skip('Marking alerts as acknowledged', () => { beforeEach(() => { cleanKibana(); loginAndWaitForPage(ALERTS_URL); - createCustomRuleActivated(getNewRule()); + createCustomRuleEnabled(getNewRule()); refreshPage(); waitForAlertsToPopulate(500); }); diff --git a/x-pack/plugins/security_solution/cypress/integration/detection_alerts/alerts_details.spec.ts b/x-pack/plugins/security_solution/cypress/integration/detection_alerts/alerts_details.spec.ts index 2d5a676646688..6a8bf9cd42ea9 100644 --- a/x-pack/plugins/security_solution/cypress/integration/detection_alerts/alerts_details.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/detection_alerts/alerts_details.spec.ts @@ -15,7 +15,7 @@ import { import { expandFirstAlert } from '../../tasks/alerts'; import { openJsonView, openTable } from '../../tasks/alerts_details'; -import { createCustomRuleActivated } from '../../tasks/api_calls/rules'; +import { createCustomRuleEnabled } from '../../tasks/api_calls/rules'; import { cleanKibana } from '../../tasks/common'; import { waitForAlertsToPopulate } from '../../tasks/create_new_rule'; import { esArchiverLoad } from '../../tasks/es_archiver'; @@ -31,7 +31,7 @@ describe.skip('Alert details with unmapped fields', () => { cleanKibana(); esArchiverLoad('unmapped_fields'); loginAndWaitForPageWithoutDateRange(ALERTS_URL); - createCustomRuleActivated(getUnmappedRule()); + createCustomRuleEnabled(getUnmappedRule()); refreshPage(); waitForAlertsToPopulate(); expandFirstAlert(); diff --git a/x-pack/plugins/security_solution/cypress/integration/detection_alerts/attach_to_case.spec.ts b/x-pack/plugins/security_solution/cypress/integration/detection_alerts/attach_to_case.spec.ts index 436ef0975ef02..03cac07ac8b72 100644 --- a/x-pack/plugins/security_solution/cypress/integration/detection_alerts/attach_to_case.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/detection_alerts/attach_to_case.spec.ts @@ -9,7 +9,7 @@ import { getNewRule } from '../../objects/rule'; import { ROLES } from '../../../common/test'; import { expandFirstAlertActions } from '../../tasks/alerts'; -import { createCustomRuleActivated } from '../../tasks/api_calls/rules'; +import { createCustomRuleEnabled } from '../../tasks/api_calls/rules'; import { cleanKibana } from '../../tasks/common'; import { waitForAlertsToPopulate } from '../../tasks/create_new_rule'; import { login, loginAndWaitForPage, waitForPageWithoutDateRange } from '../../tasks/login'; @@ -28,7 +28,7 @@ describe.skip('Alerts timeline', () => { // First we login as a privileged user to create alerts. cleanKibana(); loginAndWaitForPage(ALERTS_URL, ROLES.platform_engineer); - createCustomRuleActivated(getNewRule()); + createCustomRuleEnabled(getNewRule()); refreshPage(); waitForAlertsToPopulate(500); diff --git a/x-pack/plugins/security_solution/cypress/integration/detection_alerts/building_block_alerts.spec.ts b/x-pack/plugins/security_solution/cypress/integration/detection_alerts/building_block_alerts.spec.ts index 288d16dc22fb6..d9cf959219120 100644 --- a/x-pack/plugins/security_solution/cypress/integration/detection_alerts/building_block_alerts.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/detection_alerts/building_block_alerts.spec.ts @@ -9,7 +9,7 @@ import { getBuildingBlockRule } from '../../objects/rule'; import { OVERVIEW_ALERTS_HISTOGRAM } from '../../screens/overview'; import { OVERVIEW } from '../../screens/security_header'; import { goToRuleDetails } from '../../tasks/alerts_detection_rules'; -import { createCustomRuleActivated } from '../../tasks/api_calls/rules'; +import { createCustomRuleEnabled } from '../../tasks/api_calls/rules'; import { cleanKibana } from '../../tasks/common'; import { waitForAlertsToPopulate, waitForTheRuleToBeExecuted } from '../../tasks/create_new_rule'; import { loginAndWaitForPage, loginAndWaitForPageWithoutDateRange } from '../../tasks/login'; @@ -25,7 +25,7 @@ describe.skip('Alerts generated by building block rules', () => { }); it('Alerts should be visible on the Rule Detail page and not visible on the Overview page', () => { - createCustomRuleActivated(getBuildingBlockRule()); + createCustomRuleEnabled(getBuildingBlockRule()); loginAndWaitForPage(DETECTIONS_RULE_MANAGEMENT_URL); goToRuleDetails(); waitForTheRuleToBeExecuted(); diff --git a/x-pack/plugins/security_solution/cypress/integration/detection_alerts/closing.spec.ts b/x-pack/plugins/security_solution/cypress/integration/detection_alerts/closing.spec.ts index af2772b98a790..a46502687d3ad 100644 --- a/x-pack/plugins/security_solution/cypress/integration/detection_alerts/closing.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/detection_alerts/closing.spec.ts @@ -23,7 +23,7 @@ import { selectNumberOfAlerts, waitForAlerts, } from '../../tasks/alerts'; -import { createCustomRuleActivated, deleteCustomRule } from '../../tasks/api_calls/rules'; +import { createCustomRuleEnabled, deleteCustomRule } from '../../tasks/api_calls/rules'; import { cleanKibana } from '../../tasks/common'; import { waitForAlertsToPopulate } from '../../tasks/create_new_rule'; import { loginAndWaitForPage } from '../../tasks/login'; @@ -35,7 +35,7 @@ describe.skip('Closing alerts', () => { beforeEach(() => { cleanKibana(); loginAndWaitForPage(ALERTS_URL); - createCustomRuleActivated(getNewRule(), '1', '100m', 100); + createCustomRuleEnabled(getNewRule(), '1', '100m', 100); refreshPage(); waitForAlertsToPopulate(100); deleteCustomRule(); diff --git a/x-pack/plugins/security_solution/cypress/integration/detection_alerts/investigate_in_timeline.spec.ts b/x-pack/plugins/security_solution/cypress/integration/detection_alerts/investigate_in_timeline.spec.ts index e8873de412f4c..7ea11017dd6e8 100644 --- a/x-pack/plugins/security_solution/cypress/integration/detection_alerts/investigate_in_timeline.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/detection_alerts/investigate_in_timeline.spec.ts @@ -9,7 +9,7 @@ import { getNewRule } from '../../objects/rule'; import { PROVIDER_BADGE } from '../../screens/timeline'; import { investigateFirstAlertInTimeline } from '../../tasks/alerts'; -import { createCustomRuleActivated } from '../../tasks/api_calls/rules'; +import { createCustomRuleEnabled } from '../../tasks/api_calls/rules'; import { cleanKibana } from '../../tasks/common'; import { waitForAlertsToPopulate } from '../../tasks/create_new_rule'; import { loginAndWaitForPage } from '../../tasks/login'; @@ -21,7 +21,7 @@ describe.skip('Alerts timeline', () => { beforeEach(() => { cleanKibana(); loginAndWaitForPage(ALERTS_URL); - createCustomRuleActivated(getNewRule()); + createCustomRuleEnabled(getNewRule()); refreshPage(); waitForAlertsToPopulate(500); }); diff --git a/x-pack/plugins/security_solution/cypress/integration/detection_alerts/opening.spec.ts b/x-pack/plugins/security_solution/cypress/integration/detection_alerts/opening.spec.ts index ece7dbe559672..6ad8c28595c6a 100644 --- a/x-pack/plugins/security_solution/cypress/integration/detection_alerts/opening.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/detection_alerts/opening.spec.ts @@ -21,7 +21,7 @@ import { selectNumberOfAlerts, waitForAlerts, } from '../../tasks/alerts'; -import { createCustomRuleActivated } from '../../tasks/api_calls/rules'; +import { createCustomRuleEnabled } from '../../tasks/api_calls/rules'; import { cleanKibana } from '../../tasks/common'; import { waitForAlertsToPopulate } from '../../tasks/create_new_rule'; import { loginAndWaitForPage } from '../../tasks/login'; @@ -33,7 +33,7 @@ describe.skip('Opening alerts', () => { beforeEach(() => { cleanKibana(); loginAndWaitForPage(ALERTS_URL); - createCustomRuleActivated(getNewRule()); + createCustomRuleEnabled(getNewRule()); refreshPage(); waitForAlertsToPopulate(500); selectNumberOfAlerts(5); diff --git a/x-pack/plugins/security_solution/cypress/integration/detection_rules/custom_query_rule.spec.ts b/x-pack/plugins/security_solution/cypress/integration/detection_rules/custom_query_rule.spec.ts index b98f626c6356c..73b915dfff648 100644 --- a/x-pack/plugins/security_solution/cypress/integration/detection_rules/custom_query_rule.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/detection_rules/custom_query_rule.spec.ts @@ -83,11 +83,11 @@ import { selectNumberOfRules, waitForRulesTableToBeRefreshed, } from '../../tasks/alerts_detection_rules'; -import { createCustomRuleActivated } from '../../tasks/api_calls/rules'; +import { createCustomRuleEnabled } from '../../tasks/api_calls/rules'; import { createTimeline } from '../../tasks/api_calls/timelines'; import { cleanKibana, reload } from '../../tasks/common'; import { - createAndActivateRule, + createAndEnableRule, fillAboutRule, fillAboutRuleAndContinue, fillDefineCustomRuleWithImportedQueryAndContinue, @@ -101,7 +101,7 @@ import { } from '../../tasks/create_new_rule'; import { saveEditedRule, waitForKibana } from '../../tasks/edit_rule'; import { loginAndWaitForPageWithoutDateRange } from '../../tasks/login'; -import { activatesRule, getDetails } from '../../tasks/rule_details'; +import { enablesRule, getDetails } from '../../tasks/rule_details'; import { RULE_CREATION, DETECTIONS_RULE_MANAGEMENT_URL } from '../../urls/navigation'; @@ -125,7 +125,7 @@ describe.skip('Custom detection rules creation', () => { }); }); - it('Creates and activates a new rule', function () { + it('Creates and enables a new rule', function () { loginAndWaitForPageWithoutDateRange(RULE_CREATION); fillDefineCustomRuleWithImportedQueryAndContinue(this.rule); fillAboutRuleAndContinue(this.rule); @@ -143,7 +143,7 @@ describe.skip('Custom detection rules creation', () => { cy.get(ABOUT_CONTINUE_BTN).should('exist').click({ force: true }); cy.get(ABOUT_CONTINUE_BTN).should('not.exist'); - createAndActivateRule(); + createAndEnableRule(); cy.get(CUSTOM_RULES_BTN).should('have.text', 'Custom rules (1)'); @@ -209,10 +209,10 @@ describe('Custom detection rules deletion and edition', () => { beforeEach(() => { cleanKibana(); loginAndWaitForPageWithoutDateRange(DETECTIONS_RULE_MANAGEMENT_URL); - createCustomRuleActivated(getNewRule(), 'rule1'); + createCustomRuleEnabled(getNewRule(), 'rule1'); - createCustomRuleActivated(getNewOverrideRule(), 'rule2'); - createCustomRuleActivated(getExistingRule(), 'rule3'); + createCustomRuleEnabled(getNewOverrideRule(), 'rule2'); + createCustomRuleEnabled(getExistingRule(), 'rule3'); reload(); }); @@ -309,12 +309,12 @@ describe('Custom detection rules deletion and edition', () => { beforeEach(() => { cleanKibana(); loginAndWaitForPageWithoutDateRange(DETECTIONS_RULE_MANAGEMENT_URL); - createCustomRuleActivated(getExistingRule(), 'rule1'); + createCustomRuleEnabled(getExistingRule(), 'rule1'); reload(); }); it('Only modifies rule active status on enable/disable', () => { - activatesRule(); + enablesRule(); cy.intercept('GET', `/api/detection_engine/rules?id=*`).as('fetchRuleDetails'); diff --git a/x-pack/plugins/security_solution/cypress/integration/detection_rules/event_correlation_rule.spec.ts b/x-pack/plugins/security_solution/cypress/integration/detection_rules/event_correlation_rule.spec.ts index 8384c879d8110..0ae68553f50c6 100644 --- a/x-pack/plugins/security_solution/cypress/integration/detection_rules/event_correlation_rule.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/detection_rules/event_correlation_rule.spec.ts @@ -51,7 +51,7 @@ import { import { createTimeline } from '../../tasks/api_calls/timelines'; import { cleanKibana } from '../../tasks/common'; import { - createAndActivateRule, + createAndEnableRule, fillAboutRuleAndContinue, fillDefineEqlRuleAndContinue, fillScheduleRuleAndContinue, @@ -84,13 +84,13 @@ describe.skip('Detection rules, EQL', () => { }); }); - it('Creates and activates a new EQL rule', function () { + it('Creates and enables a new EQL rule', function () { loginAndWaitForPageWithoutDateRange(RULE_CREATION); selectEqlRuleType(); fillDefineEqlRuleAndContinue(this.rule); fillAboutRuleAndContinue(this.rule); fillScheduleRuleAndContinue(this.rule); - createAndActivateRule(); + createAndEnableRule(); cy.get(CUSTOM_RULES_BTN).should('have.text', 'Custom rules (1)'); @@ -176,13 +176,13 @@ describe.skip('Detection rules, sequence EQL', () => { }); }); - it('Creates and activates a new EQL rule with a sequence', function () { + it('Creates and enables a new EQL rule with a sequence', function () { loginAndWaitForPageWithoutDateRange(RULE_CREATION); selectEqlRuleType(); fillDefineEqlRuleAndContinue(this.rule); fillAboutRuleAndContinue(this.rule); fillScheduleRuleAndContinue(this.rule); - createAndActivateRule(); + createAndEnableRule(); cy.get(CUSTOM_RULES_BTN).should('have.text', 'Custom rules (1)'); diff --git a/x-pack/plugins/security_solution/cypress/integration/detection_rules/indicator_match_rule.spec.ts b/x-pack/plugins/security_solution/cypress/integration/detection_rules/indicator_match_rule.spec.ts index d34d9bd4fc171..9978045835f48 100644 --- a/x-pack/plugins/security_solution/cypress/integration/detection_rules/indicator_match_rule.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/detection_rules/indicator_match_rule.spec.ts @@ -75,7 +75,7 @@ import { createCustomIndicatorRule } from '../../tasks/api_calls/rules'; import { loadPrepackagedTimelineTemplates } from '../../tasks/api_calls/timelines'; import { cleanKibana, reload } from '../../tasks/common'; import { - createAndActivateRule, + createAndEnableRule, fillAboutRuleAndContinue, fillDefineIndicatorMatchRuleAndContinue, fillIndexAndIndicatorIndexPattern, @@ -408,7 +408,7 @@ describe.skip('indicator match', () => { loginAndWaitForPageWithoutDateRange(ALERTS_URL); }); - it('Creates and activates a new Indicator Match rule', () => { + it('Creates and enables a new Indicator Match rule', () => { goToManageAlertsDetectionRules(); waitForRulesTableToBeLoaded(); goToCreateNewRule(); @@ -416,7 +416,7 @@ describe.skip('indicator match', () => { fillDefineIndicatorMatchRuleAndContinue(getNewThreatIndicatorRule()); fillAboutRuleAndContinue(getNewThreatIndicatorRule()); fillScheduleRuleAndContinue(getNewThreatIndicatorRule()); - createAndActivateRule(); + createAndEnableRule(); cy.get(CUSTOM_RULES_BTN).should('have.text', 'Custom rules (1)'); diff --git a/x-pack/plugins/security_solution/cypress/integration/detection_rules/links.spec.ts b/x-pack/plugins/security_solution/cypress/integration/detection_rules/links.spec.ts index 469c77e1c3c17..4e6a5352aee9d 100644 --- a/x-pack/plugins/security_solution/cypress/integration/detection_rules/links.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/detection_rules/links.spec.ts @@ -7,7 +7,7 @@ import { getNewRule } from '../../objects/rule'; import { RULES_MONITORING_TABLE, RULE_NAME } from '../../screens/alerts_detection_rules'; -import { createCustomRuleActivated } from '../../tasks/api_calls/rules'; +import { createCustomRuleEnabled } from '../../tasks/api_calls/rules'; import { cleanKibana, reload } from '../../tasks/common'; import { loginAndWaitForPageWithoutDateRange } from '../../tasks/login'; import { DETECTIONS_RULE_MANAGEMENT_URL } from '../../urls/navigation'; @@ -16,7 +16,7 @@ describe('Rules talbes links', () => { beforeEach(() => { cleanKibana(); loginAndWaitForPageWithoutDateRange(DETECTIONS_RULE_MANAGEMENT_URL); - createCustomRuleActivated(getNewRule(), 'rule1'); + createCustomRuleEnabled(getNewRule(), 'rule1'); reload(); }); diff --git a/x-pack/plugins/security_solution/cypress/integration/detection_rules/machine_learning_rule.spec.ts b/x-pack/plugins/security_solution/cypress/integration/detection_rules/machine_learning_rule.spec.ts index bf8d753a8161c..d47ff6f98cd19 100644 --- a/x-pack/plugins/security_solution/cypress/integration/detection_rules/machine_learning_rule.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/detection_rules/machine_learning_rule.spec.ts @@ -47,7 +47,7 @@ import { } from '../../tasks/alerts_detection_rules'; import { cleanKibana } from '../../tasks/common'; import { - createAndActivateRule, + createAndEnableRule, fillAboutRuleAndContinue, fillDefineMachineLearningRuleAndContinue, fillScheduleRuleAndContinue, @@ -68,13 +68,13 @@ describe.skip('Detection rules, machine learning', () => { cleanKibana(); }); - it('Creates and activates a new ml rule', () => { + it('Creates and enables a new ml rule', () => { loginAndWaitForPageWithoutDateRange(RULE_CREATION); selectMachineLearningRuleType(); fillDefineMachineLearningRuleAndContinue(getMachineLearningRule()); fillAboutRuleAndContinue(getMachineLearningRule()); fillScheduleRuleAndContinue(getMachineLearningRule()); - createAndActivateRule(); + createAndEnableRule(); cy.get(CUSTOM_RULES_BTN).should('have.text', 'Custom rules (1)'); diff --git a/x-pack/plugins/security_solution/cypress/integration/detection_rules/override.spec.ts b/x-pack/plugins/security_solution/cypress/integration/detection_rules/override.spec.ts index 694036d8a1678..2dcfae29b615b 100644 --- a/x-pack/plugins/security_solution/cypress/integration/detection_rules/override.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/detection_rules/override.spec.ts @@ -61,7 +61,7 @@ import { import { createTimeline } from '../../tasks/api_calls/timelines'; import { cleanKibana } from '../../tasks/common'; import { - createAndActivateRule, + createAndEnableRule, fillAboutRuleWithOverrideAndContinue, fillDefineCustomRuleWithImportedQueryAndContinue, fillScheduleRuleAndContinue, @@ -92,12 +92,12 @@ describe.skip('Detection rules, override', () => { }); }); - it('Creates and activates a new custom rule with override option', function () { + it('Creates and enables a new custom rule with override option', function () { loginAndWaitForPageWithoutDateRange(RULE_CREATION); fillDefineCustomRuleWithImportedQueryAndContinue(this.rule); fillAboutRuleWithOverrideAndContinue(this.rule); fillScheduleRuleAndContinue(this.rule); - createAndActivateRule(); + createAndEnableRule(); cy.get(CUSTOM_RULES_BTN).should('have.text', 'Custom rules (1)'); diff --git a/x-pack/plugins/security_solution/cypress/integration/detection_rules/prebuilt_rules.spec.ts b/x-pack/plugins/security_solution/cypress/integration/detection_rules/prebuilt_rules.spec.ts index 3081d7c966eb6..ea83b66ffb95d 100644 --- a/x-pack/plugins/security_solution/cypress/integration/detection_rules/prebuilt_rules.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/detection_rules/prebuilt_rules.spec.ts @@ -27,9 +27,9 @@ import { waitForPrebuiltDetectionRulesToBeLoaded, selectAllRules, confirmRulesDelete, - activateSelectedRules, + enableSelectedRules, waitForRuleToChangeStatus, - deactivateSelectedRules, + disableSelectedRules, changeRowsPerPageTo, } from '../../tasks/alerts_detection_rules'; import { loginAndWaitForPageWithoutDateRange } from '../../tasks/login'; @@ -77,14 +77,14 @@ describe('Actions with prebuilt rules', () => { }); context('Rules table', () => { - it('Allows to activate/deactivate all rules at once', () => { + it('Allows to enable/disable all rules at once', () => { selectAllRules(); - activateSelectedRules(); + enableSelectedRules(); waitForRuleToChangeStatus(); cy.get(RULE_SWITCH).should('have.attr', 'aria-checked', 'true'); selectAllRules(); - deactivateSelectedRules(); + disableSelectedRules(); waitForRuleToChangeStatus(); cy.get(RULE_SWITCH).should('have.attr', 'aria-checked', 'false'); }); @@ -174,16 +174,16 @@ describe('Actions with prebuilt rules', () => { }); context('Rule monitoring table', () => { - it('Allows to activate/deactivate all rules at once', () => { + it('Allows to enable/disable all rules at once', () => { cy.get(RULES_MONITORING_TABLE).click(); cy.get(SELECT_ALL_RULES_ON_PAGE_CHECKBOX).click(); - activateSelectedRules(); + enableSelectedRules(); waitForRuleToChangeStatus(); cy.get(RULE_SWITCH).should('have.attr', 'aria-checked', 'true'); selectAllRules(); - deactivateSelectedRules(); + disableSelectedRules(); waitForRuleToChangeStatus(); cy.get(RULE_SWITCH).should('have.attr', 'aria-checked', 'false'); }); diff --git a/x-pack/plugins/security_solution/cypress/integration/detection_rules/threshold_rule.spec.ts b/x-pack/plugins/security_solution/cypress/integration/detection_rules/threshold_rule.spec.ts index 921128ce3303d..80fbfc6a7bf13 100644 --- a/x-pack/plugins/security_solution/cypress/integration/detection_rules/threshold_rule.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/detection_rules/threshold_rule.spec.ts @@ -59,11 +59,11 @@ import { goToRuleDetails, waitForRulesTableToBeLoaded, } from '../../tasks/alerts_detection_rules'; -import { createCustomRuleActivated } from '../../tasks/api_calls/rules'; +import { createCustomRuleEnabled } from '../../tasks/api_calls/rules'; import { createTimeline } from '../../tasks/api_calls/timelines'; import { cleanKibana } from '../../tasks/common'; import { - createAndActivateRule, + createAndEnableRule, fillAboutRuleAndContinue, fillDefineThresholdRuleAndContinue, fillDefineThresholdRule, @@ -93,12 +93,12 @@ describe.skip('Detection rules, threshold', () => { loginAndWaitForPageWithoutDateRange(RULE_CREATION); }); - it('Creates and activates a new threshold rule', () => { + it('Creates and enables a new threshold rule', () => { selectThresholdRuleType(); fillDefineThresholdRuleAndContinue(rule); fillAboutRuleAndContinue(rule); fillScheduleRuleAndContinue(rule); - createAndActivateRule(); + createAndEnableRule(); cy.get(CUSTOM_RULES_BTN).should('have.text', 'Custom rules (1)'); @@ -168,7 +168,7 @@ describe.skip('Detection rules, threshold', () => { it.skip('Preview results of keyword using "host.name"', () => { rule.index = [...rule.index, '.siem-signals*']; - createCustomRuleActivated(getNewRule()); + createCustomRuleEnabled(getNewRule()); goToManageAlertsDetectionRules(); waitForRulesTableToBeLoaded(); goToCreateNewRule(); @@ -187,7 +187,7 @@ describe.skip('Detection rules, threshold', () => { }; previewRule.index = [...previewRule.index, '.siem-signals*']; - createCustomRuleActivated(getNewRule()); + createCustomRuleEnabled(getNewRule()); goToManageAlertsDetectionRules(); waitForRulesTableToBeLoaded(); goToCreateNewRule(); diff --git a/x-pack/plugins/security_solution/cypress/integration/exceptions/from_alert.spec.ts b/x-pack/plugins/security_solution/cypress/integration/exceptions/from_alert.spec.ts index 9887eb1e8612b..a46565b09e5a6 100644 --- a/x-pack/plugins/security_solution/cypress/integration/exceptions/from_alert.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/exceptions/from_alert.spec.ts @@ -18,7 +18,7 @@ import { waitForAlertsToPopulate } from '../../tasks/create_new_rule'; import { esArchiverLoad, esArchiverUnload } from '../../tasks/es_archiver'; import { loginAndWaitForPageWithoutDateRange } from '../../tasks/login'; import { - activatesRule, + enablesRule, addsException, goToAlertsTab, goToExceptionsTab, @@ -42,7 +42,7 @@ describe.skip('From alert', () => { cy.get(RULE_STATUS).should('have.text', '—'); esArchiverLoad('auditbeat_for_exceptions'); - activatesRule(); + enablesRule(); waitForTheRuleToBeExecuted(); waitForAlertsToPopulate(); diff --git a/x-pack/plugins/security_solution/cypress/integration/exceptions/from_rule.spec.ts b/x-pack/plugins/security_solution/cypress/integration/exceptions/from_rule.spec.ts index d9661324aee6d..42c215ca7238d 100644 --- a/x-pack/plugins/security_solution/cypress/integration/exceptions/from_rule.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/exceptions/from_rule.spec.ts @@ -18,7 +18,7 @@ import { waitForAlertsToPopulate } from '../../tasks/create_new_rule'; import { esArchiverLoad, esArchiverUnload } from '../../tasks/es_archiver'; import { loginAndWaitForPageWithoutDateRange } from '../../tasks/login'; import { - activatesRule, + enablesRule, addsExceptionFromRuleSettings, goToAlertsTab, goToExceptionsTab, @@ -42,7 +42,7 @@ describe.skip('From rule', () => { cy.get(RULE_STATUS).should('have.text', '—'); esArchiverLoad('auditbeat_for_exceptions'); - activatesRule(); + enablesRule(); waitForTheRuleToBeExecuted(); waitForAlertsToPopulate(); refreshPage(); diff --git a/x-pack/plugins/security_solution/cypress/integration/users/user_details.spec.ts b/x-pack/plugins/security_solution/cypress/integration/users/user_details.spec.ts index a30b651bfba39..9e3446a7d071f 100644 --- a/x-pack/plugins/security_solution/cypress/integration/users/user_details.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/users/user_details.spec.ts @@ -6,7 +6,7 @@ */ import { ALERT_FLYOUT } from '../../screens/alerts_details'; -import { createCustomRuleActivated } from '../../tasks/api_calls/rules'; +import { createCustomRuleEnabled } from '../../tasks/api_calls/rules'; import { cleanKibana } from '../../tasks/common'; import { waitForAlertsToPopulate } from '../../tasks/create_new_rule'; import { loginAndWaitForPageWithoutDateRange } from '../../tasks/login'; @@ -24,7 +24,7 @@ describe.skip('user details flyout', () => { beforeEach(() => { cleanKibana(); loginAndWaitForPageWithoutDateRange(ALERTS_URL); - createCustomRuleActivated(getNewRule()); + createCustomRuleEnabled(getNewRule()); refreshPage(); waitForAlertsToPopulate(); }); diff --git a/x-pack/plugins/security_solution/cypress/screens/alerts_detection_rules.ts b/x-pack/plugins/security_solution/cypress/screens/alerts_detection_rules.ts index fa8271a158984..f72f613d99e8c 100644 --- a/x-pack/plugins/security_solution/cypress/screens/alerts_detection_rules.ts +++ b/x-pack/plugins/security_solution/cypress/screens/alerts_detection_rules.ts @@ -23,9 +23,9 @@ export const DUPLICATE_RULE_ACTION_BTN = '[data-test-subj="duplicateRuleAction"] export const DUPLICATE_RULE_MENU_PANEL_BTN = '[data-test-subj="rules-details-duplicate-rule"]'; -export const ACTIVATE_RULE_BULK_BTN = '[data-test-subj="activateRuleBulk"]'; +export const ENABLE_RULE_BULK_BTN = '[data-test-subj="enableRuleBulk"]'; -export const DEACTIVATE_RULE_BULK_BTN = '[data-test-subj="deactivateRuleBulk"]'; +export const DISABLE_RULE_BULK_BTN = '[data-test-subj="disableRuleBulk"]'; export const DELETE_RULE_BULK_BTN = '[data-test-subj="deleteRuleBulk"]'; diff --git a/x-pack/plugins/security_solution/cypress/screens/create_new_rule.ts b/x-pack/plugins/security_solution/cypress/screens/create_new_rule.ts index a3e5e8af3f598..bb87a0fe12620 100644 --- a/x-pack/plugins/security_solution/cypress/screens/create_new_rule.ts +++ b/x-pack/plugins/security_solution/cypress/screens/create_new_rule.ts @@ -58,7 +58,7 @@ export const COMBO_BOX_CLEAR_BTN = '[data-test-subj="comboBoxClearButton"]'; export const COMBO_BOX_INPUT = '[data-test-subj="comboBoxInput"]'; -export const CREATE_AND_ACTIVATE_BTN = '[data-test-subj="create-activate"]'; +export const CREATE_AND_ENABLE_BTN = '[data-test-subj="create-enable"]'; export const CUSTOM_QUERY_INPUT = '[data-test-subj="queryInput"]'; diff --git a/x-pack/plugins/security_solution/cypress/tasks/alerts_detection_rules.ts b/x-pack/plugins/security_solution/cypress/tasks/alerts_detection_rules.ts index e2b187a6b51de..8475ef7247c2c 100644 --- a/x-pack/plugins/security_solution/cypress/tasks/alerts_detection_rules.ts +++ b/x-pack/plugins/security_solution/cypress/tasks/alerts_detection_rules.ts @@ -36,8 +36,8 @@ import { SELECT_ALL_RULES_BTN, MODAL_CONFIRMATION_BTN, RULES_DELETE_CONFIRMATION_MODAL, - ACTIVATE_RULE_BULK_BTN, - DEACTIVATE_RULE_BULK_BTN, + ENABLE_RULE_BULK_BTN, + DISABLE_RULE_BULK_BTN, RULE_DETAILS_DELETE_BTN, RULE_IMPORT_MODAL_BUTTON, RULE_IMPORT_MODAL, @@ -87,7 +87,7 @@ export const duplicateRuleFromMenu = () => { /** * Check that the duplicated rule is on the table - * and it is deactivated (default) + * and it is disabled (default) */ export const checkDuplicatedRule = () => { cy.contains(RULE_NAME, duplicatedRuleName) @@ -126,14 +126,14 @@ export const duplicateSelectedRules = () => { cy.get(DUPLICATE_RULE_BULK_BTN).click(); }; -export const activateSelectedRules = () => { +export const enableSelectedRules = () => { cy.get(BULK_ACTIONS_BTN).click({ force: true }); - cy.get(ACTIVATE_RULE_BULK_BTN).click(); + cy.get(ENABLE_RULE_BULK_BTN).click(); }; -export const deactivateSelectedRules = () => { +export const disableSelectedRules = () => { cy.get(BULK_ACTIONS_BTN).click({ force: true }); - cy.get(DEACTIVATE_RULE_BULK_BTN).click(); + cy.get(DISABLE_RULE_BULK_BTN).click(); }; export const exportFirstRule = () => { diff --git a/x-pack/plugins/security_solution/cypress/tasks/api_calls/rules.ts b/x-pack/plugins/security_solution/cypress/tasks/api_calls/rules.ts index 0e6f4e6851a1b..6e5de090627e0 100644 --- a/x-pack/plugins/security_solution/cypress/tasks/api_calls/rules.ts +++ b/x-pack/plugins/security_solution/cypress/tasks/api_calls/rules.ts @@ -90,7 +90,7 @@ export const createCustomIndicatorRule = (rule: ThreatIndicatorRule, ruleId = 'r failOnStatusCode: false, }); -export const createCustomRuleActivated = ( +export const createCustomRuleEnabled = ( rule: CustomRule, ruleId = '1', interval = '100m', diff --git a/x-pack/plugins/security_solution/cypress/tasks/create_new_rule.ts b/x-pack/plugins/security_solution/cypress/tasks/create_new_rule.ts index 068839ad576dc..4ea8f4ce0ff91 100644 --- a/x-pack/plugins/security_solution/cypress/tasks/create_new_rule.ts +++ b/x-pack/plugins/security_solution/cypress/tasks/create_new_rule.ts @@ -27,7 +27,7 @@ import { BACK_TO_ALL_RULES_LINK, COMBO_BOX_CLEAR_BTN, COMBO_BOX_INPUT, - CREATE_AND_ACTIVATE_BTN, + CREATE_AND_ENABLE_BTN, CUSTOM_QUERY_INPUT, CUSTOM_QUERY_REQUIRED, DEFAULT_RISK_SCORE_INPUT, @@ -98,10 +98,10 @@ import { SERVER_SIDE_EVENT_COUNT } from '../screens/timeline'; import { TIMELINE } from '../screens/timelines'; import { refreshPage } from './security_header'; -export const createAndActivateRule = () => { +export const createAndEnableRule = () => { cy.get(SCHEDULE_CONTINUE_BUTTON).click({ force: true }); - cy.get(CREATE_AND_ACTIVATE_BTN).click({ force: true }); - cy.get(CREATE_AND_ACTIVATE_BTN).should('not.exist'); + cy.get(CREATE_AND_ENABLE_BTN).click({ force: true }); + cy.get(CREATE_AND_ENABLE_BTN).should('not.exist'); cy.get(BACK_TO_ALL_RULES_LINK).click({ force: true }); cy.get(BACK_TO_ALL_RULES_LINK).should('not.exist'); }; diff --git a/x-pack/plugins/security_solution/cypress/tasks/rule_details.ts b/x-pack/plugins/security_solution/cypress/tasks/rule_details.ts index 5094d469907bf..e69c217c4a764 100644 --- a/x-pack/plugins/security_solution/cypress/tasks/rule_details.ts +++ b/x-pack/plugins/security_solution/cypress/tasks/rule_details.ts @@ -31,7 +31,7 @@ import { } from '../screens/rule_details'; import { addsFields, closeFieldsBrowser, filterFieldsBrowser } from './fields_browser'; -export const activatesRule = () => { +export const enablesRule = () => { cy.intercept('PATCH', '/api/detection_engine/rules/_bulk_update').as('bulk_update'); cy.get(RULE_SWITCH).should('be.visible'); cy.get(RULE_SWITCH).click(); diff --git a/x-pack/plugins/security_solution/cypress/tasks/sourcerer.ts b/x-pack/plugins/security_solution/cypress/tasks/sourcerer.ts index 7309b374810eb..95a2d01cd2f5a 100644 --- a/x-pack/plugins/security_solution/cypress/tasks/sourcerer.ts +++ b/x-pack/plugins/security_solution/cypress/tasks/sourcerer.ts @@ -11,7 +11,7 @@ import { HOSTS_URL } from '../urls/navigation'; import { waitForPage } from './login'; import { openTimelineUsingToggle } from './security_main'; import { DEFAULT_ALERTS_INDEX } from '../../common/constants'; -import { createCustomRuleActivated } from './api_calls/rules'; +import { createCustomRuleEnabled } from './api_calls/rules'; import { getNewRule } from '../objects/rule'; export const openSourcerer = (sourcererScope?: string) => { @@ -176,6 +176,6 @@ export const refreshUntilAlertsIndexExists = async () => { }; export const waitForAlertsIndexToExist = () => { - createCustomRuleActivated(getNewRule(), '1', '100m', 100); + createCustomRuleEnabled(getNewRule(), '1', '100m', 100); refreshUntilAlertsIndexExists(); }; diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/ml_job_select/help_text.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/ml_job_select/help_text.tsx index 0a4c5ce76c785..ee4b5061e8499 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/ml_job_select/help_text.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/ml_job_select/help_text.tsx @@ -42,7 +42,7 @@ const HelpTextComponent: React.FC<{ href: string; notRunningJobIds: string[] }> {notRunningJobIds.length === 1 ? ( ) : ( acc + (i < array.length - 1 ? ', ' : ', and ') + value diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/pre_packaged_rules/translations.ts b/x-pack/plugins/security_solution/public/detections/components/rules/pre_packaged_rules/translations.ts index 847e73f0bf19d..5b66b4611c03d 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/pre_packaged_rules/translations.ts +++ b/x-pack/plugins/security_solution/public/detections/components/rules/pre_packaged_rules/translations.ts @@ -18,7 +18,7 @@ export const PRE_BUILT_MSG = i18n.translate( 'xpack.securitySolution.detectionEngine.rules.prePackagedRules.emptyPromptMessage', { defaultMessage: - 'Elastic Security comes with prebuilt detection rules that run in the background and create alerts when their conditions are met. By default, all prebuilt rules except the Endpoint Security rule are disabled. You can select additional rules you want to activate.', + 'Elastic Security comes with prebuilt detection rules that run in the background and create alerts when their conditions are met. By default, all prebuilt rules except the Endpoint Security rule are disabled. You can select additional rules you want to enable.', } ); diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/step_rule_actions/index.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/step_rule_actions/index.tsx index 72730deec6a19..94a883e6bae19 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/step_rule_actions/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/step_rule_actions/index.tsx @@ -230,7 +230,7 @@ const StepRuleActionsComponent: FC = ({ isLoading={isLoading} onClick={() => handleSubmit(false)} > - {I18n.COMPLETE_WITHOUT_ACTIVATING} + {I18n.COMPLETE_WITHOUT_ENABLING} @@ -239,9 +239,9 @@ const StepRuleActionsComponent: FC = ({ isDisabled={isLoading} isLoading={isLoading} onClick={() => handleSubmit(true)} - data-test-subj="create-activate" + data-test-subj="create-enable" > - {I18n.COMPLETE_WITH_ACTIVATING} + {I18n.COMPLETE_WITH_ENABLING} diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/step_rule_actions/translations.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/step_rule_actions/translations.tsx index fcd04c2bfc1ec..dadb3d4229734 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/step_rule_actions/translations.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/step_rule_actions/translations.tsx @@ -8,17 +8,17 @@ import { i18n } from '@kbn/i18n'; import { startCase } from 'lodash/fp'; -export const COMPLETE_WITHOUT_ACTIVATING = i18n.translate( - 'xpack.securitySolution.detectionEngine.createRule.stepScheduleRule.completeWithoutActivatingTitle', +export const COMPLETE_WITHOUT_ENABLING = i18n.translate( + 'xpack.securitySolution.detectionEngine.createRule.stepScheduleRule.completeWithoutEnablingTitle', { - defaultMessage: 'Create rule without activating it', + defaultMessage: 'Create rule without enabling it', } ); -export const COMPLETE_WITH_ACTIVATING = i18n.translate( - 'xpack.securitySolution.detectionEngine.createRule.stepScheduleRule.completeWithActivatingTitle', +export const COMPLETE_WITH_ENABLING = i18n.translate( + 'xpack.securitySolution.detectionEngine.createRule.stepScheduleRule.completeWithEnablingTitle', { - defaultMessage: 'Create & activate rule', + defaultMessage: 'Create & enable rule', } ); diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/step_schedule_rule/translations.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/step_schedule_rule/translations.tsx deleted file mode 100644 index c1de42c708849..0000000000000 --- a/x-pack/plugins/security_solution/public/detections/components/rules/step_schedule_rule/translations.tsx +++ /dev/null @@ -1,22 +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 { i18n } from '@kbn/i18n'; - -export const COMPLETE_WITHOUT_ACTIVATING = i18n.translate( - 'xpack.securitySolution.detectionEngine.createRule. stepScheduleRule.completeWithoutActivatingTitle', - { - defaultMessage: 'Create rule without activating it', - } -); - -export const COMPLETE_WITH_ACTIVATING = i18n.translate( - 'xpack.securitySolution.detectionEngine.createRule. stepScheduleRule.completeWithActivatingTitle', - { - defaultMessage: 'Create & activate rule', - } -); diff --git a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/rules/use_find_rules_query.ts b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/rules/use_find_rules_query.ts index 47778be0d9c91..6e212cebc85d1 100644 --- a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/rules/use_find_rules_query.ts +++ b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/rules/use_find_rules_query.ts @@ -87,7 +87,7 @@ export const useInvalidateRules = () => { /** * We should use this hook to update the rules cache when modifying rules * without changing the rules collection size. Use it with the new rules data - * after operations like bulk or single rule edit or rule activation, but not + * after operations like bulk or single rule edit or rule enabling, but not * when adding or removing rules. When adding/removing rules, we should * invalidate the cache instead. * diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/actions.ts b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/actions.ts index 29b374f3fb26e..8e98d24b17246 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/actions.ts +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/actions.ts @@ -138,8 +138,8 @@ export const enableRulesAction = async ( setLoadingRules?: RulesTableActions['setLoadingRules'] ) => { const errorTitle = enabled - ? i18n.BATCH_ACTION_ACTIVATE_SELECTED_ERROR(ids.length) - : i18n.BATCH_ACTION_DEACTIVATE_SELECTED_ERROR(ids.length); + ? i18n.BATCH_ACTION_ENABLE_SELECTED_ERROR(ids.length) + : i18n.BATCH_ACTION_DISABLE_SELECTED_ERROR(ids.length); try { setLoadingRules?.({ ids, action: enabled ? 'enable' : 'disable' }); diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/bulk_actions/use_bulk_actions.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/bulk_actions/use_bulk_actions.tsx index 7058b95bf5fc9..fd12f9a71bf29 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/bulk_actions/use_bulk_actions.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/bulk_actions/use_bulk_actions.tsx @@ -110,19 +110,19 @@ export const useBulkActions = ({ !hasActionsPrivileges && selectedRules.some((rule) => !canEditRuleWithActions(rule, hasActionsPrivileges)); - const handleActivateAction = async () => { + const handleEnableAction = async () => { closePopover(); - const deactivatedRules = selectedRules.filter(({ enabled }) => !enabled); - const deactivatedRulesNoML = deactivatedRules.filter(({ type }) => !isMlRule(type)); + const disabledRules = selectedRules.filter(({ enabled }) => !enabled); + const disabledRulesNoML = disabledRules.filter(({ type }) => !isMlRule(type)); - const mlRuleCount = deactivatedRules.length - deactivatedRulesNoML.length; + const mlRuleCount = disabledRules.length - disabledRulesNoML.length; if (!hasMlPermissions && mlRuleCount > 0) { displayWarningToast(detectionI18n.ML_RULES_UNAVAILABLE(mlRuleCount), dispatchToaster); } const ruleIds = hasMlPermissions - ? deactivatedRules.map(({ id }) => id) - : deactivatedRulesNoML.map(({ id }) => id); + ? disabledRules.map(({ id }) => id) + : disabledRulesNoML.map(({ id }) => id); if (isAllSelected) { const rulesBulkAction = initRulesBulkAction({ @@ -139,12 +139,12 @@ export const useBulkActions = ({ invalidateRules(); }; - const handleDeactivateActions = async () => { + const handleDisableActions = async () => { closePopover(); - const activatedIds = selectedRules.filter(({ enabled }) => enabled).map(({ id }) => id); + const enabledIds = selectedRules.filter(({ enabled }) => enabled).map(({ id }) => id); if (isAllSelected) { const rulesBulkAction = initRulesBulkAction({ - visibleRuleIds: activatedIds, + visibleRuleIds: enabledIds, action: BulkAction.disable, setLoadingRules, toasts, @@ -152,7 +152,7 @@ export const useBulkActions = ({ await rulesBulkAction.byQuery(filterQuery); } else { - await enableRulesAction(activatedIds, false, dispatchToaster, setLoadingRules); + await enableRulesAction(enabledIds, false, dispatchToaster, setLoadingRules); } invalidateRules(); }; @@ -345,10 +345,10 @@ export const useBulkActions = ({ { key: i18n.BULK_ACTION_ENABLE, name: i18n.BULK_ACTION_ENABLE, - 'data-test-subj': 'activateRuleBulk', + 'data-test-subj': 'enableRuleBulk', disabled: missingActionPrivileges || containsLoading || (!containsDisabled && !isAllSelected), - onClick: handleActivateAction, + onClick: handleEnableAction, toolTipContent: missingActionPrivileges ? i18n.EDIT_RULE_SETTINGS_TOOLTIP : undefined, toolTipPosition: 'right', icon: undefined, @@ -391,10 +391,10 @@ export const useBulkActions = ({ { key: i18n.BULK_ACTION_DISABLE, name: i18n.BULK_ACTION_DISABLE, - 'data-test-subj': 'deactivateRuleBulk', + 'data-test-subj': 'disableRuleBulk', disabled: missingActionPrivileges || containsLoading || (!containsEnabled && !isAllSelected), - onClick: handleDeactivateActions, + onClick: handleDisableActions, toolTipContent: missingActionPrivileges ? i18n.EDIT_RULE_SETTINGS_TOOLTIP : undefined, toolTipPosition: 'right', icon: undefined, diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/details/index.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/details/index.tsx index 29df35290a445..7ddc97ccbfdc4 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/details/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/details/index.tsx @@ -677,7 +677,7 @@ const RuleDetailsPageComponent: React.FC = ({ enabled={isExistingRule && (rule?.enabled ?? false)} onChange={handleOnChangeEnabledRule} /> - {i18n.ACTIVATE_RULE} + {i18n.ENABLE_RULE} diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/details/translations.ts b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/details/translations.ts index 32745f39d27a8..9a51952d17a91 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/details/translations.ts +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/details/translations.ts @@ -28,10 +28,10 @@ export const EXPERIMENTAL = i18n.translate( } ); -export const ACTIVATE_RULE = i18n.translate( - 'xpack.securitySolution.detectionEngine.ruleDetails.activateRuleLabel', +export const ENABLE_RULE = i18n.translate( + 'xpack.securitySolution.detectionEngine.ruleDetails.enableRuleLabel', { - defaultMessage: 'Activate', + defaultMessage: 'Enable', } ); diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/translations.ts b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/translations.ts index c336b588f12b8..b1cc2e4f0388c 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/translations.ts +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/translations.ts @@ -454,18 +454,18 @@ export const BULK_EDIT_FLYOUT_FORM_DELETE_TAGS_TITLE = i18n.translate( } ); -export const BATCH_ACTION_ACTIVATE_SELECTED_ERROR = (totalRules: number) => +export const BATCH_ACTION_ENABLE_SELECTED_ERROR = (totalRules: number) => i18n.translate( - 'xpack.securitySolution.detectionEngine.rules.allRules.batchActions.activateSelectedErrorTitle', + 'xpack.securitySolution.detectionEngine.rules.allRules.batchActions.enableSelectedErrorTitle', { values: { totalRules }, defaultMessage: 'Error enabling {totalRules, plural, =1 {rule} other {rules}}', } ); -export const BATCH_ACTION_DEACTIVATE_SELECTED_ERROR = (totalRules: number) => +export const BATCH_ACTION_DISABLE_SELECTED_ERROR = (totalRules: number) => i18n.translate( - 'xpack.securitySolution.detectionEngine.rules.allRules.batchActions.deactivateSelectedErrorTitle', + 'xpack.securitySolution.detectionEngine.rules.allRules.batchActions.disableSelectedErrorTitle', { values: { totalRules }, defaultMessage: 'Error disabling {totalRules, plural, =1 {rule} other {rules}}', diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/notifications/legacy_saved_object_references/README.md b/x-pack/plugins/security_solution/server/lib/detection_engine/notifications/legacy_saved_object_references/README.md index da9ccd30cfdac..22e1da8dff5b3 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/notifications/legacy_saved_object_references/README.md +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/notifications/legacy_saved_object_references/README.md @@ -10,7 +10,7 @@ until we have all users moved away from the legacy system. ## How to create a legacy notification -* Create a rule and activate it normally within security_solution +* Create a rule and enable it normally within security_solution * Do not add actions to the rule at this point as we are exercising the older legacy system. However, you want at least one action configured such as a slack notification. * Within dev tools do a query for all your actions and grab one of the `_id` of them without their prefix: diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/utils.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/utils.test.ts index c57a446207873..9cf57ff0018be 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/utils.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/utils.test.ts @@ -757,12 +757,12 @@ describe('utils', () => { expect(res).toBeTruthy(); expect(mockLogger.warn).toHaveBeenCalledWith( - 'This rule is attempting to query data from Elasticsearch indices listed in the "Index pattern" section of the rule definition, however no index matching: ["logs-endpoint.alerts-*"] was found. This warning will continue to appear until a matching index is created or this rule is de-activated. If you have recently enrolled agents enabled with Endpoint Security through Fleet, this warning should stop once an alert is sent from an agent. name: "fake name" id: "fake id" rule id: "fake rule id" signals index: "fakeindex"' + 'This rule is attempting to query data from Elasticsearch indices listed in the "Index pattern" section of the rule definition, however no index matching: ["logs-endpoint.alerts-*"] was found. This warning will continue to appear until a matching index is created or this rule is disabled. If you have recently enrolled agents enabled with Endpoint Security through Fleet, this warning should stop once an alert is sent from an agent. name: "fake name" id: "fake id" rule id: "fake rule id" signals index: "fakeindex"' ); expect(ruleExecutionLogger.logStatusChange).toHaveBeenCalledWith({ newStatus: RuleExecutionStatus['partial failure'], message: - 'This rule is attempting to query data from Elasticsearch indices listed in the "Index pattern" section of the rule definition, however no index matching: ["logs-endpoint.alerts-*"] was found. This warning will continue to appear until a matching index is created or this rule is de-activated. If you have recently enrolled agents enabled with Endpoint Security through Fleet, this warning should stop once an alert is sent from an agent.', + 'This rule is attempting to query data from Elasticsearch indices listed in the "Index pattern" section of the rule definition, however no index matching: ["logs-endpoint.alerts-*"] was found. This warning will continue to appear until a matching index is created or this rule is disabled. If you have recently enrolled agents enabled with Endpoint Security through Fleet, this warning should stop once an alert is sent from an agent.', }); }); @@ -797,12 +797,12 @@ describe('utils', () => { expect(res).toBeTruthy(); expect(mockLogger.warn).toHaveBeenCalledWith( - 'This rule is attempting to query data from Elasticsearch indices listed in the "Index pattern" section of the rule definition, however no index matching: ["logs-endpoint.alerts-*"] was found. This warning will continue to appear until a matching index is created or this rule is de-activated. name: "fake name" id: "fake id" rule id: "fake rule id" signals index: "fakeindex"' + 'This rule is attempting to query data from Elasticsearch indices listed in the "Index pattern" section of the rule definition, however no index matching: ["logs-endpoint.alerts-*"] was found. This warning will continue to appear until a matching index is created or this rule is disabled. name: "fake name" id: "fake id" rule id: "fake rule id" signals index: "fakeindex"' ); expect(ruleExecutionLogger.logStatusChange).toHaveBeenCalledWith({ newStatus: RuleExecutionStatus['partial failure'], message: - 'This rule is attempting to query data from Elasticsearch indices listed in the "Index pattern" section of the rule definition, however no index matching: ["logs-endpoint.alerts-*"] was found. This warning will continue to appear until a matching index is created or this rule is de-activated.', + 'This rule is attempting to query data from Elasticsearch indices listed in the "Index pattern" section of the rule definition, however no index matching: ["logs-endpoint.alerts-*"] was found. This warning will continue to appear until a matching index is created or this rule is disabled.', }); }); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/utils.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/utils.ts index cb1db88f78d31..b7a06d618162e 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/utils.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/utils.ts @@ -143,7 +143,7 @@ export const hasTimestampFields = async (args: { if (isEmpty(timestampFieldCapsResponse.body.indices)) { const errorString = `This rule is attempting to query data from Elasticsearch indices listed in the "Index pattern" section of the rule definition, however no index matching: ${JSON.stringify( inputIndices - )} was found. This warning will continue to appear until a matching index is created or this rule is de-activated. ${ + )} was found. This warning will continue to appear until a matching index is created or this rule is disabled. ${ ruleName === 'Endpoint Security' ? 'If you have recently enrolled agents enabled with Endpoint Security through Fleet, this warning should stop once an alert is sent from an agent.' : '' diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index b0c005bb3285b..eb30528500fd9 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -23116,8 +23116,6 @@ "xpack.securitySolution.detectionEngine.components.importRuleModal.overwriteExceptionLabel": "競合する「list_id」で既存の例外リストを上書き", "xpack.securitySolution.detectionEngine.components.importRuleModal.selectRuleDescription": "インポートするルールを選択します。関連付けられたルールアクションと例外を含めることができます。", "xpack.securitySolution.detectionEngine.components.importRuleModal.successfullyImportedRulesTitle": "{totalRules} {totalRules, plural, other {ルール}}を正常にインポートしました", - "xpack.securitySolution.detectionEngine.createRule. stepScheduleRule.completeWithActivatingTitle": "ルールの作成と有効化", - "xpack.securitySolution.detectionEngine.createRule. stepScheduleRule.completeWithoutActivatingTitle": "有効化せずにルールを作成", "xpack.securitySolution.detectionEngine.createRule.backToRulesButton": "ルール", "xpack.securitySolution.detectionEngine.createRule.editRuleButton": "編集", "xpack.securitySolution.detectionEngine.createRule.eqlRuleTypeDescription": "イベント相関関係", @@ -23219,8 +23217,6 @@ "xpack.securitySolution.detectionEngine.createRule.stepRuleActions.invalidMustacheTemplateErrorMessage": "{key}は有効なmustacheテンプレートではありません", "xpack.securitySolution.detectionEngine.createRule.stepRuleActions.noConnectorSelectedErrorMessage": "コネクターを選択していません", "xpack.securitySolution.detectionEngine.createRule.stepRuleActions.noReadActionsPrivileges": "ルールアクションを作成できません。「Actions」プラグインの「読み取り」アクセス権がありません。", - "xpack.securitySolution.detectionEngine.createRule.stepScheduleRule.completeWithActivatingTitle": "ルールの作成と有効化", - "xpack.securitySolution.detectionEngine.createRule.stepScheduleRule.completeWithoutActivatingTitle": "有効化せずにルールを作成", "xpack.securitySolution.detectionEngine.createRule.stepScheduleRule.fieldAdditionalLookBackHelpText": "ルックバック期間に時間を追加してアラートの見落としを防ぎます。", "xpack.securitySolution.detectionEngine.createRule.stepScheduleRule.fieldAdditionalLookBackLabel": "追加のルックバック時間", "xpack.securitySolution.detectionEngine.createRule.stepScheduleRule.fieldIntervalHelpText": "ルールを定期的に実行し、指定の時間枠内でアラートを検出します。", @@ -23902,7 +23898,6 @@ "xpack.securitySolution.detectionEngine.ruleDescription.mlJobStoppedDescription": "停止", "xpack.securitySolution.detectionEngine.ruleDescription.thresholdResultsAggregatedByDescription": "結果集約条件", "xpack.securitySolution.detectionEngine.ruleDescription.thresholdResultsAllDescription": "すべての結果", - "xpack.securitySolution.detectionEngine.ruleDetails.activateRuleLabel": "有効化", "xpack.securitySolution.detectionEngine.ruleDetails.backToRulesButton": "ルール", "xpack.securitySolution.detectionEngine.ruleDetails.deletedRule": "削除されたルール", "xpack.securitySolution.detectionEngine.ruleDetails.exceptionsTab": "例外", @@ -23945,8 +23940,6 @@ "xpack.securitySolution.detectionEngine.rules.allRules.actions.editRuleSettingsToolTip": "Kibana アクション特権がありません", "xpack.securitySolution.detectionEngine.rules.allRules.actions.exportRuleDescription": "ルールのエクスポート", "xpack.securitySolution.detectionEngine.rules.allRules.activeRuleDescription": "アクティブ", - "xpack.securitySolution.detectionEngine.rules.allRules.batchActions.activateSelectedErrorTitle": "{totalRules, plural, other {個のルール}}の有効化エラー", - "xpack.securitySolution.detectionEngine.rules.allRules.batchActions.deactivateSelectedErrorTitle": "{totalRules, plural, other {個のルール}}の無効化エラー", "xpack.securitySolution.detectionEngine.rules.allRules.batchActions.deleteSelectedErrorTitle": "{totalRules, plural, other {ルール}}の削除エラー", "xpack.securitySolution.detectionEngine.rules.allRules.batchActions.deleteSelectedImmutableTitle": "選択には削除できないイミュータブルルールがあります", "xpack.securitySolution.detectionEngine.rules.allRules.batchActionsTitle": "一斉アクション", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 5394701a744ea..d26414df7e496 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -23145,8 +23145,6 @@ "xpack.securitySolution.detectionEngine.components.importRuleModal.overwriteExceptionLabel": "覆盖具有冲突“list_id”的现有例外列表", "xpack.securitySolution.detectionEngine.components.importRuleModal.selectRuleDescription": "选择要导入的规则。可以包括关联的规则操作和例外。", "xpack.securitySolution.detectionEngine.components.importRuleModal.successfullyImportedRulesTitle": "已成功导入 {totalRules} 个{totalRules, plural, other {规则}}", - "xpack.securitySolution.detectionEngine.createRule. stepScheduleRule.completeWithActivatingTitle": "创建并激活规则", - "xpack.securitySolution.detectionEngine.createRule. stepScheduleRule.completeWithoutActivatingTitle": "创建规则但不激活", "xpack.securitySolution.detectionEngine.createRule.backToRulesButton": "规则", "xpack.securitySolution.detectionEngine.createRule.editRuleButton": "编辑", "xpack.securitySolution.detectionEngine.createRule.eqlRuleTypeDescription": "事件关联", @@ -23248,8 +23246,6 @@ "xpack.securitySolution.detectionEngine.createRule.stepRuleActions.invalidMustacheTemplateErrorMessage": "{key} 不是有效的 Mustache 模板", "xpack.securitySolution.detectionEngine.createRule.stepRuleActions.noConnectorSelectedErrorMessage": "未选择任何连接器", "xpack.securitySolution.detectionEngine.createRule.stepRuleActions.noReadActionsPrivileges": "无法创建规则操作。您对“操作”插件没有“读”权限。", - "xpack.securitySolution.detectionEngine.createRule.stepScheduleRule.completeWithActivatingTitle": "创建并激活规则", - "xpack.securitySolution.detectionEngine.createRule.stepScheduleRule.completeWithoutActivatingTitle": "创建规则但不激活", "xpack.securitySolution.detectionEngine.createRule.stepScheduleRule.fieldAdditionalLookBackHelpText": "增加回查时段的时间以防止错过告警。", "xpack.securitySolution.detectionEngine.createRule.stepScheduleRule.fieldAdditionalLookBackLabel": "更多回查时间", "xpack.securitySolution.detectionEngine.createRule.stepScheduleRule.fieldIntervalHelpText": "规则定期运行并检测指定时间范围内的告警。", @@ -23931,7 +23927,6 @@ "xpack.securitySolution.detectionEngine.ruleDescription.mlJobStoppedDescription": "已停止", "xpack.securitySolution.detectionEngine.ruleDescription.thresholdResultsAggregatedByDescription": "结果聚合依据", "xpack.securitySolution.detectionEngine.ruleDescription.thresholdResultsAllDescription": "所有结果", - "xpack.securitySolution.detectionEngine.ruleDetails.activateRuleLabel": "激活", "xpack.securitySolution.detectionEngine.ruleDetails.backToRulesButton": "规则", "xpack.securitySolution.detectionEngine.ruleDetails.deletedRule": "已删除规则", "xpack.securitySolution.detectionEngine.ruleDetails.exceptionsTab": "例外", @@ -23974,8 +23969,6 @@ "xpack.securitySolution.detectionEngine.rules.allRules.actions.editRuleSettingsToolTip": "您没有 Kibana 操作权限", "xpack.securitySolution.detectionEngine.rules.allRules.actions.exportRuleDescription": "导出规则", "xpack.securitySolution.detectionEngine.rules.allRules.activeRuleDescription": "活动", - "xpack.securitySolution.detectionEngine.rules.allRules.batchActions.activateSelectedErrorTitle": "启用{totalRules, plural, other {规则}}时出错", - "xpack.securitySolution.detectionEngine.rules.allRules.batchActions.deactivateSelectedErrorTitle": "禁用{totalRules, plural, other {规则}}时出错", "xpack.securitySolution.detectionEngine.rules.allRules.batchActions.deleteSelectedErrorTitle": "删除{totalRules, plural, other {规则}}时出错", "xpack.securitySolution.detectionEngine.rules.allRules.batchActions.deleteSelectedImmutableTitle": "选择内容包含无法删除的不可变规则", "xpack.securitySolution.detectionEngine.rules.allRules.batchActionsTitle": "批处理操作", diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_rules.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_rules.ts index 3bc547ccb6a9a..1075a63742777 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_rules.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_rules.ts @@ -131,7 +131,7 @@ export default ({ getService }: FtrProviderContext) => { // TODO: https://github.com/elastic/kibana/pull/121644 clean up, make type-safe expect(rule?.execution_summary?.last_execution.status).to.eql('partial failure'); expect(rule?.execution_summary?.last_execution.message).to.eql( - 'This rule is attempting to query data from Elasticsearch indices listed in the "Index pattern" section of the rule definition, however no index matching: ["does-not-exist-*"] was found. This warning will continue to appear until a matching index is created or this rule is de-activated.' + 'This rule is attempting to query data from Elasticsearch indices listed in the "Index pattern" section of the rule definition, however no index matching: ["does-not-exist-*"] was found. This warning will continue to appear until a matching index is created or this rule is disabled.' ); }); From 82f143c2b032108e68c872887254122978e7b2ae Mon Sep 17 00:00:00 2001 From: Brandon Kobel Date: Tue, 1 Mar 2022 08:56:26 -0800 Subject: [PATCH 087/102] Use response-ops GitHub team everywhere, no more alerting services (#126518) * Use response-ops GitHub team everywhere, no more alerting services * Update x-pack/test/plugin_api_integration/plugins/event_log/kibana.json Co-authored-by: Ying Mao Co-authored-by: Ying Mao --- api_docs/actions.mdx | 2 +- api_docs/alerting.mdx | 2 +- api_docs/event_log.mdx | 2 +- api_docs/plugin_directory.mdx | 14 +++++++------- api_docs/stack_alerts.mdx | 2 +- api_docs/task_manager.mdx | 2 +- api_docs/triggers_actions_ui.mdx | 2 +- x-pack/examples/alerting_example/kibana.json | 4 ++-- x-pack/plugins/actions/kibana.json | 4 ++-- x-pack/plugins/alerting/kibana.json | 4 ++-- x-pack/plugins/event_log/kibana.json | 4 ++-- x-pack/plugins/stack_alerts/kibana.json | 4 ++-- x-pack/plugins/task_manager/kibana.json | 4 ++-- x-pack/plugins/triggers_actions_ui/kibana.json | 4 ++-- .../common/fixtures/plugins/aad/kibana.json | 4 ++-- .../plugins/actions_simulators/kibana.json | 4 ++-- .../common/fixtures/plugins/alerts/kibana.json | 4 ++-- .../fixtures/plugins/alerts_restricted/kibana.json | 4 ++-- .../plugins/task_manager_fixture/kibana.json | 4 ++-- .../fixtures/plugins/alerts/kibana.json | 2 +- .../plugins/event_log/kibana.json | 4 ++-- .../plugins/sample_task_plugin/kibana.json | 4 ++-- .../plugins/task_manager_performance/kibana.json | 2 +- 23 files changed, 43 insertions(+), 43 deletions(-) diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index ec19812917d50..8c424176af296 100644 --- a/api_docs/actions.mdx +++ b/api_docs/actions.mdx @@ -12,7 +12,7 @@ import actionsObj from './actions.devdocs.json'; -Contact [Kibana Alerting](https://github.com/orgs/elastic/teams/kibana-alerting-services) for questions regarding this plugin. +Contact [Response Ops](https://github.com/orgs/elastic/teams/response-ops) for questions regarding this plugin. **Code health stats** diff --git a/api_docs/alerting.mdx b/api_docs/alerting.mdx index bad1c9dd0214e..f9c8afc629784 100644 --- a/api_docs/alerting.mdx +++ b/api_docs/alerting.mdx @@ -12,7 +12,7 @@ import alertingObj from './alerting.devdocs.json'; -Contact [Kibana Alerting](https://github.com/orgs/elastic/teams/kibana-alerting-services) for questions regarding this plugin. +Contact [Response Ops](https://github.com/orgs/elastic/teams/response-ops) for questions regarding this plugin. **Code health stats** diff --git a/api_docs/event_log.mdx b/api_docs/event_log.mdx index 1c37cdac9c679..34fe15801fc5c 100644 --- a/api_docs/event_log.mdx +++ b/api_docs/event_log.mdx @@ -12,7 +12,7 @@ import eventLogObj from './event_log.devdocs.json'; -Contact [Kibana Alerting](https://github.com/orgs/elastic/teams/kibana-alerting-services) for questions regarding this plugin. +Contact [Response Ops](https://github.com/orgs/elastic/teams/response-ops) for questions regarding this plugin. **Code health stats** diff --git a/api_docs/plugin_directory.mdx b/api_docs/plugin_directory.mdx index 65a1dd12b0e4a..524c624763ac4 100644 --- a/api_docs/plugin_directory.mdx +++ b/api_docs/plugin_directory.mdx @@ -24,14 +24,14 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Plugin name           | Maintaining team | Description | API Cnt | Any Cnt | Missing
      comments | Missing
      exports | |--------------|----------------|-----------|--------------|----------|---------------|--------| -| | [Kibana Alerting](https://github.com/orgs/elastic/teams/kibana-alerting-services) | - | 125 | 0 | 125 | 11 | +| | [Response Ops](https://github.com/orgs/elastic/teams/response-ops) | - | 125 | 0 | 125 | 11 | | | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-vis-editors) | - | 23 | 0 | 19 | 1 | -| | [Kibana Alerting](https://github.com/orgs/elastic/teams/kibana-alerting-services) | - | 299 | 0 | 291 | 19 | +| | [Response Ops](https://github.com/orgs/elastic/teams/response-ops) | - | 299 | 0 | 291 | 19 | | | [APM UI](https://github.com/orgs/elastic/teams/apm-ui) | The user interface for Elastic APM | 40 | 0 | 40 | 49 | | | [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) | - | 9 | 0 | 9 | 0 | | | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | Considering using bfetch capabilities when fetching large amounts of data. This services supports batching HTTP requests and streaming responses back. | 78 | 1 | 69 | 2 | | | [Kibana Presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds Canvas application to Kibana | 9 | 0 | 8 | 3 | -| | [ResponseOps](https://github.com/orgs/elastic/teams/response-ops) | The Case management system in Kibana | 82 | 0 | 59 | 20 | +| | [Response Ops](https://github.com/orgs/elastic/teams/response-ops) | The Case management system in Kibana | 82 | 0 | 59 | 20 | | | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-vis-editors) | - | 321 | 2 | 288 | 4 | | | [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) | - | 28 | 0 | 23 | 0 | | | [Stack Management](https://github.com/orgs/elastic/teams/kibana-stack-management) | - | 13 | 0 | 13 | 1 | @@ -56,7 +56,7 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | | [Platform Security](https://github.com/orgs/elastic/teams/kibana-security) | This plugin provides encryption and decryption utilities for saved objects containing sensitive information. | 48 | 0 | 44 | 0 | | | [Enterprise Search](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | Adds dashboards for discovering and managing Enterprise Search products. | 2 | 0 | 2 | 0 | | | [Stack Management](https://github.com/orgs/elastic/teams/kibana-stack-management) | - | 110 | 3 | 106 | 3 | -| | [Kibana Alerting](https://github.com/orgs/elastic/teams/kibana-alerting-services) | - | 82 | 0 | 82 | 6 | +| | [Response Ops](https://github.com/orgs/elastic/teams/response-ops) | - | 82 | 0 | 82 | 6 | | | [Kibana Presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds 'error' renderer to expressions | 17 | 0 | 15 | 2 | | | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-vis-editors) | Expression Gauge plugin adds a `gauge` renderer and function to the expression plugin. The renderer will display the `gauge` chart. | 68 | 0 | 68 | 3 | | | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-vis-editors) | Expression Heatmap plugin adds a `heatmap` renderer and function to the expression plugin. The renderer will display the `heatmap` chart. | 114 | 0 | 110 | 3 | @@ -126,8 +126,8 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | | [Shared UX](https://github.com/orgs/elastic/teams/shared-ux) | A plugin providing components and services for shared user experiences in Kibana. | 14 | 0 | 0 | 1 | | | [Stack Management](https://github.com/orgs/elastic/teams/kibana-stack-management) | - | 21 | 1 | 21 | 1 | | | [Platform 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. | 250 | 0 | 61 | 0 | -| | [Kibana Alerting](https://github.com/orgs/elastic/teams/kibana-alerting-services) | - | 4 | 0 | 4 | 0 | -| | [Kibana Alerting](https://github.com/orgs/elastic/teams/kibana-alerting-services) | - | 71 | 0 | 33 | 7 | +| | [Response Ops](https://github.com/orgs/elastic/teams/response-ops) | - | 4 | 0 | 4 | 0 | +| | [Response Ops](https://github.com/orgs/elastic/teams/response-ops) | - | 71 | 0 | 33 | 7 | | | [Kibana Telemetry](https://github.com/orgs/elastic/teams/kibana-telemetry) | - | 41 | 0 | 0 | 0 | | | [Kibana Telemetry](https://github.com/orgs/elastic/teams/kibana-telemetry) | - | 33 | 0 | 33 | 6 | | | [Kibana Telemetry](https://github.com/orgs/elastic/teams/kibana-telemetry) | - | 1 | 0 | 1 | 0 | @@ -135,7 +135,7 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | | [Security solution](https://github.com/orgs/elastic/teams/security-solution) | - | 444 | 1 | 338 | 34 | | | [Machine Learning 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 | | translations | [Kibana Localization](https://github.com/orgs/elastic/teams/kibana-localization) | - | 0 | 0 | 0 | 0 | -| | [Kibana Alerting](https://github.com/orgs/elastic/teams/kibana-alerting-services) | - | 246 | 0 | 234 | 20 | +| | [Response Ops](https://github.com/orgs/elastic/teams/response-ops) | - | 246 | 0 | 234 | 20 | | | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | Adds UI Actions service to Kibana | 130 | 0 | 91 | 11 | | | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | Extends UI Actions plugin with more functionality | 203 | 0 | 141 | 9 | | upgradeAssistant | [Stack Management](https://github.com/orgs/elastic/teams/kibana-stack-management) | - | 0 | 0 | 0 | 0 | diff --git a/api_docs/stack_alerts.mdx b/api_docs/stack_alerts.mdx index 765a402c7ab27..c14cf169d0b7d 100644 --- a/api_docs/stack_alerts.mdx +++ b/api_docs/stack_alerts.mdx @@ -12,7 +12,7 @@ import stackAlertsObj from './stack_alerts.devdocs.json'; -Contact [Kibana Alerting](https://github.com/orgs/elastic/teams/kibana-alerting-services) for questions regarding this plugin. +Contact [Response Ops](https://github.com/orgs/elastic/teams/response-ops) for questions regarding this plugin. **Code health stats** diff --git a/api_docs/task_manager.mdx b/api_docs/task_manager.mdx index 96ba8428e04dd..329f94578041c 100644 --- a/api_docs/task_manager.mdx +++ b/api_docs/task_manager.mdx @@ -12,7 +12,7 @@ import taskManagerObj from './task_manager.devdocs.json'; -Contact [Kibana Alerting](https://github.com/orgs/elastic/teams/kibana-alerting-services) for questions regarding this plugin. +Contact [Response Ops](https://github.com/orgs/elastic/teams/response-ops) for questions regarding this plugin. **Code health stats** diff --git a/api_docs/triggers_actions_ui.mdx b/api_docs/triggers_actions_ui.mdx index 23abdccc81e78..6eb7cf35af149 100644 --- a/api_docs/triggers_actions_ui.mdx +++ b/api_docs/triggers_actions_ui.mdx @@ -12,7 +12,7 @@ import triggersActionsUiObj from './triggers_actions_ui.devdocs.json'; -Contact [Kibana Alerting](https://github.com/orgs/elastic/teams/kibana-alerting-services) for questions regarding this plugin. +Contact [Response Ops](https://github.com/orgs/elastic/teams/response-ops) for questions regarding this plugin. **Code health stats** diff --git a/x-pack/examples/alerting_example/kibana.json b/x-pack/examples/alerting_example/kibana.json index 13117713a9a7e..dabf932b5e68d 100644 --- a/x-pack/examples/alerting_example/kibana.json +++ b/x-pack/examples/alerting_example/kibana.json @@ -3,8 +3,8 @@ "version": "0.0.1", "kibanaVersion": "kibana", "owner": { - "name": "Kibana Alerting", - "githubTeam": "kibana-alerting-services" + "name": "Response Ops", + "githubTeam": "response-ops" }, "server": true, "ui": true, diff --git a/x-pack/plugins/actions/kibana.json b/x-pack/plugins/actions/kibana.json index aa3a9f3f6c34c..4e928fafc4d50 100644 --- a/x-pack/plugins/actions/kibana.json +++ b/x-pack/plugins/actions/kibana.json @@ -1,8 +1,8 @@ { "id": "actions", "owner": { - "name": "Kibana Alerting", - "githubTeam": "kibana-alerting-services" + "name": "Response Ops", + "githubTeam": "response-ops" }, "server": true, "version": "8.0.0", diff --git a/x-pack/plugins/alerting/kibana.json b/x-pack/plugins/alerting/kibana.json index 82d8de0daf14a..90db7885de812 100644 --- a/x-pack/plugins/alerting/kibana.json +++ b/x-pack/plugins/alerting/kibana.json @@ -3,8 +3,8 @@ "server": true, "ui": true, "owner": { - "name": "Kibana Alerting", - "githubTeam": "kibana-alerting-services" + "name": "Response Ops", + "githubTeam": "response-ops" }, "version": "8.0.0", "kibanaVersion": "kibana", diff --git a/x-pack/plugins/event_log/kibana.json b/x-pack/plugins/event_log/kibana.json index 5223549a2e4fb..c437667512cde 100644 --- a/x-pack/plugins/event_log/kibana.json +++ b/x-pack/plugins/event_log/kibana.json @@ -3,8 +3,8 @@ "version": "0.0.1", "kibanaVersion": "kibana", "owner": { - "name": "Kibana Alerting", - "githubTeam": "kibana-alerting-services" + "name": "Response Ops", + "githubTeam": "response-ops" }, "configPath": ["xpack", "eventLog"], "optionalPlugins": ["spaces"], diff --git a/x-pack/plugins/stack_alerts/kibana.json b/x-pack/plugins/stack_alerts/kibana.json index acd9dcb374d10..f70ad679deefd 100644 --- a/x-pack/plugins/stack_alerts/kibana.json +++ b/x-pack/plugins/stack_alerts/kibana.json @@ -1,8 +1,8 @@ { "id": "stackAlerts", "owner": { - "name": "Kibana Alerting", - "githubTeam": "kibana-alerting-services" + "name": "Response Ops", + "githubTeam": "response-ops" }, "server": true, "version": "8.2.0", diff --git a/x-pack/plugins/task_manager/kibana.json b/x-pack/plugins/task_manager/kibana.json index 3c28df441a0ab..98ca8e115f767 100644 --- a/x-pack/plugins/task_manager/kibana.json +++ b/x-pack/plugins/task_manager/kibana.json @@ -3,8 +3,8 @@ "server": true, "version": "8.2.0", "owner": { - "name": "Kibana Alerting", - "githubTeam": "kibana-alerting-services" + "name": "Response Ops", + "githubTeam": "response-ops" }, "kibanaVersion": "kibana", "configPath": ["xpack", "task_manager"], diff --git a/x-pack/plugins/triggers_actions_ui/kibana.json b/x-pack/plugins/triggers_actions_ui/kibana.json index b72a7fe96817d..b7b918aff946f 100644 --- a/x-pack/plugins/triggers_actions_ui/kibana.json +++ b/x-pack/plugins/triggers_actions_ui/kibana.json @@ -1,8 +1,8 @@ { "id": "triggersActionsUi", "owner": { - "name": "Kibana Alerting", - "githubTeam": "kibana-alerting-services" + "name": "Response Ops", + "githubTeam": "response-ops" }, "version": "kibana", "server": true, diff --git a/x-pack/test/alerting_api_integration/common/fixtures/plugins/aad/kibana.json b/x-pack/test/alerting_api_integration/common/fixtures/plugins/aad/kibana.json index 7dea652f7f9bb..1036cee74da62 100644 --- a/x-pack/test/alerting_api_integration/common/fixtures/plugins/aad/kibana.json +++ b/x-pack/test/alerting_api_integration/common/fixtures/plugins/aad/kibana.json @@ -1,8 +1,8 @@ { "id": "aadFixtures", "owner": { - "name": "Alerting Services", - "githubTeam": "kibana-alerting-services" + "name": "Response Ops", + "githubTeam": "response-ops" }, "version": "1.0.0", "kibanaVersion": "kibana", diff --git a/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators/kibana.json b/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators/kibana.json index 5a76689f96d38..f007886f09aca 100644 --- a/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators/kibana.json +++ b/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators/kibana.json @@ -1,8 +1,8 @@ { "id": "actionsSimulators", "owner": { - "name": "Alerting Services", - "githubTeam": "kibana-alerting-services" + "name": "Response Ops", + "githubTeam": "response-ops" }, "version": "1.0.0", "kibanaVersion": "kibana", diff --git a/x-pack/test/alerting_api_integration/common/fixtures/plugins/alerts/kibana.json b/x-pack/test/alerting_api_integration/common/fixtures/plugins/alerts/kibana.json index 22ccd552762f5..e241028ec6977 100644 --- a/x-pack/test/alerting_api_integration/common/fixtures/plugins/alerts/kibana.json +++ b/x-pack/test/alerting_api_integration/common/fixtures/plugins/alerts/kibana.json @@ -1,8 +1,8 @@ { "id": "alertsFixtures", "owner": { - "name": "Alerting Services", - "githubTeam": "kibana-alerting-services" + "name": "Response Ops", + "githubTeam": "response-ops" }, "version": "1.0.0", "kibanaVersion": "kibana", diff --git a/x-pack/test/alerting_api_integration/common/fixtures/plugins/alerts_restricted/kibana.json b/x-pack/test/alerting_api_integration/common/fixtures/plugins/alerts_restricted/kibana.json index 206acd533b266..6c7ee636c35ad 100644 --- a/x-pack/test/alerting_api_integration/common/fixtures/plugins/alerts_restricted/kibana.json +++ b/x-pack/test/alerting_api_integration/common/fixtures/plugins/alerts_restricted/kibana.json @@ -1,8 +1,8 @@ { "id": "alertsRestrictedFixtures", "owner": { - "name": "Alerting Services", - "githubTeam": "kibana-alerting-services" + "name": "Response Ops", + "githubTeam": "response-ops" }, "version": "1.0.0", "kibanaVersion": "kibana", diff --git a/x-pack/test/alerting_api_integration/common/fixtures/plugins/task_manager_fixture/kibana.json b/x-pack/test/alerting_api_integration/common/fixtures/plugins/task_manager_fixture/kibana.json index 8adfa8d57e72b..79d04d29954c1 100644 --- a/x-pack/test/alerting_api_integration/common/fixtures/plugins/task_manager_fixture/kibana.json +++ b/x-pack/test/alerting_api_integration/common/fixtures/plugins/task_manager_fixture/kibana.json @@ -1,8 +1,8 @@ { "id": "taskManagerFixture", "owner": { - "name": "Alerting Services", - "githubTeam": "kibana-alerting-services" + "name": "Response Ops", + "githubTeam": "response-ops" }, "version": "1.0.0", "kibanaVersion": "kibana", diff --git a/x-pack/test/functional_with_es_ssl/fixtures/plugins/alerts/kibana.json b/x-pack/test/functional_with_es_ssl/fixtures/plugins/alerts/kibana.json index 8c798aa3fbe0a..2dd7fcc0c4986 100644 --- a/x-pack/test/functional_with_es_ssl/fixtures/plugins/alerts/kibana.json +++ b/x-pack/test/functional_with_es_ssl/fixtures/plugins/alerts/kibana.json @@ -1,6 +1,6 @@ { "id": "alertingFixture", - "owner": { "name": "Alerting Services", "githubTeam": "kibana-alerting-services" }, + "owner": { "name": "Response Ops", "githubTeam": "response-ops" }, "version": "1.0.0", "kibanaVersion": "kibana", "requiredPlugins": ["alerting", "triggersActionsUi", "features"], diff --git a/x-pack/test/plugin_api_integration/plugins/event_log/kibana.json b/x-pack/test/plugin_api_integration/plugins/event_log/kibana.json index 42cfa0f766e3e..2117704cbef8d 100644 --- a/x-pack/test/plugin_api_integration/plugins/event_log/kibana.json +++ b/x-pack/test/plugin_api_integration/plugins/event_log/kibana.json @@ -1,8 +1,8 @@ { "id": "eventLogFixture", "owner": { - "name": "Kibana Alerting", - "githubTeam": "kibana-alerting-services" + "name": "Response Ops", + "githubTeam": "response-ops" }, "version": "1.0.0", "kibanaVersion": "kibana", diff --git a/x-pack/test/plugin_api_integration/plugins/sample_task_plugin/kibana.json b/x-pack/test/plugin_api_integration/plugins/sample_task_plugin/kibana.json index 0171004f1c7b5..151e49c08016c 100644 --- a/x-pack/test/plugin_api_integration/plugins/sample_task_plugin/kibana.json +++ b/x-pack/test/plugin_api_integration/plugins/sample_task_plugin/kibana.json @@ -1,8 +1,8 @@ { "id": "sampleTaskPlugin", "owner": { - "name": "Alerting Services", - "githubTeam": "kibana-alerting-services" + "name": "Response Ops", + "githubTeam": "response-ops" }, "version": "1.0.0", "kibanaVersion": "kibana", diff --git a/x-pack/test/plugin_api_perf/plugins/task_manager_performance/kibana.json b/x-pack/test/plugin_api_perf/plugins/task_manager_performance/kibana.json index 995427773ad92..b7fad9c245313 100644 --- a/x-pack/test/plugin_api_perf/plugins/task_manager_performance/kibana.json +++ b/x-pack/test/plugin_api_perf/plugins/task_manager_performance/kibana.json @@ -1,6 +1,6 @@ { "id": "taskManagerPerformance", - "owner": { "name": "Alerting Services", "githubTeam": "kibana-alerting-services" }, + "owner": { "name": "Response Ops", "githubTeam": "response-ops" }, "version": "1.0.0", "kibanaVersion": "kibana", "requiredPlugins": ["taskManager"], From 7f364ea1740df41c5b05ea3851220ccbee5c0b25 Mon Sep 17 00:00:00 2001 From: Shan Wong <52825514+shanwong29@users.noreply.github.com> Date: Tue, 1 Mar 2022 18:03:43 +0100 Subject: [PATCH 088/102] [Ingest Pipelines] Fix dot expander processor to accept wildcard (#122508) (#123522) --- .../__jest__/processors/dot_expander.test.tsx | 23 +++++++++++++++-- .../processors/dot_expander.tsx | 8 ++++-- .../shared/map_processor_type_to_form.tsx | 25 +++++++++++++------ .../translations/translations/ja-JP.json | 1 - .../translations/translations/zh-CN.json | 1 - 5 files changed, 45 insertions(+), 13 deletions(-) diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/__jest__/processors/dot_expander.test.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/__jest__/processors/dot_expander.test.tsx index 75468f31b1a54..eb93f4ea86449 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/__jest__/processors/dot_expander.test.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/__jest__/processors/dot_expander.test.tsx @@ -56,7 +56,7 @@ describe('Processor: Dot Expander', () => { expect(form.getErrorsMessages()).toEqual(['A field value is required.']); }); - test('prevents form submission if field does not contain a . for the dot notation', async () => { + test('prevents form submission if field for the dot notation does not contain a . and not equal to *', async () => { const { actions: { saveNewProcessor }, form, @@ -77,9 +77,28 @@ describe('Processor: Dot Expander', () => { // Expect form error as "field" does not contain '.' expect(form.getErrorsMessages()).toEqual([ - 'A field value requires at least one dot character.', + 'The field name must be an asterisk or contain a dot character.', ]); }); + + test('allows form submission if the field for the dot notation is equal to *', async () => { + const { + actions: { saveNewProcessor }, + form, + } = testBed; + + // Set "field" value to a * for expanding all top-level dotted field names + form.setInputValue('fieldNameField.input', '*'); + + // Save the field + await saveNewProcessor(); + + const processors = getProcessorValue(onUpdate, DOT_EXPANDER_TYPE); + expect(processors[0][DOT_EXPANDER_TYPE]).toEqual({ + field: '*', + }); + }); + test('saves with default parameter values', async () => { const { actions: { saveNewProcessor }, diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/processor_form/processors/dot_expander.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/processor_form/processors/dot_expander.tsx index c66633dfd23d5..0d82fadbc026e 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/processor_form/processors/dot_expander.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/processor_form/processors/dot_expander.tsx @@ -40,11 +40,15 @@ export const DotExpander: FunctionComponent = () => { { validator: ({ value }) => { if (typeof value === 'string' && value.length) { - return !value.includes('.') + const allowedPattern = value.includes('.') || value === '*'; + return !allowedPattern ? { message: i18n.translate( 'xpack.ingestPipelines.pipelineEditor.dotExpanderForm.fieldNameRequiresDotError', - { defaultMessage: 'A field value requires at least one dot character.' } + { + defaultMessage: + 'The field name must be an asterisk or contain a dot character.', + } ), } : undefined; diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/shared/map_processor_type_to_form.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/shared/map_processor_type_to_form.tsx index d02aa4fc3fc05..d47f90abbd36d 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/shared/map_processor_type_to_form.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/shared/map_processor_type_to_form.tsx @@ -256,13 +256,24 @@ export const mapProcessorTypeToDescriptor: MapProcessorTypeToDescriptor = { defaultMessage: 'Expands a field containing dot notation into an object field. The object field is then accessible by other processors in the pipeline.', }), - getDefaultDescription: ({ field }) => - i18n.translate('xpack.ingestPipelines.processors.defaultDescription.dot_expander', { - defaultMessage: 'Expands "{field}" into an object field', - values: { - field, - }, - }), + getDefaultDescription: ({ field }) => { + return field === '*' + ? i18n.translate( + 'xpack.ingestPipelines.processors.defaultDescription.dot_expander.wildcard', + { + defaultMessage: 'All top-level fields will be expanded', + } + ) + : i18n.translate( + 'xpack.ingestPipelines.processors.defaultDescription.dot_expander.dot_notation', + { + defaultMessage: 'Expands "{field}" into an object field', + values: { + field, + }, + } + ); + }, }, drop: { FieldsComponent: Drop, diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index eb30528500fd9..2b1aeea6e4f7d 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -15712,7 +15712,6 @@ "xpack.ingestPipelines.processors.defaultDescription.dateIndexName.indexNamePrefixDefault.noPrefixValueLabel": "プレフィックスなし", "xpack.ingestPipelines.processors.defaultDescription.dateIndexName.indexNamePrefixDefault.prefixValueLabel": "プレフィックス\"{prefix}\"を使用", "xpack.ingestPipelines.processors.defaultDescription.dissect": "分離したパターンと一致する値を\"{field}\"から抽出します", - "xpack.ingestPipelines.processors.defaultDescription.dot_expander": "\"{field}\"をオブジェクトフィールドに拡張します", "xpack.ingestPipelines.processors.defaultDescription.drop": "エラーを返さずにドキュメントを破棄します", "xpack.ingestPipelines.processors.defaultDescription.enrich": "\"{policy_name}\"ポリシーが\"{field}\"と一致した場合に、データを\"{target_field}\"に改善します", "xpack.ingestPipelines.processors.defaultDescription.fail": "実行を停止する例外を発生させます", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index d26414df7e496..bfb22faf1316b 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -15736,7 +15736,6 @@ "xpack.ingestPipelines.processors.defaultDescription.dateIndexName.indexNamePrefixDefault.noPrefixValueLabel": "无前缀", "xpack.ingestPipelines.processors.defaultDescription.dateIndexName.indexNamePrefixDefault.prefixValueLabel": "带前缀“{prefix}”", "xpack.ingestPipelines.processors.defaultDescription.dissect": "从“{field}”提取匹配分解模式的值", - "xpack.ingestPipelines.processors.defaultDescription.dot_expander": "将“{field}”扩展成对象字段", "xpack.ingestPipelines.processors.defaultDescription.drop": "丢弃文档而不返回错误", "xpack.ingestPipelines.processors.defaultDescription.enrich": "如果策略“{policy_name}”匹配“{field}”,将数据扩充到“{target_field}”", "xpack.ingestPipelines.processors.defaultDescription.fail": "引发使执行停止的异常", From 058ad18b8b7d0823929295433aabc924a0ef0ef8 Mon Sep 17 00:00:00 2001 From: Melissa Alvarez Date: Tue, 1 Mar 2022 10:29:22 -0700 Subject: [PATCH 089/102] [ML] Maps integration: adds influencers to tooltip in anomalies layer (#126007) * adds influencers to tooltip * do not add to tooltip if already partition field * adds unit test for influencer string function * add unit test for getResultsForJobId --- .../ml/public/maps/anomaly_source_field.ts | 6 + .../plugins/ml/public/maps/maps_util.test.js | 90 ++++++++++ .../ml/public/maps/results.test.mock.ts | 160 ++++++++++++++++++ x-pack/plugins/ml/public/maps/util.ts | 51 +++++- 4 files changed, 301 insertions(+), 6 deletions(-) create mode 100644 x-pack/plugins/ml/public/maps/maps_util.test.js create mode 100644 x-pack/plugins/ml/public/maps/results.test.mock.ts diff --git a/x-pack/plugins/ml/public/maps/anomaly_source_field.ts b/x-pack/plugins/ml/public/maps/anomaly_source_field.ts index bc03363970893..ac60cb3b54fb5 100644 --- a/x-pack/plugins/ml/public/maps/anomaly_source_field.ts +++ b/x-pack/plugins/ml/public/maps/anomaly_source_field.ts @@ -98,6 +98,12 @@ export const ANOMALY_SOURCE_FIELDS: Record> = { }), type: 'string', }, + influencers: { + label: i18n.translate('xpack.ml.maps.anomalyLayerInfluencersLabel', { + defaultMessage: 'Influencers', + }), + type: 'string', + }, }; export class AnomalySourceTooltipProperty implements ITooltipProperty { diff --git a/x-pack/plugins/ml/public/maps/maps_util.test.js b/x-pack/plugins/ml/public/maps/maps_util.test.js new file mode 100644 index 0000000000000..dd6fde9e8b28c --- /dev/null +++ b/x-pack/plugins/ml/public/maps/maps_util.test.js @@ -0,0 +1,90 @@ +/* + * 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 { getInfluencersHtmlString, getResultsForJobId } from './util'; +import { + mlResultsServiceMock, + typicalExpected, + actualExpected, + typicalToActualExpected, +} from './results.test.mock'; + +describe('Maps util', () => { + describe('getInfluencersHtmlString', () => { + const splitField = 'split_field_influencer'; + const valueFour = 'value_four'; + const influencerFour = 'influencer_four'; + const influencers = [ + { + influencer_field_name: 'influencer_one', + influencer_field_values: ['value_one', 'value_two', 'value_three', valueFour], + }, + { + influencer_field_name: 'influencer_two', + influencer_field_values: ['value_one', 'value_two', 'value_three', valueFour], + }, + { + influencer_field_name: splitField, + influencer_field_values: ['value_one', 'value_two'], + }, + { + influencer_field_name: 'influencer_three', + influencer_field_values: ['value_one', 'value_two', 'value_three', valueFour], + }, + { + influencer_field_name: influencerFour, + influencer_field_values: ['value_one', 'value_two', 'value_three', valueFour], + }, + ]; + + test('should create the html string when given an array of influencers', () => { + const expected = + '
      • influencer_one: value_one, value_two, value_three
      • influencer_two: value_one, value_two, value_three
      • influencer_three: value_one, value_two, value_three
      '; + const actual = getInfluencersHtmlString(influencers, splitField); + expect(actual).toBe(expected); + // Should not include split field + expect(actual.includes(splitField)).toBe(false); + // should limit to the first three influencer values + expect(actual.includes(valueFour)).toBe(false); + // should limit to the first three influencer names + expect(actual.includes(influencerFour)).toBe(false); + }); + }); + + describe('getResultsForJobId', () => { + const jobId = 'jobId'; + const searchFilters = { + timeFilters: { from: 'now-2y', to: 'now' }, + query: { language: 'kuery', query: '' }, + }; + + test('should get map features from job anomalies results for typical layer', async () => { + const actual = await getResultsForJobId( + mlResultsServiceMock, + jobId, + 'typical', + searchFilters + ); + expect(actual).toEqual(typicalExpected); + }); + + test('should get map features from job anomalies results for actual layer', async () => { + const actual = await getResultsForJobId(mlResultsServiceMock, jobId, 'actual', searchFilters); + expect(actual).toEqual(actualExpected); + }); + + test('should get map features from job anomalies results for "typical to actual" layer', async () => { + const actual = await getResultsForJobId( + mlResultsServiceMock, + jobId, + 'typical to actual', + searchFilters + ); + expect(actual).toEqual(typicalToActualExpected); + }); + }); +}); diff --git a/x-pack/plugins/ml/public/maps/results.test.mock.ts b/x-pack/plugins/ml/public/maps/results.test.mock.ts new file mode 100644 index 0000000000000..f718e818ba73c --- /dev/null +++ b/x-pack/plugins/ml/public/maps/results.test.mock.ts @@ -0,0 +1,160 @@ +/* + * 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. + */ + +const results = { + took: 9, + timed_out: false, + _shards: { + total: 1, + successful: 1, + skipped: 0, + failed: 0, + }, + hits: { + total: { + value: 19, + relation: 'eq', + }, + max_score: 4.4813457, + hits: [ + { + _index: '.ml-anomalies-shared', + _id: 'test-tooltip-one_record_1645974000000_900_0_0_0', + _score: 4.4813457, + _source: { + job_id: 'test-tooltip-one', + result_type: 'record', + probability: 0.00042878057629659614, + multi_bucket_impact: -5, + record_score: 77.74620142126848, + initial_record_score: 77.74620142126848, + bucket_span: 900, + detector_index: 0, + is_interim: false, + timestamp: 1645974000000, + function: 'lat_long', + function_description: 'lat_long', + typical: [39.9864616394043, -97.862548828125], + actual: [29.261693651787937, -121.93940273718908], + field_name: 'geo.coordinates', + influencers: [ + { + influencer_field_name: 'geo.dest', + influencer_field_values: ['CN', 'DO', 'RU', 'US'], + }, + { + influencer_field_name: 'clientip', + influencer_field_values: [ + '108.131.25.207', + '192.41.143.247', + '194.12.201.131', + '41.91.106.242', + ], + }, + { + influencer_field_name: 'agent.keyword', + influencer_field_values: [ + 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)', + 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.50 Safari/534.24', + 'Mozilla/5.0 (X11; Linux x86_64; rv:6.0a1) Gecko/20110421 Firefox/6.0a1', + ], + }, + ], + geo_results: { + typical_point: '39.986461639404,-97.862548828125', + actual_point: '29.261693651788,-121.939402737189', + }, + 'geo.dest': ['CN', 'DO', 'RU', 'US'], + 'agent.keyword': [ + 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)', + 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.50 Safari/534.24', + 'Mozilla/5.0 (X11; Linux x86_64; rv:6.0a1) Gecko/20110421 Firefox/6.0a1', + ], + clientip: ['108.131.25.207', '192.41.143.247', '194.12.201.131', '41.91.106.242'], + }, + }, + ], + }, +}; + +export const typicalExpected = { + features: [ + { + geometry: { coordinates: [-97.862548828125, 39.986461639404], type: 'Point' }, + properties: { + actual: [-121.939402737189, 29.261693651788], + actualDisplay: [-121.94, 29.26], + fieldName: 'geo.coordinates', + functionDescription: 'lat_long', + influencers: + '
      • geo.dest: CN, DO, RU
      • clientip: 108.131.25.207, 192.41.143.247, 194.12.201.131
      • agent.keyword: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322), Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.50 Safari/534.24, Mozilla/5.0 (X11; Linux x86_64; rv:6.0a1) Gecko/20110421 Firefox/6.0a1
      ', + record_score: 77, + timestamp: 'February 27th 2022, 10:00:00', + typical: [-97.862548828125, 39.986461639404], + typicalDisplay: [-97.86, 39.99], + }, + type: 'Feature', + }, + ], + type: 'FeatureCollection', +}; + +export const actualExpected = { + type: 'FeatureCollection', + features: [ + { + type: 'Feature', + geometry: { + type: 'Point', + coordinates: [-121.939402737189, 29.261693651788], + }, + properties: { + actual: [-121.939402737189, 29.261693651788], + actualDisplay: [-121.94, 29.26], + typical: [-97.862548828125, 39.986461639404], + typicalDisplay: [-97.86, 39.99], + fieldName: 'geo.coordinates', + functionDescription: 'lat_long', + timestamp: 'February 27th 2022, 10:00:00', + record_score: 77, + influencers: + '
      • geo.dest: CN, DO, RU
      • clientip: 108.131.25.207, 192.41.143.247, 194.12.201.131
      • agent.keyword: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322), Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.50 Safari/534.24, Mozilla/5.0 (X11; Linux x86_64; rv:6.0a1) Gecko/20110421 Firefox/6.0a1
      ', + }, + }, + ], +}; +export const typicalToActualExpected = { + type: 'FeatureCollection', + features: [ + { + type: 'Feature', + geometry: { + type: 'LineString', + coordinates: [ + [-97.862548828125, 39.986461639404], + [-121.939402737189, 29.261693651788], + ], + }, + properties: { + actual: [-121.939402737189, 29.261693651788], + actualDisplay: [-121.94, 29.26], + typical: [-97.862548828125, 39.986461639404], + typicalDisplay: [-97.86, 39.99], + fieldName: 'geo.coordinates', + functionDescription: 'lat_long', + timestamp: 'February 27th 2022, 10:00:00', + record_score: 77, + influencers: + '
      • geo.dest: CN, DO, RU
      • clientip: 108.131.25.207, 192.41.143.247, 194.12.201.131
      • agent.keyword: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322), Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.50 Safari/534.24, Mozilla/5.0 (X11; Linux x86_64; rv:6.0a1) Gecko/20110421 Firefox/6.0a1
      ', + }, + }, + ], +}; + +export const mlResultsServiceMock = { + anomalySearch: () => results, +}; diff --git a/x-pack/plugins/ml/public/maps/util.ts b/x-pack/plugins/ml/public/maps/util.ts index df731f4bb309a..11e6b6f5a3920 100644 --- a/x-pack/plugins/ml/public/maps/util.ts +++ b/x-pack/plugins/ml/public/maps/util.ts @@ -23,6 +23,34 @@ export const ML_ANOMALY_LAYERS = { } as const; export type MlAnomalyLayersType = typeof ML_ANOMALY_LAYERS[keyof typeof ML_ANOMALY_LAYERS]; +const INFLUENCER_LIMIT = 3; +const INFLUENCER_MAX_VALUES = 3; + +export function getInfluencersHtmlString( + influencers: Array<{ influencer_field_name: string; influencer_field_values: string[] }>, + splitFields: string[] +) { + let htmlString = '
        '; + let influencerCount = 0; + for (let i = 0; i < influencers.length; i++) { + // eslint-disable-next-line @typescript-eslint/naming-convention + const { influencer_field_name, influencer_field_values } = influencers[i]; + // Skip if there are no values or it's a partition field + if (!influencer_field_values.length || splitFields.includes(influencer_field_name)) continue; + + const fieldValuesString = influencer_field_values.slice(0, INFLUENCER_MAX_VALUES).join(', '); + + htmlString += `
      • ${influencer_field_name}: ${fieldValuesString}
      • `; + influencerCount += 1; + + if (influencerCount === INFLUENCER_LIMIT) { + break; + } + } + htmlString += '
      '; + + return htmlString; +} // Must reverse coordinates here. Map expects [lon, lat] - anomalies are stored as [lat, lon] for lat_lon jobs function getCoordinates(actualCoordinateStr: string, round: boolean = false): number[] { @@ -136,6 +164,15 @@ export async function getResultsForJobId( coordinates: [typical, actual], }; } + + const splitFields = { + ...(_source.partition_field_name + ? { [_source.partition_field_name]: _source.partition_field_value } + : {}), + ...(_source.by_field_name ? { [_source.by_field_name]: _source.by_field_value } : {}), + ...(_source.over_field_name ? { [_source.over_field_name]: _source.over_field_value } : {}), + }; + return { type: 'Feature', geometry, @@ -148,12 +185,14 @@ export async function getResultsForJobId( functionDescription: _source.function_description, timestamp: formatHumanReadableDateTimeSeconds(_source.timestamp), record_score: Math.floor(_source.record_score), - ...(_source.partition_field_name - ? { [_source.partition_field_name]: _source.partition_field_value } - : {}), - ...(_source.by_field_name ? { [_source.by_field_name]: _source.by_field_value } : {}), - ...(_source.over_field_name - ? { [_source.over_field_name]: _source.over_field_value } + ...(Object.keys(splitFields).length > 0 ? splitFields : {}), + ...(_source.influencers?.length + ? { + influencers: getInfluencersHtmlString( + _source.influencers, + Object.keys(splitFields) + ), + } : {}), }, }; From f886a7b532f8980091808b2af7011fc787d32a61 Mon Sep 17 00:00:00 2001 From: Giorgos Bamparopoulos Date: Tue, 1 Mar 2022 17:36:42 +0000 Subject: [PATCH 090/102] [APM] Remove beta badge for AWS lambda (#126596) * Remove beta badge for AWS lambda --- .../shared/service_icons/cloud_details.tsx | 35 ++----------------- .../translations/translations/ja-JP.json | 2 -- .../translations/translations/zh-CN.json | 2 -- 3 files changed, 2 insertions(+), 37 deletions(-) diff --git a/x-pack/plugins/apm/public/components/shared/service_icons/cloud_details.tsx b/x-pack/plugins/apm/public/components/shared/service_icons/cloud_details.tsx index 91780fec15845..b5e4013d08ecb 100644 --- a/x-pack/plugins/apm/public/components/shared/service_icons/cloud_details.tsx +++ b/x-pack/plugins/apm/public/components/shared/service_icons/cloud_details.tsx @@ -5,13 +5,7 @@ * 2.0. */ -import { - EuiBadge, - EuiDescriptionList, - EuiBetaBadge, - EuiFlexGroup, - EuiFlexItem, -} from '@elastic/eui'; +import { EuiBadge, EuiDescriptionList } from '@elastic/eui'; import { EuiDescriptionListProps } from '@elastic/eui/src/components/description_list/description_list'; import { i18n } from '@kbn/i18n'; import React from 'react'; @@ -51,32 +45,7 @@ export function CloudDetails({ cloud, isServerless }: Props) { defaultMessage: 'Cloud service', } ), - description: ( - - {cloud.serviceName} - {isServerless && ( - - - - )} - - ), + description: cloud.serviceName, }); } diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 2b1aeea6e4f7d..263a760a9d797 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -7295,8 +7295,6 @@ "xpack.apm.serviceIcons.serverless": "サーバーレス", "xpack.apm.serviceIcons.service": "サービス", "xpack.apm.serviceIcons.serviceDetails.cloud.availabilityZoneLabel": "{zones, plural, other {可用性ゾーン}} ", - "xpack.apm.serviceIcons.serviceDetails.cloud.betaLabel": "ベータ", - "xpack.apm.serviceIcons.serviceDetails.cloud.betaTooltip": "AWS Lambdaサポートは一般公開されていません。不具合を報告して支援してください。", "xpack.apm.serviceIcons.serviceDetails.cloud.faasTriggerTypeLabel": "{triggerTypes, plural, other {トリガータイプ}} ", "xpack.apm.serviceIcons.serviceDetails.cloud.functionNameLabel": "{functionNames, plural, other {関数名}} ", "xpack.apm.serviceIcons.serviceDetails.cloud.machineTypesLabel": "{machineTypes, plural, other {コンピュータータイプ} }\n ", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index bfb22faf1316b..a3a5ba1a83dc6 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -7312,8 +7312,6 @@ "xpack.apm.serviceIcons.serverless": "无服务器", "xpack.apm.serviceIcons.service": "服务", "xpack.apm.serviceIcons.serviceDetails.cloud.availabilityZoneLabel": "{zones, plural, other {可用性区域}} ", - "xpack.apm.serviceIcons.serviceDetails.cloud.betaLabel": "公测版", - "xpack.apm.serviceIcons.serviceDetails.cloud.betaTooltip": "AWS Lambda 支持不是 GA 版。请通过报告错误来帮助我们。", "xpack.apm.serviceIcons.serviceDetails.cloud.faasTriggerTypeLabel": "{triggerTypes, plural, other {触发类型}} ", "xpack.apm.serviceIcons.serviceDetails.cloud.functionNameLabel": "{functionNames, plural, other {功能名称}} ", "xpack.apm.serviceIcons.serviceDetails.cloud.machineTypesLabel": "{machineTypes, plural, other {机器类型}} ", From aa3e20e1f578a94deb1fd467c9e4f225ce9e2a17 Mon Sep 17 00:00:00 2001 From: Jan Monschke Date: Tue, 1 Mar 2022 19:28:55 +0100 Subject: [PATCH 091/102] [SecuritySolution] Fixes for alert ids in the alert flyout (#126490) * fix: show dns.question.name for network events There are no events with event.category == 'dns'. DNS events are actually 'network' events with dns.network == 'dns'. To simplify the field logic, we'll show the 'dns.question.name' field for all network events. * fix: show threat_match fields For newly-generated events, the threat indicator values can be found under 'kibana.alert.rule.parameters`. This adds a temporary fix for that. * fix: use legacy fields where necessary Threat match and ML alert fields of migrated alerts are not migrated into the alert rule's parameters. We therefore read them by their legacy id. * fix: remove unused import Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../common/ecs/event/index.ts | 1 - .../event_details/alert_summary_view.test.tsx | 84 +++++++++++++++++-- .../event_details/get_alert_summary_rows.tsx | 24 ++++-- .../common/components/event_details/types.ts | 1 + 4 files changed, 97 insertions(+), 13 deletions(-) diff --git a/x-pack/plugins/security_solution/common/ecs/event/index.ts b/x-pack/plugins/security_solution/common/ecs/event/index.ts index f38ebdc29c1fe..56f7d3e84dfa0 100644 --- a/x-pack/plugins/security_solution/common/ecs/event/index.ts +++ b/x-pack/plugins/security_solution/common/ecs/event/index.ts @@ -62,7 +62,6 @@ export enum EventCategory { PROCESS = 'process', FILE = 'file', NETWORK = 'network', - DNS = 'dns', REGISTRY = 'registry', MALWARE = 'malware', } diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/alert_summary_view.test.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/alert_summary_view.test.tsx index 4bb4c4809764a..53c0d143600fb 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/alert_summary_view.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/alert_summary_view.test.tsx @@ -129,7 +129,7 @@ describe('AlertSummaryView', () => { }); }); - test('DNS event renders the correct summary rows', () => { + test('DNS network event renders the correct summary rows', () => { const renderProps = { ...props, data: [ @@ -137,8 +137,8 @@ describe('AlertSummaryView', () => { if (item.category === 'event' && item.field === 'event.category') { return { ...item, - values: ['dns'], - originalValue: ['dns'], + values: ['network'], + originalValue: ['network'], }; } return item; @@ -324,6 +324,39 @@ describe('AlertSummaryView', () => { }); }); + test('[legacy] Machine learning events show correct fields', () => { + const enhancedData = [ + ...mockAlertDetailsData.map((item) => { + if (item.category === 'kibana' && item.field === 'kibana.alert.rule.type') { + return { + ...item, + values: ['machine_learning'], + originalValue: ['machine_learning'], + }; + } + return item; + }), + { + category: 'signal', + field: 'signal.rule.machine_learning_job_id', + values: ['i_am_the_ml_job_id'], + }, + { category: 'signal', field: 'signal.rule.anomaly_threshold', values: [2] }, + ] as TimelineEventsDetailsItem[]; + const renderProps = { + ...props, + data: enhancedData, + }; + const { getByText } = render( + + + + ); + ['i_am_the_ml_job_id', 'signal.rule.anomaly_threshold'].forEach((fieldId) => { + expect(getByText(fieldId)); + }); + }); + test('Threat match events show correct fields', () => { const enhancedData = [ ...mockAlertDetailsData.map((item) => { @@ -338,10 +371,51 @@ describe('AlertSummaryView', () => { }), { category: 'kibana', - field: 'kibana.alert.rule.threat_index', + field: 'kibana.alert.rule.parameters.threat_index', + values: ['threat_index*'], + }, + { + category: 'kibana', + field: 'kibana.alert.rule.parameters.threat_query', + values: ['*query*'], + }, + ] as TimelineEventsDetailsItem[]; + const renderProps = { + ...props, + data: enhancedData, + }; + const { getByText } = render( + + + + ); + ['threat_index*', '*query*'].forEach((fieldId) => { + expect(getByText(fieldId)); + }); + }); + + test('[legacy] Threat match events show correct fields', () => { + const enhancedData = [ + ...mockAlertDetailsData.map((item) => { + if (item.category === 'kibana' && item.field === 'kibana.alert.rule.type') { + return { + ...item, + values: ['threat_match'], + originalValue: ['threat_match'], + }; + } + return item; + }), + { + category: 'signal', + field: 'signal.rule.threat_index', values: ['threat_index*'], }, - { category: 'kibana', field: 'kibana.alert.rule.threat_query', values: ['*query*'] }, + { + category: 'signal', + field: 'signal.rule.threat_query', + values: ['*query*'], + }, ] as TimelineEventsDetailsItem[]; const renderProps = { ...props, diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/get_alert_summary_rows.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/get_alert_summary_rows.tsx index 9f0dfb53a5c4b..8550cd8435124 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/get_alert_summary_rows.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/get_alert_summary_rows.tsx @@ -6,7 +6,7 @@ */ import { find, isEmpty, uniqBy } from 'lodash/fp'; -import { ALERT_RULE_NAMESPACE, ALERT_RULE_PARAMETERS, ALERT_RULE_TYPE } from '@kbn/rule-data-utils'; +import { ALERT_RULE_PARAMETERS, ALERT_RULE_TYPE } from '@kbn/rule-data-utils'; import * as i18n from './translations'; import { BrowserFields } from '../../../../common/search_strategy/index_fields'; @@ -62,10 +62,9 @@ function getFieldsByCategory({ { id: 'destination.port' }, { id: 'source.address' }, { id: 'source.port' }, + { id: 'dns.question.name' }, { id: 'process.name' }, ]; - case EventCategory.DNS: - return [{ id: 'dns.question.name' }, { id: 'process.name' }]; case EventCategory.REGISTRY: return [{ id: 'registry.key' }, { id: 'registry.value' }, { id: 'process.name' }]; case EventCategory.MALWARE: @@ -146,18 +145,22 @@ function getFieldsByRuleType(ruleType?: string): EventSummaryField[] { return [ { id: `${ALERT_RULE_PARAMETERS}.machine_learning_job_id`, + legacyId: 'signal.rule.machine_learning_job_id', }, { id: `${ALERT_RULE_PARAMETERS}.anomaly_threshold`, + legacyId: 'signal.rule.anomaly_threshold', }, ]; case 'threat_match': return [ { - id: `${ALERT_RULE_NAMESPACE}.threat_index`, + id: `${ALERT_RULE_PARAMETERS}.threat_index`, + legacyId: 'signal.rule.threat_index', }, { - id: `${ALERT_RULE_NAMESPACE}.threat_query`, + id: `${ALERT_RULE_PARAMETERS}.threat_query`, + legacyId: 'signal.rule.threat_query', }, ]; default: @@ -251,11 +254,18 @@ export const getSummaryRows = ({ return data != null ? tableFields.reduce((acc, field) => { - const item = data.find((d) => d.field === field.id); - if (!item || isEmpty(item?.values)) { + const item = data.find( + (d) => d.field === field.id || (field.legacyId && d.field === field.legacyId) + ); + if (!item || isEmpty(item.values)) { return acc; } + // If we found the data by its legacy id we swap the ids to display the correct one + if (item.field === field.legacyId) { + field.id = field.legacyId; + } + const linkValueField = field.linkField != null && data.find((d) => d.field === field.linkField); const description = { diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/types.ts b/x-pack/plugins/security_solution/public/common/components/event_details/types.ts index 0e2eef882594a..9b64ddd4db5d0 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/types.ts +++ b/x-pack/plugins/security_solution/public/common/components/event_details/types.ts @@ -30,6 +30,7 @@ export type EnrichedFieldInfoWithValues = EnrichedFieldInfo & { values: string[] export interface EventSummaryField { id: string; + legacyId?: string; label?: string; linkField?: string; fieldType?: string; From b4375e916f1eff010ef9a4c4da09094806b2e567 Mon Sep 17 00:00:00 2001 From: Nicolas Chaulet Date: Tue, 1 Mar 2022 14:05:37 -0500 Subject: [PATCH 092/102] [Fleet] Add integration test for the cloud policy (#126605) --- .../cloud_preconfiguration.test.ts.snap | 231 ++++++++++++++++++ .../cloud_preconfiguration.test.ts | 195 +++++++++++++++ .../fixtures/cloud_kibana_config.ts | 148 +++++++++++ .../server/integration_tests/ha_setup.test.ts | 2 +- .../{ => helpers}/docker_registry_helper.ts | 0 .../server/integration_tests/helpers/index.ts | 39 +++ .../reset_preconfiguration.test.ts | 31 +-- 7 files changed, 615 insertions(+), 31 deletions(-) create mode 100644 x-pack/plugins/fleet/server/integration_tests/__snapshots__/cloud_preconfiguration.test.ts.snap create mode 100644 x-pack/plugins/fleet/server/integration_tests/cloud_preconfiguration.test.ts create mode 100644 x-pack/plugins/fleet/server/integration_tests/fixtures/cloud_kibana_config.ts rename x-pack/plugins/fleet/server/integration_tests/{ => helpers}/docker_registry_helper.ts (100%) create mode 100644 x-pack/plugins/fleet/server/integration_tests/helpers/index.ts diff --git a/x-pack/plugins/fleet/server/integration_tests/__snapshots__/cloud_preconfiguration.test.ts.snap b/x-pack/plugins/fleet/server/integration_tests/__snapshots__/cloud_preconfiguration.test.ts.snap new file mode 100644 index 0000000000000..80f2c39abe988 --- /dev/null +++ b/x-pack/plugins/fleet/server/integration_tests/__snapshots__/cloud_preconfiguration.test.ts.snap @@ -0,0 +1,231 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Fleet preconfiguration reset Preconfigred cloud policy Create correct .fleet-policies 1`] = ` +Object { + "agent": Object { + "monitoring": Object { + "enabled": false, + "logs": false, + "metrics": false, + }, + }, + "id": "policy-elastic-agent-on-cloud", + "inputs": Array [ + Object { + "data_stream": Object { + "namespace": "default", + }, + "id": "elastic-cloud-fleet-server", + "meta": Object { + "package": Object { + "name": "fleet_server", + "version": "1.1.1", + }, + }, + "name": "Fleet Server", + "revision": 1, + "server": Object { + "host": "0.0.0.0", + "port": 8220, + }, + "server.runtime": Object { + "gc_percent": 20, + }, + "type": "fleet-server", + "use_output": "es-containerhost", + }, + Object { + "apm-server": Object { + "auth": Object { + "anonymous": Object { + "allow_agent": Array [ + "rum-js", + "js-base", + "iOS/swift", + ], + "allow_service": null, + "enabled": true, + "rate_limit": Object { + "event_limit": 300, + "ip_limit": 1000, + }, + }, + "api_key": Object { + "enabled": true, + "limit": 100, + }, + "secret_token": "CLOUD_SECRET_TOKEN", + }, + "capture_personal_data": true, + "default_service_environment": null, + "expvar.enabled": false, + "host": "0.0.0.0:8200", + "idle_timeout": "45s", + "java_attacher": Object { + "discovery-rules": null, + "download-agent-version": null, + "enabled": false, + }, + "max_connections": 0, + "max_event_size": 307200, + "max_header_size": 1048576, + "read_timeout": "3600s", + "response_headers": null, + "rum": Object { + "allow_headers": null, + "allow_origins": Array [ + "*", + ], + "enabled": true, + "exclude_from_grouping": "^/webpack", + "library_pattern": "node_modules|bower_components|~", + "response_headers": null, + }, + "sampling": Object { + "tail": Object { + "enabled": false, + "interval": "1m", + "policies": Array [ + Object { + "sample_rate": 0.1, + }, + ], + }, + }, + "shutdown_timeout": "30s", + "ssl": Object { + "certificate": "/app/config/certs/node.crt", + "cipher_suites": null, + "curve_types": null, + "enabled": true, + "key": "/app/config/certs/node.key", + "key_passphrase": null, + "supported_protocols": Array [ + "TLSv1.0", + "TLSv1.1", + "TLSv1.2", + ], + }, + "write_timeout": "30s", + }, + "data_stream": Object { + "namespace": "default", + }, + "id": "elastic-cloud-apm", + "meta": Object { + "package": Object { + "name": "apm", + "version": "8.2.0-dev3", + }, + }, + "name": "Elastic APM", + "revision": 1, + "type": "apm", + "use_output": "es-containerhost", + }, + ], + "output_permissions": Object { + "es-containerhost": Object { + "Elastic APM": Object { + "cluster": Array [ + "cluster:monitor/main", + ], + "indices": Array [ + Object { + "names": Array [ + "logs-apm.app-default", + ], + "privileges": Array [ + "auto_configure", + "create_doc", + ], + }, + Object { + "names": Array [ + "metrics-apm.app.*-default", + ], + "privileges": Array [ + "auto_configure", + "create_doc", + ], + }, + Object { + "names": Array [ + "logs-apm.error-default", + ], + "privileges": Array [ + "auto_configure", + "create_doc", + ], + }, + Object { + "names": Array [ + "metrics-apm.internal-default", + ], + "privileges": Array [ + "auto_configure", + "create_doc", + ], + }, + Object { + "names": Array [ + "metrics-apm.profiling-default", + ], + "privileges": Array [ + "auto_configure", + "create_doc", + ], + }, + Object { + "names": Array [ + "traces-apm.rum-default", + ], + "privileges": Array [ + "auto_configure", + "create_doc", + ], + }, + Object { + "names": Array [ + "traces-apm.sampled-default", + ], + "privileges": Array [ + "auto_configure", + "create_doc", + "maintenance", + "monitor", + "read", + ], + }, + Object { + "names": Array [ + "traces-apm-default", + ], + "privileges": Array [ + "auto_configure", + "create_doc", + ], + }, + ], + }, + "_elastic_agent_checks": Object { + "cluster": Array [ + "monitor", + ], + }, + "_elastic_agent_monitoring": Object { + "indices": Array [], + }, + }, + }, + "outputs": Object { + "es-containerhost": Object { + "hosts": Array [ + "https://cloudinternales:9200", + ], + "type": "elasticsearch", + }, + }, + "revision": 4, +} +`; diff --git a/x-pack/plugins/fleet/server/integration_tests/cloud_preconfiguration.test.ts b/x-pack/plugins/fleet/server/integration_tests/cloud_preconfiguration.test.ts new file mode 100644 index 0000000000000..2dbdb58497506 --- /dev/null +++ b/x-pack/plugins/fleet/server/integration_tests/cloud_preconfiguration.test.ts @@ -0,0 +1,195 @@ +/* + * 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 Path from 'path'; + +import * as kbnTestServer from 'src/core/test_helpers/kbn_server'; + +import { AGENT_POLICY_INDEX } from '../../common'; +import type { PackagePolicySOAttributes } from '../../common'; +import type { AgentPolicySOAttributes } from '../types'; + +import { useDockerRegistry, waitForFleetSetup } from './helpers'; +import { CLOUD_KIBANA_CONFIG } from './fixtures/cloud_kibana_config'; + +const logFilePath = Path.join(__dirname, 'logs.log'); + +describe('Fleet preconfiguration reset', () => { + let esServer: kbnTestServer.TestElasticsearchUtils; + let kbnServer: kbnTestServer.TestKibanaUtils; + + const registryUrl = useDockerRegistry(); + + const startServers = async () => { + const { startES } = kbnTestServer.createTestServers({ + adjustTimeout: (t) => jest.setTimeout(t), + settings: { + es: { + license: 'trial', + }, + kbn: {}, + }, + }); + + esServer = await startES(); + const startKibana = async () => { + const root = kbnTestServer.createRootWithCorePlugins( + { + ...CLOUD_KIBANA_CONFIG, + 'xpack.fleet.registryUrl': registryUrl, + logging: { + appenders: { + file: { + type: 'file', + fileName: logFilePath, + layout: { + type: 'json', + }, + }, + }, + loggers: [ + { + name: 'root', + appenders: ['file'], + }, + { + name: 'plugins.fleet', + level: 'all', + }, + ], + }, + }, + { oss: false } + ); + + await root.preboot(); + const coreSetup = await root.setup(); + const coreStart = await root.start(); + + return { + root, + coreSetup, + coreStart, + stop: async () => await root.shutdown(), + }; + }; + kbnServer = await startKibana(); + await waitForFleetSetup(kbnServer.root); + }; + + const stopServers = async () => { + if (kbnServer) { + await kbnServer.stop(); + } + + if (esServer) { + await esServer.stop(); + } + + await new Promise((res) => setTimeout(res, 10000)); + }; + + // Share the same servers for all the test to make test a lot faster (but test are not isolated anymore) + beforeAll(async () => { + await startServers(); + }); + + afterAll(async () => { + await stopServers(); + }); + + describe('Preconfigred cloud policy', () => { + it('Works and preconfigure correctly agent policies', async () => { + const agentPolicies = await kbnServer.coreStart.savedObjects + .createInternalRepository() + .find({ + type: 'ingest-agent-policies', + perPage: 10000, + }); + + expect(agentPolicies.total).toBe(2); + expect( + agentPolicies.saved_objects.find((so) => so.id === 'policy-elastic-agent-on-cloud') + ).toBeDefined(); + expect(agentPolicies.saved_objects.find((so) => so.id === 'default-policy')).toBeDefined(); + }); + + it('Create correct .fleet-policies', async () => { + const res = await kbnServer.coreStart.elasticsearch.client.asInternalUser.search({ + index: AGENT_POLICY_INDEX, + q: `policy_id:policy-elastic-agent-on-cloud`, + sort: 'revision_idx:desc', + }); + + expect((res.hits.hits[0]._source as any)!.data).toMatchSnapshot(); + }); + + it('Create correct package policies', async () => { + const packagePolicies = await kbnServer.coreStart.savedObjects + .createInternalRepository() + .find({ + type: 'ingest-package-policies', + perPage: 10000, + }); + + expect(packagePolicies.total).toBe(3); + expect( + packagePolicies.saved_objects.find((so) => so.id === 'elastic-cloud-fleet-server') + ).toBeDefined(); + expect( + packagePolicies.saved_objects.find((so) => so.id === 'elastic-cloud-apm') + ).toBeDefined(); + expect(packagePolicies.saved_objects.find((so) => so.id === 'default-system')).toBeDefined(); + + const fleetServerPackagePolicy = packagePolicies.saved_objects.find( + (so) => so.id === 'elastic-cloud-fleet-server' + ); + expect(fleetServerPackagePolicy?.attributes.vars).toMatchInlineSnapshot(`undefined`); + expect(fleetServerPackagePolicy?.attributes.inputs).toMatchInlineSnapshot(` + Array [ + Object { + "compiled_input": Object { + "server": Object { + "host": "0.0.0.0", + "port": 8220, + }, + "server.runtime": Object { + "gc_percent": 20, + }, + }, + "enabled": true, + "keep_enabled": true, + "policy_template": "fleet_server", + "streams": Array [], + "type": "fleet-server", + "vars": Object { + "custom": Object { + "type": "yaml", + "value": "server.runtime: + gc_percent: 20 # Force the GC to execute more frequently: see https://golang.org/pkg/runtime/debug/#SetGCPercent + ", + }, + "host": Object { + "frozen": true, + "type": "text", + "value": "0.0.0.0", + }, + "max_connections": Object { + "type": "integer", + }, + "port": Object { + "frozen": true, + "type": "integer", + "value": 8220, + }, + }, + }, + ] + `); + }); + }); +}); diff --git a/x-pack/plugins/fleet/server/integration_tests/fixtures/cloud_kibana_config.ts b/x-pack/plugins/fleet/server/integration_tests/fixtures/cloud_kibana_config.ts new file mode 100644 index 0000000000000..fa9770a58f44e --- /dev/null +++ b/x-pack/plugins/fleet/server/integration_tests/fixtures/cloud_kibana_config.ts @@ -0,0 +1,148 @@ +/* + * 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. + */ + +export const CLOUD_KIBANA_CONFIG = { + xpack: { + fleet: { + packages: [ + { + name: 'apm', + version: 'latest', + }, + { + name: 'fleet_server', + version: 'latest', + }, + { + name: 'system', + version: 'latest', + }, + ], + outputs: [ + { + name: 'Elastic Cloud internal output', + type: 'elasticsearch', + id: 'es-containerhost', + hosts: ['https://cloudinternales:9200'], + }, + ], + agentPolicies: [ + { + name: 'Elastic Cloud agent policy', + description: 'Default agent policy for agents hosted on Elastic Cloud', + id: 'policy-elastic-agent-on-cloud', + data_output_id: 'es-containerhost', + monitoring_output_id: 'es-containerhost', + is_default: false, + is_managed: true, + is_default_fleet_server: false, + namespace: 'default', + monitoring_enabled: [], + unenroll_timeout: 86400, + package_policies: [ + { + name: 'Fleet Server', + id: 'elastic-cloud-fleet-server', + package: { + name: 'fleet_server', + }, + inputs: [ + { + type: 'fleet-server', + keep_enabled: true, + vars: [ + { + name: 'host', + value: '0.0.0.0', + frozen: true, + }, + { + name: 'port', + value: 8220, + frozen: true, + }, + { + name: 'custom', + value: + 'server.runtime:\n gc_percent: 20 # Force the GC to execute more frequently: see https://golang.org/pkg/runtime/debug/#SetGCPercent\n', + }, + ], + }, + ], + }, + { + name: 'Elastic APM', + id: 'elastic-cloud-apm', + package: { + name: 'apm', + }, + inputs: [ + { + type: 'apm', + keep_enabled: true, + vars: [ + { + name: 'api_key_enabled', + value: true, + }, + { + name: 'host', + value: '0.0.0.0:8200', + frozen: true, + }, + { + name: 'secret_token', + value: 'CLOUD_SECRET_TOKEN', + }, + { + name: 'tls_enabled', + value: true, + frozen: true, + }, + { + name: 'tls_certificate', + value: '/app/config/certs/node.crt', + frozen: true, + }, + { + name: 'tls_key', + value: '/app/config/certs/node.key', + frozen: true, + }, + { + name: 'url', + value: 'CLOUD_APM_URL', + frozen: true, + }, + ], + }, + ], + }, + ], + }, + { + name: 'Default policy', + id: 'default-policy', + description: 'Default agent policy created by Kibana', + is_default: true, + is_managed: false, + namespace: 'default', + monitoring_enabled: ['logs', 'metrics'], + package_policies: [ + { + name: 'system-1', + id: 'default-system', + package: { + name: 'system', + }, + }, + ], + }, + ], + }, + }, +}; diff --git a/x-pack/plugins/fleet/server/integration_tests/ha_setup.test.ts b/x-pack/plugins/fleet/server/integration_tests/ha_setup.test.ts index 8907399adb628..2a3a35072b0b3 100644 --- a/x-pack/plugins/fleet/server/integration_tests/ha_setup.test.ts +++ b/x-pack/plugins/fleet/server/integration_tests/ha_setup.test.ts @@ -19,7 +19,7 @@ import type { PackagePolicySOAttributes, } from '../types'; -import { useDockerRegistry } from './docker_registry_helper'; +import { useDockerRegistry } from './helpers'; const logFilePath = Path.join(__dirname, 'logs.log'); diff --git a/x-pack/plugins/fleet/server/integration_tests/docker_registry_helper.ts b/x-pack/plugins/fleet/server/integration_tests/helpers/docker_registry_helper.ts similarity index 100% rename from x-pack/plugins/fleet/server/integration_tests/docker_registry_helper.ts rename to x-pack/plugins/fleet/server/integration_tests/helpers/docker_registry_helper.ts diff --git a/x-pack/plugins/fleet/server/integration_tests/helpers/index.ts b/x-pack/plugins/fleet/server/integration_tests/helpers/index.ts new file mode 100644 index 0000000000000..b413211fe9ae7 --- /dev/null +++ b/x-pack/plugins/fleet/server/integration_tests/helpers/index.ts @@ -0,0 +1,39 @@ +/* + * 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 { adminTestUser } from '@kbn/test'; + +import * as kbnTestServer from 'src/core/test_helpers/kbn_server'; +import type { HttpMethod } from 'src/core/test_helpers/kbn_server'; + +type Root = ReturnType; + +export * from './docker_registry_helper'; + +export const waitForFleetSetup = async (root: Root) => { + const isFleetSetupRunning = async () => { + const statusApi = getSupertestWithAdminUser(root, 'get', '/api/status'); + const resp = await statusApi.send(); + const fleetStatus = resp.body?.status?.plugins?.fleet; + if (fleetStatus?.meta?.error) { + throw new Error(`Setup failed: ${JSON.stringify(fleetStatus)}`); + } + + return !fleetStatus || fleetStatus?.summary === 'Fleet is setting up'; + }; + + while (await isFleetSetupRunning()) { + await new Promise((resolve) => setTimeout(resolve, 2000)); + } +}; + +export function getSupertestWithAdminUser(root: Root, method: HttpMethod, path: string) { + const testUserCredentials = Buffer.from(`${adminTestUser.username}:${adminTestUser.password}`); + return kbnTestServer + .getSupertest(root, method, path) + .set('Authorization', `Basic ${testUserCredentials.toString('base64')}`); +} diff --git a/x-pack/plugins/fleet/server/integration_tests/reset_preconfiguration.test.ts b/x-pack/plugins/fleet/server/integration_tests/reset_preconfiguration.test.ts index 3b92102657803..1c387dc628cbb 100644 --- a/x-pack/plugins/fleet/server/integration_tests/reset_preconfiguration.test.ts +++ b/x-pack/plugins/fleet/server/integration_tests/reset_preconfiguration.test.ts @@ -7,44 +7,15 @@ import Path from 'path'; -import { adminTestUser } from '@kbn/test'; - import * as kbnTestServer from 'src/core/test_helpers/kbn_server'; -import type { HttpMethod } from 'src/core/test_helpers/kbn_server'; import type { AgentPolicySOAttributes } from '../types'; import { PRECONFIGURATION_DELETION_RECORD_SAVED_OBJECT_TYPE } from '../../common'; -import { useDockerRegistry } from './docker_registry_helper'; +import { useDockerRegistry, waitForFleetSetup, getSupertestWithAdminUser } from './helpers'; const logFilePath = Path.join(__dirname, 'logs.log'); -type Root = ReturnType; - -function getSupertestWithAdminUser(root: Root, method: HttpMethod, path: string) { - const testUserCredentials = Buffer.from(`${adminTestUser.username}:${adminTestUser.password}`); - return kbnTestServer - .getSupertest(root, method, path) - .set('Authorization', `Basic ${testUserCredentials.toString('base64')}`); -} - -const waitForFleetSetup = async (root: Root) => { - const isFleetSetupRunning = async () => { - const statusApi = getSupertestWithAdminUser(root, 'get', '/api/status'); - const resp = await statusApi.send(); - const fleetStatus = resp.body?.status?.plugins?.fleet; - if (fleetStatus?.meta?.error) { - throw new Error(`Setup failed: ${JSON.stringify(fleetStatus)}`); - } - - return !fleetStatus || fleetStatus?.summary === 'Fleet is setting up'; - }; - - while (await isFleetSetupRunning()) { - await new Promise((resolve) => setTimeout(resolve, 2000)); - } -}; - describe('Fleet preconfiguration reset', () => { let esServer: kbnTestServer.TestElasticsearchUtils; let kbnServer: kbnTestServer.TestKibanaUtils; From 513a08ea390156327a8fbeed4d6d6254315e02cd Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 1 Mar 2022 12:44:08 -0700 Subject: [PATCH 093/102] Update ftr (#124559) Co-authored-by: Renovate Bot Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- package.json | 4 ++-- yarn.lock | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index c87ce15f455ca..fdb358c25fb83 100644 --- a/package.json +++ b/package.json @@ -680,7 +680,7 @@ "@types/redux-actions": "^2.6.1", "@types/redux-logger": "^3.0.8", "@types/seedrandom": ">=2.0.0 <4.0.0", - "@types/selenium-webdriver": "^4.0.16", + "@types/selenium-webdriver": "^4.0.18", "@types/semver": "^7", "@types/set-value": "^2.0.0", "@types/sinon": "^7.0.13", @@ -737,7 +737,7 @@ "callsites": "^3.1.0", "chai": "3.5.0", "chance": "1.0.18", - "chromedriver": "^97.0.2", + "chromedriver": "^98.0.0", "clean-webpack-plugin": "^3.0.0", "cmd-shim": "^2.1.0", "compression-webpack-plugin": "^4.0.0", diff --git a/yarn.lock b/yarn.lock index 68816f9b172a9..1994a2f42e4a5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7587,10 +7587,10 @@ resolved "https://registry.yarnpkg.com/@types/seedrandom/-/seedrandom-2.4.28.tgz#9ce8fa048c1e8c85cb71d7fe4d704e000226036f" integrity sha512-SMA+fUwULwK7sd/ZJicUztiPs8F1yCPwF3O23Z9uQ32ME5Ha0NmDK9+QTsYE4O2tHXChzXomSWWeIhCnoN1LqA== -"@types/selenium-webdriver@^4.0.16": - version "4.0.16" - resolved "https://registry.yarnpkg.com/@types/selenium-webdriver/-/selenium-webdriver-4.0.16.tgz#c3205c6691a1d645cf4163684bd119230a60e6f5" - integrity sha512-0UAzu2lFXpLK4lU4yhgUtM/KxoN8hIpyI+q22KAwzIDHNk4kLJ/Ut5mJZLFSxfQx58OBQ9SJXZkSL065fe/WdQ== +"@types/selenium-webdriver@^4.0.18": + version "4.0.18" + resolved "https://registry.yarnpkg.com/@types/selenium-webdriver/-/selenium-webdriver-4.0.18.tgz#98f6e1ccd2d92f6fddaccfc7c148d2e158da0f92" + integrity sha512-gkrUo3QldGr8V9im/DjgKkX4UVd1rtflfEBuPG9hPSA1keu7A0rF8h/MQjpTMm2EPVhBCd2K8tn5nlC9Vsd5Xw== "@types/semver@^7": version "7.3.4" @@ -10754,10 +10754,10 @@ chrome-trace-event@^1.0.2: dependencies: tslib "^1.9.0" -chromedriver@^97.0.2: - version "97.0.2" - resolved "https://registry.yarnpkg.com/chromedriver/-/chromedriver-97.0.2.tgz#b6c26f6667ad40dc8cf08818878cc064787116fc" - integrity sha512-sOAfKCR3WsHvmKedZoWa+3tBVGdPtxq4zKxgKZCoJ2c924olBTW4Bnha6SHl93Yo7+QqsNn6ZpAC0ojhutacAg== +chromedriver@^98.0.0: + version "98.0.0" + resolved "https://registry.yarnpkg.com/chromedriver/-/chromedriver-98.0.0.tgz#b2c3c1941fad4cdfadad5d4c46923e02f089fd30" + integrity sha512-Oi6Th5teK+VI4nti+423/dFkENYHEMOdUvqwJHzOaNwXqLwZ8FuSaKBybgALCctGapwJbd+tmPv3qSd6tUUIHQ== dependencies: "@testim/chrome-version" "^1.1.2" axios "^0.24.0" From c4ce95e292dc4dca8f1867f3f5c3b3b1b153324b Mon Sep 17 00:00:00 2001 From: liza-mae Date: Tue, 1 Mar 2022 13:50:56 -0700 Subject: [PATCH 094/102] Workaround for reporting url too long (#126552) * Workaround for reporting url too long * Use quick save --- .../apps/reporting/reporting_smoke_tests.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/x-pack/test/upgrade/apps/reporting/reporting_smoke_tests.ts b/x-pack/test/upgrade/apps/reporting/reporting_smoke_tests.ts index 20fc34f77dbf8..e7769f2761f3f 100644 --- a/x-pack/test/upgrade/apps/reporting/reporting_smoke_tests.ts +++ b/x-pack/test/upgrade/apps/reporting/reporting_smoke_tests.ts @@ -71,6 +71,21 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { } const advOpt = await find.byXPath(`//button[descendant::*[text()='Advanced options']]`); await advOpt.click(); + // Workaround for: https://github.com/elastic/kibana/issues/126540 + const isUrlTooLong = await testSubjects.exists('urlTooLongErrorMessage'); + if (isUrlTooLong) { + // Save dashboard + await PageObjects.dashboard.switchToEditMode(); + await PageObjects.dashboard.clickQuickSave(); + await PageObjects.share.openShareMenuItem(link); + if (type === 'pdf_optimize') { + await testSubjects.click('usePrintLayout'); + } + const advOpt2 = await find.byXPath( + `//button[descendant::*[text()='Advanced options']]` + ); + await advOpt2.click(); + } const postUrl = await find.byXPath(`//button[descendant::*[text()='Copy POST URL']]`); await postUrl.click(); const url = await browser.getClipboardValue(); From 933f43d166e449a7e22fa978ff2d5d7d6af3172a Mon Sep 17 00:00:00 2001 From: Corey Robertson Date: Tue, 1 Mar 2022 15:55:11 -0500 Subject: [PATCH 095/102] [Canvas] Update canvas function docs to match in app and vice versa (#125259) * Update canvas function docs to match in app and vice versa * Update src/plugins/expressions/common/expression_functions/specs/math_column.ts Co-authored-by: Catherine Liu * Update src/plugins/expressions/common/expression_functions/specs/math_column.ts Co-authored-by: Catherine Liu * Fix translations Co-authored-by: Kaarina Tungseth Co-authored-by: Catherine Liu Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../canvas/canvas-function-reference.asciidoc | 503 ++++++++++-------- .../common/expression_functions/specs/clog.ts | 2 +- .../expression_functions/specs/math_column.ts | 9 +- .../i18n/functions/dict/alter_column.ts | 3 +- .../i18n/functions/dict/static_column.ts | 3 +- .../function_examples.ts | 31 ++ .../generate_function_reference.ts | 22 +- .../translations/translations/ja-JP.json | 3 - .../translations/translations/zh-CN.json | 3 - 9 files changed, 341 insertions(+), 238 deletions(-) diff --git a/docs/canvas/canvas-function-reference.asciidoc b/docs/canvas/canvas-function-reference.asciidoc index 24a7608f98fa7..efc82bbe71f77 100644 --- a/docs/canvas/canvas-function-reference.asciidoc +++ b/docs/canvas/canvas-function-reference.asciidoc @@ -13,7 +13,7 @@ A *** denotes a required argument. A † denotes an argument can be passed multiple times. -<> | B | <> | <> | <> | <> | <> | <> | <> | <> | K | <> | <> | <> | O | <> | Q | <> | <> | <> | <> | <> | W | X | Y | Z +<> | B | <> | <> | <> | <> | <> | <> | <> | <> | <> | <> | <> | <> | O | <> | Q | <> | <> | <> | <> | <> | W | X | Y | Z [float] [[a_fns]] @@ -35,7 +35,8 @@ all condition={gt 10} condition={lt 20} *Code example* [source,text] ---- -filters +kibana +| selectFilter | demodata | math "mean(percent_uptime)" | formatnumber "0.0%" @@ -83,7 +84,8 @@ alterColumn column="@timestamp" name="foo" *Code example* [source,text] ---- -filters +kibana +| selectFilter | demodata | alterColumn "time" name="time_in_ms" type="number" | table @@ -131,7 +133,8 @@ any condition={lte 10} condition={gt 30} *Code example* [source,text] ---- -filters +kibana +| selectFilter | demodata | filterrows { getCell "project" | any {eq "elasticsearch"} {eq "kibana"} {eq "x-pack"} @@ -175,7 +178,8 @@ as name="bar" *Code example* [source,text] ---- -filters +kibana +| selectFilter | demodata | ply by="project" fn={math "count(username)" | as "num_users"} fn={math "mean(price)" | as "price"} | pointseries x="project" y="num_users" size="price" color="project" @@ -257,7 +261,8 @@ axisConfig position="right" min=0 max=10 tickSize=1 *Code example* [source,text] ---- -filters +kibana +| selectFilter | demodata | pointseries x="size(cost)" y="project" color="project" | plot defaultStyle={seriesStyle bars=0.75 horizontalBars=true} @@ -380,7 +385,7 @@ Clears the _context_, and returns `null`. [[clog_fn]] === `clog` -It outputs the _context_ in the console. This function is for debug purpose. +Outputs the _input_ in the console. This function is for debug purposes *Expression syntax* [source,js] @@ -391,74 +396,20 @@ clog *Code example* [source,text] ---- -filters - | demodata - | clog - | filterrows fn={getCell "age" | gt 70} - | clog - | pointseries x="time" y="mean(price)" - | plot defaultStyle={seriesStyle lines=1 fill=1} - | render +kibana +| demodata +| clog +| filterrows fn={getCell "age" | gt 70} +| clog +| pointseries x="time" y="mean(price)" +| plot defaultStyle={seriesStyle lines=1 fill=1} +| render ---- This prints the `datatable` objects in the browser console before and after the `filterrows` function. *Accepts:* `any` -*Returns:* `any` - -[float] -[[createTable_fn]] -=== `createTable` - -Creates a datatable with a list of columns, and 1 or more empty rows. -To populate the rows, use <> or <>. - -[cols="3*^<"] -|=== -|Argument |Type |Description - -|ids *** † - -|`string` -|Column ids to generate in positional order. ID represents the key in the row. - -|`names` † -|`string` -|Column names to generate in positional order. Names are not required to be unique, and default to the ID if not provided. - -|`rowCount` - -Default: 1 -|`number` -|The number of empty rows to add to the table, to be assigned a value later. -|=== - -*Expression syntax* -[source,js] ----- -createTable id="a" id="b" -createTable id="a" name="A" id="b" name="B" rowCount=5 ----- - -*Code example* -[source,text] ----- -var_set - name="logs" value={essql "select count(*) as a from kibana_sample_data_logs"} - name="commerce" value={essql "select count(*) as b from kibana_sample_data_ecommerce"} -| createTable ids="totalA" ids="totalB" -| staticColumn name="totalA" value={var "logs" | getCell "a"} -| alterColumn column="totalA" type="number" -| staticColumn name="totalB" value={var "commerce" | getCell "b"} -| alterColumn column="totalB" type="number" -| mathColumn id="percent" name="percent" expression="totalA / totalB" -| render ----- - -This creates a table based on the results of two `essql` queries, joined -into one table. - -*Accepts:* `null` +*Returns:* Depends on your input and arguments [float] @@ -477,7 +428,8 @@ columns exclude="username, country, age" *Code example* [source,text] ---- -filters +kibana +| selectFilter | demodata | columns include="price, cost, state, project" | table @@ -521,7 +473,8 @@ compare op="lte" to=100 *Code example* [source,text] ---- -filters +kibana +| selectFilter | demodata | mapColumn project fn={getCell project | @@ -673,6 +626,59 @@ Using the `context` function allows us to pass the output, or _context_, of the *Returns:* Depends on your input and arguments +[float] +[[createTable_fn]] +=== `createTable` + +Creates a datatable with a list of columns, and 1 or more empty rows. To populate the rows, use <> or <>. + +*Expression syntax* +[source,js] +---- +createTable id="a" id="b" +createTable id="a" name="A" id="b" name="B" rowCount=5 +---- + +*Code example* +[source,text] +---- +var_set +name="logs" value={essql "select count(*) as a from kibana_sample_data_logs"} +name="commerce" value={essql "select count(*) as b from kibana_sample_data_ecommerce"} +| createTable ids="totalA" ids="totalB" +| staticColumn name="totalA" value={var "logs" | getCell "a"} +| alterColumn column="totalA" type="number" +| staticColumn name="totalB" value={var "commerce" | getCell "b"} +| alterColumn column="totalB" type="number" +| mathColumn id="percent" name="percent" expression="totalA / totalB" +| render +---- +This creates a table based on the results of two `essql` queries, joined into one table. + +*Accepts:* `null` + +[cols="3*^<"] +|=== +|Argument |Type |Description + +|`ids` † +|`string` +|Column ids to generate in positional order. ID represents the key in the row. + +|`names` † +|`string` +|Column names to generate in positional order. Names are not required to be unique, and default to the ID if not provided. + +|`rowCount` +|`number` +|The number of empty rows to add to the table, to be assigned a value later + +Default: `1` +|=== + +*Returns:* `datatable` + + [float] [[csv_fn]] === `csv` @@ -793,7 +799,8 @@ demodata type="shirts" *Code example* [source,text] ---- -filters +kibana +| selectFilter | demodata | table | render @@ -876,6 +883,10 @@ This creates a dropdown filter element. It requires a data source and uses the u |`string` |The group name for the filter. +|`labelColumn` +|`string` +|The column or field to use as the label in the dropdown control + |`valueColumn` *** |`string` |The column or field from which to extract the unique values for the dropdown control. @@ -887,6 +898,32 @@ This creates a dropdown filter element. It requires a data source and uses the u [[e_fns]] == E +[float] +[[embeddable_fn]] +=== `embeddable` + +Returns an embeddable with the provided configuration + +*Accepts:* `filter` + +[cols="3*^<"] +|=== +|Argument |Type |Description + +|_Unnamed_ *** + +Alias: `config` +|`string` +|The base64 encoded embeddable input object + +|`type` *** +|`string` +|The embeddable type +|=== + +*Returns:* `embeddable` + + [float] [[eq_fn]] === `eq` @@ -905,7 +942,8 @@ eq "foo" *Code example* [source,text] ---- -filters +kibana +| selectFilter | demodata | mapColumn project fn={getCell project | @@ -953,7 +991,8 @@ escount query="response:404" index="kibana_sample_data_logs" *Code example* [source,text] ---- -filters +kibana +| selectFilter | escount "Cancelled:true" index="kibana_sample_data_flights" | math "value" | progress shape="semicircle" @@ -980,7 +1019,7 @@ Default: `"-_index:.kibana"` |`index` |`string` -|An index or {data-source}. For example, `"logstash-*"`. +|An index or data view. For example, `"logstash-*"`. Default: `"_all"` |=== @@ -1007,7 +1046,8 @@ esdocs index="kibana_sample_data_flights" sort="AvgTicketPrice, asc" *Code example* [source,text] ---- -filters +kibana +| selectFilter | esdocs index="kibana_sample_data_ecommerce" fields="customer_gender, taxful_total_price, order_date" sort="order_date, asc" @@ -1020,7 +1060,7 @@ filters palette={palette "#7ECAE3" "#003A4D" gradient=true} | render ---- -This retrieves the first 10000 documents data from the `kibana_sample_data_ecommerce` {data-source} sorted by `order_date` in ascending order, and only requests the `customer_gender`, `taxful_total_price`, and `order_date` fields. +This retrieves the first 10000 documents data from the `kibana_sample_data_ecommerce` index sorted by `order_date` in ascending order, and only requests the `customer_gender`, `taxful_total_price`, and `order_date` fields. *Accepts:* `filter` @@ -1048,7 +1088,7 @@ Default: `1000` |`index` |`string` -|An index or {data-source}. For example, `"logstash-*"`. +|An index or data view. For example, `"logstash-*"`. Default: `"_all"` @@ -1080,7 +1120,8 @@ essql "SELECT * FROM "apm*"" count=10000 *Code example* [source,text] ---- -filters +kibana +| selectFilter | essql query="SELECT Carrier, FlightDelayMin, AvgTicketPrice FROM "kibana_sample_data_flights"" | table | render @@ -1105,6 +1146,12 @@ Aliases: `q`, `query` Default: `1000` +|`parameter` † + +Alias: `param` +|`string`, `number`, `boolean` +|A parameter to be passed to the SQL query. + |`timezone` Alias: `tz` @@ -1134,7 +1181,8 @@ exactly column="project" value="beats" *Code example* [source,text] ---- -filters +kibana +| selectFilter | exactly column=project value=elasticsearch | demodata | pointseries x=project y="mean(age)" @@ -1188,7 +1236,8 @@ filterrows fn={getCell "age" | gt 50} *Code example* [source,text] ---- -filters +kibana +| selectFilter | demodata | filterrows {getCell "country" | any {eq "IN"} {eq "US"} {eq "CN"}} | mapColumn "@timestamp" @@ -1297,7 +1346,8 @@ font lHeight=32 *Code example* [source,text] ---- -filters +kibana +| selectFilter | demodata | pointseries x="project" y="size(cost)" color="project" | plot defaultStyle={seriesStyle bars=0.75} legend=false @@ -1323,23 +1373,25 @@ filters |`string` |The horizontal text alignment. -Default: `"left"` +Default: `${ theme "font.align" default="left" }` |`color` |`string` |The text color. +Default: `${ theme "font.color" }` + |`family` |`string` |An acceptable CSS web font string -Default: `"'Open Sans', Helvetica, Arial, sans-serif"` +Default: `${ theme "font.family" default="'Open Sans', Helvetica, Arial, sans-serif" }` |`italic` |`boolean` |Italicize the text? -Default: `false` +Default: `${ theme "font.italic" default=false }` |`lHeight` @@ -1347,25 +1399,31 @@ Alias: `lineHeight` |`number`, `null` |The line height in pixels -Default: `null` +Default: `${ theme "font.lHeight" }` |`size` |`number` -|The font size in pixels +|The font size + +Default: `${ theme "font.size" default=14 }` -Default: `14` +|`sizeUnit` +|`string` +|The font size unit + +Default: `"px"` |`underline` |`boolean` |Underline the text? -Default: `false` +Default: `${ theme "font.underline" default=false }` |`weight` |`string` |The font weight. For example, `"normal"`, `"bold"`, `"bolder"`, `"lighter"`, `"100"`, `"200"`, `"300"`, `"400"`, `"500"`, `"600"`, `"700"`, `"800"`, or `"900"`. -Default: `"normal"` +Default: `${ theme "font.weight" default="normal" }` |=== *Returns:* `style` @@ -1387,7 +1445,8 @@ formatdate "MM/DD/YYYY" *Code example* [source,text] ---- -filters +kibana +| selectFilter | demodata | mapColumn "time" fn={getCell time | formatdate "MMM 'YY"} | pointseries x="time" y="sum(price)" color="state" @@ -1428,7 +1487,8 @@ formatnumber "0.0a" *Code example* [source,text] ---- -filters +kibana +| selectFilter | demodata | math "mean(percent_uptime)" | progress shape="gauge" @@ -1609,11 +1669,7 @@ Aliases: `dataurl`, `url` |`string`, `null` |The HTTP(S) URL or `base64` data URL of an image. -Example value for the _Unnamed_ argument, formatted as a `base64` data URL: -[source, url] ------------- -data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmlld0JveD0iMCAwIDI3MC42MDAwMSAyNjkuNTQ2NjYiCiAgIGhlaWdodD0iMjY5LjU0NjY2IgogICB3aWR0aD0iMjcwLjYwMDAxIgogICB4bWw6c3BhY2U9InByZXNlcnZlIgogICBpZD0ic3ZnMiIKICAgdmVyc2lvbj0iMS4xIj48bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE4Ij48cmRmOlJERj48Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+PGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+PGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPjwvY2M6V29yaz48L3JkZjpSREY+PC9tZXRhZGF0YT48ZGVmcwogICAgIGlkPSJkZWZzNiIgLz48ZwogICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMzMzMzMzMywwLDAsLTEuMzMzMzMzMywwLDI2OS41NDY2NykiCiAgICAgaWQ9ImcxMCI+PGcKICAgICAgIHRyYW5zZm9ybT0ic2NhbGUoMC4xKSIKICAgICAgIGlkPSJnMTIiPjxwYXRoCiAgICAgICAgIGlkPSJwYXRoMTQiCiAgICAgICAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiCiAgICAgICAgIGQ9Im0gMjAyOS40OCw5NjIuNDQxIGMgMCwxNzAuMDk5IC0xMDUuNDYsMzE4Ljc5OSAtMjY0LjE3LDM3Ni42NTkgNi45OCwzNS44NiAxMC42Miw3MS43MSAxMC42MiwxMDkuMDUgMCwzMTYuMTkgLTI1Ny4yNCw1NzMuNDMgLTU3My40Nyw1NzMuNDMgLTE4NC43MiwwIC0zNTYuNTU4LC04OC41OSAtNDY0LjUzLC0yMzcuODUgLTUzLjA5LDQxLjE4IC0xMTguMjg1LDYzLjc1IC0xODYuMzA1LDYzLjc1IC0xNjcuODM2LDAgLTMwNC4zODMsLTEzNi41NCAtMzA0LjM4MywtMzA0LjM4IDAsLTM3LjA4IDYuNjE3LC03Mi41OCAxOS4wMzEsLTEwNi4wOCBDIDEwOC40ODgsMTM4MC4wOSAwLDEyMjcuODkgMCwxMDU4Ljg4IDAsODg3LjkxIDEwNS45NzcsNzM4LjUzOSAyNjUuMzk4LDY4MS4wOSBjIC02Ljc2OSwtMzUuNDQyIC0xMC40NiwtNzIuMDIgLTEwLjQ2LC0xMDkgQyAyNTQuOTM4LDI1Ni42MjEgNTExLjU2NiwwIDgyNy4wMjcsMCAxMDEyLjIsMCAxMTgzLjk0LDg4Ljk0MTQgMTI5MS4zLDIzOC44MzIgYyA1My40NSwtNDEuOTYxIDExOC44LC02NC45OTIgMTg2LjU2LC02NC45OTIgMTY3LjgzLDAgMzA0LjM4LDEzNi40OTIgMzA0LjM4LDMwNC4zMzIgMCwzNy4wNzggLTYuNjIsNzIuNjI5IC0xOS4wMywxMDYuMTI5IDE1Ny43OCw1Ni44NzkgMjY2LjI3LDIwOS4xMjkgMjY2LjI3LDM3OC4xNCIgLz48cGF0aAogICAgICAgICBpZD0icGF0aDE2IgogICAgICAgICBzdHlsZT0iZmlsbDojZmFjZjA5O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICBkPSJtIDc5Ny44OTgsMTE1MC45MyA0NDQuMDcyLC0yMDIuNDUgNDQ4LjA1LDM5Mi41OCBjIDYuNDksMzIuMzkgOS42Niw2NC42NyA5LjY2LDk4LjQ2IDAsMjc2LjIzIC0yMjQuNjgsNTAwLjk1IC01MDAuOSw1MDAuOTUgLTE2NS4yNCwwIC0zMTkuMzcsLTgxLjM2IC00MTMuMDUzLC0yMTcuNzkgbCAtNzQuNTI0LC0zODYuNjQgODYuNjk1LC0xODUuMTEiIC8+PHBhdGgKICAgICAgICAgaWQ9InBhdGgxOCIKICAgICAgICAgc3R5bGU9ImZpbGw6IzQ5YzFhZTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgICAgZD0ibSAzMzguMjIzLDY4MC42NzIgYyAtNi40ODksLTMyLjM4MyAtOS44MDksLTY1Ljk4MSAtOS44MDksLTk5Ljk3MyAwLC0yNzYuOTI5IDIyNS4zMzYsLTUwMi4yNTc2IDUwMi4zMTMsLTUwMi4yNTc2IDE2Ni41OTMsMCAzMjEuNDczLDgyLjExNzYgNDE1LjAxMywyMTkuOTQ5NiBsIDczLjk3LDM4NS4zNDcgLTk4LjcyLDE4OC42MjEgTCA3NzUuMTU2LDEwNzUuNTcgMzM4LjIyMyw2ODAuNjcyIiAvPjxwYXRoCiAgICAgICAgIGlkPSJwYXRoMjAiCiAgICAgICAgIHN0eWxlPSJmaWxsOiNlZjI5OWI7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiCiAgICAgICAgIGQ9Im0gMzM1LjQxLDE0NDkuMTggMzA0LjMzMiwtNzEuODYgNjYuNjgsMzQ2LjAyIGMgLTQxLjU4NiwzMS43OCAtOTIuOTMsNDkuMTggLTE0NS43MzEsNDkuMTggLTEzMi4yNSwwIC0yMzkuODEyLC0xMDcuNjEgLTIzOS44MTIsLTIzOS44NyAwLC0yOS4yMSA0Ljg3OSwtNTcuMjIgMTQuNTMxLC04My40NyIgLz48cGF0aAogICAgICAgICBpZD0icGF0aDIyIgogICAgICAgICBzdHlsZT0iZmlsbDojNGNhYmU0O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICBkPSJNIDMwOC45OTIsMTM3Ni43IEMgMTczLjAyLDEzMzEuNjQgNzguNDgwNSwxMjAxLjMgNzguNDgwNSwxMDU3LjkzIDc4LjQ4MDUsOTE4LjM0IDE2NC44Miw3OTMuNjggMjk0LjQwNiw3NDQuMzUyIGwgNDI2Ljk4MSwzODUuOTM4IC03OC4zOTUsMTY3LjUxIC0zMzQsNzguOSIgLz48cGF0aAogICAgICAgICBpZD0icGF0aDI0IgogICAgICAgICBzdHlsZT0iZmlsbDojODVjZTI2O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICBkPSJtIDEzMjMuOCwyOTguNDEgYyA0MS43NCwtMzIuMDkgOTIuODMsLTQ5LjU5IDE0NC45OCwtNDkuNTkgMTMyLjI1LDAgMjM5LjgxLDEwNy41NTkgMjM5LjgxLDIzOS44MjEgMCwyOS4xNiAtNC44OCw1Ny4xNjggLTE0LjUzLDgzLjQxOCBsIC0zMDQuMDgsNzEuMTYgLTY2LjE4LC0zNDQuODA5IiAvPjxwYXRoCiAgICAgICAgIGlkPSJwYXRoMjYiCiAgICAgICAgIHN0eWxlPSJmaWxsOiMzMTc3YTc7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiCiAgICAgICAgIGQ9Im0gMTM4NS42Nyw3MjIuOTMgMzM0Ljc2LC03OC4zMDEgYyAxMzYuMDIsNDQuOTYxIDIzMC41NiwxNzUuMzUxIDIzMC41NiwzMTguNzYyIDAsMTM5LjMzOSAtODYuNTQsMjYzLjg1OSAtMjE2LjM4LDMxMy4wMzkgbCAtNDM3Ljg0LC0zODMuNTkgODguOSwtMTY5LjkxIiAvPjwvZz48L2c+PC9zdmc+ ------------- +Default: `null` |`mode` |`string` @@ -1669,6 +1725,20 @@ Default: `","` *Returns:* `string` +[float] +[[k_fns]] +== K + +[float] +[[kibana_fn]] +=== `kibana` + +Gets kibana global context + +*Accepts:* `kibana_context`, `null` + +*Returns:* `kibana_context` + [float] [[l_fns]] == L @@ -1771,27 +1841,29 @@ Adds a column calculated as the result of other columns. Changes are made only w |=== |Argument |Type |Description -|`id` - -|`string`, `null` -|An optional id of the resulting column. When no id is provided, the id will be looked up from the existing column by the provided name argument. If no column with this name exists yet, a new column with this name and an identical id will be added to the table. - |_Unnamed_ *** Aliases: `column`, `name` |`string` |The name of the resulting column. Names are not required to be unique. +|`copyMetaFrom` +|`string`, `null` +|If set, the meta object from the specified column id is copied over to the specified target column. If the column doesn't exist it silently fails. + +Default: `null` + |`expression` *** Aliases: `exp`, `fn`, `function` |`boolean`, `number`, `string`, `null` -|A Canvas expression that is passed to each row as a single row `datatable`. - -|`copyMetaFrom` +|An expression that is executed on every row, provided with a single-row `datatable` context and returning the cell value. +|`id` |`string`, `null` -|If set, the meta object from the specified column id is copied over to the specified target column. Throws an exception if the column doesn't exist +|An optional id of the resulting column. When no id is provided, the id will be looked up from the existing column by the provided name argument. If no column with this name exists yet, a new column with this name and an identical id will be added to the table. + +Default: `null` |=== *Returns:* `datatable` @@ -1851,33 +1923,29 @@ Alias: `expression` |`string` |An evaluated `TinyMath` expression. See https://www.elastic.co/guide/en/kibana/current/canvas-tinymath-functions.html. -|`onError` - +|`onError` |`string` -|In case the `TinyMath` evaluation fails or returns NaN, the return value is specified by onError. For example, `"null"`, `"zero"`, `"false"`, `"throw"`. When `"throw"`, it will throw an exception, terminating expression execution. - -Default: `"throw"` +|In case the `TinyMath` evaluation fails or returns NaN, the return value is specified by onError. When `'throw'`, it will throw an exception, terminating expression execution (default). |=== -*Returns:* `number` | `boolean` | `null` +*Returns:* Depends on your input and arguments [float] [[mathColumn_fn]] === `mathColumn` -Adds a column by evaluating `TinyMath` on each row. This function is optimized for math, so it performs better than the <> with a <>. +Adds a column by evaluating TinyMath on each row. This function is optimized for math, so it performs better than the mapColumn with a math + *Accepts:* `datatable` [cols="3*^<"] |=== |Argument |Type |Description -|id *** -|`string` -|id of the resulting column. Must be unique. +|_Unnamed_ *** -|name *** +Aliases: `column`, `name` |`string` |The name of the resulting column. Names are not required to be unique. @@ -1885,19 +1953,21 @@ Adds a column by evaluating `TinyMath` on each row. This function is optimized f Alias: `expression` |`string` -|A `TinyMath` expression evaluated on each row. See https://www.elastic.co/guide/en/kibana/current/canvas-tinymath-functions.html. - -|`onError` +|An evaluated `TinyMath` expression. See https://www.elastic.co/guide/en/kibana/current/canvas-tinymath-functions.html. -|`string` -|In case the `TinyMath` evaluation fails or returns NaN, the return value is specified by onError. For example, `"null"`, `"zero"`, `"false"`, `"throw"`. When `"throw"`, it will throw an exception, terminating expression execution. +|`copyMetaFrom` +|`string`, `null` +|If set, the meta object from the specified column id is copied over to the specified target column. If the column doesn't exist it silently fails. -Default: `"throw"` +Default: `null` -|`copyMetaFrom` +|`id` *** +|`string` +|id of the resulting column. Must be unique. -|`string`, `null` -|If set, the meta object from the specified column id is copied over to the specified target column. Throws an exception if the column doesn't exist +|`onError` +|`string` +|In case the `TinyMath` evaluation fails or returns NaN, the return value is specified by onError. When `'throw'`, it will throw an exception, terminating expression execution (default). |=== *Returns:* `datatable` @@ -1991,17 +2061,41 @@ Alias: `color` |`string` |The palette colors. Accepts an HTML color name, HEX, HSL, HSLA, RGB, or RGBA. +|`continuity` +|`string` +| + +Default: `"above"` + |`gradient` |`boolean` |Make a gradient palette where supported? Default: `false` +|`range` +|`string` +| + +Default: `"percent"` + +|`rangeMax` +|`number` +| + +|`rangeMin` +|`number` +| + |`reverse` |`boolean` |Reverse the palette? Default: `false` + +|`stop` † +|`number` +|The palette color stops. When used, it must be associated with each color. |=== *Returns:* `palette` @@ -2262,6 +2356,40 @@ Default: `20` [[r_fns]] == R +[float] +[[removeFilter_fn]] +=== `removeFilter` + +Removes filters from context + +*Accepts:* `kibana_context` + +[cols="3*^<"] +|=== +|Argument |Type |Description + +|_Unnamed_ + +Alias: `group` +|`string` +|Removes only filters belonging to the provided group + +|`from` +|`string` +|Removes only filters owned by the provided id + +|`ungrouped` + +Aliases: `nogroup`, `nogroups` +|`boolean` +|Should filters without group be removed + +Default: `false` +|=== + +*Returns:* `kibana_context` + + [float] [[render_fn]] === `render` @@ -2316,14 +2444,10 @@ Default: `null` |`string`, `null` |The image to repeat. Provide an image asset as a `base64` data URL, or pass in a sub-expression. -Example value for the `image` argument, formatted as a `base64` data URL: -[source, url] ------------- -data:image/svg+xml,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0A%3Csvg%20viewBox%3D%22-3.948730230331421%20-1.7549896240234375%20245.25946044921875%20241.40370178222656%22%20width%3D%22245.25946044921875%22%20height%3D%22241.40370178222656%22%20style%3D%22enable-background%3Anew%200%200%20686.2%20235.7%3B%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Cdefs%3E%0A%20%20%20%20%3Cstyle%20type%3D%22text%2Fcss%22%3E%0A%09.st0%7Bfill%3A%232D2D2D%3B%7D%0A%3C%2Fstyle%3E%0A%20%20%3C%2Fdefs%3E%0A%20%20%3Cg%20transform%3D%22matrix%281%2C%200%2C%200%2C%201%2C%200%2C%200%29%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%3Cpath%20class%3D%22st0%22%20d%3D%22M329.4%2C160.3l4.7-0.5l0.3%2C9.6c-12.4%2C1.7-23%2C2.6-31.8%2C2.6c-11.7%2C0-20-3.4-24.9-10.2%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bc-4.9-6.8-7.3-17.4-7.3-31.7c0-28.6%2C11.4-42.9%2C34.1-42.9c11%2C0%2C19.2%2C3.1%2C24.6%2C9.2c5.4%2C6.1%2C8.1%2C15.8%2C8.1%2C28.9l-0.7%2C9.3h-53.8%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bc0%2C9%2C1.6%2C15.7%2C4.9%2C20c3.3%2C4.3%2C8.9%2C6.5%2C17%2C6.5C312.8%2C161.2%2C321.1%2C160.9%2C329.4%2C160.3z%20M325%2C124.9c0-10-1.6-17.1-4.8-21.2%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bc-3.2-4.1-8.4-6.2-15.6-6.2c-7.2%2C0-12.7%2C2.2-16.3%2C6.5c-3.6%2C4.3-5.5%2C11.3-5.6%2C20.9H325z%22%2F%3E%0A%20%20%20%20%20%20%3Cpath%20class%3D%22st0%22%20d%3D%22M354.3%2C171.4V64h12.2v107.4H354.3z%22%2F%3E%0A%20%20%20%20%20%20%3Cpath%20class%3D%22st0%22%20d%3D%22M443.5%2C113.5v41.1c0%2C4.1%2C10.1%2C3.9%2C10.1%2C3.9l-0.6%2C10.8c-8.6%2C0-15.7%2C0.7-20-3.4c-9.8%2C4.3-19.5%2C6.1-29.3%2C6.1%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bc-7.5%2C0-13.2-2.1-17.1-6.4c-3.9-4.2-5.9-10.3-5.9-18.3c0-7.9%2C2-13.8%2C6-17.5c4-3.7%2C10.3-6.1%2C18.9-6.9l25.6-2.4v-7%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bc0-5.5-1.2-9.5-3.6-11.9c-2.4-2.4-5.7-3.6-9.8-3.6l-32.1%2C0V87.2h31.3c9.2%2C0%2C15.9%2C2.1%2C20.1%2C6.4C441.4%2C97.8%2C443.5%2C104.5%2C443.5%2C113.5%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bz%20M393.3%2C146.7c0%2C10%2C4.1%2C15%2C12.4%2C15c7.4%2C0%2C14.7-1.2%2C21.8-3.7l3.7-1.3v-26.9l-24.1%2C2.3c-4.9%2C0.4-8.4%2C1.8-10.6%2C4.2%26%2310%3B%26%239%3B%26%239%3B%26%239%3BC394.4%2C138.7%2C393.3%2C142.2%2C393.3%2C146.7z%22%2F%3E%0A%20%20%20%20%20%20%3Cpath%20class%3D%22st0%22%20d%3D%22M491.2%2C98.2c-11.8%2C0-17.8%2C4.1-17.8%2C12.4c0%2C3.8%2C1.4%2C6.5%2C4.1%2C8.1c2.7%2C1.6%2C8.9%2C3.2%2C18.6%2C4.9%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bc9.7%2C1.7%2C16.5%2C4%2C20.5%2C7.1c4%2C3%2C6%2C8.7%2C6%2C17.1c0%2C8.4-2.7%2C14.5-8.1%2C18.4c-5.4%2C3.9-13.2%2C5.9-23.6%2C5.9c-6.7%2C0-29.2-2.5-29.2-2.5%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bl0.7-10.6c12.9%2C1.2%2C22.3%2C2.2%2C28.6%2C2.2c6.3%2C0%2C11.1-1%2C14.4-3c3.3-2%2C5-5.4%2C5-10.1c0-4.7-1.4-7.9-4.2-9.6c-2.8-1.7-9-3.3-18.6-4.8%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bc-9.6-1.5-16.4-3.7-20.4-6.7c-4-2.9-6-8.4-6-16.3c0-7.9%2C2.8-13.8%2C8.4-17.6c5.6-3.8%2C12.6-5.7%2C20.9-5.7c6.6%2C0%2C29.6%2C1.7%2C29.6%2C1.7%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bv10.7C508.1%2C99%2C498.2%2C98.2%2C491.2%2C98.2z%22%2F%3E%0A%20%20%20%20%20%20%3Cpath%20class%3D%22st0%22%20d%3D%22M581.7%2C99.5h-25.9v39c0%2C9.3%2C0.7%2C15.5%2C2%2C18.4c1.4%2C2.9%2C4.6%2C4.4%2C9.7%2C4.4l14.5-1l0.8%2C10.1%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bc-7.3%2C1.2-12.8%2C1.8-16.6%2C1.8c-8.5%2C0-14.3-2.1-17.6-6.2c-3.3-4.1-4.9-12-4.9-23.6V99.5h-11.6V88.9h11.6V63.9h12.1v24.9h25.9V99.5z%22%2F%3E%0A%20%20%20%20%20%20%3Cpath%20class%3D%22st0%22%20d%3D%22M598.7%2C78.4V64.3h12.2v14.2H598.7z%20M598.7%2C171.4V88.9h12.2v82.5H598.7z%22%2F%3E%0A%20%20%20%20%20%20%3Cpath%20class%3D%22st0%22%20d%3D%22M663.8%2C87.2c3.6%2C0%2C9.7%2C0.7%2C18.3%2C2l3.9%2C0.5l-0.5%2C9.9c-8.7-1-15.1-1.5-19.2-1.5c-9.2%2C0-15.5%2C2.2-18.8%2C6.6%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bc-3.3%2C4.4-5%2C12.6-5%2C24.5c0%2C11.9%2C1.5%2C20.2%2C4.6%2C24.9c3.1%2C4.7%2C9.5%2C7%2C19.3%2C7l19.2-1.5l0.5%2C10.1c-10.1%2C1.5-17.7%2C2.3-22.7%2C2.3%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bc-12.7%2C0-21.5-3.3-26.3-9.8c-4.8-6.5-7.3-17.5-7.3-33c0-15.5%2C2.6-26.4%2C7.8-32.6C643%2C90.4%2C651.7%2C87.2%2C663.8%2C87.2z%22%2F%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cpath%20class%3D%22st0%22%20d%3D%22M236.6%2C123.5c0-19.8-12.3-37.2-30.8-43.9c0.8-4.2%2C1.2-8.4%2C1.2-12.7C207%2C30%2C177%2C0%2C140.2%2C0%26%2310%3B%26%239%3B%26%239%3BC118.6%2C0%2C98.6%2C10.3%2C86%2C27.7c-6.2-4.8-13.8-7.4-21.7-7.4c-19.6%2C0-35.5%2C15.9-35.5%2C35.5c0%2C4.3%2C0.8%2C8.5%2C2.2%2C12.4%26%2310%3B%26%239%3B%26%239%3BC12.6%2C74.8%2C0%2C92.5%2C0%2C112.2c0%2C19.9%2C12.4%2C37.3%2C30.9%2C44c-0.8%2C4.1-1.2%2C8.4-1.2%2C12.7c0%2C36.8%2C29.9%2C66.7%2C66.7%2C66.7%26%2310%3B%26%239%3B%26%239%3Bc21.6%2C0%2C41.6-10.4%2C54.1-27.8c6.2%2C4.9%2C13.8%2C7.6%2C21.7%2C7.6c19.6%2C0%2C35.5-15.9%2C35.5-35.5c0-4.3-0.8-8.5-2.2-12.4%26%2310%3B%26%239%3B%26%239%3BC223.9%2C160.9%2C236.6%2C143.2%2C236.6%2C123.5z%20M91.6%2C34.8c10.9-15.9%2C28.9-25.4%2C48.1-25.4c32.2%2C0%2C58.4%2C26.2%2C58.4%2C58.4%26%2310%3B%26%239%3B%26%239%3Bc0%2C3.9-0.4%2C7.7-1.1%2C11.5l-52.2%2C45.8L93%2C101.5L82.9%2C79.9L91.6%2C34.8z%20M65.4%2C29c6.2%2C0%2C12.1%2C2%2C17%2C5.7l-7.8%2C40.3l-35.5-8.4%26%2310%3B%26%239%3B%26%239%3Bc-1.1-3.1-1.7-6.3-1.7-9.7C37.4%2C41.6%2C49.9%2C29%2C65.4%2C29z%20M9.1%2C112.3c0-16.7%2C11-31.9%2C26.9-37.2L75%2C84.4l9.1%2C19.5l-49.8%2C45%26%2310%3B%26%239%3B%26%239%3BC19.2%2C143.1%2C9.1%2C128.6%2C9.1%2C112.3z%20M145.2%2C200.9c-10.9%2C16.1-29%2C25.6-48.4%2C25.6c-32.3%2C0-58.6-26.3-58.6-58.5c0-4%2C0.4-7.9%2C1.1-11.7%26%2310%3B%26%239%3B%26%239%3Bl50.9-46l52%2C23.7l11.5%2C22L145.2%2C200.9z%20M171.2%2C206.6c-6.1%2C0-12-2-16.9-5.8l7.7-40.2l35.4%2C8.3c1.1%2C3.1%2C1.7%2C6.3%2C1.7%2C9.7%26%2310%3B%26%239%3B%26%239%3BC199.2%2C194.1%2C186.6%2C206.6%2C171.2%2C206.6z%20M200.5%2C160.5l-39-9.1l-10.4-19.8l51-44.7c15.1%2C5.7%2C25.2%2C20.2%2C25.2%2C36.5%26%2310%3B%26%239%3B%26%239%3BC227.4%2C140.1%2C216.4%2C155.3%2C200.5%2C160.5z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E ------------- +Default: `null` |`max` -|`number` +|`number`, `null` |The maximum number of times the image can repeat. Default: `1000` @@ -2396,11 +2520,7 @@ Default: `null` |`string`, `null` |The image to reveal. Provide an image asset as a `base64` data URL, or pass in a sub-expression. -Example value for the `image` argument, formatted as a `base64` data URL: -[source, url] ------------- -data:image/svg+xml,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0A%3Csvg%20viewBox%3D%22-3.948730230331421%20-1.7549896240234375%20245.25946044921875%20241.40370178222656%22%20width%3D%22245.25946044921875%22%20height%3D%22241.40370178222656%22%20style%3D%22enable-background%3Anew%200%200%20686.2%20235.7%3B%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Cdefs%3E%0A%20%20%20%20%3Cstyle%20type%3D%22text%2Fcss%22%3E%0A%09.st0%7Bfill%3A%232D2D2D%3B%7D%0A%3C%2Fstyle%3E%0A%20%20%3C%2Fdefs%3E%0A%20%20%3Cg%20transform%3D%22matrix%281%2C%200%2C%200%2C%201%2C%200%2C%200%29%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%3Cpath%20class%3D%22st0%22%20d%3D%22M329.4%2C160.3l4.7-0.5l0.3%2C9.6c-12.4%2C1.7-23%2C2.6-31.8%2C2.6c-11.7%2C0-20-3.4-24.9-10.2%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bc-4.9-6.8-7.3-17.4-7.3-31.7c0-28.6%2C11.4-42.9%2C34.1-42.9c11%2C0%2C19.2%2C3.1%2C24.6%2C9.2c5.4%2C6.1%2C8.1%2C15.8%2C8.1%2C28.9l-0.7%2C9.3h-53.8%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bc0%2C9%2C1.6%2C15.7%2C4.9%2C20c3.3%2C4.3%2C8.9%2C6.5%2C17%2C6.5C312.8%2C161.2%2C321.1%2C160.9%2C329.4%2C160.3z%20M325%2C124.9c0-10-1.6-17.1-4.8-21.2%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bc-3.2-4.1-8.4-6.2-15.6-6.2c-7.2%2C0-12.7%2C2.2-16.3%2C6.5c-3.6%2C4.3-5.5%2C11.3-5.6%2C20.9H325z%22%2F%3E%0A%20%20%20%20%20%20%3Cpath%20class%3D%22st0%22%20d%3D%22M354.3%2C171.4V64h12.2v107.4H354.3z%22%2F%3E%0A%20%20%20%20%20%20%3Cpath%20class%3D%22st0%22%20d%3D%22M443.5%2C113.5v41.1c0%2C4.1%2C10.1%2C3.9%2C10.1%2C3.9l-0.6%2C10.8c-8.6%2C0-15.7%2C0.7-20-3.4c-9.8%2C4.3-19.5%2C6.1-29.3%2C6.1%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bc-7.5%2C0-13.2-2.1-17.1-6.4c-3.9-4.2-5.9-10.3-5.9-18.3c0-7.9%2C2-13.8%2C6-17.5c4-3.7%2C10.3-6.1%2C18.9-6.9l25.6-2.4v-7%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bc0-5.5-1.2-9.5-3.6-11.9c-2.4-2.4-5.7-3.6-9.8-3.6l-32.1%2C0V87.2h31.3c9.2%2C0%2C15.9%2C2.1%2C20.1%2C6.4C441.4%2C97.8%2C443.5%2C104.5%2C443.5%2C113.5%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bz%20M393.3%2C146.7c0%2C10%2C4.1%2C15%2C12.4%2C15c7.4%2C0%2C14.7-1.2%2C21.8-3.7l3.7-1.3v-26.9l-24.1%2C2.3c-4.9%2C0.4-8.4%2C1.8-10.6%2C4.2%26%2310%3B%26%239%3B%26%239%3B%26%239%3BC394.4%2C138.7%2C393.3%2C142.2%2C393.3%2C146.7z%22%2F%3E%0A%20%20%20%20%20%20%3Cpath%20class%3D%22st0%22%20d%3D%22M491.2%2C98.2c-11.8%2C0-17.8%2C4.1-17.8%2C12.4c0%2C3.8%2C1.4%2C6.5%2C4.1%2C8.1c2.7%2C1.6%2C8.9%2C3.2%2C18.6%2C4.9%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bc9.7%2C1.7%2C16.5%2C4%2C20.5%2C7.1c4%2C3%2C6%2C8.7%2C6%2C17.1c0%2C8.4-2.7%2C14.5-8.1%2C18.4c-5.4%2C3.9-13.2%2C5.9-23.6%2C5.9c-6.7%2C0-29.2-2.5-29.2-2.5%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bl0.7-10.6c12.9%2C1.2%2C22.3%2C2.2%2C28.6%2C2.2c6.3%2C0%2C11.1-1%2C14.4-3c3.3-2%2C5-5.4%2C5-10.1c0-4.7-1.4-7.9-4.2-9.6c-2.8-1.7-9-3.3-18.6-4.8%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bc-9.6-1.5-16.4-3.7-20.4-6.7c-4-2.9-6-8.4-6-16.3c0-7.9%2C2.8-13.8%2C8.4-17.6c5.6-3.8%2C12.6-5.7%2C20.9-5.7c6.6%2C0%2C29.6%2C1.7%2C29.6%2C1.7%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bv10.7C508.1%2C99%2C498.2%2C98.2%2C491.2%2C98.2z%22%2F%3E%0A%20%20%20%20%20%20%3Cpath%20class%3D%22st0%22%20d%3D%22M581.7%2C99.5h-25.9v39c0%2C9.3%2C0.7%2C15.5%2C2%2C18.4c1.4%2C2.9%2C4.6%2C4.4%2C9.7%2C4.4l14.5-1l0.8%2C10.1%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bc-7.3%2C1.2-12.8%2C1.8-16.6%2C1.8c-8.5%2C0-14.3-2.1-17.6-6.2c-3.3-4.1-4.9-12-4.9-23.6V99.5h-11.6V88.9h11.6V63.9h12.1v24.9h25.9V99.5z%22%2F%3E%0A%20%20%20%20%20%20%3Cpath%20class%3D%22st0%22%20d%3D%22M598.7%2C78.4V64.3h12.2v14.2H598.7z%20M598.7%2C171.4V88.9h12.2v82.5H598.7z%22%2F%3E%0A%20%20%20%20%20%20%3Cpath%20class%3D%22st0%22%20d%3D%22M663.8%2C87.2c3.6%2C0%2C9.7%2C0.7%2C18.3%2C2l3.9%2C0.5l-0.5%2C9.9c-8.7-1-15.1-1.5-19.2-1.5c-9.2%2C0-15.5%2C2.2-18.8%2C6.6%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bc-3.3%2C4.4-5%2C12.6-5%2C24.5c0%2C11.9%2C1.5%2C20.2%2C4.6%2C24.9c3.1%2C4.7%2C9.5%2C7%2C19.3%2C7l19.2-1.5l0.5%2C10.1c-10.1%2C1.5-17.7%2C2.3-22.7%2C2.3%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bc-12.7%2C0-21.5-3.3-26.3-9.8c-4.8-6.5-7.3-17.5-7.3-33c0-15.5%2C2.6-26.4%2C7.8-32.6C643%2C90.4%2C651.7%2C87.2%2C663.8%2C87.2z%22%2F%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cpath%20class%3D%22st0%22%20d%3D%22M236.6%2C123.5c0-19.8-12.3-37.2-30.8-43.9c0.8-4.2%2C1.2-8.4%2C1.2-12.7C207%2C30%2C177%2C0%2C140.2%2C0%26%2310%3B%26%239%3B%26%239%3BC118.6%2C0%2C98.6%2C10.3%2C86%2C27.7c-6.2-4.8-13.8-7.4-21.7-7.4c-19.6%2C0-35.5%2C15.9-35.5%2C35.5c0%2C4.3%2C0.8%2C8.5%2C2.2%2C12.4%26%2310%3B%26%239%3B%26%239%3BC12.6%2C74.8%2C0%2C92.5%2C0%2C112.2c0%2C19.9%2C12.4%2C37.3%2C30.9%2C44c-0.8%2C4.1-1.2%2C8.4-1.2%2C12.7c0%2C36.8%2C29.9%2C66.7%2C66.7%2C66.7%26%2310%3B%26%239%3B%26%239%3Bc21.6%2C0%2C41.6-10.4%2C54.1-27.8c6.2%2C4.9%2C13.8%2C7.6%2C21.7%2C7.6c19.6%2C0%2C35.5-15.9%2C35.5-35.5c0-4.3-0.8-8.5-2.2-12.4%26%2310%3B%26%239%3B%26%239%3BC223.9%2C160.9%2C236.6%2C143.2%2C236.6%2C123.5z%20M91.6%2C34.8c10.9-15.9%2C28.9-25.4%2C48.1-25.4c32.2%2C0%2C58.4%2C26.2%2C58.4%2C58.4%26%2310%3B%26%239%3B%26%239%3Bc0%2C3.9-0.4%2C7.7-1.1%2C11.5l-52.2%2C45.8L93%2C101.5L82.9%2C79.9L91.6%2C34.8z%20M65.4%2C29c6.2%2C0%2C12.1%2C2%2C17%2C5.7l-7.8%2C40.3l-35.5-8.4%26%2310%3B%26%239%3B%26%239%3Bc-1.1-3.1-1.7-6.3-1.7-9.7C37.4%2C41.6%2C49.9%2C29%2C65.4%2C29z%20M9.1%2C112.3c0-16.7%2C11-31.9%2C26.9-37.2L75%2C84.4l9.1%2C19.5l-49.8%2C45%26%2310%3B%26%239%3B%26%239%3BC19.2%2C143.1%2C9.1%2C128.6%2C9.1%2C112.3z%20M145.2%2C200.9c-10.9%2C16.1-29%2C25.6-48.4%2C25.6c-32.3%2C0-58.6-26.3-58.6-58.5c0-4%2C0.4-7.9%2C1.1-11.7%26%2310%3B%26%239%3B%26%239%3Bl50.9-46l52%2C23.7l11.5%2C22L145.2%2C200.9z%20M171.2%2C206.6c-6.1%2C0-12-2-16.9-5.8l7.7-40.2l35.4%2C8.3c1.1%2C3.1%2C1.7%2C6.3%2C1.7%2C9.7%26%2310%3B%26%239%3B%26%239%3BC199.2%2C194.1%2C186.6%2C206.6%2C171.2%2C206.6z%20M200.5%2C160.5l-39-9.1l-10.4-19.8l51-44.7c15.1%2C5.7%2C25.2%2C20.2%2C25.2%2C36.5%26%2310%3B%26%239%3B%26%239%3BC227.4%2C140.1%2C216.4%2C155.3%2C200.5%2C160.5z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E ------------- +Default: `null` |`origin` |`string` @@ -2449,99 +2569,37 @@ Returns the number of rows. Pairs with <> to get the count of unique col == S [float] -[[savedLens_fn]] -=== `savedLens` - -Returns an embeddable for a saved Lens visualization object. - -*Accepts:* `any` - -[cols="3*^<"] -|=== -|Argument |Type |Description - -|`id` -|`string` -|The ID of the saved Lens visualization object - -|`timerange` -|`timerange` -|The timerange of data that should be included - -|`title` -|`string` -|The title for the Lens visualization object -|=== - -*Returns:* `embeddable` - - -[float] -[[savedMap_fn]] -=== `savedMap` +[[selectFilter_fn]] +=== `selectFilter` -Returns an embeddable for a saved map object. +Selects filters from context -*Accepts:* `any` +*Accepts:* `kibana_context` [cols="3*^<"] |=== |Argument |Type |Description -|`center` -|`mapCenter` -|The center and zoom level the map should have - -|`hideLayer` † -|`string` -|The IDs of map layers that should be hidden +|_Unnamed_ † -|`id` +Alias: `group` |`string` -|The ID of the saved map object +|Select only filters belonging to the provided group -|`timerange` -|`timerange` -|The timerange of data that should be included - -|`title` +|`from` |`string` -|The title for the map -|=== - -*Returns:* `embeddable` - - -[float] -[[savedVisualization_fn]] -=== `savedVisualization` - -Returns an embeddable for a saved visualization object. - -*Accepts:* `any` - -[cols="3*^<"] -|=== -|Argument |Type |Description +|Select only filters owned by the provided id -|`colors` † -|`seriesStyle` -|Defines the color to use for a specific series +|`ungrouped` -|`hideLegend` +Aliases: `nogroup`, `nogroups` |`boolean` -|Specifies the option to hide the legend +|Should filters without group be included -|`id` -|`string` -|The ID of the saved visualization object - -|`timerange` -|`timerange` -|The timerange of data that should be included +Default: `false` |=== -*Returns:* `embeddable` +*Returns:* `kibana_context` [float] @@ -2641,7 +2699,7 @@ Default: `"black"` Default: `false` |=== -*Returns:* `shape` +*Returns:* Depends on your input and arguments [float] @@ -2676,7 +2734,7 @@ Default: `false` [[staticColumn_fn]] === `staticColumn` -Adds a column with the same static value in every row. See also <>, <>, and <>. +Adds a column with the same static value in every row. See also <>, <>, and <> *Accepts:* `datatable` @@ -2994,7 +3052,7 @@ Alias: `type` Returns a UI settings parameter value. -*Accepts:* `null` +*Accepts:* `any` [cols="3*^<"] |=== @@ -3002,18 +3060,17 @@ Returns a UI settings parameter value. |_Unnamed_ *** -Aliases: `parameter` +Alias: `parameter` |`string` |The parameter name. |`default` |`any` |A default value in case of the parameter is not set. - -Default: `null` |=== -*Returns:* `ui_setting` +*Returns:* Depends on your input and arguments + [float] [[urlparam_fn]] @@ -3080,13 +3137,13 @@ Updates the Kibana global context. |=== |Argument |Type |Description -|_Unnamed_ *** +|_Unnamed_ *** † Alias: `name` |`string` |Specify the name of the variable. -|`value` +|`value` † Alias: `val` |`any` diff --git a/src/plugins/expressions/common/expression_functions/specs/clog.ts b/src/plugins/expressions/common/expression_functions/specs/clog.ts index a523d7505648f..6936b704b878e 100644 --- a/src/plugins/expressions/common/expression_functions/specs/clog.ts +++ b/src/plugins/expressions/common/expression_functions/specs/clog.ts @@ -13,7 +13,7 @@ export type ExpressionFunctionClog = ExpressionFunctionDefinition<'clog', unknow export const clog: ExpressionFunctionClog = { name: 'clog', args: {}, - help: 'Outputs the context to the console', + help: 'Outputs the _input_ in the console. This function is for debug purposes', fn: (input: unknown) => { // eslint-disable-next-line no-console console.log(input); diff --git a/src/plugins/expressions/common/expression_functions/specs/math_column.ts b/src/plugins/expressions/common/expression_functions/specs/math_column.ts index fe6049b49c969..ae6cc8b755fe1 100644 --- a/src/plugins/expressions/common/expression_functions/specs/math_column.ts +++ b/src/plugins/expressions/common/expression_functions/specs/math_column.ts @@ -28,12 +28,11 @@ export const mathColumn: ExpressionFunctionDefinition< inputTypes: ['datatable'], help: i18n.translate('expressions.functions.mathColumnHelpText', { defaultMessage: - 'Adds a column calculated as the result of other columns. ' + - 'Changes are made only when you provide arguments.' + - 'See also {alterColumnFn} and {staticColumnFn}.', + 'Adds a column by evaluating {tinymath} on each row. ' + + 'This function is optimized for math and performs better than using a math expression in {mapColumnFn}.', values: { - alterColumnFn: '`alterColumn`', - staticColumnFn: '`staticColumn`', + mapColumnFn: '`mapColumn`', + tinymath: '`TinyMath`', }, }), args: { diff --git a/x-pack/plugins/canvas/i18n/functions/dict/alter_column.ts b/x-pack/plugins/canvas/i18n/functions/dict/alter_column.ts index 25975410ef8bc..795a70abb981a 100644 --- a/x-pack/plugins/canvas/i18n/functions/dict/alter_column.ts +++ b/x-pack/plugins/canvas/i18n/functions/dict/alter_column.ts @@ -15,7 +15,7 @@ export const help: FunctionHelp> = { help: i18n.translate('xpack.canvas.functions.alterColumnHelpText', { defaultMessage: 'Converts between core types, including {list}, and {end}, and renames columns. ' + - 'See also {mapColumnFn} and {staticColumnFn}.', + 'See also {mapColumnFn}, {mathColumnFn}, and {staticColumnFn}.', values: { list: Object.values(DATATABLE_COLUMN_TYPES) .slice(0, -1) @@ -24,6 +24,7 @@ export const help: FunctionHelp> = { end: `\`${Object.values(DATATABLE_COLUMN_TYPES).slice(-1)[0]}\``, mapColumnFn: '`mapColumn`', staticColumnFn: '`staticColumn`', + mathColumnFn: '`mathColumn`', }, }), args: { diff --git a/x-pack/plugins/canvas/i18n/functions/dict/static_column.ts b/x-pack/plugins/canvas/i18n/functions/dict/static_column.ts index 3b5a632edf993..a27c1491fc0af 100644 --- a/x-pack/plugins/canvas/i18n/functions/dict/static_column.ts +++ b/x-pack/plugins/canvas/i18n/functions/dict/static_column.ts @@ -13,10 +13,11 @@ import { FunctionFactory } from '../../../types'; export const help: FunctionHelp> = { help: i18n.translate('xpack.canvas.functions.staticColumnHelpText', { defaultMessage: - 'Adds a column with the same static value in every row. See also {alterColumnFn} and {mapColumnFn}.', + 'Adds a column with the same static value in every row. See also {alterColumnFn}, {mapColumnFn}, and {mathColumnFn}', values: { alterColumnFn: '`alterColumn`', mapColumnFn: '`mapColumn`', + mathColumnFn: '`mathColumn`', }, }), args: { diff --git a/x-pack/plugins/canvas/public/components/function_reference_generator/function_examples.ts b/x-pack/plugins/canvas/public/components/function_reference_generator/function_examples.ts index 785f183b193f1..c25e163a0c210 100644 --- a/x-pack/plugins/canvas/public/components/function_reference_generator/function_examples.ts +++ b/x-pack/plugins/canvas/public/components/function_reference_generator/function_examples.ts @@ -134,6 +134,20 @@ case if={lte 50} then="green"`, help: 'This sets the color of the progress indicator and the color of the label to `"green"` if the value is less than or equal to `0.5`, `"orange"` if the value is greater than `0.5` and less than or equal to `0.75`, and `"red"` if `none` of the case conditions are met.', }, }, + clog: { + syntax: `clog`, + usage: { + expression: `kibana +| demodata +| clog +| filterrows fn={getCell "age" | gt 70} +| clog +| pointseries x="time" y="mean(price)" +| plot defaultStyle={seriesStyle lines=1 fill=1} +| render`, + help: 'This prints the `datatable` objects in the browser console before and after the `filterrows` function.', + }, + }, columns: { syntax: `columns include="@timestamp, projects, cost" columns exclude="username, country, age"`, @@ -199,6 +213,23 @@ containerStyle backgroundImage={asset id=asset-f40d2292-cf9e-4f2c-8c6f-a504a25e9 help: 'Using the `context` function allows us to pass the output, or _context_, of the previous function as a value to an argument in the next function. Here we get the formatted date string from the previous function and pass it as `content` for the markdown element.', }, }, + createTable: { + syntax: `createTable id="a" id="b" +createTable id="a" name="A" id="b" name="B" rowCount=5`, + usage: { + expression: `var_set +name="logs" value={essql "select count(*) as a from kibana_sample_data_logs"} +name="commerce" value={essql "select count(*) as b from kibana_sample_data_ecommerce"} +| createTable ids="totalA" ids="totalB" +| staticColumn name="totalA" value={var "logs" | getCell "a"} +| alterColumn column="totalA" type="number" +| staticColumn name="totalB" value={var "commerce" | getCell "b"} +| alterColumn column="totalB" type="number" +| mathColumn id="percent" name="percent" expression="totalA / totalB" +| render`, + help: 'This creates a table based on the results of two `essql` queries, joined into one table.', + }, + }, csv: { syntax: `csv "fruit, stock kiwi, 10 diff --git a/x-pack/plugins/canvas/public/components/function_reference_generator/generate_function_reference.ts b/x-pack/plugins/canvas/public/components/function_reference_generator/generate_function_reference.ts index 289704ae79539..7f7f897b4f28e 100644 --- a/x-pack/plugins/canvas/public/components/function_reference_generator/generate_function_reference.ts +++ b/x-pack/plugins/canvas/public/components/function_reference_generator/generate_function_reference.ts @@ -26,12 +26,32 @@ const fnList = [ ...browserFunctions.map((fn) => fn().name), ...serverFunctions.map((fn) => fn().name), 'asset', + 'clog', + 'createTable', + 'embeddable', 'filters', + 'font', + 'image', + 'kibana', + 'mapColumn', + 'math', + 'mathColumn', + 'metric', + 'palette', + 'pie', + 'plot', + 'progress', + 'removeFilter', + 'repeatImage', + 'revealImage', + 'selectFilter', + 'shape', 'timelion', 'to', - 'font', + 'uiSetting', 'var', 'var_set', + // ignore unsupported embeddables functions for now ].filter((fn) => !['savedSearch'].includes(fn)); diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 263a760a9d797..3a5bc5edfbb79 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -3226,7 +3226,6 @@ "expressions.functions.mathColumn.args.nameHelpText": "結果の列の名前です。名前は一意である必要はありません。", "expressions.functions.mathColumn.arrayValueError": "{name}で配列値に対する演算を実行できません", "expressions.functions.mathColumn.uniqueIdError": "IDは一意でなければなりません", - "expressions.functions.mathColumnHelpText": "他の列の結果として計算された列を追加します。引数が指定された場合のみ変更が加えられます。{alterColumnFn}と{staticColumnFn}もご参照ください。", "expressions.functions.mathHelpText": "{TYPE_NUMBER}または{DATATABLE}を{CONTEXT}として使用して、{TINYMATH}数式を解釈します。{DATATABLE}列は列名で表示されます。{CONTEXT}が数字の場合は、{value}と表示されます。", "expressions.functions.movingAverage.args.byHelpText": "移動平均計算を分割する列", "expressions.functions.movingAverage.args.inputColumnIdHelpText": "移動平均を計算する列", @@ -8086,7 +8085,6 @@ "xpack.canvas.functions.alterColumn.args.typeHelpText": "列の変換語のタイプです。タイプを変更しない場合は未入力のままにします。", "xpack.canvas.functions.alterColumn.cannotConvertTypeErrorMessage": "「{type}」に変換できません", "xpack.canvas.functions.alterColumn.columnNotFoundErrorMessage": "列が見つかりません。'{column}'", - "xpack.canvas.functions.alterColumnHelpText": "{list}、{end}などのコアタイプを変換し、列名を変更します。{mapColumnFn}および{staticColumnFn}も参照してください。", "xpack.canvas.functions.any.args.conditionHelpText": "確認する条件です。", "xpack.canvas.functions.anyHelpText": "少なくとも 1 つの条件が満たされている場合、{BOOLEAN_TRUE} が返されます。{all_fn} もご参照ください。", "xpack.canvas.functions.as.args.nameHelpText": "列に付ける名前です。", @@ -8287,7 +8285,6 @@ "xpack.canvas.functions.sortHelpText": "{DATATABLE}を指定された列で並べ替えます。", "xpack.canvas.functions.staticColumn.args.nameHelpText": "新しい列の名前です。", "xpack.canvas.functions.staticColumn.args.valueHelpText": "新しい列の各行に挿入する値です。ヒント:部分式を使用して他の列を静的値にロールアップします。", - "xpack.canvas.functions.staticColumnHelpText": "すべての行に同じ静的値の列を追加します。{alterColumnFn}および{mapColumnFn}も参照してください。", "xpack.canvas.functions.string.args.valueHelpText": "1 つの文字列に結合する値です。必要な場所にスペースを入れてください。", "xpack.canvas.functions.stringHelpText": "すべての引数を 1 つの文字列に連結させます。", "xpack.canvas.functions.switch.args.caseHelpText": "確認する条件です。", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index a3a5ba1a83dc6..cd88c2b4b6a52 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -3234,7 +3234,6 @@ "expressions.functions.mathColumn.args.nameHelpText": "结果列的名称。名称不需要唯一。", "expressions.functions.mathColumn.arrayValueError": "无法对 {name} 的数组值执行数学运算", "expressions.functions.mathColumn.uniqueIdError": "ID 必须唯一", - "expressions.functions.mathColumnHelpText": "添加计算为其他列的结果的列。只有提供参数时,才会执行更改。另请参见 {alterColumnFn} 和 {staticColumnFn}。", "expressions.functions.mathHelpText": "使用 {TYPE_NUMBER} 或 {DATATABLE} 作为 {CONTEXT} 来解释 {TINYMATH} 数学表达式。{DATATABLE} 列按列名使用。如果 {CONTEXT} 是数字,则作为 {value} 使用。", "expressions.functions.movingAverage.args.byHelpText": "用于移动平均值计算拆分依据的列", "expressions.functions.movingAverage.args.inputColumnIdHelpText": "要计算移动平均值的列", @@ -8104,7 +8103,6 @@ "xpack.canvas.functions.alterColumn.args.typeHelpText": "将列转换成的类型。留空将不更改类型。", "xpack.canvas.functions.alterColumn.cannotConvertTypeErrorMessage": "无法转换为“{type}”", "xpack.canvas.functions.alterColumn.columnNotFoundErrorMessage": "找不到列:“{column}”", - "xpack.canvas.functions.alterColumnHelpText": "在核心类型(包括 {list} 和 {end})之间转换,并重命名列。另请参见 {mapColumnFn} 和 {staticColumnFn}。", "xpack.canvas.functions.any.args.conditionHelpText": "要检查的条件。", "xpack.canvas.functions.anyHelpText": "至少满足一个条件时,返回 {BOOLEAN_TRUE}。另见 {all_fn}。", "xpack.canvas.functions.as.args.nameHelpText": "要为列提供的名称。", @@ -8306,7 +8304,6 @@ "xpack.canvas.functions.sortHelpText": "按指定列对 {DATATABLE} 进行排序。", "xpack.canvas.functions.staticColumn.args.nameHelpText": "新列的名称。", "xpack.canvas.functions.staticColumn.args.valueHelpText": "要在新列的每一行中插入的值。提示:使用子表达式可将其他列汇总为静态值。", - "xpack.canvas.functions.staticColumnHelpText": "添加每一行都具有相同静态值的列。另请参见 {alterColumnFn} 和 {mapColumnFn}。", "xpack.canvas.functions.string.args.valueHelpText": "要连结成一个字符串的值。根据需要加入空格。", "xpack.canvas.functions.stringHelpText": "将所有参数串联成单个字符串。", "xpack.canvas.functions.switch.args.caseHelpText": "要检查的条件。", From a19ea90f911b702bd2a27fbe724524c951756c66 Mon Sep 17 00:00:00 2001 From: Kevin Logan <56395104+kevinlog@users.noreply.github.com> Date: Tue, 1 Mar 2022 16:26:54 -0500 Subject: [PATCH 096/102] [Security Solution] Add Endpoint telemetry fields for policy response and additional metrics (#126290) --- .../server/lib/telemetry/constants.ts | 2 +- .../server/lib/telemetry/tasks/endpoint.ts | 16 ++++++- .../server/lib/telemetry/types.ts | 45 +++++++++++++++++++ 3 files changed, 61 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/constants.ts b/x-pack/plugins/security_solution/server/lib/telemetry/constants.ts index af02c98f32c55..ec363568cafd2 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/constants.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/constants.ts @@ -9,7 +9,7 @@ export const TELEMETRY_MAX_BUFFER_SIZE = 100; export const MAX_SECURITY_LIST_TELEMETRY_BATCH = 100; -export const MAX_ENDPOINT_TELEMETRY_BATCH = 1_000; +export const MAX_ENDPOINT_TELEMETRY_BATCH = 300; export const MAX_DETECTION_RULE_TELEMETRY_BATCH = 1_000; diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/endpoint.ts b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/endpoint.ts index 6be174cdf33e7..e9cc36bbff907 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/endpoint.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/endpoint.ts @@ -212,7 +212,15 @@ export function createTelemetryEndpointTaskConfig(maxTelemetryBatch: number) { } } - const { cpu, memory, uptime } = endpoint.endpoint_metrics.Endpoint.metrics; + const { + cpu, + memory, + uptime, + documents_volume: documentsVolume, + malicious_behavior_rules: maliciousBehaviorRules, + system_impact: systemImpact, + threads, + } = endpoint.endpoint_metrics.Endpoint.metrics; const endpointPolicyDetail = extractEndpointPolicyConfig(policyConfig); return { @@ -227,6 +235,10 @@ export function createTelemetryEndpointTaskConfig(maxTelemetryBatch: number) { cpu: cpu.endpoint, memory: memory.endpoint.private, uptime, + documentsVolume, + maliciousBehaviorRules, + systemImpact, + threads, }, endpoint_meta: { os: endpoint.endpoint_metrics.host.os, @@ -242,6 +254,8 @@ export function createTelemetryEndpointTaskConfig(maxTelemetryBatch: number) { actions: failedPolicy._source.Endpoint.policy.applied.actions .map((action) => (action.status !== 'success' ? action : null)) .filter((action) => action !== null), + configuration: failedPolicy._source.Endpoint.configuration, + state: failedPolicy._source.Endpoint.state, } : {}, telemetry_meta: { diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/types.ts b/x-pack/plugins/security_solution/server/lib/telemetry/types.ts index d7ba5fa34cf09..35b701552b6ba 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/types.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/types.ts @@ -84,6 +84,10 @@ interface EndpointPolicyResponseHits { }; } +interface NonPolicyConfiguration { + isolation: boolean; +} + export interface EndpointPolicyResponseDocument { _source: { '@timestamp': string; @@ -109,6 +113,8 @@ export interface EndpointPolicyResponseDocument { status: string; }; }; + configuration: NonPolicyConfiguration; + state: NonPolicyConfiguration; }; }; } @@ -157,6 +163,17 @@ interface EndpointMetricDocument { }; } +interface DocumentsVolumeMetrics { + suppressed_count: number; + suppressed_bytes: number; + sent_count: number; + sent_bytes: number; +} + +interface SystemImpactEventsMetrics { + week_ms: number; +} + export interface EndpointMetrics { memory: { endpoint: { @@ -180,6 +197,34 @@ export interface EndpointMetrics { endpoint: number; system: number; }; + documents_volume: { + file_events: DocumentsVolumeMetrics; + library_events: DocumentsVolumeMetrics; + process_events: DocumentsVolumeMetrics; + registry_events: DocumentsVolumeMetrics; + network_events: DocumentsVolumeMetrics; + overall: DocumentsVolumeMetrics; + }; + malicious_behavior_rules: Array<{ id: string; endpoint_uptime_percent: number }>; + system_impact: Array<{ + process: { + code_signature: Array<{ + trusted: boolean; + subject_name: string; + exists: boolean; + status: string; + }>; + executable: string; + }; + malware?: SystemImpactEventsMetrics; + process_events?: SystemImpactEventsMetrics; + registry_events?: SystemImpactEventsMetrics; + dns_events?: SystemImpactEventsMetrics; + network_events?: SystemImpactEventsMetrics; + overall?: SystemImpactEventsMetrics; + library_load_events?: SystemImpactEventsMetrics; + }>; + threads: Array<{ name: string; cpu: { mean: number } }>; } interface EndpointMetricOS { From 87a2cfa2df1620162c6b6c3fae585aac1d07ddab Mon Sep 17 00:00:00 2001 From: Steph Milovic Date: Tue, 1 Mar 2022 15:34:38 -0700 Subject: [PATCH 097/102] Fix timeline newsfeed css (#126628) --- .../components/recent_timelines/recent_timelines.tsx | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/public/overview/components/recent_timelines/recent_timelines.tsx b/x-pack/plugins/security_solution/public/overview/components/recent_timelines/recent_timelines.tsx index ee12c12536af5..b85a4509206b2 100644 --- a/x-pack/plugins/security_solution/public/overview/components/recent_timelines/recent_timelines.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/recent_timelines/recent_timelines.tsx @@ -15,6 +15,7 @@ import { } from '@elastic/eui'; import React, { useCallback, useMemo } from 'react'; +import styled from 'styled-components'; import { RecentTimelineHeader } from './header'; import { OnOpenTimeline, @@ -32,6 +33,15 @@ interface RecentTimelinesItemProps { isLastItem: boolean; } +const ClampText = styled.div` + /* Clamp text content to 3 lines */ + display: -webkit-box; + -webkit-line-clamp: 3; + -webkit-box-orient: vertical; + overflow: hidden; + word-break: break-word; +`; + const RecentTimelinesItem = React.memo( ({ timeline, onOpenTimeline, isLastItem }) => { const handleClick = useCallback( @@ -55,7 +65,7 @@ const RecentTimelinesItem = React.memo( {timeline.description && timeline.description.length && ( - {timeline.description} + {timeline.description} )} From 774fd6331d8a56266095e9f126dd87dce53e7a40 Mon Sep 17 00:00:00 2001 From: Yara Tercero Date: Tue, 1 Mar 2022 14:55:04 -0800 Subject: [PATCH 098/102] [Security Solution][Cypress] - Update cypress tests to match new min interval for rules Fixes failing cypress tests that are a result of this recent change within alerting - #125396 Rule min interval times now must be 1 minute or greater. --- .../cypress/integration/exceptions/from_alert.spec.ts | 2 +- .../cypress/integration/exceptions/from_rule.spec.ts | 2 +- x-pack/plugins/security_solution/cypress/objects/rule.ts | 2 ++ .../plugins/security_solution/cypress/tasks/api_calls/rules.ts | 2 ++ x-pack/test/security_solution_cypress/config.ts | 3 +++ 5 files changed, 9 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/security_solution/cypress/integration/exceptions/from_alert.spec.ts b/x-pack/plugins/security_solution/cypress/integration/exceptions/from_alert.spec.ts index a46565b09e5a6..189b95754e839 100644 --- a/x-pack/plugins/security_solution/cypress/integration/exceptions/from_alert.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/exceptions/from_alert.spec.ts @@ -35,7 +35,7 @@ describe.skip('From alert', () => { beforeEach(() => { cleanKibana(); loginAndWaitForPageWithoutDateRange(DETECTIONS_RULE_MANAGEMENT_URL); - createCustomRule({ ...getNewRule(), index: ['exceptions-*'] }, 'rule_testing', '10s'); + createCustomRule({ ...getNewRule(), index: ['exceptions-*'] }, 'rule_testing'); reload(); goToRuleDetails(); diff --git a/x-pack/plugins/security_solution/cypress/integration/exceptions/from_rule.spec.ts b/x-pack/plugins/security_solution/cypress/integration/exceptions/from_rule.spec.ts index 42c215ca7238d..cc4d6ec0b2e50 100644 --- a/x-pack/plugins/security_solution/cypress/integration/exceptions/from_rule.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/exceptions/from_rule.spec.ts @@ -35,7 +35,7 @@ describe.skip('From rule', () => { beforeEach(() => { cleanKibana(); loginAndWaitForPageWithoutDateRange(DETECTIONS_RULE_MANAGEMENT_URL); - createCustomRule({ ...getNewRule(), index: ['exceptions-*'] }, 'rule_testing', '10s'); + createCustomRule({ ...getNewRule(), index: ['exceptions-*'] }, 'rule_testing'); reload(); goToRuleDetails(); diff --git a/x-pack/plugins/security_solution/cypress/objects/rule.ts b/x-pack/plugins/security_solution/cypress/objects/rule.ts index 6a1c13b51509f..2f81c160f2801 100644 --- a/x-pack/plugins/security_solution/cypress/objects/rule.ts +++ b/x-pack/plugins/security_solution/cypress/objects/rule.ts @@ -163,6 +163,8 @@ const getSeverityOverride4 = (): SeverityOverride => ({ sourceValue: 'auditbeat', }); +// Default interval is 1m, our tests config overwrite this to 1s +// See https://github.com/elastic/kibana/pull/125396 for details const getRunsEvery = (): Interval => ({ interval: '1', timeType: 'Seconds', diff --git a/x-pack/plugins/security_solution/cypress/tasks/api_calls/rules.ts b/x-pack/plugins/security_solution/cypress/tasks/api_calls/rules.ts index 6e5de090627e0..13ba3af59be9a 100644 --- a/x-pack/plugins/security_solution/cypress/tasks/api_calls/rules.ts +++ b/x-pack/plugins/security_solution/cypress/tasks/api_calls/rules.ts @@ -58,6 +58,8 @@ export const createCustomIndicatorRule = (rule: ThreatIndicatorRule, ruleId = 'r rule_id: ruleId, risk_score: parseInt(rule.riskScore, 10), description: rule.description, + // Default interval is 1m, our tests config overwrite this to 1s + // See https://github.com/elastic/kibana/pull/125396 for details interval: '10s', name: rule.name, severity: rule.severity.toLocaleLowerCase(), diff --git a/x-pack/test/security_solution_cypress/config.ts b/x-pack/test/security_solution_cypress/config.ts index 383b7b31206a1..fde617bcf1ce4 100644 --- a/x-pack/test/security_solution_cypress/config.ts +++ b/x-pack/test/security_solution_cypress/config.ts @@ -43,6 +43,9 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { '--xpack.ruleRegistry.write.enabled=true', '--xpack.ruleRegistry.write.cache.enabled=false', '--xpack.ruleRegistry.unsafe.indexUpgrade.enabled=true', + // Without below line, default interval for rules is 1m + // See https://github.com/elastic/kibana/pull/125396 for details + '--xpack.alerting.minimumScheduleInterval=1s', '--xpack.ruleRegistry.unsafe.legacyMultiTenancy.enabled=true', `--xpack.securitySolution.enableExperimental=${JSON.stringify([ 'riskyHostsEnabled', From 31939f0ba9587bf31d0ffbe2361be6bf5fc29ea0 Mon Sep 17 00:00:00 2001 From: Walter Rafelsberger Date: Wed, 2 Mar 2022 11:39:40 +0100 Subject: [PATCH 099/102] [ML] Anomaly Detection: Update annotation directly using the index it is stored in. (#126573) Fixes the approach used to update an annotation so that it is update using the index that it is stored in. --- x-pack/plugins/ml/common/types/annotations.ts | 8 +-- .../__mocks__/get_annotations_response.json | 6 +-- .../annotation_service/annotation.test.ts | 2 +- .../models/annotation_service/annotation.ts | 50 +++++++++++-------- 4 files changed, 35 insertions(+), 31 deletions(-) diff --git a/x-pack/plugins/ml/common/types/annotations.ts b/x-pack/plugins/ml/common/types/annotations.ts index dbc146c1175d8..57b7551c2308a 100644 --- a/x-pack/plugins/ml/common/types/annotations.ts +++ b/x-pack/plugins/ml/common/types/annotations.ts @@ -6,10 +6,10 @@ */ // The Annotation interface is based on annotation documents stored in the -// `.ml-annotations-6` index, accessed via the `.ml-annotations-[read|write]` aliases. +// `.ml-annotations-*` index, accessed via the `.ml-annotations-[read|write]` aliases. // Annotation document mapping: -// PUT .ml-annotations-6 +// PUT .ml-annotations-000001 // { // "mappings": { // "annotation": { @@ -54,8 +54,8 @@ // POST /_aliases // { // "actions" : [ -// { "add" : { "index" : ".ml-annotations-6", "alias" : ".ml-annotations-read" } }, -// { "add" : { "index" : ".ml-annotations-6", "alias" : ".ml-annotations-write" } } +// { "add" : { "index" : ".ml-annotations-000001", "alias" : ".ml-annotations-read" } }, +// { "add" : { "index" : ".ml-annotations-000001", "alias" : ".ml-annotations-write" } } // ] // } diff --git a/x-pack/plugins/ml/server/models/annotation_service/__mocks__/get_annotations_response.json b/x-pack/plugins/ml/server/models/annotation_service/__mocks__/get_annotations_response.json index a0b8f6b242319..829b9c6581bea 100644 --- a/x-pack/plugins/ml/server/models/annotation_service/__mocks__/get_annotations_response.json +++ b/x-pack/plugins/ml/server/models/annotation_service/__mocks__/get_annotations_response.json @@ -15,8 +15,7 @@ "max_score": 0, "hits": [ { - "_index": ".ml-annotations-6", - "_type": "doc", + "_index": ".ml-annotations-000001", "_id": "T-CNvmgBQUJYQVn7TCPA", "_score": 0, "_source": { @@ -32,8 +31,7 @@ } }, { - "_index": ".ml-annotations-6", - "_type": "doc", + "_index": ".ml-annotations-000001", "_id": "3lVpvmgB5xYzd3PM-MSe", "_score": 0, "_source": { diff --git a/x-pack/plugins/ml/server/models/annotation_service/annotation.test.ts b/x-pack/plugins/ml/server/models/annotation_service/annotation.test.ts index fdeacd148434c..e6aa31501a557 100644 --- a/x-pack/plugins/ml/server/models/annotation_service/annotation.test.ts +++ b/x-pack/plugins/ml/server/models/annotation_service/annotation.test.ts @@ -41,7 +41,7 @@ describe('annotation_service', () => { const annotationMockId = 'mockId'; const deleteParamsMock: DeleteParams = { - index: '.ml-annotations-6', + index: '.ml-annotations-000001', id: annotationMockId, refresh: 'wait_for', }; diff --git a/x-pack/plugins/ml/server/models/annotation_service/annotation.ts b/x-pack/plugins/ml/server/models/annotation_service/annotation.ts index 4717a2ea1ce28..60d633b16097d 100644 --- a/x-pack/plugins/ml/server/models/annotation_service/annotation.ts +++ b/x-pack/plugins/ml/server/models/annotation_service/annotation.ts @@ -78,6 +78,31 @@ export interface AggByJob { } export function annotationProvider({ asInternalUser }: IScopedClusterClient) { + // Find the index the annotation is stored in. + async function fetchAnnotationIndex(id: string) { + const searchParams: estypes.SearchRequest = { + index: ML_ANNOTATIONS_INDEX_ALIAS_READ, + size: 1, + body: { + query: { + ids: { + values: [id], + }, + }, + }, + }; + + const body = await asInternalUser.search(searchParams); + const totalCount = + typeof body.hits.total === 'number' ? body.hits.total : body.hits.total!.value; + + if (totalCount === 0) { + throw Boom.notFound(`Cannot find annotation with ID ${id}`); + } + + return body.hits.hits[0]._index; + } + async function indexAnnotation(annotation: Annotation, username: string) { if (isAnnotation(annotation) === false) { // No need to translate, this will not be exposed in the UI. @@ -101,6 +126,8 @@ export function annotationProvider({ asInternalUser }: IScopedClusterClient) { if (typeof annotation._id !== 'undefined') { params.id = annotation._id; + params.index = await fetchAnnotationIndex(annotation._id); + params.require_alias = false; delete params.body._id; delete params.body.key; } @@ -387,28 +414,7 @@ export function annotationProvider({ asInternalUser }: IScopedClusterClient) { } async function deleteAnnotation(id: string) { - // Find the index the annotation is stored in. - const searchParams: estypes.SearchRequest = { - index: ML_ANNOTATIONS_INDEX_ALIAS_READ, - size: 1, - body: { - query: { - ids: { - values: [id], - }, - }, - }, - }; - - const body = await asInternalUser.search(searchParams); - const totalCount = - typeof body.hits.total === 'number' ? body.hits.total : body.hits.total!.value; - - if (totalCount === 0) { - throw Boom.notFound(`Cannot find annotation with ID ${id}`); - } - - const index = body.hits.hits[0]._index; + const index = await fetchAnnotationIndex(id); const deleteParams: DeleteParams = { index, From f694a2a26779879fb0e69d0d9092a7f314491e1d Mon Sep 17 00:00:00 2001 From: Ari Aviran Date: Wed, 2 Mar 2022 13:18:39 +0200 Subject: [PATCH 100/102] [Security Solution] Updates to Cloud Security Posture (#126590) Co-authored-by: Yarden Shalom Co-authored-by: Ido Cohen Co-authored-by: Or Ouziel --- .../common/constants.ts | 16 +- .../common/schemas/csp_rule.ts | 26 ++ .../cloud_security_posture/common/types.ts | 24 +- .../cloud_security_posture/kibana.json | 2 +- .../public/application/constants.tsx | 1 + .../public/application/index.tsx | 9 +- .../public/common/hooks/use_kibana.ts | 14 ++ .../common/hooks/use_navigate_findings.ts | 44 ++++ .../public/common/navigation/constants.ts | 3 +- .../public/common/navigation/types.ts | 2 +- .../public/components/chart_panel.tsx | 7 +- .../components/csp_evaluation_badge.tsx | 2 +- .../compliance_charts/cases_table.tsx | 24 ++ .../cloud_posture_score_chart.tsx | 37 ++- .../compliance_charts/compliance_stats.tsx | 158 ------------ .../compliance_charts/risks_table.test.ts | 24 +- .../compliance_charts/risks_table.tsx | 101 +++----- .../score_per_account_chart.tsx | 45 ---- .../dashboard_sections/benchmarks_section.tsx | 219 ++++++++--------- .../dashboard_sections/summary_section.tsx | 44 ++-- .../compliance_dashboard/translations.ts | 21 +- .../public/pages/findings/use_findings.ts | 5 +- .../public/pages/index.ts | 1 + .../public/pages/rules/index.tsx | 20 ++ .../public/pages/rules/use_csp_rules.ts | 66 +++++ .../cloud_security_posture/server/index.ts | 1 - .../server/lib/csp_app_services.ts | 36 +++ .../cloud_security_posture/server/plugin.ts | 24 +- .../routes/benchmarks/benchmarks.test.ts | 182 ++++++++++++++ .../server/routes/benchmarks/benchmarks.ts | 196 +++++++++++++++ .../compliance_dashboard.ts | 122 ++++++++++ .../compliance_dashboard/get_clusters.test.ts | 82 +++++++ .../compliance_dashboard/get_clusters.ts | 98 ++++++++ .../get_resources_types.test.ts | 51 ++++ .../get_resources_types.ts | 77 ++++++ .../compliance_dashboard/get_stats.test.ts | 86 +++++++ .../routes/compliance_dashboard/get_stats.ts | 74 ++++++ .../server/routes/findings/findings.test.ts | 65 ++++- .../server/routes/findings/findings.ts | 7 +- .../server/routes/index.ts | 13 +- .../server/routes/stats/stats.test.ts | 201 ---------------- .../server/routes/stats/stats.ts | 226 ------------------ .../server/routes/stats/stats_queries.ts | 111 --------- .../saved_objects/cis_1_4_1/csp_rule_type.ts | 58 +++++ .../cis_1_4_1/initialize_rules.ts | 24 ++ .../server/saved_objects/cis_1_4_1/rules.ts | 53 ++++ .../cloud_security_posture/server/types.ts | 5 +- .../cloud_security_posture/tsconfig.json | 3 +- 48 files changed, 1699 insertions(+), 1011 deletions(-) create mode 100644 x-pack/plugins/cloud_security_posture/common/schemas/csp_rule.ts create mode 100644 x-pack/plugins/cloud_security_posture/public/common/hooks/use_kibana.ts create mode 100644 x-pack/plugins/cloud_security_posture/public/common/hooks/use_navigate_findings.ts create mode 100644 x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/cases_table.tsx delete mode 100644 x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/compliance_stats.tsx delete mode 100644 x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/score_per_account_chart.tsx create mode 100644 x-pack/plugins/cloud_security_posture/public/pages/rules/index.tsx create mode 100644 x-pack/plugins/cloud_security_posture/public/pages/rules/use_csp_rules.ts create mode 100644 x-pack/plugins/cloud_security_posture/server/lib/csp_app_services.ts create mode 100644 x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts create mode 100644 x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.ts create mode 100644 x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/compliance_dashboard.ts create mode 100644 x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_clusters.test.ts create mode 100644 x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_clusters.ts create mode 100644 x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_resources_types.test.ts create mode 100644 x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_resources_types.ts create mode 100644 x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_stats.test.ts create mode 100644 x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_stats.ts delete mode 100644 x-pack/plugins/cloud_security_posture/server/routes/stats/stats.test.ts delete mode 100644 x-pack/plugins/cloud_security_posture/server/routes/stats/stats.ts delete mode 100644 x-pack/plugins/cloud_security_posture/server/routes/stats/stats_queries.ts create mode 100644 x-pack/plugins/cloud_security_posture/server/saved_objects/cis_1_4_1/csp_rule_type.ts create mode 100644 x-pack/plugins/cloud_security_posture/server/saved_objects/cis_1_4_1/initialize_rules.ts create mode 100644 x-pack/plugins/cloud_security_posture/server/saved_objects/cis_1_4_1/rules.ts diff --git a/x-pack/plugins/cloud_security_posture/common/constants.ts b/x-pack/plugins/cloud_security_posture/common/constants.ts index 8523c4b5757d4..84c62e62c3351 100644 --- a/x-pack/plugins/cloud_security_posture/common/constants.ts +++ b/x-pack/plugins/cloud_security_posture/common/constants.ts @@ -5,11 +5,15 @@ * 2.0. */ -export const CSP_KUBEBEAT_INDEX_PATTERN = 'logs-k8s_cis*'; -export const CSP_FINDINGS_INDEX_NAME = 'findings'; export const STATS_ROUTE_PATH = '/api/csp/stats'; export const FINDINGS_ROUTE_PATH = '/api/csp/findings'; -export const AGENT_LOGS_INDEX_PATTERN = '.logs-k8s_cis.metadata*'; +export const BENCHMARKS_ROUTE_PATH = '/api/csp/benchmarks'; + +export const CSP_KUBEBEAT_INDEX_PATTERN = 'logs-cis_kubernetes_benchmark.findings*'; +export const AGENT_LOGS_INDEX_PATTERN = '.logs-cis_kubernetes_benchmark.metadata*'; + +export const CSP_FINDINGS_INDEX_NAME = 'findings'; +export const CIS_KUBERNETES_PACKAGE_NAME = 'cis_kubernetes_benchmark'; export const RULE_PASSED = `passed`; export const RULE_FAILED = `failed`; @@ -17,5 +21,9 @@ export const RULE_FAILED = `failed`; // A mapping of in-development features to their status. These features should be hidden from users but can be easily // activated via a simple code change in a single location. export const INTERNAL_FEATURE_FLAGS = { - benchmarks: false, + showBenchmarks: false, + showTrendLineMock: false, + showClusterMetaMock: false, + showManageRulesMock: false, + showRisksMock: false, } as const; diff --git a/x-pack/plugins/cloud_security_posture/common/schemas/csp_rule.ts b/x-pack/plugins/cloud_security_posture/common/schemas/csp_rule.ts new file mode 100644 index 0000000000000..d5c8e9fab1f2e --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/common/schemas/csp_rule.ts @@ -0,0 +1,26 @@ +/* + * 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 { schema as rt, TypeOf } from '@kbn/config-schema'; + +export const cspRuleAssetSavedObjectType = 'csp_rule'; + +// TODO: needs to be shared with kubebeat +export const cspRuleSchema = rt.object({ + id: rt.string(), + name: rt.string(), + description: rt.string(), + rationale: rt.string(), + impact: rt.string(), + default_value: rt.string(), + remediation: rt.string(), + benchmark: rt.object({ name: rt.string(), version: rt.string() }), + tags: rt.arrayOf(rt.string()), + enabled: rt.boolean(), + muted: rt.boolean(), +}); + +export type CspRuleSchema = TypeOf; diff --git a/x-pack/plugins/cloud_security_posture/common/types.ts b/x-pack/plugins/cloud_security_posture/common/types.ts index aa6b1d5bc9854..435b9836c5754 100644 --- a/x-pack/plugins/cloud_security_posture/common/types.ts +++ b/x-pack/plugins/cloud_security_posture/common/types.ts @@ -9,25 +9,31 @@ export type Evaluation = 'passed' | 'failed' | 'NA'; /** number between 1-100 */ export type Score = number; -export interface FindingsResults { +export interface FindingsEvaluation { totalFindings: number; totalPassed: number; totalFailed: number; } -export interface Stats extends FindingsResults { +export interface Stats extends FindingsEvaluation { postureScore: Score; } -export interface ResourceTypeAgg extends FindingsResults { - resourceType: string; +export interface ResourceType extends FindingsEvaluation { + name: string; } -export interface BenchmarkStats extends Stats { - name: string; +export interface Cluster { + meta: { + clusterId: string; + benchmarkName: string; + }; + stats: Stats; + resourcesTypes: ResourceType[]; } -export interface CloudPostureStats extends Stats { - benchmarksStats: BenchmarkStats[]; - resourceTypesAggs: ResourceTypeAgg[]; +export interface CloudPostureStats { + stats: Stats; + resourcesTypes: ResourceType[]; + clusters: Cluster[]; } diff --git a/x-pack/plugins/cloud_security_posture/kibana.json b/x-pack/plugins/cloud_security_posture/kibana.json index 67143c15e2b7b..29f3813c211c7 100755 --- a/x-pack/plugins/cloud_security_posture/kibana.json +++ b/x-pack/plugins/cloud_security_posture/kibana.json @@ -10,6 +10,6 @@ "description": "The cloud security posture plugin", "server": true, "ui": true, - "requiredPlugins": ["navigation", "data"], + "requiredPlugins": ["navigation", "data", "fleet"], "requiredBundles": ["kibanaReact"] } diff --git a/x-pack/plugins/cloud_security_posture/public/application/constants.tsx b/x-pack/plugins/cloud_security_posture/public/application/constants.tsx index b592a30aeb2b4..128382d039f15 100644 --- a/x-pack/plugins/cloud_security_posture/public/application/constants.tsx +++ b/x-pack/plugins/cloud_security_posture/public/application/constants.tsx @@ -12,4 +12,5 @@ export const pageToComponentMapping: Record = findings: pages.Findings, dashboard: pages.ComplianceDashboard, benchmarks: pages.Benchmarks, + rules: pages.Rules, }; diff --git a/x-pack/plugins/cloud_security_posture/public/application/index.tsx b/x-pack/plugins/cloud_security_posture/public/application/index.tsx index 6530483bf2198..38fbef254ea44 100644 --- a/x-pack/plugins/cloud_security_posture/public/application/index.tsx +++ b/x-pack/plugins/cloud_security_posture/public/application/index.tsx @@ -7,8 +7,8 @@ import React from 'react'; import ReactDOM from 'react-dom'; +import { KibanaThemeProvider } from '../../../../../src/plugins/kibana_react/public'; import { CspApp } from './app'; - import type { AppMountParameters, CoreStart } from '../../../../../src/core/public'; import type { CspClientPluginStartDeps } from '../types'; @@ -17,7 +17,12 @@ export const renderApp = ( deps: CspClientPluginStartDeps, params: AppMountParameters ) => { - ReactDOM.render(, params.element); + ReactDOM.render( + + + , + params.element + ); return () => ReactDOM.unmountComponentAtNode(params.element); }; diff --git a/x-pack/plugins/cloud_security_posture/public/common/hooks/use_kibana.ts b/x-pack/plugins/cloud_security_posture/public/common/hooks/use_kibana.ts new file mode 100644 index 0000000000000..b2d1d2a7b6bbe --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/common/hooks/use_kibana.ts @@ -0,0 +1,14 @@ +/* + * 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 type { CoreStart } from '../../../../../../src/core/public'; +import type { CspClientPluginStartDeps } from '../../types'; +import { useKibana as useKibanaBase } from '../../../../../../src/plugins/kibana_react/public'; + +type CspKibanaContext = CoreStart & CspClientPluginStartDeps; + +export const useKibana = () => useKibanaBase(); diff --git a/x-pack/plugins/cloud_security_posture/public/common/hooks/use_navigate_findings.ts b/x-pack/plugins/cloud_security_posture/public/common/hooks/use_navigate_findings.ts new file mode 100644 index 0000000000000..6cc1582d7ff7b --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/common/hooks/use_navigate_findings.ts @@ -0,0 +1,44 @@ +/* + * 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 { useHistory } from 'react-router-dom'; +import { Query } from '@kbn/es-query'; +import { allNavigationItems } from '../navigation/constants'; +import { encodeQuery } from '../navigation/query_utils'; +import { CspFindingsRequest } from '../../pages/findings/use_findings'; + +const getFindingsQuery = (queryValue: Query['query']): Pick => { + const query = + typeof queryValue === 'string' + ? queryValue + : // TODO: use a tested query builder instead ASAP + Object.entries(queryValue) + .reduce((a, [key, value]) => { + a.push(`${key} : "${value}"`); + return a; + }, []) + .join(' and '); + + return { + query: { + language: 'kuery', + // NOTE: a query object is valid TS but throws on runtime + query, + }, + }!; +}; + +export const useNavigateFindings = () => { + const history = useHistory(); + + return (query?: Query['query']) => { + history.push({ + pathname: allNavigationItems.findings.path, + ...(query && { search: encodeQuery(getFindingsQuery(query)) }), + }); + }; +}; diff --git a/x-pack/plugins/cloud_security_posture/public/common/navigation/constants.ts b/x-pack/plugins/cloud_security_posture/public/common/navigation/constants.ts index bde28fa1ce3b5..4e07a4c800f53 100644 --- a/x-pack/plugins/cloud_security_posture/public/common/navigation/constants.ts +++ b/x-pack/plugins/cloud_security_posture/public/common/navigation/constants.ts @@ -12,9 +12,10 @@ import type { CspPage, CspNavigationItem } from './types'; export const allNavigationItems: Record = { dashboard: { name: TEXT.DASHBOARD, path: '/dashboard' }, findings: { name: TEXT.FINDINGS, path: '/findings' }, + rules: { name: 'Rules', path: '/rules', disabled: true }, benchmarks: { name: TEXT.MY_BENCHMARKS, path: '/benchmarks', - disabled: !INTERNAL_FEATURE_FLAGS.benchmarks, + disabled: !INTERNAL_FEATURE_FLAGS.showBenchmarks, }, }; diff --git a/x-pack/plugins/cloud_security_posture/public/common/navigation/types.ts b/x-pack/plugins/cloud_security_posture/public/common/navigation/types.ts index 64db2e59b667f..87f62b88ba171 100644 --- a/x-pack/plugins/cloud_security_posture/public/common/navigation/types.ts +++ b/x-pack/plugins/cloud_security_posture/public/common/navigation/types.ts @@ -10,4 +10,4 @@ export interface CspNavigationItem { readonly disabled?: boolean; } -export type CspPage = 'dashboard' | 'findings' | 'benchmarks'; +export type CspPage = 'dashboard' | 'findings' | 'benchmarks' | 'rules'; diff --git a/x-pack/plugins/cloud_security_posture/public/components/chart_panel.tsx b/x-pack/plugins/cloud_security_posture/public/components/chart_panel.tsx index 5190f71a1721a..2b0882d0916e6 100644 --- a/x-pack/plugins/cloud_security_posture/public/components/chart_panel.tsx +++ b/x-pack/plugins/cloud_security_posture/public/components/chart_panel.tsx @@ -6,7 +6,6 @@ */ import React from 'react'; -import { css } from '@emotion/react'; import { EuiPanel, EuiText, @@ -64,7 +63,7 @@ export const ChartPanel: React.FC = ({ {title && ( - +

      {title}

      )} @@ -74,7 +73,3 @@ export const ChartPanel: React.FC = ({ ); }; - -const euiTitleStyle = css` - font-weight: 400; -`; diff --git a/x-pack/plugins/cloud_security_posture/public/components/csp_evaluation_badge.tsx b/x-pack/plugins/cloud_security_posture/public/components/csp_evaluation_badge.tsx index 8603bef59122e..93aa87c18a9b8 100644 --- a/x-pack/plugins/cloud_security_posture/public/components/csp_evaluation_badge.tsx +++ b/x-pack/plugins/cloud_security_posture/public/components/csp_evaluation_badge.tsx @@ -6,7 +6,7 @@ */ import React from 'react'; -import { EuiBadge, EuiBadgeProps } from '@elastic/eui'; +import { EuiBadge, type EuiBadgeProps } from '@elastic/eui'; import { CSP_EVALUATION_BADGE_FAILED, CSP_EVALUATION_BADGE_PASSED } from './translations'; interface Props { diff --git a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/cases_table.tsx b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/cases_table.tsx new file mode 100644 index 0000000000000..30107d6689752 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/cases_table.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 from 'react'; +import { EuiFlexGroup, EuiFlexItem, EuiText } from '@elastic/eui'; +import { EuiIcon } from '@elastic/eui'; +import * as TEXT from '../translations'; + +export const CasesTable = () => { + return ( + + + + + + {TEXT.COMING_SOON} + + + ); +}; diff --git a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/cloud_posture_score_chart.tsx b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/cloud_posture_score_chart.tsx index 01dfd837fca2f..a1f044241e5d3 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/cloud_posture_score_chart.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/cloud_posture_score_chart.tsx @@ -7,18 +7,23 @@ import React from 'react'; import { + AreaSeries, + Axis, Chart, ElementClickListener, + niceTimeFormatByDay, Partition, PartitionElementEvent, PartitionLayout, Settings, + timeFormatter, } from '@elastic/charts'; import { EuiFlexGroup, EuiText, EuiHorizontalRule, EuiFlexItem } from '@elastic/eui'; import { statusColors } from '../../../common/constants'; import type { Stats } from '../../../../common/types'; import * as TEXT from '../translations'; import { CompactFormattedNumber } from '../../../components/compact_formatted_number'; +import { INTERNAL_FEATURE_FLAGS } from '../../../../common/constants'; interface CloudPostureScoreChartProps { data: Stats; @@ -37,7 +42,7 @@ const ScoreChart = ({ ]; return ( - +
      Trend Placeholder
      ; +const mockData = [ + [0, 9], + [1000, 70], + [2000, 40], + [4000, 90], + [5000, 53], +]; + +const ComplianceTrendChart = () => ( + + + + + + +); export const CloudPostureScoreChart = ({ data, @@ -97,8 +124,8 @@ export const CloudPostureScoreChart = ({ }: CloudPostureScoreChartProps) => ( - - + + @@ -106,7 +133,7 @@ export const CloudPostureScoreChart = ({ - + diff --git a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/compliance_stats.tsx b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/compliance_stats.tsx deleted file mode 100644 index 1dff4aba203b9..0000000000000 --- a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/compliance_stats.tsx +++ /dev/null @@ -1,158 +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 { - EuiStat, - EuiFlexItem, - EuiPanel, - EuiIcon, - EuiFlexGrid, - EuiText, - // EuiFlexGroup, -} from '@elastic/eui'; -// import { Chart, Settings, LineSeries } from '@elastic/charts'; -import type { IconType, EuiStatProps } from '@elastic/eui'; -import { useCloudPostureStatsApi } from '../../../common/api'; -import { statusColors } from '../../../common/constants'; -import { Score } from '../../../../common/types'; -import * as TEXT from '../translations'; -import { NO_DATA_TO_DISPLAY } from '../translations'; - -// type Trend = Array<[time: number, value: number]>; - -// TODO: this is the warning color hash listen in EUI's docs. need to find where to import it from. - -const getTitleColor = (value: Score): EuiStatProps['titleColor'] => { - if (value <= 65) return 'danger'; - if (value <= 95) return statusColors.warning; - if (value <= 100) return 'success'; - return 'default'; -}; - -const getScoreIcon = (value: Score): IconType => { - if (value <= 65) return 'alert'; - if (value <= 86) return 'alert'; - if (value <= 100) return 'check'; - return 'error'; -}; - -// TODO: make score trend check for length, cases for less than 2 or more than 5 should be handled -// const getScoreTrendPercentage = (scoreTrend: Trend) => { -// const beforeLast = scoreTrend[scoreTrend.length - 2][1]; -// const last = scoreTrend[scoreTrend.length - 1][1]; -// -// return Number((last - beforeLast).toFixed(1)); -// }; - -const placeholder = ( - - {NO_DATA_TO_DISPLAY} - -); - -export const ComplianceStats = () => { - const getStats = useCloudPostureStatsApi(); - // TODO: add error/loading state - if (!getStats.isSuccess) return null; - const { postureScore, benchmarksStats: benchmarks } = getStats.data; - - // TODO: in case we dont have a full length trend we will need to handle the sparkline chart alone. not rendering anything is just a temporary solution - if (!benchmarks || !postureScore) return null; - - // TODO: mock data, needs BE - // const scoreTrend = [ - // [0, 0], - // [1, 10], - // [2, 100], - // [3, 50], - // [4, postureScore], - // ] as Trend; - // - // const scoreChange = getScoreTrendPercentage(scoreTrend); - // const isPositiveChange = scoreChange > 0; - - const stats = [ - { - title: postureScore, - description: TEXT.POSTURE_SCORE, - titleColor: getTitleColor(postureScore), - iconType: getScoreIcon(postureScore), - }, - { - // TODO: remove placeholder for the commented out component, needs BE - title: placeholder, - description: TEXT.POSTURE_SCORE_TREND, - }, - // { - // title: ( - // - // - // {`${scoreChange}%`} - // - // ), - // description: 'Posture Score Trend', - // titleColor: isPositiveChange ? 'success' : 'danger', - // renderBody: ( - // <> - // - // - // - // - // - // ), - // }, - { - // TODO: this should count only ACTIVE benchmarks. needs BE - title: benchmarks.length, - description: TEXT.ACTIVE_FRAMEWORKS, - }, - { - // TODO: should be relatively simple to return from BE. needs BE - title: placeholder, - description: TEXT.TOTAL_RESOURCES, - }, - ]; - - return ( - - {stats.map((s) => ( - - - - { - // s.renderBody || - - } - - - - ))} - - ); -}; diff --git a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/risks_table.test.ts b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/risks_table.test.ts index 0c750e10f060a..6b2c00c507e6f 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/risks_table.test.ts +++ b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/risks_table.test.ts @@ -5,45 +5,45 @@ * 2.0. */ -import { getTop5Risks, RisksTableProps } from './risks_table'; +import { getTopRisks, RisksTableProps } from './risks_table'; const podsAgg = { - resourceType: 'pods', + name: 'pods', totalFindings: 2, totalPassed: 1, totalFailed: 1, }; const etcdAgg = { - resourceType: 'etcd', + name: 'etcd', totalFindings: 5, totalPassed: 0, totalFailed: 5, }; const clusterAgg = { - resourceType: 'cluster', + name: 'cluster', totalFindings: 2, totalPassed: 2, totalFailed: 0, }; const systemAgg = { - resourceType: 'system', + name: 'system', totalFindings: 10, totalPassed: 6, totalFailed: 4, }; const apiAgg = { - resourceType: 'api', + name: 'api', totalFindings: 19100, totalPassed: 2100, totalFailed: 17000, }; const serverAgg = { - resourceType: 'server', + name: 'server', totalFindings: 7, totalPassed: 4, totalFailed: 3, @@ -58,16 +58,16 @@ const mockData: RisksTableProps['data'] = [ serverAgg, ]; -describe('getTop5Risks', () => { +describe('getTopRisks', () => { it('returns sorted by failed findings', () => { - expect(getTop5Risks([systemAgg, etcdAgg, apiAgg])).toEqual([apiAgg, etcdAgg, systemAgg]); + expect(getTopRisks([systemAgg, etcdAgg, apiAgg], 3)).toEqual([apiAgg, etcdAgg, systemAgg]); }); it('return array filtered with failed findings only', () => { - expect(getTop5Risks([systemAgg, clusterAgg, apiAgg])).toEqual([apiAgg, systemAgg]); + expect(getTopRisks([systemAgg, clusterAgg, apiAgg], 3)).toEqual([apiAgg, systemAgg]); }); - it('return sorted and filtered array with no more then 5 elements', () => { - expect(getTop5Risks(mockData)).toEqual([apiAgg, etcdAgg, systemAgg, serverAgg, podsAgg]); + it('return sorted and filtered array with the correct number of elements', () => { + expect(getTopRisks(mockData, 5)).toEqual([apiAgg, etcdAgg, systemAgg, serverAgg, podsAgg]); }); }); diff --git a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/risks_table.tsx b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/risks_table.tsx index fb43a8129ed77..1e355b3f3c82f 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/risks_table.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/risks_table.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React, { useCallback, useMemo } from 'react'; +import React, { useMemo } from 'react'; import { EuiBasicTable, EuiButtonEmpty, @@ -14,50 +14,44 @@ import { EuiLink, EuiText, } from '@elastic/eui'; -import type { Query } from '@kbn/es-query'; -import { useHistory } from 'react-router-dom'; -import { CloudPostureStats, ResourceTypeAgg } from '../../../../common/types'; -import { allNavigationItems } from '../../../common/navigation/constants'; -import { encodeQuery } from '../../../common/navigation/query_utils'; +import { CloudPostureStats, ResourceType } from '../../../../common/types'; import { CompactFormattedNumber } from '../../../components/compact_formatted_number'; import * as TEXT from '../translations'; -import { RULE_FAILED } from '../../../../common/constants'; +import { INTERNAL_FEATURE_FLAGS } from '../../../../common/constants'; -// TODO: remove this option after we get data from the beat -const useMockData: boolean = false; -const mock = [ +const mockData = [ { - resourceType: 'pods', + name: 'pods', totalFindings: 2, totalPassed: 1, totalFailed: 1, }, { - resourceType: 'etcd', + name: 'etcd', totalFindings: 5, totalPassed: 0, totalFailed: 5, }, { - resourceType: 'cluster', + name: 'cluster', totalFindings: 2, totalPassed: 2, totalFailed: 0, }, { - resourceType: 'system', + name: 'system', totalFindings: 10, totalPassed: 6, totalFailed: 4, }, { - resourceType: 'api', + name: 'api', totalFindings: 19100, totalPassed: 2100, totalFailed: 17000, }, { - resourceType: 'server', + name: 'server', totalFindings: 7, totalPassed: 4, totalFailed: 3, @@ -65,62 +59,41 @@ const mock = [ ]; export interface RisksTableProps { - data: CloudPostureStats['resourceTypesAggs']; + data: CloudPostureStats['resourcesTypes']; + maxItems: number; + onCellClick: (resourceTypeName: string) => void; + onViewAllClick: () => void; } -const maxRisks = 5; - -export const getTop5Risks = (resourceTypesAggs: CloudPostureStats['resourceTypesAggs']) => { - const filtered = resourceTypesAggs.filter((x) => x.totalFailed > 0); +export const getTopRisks = ( + resourcesTypes: CloudPostureStats['resourcesTypes'], + maxItems: number +) => { + const filtered = resourcesTypes.filter((x) => x.totalFailed > 0); const sorted = filtered.slice().sort((first, second) => second.totalFailed - first.totalFailed); - return sorted.slice(0, maxRisks); + return sorted.slice(0, maxItems); }; -const getFailedFindingsQuery = (): Query => ({ - language: 'kuery', - query: `result.evaluation : "${RULE_FAILED}" `, -}); - -const getResourceTypeFailedFindingsQuery = (resourceType: string): Query => ({ - language: 'kuery', - query: `resource.type : "${resourceType}" and result.evaluation : "${RULE_FAILED}" `, -}); - -export const RisksTable = ({ data: resourceTypesAggs }: RisksTableProps) => { - const { push } = useHistory(); - - const handleCellClick = useCallback( - (resourceType: ResourceTypeAgg['resourceType']) => - push({ - pathname: allNavigationItems.findings.path, - search: encodeQuery(getResourceTypeFailedFindingsQuery(resourceType)), - }), - [push] - ); - - const handleViewAllClick = useCallback( - () => - push({ - pathname: allNavigationItems.findings.path, - search: encodeQuery(getFailedFindingsQuery()), - }), - [push] - ); - +export const RisksTable = ({ + data: resourcesTypes, + maxItems, + onCellClick, + onViewAllClick, +}: RisksTableProps) => { const columns = useMemo( () => [ { - field: 'resourceType', + field: 'name', name: TEXT.RESOURCE_TYPE, - render: (resourceType: ResourceTypeAgg['resourceType']) => ( - handleCellClick(resourceType)}>{resourceType} + render: (resourceTypeName: ResourceType['name']) => ( + onCellClick(resourceTypeName)}>{resourceTypeName} ), }, { field: 'totalFailed', - name: TEXT.FAILED_FINDINGS, - render: (totalFailed: ResourceTypeAgg['totalFailed'], resource: ResourceTypeAgg) => ( + name: TEXT.FINDINGS, + render: (totalFailed: ResourceType['totalFailed'], resource: ResourceType) => ( <> @@ -133,22 +106,24 @@ export const RisksTable = ({ data: resourceTypesAggs }: RisksTableProps) => { ), }, ], - [handleCellClick] + [onCellClick] ); + const items = useMemo(() => getTopRisks(resourcesTypes, maxItems), [resourcesTypes, maxItems]); + return ( - - rowHeader="resourceType" - items={useMockData ? getTop5Risks(mock) : getTop5Risks(resourceTypesAggs)} + + rowHeader="name" + items={INTERNAL_FEATURE_FLAGS.showRisksMock ? getTopRisks(mockData, maxItems) : items} columns={columns} /> - + {TEXT.VIEW_ALL_FAILED_FINDINGS} diff --git a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/score_per_account_chart.tsx b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/score_per_account_chart.tsx deleted file mode 100644 index fd47a3ecf9e43..0000000000000 --- a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/score_per_account_chart.tsx +++ /dev/null @@ -1,45 +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 { Axis, BarSeries, Chart, Settings } from '@elastic/charts'; -import { statusColors } from '../../../common/constants'; - -// soon to be deprecated -export const ScorePerAccountChart = () => { - return ( - - - - `${Number(v * 100).toFixed(0)}%`, - }} - id="bars" - data={[]} - xAccessor={'resource'} - yAccessors={['value']} - splitSeriesAccessors={['evaluation']} - stackAccessors={['evaluation']} - stackMode="percentage" - /> - - ); -}; - -const theme = { - colors: { vizColors: [statusColors.success, statusColors.danger] }, - barSeriesStyle: { - displayValue: { - fontSize: 14, - fill: { color: 'white', borderColor: 'blue', borderWidth: 0 }, - offsetX: 5, - offsetY: -5, - }, - }, -}; diff --git a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/benchmarks_section.tsx b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/benchmarks_section.tsx index fcbfe47ea6d2c..c94f138616f55 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/benchmarks_section.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/benchmarks_section.tsx @@ -7,27 +7,26 @@ import React from 'react'; import { - EuiFlexGrid, EuiFlexItem, EuiPanel, EuiIcon, - EuiTitle, EuiSpacer, - EuiDescriptionList, + EuiFlexGroup, + EuiText, + EuiButtonEmpty, + useEuiTheme, } from '@elastic/eui'; import { EuiIconType } from '@elastic/eui/src/components/icon/icon'; -import { Query } from '@kbn/es-query'; -import { useHistory } from 'react-router-dom'; import { PartitionElementEvent } from '@elastic/charts'; +import { EuiThemeComputed } from '@elastic/eui/src/services/theme/types'; import { CloudPostureScoreChart } from '../compliance_charts/cloud_posture_score_chart'; -import { ComplianceTrendChart } from '../compliance_charts/compliance_trend_chart'; import { useCloudPostureStatsApi } from '../../../common/api/use_cloud_posture_stats_api'; -import { CspHealthBadge } from '../../../components/csp_health_badge'; import { ChartPanel } from '../../../components/chart_panel'; import * as TEXT from '../translations'; -import { allNavigationItems } from '../../../common/navigation/constants'; -import { encodeQuery } from '../../../common/navigation/query_utils'; import { Evaluation } from '../../../../common/types'; +import { RisksTable } from '../compliance_charts/risks_table'; +import { INTERNAL_FEATURE_FLAGS, RULE_FAILED } from '../../../../common/constants'; +import { useNavigateFindings } from '../../../common/hooks/use_navigate_findings'; const logoMap: ReadonlyMap = new Map([['CIS Kubernetes', 'logoKubernetes']]); @@ -35,118 +34,120 @@ const getBenchmarkLogo = (benchmarkName: string): EuiIconType => { return logoMap.get(benchmarkName) ?? 'logoElastic'; }; -const getBenchmarkEvaluationQuery = (name: string, evaluation: Evaluation): Query => ({ - language: 'kuery', - query: `rule.benchmark : "${name}" and result.evaluation : "${evaluation}"`, -}); +const mockClusterId = '2468540'; + +const cardHeight = 300; export const BenchmarksSection = () => { - const history = useHistory(); + const { euiTheme } = useEuiTheme(); + const navToFindings = useNavigateFindings(); const getStats = useCloudPostureStatsApi(); - const benchmarks = getStats.isSuccess && getStats.data.benchmarksStats; - if (!benchmarks) return null; + const clusters = getStats.isSuccess && getStats.data.clusters; + if (!clusters) return null; - const handleElementClick = (name: string, elements: PartitionElementEvent[]) => { + const handleElementClick = (clusterId: string, elements: PartitionElementEvent[]) => { const [element] = elements; const [layerValue] = element; - const rollupValue = layerValue[0].groupByRollup as Evaluation; + const evaluation = layerValue[0].groupByRollup as Evaluation; - history.push({ - pathname: allNavigationItems.findings.path, - search: encodeQuery(getBenchmarkEvaluationQuery(name, rollupValue)), + navToFindings({ cluster_id: clusterId, 'result.evaluation': evaluation }); + }; + + const handleCellClick = (clusterId: string, resourceTypeName: string) => { + navToFindings({ + cluster_id: clusterId, + 'resource.type': resourceTypeName, + 'result.evaluation': RULE_FAILED, }); }; + const handleViewAllClick = (clusterId: string) => { + navToFindings({ cluster_id: clusterId, 'result.evaluation': RULE_FAILED }); + }; + return ( <> - {benchmarks.map((benchmark) => ( - - - - - - -

      {benchmark.name}

      -
      -
      - - - - handleElementClick(benchmark.name, elements) - } - /> - - ), - }, - ]} - /> - - - - {/* TODO: no api for this chart yet, using empty state for now. needs BE */} - - - ), - }, - ]} - /> - - - - ) : ( - TEXT.ERROR - ), - }, - { - title: TEXT.TOTAL_FAILURES, - description: benchmark.totalFailed || TEXT.ERROR, - }, - ]} - /> - -
      -
      - ))} + {clusters.map((cluster) => { + const shortId = cluster.meta.clusterId.slice(0, 6); + + return ( + <> + + + + + + +

      {cluster.meta.benchmarkName}

      +
      + +

      {`Cluster ID ${shortId || mockClusterId}`}

      +
      + {INTERNAL_FEATURE_FLAGS.showClusterMetaMock && ( + + + {' Updated 7 second ago'} + + )} +
      + + + + + {INTERNAL_FEATURE_FLAGS.showManageRulesMock && ( + {'Manage Rules'} + )} + +
      +
      + + + + handleElementClick(cluster.meta.clusterId, elements) + } + /> + + + + + + handleCellClick(cluster.meta.clusterId, resourceTypeName) + } + onViewAllClick={() => handleViewAllClick(cluster.meta.clusterId)} + /> + + +
      +
      + + + ); + })} ); }; + +const getIntegrationBoxStyle = (euiTheme: EuiThemeComputed) => ({ + border: `1px solid ${euiTheme.colors.lightShade}`, + borderRadius: `${euiTheme.border.radius.medium} 0 0 ${euiTheme.border.radius.medium}`, + background: euiTheme.colors.lightestShade, +}); diff --git a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/summary_section.tsx b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/summary_section.tsx index db768aa5c7b78..01dd072907472 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/summary_section.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/summary_section.tsx @@ -7,23 +7,16 @@ import React from 'react'; import { EuiFlexGrid, EuiFlexItem } from '@elastic/eui'; -import { useHistory } from 'react-router-dom'; import { PartitionElementEvent } from '@elastic/charts'; -import { Query } from '@kbn/es-query'; -import { ScorePerAccountChart } from '../compliance_charts/score_per_account_chart'; import { ChartPanel } from '../../../components/chart_panel'; import { useCloudPostureStatsApi } from '../../../common/api'; import * as TEXT from '../translations'; import { CloudPostureScoreChart } from '../compliance_charts/cloud_posture_score_chart'; -import { allNavigationItems } from '../../../common/navigation/constants'; -import { encodeQuery } from '../../../common/navigation/query_utils'; import { Evaluation } from '../../../../common/types'; import { RisksTable } from '../compliance_charts/risks_table'; - -const getEvaluationQuery = (evaluation: Evaluation): Query => ({ - language: 'kuery', - query: `"result.evaluation : "${evaluation}"`, -}); +import { CasesTable } from '../compliance_charts/cases_table'; +import { useNavigateFindings } from '../../../common/hooks/use_navigate_findings'; +import { RULE_FAILED } from '../../../../common/constants'; const defaultHeight = 360; @@ -33,19 +26,24 @@ const summarySectionWrapperStyle = { }; export const SummarySection = () => { - const history = useHistory(); + const navToFindings = useNavigateFindings(); const getStats = useCloudPostureStatsApi(); if (!getStats.isSuccess) return null; const handleElementClick = (elements: PartitionElementEvent[]) => { const [element] = elements; const [layerValue] = element; - const rollupValue = layerValue[0].groupByRollup as Evaluation; + const evaluation = layerValue[0].groupByRollup as Evaluation; + + navToFindings({ 'result.evaluation': evaluation }); + }; - history.push({ - pathname: allNavigationItems.findings.path, - search: encodeQuery(getEvaluationQuery(rollupValue)), - }); + const handleCellClick = (resourceTypeName: string) => { + navToFindings({ 'resource.type': resourceTypeName, 'result.evaluation': RULE_FAILED }); + }; + + const handleViewAllClick = () => { + navToFindings({ 'result.evaluation': RULE_FAILED }); }; return ( @@ -58,24 +56,28 @@ export const SummarySection = () => { >
      - + - {/* TODO: no api for this chart yet, using empty state for now. needs BE */} - + diff --git a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/translations.ts b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/translations.ts index 975c0069f1479..0d62625f98254 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/translations.ts +++ b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/translations.ts @@ -19,12 +19,13 @@ export const RISKS = i18n.translate('xpack.csp.risks', { defaultMessage: 'Risks', }); -export const SCORE_PER_CLUSTER_CHART_TITLE = i18n.translate( - 'xpack.csp.score_per_cluster_chart_title', - { - defaultMessage: 'Score Per Account / Cluster', - } -); +export const OPEN_CASES = i18n.translate('xpack.csp.open_cases', { + defaultMessage: 'Open Cases', +}); + +export const COMING_SOON = i18n.translate('xpack.csp.coming_soon', { + defaultMessage: 'Coming soon', +}); export const COMPLIANCE_SCORE = i18n.translate('xpack.csp.compliance_score', { defaultMessage: 'Compliance Score', @@ -78,10 +79,6 @@ export const RESOURCE_TYPE = i18n.translate('xpack.csp.resource_type', { defaultMessage: 'Resource Type', }); -export const FAILED_FINDINGS = i18n.translate('xpack.csp.failed_findings', { - defaultMessage: 'Failed Findings', -}); - -export const NO_DATA_TO_DISPLAY = i18n.translate('xpack.csp.complianceDashboard.noDataLabel', { - defaultMessage: 'No data to display', +export const FINDINGS = i18n.translate('xpack.csp.findings', { + defaultMessage: 'Findings', }); diff --git a/x-pack/plugins/cloud_security_posture/public/pages/findings/use_findings.ts b/x-pack/plugins/cloud_security_posture/public/pages/findings/use_findings.ts index c1b83bc671d16..38228e513e31b 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/findings/use_findings.ts +++ b/x-pack/plugins/cloud_security_posture/public/pages/findings/use_findings.ts @@ -67,9 +67,10 @@ const mapEsQuerySortKey = (sort: readonly EsQuerySortValue[]): EsQuerySortValue[ }, []); const showResponseErrorToast = - ({ toasts: { addDanger } }: CoreStart['notifications']) => + ({ toasts }: CoreStart['notifications']) => (error: unknown): void => { - addDanger(extractErrorMessage(error, TEXT.SEARCH_FAILED)); + if (error instanceof Error) toasts.addError(error, { title: TEXT.SEARCH_FAILED }); + else toasts.addDanger(extractErrorMessage(error, TEXT.SEARCH_FAILED)); }; const extractFindings = ({ diff --git a/x-pack/plugins/cloud_security_posture/public/pages/index.ts b/x-pack/plugins/cloud_security_posture/public/pages/index.ts index 55d62913e4474..1e667a8949fc0 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/index.ts +++ b/x-pack/plugins/cloud_security_posture/public/pages/index.ts @@ -8,3 +8,4 @@ export { Findings } from './findings'; export * from './compliance_dashboard'; export { Benchmarks } from './benchmarks'; +export { Rules } from './rules'; diff --git a/x-pack/plugins/cloud_security_posture/public/pages/rules/index.tsx b/x-pack/plugins/cloud_security_posture/public/pages/rules/index.tsx new file mode 100644 index 0000000000000..130f03fd5784d --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/pages/rules/index.tsx @@ -0,0 +1,20 @@ +/* + * 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 type { EuiPageHeaderProps } from '@elastic/eui'; +import { CspPageTemplate } from '../../components/page_template'; + +// TODO: +// - get selected integration + +const pageHeader: EuiPageHeaderProps = { + pageTitle: 'Rules', +}; + +export const Rules = () => { + return ; +}; diff --git a/x-pack/plugins/cloud_security_posture/public/pages/rules/use_csp_rules.ts b/x-pack/plugins/cloud_security_posture/public/pages/rules/use_csp_rules.ts new file mode 100644 index 0000000000000..a11256edaa40e --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/pages/rules/use_csp_rules.ts @@ -0,0 +1,66 @@ +/* + * 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 { useQuery, useMutation, useQueryClient } from 'react-query'; +import { cspRuleAssetSavedObjectType, type CspRuleSchema } from '../../../common/schemas/csp_rule'; +import type { + SavedObjectsBatchResponse, + SavedObjectsFindOptions, +} from '../../../../../../src/core/public'; +import { useKibana } from '../../common/hooks/use_kibana'; + +export type UseCspRulesOptions = Pick< + SavedObjectsFindOptions, + 'search' | 'searchFields' | 'page' | 'perPage' +>; + +export const useFindCspRules = ({ + search, + searchFields, + page = 1, + perPage = 10, +}: UseCspRulesOptions) => { + const { savedObjects } = useKibana().services; + return useQuery( + [cspRuleAssetSavedObjectType, { search, searchFields, page, perPage }], + () => + savedObjects.client.find({ + type: cspRuleAssetSavedObjectType, + search, + searchFields, + page, + // NOTE: 'name.raw' is a field maping we defined on 'name' so it'd also be sortable + // TODO: this needs to be shared or removed + sortField: 'name.raw', + perPage, + }), + { refetchOnWindowFocus: false } + ); +}; + +export const useBulkUpdateCspRules = () => { + const { savedObjects } = useKibana().services; + const queryClient = useQueryClient(); + + return useMutation( + (rules: CspRuleSchema[]) => + savedObjects.client.bulkUpdate( + rules.map((rule) => ({ + type: cspRuleAssetSavedObjectType, + id: rule.id, + attributes: rule, + })) + // TODO: fix bulkUpdate types in core + ) as Promise>, + { + onSettled: () => + queryClient.invalidateQueries({ + queryKey: cspRuleAssetSavedObjectType, + exact: false, + }), + } + ); +}; diff --git a/x-pack/plugins/cloud_security_posture/server/index.ts b/x-pack/plugins/cloud_security_posture/server/index.ts index c0912e68218c8..f790ac5256ff8 100755 --- a/x-pack/plugins/cloud_security_posture/server/index.ts +++ b/x-pack/plugins/cloud_security_posture/server/index.ts @@ -4,7 +4,6 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ - import type { PluginInitializerContext } from '../../../../src/core/server'; import { CspPlugin } from './plugin'; diff --git a/x-pack/plugins/cloud_security_posture/server/lib/csp_app_services.ts b/x-pack/plugins/cloud_security_posture/server/lib/csp_app_services.ts new file mode 100644 index 0000000000000..f769ea171c176 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/server/lib/csp_app_services.ts @@ -0,0 +1,36 @@ +/* + * 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 { + AgentService, + PackageService, + AgentPolicyServiceInterface, + PackagePolicyServiceInterface, +} from '../../../fleet/server'; + +export interface CspAppServiceDependencies { + packageService: PackageService; + agentService: AgentService; + packagePolicyService: PackagePolicyServiceInterface; + agentPolicyService: AgentPolicyServiceInterface; +} + +export class CspAppService { + public agentService: AgentService | undefined; + public packageService: PackageService | undefined; + public packagePolicyService: PackagePolicyServiceInterface | undefined; + public agentPolicyService: AgentPolicyServiceInterface | undefined; + + public start(dependencies: CspAppServiceDependencies) { + this.agentService = dependencies.agentService; + this.packageService = dependencies.packageService; + this.packagePolicyService = dependencies.packagePolicyService; + this.agentPolicyService = dependencies.agentPolicyService; + } + + public stop() {} +} diff --git a/x-pack/plugins/cloud_security_posture/server/plugin.ts b/x-pack/plugins/cloud_security_posture/server/plugin.ts index 1225d3481d334..ce6e38e4c63c5 100755 --- a/x-pack/plugins/cloud_security_posture/server/plugin.ts +++ b/x-pack/plugins/cloud_security_posture/server/plugin.ts @@ -12,6 +12,7 @@ import type { Plugin, Logger, } from '../../../../src/core/server'; +import { CspAppService } from './lib/csp_app_services'; import type { CspServerPluginSetup, CspServerPluginStart, @@ -19,6 +20,13 @@ import type { CspServerPluginStartDeps, } from './types'; import { defineRoutes } from './routes'; +import { cspRuleAssetType } from './saved_objects/cis_1_4_1/csp_rule_type'; +import { initializeCspRules } from './saved_objects/cis_1_4_1/initialize_rules'; + +export interface CspAppContext { + logger: Logger; + service: CspAppService; +} export class CspPlugin implements @@ -33,20 +41,34 @@ export class CspPlugin constructor(initializerContext: PluginInitializerContext) { this.logger = initializerContext.logger.get(); } + private readonly CspAppService = new CspAppService(); public setup( core: CoreSetup, plugins: CspServerPluginSetupDeps ): CspServerPluginSetup { + const cspAppContext: CspAppContext = { + logger: this.logger, + service: this.CspAppService, + }; + + core.savedObjects.registerType(cspRuleAssetType); + const router = core.http.createRouter(); // Register server side APIs - defineRoutes(router, this.logger); + defineRoutes(router, cspAppContext); return {}; } public start(core: CoreStart, plugins: CspServerPluginStartDeps): CspServerPluginStart { + this.CspAppService.start({ + ...plugins.fleet, + }); + + initializeCspRules(core.savedObjects.createInternalRepository()); + return {}; } public stop() {} diff --git a/x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts b/x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts new file mode 100644 index 0000000000000..b728948cf2a05 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts @@ -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 { httpServiceMock, loggingSystemMock, savedObjectsClientMock } from 'src/core/server/mocks'; +import { + defineGetBenchmarksRoute, + benchmarksInputSchema, + DEFAULT_BENCHMARKS_PER_PAGE, + PACKAGE_POLICY_SAVED_OBJECT_TYPE, + getPackagePolicies, + getAgentPolicies, + createBenchmarkEntry, +} from './benchmarks'; +import { SavedObjectsClientContract } from 'src/core/server'; +import { + createMockAgentPolicyService, + createPackagePolicyServiceMock, +} from '../../../../fleet/server/mocks'; +import { createPackagePolicyMock } from '../../../../fleet/common/mocks'; +import { AgentPolicy } from '../../../../fleet/common'; + +import { CspAppService } from '../../lib/csp_app_services'; +import { CspAppContext } from '../../plugin'; + +function createMockAgentPolicy(props: Partial = {}): AgentPolicy { + return { + id: 'some-uuid1', + namespace: 'default', + monitoring_enabled: [], + name: 'Test Policy', + description: '', + is_default: false, + is_preconfigured: false, + status: 'active', + is_managed: false, + revision: 1, + updated_at: '', + updated_by: 'elastic', + package_policies: [], + ...props, + }; +} +describe('benchmarks API', () => { + let logger: ReturnType; + + beforeEach(() => { + logger = loggingSystemMock.createLogger(); + jest.clearAllMocks(); + }); + + it('validate the API route path', async () => { + const router = httpServiceMock.createRouter(); + const cspAppContextService = new CspAppService(); + + const cspContext: CspAppContext = { + logger, + service: cspAppContextService, + }; + defineGetBenchmarksRoute(router, cspContext); + + const [config, _] = router.get.mock.calls[0]; + + expect(config.path).toEqual('/api/csp/benchmarks'); + }); + + describe('test input schema', () => { + it('expect to find default values', async () => { + const validatedQuery = benchmarksInputSchema.validate({}); + + expect(validatedQuery).toMatchObject({ + page: 1, + per_page: DEFAULT_BENCHMARKS_PER_PAGE, + }); + }); + + it('should throw when page field is not a positive integer', async () => { + expect(() => { + benchmarksInputSchema.validate({ page: -2 }); + }).toThrow(); + }); + + it('should throw when per_page field is not a positive integer', async () => { + expect(() => { + benchmarksInputSchema.validate({ per_page: -2 }); + }).toThrow(); + }); + }); + + describe('test benchmarks utils', () => { + let mockSoClient: jest.Mocked; + + beforeEach(() => { + mockSoClient = savedObjectsClientMock.create(); + }); + + describe('test getPackagePolicies', () => { + it('should throw when agentPolicyService is undefined', async () => { + const mockAgentPolicyService = undefined; + expect( + getPackagePolicies(mockSoClient, mockAgentPolicyService, 'myPackage', { + page: 1, + per_page: 100, + }) + ).rejects.toThrow(); + }); + + it('should format request by package name', async () => { + const mockAgentPolicyService = createPackagePolicyServiceMock(); + + await getPackagePolicies(mockSoClient, mockAgentPolicyService, 'myPackage', { + page: 1, + per_page: 100, + }); + + expect(mockAgentPolicyService.list.mock.calls[0][1]).toMatchObject( + expect.objectContaining({ + kuery: `${PACKAGE_POLICY_SAVED_OBJECT_TYPE}.package.name:myPackage`, + page: 1, + perPage: 100, + }) + ); + }); + }); + + describe('test getAgentPolicies', () => { + it('should return one agent policy id when there is duplication', async () => { + const agentPolicyService = createMockAgentPolicyService(); + const packagePolicies = [createPackagePolicyMock(), createPackagePolicyMock()]; + + await getAgentPolicies(mockSoClient, packagePolicies, agentPolicyService); + + expect(agentPolicyService.getByIds.mock.calls[0][1]).toHaveLength(1); + }); + + it('should return full policy ids list when there is no id duplication', async () => { + const agentPolicyService = createMockAgentPolicyService(); + + const packagePolicy1 = createPackagePolicyMock(); + const packagePolicy2 = createPackagePolicyMock(); + packagePolicy2.policy_id = 'AnotherId'; + const packagePolicies = [packagePolicy1, packagePolicy2]; + + await getAgentPolicies(mockSoClient, packagePolicies, agentPolicyService); + + expect(agentPolicyService.getByIds.mock.calls[0][1]).toHaveLength(2); + }); + }); + + describe('test createBenchmarkEntry', () => { + it('should build benchmark entry agent policy and package policy', async () => { + const packagePolicy = createPackagePolicyMock(); + const agentPolicy = createMockAgentPolicy(); + // @ts-expect-error + agentPolicy.agents = 3; + + const enrichAgentPolicy = await createBenchmarkEntry(agentPolicy, packagePolicy); + + expect(enrichAgentPolicy).toMatchObject({ + package_policy: { + id: 'c6d16e42-c32d-4dce-8a88-113cfe276ad1', + name: 'endpoint-1', + policy_id: '93c46720-c217-11ea-9906-b5b8a21b268e', + namespace: 'default', + updated_at: '2020-06-25T16:03:38.159292', + updated_by: 'kibana', + created_at: '2020-06-25T16:03:38.159292', + created_by: 'kibana', + package: { + name: 'endpoint', + title: 'Elastic Endpoint', + version: '0.9.0', + }, + }, + agent_policy: { id: 'some-uuid1', name: 'Test Policy', agents: 3 }, + }); + }); + }); + }); +}); diff --git a/x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.ts b/x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.ts new file mode 100644 index 0000000000000..80c526c248c0f --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.ts @@ -0,0 +1,196 @@ +/* + * 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 { uniq, map } from 'lodash'; +import type { IRouter, SavedObjectsClientContract } from 'src/core/server'; +import { schema as rt, TypeOf } from '@kbn/config-schema'; +import { transformError } from '@kbn/securitysolution-es-utils'; +import { string } from 'io-ts'; +import { + PackagePolicyServiceInterface, + AgentPolicyServiceInterface, + AgentService, +} from '../../../../fleet/server'; +import { GetAgentPoliciesResponseItem, PackagePolicy, AgentPolicy } from '../../../../fleet/common'; +import { BENCHMARKS_ROUTE_PATH, CIS_KUBERNETES_PACKAGE_NAME } from '../../../common/constants'; +import { CspAppContext } from '../../plugin'; + +// TODO: use the same method from common/ once PR 106 is merged +export const isNonNullable = (v: T): v is NonNullable => + v !== null && v !== undefined; + +type BenchmarksQuerySchema = TypeOf; + +export interface Benchmark { + package_policy: Pick< + PackagePolicy, + | 'id' + | 'name' + | 'policy_id' + | 'namespace' + | 'package' + | 'updated_at' + | 'updated_by' + | 'created_at' + | 'created_by' + >; + agent_policy: Pick; +} + +export const DEFAULT_BENCHMARKS_PER_PAGE = 20; +export const PACKAGE_POLICY_SAVED_OBJECT_TYPE = 'ingest-package-policies'; + +const getPackageNameQuery = (packageName: string): string => { + return `${PACKAGE_POLICY_SAVED_OBJECT_TYPE}.package.name:${packageName}`; +}; + +export const getPackagePolicies = async ( + soClient: SavedObjectsClientContract, + packagePolicyService: PackagePolicyServiceInterface | undefined, + packageName: string, + queryParams: BenchmarksQuerySchema +): Promise => { + if (!packagePolicyService) { + throw new Error('packagePolicyService is undefined'); + } + + const packageNameQuery = getPackageNameQuery(packageName); + + const { items: packagePolicies } = (await packagePolicyService?.list(soClient, { + kuery: packageNameQuery, + page: queryParams.page, + perPage: queryParams.per_page, + })) ?? { items: [] as PackagePolicy[] }; + + return packagePolicies; +}; + +export const getAgentPolicies = async ( + soClient: SavedObjectsClientContract, + packagePolicies: PackagePolicy[], + agentPolicyService: AgentPolicyServiceInterface +): Promise => { + const agentPolicyIds = uniq(map(packagePolicies, 'policy_id')); + const agentPolicies = await agentPolicyService.getByIds(soClient, agentPolicyIds); + + return agentPolicies; +}; + +const addRunningAgentToAgentPolicy = async ( + agentService: AgentService, + agentPolicies: AgentPolicy[] +): Promise => { + if (!agentPolicies?.length) return []; + return Promise.all( + agentPolicies.map((agentPolicy) => + agentService.asInternalUser + .getAgentStatusForAgentPolicy(agentPolicy.id) + .then((agentStatus) => ({ + ...agentPolicy, + agents: agentStatus.total, + })) + ) + ); +}; + +export const createBenchmarkEntry = ( + agentPolicy: GetAgentPoliciesResponseItem, + packagePolicy: PackagePolicy +): Benchmark => ({ + package_policy: { + id: packagePolicy.id, + name: packagePolicy.name, + policy_id: packagePolicy.policy_id, + namespace: packagePolicy.namespace, + updated_at: packagePolicy.updated_at, + updated_by: packagePolicy.updated_by, + created_at: packagePolicy.created_at, + created_by: packagePolicy.created_by, + package: packagePolicy.package + ? { + name: packagePolicy.package.name, + title: packagePolicy.package.title, + version: packagePolicy.package.version, + } + : undefined, + }, + agent_policy: { + id: agentPolicy.id, + name: agentPolicy.name, + agents: agentPolicy.agents, + }, +}); + +const createBenchmarks = ( + agentPolicies: GetAgentPoliciesResponseItem[], + packagePolicies: PackagePolicy[] +): Benchmark[] => + agentPolicies + .flatMap((agentPolicy) => + agentPolicy.package_policies.map((agentPackagePolicy) => { + const id = string.is(agentPackagePolicy) ? agentPackagePolicy : agentPackagePolicy.id; + const packagePolicy = packagePolicies.find((pkgPolicy) => pkgPolicy.id === id); + if (!packagePolicy) return; + return createBenchmarkEntry(agentPolicy, packagePolicy); + }) + ) + .filter(isNonNullable); + +export const defineGetBenchmarksRoute = (router: IRouter, cspContext: CspAppContext): void => + router.get( + { + path: BENCHMARKS_ROUTE_PATH, + validate: { query: benchmarksInputSchema }, + }, + async (context, request, response) => { + try { + const soClient = context.core.savedObjects.client; + const { query } = request; + + const agentService = cspContext.service.agentService; + const agentPolicyService = cspContext.service.agentPolicyService; + const packagePolicyService = cspContext.service.packagePolicyService; + + // TODO: This validate can be remove after #2819 will be merged + if (!agentPolicyService || !agentService) { + throw new Error(`Failed to get Fleet services`); + } + + const packagePolicies = await getPackagePolicies( + soClient, + packagePolicyService, + CIS_KUBERNETES_PACKAGE_NAME, + query + ); + + const agentPolicies = await getAgentPolicies(soClient, packagePolicies, agentPolicyService); + const enrichAgentPolicies = await addRunningAgentToAgentPolicy(agentService, agentPolicies); + const benchmarks = createBenchmarks(enrichAgentPolicies, packagePolicies); + + return response.ok({ + body: benchmarks, + }); + } catch (err) { + const error = transformError(err); + cspContext.logger.error(`Failed to fetch benchmarks ${err}`); + return response.customError({ + body: { message: error.message }, + statusCode: error.statusCode, + }); + } + } + ); + +export const benchmarksInputSchema = rt.object({ + /** + * The page of objects to return + */ + page: rt.number({ defaultValue: 1, min: 1 }), + /** + * The number of objects to include in each page + */ + per_page: rt.number({ defaultValue: DEFAULT_BENCHMARKS_PER_PAGE, min: 0 }), +}); diff --git a/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/compliance_dashboard.ts b/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/compliance_dashboard.ts new file mode 100644 index 0000000000000..f554eb91a4a49 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/compliance_dashboard.ts @@ -0,0 +1,122 @@ +/* + * 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 type { ElasticsearchClient, IRouter } from 'src/core/server'; +import { transformError } from '@kbn/securitysolution-es-utils'; +import type { + AggregationsMultiBucketAggregateBase as Aggregation, + AggregationsTopHitsAggregate, + QueryDslQueryContainer, + SearchRequest, +} from '@elastic/elasticsearch/lib/api/types'; +import type { CloudPostureStats } from '../../../common/types'; +import { CSP_KUBEBEAT_INDEX_PATTERN, STATS_ROUTE_PATH } from '../../../common/constants'; +import { CspAppContext } from '../../plugin'; +import { getResourcesTypes } from './get_resources_types'; +import { getClusters } from './get_clusters'; +import { getStats } from './get_stats'; + +export interface ClusterBucket { + ordered_top_hits: AggregationsTopHitsAggregate; +} + +interface ClustersQueryResult { + aggs_by_cluster_id: Aggregation; +} + +export interface KeyDocCount { + key: TKey; + doc_count: number; +} + +export const getLatestFindingQuery = (): SearchRequest => ({ + index: CSP_KUBEBEAT_INDEX_PATTERN, + size: 0, + query: { + match_all: {}, + }, + aggs: { + aggs_by_cluster_id: { + terms: { field: 'cluster_id.keyword' }, + aggs: { + ordered_top_hits: { + top_hits: { + size: 1, + sort: { + '@timestamp': { + order: 'desc', + }, + }, + }, + }, + }, + }, + }, +}); + +const getLatestCyclesIds = async (esClient: ElasticsearchClient): Promise => { + const queryResult = await esClient.search(getLatestFindingQuery(), { + meta: true, + }); + + const clusters = queryResult.body.aggregations?.aggs_by_cluster_id.buckets; + if (!Array.isArray(clusters)) throw new Error('missing aggs by cluster id'); + + return clusters.map((c) => { + const topHit = c.ordered_top_hits.hits.hits[0]; + if (!topHit) throw new Error('missing cluster latest hit'); + return topHit._source.cycle_id; + }); +}; + +// TODO: Utilize ES "Point in Time" feature https://www.elastic.co/guide/en/elasticsearch/reference/current/point-in-time-api.html +export const defineGetComplianceDashboardRoute = ( + router: IRouter, + cspContext: CspAppContext +): void => + router.get( + { + path: STATS_ROUTE_PATH, + validate: false, + }, + async (context, _, response) => { + try { + const esClient = context.core.elasticsearch.client.asCurrentUser; + const latestCyclesIds = await getLatestCyclesIds(esClient); + const query: QueryDslQueryContainer = { + bool: { + should: latestCyclesIds.map((id) => ({ + match: { 'cycle_id.keyword': { query: id } }, + })), + }, + }; + + const [stats, resourcesTypes, clusters] = await Promise.all([ + getStats(esClient, query), + getResourcesTypes(esClient, query), + getClusters(esClient, query), + ]); + + const body: CloudPostureStats = { + stats, + resourcesTypes, + clusters, + }; + + return response.ok({ + body, + }); + } catch (err) { + const error = transformError(err); + + return response.customError({ + body: { message: error.message }, + statusCode: error.statusCode, + }); + } + } + ); diff --git a/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_clusters.test.ts b/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_clusters.test.ts new file mode 100644 index 0000000000000..8ee05a6e4755f --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_clusters.test.ts @@ -0,0 +1,82 @@ +/* + * 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 { ClusterBucket, getClustersFromAggs } from './get_clusters'; + +const mockClusterBuckets: ClusterBucket[] = [ + { + key: 'cluster_id', + doc_count: 10, + benchmarks: { + buckets: [{ key: 'CIS Kubernetes', doc_count: 10 }], + }, + failed_findings: { + doc_count: 6, + }, + passed_findings: { + doc_count: 6, + }, + aggs_by_resource_type: { + buckets: [ + { + key: 'foo_type', + doc_count: 6, + failed_findings: { + doc_count: 3, + }, + passed_findings: { + doc_count: 3, + }, + }, + { + key: 'boo_type', + doc_count: 6, + failed_findings: { + doc_count: 3, + }, + passed_findings: { + doc_count: 3, + }, + }, + ], + }, + }, +]; + +describe('getClustersFromAggs', () => { + it('should return value matching CloudPostureStats["clusters"]', async () => { + const clusters = getClustersFromAggs(mockClusterBuckets); + expect(clusters).toEqual([ + { + meta: { + clusterId: 'cluster_id', + benchmarkName: 'CIS Kubernetes', + }, + stats: { + totalFindings: 12, + totalFailed: 6, + totalPassed: 6, + postureScore: 50.0, + }, + resourcesTypes: [ + { + name: 'foo_type', + totalFindings: 6, + totalFailed: 3, + totalPassed: 3, + }, + { + name: 'boo_type', + totalFindings: 6, + totalFailed: 3, + totalPassed: 3, + }, + ], + }, + ]); + }); +}); diff --git a/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_clusters.ts b/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_clusters.ts new file mode 100644 index 0000000000000..5be94f7246e53 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_clusters.ts @@ -0,0 +1,98 @@ +/* + * 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 { ElasticsearchClient } from 'kibana/server'; +import type { + AggregationsMultiBucketAggregateBase as Aggregation, + QueryDslQueryContainer, + SearchRequest, +} from '@elastic/elasticsearch/lib/api/types'; +import { CloudPostureStats } from '../../../common/types'; +import { getResourceTypeFromAggs, resourceTypeAggQuery } from './get_resources_types'; +import type { ResourceTypeQueryResult } from './get_resources_types'; +import { CSP_KUBEBEAT_INDEX_PATTERN } from '../../../common/constants'; +import { findingsEvaluationAggsQuery, getStatsFromFindingsEvaluationsAggs } from './get_stats'; +import { KeyDocCount } from './compliance_dashboard'; + +export interface ClusterBucket extends ResourceTypeQueryResult, KeyDocCount { + failed_findings: { + doc_count: number; + }; + passed_findings: { + doc_count: number; + }; + benchmarks: Aggregation; +} + +interface ClustersQueryResult { + aggs_by_cluster_id: Aggregation; +} + +export const getClustersQuery = (query: QueryDslQueryContainer): SearchRequest => ({ + index: CSP_KUBEBEAT_INDEX_PATTERN, + size: 0, + query, + aggs: { + aggs_by_cluster_id: { + terms: { + field: 'cluster_id.keyword', + }, + aggs: { + benchmarks: { + terms: { + field: 'rule.benchmark.name.keyword', + }, + }, + ...resourceTypeAggQuery, + ...findingsEvaluationAggsQuery, + }, + }, + }, +}); + +export const getClustersFromAggs = (clusters: ClusterBucket[]): CloudPostureStats['clusters'] => + clusters.map((cluster) => { + // get cluster's meta data + const benchmarks = cluster.benchmarks.buckets; + if (!Array.isArray(benchmarks)) throw new Error('missing aggs by benchmarks per cluster'); + + const meta = { + clusterId: cluster.key, + benchmarkName: benchmarks[0].key, + }; + + // get cluster's stats + if (!cluster.failed_findings || !cluster.passed_findings) + throw new Error('missing findings evaluations per cluster'); + const stats = getStatsFromFindingsEvaluationsAggs(cluster); + + // get cluster's resource types aggs + const resourcesTypesAggs = cluster.aggs_by_resource_type.buckets; + if (!Array.isArray(resourcesTypesAggs)) + throw new Error('missing aggs by resource type per cluster'); + const resourcesTypes = getResourceTypeFromAggs(resourcesTypesAggs); + + return { + meta, + stats, + resourcesTypes, + }; + }); + +export const getClusters = async ( + esClient: ElasticsearchClient, + query: QueryDslQueryContainer +): Promise => { + const queryResult = await esClient.search(getClustersQuery(query), { + meta: true, + }); + + const clusters = queryResult.body.aggregations?.aggs_by_cluster_id.buckets; + if (!Array.isArray(clusters)) throw new Error('missing aggs by cluster id'); + + return getClustersFromAggs(clusters); +}; diff --git a/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_resources_types.test.ts b/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_resources_types.test.ts new file mode 100644 index 0000000000000..b01644fc3f45b --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_resources_types.test.ts @@ -0,0 +1,51 @@ +/* + * 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 { getResourceTypeFromAggs, ResourceTypeBucket } from './get_resources_types'; + +const resourceTypeBuckets: ResourceTypeBucket[] = [ + { + key: 'foo_type', + doc_count: 41, + failed_findings: { + doc_count: 30, + }, + passed_findings: { + doc_count: 11, + }, + }, + { + key: 'boo_type', + doc_count: 11, + failed_findings: { + doc_count: 5, + }, + passed_findings: { + doc_count: 6, + }, + }, +]; + +describe('getResourceTypeFromAggs', () => { + it('should return value matching CloudPostureStats["resourcesTypes"]', async () => { + const resourceTypes = getResourceTypeFromAggs(resourceTypeBuckets); + expect(resourceTypes).toEqual([ + { + name: 'foo_type', + totalFindings: 41, + totalFailed: 30, + totalPassed: 11, + }, + { + name: 'boo_type', + totalFindings: 11, + totalFailed: 5, + totalPassed: 6, + }, + ]); + }); +}); diff --git a/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_resources_types.ts b/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_resources_types.ts new file mode 100644 index 0000000000000..459dce56042da --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_resources_types.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ElasticsearchClient } from 'kibana/server'; +import { + AggregationsMultiBucketAggregateBase as Aggregation, + QueryDslQueryContainer, + SearchRequest, +} from '@elastic/elasticsearch/lib/api/types'; +import { CloudPostureStats } from '../../../common/types'; +import { KeyDocCount } from './compliance_dashboard'; +import { CSP_KUBEBEAT_INDEX_PATTERN } from '../../../common/constants'; + +export interface ResourceTypeQueryResult { + aggs_by_resource_type: Aggregation; +} + +export interface ResourceTypeBucket extends KeyDocCount { + failed_findings: { + doc_count: number; + }; + passed_findings: { + doc_count: number; + }; +} + +export const resourceTypeAggQuery = { + aggs_by_resource_type: { + terms: { + field: 'resource.type.keyword', + }, + aggs: { + failed_findings: { + filter: { term: { 'result.evaluation.keyword': 'failed' } }, + }, + passed_findings: { + filter: { term: { 'result.evaluation.keyword': 'passed' } }, + }, + }, + }, +}; + +export const getRisksEsQuery = (query: QueryDslQueryContainer): SearchRequest => ({ + index: CSP_KUBEBEAT_INDEX_PATTERN, + size: 0, + query, + aggs: resourceTypeAggQuery, +}); + +export const getResourceTypeFromAggs = ( + queryResult: ResourceTypeBucket[] +): CloudPostureStats['resourcesTypes'] => + queryResult.map((bucket) => ({ + name: bucket.key, + totalFindings: bucket.doc_count, + totalFailed: bucket.failed_findings.doc_count || 0, + totalPassed: bucket.passed_findings.doc_count || 0, + })); + +export const getResourcesTypes = async ( + esClient: ElasticsearchClient, + query: QueryDslQueryContainer +): Promise => { + const resourceTypesQueryResult = await esClient.search( + getRisksEsQuery(query), + { meta: true } + ); + + const resourceTypes = resourceTypesQueryResult.body.aggregations?.aggs_by_resource_type.buckets; + if (!Array.isArray(resourceTypes)) throw new Error('missing resources types buckets'); + + return getResourceTypeFromAggs(resourceTypes); +}; diff --git a/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_stats.test.ts b/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_stats.test.ts new file mode 100644 index 0000000000000..558fec85860ea --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_stats.test.ts @@ -0,0 +1,86 @@ +/* + * 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 { + calculatePostureScore, + FindingsEvaluationsQueryResult, + getStatsFromFindingsEvaluationsAggs, + roundScore, +} from './get_stats'; + +const standardQueryResult: FindingsEvaluationsQueryResult = { + failed_findings: { + doc_count: 30, + }, + passed_findings: { + doc_count: 11, + }, +}; + +const oneIsZeroQueryResult: FindingsEvaluationsQueryResult = { + failed_findings: { + doc_count: 0, + }, + passed_findings: { + doc_count: 11, + }, +}; + +const bothAreZeroQueryResult: FindingsEvaluationsQueryResult = { + failed_findings: { + doc_count: 0, + }, + passed_findings: { + doc_count: 0, + }, +}; + +describe('roundScore', () => { + it('should return decimal values with one fraction digit', async () => { + const rounded = roundScore(0.85245); + expect(rounded).toEqual(85.2); + }); +}); + +describe('calculatePostureScore', () => { + it('should return calculated posture score', async () => { + const score = calculatePostureScore(4, 7); + expect(score).toEqual(36.4); + }); +}); + +describe('getStatsFromFindingsEvaluationsAggs', () => { + it('should throw error in case no findings were found', async () => { + const score = calculatePostureScore(4, 7); + expect(score).toEqual(36.4); + }); + + it('should return value matching CloudPostureStats["stats"]', async () => { + const stats = getStatsFromFindingsEvaluationsAggs(standardQueryResult); + expect(stats).toEqual({ + totalFailed: 30, + totalPassed: 11, + totalFindings: 41, + postureScore: 26.8, + }); + }); + + it('checks for stability in case one of the values is zero', async () => { + const stats = getStatsFromFindingsEvaluationsAggs(oneIsZeroQueryResult); + expect(stats).toEqual({ + totalFailed: 0, + totalPassed: 11, + totalFindings: 11, + postureScore: 100.0, + }); + }); + + it('should throw error if both evaluations are zero', async () => { + // const stats = getStatsFromFindingsEvaluationsAggs(bothAreZeroQueryResult); + expect(() => getStatsFromFindingsEvaluationsAggs(bothAreZeroQueryResult)).toThrow(); + }); +}); diff --git a/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_stats.ts b/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_stats.ts new file mode 100644 index 0000000000000..8d5417de24c52 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_stats.ts @@ -0,0 +1,74 @@ +/* + * 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 { ElasticsearchClient } from 'kibana/server'; +import { QueryDslQueryContainer, SearchRequest } from '@elastic/elasticsearch/lib/api/types'; +import { CSP_KUBEBEAT_INDEX_PATTERN } from '../../../common/constants'; +import { CloudPostureStats, Score } from '../../../common/types'; + +/** + * @param value value is [0, 1] range + */ +export const roundScore = (value: number): Score => Number((value * 100).toFixed(1)); + +export const calculatePostureScore = (passed: number, failed: number): Score => + roundScore(passed / (passed + failed)); + +export interface FindingsEvaluationsQueryResult { + failed_findings: { + doc_count: number; + }; + passed_findings: { + doc_count: number; + }; +} + +export const findingsEvaluationAggsQuery = { + failed_findings: { + filter: { term: { 'result.evaluation.keyword': 'failed' } }, + }, + passed_findings: { + filter: { term: { 'result.evaluation.keyword': 'passed' } }, + }, +}; + +export const getEvaluationsQuery = (query: QueryDslQueryContainer): SearchRequest => ({ + index: CSP_KUBEBEAT_INDEX_PATTERN, + query, + aggs: findingsEvaluationAggsQuery, +}); + +export const getStatsFromFindingsEvaluationsAggs = ( + findingsEvaluationsAggs: FindingsEvaluationsQueryResult +): CloudPostureStats['stats'] => { + const failedFindings = findingsEvaluationsAggs.failed_findings.doc_count || 0; + const passedFindings = findingsEvaluationsAggs.passed_findings.doc_count || 0; + const totalFindings = failedFindings + passedFindings; + if (!totalFindings) throw new Error("couldn't calculate posture score"); + const postureScore = calculatePostureScore(passedFindings, failedFindings); + + return { + totalFailed: failedFindings, + totalPassed: passedFindings, + totalFindings, + postureScore, + }; +}; + +export const getStats = async ( + esClient: ElasticsearchClient, + query: QueryDslQueryContainer +): Promise => { + const evaluationsQueryResult = await esClient.search( + getEvaluationsQuery(query), + { meta: true } + ); + const findingsEvaluations = evaluationsQueryResult.body.aggregations; + if (!findingsEvaluations) throw new Error('missing findings evaluations'); + + return getStatsFromFindingsEvaluationsAggs(findingsEvaluations); +}; diff --git a/x-pack/plugins/cloud_security_posture/server/routes/findings/findings.test.ts b/x-pack/plugins/cloud_security_posture/server/routes/findings/findings.test.ts index ffc5526e2fe42..76fc97e921045 100644 --- a/x-pack/plugins/cloud_security_posture/server/routes/findings/findings.test.ts +++ b/x-pack/plugins/cloud_security_posture/server/routes/findings/findings.test.ts @@ -12,6 +12,8 @@ import { // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { KibanaRequest } from 'src/core/server/http/router/request'; import { httpServerMock, httpServiceMock, loggingSystemMock } from 'src/core/server/mocks'; +import { CspAppService } from '../../lib/csp_app_services'; +import { CspAppContext } from '../../plugin'; import { defineFindingsIndexRoute, findingsInputSchema, @@ -41,7 +43,13 @@ describe('findings API', () => { it('validate the API route path', async () => { const router = httpServiceMock.createRouter(); - defineFindingsIndexRoute(router, logger); + const cspAppContextService = new CspAppService(); + + const cspContext: CspAppContext = { + logger, + service: cspAppContextService, + }; + defineFindingsIndexRoute(router, cspContext); const [config, _] = router.get.mock.calls[0]; @@ -130,7 +138,13 @@ describe('findings API', () => { it('takes cycle_id and validate the filter was built right', async () => { const mockEsClient = elasticsearchClientMock.createClusterClient().asScoped().asInternalUser; const router = httpServiceMock.createRouter(); - defineFindingsIndexRoute(router, logger); + const cspAppContextService = new CspAppService(); + + const cspContext: CspAppContext = { + logger, + service: cspAppContextService, + }; + defineFindingsIndexRoute(router, cspContext); const [_, handler] = router.get.mock.calls[0]; const mockContext = getMockCspContext(mockEsClient); @@ -178,7 +192,14 @@ describe('findings API', () => { it('validate that default sort is timestamp desc', async () => { const mockEsClient = elasticsearchClientMock.createClusterClient().asScoped().asInternalUser; const router = httpServiceMock.createRouter(); - defineFindingsIndexRoute(router, logger); + const cspAppContextService = new CspAppService(); + + const cspContext: CspAppContext = { + logger, + service: cspAppContextService, + }; + defineFindingsIndexRoute(router, cspContext); + const [_, handler] = router.get.mock.calls[0]; const mockContext = getMockCspContext(mockEsClient); const mockResponse = httpServerMock.createResponseFactory(); @@ -202,7 +223,14 @@ describe('findings API', () => { it('should build sort request by `sort_field` and `sort_order` - asc', async () => { const mockEsClient = elasticsearchClientMock.createClusterClient().asScoped().asInternalUser; const router = httpServiceMock.createRouter(); - defineFindingsIndexRoute(router, logger); + const cspAppContextService = new CspAppService(); + + const cspContext: CspAppContext = { + logger, + service: cspAppContextService, + }; + defineFindingsIndexRoute(router, cspContext); + const [_, handler] = router.get.mock.calls[0]; const mockContext = getMockCspContext(mockEsClient); const mockResponse = httpServerMock.createResponseFactory(); @@ -227,7 +255,14 @@ describe('findings API', () => { it('should build sort request by `sort_field` and `sort_order` - desc', async () => { const mockEsClient = elasticsearchClientMock.createClusterClient().asScoped().asInternalUser; const router = httpServiceMock.createRouter(); - defineFindingsIndexRoute(router, logger); + const cspAppContextService = new CspAppService(); + + const cspContext: CspAppContext = { + logger, + service: cspAppContextService, + }; + defineFindingsIndexRoute(router, cspContext); + const [_, handler] = router.get.mock.calls[0]; const mockContext = getMockCspContext(mockEsClient); const mockResponse = httpServerMock.createResponseFactory(); @@ -249,10 +284,17 @@ describe('findings API', () => { }); }); - it('takes `page_number` and `per_page` validate that the requested selected page was called', async () => { + it('takes `page` number and `per_page` validate that the requested selected page was called', async () => { const mockEsClient = elasticsearchClientMock.createClusterClient().asScoped().asInternalUser; const router = httpServiceMock.createRouter(); - defineFindingsIndexRoute(router, logger); + const cspAppContextService = new CspAppService(); + + const cspContext: CspAppContext = { + logger, + service: cspAppContextService, + }; + defineFindingsIndexRoute(router, cspContext); + const [_, handler] = router.get.mock.calls[0]; const mockContext = getMockCspContext(mockEsClient); const mockResponse = httpServerMock.createResponseFactory(); @@ -278,7 +320,14 @@ describe('findings API', () => { it('should format request by fields filter', async () => { const mockEsClient = elasticsearchClientMock.createClusterClient().asScoped().asInternalUser; const router = httpServiceMock.createRouter(); - defineFindingsIndexRoute(router, logger); + const cspAppContextService = new CspAppService(); + + const cspContext: CspAppContext = { + logger, + service: cspAppContextService, + }; + defineFindingsIndexRoute(router, cspContext); + const [_, handler] = router.get.mock.calls[0]; const mockContext = getMockCspContext(mockEsClient); diff --git a/x-pack/plugins/cloud_security_posture/server/routes/findings/findings.ts b/x-pack/plugins/cloud_security_posture/server/routes/findings/findings.ts index a5c8f67a41cac..5fea7cdbba9db 100644 --- a/x-pack/plugins/cloud_security_posture/server/routes/findings/findings.ts +++ b/x-pack/plugins/cloud_security_posture/server/routes/findings/findings.ts @@ -5,7 +5,7 @@ * 2.0. */ -import type { IRouter, Logger } from 'src/core/server'; +import type { IRouter } from 'src/core/server'; import { SearchRequest, QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/types'; import { schema as rt, TypeOf } from '@kbn/config-schema'; import type { SortOrder } from '@elastic/elasticsearch/lib/api/types'; @@ -13,6 +13,7 @@ import { transformError } from '@kbn/securitysolution-es-utils'; import { getLatestCycleIds } from './get_latest_cycle_ids'; import { CSP_KUBEBEAT_INDEX_PATTERN, FINDINGS_ROUTE_PATH } from '../../../common/constants'; +import { CspAppContext } from '../../plugin'; type FindingsQuerySchema = TypeOf; @@ -70,7 +71,7 @@ const buildOptionsRequest = (queryParams: FindingsQuerySchema): FindingsOptions ...getSearchFields(queryParams.fields), }); -export const defineFindingsIndexRoute = (router: IRouter, logger: Logger): void => +export const defineFindingsIndexRoute = (router: IRouter, cspContext: CspAppContext): void => router.get( { path: FINDINGS_ROUTE_PATH, @@ -83,7 +84,7 @@ export const defineFindingsIndexRoute = (router: IRouter, logger: Logger): void const latestCycleIds = request.query.latest_cycle === true - ? await getLatestCycleIds(esClient, logger) + ? await getLatestCycleIds(esClient, cspContext.logger) : undefined; const query = buildQueryRequest(latestCycleIds); diff --git a/x-pack/plugins/cloud_security_posture/server/routes/index.ts b/x-pack/plugins/cloud_security_posture/server/routes/index.ts index ab8d1cc3bbedf..c0b333e4058aa 100755 --- a/x-pack/plugins/cloud_security_posture/server/routes/index.ts +++ b/x-pack/plugins/cloud_security_posture/server/routes/index.ts @@ -5,11 +5,14 @@ * 2.0. */ -import type { IRouter, Logger } from '../../../../../src/core/server'; -import { defineGetStatsRoute } from './stats/stats'; +import type { IRouter } from '../../../../../src/core/server'; +import { defineGetComplianceDashboardRoute } from './compliance_dashboard/compliance_dashboard'; +import { defineGetBenchmarksRoute } from './benchmarks/benchmarks'; import { defineFindingsIndexRoute as defineGetFindingsIndexRoute } from './findings/findings'; +import { CspAppContext } from '../plugin'; -export function defineRoutes(router: IRouter, logger: Logger) { - defineGetStatsRoute(router, logger); - defineGetFindingsIndexRoute(router, logger); +export function defineRoutes(router: IRouter, cspContext: CspAppContext) { + defineGetComplianceDashboardRoute(router, cspContext); + defineGetFindingsIndexRoute(router, cspContext); + defineGetBenchmarksRoute(router, cspContext); } diff --git a/x-pack/plugins/cloud_security_posture/server/routes/stats/stats.test.ts b/x-pack/plugins/cloud_security_posture/server/routes/stats/stats.test.ts deleted file mode 100644 index 549e8d45c989f..0000000000000 --- a/x-pack/plugins/cloud_security_posture/server/routes/stats/stats.test.ts +++ /dev/null @@ -1,201 +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 { - elasticsearchClientMock, - ElasticsearchClientMock, - // eslint-disable-next-line @kbn/eslint/no-restricted-paths -} from 'src/core/server/elasticsearch/client/mocks'; - -import { - getBenchmarks, - getAllFindingsStats, - roundScore, - getBenchmarksStats, - getResourceTypesAggs, -} from './stats'; - -export const mockCountResultOnce = async (mockEsClient: ElasticsearchClientMock, count: number) => { - mockEsClient.count.mockReturnValueOnce( - // @ts-expect-error @elast ic/elasticsearch Aggregate only allows unknown values - elasticsearchClientMock.createSuccessTransportRequestPromise({ count }) - ); -}; - -export const mockSearchResultOnce = async ( - mockEsClient: ElasticsearchClientMock, - returnedMock: object -) => { - mockEsClient.search.mockReturnValueOnce( - // @ts-expect-error @elastic/elasticsearch Aggregate only allows unknown values - elasticsearchClientMock.createSuccessTransportRequestPromise(returnedMock) - ); -}; - -const mockEsClient = elasticsearchClientMock.createClusterClient().asScoped().asInternalUser; - -const resourceTypeAggsMockData = { - aggregations: { - resource_types: { - buckets: [ - { - key: 'pods', - doc_count: 3, - bucket_evaluation: { - buckets: [ - { - key: 'passed', - doc_count: 1, - }, - { - key: 'failed', - doc_count: 2, - }, - ], - }, - }, - { - key: 'etcd', - doc_count: 4, - bucket_evaluation: { - buckets: [ - // there is only one bucket here, in cases where aggs can't find an evaluation we count that as 0. - { - key: 'failed', - doc_count: 4, - }, - ], - }, - }, - ], - }, - }, -}; - -afterEach(() => { - jest.clearAllMocks(); -}); - -describe('testing round score', () => { - it('take decimal and expect the roundScore will return it with one digit after the dot ', async () => { - const score = roundScore(0.85245); - expect(score).toEqual(85.2); - }); -}); - -describe('general cloud posture score', () => { - it('expect to valid score from getAllFindingsStats', async () => { - mockCountResultOnce(mockEsClient, 10); // total findings - mockCountResultOnce(mockEsClient, 3); // pass findings - mockCountResultOnce(mockEsClient, 7); // fail findings - - const generalScore = await getAllFindingsStats(mockEsClient, 'randomCycleId'); - expect(generalScore).toEqual({ - name: 'general', - postureScore: 30, - totalFailed: 7, - totalFindings: 10, - totalPassed: 3, - }); - }); - - it("getAllFindingsStats throws when cycleId doesn't exists", async () => { - try { - await getAllFindingsStats(mockEsClient, 'randomCycleId'); - } catch (e) { - expect(e).toBeInstanceOf(Error); - expect(e.message).toEqual('missing stats'); - } - }); -}); - -describe('get benchmarks list', () => { - it('getBenchmarks - takes aggregated data and expect unique benchmarks array', async () => { - const returnedMock = { - aggregations: { - benchmarks: { - buckets: [ - { key: 'CIS Kubernetes', doc_count: 248514 }, - { key: 'GDPR', doc_count: 248514 }, - ], - }, - }, - }; - mockSearchResultOnce(mockEsClient, returnedMock); - const benchmarks = await getBenchmarks(mockEsClient); - expect(benchmarks).toEqual(['CIS Kubernetes', 'GDPR']); - }); -}); - -describe('score per benchmark, testing getBenchmarksStats', () => { - it('get data for only one benchmark and check', async () => { - mockCountResultOnce(mockEsClient, 10); // total findings - mockCountResultOnce(mockEsClient, 3); // pass findings - mockCountResultOnce(mockEsClient, 7); // fail findings - const benchmarkScore = await getBenchmarksStats(mockEsClient, 'randomCycleId', [ - 'CIS Benchmark', - ]); - expect(benchmarkScore).toEqual([ - { - name: 'CIS Benchmark', - postureScore: 30, - totalFailed: 7, - totalFindings: 10, - totalPassed: 3, - }, - ]); - }); - - it('get data two benchmarks and check', async () => { - mockCountResultOnce(mockEsClient, 10); // total findings - mockCountResultOnce(mockEsClient, 3); // pass findings - mockCountResultOnce(mockEsClient, 7); // fail findings - mockCountResultOnce(mockEsClient, 100); - mockCountResultOnce(mockEsClient, 50); - mockCountResultOnce(mockEsClient, 50); - const benchmarkScore = await getBenchmarksStats(mockEsClient, 'randomCycleId', [ - 'CIS Benchmark', - 'GDPR', - ]); - expect(benchmarkScore).toEqual([ - { - name: 'CIS Benchmark', - postureScore: 30, - totalFailed: 7, - totalFindings: 10, - totalPassed: 3, - }, - { - name: 'GDPR', - postureScore: 50, - totalFailed: 50, - totalFindings: 100, - totalPassed: 50, - }, - ]); - }); -}); - -describe('getResourceTypesAggs', () => { - it('get all resources types aggregations', async () => { - await mockSearchResultOnce(mockEsClient, resourceTypeAggsMockData); - const resourceTypeAggs = await getResourceTypesAggs(mockEsClient, 'RandomCycleId'); - expect(resourceTypeAggs).toEqual([ - { - resourceType: 'pods', - totalFindings: 3, - totalPassed: 1, - totalFailed: 2, - }, - { - resourceType: 'etcd', - totalFindings: 4, - totalPassed: 0, - totalFailed: 4, - }, - ]); - }); -}); diff --git a/x-pack/plugins/cloud_security_posture/server/routes/stats/stats.ts b/x-pack/plugins/cloud_security_posture/server/routes/stats/stats.ts deleted file mode 100644 index 828d7f932113e..0000000000000 --- a/x-pack/plugins/cloud_security_posture/server/routes/stats/stats.ts +++ /dev/null @@ -1,226 +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 type { ElasticsearchClient, IRouter, Logger } from 'src/core/server'; -import type { AggregationsMultiBucketAggregateBase } from '@elastic/elasticsearch/lib/api/types'; -import { number, UnknownRecord } from 'io-ts'; -import { transformError } from '@kbn/securitysolution-es-utils'; - -import type { BenchmarkStats, CloudPostureStats, Evaluation, Score } from '../../../common/types'; -import { - getBenchmarksQuery, - getFindingsEsQuery, - getLatestFindingQuery, - getRisksEsQuery, -} from './stats_queries'; -import { RULE_FAILED, RULE_PASSED } from '../../constants'; -import { STATS_ROUTE_PATH } from '../../../common/constants'; - -// TODO: use a schema decoder -function assertBenchmarkStats(v: unknown): asserts v is BenchmarkStats { - if ( - !UnknownRecord.is(v) || - !number.is(v.totalFindings) || - !number.is(v.totalPassed) || - !number.is(v.totalFailed) || - !number.is(v.postureScore) - ) { - throw new Error('missing stats'); - } -} - -interface LastCycle { - cycle_id: string; -} - -interface GroupFilename { - // TODO find the 'key', 'doc_count' interface - key: string; - doc_count: number; -} - -interface ResourceTypeBucket { - resource_types: AggregationsMultiBucketAggregateBase<{ - key: string; - doc_count: number; - bucket_evaluation: AggregationsMultiBucketAggregateBase; - }>; -} - -interface ResourceTypeEvaluationBucket { - key: Evaluation; - doc_count: number; -} - -/** - * @param value value is [0, 1] range - */ -export const roundScore = (value: number): Score => Number((value * 100).toFixed(1)); - -const calculatePostureScore = (total: number, passed: number, failed: number): Score | undefined => - passed + failed === 0 || total === undefined ? undefined : roundScore(passed / (passed + failed)); - -const getLatestCycleId = async (esClient: ElasticsearchClient) => { - const latestFinding = await esClient.search(getLatestFindingQuery(), { meta: true }); - const lastCycle = latestFinding.body.hits.hits[0]; - - if (lastCycle?._source?.cycle_id === undefined) { - throw new Error('cycle id is missing'); - } - return lastCycle?._source?.cycle_id; -}; - -export const getBenchmarks = async (esClient: ElasticsearchClient) => { - const queryResult = await esClient.search< - {}, - { benchmarks: AggregationsMultiBucketAggregateBase> } - >(getBenchmarksQuery(), { meta: true }); - const benchmarksBuckets = queryResult.body.aggregations?.benchmarks; - - if (!benchmarksBuckets || !Array.isArray(benchmarksBuckets?.buckets)) { - throw new Error('missing buckets'); - } - - return benchmarksBuckets.buckets.map((e) => e.key); -}; - -export const getAllFindingsStats = async ( - esClient: ElasticsearchClient, - cycleId: string -): Promise => { - const [findings, passedFindings, failedFindings] = await Promise.all([ - esClient.count(getFindingsEsQuery(cycleId), { meta: true }), - esClient.count(getFindingsEsQuery(cycleId, RULE_PASSED), { meta: true }), - esClient.count(getFindingsEsQuery(cycleId, RULE_FAILED), { meta: true }), - ]); - - const totalFindings = findings.body.count; - const totalPassed = passedFindings.body.count; - const totalFailed = failedFindings.body.count; - const postureScore = calculatePostureScore(totalFindings, totalPassed, totalFailed); - const stats = { - name: 'general', - postureScore, - totalFindings, - totalPassed, - totalFailed, - }; - - assertBenchmarkStats(stats); - - return stats; -}; - -export const getBenchmarksStats = async ( - esClient: ElasticsearchClient, - cycleId: string, - benchmarks: string[] -): Promise => { - const benchmarkPromises = benchmarks.map((benchmark) => { - const benchmarkFindings = esClient.count(getFindingsEsQuery(cycleId, undefined, benchmark), { - meta: true, - }); - const benchmarkPassedFindings = esClient.count( - getFindingsEsQuery(cycleId, RULE_PASSED, benchmark), - { meta: true } - ); - const benchmarkFailedFindings = esClient.count( - getFindingsEsQuery(cycleId, RULE_FAILED, benchmark), - { meta: true } - ); - - return Promise.all([benchmarkFindings, benchmarkPassedFindings, benchmarkFailedFindings]).then( - ([benchmarkFindingsResult, benchmarkPassedFindingsResult, benchmarkFailedFindingsResult]) => { - const totalFindings = benchmarkFindingsResult.body.count; - const totalPassed = benchmarkPassedFindingsResult.body.count; - const totalFailed = benchmarkFailedFindingsResult.body.count; - const postureScore = calculatePostureScore(totalFindings, totalPassed, totalFailed); - const stats = { - name: benchmark, - postureScore, - totalFindings, - totalPassed, - totalFailed, - }; - - assertBenchmarkStats(stats); - return stats; - } - ); - }); - - return Promise.all(benchmarkPromises); -}; - -export const getResourceTypesAggs = async ( - esClient: ElasticsearchClient, - cycleId: string -): Promise => { - const resourceTypesQueryResult = await esClient.search( - getRisksEsQuery(cycleId), - { meta: true } - ); - - const resourceTypesAggs = resourceTypesQueryResult.body.aggregations?.resource_types.buckets; - if (!Array.isArray(resourceTypesAggs)) throw new Error('missing resources types buckets'); - - return resourceTypesAggs.map((bucket) => { - const evalBuckets = bucket.bucket_evaluation.buckets; - if (!Array.isArray(evalBuckets)) throw new Error('missing resources types evaluations buckets'); - - const failedBucket = evalBuckets.find((evalBucket) => evalBucket.key === RULE_FAILED); - const passedBucket = evalBuckets.find((evalBucket) => evalBucket.key === RULE_PASSED); - - return { - resourceType: bucket.key, - totalFindings: bucket.doc_count, - totalFailed: failedBucket?.doc_count || 0, - totalPassed: passedBucket?.doc_count || 0, - }; - }); -}; - -export const defineGetStatsRoute = (router: IRouter, logger: Logger): void => - router.get( - { - path: STATS_ROUTE_PATH, - validate: false, - }, - async (context, _, response) => { - try { - const esClient = context.core.elasticsearch.client.asCurrentUser; - const [benchmarks, latestCycleID] = await Promise.all([ - getBenchmarks(esClient), - getLatestCycleId(esClient), - ]); - - // TODO: Utilize ES "Point in Time" feature https://www.elastic.co/guide/en/elasticsearch/reference/current/point-in-time-api.html - const [allFindingsStats, benchmarksStats, resourceTypesAggs] = await Promise.all([ - getAllFindingsStats(esClient, latestCycleID), - getBenchmarksStats(esClient, latestCycleID, benchmarks), - getResourceTypesAggs(esClient, latestCycleID), - ]); - - const body: CloudPostureStats = { - ...allFindingsStats, - benchmarksStats, - resourceTypesAggs, - }; - - return response.ok({ - body, - }); - } catch (err) { - const error = transformError(err); - - return response.customError({ - body: { message: error.message }, - statusCode: error.statusCode, - }); - } - } - ); diff --git a/x-pack/plugins/cloud_security_posture/server/routes/stats/stats_queries.ts b/x-pack/plugins/cloud_security_posture/server/routes/stats/stats_queries.ts deleted file mode 100644 index b88182a27fee1..0000000000000 --- a/x-pack/plugins/cloud_security_posture/server/routes/stats/stats_queries.ts +++ /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 type { - SearchRequest, - CountRequest, - QueryDslQueryContainer, -} from '@elastic/elasticsearch/lib/api/types'; - -import { CSP_KUBEBEAT_INDEX_PATTERN } from '../../../common/constants'; -import { Evaluation } from '../../../common/types'; - -export const getFindingsEsQuery = ( - cycleId: string, - evaluationResult?: string, - benchmark?: string -): CountRequest => { - const filter: QueryDslQueryContainer[] = [{ term: { 'cycle_id.keyword': cycleId } }]; - - if (benchmark) { - filter.push({ term: { 'rule.benchmark.keyword': benchmark } }); - } - - if (evaluationResult) { - filter.push({ term: { 'result.evaluation.keyword': evaluationResult } }); - } - - return { - index: CSP_KUBEBEAT_INDEX_PATTERN, - query: { - bool: { filter }, - }, - }; -}; - -export const getResourcesEvaluationEsQuery = ( - cycleId: string, - evaluation: Evaluation, - size: number, - resources?: string[] -): SearchRequest => { - const query: QueryDslQueryContainer = { - bool: { - filter: [ - { term: { 'cycle_id.keyword': cycleId } }, - { term: { 'result.evaluation.keyword': evaluation } }, - ], - }, - }; - if (resources) { - query.bool!.must = { terms: { 'resource.filename.keyword': resources } }; - } - return { - index: CSP_KUBEBEAT_INDEX_PATTERN, - size, - query, - aggs: { - group: { - terms: { field: 'resource.filename.keyword' }, - }, - }, - sort: 'resource.filename.keyword', - }; -}; - -export const getBenchmarksQuery = (): SearchRequest => ({ - index: CSP_KUBEBEAT_INDEX_PATTERN, - size: 0, - aggs: { - benchmarks: { - terms: { field: 'rule.benchmark.keyword' }, - }, - }, -}); - -export const getLatestFindingQuery = (): SearchRequest => ({ - index: CSP_KUBEBEAT_INDEX_PATTERN, - size: 1, - /* @ts-expect-error TS2322 - missing SearchSortContainer */ - sort: { '@timestamp': 'desc' }, - query: { - match_all: {}, - }, -}); - -export const getRisksEsQuery = (cycleId: string): SearchRequest => ({ - index: CSP_KUBEBEAT_INDEX_PATTERN, - size: 0, - query: { - bool: { - filter: [{ term: { 'cycle_id.keyword': cycleId } }], - }, - }, - aggs: { - resource_types: { - terms: { - field: 'resource.type.keyword', - }, - aggs: { - bucket_evaluation: { - terms: { - field: 'result.evaluation.keyword', - }, - }, - }, - }, - }, -}); diff --git a/x-pack/plugins/cloud_security_posture/server/saved_objects/cis_1_4_1/csp_rule_type.ts b/x-pack/plugins/cloud_security_posture/server/saved_objects/cis_1_4_1/csp_rule_type.ts new file mode 100644 index 0000000000000..fcff7449fb3f5 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/server/saved_objects/cis_1_4_1/csp_rule_type.ts @@ -0,0 +1,58 @@ +/* + * 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 { i18n } from '@kbn/i18n'; +import type { + SavedObjectsType, + SavedObjectsValidationMap, +} from '../../../../../../src/core/server'; +import { + type CspRuleSchema, + cspRuleSchema, + cspRuleAssetSavedObjectType, +} from '../../../common/schemas/csp_rule'; + +const validationMap: SavedObjectsValidationMap = { + '1.0.0': cspRuleSchema, +}; + +export const ruleAssetSavedObjectMappings: SavedObjectsType['mappings'] = { + dynamic: false, + properties: { + name: { + type: 'text', // search + fields: { + // TODO: how is fields mapping shared with UI ? + raw: { + type: 'keyword', // sort + }, + }, + }, + description: { + type: 'text', + }, + }, +}; + +export const cspRuleAssetType: SavedObjectsType = { + name: cspRuleAssetSavedObjectType, + hidden: false, + namespaceType: 'agnostic', + mappings: ruleAssetSavedObjectMappings, + schemas: validationMap, + // migrations: {} + management: { + importableAndExportable: true, + visibleInManagement: true, + getTitle: (savedObject) => + `${i18n.translate('xpack.csp.cspSettings.rules', { + defaultMessage: `CSP Security Rules - `, + })} ${savedObject.attributes.benchmark.name} ${savedObject.attributes.benchmark.version} ${ + savedObject.attributes.name + }`, + }, +}; diff --git a/x-pack/plugins/cloud_security_posture/server/saved_objects/cis_1_4_1/initialize_rules.ts b/x-pack/plugins/cloud_security_posture/server/saved_objects/cis_1_4_1/initialize_rules.ts new file mode 100644 index 0000000000000..1cb08ddc1be1a --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/server/saved_objects/cis_1_4_1/initialize_rules.ts @@ -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 type { ISavedObjectsRepository } from 'src/core/server'; +import { CIS_BENCHMARK_1_4_1_RULES } from './rules'; +import { cspRuleAssetSavedObjectType } from '../../../common/schemas/csp_rule'; + +export const initializeCspRules = async (client: ISavedObjectsRepository) => { + const existingRules = await client.find({ type: cspRuleAssetSavedObjectType, perPage: 1 }); + + // TODO: version? + if (existingRules.total !== 0) return; + + try { + await client.bulkCreate(CIS_BENCHMARK_1_4_1_RULES); + } catch (e) { + // TODO: add logger + // TODO: handle error + } +}; diff --git a/x-pack/plugins/cloud_security_posture/server/saved_objects/cis_1_4_1/rules.ts b/x-pack/plugins/cloud_security_posture/server/saved_objects/cis_1_4_1/rules.ts new file mode 100644 index 0000000000000..8f3d6df65b6b5 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/server/saved_objects/cis_1_4_1/rules.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 type { SavedObjectsBulkCreateObject } from 'src/core/server'; +import type { CspRuleSchema } from '../../../common/schemas/csp_rule'; +import { cspRuleAssetSavedObjectType } from '../../../common/schemas/csp_rule'; + +const benchmark = { name: 'CIS', version: '1.4.1' } as const; + +const RULES: CspRuleSchema[] = [ + { + id: '1.1.1', + name: 'Ensure that the API server pod specification file permissions are set to 644 or more restrictive (Automated)', + description: 'Disable anonymous requests to the API server', + rationale: + 'When enabled, requests that are not rejected by other configured authentication methods\nare treated as anonymous requests. These requests are then served by the API server. You\nshould rely on authentication to authorize access and disallow anonymous requests.\nIf you are using RBAC authorization, it is generally considered reasonable to allow\nanonymous access to the API Server for health checks and discovery purposes, and hence\nthis recommendation is not scored. However, you should consider whether anonymous\ndiscovery is an acceptable risk for your purposes.', + impact: 'Anonymous requests will be rejected.', + default_value: 'By default, anonymous access is enabled.', + remediation: + 'Edit the API server pod specification file /etc/kubernetes/manifests/kubeapiserver.yaml on the master node and set the below parameter.\n--anonymous-auth=false', + tags: [], + enabled: true, + muted: false, + benchmark, + }, + { + id: '1.1.2', + name: 'Ensure that the --basic-auth-file argument is not set (Scored)', + description: 'Do not use basic authentication', + rationale: + 'Basic authentication uses plaintext credentials for authentication. Currently, the basic\nauthentication credentials last indefinitely, and the password cannot be changed without\nrestarting API server. The basic authentication is currently supported for convenience.\nHence, basic authentication should not be used', + impact: + 'You will have to configure and use alternate authentication mechanisms such as tokens and\ncertificates. Username and password for basic authentication could no longer be used.', + default_value: 'By default, basic authentication is not set', + remediation: + 'Follow the documentation and configure alternate mechanisms for authentication. Then,\nedit the API server pod specification file /etc/kubernetes/manifests/kubeapiserver.yaml on the master node and remove the --basic-auth-file=\nparameter.', + tags: [], + enabled: true, + muted: false, + benchmark, + }, +]; + +export const CIS_BENCHMARK_1_4_1_RULES: Array> = + RULES.map((rule) => ({ + attributes: rule, + id: rule.id, + type: cspRuleAssetSavedObjectType, + })); diff --git a/x-pack/plugins/cloud_security_posture/server/types.ts b/x-pack/plugins/cloud_security_posture/server/types.ts index 707002461d2a6..4e70027013df8 100644 --- a/x-pack/plugins/cloud_security_posture/server/types.ts +++ b/x-pack/plugins/cloud_security_posture/server/types.ts @@ -10,6 +10,8 @@ import type { PluginStart as DataPluginStart, } from '../../../../src/plugins/data/server'; +import type { FleetStartContract } from '../../fleet/server'; + // eslint-disable-next-line @typescript-eslint/no-empty-interface export interface CspServerPluginSetup {} // eslint-disable-next-line @typescript-eslint/no-empty-interface @@ -25,6 +27,5 @@ export interface CspServerPluginSetupDeps { export interface CspServerPluginStartDeps { // required data: DataPluginStart; - - // optional + fleet: FleetStartContract; } diff --git a/x-pack/plugins/cloud_security_posture/tsconfig.json b/x-pack/plugins/cloud_security_posture/tsconfig.json index 47625c59eae6c..d7902b8b05977 100755 --- a/x-pack/plugins/cloud_security_posture/tsconfig.json +++ b/x-pack/plugins/cloud_security_posture/tsconfig.json @@ -19,6 +19,7 @@ "references": [ { "path": "../../../src/core/tsconfig.json" }, { "path": "../../../src/plugins/data/tsconfig.json" }, - { "path": "../../../src/plugins/navigation/tsconfig.json" } + { "path": "../../../src/plugins/navigation/tsconfig.json" }, + { "path": "../../../x-pack/plugins/fleet/tsconfig.json" }, ] } From 12f42e06230e15837ecc6c77541a698437e38daa Mon Sep 17 00:00:00 2001 From: Michael Dokolin Date: Wed, 2 Mar 2022 13:25:07 +0100 Subject: [PATCH 101/102] [Data] Provide `datatable` utility functions (#126572) * Extract datatable utilities into a separate service * Add getField utility function * Add getFieldFormat utility function * Add field format setter utility functions * Add data view field setter utility functions * Add getInterval utility function --- .../datatable_utilities_service.test.ts | 123 ++++++++++++++++++ .../datatable_utilities_service.ts | 93 +++++++++++++ .../data/common/datatable_utilities/index.ts | 9 ++ .../data/common/datatable_utilities/mock.ts | 22 ++++ src/plugins/data/common/index.ts | 1 + src/plugins/data/common/mocks.ts | 1 + .../common/search/aggs/aggs_service.test.ts | 3 +- .../data/common/search/aggs/aggs_service.ts | 12 +- src/plugins/data/common/search/aggs/types.ts | 7 - .../aggs/utils/datatable_column_meta.ts | 57 -------- src/plugins/data/public/mocks.ts | 2 + src/plugins/data/public/plugin.ts | 6 +- .../public/search/aggs/aggs_service.test.ts | 3 +- .../data/public/search/aggs/aggs_service.ts | 13 +- src/plugins/data/public/search/aggs/mocks.ts | 5 - src/plugins/data/public/types.ts | 7 + .../datatable_utilities_service.ts | 43 ++++++ .../data/server/datatable_utilities/index.ts | 9 ++ .../data/server/datatable_utilities/mock.ts | 16 +++ src/plugins/data/server/mocks.ts | 2 + src/plugins/data/server/plugin.ts | 17 ++- .../data/server/search/aggs/aggs_service.ts | 19 +-- src/plugins/data/server/search/aggs/mocks.ts | 5 - 23 files changed, 363 insertions(+), 112 deletions(-) create mode 100644 src/plugins/data/common/datatable_utilities/datatable_utilities_service.test.ts create mode 100644 src/plugins/data/common/datatable_utilities/datatable_utilities_service.ts create mode 100644 src/plugins/data/common/datatable_utilities/index.ts create mode 100644 src/plugins/data/common/datatable_utilities/mock.ts delete mode 100644 src/plugins/data/common/search/aggs/utils/datatable_column_meta.ts create mode 100644 src/plugins/data/server/datatable_utilities/datatable_utilities_service.ts create mode 100644 src/plugins/data/server/datatable_utilities/index.ts create mode 100644 src/plugins/data/server/datatable_utilities/mock.ts diff --git a/src/plugins/data/common/datatable_utilities/datatable_utilities_service.test.ts b/src/plugins/data/common/datatable_utilities/datatable_utilities_service.test.ts new file mode 100644 index 0000000000000..d626bc2226543 --- /dev/null +++ b/src/plugins/data/common/datatable_utilities/datatable_utilities_service.test.ts @@ -0,0 +1,123 @@ +/* + * 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 { createStubDataView } from 'src/plugins/data_views/common/mocks'; +import type { DataViewsContract } from 'src/plugins/data_views/common'; +import type { DatatableColumn } from 'src/plugins/expressions/common'; +import { FieldFormat } from 'src/plugins/field_formats/common'; +import { fieldFormatsMock } from 'src/plugins/field_formats/common/mocks'; +import type { AggsCommonStart } from '../search'; +import { DatatableUtilitiesService } from './datatable_utilities_service'; + +describe('DatatableUtilitiesService', () => { + let aggs: jest.Mocked; + let dataViews: jest.Mocked; + let datatableUtilitiesService: DatatableUtilitiesService; + + beforeEach(() => { + aggs = { + createAggConfigs: jest.fn(), + types: { get: jest.fn() }, + } as unknown as typeof aggs; + dataViews = { + get: jest.fn(), + } as unknown as typeof dataViews; + + datatableUtilitiesService = new DatatableUtilitiesService(aggs, dataViews, fieldFormatsMock); + }); + + describe('clearField', () => { + it('should delete the field reference', () => { + const column = { meta: { field: 'foo' } } as DatatableColumn; + + datatableUtilitiesService.clearField(column); + + expect(column).not.toHaveProperty('meta.field'); + }); + }); + + describe('clearFieldFormat', () => { + it('should remove field format', () => { + const column = { meta: { params: { id: 'number' } } } as DatatableColumn; + datatableUtilitiesService.clearFieldFormat(column); + + expect(column).not.toHaveProperty('meta.params'); + }); + }); + + describe('getDataView', () => { + it('should return a data view instance', async () => { + const column = { meta: { index: 'index' } } as DatatableColumn; + const dataView = {} as ReturnType; + dataViews.get.mockReturnValue(dataView); + + await expect(datatableUtilitiesService.getDataView(column)).resolves.toBe(dataView); + expect(dataViews.get).toHaveBeenCalledWith('index'); + }); + + it('should return undefined when there is no index metadata', async () => { + const column = { meta: {} } as DatatableColumn; + + await expect(datatableUtilitiesService.getDataView(column)).resolves.toBeUndefined(); + expect(dataViews.get).not.toHaveBeenCalled(); + }); + }); + + describe('getField', () => { + it('should return a data view field instance', async () => { + const column = { meta: { field: 'field', index: 'index' } } as DatatableColumn; + const dataView = createStubDataView({ spec: {} }); + const field = {}; + spyOn(datatableUtilitiesService, 'getDataView').and.returnValue(dataView); + spyOn(dataView, 'getFieldByName').and.returnValue(field); + + await expect(datatableUtilitiesService.getField(column)).resolves.toBe(field); + expect(dataView.getFieldByName).toHaveBeenCalledWith('field'); + }); + + it('should return undefined when there is no field metadata', async () => { + const column = { meta: {} } as DatatableColumn; + + await expect(datatableUtilitiesService.getField(column)).resolves.toBeUndefined(); + }); + }); + + describe('getFieldFormat', () => { + it('should deserialize field format', () => { + const column = { meta: { params: { id: 'number' } } } as DatatableColumn; + const fieldFormat = datatableUtilitiesService.getFieldFormat(column); + + expect(fieldFormat).toBeInstanceOf(FieldFormat); + }); + }); + + describe('getInterval', () => { + it('should return a histogram interval', () => { + const column = { + meta: { sourceParams: { params: { interval: '1d' } } }, + } as unknown as DatatableColumn; + + expect(datatableUtilitiesService.getInterval(column)).toBe('1d'); + }); + }); + + describe('setFieldFormat', () => { + it('should set new field format', () => { + const column = { meta: {} } as DatatableColumn; + const fieldFormat = fieldFormatsMock.deserialize({ id: 'number' }); + datatableUtilitiesService.setFieldFormat(column, fieldFormat); + + expect(column.meta.params).toEqual( + expect.objectContaining({ + id: expect.anything(), + params: undefined, + }) + ); + }); + }); +}); diff --git a/src/plugins/data/common/datatable_utilities/datatable_utilities_service.ts b/src/plugins/data/common/datatable_utilities/datatable_utilities_service.ts new file mode 100644 index 0000000000000..cf4e65f31cce3 --- /dev/null +++ b/src/plugins/data/common/datatable_utilities/datatable_utilities_service.ts @@ -0,0 +1,93 @@ +/* + * 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 type { DataView, DataViewsContract, DataViewField } from 'src/plugins/data_views/common'; +import type { DatatableColumn } from 'src/plugins/expressions/common'; +import type { FieldFormatsStartCommon, FieldFormat } from 'src/plugins/field_formats/common'; +import type { AggsCommonStart, AggConfig, CreateAggConfigParams, IAggType } from '../search'; + +export class DatatableUtilitiesService { + constructor( + private aggs: AggsCommonStart, + private dataViews: DataViewsContract, + private fieldFormats: FieldFormatsStartCommon + ) { + this.getAggConfig = this.getAggConfig.bind(this); + this.getDataView = this.getDataView.bind(this); + this.getField = this.getField.bind(this); + this.isFilterable = this.isFilterable.bind(this); + } + + clearField(column: DatatableColumn): void { + delete column.meta.field; + } + + clearFieldFormat(column: DatatableColumn): void { + delete column.meta.params; + } + + async getAggConfig(column: DatatableColumn): Promise { + const dataView = await this.getDataView(column); + + if (!dataView) { + return; + } + + const { aggs } = await this.aggs.createAggConfigs( + dataView, + column.meta.sourceParams && [column.meta.sourceParams as CreateAggConfigParams] + ); + + return aggs[0]; + } + + async getDataView(column: DatatableColumn): Promise { + if (!column.meta.index) { + return; + } + + return this.dataViews.get(column.meta.index); + } + + async getField(column: DatatableColumn): Promise { + if (!column.meta.field) { + return; + } + + const dataView = await this.getDataView(column); + if (!dataView) { + return; + } + + return dataView.getFieldByName(column.meta.field); + } + + getFieldFormat(column: DatatableColumn): FieldFormat | undefined { + return this.fieldFormats.deserialize(column.meta.params); + } + + getInterval(column: DatatableColumn): string | undefined { + const params = column.meta.sourceParams?.params as { interval: string } | undefined; + + return params?.interval; + } + + isFilterable(column: DatatableColumn): boolean { + if (column.meta.source !== 'esaggs') { + return false; + } + + const aggType = this.aggs.types.get(column.meta.sourceParams?.type as string) as IAggType; + + return Boolean(aggType.createFilter); + } + + setFieldFormat(column: DatatableColumn, fieldFormat: FieldFormat): void { + column.meta.params = fieldFormat.toJSON(); + } +} diff --git a/src/plugins/data/common/datatable_utilities/index.ts b/src/plugins/data/common/datatable_utilities/index.ts new file mode 100644 index 0000000000000..34df78137510a --- /dev/null +++ b/src/plugins/data/common/datatable_utilities/index.ts @@ -0,0 +1,9 @@ +/* + * 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. + */ + +export * from './datatable_utilities_service'; diff --git a/src/plugins/data/common/datatable_utilities/mock.ts b/src/plugins/data/common/datatable_utilities/mock.ts new file mode 100644 index 0000000000000..4266e501f2ca2 --- /dev/null +++ b/src/plugins/data/common/datatable_utilities/mock.ts @@ -0,0 +1,22 @@ +/* + * 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 type { DatatableUtilitiesService } from './datatable_utilities_service'; + +export function createDatatableUtilitiesMock(): jest.Mocked { + return { + clearField: jest.fn(), + clearFieldFormat: jest.fn(), + getAggConfig: jest.fn(), + getDataView: jest.fn(), + getField: jest.fn(), + getFieldFormat: jest.fn(), + isFilterable: jest.fn(), + setFieldFormat: jest.fn(), + } as unknown as jest.Mocked; +} diff --git a/src/plugins/data/common/index.ts b/src/plugins/data/common/index.ts index 7bb4b78850dcd..a793050eb6556 100644 --- a/src/plugins/data/common/index.ts +++ b/src/plugins/data/common/index.ts @@ -10,6 +10,7 @@ /* eslint-disable @kbn/eslint/no_export_all */ export * from './constants'; +export * from './datatable_utilities'; export * from './es_query'; export * from './kbn_field_types'; export * from './query'; diff --git a/src/plugins/data/common/mocks.ts b/src/plugins/data/common/mocks.ts index c656d9d21346e..cf7d6bef6a4e8 100644 --- a/src/plugins/data/common/mocks.ts +++ b/src/plugins/data/common/mocks.ts @@ -7,3 +7,4 @@ */ export * from '../../data_views/common/fields/fields.mocks'; +export * from './datatable_utilities/mock'; diff --git a/src/plugins/data/common/search/aggs/aggs_service.test.ts b/src/plugins/data/common/search/aggs/aggs_service.test.ts index 998b8bf286b52..b7237c7b80134 100644 --- a/src/plugins/data/common/search/aggs/aggs_service.test.ts +++ b/src/plugins/data/common/search/aggs/aggs_service.test.ts @@ -206,11 +206,10 @@ describe('Aggs service', () => { describe('start()', () => { test('exposes proper contract', () => { const start = service.start(startDeps); - expect(Object.keys(start).length).toBe(4); + expect(Object.keys(start).length).toBe(3); expect(start).toHaveProperty('calculateAutoTimeExpression'); expect(start).toHaveProperty('createAggConfigs'); expect(start).toHaveProperty('types'); - expect(start).toHaveProperty('datatableUtilities'); }); test('types registry returns uninitialized type providers', () => { diff --git a/src/plugins/data/common/search/aggs/aggs_service.ts b/src/plugins/data/common/search/aggs/aggs_service.ts index 58f65bb0cab44..6fe7eef5b87b4 100644 --- a/src/plugins/data/common/search/aggs/aggs_service.ts +++ b/src/plugins/data/common/search/aggs/aggs_service.ts @@ -17,7 +17,6 @@ import { getCalculateAutoTimeExpression, } from './'; import { AggsCommonSetup, AggsCommonStart } from './types'; -import { getDatatableColumnUtilities } from './utils/datatable_column_meta'; /** @internal */ export const aggsRequiredUiSettings = [ @@ -67,11 +66,7 @@ export class AggsCommonService { }; } - public start({ - getConfig, - getIndexPattern, - isDefaultTimezone, - }: AggsCommonStartDependencies): AggsCommonStart { + public start({ getConfig }: AggsCommonStartDependencies): AggsCommonStart { const aggTypesStart = this.aggTypesRegistry.start(); const calculateAutoTimeExpression = getCalculateAutoTimeExpression(getConfig); @@ -86,11 +81,6 @@ export class AggsCommonService { return { calculateAutoTimeExpression, - datatableUtilities: getDatatableColumnUtilities({ - getIndexPattern, - createAggConfigs, - aggTypesStart, - }), createAggConfigs, types: aggTypesStart, }; diff --git a/src/plugins/data/common/search/aggs/types.ts b/src/plugins/data/common/search/aggs/types.ts index 34d773b0ba518..cf9a6123b14c8 100644 --- a/src/plugins/data/common/search/aggs/types.ts +++ b/src/plugins/data/common/search/aggs/types.ts @@ -7,7 +7,6 @@ */ import { Assign } from '@kbn/utility-types'; -import { DatatableColumn } from 'src/plugins/expressions'; import { IndexPattern } from '../..'; import { aggAvg, @@ -88,7 +87,6 @@ import { CreateAggConfigParams, getCalculateAutoTimeExpression, METRIC_TYPES, - AggConfig, aggFilteredMetric, aggSinglePercentile, } from './'; @@ -111,11 +109,6 @@ export interface AggsCommonSetup { export interface AggsCommonStart { calculateAutoTimeExpression: ReturnType; - datatableUtilities: { - getIndexPattern: (column: DatatableColumn) => Promise; - getAggConfig: (column: DatatableColumn) => Promise; - isFilterable: (column: DatatableColumn) => boolean; - }; createAggConfigs: ( indexPattern: IndexPattern, configStates?: CreateAggConfigParams[] diff --git a/src/plugins/data/common/search/aggs/utils/datatable_column_meta.ts b/src/plugins/data/common/search/aggs/utils/datatable_column_meta.ts deleted file mode 100644 index 0e3ff69fac1d1..0000000000000 --- a/src/plugins/data/common/search/aggs/utils/datatable_column_meta.ts +++ /dev/null @@ -1,57 +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 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 { DatatableColumn } from 'src/plugins/expressions/common'; -import { IndexPattern } from '../../..'; -import { AggConfigs, CreateAggConfigParams } from '../agg_configs'; -import { AggTypesRegistryStart } from '../agg_types_registry'; -import { IAggType } from '../agg_type'; - -export interface MetaByColumnDeps { - getIndexPattern: (id: string) => Promise; - createAggConfigs: ( - indexPattern: IndexPattern, - configStates?: CreateAggConfigParams[] - ) => InstanceType; - aggTypesStart: AggTypesRegistryStart; -} - -export const getDatatableColumnUtilities = (deps: MetaByColumnDeps) => { - const { getIndexPattern, createAggConfigs, aggTypesStart } = deps; - - const getIndexPatternFromDatatableColumn = async (column: DatatableColumn) => { - if (!column.meta.index) return; - - return await getIndexPattern(column.meta.index); - }; - - const getAggConfigFromDatatableColumn = async (column: DatatableColumn) => { - const indexPattern = await getIndexPatternFromDatatableColumn(column); - - if (!indexPattern) return; - - const aggConfigs = await createAggConfigs(indexPattern, [column.meta.sourceParams as any]); - return aggConfigs.aggs[0]; - }; - - const isFilterableAggDatatableColumn = (column: DatatableColumn) => { - if (column.meta.source !== 'esaggs') { - return false; - } - const aggType = (aggTypesStart.get(column.meta.sourceParams?.type as string) as any)( - {} - ) as IAggType; - return Boolean(aggType.createFilter); - }; - - return { - getIndexPattern: getIndexPatternFromDatatableColumn, - getAggConfig: getAggConfigFromDatatableColumn, - isFilterable: isFilterableAggDatatableColumn, - }; -}; diff --git a/src/plugins/data/public/mocks.ts b/src/plugins/data/public/mocks.ts index 53600a1f44469..630a29a8a7854 100644 --- a/src/plugins/data/public/mocks.ts +++ b/src/plugins/data/public/mocks.ts @@ -6,6 +6,7 @@ * Side Public License, v 1. */ +import { createDatatableUtilitiesMock } from '../common/mocks'; import { DataPlugin, DataViewsContract } from '.'; import { fieldFormatsServiceMock } from '../../field_formats/public/mocks'; import { searchServiceMock } from './search/mocks'; @@ -58,6 +59,7 @@ const createStartContract = (): Start => { createFiltersFromRangeSelectAction: jest.fn(), }, autocomplete: autocompleteStartMock, + datatableUtilities: createDatatableUtilitiesMock(), search: searchServiceMock.createStartContract(), fieldFormats: fieldFormatsServiceMock.createStartContract(), query: queryStartMock, diff --git a/src/plugins/data/public/plugin.ts b/src/plugins/data/public/plugin.ts index 7d19c1eb3ac19..50795b4416247 100644 --- a/src/plugins/data/public/plugin.ts +++ b/src/plugins/data/public/plugin.ts @@ -42,7 +42,7 @@ import { APPLY_FILTER_TRIGGER, applyFilterTrigger } from './triggers'; import { UsageCollectionSetup } from '../../usage_collection/public'; import { getTableViewDescription } from './utils/table_inspector_view'; import { NowProvider, NowProviderInternalContract } from './now_provider'; -import { getAggsFormats } from '../common'; +import { getAggsFormats, DatatableUtilitiesService } from '../common'; export class DataPublicPlugin implements @@ -108,7 +108,7 @@ export class DataPublicPlugin uiActions: startServices().plugins.uiActions, uiSettings: startServices().core.uiSettings, fieldFormats: startServices().self.fieldFormats, - isFilterable: startServices().self.search.aggs.datatableUtilities.isFilterable, + isFilterable: startServices().self.datatableUtilities.isFilterable, })) ); @@ -166,12 +166,14 @@ export class DataPublicPlugin uiActions.getAction(ACTION_GLOBAL_APPLY_FILTER) ); + const datatableUtilities = new DatatableUtilitiesService(search.aggs, dataViews, fieldFormats); const dataServices = { actions: { createFiltersFromValueClickAction, createFiltersFromRangeSelectAction, }, autocomplete: this.autocomplete.start(), + datatableUtilities, fieldFormats, indexPatterns: dataViews, dataViews, diff --git a/src/plugins/data/public/search/aggs/aggs_service.test.ts b/src/plugins/data/public/search/aggs/aggs_service.test.ts index b0e6e0327e654..101c2c909c7e1 100644 --- a/src/plugins/data/public/search/aggs/aggs_service.test.ts +++ b/src/plugins/data/public/search/aggs/aggs_service.test.ts @@ -79,11 +79,10 @@ describe('AggsService - public', () => { describe('start()', () => { test('exposes proper contract', () => { const start = service.start(startDeps); - expect(Object.keys(start).length).toBe(4); + expect(Object.keys(start).length).toBe(3); expect(start).toHaveProperty('calculateAutoTimeExpression'); expect(start).toHaveProperty('createAggConfigs'); expect(start).toHaveProperty('types'); - expect(start).toHaveProperty('datatableUtilities'); }); test('types registry returns initialized agg types', () => { diff --git a/src/plugins/data/public/search/aggs/aggs_service.ts b/src/plugins/data/public/search/aggs/aggs_service.ts index 4907c3bcbad26..99930a95831ea 100644 --- a/src/plugins/data/public/search/aggs/aggs_service.ts +++ b/src/plugins/data/public/search/aggs/aggs_service.ts @@ -91,13 +91,11 @@ export class AggsService { public start({ fieldFormats, uiSettings, indexPatterns }: AggsStartDependencies): AggsStart { const isDefaultTimezone = () => uiSettings.isDefault('dateFormat:tz'); - const { calculateAutoTimeExpression, datatableUtilities, types } = this.aggsCommonService.start( - { - getConfig: this.getConfig!, - getIndexPattern: indexPatterns.get, - isDefaultTimezone, - } - ); + const { calculateAutoTimeExpression, types } = this.aggsCommonService.start({ + getConfig: this.getConfig!, + getIndexPattern: indexPatterns.get, + isDefaultTimezone, + }); const aggTypesDependencies: AggTypesDependencies = { calculateBounds: this.calculateBounds, @@ -137,7 +135,6 @@ export class AggsService { return { calculateAutoTimeExpression, - datatableUtilities, createAggConfigs: (indexPattern, configStates = []) => { return new AggConfigs(indexPattern, configStates, { typesRegistry }); }, diff --git a/src/plugins/data/public/search/aggs/mocks.ts b/src/plugins/data/public/search/aggs/mocks.ts index fb50058f08348..c45d024384ba6 100644 --- a/src/plugins/data/public/search/aggs/mocks.ts +++ b/src/plugins/data/public/search/aggs/mocks.ts @@ -56,11 +56,6 @@ export const searchAggsSetupMock = (): AggsSetup => ({ export const searchAggsStartMock = (): AggsStart => ({ calculateAutoTimeExpression: getCalculateAutoTimeExpression(getConfig), - datatableUtilities: { - isFilterable: jest.fn(), - getAggConfig: jest.fn(), - getIndexPattern: jest.fn(), - }, createAggConfigs: jest.fn().mockImplementation((indexPattern, configStates = [], schemas) => { return new AggConfigs(indexPattern, configStates, { typesRegistry: mockAggTypesRegistry(), diff --git a/src/plugins/data/public/types.ts b/src/plugins/data/public/types.ts index e2e7c6b222b90..bfc35b8f39c51 100644 --- a/src/plugins/data/public/types.ts +++ b/src/plugins/data/public/types.ts @@ -14,6 +14,7 @@ import { ExpressionsSetup } from 'src/plugins/expressions/public'; import { DataViewsPublicPluginStart } from 'src/plugins/data_views/public'; import { UiActionsSetup, UiActionsStart } from 'src/plugins/ui_actions/public'; import { FieldFormatsSetup, FieldFormatsStart } from 'src/plugins/field_formats/public'; +import { DatatableUtilitiesService } from '../common'; import { AutocompleteSetup, AutocompleteStart } from './autocomplete'; import { createFiltersFromRangeSelectAction, createFiltersFromValueClickAction } from './actions'; import type { ISearchSetup, ISearchStart } from './search'; @@ -83,6 +84,12 @@ export interface DataPublicPluginStart { * {@link DataViewsContract} */ dataViews: DataViewsContract; + + /** + * Datatable type utility functions. + */ + datatableUtilities: DatatableUtilitiesService; + /** * index patterns service * {@link DataViewsContract} diff --git a/src/plugins/data/server/datatable_utilities/datatable_utilities_service.ts b/src/plugins/data/server/datatable_utilities/datatable_utilities_service.ts new file mode 100644 index 0000000000000..3909003cd4d2c --- /dev/null +++ b/src/plugins/data/server/datatable_utilities/datatable_utilities_service.ts @@ -0,0 +1,43 @@ +/* + * 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 type { + ElasticsearchClient, + SavedObjectsClientContract, + UiSettingsServiceStart, +} from 'src/core/server'; +import type { FieldFormatsStart } from 'src/plugins/field_formats/server'; +import type { IndexPatternsServiceStart } from 'src/plugins/data_views/server'; +import { DatatableUtilitiesService as DatatableUtilitiesServiceCommon } from '../../common'; +import type { AggsStart } from '../search'; + +export class DatatableUtilitiesService { + constructor( + private aggs: AggsStart, + private dataViews: IndexPatternsServiceStart, + private fieldFormats: FieldFormatsStart, + private uiSettings: UiSettingsServiceStart + ) { + this.asScopedToClient = this.asScopedToClient.bind(this); + } + + async asScopedToClient( + savedObjectsClient: SavedObjectsClientContract, + elasticsearchClient: ElasticsearchClient + ): Promise { + const aggs = await this.aggs.asScopedToClient(savedObjectsClient, elasticsearchClient); + const dataViews = await this.dataViews.dataViewsServiceFactory( + savedObjectsClient, + elasticsearchClient + ); + const uiSettings = this.uiSettings.asScopedToClient(savedObjectsClient); + const fieldFormats = await this.fieldFormats.fieldFormatServiceFactory(uiSettings); + + return new DatatableUtilitiesServiceCommon(aggs, dataViews, fieldFormats); + } +} diff --git a/src/plugins/data/server/datatable_utilities/index.ts b/src/plugins/data/server/datatable_utilities/index.ts new file mode 100644 index 0000000000000..34df78137510a --- /dev/null +++ b/src/plugins/data/server/datatable_utilities/index.ts @@ -0,0 +1,9 @@ +/* + * 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. + */ + +export * from './datatable_utilities_service'; diff --git a/src/plugins/data/server/datatable_utilities/mock.ts b/src/plugins/data/server/datatable_utilities/mock.ts new file mode 100644 index 0000000000000..9ec069fda7ab0 --- /dev/null +++ b/src/plugins/data/server/datatable_utilities/mock.ts @@ -0,0 +1,16 @@ +/* + * 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 { createDatatableUtilitiesMock as createDatatableUtilitiesCommonMock } from '../../common/mocks'; +import type { DatatableUtilitiesService } from './datatable_utilities_service'; + +export function createDatatableUtilitiesMock(): jest.Mocked { + return { + asScopedToClient: jest.fn(createDatatableUtilitiesCommonMock), + } as unknown as jest.Mocked; +} diff --git a/src/plugins/data/server/mocks.ts b/src/plugins/data/server/mocks.ts index 6fd670d869c20..355e809888bd4 100644 --- a/src/plugins/data/server/mocks.ts +++ b/src/plugins/data/server/mocks.ts @@ -16,6 +16,7 @@ import { createFieldFormatsStartMock, } from '../../field_formats/server/mocks'; import { createIndexPatternsStartMock } from './data_views/mocks'; +import { createDatatableUtilitiesMock } from './datatable_utilities/mock'; import { DataRequestHandlerContext } from './search'; import { AutocompleteSetup } from './autocomplete'; @@ -42,6 +43,7 @@ function createStartContract() { */ fieldFormats: createFieldFormatsStartMock(), indexPatterns: createIndexPatternsStartMock(), + datatableUtilities: createDatatableUtilitiesMock(), }; } diff --git a/src/plugins/data/server/plugin.ts b/src/plugins/data/server/plugin.ts index ab8e28755cd77..9d5b3792da566 100644 --- a/src/plugins/data/server/plugin.ts +++ b/src/plugins/data/server/plugin.ts @@ -11,6 +11,7 @@ import { ExpressionsServerSetup } from 'src/plugins/expressions/server'; import { BfetchServerSetup } from 'src/plugins/bfetch/server'; import { PluginStart as DataViewsServerPluginStart } from 'src/plugins/data_views/server'; import { ConfigSchema } from '../config'; +import { DatatableUtilitiesService } from './datatable_utilities'; import type { ISearchSetup, ISearchStart, SearchEnhancements } from './search'; import { SearchService } from './search/search_service'; import { QueryService } from './query/query_service'; @@ -48,6 +49,11 @@ export interface DataPluginStart { */ fieldFormats: FieldFormatsStart; indexPatterns: DataViewsServerPluginStart; + + /** + * Datatable type utility functions. + */ + datatableUtilities: DatatableUtilitiesService; } export interface DataPluginSetupDependencies { @@ -115,10 +121,19 @@ export class DataServerPlugin } public start(core: CoreStart, { fieldFormats, dataViews }: DataPluginStartDependencies) { + const search = this.searchService.start(core, { fieldFormats, indexPatterns: dataViews }); + const datatableUtilities = new DatatableUtilitiesService( + search.aggs, + dataViews, + fieldFormats, + core.uiSettings + ); + return { + datatableUtilities, + search, fieldFormats, indexPatterns: dataViews, - search: this.searchService.start(core, { fieldFormats, indexPatterns: dataViews }), }; } diff --git a/src/plugins/data/server/search/aggs/aggs_service.ts b/src/plugins/data/server/search/aggs/aggs_service.ts index e65c6d4134970..808c0e9cc8499 100644 --- a/src/plugins/data/server/search/aggs/aggs_service.ts +++ b/src/plugins/data/server/search/aggs/aggs_service.ts @@ -72,17 +72,13 @@ export class AggsService { }; const isDefaultTimezone = () => getConfig('dateFormat:tz') === 'Browser'; - const { calculateAutoTimeExpression, datatableUtilities, types } = - this.aggsCommonService.start({ - getConfig, - getIndexPattern: ( - await indexPatterns.indexPatternsServiceFactory( - savedObjectsClient, - elasticsearchClient - ) - ).get, - isDefaultTimezone, - }); + const { calculateAutoTimeExpression, types } = this.aggsCommonService.start({ + getConfig, + getIndexPattern: ( + await indexPatterns.indexPatternsServiceFactory(savedObjectsClient, elasticsearchClient) + ).get, + isDefaultTimezone, + }); const aggTypesDependencies: AggTypesDependencies = { calculateBounds: this.calculateBounds, @@ -118,7 +114,6 @@ export class AggsService { return { calculateAutoTimeExpression, - datatableUtilities, createAggConfigs: (indexPattern, configStates = []) => { return new AggConfigs(indexPattern, configStates, { typesRegistry }); }, diff --git a/src/plugins/data/server/search/aggs/mocks.ts b/src/plugins/data/server/search/aggs/mocks.ts index 3644a3c13c48d..301bc3e5e1240 100644 --- a/src/plugins/data/server/search/aggs/mocks.ts +++ b/src/plugins/data/server/search/aggs/mocks.ts @@ -58,11 +58,6 @@ export const searchAggsSetupMock = (): AggsSetup => ({ const commonStartMock = (): AggsCommonStart => ({ calculateAutoTimeExpression: getCalculateAutoTimeExpression(getConfig), - datatableUtilities: { - getIndexPattern: jest.fn(), - getAggConfig: jest.fn(), - isFilterable: jest.fn(), - }, createAggConfigs: jest.fn().mockImplementation((indexPattern, configStates = [], schemas) => { return new AggConfigs(indexPattern, configStates, { typesRegistry: mockAggTypesRegistry(), From d53154ec5ebb9feb1a77d948e046269cc0a7f6e9 Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Wed, 2 Mar 2022 13:58:38 +0100 Subject: [PATCH 102/102] [Reporting] Remove `preserve_layout` injected css (#126475) * remove unnecessary CSS * removed unused discover injected CSS * move visualize-specific css to visualize * added some comments * added missing mock Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- src/plugins/visualizations/kibana.json | 3 +- src/plugins/visualizations/public/mocks.ts | 2 + src/plugins/visualizations/public/plugin.ts | 7 ++ .../public/visualize_screenshot_mode.scss | 60 ++++++++++++++ .../server/layouts/preserve_layout.css | 80 +------------------ 5 files changed, 74 insertions(+), 78 deletions(-) create mode 100644 src/plugins/visualizations/public/visualize_screenshot_mode.scss diff --git a/src/plugins/visualizations/kibana.json b/src/plugins/visualizations/kibana.json index c7fd9c977bc2e..79b04f132077b 100644 --- a/src/plugins/visualizations/kibana.json +++ b/src/plugins/visualizations/kibana.json @@ -12,9 +12,10 @@ "embeddable", "inspector", "savedObjects", + "screenshotMode", "presentationUtil" ], - "optionalPlugins": [ "home", "share", "usageCollection", "spaces", "savedObjectsTaggingOss"], + "optionalPlugins": ["home", "share", "usageCollection", "spaces", "savedObjectsTaggingOss"], "requiredBundles": ["kibanaUtils", "discover", "kibanaReact", "home"], "extraPublicDirs": ["common/constants", "common/utils", "common/expression_functions"], "owner": { diff --git a/src/plugins/visualizations/public/mocks.ts b/src/plugins/visualizations/public/mocks.ts index 0fc142aeead63..69a7c61e68893 100644 --- a/src/plugins/visualizations/public/mocks.ts +++ b/src/plugins/visualizations/public/mocks.ts @@ -23,6 +23,7 @@ import { urlForwardingPluginMock } from '../../../plugins/url_forwarding/public/ import { navigationPluginMock } from '../../../plugins/navigation/public/mocks'; import { presentationUtilPluginMock } from '../../../plugins/presentation_util/public/mocks'; import { savedObjectTaggingOssPluginMock } from '../../saved_objects_tagging_oss/public/mocks'; +import { screenshotModePluginMock } from '../../screenshot_mode/public/mocks'; const createSetupContract = (): VisualizationsSetup => ({ createBaseVisualization: jest.fn(), @@ -68,6 +69,7 @@ const createInstance = async () => { navigation: navigationPluginMock.createStartContract(), presentationUtil: presentationUtilPluginMock.createStartContract(coreMock.createStart()), urlForwarding: urlForwardingPluginMock.createStartContract(), + screenshotMode: screenshotModePluginMock.createStartContract(), }); return { diff --git a/src/plugins/visualizations/public/plugin.ts b/src/plugins/visualizations/public/plugin.ts index c8c4d57543a02..92bcf1dfe6a96 100644 --- a/src/plugins/visualizations/public/plugin.ts +++ b/src/plugins/visualizations/public/plugin.ts @@ -86,6 +86,7 @@ import type { SharePluginSetup, SharePluginStart } from '../../share/public'; import type { UrlForwardingSetup, UrlForwardingStart } from '../../url_forwarding/public'; import type { PresentationUtilPluginStart } from '../../presentation_util/public'; import type { UsageCollectionStart } from '../../usage_collection/public'; +import type { ScreenshotModePluginStart } from '../../screenshot_mode/public'; import type { HomePublicPluginSetup } from '../../home/public'; import type { SpacesPluginStart } from '../../../../x-pack/plugins/spaces/public'; @@ -130,6 +131,7 @@ export interface VisualizationsStartDeps { share?: SharePluginStart; urlForwarding: UrlForwardingStart; usageCollection?: UsageCollectionStart; + screenshotMode: ScreenshotModePluginStart; } /** @@ -289,6 +291,11 @@ export class VisualizationsPlugin params.element.classList.add('visAppWrapper'); const { renderApp } = await import('./visualize_app'); + if (pluginsStart.screenshotMode.isScreenshotMode()) { + params.element.classList.add('visEditorScreenshotModeActive'); + // @ts-expect-error TS error, cannot find type declaration for scss + await import('./visualize_screenshot_mode.scss'); + } const unmount = renderApp(params, services); return () => { data.search.session.clear(); diff --git a/src/plugins/visualizations/public/visualize_screenshot_mode.scss b/src/plugins/visualizations/public/visualize_screenshot_mode.scss new file mode 100644 index 0000000000000..b0a8bb35835bd --- /dev/null +++ b/src/plugins/visualizations/public/visualize_screenshot_mode.scss @@ -0,0 +1,60 @@ +/* hide unusable controls */ +/* TODO: This is the legacy way of hiding chrome elements. Rather use chrome.setIsVisible */ +kbn-top-nav, +filter-bar, +.kbnTopNavMenu__wrapper, +::-webkit-scrollbar, +.euiNavDrawer { + display: none !important; +} + +/* hide unusable controls +* !important is required to override resizable panel inline display */ +.visEditorScreenshotModeActive .visEditor__content .visEditor--default > :not(.visEditor__visualization__wrapper) { + display: none !important; +} + +/** THIS IS FOR TSVB UNTIL REFACTOR **/ +.visEditorScreenshotModeActive .tvbEditorVisualization { + position: static !important; +} +.visEditorScreenshotModeActive .visualize .tvbVisTimeSeries__legendToggle { + /* all non-content rows in interface */ + display: none; +} + +.visEditorScreenshotModeActive .tvbEditor--hideForReporting { + /* all non-content rows in interface */ + display: none; +} +/** END TSVB BAD BAD HACKS **/ + +/* remove left padding from visualizations so that map lines up with .leaflet-container and +* setting the position to be fixed and to take up the entire screen, because some zoom levels/viewports +* are triggering the media breakpoints that cause the .visEditor__canvas to take up more room than the viewport */ + +.visEditorScreenshotModeActive .visEditor .visEditor__canvas { + padding-left: 0; + position: fixed; + width: 100%; + height: 100%; + top: 0; + left: 0; +} + +/** + * Visualization tweaks + */ + +/* hide unusable controls */ +.visEditorScreenshotModeActive .visualize .visLegend__toggle, +.visEditorScreenshotModeActive .visualize .kbnAggTable__controls, +.visEditorScreenshotModeActive .visualize .leaflet-container .leaflet-top.leaflet-left, +.visEditorScreenshotModeActive .visualize paginate-controls /* page numbers */ { + display: none; +} + +/* Ensure the min-height of the small breakpoint isn't used */ +.visEditorScreenshotModeActive .vis-editor visualization { + min-height: 0 !important; +} diff --git a/x-pack/plugins/screenshotting/server/layouts/preserve_layout.css b/x-pack/plugins/screenshotting/server/layouts/preserve_layout.css index 60513c417165f..7b692881d5bde 100644 --- a/x-pack/plugins/screenshotting/server/layouts/preserve_layout.css +++ b/x-pack/plugins/screenshotting/server/layouts/preserve_layout.css @@ -1,12 +1,5 @@ -/* - ****** - ****** This is a collection of CSS overrides that make Kibana look better for - ****** generating PDF reports with headless browser - ****** - */ - /** - * global + * Global utilities */ /* elements can hide themselves when shared */ @@ -14,26 +7,9 @@ display: none !important; } -/* hide unusable controls */ -kbn-top-nav, -filter-bar, -.kbnTopNavMenu__wrapper, -::-webkit-scrollbar, -.euiNavDrawer { - display: none !important; -} - /** - * Discover Tweaks - */ - -/* hide unusable controls */ -discover-app .dscTimechart, -discover-app .dscSidebar__container, -discover-app .dscCollapsibleSidebar__collapseButton, -discover-app .discover-table-footer { - display: none; -} +* Global overrides +*/ /** * The global banner (e.g. "Help us improve Elastic...") should not print. @@ -41,53 +17,3 @@ discover-app .discover-table-footer { #globalBannerList { display: none; } - -/** - * Visualize Editor Tweaks - */ - -/* hide unusable controls -* !important is required to override resizable panel inline display */ -.visEditor__content .visEditor--default > :not(.visEditor__visualization__wrapper) { - display: none !important; -} - -/** THIS IS FOR TSVB UNTIL REFACTOR **/ -.tvbEditorVisualization { - position: static !important; -} -.visualize .tvbVisTimeSeries__legendToggle, -.tvbEditor--hideForReporting { - /* all non-content rows in interface */ - display: none; -} -/** END TSVB BAD BAD HACKS **/ - -/* remove left padding from visualizations so that map lines up with .leaflet-container and -* setting the position to be fixed and to take up the entire screen, because some zoom levels/viewports -* are triggering the media breakpoints that cause the .visEditor__canvas to take up more room than the viewport */ -.visEditor .visEditor__canvas { - padding-left: 0px; - position: fixed; - width: 100%; - height: 100%; - top: 0; - left: 0; -} - -/** - * Visualization tweaks - */ - -/* hide unusable controls */ -.visualize .visLegend__toggle, -.visualize .kbnAggTable__controls/* export raw, export formatted, etc. */ , -.visualize .leaflet-container .leaflet-top.leaflet-left/* tilemap controls */ , -.visualize paginate-controls /* page numbers */ { - display: none; -} - -/* Ensure the min-height of the small breakpoint isn't used */ -.vis-editor visualization { - min-height: 0 !important; -}