From 4f267413c84a6d928076483362de16490c22d3e8 Mon Sep 17 00:00:00 2001 From: Robert Oskamp Date: Tue, 4 Feb 2020 16:08:17 +0100 Subject: [PATCH 01/86] [ML] Functional tests - stabilize job row and analytics result view assertions (#56595) This PR makes assertions of the job row and analytics result views more robust against loading time issues during test execution. --- .../services/machine_learning/data_frame_analytics_table.ts | 2 +- x-pack/test/functional/services/machine_learning/job_table.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/functional/services/machine_learning/data_frame_analytics_table.ts b/x-pack/test/functional/services/machine_learning/data_frame_analytics_table.ts index 0324b440548bc..1d710a1c4cec7 100644 --- a/x-pack/test/functional/services/machine_learning/data_frame_analytics_table.ts +++ b/x-pack/test/functional/services/machine_learning/data_frame_analytics_table.ts @@ -92,7 +92,7 @@ export function MachineLearningDataFrameAnalyticsTableProvider({ getService }: F public async openResultsView() { await this.assertJobViewButtonExists(); await testSubjects.click('mlAnalyticsJobViewButton'); - await testSubjects.existOrFail('mlPageDataFrameAnalyticsExploration', { timeout: 5000 }); + await testSubjects.existOrFail('mlPageDataFrameAnalyticsExploration', { timeout: 20 * 1000 }); } public async filterWithSearchString(filter: string) { diff --git a/x-pack/test/functional/services/machine_learning/job_table.ts b/x-pack/test/functional/services/machine_learning/job_table.ts index eed6d180b4dca..153a0ac477b47 100644 --- a/x-pack/test/functional/services/machine_learning/job_table.ts +++ b/x-pack/test/functional/services/machine_learning/job_table.ts @@ -176,6 +176,7 @@ export function MachineLearningJobTableProvider({ getService }: FtrProviderConte } public async assertJobRowFields(jobId: string, expectedRow: object) { + await this.refreshJobList(); const rows = await this.parseJobTable(); const jobRow = rows.filter(row => row.id === jobId)[0]; expect(jobRow).to.eql(expectedRow); From be61507349fa3a08cee7ca75a15d6c2b2ed41a19 Mon Sep 17 00:00:00 2001 From: Alexey Antonov Date: Tue, 4 Feb 2020 18:25:26 +0300 Subject: [PATCH 02/86] =?UTF-8?q?Move=20kuery=5Fautocomplete=20=E2=87=92?= =?UTF-8?q?=20NP=20(#56607)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Move kuery_autocomplete ⇒ NP Closes: #51277 * fix i18n keys * update translations * data_xpack -> data_enhanced * data -> data_enhanced * fix i18nrc * fix PR comments --- x-pack/.i18nrc.json | 2 +- x-pack/index.js | 2 - .../plugins/kuery_autocomplete/index.ts | 22 -------- .../kuery_autocomplete/public/legacy.ts | 27 ---------- .../kuery_autocomplete/public/plugin.ts | 41 --------------- x-pack/plugins/data_enhanced/kibana.json | 13 +++++ .../public/autocomplete/index.ts | 10 ++++ .../__fixtures__/index_pattern_response.json | 0 .../kql_query_suggestion/conjunction.test.ts | 4 +- .../kql_query_suggestion/conjunction.tsx | 18 +++---- .../kql_query_suggestion/field.test.ts | 4 +- .../providers}/kql_query_suggestion/field.tsx | 8 ++- .../providers}/kql_query_suggestion/index.ts | 4 +- .../lib/escape_kuery.test.ts | 0 .../kql_query_suggestion/lib/escape_kuery.ts | 0 .../kql_query_suggestion/operator.test.ts | 4 +- .../kql_query_suggestion/operator.tsx | 50 +++++++++---------- .../sort_prefix_first.test.ts | 0 .../kql_query_suggestion/sort_prefix_first.ts | 0 .../providers}/kql_query_suggestion/types.ts | 2 +- .../kql_query_suggestion/value.test.ts | 6 +-- .../providers}/kql_query_suggestion/value.ts | 4 +- .../data_enhanced}/public/index.ts | 9 ++-- x-pack/plugins/data_enhanced/public/plugin.ts | 33 ++++++++++++ .../data_enhanced}/public/services.ts | 4 +- .../translations/translations/ja-JP.json | 34 ++++++------- .../translations/translations/zh-CN.json | 34 ++++++------- 27 files changed, 152 insertions(+), 183 deletions(-) delete mode 100644 x-pack/legacy/plugins/kuery_autocomplete/index.ts delete mode 100644 x-pack/legacy/plugins/kuery_autocomplete/public/legacy.ts delete mode 100644 x-pack/legacy/plugins/kuery_autocomplete/public/plugin.ts create mode 100644 x-pack/plugins/data_enhanced/kibana.json create mode 100644 x-pack/plugins/data_enhanced/public/autocomplete/index.ts rename x-pack/{legacy/plugins/kuery_autocomplete/public => plugins/data_enhanced/public/autocomplete/providers}/kql_query_suggestion/__fixtures__/index_pattern_response.json (100%) rename x-pack/{legacy/plugins/kuery_autocomplete/public => plugins/data_enhanced/public/autocomplete/providers}/kql_query_suggestion/conjunction.test.ts (93%) rename x-pack/{legacy/plugins/kuery_autocomplete/public => plugins/data_enhanced/public/autocomplete/providers}/kql_query_suggestion/conjunction.tsx (69%) rename x-pack/{legacy/plugins/kuery_autocomplete/public => plugins/data_enhanced/public/autocomplete/providers}/kql_query_suggestion/field.test.ts (98%) rename x-pack/{legacy/plugins/kuery_autocomplete/public => plugins/data_enhanced/public/autocomplete/providers}/kql_query_suggestion/field.tsx (94%) rename x-pack/{legacy/plugins/kuery_autocomplete/public => plugins/data_enhanced/public/autocomplete/providers}/kql_query_suggestion/index.ts (94%) rename x-pack/{legacy/plugins/kuery_autocomplete/public => plugins/data_enhanced/public/autocomplete/providers}/kql_query_suggestion/lib/escape_kuery.test.ts (100%) rename x-pack/{legacy/plugins/kuery_autocomplete/public => plugins/data_enhanced/public/autocomplete/providers}/kql_query_suggestion/lib/escape_kuery.ts (100%) rename x-pack/{legacy/plugins/kuery_autocomplete/public => plugins/data_enhanced/public/autocomplete/providers}/kql_query_suggestion/operator.test.ts (94%) rename x-pack/{legacy/plugins/kuery_autocomplete/public => plugins/data_enhanced/public/autocomplete/providers}/kql_query_suggestion/operator.tsx (64%) rename x-pack/{legacy/plugins/kuery_autocomplete/public => plugins/data_enhanced/public/autocomplete/providers}/kql_query_suggestion/sort_prefix_first.test.ts (100%) rename x-pack/{legacy/plugins/kuery_autocomplete/public => plugins/data_enhanced/public/autocomplete/providers}/kql_query_suggestion/sort_prefix_first.ts (100%) rename x-pack/{legacy/plugins/kuery_autocomplete/public => plugins/data_enhanced/public/autocomplete/providers}/kql_query_suggestion/types.ts (85%) rename x-pack/{legacy/plugins/kuery_autocomplete/public => plugins/data_enhanced/public/autocomplete/providers}/kql_query_suggestion/value.test.ts (96%) rename x-pack/{legacy/plugins/kuery_autocomplete/public => plugins/data_enhanced/public/autocomplete/providers}/kql_query_suggestion/value.ts (93%) rename x-pack/{legacy/plugins/kuery_autocomplete => plugins/data_enhanced}/public/index.ts (50%) create mode 100644 x-pack/plugins/data_enhanced/public/plugin.ts rename x-pack/{legacy/plugins/kuery_autocomplete => plugins/data_enhanced}/public/services.ts (70%) diff --git a/x-pack/.i18nrc.json b/x-pack/.i18nrc.json index 32ff4908629eb..50348a74f0725 100644 --- a/x-pack/.i18nrc.json +++ b/x-pack/.i18nrc.json @@ -18,7 +18,7 @@ "xpack.idxMgmt": "legacy/plugins/index_management", "xpack.indexLifecycleMgmt": "legacy/plugins/index_lifecycle_management", "xpack.infra": "legacy/plugins/infra", - "xpack.kueryAutocomplete": "legacy/plugins/kuery_autocomplete", + "xpack.data": "plugins/data_enhanced", "xpack.lens": "legacy/plugins/lens", "xpack.licenseMgmt": "legacy/plugins/license_management", "xpack.licensing": "plugins/licensing", diff --git a/x-pack/index.js b/x-pack/index.js index 9ab6e2ee322d9..e2d25ce87b26b 100644 --- a/x-pack/index.js +++ b/x-pack/index.js @@ -23,7 +23,6 @@ import { licenseManagement } from './legacy/plugins/license_management'; import { indexManagement } from './legacy/plugins/index_management'; import { indexLifecycleManagement } from './legacy/plugins/index_lifecycle_management'; import { spaces } from './legacy/plugins/spaces'; -import { kueryAutocompleteInitializer } from './legacy/plugins/kuery_autocomplete'; import { canvas } from './legacy/plugins/canvas'; import { infra } from './legacy/plugins/infra'; import { taskManager } from './legacy/plugins/task_manager'; @@ -65,7 +64,6 @@ module.exports = function(kibana) { licenseManagement(kibana), indexManagement(kibana), indexLifecycleManagement(kibana), - kueryAutocompleteInitializer(kibana), infra(kibana), taskManager(kibana), rollup(kibana), diff --git a/x-pack/legacy/plugins/kuery_autocomplete/index.ts b/x-pack/legacy/plugins/kuery_autocomplete/index.ts deleted file mode 100644 index 5f9d74ed799e6..0000000000000 --- a/x-pack/legacy/plugins/kuery_autocomplete/index.ts +++ /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; - * you may not use this file except in compliance with the Elastic License. - */ - -import { resolve } from 'path'; -import { Legacy } from 'kibana'; - -import { LegacyPluginApi, LegacyPluginInitializer } from '../../../../src/legacy/types'; - -export const kueryAutocompleteInitializer: LegacyPluginInitializer = ({ - Plugin, -}: LegacyPluginApi) => - new Plugin({ - id: 'kuery_autocomplete', - publicDir: resolve(__dirname, 'public'), - uiExports: { - hacks: [resolve(__dirname, 'public/legacy')], - }, - init: (server: Legacy.Server) => ({}), - } as Legacy.PluginSpecOptions); diff --git a/x-pack/legacy/plugins/kuery_autocomplete/public/legacy.ts b/x-pack/legacy/plugins/kuery_autocomplete/public/legacy.ts deleted file mode 100644 index 303fe8c557fbd..0000000000000 --- a/x-pack/legacy/plugins/kuery_autocomplete/public/legacy.ts +++ /dev/null @@ -1,27 +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; - * you may not use this file except in compliance with the Elastic License. - */ - -import { PluginInitializerContext } from 'src/core/public'; -import { npSetup, npStart } from 'ui/new_platform'; - -import { plugin } from './index'; -import { - KueryAutocompletePluginSetupDependencies, - KueryAutocompletePluginStartDependencies, -} from './plugin'; - -const pluginsSetup: Readonly = { - data: npSetup.plugins.data, -}; - -const pluginsStart: Readonly = { - data: npStart.plugins.data, -}; - -const pluginInstance = plugin({} as PluginInitializerContext); - -export const setup = pluginInstance.setup(npSetup.core, pluginsSetup); -export const start = pluginInstance.start(npStart.core, pluginsStart); diff --git a/x-pack/legacy/plugins/kuery_autocomplete/public/plugin.ts b/x-pack/legacy/plugins/kuery_autocomplete/public/plugin.ts deleted file mode 100644 index 81737c4636532..0000000000000 --- a/x-pack/legacy/plugins/kuery_autocomplete/public/plugin.ts +++ /dev/null @@ -1,41 +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; - * you may not use this file except in compliance with the Elastic License. - */ - -import { PluginInitializerContext, CoreSetup, CoreStart, Plugin } from 'src/core/public'; -import { Plugin as DataPublicPlugin } from '../../../../../src/plugins/data/public'; -import { setAutocompleteService } from './services'; -import { setupKqlQuerySuggestionProvider } from './kql_query_suggestion'; - -/** @internal */ -export interface KueryAutocompletePluginSetupDependencies { - data: ReturnType; -} - -/** @internal */ -export interface KueryAutocompletePluginStartDependencies { - data: ReturnType; -} - -const KUERY_LANGUAGE_NAME = 'kuery'; - -/** @internal */ -export class KueryAutocompletePlugin implements Plugin, void> { - initializerContext: PluginInitializerContext; - - constructor(initializerContext: PluginInitializerContext) { - this.initializerContext = initializerContext; - } - - public async setup(core: CoreSetup, plugins: KueryAutocompletePluginSetupDependencies) { - const kueryProvider = setupKqlQuerySuggestionProvider(core); - - plugins.data.autocomplete.addQuerySuggestionProvider(KUERY_LANGUAGE_NAME, kueryProvider); - } - - public start(core: CoreStart, plugins: KueryAutocompletePluginStartDependencies) { - setAutocompleteService(plugins.data.autocomplete); - } -} diff --git a/x-pack/plugins/data_enhanced/kibana.json b/x-pack/plugins/data_enhanced/kibana.json new file mode 100644 index 0000000000000..4dbfe958eff68 --- /dev/null +++ b/x-pack/plugins/data_enhanced/kibana.json @@ -0,0 +1,13 @@ +{ + "id": "data_enhanced", + "version": "8.0.0", + "kibanaVersion": "kibana", + "configPath": [ + "xpack" + ], + "requiredPlugins": [ + "data" + ], + "server": false, + "ui": true +} diff --git a/x-pack/plugins/data_enhanced/public/autocomplete/index.ts b/x-pack/plugins/data_enhanced/public/autocomplete/index.ts new file mode 100644 index 0000000000000..59670a89d2caf --- /dev/null +++ b/x-pack/plugins/data_enhanced/public/autocomplete/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; + * you may not use this file except in compliance with the Elastic License. + */ + +export { + setupKqlQuerySuggestionProvider, + KUERY_LANGUAGE_NAME, +} from './providers/kql_query_suggestion'; diff --git a/x-pack/legacy/plugins/kuery_autocomplete/public/kql_query_suggestion/__fixtures__/index_pattern_response.json b/x-pack/plugins/data_enhanced/public/autocomplete/providers/kql_query_suggestion/__fixtures__/index_pattern_response.json similarity index 100% rename from x-pack/legacy/plugins/kuery_autocomplete/public/kql_query_suggestion/__fixtures__/index_pattern_response.json rename to x-pack/plugins/data_enhanced/public/autocomplete/providers/kql_query_suggestion/__fixtures__/index_pattern_response.json diff --git a/x-pack/legacy/plugins/kuery_autocomplete/public/kql_query_suggestion/conjunction.test.ts b/x-pack/plugins/data_enhanced/public/autocomplete/providers/kql_query_suggestion/conjunction.test.ts similarity index 93% rename from x-pack/legacy/plugins/kuery_autocomplete/public/kql_query_suggestion/conjunction.test.ts rename to x-pack/plugins/data_enhanced/public/autocomplete/providers/kql_query_suggestion/conjunction.test.ts index e8aec0deec6d7..d993c3d8ad51d 100644 --- a/x-pack/legacy/plugins/kuery_autocomplete/public/kql_query_suggestion/conjunction.test.ts +++ b/x-pack/plugins/data_enhanced/public/autocomplete/providers/kql_query_suggestion/conjunction.test.ts @@ -5,8 +5,8 @@ */ import { setupGetConjunctionSuggestions } from './conjunction'; -import { autocomplete, esKuery } from '../../../../../../src/plugins/data/public'; -import { coreMock } from '../../../../../../src/core/public/mocks'; +import { autocomplete, esKuery } from '../../../../../../../src/plugins/data/public'; +import { coreMock } from '../../../../../../../src/core/public/mocks'; const mockKueryNode = (kueryNode: Partial) => (kueryNode as unknown) as esKuery.KueryNode; diff --git a/x-pack/legacy/plugins/kuery_autocomplete/public/kql_query_suggestion/conjunction.tsx b/x-pack/plugins/data_enhanced/public/autocomplete/providers/kql_query_suggestion/conjunction.tsx similarity index 69% rename from x-pack/legacy/plugins/kuery_autocomplete/public/kql_query_suggestion/conjunction.tsx rename to x-pack/plugins/data_enhanced/public/autocomplete/providers/kql_query_suggestion/conjunction.tsx index f570586274fdd..fa655562134cc 100644 --- a/x-pack/legacy/plugins/kuery_autocomplete/public/kql_query_suggestion/conjunction.tsx +++ b/x-pack/plugins/data_enhanced/public/autocomplete/providers/kql_query_suggestion/conjunction.tsx @@ -7,21 +7,21 @@ import React from 'react'; import { $Keys } from 'utility-types'; import { FormattedMessage } from '@kbn/i18n/react'; import { KqlQuerySuggestionProvider } from './types'; -import { autocomplete } from '../../../../../../src/plugins/data/public'; +import { autocomplete } from '../../../../../../../src/plugins/data/public'; const bothArgumentsText = ( ); const oneOrMoreArgumentsText = ( ); @@ -29,20 +29,20 @@ const conjunctions: Record = { and: (

{bothArgumentsText}, }} description="Full text: ' Requires both arguments to be true'. See - 'xpack.kueryAutocomplete.andOperatorDescription.bothArgumentsText' for 'both arguments' part." + 'xpack.data.kueryAutocomplete.andOperatorDescription.bothArgumentsText' for 'both arguments' part." />

), or: (

= { ), }} description="Full text: 'Requires one or more arguments to be true'. See - 'xpack.kueryAutocomplete.orOperatorDescription.oneOrMoreArgumentsText' for 'one or more arguments' part." + 'xpack.data.kueryAutocomplete.orOperatorDescription.oneOrMoreArgumentsText' for 'one or more arguments' part." />

), diff --git a/x-pack/legacy/plugins/kuery_autocomplete/public/kql_query_suggestion/field.test.ts b/x-pack/plugins/data_enhanced/public/autocomplete/providers/kql_query_suggestion/field.test.ts similarity index 98% rename from x-pack/legacy/plugins/kuery_autocomplete/public/kql_query_suggestion/field.test.ts rename to x-pack/plugins/data_enhanced/public/autocomplete/providers/kql_query_suggestion/field.test.ts index 2fd5cfd17eb69..d05fd49d266f2 100644 --- a/x-pack/legacy/plugins/kuery_autocomplete/public/kql_query_suggestion/field.test.ts +++ b/x-pack/plugins/data_enhanced/public/autocomplete/providers/kql_query_suggestion/field.test.ts @@ -6,8 +6,8 @@ import indexPatternResponse from './__fixtures__/index_pattern_response.json'; import { setupGetFieldSuggestions } from './field'; -import { isFilterable, autocomplete, esKuery } from '../../../../../../src/plugins/data/public'; -import { coreMock } from '../../../../../../src/core/public/mocks'; +import { isFilterable, autocomplete, esKuery } from '../../../../../../../src/plugins/data/public'; +import { coreMock } from '../../../../../../../src/core/public/mocks'; const mockKueryNode = (kueryNode: Partial) => (kueryNode as unknown) as esKuery.KueryNode; diff --git a/x-pack/legacy/plugins/kuery_autocomplete/public/kql_query_suggestion/field.tsx b/x-pack/plugins/data_enhanced/public/autocomplete/providers/kql_query_suggestion/field.tsx similarity index 94% rename from x-pack/legacy/plugins/kuery_autocomplete/public/kql_query_suggestion/field.tsx rename to x-pack/plugins/data_enhanced/public/autocomplete/providers/kql_query_suggestion/field.tsx index a8af884c24fc3..f04312b925436 100644 --- a/x-pack/legacy/plugins/kuery_autocomplete/public/kql_query_suggestion/field.tsx +++ b/x-pack/plugins/data_enhanced/public/autocomplete/providers/kql_query_suggestion/field.tsx @@ -8,14 +8,18 @@ import { flatten } from 'lodash'; import { FormattedMessage } from '@kbn/i18n/react'; import { escapeKuery } from './lib/escape_kuery'; import { sortPrefixFirst } from './sort_prefix_first'; -import { IFieldType, isFilterable, autocomplete } from '../../../../../../src/plugins/data/public'; +import { + IFieldType, + isFilterable, + autocomplete, +} from '../../../../../../../src/plugins/data/public'; import { KqlQuerySuggestionProvider } from './types'; const getDescription = (field: IFieldType) => { return (

{field.name} }} /> diff --git a/x-pack/legacy/plugins/kuery_autocomplete/public/kql_query_suggestion/index.ts b/x-pack/plugins/data_enhanced/public/autocomplete/providers/kql_query_suggestion/index.ts similarity index 94% rename from x-pack/legacy/plugins/kuery_autocomplete/public/kql_query_suggestion/index.ts rename to x-pack/plugins/data_enhanced/public/autocomplete/providers/kql_query_suggestion/index.ts index 2cc15fe4c9280..6168ab8fc3462 100644 --- a/x-pack/legacy/plugins/kuery_autocomplete/public/kql_query_suggestion/index.ts +++ b/x-pack/plugins/data_enhanced/public/autocomplete/providers/kql_query_suggestion/index.ts @@ -11,13 +11,15 @@ import { setupGetFieldSuggestions } from './field'; import { setupGetValueSuggestions } from './value'; import { setupGetOperatorSuggestions } from './operator'; import { setupGetConjunctionSuggestions } from './conjunction'; -import { esKuery, autocomplete } from '../../../../../../src/plugins/data/public'; +import { esKuery, autocomplete } from '../../../../../../../src/plugins/data/public'; const cursorSymbol = '@kuery-cursor@'; const dedup = (suggestions: autocomplete.QuerySuggestion[]): autocomplete.QuerySuggestion[] => uniq(suggestions, ({ type, text, start, end }) => [type, text, start, end].join('|')); +export const KUERY_LANGUAGE_NAME = 'kuery'; + export const setupKqlQuerySuggestionProvider = ( core: CoreSetup ): autocomplete.QuerySuggestionsGetFn => { diff --git a/x-pack/legacy/plugins/kuery_autocomplete/public/kql_query_suggestion/lib/escape_kuery.test.ts b/x-pack/plugins/data_enhanced/public/autocomplete/providers/kql_query_suggestion/lib/escape_kuery.test.ts similarity index 100% rename from x-pack/legacy/plugins/kuery_autocomplete/public/kql_query_suggestion/lib/escape_kuery.test.ts rename to x-pack/plugins/data_enhanced/public/autocomplete/providers/kql_query_suggestion/lib/escape_kuery.test.ts diff --git a/x-pack/legacy/plugins/kuery_autocomplete/public/kql_query_suggestion/lib/escape_kuery.ts b/x-pack/plugins/data_enhanced/public/autocomplete/providers/kql_query_suggestion/lib/escape_kuery.ts similarity index 100% rename from x-pack/legacy/plugins/kuery_autocomplete/public/kql_query_suggestion/lib/escape_kuery.ts rename to x-pack/plugins/data_enhanced/public/autocomplete/providers/kql_query_suggestion/lib/escape_kuery.ts diff --git a/x-pack/legacy/plugins/kuery_autocomplete/public/kql_query_suggestion/operator.test.ts b/x-pack/plugins/data_enhanced/public/autocomplete/providers/kql_query_suggestion/operator.test.ts similarity index 94% rename from x-pack/legacy/plugins/kuery_autocomplete/public/kql_query_suggestion/operator.test.ts rename to x-pack/plugins/data_enhanced/public/autocomplete/providers/kql_query_suggestion/operator.test.ts index acafc4e169c8f..7e564b96064ef 100644 --- a/x-pack/legacy/plugins/kuery_autocomplete/public/kql_query_suggestion/operator.test.ts +++ b/x-pack/plugins/data_enhanced/public/autocomplete/providers/kql_query_suggestion/operator.test.ts @@ -6,8 +6,8 @@ import indexPatternResponse from './__fixtures__/index_pattern_response.json'; import { setupGetOperatorSuggestions } from './operator'; -import { autocomplete, esKuery } from '../../../../../../src/plugins/data/public'; -import { coreMock } from '../../../../../../src/core/public/mocks'; +import { autocomplete, esKuery } from '../../../../../../../src/plugins/data/public'; +import { coreMock } from '../../../../../../../src/core/public/mocks'; const mockKueryNode = (kueryNode: Partial) => (kueryNode as unknown) as esKuery.KueryNode; diff --git a/x-pack/legacy/plugins/kuery_autocomplete/public/kql_query_suggestion/operator.tsx b/x-pack/plugins/data_enhanced/public/autocomplete/providers/kql_query_suggestion/operator.tsx similarity index 64% rename from x-pack/legacy/plugins/kuery_autocomplete/public/kql_query_suggestion/operator.tsx rename to x-pack/plugins/data_enhanced/public/autocomplete/providers/kql_query_suggestion/operator.tsx index 6e9010c4310fb..af90e7bfe1172 100644 --- a/x-pack/legacy/plugins/kuery_autocomplete/public/kql_query_suggestion/operator.tsx +++ b/x-pack/plugins/data_enhanced/public/autocomplete/providers/kql_query_suggestion/operator.tsx @@ -10,48 +10,48 @@ import { $Keys } from 'utility-types'; import { flatten } from 'lodash'; import { KqlQuerySuggestionProvider } from './types'; -import { autocomplete } from '../../../../../../src/plugins/data/public'; +import { autocomplete } from '../../../../../../../src/plugins/data/public'; const equalsText = ( ); const lessThanOrEqualToText = ( ); const greaterThanOrEqualToText = ( ); const lessThanText = ( ); const greaterThanText = ( ); const existsText = ( ); @@ -59,11 +59,11 @@ const operators = { ':': { description: ( {equalsText} }} description="Full text: 'equals some value'. See - 'xpack.kueryAutocomplete.equalOperatorDescription.equalsText' for 'equals' part." + 'xpack.data.kueryAutocomplete.equalOperatorDescription.equalsText' for 'equals' part." /> ), fieldTypes: ['string', 'number', 'date', 'ip', 'geo_point', 'geo_shape', 'boolean'], @@ -71,7 +71,7 @@ const operators = { '<=': { description: ( ), fieldTypes: ['number', 'date', 'ip'], @@ -87,7 +87,7 @@ const operators = { '>=': { description: ( ), fieldTypes: ['number', 'date', 'ip'], @@ -103,11 +103,11 @@ const operators = { '<': { description: ( {lessThanText} }} description="Full text: 'is less than some value'. See - 'xpack.kueryAutocomplete.lessThanOperatorDescription.lessThanText' for 'less than' part." + 'xpack.data.kueryAutocomplete.lessThanOperatorDescription.lessThanText' for 'less than' part." /> ), fieldTypes: ['number', 'date', 'ip'], @@ -115,13 +115,13 @@ const operators = { '>': { description: ( {greaterThanText}, }} description="Full text: 'is greater than some value'. See - 'xpack.kueryAutocomplete.greaterThanOperatorDescription.greaterThanText' for 'greater than' part." + 'xpack.data.kueryAutocomplete.greaterThanOperatorDescription.greaterThanText' for 'greater than' part." /> ), fieldTypes: ['number', 'date', 'ip'], @@ -129,11 +129,11 @@ const operators = { ': *': { description: ( {existsText} }} description="Full text: 'exists in any form'. See - 'xpack.kueryAutocomplete.existOperatorDescription.existsText' for 'exists' part." + 'xpack.data.kueryAutocomplete.existOperatorDescription.existsText' for 'exists' part." /> ), fieldTypes: undefined, diff --git a/x-pack/legacy/plugins/kuery_autocomplete/public/kql_query_suggestion/sort_prefix_first.test.ts b/x-pack/plugins/data_enhanced/public/autocomplete/providers/kql_query_suggestion/sort_prefix_first.test.ts similarity index 100% rename from x-pack/legacy/plugins/kuery_autocomplete/public/kql_query_suggestion/sort_prefix_first.test.ts rename to x-pack/plugins/data_enhanced/public/autocomplete/providers/kql_query_suggestion/sort_prefix_first.test.ts diff --git a/x-pack/legacy/plugins/kuery_autocomplete/public/kql_query_suggestion/sort_prefix_first.ts b/x-pack/plugins/data_enhanced/public/autocomplete/providers/kql_query_suggestion/sort_prefix_first.ts similarity index 100% rename from x-pack/legacy/plugins/kuery_autocomplete/public/kql_query_suggestion/sort_prefix_first.ts rename to x-pack/plugins/data_enhanced/public/autocomplete/providers/kql_query_suggestion/sort_prefix_first.ts diff --git a/x-pack/legacy/plugins/kuery_autocomplete/public/kql_query_suggestion/types.ts b/x-pack/plugins/data_enhanced/public/autocomplete/providers/kql_query_suggestion/types.ts similarity index 85% rename from x-pack/legacy/plugins/kuery_autocomplete/public/kql_query_suggestion/types.ts rename to x-pack/plugins/data_enhanced/public/autocomplete/providers/kql_query_suggestion/types.ts index c51b75e001b9f..8e3146ab09848 100644 --- a/x-pack/legacy/plugins/kuery_autocomplete/public/kql_query_suggestion/types.ts +++ b/x-pack/plugins/data_enhanced/public/autocomplete/providers/kql_query_suggestion/types.ts @@ -5,7 +5,7 @@ */ import { CoreSetup } from 'kibana/public'; -import { esKuery, autocomplete } from '../../../../../../src/plugins/data/public'; +import { esKuery, autocomplete } from '../../../../../../../src/plugins/data/public'; export type KqlQuerySuggestionProvider = ( core: CoreSetup diff --git a/x-pack/legacy/plugins/kuery_autocomplete/public/kql_query_suggestion/value.test.ts b/x-pack/plugins/data_enhanced/public/autocomplete/providers/kql_query_suggestion/value.test.ts similarity index 96% rename from x-pack/legacy/plugins/kuery_autocomplete/public/kql_query_suggestion/value.test.ts rename to x-pack/plugins/data_enhanced/public/autocomplete/providers/kql_query_suggestion/value.test.ts index 5ffe30c877868..14eeabda97d1a 100644 --- a/x-pack/legacy/plugins/kuery_autocomplete/public/kql_query_suggestion/value.test.ts +++ b/x-pack/plugins/data_enhanced/public/autocomplete/providers/kql_query_suggestion/value.test.ts @@ -5,9 +5,9 @@ */ import { setupGetValueSuggestions } from './value'; import indexPatternResponse from './__fixtures__/index_pattern_response.json'; -import { coreMock } from '../../../../../../src/core/public/mocks'; -import { autocomplete, esKuery } from '../../../../../../src/plugins/data/public'; -import { setAutocompleteService } from '../services'; +import { coreMock } from '../../../../../../../src/core/public/mocks'; +import { autocomplete, esKuery } from '../../../../../../../src/plugins/data/public'; +import { setAutocompleteService } from '../../../services'; const mockKueryNode = (kueryNode: Partial) => (kueryNode as unknown) as esKuery.KueryNode; diff --git a/x-pack/legacy/plugins/kuery_autocomplete/public/kql_query_suggestion/value.ts b/x-pack/plugins/data_enhanced/public/autocomplete/providers/kql_query_suggestion/value.ts similarity index 93% rename from x-pack/legacy/plugins/kuery_autocomplete/public/kql_query_suggestion/value.ts rename to x-pack/plugins/data_enhanced/public/autocomplete/providers/kql_query_suggestion/value.ts index 242b9ccba3508..83b8024d8314d 100644 --- a/x-pack/legacy/plugins/kuery_autocomplete/public/kql_query_suggestion/value.ts +++ b/x-pack/plugins/data_enhanced/public/autocomplete/providers/kql_query_suggestion/value.ts @@ -7,8 +7,8 @@ import { flatten } from 'lodash'; import { escapeQuotes } from './lib/escape_kuery'; import { KqlQuerySuggestionProvider } from './types'; -import { getAutocompleteService } from '../services'; -import { autocomplete } from '../../../../../../src/plugins/data/public'; +import { getAutocompleteService } from '../../../services'; +import { autocomplete } from '../../../../../../../src/plugins/data/public'; const wrapAsSuggestions = (start: number, end: number, query: string, values: string[]) => values diff --git a/x-pack/legacy/plugins/kuery_autocomplete/public/index.ts b/x-pack/plugins/data_enhanced/public/index.ts similarity index 50% rename from x-pack/legacy/plugins/kuery_autocomplete/public/index.ts rename to x-pack/plugins/data_enhanced/public/index.ts index c2241f424511f..93b6b7a957182 100644 --- a/x-pack/legacy/plugins/kuery_autocomplete/public/index.ts +++ b/x-pack/plugins/data_enhanced/public/index.ts @@ -4,9 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -import { PluginInitializerContext } from 'src/core/public'; -import { KueryAutocompletePlugin as Plugin } from './plugin'; +import { DataEnhancedPlugin, DataEnhancedSetup, DataEnhancedStart } from './plugin'; -export function plugin(initializerContext: PluginInitializerContext) { - return new Plugin(initializerContext); -} +export const plugin = () => new DataEnhancedPlugin(); + +export { DataEnhancedSetup, DataEnhancedStart }; diff --git a/x-pack/plugins/data_enhanced/public/plugin.ts b/x-pack/plugins/data_enhanced/public/plugin.ts new file mode 100644 index 0000000000000..14b5382bc85aa --- /dev/null +++ b/x-pack/plugins/data_enhanced/public/plugin.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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { CoreSetup, CoreStart, Plugin } from 'src/core/public'; +import { DataPublicPluginSetup, DataPublicPluginStart } from '../../../../src/plugins/data/public'; +import { setAutocompleteService } from './services'; +import { setupKqlQuerySuggestionProvider, KUERY_LANGUAGE_NAME } from './autocomplete'; + +export interface DataEnhancedSetupDependencies { + data: DataPublicPluginSetup; +} +export interface DataEnhancedStartDependencies { + data: DataPublicPluginStart; +} + +export type DataEnhancedSetup = ReturnType; +export type DataEnhancedStart = ReturnType; + +export class DataEnhancedPlugin implements Plugin { + public setup(core: CoreSetup, plugins: DataEnhancedSetupDependencies) { + plugins.data.autocomplete.addQuerySuggestionProvider( + KUERY_LANGUAGE_NAME, + setupKqlQuerySuggestionProvider(core) + ); + } + + public start(core: CoreStart, plugins: DataEnhancedStartDependencies) { + setAutocompleteService(plugins.data.autocomplete); + } +} diff --git a/x-pack/legacy/plugins/kuery_autocomplete/public/services.ts b/x-pack/plugins/data_enhanced/public/services.ts similarity index 70% rename from x-pack/legacy/plugins/kuery_autocomplete/public/services.ts rename to x-pack/plugins/data_enhanced/public/services.ts index 1ec48e597f636..847b4c783fd7f 100644 --- a/x-pack/legacy/plugins/kuery_autocomplete/public/services.ts +++ b/x-pack/plugins/data_enhanced/public/services.ts @@ -4,8 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -import { createGetterSetter } from '../../../../../src/plugins/kibana_utils/public'; -import { DataPublicPluginStart } from '../../../../../src/plugins/data/public'; +import { createGetterSetter } from '../../../../src/plugins/kibana_utils/public'; +import { DataPublicPluginStart } from '../../../../src/plugins/data/public'; export const [getAutocompleteService, setAutocompleteService] = createGetterSetter< DataPublicPluginStart['autocomplete'] diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 74fbbdd5f967b..abf56cd2d05b6 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -6753,23 +6753,23 @@ "xpack.infra.waffle.unableToSelectMetricErrorTitle": "メトリックのオプションまたは値を選択できません", "xpack.infra.waffleTime.autoRefreshButtonLabel": "自動更新", "xpack.infra.waffleTime.stopRefreshingButtonLabel": "更新中止", - "xpack.kueryAutocomplete.andOperatorDescription": "{bothArguments}がtrueであることを条件とする", - "xpack.kueryAutocomplete.andOperatorDescription.bothArgumentsText": "両方の引数", - "xpack.kueryAutocomplete.equalOperatorDescription": "一部の値に{equals}", - "xpack.kueryAutocomplete.equalOperatorDescription.equalsText": "一致する", - "xpack.kueryAutocomplete.existOperatorDescription": "いずれかの形式中に{exists}", - "xpack.kueryAutocomplete.existOperatorDescription.existsText": "存在する", - "xpack.kueryAutocomplete.filterResultsDescription": "{fieldName}を含む結果をフィルタリング", - "xpack.kueryAutocomplete.greaterThanOperatorDescription": "が一部の値{greaterThan}", - "xpack.kueryAutocomplete.greaterThanOperatorDescription.greaterThanText": "より大きい", - "xpack.kueryAutocomplete.greaterThanOrEqualOperatorDescription": "が一部の値{greaterThanOrEqualTo}", - "xpack.kueryAutocomplete.greaterThanOrEqualOperatorDescription.greaterThanOrEqualToText": "よりも大きいまたは等しい", - "xpack.kueryAutocomplete.lessThanOperatorDescription": "が一部の値{lessThan}", - "xpack.kueryAutocomplete.lessThanOperatorDescription.lessThanText": "より小さい", - "xpack.kueryAutocomplete.lessThanOrEqualOperatorDescription": "が一部の値{lessThanOrEqualTo}", - "xpack.kueryAutocomplete.lessThanOrEqualOperatorDescription.lessThanOrEqualToText": "より小さいまたは等しい", - "xpack.kueryAutocomplete.orOperatorDescription": "{oneOrMoreArguments}がtrueであることを条件とする", - "xpack.kueryAutocomplete.orOperatorDescription.oneOrMoreArgumentsText": "1つ以上の引数", + "xpack.data.kueryAutocomplete.andOperatorDescription": "{bothArguments}がtrueであることを条件とする", + "xpack.data.kueryAutocomplete.andOperatorDescription.bothArgumentsText": "両方の引数", + "xpack.data.kueryAutocomplete.equalOperatorDescription": "一部の値に{equals}", + "xpack.data.kueryAutocomplete.equalOperatorDescription.equalsText": "一致する", + "xpack.data.kueryAutocomplete.existOperatorDescription": "いずれかの形式中に{exists}", + "xpack.data.kueryAutocomplete.existOperatorDescription.existsText": "存在する", + "xpack.data.kueryAutocomplete.filterResultsDescription": "{fieldName}を含む結果をフィルタリング", + "xpack.data.kueryAutocomplete.greaterThanOperatorDescription": "が一部の値{greaterThan}", + "xpack.data.kueryAutocomplete.greaterThanOperatorDescription.greaterThanText": "より大きい", + "xpack.data.kueryAutocomplete.greaterThanOrEqualOperatorDescription": "が一部の値{greaterThanOrEqualTo}", + "xpack.data.kueryAutocomplete.greaterThanOrEqualOperatorDescription.greaterThanOrEqualToText": "よりも大きいまたは等しい", + "xpack.data.kueryAutocomplete.lessThanOperatorDescription": "が一部の値{lessThan}", + "xpack.data.kueryAutocomplete.lessThanOperatorDescription.lessThanText": "より小さい", + "xpack.data.kueryAutocomplete.lessThanOrEqualOperatorDescription": "が一部の値{lessThanOrEqualTo}", + "xpack.data.kueryAutocomplete.lessThanOrEqualOperatorDescription.lessThanOrEqualToText": "より小さいまたは等しい", + "xpack.data.kueryAutocomplete.orOperatorDescription": "{oneOrMoreArguments}がtrueであることを条件とする", + "xpack.data.kueryAutocomplete.orOperatorDescription.oneOrMoreArgumentsText": "1つ以上の引数", "xpack.lens.app.docLoadingError": "保存されたドキュメントの保存中にエラーが発生", "xpack.lens.app.docSavingError": "ドキュメントの保存中にエラーが発生", "xpack.lens.app.indexPatternLoadingError": "インデックスパターンの読み込み中にエラーが発生", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 97c4ea7d9f5a9..b97982b5c99da 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -6752,23 +6752,23 @@ "xpack.infra.waffle.unableToSelectMetricErrorTitle": "无法选择指标选项或指标值。", "xpack.infra.waffleTime.autoRefreshButtonLabel": "自动刷新", "xpack.infra.waffleTime.stopRefreshingButtonLabel": "停止刷新", - "xpack.kueryAutocomplete.andOperatorDescription": "需要{bothArguments}为真", - "xpack.kueryAutocomplete.andOperatorDescription.bothArgumentsText": "两个参数都", - "xpack.kueryAutocomplete.equalOperatorDescription": "{equals}某一值", - "xpack.kueryAutocomplete.equalOperatorDescription.equalsText": "等于", - "xpack.kueryAutocomplete.existOperatorDescription": "以任意形式{exists}", - "xpack.kueryAutocomplete.existOperatorDescription.existsText": "存在", - "xpack.kueryAutocomplete.filterResultsDescription": "筛选包含 {fieldName} 的结果", - "xpack.kueryAutocomplete.greaterThanOperatorDescription": "{greaterThan}某一值", - "xpack.kueryAutocomplete.greaterThanOperatorDescription.greaterThanText": "大于", - "xpack.kueryAutocomplete.greaterThanOrEqualOperatorDescription": "{greaterThanOrEqualTo}某一值", - "xpack.kueryAutocomplete.greaterThanOrEqualOperatorDescription.greaterThanOrEqualToText": "大于或等于", - "xpack.kueryAutocomplete.lessThanOperatorDescription": "{lessThan}某一值", - "xpack.kueryAutocomplete.lessThanOperatorDescription.lessThanText": "小于", - "xpack.kueryAutocomplete.lessThanOrEqualOperatorDescription": "{lessThanOrEqualTo}某一值", - "xpack.kueryAutocomplete.lessThanOrEqualOperatorDescription.lessThanOrEqualToText": "小于或等于", - "xpack.kueryAutocomplete.orOperatorDescription": "需要{oneOrMoreArguments}为真", - "xpack.kueryAutocomplete.orOperatorDescription.oneOrMoreArgumentsText": "一个或多个参数", + "xpack.data.kueryAutocomplete.andOperatorDescription": "需要{bothArguments}为真", + "xpack.data.kueryAutocomplete.andOperatorDescription.bothArgumentsText": "两个参数都", + "xpack.data.kueryAutocomplete.equalOperatorDescription": "{equals}某一值", + "xpack.data.kueryAutocomplete.equalOperatorDescription.equalsText": "等于", + "xpack.data.kueryAutocomplete.existOperatorDescription": "以任意形式{exists}", + "xpack.data.kueryAutocomplete.existOperatorDescription.existsText": "存在", + "xpack.data.kueryAutocomplete.filterResultsDescription": "筛选包含 {fieldName} 的结果", + "xpack.data.kueryAutocomplete.greaterThanOperatorDescription": "{greaterThan}某一值", + "xpack.data.kueryAutocomplete.greaterThanOperatorDescription.greaterThanText": "大于", + "xpack.data.kueryAutocomplete.greaterThanOrEqualOperatorDescription": "{greaterThanOrEqualTo}某一值", + "xpack.data.kueryAutocomplete.greaterThanOrEqualOperatorDescription.greaterThanOrEqualToText": "大于或等于", + "xpack.data.kueryAutocomplete.lessThanOperatorDescription": "{lessThan}某一值", + "xpack.data.kueryAutocomplete.lessThanOperatorDescription.lessThanText": "小于", + "xpack.data.kueryAutocomplete.lessThanOrEqualOperatorDescription": "{lessThanOrEqualTo}某一值", + "xpack.data.kueryAutocomplete.lessThanOrEqualOperatorDescription.lessThanOrEqualToText": "小于或等于", + "xpack.data.kueryAutocomplete.orOperatorDescription": "需要{oneOrMoreArguments}为真", + "xpack.data.kueryAutocomplete.orOperatorDescription.oneOrMoreArgumentsText": "一个或多个参数", "xpack.lens.app.docLoadingError": "加载已保存文档时出错", "xpack.lens.app.docSavingError": "保存文档时出错", "xpack.lens.app.indexPatternLoadingError": "加载索引模式时出错", From bdb08aebb2c34a1ae7c3b25ffd75e6fbacd659d2 Mon Sep 17 00:00:00 2001 From: Aleh Zasypkin Date: Tue, 4 Feb 2020 17:18:21 +0100 Subject: [PATCH 03/86] Do not treat HTTP 500 error as possible reason for the expired/missing tokens. (#52631) --- .../authentication/providers/kerberos.test.ts | 38 ---------- .../authentication/providers/saml.test.ts | 76 ------------------- .../authentication/providers/token.test.ts | 30 -------- .../server/authentication/tokens.test.ts | 4 - .../security/server/authentication/tokens.ts | 15 +--- 5 files changed, 2 insertions(+), 161 deletions(-) diff --git a/x-pack/plugins/security/server/authentication/providers/kerberos.test.ts b/x-pack/plugins/security/server/authentication/providers/kerberos.test.ts index 27105793fc966..e609afb6ae3f3 100644 --- a/x-pack/plugins/security/server/authentication/providers/kerberos.test.ts +++ b/x-pack/plugins/security/server/authentication/providers/kerberos.test.ts @@ -419,44 +419,6 @@ describe('KerberosAuthenticationProvider', () => { expect(authenticationResult.authResponseHeaders).toEqual({ 'WWW-Authenticate': 'Negotiate' }); }); - it('fails with `Negotiate` challenge if both access and refresh token documents are missing and backend supports Kerberos.', async () => { - const request = httpServerMock.createKibanaRequest({ headers: {} }); - const tokenPair = { accessToken: 'missing-token', refreshToken: 'missing-refresh-token' }; - - mockScopedClusterClient( - mockOptions.client, - sinon.match({ headers: { authorization: `Bearer ${tokenPair.accessToken}` } }) - ) - .callAsCurrentUser.withArgs('shield.authenticate') - .rejects({ - statusCode: 500, - body: { error: { reason: 'token document is missing and must be present' } }, - }); - - mockScopedClusterClient( - mockOptions.client, - sinon.match({ - headers: { authorization: `Negotiate ${Buffer.from('__fake__').toString('base64')}` }, - }) - ) - .callAsCurrentUser.withArgs('shield.authenticate') - .rejects( - ElasticsearchErrorHelpers.decorateNotAuthorizedError( - new (errors.AuthenticationException as any)('Unauthorized', { - body: { error: { header: { 'WWW-Authenticate': 'Negotiate' } } }, - }) - ) - ); - - mockOptions.tokens.refresh.withArgs(tokenPair.refreshToken).resolves(null); - - const authenticationResult = await provider.authenticate(request, tokenPair); - - expect(authenticationResult.failed()).toBe(true); - expect(authenticationResult.error).toHaveProperty('output.statusCode', 401); - expect(authenticationResult.authResponseHeaders).toEqual({ 'WWW-Authenticate': 'Negotiate' }); - }); - it('succeeds if `authorization` contains a valid token.', async () => { const user = mockAuthenticatedUser(); const request = httpServerMock.createKibanaRequest({ diff --git a/x-pack/plugins/security/server/authentication/providers/saml.test.ts b/x-pack/plugins/security/server/authentication/providers/saml.test.ts index 27702f70865ea..a5d1010a1bec8 100644 --- a/x-pack/plugins/security/server/authentication/providers/saml.test.ts +++ b/x-pack/plugins/security/server/authentication/providers/saml.test.ts @@ -758,82 +758,6 @@ describe('SAMLAuthenticationProvider', () => { ); }); - it('re-capture URL for non-AJAX requests if access token document is missing.', async () => { - const request = httpServerMock.createKibanaRequest({ path: '/s/foo/some-path' }); - const state = { - username: 'user', - accessToken: 'expired-token', - refreshToken: 'expired-refresh-token', - }; - - mockScopedClusterClient( - mockOptions.client, - sinon.match({ headers: { authorization: `Bearer ${state.accessToken}` } }) - ) - .callAsCurrentUser.withArgs('shield.authenticate') - .rejects({ - statusCode: 500, - body: { error: { reason: 'token document is missing and must be present' } }, - }); - - mockOptions.tokens.refresh.withArgs(state.refreshToken).resolves(null); - - const authenticationResult = await provider.authenticate(request, state); - - sinon.assert.notCalled(mockOptions.client.callAsInternalUser); - - expect(authenticationResult.redirected()).toBe(true); - expect(authenticationResult.redirectURL).toBe( - '/mock-server-basepath/api/security/saml/capture-url-fragment' - ); - expect(authenticationResult.state).toEqual({ redirectURL: '/base-path/s/foo/some-path' }); - }); - - it('initiates SAML handshake for non-AJAX requests if access token document is missing and request path is too large.', async () => { - const request = httpServerMock.createKibanaRequest({ - path: `/s/foo/${'some-path'.repeat(10)}`, - }); - const state = { - username: 'user', - accessToken: 'expired-token', - refreshToken: 'expired-refresh-token', - }; - - mockOptions.client.callAsInternalUser.withArgs('shield.samlPrepare').resolves({ - id: 'some-request-id', - redirect: 'https://idp-host/path/login?SAMLRequest=some%20request%20', - }); - - mockScopedClusterClient( - mockOptions.client, - sinon.match({ headers: { authorization: `Bearer ${state.accessToken}` } }) - ) - .callAsCurrentUser.withArgs('shield.authenticate') - .rejects({ - statusCode: 500, - body: { error: { reason: 'token document is missing and must be present' } }, - }); - - mockOptions.tokens.refresh.withArgs(state.refreshToken).resolves(null); - - const authenticationResult = await provider.authenticate(request, state); - - sinon.assert.calledWithExactly(mockOptions.client.callAsInternalUser, 'shield.samlPrepare', { - body: { realm: 'test-realm' }, - }); - - expect(mockOptions.logger.warn).toHaveBeenCalledTimes(1); - expect(mockOptions.logger.warn).toHaveBeenCalledWith( - 'Max URL path size should not exceed 100b but it was 107b. URL is not captured.' - ); - - expect(authenticationResult.redirected()).toBe(true); - expect(authenticationResult.redirectURL).toBe( - 'https://idp-host/path/login?SAMLRequest=some%20request%20' - ); - expect(authenticationResult.state).toEqual({ requestId: 'some-request-id', redirectURL: '' }); - }); - it('re-capture URL for non-AJAX requests if refresh token is expired.', async () => { const request = httpServerMock.createKibanaRequest({ path: '/s/foo/some-path' }); const state = { diff --git a/x-pack/plugins/security/server/authentication/providers/token.test.ts b/x-pack/plugins/security/server/authentication/providers/token.test.ts index a6850dcdf8321..3d377140cb42e 100644 --- a/x-pack/plugins/security/server/authentication/providers/token.test.ts +++ b/x-pack/plugins/security/server/authentication/providers/token.test.ts @@ -300,36 +300,6 @@ describe('TokenAuthenticationProvider', () => { expect(authenticationResult.error).toEqual(refreshError); }); - it('redirects non-AJAX requests to /login and clears session if token document is missing', async () => { - const request = httpServerMock.createKibanaRequest({ path: '/some-path' }); - const tokenPair = { accessToken: 'foo', refreshToken: 'bar' }; - - mockScopedClusterClient( - mockOptions.client, - sinon.match({ headers: { authorization: `Bearer ${tokenPair.accessToken}` } }) - ) - .callAsCurrentUser.withArgs('shield.authenticate') - .rejects({ - statusCode: 500, - body: { error: { reason: 'token document is missing and must be present' } }, - }); - - mockOptions.tokens.refresh.withArgs(tokenPair.refreshToken).resolves(null); - - const authenticationResult = await provider.authenticate(request, tokenPair); - - sinon.assert.calledOnce(mockOptions.tokens.refresh); - - expect(request.headers).not.toHaveProperty('authorization'); - expect(authenticationResult.redirected()).toBe(true); - expect(authenticationResult.redirectURL).toBe( - '/base-path/login?next=%2Fbase-path%2Fsome-path' - ); - expect(authenticationResult.user).toBeUndefined(); - expect(authenticationResult.state).toEqual(null); - expect(authenticationResult.error).toBeUndefined(); - }); - it('redirects non-AJAX requests to /login and clears session if token cannot be refreshed', async () => { const request = httpServerMock.createKibanaRequest({ path: '/some-path' }); const tokenPair = { accessToken: 'foo', refreshToken: 'bar' }; diff --git a/x-pack/plugins/security/server/authentication/tokens.test.ts b/x-pack/plugins/security/server/authentication/tokens.test.ts index 8d15ea69ae392..82f29310c04c0 100644 --- a/x-pack/plugins/security/server/authentication/tokens.test.ts +++ b/x-pack/plugins/security/server/authentication/tokens.test.ts @@ -41,10 +41,6 @@ describe('Tokens', () => { { statusCode: 401 }, ElasticsearchErrorHelpers.decorateNotAuthorizedError(new Error()), new errors.AuthenticationException(), - { - statusCode: 500, - body: { error: { reason: 'token document is missing and must be present' } }, - }, ]; for (const error of expirationErrors) { expect(Tokens.isAccessTokenExpiredError(error)).toBe(true); diff --git a/x-pack/plugins/security/server/authentication/tokens.ts b/x-pack/plugins/security/server/authentication/tokens.ts index 2906f28912d5b..ea7b5d5a9ff38 100644 --- a/x-pack/plugins/security/server/authentication/tokens.ts +++ b/x-pack/plugins/security/server/authentication/tokens.ts @@ -150,21 +150,10 @@ export class Tokens { /** * Tries to determine whether specified error that occurred while trying to authenticate request * using access token happened because access token is expired. We treat all `401 Unauthorized` - * as such. Another use case that we should temporarily support (until elastic/elasticsearch#38866 - * is fixed) is when token document has been removed and ES responds with `500 Internal Server Error`. + * as such. * @param err Error returned from Elasticsearch. */ public static isAccessTokenExpiredError(err?: any) { - const errorStatusCode = getErrorStatusCode(err); - return ( - errorStatusCode === 401 || - (errorStatusCode === 500 && - !!( - err && - err.body && - err.body.error && - err.body.error.reason === 'token document is missing and must be present' - )) - ); + return getErrorStatusCode(err) === 401; } } From 9a53aeadc10b4a692ca85e0a1f2e88ac1b34d9cb Mon Sep 17 00:00:00 2001 From: Oliver Gupte Date: Tue, 4 Feb 2020 08:35:46 -0800 Subject: [PATCH 04/86] Closes #56575. Removes red border. (#56576) Co-authored-by: Elastic Machine --- .../apm/public/components/app/ServiceMap/Popover/index.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/x-pack/legacy/plugins/apm/public/components/app/ServiceMap/Popover/index.tsx b/x-pack/legacy/plugins/apm/public/components/app/ServiceMap/Popover/index.tsx index e8e37cfdfb1f0..8e49a02909aab 100644 --- a/x-pack/legacy/plugins/apm/public/components/app/ServiceMap/Popover/index.tsx +++ b/x-pack/legacy/plugins/apm/public/components/app/ServiceMap/Popover/index.tsx @@ -38,8 +38,7 @@ export function Popover({ focusedServiceName }: PopoverProps) { background: 'transparent', height: renderedHeight, position: 'absolute', - width: renderedWidth, - border: '3px dotted red' + width: renderedWidth }; const trigger =

; const zoom = cy?.zoom() ?? 1; From 4c8049f979374ea47a4d849f76722d4502ddc175 Mon Sep 17 00:00:00 2001 From: Aaron Caldwell Date: Tue, 4 Feb 2020 09:52:57 -0700 Subject: [PATCH 05/86] [Maps] Set filterByMapBounds to default constant if no arg passed (#55068) * Set filterByMapBounds to default constant if no arg passed * toggle accidentally refers to props instead of state for filterByBounds. update to state * Review feedback. Remove extra filterByMapBounds Co-authored-by: Elastic Machine --- .../layers/sources/es_search_source/create_source_editor.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/legacy/plugins/maps/public/layers/sources/es_search_source/create_source_editor.js b/x-pack/legacy/plugins/maps/public/layers/sources/es_search_source/create_source_editor.js index ad55a279f9cd7..da6248099c9c1 100644 --- a/x-pack/legacy/plugins/maps/public/layers/sources/es_search_source/create_source_editor.js +++ b/x-pack/legacy/plugins/maps/public/layers/sources/es_search_source/create_source_editor.js @@ -227,7 +227,7 @@ export class CreateSourceEditor extends Component { label={i18n.translate('xpack.maps.source.esSearch.extentFilterLabel', { defaultMessage: `Dynamically filter for data in the visible map area`, })} - checked={this.props.filterByMapBounds} + checked={this.state.filterByMapBounds} onChange={this.onFilterByMapBoundsChange} /> From 22e66a1484a258c4150ca23c2b44305a89d80f0e Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Tue, 4 Feb 2020 18:15:48 +0100 Subject: [PATCH 06/86] Rollup TSVB integration: Add test and fix warning text (#56639) --- .../public/components/index_pattern.js | 2 + .../public/components/yes_no.js | 4 +- .../page_objects/visual_builder_page.ts | 13 +++ .../components/rollup_prompt/rollup_prompt.js | 2 +- .../test/functional/apps/rollup_job/index.js | 1 + .../test/functional/apps/rollup_job/tsvb.js | 105 ++++++++++++++++++ 6 files changed, 125 insertions(+), 2 deletions(-) create mode 100644 x-pack/test/functional/apps/rollup_job/tsvb.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/index_pattern.js b/src/legacy/core_plugins/vis_type_timeseries/public/components/index_pattern.js index de8469adfb8a7..f6530eb22332a 100644 --- a/src/legacy/core_plugins/vis_type_timeseries/public/components/index_pattern.js +++ b/src/legacy/core_plugins/vis_type_timeseries/public/components/index_pattern.js @@ -206,6 +206,7 @@ export const IndexPattern = ({ fields, prefix, onChange, disabled, model: _model })} > { const { name } = props; return () => { @@ -38,6 +38,7 @@ export function YesNo(props) {
{ await comboBox.clearInputField('metricsIndexPatternFieldsSelect'); diff --git a/x-pack/legacy/plugins/rollup/public/index_pattern_creation/components/rollup_prompt/rollup_prompt.js b/x-pack/legacy/plugins/rollup/public/index_pattern_creation/components/rollup_prompt/rollup_prompt.js index 7a944c5e9a5c0..42c950f0b0d74 100644 --- a/x-pack/legacy/plugins/rollup/public/index_pattern_creation/components/rollup_prompt/rollup_prompt.js +++ b/x-pack/legacy/plugins/rollup/public/index_pattern_creation/components/rollup_prompt/rollup_prompt.js @@ -13,7 +13,7 @@ export const RollupPrompt = () => (

Kibana's support for rollup index patterns is in beta. You might encounter issues using these patterns in saved searches, visualizations, and dashboards. They are not supported in - advanced features, such as TSVB, Timelion, and Machine Learning. + some advanced features, such as Timelion, and Machine Learning.

You can match a rollup index pattern against one rollup index and zero or more regular diff --git a/x-pack/test/functional/apps/rollup_job/index.js b/x-pack/test/functional/apps/rollup_job/index.js index 146cc4e8dbdf0..055b239058eac 100644 --- a/x-pack/test/functional/apps/rollup_job/index.js +++ b/x-pack/test/functional/apps/rollup_job/index.js @@ -10,5 +10,6 @@ export default function({ loadTestFile }) { loadTestFile(require.resolve('./rollup_jobs')); loadTestFile(require.resolve('./hybrid_index_pattern')); + loadTestFile(require.resolve('./tsvb')); }); } diff --git a/x-pack/test/functional/apps/rollup_job/tsvb.js b/x-pack/test/functional/apps/rollup_job/tsvb.js new file mode 100644 index 0000000000000..f3782c4c91644 --- /dev/null +++ b/x-pack/test/functional/apps/rollup_job/tsvb.js @@ -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; + * you may not use this file except in compliance with the Elastic License. + */ + +import datemath from '@elastic/datemath'; +import expect from '@kbn/expect'; +import mockRolledUpData from './hybrid_index_helper'; + +export default function({ getService, getPageObjects }) { + const es = getService('legacyEs'); + const esArchiver = getService('esArchiver'); + const retry = getService('retry'); + const testSubjects = getService('testSubjects'); + const PageObjects = getPageObjects([ + 'common', + 'settings', + 'visualize', + 'visualBuilder', + 'timePicker', + ]); + + describe('tsvb integration', function() { + //Since rollups can only be created once with the same name (even if you delete it), + //we add the Date.now() to avoid name collision if you run the tests locally back to back. + const rollupJobName = `tsvb-test-rollup-job-${Date.now()}`; + const rollupSourceIndexName = 'rollup-source-data'; + const rollupTargetIndexName = `rollup-target-data`; + const now = new Date(); + const pastDates = [ + datemath.parse('now-1m', { forceNow: now }), + datemath.parse('now-2m', { forceNow: now }), + datemath.parse('now-3m', { forceNow: now }), + ]; + + before(async () => { + // load visualize to have an index pattern ready, otherwise visualize will redirect + await esArchiver.load('visualize/default'); + }); + + it('create rollup tsvb', async () => { + //Create data for rollup job so it doesn't fail + await es.index({ + index: rollupSourceIndexName, + body: { + '@timestamp': new Date().toISOString(), + }, + }); + + await retry.try(async () => { + //Create a rollup for kibana to recognize + await es.transport.request({ + path: `/_rollup/job/${rollupJobName}`, + method: 'PUT', + body: { + index_pattern: rollupSourceIndexName, + rollup_index: rollupTargetIndexName, + cron: '*/10 * * * * ?', + groups: { + date_histogram: { + fixed_interval: '1000ms', + field: '@timestamp', + time_zone: 'UTC', + }, + }, + timeout: '20s', + page_size: 1000, + }, + }); + }); + + await pastDates.map(async day => { + await es.index(mockRolledUpData(rollupJobName, rollupTargetIndexName, day)); + }); + + await PageObjects.visualize.navigateToNewVisualization(); + await PageObjects.visualize.clickVisualBuilder(); + await PageObjects.visualBuilder.checkVisualBuilderIsPresent(); + await PageObjects.timePicker.openQuickSelectTimeMenu(); + await testSubjects.click('superDatePickerCommonlyUsed_Last_24 hours'); + await PageObjects.visualBuilder.clickMetric(); + await PageObjects.visualBuilder.checkMetricTabIsPresent(); + await PageObjects.visualBuilder.clickPanelOptions('metric'); + await PageObjects.visualBuilder.setIndexPatternValue(rollupTargetIndexName); + await PageObjects.visualBuilder.setIntervalValue('1d'); + await PageObjects.visualBuilder.setDropLastBucket(false); + await PageObjects.common.sleep(3000); + const newValue = await PageObjects.visualBuilder.getMetricValue(); + expect(newValue).to.eql('3'); + }); + + after(async () => { + // Delete the rollup job. + await es.transport.request({ + path: `/_rollup/job/${rollupJobName}`, + method: 'DELETE', + }); + + await es.indices.delete({ index: rollupTargetIndexName }); + await es.indices.delete({ index: rollupSourceIndexName }); + await esArchiver.load('empty_kibana'); + }); + }); +} From e510484ddf880a04924921a18b0efea32427d43f Mon Sep 17 00:00:00 2001 From: Lukas Olson Date: Tue, 4 Feb 2020 10:58:43 -0700 Subject: [PATCH 07/86] [Search service] Move loadingCount to sync search strategy (#56335) * Move loadingCount to search strategy * Only register observable once Co-authored-by: Elastic Machine --- .../create_app_mount_context_search.test.ts | 50 ++++++++----------- .../search/create_app_mount_context_search.ts | 19 ++----- .../public/search/es_client/get_es_client.ts | 6 ++- .../data/public/search/search_service.ts | 10 +--- .../public/search/sync_search_strategy.ts | 17 ++++--- 5 files changed, 42 insertions(+), 60 deletions(-) diff --git a/src/plugins/data/public/search/create_app_mount_context_search.test.ts b/src/plugins/data/public/search/create_app_mount_context_search.test.ts index 15b85ee270bed..fa7cdbcda3082 100644 --- a/src/plugins/data/public/search/create_app_mount_context_search.test.ts +++ b/src/plugins/data/public/search/create_app_mount_context_search.test.ts @@ -18,35 +18,32 @@ */ import { createAppMountSearchContext } from './create_app_mount_context_search'; -import { from, BehaviorSubject } from 'rxjs'; +import { from } from 'rxjs'; describe('Create app mount search context', () => { it('Returns search fn when there are no strategies', () => { - const context = createAppMountSearchContext({}, new BehaviorSubject(0)); + const context = createAppMountSearchContext({}); expect(context.search).toBeDefined(); }); it(`Search throws an error when the strategy doesn't exist`, () => { - const context = createAppMountSearchContext({}, new BehaviorSubject(0)); + const context = createAppMountSearchContext({}); expect(() => context.search({}, {}, 'noexist').toPromise()).toThrowErrorMatchingInlineSnapshot( `"Strategy with name noexist does not exist"` ); }); it(`Search fn is called on appropriate strategy name`, done => { - const context = createAppMountSearchContext( - { - mysearch: search => - Promise.resolve({ - search: () => from(Promise.resolve({ percentComplete: 98 })), - }), - anothersearch: search => - Promise.resolve({ - search: () => from(Promise.resolve({ percentComplete: 0 })), - }), - }, - new BehaviorSubject(0) - ); + const context = createAppMountSearchContext({ + mysearch: search => + Promise.resolve({ + search: () => from(Promise.resolve({ percentComplete: 98 })), + }), + anothersearch: search => + Promise.resolve({ + search: () => from(Promise.resolve({ percentComplete: 0 })), + }), + }); context.search({}, {}, 'mysearch').subscribe(response => { expect(response).toEqual({ percentComplete: 98 }); @@ -55,19 +52,16 @@ describe('Create app mount search context', () => { }); it(`Search fn is called with the passed in request object`, done => { - const context = createAppMountSearchContext( - { - mysearch: search => { - return Promise.resolve({ - search: request => { - expect(request).toEqual({ greeting: 'hi' }); - return from(Promise.resolve({})); - }, - }); - }, + const context = createAppMountSearchContext({ + mysearch: search => { + return Promise.resolve({ + search: request => { + expect(request).toEqual({ greeting: 'hi' }); + return from(Promise.resolve({})); + }, + }); }, - new BehaviorSubject(0) - ); + }); context.search({ greeting: 'hi' } as any, {}, 'mysearch').subscribe( response => {}, () => {}, diff --git a/src/plugins/data/public/search/create_app_mount_context_search.ts b/src/plugins/data/public/search/create_app_mount_context_search.ts index f480b8f3e042e..7a617e0bab837 100644 --- a/src/plugins/data/public/search/create_app_mount_context_search.ts +++ b/src/plugins/data/public/search/create_app_mount_context_search.ts @@ -17,8 +17,8 @@ * under the License. */ -import { mergeMap, tap } from 'rxjs/operators'; -import { from, BehaviorSubject } from 'rxjs'; +import { mergeMap } from 'rxjs/operators'; +import { from } from 'rxjs'; import { ISearchAppMountContext } from './i_search_app_mount_context'; import { ISearchGeneric } from './i_search'; import { @@ -30,8 +30,7 @@ import { TStrategyTypes } from './strategy_types'; import { DEFAULT_SEARCH_STRATEGY } from '../../common/search'; export const createAppMountSearchContext = ( - searchStrategies: TSearchStrategiesMap, - loadingCount$: BehaviorSubject + searchStrategies: TSearchStrategiesMap ): ISearchAppMountContext => { const getSearchStrategy = ( strategyName?: K @@ -47,17 +46,7 @@ export const createAppMountSearchContext = ( const search: ISearchGeneric = (request, options, strategyName) => { const strategyPromise = getSearchStrategy(strategyName); - return from(strategyPromise).pipe( - mergeMap(strategy => { - loadingCount$.next(loadingCount$.getValue() + 1); - return strategy.search(request, options).pipe( - tap( - error => loadingCount$.next(loadingCount$.getValue() - 1), - complete => loadingCount$.next(loadingCount$.getValue() - 1) - ) - ); - }) - ); + return from(strategyPromise).pipe(mergeMap(strategy => strategy.search(request, options))); }; return { search }; diff --git a/src/plugins/data/public/search/es_client/get_es_client.ts b/src/plugins/data/public/search/es_client/get_es_client.ts index 6c271643ba012..93d9d24920271 100644 --- a/src/plugins/data/public/search/es_client/get_es_client.ts +++ b/src/plugins/data/public/search/es_client/get_es_client.ts @@ -25,8 +25,7 @@ import { BehaviorSubject } from 'rxjs'; export function getEsClient( injectedMetadata: CoreStart['injectedMetadata'], http: CoreStart['http'], - packageInfo: PackageInfo, - loadingCount$: BehaviorSubject + packageInfo: PackageInfo ) { const esRequestTimeout = injectedMetadata.getInjectedVar('esRequestTimeout') as number; const esApiVersion = injectedMetadata.getInjectedVar('esApiVersion') as string; @@ -39,6 +38,9 @@ export function getEsClient( apiVersion: esApiVersion, }); + const loadingCount$ = new BehaviorSubject(0); + http.addLoadingCountSource(loadingCount$); + return { search: wrapEsClientMethod(client, 'search', loadingCount$), msearch: wrapEsClientMethod(client, 'msearch', loadingCount$), diff --git a/src/plugins/data/public/search/search_service.ts b/src/plugins/data/public/search/search_service.ts index dad2b3d078aa0..dd67c04f1d7bd 100644 --- a/src/plugins/data/public/search/search_service.ts +++ b/src/plugins/data/public/search/search_service.ts @@ -16,7 +16,6 @@ * specific language governing permissions and limitations * under the License. */ -import { BehaviorSubject } from 'rxjs'; import { Plugin, CoreSetup, @@ -80,22 +79,17 @@ export class SearchService implements Plugin { private contextContainer?: IContextContainer>; private esClient?: LegacyApiCaller; private search?: ISearchGeneric; - private readonly loadingCount$ = new BehaviorSubject(0); constructor(private initializerContext: PluginInitializerContext) {} public setup(core: CoreSetup, packageInfo: PackageInfo): ISearchSetup { - core.http.addLoadingCountSource(this.loadingCount$); - const search = (this.search = createAppMountSearchContext( - this.searchStrategies, - this.loadingCount$ - ).search); + const search = (this.search = createAppMountSearchContext(this.searchStrategies).search); core.application.registerMountContext<'search'>('search', () => { return { search }; }); this.contextContainer = core.context.createContextContainer(); - this.esClient = getEsClient(core.injectedMetadata, core.http, packageInfo, this.loadingCount$); + this.esClient = getEsClient(core.injectedMetadata, core.http, packageInfo); const registerSearchStrategyProvider: TRegisterSearchStrategyProvider = < T extends TStrategyTypes diff --git a/src/plugins/data/public/search/sync_search_strategy.ts b/src/plugins/data/public/search/sync_search_strategy.ts index 65fe10f39aaa0..b895a177d8608 100644 --- a/src/plugins/data/public/search/sync_search_strategy.ts +++ b/src/plugins/data/public/search/sync_search_strategy.ts @@ -17,7 +17,7 @@ * under the License. */ -import { from } from 'rxjs'; +import { BehaviorSubject, from } from 'rxjs'; import { IKibanaSearchRequest, IKibanaSearchResponse } from '../../common/search'; import { ISearchContext } from './i_search_context'; import { ISearch, ISearchOptions } from './i_search'; @@ -31,11 +31,16 @@ export interface ISyncSearchRequest extends IKibanaSearchRequest { export const syncSearchStrategyProvider: TSearchStrategyProvider = ( context: ISearchContext -) => { +): ISearchStrategy => { + const loadingCount$ = new BehaviorSubject(0); + context.core.http.addLoadingCountSource(loadingCount$); + const search: ISearch = ( request: ISyncSearchRequest, options: ISearchOptions = {} ) => { + loadingCount$.next(loadingCount$.getValue() + 1); + const response: Promise = context.core.http.fetch({ path: `/internal/search/${request.serverStrategy}`, method: 'POST', @@ -43,12 +48,10 @@ export const syncSearchStrategyProvider: TSearchStrategyProvider loadingCount$.next(loadingCount$.getValue() - 1)); - const strategy: ISearchStrategy = { - search, + return from(response); }; - return strategy; + return { search }; }; From 885b79e76fafba23def567668b5e0b958e895c47 Mon Sep 17 00:00:00 2001 From: Xavier Mouligneau <189600+XavierM@users.noreply.github.com> Date: Tue, 4 Feb 2020 13:29:18 -0500 Subject: [PATCH 08/86] fix open close signal on detail page (#56757) --- .../pages/detection_engine/components/signals/index.tsx | 4 +++- .../detection_engine/routes/__mocks__/request_responses.ts | 2 +- .../routes/signals/open_close_signals_route.ts | 6 +++++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/signals/index.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/signals/index.tsx index e65adcf3a6920..7eb8e07ada762 100644 --- a/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/signals/index.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/signals/index.tsx @@ -129,7 +129,9 @@ const SignalsTableComponent: React.FC = ({ dataProviders: [], indexPattern: indexPatterns, browserFields, - filters: globalFilters, + filters: isEmpty(defaultFilters) + ? globalFilters + : [...(defaultFilters ?? []), ...globalFilters], kqlQuery: globalQuery, kqlMode: globalQuery.language, start: from, diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/request_responses.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/request_responses.ts index 6a42aed123fa3..19c4279e06b03 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/request_responses.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/request_responses.ts @@ -84,7 +84,7 @@ export const typicalSetStatusSignalByIdsPayload = (): Partial => ({ - query: { range: { '@timestamp': { gte: 'now-2M', lte: 'now/M' } } }, + query: { bool: { filter: { range: { '@timestamp': { gte: 'now-2M', lte: 'now/M' } } } } }, status: 'closed', }); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/open_close_signals_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/open_close_signals_route.ts index 7c49a1942ee91..4755869c3d908 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/open_close_signals_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/open_close_signals_route.ts @@ -33,7 +33,11 @@ export const setSignalsStatusRouteDef = (server: ServerFacade): Hapi.ServerRoute queryObject = { ids: { values: signalIds } }; } if (query) { - queryObject = query; + queryObject = { + bool: { + filter: query, + }, + }; } try { return callWithRequest(request, 'updateByQuery', { From b92e8e264c91a9c8eb8cb52fd7c414d31d4ccf83 Mon Sep 17 00:00:00 2001 From: Caroline Horn <549577+cchaos@users.noreply.github.com> Date: Tue, 4 Feb 2020 13:42:27 -0500 Subject: [PATCH 09/86] Fix: Filter pill base coloring (#56761) --- src/plugins/data/public/ui/filter_bar/filter_view/index.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/data/public/ui/filter_bar/filter_view/index.tsx b/src/plugins/data/public/ui/filter_bar/filter_view/index.tsx index dd12789d15a9d..ed33afeca69c2 100644 --- a/src/plugins/data/public/ui/filter_bar/filter_view/index.tsx +++ b/src/plugins/data/public/ui/filter_bar/filter_view/index.tsx @@ -57,6 +57,7 @@ export const FilterView: FC = ({ return ( Date: Tue, 4 Feb 2020 11:05:30 -0800 Subject: [PATCH 10/86] Implement UI for Create Alert form (#55232) * Updated Alert ui model, fixed form validation and small issues * Fixed error messages and validation for action params forms * Fixed typecheck error * Moved alert add/edit common fields to alert form * Fixed type checks * Refactored alert add flyout by splitting it to the form and flyout components, added some unit tests * Refactored connector add/edit flyouts and created add connector modal * Refactored add/edit flyout tests * Fixed test * Removed orig files * Removed orig file * Added unit tests for add connector modal dialog * Action Groups idea of implementation * Removed action group tabs and set only first action group as default (temporary till design will be ready for support multiple groups) * Added missing unit tests * Changed design of the email params form * Fixed actions params forms according to latest mockups * Fixed options list for available actions connectors * Fixed modal dialog update on action delete * fixed build fail * Added functionality for action types with Message field to Add variables * Added alertReducer unit tests * Added create alert functional test * Added types for Params * Some design fixes * alerts empty prompt * Fixed failing app on save alert and added possibility to hide Change trigger button * Fixed type check issues * Added connector config types * fixed type check * Fixed merge issues * Fixed type checks * Fixed functional tests and error expression message * Fixed jest tests * Review changes Co-authored-by: dave.snider@gmail.com --- .../np_ready/public/application/app.tsx | 2 +- .../builtin_action_types/email.test.tsx | 58 +- .../components/builtin_action_types/email.tsx | 307 ++++--- .../builtin_action_types/es_index.test.tsx | 19 +- .../builtin_action_types/es_index.tsx | 35 +- .../builtin_action_types/pagerduty.test.tsx | 36 +- .../builtin_action_types/pagerduty.tsx | 82 +- .../builtin_action_types/server_log.test.tsx | 26 +- .../builtin_action_types/server_log.tsx | 90 +- .../builtin_action_types/slack.test.tsx | 22 +- .../components/builtin_action_types/slack.tsx | 105 ++- .../components/builtin_action_types/types.ts | 130 +++ .../builtin_action_types/webhook.test.tsx | 22 +- .../builtin_action_types/webhook.tsx | 28 +- .../components/builtin_alert_types/index.ts | 2 +- .../threshold/expression.tsx | 153 +--- .../builtin_alert_types/threshold/index.ts | 103 +++ .../threshold/visualization.tsx | 5 +- .../application/constants/action_groups.ts | 11 - .../application/context/alerts_context.tsx | 5 +- .../public/application/lib/alert_api.test.ts | 10 +- .../action_connector_form/_index.scss | 3 + .../action_connector_form.test.tsx | 63 +- .../action_connector_form.tsx | 327 +++---- .../action_type_menu.tsx | 40 +- .../connector_add_flyout.test.tsx | 58 +- .../connector_add_flyout.tsx | 131 ++- .../connector_add_modal.test.tsx | 102 +++ .../connector_add_modal.tsx | 168 ++++ .../connector_edit_flyout.test.tsx | 2 +- .../connector_edit_flyout.tsx | 120 ++- .../connector_reducer.ts | 13 +- .../components/actions_connectors_list.tsx | 7 +- .../sections/alert_add/alert_add.test.tsx | 117 +++ .../sections/alert_add/alert_add.tsx | 759 ++-------------- .../sections/alert_add/alert_form.test.tsx | 200 ++++ .../sections/alert_add/alert_form.tsx | 853 ++++++++++++++++++ .../sections/alert_add/alert_reducer.test.ts | 163 ++++ .../sections/alert_add/alert_reducer.ts | 18 + .../components/alert_details.test.tsx | 32 + .../components/alerts_list.test.tsx | 12 +- .../alerts_list/components/alerts_list.tsx | 230 +++-- .../np_ready/public/types.ts | 25 +- .../triggers_actions_ui/public/index.scss | 3 + .../apps/triggers_actions_ui/alerts.ts | 90 +- .../apps/triggers_actions_ui/connectors.ts | 10 +- .../page_objects/triggers_actions_ui_page.ts | 24 +- 47 files changed, 3160 insertions(+), 1661 deletions(-) create mode 100644 x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/types.ts create mode 100644 x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_alert_types/threshold/index.ts delete mode 100644 x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/constants/action_groups.ts create mode 100644 x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/_index.scss create mode 100644 x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/connector_add_modal.test.tsx create mode 100644 x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/connector_add_modal.tsx create mode 100644 x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alert_add/alert_add.test.tsx create mode 100644 x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alert_add/alert_form.test.tsx create mode 100644 x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alert_add/alert_form.tsx create mode 100644 x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alert_add/alert_reducer.test.ts diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/app.tsx b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/app.tsx index 7d9a963c9c6b3..8bc292c58468e 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/app.tsx +++ b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/app.tsx @@ -48,7 +48,7 @@ export const App = (appDeps: AppDeps) => { ); }; -export const AppWithoutRouter = ({ sectionsRegex }: any) => { +export const AppWithoutRouter = ({ sectionsRegex }: { sectionsRegex: string }) => { const { capabilities } = useAppDependencies(); const canShowAlerts = hasShowAlertsCapability(capabilities); const DEFAULT_SECTION: Section = canShowAlerts ? 'alerts' : 'connectors'; diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/email.test.tsx b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/email.test.tsx index 5c924982c3536..49a611167cf16 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/email.test.tsx +++ b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/email.test.tsx @@ -3,11 +3,12 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import React from 'react'; +import React, { FunctionComponent } from 'react'; import { mountWithIntl } from 'test_utils/enzyme_helpers'; import { TypeRegistry } from '../../type_registry'; import { registerBuiltInActionTypes } from './index'; -import { ActionTypeModel, ActionConnector } from '../../../types'; +import { ActionTypeModel, ActionParamsProps } from '../../../types'; +import { EmailActionParams, EmailActionConnector } from './types'; const ACTION_TYPE_ID = '.email'; let actionTypeModel: ActionTypeModel; @@ -40,43 +41,15 @@ describe('connector validation', () => { name: 'email', config: { from: 'test@test.com', - port: '2323', + port: 2323, host: 'localhost', test: 'test', }, - } as ActionConnector; + } as EmailActionConnector; expect(actionTypeModel.validateConnector(actionConnector)).toEqual({ errors: { from: [], - service: [], - port: [], - host: [], - user: [], - password: [], - }, - }); - - delete actionConnector.config.test; - actionConnector.config.host = 'elastic.co'; - actionConnector.config.port = 8080; - expect(actionTypeModel.validateConnector(actionConnector)).toEqual({ - errors: { - from: [], - service: [], - port: [], - host: [], - user: [], - password: [], - }, - }); - delete actionConnector.config.host; - delete actionConnector.config.port; - actionConnector.config.service = 'testService'; - expect(actionTypeModel.validateConnector(actionConnector)).toEqual({ - errors: { - from: [], - service: [], port: [], host: [], user: [], @@ -97,12 +70,11 @@ describe('connector validation', () => { config: { from: 'test@test.com', }, - } as ActionConnector; + } as EmailActionConnector; expect(actionTypeModel.validateConnector(actionConnector)).toEqual({ errors: { from: [], - service: ['Service is required.'], port: ['Port is required.'], host: ['Host is required.'], user: [], @@ -168,14 +140,13 @@ describe('EmailActionConnectorFields renders', () => { config: { from: 'test@test.com', }, - } as ActionConnector; + } as EmailActionConnector; const wrapper = mountWithIntl( {}} editActionSecrets={() => {}} - hasErrors={false} /> ); expect(wrapper.find('[data-test-subj="emailFromInput"]').length > 0).toBeTruthy(); @@ -198,19 +169,22 @@ describe('EmailParamsFields renders', () => { if (!actionTypeModel.actionParamsFields) { return; } - const ParamsFields = actionTypeModel.actionParamsFields; + const ParamsFields = actionTypeModel.actionParamsFields as FunctionComponent< + ActionParamsProps + >; const actionParams = { + cc: [], + bcc: [], to: ['test@test.com'], subject: 'test', message: 'test message', }; const wrapper = mountWithIntl( {}} index={0} - hasErrors={false} /> ); expect(wrapper.find('[data-test-subj="toEmailAddressInput"]').length > 0).toBeTruthy(); @@ -220,8 +194,6 @@ describe('EmailParamsFields renders', () => { .first() .prop('selectedOptions') ).toStrictEqual([{ label: 'test@test.com' }]); - expect(wrapper.find('[data-test-subj="ccEmailAddressInput"]').length > 0).toBeTruthy(); - expect(wrapper.find('[data-test-subj="bccEmailAddressInput"]').length > 0).toBeTruthy(); expect(wrapper.find('[data-test-subj="emailSubjectInput"]').length > 0).toBeTruthy(); expect(wrapper.find('[data-test-subj="emailMessageInput"]').length > 0).toBeTruthy(); }); diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/email.tsx b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/email.tsx index a6750ccf96deb..f82b2c8c88ada 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/email.tsx +++ b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/email.tsx @@ -3,7 +3,8 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import React, { Fragment } from 'react'; +import React, { Fragment, useState, useEffect } from 'react'; +import { FormattedMessage } from '@kbn/i18n/react'; import { EuiFieldText, EuiFlexItem, @@ -12,17 +13,22 @@ import { EuiFieldPassword, EuiComboBox, EuiTextArea, + EuiButtonEmpty, EuiSwitch, EuiFormRow, + EuiContextMenuItem, + EuiButtonIcon, + EuiContextMenuPanel, + EuiPopover, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { ActionTypeModel, ActionConnectorFieldsProps, - ActionConnector, ValidationResult, ActionParamsProps, } from '../../../types'; +import { EmailActionParams, EmailActionConnector } from './types'; export function getActionType(): ActionTypeModel { const mailformat = /^[^@\s]+@[^@\s]+$/; @@ -35,11 +41,16 @@ export function getActionType(): ActionTypeModel { defaultMessage: 'Send email from your server.', } ), - validateConnector: (action: ActionConnector): ValidationResult => { + actionTypeTitle: i18n.translate( + 'xpack.triggersActionsUI.components.builtinActionTypes.emailAction.actionTypeTitle', + { + defaultMessage: 'Send to email', + } + ), + validateConnector: (action: EmailActionConnector): ValidationResult => { const validationResult = { errors: {} }; const errors = { from: new Array(), - service: new Array(), port: new Array(), host: new Array(), user: new Array(), @@ -66,7 +77,7 @@ export function getActionType(): ActionTypeModel { ) ); } - if (!action.config.port && !action.config.service) { + if (!action.config.port) { errors.port.push( i18n.translate( 'xpack.triggersActionsUI.components.builtinActionTypes.error.requiredPortText', @@ -76,17 +87,7 @@ export function getActionType(): ActionTypeModel { ) ); } - if (!action.config.service && (!action.config.port || !action.config.host)) { - errors.service.push( - i18n.translate( - 'xpack.triggersActionsUI.components.builtinActionTypes.error.requiredServiceText', - { - defaultMessage: 'Service is required.', - } - ) - ); - } - if (!action.config.host && !action.config.service) { + if (!action.config.host) { errors.host.push( i18n.translate( 'xpack.triggersActionsUI.components.builtinActionTypes.error.requiredHostText', @@ -118,7 +119,7 @@ export function getActionType(): ActionTypeModel { } return validationResult; }, - validateParams: (actionParams: any): ValidationResult => { + validateParams: (actionParams: EmailActionParams): ValidationResult => { const validationResult = { errors: {} }; const errors = { to: new Array(), @@ -143,7 +144,7 @@ export function getActionType(): ActionTypeModel { errors.cc.push(errorText); errors.bcc.push(errorText); } - if (!actionParams.message) { + if (!actionParams.message?.length) { errors.message.push( i18n.translate( 'xpack.triggersActionsUI.components.builtinActionTypes.error.requiredMessageText', @@ -153,7 +154,7 @@ export function getActionType(): ActionTypeModel { ) ); } - if (!actionParams.subject) { + if (!actionParams.subject?.length) { errors.subject.push( i18n.translate( 'xpack.triggersActionsUI.components.builtinActionTypes.error.requiredSubjectText', @@ -170,12 +171,9 @@ export function getActionType(): ActionTypeModel { }; } -const EmailActionConnectorFields: React.FunctionComponent = ({ - action, - editActionConfig, - editActionSecrets, - errors, -}) => { +const EmailActionConnectorFields: React.FunctionComponent> = ({ action, editActionConfig, editActionSecrets, errors }) => { const { from, host, port, secure } = action.config; const { user, password } = action.secrets; @@ -265,7 +263,7 @@ const EmailActionConnectorFields: React.FunctionComponent 0 && port !== undefined} fullWidth name="port" - value={port || ''} + value={port} data-test-subj="emailPortInput" onChange={e => { editActionConfig('port', parseInt(e.target.value, 10)); @@ -365,34 +363,79 @@ const EmailActionConnectorFields: React.FunctionComponent = ({ - action, +const EmailParamsFields: React.FunctionComponent> = ({ + actionParams, editAction, index, errors, - hasErrors, + messageVariables, + defaultMessage, }) => { - const { to, cc, bcc, subject, message } = action; + const { to, cc, bcc, subject, message } = actionParams; const toOptions = to ? to.map((label: string) => ({ label })) : []; const ccOptions = cc ? cc.map((label: string) => ({ label })) : []; const bccOptions = bcc ? bcc.map((label: string) => ({ label })) : []; + const [addCC, setAddCC] = useState(false); + const [addBCC, setAddBCC] = useState(false); + const [isVariablesPopoverOpen, setIsVariablesPopoverOpen] = useState(false); + useEffect(() => { + if (defaultMessage && defaultMessage.length > 0) { + editAction('message', defaultMessage, index); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + const messageVariablesItems = messageVariables?.map((variable: string) => ( + { + editAction('message', (message ?? '').concat(` {{${variable}}}`), index); + setIsVariablesPopoverOpen(false); + }} + > + {`{{${variable}}}`} + + )); return ( 0 && to !== undefined} label={i18n.translate( 'xpack.triggersActionsUI.sections.builtinActionTypes.emailAction.recipientTextFieldLabel', { - defaultMessage: 'To', + defaultMessage: 'To:', } )} + labelAppend={ + + + {!addCC ? ( + setAddCC(true)}> + + + ) : null} + {!addBCC ? ( + setAddBCC(true)}> + + + ) : null} + + + } > 0 && to !== undefined} fullWidth data-test-subj="toEmailAddressInput" selectedOptions={toOptions} @@ -418,126 +461,164 @@ const EmailParamsFields: React.FunctionComponent = ({ }} /> - - { - const newOptions = [...ccOptions, { label: searchValue }]; - editAction( - 'cc', - newOptions.map(newOption => newOption.label), - index - ); - }} - onChange={(selectedOptions: Array<{ label: string }>) => { - editAction( - 'cc', - selectedOptions.map(selectedOption => selectedOption.label), - index - ); - }} - onBlur={() => { - if (!cc) { - editAction('cc', [], index); + error={errors.cc} + isInvalid={errors.cc.length > 0 && cc !== undefined} + label={i18n.translate( + 'xpack.triggersActionsUI.sections.builtinActionTypes.emailAction.recipientCopyTextFieldLabel', + { + defaultMessage: 'Cc:', } - }} - /> - - - + 0 && cc !== undefined} + fullWidth + data-test-subj="ccEmailAddressInput" + selectedOptions={ccOptions} + onCreateOption={(searchValue: string) => { + const newOptions = [...ccOptions, { label: searchValue }]; + editAction( + 'cc', + newOptions.map(newOption => newOption.label), + index + ); + }} + onChange={(selectedOptions: Array<{ label: string }>) => { + editAction( + 'cc', + selectedOptions.map(selectedOption => selectedOption.label), + index + ); + }} + onBlur={() => { + if (!cc) { + editAction('cc', [], index); + } + }} + /> + + ) : null} + {addBCC ? ( + { - const newOptions = [...bccOptions, { label: searchValue }]; - editAction( - 'bcc', - newOptions.map(newOption => newOption.label), - index - ); - }} - onChange={(selectedOptions: Array<{ label: string }>) => { - editAction( - 'bcc', - selectedOptions.map(selectedOption => selectedOption.label), - index - ); - }} - onBlur={() => { - if (!bcc) { - editAction('bcc', [], index); + error={errors.bcc} + isInvalid={errors.bcc.length > 0 && bcc !== undefined} + label={i18n.translate( + 'xpack.triggersActionsUI.sections.builtinActionTypes.emailAction.recipientBccTextFieldLabel', + { + defaultMessage: 'Bcc:', } - }} - /> - + )} + > + 0 && bcc !== undefined} + fullWidth + data-test-subj="bccEmailAddressInput" + selectedOptions={bccOptions} + onCreateOption={(searchValue: string) => { + const newOptions = [...bccOptions, { label: searchValue }]; + editAction( + 'bcc', + newOptions.map(newOption => newOption.label), + index + ); + }} + onChange={(selectedOptions: Array<{ label: string }>) => { + editAction( + 'bcc', + selectedOptions.map(selectedOption => selectedOption.label), + index + ); + }} + onBlur={() => { + if (!bcc) { + editAction('bcc', [], index); + } + }} + /> + + ) : null} 0 && subject !== undefined} label={i18n.translate( 'xpack.triggersActionsUI.sections.builtinActionTypes.emailAction.subjectTextFieldLabel', { - defaultMessage: 'Subject', + defaultMessage: 'Subject:', } )} > 0 && subject !== undefined} name="subject" data-test-subj="emailSubjectInput" value={subject || ''} + placeholder="Text field (placeholder)" onChange={e => { editAction('subject', e.target.value, index); }} + onBlur={() => { + if (!subject) { + editAction('subject', '', index); + } + }} /> 0 && message !== undefined} label={i18n.translate( 'xpack.triggersActionsUI.sections.builtinActionTypes.emailAction.messageTextAreaFieldLabel', { - defaultMessage: 'Message', + defaultMessage: 'Message:', } )} + labelAppend={ + setIsVariablesPopoverOpen(true)} + iconType="indexOpen" + aria-label={i18n.translate( + 'xpack.triggersActionsUI.components.builtinActionTypes.emailAction.addVariablePopoverButton', + { + defaultMessage: 'Add variable', + } + )} + /> + } + isOpen={isVariablesPopoverOpen} + closePopover={() => setIsVariablesPopoverOpen(false)} + panelPaddingSize="none" + anchorPosition="downLeft" + > + + + } > 0 && message !== undefined} value={message || ''} name="message" data-test-subj="emailMessageInput" onChange={e => { editAction('message', e.target.value, index); }} + onBlur={() => { + if (!message) { + editAction('message', '', index); + } + }} /> diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/es_index.test.tsx b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/es_index.test.tsx index b6a7c4d82aca4..d44787f0c4ed6 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/es_index.test.tsx +++ b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/es_index.test.tsx @@ -3,11 +3,12 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import React from 'react'; +import React, { FunctionComponent } from 'react'; import { mountWithIntl } from 'test_utils/enzyme_helpers'; import { TypeRegistry } from '../../type_registry'; import { registerBuiltInActionTypes } from './index'; -import { ActionTypeModel, ActionConnector } from '../../../types'; +import { ActionTypeModel, ActionParamsProps } from '../../../types'; +import { IndexActionParams, EsIndexActionConnector } from './types'; const ACTION_TYPE_ID = '.index'; let actionTypeModel: ActionTypeModel; @@ -38,7 +39,7 @@ describe('index connector validation', () => { config: { index: 'test_es_index', }, - } as ActionConnector; + } as EsIndexActionConnector; expect(actionTypeModel.validateConnector(actionConnector)).toEqual({ errors: {}, @@ -87,14 +88,13 @@ describe('IndexActionConnectorFields renders', () => { config: { index: 'test', }, - } as ActionConnector; + } as EsIndexActionConnector; const wrapper = mountWithIntl( {}} editActionSecrets={() => {}} - hasErrors={false} /> ); expect(wrapper.find('[data-test-subj="indexInput"]').length > 0).toBeTruthy(); @@ -113,7 +113,9 @@ describe('IndexParamsFields renders', () => { if (!actionTypeModel.actionParamsFields) { return; } - const ParamsFields = actionTypeModel.actionParamsFields; + const ParamsFields = actionTypeModel.actionParamsFields as FunctionComponent< + ActionParamsProps + >; const actionParams = { index: 'test_index', refresh: false, @@ -121,11 +123,10 @@ describe('IndexParamsFields renders', () => { }; const wrapper = mountWithIntl( {}} index={0} - hasErrors={false} /> ); expect(wrapper.find('[data-test-subj="indexInput"]').length > 0).toBeTruthy(); diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/es_index.tsx b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/es_index.tsx index aa15195cdc286..6af54d2bf15b4 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/es_index.tsx +++ b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/es_index.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ import React, { Fragment } from 'react'; -import { EuiFieldText, EuiFormRow, EuiSwitch } from '@elastic/eui'; +import { EuiFieldText, EuiFormRow, EuiSwitch, EuiSpacer } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import { i18n } from '@kbn/i18n'; import { @@ -13,6 +13,7 @@ import { ValidationResult, ActionParamsProps, } from '../../../types'; +import { IndexActionParams, EsIndexActionConnector } from './types'; export function getActionType(): ActionTypeModel { return { @@ -29,17 +30,15 @@ export function getActionType(): ActionTypeModel { }, actionConnectorFields: IndexActionConnectorFields, actionParamsFields: IndexParamsFields, - validateParams: (actionParams: any): ValidationResult => { - const validationResult = { errors: {} }; - return validationResult; + validateParams: (): ValidationResult => { + return { errors: {} }; }, }; } -const IndexActionConnectorFields: React.FunctionComponent = ({ - action, - editActionConfig, -}) => { +const IndexActionConnectorFields: React.FunctionComponent> = ({ action, editActionConfig }) => { const { index } = action.config; return ( = ({ - action, +const IndexParamsFields: React.FunctionComponent> = ({ + actionParams, index, editAction, - errors, - hasErrors, }) => { - const { refresh } = action; + const { refresh } = actionParams; return ( = ({ > ) => { editAction('index', e.target.value, index); }} onBlur={() => { - if (!action.index) { + if (!actionParams.index) { editAction('index', '', index); } }} /> + { + checked={refresh || false} + onChange={e => { editAction('refresh', e.target.checked, index); }} label={ diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/pagerduty.test.tsx b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/pagerduty.test.tsx index 582315c95812a..31a69f9fd94ac 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/pagerduty.test.tsx +++ b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/pagerduty.test.tsx @@ -3,11 +3,17 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import React from 'react'; +import React, { FunctionComponent } from 'react'; import { mountWithIntl } from 'test_utils/enzyme_helpers'; import { TypeRegistry } from '../../type_registry'; import { registerBuiltInActionTypes } from './index'; -import { ActionTypeModel, ActionConnector } from '../../../types'; +import { ActionTypeModel, ActionParamsProps } from '../../../types'; +import { + PagerDutyActionParams, + EventActionOptions, + SeverityActionOptions, + PagerDutyActionConnector, +} from './types'; const ACTION_TYPE_ID = '.pagerduty'; let actionTypeModel: ActionTypeModel; @@ -40,7 +46,7 @@ describe('pagerduty connector validation', () => { config: { apiUrl: 'http:\\test', }, - } as ActionConnector; + } as PagerDutyActionConnector; expect(actionTypeModel.validateConnector(actionConnector)).toEqual({ errors: { @@ -66,7 +72,7 @@ describe('pagerduty connector validation', () => { config: { apiUrl: 'http:\\test', }, - } as ActionConnector; + } as PagerDutyActionConnector; expect(actionTypeModel.validateConnector(actionConnector)).toEqual({ errors: { @@ -91,7 +97,9 @@ describe('pagerduty action params validation', () => { }; expect(actionTypeModel.validateParams(actionParams)).toEqual({ - errors: {}, + errors: { + summary: [], + }, }); }); }); @@ -113,14 +121,13 @@ describe('PagerDutyActionConnectorFields renders', () => { config: { apiUrl: 'http:\\test', }, - } as ActionConnector; + } as PagerDutyActionConnector; const wrapper = mountWithIntl( {}} editActionSecrets={() => {}} - hasErrors={false} /> ); expect(wrapper.find('[data-test-subj="pagerdutyApiUrlInput"]').length > 0).toBeTruthy(); @@ -140,13 +147,15 @@ describe('PagerDutyParamsFields renders', () => { if (!actionTypeModel.actionParamsFields) { return; } - const ParamsFields = actionTypeModel.actionParamsFields; + const ParamsFields = actionTypeModel.actionParamsFields as FunctionComponent< + ActionParamsProps + >; const actionParams = { - eventAction: 'trigger', + eventAction: EventActionOptions.TRIGGER, dedupKey: 'test', summary: '2323', source: 'source', - severity: 'critical', + severity: SeverityActionOptions.CRITICAL, timestamp: '234654564654', component: 'test', group: 'group', @@ -154,11 +163,10 @@ describe('PagerDutyParamsFields renders', () => { }; const wrapper = mountWithIntl( {}} index={0} - hasErrors={false} /> ); expect(wrapper.find('[data-test-subj="severitySelect"]').length > 0).toBeTruthy(); @@ -174,6 +182,6 @@ describe('PagerDutyParamsFields renders', () => { expect(wrapper.find('[data-test-subj="componentInput"]').length > 0).toBeTruthy(); expect(wrapper.find('[data-test-subj="groupInput"]').length > 0).toBeTruthy(); expect(wrapper.find('[data-test-subj="sourceInput"]').length > 0).toBeTruthy(); - expect(wrapper.find('[data-test-subj="pagerdutyDescriptionInput"]').length > 0).toBeTruthy(); + expect(wrapper.find('[data-test-subj="pagerdutySummaryInput"]').length > 0).toBeTruthy(); }); }); diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/pagerduty.tsx b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/pagerduty.tsx index 69c7ec166df60..3c1b1d258cfe2 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/pagerduty.tsx +++ b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/pagerduty.tsx @@ -17,10 +17,10 @@ import { FormattedMessage } from '@kbn/i18n/react'; import { ActionTypeModel, ActionConnectorFieldsProps, - ActionConnector, ValidationResult, ActionParamsProps, } from '../../../types'; +import { PagerDutyActionParams, PagerDutyActionConnector } from './types'; export function getActionType(): ActionTypeModel { return { @@ -32,7 +32,13 @@ export function getActionType(): ActionTypeModel { defaultMessage: 'Send an event in PagerDuty.', } ), - validateConnector: (action: ActionConnector): ValidationResult => { + actionTypeTitle: i18n.translate( + 'xpack.triggersActionsUI.components.builtinActionTypes.pagerDutyAction.actionTypeTitle', + { + defaultMessage: 'Send to PagerDuty', + } + ), + validateConnector: (action: PagerDutyActionConnector): ValidationResult => { const validationResult = { errors: {} }; const errors = { routingKey: new Array(), @@ -50,8 +56,22 @@ export function getActionType(): ActionTypeModel { } return validationResult; }, - validateParams: (actionParams: any): ValidationResult => { + validateParams: (actionParams: PagerDutyActionParams): ValidationResult => { const validationResult = { errors: {} }; + const errors = { + summary: new Array(), + }; + validationResult.errors = errors; + if (!actionParams.summary?.length) { + errors.summary.push( + i18n.translate( + 'xpack.triggersActionsUI.components.builtinActionTypes.pagerDutyAction.error.requiredSummaryText', + { + defaultMessage: 'Summary is required.', + } + ) + ); + } return validationResult; }, actionConnectorFields: PagerDutyActionConnectorFields, @@ -59,12 +79,9 @@ export function getActionType(): ActionTypeModel { }; } -const PagerDutyActionConnectorFields: React.FunctionComponent = ({ - errors, - action, - editActionConfig, - editActionSecrets, -}) => { +const PagerDutyActionConnectorFields: React.FunctionComponent> = ({ errors, action, editActionConfig, editActionSecrets }) => { const { apiUrl } = action.config; const { routingKey } = action.secrets; return ( @@ -137,14 +154,22 @@ const PagerDutyActionConnectorFields: React.FunctionComponent = ({ - action, +const PagerDutyParamsFields: React.FunctionComponent> = ({ + actionParams, editAction, index, errors, - hasErrors, }) => { - const { eventAction, dedupKey, summary, source, severity, timestamp, component, group } = action; + const { + eventAction, + dedupKey, + summary, + source, + severity, + timestamp, + component, + group, + } = actionParams; const severityOptions = [ { value: 'critical', text: 'Critical' }, { value: 'info', text: 'Info' }, @@ -332,7 +357,7 @@ const PagerDutyParamsFields: React.FunctionComponent = ({ id="pagerDutySummary" fullWidth error={errors.summary} - isInvalid={hasErrors === true && summary !== undefined} + isInvalid={errors.summary.length > 0 && summary !== undefined} label={i18n.translate( 'xpack.triggersActionsUI.components.builtinActionTypes.pagerDutyAction.summaryFieldLabel', { @@ -342,10 +367,10 @@ const PagerDutyParamsFields: React.FunctionComponent = ({ > 0 && summary !== undefined} name="summary" value={summary || ''} - data-test-subj="pagerdutyDescriptionInput" + data-test-subj="pagerdutySummaryInput" onChange={(e: React.ChangeEvent) => { editAction('summary', e.target.value, index); }} @@ -356,6 +381,31 @@ const PagerDutyParamsFields: React.FunctionComponent = ({ }} /> + + ) => { + editAction('class', e.target.value, index); + }} + onBlur={() => { + if (!actionParams.class) { + editAction('class', '', index); + } + }} + /> + ); }; diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/server_log.test.tsx b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/server_log.test.tsx index b79be4eef523b..fce8f25e51131 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/server_log.test.tsx +++ b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/server_log.test.tsx @@ -3,11 +3,12 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import React from 'react'; +import React, { FunctionComponent } from 'react'; import { mountWithIntl } from 'test_utils/enzyme_helpers'; import { TypeRegistry } from '../../type_registry'; import { registerBuiltInActionTypes } from './index'; -import { ActionTypeModel, ActionConnector } from '../../../types'; +import { ActionTypeModel, ActionConnector, ActionParamsProps } from '../../../types'; +import { ServerLogActionParams, ServerLogLevelOptions } from './types'; const ACTION_TYPE_ID = '.server-log'; let actionTypeModel: ActionTypeModel; @@ -63,18 +64,20 @@ describe('ServerLogParamsFields renders', () => { if (!actionTypeModel.actionParamsFields) { return; } - const ParamsFields = actionTypeModel.actionParamsFields; + const ParamsFields = actionTypeModel.actionParamsFields as FunctionComponent< + ActionParamsProps + >; const actionParams = { - message: 'test message', - level: 'trace', + level: ServerLogLevelOptions.TRACE, + message: 'test', }; const wrapper = mountWithIntl( {}} index={0} - hasErrors={false} + defaultMessage={'test default message'} /> ); expect(wrapper.find('[data-test-subj="loggingLevelSelect"]').length > 0).toBeTruthy(); @@ -92,18 +95,19 @@ describe('ServerLogParamsFields renders', () => { if (!actionTypeModel.actionParamsFields) { return; } - const ParamsFields = actionTypeModel.actionParamsFields; + const ParamsFields = actionTypeModel.actionParamsFields as FunctionComponent< + ActionParamsProps + >; const actionParams = { message: 'test message', - level: 'info', + level: ServerLogLevelOptions.INFO, }; const wrapper = mountWithIntl( {}} index={0} - hasErrors={false} /> ); expect(wrapper.find('[data-test-subj="loggingLevelSelect"]').length > 0).toBeTruthy(); diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/server_log.tsx b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/server_log.tsx index 885061aa81924..8d8045042cfc3 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/server_log.tsx +++ b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/server_log.tsx @@ -3,10 +3,19 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import React, { Fragment } from 'react'; +import React, { Fragment, useEffect, useState } from 'react'; import { i18n } from '@kbn/i18n'; -import { EuiSelect, EuiTextArea, EuiFormRow } from '@elastic/eui'; +import { + EuiSelect, + EuiTextArea, + EuiFormRow, + EuiContextMenuItem, + EuiPopover, + EuiButtonIcon, + EuiContextMenuPanel, +} from '@elastic/eui'; import { ActionTypeModel, ValidationResult, ActionParamsProps } from '../../../types'; +import { ServerLogActionParams } from './types'; export function getActionType(): ActionTypeModel { return { @@ -18,16 +27,22 @@ export function getActionType(): ActionTypeModel { defaultMessage: 'Add a message to a Kibana log.', } ), + actionTypeTitle: i18n.translate( + 'xpack.triggersActionsUI.components.builtinActionTypes.serverLogAction.actionTypeTitle', + { + defaultMessage: 'Send to Server log', + } + ), validateConnector: (): ValidationResult => { return { errors: {} }; }, - validateParams: (actionParams: any): ValidationResult => { + validateParams: (actionParams: ServerLogActionParams): ValidationResult => { const validationResult = { errors: {} }; const errors = { message: new Array(), }; validationResult.errors = errors; - if (!actionParams.message || actionParams.message.length === 0) { + if (!actionParams.message?.length) { errors.message.push( i18n.translate( 'xpack.triggersActionsUI.components.builtinActionTypes.error.requiredServerLogMessageText', @@ -44,14 +59,10 @@ export function getActionType(): ActionTypeModel { }; } -export const ServerLogParamsFields: React.FunctionComponent = ({ - action, - editAction, - index, - errors, - hasErrors, -}) => { - const { message, level } = action; +export const ServerLogParamsFields: React.FunctionComponent> = ({ actionParams, editAction, index, errors, messageVariables, defaultMessage }) => { + const { message, level } = actionParams; const levelOptions = [ { value: 'trace', text: 'Trace' }, { value: 'debug', text: 'Debug' }, @@ -60,10 +71,27 @@ export const ServerLogParamsFields: React.FunctionComponent = { value: 'error', text: 'Error' }, { value: 'fatal', text: 'Fatal' }, ]; + const [isVariablesPopoverOpen, setIsVariablesPopoverOpen] = useState(false); - // Set default value 'info' for level param - editAction('level', 'info', index); - + useEffect(() => { + editAction('level', 'info', index); + if (defaultMessage && defaultMessage.length > 0) { + editAction('message', defaultMessage, index); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + const messageVariablesItems = messageVariables?.map((variable: string) => ( + { + editAction('message', (message ?? '').concat(` {{${variable}}}`), index); + setIsVariablesPopoverOpen(false); + }} + > + {`{{${variable}}}`} + + )); return ( = id="loggingMessage" fullWidth error={errors.message} - isInvalid={hasErrors && message !== undefined} + isInvalid={errors.message.length > 0 && message !== undefined} label={i18n.translate( 'xpack.triggersActionsUI.components.builtinActionTypes.serverLogAction.logMessageFieldLabel', { defaultMessage: 'Message', } )} + labelAppend={ + setIsVariablesPopoverOpen(true)} + iconType="indexOpen" + aria-label={i18n.translate( + 'xpack.triggersActionsUI.components.builtinActionTypes.serverLogAction.addVariablePopoverButton', + { + defaultMessage: 'Add variable', + } + )} + /> + } + isOpen={isVariablesPopoverOpen} + closePopover={() => setIsVariablesPopoverOpen(false)} + panelPaddingSize="none" + anchorPosition="downLeft" + > + + + } > 0 && message !== undefined} value={message || ''} name="message" data-test-subj="loggingMessageInput" onChange={e => { editAction('message', e.target.value, index); }} + onBlur={() => { + if (!message) { + editAction('message', '', index); + } + }} /> diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/slack.test.tsx b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/slack.test.tsx index 36beea4d2f2be..e4f8599d2e46e 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/slack.test.tsx +++ b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/slack.test.tsx @@ -3,11 +3,12 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import React from 'react'; +import React, { FunctionComponent } from 'react'; import { mountWithIntl } from 'test_utils/enzyme_helpers'; import { TypeRegistry } from '../../type_registry'; import { registerBuiltInActionTypes } from './index'; -import { ActionTypeModel, ActionConnector } from '../../../types'; +import { ActionTypeModel, ActionParamsProps } from '../../../types'; +import { SlackActionParams, SlackActionConnector } from './types'; const ACTION_TYPE_ID = '.slack'; let actionTypeModel: ActionTypeModel; @@ -38,7 +39,7 @@ describe('slack connector validation', () => { actionTypeId: '.email', name: 'email', config: {}, - } as ActionConnector; + } as SlackActionConnector; expect(actionTypeModel.validateConnector(actionConnector)).toEqual({ errors: { @@ -54,7 +55,7 @@ describe('slack connector validation', () => { actionTypeId: '.email', name: 'email', config: {}, - } as ActionConnector; + } as SlackActionConnector; expect(actionTypeModel.validateConnector(actionConnector)).toEqual({ errors: { @@ -91,7 +92,7 @@ describe('SlackActionFields renders', () => { actionTypeId: '.email', name: 'email', config: {}, - } as ActionConnector; + } as SlackActionConnector; const wrapper = mountWithIntl( { if (!actionTypeModel.actionParamsFields) { return; } - const ParamsFields = actionTypeModel.actionParamsFields; + const ParamsFields = actionTypeModel.actionParamsFields as FunctionComponent< + ActionParamsProps + >; const actionParams = { message: 'test message', }; const wrapper = mountWithIntl( {}} index={0} - hasErrors={false} /> ); - expect(wrapper.find('[data-test-subj="slackMessageTextarea"]').length > 0).toBeTruthy(); + expect(wrapper.find('[data-test-subj="slackMessageTextArea"]').length > 0).toBeTruthy(); expect( wrapper - .find('[data-test-subj="slackMessageTextarea"]') + .find('[data-test-subj="slackMessageTextArea"]') .first() .prop('value') ).toStrictEqual('test message'); diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/slack.tsx b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/slack.tsx index 0ae51725169bf..916715de7ae18 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/slack.tsx +++ b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/slack.tsx @@ -3,25 +3,26 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import React, { Fragment } from 'react'; +import React, { Fragment, useState, useEffect } from 'react'; import { EuiFieldText, EuiTextArea, - EuiFlexGroup, - EuiFlexItem, EuiButtonIcon, EuiFormRow, EuiLink, + EuiPopover, + EuiContextMenuPanel, + EuiContextMenuItem, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import { ActionTypeModel, ActionConnectorFieldsProps, - ActionConnector, ValidationResult, ActionParamsProps, } from '../../../types'; +import { SlackActionParams, SlackActionConnector } from './types'; export function getActionType(): ActionTypeModel { return { @@ -33,7 +34,13 @@ export function getActionType(): ActionTypeModel { defaultMessage: 'Send a message to a Slack channel or user.', } ), - validateConnector: (action: ActionConnector): ValidationResult => { + actionTypeTitle: i18n.translate( + 'xpack.triggersActionsUI.components.builtinActionTypes.slackAction.actionTypeTitle', + { + defaultMessage: 'Send to Slack', + } + ), + validateConnector: (action: SlackActionConnector): ValidationResult => { const validationResult = { errors: {} }; const errors = { webhookUrl: new Array(), @@ -51,13 +58,13 @@ export function getActionType(): ActionTypeModel { } return validationResult; }, - validateParams: (actionParams: any): ValidationResult => { + validateParams: (actionParams: SlackActionParams): ValidationResult => { const validationResult = { errors: {} }; const errors = { message: new Array(), }; validationResult.errors = errors; - if (!actionParams.message || actionParams.message.length === 0) { + if (!actionParams.message?.length) { errors.message.push( i18n.translate( 'xpack.triggersActionsUI.components.builtinActionTypes.error.requiredSlackMessageText', @@ -74,11 +81,9 @@ export function getActionType(): ActionTypeModel { }; } -const SlackActionFields: React.FunctionComponent = ({ - action, - editActionSecrets, - errors, -}) => { +const SlackActionFields: React.FunctionComponent> = ({ action, editActionSecrets, errors }) => { const { webhookUrl } = action.secrets; return ( @@ -127,47 +132,87 @@ const SlackActionFields: React.FunctionComponent = ( ); }; -const SlackParamsFields: React.FunctionComponent = ({ - action, +const SlackParamsFields: React.FunctionComponent> = ({ + actionParams, editAction, index, errors, - hasErrors, + messageVariables, + defaultMessage, }) => { - const { message } = action; - + const { message } = actionParams; + const [isVariablesPopoverOpen, setIsVariablesPopoverOpen] = useState(false); + useEffect(() => { + if (defaultMessage && defaultMessage.length > 0) { + editAction('message', defaultMessage, index); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + const messageVariablesItems = messageVariables?.map((variable: string, i: number) => ( + { + editAction('message', (message ?? '').concat(` {{${variable}}}`), index); + setIsVariablesPopoverOpen(false); + }} + > + {`{{${variable}}}`} + + )); return ( - - - window.alert('Button clicked')} - iconType="indexOpen" - aria-label="Add variable" - /> - - 0 && message !== undefined} label={i18n.translate( 'xpack.triggersActionsUI.components.builtinActionTypes.slackAction.messageTextAreaFieldLabel', { defaultMessage: 'Message', } )} + labelAppend={ + setIsVariablesPopoverOpen(true)} + iconType="indexOpen" + aria-label={i18n.translate( + 'xpack.triggersActionsUI.components.builtinActionTypes.slackAction.addVariablePopoverButton', + { + defaultMessage: 'Add variable', + } + )} + /> + } + isOpen={isVariablesPopoverOpen} + closePopover={() => setIsVariablesPopoverOpen(false)} + panelPaddingSize="none" + anchorPosition="downLeft" + > + + + } > 0 && message !== undefined} name="message" - value={message} - data-test-subj="slackMessageTextarea" + value={message || ''} + data-test-subj="slackMessageTextArea" onChange={e => { editAction('message', e.target.value, index); }} + onBlur={() => { + if (!message) { + editAction('message', '', index); + } + }} /> diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/types.ts b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/types.ts new file mode 100644 index 0000000000000..45a08b2d5263a --- /dev/null +++ b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/types.ts @@ -0,0 +1,130 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { ActionConnector } from '../../../types'; + +export interface EmailActionParams { + to: string[]; + cc: string[]; + bcc: string[]; + subject: string; + message: string; +} + +export enum EventActionOptions { + TRIGGER = 'trigger', + RESOLVE = 'resolve', + ACKNOWLEDGE = 'acknowledge', +} + +export enum SeverityActionOptions { + CRITICAL = 'critical', + ERROR = 'error', + WARNING = 'warning', + INFO = 'info', +} + +export interface PagerDutyActionParams { + eventAction?: EventActionOptions; + dedupKey?: string; + summary?: string; + source?: string; + severity?: SeverityActionOptions; + timestamp?: string; + component?: string; + group?: string; + class?: string; +} + +export interface IndexActionParams { + index?: string; + refresh?: boolean; + executionTimeField?: string; + documents: string[]; +} + +export enum ServerLogLevelOptions { + TRACE = 'trace', + DEBUG = 'debug', + INFO = 'info', + WARN = 'warn', + ERROR = 'error', + FATAL = 'fatal', +} + +export interface ServerLogActionParams { + level?: ServerLogLevelOptions; + message: string; +} + +export interface SlackActionParams { + message: string; +} + +export interface WebhookActionParams { + body?: string; +} + +interface EmailConfig { + from: string; + host: string; + port: number; + secure?: boolean; +} + +interface EmailSecrets { + user: string; + password: string; +} + +export interface EmailActionConnector extends ActionConnector { + config: EmailConfig; + secrets: EmailSecrets; +} + +interface EsIndexConfig { + index?: string; +} + +export interface EsIndexActionConnector extends ActionConnector { + config: EsIndexConfig; +} + +interface PagerDutyConfig { + apiUrl?: string; +} + +interface PagerDutySecrets { + routingKey: string; +} + +export interface PagerDutyActionConnector extends ActionConnector { + config: PagerDutyConfig; + secrets: PagerDutySecrets; +} + +interface SlackSecrets { + webhookUrl: string; +} + +export interface SlackActionConnector extends ActionConnector { + secrets: SlackSecrets; +} + +interface WebhookConfig { + method: string; + url: string; + headers: Record; +} + +interface WebhookSecrets { + user: string; + password: string; +} + +export interface WebhookActionConnector extends ActionConnector { + config: WebhookConfig; + secrets: WebhookSecrets; +} diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/webhook.test.tsx b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/webhook.test.tsx index cd342f2e19969..5e6c0404db532 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/webhook.test.tsx +++ b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/webhook.test.tsx @@ -3,11 +3,12 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import React from 'react'; +import React, { FunctionComponent } from 'react'; import { mountWithIntl } from 'test_utils/enzyme_helpers'; import { TypeRegistry } from '../../type_registry'; import { registerBuiltInActionTypes } from './index'; -import { ActionTypeModel, ActionConnector } from '../../../types'; +import { ActionTypeModel, ActionParamsProps } from '../../../types'; +import { WebhookActionParams, WebhookActionConnector } from './types'; const ACTION_TYPE_ID = '.webhook'; let actionTypeModel: ActionTypeModel; @@ -41,9 +42,9 @@ describe('webhook connector validation', () => { config: { method: 'PUT', url: 'http:\\test', - headers: ['content-type: text'], + headers: { 'content-type': 'text' }, }, - } as ActionConnector; + } as WebhookActionConnector; expect(actionTypeModel.validateConnector(actionConnector)).toEqual({ errors: { @@ -66,7 +67,7 @@ describe('webhook connector validation', () => { config: { method: 'PUT', }, - } as ActionConnector; + } as WebhookActionConnector; expect(actionTypeModel.validateConnector(actionConnector)).toEqual({ errors: { @@ -109,9 +110,9 @@ describe('WebhookActionConnectorFields renders', () => { config: { method: 'PUT', url: 'http:\\test', - headers: ['content-type: text'], + headers: { 'content-type': 'text' }, }, - } as ActionConnector; + } as WebhookActionConnector; const wrapper = mountWithIntl( { if (!actionTypeModel.actionParamsFields) { return; } - const ParamsFields = actionTypeModel.actionParamsFields; + const ParamsFields = actionTypeModel.actionParamsFields as FunctionComponent< + ActionParamsProps + >; const actionParams = { body: 'test message', }; const wrapper = mountWithIntl( {}} index={0} - hasErrors={false} /> ); expect(wrapper.find('[data-test-subj="webhookBodyEditor"]').length > 0).toBeTruthy(); diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/webhook.tsx b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/webhook.tsx index 70a9a6f3d75b3..3000191218932 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/webhook.tsx +++ b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/webhook.tsx @@ -27,10 +27,10 @@ import { i18n } from '@kbn/i18n'; import { ActionTypeModel, ActionConnectorFieldsProps, - ActionConnector, ValidationResult, ActionParamsProps, } from '../../../types'; +import { WebhookActionParams, WebhookActionConnector } from './types'; const HTTP_VERBS = ['post', 'put']; @@ -44,7 +44,7 @@ export function getActionType(): ActionTypeModel { defaultMessage: 'Send a request to a web service.', } ), - validateConnector: (action: ActionConnector): ValidationResult => { + validateConnector: (action: WebhookActionConnector): ValidationResult => { const validationResult = { errors: {} }; const errors = { url: new Array(), @@ -95,13 +95,13 @@ export function getActionType(): ActionTypeModel { } return validationResult; }, - validateParams: (actionParams: any): ValidationResult => { + validateParams: (actionParams: WebhookActionParams): ValidationResult => { const validationResult = { errors: {} }; const errors = { body: new Array(), }; validationResult.errors = errors; - if (!actionParams.body || actionParams.body.length === 0) { + if (!actionParams.body?.length) { errors.body.push( i18n.translate( 'xpack.triggersActionsUI.components.builtinActionTypes.error.requiredWebhookBodyText', @@ -118,12 +118,9 @@ export function getActionType(): ActionTypeModel { }; } -const WebhookActionConnectorFields: React.FunctionComponent = ({ - action, - editActionConfig, - editActionSecrets, - errors, -}) => { +const WebhookActionConnectorFields: React.FunctionComponent> = ({ action, editActionConfig, editActionSecrets, errors }) => { const [httpHeaderKey, setHttpHeaderKey] = useState(''); const [httpHeaderValue, setHttpHeaderValue] = useState(''); const [hasHeaders, setHasHeaders] = useState(false); @@ -453,14 +450,13 @@ const WebhookActionConnectorFields: React.FunctionComponent = ({ - action, +const WebhookParamsFields: React.FunctionComponent> = ({ + actionParams, editAction, index, errors, - hasErrors, }) => { - const { body } = action; + const { body } = actionParams; return ( @@ -472,13 +468,13 @@ const WebhookParamsFields: React.FunctionComponent = ({ defaultMessage: 'Body', } )} - isInvalid={hasErrors === true} + isInvalid={errors.body.length > 0 && body !== undefined} fullWidth error={errors.body} > 0 && body !== undefined} mode="json" width="100%" height="200px" diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_alert_types/index.ts b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_alert_types/index.ts index 6c5d440e47888..436a034e06051 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_alert_types/index.ts +++ b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_alert_types/index.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { getActionType as getThresholdAlertType } from './threshold/expression'; +import { getAlertType as getThresholdAlertType } from './threshold'; import { TypeRegistry } from '../../type_registry'; import { AlertTypeModel } from '../../../types'; diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_alert_types/threshold/expression.tsx b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_alert_types/threshold/expression.tsx index 907a61677b263..73e2e9cbf9b76 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_alert_types/threshold/expression.tsx +++ b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_alert_types/threshold/expression.tsx @@ -22,7 +22,7 @@ import { EuiFormRow, EuiCallOut, } from '@elastic/eui'; -import { AlertTypeModel, Alert, ValidationResult } from '../../../../types'; +import { Alert } from '../../../../types'; import { Comparator, AggregationType, GroupByType } from './types'; import { AGGREGATION_TYPES, COMPARATORS } from './constants'; import { @@ -58,99 +58,6 @@ const expressionFieldsWithValidation = [ 'timeWindowSize', ]; -const validateAlertType = (alert: Alert): ValidationResult => { - const { - index, - timeField, - aggType, - aggField, - groupBy, - termSize, - termField, - threshold, - timeWindowSize, - } = alert.params; - const validationResult = { errors: {} }; - const errors = { - aggField: new Array(), - termSize: new Array(), - termField: new Array(), - timeWindowSize: new Array(), - threshold0: new Array(), - threshold1: new Array(), - index: new Array(), - timeField: new Array(), - }; - validationResult.errors = errors; - if (!index) { - errors.index.push( - i18n.translate('xpack.triggersActionsUI.sections.addAlert.error.requiredIndexText', { - defaultMessage: 'Index is required.', - }) - ); - } - if (!timeField) { - errors.timeField.push( - i18n.translate('xpack.triggersActionsUI.sections.addAlert.error.requiredTimeFieldText', { - defaultMessage: 'Time field is required.', - }) - ); - } - if (aggType && aggregationTypes[aggType].fieldRequired && !aggField) { - errors.aggField.push( - i18n.translate('xpack.triggersActionsUI.sections.addAlert.error.requiredAggFieldText', { - defaultMessage: 'Aggregation field is required.', - }) - ); - } - if (!termSize) { - errors.termSize.push( - i18n.translate('xpack.triggersActionsUI.sections.addAlert.error.requiredTermSizedText', { - defaultMessage: 'Term size is required.', - }) - ); - } - if (groupBy && groupByTypes[groupBy].sizeRequired && !termField) { - errors.termField.push( - i18n.translate('xpack.triggersActionsUI.sections.addAlert.error.requiredtTermFieldText', { - defaultMessage: 'Term field is required.', - }) - ); - } - if (!timeWindowSize) { - errors.timeWindowSize.push( - i18n.translate('xpack.triggersActionsUI.sections.addAlert.error.requiredTimeWindowSizeText', { - defaultMessage: 'Time window size is required.', - }) - ); - } - if (threshold && threshold.length > 0 && !threshold[0]) { - errors.threshold0.push( - i18n.translate('xpack.triggersActionsUI.sections.addAlert.error.requiredThreshold0Text', { - defaultMessage: 'Threshold0, is required.', - }) - ); - } - if (threshold && threshold.length > 1 && !threshold[1]) { - errors.threshold1.push( - i18n.translate('xpack.triggersActionsUI.sections.addAlert.error.requiredThreshold1Text', { - defaultMessage: 'Threshold1 is required.', - }) - ); - } - return validationResult; -}; - -export function getActionType(): AlertTypeModel { - return { - id: 'threshold', - name: 'Index Threshold', - iconClass: 'alert', - alertParamsExpression: IndexThresholdAlertTypeExpression, - validate: validateAlertType, - }; -} - export const aggregationTypes: { [key: string]: AggregationType } = { count: { text: 'count()', @@ -275,7 +182,6 @@ export const IndexThresholdAlertTypeExpression: React.FunctionComponent = setAlertParams, setAlertProperty, errors, - hasErrors, }) => { const { http } = useAppDependencies(); @@ -307,7 +213,7 @@ export const IndexThresholdAlertTypeExpression: React.FunctionComponent = const [indexPopoverOpen, setIndexPopoverOpen] = useState(false); const [indexPatterns, setIndexPatterns] = useState([]); const [esFields, setEsFields] = useState>([]); - const [indexOptions, setIndexOptions] = useState([]); + const [indexOptions, setIndexOptions] = useState([]); const [timeFieldOptions, setTimeFieldOptions] = useState([firstFieldOption]); const [isIndiciesLoading, setIsIndiciesLoading] = useState(false); const [alertThresholdPopoverOpen, setAlertThresholdPopoverOpen] = useState(false); @@ -323,6 +229,13 @@ export const IndexThresholdAlertTypeExpression: React.FunctionComponent = ); const hasExpressionErrors = !!Object.keys(errors).find( + errorKey => + expressionFieldsWithValidation.includes(errorKey) && + errors[errorKey].length >= 1 && + alert.params[errorKey] !== undefined + ); + + const canShowVizualization = !!Object.keys(errors).find( errorKey => expressionFieldsWithValidation.includes(errorKey) && errors[errorKey].length >= 1 ); @@ -433,7 +346,7 @@ export const IndexThresholdAlertTypeExpression: React.FunctionComponent = defaultMessage="Indices to query" /> } - isInvalid={hasErrors && index !== undefined} + isInvalid={errors.index.length > 0 && index !== undefined} error={errors.index} helpText={ = fullWidth async isLoading={isIndiciesLoading} - isInvalid={hasErrors && index !== undefined} + isInvalid={errors.index.length > 0 && index !== undefined} noSuggestions={!indexOptions.length} options={indexOptions} data-test-subj="thresholdIndexesComboBox" @@ -466,8 +379,6 @@ export const IndexThresholdAlertTypeExpression: React.FunctionComponent = // reset time field and expression fields if indices are deleted if (indices.length === 0) { setTimeFieldOptions([firstFieldOption]); - setAlertParams('timeFields', []); - setDefaultExpressionValues(); return; } @@ -475,7 +386,6 @@ export const IndexThresholdAlertTypeExpression: React.FunctionComponent = const timeFields = getTimeFieldOptions(currentEsFields as any); setEsFields(currentEsFields); - setAlertParams('timeFields', timeFields); setTimeFieldOptions([firstFieldOption, ...timeFields]); }} onSearchChange={async search => { @@ -493,7 +403,7 @@ export const IndexThresholdAlertTypeExpression: React.FunctionComponent = = defaultMessage="Time field" /> } - isInvalid={hasErrors && timeField !== undefined} + isInvalid={errors.timeField.length > 0 && timeField !== undefined} error={errors.timeField} > 0 && timeField !== undefined} fullWidth - name="watchTimeField" - data-test-subj="watchTimeFieldSelect" + name="thresholdTimeField" + data-test-subj="thresholdAlertTimeFieldSelect" value={timeField} onChange={e => { setAlertParams('timeField', e.target.value); @@ -542,6 +452,7 @@ export const IndexThresholdAlertTypeExpression: React.FunctionComponent = id="indexPopover" button={ = 0 && aggField !== undefined} error={errors.aggField} > 0 && aggField !== undefined} placeholder={firstFieldOption.text} options={esFields.reduce((esFieldOptions: any[], field: any) => { if ( @@ -777,9 +688,9 @@ export const IndexThresholdAlertTypeExpression: React.FunctionComponent = {groupByTypes[groupBy || DEFAULT_VALUES.GROUP_BY].sizeRequired ? ( - + 0} error={errors.termSize}> 0} value={termSize || 0} onChange={e => { const { value } = e.target; @@ -792,12 +703,12 @@ export const IndexThresholdAlertTypeExpression: React.FunctionComponent = 0 && termField !== undefined} error={errors.termField} > 0 && termField !== undefined} onChange={e => { setAlertParams('termField', e.target.value); }} @@ -896,14 +807,17 @@ export const IndexThresholdAlertTypeExpression: React.FunctionComponent = className="alertThresholdWatchInBetweenComparatorText" > {andThresholdText} - {hasErrors && } + {errors[`threshold${i}`].length > 0 && } ) : null} - + 0} + error={errors[`threshold${i}`]} + > 0} value={!threshold || threshold[i] === null ? 0 : threshold[i]} min={0} step={0.1} @@ -963,9 +877,12 @@ export const IndexThresholdAlertTypeExpression: React.FunctionComponent = - + 0} + error={errors.timeWindowSize} + > 0} min={1} value={timeWindowSize ? parseInt(timeWindowSize, 10) : 1} onChange={e => { @@ -990,7 +907,7 @@ export const IndexThresholdAlertTypeExpression: React.FunctionComponent = - {hasExpressionErrors ? null : ( + {canShowVizualization ? null : ( diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_alert_types/threshold/index.ts b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_alert_types/threshold/index.ts new file mode 100644 index 0000000000000..a0a5b05d49680 --- /dev/null +++ b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_alert_types/threshold/index.ts @@ -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; + * you may not use this file except in compliance with the Elastic License. + */ +import { i18n } from '@kbn/i18n'; +import { Alert, AlertTypeModel, ValidationResult } from '../../../../types'; +import { IndexThresholdAlertTypeExpression, aggregationTypes, groupByTypes } from './expression'; + +export function getAlertType(): AlertTypeModel { + return { + id: 'threshold', + name: 'Index Threshold', + iconClass: 'alert', + alertParamsExpression: IndexThresholdAlertTypeExpression, + validate: (alert: Alert): ValidationResult => { + const { + index, + timeField, + aggType, + aggField, + groupBy, + termSize, + termField, + threshold, + timeWindowSize, + } = alert.params; + const validationResult = { errors: {} }; + const errors = { + aggField: new Array(), + termSize: new Array(), + termField: new Array(), + timeWindowSize: new Array(), + threshold0: new Array(), + threshold1: new Array(), + index: new Array(), + timeField: new Array(), + }; + validationResult.errors = errors; + if (!index || index.length === 0) { + errors.index.push( + i18n.translate('xpack.triggersActionsUI.sections.addAlert.error.requiredIndexText', { + defaultMessage: 'Index is required.', + }) + ); + } + if (!timeField) { + errors.timeField.push( + i18n.translate('xpack.triggersActionsUI.sections.addAlert.error.requiredTimeFieldText', { + defaultMessage: 'Time field is required.', + }) + ); + } + if (aggType && aggregationTypes[aggType].fieldRequired && !aggField) { + errors.aggField.push( + i18n.translate('xpack.triggersActionsUI.sections.addAlert.error.requiredAggFieldText', { + defaultMessage: 'Aggregation field is required.', + }) + ); + } + if (!termSize) { + errors.termSize.push( + i18n.translate('xpack.triggersActionsUI.sections.addAlert.error.requiredTermSizedText', { + defaultMessage: 'Term size is required.', + }) + ); + } + if (groupBy && groupByTypes[groupBy].sizeRequired && !termField) { + errors.termField.push( + i18n.translate('xpack.triggersActionsUI.sections.addAlert.error.requiredtTermFieldText', { + defaultMessage: 'Term field is required.', + }) + ); + } + if (!timeWindowSize) { + errors.timeWindowSize.push( + i18n.translate( + 'xpack.triggersActionsUI.sections.addAlert.error.requiredTimeWindowSizeText', + { + defaultMessage: 'Time window size is required.', + } + ) + ); + } + if (threshold && threshold.length > 0 && !threshold[0]) { + errors.threshold0.push( + i18n.translate('xpack.triggersActionsUI.sections.addAlert.error.requiredThreshold0Text', { + defaultMessage: 'Threshold0, is required.', + }) + ); + } + if (threshold && threshold.length > 1 && !threshold[1]) { + errors.threshold1.push( + i18n.translate('xpack.triggersActionsUI.sections.addAlert.error.requiredThreshold1Text', { + defaultMessage: 'Threshold1 is required.', + }) + ); + } + return validationResult; + }, + defaultActionMessage: 'Alert [{{ctx.metadata.name}}] has exceeded the threshold', + }; +} diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_alert_types/threshold/visualization.tsx b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_alert_types/threshold/visualization.tsx index 9ba79bba8fef6..f91c3cf9a7708 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_alert_types/threshold/visualization.tsx +++ b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_alert_types/threshold/visualization.tsx @@ -280,17 +280,18 @@ export const ThresholdVisualization: React.FunctionComponent = ({ alert } ) : ( } color="warning" > )} diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/constants/action_groups.ts b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/constants/action_groups.ts deleted file mode 100644 index 83a03010d55ad..0000000000000 --- a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/constants/action_groups.ts +++ /dev/null @@ -1,11 +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; - * you may not use this file except in compliance with the Elastic License. - */ - -export enum ACTION_GROUPS { - ALERT = 'alert', - WARNING = 'warning', - UNACKNOWLEDGED = 'unacknowledged', -} diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/context/alerts_context.tsx b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/context/alerts_context.tsx index 06be1bb7c5851..e019319d843a8 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/context/alerts_context.tsx +++ b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/context/alerts_context.tsx @@ -7,8 +7,9 @@ import React, { useContext, createContext } from 'react'; export interface AlertsContextValue { - alertFlyoutVisible: boolean; - setAlertFlyoutVisibility: React.Dispatch>; + addFlyoutVisible: boolean; + setAddFlyoutVisibility: React.Dispatch>; + reloadAlerts: () => Promise; } const AlertsContext = createContext(null as any); diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/lib/alert_api.test.ts b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/lib/alert_api.test.ts index 35d1a095188de..9e64fd86f9873 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/lib/alert_api.test.ts +++ b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/lib/alert_api.test.ts @@ -35,6 +35,8 @@ describe('loadAlertTypes', () => { { id: 'test', name: 'Test', + actionVariables: ['var1'], + actionGroups: ['default'], }, ]; http.get.mockResolvedValueOnce(resolvedValue); @@ -300,6 +302,7 @@ describe('createAlert', () => { test('should call create alert API', async () => { const alertToCreate = { name: 'test', + consumer: 'alerting', tags: ['foo'], enabled: true, alertTypeId: 'test', @@ -309,7 +312,6 @@ describe('createAlert', () => { actions: [], params: {}, throttle: null, - consumer: '', createdAt: new Date('1970-01-01T00:00:00.000Z'), updatedAt: new Date('1970-01-01T00:00:00.000Z'), apiKey: null, @@ -331,7 +333,7 @@ describe('createAlert', () => { Array [ "/api/alert", Object { - "body": "{\\"name\\":\\"test\\",\\"tags\\":[\\"foo\\"],\\"enabled\\":true,\\"alertTypeId\\":\\"test\\",\\"schedule\\":{\\"interval\\":\\"1m\\"},\\"actions\\":[],\\"params\\":{},\\"throttle\\":null,\\"consumer\\":\\"\\",\\"createdAt\\":\\"1970-01-01T00:00:00.000Z\\",\\"updatedAt\\":\\"1970-01-01T00:00:00.000Z\\",\\"apiKey\\":null,\\"apiKeyOwner\\":null}", + "body": "{\\"name\\":\\"test\\",\\"consumer\\":\\"alerting\\",\\"tags\\":[\\"foo\\"],\\"enabled\\":true,\\"alertTypeId\\":\\"test\\",\\"schedule\\":{\\"interval\\":\\"1m\\"},\\"actions\\":[],\\"params\\":{},\\"throttle\\":null,\\"createdAt\\":\\"1970-01-01T00:00:00.000Z\\",\\"updatedAt\\":\\"1970-01-01T00:00:00.000Z\\",\\"apiKey\\":null,\\"apiKeyOwner\\":null}", }, ] `); @@ -342,6 +344,7 @@ describe('updateAlert', () => { test('should call alert update API', async () => { const alertToUpdate = { throttle: '1m', + consumer: 'alerting', name: 'test', tags: ['foo'], schedule: { @@ -349,7 +352,6 @@ describe('updateAlert', () => { }, params: {}, actions: [], - consumer: '', createdAt: new Date('1970-01-01T00:00:00.000Z'), updatedAt: new Date('1970-01-01T00:00:00.000Z'), apiKey: null, @@ -373,7 +375,7 @@ describe('updateAlert', () => { Array [ "/api/alert/123", Object { - "body": "{\\"throttle\\":\\"1m\\",\\"name\\":\\"test\\",\\"tags\\":[\\"foo\\"],\\"schedule\\":{\\"interval\\":\\"1m\\"},\\"params\\":{},\\"actions\\":[],\\"consumer\\":\\"\\",\\"createdAt\\":\\"1970-01-01T00:00:00.000Z\\",\\"updatedAt\\":\\"1970-01-01T00:00:00.000Z\\",\\"apiKey\\":null,\\"apiKeyOwner\\":null}", + "body": "{\\"throttle\\":\\"1m\\",\\"consumer\\":\\"alerting\\",\\"name\\":\\"test\\",\\"tags\\":[\\"foo\\"],\\"schedule\\":{\\"interval\\":\\"1m\\"},\\"params\\":{},\\"actions\\":[],\\"createdAt\\":\\"1970-01-01T00:00:00.000Z\\",\\"updatedAt\\":\\"1970-01-01T00:00:00.000Z\\",\\"apiKey\\":null,\\"apiKeyOwner\\":null}", }, ] `); diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/_index.scss b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/_index.scss new file mode 100644 index 0000000000000..f8fa882cd617d --- /dev/null +++ b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/_index.scss @@ -0,0 +1,3 @@ +.actConnectorModal { + z-index: 9000; +} diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/action_connector_form.test.tsx b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/action_connector_form.test.tsx index f27f7d8c3054d..7bccf7a4328b6 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/action_connector_form.test.tsx +++ b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/action_connector_form.test.tsx @@ -6,9 +6,6 @@ import * as React from 'react'; import { mountWithIntl } from 'test_utils/enzyme_helpers'; import { coreMock } from '../../../../../../../../../src/core/public/mocks'; -import { ReactWrapper } from 'enzyme'; -import { act } from 'react-dom/test-utils'; -import { ActionsConnectorsContextProvider } from '../../context/actions_connectors_context'; import { actionTypeRegistryMock } from '../../action_type_registry.mock'; import { ValidationResult, ActionConnector } from '../../../types'; import { ActionConnectorForm } from './action_connector_form'; @@ -16,8 +13,7 @@ import { AppContextProvider } from '../../app_context'; const actionTypeRegistry = actionTypeRegistryMock.create(); describe('action_connector_form', () => { - let wrapper: ReactWrapper; - + let deps: any; beforeAll(async () => { const mockes = coreMock.createSetup(); const [ @@ -27,7 +23,7 @@ describe('action_connector_form', () => { application: { capabilities }, }, ] = await mockes.getStartServices(); - const deps = { + deps = { chrome, docLinks, toastNotifications: mockes.notifications.toasts, @@ -48,7 +44,9 @@ describe('action_connector_form', () => { actionTypeRegistry: actionTypeRegistry as any, alertTypeRegistry: {} as any, }; + }); + it('renders action_connector_form', () => { const actionType = { id: 'my-action-type', iconClass: 'test', @@ -71,50 +69,19 @@ describe('action_connector_form', () => { config: {}, secrets: {}, } as ActionConnector; - - await act(async () => { - wrapper = mountWithIntl( - - {}, - editFlyoutVisible: false, - setEditFlyoutVisibility: () => {}, - actionTypesIndex: { - 'my-action-type': { - id: 'my-action-type', - name: 'my-action-type-name', - enabled: true, - }, - }, - reloadConnectors: () => { - return new Promise(() => {}); - }, - }} - > - {}} - /> - - - ); - }); - - await waitForRender(wrapper); - }); - - it('renders action_connector_form', () => { + const wrapper = mountWithIntl( + + {}} + serverError={null} + errors={{ name: [] }} + /> + + ); const connectorNameField = wrapper.find('[data-test-subj="nameInput"]'); expect(connectorNameField.exists()).toBeTruthy(); expect(connectorNameField.first().prop('value')).toBe(''); }); }); - -async function waitForRender(wrapper: ReactWrapper) { - await Promise.resolve(); - await Promise.resolve(); - wrapper.update(); -} diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/action_connector_form.tsx b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/action_connector_form.tsx index 852e713b38ed7..c29064efcde35 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/action_connector_form.tsx +++ b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/action_connector_form.tsx @@ -3,49 +3,59 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import React, { Fragment, useState, useReducer } from 'react'; +import React, { Fragment } from 'react'; import { - EuiButton, - EuiFlexGroup, - EuiFlexItem, EuiForm, EuiCallOut, EuiLink, EuiText, EuiSpacer, - EuiButtonEmpty, - EuiFlyoutFooter, EuiFieldText, - EuiFlyoutBody, EuiFormRow, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; -import { createActionConnector, updateActionConnector } from '../../lib/action_connector_api'; import { useAppDependencies } from '../../app_context'; -import { connectorReducer } from './connector_reducer'; -import { useActionsConnectorsContext } from '../../context/actions_connectors_context'; +import { ReducerAction } from './connector_reducer'; import { ActionConnector, IErrorObject } from '../../../types'; -import { hasSaveActionsCapability } from '../../lib/capabilities'; + +export function validateBaseProperties(actionObject: ActionConnector) { + const validationResult = { errors: {} }; + const verrors = { + name: new Array(), + }; + validationResult.errors = verrors; + if (!actionObject.name) { + verrors.name.push( + i18n.translate( + 'xpack.triggersActionsUI.sections.actionConnectorForm.error.requiredNameText', + { + defaultMessage: 'Name is required.', + } + ) + ); + } + return validationResult; +} interface ActionConnectorProps { - initialConnector: ActionConnector; + connector: ActionConnector; + dispatch: React.Dispatch; actionTypeName: string; - setFlyoutVisibility: React.Dispatch>; + serverError: { + body: { message: string; error: string }; + } | null; + errors: IErrorObject; } export const ActionConnectorForm = ({ - initialConnector, + connector, + dispatch, actionTypeName, - setFlyoutVisibility, + serverError, + errors, }: ActionConnectorProps) => { - const { http, toastNotifications, capabilities, actionTypeRegistry } = useAppDependencies(); - - const { reloadConnectors } = useActionsConnectorsContext(); - const canSave = hasSaveActionsCapability(capabilities); - - // hooks - const [{ connector }, dispatch] = useReducer(connectorReducer, { connector: initialConnector }); + const { actionTypeRegistry } = useAppDependencies(); const setActionProperty = (key: string, value: any) => { dispatch({ command: { type: 'setProperty' }, payload: { key, value } }); @@ -59,207 +69,86 @@ export const ActionConnectorForm = ({ dispatch({ command: { type: 'setSecretsProperty' }, payload: { key, value } }); }; - const [isSaving, setIsSaving] = useState(false); - const [serverError, setServerError] = useState<{ - body: { message: string; error: string }; - } | null>(null); - - const actionTypeRegistered = actionTypeRegistry.get(initialConnector.actionTypeId); - if (!actionTypeRegistered) return null; - - function validateBaseProperties(actionObject: ActionConnector) { - const validationResult = { errors: {} }; - const errors = { - name: new Array(), - }; - validationResult.errors = errors; - if (!actionObject.name) { - errors.name.push( - i18n.translate( - 'xpack.triggersActionsUI.sections.actionConnectorForm.error.requiredNameText', - { - defaultMessage: 'Name is required.', - } - ) - ); - } - return validationResult; - } + const actionTypeRegistered = actionTypeRegistry.get(connector.actionTypeId); + if (!actionTypeRegistered) + return ( + + + +

+ + + + ), + }} + /> +

+ + + + + ); const FieldsComponent = actionTypeRegistered.actionConnectorFields; - const errors = { - ...actionTypeRegistered.validateConnector(connector).errors, - ...validateBaseProperties(connector).errors, - } as IErrorObject; - const hasErrors = !!Object.keys(errors).find(errorKey => errors[errorKey].length >= 1); - - async function onActionConnectorSave(): Promise { - let message: string; - let savedConnector: ActionConnector | undefined; - let error; - if (connector.id === undefined) { - await createActionConnector({ http, connector }) - .then(res => { - savedConnector = res; - }) - .catch(errorRes => { - error = errorRes; - }); - - message = 'Created'; - } else { - await updateActionConnector({ http, connector, id: connector.id }) - .then(res => { - savedConnector = res; - }) - .catch(errorRes => { - error = errorRes; - }); - message = 'Updated'; - } - if (error) { - return { - error, - }; - } - toastNotifications.addSuccess( - i18n.translate( - 'xpack.triggersActionsUI.sections.actionConnectorForm.updateSuccessNotificationText', - { - defaultMessage: "{message} '{connectorName}'", - values: { - message, - connectorName: savedConnector ? savedConnector.name : '', - }, - } - ) - ); - return savedConnector; - } return ( - - - - + + + } + isInvalid={errors.name.length > 0 && connector.name !== undefined} + error={errors.name} + > + 0 && connector.name !== undefined} + name="name" + placeholder="Untitled" + data-test-subj="nameInput" + value={connector.name || ''} + onChange={e => { + setActionProperty('name', e.target.value); + }} + onBlur={() => { + if (!connector.name) { + setActionProperty('name', ''); } - isInvalid={errors.name.length > 0 && connector.name !== undefined} - error={errors.name} - > - 0 && connector.name !== undefined} - name="name" - placeholder="Untitled" - data-test-subj="nameInput" - value={connector.name || ''} - onChange={e => { - setActionProperty('name', e.target.value); - }} - onBlur={() => { - if (!connector.name) { - setActionProperty('name', ''); - } - }} - /> - - - {FieldsComponent !== null ? ( - - {initialConnector.actionTypeId === null ? ( - - - -

- - - - ), - }} - /> -

-
-
- -
- ) : null} -
- ) : null} -
-
- - - - setFlyoutVisibility(false)}> - {i18n.translate( - 'xpack.triggersActionsUI.sections.actionConnectorForm.cancelButtonLabel', - { - defaultMessage: 'Cancel', - } - )} - - - {canSave ? ( - - { - setIsSaving(true); - const savedAction = await onActionConnectorSave(); - setIsSaving(false); - if (savedAction && savedAction.error) { - return setServerError(savedAction.error); - } - setFlyoutVisibility(false); - reloadConnectors(); - }} - > - - - - ) : null} - - -
+ }} + /> + + + {FieldsComponent !== null ? ( + + ) : null} + ); }; diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/action_type_menu.tsx b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/action_type_menu.tsx index 19373fda79b9e..f89d61acb59ca 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/action_type_menu.tsx +++ b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/action_type_menu.tsx @@ -3,18 +3,8 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import React, { Fragment } from 'react'; -import { - EuiFlexGroup, - EuiFlexItem, - EuiCard, - EuiIcon, - EuiFlexGrid, - EuiFlyoutBody, - EuiFlyoutFooter, - EuiButtonEmpty, -} from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; +import React from 'react'; +import { EuiFlexItem, EuiCard, EuiIcon, EuiFlexGrid } from '@elastic/eui'; import { ActionType } from '../../../types'; import { useActionsConnectorsContext } from '../../context/actions_connectors_context'; import { useAppDependencies } from '../../app_context'; @@ -25,7 +15,7 @@ interface Props { export const ActionTypeMenu = ({ onActionTypeChange }: Props) => { const { actionTypeRegistry } = useAppDependencies(); - const { actionTypesIndex, setAddFlyoutVisibility } = useActionsConnectorsContext(); + const { actionTypesIndex } = useActionsConnectorsContext(); if (!actionTypesIndex) { return null; } @@ -45,7 +35,7 @@ export const ActionTypeMenu = ({ onActionTypeChange }: Props) => { const cardNodes = actionTypes .sort((a, b) => a.name.localeCompare(b.name)) - .map((item, index): any => { + .map((item, index) => { return ( { ); }); - return ( - - - {cardNodes} - - - - - setAddFlyoutVisibility(false)}> - {i18n.translate( - 'xpack.triggersActionsUI.sections.actionConnectorForm.cancelButtonLabel', - { - defaultMessage: 'Cancel', - } - )} - - - - - - ); + return {cardNodes}; }; diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/connector_add_flyout.test.tsx b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/connector_add_flyout.test.tsx index a03296c7c3679..52b9d1c0ed1bb 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/connector_add_flyout.test.tsx +++ b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/connector_add_flyout.test.tsx @@ -6,17 +6,16 @@ import * as React from 'react'; import { mountWithIntl } from 'test_utils/enzyme_helpers'; import { coreMock } from '../../../../../../../../../src/core/public/mocks'; -import { ReactWrapper } from 'enzyme'; -import { act } from 'react-dom/test-utils'; import { ConnectorAddFlyout } from './connector_add_flyout'; import { ActionsConnectorsContextProvider } from '../../context/actions_connectors_context'; import { actionTypeRegistryMock } from '../../action_type_registry.mock'; import { ValidationResult } from '../../../types'; import { AppContextProvider } from '../../app_context'; +import { AppDeps } from '../../app'; const actionTypeRegistry = actionTypeRegistryMock.create(); describe('connector_add_flyout', () => { - let wrapper: ReactWrapper; + let deps: AppDeps | null; beforeAll(async () => { const mockes = coreMock.createSetup(); @@ -27,7 +26,7 @@ describe('connector_add_flyout', () => { application: { capabilities }, }, ] = await mockes.getStartServices(); - const deps = { + deps = { chrome, docLinks, toastNotifications: mockes.notifications.toasts, @@ -48,31 +47,6 @@ describe('connector_add_flyout', () => { actionTypeRegistry: actionTypeRegistry as any, alertTypeRegistry: {} as any, }; - - await act(async () => { - wrapper = mountWithIntl( - - {}, - editFlyoutVisible: false, - setEditFlyoutVisibility: state => {}, - actionTypesIndex: { - 'my-action-type': { id: 'my-action-type', name: 'test', enabled: true }, - }, - reloadConnectors: () => { - return new Promise(() => {}); - }, - }} - > - - - - ); - }); - - await waitForRender(wrapper); }); it('renders action type menu on flyout open', () => { @@ -93,13 +67,27 @@ describe('connector_add_flyout', () => { actionTypeRegistry.get.mockReturnValueOnce(actionType); actionTypeRegistry.has.mockReturnValue(true); + const wrapper = mountWithIntl( + + {}, + editFlyoutVisible: false, + setEditFlyoutVisibility: state => {}, + actionTypesIndex: { + 'my-action-type': { id: 'my-action-type', name: 'test', enabled: true }, + }, + reloadConnectors: () => { + return new Promise(() => {}); + }, + }} + > + + + + ); expect(wrapper.find('ActionTypeMenu')).toHaveLength(1); expect(wrapper.find('[data-test-subj="my-action-type-card"]').exists()).toBeTruthy(); }); }); - -async function waitForRender(wrapper: ReactWrapper) { - await Promise.resolve(); - await Promise.resolve(); - wrapper.update(); -} diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/connector_add_flyout.tsx b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/connector_add_flyout.tsx index a3ec7ab4b3ab9..8a50513f158a1 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/connector_add_flyout.tsx +++ b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/connector_add_flyout.tsx @@ -3,7 +3,7 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import React, { useCallback, useState, Fragment } from 'react'; +import React, { useCallback, useState, Fragment, useReducer } from 'react'; import { FormattedMessage } from '@kbn/i18n/react'; import { EuiTitle, @@ -13,21 +13,57 @@ import { EuiFlexItem, EuiIcon, EuiText, + EuiFlyoutFooter, + EuiButtonEmpty, + EuiButton, + EuiFlyoutBody, } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; import { useActionsConnectorsContext } from '../../context/actions_connectors_context'; import { ActionTypeMenu } from './action_type_menu'; -import { ActionConnectorForm } from './action_connector_form'; -import { ActionType, ActionConnector } from '../../../types'; +import { ActionConnectorForm, validateBaseProperties } from './action_connector_form'; +import { ActionType, ActionConnector, IErrorObject } from '../../../types'; import { useAppDependencies } from '../../app_context'; +import { connectorReducer } from './connector_reducer'; +import { hasSaveActionsCapability } from '../../lib/capabilities'; +import { createActionConnector } from '../../lib/action_connector_api'; export const ConnectorAddFlyout = () => { - const { actionTypeRegistry } = useAppDependencies(); - const { addFlyoutVisible, setAddFlyoutVisibility } = useActionsConnectorsContext(); + let hasErrors = false; + const { http, toastNotifications, capabilities, actionTypeRegistry } = useAppDependencies(); const [actionType, setActionType] = useState(undefined); + + // hooks + const initialConnector = { + actionTypeId: actionType?.id ?? '', + config: {}, + secrets: {}, + } as ActionConnector; + const [{ connector }, dispatch] = useReducer(connectorReducer, { connector: initialConnector }); + const setActionProperty = (key: string, value: any) => { + dispatch({ command: { type: 'setProperty' }, payload: { key, value } }); + }; + const setConnector = (value: any) => { + dispatch({ command: { type: 'setConnector' }, payload: { key: 'connector', value } }); + }; + + const { + addFlyoutVisible, + setAddFlyoutVisibility, + reloadConnectors, + } = useActionsConnectorsContext(); + const [isSaving, setIsSaving] = useState(false); + const closeFlyout = useCallback(() => { setAddFlyoutVisibility(false); setActionType(undefined); - }, [setAddFlyoutVisibility, setActionType]); + setConnector(initialConnector); + }, [setAddFlyoutVisibility, initialConnector]); + + const [serverError, setServerError] = useState<{ + body: { message: string; error: string }; + } | null>(null); + const canSave = hasSaveActionsCapability(capabilities); if (!addFlyoutVisible) { return null; @@ -35,6 +71,7 @@ export const ConnectorAddFlyout = () => { function onActionTypeChange(newActionType: ActionType) { setActionType(newActionType); + setActionProperty('actionTypeId', newActionType.id); } let currentForm; @@ -43,21 +80,45 @@ export const ConnectorAddFlyout = () => { currentForm = ; } else { actionTypeModel = actionTypeRegistry.get(actionType.id); - const initialConnector = { - actionTypeId: actionType.id, - config: {}, - secrets: {}, - } as ActionConnector; + + const errors = { + ...actionTypeModel?.validateConnector(connector).errors, + ...validateBaseProperties(connector).errors, + } as IErrorObject; + hasErrors = !!Object.keys(errors).find(errorKey => errors[errorKey].length >= 1); currentForm = ( ); } + const onActionConnectorSave = async (): Promise => + await createActionConnector({ http, connector }) + .then(savedConnector => { + toastNotifications.addSuccess( + i18n.translate( + 'xpack.triggersActionsUI.sections.addConnectorForm.updateSuccessNotificationText', + { + defaultMessage: "Created '{connectorName}'", + values: { + connectorName: savedConnector.name, + }, + } + ) + ); + return savedConnector; + }) + .catch(errorRes => { + setServerError(errorRes); + return undefined; + }); + return ( @@ -98,7 +159,49 @@ export const ConnectorAddFlyout = () => { - {currentForm} + {currentForm} + + + + + + {i18n.translate( + 'xpack.triggersActionsUI.sections.actionConnectorAdd.cancelButtonLabel', + { + defaultMessage: 'Cancel', + } + )} + + + {canSave && actionTypeModel && actionType ? ( + + { + setIsSaving(true); + const savedAction = await onActionConnectorSave(); + setIsSaving(false); + if (savedAction) { + closeFlyout(); + reloadConnectors(); + } + }} + > + + + + ) : null} + + ); }; diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/connector_add_modal.test.tsx b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/connector_add_modal.test.tsx new file mode 100644 index 0000000000000..cc87b16035ad3 --- /dev/null +++ b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/connector_add_modal.test.tsx @@ -0,0 +1,102 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import * as React from 'react'; +import { mountWithIntl } from 'test_utils/enzyme_helpers'; +import { coreMock } from '../../../../../../../../../src/core/public/mocks'; +import { ConnectorAddModal } from './connector_add_modal'; +import { ActionsConnectorsContextProvider } from '../../context/actions_connectors_context'; +import { actionTypeRegistryMock } from '../../action_type_registry.mock'; +import { ValidationResult } from '../../../types'; +import { AppContextProvider } from '../../app_context'; +import { AppDeps } from '../../app'; +const actionTypeRegistry = actionTypeRegistryMock.create(); + +describe('connector_add_modal', () => { + let deps: AppDeps | null; + + beforeAll(async () => { + const mocks = coreMock.createSetup(); + const [ + { + chrome, + docLinks, + application: { capabilities }, + }, + ] = await mocks.getStartServices(); + deps = { + chrome, + docLinks, + toastNotifications: mocks.notifications.toasts, + injectedMetadata: mocks.injectedMetadata, + http: mocks.http, + uiSettings: mocks.uiSettings, + capabilities: { + ...capabilities, + actions: { + delete: true, + save: true, + show: true, + }, + }, + legacy: { + MANAGEMENT_BREADCRUMB: { set: () => {} } as any, + }, + actionTypeRegistry: actionTypeRegistry as any, + alertTypeRegistry: {} as any, + }; + }); + it('renders connector modal form if addModalVisible is true', () => { + const actionTypeModel = { + id: 'my-action-type', + iconClass: 'test', + selectMessage: 'test', + validateConnector: (): ValidationResult => { + return { errors: {} }; + }, + validateParams: (): ValidationResult => { + const validationResult = { errors: {} }; + return validationResult; + }, + actionConnectorFields: null, + actionParamsFields: null, + }; + actionTypeRegistry.get.mockReturnValueOnce(actionTypeModel); + actionTypeRegistry.has.mockReturnValue(true); + + const actionType = { + id: 'my-action-type', + name: 'test', + enabled: true, + }; + + const wrapper = mountWithIntl( + + {}, + editFlyoutVisible: false, + setEditFlyoutVisibility: state => {}, + actionTypesIndex: { + 'my-action-type': { id: 'my-action-type', name: 'test', enabled: true }, + }, + reloadConnectors: () => { + return new Promise(() => {}); + }, + }} + > + {}} + actionType={actionType} + /> + + + ); + expect(wrapper.find('EuiModalHeader')).toHaveLength(1); + expect(wrapper.find('[data-test-subj="saveActionButtonModal"]').exists()).toBeTruthy(); + }); +}); diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/connector_add_modal.tsx b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/connector_add_modal.tsx new file mode 100644 index 0000000000000..2ce282e946a38 --- /dev/null +++ b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/connector_add_modal.tsx @@ -0,0 +1,168 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import React, { useCallback, useReducer, useState } from 'react'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { EuiTitle, EuiFlexItem, EuiIcon, EuiFlexGroup } from '@elastic/eui'; +import { + EuiModal, + EuiButton, + EuiModalHeader, + EuiModalHeaderTitle, + EuiModalBody, + EuiModalFooter, +} from '@elastic/eui'; +import { EuiButtonEmpty } from '@elastic/eui'; +import { EuiOverlayMask } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { ActionConnectorForm, validateBaseProperties } from './action_connector_form'; +import { ActionType, ActionConnector, IErrorObject } from '../../../types'; +import { connectorReducer } from './connector_reducer'; +import { createActionConnector } from '../../lib/action_connector_api'; +import { useAppDependencies } from '../../app_context'; + +export const ConnectorAddModal = ({ + actionType, + addModalVisible, + setAddModalVisibility, + postSaveEventHandler, +}: { + actionType: ActionType; + addModalVisible: boolean; + setAddModalVisibility: React.Dispatch>; + postSaveEventHandler?: (savedAction: ActionConnector) => void; +}) => { + let hasErrors = false; + const { http, toastNotifications, actionTypeRegistry } = useAppDependencies(); + const initialConnector = { + actionTypeId: actionType.id, + config: {}, + secrets: {}, + } as ActionConnector; + const [isSaving, setIsSaving] = useState(false); + + const [{ connector }, dispatch] = useReducer(connectorReducer, { connector: initialConnector }); + const setConnector = (value: any) => { + dispatch({ command: { type: 'setConnector' }, payload: { key: 'connector', value } }); + }; + const [serverError, setServerError] = useState<{ + body: { message: string; error: string }; + } | null>(null); + + const closeModal = useCallback(() => { + setAddModalVisibility(false); + setConnector(initialConnector); + setServerError(null); + }, [initialConnector, setAddModalVisibility]); + + if (!addModalVisible) { + return null; + } + const actionTypeModel = actionTypeRegistry.get(actionType.id); + const errors = { + ...actionTypeModel?.validateConnector(connector).errors, + ...validateBaseProperties(connector).errors, + } as IErrorObject; + hasErrors = !!Object.keys(errors).find(errorKey => errors[errorKey].length >= 1); + + const onActionConnectorSave = async (): Promise => + await createActionConnector({ http, connector }) + .then(savedConnector => { + toastNotifications.addSuccess( + i18n.translate( + 'xpack.triggersActionsUI.sections.addModalConnectorForm.updateSuccessNotificationText', + { + defaultMessage: "Created '{connectorName}'", + values: { + connectorName: savedConnector.name, + }, + } + ) + ); + return savedConnector; + }) + .catch(errorRes => { + setServerError(errorRes); + return undefined; + }); + + return ( + + + + + + {actionTypeModel && actionTypeModel.iconClass ? ( + + + + ) : null} + + +

+ +

+
+
+
+
+
+ + + + + + + + {i18n.translate( + 'xpack.triggersActionsUI.sections.addModalConnectorForm.cancelButtonLabel', + { + defaultMessage: 'Cancel', + } + )} + + + { + setIsSaving(true); + const savedAction = await onActionConnectorSave(); + setIsSaving(false); + if (savedAction) { + if (postSaveEventHandler) { + postSaveEventHandler(savedAction); + } + closeModal(); + } + }} + > + + + +
+
+ ); +}; diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/connector_edit_flyout.test.tsx b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/connector_edit_flyout.test.tsx index 0dc38523bfab8..9687707d0876a 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/connector_edit_flyout.test.tsx +++ b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/connector_edit_flyout.test.tsx @@ -91,7 +91,7 @@ describe('connector_edit_flyout', () => { }, }} > - + ); diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/connector_edit_flyout.tsx b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/connector_edit_flyout.tsx index 408989609d2ec..9c1f2ddc7f7f6 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/connector_edit_flyout.tsx +++ b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/connector_edit_flyout.tsx @@ -3,7 +3,7 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import React, { useCallback } from 'react'; +import React, { useCallback, useReducer, useState } from 'react'; import { FormattedMessage } from '@kbn/i18n/react'; import { EuiTitle, @@ -12,26 +12,73 @@ import { EuiFlexGroup, EuiFlexItem, EuiIcon, + EuiFlyoutBody, + EuiFlyoutFooter, + EuiButtonEmpty, + EuiButton, } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; import { useActionsConnectorsContext } from '../../context/actions_connectors_context'; -import { ActionConnectorForm } from './action_connector_form'; +import { ActionConnectorForm, validateBaseProperties } from './action_connector_form'; import { useAppDependencies } from '../../app_context'; -import { ActionConnectorTableItem } from '../../../types'; +import { ActionConnectorTableItem, ActionConnector, IErrorObject } from '../../../types'; +import { connectorReducer } from './connector_reducer'; +import { updateActionConnector } from '../../lib/action_connector_api'; +import { hasSaveActionsCapability } from '../../lib/capabilities'; export interface ConnectorEditProps { - connector: ActionConnectorTableItem; + initialConnector: ActionConnectorTableItem; } -export const ConnectorEditFlyout = ({ connector }: ConnectorEditProps) => { - const { actionTypeRegistry } = useAppDependencies(); - const { editFlyoutVisible, setEditFlyoutVisibility } = useActionsConnectorsContext(); +export const ConnectorEditFlyout = ({ initialConnector }: ConnectorEditProps) => { + let hasErrors = false; + const { http, toastNotifications, capabilities, actionTypeRegistry } = useAppDependencies(); + const canSave = hasSaveActionsCapability(capabilities); + const { + editFlyoutVisible, + setEditFlyoutVisibility, + reloadConnectors, + } = useActionsConnectorsContext(); const closeFlyout = useCallback(() => setEditFlyoutVisibility(false), [setEditFlyoutVisibility]); + const [{ connector }, dispatch] = useReducer(connectorReducer, { + connector: { ...initialConnector, secrets: {} }, + }); + const [isSaving, setIsSaving] = useState(false); + const [serverError, setServerError] = useState<{ + body: { message: string; error: string }; + } | null>(null); if (!editFlyoutVisible) { return null; } const actionTypeModel = actionTypeRegistry.get(connector.actionTypeId); + const errors = { + ...actionTypeModel?.validateConnector(connector).errors, + ...validateBaseProperties(connector).errors, + } as IErrorObject; + hasErrors = !!Object.keys(errors).find(errorKey => errors[errorKey].length >= 1); + + const onActionConnectorSave = async (): Promise => + await updateActionConnector({ http, connector, id: connector.id }) + .then(savedConnector => { + toastNotifications.addSuccess( + i18n.translate( + 'xpack.triggersActionsUI.sections.editConnectorForm.updateSuccessNotificationText', + { + defaultMessage: "Updated '{connectorName}'", + values: { + connectorName: savedConnector.name, + }, + } + ) + ); + return savedConnector; + }) + .catch(errorRes => { + setServerError(errorRes); + return undefined; + }); return ( @@ -54,15 +101,56 @@ export const ConnectorEditFlyout = ({ connector }: ConnectorEditProps) => { - + + + + + + + + {i18n.translate( + 'xpack.triggersActionsUI.sections.editConnectorForm.cancelButtonLabel', + { + defaultMessage: 'Cancel', + } + )} + + + {canSave && actionTypeModel ? ( + + { + setIsSaving(true); + const savedAction = await onActionConnectorSave(); + setIsSaving(false); + if (savedAction) { + closeFlyout(); + reloadConnectors(); + } + }} + > + + + + ) : null} + + ); }; diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/connector_reducer.ts b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/connector_reducer.ts index 4a2610f965735..4d094cd869420 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/connector_reducer.ts +++ b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/connector_reducer.ts @@ -6,7 +6,7 @@ import { isEqual } from 'lodash'; interface CommandType { - type: 'setProperty' | 'setConfigProperty' | 'setSecretsProperty'; + type: 'setConnector' | 'setProperty' | 'setConfigProperty' | 'setSecretsProperty'; } export interface ActionState { @@ -26,6 +26,17 @@ export const connectorReducer = (state: ActionState, action: ReducerAction) => { const { connector } = state; switch (command.type) { + case 'setConnector': { + const { key, value } = payload; + if (key === 'connector') { + return { + ...state, + connector: value, + }; + } else { + return state; + } + } case 'setProperty': { const { key, value } = payload; if (isEqual(connector[key], value)) { diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/actions_connectors_list/components/actions_connectors_list.tsx b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/actions_connectors_list/components/actions_connectors_list.tsx index e98c3b2c08749..bed285f668e01 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/actions_connectors_list/components/actions_connectors_list.tsx +++ b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/actions_connectors_list/components/actions_connectors_list.tsx @@ -384,7 +384,12 @@ export const ActionsConnectorsList: React.FunctionComponent = () => { }} > - {editedConnectorItem ? : null} + {editedConnectorItem ? ( + + ) : null} ); diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alert_add/alert_add.test.tsx b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alert_add/alert_add.test.tsx new file mode 100644 index 0000000000000..bf94ffc73b85c --- /dev/null +++ b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alert_add/alert_add.test.tsx @@ -0,0 +1,117 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import * as React from 'react'; +import { mountWithIntl } from 'test_utils/enzyme_helpers'; +import { act } from 'react-dom/test-utils'; +import { coreMock } from '../../../../../../../../../src/core/public/mocks'; +import { AlertAdd } from './alert_add'; +import { actionTypeRegistryMock } from '../../action_type_registry.mock'; +import { ValidationResult } from '../../../types'; +import { AppContextProvider } from '../../app_context'; +import { AppDeps } from '../../app'; +import { AlertsContextProvider } from '../../context/alerts_context'; +import { alertTypeRegistryMock } from '../../alert_type_registry.mock'; +import { ReactWrapper } from 'enzyme'; +const actionTypeRegistry = actionTypeRegistryMock.create(); +const alertTypeRegistry = alertTypeRegistryMock.create(); + +describe('alert_add', () => { + let deps: AppDeps | null; + let wrapper: ReactWrapper; + + beforeAll(async () => { + const mockes = coreMock.createSetup(); + const [ + { + chrome, + docLinks, + application: { capabilities }, + }, + ] = await mockes.getStartServices(); + deps = { + chrome, + docLinks, + toastNotifications: mockes.notifications.toasts, + injectedMetadata: mockes.injectedMetadata, + http: mockes.http, + uiSettings: mockes.uiSettings, + capabilities: { + ...capabilities, + alerting: { + delete: true, + save: true, + show: true, + }, + }, + legacy: { + MANAGEMENT_BREADCRUMB: { set: () => {} } as any, + }, + actionTypeRegistry: actionTypeRegistry as any, + alertTypeRegistry: alertTypeRegistry as any, + }; + const alertType = { + id: 'my-alert-type', + iconClass: 'test', + name: 'test-alert', + validate: (): ValidationResult => { + return { errors: {} }; + }, + alertParamsExpression: () => , + }; + + const actionTypeModel = { + id: 'my-action-type', + iconClass: 'test', + selectMessage: 'test', + validateConnector: (): ValidationResult => { + return { errors: {} }; + }, + validateParams: (): ValidationResult => { + const validationResult = { errors: {} }; + return validationResult; + }, + actionConnectorFields: null, + actionParamsFields: null, + }; + actionTypeRegistry.get.mockReturnValueOnce(actionTypeModel); + actionTypeRegistry.has.mockReturnValue(true); + alertTypeRegistry.list.mockReturnValue([alertType]); + alertTypeRegistry.get.mockReturnValue(alertType); + alertTypeRegistry.has.mockReturnValue(true); + actionTypeRegistry.list.mockReturnValue([actionTypeModel]); + actionTypeRegistry.has.mockReturnValue(true); + + await act(async () => { + wrapper = mountWithIntl( + + {}, + reloadAlerts: () => { + return new Promise(() => {}); + }, + }} + > + + + + ); + }); + await waitForRender(wrapper); + }); + + it('renders alert add flyout', () => { + expect(wrapper.find('[data-test-subj="addAlertFlyoutTitle"]').exists()).toBeTruthy(); + expect(wrapper.find('[data-test-subj="saveAlertButton"]').exists()).toBeTruthy(); + }); +}); + +async function waitForRender(wrapper: ReactWrapper) { + await Promise.resolve(); + await Promise.resolve(); + wrapper.update(); +} diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alert_add/alert_add.tsx b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alert_add/alert_add.tsx index f11b0b948b2a7..d73feff938076 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alert_add/alert_add.tsx +++ b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alert_add/alert_add.tsx @@ -3,584 +3,120 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import React, { Fragment, useState, useCallback, useReducer, useEffect } from 'react'; -import { i18n } from '@kbn/i18n'; +import React, { useCallback, useReducer, useState } from 'react'; import { FormattedMessage } from '@kbn/i18n/react'; import { - EuiButton, + EuiTitle, + EuiFlyoutHeader, + EuiFlyout, + EuiFlyoutFooter, EuiFlexGroup, EuiFlexItem, - EuiIcon, - EuiTitle, - EuiForm, - EuiSpacer, EuiButtonEmpty, - EuiFlyoutFooter, + EuiButton, EuiFlyoutBody, - EuiFlyoutHeader, - EuiFlyout, - EuiFieldText, - EuiFlexGrid, - EuiFormRow, - EuiComboBox, - EuiKeyPadMenuItem, - EuiTabs, - EuiTab, - EuiLink, - EuiFieldNumber, - EuiSelect, - EuiIconTip, EuiPortal, - EuiAccordion, - EuiButtonIcon, } from '@elastic/eui'; -import { useAppDependencies } from '../../app_context'; -import { createAlert } from '../../lib/alert_api'; -import { loadActionTypes, loadAllActions } from '../../lib/action_connector_api'; +import { i18n } from '@kbn/i18n'; import { useAlertsContext } from '../../context/alerts_context'; +import { Alert, AlertAction, IErrorObject } from '../../../types'; +import { AlertForm, validateBaseProperties } from './alert_form'; import { alertReducer } from './alert_reducer'; -import { - AlertTypeModel, - Alert, - IErrorObject, - ActionTypeModel, - AlertAction, - ActionTypeIndex, - ActionConnector, -} from '../../../types'; -import { ACTION_GROUPS } from '../../constants/action_groups'; -import { getTimeOptions } from '../../lib/get_time_options'; -import { SectionLoading } from '../../components/section_loading'; - -interface Props { - refreshList: () => Promise; -} - -function validateBaseProperties(alertObject: Alert) { - const validationResult = { errors: {} }; - const errors = { - name: new Array(), - interval: new Array(), - alertTypeId: new Array(), - actionConnectors: new Array(), - }; - validationResult.errors = errors; - if (!alertObject.name) { - errors.name.push( - i18n.translate('xpack.triggersActionsUI.sections.alertAdd.error.requiredNameText', { - defaultMessage: 'Name is required.', - }) - ); - } - if (!(alertObject.schedule && alertObject.schedule.interval)) { - errors.interval.push( - i18n.translate('xpack.triggersActionsUI.sections.alertAdd.error.requiredIntervalText', { - defaultMessage: 'Check interval is required.', - }) - ); - } - if (!alertObject.alertTypeId) { - errors.alertTypeId.push( - i18n.translate('xpack.triggersActionsUI.sections.alertAdd.error.requiredAlertTypeIdText', { - defaultMessage: 'Alert trigger is required.', - }) - ); - } - return validationResult; -} +import { useAppDependencies } from '../../app_context'; +import { createAlert } from '../../lib/alert_api'; -export const AlertAdd = ({ refreshList }: Props) => { +export const AlertAdd = () => { const { http, toastNotifications, alertTypeRegistry, actionTypeRegistry } = useAppDependencies(); - const initialAlert = { + const initialAlert = ({ params: {}, + consumer: 'alerting', alertTypeId: null, schedule: { interval: '1m', }, actions: [], tags: [], - }; + } as unknown) as Alert; - const { alertFlyoutVisible, setAlertFlyoutVisibility } = useAlertsContext(); - // hooks - const [alertType, setAlertType] = useState(undefined); const [{ alert }, dispatch] = useReducer(alertReducer, { alert: initialAlert }); const [isSaving, setIsSaving] = useState(false); - const [isLoadingActionTypes, setIsLoadingActionTypes] = useState(false); - const [selectedTabId, setSelectedTabId] = useState('alert'); - const [actionTypesIndex, setActionTypesIndex] = useState(undefined); - const [alertInterval, setAlertInterval] = useState(null); - const [alertIntervalUnit, setAlertIntervalUnit] = useState('m'); - const [alertThrottle, setAlertThrottle] = useState(null); - const [alertThrottleUnit, setAlertThrottleUnit] = useState(''); - const [serverError, setServerError] = useState<{ - body: { message: string; error: string }; - } | null>(null); - const [isAddActionPanelOpen, setIsAddActionPanelOpen] = useState(true); - const [connectors, setConnectors] = useState([]); - - useEffect(() => { - (async () => { - try { - setIsLoadingActionTypes(true); - const actionTypes = await loadActionTypes({ http }); - const index: ActionTypeIndex = {}; - for (const actionTypeItem of actionTypes) { - index[actionTypeItem.id] = actionTypeItem; - } - setActionTypesIndex(index); - } catch (e) { - toastNotifications.addDanger({ - title: i18n.translate( - 'xpack.triggersActionsUI.sections.alertAdd.unableToLoadActionTypesMessage', - { defaultMessage: 'Unable to load action types' } - ), - }); - } finally { - setIsLoadingActionTypes(false); - } - })(); - }, [toastNotifications, http]); - - useEffect(() => { - dispatch({ - command: { type: 'setAlert' }, - payload: { - key: 'alert', - value: { - params: {}, - alertTypeId: null, - schedule: { - interval: '1m', - }, - actions: [], - tags: [], - }, - }, - }); - }, [alertFlyoutVisible]); - - useEffect(() => { - loadConnectors(); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [alertFlyoutVisible]); - - const setAlertProperty = (key: string, value: any) => { - dispatch({ command: { type: 'setProperty' }, payload: { key, value } }); - }; - const setAlertParams = (key: string, value: any) => { - dispatch({ command: { type: 'setAlertParams' }, payload: { key, value } }); + const setAlert = (value: any) => { + dispatch({ command: { type: 'setAlert' }, payload: { key: 'alert', value } }); }; - const setActionParamsProperty = (key: string, value: any, index: number) => { - dispatch({ command: { type: 'setAlertActionParams' }, payload: { key, value, index } }); - }; - - const setActionProperty = (key: string, value: any, index: number) => { - dispatch({ command: { type: 'setAlertActionProperty' }, payload: { key, value, index } }); - }; + const { addFlyoutVisible, setAddFlyoutVisibility, reloadAlerts } = useAlertsContext(); const closeFlyout = useCallback(() => { - setAlertFlyoutVisibility(false); - setAlertType(undefined); - setIsAddActionPanelOpen(true); - setSelectedTabId('alert'); + setAddFlyoutVisibility(false); + setAlert(initialAlert); setServerError(null); - }, [setAlertFlyoutVisibility]); - - if (!alertFlyoutVisible) { - return null; - } + }, [initialAlert, setAddFlyoutVisibility]); - const tagsOptions = alert.tags ? alert.tags.map((label: string) => ({ label })) : []; + const [serverError, setServerError] = useState<{ + body: { message: string; error: string }; + } | null>(null); - async function loadConnectors() { - try { - const actionsResponse = await loadAllActions({ http }); - setConnectors(actionsResponse.data); - } catch (e) { - toastNotifications.addDanger({ - title: i18n.translate( - 'xpack.triggersActionsUI.sections.alertAdd.unableToLoadActionsMessage', - { - defaultMessage: 'Unable to load connectors', - } - ), - }); - } + if (!addFlyoutVisible) { + return null; } - const AlertParamsExpressionComponent = alertType ? alertType.alertParamsExpression : null; - + const alertType = alertTypeRegistry.get(alert.alertTypeId); const errors = { ...(alertType ? alertType.validate(alert).errors : []), ...validateBaseProperties(alert).errors, } as IErrorObject; const hasErrors = !!Object.keys(errors).find(errorKey => errors[errorKey].length >= 1); - const actionErrors = alert.actions.reduce((acc: any, alertAction: AlertAction) => { - const actionTypeConnectors = connectors.find(field => field.id === alertAction.id); - if (!actionTypeConnectors) { - return []; - } - const actionType = actionTypeRegistry.get(actionTypeConnectors.actionTypeId); - if (!actionType) { - return []; - } - const actionValidationErrors = actionType.validateParams(alertAction.params); - acc[alertAction.id] = actionValidationErrors; - return acc; - }, {}); - - const hasActionErrors = !!Object.keys(actionErrors).find(actionError => { - return !!Object.keys(actionErrors[actionError]).find((actionErrorKey: string) => { - return actionErrors[actionError][actionErrorKey].length >= 1; - }); - }); - - const tabs = [ - { - id: ACTION_GROUPS.ALERT, - name: i18n.translate('xpack.triggersActionsUI.sections.alertAdd.alertTabText', { - defaultMessage: 'Alert', - }), - }, - { - id: ACTION_GROUPS.WARNING, - name: i18n.translate('xpack.triggersActionsUI.sections.alertAdd.warningTabText', { - defaultMessage: 'Warning', - }), - }, - { - id: ACTION_GROUPS.UNACKNOWLEDGED, - name: i18n.translate('xpack.triggersActionsUI.sections.alertAdd.unacknowledgedTabText', { - defaultMessage: 'If unacknowledged', - }), - disabled: false, + const actionsErrors = alert.actions.reduce( + (acc: Record, alertAction: AlertAction) => { + const actionType = actionTypeRegistry.get(alertAction.actionTypeId); + if (!actionType) { + return { ...acc }; + } + const actionValidationErrors = actionType.validateParams(alertAction.params); + return { ...acc, [alertAction.id]: actionValidationErrors }; }, - ]; + {} + ) as Record; + + const hasActionErrors = !!Object.entries(actionsErrors) + .map(([, actionErrors]) => actionErrors) + .find((actionErrors: { errors: IErrorObject }) => { + return !!Object.keys(actionErrors.errors).find( + errorKey => actionErrors.errors[errorKey].length >= 1 + ); + }); - async function onSaveAlert(): Promise { + async function onSaveAlert(): Promise { try { const newAlert = await createAlert({ http, alert }); toastNotifications.addSuccess( - i18n.translate('xpack.triggersActionsUI.sections.alertAdd.saveSuccessNotificationText', { + i18n.translate('xpack.triggersActionsUI.sections.alertForm.saveSuccessNotificationText', { defaultMessage: "Saved '{alertName}'", values: { - alertName: newAlert.id, + alertName: newAlert.name, }, }) ); return newAlert; - } catch (error) { - return { - error, - }; - } - } - - function addActionType(actionTypeModel: ActionTypeModel) { - setIsAddActionPanelOpen(false); - const actionTypeConnectors = connectors.filter( - field => field.actionTypeId === actionTypeModel.id - ); - if (actionTypeConnectors.length > 0) { - alert.actions.push({ id: actionTypeConnectors[0].id, group: selectedTabId, params: {} }); + } catch (errorRes) { + setServerError(errorRes); + return undefined; } } - const alertTypeNodes = alertTypeRegistry.list().map(function(item, index) { - return ( - { - setAlertProperty('alertTypeId', item.id); - setAlertType(item); - }} - > - - - ); - }); - - const actionTypeNodes = actionTypeRegistry.list().map(function(item, index) { - return ( - addActionType(item)} - > - - - ); - }); - - const alertTabs = tabs.map(function(tab, index): any { - return ( - { - setSelectedTabId(tab.id); - if (!alert.actions.find((action: AlertAction) => action.group === tab.id)) { - setIsAddActionPanelOpen(true); - } else { - setIsAddActionPanelOpen(false); - } - }} - isSelected={tab.id === selectedTabId} - disabled={tab.disabled} - key={index} - > - {tab.name} - - ); - }); - - const alertTypeDetails = ( - - - - -
- -
-
-
- - { - setAlertProperty('alertTypeId', null); - setAlertType(undefined); - }} - > - - - -
- {AlertParamsExpressionComponent ? ( - - ) : null} -
- ); - - const getSelectedOptions = (actionItemId: string) => { - const val = connectors.find(connector => connector.id === actionItemId); - if (!val) { - return []; - } - return [ - { - label: val.name, - value: val.name, - id: actionItemId, - }, - ]; - }; - - const actionsListForGroup = ( - - {alert.actions.map((actionItem: AlertAction, index: number) => { - const actionConnector = connectors.find(field => field.id === actionItem.id); - if (!actionConnector) { - return null; - } - const optionsList = connectors - .filter(field => field.actionTypeId === actionConnector.actionTypeId) - .map(({ name, id }) => ({ - label: name, - key: id, - id, - })); - const actionTypeRegisterd = actionTypeRegistry.get(actionConnector.actionTypeId); - if (actionTypeRegisterd === null || actionItem.group !== selectedTabId) return null; - const ParamsFieldsComponent = actionTypeRegisterd.actionParamsFields; - const actionParamsErrors = - Object.keys(actionErrors).length > 0 ? actionErrors[actionItem.id] : []; - const hasActionParamsErrors = !!Object.keys(actionParamsErrors).find( - errorKey => actionParamsErrors[errorKey].length >= 1 - ); - return ( - - - - - - -
- -
-
-
- - } - extraAction={ - { - const updatedActions = alert.actions.filter( - (item: AlertAction) => item.id !== actionItem.id - ); - setAlertProperty('actions', updatedActions); - }} - /> - } - paddingSize="l" - > - - } - // errorKey="name" - // isShowingErrors={hasErrors} - // errors={errors} - > - { - setActionProperty('id', selectedOptions[0].id, index); - }} - isClearable={false} - /> - - - {ParamsFieldsComponent ? ( - - ) : null} -
- ); - })} - - {!isAddActionPanelOpen ? ( - setIsAddActionPanelOpen(true)} - > - - - ) : null} -
- ); - - let alertTypeArea; - if (alertType) { - alertTypeArea = {alertTypeDetails}; - } else { - alertTypeArea = ( - - -
- -
-
- - - {alertTypeNodes} - -
- ); - } - - const labelForAlertChecked = ( - <> - {' '} - - - ); - - const labelForAlertRenotify = ( - <> - {' '} - - - ); - return ( - +

{ - - - - - } - isInvalid={hasErrors && alert.name !== undefined} - error={errors.name} - > - { - setAlertProperty('name', e.target.value); - }} - onBlur={() => { - if (!alert.name) { - setAlertProperty('name', ''); - } - }} - /> - - - - - { - const newOptions = [...tagsOptions, { label: searchValue }]; - setAlertProperty( - 'tags', - newOptions.map(newOption => newOption.label) - ); - }} - onChange={(selectedOptions: Array<{ label: string }>) => { - setAlertProperty( - 'tags', - selectedOptions.map(selectedOption => selectedOption.label) - ); - }} - onBlur={() => { - if (!alert.tags) { - setAlertProperty('tags', []); - } - }} - /> - - - - - - - - - - { - const interval = - e.target.value !== '' ? parseInt(e.target.value, 10) : null; - setAlertInterval(interval); - setAlertProperty('schedule', { - interval: `${e.target.value}${alertIntervalUnit}`, - }); - }} - /> - - - { - setAlertIntervalUnit(e.target.value); - setAlertProperty('schedule', { - interval: `${alertInterval}${e.target.value}`, - }); - }} - /> - - - - - - - - - { - const throttle = - e.target.value !== '' ? parseInt(e.target.value, 10) : null; - setAlertThrottle(throttle); - setAlertProperty('throttle', `${e.target.value}${alertThrottleUnit}`); - }} - /> - - - { - setAlertThrottleUnit(e.target.value); - setAlertProperty('throttle', `${alertThrottle}${e.target.value}`); - }} - /> - - - - - - - {alertTabs} - - {alertTypeArea} - - {actionsListForGroup} - {isAddActionPanelOpen ? ( - - -
- -
-
- - - {isLoadingActionTypes ? ( - - - - ) : ( - actionTypeNodes - )} - -
- ) : null} -
+
- + {i18n.translate('xpack.triggersActionsUI.sections.alertAdd.cancelButtonLabel', { defaultMessage: 'Cancel', })} @@ -781,7 +141,7 @@ export const AlertAdd = ({ refreshList }: Props) => { { setIsSaving(true); const savedAlert = await onSaveAlert(); setIsSaving(false); - if (savedAlert && savedAlert.error) { - return setServerError(savedAlert.error); + if (savedAlert) { + closeFlyout(); + reloadAlerts(); } - closeFlyout(); - refreshList(); }} > { + let deps: AppDeps | null; + const alertType = { + id: 'my-alert-type', + iconClass: 'test', + name: 'test-alert', + validate: (): ValidationResult => { + return { errors: {} }; + }, + alertParamsExpression: () => , + }; + + const actionType = { + id: 'my-action-type', + iconClass: 'test', + selectMessage: 'test', + validateConnector: (): ValidationResult => { + return { errors: {} }; + }, + validateParams: (): ValidationResult => { + const validationResult = { errors: {} }; + return validationResult; + }, + actionConnectorFields: null, + actionParamsFields: null, + }; + beforeAll(async () => { + const mockes = coreMock.createSetup(); + const [ + { + chrome, + docLinks, + application: { capabilities }, + }, + ] = await mockes.getStartServices(); + deps = { + chrome, + docLinks, + toastNotifications: mockes.notifications.toasts, + injectedMetadata: mockes.injectedMetadata, + http: mockes.http, + uiSettings: mockes.uiSettings, + capabilities: { + ...capabilities, + siem: { + 'alerting:show': true, + 'alerting:save': true, + 'alerting:delete': false, + }, + }, + legacy: { + MANAGEMENT_BREADCRUMB: { set: () => {} } as any, + }, + actionTypeRegistry: actionTypeRegistry as any, + alertTypeRegistry: alertTypeRegistry as any, + }; + }); + + describe('alert_form create alert', () => { + let wrapper: ReactWrapper; + + beforeAll(async () => { + alertTypeRegistry.list.mockReturnValue([alertType]); + alertTypeRegistry.has.mockReturnValue(true); + actionTypeRegistry.list.mockReturnValue([actionType]); + actionTypeRegistry.has.mockReturnValue(true); + + const initialAlert = ({ + name: 'test', + params: {}, + consumer: 'alerting', + schedule: { + interval: '1m', + }, + actions: [], + tags: [], + muteAll: false, + enabled: false, + mutedInstanceIds: [], + } as unknown) as Alert; + + await act(async () => { + wrapper = mountWithIntl( + + {}} + errors={{ name: [] }} + serverError={null} + /> + + ); + }); + + await waitForRender(wrapper); + }); + + it('renders alert name', () => { + const alertNameField = wrapper.find('[data-test-subj="alertNameInput"]'); + expect(alertNameField.exists()).toBeTruthy(); + expect(alertNameField.first().prop('value')).toBe('test'); + }); + + it('renders registered selected alert type', () => { + const alertTypeSelectOptions = wrapper.find('[data-test-subj="my-alert-type-SelectOption"]'); + expect(alertTypeSelectOptions.exists()).toBeTruthy(); + }); + + it('renders registered action types', () => { + const alertTypeSelectOptions = wrapper.find( + '[data-test-subj=".server-log-ActionTypeSelectOption"]' + ); + expect(alertTypeSelectOptions.exists()).toBeFalsy(); + }); + }); + + describe('alert_form edit alert', () => { + let wrapper: ReactWrapper; + + beforeAll(async () => { + alertTypeRegistry.list.mockReturnValue([alertType]); + alertTypeRegistry.get.mockReturnValue(alertType); + alertTypeRegistry.has.mockReturnValue(true); + actionTypeRegistry.list.mockReturnValue([actionType]); + actionTypeRegistry.has.mockReturnValue(true); + + const initialAlert = ({ + name: 'test', + alertTypeId: alertType.id, + params: {}, + consumer: 'alerting', + schedule: { + interval: '1m', + }, + actions: [], + tags: [], + muteAll: false, + enabled: false, + mutedInstanceIds: [], + } as unknown) as Alert; + + await act(async () => { + wrapper = mountWithIntl( + + {}} + errors={{ name: [] }} + serverError={null} + /> + + ); + }); + + await waitForRender(wrapper); + }); + + it('renders alert name', () => { + const alertNameField = wrapper.find('[data-test-subj="alertNameInput"]'); + expect(alertNameField.exists()).toBeTruthy(); + expect(alertNameField.first().prop('value')).toBe('test'); + }); + + it('renders registered selected alert type', () => { + const alertTypeSelectOptions = wrapper.find('[data-test-subj="selectedAlertTypeTitle"]'); + expect(alertTypeSelectOptions.exists()).toBeTruthy(); + }); + + it('renders registered action types', () => { + const actionTypeSelectOptions = wrapper.find( + '[data-test-subj="my-action-type-ActionTypeSelectOption"]' + ); + expect(actionTypeSelectOptions.exists()).toBeTruthy(); + }); + }); + + async function waitForRender(wrapper: ReactWrapper) { + await Promise.resolve(); + await Promise.resolve(); + wrapper.update(); + } +}); diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alert_add/alert_form.tsx b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alert_add/alert_form.tsx new file mode 100644 index 0000000000000..78aca3ec78e66 --- /dev/null +++ b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alert_add/alert_form.tsx @@ -0,0 +1,853 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import React, { Fragment, useState, useEffect } from 'react'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { + EuiButton, + EuiFlexGroup, + EuiFlexItem, + EuiIcon, + EuiTitle, + EuiForm, + EuiSpacer, + EuiFieldText, + EuiFlexGrid, + EuiFormRow, + EuiComboBox, + EuiKeyPadMenuItem, + EuiLink, + EuiFieldNumber, + EuiSelect, + EuiIconTip, + EuiAccordion, + EuiButtonIcon, + EuiEmptyPrompt, + EuiButtonEmpty, +} from '@elastic/eui'; +import { useAppDependencies } from '../../app_context'; +import { loadAlertTypes } from '../../lib/alert_api'; +import { loadActionTypes, loadAllActions } from '../../lib/action_connector_api'; +import { AlertReducerAction } from './alert_reducer'; +import { + AlertTypeModel, + Alert, + IErrorObject, + ActionTypeModel, + AlertAction, + ActionTypeIndex, + ActionConnector, + AlertTypeIndex, +} from '../../../types'; +import { getTimeOptions } from '../../lib/get_time_options'; +import { SectionLoading } from '../../components/section_loading'; +import { ConnectorAddModal } from '../action_connector_form/connector_add_modal'; + +export function validateBaseProperties(alertObject: Alert) { + const validationResult = { errors: {} }; + const errors = { + name: new Array(), + interval: new Array(), + alertTypeId: new Array(), + actionConnectors: new Array(), + }; + validationResult.errors = errors; + if (!alertObject.name) { + errors.name.push( + i18n.translate('xpack.triggersActionsUI.sections.alertForm.error.requiredNameText', { + defaultMessage: 'Name is required.', + }) + ); + } + if (!alertObject.schedule.interval) { + errors.interval.push( + i18n.translate('xpack.triggersActionsUI.sections.alertForm.error.requiredIntervalText', { + defaultMessage: 'Check interval is required.', + }) + ); + } + if (!alertObject.alertTypeId) { + errors.alertTypeId.push( + i18n.translate('xpack.triggersActionsUI.sections.alertForm.error.requiredAlertTypeIdText', { + defaultMessage: 'Alert trigger is required.', + }) + ); + } + return validationResult; +} + +interface AlertFormProps { + alert: Alert; + canChangeTrigger?: boolean; // to hide Change trigger button + dispatch: React.Dispatch; + errors: IErrorObject; + serverError: { + body: { message: string; error: string }; + } | null; +} + +interface ActiveActionConnectorState { + actionTypeId: string; + index: number; +} + +export const AlertForm = ({ + alert, + canChangeTrigger = true, + dispatch, + errors, + serverError, +}: AlertFormProps) => { + const { http, toastNotifications, alertTypeRegistry, actionTypeRegistry } = useAppDependencies(); + const [alertTypeModel, setAlertTypeModel] = useState( + alertTypeRegistry.get(alert.alertTypeId) + ); + + const [addModalVisible, setAddModalVisibility] = useState(false); + const [isLoadingActionTypes, setIsLoadingActionTypes] = useState(false); + const [actionTypesIndex, setActionTypesIndex] = useState(undefined); + const [alertTypesIndex, setAlertTypesIndex] = useState(undefined); + const [alertInterval, setAlertInterval] = useState(null); + const [alertIntervalUnit, setAlertIntervalUnit] = useState('m'); + const [alertThrottle, setAlertThrottle] = useState(null); + const [alertThrottleUnit, setAlertThrottleUnit] = useState('m'); + const [isAddActionPanelOpen, setIsAddActionPanelOpen] = useState(true); + const [connectors, setConnectors] = useState([]); + const [defaultActionGroup, setDefaultActionGroup] = useState(undefined); + const [activeActionItem, setActiveActionItem] = useState( + undefined + ); + + // load action types + useEffect(() => { + (async () => { + try { + setIsLoadingActionTypes(true); + const actionTypes = await loadActionTypes({ http }); + const index: ActionTypeIndex = {}; + for (const actionTypeItem of actionTypes) { + index[actionTypeItem.id] = actionTypeItem; + } + setActionTypesIndex(index); + } catch (e) { + toastNotifications.addDanger({ + title: i18n.translate( + 'xpack.triggersActionsUI.sections.alertForm.unableToLoadActionTypesMessage', + { defaultMessage: 'Unable to load action types' } + ), + }); + } finally { + setIsLoadingActionTypes(false); + } + })(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + // load alert types + useEffect(() => { + (async () => { + try { + const alertTypes = await loadAlertTypes({ http }); + // temp hack of API result + alertTypes.push({ + id: 'threshold', + actionGroups: ['Alert', 'Warning', 'If unacknowledged'], + name: 'threshold', + actionVariables: ['ctx.metadata.name', 'ctx.metadata.test'], + }); + const index: AlertTypeIndex = {}; + for (const alertTypeItem of alertTypes) { + index[alertTypeItem.id] = alertTypeItem; + } + setAlertTypesIndex(index); + } catch (e) { + toastNotifications.addDanger({ + title: i18n.translate( + 'xpack.triggersActionsUI.sections.alertForm.unableToLoadAlertTypesMessage', + { defaultMessage: 'Unable to load alert types' } + ), + }); + } + })(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + useEffect(() => { + loadConnectors(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + const setAlertProperty = (key: string, value: any) => { + dispatch({ command: { type: 'setProperty' }, payload: { key, value } }); + }; + + const setAlertParams = (key: string, value: any) => { + dispatch({ command: { type: 'setAlertParams' }, payload: { key, value } }); + }; + + const setScheduleProperty = (key: string, value: any) => { + dispatch({ command: { type: 'setScheduleProperty' }, payload: { key, value } }); + }; + + const setActionParamsProperty = (key: string, value: any, index: number) => { + dispatch({ command: { type: 'setAlertActionParams' }, payload: { key, value, index } }); + }; + + const setActionProperty = (key: string, value: any, index: number) => { + dispatch({ command: { type: 'setAlertActionProperty' }, payload: { key, value, index } }); + }; + + const tagsOptions = alert.tags ? alert.tags.map((label: string) => ({ label })) : []; + + async function loadConnectors() { + try { + const actionsResponse = await loadAllActions({ http }); + setConnectors(actionsResponse.data); + } catch (e) { + toastNotifications.addDanger({ + title: i18n.translate( + 'xpack.triggersActionsUI.sections.alertForm.unableToLoadActionsMessage', + { + defaultMessage: 'Unable to load connectors', + } + ), + }); + } + } + + const actionsErrors = alert.actions.reduce( + (acc: Record, alertAction: AlertAction) => { + const actionType = actionTypeRegistry.get(alertAction.actionTypeId); + if (!actionType) { + return { ...acc }; + } + const actionValidationErrors = actionType.validateParams(alertAction.params); + return { ...acc, [alertAction.id]: actionValidationErrors }; + }, + {} + ); + + const AlertParamsExpressionComponent = alertTypeModel + ? alertTypeModel.alertParamsExpression + : null; + + function addActionType(actionTypeModel: ActionTypeModel) { + setIsAddActionPanelOpen(false); + const actionTypeConnectors = connectors.filter( + field => field.actionTypeId === actionTypeModel.id + ); + let freeConnectors; + if (actionTypeConnectors.length > 0) { + // Should we allow adding multiple actions to the same connector under the alert? + freeConnectors = actionTypeConnectors.filter( + (actionConnector: ActionConnector) => + !alert.actions.find((actionItem: AlertAction) => actionItem.id === actionConnector.id) + ); + if (freeConnectors.length > 0) { + alert.actions.push({ + id: '', + actionTypeId: actionTypeModel.id, + group: defaultActionGroup ?? 'Alert', + params: {}, + }); + setActionProperty('id', freeConnectors[0].id, alert.actions.length - 1); + } + } + if (actionTypeConnectors.length === 0 || !freeConnectors || freeConnectors.length === 0) { + // if no connectors exists or all connectors is already assigned an action under current alert + // set actionType as id to be able to create new connector within the alert form + alert.actions.push({ + id: '', + actionTypeId: actionTypeModel.id, + group: defaultActionGroup ?? 'Alert', + params: {}, + }); + setActionProperty('id', alert.actions.length, alert.actions.length - 1); + } + } + + const alertTypeNodes = alertTypeRegistry.list().map(function(item, index) { + return ( + { + setAlertProperty('alertTypeId', item.id); + setAlertTypeModel(item); + if ( + alertTypesIndex && + alertTypesIndex[item.id] && + alertTypesIndex[item.id].actionGroups.length > 0 + ) { + setDefaultActionGroup(alertTypesIndex[item.id].actionGroups[0]); + } + }} + > + + + ); + }); + + const actionTypeNodes = actionTypeRegistry.list().map(function(item, index) { + return ( + addActionType(item)} + > + + + ); + }); + + const getSelectedOptions = (actionItemId: string) => { + const val = connectors.find(connector => connector.id === actionItemId); + if (!val) { + return []; + } + return [ + { + label: val.name, + value: val.name, + id: actionItemId, + }, + ]; + }; + + const getActionTypeForm = ( + actionItem: AlertAction, + actionConnector: ActionConnector, + index: number + ) => { + const optionsList = connectors + .filter( + connectorItem => + connectorItem.actionTypeId === actionItem.actionTypeId && + (connectorItem.id === actionItem.id || + !alert.actions.find( + (existingAction: AlertAction) => + existingAction.id === connectorItem.id && existingAction.group === actionItem.group + )) + ) + .map(({ name, id }) => ({ + label: name, + key: id, + id, + })); + const actionTypeRegisterd = actionTypeRegistry.get(actionConnector.actionTypeId); + if (actionTypeRegisterd === null || actionItem.group !== defaultActionGroup) return null; + const ParamsFieldsComponent = actionTypeRegisterd.actionParamsFields; + const actionParamsErrors: { errors: IErrorObject } = + Object.keys(actionsErrors).length > 0 ? actionsErrors[actionItem.id] : { errors: {} }; + + return ( + + + + + + +
+ +
+
+
+
+ } + extraAction={ + { + const updatedActions = alert.actions.filter( + (item: AlertAction) => item.id !== actionItem.id + ); + setAlertProperty('actions', updatedActions); + setIsAddActionPanelOpen( + updatedActions.filter((item: AlertAction) => item.id !== actionItem.id).length === 0 + ); + setActiveActionItem(undefined); + }} + /> + } + paddingSize="l" + > + + + + } + labelAppend={ + { + setActiveActionItem({ actionTypeId: actionItem.actionTypeId, index }); + setAddModalVisibility(true); + }} + > + + + } + > + { + setActionProperty('id', selectedOptions[0].id, index); + }} + isClearable={false} + /> + + + + + {ParamsFieldsComponent ? ( + + ) : null} + + ); + }; + + const getAddConnectorsForm = (actionItem: AlertAction, index: number) => { + const actionTypeName = actionTypesIndex + ? actionTypesIndex[actionItem.actionTypeId].name + : actionItem.actionTypeId; + const actionTypeRegisterd = actionTypeRegistry.get(actionItem.actionTypeId); + if (actionTypeRegisterd === null || actionItem.group !== defaultActionGroup) return null; + return ( + + + + + + +
+ +
+
+
+ + } + extraAction={ + { + const updatedActions = alert.actions.filter( + (item: AlertAction) => item.id !== actionItem.id + ); + setAlertProperty('actions', updatedActions); + setIsAddActionPanelOpen( + updatedActions.filter((item: AlertAction) => item.id !== actionItem.id).length === 0 + ); + setActiveActionItem(undefined); + }} + /> + } + paddingSize="l" + > + + } + actions={[ + { + setActiveActionItem({ actionTypeId: actionItem.actionTypeId, index }); + setAddModalVisibility(true); + }} + > + + , + ]} + /> +
+ ); + }; + + const selectedGroupActions = ( + + {alert.actions.map((actionItem: AlertAction, index: number) => { + const actionConnector = connectors.find(field => field.id === actionItem.id); + // connectors doesn't exists + if (!actionConnector) { + return getAddConnectorsForm(actionItem, index); + } + return getActionTypeForm(actionItem, actionConnector, index); + })} + + {isAddActionPanelOpen === false ? ( + setIsAddActionPanelOpen(true)} + > + + + ) : null} + + ); + + const alertTypeDetails = ( + + + + +
+ +
+
+
+ {canChangeTrigger ? ( + + { + setAlertProperty('alertTypeId', null); + setAlertTypeModel(null); + }} + > + + + + ) : null} +
+ {AlertParamsExpressionComponent ? ( + + ) : null} + + {selectedGroupActions} + {isAddActionPanelOpen ? ( + + +
+ +
+
+ + + {isLoadingActionTypes ? ( + + + + ) : ( + actionTypeNodes + )} + +
+ ) : null} +
+ ); + + const labelForAlertChecked = ( + <> + {' '} + + + ); + + const labelForAlertRenotify = ( + <> + {' '} + + + ); + + return ( + + + + + } + isInvalid={errors.name.length > 0 && alert.name !== undefined} + error={errors.name} + > + 0 && alert.name !== undefined} + compressed + name="name" + data-test-subj="alertNameInput" + value={alert.name || ''} + onChange={e => { + setAlertProperty('name', e.target.value); + }} + onBlur={() => { + if (!alert.name) { + setAlertProperty('name', ''); + } + }} + /> + + + + + { + const newOptions = [...tagsOptions, { label: searchValue }]; + setAlertProperty( + 'tags', + newOptions.map(newOption => newOption.label) + ); + }} + onChange={(selectedOptions: Array<{ label: string }>) => { + setAlertProperty( + 'tags', + selectedOptions.map(selectedOption => selectedOption.label) + ); + }} + onBlur={() => { + if (!alert.tags) { + setAlertProperty('tags', []); + } + }} + /> + + + + + + + + + + { + const interval = e.target.value !== '' ? parseInt(e.target.value, 10) : null; + setAlertInterval(interval); + setScheduleProperty('interval', `${e.target.value}${alertIntervalUnit}`); + }} + /> + + + { + setAlertIntervalUnit(e.target.value); + setScheduleProperty('interval', `${alertInterval}${e.target.value}`); + }} + /> + + + + + + + + + { + const throttle = e.target.value !== '' ? parseInt(e.target.value, 10) : null; + setAlertThrottle(throttle); + setAlertProperty('throttle', `${e.target.value}${alertThrottleUnit}`); + }} + /> + + + { + setAlertThrottleUnit(e.target.value); + setAlertProperty('throttle', `${alertThrottle}${e.target.value}`); + }} + /> + + + + + + + {alertTypeModel ? ( + {alertTypeDetails} + ) : ( + + +
+ +
+
+ + + {alertTypeNodes} + +
+ )} + {actionTypesIndex && activeActionItem ? ( + { + connectors.push(savedAction); + setActionProperty('id', savedAction.id, activeActionItem.index); + }} + /> + ) : null} +
+ ); +}; diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alert_add/alert_reducer.test.ts b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alert_add/alert_reducer.test.ts new file mode 100644 index 0000000000000..bd320de144024 --- /dev/null +++ b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alert_add/alert_reducer.test.ts @@ -0,0 +1,163 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { alertReducer } from './alert_reducer'; +import { Alert } from '../../../types'; + +describe('alert reducer', () => { + let initialAlert: Alert; + beforeAll(() => { + initialAlert = ({ + params: {}, + consumer: 'alerting', + alertTypeId: null, + schedule: { + interval: '1m', + }, + actions: [], + tags: [], + } as unknown) as Alert; + }); + + // 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: 'setAlertParams' }, + 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: 'setAlertParams' }, + 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 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/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alert_add/alert_reducer.ts b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alert_add/alert_reducer.ts index 9c2260f0178be..2e56f4b026b4a 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alert_add/alert_reducer.ts +++ b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alert_add/alert_reducer.ts @@ -9,6 +9,7 @@ interface CommandType { type: | 'setAlert' | 'setProperty' + | 'setScheduleProperty' | 'setAlertParams' | 'setAlertActionParams' | 'setAlertActionProperty'; @@ -57,6 +58,23 @@ export const alertReducer = (state: any, action: AlertReducerAction) => { }; } } + case 'setScheduleProperty': { + const { key, value } = payload; + if (isEqual(alert.schedule[key], value)) { + return state; + } else { + return { + ...state, + alert: { + ...alert, + schedule: { + ...alert.schedule, + [key]: value, + }, + }, + }; + } + } case 'setAlertParams': { const { key, value } = payload; if (isEqual(alert.params[key], value)) { diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alert_details/components/alert_details.test.tsx b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alert_details/components/alert_details.test.tsx index 228bceb87cad7..683aca742ac87 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alert_details/components/alert_details.test.tsx +++ b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alert_details/components/alert_details.test.tsx @@ -43,6 +43,8 @@ describe('alert_details', () => { const alertType = { id: '.noop', name: 'No Op', + actionGroups: ['default'], + actionVariables: [], }; expect( @@ -61,6 +63,8 @@ describe('alert_details', () => { const alertType = { id: '.noop', name: 'No Op', + actionGroups: ['default'], + actionVariables: [], }; expect( @@ -86,6 +90,8 @@ describe('alert_details', () => { const alertType = { id: '.noop', name: 'No Op', + actionGroups: ['default'], + actionVariables: [], }; const actionTypes: ActionType[] = [ @@ -133,6 +139,8 @@ describe('alert_details', () => { const alertType = { id: '.noop', name: 'No Op', + actionGroups: ['default'], + actionVariables: [], }; const actionTypes: ActionType[] = [ { @@ -181,6 +189,8 @@ describe('alert_details', () => { const alertType = { id: '.noop', name: 'No Op', + actionGroups: ['default'], + actionVariables: [], }; expect( @@ -203,6 +213,8 @@ describe('alert_details', () => { const alertType = { id: '.noop', name: 'No Op', + actionGroups: ['default'], + actionVariables: [], }; expect( @@ -225,6 +237,8 @@ describe('alert_details', () => { const alertType = { id: '.noop', name: 'No Op', + actionGroups: ['default'], + actionVariables: [], }; expect( @@ -252,6 +266,8 @@ describe('enable button', () => { const alertType = { id: '.noop', name: 'No Op', + actionGroups: ['default'], + actionVariables: [], }; const enableButton = shallow( @@ -275,6 +291,8 @@ describe('enable button', () => { const alertType = { id: '.noop', name: 'No Op', + actionGroups: ['default'], + actionVariables: [], }; const enableButton = shallow( @@ -298,6 +316,8 @@ describe('enable button', () => { const alertType = { id: '.noop', name: 'No Op', + actionGroups: ['default'], + actionVariables: [], }; const disableAlert = jest.fn(); @@ -330,6 +350,8 @@ describe('enable button', () => { const alertType = { id: '.noop', name: 'No Op', + actionGroups: ['default'], + actionVariables: [], }; const enableAlert = jest.fn(); @@ -365,6 +387,8 @@ describe('mute button', () => { const alertType = { id: '.noop', name: 'No Op', + actionGroups: ['default'], + actionVariables: [], }; const enableButton = shallow( @@ -389,6 +413,8 @@ describe('mute button', () => { const alertType = { id: '.noop', name: 'No Op', + actionGroups: ['default'], + actionVariables: [], }; const enableButton = shallow( @@ -413,6 +439,8 @@ describe('mute button', () => { const alertType = { id: '.noop', name: 'No Op', + actionGroups: ['default'], + actionVariables: [], }; const muteAlert = jest.fn(); @@ -446,6 +474,8 @@ describe('mute button', () => { const alertType = { id: '.noop', name: 'No Op', + actionGroups: ['default'], + actionVariables: [], }; const unmuteAlert = jest.fn(); @@ -479,6 +509,8 @@ describe('mute button', () => { const alertType = { id: '.noop', name: 'No Op', + actionGroups: ['default'], + actionVariables: [], }; const enableButton = shallow( diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alerts_list/components/alerts_list.test.tsx b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alerts_list/components/alerts_list.test.tsx index f410fff44172f..60435552a5759 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alerts_list/components/alerts_list.test.tsx +++ b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alerts_list/components/alerts_list.test.tsx @@ -46,7 +46,6 @@ actionTypeRegistry.list.mockReturnValue([]); describe('alerts_list component empty', () => { let wrapper: ReactWrapper; - beforeEach(async () => { const { loadAlerts, loadAlertTypes } = jest.requireMock('../../../lib/alert_api'); const { loadActionTypes, loadAllActions } = jest.requireMock( @@ -124,14 +123,13 @@ describe('alerts_list component empty', () => { }); it('renders empty list', () => { - expect(wrapper.find('[data-test-subj="createAlertButton"]').find('EuiButton')).toHaveLength(1); + expect(wrapper.find('[data-test-subj="createFirstAlertEmptyPrompt"]').exists()).toBeTruthy(); }); - test('if click create button should render AlertAdd', () => { - wrapper - .find('[data-test-subj="createAlertButton"]') - .first() - .simulate('click'); + it('renders Create alert button', () => { + expect( + wrapper.find('[data-test-subj="createFirstAlertButton"]').find('EuiButton') + ).toHaveLength(1); expect(wrapper.find('AlertAdd')).toHaveLength(1); }); }); diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alerts_list/components/alerts_list.tsx b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alerts_list/components/alerts_list.tsx index 32de924f63e80..643816e728d1a 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alerts_list/components/alerts_list.tsx +++ b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alerts_list/components/alerts_list.tsx @@ -6,7 +6,7 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; -import React, { Fragment, useEffect, useState } from 'react'; +import React, { useEffect, useState, Fragment } from 'react'; import { EuiBasicTable, EuiButton, @@ -15,6 +15,7 @@ import { EuiFlexItem, EuiIcon, EuiSpacer, + EuiEmptyPrompt, EuiLink, } from '@elastic/eui'; import { useHistory } from 'react-router-dom'; @@ -245,100 +246,149 @@ export const AlertsList: React.FunctionComponent = () => { ); } - return ( -
- - - - - {selectedIds.length > 0 && canDelete && ( - - - setIsPerformingAction(true)} - onActionPerformed={() => { - loadAlertsData(); - setIsPerformingAction(false); - }} - /> - - - )} - - } - onChange={e => setInputText(e.target.value)} - onKeyUp={e => { - if (e.keyCode === ENTER_KEY) { - setSearchText(inputText); - } - }} - placeholder={i18n.translate( - 'xpack.triggersActionsUI.sections.alertsList.searchPlaceholderTitle', - { defaultMessage: 'Search...' } + const emptyPrompt = ( + + +

+ } + body={ +

+ +

+ } + actions={ + setAlertFlyoutVisibility(true)} + > + + + } + /> + ); + + const table = ( + + + {selectedIds.length > 0 && canDelete && ( + + + setIsPerformingAction(true)} + onActionPerformed={() => { + loadAlertsData(); + setIsPerformingAction(false); + }} /> - - - - {toolsRight.map((tool, index: number) => ( - - {tool} - - ))} - - + + + )} + + } + onChange={e => setInputText(e.target.value)} + onKeyUp={e => { + if (e.keyCode === ENTER_KEY) { + setSearchText(inputText); + } + }} + placeholder={i18n.translate( + 'xpack.triggersActionsUI.sections.alertsList.searchPlaceholderTitle', + { defaultMessage: 'Search' } + )} + /> + + + + {toolsRight.map((tool, index: number) => ( + + {tool} + + ))} + + - {/* Large to remain consistent with ActionsList table spacing */} - + {/* Large to remain consistent with ActionsList table spacing */} + - ({ - 'data-test-subj': 'alert-row', - })} - cellProps={() => ({ - 'data-test-subj': 'cell', - })} - data-test-subj="alertsList" - 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, - }} - selection={ - canDelete - ? { - onSelectionChange(updatedSelectedItemsList: AlertTableItem[]) { - setSelectedIds(updatedSelectedItemsList.map(item => item.id)); - }, - } - : undefined - } - onChange={({ page: changedPage }: { page: Pagination }) => { - setPage(changedPage); - }} - /> - - - + ({ + 'data-test-subj': 'alert-row', + })} + cellProps={() => ({ + 'data-test-subj': 'cell', + })} + data-test-subj="alertsList" + 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, + }} + selection={ + canDelete + ? { + onSelectionChange(updatedSelectedItemsList: AlertTableItem[]) { + setSelectedIds(updatedSelectedItemsList.map(item => item.id)); + }, + } + : undefined + } + onChange={({ page: changedPage }: { page: Pagination }) => { + setPage(changedPage); + }} + /> + + ); + + return ( +
+ + {convertAlertsToTableItems(alertsState.data, alertTypesState.data).length !== 0 && table} + {convertAlertsToTableItems(alertsState.data, alertTypesState.data).length === 0 && + emptyPrompt} + + +
); }; diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/types.ts b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/types.ts index 7fb7d0bf48e4d..1bed658940a6e 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/types.ts +++ b/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/types.ts @@ -3,10 +3,9 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ +import { ActionType } from '../../../../../plugins/actions/common'; import { TypeRegistry } from './application/type_registry'; import { SanitizedAlert as Alert, AlertAction } from '../../../alerting/common'; -import { ActionType } from '../../../../../plugins/actions/common'; - export { Alert, AlertAction }; export { ActionType }; @@ -15,20 +14,20 @@ export type AlertTypeIndex = Record; export type ActionTypeRegistryContract = PublicMethodsOf>; export type AlertTypeRegistryContract = PublicMethodsOf>; -export interface ActionConnectorFieldsProps { - action: ActionConnector; +export interface ActionConnectorFieldsProps { + action: TActionCOnnector; editActionConfig: (property: string, value: any) => void; editActionSecrets: (property: string, value: any) => void; errors: { [key: string]: string[] }; - hasErrors?: boolean; } -export interface ActionParamsProps { - action: any; +export interface ActionParamsProps { + actionParams: TParams; index: number; editAction: (property: string, value: any, index: number) => void; errors: { [key: string]: string[] }; - hasErrors?: boolean; + messageVariables?: string[]; + defaultMessage?: string; } export interface Pagination { @@ -40,10 +39,11 @@ export interface ActionTypeModel { id: string; iconClass: string; selectMessage: string; - validateConnector: (action: ActionConnector) => ValidationResult; + actionTypeTitle?: string; + validateConnector: (connector: any) => ValidationResult; validateParams: (actionParams: any) => ValidationResult; - actionConnectorFields: React.FunctionComponent | null; - actionParamsFields: React.FunctionComponent | null; + actionConnectorFields: React.FunctionComponent | null; + actionParamsFields: any; } export interface ValidationResult { @@ -68,6 +68,8 @@ export interface ActionConnectorTableItem extends ActionConnector { export interface AlertType { id: string; name: string; + actionGroups: string[]; + actionVariables: string[]; } export type AlertWithoutId = Omit; @@ -83,6 +85,7 @@ export interface AlertTypeModel { iconClass: string; validate: (alert: Alert) => ValidationResult; alertParamsExpression: React.FunctionComponent; + defaultActionMessage?: string; } export interface IErrorObject { diff --git a/x-pack/legacy/plugins/triggers_actions_ui/public/index.scss b/x-pack/legacy/plugins/triggers_actions_ui/public/index.scss index 6faad81630b2b..810176a57f9e3 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/public/index.scss +++ b/x-pack/legacy/plugins/triggers_actions_ui/public/index.scss @@ -3,3 +3,6 @@ // Styling within the app @import '../np_ready/public/application/sections/actions_connectors_list/components/index'; + +@import '../np_ready/public/application/sections/action_connector_form/index'; + diff --git a/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/alerts.ts b/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/alerts.ts index 0276ca8109732..84081309c18d9 100644 --- a/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/alerts.ts +++ b/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/alerts.ts @@ -16,7 +16,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const testSubjects = getService('testSubjects'); const pageObjects = getPageObjects(['common', 'triggersActionsUI', 'header']); const supertest = getService('supertest'); - const retry = getService('retry'); + const find = getService('find'); async function createAlert() { const { body: createdAlert } = await supertest @@ -43,9 +43,52 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await testSubjects.click('alertsTab'); }); + it('should create an alert', async () => { + const alertName = generateUniqueKey(); + + await pageObjects.triggersActionsUI.clickCreateAlertButton(); + + const nameInput = await testSubjects.find('alertNameInput'); + await nameInput.click(); + await nameInput.clearValue(); + await nameInput.type(alertName); + + await testSubjects.click('threshold-SelectOption'); + + await testSubjects.click('.slack-ActionTypeSelectOption'); + await testSubjects.click('createActionConnectorButton'); + const connectorNameInput = await testSubjects.find('nameInput'); + await connectorNameInput.click(); + await connectorNameInput.clearValue(); + const connectorName = generateUniqueKey(); + await connectorNameInput.type(connectorName); + + const slackWebhookUrlInput = await testSubjects.find('slackWebhookUrlInput'); + await slackWebhookUrlInput.click(); + await slackWebhookUrlInput.clearValue(); + await slackWebhookUrlInput.type('https://test'); + + await find.clickByCssSelector('[data-test-subj="saveActionButtonModal"]:not(disabled)'); + + const loggingMessageInput = await testSubjects.find('slackMessageTextArea'); + await loggingMessageInput.click(); + await loggingMessageInput.clearValue(); + await loggingMessageInput.type('test message'); + + await testSubjects.click('slackAddVariableButton'); + const variableMenuButton = await testSubjects.find('variableMenuButton-0'); + await variableMenuButton.click(); + + await testSubjects.click('selectIndexExpression'); + + await find.clickByCssSelector('[data-test-subj="cancelSaveAlertButton"]'); + + // TODO: implement saving to the server, when threshold API will be ready + }); + it('should search for alert', async () => { const createdAlert = await createAlert(); - + await pageObjects.common.navigateToApp('triggersActions'); await pageObjects.triggersActionsUI.searchAlerts(createdAlert.name); const searchResults = await pageObjects.triggersActionsUI.getAlertsList(); @@ -61,7 +104,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { it('should search for tags', async () => { const createdAlert = await createAlert(); - + await pageObjects.common.navigateToApp('triggersActions'); await pageObjects.triggersActionsUI.searchAlerts(`${createdAlert.name} foo`); const searchResults = await pageObjects.triggersActionsUI.getAlertsList(); @@ -77,7 +120,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { it('should disable single alert', async () => { const createdAlert = await createAlert(); - + await pageObjects.common.navigateToApp('triggersActions'); await pageObjects.triggersActionsUI.searchAlerts(createdAlert.name); await testSubjects.click('collapsedItemActions'); @@ -95,7 +138,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { it('should re-enable single alert', async () => { const createdAlert = await createAlert(); - + await pageObjects.common.navigateToApp('triggersActions'); await pageObjects.triggersActionsUI.searchAlerts(createdAlert.name); await testSubjects.click('collapsedItemActions'); @@ -119,7 +162,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { it('should mute single alert', async () => { const createdAlert = await createAlert(); - + await pageObjects.common.navigateToApp('triggersActions'); await pageObjects.triggersActionsUI.searchAlerts(createdAlert.name); await testSubjects.click('collapsedItemActions'); @@ -137,7 +180,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { it('should unmute single alert', async () => { const createdAlert = await createAlert(); - + await pageObjects.common.navigateToApp('triggersActions'); await pageObjects.triggersActionsUI.searchAlerts(createdAlert.name); await testSubjects.click('collapsedItemActions'); @@ -161,24 +204,21 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { it('should delete single alert', async () => { const createdAlert = await createAlert(); - + await pageObjects.common.navigateToApp('triggersActions'); await pageObjects.triggersActionsUI.searchAlerts(createdAlert.name); await testSubjects.click('collapsedItemActions'); await testSubjects.click('deleteAlert'); - - await retry.try(async () => { - await pageObjects.triggersActionsUI.searchAlerts(createdAlert.name); - - const searchResults = await pageObjects.triggersActionsUI.getAlertsList(); - expect(searchResults.length).to.eql(0); - }); + const emptyPrompt = await find.byCssSelector( + '[data-test-subj="createFirstAlertEmptyPrompt"]' + ); + expect(await emptyPrompt.elementHasClass('euiEmptyPrompt')).to.be(true); }); it('should mute all selection', async () => { const createdAlert = await createAlert(); - + await pageObjects.common.navigateToApp('triggersActions'); await pageObjects.triggersActionsUI.searchAlerts(createdAlert.name); await testSubjects.click(`checkboxSelectRow-${createdAlert.id}`); @@ -201,7 +241,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { it('should unmute all selection', async () => { const createdAlert = await createAlert(); - + await pageObjects.common.navigateToApp('triggersActions'); await pageObjects.triggersActionsUI.searchAlerts(createdAlert.name); await testSubjects.click(`checkboxSelectRow-${createdAlert.id}`); @@ -226,7 +266,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { it('should disable all selection', async () => { const createdAlert = await createAlert(); - + await pageObjects.common.navigateToApp('triggersActions'); await pageObjects.triggersActionsUI.searchAlerts(createdAlert.name); await testSubjects.click(`checkboxSelectRow-${createdAlert.id}`); @@ -249,7 +289,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { it('should enable all selection', async () => { const createdAlert = await createAlert(); - + await pageObjects.common.navigateToApp('triggersActions'); await pageObjects.triggersActionsUI.searchAlerts(createdAlert.name); await testSubjects.click(`checkboxSelectRow-${createdAlert.id}`); @@ -274,7 +314,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { it('should delete all selection', async () => { const createdAlert = await createAlert(); - + await pageObjects.common.navigateToApp('triggersActions'); await pageObjects.triggersActionsUI.searchAlerts(createdAlert.name); await testSubjects.click(`checkboxSelectRow-${createdAlert.id}`); @@ -283,12 +323,10 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await testSubjects.click('deleteAll'); - await retry.try(async () => { - await pageObjects.triggersActionsUI.searchAlerts(createdAlert.name); - - const searchResults = await pageObjects.triggersActionsUI.getAlertsList(); - expect(searchResults.length).to.eql(0); - }); + const emptyPrompt = await find.byCssSelector( + '[data-test-subj="createFirstAlertEmptyPrompt"]' + ); + expect(await emptyPrompt.elementHasClass('euiEmptyPrompt')).to.be(true); }); }); }; diff --git a/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/connectors.ts b/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/connectors.ts index d037155a29e12..9d656b08a3abd 100644 --- a/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/connectors.ts +++ b/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/connectors.ts @@ -35,7 +35,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await nameInput.clearValue(); await nameInput.type(connectorName); - await find.clickByCssSelector('[data-test-subj="saveActionButton"]:not(disabled)'); + await find.clickByCssSelector('[data-test-subj="saveNewActionButton"]:not(disabled)'); const toastTitle = await pageObjects.common.closeToast(); expect(toastTitle).to.eql(`Created '${connectorName}'`); @@ -65,7 +65,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await nameInput.clearValue(); await nameInput.type(connectorName); - await find.clickByCssSelector('[data-test-subj="saveActionButton"]:not(disabled)'); + await find.clickByCssSelector('[data-test-subj="saveNewActionButton"]:not(disabled)'); await pageObjects.common.closeToast(); @@ -81,7 +81,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await nameInputToUpdate.clearValue(); await nameInputToUpdate.type(updatedConnectorName); - await find.clickByCssSelector('[data-test-subj="saveActionButton"]:not(disabled)'); + await find.clickByCssSelector('[data-test-subj="saveEditedActionButton"]:not(disabled)'); const toastTitle = await pageObjects.common.closeToast(); expect(toastTitle).to.eql(`Updated '${updatedConnectorName}'`); @@ -109,7 +109,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await nameInput.clearValue(); await nameInput.type(connectorName); - await find.clickByCssSelector('[data-test-subj="saveActionButton"]:not(disabled)'); + await find.clickByCssSelector('[data-test-subj="saveNewActionButton"]:not(disabled)'); await pageObjects.common.closeToast(); } const connectorName = generateUniqueKey(); @@ -147,7 +147,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await nameInput.clearValue(); await nameInput.type(connectorName); - await find.clickByCssSelector('[data-test-subj="saveActionButton"]:not(disabled)'); + await find.clickByCssSelector('[data-test-subj="saveNewActionButton"]:not(disabled)'); await pageObjects.common.closeToast(); } 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 ae66ac0ddddfb..91c7fe1f97d12 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 @@ -18,11 +18,21 @@ export function TriggersActionsPageProvider({ getService }: FtrProviderContext) async getSectionHeadingText() { return await testSubjects.getVisibleText('appTitle'); }, + async clickCreateFirstConnectorButton() { + const createBtn = await find.byCssSelector('[data-test-subj="createFirstActionButton"]'); + const createBtnIsVisible = await createBtn.isDisplayed(); + if (createBtnIsVisible) { + await createBtn.click(); + } + }, async clickCreateConnectorButton() { - const createBtn = await find.byCssSelector( - '[data-test-subj="createActionButton"],[data-test-subj="createFirstActionButton"]' - ); - await createBtn.click(); + const createBtn = await find.byCssSelector('[data-test-subj="createActionButton"]'); + const createBtnIsVisible = await createBtn.isDisplayed(); + if (createBtnIsVisible) { + await createBtn.click(); + } else { + await this.clickCreateFirstConnectorButton(); + } }, async searchConnectors(searchText: string) { const searchBox = await find.byCssSelector('[data-test-subj="actionsList"] .euiFieldSearch'); @@ -109,5 +119,11 @@ export function TriggersActionsPageProvider({ getService }: FtrProviderContext) expect(valueAfter).not.to.eql(valueBefore); }); }, + async clickCreateAlertButton() { + const createBtn = await find.byCssSelector( + '[data-test-subj="createAlertButton"],[data-test-subj="createFirstAlertButton"]' + ); + await createBtn.click(); + }, }; } From 84fa97f89141ab01ba9f237ee6388c73ec8502df Mon Sep 17 00:00:00 2001 From: nnamdifrankie <56440728+nnamdifrankie@users.noreply.github.com> Date: Tue, 4 Feb 2020 14:22:30 -0500 Subject: [PATCH 11/86] [Endpoint] EMT-67: add kql support for endpoint list (#56328) [Endpoint] EMT-67: add kql support for endpoint list --- .../endpoint/server/routes/endpoints.test.ts | 65 ++++++++++++++++++- .../endpoint/server/routes/endpoints.ts | 28 +++++--- .../endpoint/endpoint_query_builders.test.ts | 59 +++++++++++++++++ .../endpoint/endpoint_query_builders.ts | 14 +++- .../apis/endpoint/endpoints.ts | 42 +++++++++++- 5 files changed, 194 insertions(+), 14 deletions(-) diff --git a/x-pack/plugins/endpoint/server/routes/endpoints.test.ts b/x-pack/plugins/endpoint/server/routes/endpoints.test.ts index be14554f128c3..25c4225495a41 100644 --- a/x-pack/plugins/endpoint/server/routes/endpoints.test.ts +++ b/x-pack/plugins/endpoint/server/routes/endpoints.test.ts @@ -79,7 +79,7 @@ describe('test endpoint route', () => { expect(endpointResultList.request_page_size).toEqual(10); }); - it('test find the latest of all endpoints with params', async () => { + it('test find the latest of all endpoints with paging properties', async () => { const mockRequest = httpServerMock.createKibanaRequest({ body: { paging_properties: [ @@ -112,6 +112,69 @@ describe('test endpoint route', () => { ); expect(mockScopedClient.callAsCurrentUser).toBeCalled(); + expect(mockScopedClient.callAsCurrentUser.mock.calls[0][1]?.body?.query).toEqual({ + match_all: {}, + }); + expect(routeConfig.options).toEqual({ authRequired: true }); + expect(mockResponse.ok).toBeCalled(); + const endpointResultList = mockResponse.ok.mock.calls[0][0]?.body as EndpointResultList; + expect(endpointResultList.endpoints.length).toEqual(2); + expect(endpointResultList.total).toEqual(2); + expect(endpointResultList.request_page_index).toEqual(10); + expect(endpointResultList.request_page_size).toEqual(10); + }); + + it('test find the latest of all endpoints with paging and filters properties', async () => { + const mockRequest = httpServerMock.createKibanaRequest({ + body: { + paging_properties: [ + { + page_size: 10, + }, + { + page_index: 1, + }, + ], + + filter: 'not host.ip:10.140.73.246', + }, + }); + mockScopedClient.callAsCurrentUser.mockImplementationOnce(() => + Promise.resolve((data as unknown) as SearchResponse) + ); + [routeConfig, routeHandler] = routerMock.post.mock.calls.find(([{ path }]) => + path.startsWith('/api/endpoint/endpoints') + )!; + + await routeHandler( + ({ + core: { + elasticsearch: { + dataClient: mockScopedClient, + }, + }, + } as unknown) as RequestHandlerContext, + mockRequest, + mockResponse + ); + + expect(mockScopedClient.callAsCurrentUser).toBeCalled(); + expect(mockScopedClient.callAsCurrentUser.mock.calls[0][1]?.body?.query).toEqual({ + bool: { + must_not: { + bool: { + minimum_should_match: 1, + should: [ + { + match: { + 'host.ip': '10.140.73.246', + }, + }, + ], + }, + }, + }, + }); expect(routeConfig.options).toEqual({ authRequired: true }); expect(mockResponse.ok).toBeCalled(); const endpointResultList = mockResponse.ok.mock.calls[0][0]?.body as EndpointResultList; diff --git a/x-pack/plugins/endpoint/server/routes/endpoints.ts b/x-pack/plugins/endpoint/server/routes/endpoints.ts index 24ad8e3941f5e..054172a7f258a 100644 --- a/x-pack/plugins/endpoint/server/routes/endpoints.ts +++ b/x-pack/plugins/endpoint/server/routes/endpoints.ts @@ -26,16 +26,26 @@ export function registerEndpointRoutes(router: IRouter, endpointAppContext: Endp validate: { body: schema.nullable( schema.object({ - paging_properties: schema.arrayOf( - schema.oneOf([ - // the number of results to return for this request per page - schema.object({ - page_size: schema.number({ defaultValue: 10, min: 1, max: 10000 }), - }), - // the index of the page to return - schema.object({ page_index: schema.number({ defaultValue: 0, min: 0 }) }), - ]) + paging_properties: schema.nullable( + schema.arrayOf( + schema.oneOf([ + /** + * the number of results to return for this request per page + */ + schema.object({ + page_size: schema.number({ defaultValue: 10, min: 1, max: 10000 }), + }), + /** + * the zero based page index of the the total number of pages of page size + */ + schema.object({ page_index: schema.number({ defaultValue: 0, min: 0 }) }), + ]) + ) ), + /** + * filter to be applied, it could be a kql expression or discrete filter to be implemented + */ + filter: schema.nullable(schema.oneOf([schema.string()])), }) ), }, diff --git a/x-pack/plugins/endpoint/server/services/endpoint/endpoint_query_builders.test.ts b/x-pack/plugins/endpoint/server/services/endpoint/endpoint_query_builders.test.ts index e453f777fbd50..bd9986ecf1f97 100644 --- a/x-pack/plugins/endpoint/server/services/endpoint/endpoint_query_builders.test.ts +++ b/x-pack/plugins/endpoint/server/services/endpoint/endpoint_query_builders.test.ts @@ -55,6 +55,65 @@ describe('query builder', () => { }); }); + describe('test query builder with kql filter', () => { + it('test default query params for all endpoints when no params or body is provided', async () => { + const mockRequest = httpServerMock.createKibanaRequest({ + body: { + filter: 'not host.ip:10.140.73.246', + }, + }); + const query = await kibanaRequestToEndpointListQuery(mockRequest, { + logFactory: loggingServiceMock.create(), + config: () => Promise.resolve(EndpointConfigSchema.validate({})), + }); + expect(query).toEqual({ + body: { + query: { + bool: { + must_not: { + bool: { + minimum_should_match: 1, + should: [ + { + match: { + 'host.ip': '10.140.73.246', + }, + }, + ], + }, + }, + }, + }, + collapse: { + field: 'host.id.keyword', + inner_hits: { + name: 'most_recent', + size: 1, + sort: [{ 'event.created': 'desc' }], + }, + }, + aggs: { + total: { + cardinality: { + field: 'host.id.keyword', + }, + }, + }, + sort: [ + { + 'event.created': { + order: 'desc', + }, + }, + ], + }, + from: 0, + size: 10, + index: 'endpoint-agent*', + } as Record); + }); + }); + describe('EndpointFetchQuery', () => { it('searches for the correct ID', () => { const mockID = 'AABBCCDD-0011-2233-AA44-DEADBEEF8899'; diff --git a/x-pack/plugins/endpoint/server/services/endpoint/endpoint_query_builders.ts b/x-pack/plugins/endpoint/server/services/endpoint/endpoint_query_builders.ts index b4f295a64b6ea..c143b09ec453c 100644 --- a/x-pack/plugins/endpoint/server/services/endpoint/endpoint_query_builders.ts +++ b/x-pack/plugins/endpoint/server/services/endpoint/endpoint_query_builders.ts @@ -6,6 +6,7 @@ import { KibanaRequest } from 'kibana/server'; import { EndpointAppConstants } from '../../../common/types'; import { EndpointAppContext } from '../../types'; +import { esKuery } from '../../../../../../src/plugins/data/server'; export const kibanaRequestToEndpointListQuery = async ( request: KibanaRequest, @@ -14,9 +15,7 @@ export const kibanaRequestToEndpointListQuery = async ( const pagingProperties = await getPagingProperties(request, endpointAppContext); return { body: { - query: { - match_all: {}, - }, + query: buildQueryBody(request), collapse: { field: 'host.id.keyword', inner_hits: { @@ -66,6 +65,15 @@ async function getPagingProperties( }; } +function buildQueryBody(request: KibanaRequest): Record { + if (typeof request?.body?.filter === 'string') { + return esKuery.toElasticsearchQuery(esKuery.fromKueryExpression(request.body.filter)); + } + return { + match_all: {}, + }; +} + export const kibanaRequestToEndpointFetchQuery = ( request: KibanaRequest, endpointAppContext: EndpointAppContext diff --git a/x-pack/test/api_integration/apis/endpoint/endpoints.ts b/x-pack/test/api_integration/apis/endpoint/endpoints.ts index 1c520fe92e38e..210e9d78d7e18 100644 --- a/x-pack/test/api_integration/apis/endpoint/endpoints.ts +++ b/x-pack/test/api_integration/apis/endpoint/endpoints.ts @@ -40,7 +40,7 @@ export default function({ getService }: FtrProviderContext) { expect(body.request_page_index).to.eql(0); }); - it('endpoints api should return page based on params passed.', async () => { + it('endpoints api should return page based on paging properties passed.', async () => { const { body } = await supertest .post('/api/endpoint/endpoints') .set('kbn-xsrf', 'xxx') @@ -102,6 +102,46 @@ export default function({ getService }: FtrProviderContext) { .expect(400); expect(body.message).to.contain('Value is [0] but it must be equal to or greater than [1]'); }); + + it('endpoints api should return page based on filters passed.', async () => { + const { body } = await supertest + .post('/api/endpoint/endpoints') + .set('kbn-xsrf', 'xxx') + .send({ filter: 'not host.ip:10.101.149.26' }) + .expect(200); + expect(body.total).to.eql(2); + expect(body.endpoints.length).to.eql(2); + expect(body.request_page_size).to.eql(10); + expect(body.request_page_index).to.eql(0); + }); + + it('endpoints api should return page based on filters and paging passed.', async () => { + const notIncludedIp = '10.101.149.26'; + const { body } = await supertest + .post('/api/endpoint/endpoints') + .set('kbn-xsrf', 'xxx') + .send({ + paging_properties: [ + { + page_size: 10, + }, + { + page_index: 0, + }, + ], + filter: `not host.ip:${notIncludedIp}`, + }) + .expect(200); + expect(body.total).to.eql(2); + const resultIps: string[] = [].concat( + ...body.endpoints.map((metadata: Record) => metadata.host.ip) + ); + expect(resultIps).to.eql(['10.192.213.130', '10.70.28.129', '10.46.229.234']); + expect(resultIps).not.include.eql(notIncludedIp); + expect(body.endpoints.length).to.eql(2); + expect(body.request_page_size).to.eql(10); + expect(body.request_page_index).to.eql(0); + }); }); }); } From 16d412f8f3022db0a93aff2c4ebf82fd97a06ce2 Mon Sep 17 00:00:00 2001 From: Matthew Kime Date: Tue, 4 Feb 2020 13:38:18 -0600 Subject: [PATCH 12/86] =?UTF-8?q?Advanced=20settings=20component=20registr?= =?UTF-8?q?y=20=E2=87=92=20kibana=20platform=20plugin=20(#55940)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * advanced settings component registry to new platform --- .i18nrc.json | 1 + rfcs/text/0006_management_section_service.md | 8 -- .../advanced_settings.test.tsx.snap | 12 +-- .../settings/advanced_settings.test.tsx | 18 ++++ .../sections/settings/advanced_settings.tsx | 19 ++-- .../component_registry.test.tsx.snap | 5 - .../components/component_registry.test.tsx | 82 ----------------- .../settings/components/component_registry.ts | 83 ----------------- .../default_component_registry.test.tsx | 44 --------- .../public/views/management/management.js | 9 +- src/legacy/ui/public/management/index.d.ts | 8 -- src/legacy/ui/public/management/index.js | 6 -- .../public/new_platform/__mocks__/helpers.ts | 3 + .../new_platform/new_platform.karma_mock.js | 7 ++ .../ui/public/new_platform/new_platform.ts | 6 ++ src/plugins/advanced_settings/kibana.json | 7 ++ .../component_registry.test.tsx.snap | 3 + .../component_registry.test.tsx | 90 ++++++++++++++++++ .../component_registry/component_registry.ts | 91 +++++++++++++++++++ .../public/component_registry/index.ts | 20 ++++ .../__snapshots__/page_footer.test.tsx.snap | 0 .../component_registry}/page_footer/index.ts | 0 .../page_footer/page_footer.test.tsx | 0 .../page_footer/page_footer.ts | 0 .../__snapshots__/page_subtitle.test.tsx.snap | 0 .../page_subtitle/index.ts | 0 .../page_subtitle/page_subtitle.test.tsx | 0 .../page_subtitle/page_subtitle.ts | 0 .../__snapshots__/page_title.test.tsx.snap | 2 +- .../component_registry}/page_title/index.ts | 0 .../page_title/page_title.test.tsx | 0 .../page_title/page_title.tsx | 2 +- src/plugins/advanced_settings/public/index.ts | 27 ++++++ src/plugins/advanced_settings/public/mocks.ts | 33 +++++++ .../advanced_settings/public/plugin.ts} | 28 +++--- src/plugins/advanced_settings/public/types.ts | 27 ++++++ .../advanced_settings_service.test.tsx | 21 ++--- .../advanced_settings_service.tsx | 22 +++-- x-pack/legacy/plugins/spaces/public/legacy.ts | 5 +- .../legacy/plugins/spaces/public/plugin.tsx | 11 +-- .../translations/translations/ja-JP.json | 2 +- .../translations/translations/zh-CN.json | 2 +- 42 files changed, 399 insertions(+), 305 deletions(-) delete mode 100644 src/legacy/core_plugins/kibana/public/management/sections/settings/components/__snapshots__/component_registry.test.tsx.snap delete mode 100644 src/legacy/core_plugins/kibana/public/management/sections/settings/components/component_registry.test.tsx delete mode 100644 src/legacy/core_plugins/kibana/public/management/sections/settings/components/component_registry.ts delete mode 100644 src/legacy/core_plugins/kibana/public/management/sections/settings/components/default_component_registry.test.tsx create mode 100644 src/plugins/advanced_settings/kibana.json create mode 100644 src/plugins/advanced_settings/public/component_registry/__snapshots__/component_registry.test.tsx.snap create mode 100644 src/plugins/advanced_settings/public/component_registry/component_registry.test.tsx create mode 100644 src/plugins/advanced_settings/public/component_registry/component_registry.ts create mode 100644 src/plugins/advanced_settings/public/component_registry/index.ts rename src/{legacy/core_plugins/kibana/public/management/sections/settings/components => plugins/advanced_settings/public/component_registry}/page_footer/__snapshots__/page_footer.test.tsx.snap (100%) rename src/{legacy/core_plugins/kibana/public/management/sections/settings/components => plugins/advanced_settings/public/component_registry}/page_footer/index.ts (100%) rename src/{legacy/core_plugins/kibana/public/management/sections/settings/components => plugins/advanced_settings/public/component_registry}/page_footer/page_footer.test.tsx (100%) rename src/{legacy/core_plugins/kibana/public/management/sections/settings/components => plugins/advanced_settings/public/component_registry}/page_footer/page_footer.ts (100%) rename src/{legacy/core_plugins/kibana/public/management/sections/settings/components => plugins/advanced_settings/public/component_registry}/page_subtitle/__snapshots__/page_subtitle.test.tsx.snap (100%) rename src/{legacy/core_plugins/kibana/public/management/sections/settings/components => plugins/advanced_settings/public/component_registry}/page_subtitle/index.ts (100%) rename src/{legacy/core_plugins/kibana/public/management/sections/settings/components => plugins/advanced_settings/public/component_registry}/page_subtitle/page_subtitle.test.tsx (100%) rename src/{legacy/core_plugins/kibana/public/management/sections/settings/components => plugins/advanced_settings/public/component_registry}/page_subtitle/page_subtitle.ts (100%) rename src/{legacy/core_plugins/kibana/public/management/sections/settings/components => plugins/advanced_settings/public/component_registry}/page_title/__snapshots__/page_title.test.tsx.snap (85%) rename src/{legacy/core_plugins/kibana/public/management/sections/settings/components => plugins/advanced_settings/public/component_registry}/page_title/index.ts (100%) rename src/{legacy/core_plugins/kibana/public/management/sections/settings/components => plugins/advanced_settings/public/component_registry}/page_title/page_title.test.tsx (100%) rename src/{legacy/core_plugins/kibana/public/management/sections/settings/components => plugins/advanced_settings/public/component_registry}/page_title/page_title.tsx (91%) create mode 100644 src/plugins/advanced_settings/public/index.ts create mode 100644 src/plugins/advanced_settings/public/mocks.ts rename src/{legacy/core_plugins/kibana/public/management/sections/settings/components/default_component_registry.ts => plugins/advanced_settings/public/plugin.ts} (54%) create mode 100644 src/plugins/advanced_settings/public/types.ts diff --git a/.i18nrc.json b/.i18nrc.json index 7d7685b5c1ef1..e0acda70cc348 100644 --- a/.i18nrc.json +++ b/.i18nrc.json @@ -26,6 +26,7 @@ "src/legacy/core_plugins/management", "src/plugins/management" ], + "advancedSettings": "src/plugins/advanced_settings", "kibana_react": "src/legacy/core_plugins/kibana_react", "kibana-react": "src/plugins/kibana_react", "kibana_utils": "src/plugins/kibana_utils", diff --git a/rfcs/text/0006_management_section_service.md b/rfcs/text/0006_management_section_service.md index d9781e85cd8a9..1a52e85a4ff16 100644 --- a/rfcs/text/0006_management_section_service.md +++ b/rfcs/text/0006_management_section_service.md @@ -257,15 +257,7 @@ Current public contracts owned by the legacy service: ```js // ui/management/index interface API { - PAGE_TITLE_COMPONENT: string; // actually related to advanced settings? - PAGE_SUBTITLE_COMPONENT: string; // actually related to advanced settings? - PAGE_FOOTER_COMPONENT: string; // actually related to advanced settings? SidebarNav: React.FC; - registerSettingsComponent: ( - id: string, - component: string | React.FC, - allowOverride: boolean - ) => void; management: new ManagementSection(); MANAGEMENT_BREADCRUMB: { text: string; diff --git a/src/legacy/core_plugins/kibana/public/management/sections/settings/__snapshots__/advanced_settings.test.tsx.snap b/src/legacy/core_plugins/kibana/public/management/sections/settings/__snapshots__/advanced_settings.test.tsx.snap index 4814432c832e2..e76435fdb73b2 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/settings/__snapshots__/advanced_settings.test.tsx.snap +++ b/src/legacy/core_plugins/kibana/public/management/sections/settings/__snapshots__/advanced_settings.test.tsx.snap @@ -6,7 +6,7 @@ exports[`AdvancedSettings should render read-only when saving is disabled 1`] = gutterSize="none" > - + - + @@ -139,7 +139,7 @@ exports[`AdvancedSettings should render read-only when saving is disabled 1`] = } showNoResultsMessage={true} /> - - + - + @@ -322,7 +322,7 @@ exports[`AdvancedSettings should render specific setting if given setting key 1` } showNoResultsMessage={true} /> - ({ npStart: mockConfig(), @@ -215,6 +217,22 @@ function mockConfig() { core: { uiSettings: config, }, + plugins: { + advancedSettings: { + component: { + register: jest.fn(), + get: () => { + const foo: React.ComponentType = () =>
Hello
; + foo.displayName = 'foo_component'; + return foo; + }, + componentType: { + PAGE_TITLE_COMPONENT: 'page_title_component', + PAGE_SUBTITLE_COMPONENT: 'page_subtitle_component', + }, + }, + }, + }, }; } diff --git a/src/legacy/core_plugins/kibana/public/management/sections/settings/advanced_settings.tsx b/src/legacy/core_plugins/kibana/public/management/sections/settings/advanced_settings.tsx index 569ef73f2b453..c995b391d3d2d 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/settings/advanced_settings.tsx +++ b/src/legacy/core_plugins/kibana/public/management/sections/settings/advanced_settings.tsx @@ -31,14 +31,6 @@ import { getAriaName, toEditableConfig, DEFAULT_CATEGORY } from './lib'; import { FieldSetting, IQuery } from './types'; -import { - registerDefaultComponents, - PAGE_TITLE_COMPONENT, - PAGE_SUBTITLE_COMPONENT, - PAGE_FOOTER_COMPONENT, -} from './components/default_component_registry'; -import { getSettingsComponent } from './components/component_registry'; - interface AdvancedSettingsProps { queryText: string; enableSaving: boolean; @@ -75,8 +67,6 @@ export class AdvancedSettings extends Component diff --git a/src/legacy/core_plugins/kibana/public/management/sections/settings/components/__snapshots__/component_registry.test.tsx.snap b/src/legacy/core_plugins/kibana/public/management/sections/settings/components/__snapshots__/component_registry.test.tsx.snap deleted file mode 100644 index 070b387057061..0000000000000 --- a/src/legacy/core_plugins/kibana/public/management/sections/settings/components/__snapshots__/component_registry.test.tsx.snap +++ /dev/null @@ -1,5 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`getSettingsComponent should throw an error when requesting a component that does not exist 1`] = `"Component not found with id does not exist"`; - -exports[`registerSettingsComponent should disallow registering a component with a duplicate id 1`] = `"Component with id test2 is already registered."`; diff --git a/src/legacy/core_plugins/kibana/public/management/sections/settings/components/component_registry.test.tsx b/src/legacy/core_plugins/kibana/public/management/sections/settings/components/component_registry.test.tsx deleted file mode 100644 index 24e9e5dd3809c..0000000000000 --- a/src/legacy/core_plugins/kibana/public/management/sections/settings/components/component_registry.test.tsx +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import React, { FunctionComponent } from 'react'; -import { - tryRegisterSettingsComponent, - registerSettingsComponent, - getSettingsComponent, -} from './component_registry'; - -describe('tryRegisterSettingsComponent', () => { - it('should allow a component to be registered', () => { - const component = () =>
; - expect(tryRegisterSettingsComponent('tryTest1', component)).toEqual(true); - }); - - it('should return false if the component is already registered, and not allow an override', () => { - const component = () =>
; - expect(tryRegisterSettingsComponent('tryTest2', component)).toEqual(true); - - const updatedComponent = () =>
; - expect(tryRegisterSettingsComponent('tryTest2', updatedComponent)).toEqual(false); - expect(getSettingsComponent('tryTest2')).toBe(component); - }); -}); - -describe('registerSettingsComponent', () => { - it('should allow a component to be registered', () => { - const component = () =>
; - registerSettingsComponent('test', component); - }); - - it('should disallow registering a component with a duplicate id', () => { - const component = () =>
; - registerSettingsComponent('test2', component); - expect(() => registerSettingsComponent('test2', () => )).toThrowErrorMatchingSnapshot(); - }); - - it('should allow a component to be overriden', () => { - const component = () =>
; - registerSettingsComponent('test3', component); - - const anotherComponent = () => ; - registerSettingsComponent('test3', anotherComponent, true); - - expect(getSettingsComponent('test3')).toBe(anotherComponent); - }); - - it('should set a displayName for the component', () => { - const component = () =>
; - registerSettingsComponent('display_name_component', component); - expect((component as FunctionComponent).displayName).toEqual('display_name_component'); - }); -}); - -describe('getSettingsComponent', () => { - it('should allow a component to be retrieved', () => { - const component = () =>
; - registerSettingsComponent('test4', component); - expect(getSettingsComponent('test4')).toBe(component); - }); - - it('should throw an error when requesting a component that does not exist', () => { - expect(() => getSettingsComponent('does not exist')).toThrowErrorMatchingSnapshot(); - }); -}); diff --git a/src/legacy/core_plugins/kibana/public/management/sections/settings/components/component_registry.ts b/src/legacy/core_plugins/kibana/public/management/sections/settings/components/component_registry.ts deleted file mode 100644 index b58180c498edf..0000000000000 --- a/src/legacy/core_plugins/kibana/public/management/sections/settings/components/component_registry.ts +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { ComponentType } from 'react'; - -type Id = string; -const registry: Record | undefined>> = {}; - -/** - * Attempts to register the provided component. - * If a component with that ID is already registered, then the registration fails. - * - * @param {*} id the id of the component to register - * @param {*} component the component - */ -export function tryRegisterSettingsComponent( - id: Id, - component: ComponentType | undefined> -) { - if (id in registry) { - return false; - } - - registerSettingsComponent(id, component); - return true; -} - -/** - * Attempts to register the provided component, with the ability to optionally allow - * the component to override an existing one. - * - * If the intent is to override, then `allowOverride` must be set to true, otherwise an exception is thrown. - * - * @param {*} id the id of the component to register - * @param {*} component the component - * @param {*} allowOverride (default: false) - optional flag to allow this component to override a previously registered component - */ -export function registerSettingsComponent( - id: Id, - component: ComponentType | undefined>, - allowOverride = false -) { - if (!allowOverride && id in registry) { - throw new Error(`Component with id ${id} is already registered.`); - } - - // Setting a display name if one does not already exist. - // This enhances the snapshots, as well as the debugging experience. - if (!component.displayName) { - component.displayName = id; - } - - registry[id] = component; -} - -/** - * Retrieve a registered component by its ID. - * If the component does not exist, then an exception is thrown. - * - * @param {*} id the ID of the component to retrieve - */ -export function getSettingsComponent(id: Id): ComponentType | undefined> { - if (!(id in registry)) { - throw new Error(`Component not found with id ${id}`); - } - return registry[id]; -} diff --git a/src/legacy/core_plugins/kibana/public/management/sections/settings/components/default_component_registry.test.tsx b/src/legacy/core_plugins/kibana/public/management/sections/settings/components/default_component_registry.test.tsx deleted file mode 100644 index ff3f75b79baef..0000000000000 --- a/src/legacy/core_plugins/kibana/public/management/sections/settings/components/default_component_registry.test.tsx +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import React from 'react'; -import { registerDefaultComponents, PAGE_TITLE_COMPONENT } from './default_component_registry'; -import { getSettingsComponent, registerSettingsComponent } from './component_registry'; -import { PageTitle } from './page_title'; - -describe('default_component_registry', () => { - it('should register default components with the registry', () => { - registerDefaultComponents(); - expect(getSettingsComponent(PAGE_TITLE_COMPONENT)).toEqual(PageTitle); - }); - - it('should be able to call "registerDefaultComponents" several times without throwing', () => { - registerDefaultComponents(); - registerDefaultComponents(); - registerDefaultComponents(); - }); - - it('should not override components if they are already registered', () => { - const newComponent = () =>
; - registerSettingsComponent(PAGE_TITLE_COMPONENT, newComponent, true); - registerDefaultComponents(); - - expect(getSettingsComponent(PAGE_TITLE_COMPONENT)).toEqual(newComponent); - }); -}); diff --git a/src/legacy/core_plugins/telemetry/public/views/management/management.js b/src/legacy/core_plugins/telemetry/public/views/management/management.js index 796caf1c8cfe6..7032775e391bb 100644 --- a/src/legacy/core_plugins/telemetry/public/views/management/management.js +++ b/src/legacy/core_plugins/telemetry/public/views/management/management.js @@ -19,7 +19,7 @@ import React from 'react'; import routes from 'ui/routes'; -import { registerSettingsComponent, PAGE_FOOTER_COMPONENT } from 'ui/management'; +import { npSetup } from 'ui/new_platform'; import { TelemetryOptInProvider } from '../../services'; import { TelemetryForm } from '../../components'; @@ -27,6 +27,7 @@ routes.defaults(/\/management/, { resolve: { telemetryManagementSection: function(Private) { const telemetryOptInProvider = Private(TelemetryOptInProvider); + const componentRegistry = npSetup.plugins.advancedSettings.component; const Component = props => ( ); - registerSettingsComponent(PAGE_FOOTER_COMPONENT, Component, true); + componentRegistry.register( + componentRegistry.componentType.PAGE_FOOTER_COMPONENT, + Component, + true + ); }, }, }); diff --git a/src/legacy/ui/public/management/index.d.ts b/src/legacy/ui/public/management/index.d.ts index 7880e1d5d0295..529efd36623a3 100644 --- a/src/legacy/ui/public/management/index.d.ts +++ b/src/legacy/ui/public/management/index.d.ts @@ -18,15 +18,7 @@ */ declare module 'ui/management' { - export const PAGE_TITLE_COMPONENT: string; - export const PAGE_SUBTITLE_COMPONENT: string; - export const PAGE_FOOTER_COMPONENT: string; export const SidebarNav: React.FC; - export function registerSettingsComponent( - id: string, - component: string | React.FC, - allowOverride: boolean - ): void; export const management: any; // TODO - properly provide types export const MANAGEMENT_BREADCRUMB: { text: string; diff --git a/src/legacy/ui/public/management/index.js b/src/legacy/ui/public/management/index.js index b2f1946dbc59c..25d3678c5dbba 100644 --- a/src/legacy/ui/public/management/index.js +++ b/src/legacy/ui/public/management/index.js @@ -17,12 +17,6 @@ * under the License. */ -export { - PAGE_TITLE_COMPONENT, - PAGE_SUBTITLE_COMPONENT, - PAGE_FOOTER_COMPONENT, -} from '../../../core_plugins/kibana/public/management/sections/settings/components/default_component_registry'; -export { registerSettingsComponent } from '../../../core_plugins/kibana/public/management/sections/settings/components/component_registry'; export { MANAGEMENT_BREADCRUMB } from './breadcrumbs'; import { npStart } from 'ui/new_platform'; export const management = npStart.plugins.management.legacy; diff --git a/src/legacy/ui/public/new_platform/__mocks__/helpers.ts b/src/legacy/ui/public/new_platform/__mocks__/helpers.ts index 439ac9b5713df..cf24b0e9675fa 100644 --- a/src/legacy/ui/public/new_platform/__mocks__/helpers.ts +++ b/src/legacy/ui/public/new_platform/__mocks__/helpers.ts @@ -29,6 +29,7 @@ import { managementPluginMock } from '../../../../../plugins/management/public/m import { usageCollectionPluginMock } from '../../../../../plugins/usage_collection/public/mocks'; import { kibanaLegacyPluginMock } from '../../../../../plugins/kibana_legacy/public/mocks'; import { chartPluginMock } from '../../../../../plugins/charts/public/mocks'; +import { advancedSettingsMock } from '../../../../../plugins/advanced_settings/public/mocks'; /* eslint-enable @kbn/eslint/no-restricted-paths */ export const pluginsMock = { @@ -41,6 +42,7 @@ export const pluginsMock = { expressions: expressionsPluginMock.createSetupContract(), uiActions: uiActionsPluginMock.createSetupContract(), usageCollection: usageCollectionPluginMock.createSetupContract(), + advancedSettings: advancedSettingsMock.createSetupContract(), kibana_legacy: kibanaLegacyPluginMock.createSetupContract(), }), createStart: () => ({ @@ -52,6 +54,7 @@ export const pluginsMock = { expressions: expressionsPluginMock.createStartContract(), uiActions: uiActionsPluginMock.createStartContract(), management: managementPluginMock.createStartContract(), + advancedSettings: advancedSettingsMock.createStartContract(), kibana_legacy: kibanaLegacyPluginMock.createStartContract(), }), }; diff --git a/src/legacy/ui/public/new_platform/new_platform.karma_mock.js b/src/legacy/ui/public/new_platform/new_platform.karma_mock.js index c2c8b5a0fae7a..7f4f67ebb06d3 100644 --- a/src/legacy/ui/public/new_platform/new_platform.karma_mock.js +++ b/src/legacy/ui/public/new_platform/new_platform.karma_mock.js @@ -20,6 +20,7 @@ import sinon from 'sinon'; import { getFieldFormatsRegistry } from '../../../../test_utils/public/stub_field_formats'; import { METRIC_TYPE } from '@kbn/analytics'; +import { ComponentRegistry } from '../../../../../src/plugins/advanced_settings/public/'; const mockObservable = () => { return { @@ -58,6 +59,12 @@ const mockCore = { export const npSetup = { core: mockCore, plugins: { + advancedSettings: { + component: { + register: sinon.fake(), + componentType: ComponentRegistry.componentType, + }, + }, usageCollection: { allowTrackUserAgent: sinon.fake(), reportUiStats: sinon.fake(), diff --git a/src/legacy/ui/public/new_platform/new_platform.ts b/src/legacy/ui/public/new_platform/new_platform.ts index 2ade98ec54efd..62abe2eb9b5ba 100644 --- a/src/legacy/ui/public/new_platform/new_platform.ts +++ b/src/legacy/ui/public/new_platform/new_platform.ts @@ -32,6 +32,10 @@ import { DevToolsSetup, DevToolsStart } from '../../../../plugins/dev_tools/publ import { KibanaLegacySetup, KibanaLegacyStart } from '../../../../plugins/kibana_legacy/public'; import { HomePublicPluginSetup, HomePublicPluginStart } from '../../../../plugins/home/public'; import { SharePluginSetup, SharePluginStart } from '../../../../plugins/share/public'; +import { + AdvancedSettingsSetup, + AdvancedSettingsStart, +} from '../../../../plugins/advanced_settings/public'; import { ManagementSetup, ManagementStart } from '../../../../plugins/management/public'; import { BfetchPublicSetup, BfetchPublicStart } from '../../../../plugins/bfetch/public'; import { UsageCollectionSetup } from '../../../../plugins/usage_collection/public'; @@ -54,6 +58,7 @@ export interface PluginsSetup { kibana_legacy: KibanaLegacySetup; share: SharePluginSetup; usageCollection: UsageCollectionSetup; + advancedSettings: AdvancedSettingsSetup; management: ManagementSetup; } @@ -71,6 +76,7 @@ export interface PluginsStart { kibana_legacy: KibanaLegacyStart; share: SharePluginStart; management: ManagementStart; + advancedSettings: AdvancedSettingsStart; } export const npSetup = { diff --git a/src/plugins/advanced_settings/kibana.json b/src/plugins/advanced_settings/kibana.json new file mode 100644 index 0000000000000..5fc1e916ae45f --- /dev/null +++ b/src/plugins/advanced_settings/kibana.json @@ -0,0 +1,7 @@ +{ + "id": "advancedSettings", + "version": "kibana", + "server": false, + "ui": true, + "requiredPlugins": [] +} diff --git a/src/plugins/advanced_settings/public/component_registry/__snapshots__/component_registry.test.tsx.snap b/src/plugins/advanced_settings/public/component_registry/__snapshots__/component_registry.test.tsx.snap new file mode 100644 index 0000000000000..1d6cc882cb344 --- /dev/null +++ b/src/plugins/advanced_settings/public/component_registry/__snapshots__/component_registry.test.tsx.snap @@ -0,0 +1,3 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`ComponentRegistry register should disallow registering a component with a duplicate id 1`] = `"Component with id advanced_settings_page_title is already registered."`; diff --git a/src/plugins/advanced_settings/public/component_registry/component_registry.test.tsx b/src/plugins/advanced_settings/public/component_registry/component_registry.test.tsx new file mode 100644 index 0000000000000..3b722e9517fdb --- /dev/null +++ b/src/plugins/advanced_settings/public/component_registry/component_registry.test.tsx @@ -0,0 +1,90 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from 'react'; +import { ComponentRegistry } from './component_registry'; + +describe('ComponentRegistry', () => { + describe('register', () => { + it('should allow a component to be registered', () => { + const component = () =>
; + new ComponentRegistry().setup.register( + ComponentRegistry.componentType.PAGE_TITLE_COMPONENT, + component + ); + }); + + it('should disallow registering a component with a duplicate id', () => { + const registry = new ComponentRegistry(); + const component = () =>
; + registry.setup.register(ComponentRegistry.componentType.PAGE_TITLE_COMPONENT, component); + expect(() => + registry.setup.register(ComponentRegistry.componentType.PAGE_TITLE_COMPONENT, () => ( + + )) + ).toThrowErrorMatchingSnapshot(); + }); + + it('should allow a component to be overriden', () => { + const registry = new ComponentRegistry(); + const component = () =>
; + registry.setup.register(ComponentRegistry.componentType.PAGE_TITLE_COMPONENT, component); + + const anotherComponent = () => ; + registry.setup.register( + ComponentRegistry.componentType.PAGE_TITLE_COMPONENT, + anotherComponent, + true + ); + + expect(registry.start.get(ComponentRegistry.componentType.PAGE_TITLE_COMPONENT)).toBe( + anotherComponent + ); + }); + }); + + describe('get', () => { + it('should allow a component to be retrieved', () => { + const registry = new ComponentRegistry(); + const component = () =>
; + registry.setup.register(ComponentRegistry.componentType.PAGE_TITLE_COMPONENT, component); + expect(registry.start.get(ComponentRegistry.componentType.PAGE_TITLE_COMPONENT)).toBe( + component + ); + }); + }); + + it('should set a displayName for the component if one does not exist', () => { + const component: React.ComponentType = () =>
; + const registry = new ComponentRegistry(); + registry.setup.register(ComponentRegistry.componentType.PAGE_TITLE_COMPONENT, component); + + expect(component.displayName).toEqual(ComponentRegistry.componentType.PAGE_TITLE_COMPONENT); + }); + + it('should not set a displayName for the component if one already exists', () => { + const component: React.ComponentType = () =>
; + component.displayName = ''; + const registry = new ComponentRegistry(); + + registry.setup.register(ComponentRegistry.componentType.PAGE_TITLE_COMPONENT, component); + + expect(component.displayName).toEqual(''); + }); +}); diff --git a/src/plugins/advanced_settings/public/component_registry/component_registry.ts b/src/plugins/advanced_settings/public/component_registry/component_registry.ts new file mode 100644 index 0000000000000..cc61798e84cb7 --- /dev/null +++ b/src/plugins/advanced_settings/public/component_registry/component_registry.ts @@ -0,0 +1,91 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { ComponentType } from 'react'; +import { PageTitle } from './page_title'; +import { PageSubtitle } from './page_subtitle'; +import { PageFooter } from './page_footer'; + +type Id = + | 'advanced_settings_page_title' + | 'advanced_settings_page_subtitle' + | 'advanced_settings_page_footer'; + +const componentType: { [key: string]: Id } = { + PAGE_TITLE_COMPONENT: 'advanced_settings_page_title' as Id, + PAGE_SUBTITLE_COMPONENT: 'advanced_settings_page_subtitle' as Id, + PAGE_FOOTER_COMPONENT: 'advanced_settings_page_footer' as Id, +}; + +type RegistryComponent = ComponentType | undefined>; + +export class ComponentRegistry { + static readonly componentType = componentType; + static readonly defaultRegistry: Record = { + advanced_settings_page_title: PageTitle, + advanced_settings_page_subtitle: PageSubtitle, + advanced_settings_page_footer: PageFooter, + }; + + registry: { [key in Id]?: RegistryComponent } = {}; + + /** + * Attempts to register the provided component, with the ability to optionally allow + * the component to override an existing one. + * + * If the intent is to override, then `allowOverride` must be set to true, otherwise an exception is thrown. + * + * @param {*} id the id of the component to register + * @param {*} component the component + * @param {*} allowOverride (default: false) - optional flag to allow this component to override a previously registered component + */ + private register(id: Id, component: RegistryComponent, allowOverride = false) { + if (!allowOverride && id in this.registry) { + throw new Error(`Component with id ${id} is already registered.`); + } + + // Setting a display name if one does not already exist. + // This enhances the snapshots, as well as the debugging experience. + if (!component.displayName) { + component.displayName = id; + } + + this.registry[id] = component; + } + + /** + * Retrieve a registered component by its ID. + * If the component does not exist, then an exception is thrown. + * + * @param {*} id the ID of the component to retrieve + */ + private get(id: Id): RegistryComponent { + return this.registry[id] || ComponentRegistry.defaultRegistry[id]; + } + + setup = { + componentType: ComponentRegistry.componentType, + register: this.register.bind(this), + }; + + start = { + componentType: ComponentRegistry.componentType, + get: this.get.bind(this), + }; +} diff --git a/src/plugins/advanced_settings/public/component_registry/index.ts b/src/plugins/advanced_settings/public/component_registry/index.ts new file mode 100644 index 0000000000000..79c9248e0c2a9 --- /dev/null +++ b/src/plugins/advanced_settings/public/component_registry/index.ts @@ -0,0 +1,20 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export { ComponentRegistry } from './component_registry'; diff --git a/src/legacy/core_plugins/kibana/public/management/sections/settings/components/page_footer/__snapshots__/page_footer.test.tsx.snap b/src/plugins/advanced_settings/public/component_registry/page_footer/__snapshots__/page_footer.test.tsx.snap similarity index 100% rename from src/legacy/core_plugins/kibana/public/management/sections/settings/components/page_footer/__snapshots__/page_footer.test.tsx.snap rename to src/plugins/advanced_settings/public/component_registry/page_footer/__snapshots__/page_footer.test.tsx.snap diff --git a/src/legacy/core_plugins/kibana/public/management/sections/settings/components/page_footer/index.ts b/src/plugins/advanced_settings/public/component_registry/page_footer/index.ts similarity index 100% rename from src/legacy/core_plugins/kibana/public/management/sections/settings/components/page_footer/index.ts rename to src/plugins/advanced_settings/public/component_registry/page_footer/index.ts diff --git a/src/legacy/core_plugins/kibana/public/management/sections/settings/components/page_footer/page_footer.test.tsx b/src/plugins/advanced_settings/public/component_registry/page_footer/page_footer.test.tsx similarity index 100% rename from src/legacy/core_plugins/kibana/public/management/sections/settings/components/page_footer/page_footer.test.tsx rename to src/plugins/advanced_settings/public/component_registry/page_footer/page_footer.test.tsx diff --git a/src/legacy/core_plugins/kibana/public/management/sections/settings/components/page_footer/page_footer.ts b/src/plugins/advanced_settings/public/component_registry/page_footer/page_footer.ts similarity index 100% rename from src/legacy/core_plugins/kibana/public/management/sections/settings/components/page_footer/page_footer.ts rename to src/plugins/advanced_settings/public/component_registry/page_footer/page_footer.ts diff --git a/src/legacy/core_plugins/kibana/public/management/sections/settings/components/page_subtitle/__snapshots__/page_subtitle.test.tsx.snap b/src/plugins/advanced_settings/public/component_registry/page_subtitle/__snapshots__/page_subtitle.test.tsx.snap similarity index 100% rename from src/legacy/core_plugins/kibana/public/management/sections/settings/components/page_subtitle/__snapshots__/page_subtitle.test.tsx.snap rename to src/plugins/advanced_settings/public/component_registry/page_subtitle/__snapshots__/page_subtitle.test.tsx.snap diff --git a/src/legacy/core_plugins/kibana/public/management/sections/settings/components/page_subtitle/index.ts b/src/plugins/advanced_settings/public/component_registry/page_subtitle/index.ts similarity index 100% rename from src/legacy/core_plugins/kibana/public/management/sections/settings/components/page_subtitle/index.ts rename to src/plugins/advanced_settings/public/component_registry/page_subtitle/index.ts diff --git a/src/legacy/core_plugins/kibana/public/management/sections/settings/components/page_subtitle/page_subtitle.test.tsx b/src/plugins/advanced_settings/public/component_registry/page_subtitle/page_subtitle.test.tsx similarity index 100% rename from src/legacy/core_plugins/kibana/public/management/sections/settings/components/page_subtitle/page_subtitle.test.tsx rename to src/plugins/advanced_settings/public/component_registry/page_subtitle/page_subtitle.test.tsx diff --git a/src/legacy/core_plugins/kibana/public/management/sections/settings/components/page_subtitle/page_subtitle.ts b/src/plugins/advanced_settings/public/component_registry/page_subtitle/page_subtitle.ts similarity index 100% rename from src/legacy/core_plugins/kibana/public/management/sections/settings/components/page_subtitle/page_subtitle.ts rename to src/plugins/advanced_settings/public/component_registry/page_subtitle/page_subtitle.ts diff --git a/src/legacy/core_plugins/kibana/public/management/sections/settings/components/page_title/__snapshots__/page_title.test.tsx.snap b/src/plugins/advanced_settings/public/component_registry/page_title/__snapshots__/page_title.test.tsx.snap similarity index 85% rename from src/legacy/core_plugins/kibana/public/management/sections/settings/components/page_title/__snapshots__/page_title.test.tsx.snap rename to src/plugins/advanced_settings/public/component_registry/page_title/__snapshots__/page_title.test.tsx.snap index 8dd4e501067b5..10b799a986b84 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/settings/components/page_title/__snapshots__/page_title.test.tsx.snap +++ b/src/plugins/advanced_settings/public/component_registry/page_title/__snapshots__/page_title.test.tsx.snap @@ -7,7 +7,7 @@ exports[`PageTitle should render normally 1`] = ` > diff --git a/src/legacy/core_plugins/kibana/public/management/sections/settings/components/page_title/index.ts b/src/plugins/advanced_settings/public/component_registry/page_title/index.ts similarity index 100% rename from src/legacy/core_plugins/kibana/public/management/sections/settings/components/page_title/index.ts rename to src/plugins/advanced_settings/public/component_registry/page_title/index.ts diff --git a/src/legacy/core_plugins/kibana/public/management/sections/settings/components/page_title/page_title.test.tsx b/src/plugins/advanced_settings/public/component_registry/page_title/page_title.test.tsx similarity index 100% rename from src/legacy/core_plugins/kibana/public/management/sections/settings/components/page_title/page_title.test.tsx rename to src/plugins/advanced_settings/public/component_registry/page_title/page_title.test.tsx diff --git a/src/legacy/core_plugins/kibana/public/management/sections/settings/components/page_title/page_title.tsx b/src/plugins/advanced_settings/public/component_registry/page_title/page_title.tsx similarity index 91% rename from src/legacy/core_plugins/kibana/public/management/sections/settings/components/page_title/page_title.tsx rename to src/plugins/advanced_settings/public/component_registry/page_title/page_title.tsx index cb807302c2380..18d9c60d331bb 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/settings/components/page_title/page_title.tsx +++ b/src/plugins/advanced_settings/public/component_registry/page_title/page_title.tsx @@ -25,7 +25,7 @@ export const PageTitle = () => { return (

- +

); diff --git a/src/plugins/advanced_settings/public/index.ts b/src/plugins/advanced_settings/public/index.ts new file mode 100644 index 0000000000000..13be36e671f75 --- /dev/null +++ b/src/plugins/advanced_settings/public/index.ts @@ -0,0 +1,27 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { PluginInitializerContext } from 'kibana/public'; +import { AdvancedSettingsPlugin } from './plugin'; +export { AdvancedSettingsSetup, AdvancedSettingsStart } from './types'; +export { ComponentRegistry } from './component_registry'; + +export function plugin(initializerContext: PluginInitializerContext) { + return new AdvancedSettingsPlugin(); +} diff --git a/src/plugins/advanced_settings/public/mocks.ts b/src/plugins/advanced_settings/public/mocks.ts new file mode 100644 index 0000000000000..e147f57101aae --- /dev/null +++ b/src/plugins/advanced_settings/public/mocks.ts @@ -0,0 +1,33 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { ComponentRegistry } from './component_registry'; + +const register = jest.fn(); +const get = jest.fn(); +const componentType = ComponentRegistry.componentType; + +export const advancedSettingsMock = { + createSetupContract() { + return { register, componentType }; + }, + createStartContract() { + return { get, componentType }; + }, +}; diff --git a/src/legacy/core_plugins/kibana/public/management/sections/settings/components/default_component_registry.ts b/src/plugins/advanced_settings/public/plugin.ts similarity index 54% rename from src/legacy/core_plugins/kibana/public/management/sections/settings/components/default_component_registry.ts rename to src/plugins/advanced_settings/public/plugin.ts index 80b2f2e79b9c7..692e515ca4e5e 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/settings/components/default_component_registry.ts +++ b/src/plugins/advanced_settings/public/plugin.ts @@ -17,17 +17,23 @@ * under the License. */ -import { tryRegisterSettingsComponent } from './component_registry'; -import { PageTitle } from './page_title'; -import { PageSubtitle } from './page_subtitle'; -import { PageFooter } from './page_footer'; +import { CoreSetup, CoreStart, Plugin } from 'kibana/public'; +import { ComponentRegistry } from './component_registry'; +import { AdvancedSettingsSetup, AdvancedSettingsStart } from './types'; -export const PAGE_TITLE_COMPONENT = 'advanced_settings_page_title'; -export const PAGE_SUBTITLE_COMPONENT = 'advanced_settings_page_subtitle'; -export const PAGE_FOOTER_COMPONENT = 'advanced_settings_page_footer'; +const component = new ComponentRegistry(); -export function registerDefaultComponents() { - tryRegisterSettingsComponent(PAGE_TITLE_COMPONENT, PageTitle); - tryRegisterSettingsComponent(PAGE_SUBTITLE_COMPONENT, PageSubtitle); - tryRegisterSettingsComponent(PAGE_FOOTER_COMPONENT, PageFooter); +export class AdvancedSettingsPlugin + implements Plugin { + public setup(core: CoreSetup) { + return { + component: component.setup, + }; + } + + public start(core: CoreStart) { + return { + component: component.start, + }; + } } diff --git a/src/plugins/advanced_settings/public/types.ts b/src/plugins/advanced_settings/public/types.ts new file mode 100644 index 0000000000000..a9b965c3c22de --- /dev/null +++ b/src/plugins/advanced_settings/public/types.ts @@ -0,0 +1,27 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { ComponentRegistry } from './component_registry'; + +export interface AdvancedSettingsSetup { + component: ComponentRegistry['setup']; +} +export interface AdvancedSettingsStart { + component: ComponentRegistry['start']; +} diff --git a/x-pack/legacy/plugins/spaces/public/advanced_settings/advanced_settings_service.test.tsx b/x-pack/legacy/plugins/spaces/public/advanced_settings/advanced_settings_service.test.tsx index aa3c6acf26236..3c6b2332bbbdc 100644 --- a/x-pack/legacy/plugins/spaces/public/advanced_settings/advanced_settings_service.test.tsx +++ b/x-pack/legacy/plugins/spaces/public/advanced_settings/advanced_settings_service.test.tsx @@ -5,33 +5,30 @@ */ import { AdvancedSettingsService } from './advanced_settings_service'; -jest.mock('ui/management', () => { - return { - PAGE_TITLE_COMPONENT: 'page_title_component', - PAGE_SUBTITLE_COMPONENT: 'page_subtitle_component', - }; -}); +import { advancedSettingsMock } from '../../../../../../src/plugins/advanced_settings/public/mocks'; + +const componentRegistryMock = advancedSettingsMock.createSetupContract(); describe('Advanced Settings Service', () => { describe('#setup', () => { it('registers space-aware components to augment the advanced settings screen', () => { const deps = { getActiveSpace: jest.fn().mockResolvedValue({ id: 'foo', name: 'foo-space' }), - registerSettingsComponent: jest.fn(), + componentRegistry: componentRegistryMock, }; const advancedSettingsService = new AdvancedSettingsService(); advancedSettingsService.setup(deps); - expect(deps.registerSettingsComponent).toHaveBeenCalledTimes(2); - expect(deps.registerSettingsComponent).toHaveBeenCalledWith( - 'page_title_component', + expect(deps.componentRegistry.register).toHaveBeenCalledTimes(2); + expect(deps.componentRegistry.register).toHaveBeenCalledWith( + componentRegistryMock.componentType.PAGE_TITLE_COMPONENT, expect.any(Function), true ); - expect(deps.registerSettingsComponent).toHaveBeenCalledWith( - 'page_subtitle_component', + expect(deps.componentRegistry.register).toHaveBeenCalledWith( + componentRegistryMock.componentType.PAGE_SUBTITLE_COMPONENT, expect.any(Function), true ); diff --git a/x-pack/legacy/plugins/spaces/public/advanced_settings/advanced_settings_service.tsx b/x-pack/legacy/plugins/spaces/public/advanced_settings/advanced_settings_service.tsx index 9c6c2fcc2cdda..a1552add18f2d 100644 --- a/x-pack/legacy/plugins/spaces/public/advanced_settings/advanced_settings_service.tsx +++ b/x-pack/legacy/plugins/spaces/public/advanced_settings/advanced_settings_service.tsx @@ -4,25 +4,29 @@ * you may not use this file except in compliance with the Elastic License. */ import React from 'react'; -import { PAGE_TITLE_COMPONENT, PAGE_SUBTITLE_COMPONENT } from 'ui/management'; import { Space } from '../../common/model/space'; import { AdvancedSettingsTitle, AdvancedSettingsSubtitle } from './components'; +import { AdvancedSettingsSetup } from '../../../../../../src/plugins/advanced_settings/public'; interface SetupDeps { getActiveSpace: () => Promise; - registerSettingsComponent: ( - id: string, - component: string | React.FC, - allowOverride: boolean - ) => void; + componentRegistry: AdvancedSettingsSetup['component']; } export class AdvancedSettingsService { - public setup({ getActiveSpace, registerSettingsComponent }: SetupDeps) { + public setup({ getActiveSpace, componentRegistry }: SetupDeps) { const PageTitle = () => ; const SubTitle = () => ; - registerSettingsComponent(PAGE_TITLE_COMPONENT, PageTitle, true); - registerSettingsComponent(PAGE_SUBTITLE_COMPONENT, SubTitle, true); + componentRegistry.register( + componentRegistry.componentType.PAGE_TITLE_COMPONENT, + PageTitle, + true + ); + componentRegistry.register( + componentRegistry.componentType.PAGE_SUBTITLE_COMPONENT, + SubTitle, + true + ); } } diff --git a/x-pack/legacy/plugins/spaces/public/legacy.ts b/x-pack/legacy/plugins/spaces/public/legacy.ts index 1dffbd2661714..200cae5498595 100644 --- a/x-pack/legacy/plugins/spaces/public/legacy.ts +++ b/x-pack/legacy/plugins/spaces/public/legacy.ts @@ -4,7 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -import { registerSettingsComponent } from 'ui/management'; import { npSetup, npStart } from 'ui/new_platform'; import { setup as managementSetup } from '../../../../../src/legacy/core_plugins/management/public/legacy'; import { plugin } from '.'; @@ -16,9 +15,7 @@ const spacesPlugin: SpacesPlugin = plugin(); const pluginsSetup: PluginsSetup = { home: npSetup.plugins.home, management: managementSetup, - __managementLegacyCompat: { - registerSettingsComponent, - }, + advancedSettings: npSetup.plugins.advancedSettings, }; const pluginsStart: PluginsStart = { diff --git a/x-pack/legacy/plugins/spaces/public/plugin.tsx b/x-pack/legacy/plugins/spaces/public/plugin.tsx index 1ddb69a5b595c..e6271ac3a0a70 100644 --- a/x-pack/legacy/plugins/spaces/public/plugin.tsx +++ b/x-pack/legacy/plugins/spaces/public/plugin.tsx @@ -8,6 +8,7 @@ import { CoreSetup, CoreStart, Plugin } from 'src/core/public'; import { HomePublicPluginSetup } from 'src/plugins/home/public'; import { ManagementSetup } from 'src/legacy/core_plugins/management/public'; import { ManagementStart } from 'src/plugins/management/public'; +import { AdvancedSettingsSetup } from 'src/plugins/advanced_settings/public'; import { SpacesManager } from './spaces_manager'; import { initSpacesNavControl } from './nav_control'; import { createSpacesFeatureCatalogueEntry } from './create_feature_catalogue_entry'; @@ -22,13 +23,7 @@ export interface SpacesPluginStart { export interface PluginsSetup { home?: HomePublicPluginSetup; management: ManagementSetup; - __managementLegacyCompat: { - registerSettingsComponent: ( - id: string, - component: string | React.FC, - allowOverride: boolean - ) => void; - }; + advancedSettings: AdvancedSettingsSetup; } export interface PluginsStart { @@ -53,7 +48,7 @@ export class SpacesPlugin implements Plugin this.spacesManager.getActiveSpace(), - registerSettingsComponent: plugins.__managementLegacyCompat.registerSettingsComponent, + componentRegistry: plugins.advancedSettings.component, }); if (plugins.home) { diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index abf56cd2d05b6..58d97ce263bea 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -1624,7 +1624,7 @@ "kbn.management.settings.form.clearSearchResultText": "(検索結果を消去)", "kbn.management.settings.form.noSearchResultText": "設定が見つかりませんでした {clearSearch}", "kbn.management.settings.form.searchResultText": "検索用語により {settingsCount} 件の設定が非表示になっています {clearSearch}", - "kbn.management.settings.pageTitle": "設定", + "advancedSettings.pageTitle": "設定", "kbn.management.settings.searchBar.unableToParseQueryErrorMessage": "クエリをパースできません", "kbn.management.settings.searchBarAriaLabel": "高度な設定を検索", "kbn.management.settings.sectionLabel": "高度な設定", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index b97982b5c99da..5d62e15be2b9f 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -1624,7 +1624,7 @@ "kbn.management.settings.form.clearSearchResultText": "(清除搜索)", "kbn.management.settings.form.noSearchResultText": "未找到设置{clearSearch}", "kbn.management.settings.form.searchResultText": "搜索词隐藏了 {settingsCount} 个设置{clearSearch}", - "kbn.management.settings.pageTitle": "设置", + "advancedSettings.pageTitle": "设置", "kbn.management.settings.searchBar.unableToParseQueryErrorMessage": "无法解析查询", "kbn.management.settings.searchBarAriaLabel": "搜索高级设置", "kbn.management.settings.sectionLabel": "高级设置", From 74768e567ba7b66496002c401ad0a9be3b69e334 Mon Sep 17 00:00:00 2001 From: Tyler Smalley Date: Tue, 4 Feb 2020 11:49:38 -0800 Subject: [PATCH 13/86] Bumps terser-webpack-plugin to 2.3.4 (#56662) We're seeing occasional "Error: Call retries were exceeded" exception with Terser, which should be resolved by https://github.com/webpack-contrib/terser-webpack-plugin/commit/abfd9506207cf392de63a0629de82145efff2361, first included in 2.3.4 Signed-off-by: Tyler Smalley --- package.json | 2 +- packages/kbn-pm/dist/index.js | 21114 ++++++++++++++++++-------------- yarn.lock | 221 +- 3 files changed, 11897 insertions(+), 9440 deletions(-) diff --git a/package.json b/package.json index f9a3bfd99b109..c9376e974492a 100644 --- a/package.json +++ b/package.json @@ -262,7 +262,7 @@ "style-loader": "0.23.1", "symbol-observable": "^1.2.0", "tar": "4.4.13", - "terser-webpack-plugin": "^2.1.2", + "terser-webpack-plugin": "^2.3.4", "thread-loader": "^2.1.3", "tinygradient": "0.4.3", "tinymath": "1.2.1", diff --git a/packages/kbn-pm/dist/index.js b/packages/kbn-pm/dist/index.js index 8bded9d403c21..8d17d285dce21 100644 --- a/packages/kbn-pm/dist/index.js +++ b/packages/kbn-pm/dist/index.js @@ -94,7 +94,7 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _cli__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "run", function() { return _cli__WEBPACK_IMPORTED_MODULE_0__["run"]; }); -/* harmony import */ var _production__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(703); +/* harmony import */ var _production__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(705); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "buildProductionProjects", function() { return _production__WEBPACK_IMPORTED_MODULE_1__["buildProductionProjects"]; }); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "prepareExternalProjectDependencies", function() { return _production__WEBPACK_IMPORTED_MODULE_1__["prepareExternalProjectDependencies"]; }); @@ -152,7 +152,7 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(16); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _commands__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(17); -/* harmony import */ var _run__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(689); +/* harmony import */ var _run__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(690); /* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(34); /* * Licensed to Elasticsearch B.V. under one or more contributor @@ -2507,8 +2507,8 @@ __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "commands", function() { return commands; }); /* harmony import */ var _bootstrap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(18); /* harmony import */ var _clean__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(587); -/* harmony import */ var _run__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(686); -/* harmony import */ var _watch__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(687); +/* harmony import */ var _run__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(687); +/* harmony import */ var _watch__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(688); /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with @@ -46624,9 +46624,11 @@ function range(a, b, str) { try { var util = __webpack_require__(29); + /* istanbul ignore next */ if (typeof util.inherits !== 'function') throw ''; module.exports = util.inherits; } catch (e) { + /* istanbul ignore next */ module.exports = __webpack_require__(510); } @@ -46638,24 +46640,28 @@ try { if (typeof Object.create === 'function') { // implementation from standard node.js 'util' module module.exports = function inherits(ctor, superCtor) { - ctor.super_ = superCtor - ctor.prototype = Object.create(superCtor.prototype, { - constructor: { - value: ctor, - enumerable: false, - writable: true, - configurable: true - } - }); + if (superCtor) { + ctor.super_ = superCtor + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }) + } }; } else { // old school shim for old browsers module.exports = function inherits(ctor, superCtor) { - ctor.super_ = superCtor - var TempCtor = function () {} - TempCtor.prototype = superCtor.prototype - ctor.prototype = new TempCtor() - ctor.prototype.constructor = ctor + if (superCtor) { + ctor.super_ = superCtor + var TempCtor = function () {} + TempCtor.prototype = superCtor.prototype + ctor.prototype = new TempCtor() + ctor.prototype.constructor = ctor + } } } @@ -68970,7 +68976,7 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(chalk__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var del__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(588); /* harmony import */ var del__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(del__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var ora__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(675); +/* harmony import */ var ora__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(676); /* harmony import */ var ora__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(ora__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(16); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_3__); @@ -69078,13 +69084,13 @@ const CleanCommand = { const {promisify} = __webpack_require__(29); const path = __webpack_require__(16); const globby = __webpack_require__(589); -const isGlob = __webpack_require__(601); -const slash = __webpack_require__(662); -const gracefulFs = __webpack_require__(664); -const isPathCwd = __webpack_require__(668); -const isPathInside = __webpack_require__(669); -const rimraf = __webpack_require__(670); -const pMap = __webpack_require__(671); +const isGlob = __webpack_require__(606); +const slash = __webpack_require__(667); +const gracefulFs = __webpack_require__(22); +const isPathCwd = __webpack_require__(669); +const isPathInside = __webpack_require__(670); +const rimraf = __webpack_require__(671); +const pMap = __webpack_require__(672); const rimrafP = promisify(rimraf); @@ -69206,11 +69212,11 @@ module.exports.sync = (patterns, {force, dryRun, cwd = process.cwd(), ...options const fs = __webpack_require__(23); const arrayUnion = __webpack_require__(590); const merge2 = __webpack_require__(591); -const glob = __webpack_require__(502); -const fastGlob = __webpack_require__(592); -const dirGlob = __webpack_require__(658); -const gitignore = __webpack_require__(660); -const {FilterStream, UniqueStream} = __webpack_require__(663); +const glob = __webpack_require__(592); +const fastGlob = __webpack_require__(597); +const dirGlob = __webpack_require__(663); +const gitignore = __webpack_require__(665); +const {FilterStream, UniqueStream} = __webpack_require__(668); const DEFAULT_FILTER = () => false; @@ -69512,5704 +69518,7286 @@ function pauseStreams (streams, options) { /* 592 */ /***/ (function(module, exports, __webpack_require__) { -"use strict"; - -const taskManager = __webpack_require__(593); -const async_1 = __webpack_require__(621); -const stream_1 = __webpack_require__(654); -const sync_1 = __webpack_require__(655); -const settings_1 = __webpack_require__(657); -const utils = __webpack_require__(594); -function FastGlob(source, options) { - try { - assertPatternsInput(source); - } - catch (error) { - return Promise.reject(error); - } - const works = getWorks(source, async_1.default, options); - return Promise.all(works).then(utils.array.flatten); -} -(function (FastGlob) { - function sync(source, options) { - assertPatternsInput(source); - const works = getWorks(source, sync_1.default, options); - return utils.array.flatten(works); - } - FastGlob.sync = sync; - function stream(source, options) { - assertPatternsInput(source); - const works = getWorks(source, stream_1.default, options); - /** - * The stream returned by the provider cannot work with an asynchronous iterator. - * To support asynchronous iterators, regardless of the number of tasks, we always multiplex streams. - * This affects performance (+25%). I don't see best solution right now. - */ - return utils.stream.merge(works); - } - FastGlob.stream = stream; - function generateTasks(source, options) { - assertPatternsInput(source); - const patterns = [].concat(source); - const settings = new settings_1.default(options); - return taskManager.generate(patterns, settings); - } - FastGlob.generateTasks = generateTasks; -})(FastGlob || (FastGlob = {})); -function getWorks(source, _Provider, options) { - const patterns = [].concat(source); - const settings = new settings_1.default(options); - const tasks = taskManager.generate(patterns, settings); - const provider = new _Provider(settings); - return tasks.map(provider.read, provider); -} -function assertPatternsInput(source) { - if ([].concat(source).every(isString)) { - return; - } - throw new TypeError('Patterns must be a string or an array of strings'); -} -function isString(source) { - /* tslint:disable-next-line strict-type-predicates */ - return typeof source === 'string'; -} -module.exports = FastGlob; +// Approach: +// +// 1. Get the minimatch set +// 2. For each pattern in the set, PROCESS(pattern, false) +// 3. Store matches per-set, then uniq them +// +// PROCESS(pattern, inGlobStar) +// Get the first [n] items from pattern that are all strings +// Join these together. This is PREFIX. +// If there is no more remaining, then stat(PREFIX) and +// add to matches if it succeeds. END. +// +// If inGlobStar and PREFIX is symlink and points to dir +// set ENTRIES = [] +// else readdir(PREFIX) as ENTRIES +// If fail, END +// +// with ENTRIES +// If pattern[n] is GLOBSTAR +// // handle the case where the globstar match is empty +// // by pruning it out, and testing the resulting pattern +// PROCESS(pattern[0..n] + pattern[n+1 .. $], false) +// // handle other cases. +// for ENTRY in ENTRIES (not dotfiles) +// // attach globstar + tail onto the entry +// // Mark that this entry is a globstar match +// PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true) +// +// else // not globstar +// for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot) +// Test ENTRY against pattern[n] +// If fails, continue +// If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $]) +// +// Caveat: +// Cache all stats and readdirs results to minimize syscall. Since all +// we ever care about is existence and directory-ness, we can just keep +// `true` for files, and [children,...] for directories, or `false` for +// things that don't exist. +module.exports = glob -/***/ }), -/* 593 */ -/***/ (function(module, exports, __webpack_require__) { +var fs = __webpack_require__(23) +var rp = __webpack_require__(503) +var minimatch = __webpack_require__(505) +var Minimatch = minimatch.Minimatch +var inherits = __webpack_require__(593) +var EE = __webpack_require__(379).EventEmitter +var path = __webpack_require__(16) +var assert = __webpack_require__(30) +var isAbsolute = __webpack_require__(511) +var globSync = __webpack_require__(595) +var common = __webpack_require__(596) +var alphasort = common.alphasort +var alphasorti = common.alphasorti +var setopts = common.setopts +var ownProp = common.ownProp +var inflight = __webpack_require__(514) +var util = __webpack_require__(29) +var childrenIgnored = common.childrenIgnored +var isIgnored = common.isIgnored -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const utils = __webpack_require__(594); -function generate(patterns, settings) { - const positivePatterns = getPositivePatterns(patterns); - const negativePatterns = getNegativePatternsAsPositive(patterns, settings.ignore); - /** - * When the `caseSensitiveMatch` option is disabled, all patterns must be marked as dynamic, because we cannot check - * filepath directly (without read directory). - */ - const staticPatterns = !settings.caseSensitiveMatch ? [] : positivePatterns.filter(utils.pattern.isStaticPattern); - const dynamicPatterns = !settings.caseSensitiveMatch ? positivePatterns : positivePatterns.filter(utils.pattern.isDynamicPattern); - const staticTasks = convertPatternsToTasks(staticPatterns, negativePatterns, /* dynamic */ false); - const dynamicTasks = convertPatternsToTasks(dynamicPatterns, negativePatterns, /* dynamic */ true); - return staticTasks.concat(dynamicTasks); -} -exports.generate = generate; -function convertPatternsToTasks(positive, negative, dynamic) { - const positivePatternsGroup = groupPatternsByBaseDirectory(positive); - // When we have a global group – there is no reason to divide the patterns into independent tasks. - // In this case, the global task covers the rest. - if ('.' in positivePatternsGroup) { - const task = convertPatternGroupToTask('.', positive, negative, dynamic); - return [task]; - } - return convertPatternGroupsToTasks(positivePatternsGroup, negative, dynamic); -} -exports.convertPatternsToTasks = convertPatternsToTasks; -function getPositivePatterns(patterns) { - return utils.pattern.getPositivePatterns(patterns); -} -exports.getPositivePatterns = getPositivePatterns; -function getNegativePatternsAsPositive(patterns, ignore) { - const negative = utils.pattern.getNegativePatterns(patterns).concat(ignore); - const positive = negative.map(utils.pattern.convertToPositivePattern); - return positive; -} -exports.getNegativePatternsAsPositive = getNegativePatternsAsPositive; -function groupPatternsByBaseDirectory(patterns) { - return patterns.reduce((collection, pattern) => { - const base = utils.pattern.getBaseDirectory(pattern); - if (base in collection) { - collection[base].push(pattern); - } - else { - collection[base] = [pattern]; - } - return collection; - }, {}); -} -exports.groupPatternsByBaseDirectory = groupPatternsByBaseDirectory; -function convertPatternGroupsToTasks(positive, negative, dynamic) { - return Object.keys(positive).map((base) => { - return convertPatternGroupToTask(base, positive[base], negative, dynamic); - }); -} -exports.convertPatternGroupsToTasks = convertPatternGroupsToTasks; -function convertPatternGroupToTask(base, positive, negative, dynamic) { - return { - dynamic, - positive, - negative, - base, - patterns: [].concat(positive, negative.map(utils.pattern.convertToNegativePattern)) - }; -} -exports.convertPatternGroupToTask = convertPatternGroupToTask; +var once = __webpack_require__(385) +function glob (pattern, options, cb) { + if (typeof options === 'function') cb = options, options = {} + if (!options) options = {} -/***/ }), -/* 594 */ -/***/ (function(module, exports, __webpack_require__) { + if (options.sync) { + if (cb) + throw new TypeError('callback provided to sync glob') + return globSync(pattern, options) + } -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const array = __webpack_require__(595); -exports.array = array; -const errno = __webpack_require__(596); -exports.errno = errno; -const fs = __webpack_require__(597); -exports.fs = fs; -const path = __webpack_require__(598); -exports.path = path; -const pattern = __webpack_require__(599); -exports.pattern = pattern; -const stream = __webpack_require__(620); -exports.stream = stream; + return new Glob(pattern, options, cb) +} +glob.sync = globSync +var GlobSync = glob.GlobSync = globSync.GlobSync -/***/ }), -/* 595 */ -/***/ (function(module, exports, __webpack_require__) { +// old api surface +glob.glob = glob -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -function flatten(items) { - return items.reduce((collection, item) => [].concat(collection, item), []); -} -exports.flatten = flatten; +function extend (origin, add) { + if (add === null || typeof add !== 'object') { + return origin + } + var keys = Object.keys(add) + var i = keys.length + while (i--) { + origin[keys[i]] = add[keys[i]] + } + return origin +} -/***/ }), -/* 596 */ -/***/ (function(module, exports, __webpack_require__) { +glob.hasMagic = function (pattern, options_) { + var options = extend({}, options_) + options.noprocess = true -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -function isEnoentCodeError(error) { - return error.code === 'ENOENT'; -} -exports.isEnoentCodeError = isEnoentCodeError; + var g = new Glob(pattern, options) + var set = g.minimatch.set + if (!pattern) + return false -/***/ }), -/* 597 */ -/***/ (function(module, exports, __webpack_require__) { + if (set.length > 1) + return true -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -class DirentFromStats { - constructor(name, stats) { - this.name = name; - this.isBlockDevice = stats.isBlockDevice.bind(stats); - this.isCharacterDevice = stats.isCharacterDevice.bind(stats); - this.isDirectory = stats.isDirectory.bind(stats); - this.isFIFO = stats.isFIFO.bind(stats); - this.isFile = stats.isFile.bind(stats); - this.isSocket = stats.isSocket.bind(stats); - this.isSymbolicLink = stats.isSymbolicLink.bind(stats); - } -} -function createDirentFromStats(name, stats) { - return new DirentFromStats(name, stats); -} -exports.createDirentFromStats = createDirentFromStats; + for (var j = 0; j < set[0].length; j++) { + if (typeof set[0][j] !== 'string') + return true + } + return false +} -/***/ }), -/* 598 */ -/***/ (function(module, exports, __webpack_require__) { +glob.Glob = Glob +inherits(Glob, EE) +function Glob (pattern, options, cb) { + if (typeof options === 'function') { + cb = options + options = null + } -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const path = __webpack_require__(16); -/** - * Designed to work only with simple paths: `dir\\file`. - */ -function unixify(filepath) { - return filepath.replace(/\\/g, '/'); -} -exports.unixify = unixify; -function makeAbsolute(cwd, filepath) { - return path.resolve(cwd, filepath); -} -exports.makeAbsolute = makeAbsolute; + if (options && options.sync) { + if (cb) + throw new TypeError('callback provided to sync glob') + return new GlobSync(pattern, options) + } + if (!(this instanceof Glob)) + return new Glob(pattern, options, cb) -/***/ }), -/* 599 */ -/***/ (function(module, exports, __webpack_require__) { + setopts(this, pattern, options) + this._didRealPath = false -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const path = __webpack_require__(16); -const globParent = __webpack_require__(600); -const isGlob = __webpack_require__(601); -const micromatch = __webpack_require__(603); -const GLOBSTAR = '**'; -function isStaticPattern(pattern) { - return !isDynamicPattern(pattern); -} -exports.isStaticPattern = isStaticPattern; -function isDynamicPattern(pattern) { - return isGlob(pattern, { strict: false }); -} -exports.isDynamicPattern = isDynamicPattern; -function convertToPositivePattern(pattern) { - return isNegativePattern(pattern) ? pattern.slice(1) : pattern; -} -exports.convertToPositivePattern = convertToPositivePattern; -function convertToNegativePattern(pattern) { - return '!' + pattern; -} -exports.convertToNegativePattern = convertToNegativePattern; -function isNegativePattern(pattern) { - return pattern.startsWith('!') && pattern[1] !== '('; -} -exports.isNegativePattern = isNegativePattern; -function isPositivePattern(pattern) { - return !isNegativePattern(pattern); -} -exports.isPositivePattern = isPositivePattern; -function getNegativePatterns(patterns) { - return patterns.filter(isNegativePattern); -} -exports.getNegativePatterns = getNegativePatterns; -function getPositivePatterns(patterns) { - return patterns.filter(isPositivePattern); -} -exports.getPositivePatterns = getPositivePatterns; -function getBaseDirectory(pattern) { - return globParent(pattern); -} -exports.getBaseDirectory = getBaseDirectory; -function hasGlobStar(pattern) { - return pattern.indexOf(GLOBSTAR) !== -1; -} -exports.hasGlobStar = hasGlobStar; -function endsWithSlashGlobStar(pattern) { - return pattern.endsWith('/' + GLOBSTAR); -} -exports.endsWithSlashGlobStar = endsWithSlashGlobStar; -function isAffectDepthOfReadingPattern(pattern) { - const basename = path.basename(pattern); - return endsWithSlashGlobStar(pattern) || isStaticPattern(basename); -} -exports.isAffectDepthOfReadingPattern = isAffectDepthOfReadingPattern; -function getNaiveDepth(pattern) { - const base = getBaseDirectory(pattern); - const patternDepth = pattern.split('/').length; - const patternBaseDepth = base.split('/').length; - /** - * This is a hack for pattern that has no base directory. - * - * This is related to the `*\something\*` pattern. - */ - if (base === '.') { - return patternDepth - patternBaseDepth; - } - return patternDepth - patternBaseDepth - 1; -} -exports.getNaiveDepth = getNaiveDepth; -function getMaxNaivePatternsDepth(patterns) { - return patterns.reduce((max, pattern) => { - const depth = getNaiveDepth(pattern); - return depth > max ? depth : max; - }, 0); -} -exports.getMaxNaivePatternsDepth = getMaxNaivePatternsDepth; -function makeRe(pattern, options) { - return micromatch.makeRe(pattern, options); -} -exports.makeRe = makeRe; -function convertPatternsToRe(patterns, options) { - return patterns.map((pattern) => makeRe(pattern, options)); -} -exports.convertPatternsToRe = convertPatternsToRe; -function matchAny(entry, patternsRe) { - const filepath = entry.replace(/^\.[\\\/]/, ''); - return patternsRe.some((patternRe) => patternRe.test(filepath)); -} -exports.matchAny = matchAny; + // process each pattern in the minimatch set + var n = this.minimatch.set.length + // The matches are stored as {: true,...} so that + // duplicates are automagically pruned. + // Later, we do an Object.keys() on these. + // Keep them as a list so we can fill in when nonull is set. + this.matches = new Array(n) -/***/ }), -/* 600 */ -/***/ (function(module, exports, __webpack_require__) { + if (typeof cb === 'function') { + cb = once(cb) + this.on('error', cb) + this.on('end', function (matches) { + cb(null, matches) + }) + } -"use strict"; + var self = this + this._processing = 0 + this._emitQueue = [] + this._processQueue = [] + this.paused = false -var isGlob = __webpack_require__(601); -var pathPosixDirname = __webpack_require__(16).posix.dirname; -var isWin32 = __webpack_require__(11).platform() === 'win32'; + if (this.noprocess) + return this -var slash = '/'; -var backslash = /\\/g; -var enclosure = /[\{\[].*[\/]*.*[\}\]]$/; -var globby = /(^|[^\\])([\{\[]|\([^\)]+$)/; -var escaped = /\\([\*\?\|\[\]\(\)\{\}])/g; + if (n === 0) + return done() -module.exports = function globParent(str) { - // flip windows path separators - if (isWin32 && str.indexOf(slash) < 0) { - str = str.replace(backslash, slash); + var sync = true + for (var i = 0; i < n; i ++) { + this._process(this.minimatch.set[i], i, false, done) } + sync = false - // special case for strings ending in enclosure containing path separator - if (enclosure.test(str)) { - str += slash; + function done () { + --self._processing + if (self._processing <= 0) { + if (sync) { + process.nextTick(function () { + self._finish() + }) + } else { + self._finish() + } + } } +} - // preserves full path in case of trailing path separator - str += 'a'; - - // remove path parts that are globby - do { - str = pathPosixDirname(str); - } while (isGlob(str) || globby.test(str)); +Glob.prototype._finish = function () { + assert(this instanceof Glob) + if (this.aborted) + return - // remove escape chars and return result - return str.replace(escaped, '$1'); -}; + if (this.realpath && !this._didRealpath) + return this._realpath() + common.finish(this) + this.emit('end', this.found) +} -/***/ }), -/* 601 */ -/***/ (function(module, exports, __webpack_require__) { +Glob.prototype._realpath = function () { + if (this._didRealpath) + return -/*! - * is-glob - * - * Copyright (c) 2014-2017, Jon Schlinkert. - * Released under the MIT License. - */ + this._didRealpath = true -var isExtglob = __webpack_require__(602); -var chars = { '{': '}', '(': ')', '[': ']'}; -var strictRegex = /\\(.)|(^!|\*|[\].+)]\?|\[[^\\\]]+\]|\{[^\\}]+\}|\(\?[:!=][^\\)]+\)|\([^|]+\|[^\\)]+\))/; -var relaxedRegex = /\\(.)|(^!|[*?{}()[\]]|\(\?)/; + var n = this.matches.length + if (n === 0) + return this._finish() -module.exports = function isGlob(str, options) { - if (typeof str !== 'string' || str === '') { - return false; - } + var self = this + for (var i = 0; i < this.matches.length; i++) + this._realpathSet(i, next) - if (isExtglob(str)) { - return true; + function next () { + if (--n === 0) + self._finish() } +} - var regex = strictRegex; - var match; +Glob.prototype._realpathSet = function (index, cb) { + var matchset = this.matches[index] + if (!matchset) + return cb() - // optionally relax regex - if (options && options.strict === false) { - regex = relaxedRegex; - } + var found = Object.keys(matchset) + var self = this + var n = found.length - while ((match = regex.exec(str))) { - if (match[2]) return true; - var idx = match.index + match[0].length; + if (n === 0) + return cb() - // if an open bracket/brace/paren is escaped, - // set the index to the next closing character - var open = match[1]; - var close = open ? chars[open] : null; - if (open && close) { - var n = str.indexOf(close, idx); - if (n !== -1) { - idx = n + 1; + var set = this.matches[index] = Object.create(null) + found.forEach(function (p, i) { + // If there's a problem with the stat, then it means that + // one or more of the links in the realpath couldn't be + // resolved. just return the abs value in that case. + p = self._makeAbs(p) + rp.realpath(p, self.realpathCache, function (er, real) { + if (!er) + set[real] = true + else if (er.syscall === 'stat') + set[p] = true + else + self.emit('error', er) // srsly wtf right here + + if (--n === 0) { + self.matches[index] = set + cb() } - } + }) + }) +} - str = str.slice(idx); - } - return false; -}; +Glob.prototype._mark = function (p) { + return common.mark(this, p) +} +Glob.prototype._makeAbs = function (f) { + return common.makeAbs(this, f) +} -/***/ }), -/* 602 */ -/***/ (function(module, exports) { +Glob.prototype.abort = function () { + this.aborted = true + this.emit('abort') +} -/*! - * is-extglob - * - * Copyright (c) 2014-2016, Jon Schlinkert. - * Licensed under the MIT License. - */ +Glob.prototype.pause = function () { + if (!this.paused) { + this.paused = true + this.emit('pause') + } +} -module.exports = function isExtglob(str) { - if (typeof str !== 'string' || str === '') { - return false; +Glob.prototype.resume = function () { + if (this.paused) { + this.emit('resume') + this.paused = false + if (this._emitQueue.length) { + var eq = this._emitQueue.slice(0) + this._emitQueue.length = 0 + for (var i = 0; i < eq.length; i ++) { + var e = eq[i] + this._emitMatch(e[0], e[1]) + } + } + if (this._processQueue.length) { + var pq = this._processQueue.slice(0) + this._processQueue.length = 0 + for (var i = 0; i < pq.length; i ++) { + var p = pq[i] + this._processing-- + this._process(p[0], p[1], p[2], p[3]) + } + } } +} - var match; - while ((match = /(\\).|([@?!+*]\(.*\))/g.exec(str))) { - if (match[2]) return true; - str = str.slice(match.index + match[0].length); +Glob.prototype._process = function (pattern, index, inGlobStar, cb) { + assert(this instanceof Glob) + assert(typeof cb === 'function') + + if (this.aborted) + return + + this._processing++ + if (this.paused) { + this._processQueue.push([pattern, index, inGlobStar, cb]) + return } - return false; -}; + //console.error('PROCESS %d', this._processing, pattern) + // Get the first [n] parts of pattern that are all strings. + var n = 0 + while (typeof pattern[n] === 'string') { + n ++ + } + // now n is the index of the first one that is *not* a string. -/***/ }), -/* 603 */ -/***/ (function(module, exports, __webpack_require__) { + // see if there's anything else + var prefix + switch (n) { + // if not, then this is rather simple + case pattern.length: + this._processSimple(pattern.join('/'), index, cb) + return -"use strict"; + case 0: + // pattern *starts* with some non-trivial item. + // going to readdir(cwd), but not include the prefix in matches. + prefix = null + break + default: + // pattern has some string bits in the front. + // whatever it starts with, whether that's 'absolute' like /foo/bar, + // or 'relative' like '../baz' + prefix = pattern.slice(0, n).join('/') + break + } -const util = __webpack_require__(29); -const braces = __webpack_require__(604); -const picomatch = __webpack_require__(614); -const utils = __webpack_require__(617); -const isEmptyString = val => typeof val === 'string' && (val === '' || val === './'); + var remain = pattern.slice(n) -/** - * Returns an array of strings that match one or more glob patterns. - * - * ```js - * const mm = require('micromatch'); - * // mm(list, patterns[, options]); - * - * console.log(mm(['a.js', 'a.txt'], ['*.js'])); - * //=> [ 'a.js' ] - * ``` - * @param {String|Array} list List of strings to match. - * @param {String|Array} patterns One or more glob patterns to use for matching. - * @param {Object} options See available [options](#options) - * @return {Array} Returns an array of matches - * @summary false - * @api public - */ + // get the list of entries. + var read + if (prefix === null) + read = '.' + else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) { + if (!prefix || !isAbsolute(prefix)) + prefix = '/' + prefix + read = prefix + } else + read = prefix -const micromatch = (list, patterns, options) => { - patterns = [].concat(patterns); - list = [].concat(list); + var abs = this._makeAbs(read) - let omit = new Set(); - let keep = new Set(); - let items = new Set(); - let negatives = 0; + //if ignored, skip _processing + if (childrenIgnored(this, read)) + return cb() - let onResult = state => { - items.add(state.output); - if (options && options.onResult) { - options.onResult(state); - } - }; + var isGlobStar = remain[0] === minimatch.GLOBSTAR + if (isGlobStar) + this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb) + else + this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb) +} - for (let i = 0; i < patterns.length; i++) { - let isMatch = picomatch(String(patterns[i]), { ...options, onResult }, true); - let negated = isMatch.state.negated || isMatch.state.negatedExtglob; - if (negated) negatives++; +Glob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) { + var self = this + this._readdir(abs, inGlobStar, function (er, entries) { + return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb) + }) +} - for (let item of list) { - let matched = isMatch(item, true); +Glob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) { - let match = negated ? !matched.isMatch : matched.isMatch; - if (!match) continue; + // if the abs isn't a dir, then nothing can match! + if (!entries) + return cb() - if (negated) { - omit.add(matched.output); + // It will only match dot entries if it starts with a dot, or if + // dot is set. Stuff like @(.foo|.bar) isn't allowed. + var pn = remain[0] + var negate = !!this.minimatch.negate + var rawGlob = pn._glob + var dotOk = this.dot || rawGlob.charAt(0) === '.' + + var matchedEntries = [] + for (var i = 0; i < entries.length; i++) { + var e = entries[i] + if (e.charAt(0) !== '.' || dotOk) { + var m + if (negate && !prefix) { + m = !e.match(pn) } else { - omit.delete(matched.output); - keep.add(matched.output); + m = e.match(pn) } + if (m) + matchedEntries.push(e) } } - let result = negatives === patterns.length ? [...items] : [...keep]; - let matches = result.filter(item => !omit.has(item)); + //console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries) - if (options && matches.length === 0) { - if (options.failglob === true) { - throw new Error(`No matches found for "${patterns.join(', ')}"`); + var len = matchedEntries.length + // If there are no matched entries, then nothing matches. + if (len === 0) + return cb() + + // if this is the last remaining pattern bit, then no need for + // an additional stat *unless* the user has specified mark or + // stat explicitly. We know they exist, since readdir returned + // them. + + if (remain.length === 1 && !this.mark && !this.stat) { + if (!this.matches[index]) + this.matches[index] = Object.create(null) + + for (var i = 0; i < len; i ++) { + var e = matchedEntries[i] + if (prefix) { + if (prefix !== '/') + e = prefix + '/' + e + else + e = prefix + e + } + + if (e.charAt(0) === '/' && !this.nomount) { + e = path.join(this.root, e) + } + this._emitMatch(index, e) } + // This was the last one, and no stats were needed + return cb() + } - if (options.nonull === true || options.nullglob === true) { - return options.unescape ? patterns.map(p => p.replace(/\\/g, '')) : patterns; + // now test all matched entries as stand-ins for that part + // of the pattern. + remain.shift() + for (var i = 0; i < len; i ++) { + var e = matchedEntries[i] + var newPattern + if (prefix) { + if (prefix !== '/') + e = prefix + '/' + e + else + e = prefix + e } + this._process([e].concat(remain), index, inGlobStar, cb) } + cb() +} - return matches; -}; +Glob.prototype._emitMatch = function (index, e) { + if (this.aborted) + return -/** - * Backwards compatibility - */ + if (isIgnored(this, e)) + return -micromatch.match = micromatch; + if (this.paused) { + this._emitQueue.push([index, e]) + return + } -/** - * Returns a matcher function from the given glob `pattern` and `options`. - * The returned function takes a string to match as its only argument and returns - * true if the string is a match. - * - * ```js - * const mm = require('micromatch'); - * // mm.matcher(pattern[, options]); - * - * const isMatch = mm.matcher('*.!(*a)'); - * console.log(isMatch('a.a')); //=> false - * console.log(isMatch('a.b')); //=> true - * ``` - * @param {String} `pattern` Glob pattern - * @param {Object} `options` - * @return {Function} Returns a matcher function. - * @api public - */ + var abs = isAbsolute(e) ? e : this._makeAbs(e) -micromatch.matcher = (pattern, options) => picomatch(pattern, options); + if (this.mark) + e = this._mark(e) -/** - * Returns true if **any** of the given glob `patterns` match the specified `string`. - * - * ```js - * const mm = require('micromatch'); - * // mm.isMatch(string, patterns[, options]); - * - * console.log(mm.isMatch('a.a', ['b.*', '*.a'])); //=> true - * console.log(mm.isMatch('a.a', 'b.*')); //=> false - * ``` - * @param {String} str The string to test. - * @param {String|Array} patterns One or more glob patterns to use for matching. - * @param {Object} [options] See available [options](#options). - * @return {Boolean} Returns true if any patterns match `str` - * @api public - */ + if (this.absolute) + e = abs -micromatch.isMatch = (str, patterns, options) => picomatch(patterns, options)(str); + if (this.matches[index][e]) + return -/** - * Backwards compatibility - */ + if (this.nodir) { + var c = this.cache[abs] + if (c === 'DIR' || Array.isArray(c)) + return + } -micromatch.any = micromatch.isMatch; + this.matches[index][e] = true -/** - * Returns a list of strings that _**do not match any**_ of the given `patterns`. - * - * ```js - * const mm = require('micromatch'); - * // mm.not(list, patterns[, options]); - * - * console.log(mm.not(['a.a', 'b.b', 'c.c'], '*.a')); - * //=> ['b.b', 'c.c'] - * ``` - * @param {Array} `list` Array of strings to match. - * @param {String|Array} `patterns` One or more glob pattern to use for matching. - * @param {Object} `options` See available [options](#options) for changing how matches are performed - * @return {Array} Returns an array of strings that **do not match** the given patterns. - * @api public - */ + var st = this.statCache[abs] + if (st) + this.emit('stat', e, st) -micromatch.not = (list, patterns, options = {}) => { - patterns = [].concat(patterns).map(String); - let result = new Set(); - let items = []; + this.emit('match', e) +} - let onResult = state => { - if (options.onResult) options.onResult(state); - items.push(state.output); - }; +Glob.prototype._readdirInGlobStar = function (abs, cb) { + if (this.aborted) + return - let matches = micromatch(list, patterns, { ...options, onResult }); + // follow all symlinked directories forever + // just proceed as if this is a non-globstar situation + if (this.follow) + return this._readdir(abs, false, cb) - for (let item of items) { - if (!matches.includes(item)) { - result.add(item); - } - } - return [...result]; -}; + var lstatkey = 'lstat\0' + abs + var self = this + var lstatcb = inflight(lstatkey, lstatcb_) -/** - * Returns true if the given `string` contains the given pattern. Similar - * to [.isMatch](#isMatch) but the pattern can match any part of the string. - * - * ```js - * var mm = require('micromatch'); - * // mm.contains(string, pattern[, options]); - * - * console.log(mm.contains('aa/bb/cc', '*b')); - * //=> true - * console.log(mm.contains('aa/bb/cc', '*d')); - * //=> false - * ``` - * @param {String} `str` The string to match. - * @param {String|Array} `patterns` Glob pattern to use for matching. - * @param {Object} `options` See available [options](#options) for changing how matches are performed - * @return {Boolean} Returns true if the patter matches any part of `str`. - * @api public - */ + if (lstatcb) + fs.lstat(abs, lstatcb) -micromatch.contains = (str, pattern, options) => { - if (typeof str !== 'string') { - throw new TypeError(`Expected a string: "${util.inspect(str)}"`); + function lstatcb_ (er, lstat) { + if (er && er.code === 'ENOENT') + return cb() + + var isSym = lstat && lstat.isSymbolicLink() + self.symlinks[abs] = isSym + + // If it's not a symlink or a dir, then it's definitely a regular file. + // don't bother doing a readdir in that case. + if (!isSym && lstat && !lstat.isDirectory()) { + self.cache[abs] = 'FILE' + cb() + } else + self._readdir(abs, false, cb) } +} - if (Array.isArray(pattern)) { - return pattern.some(p => micromatch.contains(str, p, options)); +Glob.prototype._readdir = function (abs, inGlobStar, cb) { + if (this.aborted) + return + + cb = inflight('readdir\0'+abs+'\0'+inGlobStar, cb) + if (!cb) + return + + //console.error('RD %j %j', +inGlobStar, abs) + if (inGlobStar && !ownProp(this.symlinks, abs)) + return this._readdirInGlobStar(abs, cb) + + if (ownProp(this.cache, abs)) { + var c = this.cache[abs] + if (!c || c === 'FILE') + return cb() + + if (Array.isArray(c)) + return cb(null, c) } - if (typeof pattern === 'string') { - if (isEmptyString(str) || isEmptyString(pattern)) { - return false; - } + var self = this + fs.readdir(abs, readdirCb(this, abs, cb)) +} - if (str.includes(pattern) || (str.startsWith('./') && str.slice(2).includes(pattern))) { - return true; - } +function readdirCb (self, abs, cb) { + return function (er, entries) { + if (er) + self._readdirError(abs, er, cb) + else + self._readdirEntries(abs, entries, cb) } +} - return micromatch.isMatch(str, pattern, { ...options, contains: true }); -}; +Glob.prototype._readdirEntries = function (abs, entries, cb) { + if (this.aborted) + return -/** - * Filter the keys of the given object with the given `glob` pattern - * and `options`. Does not attempt to match nested keys. If you need this feature, - * use [glob-object][] instead. - * - * ```js - * const mm = require('micromatch'); - * // mm.matchKeys(object, patterns[, options]); - * - * const obj = { aa: 'a', ab: 'b', ac: 'c' }; - * console.log(mm.matchKeys(obj, '*b')); - * //=> { ab: 'b' } - * ``` - * @param {Object} `object` The object with keys to filter. - * @param {String|Array} `patterns` One or more glob patterns to use for matching. - * @param {Object} `options` See available [options](#options) for changing how matches are performed - * @return {Object} Returns an object with only keys that match the given patterns. - * @api public - */ - -micromatch.matchKeys = (obj, patterns, options) => { - if (!utils.isObject(obj)) { - throw new TypeError('Expected the first argument to be an object'); + // if we haven't asked to stat everything, then just + // assume that everything in there exists, so we can avoid + // having to stat it a second time. + if (!this.mark && !this.stat) { + for (var i = 0; i < entries.length; i ++) { + var e = entries[i] + if (abs === '/') + e = abs + e + else + e = abs + '/' + e + this.cache[e] = true + } } - let keys = micromatch(Object.keys(obj), patterns, options); - let res = {}; - for (let key of keys) res[key] = obj[key]; - return res; -}; - -/** - * Returns true if some of the strings in the given `list` match any of the given glob `patterns`. - * - * ```js - * const mm = require('micromatch'); - * // mm.some(list, patterns[, options]); - * - * console.log(mm.some(['foo.js', 'bar.js'], ['*.js', '!foo.js'])); - * // true - * console.log(mm.some(['foo.js'], ['*.js', '!foo.js'])); - * // false - * ``` - * @param {String|Array} `list` The string or array of strings to test. Returns as soon as the first match is found. - * @param {String|Array} `patterns` One or more glob patterns to use for matching. - * @param {Object} `options` See available [options](#options) for changing how matches are performed - * @return {Boolean} Returns true if any patterns match `str` - * @api public - */ -micromatch.some = (list, patterns, options) => { - let items = [].concat(list); + this.cache[abs] = entries + return cb(null, entries) +} - for (let pattern of [].concat(patterns)) { - let isMatch = picomatch(String(pattern), options); - if (items.some(item => isMatch(item))) { - return true; - } - } - return false; -}; +Glob.prototype._readdirError = function (f, er, cb) { + if (this.aborted) + return -/** - * Returns true if every string in the given `list` matches - * any of the given glob `patterns`. - * - * ```js - * const mm = require('micromatch'); - * // mm.every(list, patterns[, options]); - * - * console.log(mm.every('foo.js', ['foo.js'])); - * // true - * console.log(mm.every(['foo.js', 'bar.js'], ['*.js'])); - * // true - * console.log(mm.every(['foo.js', 'bar.js'], ['*.js', '!foo.js'])); - * // false - * console.log(mm.every(['foo.js'], ['*.js', '!foo.js'])); - * // false - * ``` - * @param {String|Array} `list` The string or array of strings to test. - * @param {String|Array} `patterns` One or more glob patterns to use for matching. - * @param {Object} `options` See available [options](#options) for changing how matches are performed - * @return {Boolean} Returns true if any patterns match `str` - * @api public - */ + // handle errors, and cache the information + switch (er.code) { + case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205 + case 'ENOTDIR': // totally normal. means it *does* exist. + var abs = this._makeAbs(f) + this.cache[abs] = 'FILE' + if (abs === this.cwdAbs) { + var error = new Error(er.code + ' invalid cwd ' + this.cwd) + error.path = this.cwd + error.code = er.code + this.emit('error', error) + this.abort() + } + break -micromatch.every = (list, patterns, options) => { - let items = [].concat(list); + case 'ENOENT': // not terribly unusual + case 'ELOOP': + case 'ENAMETOOLONG': + case 'UNKNOWN': + this.cache[this._makeAbs(f)] = false + break - for (let pattern of [].concat(patterns)) { - let isMatch = picomatch(String(pattern), options); - if (!items.every(item => isMatch(item))) { - return false; - } + default: // some unusual error. Treat as failure. + this.cache[this._makeAbs(f)] = false + if (this.strict) { + this.emit('error', er) + // If the error is handled, then we abort + // if not, we threw out of here + this.abort() + } + if (!this.silent) + console.error('glob error', er) + break } - return true; -}; -/** - * Returns true if **all** of the given `patterns` match - * the specified string. - * - * ```js - * const mm = require('micromatch'); - * // mm.all(string, patterns[, options]); - * - * console.log(mm.all('foo.js', ['foo.js'])); - * // true - * - * console.log(mm.all('foo.js', ['*.js', '!foo.js'])); - * // false - * - * console.log(mm.all('foo.js', ['*.js', 'foo.js'])); - * // true - * - * console.log(mm.all('foo.js', ['*.js', 'f*', '*o*', '*o.js'])); - * // true - * ``` - * @param {String|Array} `str` The string to test. - * @param {String|Array} `patterns` One or more glob patterns to use for matching. - * @param {Object} `options` See available [options](#options) for changing how matches are performed - * @return {Boolean} Returns true if any patterns match `str` - * @api public - */ + return cb() +} -micromatch.all = (str, patterns, options) => { - if (typeof str !== 'string') { - throw new TypeError(`Expected a string: "${util.inspect(str)}"`); - } +Glob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) { + var self = this + this._readdir(abs, inGlobStar, function (er, entries) { + self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb) + }) +} - return [].concat(patterns).every(p => picomatch(p, options)(str)); -}; -/** - * Returns an array of matches captured by `pattern` in `string, or `null` if the pattern did not match. - * - * ```js - * const mm = require('micromatch'); - * // mm.capture(pattern, string[, options]); - * - * console.log(mm.capture('test/*.js', 'test/foo.js')); - * //=> ['foo'] - * console.log(mm.capture('test/*.js', 'foo/bar.css')); - * //=> null - * ``` - * @param {String} `glob` Glob pattern to use for matching. - * @param {String} `input` String to match - * @param {Object} `options` See available [options](#options) for changing how matches are performed - * @return {Boolean} Returns an array of captures if the input matches the glob pattern, otherwise `null`. - * @api public - */ +Glob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) { + //console.error('pgs2', prefix, remain[0], entries) -micromatch.capture = (glob, input, options) => { - let posix = utils.isWindows(options); - let regex = picomatch.makeRe(String(glob), { ...options, capture: true }); - let match = regex.exec(posix ? utils.toPosixSlashes(input) : input); + // no entries means not a dir, so it can never have matches + // foo.txt/** doesn't match foo.txt + if (!entries) + return cb() - if (match) { - return match.slice(1).map(v => v === void 0 ? '' : v); - } -}; + // test without the globstar, and with every child both below + // and replacing the globstar. + var remainWithoutGlobStar = remain.slice(1) + var gspref = prefix ? [ prefix ] : [] + var noGlobStar = gspref.concat(remainWithoutGlobStar) -/** - * Create a regular expression from the given glob `pattern`. - * - * ```js - * const mm = require('micromatch'); - * // mm.makeRe(pattern[, options]); - * - * console.log(mm.makeRe('*.js')); - * //=> /^(?:(\.[\\\/])?(?!\.)(?=.)[^\/]*?\.js)$/ - * ``` - * @param {String} `pattern` A glob pattern to convert to regex. - * @param {Object} `options` - * @return {RegExp} Returns a regex created from the given pattern. - * @api public - */ + // the noGlobStar pattern exits the inGlobStar state + this._process(noGlobStar, index, false, cb) -micromatch.makeRe = (...args) => picomatch.makeRe(...args); + var isSym = this.symlinks[abs] + var len = entries.length -/** - * Scan a glob pattern to separate the pattern into segments. Used - * by the [split](#split) method. - * - * ```js - * const mm = require('micromatch'); - * const state = mm.scan(pattern[, options]); - * ``` - * @param {String} `pattern` - * @param {Object} `options` - * @return {Object} Returns an object with - * @api public - */ + // If it's a symlink, and we're in a globstar, then stop + if (isSym && inGlobStar) + return cb() -micromatch.scan = (...args) => picomatch.scan(...args); + for (var i = 0; i < len; i++) { + var e = entries[i] + if (e.charAt(0) === '.' && !this.dot) + continue -/** - * Parse a glob pattern to create the source string for a regular - * expression. - * - * ```js - * const mm = require('micromatch'); - * const state = mm(pattern[, options]); - * ``` - * @param {String} `glob` - * @param {Object} `options` - * @return {Object} Returns an object with useful properties and output to be used as regex source string. - * @api public - */ + // these two cases enter the inGlobStar state + var instead = gspref.concat(entries[i], remainWithoutGlobStar) + this._process(instead, index, true, cb) -micromatch.parse = (patterns, options) => { - let res = []; - for (let pattern of [].concat(patterns || [])) { - for (let str of braces(String(pattern), options)) { - res.push(picomatch.parse(str, options)); - } + var below = gspref.concat(entries[i], remain) + this._process(below, index, true, cb) } - return res; -}; -/** - * Process the given brace `pattern`. - * - * ```js - * const { braces } = require('micromatch'); - * console.log(braces('foo/{a,b,c}/bar')); - * //=> [ 'foo/(a|b|c)/bar' ] - * - * console.log(braces('foo/{a,b,c}/bar', { expand: true })); - * //=> [ 'foo/a/bar', 'foo/b/bar', 'foo/c/bar' ] - * ``` - * @param {String} `pattern` String with brace pattern to process. - * @param {Object} `options` Any [options](#options) to change how expansion is performed. See the [braces][] library for all available options. - * @return {Array} - * @api public - */ + cb() +} -micromatch.braces = (pattern, options) => { - if (typeof pattern !== 'string') throw new TypeError('Expected a string'); - if ((options && options.nobrace === true) || !/\{.*\}/.test(pattern)) { - return [pattern]; +Glob.prototype._processSimple = function (prefix, index, cb) { + // XXX review this. Shouldn't it be doing the mounting etc + // before doing stat? kinda weird? + var self = this + this._stat(prefix, function (er, exists) { + self._processSimple2(prefix, index, er, exists, cb) + }) +} +Glob.prototype._processSimple2 = function (prefix, index, er, exists, cb) { + + //console.error('ps2', prefix, exists) + + if (!this.matches[index]) + this.matches[index] = Object.create(null) + + // If it doesn't exist, then just mark the lack of results + if (!exists) + return cb() + + if (prefix && isAbsolute(prefix) && !this.nomount) { + var trail = /[\/\\]$/.test(prefix) + if (prefix.charAt(0) === '/') { + prefix = path.join(this.root, prefix) + } else { + prefix = path.resolve(this.root, prefix) + if (trail) + prefix += '/' + } } - return braces(pattern, options); -}; -/** - * Expand braces - */ + if (process.platform === 'win32') + prefix = prefix.replace(/\\/g, '/') -micromatch.braceExpand = (pattern, options) => { - if (typeof pattern !== 'string') throw new TypeError('Expected a string'); - return micromatch.braces(pattern, { ...options, expand: true }); -}; + // Mark this as a match + this._emitMatch(index, prefix) + cb() +} -/** - * Expose micromatch - */ +// Returns either 'DIR', 'FILE', or false +Glob.prototype._stat = function (f, cb) { + var abs = this._makeAbs(f) + var needDir = f.slice(-1) === '/' -module.exports = micromatch; + if (f.length > this.maxLength) + return cb() + if (!this.stat && ownProp(this.cache, abs)) { + var c = this.cache[abs] -/***/ }), -/* 604 */ -/***/ (function(module, exports, __webpack_require__) { + if (Array.isArray(c)) + c = 'DIR' -"use strict"; + // It exists, but maybe not how we need it + if (!needDir || c === 'DIR') + return cb(null, c) + if (needDir && c === 'FILE') + return cb() -const stringify = __webpack_require__(605); -const compile = __webpack_require__(607); -const expand = __webpack_require__(611); -const parse = __webpack_require__(612); + // otherwise we have to stat, because maybe c=true + // if we know it exists, but not what it is. + } -/** - * Expand the given pattern or create a regex-compatible string. - * - * ```js - * const braces = require('braces'); - * console.log(braces('{a,b,c}', { compile: true })); //=> ['(a|b|c)'] - * console.log(braces('{a,b,c}')); //=> ['a', 'b', 'c'] - * ``` - * @param {String} `str` - * @param {Object} `options` - * @return {String} - * @api public - */ + var exists + var stat = this.statCache[abs] + if (stat !== undefined) { + if (stat === false) + return cb(null, stat) + else { + var type = stat.isDirectory() ? 'DIR' : 'FILE' + if (needDir && type === 'FILE') + return cb() + else + return cb(null, type, stat) + } + } -const braces = (input, options = {}) => { - let output = []; + var self = this + var statcb = inflight('stat\0' + abs, lstatcb_) + if (statcb) + fs.lstat(abs, statcb) - if (Array.isArray(input)) { - for (let pattern of input) { - let result = braces.create(pattern, options); - if (Array.isArray(result)) { - output.push(...result); - } else { - output.push(result); - } + function lstatcb_ (er, lstat) { + if (lstat && lstat.isSymbolicLink()) { + // If it's a symlink, then treat it as the target, unless + // the target does not exist, then treat it as a file. + return fs.stat(abs, function (er, stat) { + if (er) + self._stat2(f, abs, null, lstat, cb) + else + self._stat2(f, abs, er, stat, cb) + }) + } else { + self._stat2(f, abs, er, lstat, cb) } - } else { - output = [].concat(braces.create(input, options)); } +} - if (options && options.expand === true && options.nodupes === true) { - output = [...new Set(output)]; +Glob.prototype._stat2 = function (f, abs, er, stat, cb) { + if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) { + this.statCache[abs] = false + return cb() } - return output; -}; -/** - * Parse the given `str` with the given `options`. - * - * ```js - * // braces.parse(pattern, [, options]); - * const ast = braces.parse('a/{b,c}/d'); - * console.log(ast); - * ``` - * @param {String} pattern Brace pattern to parse - * @param {Object} options - * @return {Object} Returns an AST - * @api public - */ + var needDir = f.slice(-1) === '/' + this.statCache[abs] = stat -braces.parse = (input, options = {}) => parse(input, options); + if (abs.slice(-1) === '/' && stat && !stat.isDirectory()) + return cb(null, false, stat) -/** - * Creates a braces string from an AST, or an AST node. - * - * ```js - * const braces = require('braces'); - * let ast = braces.parse('foo/{a,b}/bar'); - * console.log(stringify(ast.nodes[2])); //=> '{a,b}' - * ``` - * @param {String} `input` Brace pattern or AST. - * @param {Object} `options` - * @return {Array} Returns an array of expanded values. - * @api public - */ + var c = true + if (stat) + c = stat.isDirectory() ? 'DIR' : 'FILE' + this.cache[abs] = this.cache[abs] || c -braces.stringify = (input, options = {}) => { - if (typeof input === 'string') { - return stringify(braces.parse(input, options), options); - } - return stringify(input, options); -}; + if (needDir && c === 'FILE') + return cb() -/** - * Compiles a brace pattern into a regex-compatible, optimized string. - * This method is called by the main [braces](#braces) function by default. - * - * ```js - * const braces = require('braces'); - * console.log(braces.compile('a/{b,c}/d')); - * //=> ['a/(b|c)/d'] - * ``` - * @param {String} `input` Brace pattern or AST. - * @param {Object} `options` - * @return {Array} Returns an array of expanded values. - * @api public - */ + return cb(null, c, stat) +} -braces.compile = (input, options = {}) => { - if (typeof input === 'string') { - input = braces.parse(input, options); - } - return compile(input, options); -}; -/** - * Expands a brace pattern into an array. This method is called by the - * main [braces](#braces) function when `options.expand` is true. Before - * using this method it's recommended that you read the [performance notes](#performance)) - * and advantages of using [.compile](#compile) instead. - * - * ```js - * const braces = require('braces'); - * console.log(braces.expand('a/{b,c}/d')); - * //=> ['a/b/d', 'a/c/d']; - * ``` - * @param {String} `pattern` Brace pattern - * @param {Object} `options` - * @return {Array} Returns an array of expanded values. - * @api public - */ +/***/ }), +/* 593 */ +/***/ (function(module, exports, __webpack_require__) { -braces.expand = (input, options = {}) => { - if (typeof input === 'string') { - input = braces.parse(input, options); - } +try { + var util = __webpack_require__(29); + /* istanbul ignore next */ + if (typeof util.inherits !== 'function') throw ''; + module.exports = util.inherits; +} catch (e) { + /* istanbul ignore next */ + module.exports = __webpack_require__(594); +} - let result = expand(input, options); - // filter out empty strings if specified - if (options.noempty === true) { - result = result.filter(Boolean); - } +/***/ }), +/* 594 */ +/***/ (function(module, exports) { - // filter out duplicates if specified - if (options.nodupes === true) { - result = [...new Set(result)]; +if (typeof Object.create === 'function') { + // implementation from standard node.js 'util' module + module.exports = function inherits(ctor, superCtor) { + if (superCtor) { + ctor.super_ = superCtor + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }) + } + }; +} else { + // old school shim for old browsers + module.exports = function inherits(ctor, superCtor) { + if (superCtor) { + ctor.super_ = superCtor + var TempCtor = function () {} + TempCtor.prototype = superCtor.prototype + ctor.prototype = new TempCtor() + ctor.prototype.constructor = ctor + } } +} - return result; -}; -/** - * Processes a brace pattern and returns either an expanded array - * (if `options.expand` is true), a highly optimized regex-compatible string. - * This method is called by the main [braces](#braces) function. - * - * ```js - * const braces = require('braces'); - * console.log(braces.create('user-{200..300}/project-{a,b,c}-{1..10}')) - * //=> 'user-(20[0-9]|2[1-9][0-9]|300)/project-(a|b|c)-([1-9]|10)' - * ``` - * @param {String} `pattern` Brace pattern - * @param {Object} `options` - * @return {Array} Returns an array of expanded values. - * @api public - */ +/***/ }), +/* 595 */ +/***/ (function(module, exports, __webpack_require__) { -braces.create = (input, options = {}) => { - if (input === '' || input.length < 3) { - return [input]; - } +module.exports = globSync +globSync.GlobSync = GlobSync - return options.expand !== true - ? braces.compile(input, options) - : braces.expand(input, options); -}; +var fs = __webpack_require__(23) +var rp = __webpack_require__(503) +var minimatch = __webpack_require__(505) +var Minimatch = minimatch.Minimatch +var Glob = __webpack_require__(592).Glob +var util = __webpack_require__(29) +var path = __webpack_require__(16) +var assert = __webpack_require__(30) +var isAbsolute = __webpack_require__(511) +var common = __webpack_require__(596) +var alphasort = common.alphasort +var alphasorti = common.alphasorti +var setopts = common.setopts +var ownProp = common.ownProp +var childrenIgnored = common.childrenIgnored +var isIgnored = common.isIgnored -/** - * Expose "braces" - */ +function globSync (pattern, options) { + if (typeof options === 'function' || arguments.length === 3) + throw new TypeError('callback provided to sync glob\n'+ + 'See: https://github.com/isaacs/node-glob/issues/167') -module.exports = braces; + return new GlobSync(pattern, options).found +} +function GlobSync (pattern, options) { + if (!pattern) + throw new Error('must provide pattern') -/***/ }), -/* 605 */ -/***/ (function(module, exports, __webpack_require__) { + if (typeof options === 'function' || arguments.length === 3) + throw new TypeError('callback provided to sync glob\n'+ + 'See: https://github.com/isaacs/node-glob/issues/167') -"use strict"; + if (!(this instanceof GlobSync)) + return new GlobSync(pattern, options) + setopts(this, pattern, options) -const utils = __webpack_require__(606); + if (this.noprocess) + return this -module.exports = (ast, options = {}) => { - let stringify = (node, parent = {}) => { - let invalidBlock = options.escapeInvalid && utils.isInvalidBrace(parent); - let invalidNode = node.invalid === true && options.escapeInvalid === true; - let output = ''; + var n = this.minimatch.set.length + this.matches = new Array(n) + for (var i = 0; i < n; i ++) { + this._process(this.minimatch.set[i], i, false) + } + this._finish() +} - if (node.value) { - if ((invalidBlock || invalidNode) && utils.isOpenOrClose(node)) { - return '\\' + node.value; +GlobSync.prototype._finish = function () { + assert(this instanceof GlobSync) + if (this.realpath) { + var self = this + this.matches.forEach(function (matchset, index) { + var set = self.matches[index] = Object.create(null) + for (var p in matchset) { + try { + p = self._makeAbs(p) + var real = rp.realpathSync(p, self.realpathCache) + set[real] = true + } catch (er) { + if (er.syscall === 'stat') + set[self._makeAbs(p)] = true + else + throw er + } } - return node.value; - } + }) + } + common.finish(this) +} - if (node.value) { - return node.value; - } - if (node.nodes) { - for (let child of node.nodes) { - output += stringify(child); - } - } - return output; - }; +GlobSync.prototype._process = function (pattern, index, inGlobStar) { + assert(this instanceof GlobSync) - return stringify(ast); -}; + // Get the first [n] parts of pattern that are all strings. + var n = 0 + while (typeof pattern[n] === 'string') { + n ++ + } + // now n is the index of the first one that is *not* a string. + // See if there's anything else + var prefix + switch (n) { + // if not, then this is rather simple + case pattern.length: + this._processSimple(pattern.join('/'), index) + return + case 0: + // pattern *starts* with some non-trivial item. + // going to readdir(cwd), but not include the prefix in matches. + prefix = null + break -/***/ }), -/* 606 */ -/***/ (function(module, exports, __webpack_require__) { + default: + // pattern has some string bits in the front. + // whatever it starts with, whether that's 'absolute' like /foo/bar, + // or 'relative' like '../baz' + prefix = pattern.slice(0, n).join('/') + break + } -"use strict"; + var remain = pattern.slice(n) + // get the list of entries. + var read + if (prefix === null) + read = '.' + else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) { + if (!prefix || !isAbsolute(prefix)) + prefix = '/' + prefix + read = prefix + } else + read = prefix -exports.isInteger = num => { - if (typeof num === 'number') { - return Number.isInteger(num); - } - if (typeof num === 'string' && num.trim() !== '') { - return Number.isInteger(Number(num)); - } - return false; -}; + var abs = this._makeAbs(read) -/** - * Find a node of the given type - */ + //if ignored, skip processing + if (childrenIgnored(this, read)) + return -exports.find = (node, type) => node.nodes.find(node => node.type === type); + var isGlobStar = remain[0] === minimatch.GLOBSTAR + if (isGlobStar) + this._processGlobStar(prefix, read, abs, remain, index, inGlobStar) + else + this._processReaddir(prefix, read, abs, remain, index, inGlobStar) +} -/** - * Find a node of the given type - */ -exports.exceedsLimit = (min, max, step = 1, limit) => { - if (limit === false) return false; - if (!exports.isInteger(min) || !exports.isInteger(max)) return false; - return ((Number(max) - Number(min)) / Number(step)) >= limit; -}; +GlobSync.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar) { + var entries = this._readdir(abs, inGlobStar) -/** - * Escape the given node with '\\' before node.value - */ + // if the abs isn't a dir, then nothing can match! + if (!entries) + return -exports.escapeNode = (block, n = 0, type) => { - let node = block.nodes[n]; - if (!node) return; + // It will only match dot entries if it starts with a dot, or if + // dot is set. Stuff like @(.foo|.bar) isn't allowed. + var pn = remain[0] + var negate = !!this.minimatch.negate + var rawGlob = pn._glob + var dotOk = this.dot || rawGlob.charAt(0) === '.' - if ((type && node.type === type) || node.type === 'open' || node.type === 'close') { - if (node.escaped !== true) { - node.value = '\\' + node.value; - node.escaped = true; + var matchedEntries = [] + for (var i = 0; i < entries.length; i++) { + var e = entries[i] + if (e.charAt(0) !== '.' || dotOk) { + var m + if (negate && !prefix) { + m = !e.match(pn) + } else { + m = e.match(pn) + } + if (m) + matchedEntries.push(e) } } -}; -/** - * Returns true if the given brace node should be enclosed in literal braces - */ + var len = matchedEntries.length + // If there are no matched entries, then nothing matches. + if (len === 0) + return -exports.encloseBrace = node => { - if (node.type !== 'brace') return false; - if ((node.commas >> 0 + node.ranges >> 0) === 0) { - node.invalid = true; - return true; - } - return false; -}; + // if this is the last remaining pattern bit, then no need for + // an additional stat *unless* the user has specified mark or + // stat explicitly. We know they exist, since readdir returned + // them. -/** - * Returns true if a brace node is invalid. - */ + if (remain.length === 1 && !this.mark && !this.stat) { + if (!this.matches[index]) + this.matches[index] = Object.create(null) -exports.isInvalidBrace = block => { - if (block.type !== 'brace') return false; - if (block.invalid === true || block.dollar) return true; - if ((block.commas >> 0 + block.ranges >> 0) === 0) { - block.invalid = true; - return true; - } - if (block.open !== true || block.close !== true) { - block.invalid = true; - return true; - } - return false; -}; + for (var i = 0; i < len; i ++) { + var e = matchedEntries[i] + if (prefix) { + if (prefix.slice(-1) !== '/') + e = prefix + '/' + e + else + e = prefix + e + } -/** - * Returns true if a node is an open or close node - */ + if (e.charAt(0) === '/' && !this.nomount) { + e = path.join(this.root, e) + } + this._emitMatch(index, e) + } + // This was the last one, and no stats were needed + return + } -exports.isOpenOrClose = node => { - if (node.type === 'open' || node.type === 'close') { - return true; + // now test all matched entries as stand-ins for that part + // of the pattern. + remain.shift() + for (var i = 0; i < len; i ++) { + var e = matchedEntries[i] + var newPattern + if (prefix) + newPattern = [prefix, e] + else + newPattern = [e] + this._process(newPattern.concat(remain), index, inGlobStar) } - return node.open === true || node.close === true; -}; +} -/** - * Reduce an array of text nodes. - */ -exports.reduce = nodes => nodes.reduce((acc, node) => { - if (node.type === 'text') acc.push(node.value); - if (node.type === 'range') node.type = 'text'; - return acc; -}, []); +GlobSync.prototype._emitMatch = function (index, e) { + if (isIgnored(this, e)) + return -/** - * Flatten an array - */ + var abs = this._makeAbs(e) -exports.flatten = (...args) => { - const result = []; - const flat = arr => { - for (let i = 0; i < arr.length; i++) { - let ele = arr[i]; - Array.isArray(ele) ? flat(ele, result) : ele !== void 0 && result.push(ele); - } - return result; - }; - flat(args); - return result; -}; + if (this.mark) + e = this._mark(e) + if (this.absolute) { + e = abs + } -/***/ }), -/* 607 */ -/***/ (function(module, exports, __webpack_require__) { + if (this.matches[index][e]) + return -"use strict"; + if (this.nodir) { + var c = this.cache[abs] + if (c === 'DIR' || Array.isArray(c)) + return + } + this.matches[index][e] = true -const fill = __webpack_require__(608); -const utils = __webpack_require__(606); + if (this.stat) + this._stat(e) +} -const compile = (ast, options = {}) => { - let walk = (node, parent = {}) => { - let invalidBlock = utils.isInvalidBrace(parent); - let invalidNode = node.invalid === true && options.escapeInvalid === true; - let invalid = invalidBlock === true || invalidNode === true; - let prefix = options.escapeInvalid === true ? '\\' : ''; - let output = ''; - if (node.isOpen === true) { - return prefix + node.value; - } - if (node.isClose === true) { - return prefix + node.value; - } +GlobSync.prototype._readdirInGlobStar = function (abs) { + // follow all symlinked directories forever + // just proceed as if this is a non-globstar situation + if (this.follow) + return this._readdir(abs, false) - if (node.type === 'open') { - return invalid ? (prefix + node.value) : '('; + var entries + var lstat + var stat + try { + lstat = fs.lstatSync(abs) + } catch (er) { + if (er.code === 'ENOENT') { + // lstat failed, doesn't exist + return null } + } - if (node.type === 'close') { - return invalid ? (prefix + node.value) : ')'; - } + var isSym = lstat && lstat.isSymbolicLink() + this.symlinks[abs] = isSym - if (node.type === 'comma') { - return node.prev.type === 'comma' ? '' : (invalid ? node.value : '|'); - } + // If it's not a symlink or a dir, then it's definitely a regular file. + // don't bother doing a readdir in that case. + if (!isSym && lstat && !lstat.isDirectory()) + this.cache[abs] = 'FILE' + else + entries = this._readdir(abs, false) - if (node.value) { - return node.value; - } + return entries +} - if (node.nodes && node.ranges > 0) { - let args = utils.reduce(node.nodes); - let range = fill(...args, { ...options, wrap: false, toRegex: true }); +GlobSync.prototype._readdir = function (abs, inGlobStar) { + var entries - if (range.length !== 0) { - return args.length > 1 && range.length > 1 ? `(${range})` : range; - } - } + if (inGlobStar && !ownProp(this.symlinks, abs)) + return this._readdirInGlobStar(abs) - if (node.nodes) { - for (let child of node.nodes) { - output += walk(child, node); - } - } - return output; - }; + if (ownProp(this.cache, abs)) { + var c = this.cache[abs] + if (!c || c === 'FILE') + return null - return walk(ast); -}; + if (Array.isArray(c)) + return c + } -module.exports = compile; + try { + return this._readdirEntries(abs, fs.readdirSync(abs)) + } catch (er) { + this._readdirError(abs, er) + return null + } +} +GlobSync.prototype._readdirEntries = function (abs, entries) { + // if we haven't asked to stat everything, then just + // assume that everything in there exists, so we can avoid + // having to stat it a second time. + if (!this.mark && !this.stat) { + for (var i = 0; i < entries.length; i ++) { + var e = entries[i] + if (abs === '/') + e = abs + e + else + e = abs + '/' + e + this.cache[e] = true + } + } -/***/ }), -/* 608 */ -/***/ (function(module, exports, __webpack_require__) { + this.cache[abs] = entries -"use strict"; -/*! - * fill-range - * - * Copyright (c) 2014-present, Jon Schlinkert. - * Licensed under the MIT License. - */ + // mark and cache dir-ness + return entries +} +GlobSync.prototype._readdirError = function (f, er) { + // handle errors, and cache the information + switch (er.code) { + case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205 + case 'ENOTDIR': // totally normal. means it *does* exist. + var abs = this._makeAbs(f) + this.cache[abs] = 'FILE' + if (abs === this.cwdAbs) { + var error = new Error(er.code + ' invalid cwd ' + this.cwd) + error.path = this.cwd + error.code = er.code + throw error + } + break + case 'ENOENT': // not terribly unusual + case 'ELOOP': + case 'ENAMETOOLONG': + case 'UNKNOWN': + this.cache[this._makeAbs(f)] = false + break -const util = __webpack_require__(29); -const toRegexRange = __webpack_require__(609); - -const isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val); - -const transform = toNumber => { - return value => toNumber === true ? Number(value) : String(value); -}; - -const isValidValue = value => { - return typeof value === 'number' || (typeof value === 'string' && value !== ''); -}; - -const isNumber = num => Number.isInteger(+num); - -const zeros = input => { - let value = `${input}`; - let index = -1; - if (value[0] === '-') value = value.slice(1); - if (value === '0') return false; - while (value[++index] === '0'); - return index > 0; -}; - -const stringify = (start, end, options) => { - if (typeof start === 'string' || typeof end === 'string') { - return true; + default: // some unusual error. Treat as failure. + this.cache[this._makeAbs(f)] = false + if (this.strict) + throw er + if (!this.silent) + console.error('glob error', er) + break } - return options.stringify === true; -}; +} -const pad = (input, maxLength, toNumber) => { - if (maxLength > 0) { - let dash = input[0] === '-' ? '-' : ''; - if (dash) input = input.slice(1); - input = (dash + input.padStart(dash ? maxLength - 1 : maxLength, '0')); - } - if (toNumber === false) { - return String(input); - } - return input; -}; +GlobSync.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar) { -const toMaxLen = (input, maxLength) => { - let negative = input[0] === '-' ? '-' : ''; - if (negative) { - input = input.slice(1); - maxLength--; - } - while (input.length < maxLength) input = '0' + input; - return negative ? ('-' + input) : input; -}; + var entries = this._readdir(abs, inGlobStar) -const toSequence = (parts, options) => { - parts.negatives.sort((a, b) => a < b ? -1 : a > b ? 1 : 0); - parts.positives.sort((a, b) => a < b ? -1 : a > b ? 1 : 0); + // no entries means not a dir, so it can never have matches + // foo.txt/** doesn't match foo.txt + if (!entries) + return - let prefix = options.capture ? '' : '?:'; - let positives = ''; - let negatives = ''; - let result; + // test without the globstar, and with every child both below + // and replacing the globstar. + var remainWithoutGlobStar = remain.slice(1) + var gspref = prefix ? [ prefix ] : [] + var noGlobStar = gspref.concat(remainWithoutGlobStar) - if (parts.positives.length) { - positives = parts.positives.join('|'); - } + // the noGlobStar pattern exits the inGlobStar state + this._process(noGlobStar, index, false) - if (parts.negatives.length) { - negatives = `-(${prefix}${parts.negatives.join('|')})`; - } + var len = entries.length + var isSym = this.symlinks[abs] - if (positives && negatives) { - result = `${positives}|${negatives}`; - } else { - result = positives || negatives; - } + // If it's a symlink, and we're in a globstar, then stop + if (isSym && inGlobStar) + return - if (options.wrap) { - return `(${prefix}${result})`; - } + for (var i = 0; i < len; i++) { + var e = entries[i] + if (e.charAt(0) === '.' && !this.dot) + continue - return result; -}; + // these two cases enter the inGlobStar state + var instead = gspref.concat(entries[i], remainWithoutGlobStar) + this._process(instead, index, true) -const toRange = (a, b, isNumbers, options) => { - if (isNumbers) { - return toRegexRange(a, b, { wrap: false, ...options }); + var below = gspref.concat(entries[i], remain) + this._process(below, index, true) } +} - let start = String.fromCharCode(a); - if (a === b) return start; +GlobSync.prototype._processSimple = function (prefix, index) { + // XXX review this. Shouldn't it be doing the mounting etc + // before doing stat? kinda weird? + var exists = this._stat(prefix) - let stop = String.fromCharCode(b); - return `[${start}-${stop}]`; -}; + if (!this.matches[index]) + this.matches[index] = Object.create(null) -const toRegex = (start, end, options) => { - if (Array.isArray(start)) { - let wrap = options.wrap === true; - let prefix = options.capture ? '' : '?:'; - return wrap ? `(${prefix}${start.join('|')})` : start.join('|'); + // If it doesn't exist, then just mark the lack of results + if (!exists) + return + + if (prefix && isAbsolute(prefix) && !this.nomount) { + var trail = /[\/\\]$/.test(prefix) + if (prefix.charAt(0) === '/') { + prefix = path.join(this.root, prefix) + } else { + prefix = path.resolve(this.root, prefix) + if (trail) + prefix += '/' + } } - return toRegexRange(start, end, options); -}; -const rangeError = (...args) => { - return new RangeError('Invalid range arguments: ' + util.inspect(...args)); -}; + if (process.platform === 'win32') + prefix = prefix.replace(/\\/g, '/') -const invalidRange = (start, end, options) => { - if (options.strictRanges === true) throw rangeError([start, end]); - return []; -}; + // Mark this as a match + this._emitMatch(index, prefix) +} -const invalidStep = (step, options) => { - if (options.strictRanges === true) { - throw new TypeError(`Expected step "${step}" to be a number`); - } - return []; -}; +// Returns either 'DIR', 'FILE', or false +GlobSync.prototype._stat = function (f) { + var abs = this._makeAbs(f) + var needDir = f.slice(-1) === '/' -const fillNumbers = (start, end, step = 1, options = {}) => { - let a = Number(start); - let b = Number(end); + if (f.length > this.maxLength) + return false - if (!Number.isInteger(a) || !Number.isInteger(b)) { - if (options.strictRanges === true) throw rangeError([start, end]); - return []; - } + if (!this.stat && ownProp(this.cache, abs)) { + var c = this.cache[abs] - // fix negative zero - if (a === 0) a = 0; - if (b === 0) b = 0; + if (Array.isArray(c)) + c = 'DIR' - let descending = a > b; - let startString = String(start); - let endString = String(end); - let stepString = String(step); - step = Math.max(Math.abs(step), 1); + // It exists, but maybe not how we need it + if (!needDir || c === 'DIR') + return c - let padded = zeros(startString) || zeros(endString) || zeros(stepString); - let maxLen = padded ? Math.max(startString.length, endString.length, stepString.length) : 0; - let toNumber = padded === false && stringify(start, end, options) === false; - let format = options.transform || transform(toNumber); + if (needDir && c === 'FILE') + return false - if (options.toRegex && step === 1) { - return toRange(toMaxLen(start, maxLen), toMaxLen(end, maxLen), true, options); + // otherwise we have to stat, because maybe c=true + // if we know it exists, but not what it is. } - let parts = { negatives: [], positives: [] }; - let push = num => parts[num < 0 ? 'negatives' : 'positives'].push(Math.abs(num)); - let range = []; - let index = 0; + var exists + var stat = this.statCache[abs] + if (!stat) { + var lstat + try { + lstat = fs.lstatSync(abs) + } catch (er) { + if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) { + this.statCache[abs] = false + return false + } + } - while (descending ? a >= b : a <= b) { - if (options.toRegex === true && step > 1) { - push(a); + if (lstat && lstat.isSymbolicLink()) { + try { + stat = fs.statSync(abs) + } catch (er) { + stat = lstat + } } else { - range.push(pad(format(a, index), maxLen, toNumber)); + stat = lstat } - a = descending ? a - step : a + step; - index++; } - if (options.toRegex === true) { - return step > 1 - ? toSequence(parts, options) - : toRegex(range, null, { wrap: false, ...options }); - } + this.statCache[abs] = stat - return range; -}; + var c = true + if (stat) + c = stat.isDirectory() ? 'DIR' : 'FILE' -const fillLetters = (start, end, step = 1, options = {}) => { - if ((!isNumber(start) && start.length > 1) || (!isNumber(end) && end.length > 1)) { - return invalidRange(start, end, options); - } + this.cache[abs] = this.cache[abs] || c + if (needDir && c === 'FILE') + return false - let format = options.transform || (val => String.fromCharCode(val)); - let a = `${start}`.charCodeAt(0); - let b = `${end}`.charCodeAt(0); + return c +} - let descending = a > b; - let min = Math.min(a, b); - let max = Math.max(a, b); +GlobSync.prototype._mark = function (p) { + return common.mark(this, p) +} - if (options.toRegex && step === 1) { - return toRange(min, max, false, options); - } +GlobSync.prototype._makeAbs = function (f) { + return common.makeAbs(this, f) +} - let range = []; - let index = 0; - while (descending ? a >= b : a <= b) { - range.push(format(a, index)); - a = descending ? a - step : a + step; - index++; - } +/***/ }), +/* 596 */ +/***/ (function(module, exports, __webpack_require__) { - if (options.toRegex === true) { - return toRegex(range, null, { wrap: false, options }); - } +exports.alphasort = alphasort +exports.alphasorti = alphasorti +exports.setopts = setopts +exports.ownProp = ownProp +exports.makeAbs = makeAbs +exports.finish = finish +exports.mark = mark +exports.isIgnored = isIgnored +exports.childrenIgnored = childrenIgnored - return range; -}; +function ownProp (obj, field) { + return Object.prototype.hasOwnProperty.call(obj, field) +} -const fill = (start, end, step, options = {}) => { - if (end == null && isValidValue(start)) { - return [start]; - } +var path = __webpack_require__(16) +var minimatch = __webpack_require__(505) +var isAbsolute = __webpack_require__(511) +var Minimatch = minimatch.Minimatch - if (!isValidValue(start) || !isValidValue(end)) { - return invalidRange(start, end, options); +function alphasorti (a, b) { + return a.toLowerCase().localeCompare(b.toLowerCase()) +} + +function alphasort (a, b) { + return a.localeCompare(b) +} + +function setupIgnores (self, options) { + self.ignore = options.ignore || [] + + if (!Array.isArray(self.ignore)) + self.ignore = [self.ignore] + + if (self.ignore.length) { + self.ignore = self.ignore.map(ignoreMap) } +} - if (typeof step === 'function') { - return fill(start, end, 1, { transform: step }); +// ignore patterns are always in dot:true mode. +function ignoreMap (pattern) { + var gmatcher = null + if (pattern.slice(-3) === '/**') { + var gpattern = pattern.replace(/(\/\*\*)+$/, '') + gmatcher = new Minimatch(gpattern, { dot: true }) } - if (isObject(step)) { - return fill(start, end, 0, step); + return { + matcher: new Minimatch(pattern, { dot: true }), + gmatcher: gmatcher } +} - let opts = { ...options }; - if (opts.capture === true) opts.wrap = true; - step = step || opts.step || 1; +function setopts (self, pattern, options) { + if (!options) + options = {} - if (!isNumber(step)) { - if (step != null && !isObject(step)) return invalidStep(step, opts); - return fill(start, end, 1, step); + // base-matching: just use globstar for that. + if (options.matchBase && -1 === pattern.indexOf("/")) { + if (options.noglobstar) { + throw new Error("base matching requires globstar") + } + pattern = "**/" + pattern } - if (isNumber(start) && isNumber(end)) { - return fillNumbers(start, end, step, opts); - } + self.silent = !!options.silent + self.pattern = pattern + self.strict = options.strict !== false + self.realpath = !!options.realpath + self.realpathCache = options.realpathCache || Object.create(null) + self.follow = !!options.follow + self.dot = !!options.dot + self.mark = !!options.mark + self.nodir = !!options.nodir + if (self.nodir) + self.mark = true + self.sync = !!options.sync + self.nounique = !!options.nounique + self.nonull = !!options.nonull + self.nosort = !!options.nosort + self.nocase = !!options.nocase + self.stat = !!options.stat + self.noprocess = !!options.noprocess + self.absolute = !!options.absolute - return fillLetters(start, end, Math.max(Math.abs(step), 1), opts); -}; + self.maxLength = options.maxLength || Infinity + self.cache = options.cache || Object.create(null) + self.statCache = options.statCache || Object.create(null) + self.symlinks = options.symlinks || Object.create(null) -module.exports = fill; + setupIgnores(self, options) + self.changedCwd = false + var cwd = process.cwd() + if (!ownProp(options, "cwd")) + self.cwd = cwd + else { + self.cwd = path.resolve(options.cwd) + self.changedCwd = self.cwd !== cwd + } -/***/ }), -/* 609 */ -/***/ (function(module, exports, __webpack_require__) { + self.root = options.root || path.resolve(self.cwd, "/") + self.root = path.resolve(self.root) + if (process.platform === "win32") + self.root = self.root.replace(/\\/g, "/") -"use strict"; -/*! - * to-regex-range - * - * Copyright (c) 2015-present, Jon Schlinkert. - * Released under the MIT License. - */ + // TODO: is an absolute `cwd` supposed to be resolved against `root`? + // e.g. { cwd: '/test', root: __dirname } === path.join(__dirname, '/test') + self.cwdAbs = isAbsolute(self.cwd) ? self.cwd : makeAbs(self, self.cwd) + if (process.platform === "win32") + self.cwdAbs = self.cwdAbs.replace(/\\/g, "/") + self.nomount = !!options.nomount + // disable comments and negation in Minimatch. + // Note that they are not supported in Glob itself anyway. + options.nonegate = true + options.nocomment = true + self.minimatch = new Minimatch(pattern, options) + self.options = self.minimatch.options +} -const isNumber = __webpack_require__(610); +function finish (self) { + var nou = self.nounique + var all = nou ? [] : Object.create(null) -const toRegexRange = (min, max, options) => { - if (isNumber(min) === false) { - throw new TypeError('toRegexRange: expected the first argument to be a number'); + for (var i = 0, l = self.matches.length; i < l; i ++) { + var matches = self.matches[i] + if (!matches || Object.keys(matches).length === 0) { + if (self.nonull) { + // do like the shell, and spit out the literal glob + var literal = self.minimatch.globSet[i] + if (nou) + all.push(literal) + else + all[literal] = true + } + } else { + // had matches + var m = Object.keys(matches) + if (nou) + all.push.apply(all, m) + else + m.forEach(function (m) { + all[m] = true + }) + } } - if (max === void 0 || min === max) { - return String(min); - } + if (!nou) + all = Object.keys(all) - if (isNumber(max) === false) { - throw new TypeError('toRegexRange: expected the second argument to be a number.'); - } + if (!self.nosort) + all = all.sort(self.nocase ? alphasorti : alphasort) - let opts = { relaxZeros: true, ...options }; - if (typeof opts.strictZeros === 'boolean') { - opts.relaxZeros = opts.strictZeros === false; + // at *some* point we statted all of these + if (self.mark) { + for (var i = 0; i < all.length; i++) { + all[i] = self._mark(all[i]) + } + if (self.nodir) { + all = all.filter(function (e) { + var notDir = !(/\/$/.test(e)) + var c = self.cache[e] || self.cache[makeAbs(self, e)] + if (notDir && c) + notDir = c !== 'DIR' && !Array.isArray(c) + return notDir + }) + } } - let relax = String(opts.relaxZeros); - let shorthand = String(opts.shorthand); - let capture = String(opts.capture); - let wrap = String(opts.wrap); - let cacheKey = min + ':' + max + '=' + relax + shorthand + capture + wrap; + if (self.ignore.length) + all = all.filter(function(m) { + return !isIgnored(self, m) + }) - if (toRegexRange.cache.hasOwnProperty(cacheKey)) { - return toRegexRange.cache[cacheKey].result; - } + self.found = all +} - let a = Math.min(min, max); - let b = Math.max(min, max); +function mark (self, p) { + var abs = makeAbs(self, p) + var c = self.cache[abs] + var m = p + if (c) { + var isDir = c === 'DIR' || Array.isArray(c) + var slash = p.slice(-1) === '/' - if (Math.abs(a - b) === 1) { - let result = min + '|' + max; - if (opts.capture) { - return `(${result})`; - } - if (opts.wrap === false) { - return result; + if (isDir && !slash) + m += '/' + else if (!isDir && slash) + m = m.slice(0, -1) + + if (m !== p) { + var mabs = makeAbs(self, m) + self.statCache[mabs] = self.statCache[abs] + self.cache[mabs] = self.cache[abs] } - return `(?:${result})`; } - let isPadded = hasPadding(min) || hasPadding(max); - let state = { min, max, a, b }; - let positives = []; - let negatives = []; - - if (isPadded) { - state.isPadded = isPadded; - state.maxLen = String(state.max).length; - } + return m +} - if (a < 0) { - let newMin = b < 0 ? Math.abs(b) : 1; - negatives = splitToPatterns(newMin, Math.abs(a), state, opts); - a = state.a = 0; +// lotta situps... +function makeAbs (self, f) { + var abs = f + if (f.charAt(0) === '/') { + abs = path.join(self.root, f) + } else if (isAbsolute(f) || f === '') { + abs = f + } else if (self.changedCwd) { + abs = path.resolve(self.cwd, f) + } else { + abs = path.resolve(f) } - if (b >= 0) { - positives = splitToPatterns(a, b, state, opts); - } + if (process.platform === 'win32') + abs = abs.replace(/\\/g, '/') - state.negatives = negatives; - state.positives = positives; - state.result = collatePatterns(negatives, positives, opts); + return abs +} - if (opts.capture === true) { - state.result = `(${state.result})`; - } else if (opts.wrap !== false && (positives.length + negatives.length) > 1) { - state.result = `(?:${state.result})`; - } - toRegexRange.cache[cacheKey] = state; - return state.result; -}; +// Return true, if pattern ends with globstar '**', for the accompanying parent directory. +// Ex:- If node_modules/** is the pattern, add 'node_modules' to ignore list along with it's contents +function isIgnored (self, path) { + if (!self.ignore.length) + return false -function collatePatterns(neg, pos, options) { - let onlyNegative = filterPatterns(neg, pos, '-', false, options) || []; - let onlyPositive = filterPatterns(pos, neg, '', false, options) || []; - let intersected = filterPatterns(neg, pos, '-?', true, options) || []; - let subpatterns = onlyNegative.concat(intersected).concat(onlyPositive); - return subpatterns.join('|'); + return self.ignore.some(function(item) { + return item.matcher.match(path) || !!(item.gmatcher && item.gmatcher.match(path)) + }) } -function splitToRanges(min, max) { - let nines = 1; - let zeros = 1; +function childrenIgnored (self, path) { + if (!self.ignore.length) + return false - let stop = countNines(min, nines); - let stops = new Set([max]); + return self.ignore.some(function(item) { + return !!(item.gmatcher && item.gmatcher.match(path)) + }) +} - while (min <= stop && stop <= max) { - stops.add(stop); - nines += 1; - stop = countNines(min, nines); - } - stop = countZeros(max + 1, zeros) - 1; +/***/ }), +/* 597 */ +/***/ (function(module, exports, __webpack_require__) { - while (min < stop && stop <= max) { - stops.add(stop); - zeros += 1; - stop = countZeros(max + 1, zeros) - 1; - } +"use strict"; + +const taskManager = __webpack_require__(598); +const async_1 = __webpack_require__(626); +const stream_1 = __webpack_require__(659); +const sync_1 = __webpack_require__(660); +const settings_1 = __webpack_require__(662); +const utils = __webpack_require__(599); +function FastGlob(source, options) { + try { + assertPatternsInput(source); + } + catch (error) { + return Promise.reject(error); + } + const works = getWorks(source, async_1.default, options); + return Promise.all(works).then(utils.array.flatten); +} +(function (FastGlob) { + function sync(source, options) { + assertPatternsInput(source); + const works = getWorks(source, sync_1.default, options); + return utils.array.flatten(works); + } + FastGlob.sync = sync; + function stream(source, options) { + assertPatternsInput(source); + const works = getWorks(source, stream_1.default, options); + /** + * The stream returned by the provider cannot work with an asynchronous iterator. + * To support asynchronous iterators, regardless of the number of tasks, we always multiplex streams. + * This affects performance (+25%). I don't see best solution right now. + */ + return utils.stream.merge(works); + } + FastGlob.stream = stream; + function generateTasks(source, options) { + assertPatternsInput(source); + const patterns = [].concat(source); + const settings = new settings_1.default(options); + return taskManager.generate(patterns, settings); + } + FastGlob.generateTasks = generateTasks; +})(FastGlob || (FastGlob = {})); +function getWorks(source, _Provider, options) { + const patterns = [].concat(source); + const settings = new settings_1.default(options); + const tasks = taskManager.generate(patterns, settings); + const provider = new _Provider(settings); + return tasks.map(provider.read, provider); +} +function assertPatternsInput(source) { + if ([].concat(source).every(isString)) { + return; + } + throw new TypeError('Patterns must be a string or an array of strings'); +} +function isString(source) { + /* tslint:disable-next-line strict-type-predicates */ + return typeof source === 'string'; +} +module.exports = FastGlob; - stops = [...stops]; - stops.sort(compare); - return stops; -} -/** - * Convert a range to a regex pattern - * @param {Number} `start` - * @param {Number} `stop` - * @return {String} - */ +/***/ }), +/* 598 */ +/***/ (function(module, exports, __webpack_require__) { -function rangeToPattern(start, stop, options) { - if (start === stop) { - return { pattern: start, count: [], digits: 0 }; - } +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const utils = __webpack_require__(599); +function generate(patterns, settings) { + const positivePatterns = getPositivePatterns(patterns); + const negativePatterns = getNegativePatternsAsPositive(patterns, settings.ignore); + /** + * When the `caseSensitiveMatch` option is disabled, all patterns must be marked as dynamic, because we cannot check + * filepath directly (without read directory). + */ + const staticPatterns = !settings.caseSensitiveMatch ? [] : positivePatterns.filter(utils.pattern.isStaticPattern); + const dynamicPatterns = !settings.caseSensitiveMatch ? positivePatterns : positivePatterns.filter(utils.pattern.isDynamicPattern); + const staticTasks = convertPatternsToTasks(staticPatterns, negativePatterns, /* dynamic */ false); + const dynamicTasks = convertPatternsToTasks(dynamicPatterns, negativePatterns, /* dynamic */ true); + return staticTasks.concat(dynamicTasks); +} +exports.generate = generate; +function convertPatternsToTasks(positive, negative, dynamic) { + const positivePatternsGroup = groupPatternsByBaseDirectory(positive); + // When we have a global group – there is no reason to divide the patterns into independent tasks. + // In this case, the global task covers the rest. + if ('.' in positivePatternsGroup) { + const task = convertPatternGroupToTask('.', positive, negative, dynamic); + return [task]; + } + return convertPatternGroupsToTasks(positivePatternsGroup, negative, dynamic); +} +exports.convertPatternsToTasks = convertPatternsToTasks; +function getPositivePatterns(patterns) { + return utils.pattern.getPositivePatterns(patterns); +} +exports.getPositivePatterns = getPositivePatterns; +function getNegativePatternsAsPositive(patterns, ignore) { + const negative = utils.pattern.getNegativePatterns(patterns).concat(ignore); + const positive = negative.map(utils.pattern.convertToPositivePattern); + return positive; +} +exports.getNegativePatternsAsPositive = getNegativePatternsAsPositive; +function groupPatternsByBaseDirectory(patterns) { + return patterns.reduce((collection, pattern) => { + const base = utils.pattern.getBaseDirectory(pattern); + if (base in collection) { + collection[base].push(pattern); + } + else { + collection[base] = [pattern]; + } + return collection; + }, {}); +} +exports.groupPatternsByBaseDirectory = groupPatternsByBaseDirectory; +function convertPatternGroupsToTasks(positive, negative, dynamic) { + return Object.keys(positive).map((base) => { + return convertPatternGroupToTask(base, positive[base], negative, dynamic); + }); +} +exports.convertPatternGroupsToTasks = convertPatternGroupsToTasks; +function convertPatternGroupToTask(base, positive, negative, dynamic) { + return { + dynamic, + positive, + negative, + base, + patterns: [].concat(positive, negative.map(utils.pattern.convertToNegativePattern)) + }; +} +exports.convertPatternGroupToTask = convertPatternGroupToTask; - let zipped = zip(start, stop); - let digits = zipped.length; - let pattern = ''; - let count = 0; - for (let i = 0; i < digits; i++) { - let [startDigit, stopDigit] = zipped[i]; +/***/ }), +/* 599 */ +/***/ (function(module, exports, __webpack_require__) { - if (startDigit === stopDigit) { - pattern += startDigit; +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const array = __webpack_require__(600); +exports.array = array; +const errno = __webpack_require__(601); +exports.errno = errno; +const fs = __webpack_require__(602); +exports.fs = fs; +const path = __webpack_require__(603); +exports.path = path; +const pattern = __webpack_require__(604); +exports.pattern = pattern; +const stream = __webpack_require__(625); +exports.stream = stream; - } else if (startDigit !== '0' || stopDigit !== '9') { - pattern += toCharacterClass(startDigit, stopDigit, options); - } else { - count++; - } - } +/***/ }), +/* 600 */ +/***/ (function(module, exports, __webpack_require__) { - if (count) { - pattern += options.shorthand === true ? '\\d' : '[0-9]'; - } +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +function flatten(items) { + return items.reduce((collection, item) => [].concat(collection, item), []); +} +exports.flatten = flatten; - return { pattern, count: [count], digits }; -} -function splitToPatterns(min, max, tok, options) { - let ranges = splitToRanges(min, max); - let tokens = []; - let start = min; - let prev; +/***/ }), +/* 601 */ +/***/ (function(module, exports, __webpack_require__) { - for (let i = 0; i < ranges.length; i++) { - let max = ranges[i]; - let obj = rangeToPattern(String(start), String(max), options); - let zeros = ''; +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +function isEnoentCodeError(error) { + return error.code === 'ENOENT'; +} +exports.isEnoentCodeError = isEnoentCodeError; - if (!tok.isPadded && prev && prev.pattern === obj.pattern) { - if (prev.count.length > 1) { - prev.count.pop(); - } - prev.count.push(obj.count[0]); - prev.string = prev.pattern + toQuantifier(prev.count); - start = max + 1; - continue; - } +/***/ }), +/* 602 */ +/***/ (function(module, exports, __webpack_require__) { - if (tok.isPadded) { - zeros = padZeros(max, tok, options); - } +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +class DirentFromStats { + constructor(name, stats) { + this.name = name; + this.isBlockDevice = stats.isBlockDevice.bind(stats); + this.isCharacterDevice = stats.isCharacterDevice.bind(stats); + this.isDirectory = stats.isDirectory.bind(stats); + this.isFIFO = stats.isFIFO.bind(stats); + this.isFile = stats.isFile.bind(stats); + this.isSocket = stats.isSocket.bind(stats); + this.isSymbolicLink = stats.isSymbolicLink.bind(stats); + } +} +function createDirentFromStats(name, stats) { + return new DirentFromStats(name, stats); +} +exports.createDirentFromStats = createDirentFromStats; - obj.string = zeros + obj.pattern + toQuantifier(obj.count); - tokens.push(obj); - start = max + 1; - prev = obj; - } - return tokens; -} +/***/ }), +/* 603 */ +/***/ (function(module, exports, __webpack_require__) { -function filterPatterns(arr, comparison, prefix, intersection, options) { - let result = []; +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const path = __webpack_require__(16); +/** + * Designed to work only with simple paths: `dir\\file`. + */ +function unixify(filepath) { + return filepath.replace(/\\/g, '/'); +} +exports.unixify = unixify; +function makeAbsolute(cwd, filepath) { + return path.resolve(cwd, filepath); +} +exports.makeAbsolute = makeAbsolute; - for (let ele of arr) { - let { string } = ele; - // only push if _both_ are negative... - if (!intersection && !contains(comparison, 'string', string)) { - result.push(prefix + string); - } +/***/ }), +/* 604 */ +/***/ (function(module, exports, __webpack_require__) { - // or _both_ are positive - if (intersection && contains(comparison, 'string', string)) { - result.push(prefix + string); - } - } - return result; -} +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const path = __webpack_require__(16); +const globParent = __webpack_require__(605); +const isGlob = __webpack_require__(606); +const micromatch = __webpack_require__(608); +const GLOBSTAR = '**'; +function isStaticPattern(pattern) { + return !isDynamicPattern(pattern); +} +exports.isStaticPattern = isStaticPattern; +function isDynamicPattern(pattern) { + return isGlob(pattern, { strict: false }); +} +exports.isDynamicPattern = isDynamicPattern; +function convertToPositivePattern(pattern) { + return isNegativePattern(pattern) ? pattern.slice(1) : pattern; +} +exports.convertToPositivePattern = convertToPositivePattern; +function convertToNegativePattern(pattern) { + return '!' + pattern; +} +exports.convertToNegativePattern = convertToNegativePattern; +function isNegativePattern(pattern) { + return pattern.startsWith('!') && pattern[1] !== '('; +} +exports.isNegativePattern = isNegativePattern; +function isPositivePattern(pattern) { + return !isNegativePattern(pattern); +} +exports.isPositivePattern = isPositivePattern; +function getNegativePatterns(patterns) { + return patterns.filter(isNegativePattern); +} +exports.getNegativePatterns = getNegativePatterns; +function getPositivePatterns(patterns) { + return patterns.filter(isPositivePattern); +} +exports.getPositivePatterns = getPositivePatterns; +function getBaseDirectory(pattern) { + return globParent(pattern); +} +exports.getBaseDirectory = getBaseDirectory; +function hasGlobStar(pattern) { + return pattern.indexOf(GLOBSTAR) !== -1; +} +exports.hasGlobStar = hasGlobStar; +function endsWithSlashGlobStar(pattern) { + return pattern.endsWith('/' + GLOBSTAR); +} +exports.endsWithSlashGlobStar = endsWithSlashGlobStar; +function isAffectDepthOfReadingPattern(pattern) { + const basename = path.basename(pattern); + return endsWithSlashGlobStar(pattern) || isStaticPattern(basename); +} +exports.isAffectDepthOfReadingPattern = isAffectDepthOfReadingPattern; +function getNaiveDepth(pattern) { + const base = getBaseDirectory(pattern); + const patternDepth = pattern.split('/').length; + const patternBaseDepth = base.split('/').length; + /** + * This is a hack for pattern that has no base directory. + * + * This is related to the `*\something\*` pattern. + */ + if (base === '.') { + return patternDepth - patternBaseDepth; + } + return patternDepth - patternBaseDepth - 1; +} +exports.getNaiveDepth = getNaiveDepth; +function getMaxNaivePatternsDepth(patterns) { + return patterns.reduce((max, pattern) => { + const depth = getNaiveDepth(pattern); + return depth > max ? depth : max; + }, 0); +} +exports.getMaxNaivePatternsDepth = getMaxNaivePatternsDepth; +function makeRe(pattern, options) { + return micromatch.makeRe(pattern, options); +} +exports.makeRe = makeRe; +function convertPatternsToRe(patterns, options) { + return patterns.map((pattern) => makeRe(pattern, options)); +} +exports.convertPatternsToRe = convertPatternsToRe; +function matchAny(entry, patternsRe) { + const filepath = entry.replace(/^\.[\\\/]/, ''); + return patternsRe.some((patternRe) => patternRe.test(filepath)); +} +exports.matchAny = matchAny; -/** - * Zip strings - */ -function zip(a, b) { - let arr = []; - for (let i = 0; i < a.length; i++) arr.push([a[i], b[i]]); - return arr; -} +/***/ }), +/* 605 */ +/***/ (function(module, exports, __webpack_require__) { -function compare(a, b) { - return a > b ? 1 : b > a ? -1 : 0; -} +"use strict"; -function contains(arr, key, val) { - return arr.some(ele => ele[key] === val); -} -function countNines(min, len) { - return Number(String(min).slice(0, -len) + '9'.repeat(len)); -} +var isGlob = __webpack_require__(606); +var pathPosixDirname = __webpack_require__(16).posix.dirname; +var isWin32 = __webpack_require__(11).platform() === 'win32'; -function countZeros(integer, zeros) { - return integer - (integer % Math.pow(10, zeros)); -} +var slash = '/'; +var backslash = /\\/g; +var enclosure = /[\{\[].*[\/]*.*[\}\]]$/; +var globby = /(^|[^\\])([\{\[]|\([^\)]+$)/; +var escaped = /\\([\*\?\|\[\]\(\)\{\}])/g; -function toQuantifier(digits) { - let [start = 0, stop = ''] = digits; - if (stop || start > 1) { - return `{${start + (stop ? ',' + stop : '')}}`; +module.exports = function globParent(str) { + // flip windows path separators + if (isWin32 && str.indexOf(slash) < 0) { + str = str.replace(backslash, slash); } - return ''; -} - -function toCharacterClass(a, b, options) { - return `[${a}${(b - a === 1) ? '' : '-'}${b}]`; -} - -function hasPadding(str) { - return /^-?(0+)\d/.test(str); -} -function padZeros(value, tok, options) { - if (!tok.isPadded) { - return value; + // special case for strings ending in enclosure containing path separator + if (enclosure.test(str)) { + str += slash; } - let diff = Math.abs(tok.maxLen - String(value).length); - let relax = options.relaxZeros !== false; + // preserves full path in case of trailing path separator + str += 'a'; - switch (diff) { - case 0: - return ''; - case 1: - return relax ? '0?' : '0'; - case 2: - return relax ? '0{0,2}' : '00'; - default: { - return relax ? `0{0,${diff}}` : `0{${diff}}`; - } - } -} - -/** - * Cache - */ - -toRegexRange.cache = {}; -toRegexRange.clearCache = () => (toRegexRange.cache = {}); - -/** - * Expose `toRegexRange` - */ + // remove path parts that are globby + do { + str = pathPosixDirname(str); + } while (isGlob(str) || globby.test(str)); -module.exports = toRegexRange; + // remove escape chars and return result + return str.replace(escaped, '$1'); +}; /***/ }), -/* 610 */ +/* 606 */ /***/ (function(module, exports, __webpack_require__) { -"use strict"; /*! - * is-number + * is-glob * - * Copyright (c) 2014-present, Jon Schlinkert. + * Copyright (c) 2014-2017, Jon Schlinkert. * Released under the MIT License. */ +var isExtglob = __webpack_require__(607); +var chars = { '{': '}', '(': ')', '[': ']'}; +var strictRegex = /\\(.)|(^!|\*|[\].+)]\?|\[[^\\\]]+\]|\{[^\\}]+\}|\(\?[:!=][^\\)]+\)|\([^|]+\|[^\\)]+\))/; +var relaxedRegex = /\\(.)|(^!|[*?{}()[\]]|\(\?)/; - -module.exports = function(num) { - if (typeof num === 'number') { - return num - num === 0; +module.exports = function isGlob(str, options) { + if (typeof str !== 'string' || str === '') { + return false; } - if (typeof num === 'string' && num.trim() !== '') { - return Number.isFinite ? Number.isFinite(+num) : isFinite(+num); + + if (isExtglob(str)) { + return true; } - return false; -}; + var regex = strictRegex; + var match; -/***/ }), -/* 611 */ -/***/ (function(module, exports, __webpack_require__) { + // optionally relax regex + if (options && options.strict === false) { + regex = relaxedRegex; + } -"use strict"; + while ((match = regex.exec(str))) { + if (match[2]) return true; + var idx = match.index + match[0].length; + + // if an open bracket/brace/paren is escaped, + // set the index to the next closing character + var open = match[1]; + var close = open ? chars[open] : null; + if (open && close) { + var n = str.indexOf(close, idx); + if (n !== -1) { + idx = n + 1; + } + } + str = str.slice(idx); + } + return false; +}; -const fill = __webpack_require__(608); -const stringify = __webpack_require__(605); -const utils = __webpack_require__(606); -const append = (queue = '', stash = '', enclose = false) => { - let result = []; +/***/ }), +/* 607 */ +/***/ (function(module, exports) { - queue = [].concat(queue); - stash = [].concat(stash); +/*! + * is-extglob + * + * Copyright (c) 2014-2016, Jon Schlinkert. + * Licensed under the MIT License. + */ - if (!stash.length) return queue; - if (!queue.length) { - return enclose ? utils.flatten(stash).map(ele => `{${ele}}`) : stash; +module.exports = function isExtglob(str) { + if (typeof str !== 'string' || str === '') { + return false; } - for (let item of queue) { - if (Array.isArray(item)) { - for (let value of item) { - result.push(append(value, stash, enclose)); - } - } else { - for (let ele of stash) { - if (enclose === true && typeof ele === 'string') ele = `{${ele}}`; - result.push(Array.isArray(ele) ? append(item, ele, enclose) : (item + ele)); - } - } + var match; + while ((match = /(\\).|([@?!+*]\(.*\))/g.exec(str))) { + if (match[2]) return true; + str = str.slice(match.index + match[0].length); } - return utils.flatten(result); -}; -const expand = (ast, options = {}) => { - let rangeLimit = options.rangeLimit === void 0 ? 1000 : options.rangeLimit; + return false; +}; - let walk = (node, parent = {}) => { - node.queue = []; - let p = parent; - let q = parent.queue; +/***/ }), +/* 608 */ +/***/ (function(module, exports, __webpack_require__) { - while (p.type !== 'brace' && p.type !== 'root' && p.parent) { - p = p.parent; - q = p.queue; - } +"use strict"; - if (node.invalid || node.dollar) { - q.push(append(q.pop(), stringify(node, options))); - return; - } - if (node.type === 'brace' && node.invalid !== true && node.nodes.length === 2) { - q.push(append(q.pop(), ['{}'])); - return; - } +const util = __webpack_require__(29); +const braces = __webpack_require__(609); +const picomatch = __webpack_require__(619); +const utils = __webpack_require__(622); +const isEmptyString = val => typeof val === 'string' && (val === '' || val === './'); - if (node.nodes && node.ranges > 0) { - let args = utils.reduce(node.nodes); +/** + * Returns an array of strings that match one or more glob patterns. + * + * ```js + * const mm = require('micromatch'); + * // mm(list, patterns[, options]); + * + * console.log(mm(['a.js', 'a.txt'], ['*.js'])); + * //=> [ 'a.js' ] + * ``` + * @param {String|Array} list List of strings to match. + * @param {String|Array} patterns One or more glob patterns to use for matching. + * @param {Object} options See available [options](#options) + * @return {Array} Returns an array of matches + * @summary false + * @api public + */ - if (utils.exceedsLimit(...args, options.step, rangeLimit)) { - throw new RangeError('expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.'); - } +const micromatch = (list, patterns, options) => { + patterns = [].concat(patterns); + list = [].concat(list); - let range = fill(...args, options); - if (range.length === 0) { - range = stringify(node, options); - } + let omit = new Set(); + let keep = new Set(); + let items = new Set(); + let negatives = 0; - q.push(append(q.pop(), range)); - node.nodes = []; - return; + let onResult = state => { + items.add(state.output); + if (options && options.onResult) { + options.onResult(state); } + }; - let enclose = utils.encloseBrace(node); - let queue = node.queue; - let block = node; - - while (block.type !== 'brace' && block.type !== 'root' && block.parent) { - block = block.parent; - queue = block.queue; - } + for (let i = 0; i < patterns.length; i++) { + let isMatch = picomatch(String(patterns[i]), { ...options, onResult }, true); + let negated = isMatch.state.negated || isMatch.state.negatedExtglob; + if (negated) negatives++; - for (let i = 0; i < node.nodes.length; i++) { - let child = node.nodes[i]; + for (let item of list) { + let matched = isMatch(item, true); - if (child.type === 'comma' && node.type === 'brace') { - if (i === 1) queue.push(''); - queue.push(''); - continue; - } + let match = negated ? !matched.isMatch : matched.isMatch; + if (!match) continue; - if (child.type === 'close') { - q.push(append(q.pop(), queue, enclose)); - continue; + if (negated) { + omit.add(matched.output); + } else { + omit.delete(matched.output); + keep.add(matched.output); } + } + } - if (child.value && child.type !== 'open') { - queue.push(append(queue.pop(), child.value)); - continue; - } + let result = negatives === patterns.length ? [...items] : [...keep]; + let matches = result.filter(item => !omit.has(item)); - if (child.nodes) { - walk(child, node); - } + if (options && matches.length === 0) { + if (options.failglob === true) { + throw new Error(`No matches found for "${patterns.join(', ')}"`); } - return queue; - }; + if (options.nonull === true || options.nullglob === true) { + return options.unescape ? patterns.map(p => p.replace(/\\/g, '')) : patterns; + } + } - return utils.flatten(walk(ast)); + return matches; }; -module.exports = expand; - - -/***/ }), -/* 612 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - +/** + * Backwards compatibility + */ -const stringify = __webpack_require__(605); +micromatch.match = micromatch; /** - * Constants + * Returns a matcher function from the given glob `pattern` and `options`. + * The returned function takes a string to match as its only argument and returns + * true if the string is a match. + * + * ```js + * const mm = require('micromatch'); + * // mm.matcher(pattern[, options]); + * + * const isMatch = mm.matcher('*.!(*a)'); + * console.log(isMatch('a.a')); //=> false + * console.log(isMatch('a.b')); //=> true + * ``` + * @param {String} `pattern` Glob pattern + * @param {Object} `options` + * @return {Function} Returns a matcher function. + * @api public */ -const { - MAX_LENGTH, - CHAR_BACKSLASH, /* \ */ - CHAR_BACKTICK, /* ` */ - CHAR_COMMA, /* , */ - CHAR_DOT, /* . */ - CHAR_LEFT_PARENTHESES, /* ( */ - CHAR_RIGHT_PARENTHESES, /* ) */ - CHAR_LEFT_CURLY_BRACE, /* { */ - CHAR_RIGHT_CURLY_BRACE, /* } */ - CHAR_LEFT_SQUARE_BRACKET, /* [ */ - CHAR_RIGHT_SQUARE_BRACKET, /* ] */ - CHAR_DOUBLE_QUOTE, /* " */ - CHAR_SINGLE_QUOTE, /* ' */ - CHAR_NO_BREAK_SPACE, - CHAR_ZERO_WIDTH_NOBREAK_SPACE -} = __webpack_require__(613); +micromatch.matcher = (pattern, options) => picomatch(pattern, options); /** - * parse + * Returns true if **any** of the given glob `patterns` match the specified `string`. + * + * ```js + * const mm = require('micromatch'); + * // mm.isMatch(string, patterns[, options]); + * + * console.log(mm.isMatch('a.a', ['b.*', '*.a'])); //=> true + * console.log(mm.isMatch('a.a', 'b.*')); //=> false + * ``` + * @param {String} str The string to test. + * @param {String|Array} patterns One or more glob patterns to use for matching. + * @param {Object} [options] See available [options](#options). + * @return {Boolean} Returns true if any patterns match `str` + * @api public */ -const parse = (input, options = {}) => { - if (typeof input !== 'string') { - throw new TypeError('Expected a string'); - } - - let opts = options || {}; - let max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH; - if (input.length > max) { - throw new SyntaxError(`Input length (${input.length}), exceeds max characters (${max})`); - } +micromatch.isMatch = (str, patterns, options) => picomatch(patterns, options)(str); - let ast = { type: 'root', input, nodes: [] }; - let stack = [ast]; - let block = ast; - let prev = ast; - let brackets = 0; - let length = input.length; - let index = 0; - let depth = 0; - let value; - let memo = {}; +/** + * Backwards compatibility + */ - /** - * Helpers - */ +micromatch.any = micromatch.isMatch; - const advance = () => input[index++]; - const push = node => { - if (node.type === 'text' && prev.type === 'dot') { - prev.type = 'text'; - } +/** + * Returns a list of strings that _**do not match any**_ of the given `patterns`. + * + * ```js + * const mm = require('micromatch'); + * // mm.not(list, patterns[, options]); + * + * console.log(mm.not(['a.a', 'b.b', 'c.c'], '*.a')); + * //=> ['b.b', 'c.c'] + * ``` + * @param {Array} `list` Array of strings to match. + * @param {String|Array} `patterns` One or more glob pattern to use for matching. + * @param {Object} `options` See available [options](#options) for changing how matches are performed + * @return {Array} Returns an array of strings that **do not match** the given patterns. + * @api public + */ - if (prev && prev.type === 'text' && node.type === 'text') { - prev.value += node.value; - return; - } +micromatch.not = (list, patterns, options = {}) => { + patterns = [].concat(patterns).map(String); + let result = new Set(); + let items = []; - block.nodes.push(node); - node.parent = block; - node.prev = prev; - prev = node; - return node; + let onResult = state => { + if (options.onResult) options.onResult(state); + items.push(state.output); }; - push({ type: 'bos' }); - - while (index < length) { - block = stack[stack.length - 1]; - value = advance(); - - /** - * Invalid chars - */ + let matches = micromatch(list, patterns, { ...options, onResult }); - if (value === CHAR_ZERO_WIDTH_NOBREAK_SPACE || value === CHAR_NO_BREAK_SPACE) { - continue; + for (let item of items) { + if (!matches.includes(item)) { + result.add(item); } + } + return [...result]; +}; - /** - * Escaped chars - */ +/** + * Returns true if the given `string` contains the given pattern. Similar + * to [.isMatch](#isMatch) but the pattern can match any part of the string. + * + * ```js + * var mm = require('micromatch'); + * // mm.contains(string, pattern[, options]); + * + * console.log(mm.contains('aa/bb/cc', '*b')); + * //=> true + * console.log(mm.contains('aa/bb/cc', '*d')); + * //=> false + * ``` + * @param {String} `str` The string to match. + * @param {String|Array} `patterns` Glob pattern to use for matching. + * @param {Object} `options` See available [options](#options) for changing how matches are performed + * @return {Boolean} Returns true if the patter matches any part of `str`. + * @api public + */ - if (value === CHAR_BACKSLASH) { - push({ type: 'text', value: (options.keepEscaping ? value : '') + advance() }); - continue; - } +micromatch.contains = (str, pattern, options) => { + if (typeof str !== 'string') { + throw new TypeError(`Expected a string: "${util.inspect(str)}"`); + } - /** - * Right square bracket (literal): ']' - */ + if (Array.isArray(pattern)) { + return pattern.some(p => micromatch.contains(str, p, options)); + } - if (value === CHAR_RIGHT_SQUARE_BRACKET) { - push({ type: 'text', value: '\\' + value }); - continue; + if (typeof pattern === 'string') { + if (isEmptyString(str) || isEmptyString(pattern)) { + return false; } - /** - * Left square bracket: '[' - */ - - if (value === CHAR_LEFT_SQUARE_BRACKET) { - brackets++; - - let closed = true; - let next; + if (str.includes(pattern) || (str.startsWith('./') && str.slice(2).includes(pattern))) { + return true; + } + } - while (index < length && (next = advance())) { - value += next; + return micromatch.isMatch(str, pattern, { ...options, contains: true }); +}; - if (next === CHAR_LEFT_SQUARE_BRACKET) { - brackets++; - continue; - } +/** + * Filter the keys of the given object with the given `glob` pattern + * and `options`. Does not attempt to match nested keys. If you need this feature, + * use [glob-object][] instead. + * + * ```js + * const mm = require('micromatch'); + * // mm.matchKeys(object, patterns[, options]); + * + * const obj = { aa: 'a', ab: 'b', ac: 'c' }; + * console.log(mm.matchKeys(obj, '*b')); + * //=> { ab: 'b' } + * ``` + * @param {Object} `object` The object with keys to filter. + * @param {String|Array} `patterns` One or more glob patterns to use for matching. + * @param {Object} `options` See available [options](#options) for changing how matches are performed + * @return {Object} Returns an object with only keys that match the given patterns. + * @api public + */ - if (next === CHAR_BACKSLASH) { - value += advance(); - continue; - } +micromatch.matchKeys = (obj, patterns, options) => { + if (!utils.isObject(obj)) { + throw new TypeError('Expected the first argument to be an object'); + } + let keys = micromatch(Object.keys(obj), patterns, options); + let res = {}; + for (let key of keys) res[key] = obj[key]; + return res; +}; - if (next === CHAR_RIGHT_SQUARE_BRACKET) { - brackets--; +/** + * Returns true if some of the strings in the given `list` match any of the given glob `patterns`. + * + * ```js + * const mm = require('micromatch'); + * // mm.some(list, patterns[, options]); + * + * console.log(mm.some(['foo.js', 'bar.js'], ['*.js', '!foo.js'])); + * // true + * console.log(mm.some(['foo.js'], ['*.js', '!foo.js'])); + * // false + * ``` + * @param {String|Array} `list` The string or array of strings to test. Returns as soon as the first match is found. + * @param {String|Array} `patterns` One or more glob patterns to use for matching. + * @param {Object} `options` See available [options](#options) for changing how matches are performed + * @return {Boolean} Returns true if any patterns match `str` + * @api public + */ - if (brackets === 0) { - break; - } - } - } +micromatch.some = (list, patterns, options) => { + let items = [].concat(list); - push({ type: 'text', value }); - continue; + for (let pattern of [].concat(patterns)) { + let isMatch = picomatch(String(pattern), options); + if (items.some(item => isMatch(item))) { + return true; } + } + return false; +}; - /** - * Parentheses - */ - - if (value === CHAR_LEFT_PARENTHESES) { - block = push({ type: 'paren', nodes: [] }); - stack.push(block); - push({ type: 'text', value }); - continue; - } - - if (value === CHAR_RIGHT_PARENTHESES) { - if (block.type !== 'paren') { - push({ type: 'text', value }); - continue; - } - block = stack.pop(); - push({ type: 'text', value }); - block = stack[stack.length - 1]; - continue; - } - - /** - * Quotes: '|"|` - */ - - if (value === CHAR_DOUBLE_QUOTE || value === CHAR_SINGLE_QUOTE || value === CHAR_BACKTICK) { - let open = value; - let next; - - if (options.keepQuotes !== true) { - value = ''; - } - - while (index < length && (next = advance())) { - if (next === CHAR_BACKSLASH) { - value += next + advance(); - continue; - } - - if (next === open) { - if (options.keepQuotes === true) value += next; - break; - } - - value += next; - } - - push({ type: 'text', value }); - continue; - } - - /** - * Left curly brace: '{' - */ - - if (value === CHAR_LEFT_CURLY_BRACE) { - depth++; - - let dollar = prev.value && prev.value.slice(-1) === '$' || block.dollar === true; - let brace = { - type: 'brace', - open: true, - close: false, - dollar, - depth, - commas: 0, - ranges: 0, - nodes: [] - }; - - block = push(brace); - stack.push(block); - push({ type: 'open', value }); - continue; - } - - /** - * Right curly brace: '}' - */ - - if (value === CHAR_RIGHT_CURLY_BRACE) { - if (block.type !== 'brace') { - push({ type: 'text', value }); - continue; - } - - let type = 'close'; - block = stack.pop(); - block.close = true; - - push({ type, value }); - depth--; - - block = stack[stack.length - 1]; - continue; - } - - /** - * Comma: ',' - */ - - if (value === CHAR_COMMA && depth > 0) { - if (block.ranges > 0) { - block.ranges = 0; - let open = block.nodes.shift(); - block.nodes = [open, { type: 'text', value: stringify(block) }]; - } - - push({ type: 'comma', value }); - block.commas++; - continue; - } - - /** - * Dot: '.' - */ - - if (value === CHAR_DOT && depth > 0 && block.commas === 0) { - let siblings = block.nodes; - - if (depth === 0 || siblings.length === 0) { - push({ type: 'text', value }); - continue; - } - - if (prev.type === 'dot') { - block.range = []; - prev.value += value; - prev.type = 'range'; - - if (block.nodes.length !== 3 && block.nodes.length !== 5) { - block.invalid = true; - block.ranges = 0; - prev.type = 'text'; - continue; - } - - block.ranges++; - block.args = []; - continue; - } - - if (prev.type === 'range') { - siblings.pop(); +/** + * Returns true if every string in the given `list` matches + * any of the given glob `patterns`. + * + * ```js + * const mm = require('micromatch'); + * // mm.every(list, patterns[, options]); + * + * console.log(mm.every('foo.js', ['foo.js'])); + * // true + * console.log(mm.every(['foo.js', 'bar.js'], ['*.js'])); + * // true + * console.log(mm.every(['foo.js', 'bar.js'], ['*.js', '!foo.js'])); + * // false + * console.log(mm.every(['foo.js'], ['*.js', '!foo.js'])); + * // false + * ``` + * @param {String|Array} `list` The string or array of strings to test. + * @param {String|Array} `patterns` One or more glob patterns to use for matching. + * @param {Object} `options` See available [options](#options) for changing how matches are performed + * @return {Boolean} Returns true if any patterns match `str` + * @api public + */ - let before = siblings[siblings.length - 1]; - before.value += prev.value + value; - prev = before; - block.ranges--; - continue; - } +micromatch.every = (list, patterns, options) => { + let items = [].concat(list); - push({ type: 'dot', value }); - continue; + for (let pattern of [].concat(patterns)) { + let isMatch = picomatch(String(pattern), options); + if (!items.every(item => isMatch(item))) { + return false; } - - /** - * Text - */ - - push({ type: 'text', value }); } - - // Mark imbalanced braces and brackets as invalid - do { - block = stack.pop(); - - if (block.type !== 'root') { - block.nodes.forEach(node => { - if (!node.nodes) { - if (node.type === 'open') node.isOpen = true; - if (node.type === 'close') node.isClose = true; - if (!node.nodes) node.type = 'text'; - node.invalid = true; - } - }); - - // get the location of the block on parent.nodes (block's siblings) - let parent = stack[stack.length - 1]; - let index = parent.nodes.indexOf(block); - // replace the (invalid) block with it's nodes - parent.nodes.splice(index, 1, ...block.nodes); - } - } while (stack.length > 0); - - push({ type: 'eos' }); - return ast; -}; - -module.exports = parse; - - -/***/ }), -/* 613 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -module.exports = { - MAX_LENGTH: 1024 * 64, - - // Digits - CHAR_0: '0', /* 0 */ - CHAR_9: '9', /* 9 */ - - // Alphabet chars. - CHAR_UPPERCASE_A: 'A', /* A */ - CHAR_LOWERCASE_A: 'a', /* a */ - CHAR_UPPERCASE_Z: 'Z', /* Z */ - CHAR_LOWERCASE_Z: 'z', /* z */ - - CHAR_LEFT_PARENTHESES: '(', /* ( */ - CHAR_RIGHT_PARENTHESES: ')', /* ) */ - - CHAR_ASTERISK: '*', /* * */ - - // Non-alphabetic chars. - CHAR_AMPERSAND: '&', /* & */ - CHAR_AT: '@', /* @ */ - CHAR_BACKSLASH: '\\', /* \ */ - CHAR_BACKTICK: '`', /* ` */ - CHAR_CARRIAGE_RETURN: '\r', /* \r */ - CHAR_CIRCUMFLEX_ACCENT: '^', /* ^ */ - CHAR_COLON: ':', /* : */ - CHAR_COMMA: ',', /* , */ - CHAR_DOLLAR: '$', /* . */ - CHAR_DOT: '.', /* . */ - CHAR_DOUBLE_QUOTE: '"', /* " */ - CHAR_EQUAL: '=', /* = */ - CHAR_EXCLAMATION_MARK: '!', /* ! */ - CHAR_FORM_FEED: '\f', /* \f */ - CHAR_FORWARD_SLASH: '/', /* / */ - CHAR_HASH: '#', /* # */ - CHAR_HYPHEN_MINUS: '-', /* - */ - CHAR_LEFT_ANGLE_BRACKET: '<', /* < */ - CHAR_LEFT_CURLY_BRACE: '{', /* { */ - CHAR_LEFT_SQUARE_BRACKET: '[', /* [ */ - CHAR_LINE_FEED: '\n', /* \n */ - CHAR_NO_BREAK_SPACE: '\u00A0', /* \u00A0 */ - CHAR_PERCENT: '%', /* % */ - CHAR_PLUS: '+', /* + */ - CHAR_QUESTION_MARK: '?', /* ? */ - CHAR_RIGHT_ANGLE_BRACKET: '>', /* > */ - CHAR_RIGHT_CURLY_BRACE: '}', /* } */ - CHAR_RIGHT_SQUARE_BRACKET: ']', /* ] */ - CHAR_SEMICOLON: ';', /* ; */ - CHAR_SINGLE_QUOTE: '\'', /* ' */ - CHAR_SPACE: ' ', /* */ - CHAR_TAB: '\t', /* \t */ - CHAR_UNDERSCORE: '_', /* _ */ - CHAR_VERTICAL_LINE: '|', /* | */ - CHAR_ZERO_WIDTH_NOBREAK_SPACE: '\uFEFF' /* \uFEFF */ + return true; }; - -/***/ }), -/* 614 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -module.exports = __webpack_require__(615); - - -/***/ }), -/* 615 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -const path = __webpack_require__(16); -const scan = __webpack_require__(616); -const parse = __webpack_require__(619); -const utils = __webpack_require__(617); - /** - * Creates a matcher function from one or more glob patterns. The - * returned function takes a string to match as its first argument, - * and returns true if the string is a match. The returned matcher - * function also takes a boolean as the second argument that, when true, - * returns an object with additional information. + * Returns true if **all** of the given `patterns` match + * the specified string. * * ```js - * const picomatch = require('picomatch'); - * // picomatch(glob[, options]); + * const mm = require('micromatch'); + * // mm.all(string, patterns[, options]); * - * const isMatch = picomatch('*.!(*a)'); - * console.log(isMatch('a.a')); //=> false - * console.log(isMatch('a.b')); //=> true + * console.log(mm.all('foo.js', ['foo.js'])); + * // true + * + * console.log(mm.all('foo.js', ['*.js', '!foo.js'])); + * // false + * + * console.log(mm.all('foo.js', ['*.js', 'foo.js'])); + * // true + * + * console.log(mm.all('foo.js', ['*.js', 'f*', '*o*', '*o.js'])); + * // true * ``` - * @name picomatch - * @param {String|Array} `globs` One or more glob patterns. - * @param {Object=} `options` - * @return {Function=} Returns a matcher function. + * @param {String|Array} `str` The string to test. + * @param {String|Array} `patterns` One or more glob patterns to use for matching. + * @param {Object} `options` See available [options](#options) for changing how matches are performed + * @return {Boolean} Returns true if any patterns match `str` * @api public */ -const picomatch = (glob, options, returnState = false) => { - if (Array.isArray(glob)) { - let fns = glob.map(input => picomatch(input, options, returnState)); - return str => { - for (let isMatch of fns) { - let state = isMatch(str); - if (state) return state; - } - return false; - }; - } - - if (typeof glob !== 'string' || glob === '') { - throw new TypeError('Expected pattern to be a non-empty string'); - } - - let opts = options || {}; - let posix = utils.isWindows(options); - let regex = picomatch.makeRe(glob, options, false, true); - let state = regex.state; - delete regex.state; - - let isIgnored = () => false; - if (opts.ignore) { - let ignoreOpts = { ...options, ignore: null, onMatch: null, onResult: null }; - isIgnored = picomatch(opts.ignore, ignoreOpts, returnState); - } - - const matcher = (input, returnObject = false) => { - let { isMatch, match, output } = picomatch.test(input, regex, options, { glob, posix }); - let result = { glob, state, regex, posix, input, output, match, isMatch }; - - if (typeof opts.onResult === 'function') { - opts.onResult(result); - } - - if (isMatch === false) { - result.isMatch = false; - return returnObject ? result : false; - } - - if (isIgnored(input)) { - if (typeof opts.onIgnore === 'function') { - opts.onIgnore(result); - } - result.isMatch = false; - return returnObject ? result : false; - } - - if (typeof opts.onMatch === 'function') { - opts.onMatch(result); - } - return returnObject ? result : true; - }; - - if (returnState) { - matcher.state = state; +micromatch.all = (str, patterns, options) => { + if (typeof str !== 'string') { + throw new TypeError(`Expected a string: "${util.inspect(str)}"`); } - return matcher; + return [].concat(patterns).every(p => picomatch(p, options)(str)); }; /** - * Test `input` with the given `regex`. This is used by the main - * `picomatch()` function to test the input string. + * Returns an array of matches captured by `pattern` in `string, or `null` if the pattern did not match. * * ```js - * const picomatch = require('picomatch'); - * // picomatch.test(input, regex[, options]); + * const mm = require('micromatch'); + * // mm.capture(pattern, string[, options]); * - * console.log(picomatch.test('foo/bar', /^(?:([^/]*?)\/([^/]*?))$/)); - * // { isMatch: true, match: [ 'foo/', 'foo', 'bar' ], output: 'foo/bar' } + * console.log(mm.capture('test/*.js', 'test/foo.js')); + * //=> ['foo'] + * console.log(mm.capture('test/*.js', 'foo/bar.css')); + * //=> null * ``` - * @param {String} `input` String to test. - * @param {RegExp} `regex` - * @return {Object} Returns an object with matching info. + * @param {String} `glob` Glob pattern to use for matching. + * @param {String} `input` String to match + * @param {Object} `options` See available [options](#options) for changing how matches are performed + * @return {Boolean} Returns an array of captures if the input matches the glob pattern, otherwise `null`. * @api public */ -picomatch.test = (input, regex, options, { glob, posix } = {}) => { - if (typeof input !== 'string') { - throw new TypeError('Expected input to be a string'); - } - - if (input === '') { - return { isMatch: false, output: '' }; - } - - let opts = options || {}; - let format = opts.format || (posix ? utils.toPosixSlashes : null); - let match = input === glob; - let output = (match && format) ? format(input) : input; - - if (match === false) { - output = format ? format(input) : input; - match = output === glob; - } +micromatch.capture = (glob, input, options) => { + let posix = utils.isWindows(options); + let regex = picomatch.makeRe(String(glob), { ...options, capture: true }); + let match = regex.exec(posix ? utils.toPosixSlashes(input) : input); - if (match === false || opts.capture === true) { - if (opts.matchBase === true || opts.basename === true) { - match = picomatch.matchBase(input, regex, options, posix); - } else { - match = regex.exec(output); - } + if (match) { + return match.slice(1).map(v => v === void 0 ? '' : v); } - - return { isMatch: !!match, match, output }; }; /** - * Match the basename of a filepath. + * Create a regular expression from the given glob `pattern`. * * ```js - * const picomatch = require('picomatch'); - * // picomatch.matchBase(input, glob[, options]); - * console.log(picomatch.matchBase('foo/bar.js', '*.js'); // true + * const mm = require('micromatch'); + * // mm.makeRe(pattern[, options]); + * + * console.log(mm.makeRe('*.js')); + * //=> /^(?:(\.[\\\/])?(?!\.)(?=.)[^\/]*?\.js)$/ * ``` - * @param {String} `input` String to test. - * @param {RegExp|String} `glob` Glob pattern or regex created by [.makeRe](#makeRe). - * @return {Boolean} + * @param {String} `pattern` A glob pattern to convert to regex. + * @param {Object} `options` + * @return {RegExp} Returns a regex created from the given pattern. * @api public */ -picomatch.matchBase = (input, glob, options, posix = utils.isWindows(options)) => { - let regex = glob instanceof RegExp ? glob : picomatch.makeRe(glob, options); - return regex.test(path.basename(input)); -}; +micromatch.makeRe = (...args) => picomatch.makeRe(...args); /** - * Returns true if **any** of the given glob `patterns` match the specified `string`. + * Scan a glob pattern to separate the pattern into segments. Used + * by the [split](#split) method. * * ```js - * const picomatch = require('picomatch'); - * // picomatch.isMatch(string, patterns[, options]); - * - * console.log(picomatch.isMatch('a.a', ['b.*', '*.a'])); //=> true - * console.log(picomatch.isMatch('a.a', 'b.*')); //=> false + * const mm = require('micromatch'); + * const state = mm.scan(pattern[, options]); * ``` - * @param {String|Array} str The string to test. - * @param {String|Array} patterns One or more glob patterns to use for matching. - * @param {Object} [options] See available [options](#options). - * @return {Boolean} Returns true if any patterns match `str` + * @param {String} `pattern` + * @param {Object} `options` + * @return {Object} Returns an object with * @api public */ -picomatch.isMatch = (str, patterns, options) => picomatch(patterns, options)(str); +micromatch.scan = (...args) => picomatch.scan(...args); /** * Parse a glob pattern to create the source string for a regular * expression. * * ```js - * const picomatch = require('picomatch'); - * const result = picomatch.parse(glob[, options]); + * const mm = require('micromatch'); + * const state = mm(pattern[, options]); * ``` * @param {String} `glob` * @param {Object} `options` - * @return {Object} Returns an object with useful properties and output to be used as a regex source string. + * @return {Object} Returns an object with useful properties and output to be used as regex source string. * @api public */ -picomatch.parse = (glob, options) => parse(glob, options); +micromatch.parse = (patterns, options) => { + let res = []; + for (let pattern of [].concat(patterns || [])) { + for (let str of braces(String(pattern), options)) { + res.push(picomatch.parse(str, options)); + } + } + return res; +}; /** - * Scan a glob pattern to separate the pattern into segments. + * Process the given brace `pattern`. * * ```js - * const picomatch = require('picomatch'); - * // picomatch.scan(input[, options]); + * const { braces } = require('micromatch'); + * console.log(braces('foo/{a,b,c}/bar')); + * //=> [ 'foo/(a|b|c)/bar' ] * - * const result = picomatch.scan('!./foo/*.js'); - * console.log(result); - * // { prefix: '!./', - * // input: '!./foo/*.js', - * // base: 'foo', - * // glob: '*.js', - * // negated: true, - * // isGlob: true } + * console.log(braces('foo/{a,b,c}/bar', { expand: true })); + * //=> [ 'foo/a/bar', 'foo/b/bar', 'foo/c/bar' ] * ``` - * @param {String} `input` Glob pattern to scan. - * @param {Object} `options` - * @return {Object} Returns an object with + * @param {String} `pattern` String with brace pattern to process. + * @param {Object} `options` Any [options](#options) to change how expansion is performed. See the [braces][] library for all available options. + * @return {Array} * @api public */ -picomatch.scan = (input, options) => scan(input, options); +micromatch.braces = (pattern, options) => { + if (typeof pattern !== 'string') throw new TypeError('Expected a string'); + if ((options && options.nobrace === true) || !/\{.*\}/.test(pattern)) { + return [pattern]; + } + return braces(pattern, options); +}; /** - * Create a regular expression from a glob pattern. - * - * ```js - * const picomatch = require('picomatch'); - * // picomatch.makeRe(input[, options]); - * - * console.log(picomatch.makeRe('*.js')); - * //=> /^(?:(?!\.)(?=.)[^/]*?\.js)$/ - * ``` - * @param {String} `input` A glob pattern to convert to regex. - * @param {Object} `options` - * @return {RegExp} Returns a regex created from the given pattern. - * @api public + * Expand braces */ -picomatch.makeRe = (input, options, returnOutput = false, returnState = false) => { - if (!input || typeof input !== 'string') { - throw new TypeError('Expected a non-empty string'); - } +micromatch.braceExpand = (pattern, options) => { + if (typeof pattern !== 'string') throw new TypeError('Expected a string'); + return micromatch.braces(pattern, { ...options, expand: true }); +}; - let opts = options || {}; - let prepend = opts.contains ? '' : '^'; - let append = opts.contains ? '' : '$'; - let state = { negated: false, fastpaths: true }; - let prefix = ''; - let output; +/** + * Expose micromatch + */ - if (input.startsWith('./')) { - input = input.slice(2); - prefix = state.prefix = './'; - } +module.exports = micromatch; - if (opts.fastpaths !== false && (input[0] === '.' || input[0] === '*')) { - output = parse.fastpaths(input, options); - } - if (output === void 0) { - state = picomatch.parse(input, options); - state.prefix = prefix + (state.prefix || ''); - output = state.output; - } +/***/ }), +/* 609 */ +/***/ (function(module, exports, __webpack_require__) { - if (returnOutput === true) { - return output; - } +"use strict"; - let source = `${prepend}(?:${output})${append}`; - if (state && state.negated === true) { - source = `^(?!${source}).*$`; - } - let regex = picomatch.toRegex(source, options); - if (returnState === true) { - regex.state = state; +const stringify = __webpack_require__(610); +const compile = __webpack_require__(612); +const expand = __webpack_require__(616); +const parse = __webpack_require__(617); + +/** + * Expand the given pattern or create a regex-compatible string. + * + * ```js + * const braces = require('braces'); + * console.log(braces('{a,b,c}', { compile: true })); //=> ['(a|b|c)'] + * console.log(braces('{a,b,c}')); //=> ['a', 'b', 'c'] + * ``` + * @param {String} `str` + * @param {Object} `options` + * @return {String} + * @api public + */ + +const braces = (input, options = {}) => { + let output = []; + + if (Array.isArray(input)) { + for (let pattern of input) { + let result = braces.create(pattern, options); + if (Array.isArray(result)) { + output.push(...result); + } else { + output.push(result); + } + } + } else { + output = [].concat(braces.create(input, options)); } - return regex; + if (options && options.expand === true && options.nodupes === true) { + output = [...new Set(output)]; + } + return output; }; /** - * Create a regular expression from the given regex source string. + * Parse the given `str` with the given `options`. * * ```js - * const picomatch = require('picomatch'); - * // picomatch.toRegex(source[, options]); + * // braces.parse(pattern, [, options]); + * const ast = braces.parse('a/{b,c}/d'); + * console.log(ast); + * ``` + * @param {String} pattern Brace pattern to parse + * @param {Object} options + * @return {Object} Returns an AST + * @api public + */ + +braces.parse = (input, options = {}) => parse(input, options); + +/** + * Creates a braces string from an AST, or an AST node. * - * const { output } = picomatch.parse('*.js'); - * console.log(picomatch.toRegex(output)); - * //=> /^(?:(?!\.)(?=.)[^/]*?\.js)$/ + * ```js + * const braces = require('braces'); + * let ast = braces.parse('foo/{a,b}/bar'); + * console.log(stringify(ast.nodes[2])); //=> '{a,b}' * ``` - * @param {String} `source` Regular expression source string. + * @param {String} `input` Brace pattern or AST. * @param {Object} `options` - * @return {RegExp} + * @return {Array} Returns an array of expanded values. * @api public */ -picomatch.toRegex = (source, options) => { - try { - let opts = options || {}; - return new RegExp(source, opts.flags || (opts.nocase ? 'i' : '')); - } catch (err) { - if (options && options.debug === true) throw err; - return /$^/; +braces.stringify = (input, options = {}) => { + if (typeof input === 'string') { + return stringify(braces.parse(input, options), options); } + return stringify(input, options); }; /** - * Picomatch constants. - * @return {Object} + * Compiles a brace pattern into a regex-compatible, optimized string. + * This method is called by the main [braces](#braces) function by default. + * + * ```js + * const braces = require('braces'); + * console.log(braces.compile('a/{b,c}/d')); + * //=> ['a/(b|c)/d'] + * ``` + * @param {String} `input` Brace pattern or AST. + * @param {Object} `options` + * @return {Array} Returns an array of expanded values. + * @api public */ -picomatch.constants = __webpack_require__(618); +braces.compile = (input, options = {}) => { + if (typeof input === 'string') { + input = braces.parse(input, options); + } + return compile(input, options); +}; /** - * Expose "picomatch" + * Expands a brace pattern into an array. This method is called by the + * main [braces](#braces) function when `options.expand` is true. Before + * using this method it's recommended that you read the [performance notes](#performance)) + * and advantages of using [.compile](#compile) instead. + * + * ```js + * const braces = require('braces'); + * console.log(braces.expand('a/{b,c}/d')); + * //=> ['a/b/d', 'a/c/d']; + * ``` + * @param {String} `pattern` Brace pattern + * @param {Object} `options` + * @return {Array} Returns an array of expanded values. + * @api public */ -module.exports = picomatch; - - -/***/ }), -/* 616 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; +braces.expand = (input, options = {}) => { + if (typeof input === 'string') { + input = braces.parse(input, options); + } + let result = expand(input, options); -const utils = __webpack_require__(617); + // filter out empty strings if specified + if (options.noempty === true) { + result = result.filter(Boolean); + } -const { - CHAR_ASTERISK, /* * */ - CHAR_AT, /* @ */ - CHAR_BACKWARD_SLASH, /* \ */ - CHAR_COMMA, /* , */ - CHAR_DOT, /* . */ - CHAR_EXCLAMATION_MARK, /* ! */ - CHAR_FORWARD_SLASH, /* / */ - CHAR_LEFT_CURLY_BRACE, /* { */ - CHAR_LEFT_PARENTHESES, /* ( */ - CHAR_LEFT_SQUARE_BRACKET, /* [ */ - CHAR_PLUS, /* + */ - CHAR_QUESTION_MARK, /* ? */ - CHAR_RIGHT_CURLY_BRACE, /* } */ - CHAR_RIGHT_PARENTHESES, /* ) */ - CHAR_RIGHT_SQUARE_BRACKET /* ] */ -} = __webpack_require__(618); + // filter out duplicates if specified + if (options.nodupes === true) { + result = [...new Set(result)]; + } -const isPathSeparator = code => { - return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH; + return result; }; /** - * Quickly scans a glob pattern and returns an object with a handful of - * useful properties, like `isGlob`, `path` (the leading non-glob, if it exists), - * `glob` (the actual pattern), and `negated` (true if the path starts with `!`). + * Processes a brace pattern and returns either an expanded array + * (if `options.expand` is true), a highly optimized regex-compatible string. + * This method is called by the main [braces](#braces) function. * * ```js - * const pm = require('picomatch'); - * console.log(pm.scan('foo/bar/*.js')); - * { isGlob: true, input: 'foo/bar/*.js', base: 'foo/bar', glob: '*.js' } + * const braces = require('braces'); + * console.log(braces.create('user-{200..300}/project-{a,b,c}-{1..10}')) + * //=> 'user-(20[0-9]|2[1-9][0-9]|300)/project-(a|b|c)-([1-9]|10)' * ``` - * @param {String} `str` + * @param {String} `pattern` Brace pattern * @param {Object} `options` - * @return {Object} Returns an object with tokens and regex source string. + * @return {Array} Returns an array of expanded values. * @api public */ -module.exports = (input, options) => { - let opts = options || {}; - let length = input.length - 1; - let index = -1; - let start = 0; - let lastIndex = 0; - let isGlob = false; - let backslashes = false; - let negated = false; - let braces = 0; - let prev; - let code; - - let braceEscaped = false; - - let eos = () => index >= length; - let advance = () => { - prev = code; - return input.charCodeAt(++index); - }; +braces.create = (input, options = {}) => { + if (input === '' || input.length < 3) { + return [input]; + } - while (index < length) { - code = advance(); - let next; + return options.expand !== true + ? braces.compile(input, options) + : braces.expand(input, options); +}; - if (code === CHAR_BACKWARD_SLASH) { - backslashes = true; - next = advance(); +/** + * Expose "braces" + */ - if (next === CHAR_LEFT_CURLY_BRACE) { - braceEscaped = true; - } - continue; - } +module.exports = braces; - if (braceEscaped === true || code === CHAR_LEFT_CURLY_BRACE) { - braces++; - while (!eos() && (next = advance())) { - if (next === CHAR_BACKWARD_SLASH) { - backslashes = true; - next = advance(); - continue; - } +/***/ }), +/* 610 */ +/***/ (function(module, exports, __webpack_require__) { - if (next === CHAR_LEFT_CURLY_BRACE) { - braces++; - continue; - } +"use strict"; - if (!braceEscaped && next === CHAR_DOT && (next = advance()) === CHAR_DOT) { - isGlob = true; - break; - } - if (!braceEscaped && next === CHAR_COMMA) { - isGlob = true; - break; - } +const utils = __webpack_require__(611); - if (next === CHAR_RIGHT_CURLY_BRACE) { - braces--; - if (braces === 0) { - braceEscaped = false; - break; - } - } - } - } +module.exports = (ast, options = {}) => { + let stringify = (node, parent = {}) => { + let invalidBlock = options.escapeInvalid && utils.isInvalidBrace(parent); + let invalidNode = node.invalid === true && options.escapeInvalid === true; + let output = ''; - if (code === CHAR_FORWARD_SLASH) { - if (prev === CHAR_DOT && index === (start + 1)) { - start += 2; - continue; + if (node.value) { + if ((invalidBlock || invalidNode) && utils.isOpenOrClose(node)) { + return '\\' + node.value; } - - lastIndex = index + 1; - continue; - } - - if (code === CHAR_ASTERISK) { - isGlob = true; - break; + return node.value; } - if (code === CHAR_ASTERISK || code === CHAR_QUESTION_MARK) { - isGlob = true; - break; + if (node.value) { + return node.value; } - if (code === CHAR_LEFT_SQUARE_BRACKET) { - while (!eos() && (next = advance())) { - if (next === CHAR_BACKWARD_SLASH) { - backslashes = true; - next = advance(); - continue; - } - - if (next === CHAR_RIGHT_SQUARE_BRACKET) { - isGlob = true; - break; - } + if (node.nodes) { + for (let child of node.nodes) { + output += stringify(child); } } + return output; + }; - let isExtglobChar = code === CHAR_PLUS - || code === CHAR_AT - || code === CHAR_EXCLAMATION_MARK; - - if (isExtglobChar && input.charCodeAt(index + 1) === CHAR_LEFT_PARENTHESES) { - isGlob = true; - break; - } + return stringify(ast); +}; - if (code === CHAR_EXCLAMATION_MARK && index === start) { - negated = true; - start++; - continue; - } - if (code === CHAR_LEFT_PARENTHESES) { - while (!eos() && (next = advance())) { - if (next === CHAR_BACKWARD_SLASH) { - backslashes = true; - next = advance(); - continue; - } - if (next === CHAR_RIGHT_PARENTHESES) { - isGlob = true; - break; - } - } - } +/***/ }), +/* 611 */ +/***/ (function(module, exports, __webpack_require__) { - if (isGlob) { - break; - } - } +"use strict"; - let prefix = ''; - let orig = input; - let base = input; - let glob = ''; - if (start > 0) { - prefix = input.slice(0, start); - input = input.slice(start); - lastIndex -= start; +exports.isInteger = num => { + if (typeof num === 'number') { + return Number.isInteger(num); } - - if (base && isGlob === true && lastIndex > 0) { - base = input.slice(0, lastIndex); - glob = input.slice(lastIndex); - } else if (isGlob === true) { - base = ''; - glob = input; - } else { - base = input; + if (typeof num === 'string' && num.trim() !== '') { + return Number.isInteger(Number(num)); } + return false; +}; - if (base && base !== '' && base !== '/' && base !== input) { - if (isPathSeparator(base.charCodeAt(base.length - 1))) { - base = base.slice(0, -1); - } - } +/** + * Find a node of the given type + */ - if (opts.unescape === true) { - if (glob) glob = utils.removeBackslashes(glob); +exports.find = (node, type) => node.nodes.find(node => node.type === type); - if (base && backslashes === true) { - base = utils.removeBackslashes(base); - } - } +/** + * Find a node of the given type + */ - return { prefix, input: orig, base, glob, negated, isGlob }; +exports.exceedsLimit = (min, max, step = 1, limit) => { + if (limit === false) return false; + if (!exports.isInteger(min) || !exports.isInteger(max)) return false; + return ((Number(max) - Number(min)) / Number(step)) >= limit; }; +/** + * Escape the given node with '\\' before node.value + */ -/***/ }), -/* 617 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -const path = __webpack_require__(16); -const win32 = process.platform === 'win32'; -const { - REGEX_SPECIAL_CHARS, - REGEX_SPECIAL_CHARS_GLOBAL, - REGEX_REMOVE_BACKSLASH -} = __webpack_require__(618); +exports.escapeNode = (block, n = 0, type) => { + let node = block.nodes[n]; + if (!node) return; -exports.isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val); -exports.hasRegexChars = str => REGEX_SPECIAL_CHARS.test(str); -exports.isRegexChar = str => str.length === 1 && exports.hasRegexChars(str); -exports.escapeRegex = str => str.replace(REGEX_SPECIAL_CHARS_GLOBAL, '\\$1'); -exports.toPosixSlashes = str => str.replace(/\\/g, '/'); + if ((type && node.type === type) || node.type === 'open' || node.type === 'close') { + if (node.escaped !== true) { + node.value = '\\' + node.value; + node.escaped = true; + } + } +}; -exports.removeBackslashes = str => { - return str.replace(REGEX_REMOVE_BACKSLASH, match => { - return match === '\\' ? '' : match; - }); -} +/** + * Returns true if the given brace node should be enclosed in literal braces + */ -exports.supportsLookbehinds = () => { - let segs = process.version.slice(1).split('.'); - if (segs.length === 3 && +segs[0] >= 9 || (+segs[0] === 8 && +segs[1] >= 10)) { +exports.encloseBrace = node => { + if (node.type !== 'brace') return false; + if ((node.commas >> 0 + node.ranges >> 0) === 0) { + node.invalid = true; return true; } return false; }; -exports.isWindows = options => { - if (options && typeof options.windows === 'boolean') { - return options.windows; +/** + * Returns true if a brace node is invalid. + */ + +exports.isInvalidBrace = block => { + if (block.type !== 'brace') return false; + if (block.invalid === true || block.dollar) return true; + if ((block.commas >> 0 + block.ranges >> 0) === 0) { + block.invalid = true; + return true; } - return win32 === true || path.sep === '\\'; + if (block.open !== true || block.close !== true) { + block.invalid = true; + return true; + } + return false; }; -exports.escapeLast = (input, char, lastIdx) => { - let idx = input.lastIndexOf(char, lastIdx); - if (idx === -1) return input; - if (input[idx - 1] === '\\') return exports.escapeLast(input, char, idx - 1); - return input.slice(0, idx) + '\\' + input.slice(idx); -}; - - -/***/ }), -/* 618 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -const path = __webpack_require__(16); -const WIN_SLASH = '\\\\/'; -const WIN_NO_SLASH = `[^${WIN_SLASH}]`; - /** - * Posix glob regex + * Returns true if a node is an open or close node */ -const DOT_LITERAL = '\\.'; -const PLUS_LITERAL = '\\+'; -const QMARK_LITERAL = '\\?'; -const SLASH_LITERAL = '\\/'; -const ONE_CHAR = '(?=.)'; -const QMARK = '[^/]'; -const END_ANCHOR = `(?:${SLASH_LITERAL}|$)`; -const START_ANCHOR = `(?:^|${SLASH_LITERAL})`; -const DOTS_SLASH = `${DOT_LITERAL}{1,2}${END_ANCHOR}`; -const NO_DOT = `(?!${DOT_LITERAL})`; -const NO_DOTS = `(?!${START_ANCHOR}${DOTS_SLASH})`; -const NO_DOT_SLASH = `(?!${DOT_LITERAL}{0,1}${END_ANCHOR})`; -const NO_DOTS_SLASH = `(?!${DOTS_SLASH})`; -const QMARK_NO_DOT = `[^.${SLASH_LITERAL}]`; -const STAR = `${QMARK}*?`; - -const POSIX_CHARS = { - DOT_LITERAL, - PLUS_LITERAL, - QMARK_LITERAL, - SLASH_LITERAL, - ONE_CHAR, - QMARK, - END_ANCHOR, - DOTS_SLASH, - NO_DOT, - NO_DOTS, - NO_DOT_SLASH, - NO_DOTS_SLASH, - QMARK_NO_DOT, - STAR, - START_ANCHOR +exports.isOpenOrClose = node => { + if (node.type === 'open' || node.type === 'close') { + return true; + } + return node.open === true || node.close === true; }; /** - * Windows glob regex + * Reduce an array of text nodes. */ -const WINDOWS_CHARS = { - ...POSIX_CHARS, - - SLASH_LITERAL: `[${WIN_SLASH}]`, - QMARK: WIN_NO_SLASH, - STAR: `${WIN_NO_SLASH}*?`, - DOTS_SLASH: `${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$)`, - NO_DOT: `(?!${DOT_LITERAL})`, - NO_DOTS: `(?!(?:^|[${WIN_SLASH}])${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`, - NO_DOT_SLASH: `(?!${DOT_LITERAL}{0,1}(?:[${WIN_SLASH}]|$))`, - NO_DOTS_SLASH: `(?!${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`, - QMARK_NO_DOT: `[^.${WIN_SLASH}]`, - START_ANCHOR: `(?:^|[${WIN_SLASH}])`, - END_ANCHOR: `(?:[${WIN_SLASH}]|$)` -}; +exports.reduce = nodes => nodes.reduce((acc, node) => { + if (node.type === 'text') acc.push(node.value); + if (node.type === 'range') node.type = 'text'; + return acc; +}, []); /** - * POSIX Bracket Regex + * Flatten an array */ -const POSIX_REGEX_SOURCE = { - alnum: 'a-zA-Z0-9', - alpha: 'a-zA-Z', - ascii: '\\x00-\\x7F', - blank: ' \\t', - cntrl: '\\x00-\\x1F\\x7F', - digit: '0-9', - graph: '\\x21-\\x7E', - lower: 'a-z', - print: '\\x20-\\x7E ', - punct: '\\-!"#$%&\'()\\*+,./:;<=>?@[\\]^_`{|}~', - space: ' \\t\\r\\n\\v\\f', - upper: 'A-Z', - word: 'A-Za-z0-9_', - xdigit: 'A-Fa-f0-9' +exports.flatten = (...args) => { + const result = []; + const flat = arr => { + for (let i = 0; i < arr.length; i++) { + let ele = arr[i]; + Array.isArray(ele) ? flat(ele, result) : ele !== void 0 && result.push(ele); + } + return result; + }; + flat(args); + return result; }; -module.exports = { - MAX_LENGTH: 1024 * 64, - POSIX_REGEX_SOURCE, - // regular expressions - REGEX_BACKSLASH: /\\(?![*+?^${}(|)[\]])/g, - REGEX_NON_SPECIAL_CHAR: /^[^@![\].,$*+?^{}()|\\/]+/, - REGEX_SPECIAL_CHARS: /[-*+?.^${}(|)[\]]/, - REGEX_SPECIAL_CHARS_BACKREF: /(\\?)((\W)(\3*))/g, - REGEX_SPECIAL_CHARS_GLOBAL: /([-*+?.^${}(|)[\]])/g, - REGEX_REMOVE_BACKSLASH: /(?:\[.*?[^\\]\]|\\(?=.))/g, +/***/ }), +/* 612 */ +/***/ (function(module, exports, __webpack_require__) { - // Replace globs with equivalent patterns to reduce parsing time. - REPLACEMENTS: { - '***': '*', - '**/**': '**', - '**/**/**': '**' - }, +"use strict"; - // Digits - CHAR_0: 48, /* 0 */ - CHAR_9: 57, /* 9 */ - // Alphabet chars. - CHAR_UPPERCASE_A: 65, /* A */ - CHAR_LOWERCASE_A: 97, /* a */ - CHAR_UPPERCASE_Z: 90, /* Z */ - CHAR_LOWERCASE_Z: 122, /* z */ +const fill = __webpack_require__(613); +const utils = __webpack_require__(611); - CHAR_LEFT_PARENTHESES: 40, /* ( */ - CHAR_RIGHT_PARENTHESES: 41, /* ) */ +const compile = (ast, options = {}) => { + let walk = (node, parent = {}) => { + let invalidBlock = utils.isInvalidBrace(parent); + let invalidNode = node.invalid === true && options.escapeInvalid === true; + let invalid = invalidBlock === true || invalidNode === true; + let prefix = options.escapeInvalid === true ? '\\' : ''; + let output = ''; - CHAR_ASTERISK: 42, /* * */ + if (node.isOpen === true) { + return prefix + node.value; + } + if (node.isClose === true) { + return prefix + node.value; + } - // Non-alphabetic chars. - CHAR_AMPERSAND: 38, /* & */ - CHAR_AT: 64, /* @ */ - CHAR_BACKWARD_SLASH: 92, /* \ */ - CHAR_CARRIAGE_RETURN: 13, /* \r */ - CHAR_CIRCUMFLEX_ACCENT: 94, /* ^ */ - CHAR_COLON: 58, /* : */ - CHAR_COMMA: 44, /* , */ - CHAR_DOT: 46, /* . */ - CHAR_DOUBLE_QUOTE: 34, /* " */ - CHAR_EQUAL: 61, /* = */ - CHAR_EXCLAMATION_MARK: 33, /* ! */ - CHAR_FORM_FEED: 12, /* \f */ - CHAR_FORWARD_SLASH: 47, /* / */ - CHAR_GRAVE_ACCENT: 96, /* ` */ - CHAR_HASH: 35, /* # */ - CHAR_HYPHEN_MINUS: 45, /* - */ - CHAR_LEFT_ANGLE_BRACKET: 60, /* < */ - CHAR_LEFT_CURLY_BRACE: 123, /* { */ - CHAR_LEFT_SQUARE_BRACKET: 91, /* [ */ - CHAR_LINE_FEED: 10, /* \n */ - CHAR_NO_BREAK_SPACE: 160, /* \u00A0 */ - CHAR_PERCENT: 37, /* % */ - CHAR_PLUS: 43, /* + */ - CHAR_QUESTION_MARK: 63, /* ? */ - CHAR_RIGHT_ANGLE_BRACKET: 62, /* > */ - CHAR_RIGHT_CURLY_BRACE: 125, /* } */ - CHAR_RIGHT_SQUARE_BRACKET: 93, /* ] */ - CHAR_SEMICOLON: 59, /* ; */ - CHAR_SINGLE_QUOTE: 39, /* ' */ - CHAR_SPACE: 32, /* */ - CHAR_TAB: 9, /* \t */ - CHAR_UNDERSCORE: 95, /* _ */ - CHAR_VERTICAL_LINE: 124, /* | */ - CHAR_ZERO_WIDTH_NOBREAK_SPACE: 65279, /* \uFEFF */ + if (node.type === 'open') { + return invalid ? (prefix + node.value) : '('; + } - SEP: path.sep, + if (node.type === 'close') { + return invalid ? (prefix + node.value) : ')'; + } - /** - * Create EXTGLOB_CHARS - */ + if (node.type === 'comma') { + return node.prev.type === 'comma' ? '' : (invalid ? node.value : '|'); + } - extglobChars(chars) { - return { - '!': { type: 'negate', open: '(?:(?!(?:', close: `))${chars.STAR})` }, - '?': { type: 'qmark', open: '(?:', close: ')?' }, - '+': { type: 'plus', open: '(?:', close: ')+' }, - '*': { type: 'star', open: '(?:', close: ')*' }, - '@': { type: 'at', open: '(?:', close: ')' } - }; - }, + if (node.value) { + return node.value; + } - /** - * Create GLOB_CHARS - */ + if (node.nodes && node.ranges > 0) { + let args = utils.reduce(node.nodes); + let range = fill(...args, { ...options, wrap: false, toRegex: true }); - globChars(win32) { - return win32 === true ? WINDOWS_CHARS : POSIX_CHARS; - } + if (range.length !== 0) { + return args.length > 1 && range.length > 1 ? `(${range})` : range; + } + } + + if (node.nodes) { + for (let child of node.nodes) { + output += walk(child, node); + } + } + return output; + }; + + return walk(ast); }; +module.exports = compile; + /***/ }), -/* 619 */ +/* 613 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - - -const utils = __webpack_require__(617); -const constants = __webpack_require__(618); - -/** - * Constants +/*! + * fill-range + * + * Copyright (c) 2014-present, Jon Schlinkert. + * Licensed under the MIT License. */ -const { - MAX_LENGTH, - POSIX_REGEX_SOURCE, - REGEX_NON_SPECIAL_CHAR, - REGEX_SPECIAL_CHARS_BACKREF, - REPLACEMENTS -} = constants; -/** - * Helpers - */ -const expandRange = (args, options) => { - if (typeof options.expandRange === 'function') { - return options.expandRange(...args, options); - } +const util = __webpack_require__(29); +const toRegexRange = __webpack_require__(614); - args.sort(); - let value = `[${args.join('-')}]`; +const isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val); - try { - /* eslint-disable no-new */ - new RegExp(value); - } catch (ex) { - return args.map(v => utils.escapeRegex(v)).join('..'); - } +const transform = toNumber => { + return value => toNumber === true ? Number(value) : String(value); +}; - return value; +const isValidValue = value => { + return typeof value === 'number' || (typeof value === 'string' && value !== ''); }; -const negate = state => { - let count = 1; +const isNumber = num => Number.isInteger(+num); - while (state.peek() === '!' && (state.peek(2) !== '(' || state.peek(3) === '?')) { - state.advance(); - state.start++; - count++; +const zeros = input => { + let value = `${input}`; + let index = -1; + if (value[0] === '-') value = value.slice(1); + if (value === '0') return false; + while (value[++index] === '0'); + return index > 0; +}; + +const stringify = (start, end, options) => { + if (typeof start === 'string' || typeof end === 'string') { + return true; } + return options.stringify === true; +}; - if (count % 2 === 0) { - return false; +const pad = (input, maxLength, toNumber) => { + if (maxLength > 0) { + let dash = input[0] === '-' ? '-' : ''; + if (dash) input = input.slice(1); + input = (dash + input.padStart(dash ? maxLength - 1 : maxLength, '0')); + } + if (toNumber === false) { + return String(input); } + return input; +}; - state.negated = true; - state.start++; - return true; +const toMaxLen = (input, maxLength) => { + let negative = input[0] === '-' ? '-' : ''; + if (negative) { + input = input.slice(1); + maxLength--; + } + while (input.length < maxLength) input = '0' + input; + return negative ? ('-' + input) : input; }; -/** - * Create the message for a syntax error - */ +const toSequence = (parts, options) => { + parts.negatives.sort((a, b) => a < b ? -1 : a > b ? 1 : 0); + parts.positives.sort((a, b) => a < b ? -1 : a > b ? 1 : 0); -const syntaxError = (type, char) => { - return `Missing ${type}: "${char}" - use "\\\\${char}" to match literal characters`; -}; + let prefix = options.capture ? '' : '?:'; + let positives = ''; + let negatives = ''; + let result; -/** - * Parse the given input string. - * @param {String} input - * @param {Object} options - * @return {Object} - */ + if (parts.positives.length) { + positives = parts.positives.join('|'); + } -const parse = (input, options) => { - if (typeof input !== 'string') { - throw new TypeError('Expected a string'); + if (parts.negatives.length) { + negatives = `-(${prefix}${parts.negatives.join('|')})`; } - input = REPLACEMENTS[input] || input; + if (positives && negatives) { + result = `${positives}|${negatives}`; + } else { + result = positives || negatives; + } - let opts = { ...options }; - let max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH; - let len = input.length; - if (len > max) { - throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`); + if (options.wrap) { + return `(${prefix}${result})`; } - let bos = { type: 'bos', value: '', output: opts.prepend || '' }; - let tokens = [bos]; + return result; +}; - let capture = opts.capture ? '' : '?:'; - let win32 = utils.isWindows(options); +const toRange = (a, b, isNumbers, options) => { + if (isNumbers) { + return toRegexRange(a, b, { wrap: false, ...options }); + } - // create constants based on platform, for windows or posix - const PLATFORM_CHARS = constants.globChars(win32); - const EXTGLOB_CHARS = constants.extglobChars(PLATFORM_CHARS); + let start = String.fromCharCode(a); + if (a === b) return start; - const { - DOT_LITERAL, - PLUS_LITERAL, - SLASH_LITERAL, - ONE_CHAR, - DOTS_SLASH, - NO_DOT, - NO_DOT_SLASH, - NO_DOTS_SLASH, - QMARK, - QMARK_NO_DOT, - STAR, - START_ANCHOR - } = PLATFORM_CHARS; + let stop = String.fromCharCode(b); + return `[${start}-${stop}]`; +}; - const globstar = (opts) => { - return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`; - }; +const toRegex = (start, end, options) => { + if (Array.isArray(start)) { + let wrap = options.wrap === true; + let prefix = options.capture ? '' : '?:'; + return wrap ? `(${prefix}${start.join('|')})` : start.join('|'); + } + return toRegexRange(start, end, options); +}; - let nodot = opts.dot ? '' : NO_DOT; - let star = opts.bash === true ? globstar(opts) : STAR; - let qmarkNoDot = opts.dot ? QMARK : QMARK_NO_DOT; +const rangeError = (...args) => { + return new RangeError('Invalid range arguments: ' + util.inspect(...args)); +}; - if (opts.capture) { - star = `(${star})`; - } +const invalidRange = (start, end, options) => { + if (options.strictRanges === true) throw rangeError([start, end]); + return []; +}; - // minimatch options support - if (typeof opts.noext === 'boolean') { - opts.noextglob = opts.noext; +const invalidStep = (step, options) => { + if (options.strictRanges === true) { + throw new TypeError(`Expected step "${step}" to be a number`); } + return []; +}; - let state = { - index: -1, - start: 0, - consumed: '', - output: '', - backtrack: false, - brackets: 0, - braces: 0, - parens: 0, - quotes: 0, - tokens - }; +const fillNumbers = (start, end, step = 1, options = {}) => { + let a = Number(start); + let b = Number(end); - let extglobs = []; - let stack = []; - let prev = bos; - let value; + if (!Number.isInteger(a) || !Number.isInteger(b)) { + if (options.strictRanges === true) throw rangeError([start, end]); + return []; + } - /** - * Tokenizing helpers - */ + // fix negative zero + if (a === 0) a = 0; + if (b === 0) b = 0; - const eos = () => state.index === len - 1; - const peek = state.peek = (n = 1) => input[state.index + n]; - const advance = state.advance = () => input[++state.index]; - const append = token => { - state.output += token.output != null ? token.output : token.value; - state.consumed += token.value || ''; - }; + let descending = a > b; + let startString = String(start); + let endString = String(end); + let stepString = String(step); + step = Math.max(Math.abs(step), 1); - const increment = type => { - state[type]++; - stack.push(type); - }; + let padded = zeros(startString) || zeros(endString) || zeros(stepString); + let maxLen = padded ? Math.max(startString.length, endString.length, stepString.length) : 0; + let toNumber = padded === false && stringify(start, end, options) === false; + let format = options.transform || transform(toNumber); - const decrement = type => { - state[type]--; - stack.pop(); - }; + if (options.toRegex && step === 1) { + return toRange(toMaxLen(start, maxLen), toMaxLen(end, maxLen), true, options); + } - /** - * Push tokens onto the tokens array. This helper speeds up - * tokenizing by 1) helping us avoid backtracking as much as possible, - * and 2) helping us avoid creating extra tokens when consecutive - * characters are plain text. This improves performance and simplifies - * lookbehinds. - */ + let parts = { negatives: [], positives: [] }; + let push = num => parts[num < 0 ? 'negatives' : 'positives'].push(Math.abs(num)); + let range = []; + let index = 0; - const push = tok => { - if (prev.type === 'globstar') { - let isBrace = state.braces > 0 && (tok.type === 'comma' || tok.type === 'brace'); - let isExtglob = extglobs.length && (tok.type === 'pipe' || tok.type === 'paren'); - if (tok.type !== 'slash' && tok.type !== 'paren' && !isBrace && !isExtglob) { - state.output = state.output.slice(0, -prev.output.length); - prev.type = 'star'; - prev.value = '*'; - prev.output = star; - state.output += prev.output; - } + while (descending ? a >= b : a <= b) { + if (options.toRegex === true && step > 1) { + push(a); + } else { + range.push(pad(format(a, index), maxLen, toNumber)); } + a = descending ? a - step : a + step; + index++; + } - if (extglobs.length && tok.type !== 'paren' && !EXTGLOB_CHARS[tok.value]) { - extglobs[extglobs.length - 1].inner += tok.value; - } - - if (tok.value || tok.output) append(tok); - if (prev && prev.type === 'text' && tok.type === 'text') { - prev.value += tok.value; - return; - } + if (options.toRegex === true) { + return step > 1 + ? toSequence(parts, options) + : toRegex(range, null, { wrap: false, ...options }); + } - tok.prev = prev; - tokens.push(tok); - prev = tok; - }; + return range; +}; - const extglobOpen = (type, value) => { - let token = { ...EXTGLOB_CHARS[value], conditions: 1, inner: '' }; +const fillLetters = (start, end, step = 1, options = {}) => { + if ((!isNumber(start) && start.length > 1) || (!isNumber(end) && end.length > 1)) { + return invalidRange(start, end, options); + } - token.prev = prev; - token.parens = state.parens; - token.output = state.output; - let output = (opts.capture ? '(' : '') + token.open; - push({ type, value, output: state.output ? '' : ONE_CHAR }); - push({ type: 'paren', extglob: true, value: advance(), output }); - increment('parens'); - extglobs.push(token); - }; + let format = options.transform || (val => String.fromCharCode(val)); + let a = `${start}`.charCodeAt(0); + let b = `${end}`.charCodeAt(0); - const extglobClose = token => { - let output = token.close + (opts.capture ? ')' : ''); + let descending = a > b; + let min = Math.min(a, b); + let max = Math.max(a, b); - if (token.type === 'negate') { - let extglobStar = star; + if (options.toRegex && step === 1) { + return toRange(min, max, false, options); + } - if (token.inner && token.inner.length > 1 && token.inner.includes('/')) { - extglobStar = globstar(opts); - } + let range = []; + let index = 0; - if (extglobStar !== star || eos() || /^\)+$/.test(input.slice(state.index + 1))) { - output = token.close = ')$))' + extglobStar; - } + while (descending ? a >= b : a <= b) { + range.push(format(a, index)); + a = descending ? a - step : a + step; + index++; + } - if (token.prev.type === 'bos' && eos()) { - state.negatedExtglob = true; - } - } + if (options.toRegex === true) { + return toRegex(range, null, { wrap: false, options }); + } - push({ type: 'paren', extglob: true, value, output }); - decrement('parens'); - }; + return range; +}; - if (opts.fastpaths !== false && !/(^[*!]|[/{[()\]}"])/.test(input)) { - let backslashes = false; +const fill = (start, end, step, options = {}) => { + if (end == null && isValidValue(start)) { + return [start]; + } - let output = input.replace(REGEX_SPECIAL_CHARS_BACKREF, (m, esc, chars, first, rest, index) => { - if (first === '\\') { - backslashes = true; - return m; - } + if (!isValidValue(start) || !isValidValue(end)) { + return invalidRange(start, end, options); + } - if (first === '?') { - if (esc) { - return esc + first + (rest ? QMARK.repeat(rest.length) : ''); - } - if (index === 0) { - return qmarkNoDot + (rest ? QMARK.repeat(rest.length) : ''); - } - return QMARK.repeat(chars.length); - } + if (typeof step === 'function') { + return fill(start, end, 1, { transform: step }); + } - if (first === '.') { - return DOT_LITERAL.repeat(chars.length); - } + if (isObject(step)) { + return fill(start, end, 0, step); + } - if (first === '*') { - if (esc) { - return esc + first + (rest ? star : ''); - } - return star; - } - return esc ? m : '\\' + m; - }); + let opts = { ...options }; + if (opts.capture === true) opts.wrap = true; + step = step || opts.step || 1; - if (backslashes === true) { - if (opts.unescape === true) { - output = output.replace(/\\/g, ''); - } else { - output = output.replace(/\\+/g, m => { - return m.length % 2 === 0 ? '\\\\' : (m ? '\\' : ''); - }); - } - } + if (!isNumber(step)) { + if (step != null && !isObject(step)) return invalidStep(step, opts); + return fill(start, end, 1, step); + } - state.output = output; - return state; + if (isNumber(start) && isNumber(end)) { + return fillNumbers(start, end, step, opts); } - /** - * Tokenize input until we reach end-of-string - */ + return fillLetters(start, end, Math.max(Math.abs(step), 1), opts); +}; - while (!eos()) { - value = advance(); +module.exports = fill; - if (value === '\u0000') { - continue; - } - /** - * Escaped characters - */ +/***/ }), +/* 614 */ +/***/ (function(module, exports, __webpack_require__) { - if (value === '\\') { - let next = peek(); +"use strict"; +/*! + * to-regex-range + * + * Copyright (c) 2015-present, Jon Schlinkert. + * Released under the MIT License. + */ - if (next === '/' && opts.bash !== true) { - continue; - } - if (next === '.' || next === ';') { - continue; - } - if (!next) { - value += '\\'; - push({ type: 'text', value }); - continue; - } +const isNumber = __webpack_require__(615); - // collapse slashes to reduce potential for exploits - let match = /^\\+/.exec(input.slice(state.index + 1)); - let slashes = 0; +const toRegexRange = (min, max, options) => { + if (isNumber(min) === false) { + throw new TypeError('toRegexRange: expected the first argument to be a number'); + } - if (match && match[0].length > 2) { - slashes = match[0].length; - state.index += slashes; - if (slashes % 2 !== 0) { - value += '\\'; - } - } + if (max === void 0 || min === max) { + return String(min); + } - if (opts.unescape === true) { - value = advance() || ''; - } else { - value += advance() || ''; - } + if (isNumber(max) === false) { + throw new TypeError('toRegexRange: expected the second argument to be a number.'); + } - if (state.brackets === 0) { - push({ type: 'text', value }); - continue; - } - } + let opts = { relaxZeros: true, ...options }; + if (typeof opts.strictZeros === 'boolean') { + opts.relaxZeros = opts.strictZeros === false; + } - /** - * If we're inside a regex character class, continue - * until we reach the closing bracket. - */ + let relax = String(opts.relaxZeros); + let shorthand = String(opts.shorthand); + let capture = String(opts.capture); + let wrap = String(opts.wrap); + let cacheKey = min + ':' + max + '=' + relax + shorthand + capture + wrap; - if (state.brackets > 0 && (value !== ']' || prev.value === '[' || prev.value === '[^')) { - if (opts.posix !== false && value === ':') { - let inner = prev.value.slice(1); - if (inner.includes('[')) { - prev.posix = true; + if (toRegexRange.cache.hasOwnProperty(cacheKey)) { + return toRegexRange.cache[cacheKey].result; + } - if (inner.includes(':')) { - let idx = prev.value.lastIndexOf('['); - let pre = prev.value.slice(0, idx); - let rest = prev.value.slice(idx + 2); - let posix = POSIX_REGEX_SOURCE[rest]; - if (posix) { - prev.value = pre + posix; - state.backtrack = true; - advance(); + let a = Math.min(min, max); + let b = Math.max(min, max); - if (!bos.output && tokens.indexOf(prev) === 1) { - bos.output = ONE_CHAR; - } - continue; - } - } - } - } + if (Math.abs(a - b) === 1) { + let result = min + '|' + max; + if (opts.capture) { + return `(${result})`; + } + if (opts.wrap === false) { + return result; + } + return `(?:${result})`; + } - if ((value === '[' && peek() !== ':') || (value === '-' && peek() === ']')) { - value = '\\' + value; - } + let isPadded = hasPadding(min) || hasPadding(max); + let state = { min, max, a, b }; + let positives = []; + let negatives = []; - if (value === ']' && (prev.value === '[' || prev.value === '[^')) { - value = '\\' + value; - } + if (isPadded) { + state.isPadded = isPadded; + state.maxLen = String(state.max).length; + } - if (opts.posix === true && value === '!' && prev.value === '[') { - value = '^'; - } + if (a < 0) { + let newMin = b < 0 ? Math.abs(b) : 1; + negatives = splitToPatterns(newMin, Math.abs(a), state, opts); + a = state.a = 0; + } - prev.value += value; - append({ value }); - continue; - } + if (b >= 0) { + positives = splitToPatterns(a, b, state, opts); + } - /** - * If we're inside a quoted string, continue - * until we reach the closing double quote. - */ + state.negatives = negatives; + state.positives = positives; + state.result = collatePatterns(negatives, positives, opts); - if (state.quotes === 1 && value !== '"') { - value = utils.escapeRegex(value); - prev.value += value; - append({ value }); - continue; - } + if (opts.capture === true) { + state.result = `(${state.result})`; + } else if (opts.wrap !== false && (positives.length + negatives.length) > 1) { + state.result = `(?:${state.result})`; + } - /** - * Double quotes - */ + toRegexRange.cache[cacheKey] = state; + return state.result; +}; - if (value === '"') { - state.quotes = state.quotes === 1 ? 0 : 1; - if (opts.keepQuotes === true) { - push({ type: 'text', value }); - } - continue; - } +function collatePatterns(neg, pos, options) { + let onlyNegative = filterPatterns(neg, pos, '-', false, options) || []; + let onlyPositive = filterPatterns(pos, neg, '', false, options) || []; + let intersected = filterPatterns(neg, pos, '-?', true, options) || []; + let subpatterns = onlyNegative.concat(intersected).concat(onlyPositive); + return subpatterns.join('|'); +} - /** - * Parentheses - */ +function splitToRanges(min, max) { + let nines = 1; + let zeros = 1; - if (value === '(') { - push({ type: 'paren', value }); - increment('parens'); - continue; - } + let stop = countNines(min, nines); + let stops = new Set([max]); - if (value === ')') { - if (state.parens === 0 && opts.strictBrackets === true) { - throw new SyntaxError(syntaxError('opening', '(')); - } + while (min <= stop && stop <= max) { + stops.add(stop); + nines += 1; + stop = countNines(min, nines); + } - let extglob = extglobs[extglobs.length - 1]; - if (extglob && state.parens === extglob.parens + 1) { - extglobClose(extglobs.pop()); - continue; - } + stop = countZeros(max + 1, zeros) - 1; - push({ type: 'paren', value, output: state.parens ? ')' : '\\)' }); - decrement('parens'); - continue; - } + while (min < stop && stop <= max) { + stops.add(stop); + zeros += 1; + stop = countZeros(max + 1, zeros) - 1; + } - /** - * Brackets - */ + stops = [...stops]; + stops.sort(compare); + return stops; +} - if (value === '[') { - if (opts.nobracket === true || !input.slice(state.index + 1).includes(']')) { - if (opts.nobracket !== true && opts.strictBrackets === true) { - throw new SyntaxError(syntaxError('closing', ']')); - } +/** + * Convert a range to a regex pattern + * @param {Number} `start` + * @param {Number} `stop` + * @return {String} + */ - value = '\\' + value; - } else { - increment('brackets'); - } +function rangeToPattern(start, stop, options) { + if (start === stop) { + return { pattern: start, count: [], digits: 0 }; + } - push({ type: 'bracket', value }); - continue; - } + let zipped = zip(start, stop); + let digits = zipped.length; + let pattern = ''; + let count = 0; - if (value === ']') { - if (opts.nobracket === true || (prev && prev.type === 'bracket' && prev.value.length === 1)) { - push({ type: 'text', value, output: '\\' + value }); - continue; - } + for (let i = 0; i < digits; i++) { + let [startDigit, stopDigit] = zipped[i]; - if (state.brackets === 0) { - if (opts.strictBrackets === true) { - throw new SyntaxError(syntaxError('opening', '[')); - } + if (startDigit === stopDigit) { + pattern += startDigit; - push({ type: 'text', value, output: '\\' + value }); - continue; - } + } else if (startDigit !== '0' || stopDigit !== '9') { + pattern += toCharacterClass(startDigit, stopDigit, options); - decrement('brackets'); + } else { + count++; + } + } - let prevValue = prev.value.slice(1); - if (prev.posix !== true && prevValue[0] === '^' && !prevValue.includes('/')) { - value = '/' + value; - } + if (count) { + pattern += options.shorthand === true ? '\\d' : '[0-9]'; + } - prev.value += value; - append({ value }); + return { pattern, count: [count], digits }; +} - // when literal brackets are explicitly disabled - // assume we should match with a regex character class - if (opts.literalBrackets === false || utils.hasRegexChars(prevValue)) { - continue; - } +function splitToPatterns(min, max, tok, options) { + let ranges = splitToRanges(min, max); + let tokens = []; + let start = min; + let prev; - let escaped = utils.escapeRegex(prev.value); - state.output = state.output.slice(0, -prev.value.length); + for (let i = 0; i < ranges.length; i++) { + let max = ranges[i]; + let obj = rangeToPattern(String(start), String(max), options); + let zeros = ''; - // when literal brackets are explicitly enabled - // assume we should escape the brackets to match literal characters - if (opts.literalBrackets === true) { - state.output += escaped; - prev.value = escaped; - continue; + if (!tok.isPadded && prev && prev.pattern === obj.pattern) { + if (prev.count.length > 1) { + prev.count.pop(); } - // when the user specifies nothing, try to match both - prev.value = `(${capture}${escaped}|${prev.value})`; - state.output += prev.value; + prev.count.push(obj.count[0]); + prev.string = prev.pattern + toQuantifier(prev.count); + start = max + 1; continue; } - /** - * Braces - */ - - if (value === '{' && opts.nobrace !== true) { - push({ type: 'brace', value, output: '(' }); - increment('braces'); - continue; + if (tok.isPadded) { + zeros = padZeros(max, tok, options); } - if (value === '}') { - if (opts.nobrace === true || state.braces === 0) { - push({ type: 'text', value, output: '\\' + value }); - continue; - } + obj.string = zeros + obj.pattern + toQuantifier(obj.count); + tokens.push(obj); + start = max + 1; + prev = obj; + } - let output = ')'; + return tokens; +} - if (state.dots === true) { - let arr = tokens.slice(); - let range = []; +function filterPatterns(arr, comparison, prefix, intersection, options) { + let result = []; - for (let i = arr.length - 1; i >= 0; i--) { - tokens.pop(); - if (arr[i].type === 'brace') { - break; - } - if (arr[i].type !== 'dots') { - range.unshift(arr[i].value); - } - } + for (let ele of arr) { + let { string } = ele; - output = expandRange(range, opts); - state.backtrack = true; - } + // only push if _both_ are negative... + if (!intersection && !contains(comparison, 'string', string)) { + result.push(prefix + string); + } - push({ type: 'brace', value, output }); - decrement('braces'); - continue; + // or _both_ are positive + if (intersection && contains(comparison, 'string', string)) { + result.push(prefix + string); } + } + return result; +} - /** - * Pipes - */ +/** + * Zip strings + */ - if (value === '|') { - if (extglobs.length > 0) { - extglobs[extglobs.length - 1].conditions++; - } - push({ type: 'text', value }); - continue; - } +function zip(a, b) { + let arr = []; + for (let i = 0; i < a.length; i++) arr.push([a[i], b[i]]); + return arr; +} - /** - * Commas - */ +function compare(a, b) { + return a > b ? 1 : b > a ? -1 : 0; +} - if (value === ',') { - let output = value; +function contains(arr, key, val) { + return arr.some(ele => ele[key] === val); +} - if (state.braces > 0 && stack[stack.length - 1] === 'braces') { - output = '|'; - } +function countNines(min, len) { + return Number(String(min).slice(0, -len) + '9'.repeat(len)); +} - push({ type: 'comma', value, output }); - continue; - } +function countZeros(integer, zeros) { + return integer - (integer % Math.pow(10, zeros)); +} - /** - * Slashes - */ +function toQuantifier(digits) { + let [start = 0, stop = ''] = digits; + if (stop || start > 1) { + return `{${start + (stop ? ',' + stop : '')}}`; + } + return ''; +} - if (value === '/') { - // if the beginning of the glob is "./", advance the start - // to the current index, and don't add the "./" characters - // to the state. This greatly simplifies lookbehinds when - // checking for BOS characters like "!" and "." (not "./") - if (prev.type === 'dot' && state.index === 1) { - state.start = state.index + 1; - state.consumed = ''; - state.output = ''; - tokens.pop(); - prev = bos; // reset "prev" to the first token - continue; - } +function toCharacterClass(a, b, options) { + return `[${a}${(b - a === 1) ? '' : '-'}${b}]`; +} - push({ type: 'slash', value, output: SLASH_LITERAL }); - continue; - } +function hasPadding(str) { + return /^-?(0+)\d/.test(str); +} - /** - * Dots - */ +function padZeros(value, tok, options) { + if (!tok.isPadded) { + return value; + } - if (value === '.') { - if (state.braces > 0 && prev.type === 'dot') { - if (prev.value === '.') prev.output = DOT_LITERAL; - prev.type = 'dots'; - prev.output += value; - prev.value += value; - state.dots = true; - continue; - } + let diff = Math.abs(tok.maxLen - String(value).length); + let relax = options.relaxZeros !== false; - push({ type: 'dot', value, output: DOT_LITERAL }); - continue; + switch (diff) { + case 0: + return ''; + case 1: + return relax ? '0?' : '0'; + case 2: + return relax ? '0{0,2}' : '00'; + default: { + return relax ? `0{0,${diff}}` : `0{${diff}}`; } + } +} - /** - * Question marks - */ +/** + * Cache + */ - if (value === '?') { - if (prev && prev.type === 'paren') { - let next = peek(); - let output = value; +toRegexRange.cache = {}; +toRegexRange.clearCache = () => (toRegexRange.cache = {}); - if (next === '<' && !utils.supportsLookbehinds()) { - throw new Error('Node.js v10 or higher is required for regex lookbehinds'); - } +/** + * Expose `toRegexRange` + */ - if (prev.value === '(' && !/[!=<:]/.test(next) || (next === '<' && !/[!=]/.test(peek(2)))) { - output = '\\' + value; - } +module.exports = toRegexRange; - push({ type: 'text', value, output }); - continue; - } - if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') { - extglobOpen('qmark', value); - continue; - } +/***/ }), +/* 615 */ +/***/ (function(module, exports, __webpack_require__) { - if (opts.dot !== true && (prev.type === 'slash' || prev.type === 'bos')) { - push({ type: 'qmark', value, output: QMARK_NO_DOT }); - continue; - } +"use strict"; +/*! + * is-number + * + * Copyright (c) 2014-present, Jon Schlinkert. + * Released under the MIT License. + */ - push({ type: 'qmark', value, output: QMARK }); - continue; - } - /** - * Exclamation - */ - if (value === '!') { - if (opts.noextglob !== true && peek() === '(') { - if (peek(2) !== '?' || !/[!=<:]/.test(peek(3))) { - extglobOpen('negate', value); - continue; - } - } +module.exports = function(num) { + if (typeof num === 'number') { + return num - num === 0; + } + if (typeof num === 'string' && num.trim() !== '') { + return Number.isFinite ? Number.isFinite(+num) : isFinite(+num); + } + return false; +}; - if (opts.nonegate !== true && state.index === 0) { - negate(state); - continue; - } - } - /** - * Plus - */ +/***/ }), +/* 616 */ +/***/ (function(module, exports, __webpack_require__) { - if (value === '+') { - if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') { - extglobOpen('plus', value); - continue; - } +"use strict"; - if (prev && (prev.type === 'bracket' || prev.type === 'paren' || prev.type === 'brace')) { - let output = prev.extglob === true ? '\\' + value : value; - push({ type: 'plus', value, output }); - continue; - } - // use regex behavior inside parens - if (state.parens > 0 && opts.regex !== false) { - push({ type: 'plus', value }); - continue; - } +const fill = __webpack_require__(613); +const stringify = __webpack_require__(610); +const utils = __webpack_require__(611); - push({ type: 'plus', value: PLUS_LITERAL }); - continue; - } +const append = (queue = '', stash = '', enclose = false) => { + let result = []; - /** - * Plain text - */ + queue = [].concat(queue); + stash = [].concat(stash); - if (value === '@') { - if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') { - push({ type: 'at', value, output: '' }); - continue; - } + if (!stash.length) return queue; + if (!queue.length) { + return enclose ? utils.flatten(stash).map(ele => `{${ele}}`) : stash; + } - push({ type: 'text', value }); - continue; + for (let item of queue) { + if (Array.isArray(item)) { + for (let value of item) { + result.push(append(value, stash, enclose)); + } + } else { + for (let ele of stash) { + if (enclose === true && typeof ele === 'string') ele = `{${ele}}`; + result.push(Array.isArray(ele) ? append(item, ele, enclose) : (item + ele)); + } } + } + return utils.flatten(result); +}; - /** - * Plain text - */ +const expand = (ast, options = {}) => { + let rangeLimit = options.rangeLimit === void 0 ? 1000 : options.rangeLimit; - if (value !== '*') { - if (value === '$' || value === '^') { - value = '\\' + value; - } + let walk = (node, parent = {}) => { + node.queue = []; - let match = REGEX_NON_SPECIAL_CHAR.exec(input.slice(state.index + 1)); - if (match) { - value += match[0]; - state.index += match[0].length; - } + let p = parent; + let q = parent.queue; - push({ type: 'text', value }); - continue; + while (p.type !== 'brace' && p.type !== 'root' && p.parent) { + p = p.parent; + q = p.queue; } - /** - * Stars - */ - - if (prev && (prev.type === 'globstar' || prev.star === true)) { - prev.type = 'star'; - prev.star = true; - prev.value += value; - prev.output = star; - state.backtrack = true; - state.consumed += value; - continue; + if (node.invalid || node.dollar) { + q.push(append(q.pop(), stringify(node, options))); + return; } - if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') { - extglobOpen('star', value); - continue; + if (node.type === 'brace' && node.invalid !== true && node.nodes.length === 2) { + q.push(append(q.pop(), ['{}'])); + return; } - if (prev.type === 'star') { - if (opts.noglobstar === true) { - state.consumed += value; - continue; - } - - let prior = prev.prev; - let before = prior.prev; - let isStart = prior.type === 'slash' || prior.type === 'bos'; - let afterStar = before && (before.type === 'star' || before.type === 'globstar'); + if (node.nodes && node.ranges > 0) { + let args = utils.reduce(node.nodes); - if (opts.bash === true && (!isStart || (!eos() && peek() !== '/'))) { - push({ type: 'star', value, output: '' }); - continue; + if (utils.exceedsLimit(...args, options.step, rangeLimit)) { + throw new RangeError('expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.'); } - let isBrace = state.braces > 0 && (prior.type === 'comma' || prior.type === 'brace'); - let isExtglob = extglobs.length && (prior.type === 'pipe' || prior.type === 'paren'); - if (!isStart && prior.type !== 'paren' && !isBrace && !isExtglob) { - push({ type: 'star', value, output: '' }); - continue; + let range = fill(...args, options); + if (range.length === 0) { + range = stringify(node, options); } - // strip consecutive `/**/` - while (input.slice(state.index + 1, state.index + 4) === '/**') { - let after = input[state.index + 4]; - if (after && after !== '/') { - break; - } - state.consumed += '/**'; - state.index += 3; - } + q.push(append(q.pop(), range)); + node.nodes = []; + return; + } - if (prior.type === 'bos' && eos()) { - prev.type = 'globstar'; - prev.value += value; - prev.output = globstar(opts); - state.output = prev.output; - state.consumed += value; - continue; - } + let enclose = utils.encloseBrace(node); + let queue = node.queue; + let block = node; - if (prior.type === 'slash' && prior.prev.type !== 'bos' && !afterStar && eos()) { - state.output = state.output.slice(0, -(prior.output + prev.output).length); - prior.output = '(?:' + prior.output; + while (block.type !== 'brace' && block.type !== 'root' && block.parent) { + block = block.parent; + queue = block.queue; + } - prev.type = 'globstar'; - prev.output = globstar(opts) + '|$)'; - prev.value += value; + for (let i = 0; i < node.nodes.length; i++) { + let child = node.nodes[i]; - state.output += prior.output + prev.output; - state.consumed += value; + if (child.type === 'comma' && node.type === 'brace') { + if (i === 1) queue.push(''); + queue.push(''); continue; } - let next = peek(); - if (prior.type === 'slash' && prior.prev.type !== 'bos' && next === '/') { - let end = peek(2) !== void 0 ? '|$' : ''; - - state.output = state.output.slice(0, -(prior.output + prev.output).length); - prior.output = '(?:' + prior.output; - - prev.type = 'globstar'; - prev.output = `${globstar(opts)}${SLASH_LITERAL}|${SLASH_LITERAL}${end})`; - prev.value += value; - - state.output += prior.output + prev.output; - state.consumed += value + advance(); - - push({ type: 'slash', value, output: '' }); + if (child.type === 'close') { + q.push(append(q.pop(), queue, enclose)); continue; } - if (prior.type === 'bos' && next === '/') { - prev.type = 'globstar'; - prev.value += value; - prev.output = `(?:^|${SLASH_LITERAL}|${globstar(opts)}${SLASH_LITERAL})`; - state.output = prev.output; - state.consumed += value + advance(); - push({ type: 'slash', value, output: '' }); + if (child.value && child.type !== 'open') { + queue.push(append(queue.pop(), child.value)); continue; } - // remove single star from output - state.output = state.output.slice(0, -prev.output.length); + if (child.nodes) { + walk(child, node); + } + } - // reset previous token to globstar - prev.type = 'globstar'; - prev.output = globstar(opts); - prev.value += value; + return queue; + }; - // reset output with globstar - state.output += prev.output; - state.consumed += value; - continue; - } + return utils.flatten(walk(ast)); +}; - let token = { type: 'star', value, output: star }; +module.exports = expand; - if (opts.bash === true) { - token.output = '.*?'; - if (prev.type === 'bos' || prev.type === 'slash') { - token.output = nodot + token.output; - } - push(token); - continue; - } - if (prev && (prev.type === 'bracket' || prev.type === 'paren') && opts.regex === true) { - token.output = value; - push(token); - continue; - } +/***/ }), +/* 617 */ +/***/ (function(module, exports, __webpack_require__) { - if (state.index === state.start || prev.type === 'slash' || prev.type === 'dot') { - if (prev.type === 'dot') { - state.output += NO_DOT_SLASH; - prev.output += NO_DOT_SLASH; +"use strict"; - } else if (opts.dot === true) { - state.output += NO_DOTS_SLASH; - prev.output += NO_DOTS_SLASH; - } else { - state.output += nodot; - prev.output += nodot; - } +const stringify = __webpack_require__(610); - if (peek() !== '*') { - state.output += ONE_CHAR; - prev.output += ONE_CHAR; - } - } +/** + * Constants + */ - push(token); - } +const { + MAX_LENGTH, + CHAR_BACKSLASH, /* \ */ + CHAR_BACKTICK, /* ` */ + CHAR_COMMA, /* , */ + CHAR_DOT, /* . */ + CHAR_LEFT_PARENTHESES, /* ( */ + CHAR_RIGHT_PARENTHESES, /* ) */ + CHAR_LEFT_CURLY_BRACE, /* { */ + CHAR_RIGHT_CURLY_BRACE, /* } */ + CHAR_LEFT_SQUARE_BRACKET, /* [ */ + CHAR_RIGHT_SQUARE_BRACKET, /* ] */ + CHAR_DOUBLE_QUOTE, /* " */ + CHAR_SINGLE_QUOTE, /* ' */ + CHAR_NO_BREAK_SPACE, + CHAR_ZERO_WIDTH_NOBREAK_SPACE +} = __webpack_require__(618); - while (state.brackets > 0) { - if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ']')); - state.output = utils.escapeLast(state.output, '['); - decrement('brackets'); - } +/** + * parse + */ - while (state.parens > 0) { - if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ')')); - state.output = utils.escapeLast(state.output, '('); - decrement('parens'); +const parse = (input, options = {}) => { + if (typeof input !== 'string') { + throw new TypeError('Expected a string'); } - while (state.braces > 0) { - if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', '}')); - state.output = utils.escapeLast(state.output, '{'); - decrement('braces'); + let opts = options || {}; + let max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH; + if (input.length > max) { + throw new SyntaxError(`Input length (${input.length}), exceeds max characters (${max})`); } - if (opts.strictSlashes !== true && (prev.type === 'star' || prev.type === 'bracket')) { - push({ type: 'maybe_slash', value: '', output: `${SLASH_LITERAL}?` }); - } + let ast = { type: 'root', input, nodes: [] }; + let stack = [ast]; + let block = ast; + let prev = ast; + let brackets = 0; + let length = input.length; + let index = 0; + let depth = 0; + let value; + let memo = {}; - // rebuild the output if we had to backtrack at any point - if (state.backtrack === true) { - state.output = ''; + /** + * Helpers + */ - for (let token of state.tokens) { - state.output += token.output != null ? token.output : token.value; + const advance = () => input[index++]; + const push = node => { + if (node.type === 'text' && prev.type === 'dot') { + prev.type = 'text'; + } - if (token.suffix) { - state.output += token.suffix; - } + if (prev && prev.type === 'text' && node.type === 'text') { + prev.value += node.value; + return; } - } - return state; -}; + block.nodes.push(node); + node.parent = block; + node.prev = prev; + prev = node; + return node; + }; -/** - * Fast paths for creating regular expressions for common glob patterns. - * This can significantly speed up processing and has very little downside - * impact when none of the fast paths match. - */ + push({ type: 'bos' }); -parse.fastpaths = (input, options) => { - let opts = { ...options }; - let max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH; - let len = input.length; - if (len > max) { - throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`); - } + while (index < length) { + block = stack[stack.length - 1]; + value = advance(); - input = REPLACEMENTS[input] || input; - let win32 = utils.isWindows(options); + /** + * Invalid chars + */ - // create constants based on platform, for windows or posix - const { - DOT_LITERAL, - SLASH_LITERAL, - ONE_CHAR, - DOTS_SLASH, - NO_DOT, - NO_DOTS, - NO_DOTS_SLASH, - STAR, - START_ANCHOR - } = constants.globChars(win32); + if (value === CHAR_ZERO_WIDTH_NOBREAK_SPACE || value === CHAR_NO_BREAK_SPACE) { + continue; + } - let capture = opts.capture ? '' : '?:'; - let star = opts.bash === true ? '.*?' : STAR; - let nodot = opts.dot ? NO_DOTS : NO_DOT; - let slashDot = opts.dot ? NO_DOTS_SLASH : NO_DOT; + /** + * Escaped chars + */ - if (opts.capture) { - star = `(${star})`; - } + if (value === CHAR_BACKSLASH) { + push({ type: 'text', value: (options.keepEscaping ? value : '') + advance() }); + continue; + } - const globstar = (opts) => { - return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`; - }; + /** + * Right square bracket (literal): ']' + */ - const create = str => { - switch (str) { - case '*': - return `${nodot}${ONE_CHAR}${star}`; + if (value === CHAR_RIGHT_SQUARE_BRACKET) { + push({ type: 'text', value: '\\' + value }); + continue; + } - case '.*': - return `${DOT_LITERAL}${ONE_CHAR}${star}`; + /** + * Left square bracket: '[' + */ - case '*.*': - return `${nodot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`; + if (value === CHAR_LEFT_SQUARE_BRACKET) { + brackets++; - case '*/*': - return `${nodot}${star}${SLASH_LITERAL}${ONE_CHAR}${slashDot}${star}`; + let closed = true; + let next; - case '**': - return nodot + globstar(opts); + while (index < length && (next = advance())) { + value += next; - case '**/*': - return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${ONE_CHAR}${star}`; + if (next === CHAR_LEFT_SQUARE_BRACKET) { + brackets++; + continue; + } - case '**/*.*': - return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`; + if (next === CHAR_BACKSLASH) { + value += advance(); + continue; + } - case '**/.*': - return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${DOT_LITERAL}${ONE_CHAR}${star}`; + if (next === CHAR_RIGHT_SQUARE_BRACKET) { + brackets--; - default: { - let match = /^(.*?)\.(\w+)$/.exec(str); - if (!match) return; + if (brackets === 0) { + break; + } + } + } - let source = create(match[1], options); - if (!source) return; + push({ type: 'text', value }); + continue; + } - return source + DOT_LITERAL + match[2]; + /** + * Parentheses + */ + + if (value === CHAR_LEFT_PARENTHESES) { + block = push({ type: 'paren', nodes: [] }); + stack.push(block); + push({ type: 'text', value }); + continue; + } + + if (value === CHAR_RIGHT_PARENTHESES) { + if (block.type !== 'paren') { + push({ type: 'text', value }); + continue; } + block = stack.pop(); + push({ type: 'text', value }); + block = stack[stack.length - 1]; + continue; } - }; - let output = create(input); - if (output && opts.strictSlashes !== true) { - output += `${SLASH_LITERAL}?`; - } + /** + * Quotes: '|"|` + */ - return output; -}; + if (value === CHAR_DOUBLE_QUOTE || value === CHAR_SINGLE_QUOTE || value === CHAR_BACKTICK) { + let open = value; + let next; -module.exports = parse; + if (options.keepQuotes !== true) { + value = ''; + } + while (index < length && (next = advance())) { + if (next === CHAR_BACKSLASH) { + value += next + advance(); + continue; + } -/***/ }), -/* 620 */ -/***/ (function(module, exports, __webpack_require__) { + if (next === open) { + if (options.keepQuotes === true) value += next; + break; + } -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const merge2 = __webpack_require__(591); -function merge(streams) { - const mergedStream = merge2(streams); - streams.forEach((stream) => { - stream.once('error', (err) => mergedStream.emit('error', err)); - }); - return mergedStream; -} -exports.merge = merge; + value += next; + } + push({ type: 'text', value }); + continue; + } -/***/ }), -/* 621 */ -/***/ (function(module, exports, __webpack_require__) { + /** + * Left curly brace: '{' + */ -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const stream_1 = __webpack_require__(622); -const provider_1 = __webpack_require__(649); -class ProviderAsync extends provider_1.default { - constructor() { - super(...arguments); - this._reader = new stream_1.default(this._settings); - } - read(task) { - const root = this._getRootDirectory(task); - const options = this._getReaderOptions(task); - const entries = []; - return new Promise((resolve, reject) => { - const stream = this.api(root, task, options); - stream.once('error', reject); - stream.on('data', (entry) => entries.push(options.transform(entry))); - stream.once('end', () => resolve(entries)); - }); - } - api(root, task, options) { - if (task.dynamic) { - return this._reader.dynamic(root, options); - } - return this._reader.static(task.patterns, options); - } -} -exports.default = ProviderAsync; + if (value === CHAR_LEFT_CURLY_BRACE) { + depth++; + let dollar = prev.value && prev.value.slice(-1) === '$' || block.dollar === true; + let brace = { + type: 'brace', + open: true, + close: false, + dollar, + depth, + commas: 0, + ranges: 0, + nodes: [] + }; -/***/ }), -/* 622 */ -/***/ (function(module, exports, __webpack_require__) { + block = push(brace); + stack.push(block); + push({ type: 'open', value }); + continue; + } -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const stream_1 = __webpack_require__(27); -const fsStat = __webpack_require__(623); -const fsWalk = __webpack_require__(628); -const reader_1 = __webpack_require__(648); -class ReaderStream extends reader_1.default { - constructor() { - super(...arguments); - this._walkStream = fsWalk.walkStream; - this._stat = fsStat.stat; - } - dynamic(root, options) { - return this._walkStream(root, options); - } - static(patterns, options) { - const filepaths = patterns.map(this._getFullEntryPath, this); - const stream = new stream_1.PassThrough({ objectMode: true }); - stream._write = (index, _enc, done) => { - return this._getEntry(filepaths[index], patterns[index], options) - .then((entry) => { - if (entry !== null && options.entryFilter(entry)) { - stream.push(entry); - } - if (index === filepaths.length - 1) { - stream.end(); - } - done(); - }) - .catch(done); - }; - for (let i = 0; i < filepaths.length; i++) { - stream.write(i); - } - return stream; - } - _getEntry(filepath, pattern, options) { - return this._getStat(filepath) - .then((stats) => this._makeEntry(stats, pattern)) - .catch((error) => { - if (options.errorFilter(error)) { - return null; - } - throw error; - }); - } - _getStat(filepath) { - return new Promise((resolve, reject) => { - this._stat(filepath, this._fsStatSettings, (error, stats) => { - error ? reject(error) : resolve(stats); - }); - }); - } -} -exports.default = ReaderStream; + /** + * Right curly brace: '}' + */ + if (value === CHAR_RIGHT_CURLY_BRACE) { + if (block.type !== 'brace') { + push({ type: 'text', value }); + continue; + } -/***/ }), -/* 623 */ -/***/ (function(module, exports, __webpack_require__) { + let type = 'close'; + block = stack.pop(); + block.close = true; -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const async = __webpack_require__(624); -const sync = __webpack_require__(625); -const settings_1 = __webpack_require__(626); -exports.Settings = settings_1.default; -function stat(path, optionsOrSettingsOrCallback, callback) { - if (typeof optionsOrSettingsOrCallback === 'function') { - return async.read(path, getSettings(), optionsOrSettingsOrCallback); - } - async.read(path, getSettings(optionsOrSettingsOrCallback), callback); -} -exports.stat = stat; -function statSync(path, optionsOrSettings) { - const settings = getSettings(optionsOrSettings); - return sync.read(path, settings); -} -exports.statSync = statSync; -function getSettings(settingsOrOptions = {}) { - if (settingsOrOptions instanceof settings_1.default) { - return settingsOrOptions; - } - return new settings_1.default(settingsOrOptions); -} + push({ type, value }); + depth--; + block = stack[stack.length - 1]; + continue; + } -/***/ }), -/* 624 */ -/***/ (function(module, exports, __webpack_require__) { + /** + * Comma: ',' + */ -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -function read(path, settings, callback) { - settings.fs.lstat(path, (lstatError, lstat) => { - if (lstatError) { - return callFailureCallback(callback, lstatError); - } - if (!lstat.isSymbolicLink() || !settings.followSymbolicLink) { - return callSuccessCallback(callback, lstat); - } - settings.fs.stat(path, (statError, stat) => { - if (statError) { - if (settings.throwErrorOnBrokenSymbolicLink) { - return callFailureCallback(callback, statError); - } - return callSuccessCallback(callback, lstat); - } - if (settings.markSymbolicLink) { - stat.isSymbolicLink = () => true; - } - callSuccessCallback(callback, stat); - }); - }); -} -exports.read = read; -function callFailureCallback(callback, error) { - callback(error); -} -function callSuccessCallback(callback, result) { - callback(null, result); -} + if (value === CHAR_COMMA && depth > 0) { + if (block.ranges > 0) { + block.ranges = 0; + let open = block.nodes.shift(); + block.nodes = [open, { type: 'text', value: stringify(block) }]; + } + push({ type: 'comma', value }); + block.commas++; + continue; + } -/***/ }), -/* 625 */ -/***/ (function(module, exports, __webpack_require__) { + /** + * Dot: '.' + */ -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -function read(path, settings) { - const lstat = settings.fs.lstatSync(path); - if (!lstat.isSymbolicLink() || !settings.followSymbolicLink) { - return lstat; - } - try { - const stat = settings.fs.statSync(path); - if (settings.markSymbolicLink) { - stat.isSymbolicLink = () => true; - } - return stat; - } - catch (error) { - if (!settings.throwErrorOnBrokenSymbolicLink) { - return lstat; - } - throw error; - } -} -exports.read = read; + if (value === CHAR_DOT && depth > 0 && block.commas === 0) { + let siblings = block.nodes; + if (depth === 0 || siblings.length === 0) { + push({ type: 'text', value }); + continue; + } -/***/ }), -/* 626 */ -/***/ (function(module, exports, __webpack_require__) { + if (prev.type === 'dot') { + block.range = []; + prev.value += value; + prev.type = 'range'; -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const fs = __webpack_require__(627); -class Settings { - constructor(_options = {}) { - this._options = _options; - this.followSymbolicLink = this._getValue(this._options.followSymbolicLink, true); - this.fs = fs.createFileSystemAdapter(this._options.fs); - this.markSymbolicLink = this._getValue(this._options.markSymbolicLink, false); - this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, true); - } - _getValue(option, value) { - return option === undefined ? value : option; - } -} -exports.default = Settings; + if (block.nodes.length !== 3 && block.nodes.length !== 5) { + block.invalid = true; + block.ranges = 0; + prev.type = 'text'; + continue; + } + block.ranges++; + block.args = []; + continue; + } -/***/ }), -/* 627 */ -/***/ (function(module, exports, __webpack_require__) { + if (prev.type === 'range') { + siblings.pop(); -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const fs = __webpack_require__(23); -exports.FILE_SYSTEM_ADAPTER = { - lstat: fs.lstat, - stat: fs.stat, - lstatSync: fs.lstatSync, - statSync: fs.statSync -}; -function createFileSystemAdapter(fsMethods) { - if (!fsMethods) { - return exports.FILE_SYSTEM_ADAPTER; - } - return Object.assign({}, exports.FILE_SYSTEM_ADAPTER, fsMethods); -} -exports.createFileSystemAdapter = createFileSystemAdapter; + let before = siblings[siblings.length - 1]; + before.value += prev.value + value; + prev = before; + block.ranges--; + continue; + } + push({ type: 'dot', value }); + continue; + } -/***/ }), -/* 628 */ -/***/ (function(module, exports, __webpack_require__) { + /** + * Text + */ -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const async_1 = __webpack_require__(629); -const stream_1 = __webpack_require__(644); -const sync_1 = __webpack_require__(645); -const settings_1 = __webpack_require__(647); -exports.Settings = settings_1.default; -function walk(dir, optionsOrSettingsOrCallback, callback) { - if (typeof optionsOrSettingsOrCallback === 'function') { - return new async_1.default(dir, getSettings()).read(optionsOrSettingsOrCallback); - } - new async_1.default(dir, getSettings(optionsOrSettingsOrCallback)).read(callback); -} -exports.walk = walk; -function walkSync(dir, optionsOrSettings) { - const settings = getSettings(optionsOrSettings); - const provider = new sync_1.default(dir, settings); - return provider.read(); -} -exports.walkSync = walkSync; -function walkStream(dir, optionsOrSettings) { - const settings = getSettings(optionsOrSettings); - const provider = new stream_1.default(dir, settings); - return provider.read(); -} -exports.walkStream = walkStream; -function getSettings(settingsOrOptions = {}) { - if (settingsOrOptions instanceof settings_1.default) { - return settingsOrOptions; - } - return new settings_1.default(settingsOrOptions); -} + push({ type: 'text', value }); + } + // Mark imbalanced braces and brackets as invalid + do { + block = stack.pop(); -/***/ }), -/* 629 */ -/***/ (function(module, exports, __webpack_require__) { + if (block.type !== 'root') { + block.nodes.forEach(node => { + if (!node.nodes) { + if (node.type === 'open') node.isOpen = true; + if (node.type === 'close') node.isClose = true; + if (!node.nodes) node.type = 'text'; + node.invalid = true; + } + }); -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const async_1 = __webpack_require__(630); -class AsyncProvider { - constructor(_root, _settings) { - this._root = _root; - this._settings = _settings; - this._reader = new async_1.default(this._root, this._settings); - this._storage = new Set(); - } - read(callback) { - this._reader.onError((error) => { - callFailureCallback(callback, error); - }); - this._reader.onEntry((entry) => { - this._storage.add(entry); - }); - this._reader.onEnd(() => { - callSuccessCallback(callback, Array.from(this._storage)); - }); - this._reader.read(); - } -} -exports.default = AsyncProvider; -function callFailureCallback(callback, error) { - callback(error); -} -function callSuccessCallback(callback, entries) { - callback(null, entries); -} + // get the location of the block on parent.nodes (block's siblings) + let parent = stack[stack.length - 1]; + let index = parent.nodes.indexOf(block); + // replace the (invalid) block with it's nodes + parent.nodes.splice(index, 1, ...block.nodes); + } + } while (stack.length > 0); + + push({ type: 'eos' }); + return ast; +}; + +module.exports = parse; /***/ }), -/* 630 */ +/* 618 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const events_1 = __webpack_require__(379); -const fsScandir = __webpack_require__(631); -const fastq = __webpack_require__(640); -const common = __webpack_require__(642); -const reader_1 = __webpack_require__(643); -class AsyncReader extends reader_1.default { - constructor(_root, _settings) { - super(_root, _settings); - this._settings = _settings; - this._scandir = fsScandir.scandir; - this._emitter = new events_1.EventEmitter(); - this._queue = fastq(this._worker.bind(this), this._settings.concurrency); - this._isFatalError = false; - this._isDestroyed = false; - this._queue.drain = () => { - if (!this._isFatalError) { - this._emitter.emit('end'); - } - }; - } - read() { - this._isFatalError = false; - this._isDestroyed = false; - setImmediate(() => { - this._pushToQueue(this._root, this._settings.basePath); - }); - return this._emitter; - } - destroy() { - if (this._isDestroyed) { - throw new Error('The reader is already destroyed'); - } - this._isDestroyed = true; - this._queue.killAndDrain(); - } - onEntry(callback) { - this._emitter.on('entry', callback); - } - onError(callback) { - this._emitter.once('error', callback); - } - onEnd(callback) { - this._emitter.once('end', callback); - } - _pushToQueue(dir, base) { - const queueItem = { dir, base }; - this._queue.push(queueItem, (error) => { - if (error) { - this._handleError(error); - } - }); - } - _worker(item, done) { - this._scandir(item.dir, this._settings.fsScandirSettings, (error, entries) => { - if (error) { - return done(error, undefined); - } - for (const entry of entries) { - this._handleEntry(entry, item.base); - } - done(null, undefined); - }); - } - _handleError(error) { - if (!common.isFatalError(this._settings, error)) { - return; - } - this._isFatalError = true; - this._isDestroyed = true; - this._emitter.emit('error', error); - } - _handleEntry(entry, base) { - if (this._isDestroyed || this._isFatalError) { - return; - } - const fullpath = entry.path; - if (base !== undefined) { - entry.path = common.joinPathSegments(base, entry.name, this._settings.pathSegmentSeparator); - } - if (common.isAppliedFilter(this._settings.entryFilter, entry)) { - this._emitEntry(entry); - } - if (entry.dirent.isDirectory() && common.isAppliedFilter(this._settings.deepFilter, entry)) { - this._pushToQueue(fullpath, entry.path); - } - } - _emitEntry(entry) { - this._emitter.emit('entry', entry); - } -} -exports.default = AsyncReader; + + +module.exports = { + MAX_LENGTH: 1024 * 64, + + // Digits + CHAR_0: '0', /* 0 */ + CHAR_9: '9', /* 9 */ + + // Alphabet chars. + CHAR_UPPERCASE_A: 'A', /* A */ + CHAR_LOWERCASE_A: 'a', /* a */ + CHAR_UPPERCASE_Z: 'Z', /* Z */ + CHAR_LOWERCASE_Z: 'z', /* z */ + + CHAR_LEFT_PARENTHESES: '(', /* ( */ + CHAR_RIGHT_PARENTHESES: ')', /* ) */ + + CHAR_ASTERISK: '*', /* * */ + + // Non-alphabetic chars. + CHAR_AMPERSAND: '&', /* & */ + CHAR_AT: '@', /* @ */ + CHAR_BACKSLASH: '\\', /* \ */ + CHAR_BACKTICK: '`', /* ` */ + CHAR_CARRIAGE_RETURN: '\r', /* \r */ + CHAR_CIRCUMFLEX_ACCENT: '^', /* ^ */ + CHAR_COLON: ':', /* : */ + CHAR_COMMA: ',', /* , */ + CHAR_DOLLAR: '$', /* . */ + CHAR_DOT: '.', /* . */ + CHAR_DOUBLE_QUOTE: '"', /* " */ + CHAR_EQUAL: '=', /* = */ + CHAR_EXCLAMATION_MARK: '!', /* ! */ + CHAR_FORM_FEED: '\f', /* \f */ + CHAR_FORWARD_SLASH: '/', /* / */ + CHAR_HASH: '#', /* # */ + CHAR_HYPHEN_MINUS: '-', /* - */ + CHAR_LEFT_ANGLE_BRACKET: '<', /* < */ + CHAR_LEFT_CURLY_BRACE: '{', /* { */ + CHAR_LEFT_SQUARE_BRACKET: '[', /* [ */ + CHAR_LINE_FEED: '\n', /* \n */ + CHAR_NO_BREAK_SPACE: '\u00A0', /* \u00A0 */ + CHAR_PERCENT: '%', /* % */ + CHAR_PLUS: '+', /* + */ + CHAR_QUESTION_MARK: '?', /* ? */ + CHAR_RIGHT_ANGLE_BRACKET: '>', /* > */ + CHAR_RIGHT_CURLY_BRACE: '}', /* } */ + CHAR_RIGHT_SQUARE_BRACKET: ']', /* ] */ + CHAR_SEMICOLON: ';', /* ; */ + CHAR_SINGLE_QUOTE: '\'', /* ' */ + CHAR_SPACE: ' ', /* */ + CHAR_TAB: '\t', /* \t */ + CHAR_UNDERSCORE: '_', /* _ */ + CHAR_VERTICAL_LINE: '|', /* | */ + CHAR_ZERO_WIDTH_NOBREAK_SPACE: '\uFEFF' /* \uFEFF */ +}; /***/ }), -/* 631 */ +/* 619 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const async = __webpack_require__(632); -const sync = __webpack_require__(637); -const settings_1 = __webpack_require__(638); -exports.Settings = settings_1.default; -function scandir(path, optionsOrSettingsOrCallback, callback) { - if (typeof optionsOrSettingsOrCallback === 'function') { - return async.read(path, getSettings(), optionsOrSettingsOrCallback); - } - async.read(path, getSettings(optionsOrSettingsOrCallback), callback); -} -exports.scandir = scandir; -function scandirSync(path, optionsOrSettings) { - const settings = getSettings(optionsOrSettings); - return sync.read(path, settings); -} -exports.scandirSync = scandirSync; -function getSettings(settingsOrOptions = {}) { - if (settingsOrOptions instanceof settings_1.default) { - return settingsOrOptions; - } - return new settings_1.default(settingsOrOptions); -} + + +module.exports = __webpack_require__(620); /***/ }), -/* 632 */ +/* 620 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const fsStat = __webpack_require__(623); -const rpl = __webpack_require__(633); -const constants_1 = __webpack_require__(634); -const utils = __webpack_require__(635); -function read(dir, settings, callback) { - if (!settings.stats && constants_1.IS_SUPPORT_READDIR_WITH_FILE_TYPES) { - return readdirWithFileTypes(dir, settings, callback); - } - return readdir(dir, settings, callback); -} -exports.read = read; -function readdirWithFileTypes(dir, settings, callback) { - settings.fs.readdir(dir, { withFileTypes: true }, (readdirError, dirents) => { - if (readdirError) { - return callFailureCallback(callback, readdirError); - } - const entries = dirents.map((dirent) => ({ - dirent, - name: dirent.name, - path: `${dir}${settings.pathSegmentSeparator}${dirent.name}` - })); - if (!settings.followSymbolicLinks) { - return callSuccessCallback(callback, entries); - } - const tasks = entries.map((entry) => makeRplTaskEntry(entry, settings)); - rpl(tasks, (rplError, rplEntries) => { - if (rplError) { - return callFailureCallback(callback, rplError); - } - callSuccessCallback(callback, rplEntries); - }); - }); -} -exports.readdirWithFileTypes = readdirWithFileTypes; -function makeRplTaskEntry(entry, settings) { - return (done) => { - if (!entry.dirent.isSymbolicLink()) { - return done(null, entry); - } - settings.fs.stat(entry.path, (statError, stats) => { - if (statError) { - if (settings.throwErrorOnBrokenSymbolicLink) { - return done(statError); - } - return done(null, entry); - } - entry.dirent = utils.fs.createDirentFromStats(entry.name, stats); - return done(null, entry); - }); - }; -} -function readdir(dir, settings, callback) { - settings.fs.readdir(dir, (readdirError, names) => { - if (readdirError) { - return callFailureCallback(callback, readdirError); - } - const filepaths = names.map((name) => `${dir}${settings.pathSegmentSeparator}${name}`); - const tasks = filepaths.map((filepath) => { - return (done) => fsStat.stat(filepath, settings.fsStatSettings, done); - }); - rpl(tasks, (rplError, results) => { - if (rplError) { - return callFailureCallback(callback, rplError); - } - const entries = []; - for (let index = 0; index < names.length; index++) { - const name = names[index]; - const stats = results[index]; - const entry = { - name, - path: filepaths[index], - dirent: utils.fs.createDirentFromStats(name, stats) - }; - if (settings.stats) { - entry.stats = stats; - } - entries.push(entry); - } - callSuccessCallback(callback, entries); - }); - }); -} -exports.readdir = readdir; -function callFailureCallback(callback, error) { - callback(error); -} -function callSuccessCallback(callback, result) { - callback(null, result); -} - -/***/ }), -/* 633 */ -/***/ (function(module, exports) { -module.exports = runParallel +const path = __webpack_require__(16); +const scan = __webpack_require__(621); +const parse = __webpack_require__(624); +const utils = __webpack_require__(622); -function runParallel (tasks, cb) { - var results, pending, keys - var isSync = true +/** + * Creates a matcher function from one or more glob patterns. The + * returned function takes a string to match as its first argument, + * and returns true if the string is a match. The returned matcher + * function also takes a boolean as the second argument that, when true, + * returns an object with additional information. + * + * ```js + * const picomatch = require('picomatch'); + * // picomatch(glob[, options]); + * + * const isMatch = picomatch('*.!(*a)'); + * console.log(isMatch('a.a')); //=> false + * console.log(isMatch('a.b')); //=> true + * ``` + * @name picomatch + * @param {String|Array} `globs` One or more glob patterns. + * @param {Object=} `options` + * @return {Function=} Returns a matcher function. + * @api public + */ - if (Array.isArray(tasks)) { - results = [] - pending = tasks.length - } else { - keys = Object.keys(tasks) - results = {} - pending = keys.length +const picomatch = (glob, options, returnState = false) => { + if (Array.isArray(glob)) { + let fns = glob.map(input => picomatch(input, options, returnState)); + return str => { + for (let isMatch of fns) { + let state = isMatch(str); + if (state) return state; + } + return false; + }; } - function done (err) { - function end () { - if (cb) cb(err, results) - cb = null - } - if (isSync) process.nextTick(end) - else end() + if (typeof glob !== 'string' || glob === '') { + throw new TypeError('Expected pattern to be a non-empty string'); } - function each (i, err, result) { - results[i] = result - if (--pending === 0 || err) { - done(err) - } - } + let opts = options || {}; + let posix = utils.isWindows(options); + let regex = picomatch.makeRe(glob, options, false, true); + let state = regex.state; + delete regex.state; - if (!pending) { - // empty - done(null) - } else if (keys) { - // object - keys.forEach(function (key) { - tasks[key](function (err, result) { each(key, err, result) }) - }) - } else { - // array - tasks.forEach(function (task, i) { - task(function (err, result) { each(i, err, result) }) - }) + let isIgnored = () => false; + if (opts.ignore) { + let ignoreOpts = { ...options, ignore: null, onMatch: null, onResult: null }; + isIgnored = picomatch(opts.ignore, ignoreOpts, returnState); } - isSync = false -} + const matcher = (input, returnObject = false) => { + let { isMatch, match, output } = picomatch.test(input, regex, options, { glob, posix }); + let result = { glob, state, regex, posix, input, output, match, isMatch }; + if (typeof opts.onResult === 'function') { + opts.onResult(result); + } -/***/ }), -/* 634 */ -/***/ (function(module, exports, __webpack_require__) { + if (isMatch === false) { + result.isMatch = false; + return returnObject ? result : false; + } -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const NODE_PROCESS_VERSION_PARTS = process.versions.node.split('.'); -const MAJOR_VERSION = parseInt(NODE_PROCESS_VERSION_PARTS[0], 10); -const MINOR_VERSION = parseInt(NODE_PROCESS_VERSION_PARTS[1], 10); -/** - * IS `true` for Node.js 10.10 and greater. - */ -exports.IS_SUPPORT_READDIR_WITH_FILE_TYPES = MAJOR_VERSION > 10 || (MAJOR_VERSION === 10 && MINOR_VERSION >= 10); + if (isIgnored(input)) { + if (typeof opts.onIgnore === 'function') { + opts.onIgnore(result); + } + result.isMatch = false; + return returnObject ? result : false; + } + if (typeof opts.onMatch === 'function') { + opts.onMatch(result); + } + return returnObject ? result : true; + }; -/***/ }), -/* 635 */ -/***/ (function(module, exports, __webpack_require__) { + if (returnState) { + matcher.state = state; + } -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const fs = __webpack_require__(636); -exports.fs = fs; + return matcher; +}; +/** + * Test `input` with the given `regex`. This is used by the main + * `picomatch()` function to test the input string. + * + * ```js + * const picomatch = require('picomatch'); + * // picomatch.test(input, regex[, options]); + * + * console.log(picomatch.test('foo/bar', /^(?:([^/]*?)\/([^/]*?))$/)); + * // { isMatch: true, match: [ 'foo/', 'foo', 'bar' ], output: 'foo/bar' } + * ``` + * @param {String} `input` String to test. + * @param {RegExp} `regex` + * @return {Object} Returns an object with matching info. + * @api public + */ -/***/ }), -/* 636 */ -/***/ (function(module, exports, __webpack_require__) { +picomatch.test = (input, regex, options, { glob, posix } = {}) => { + if (typeof input !== 'string') { + throw new TypeError('Expected input to be a string'); + } -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -class DirentFromStats { - constructor(name, stats) { - this.name = name; - this.isBlockDevice = stats.isBlockDevice.bind(stats); - this.isCharacterDevice = stats.isCharacterDevice.bind(stats); - this.isDirectory = stats.isDirectory.bind(stats); - this.isFIFO = stats.isFIFO.bind(stats); - this.isFile = stats.isFile.bind(stats); - this.isSocket = stats.isSocket.bind(stats); - this.isSymbolicLink = stats.isSymbolicLink.bind(stats); - } -} -function createDirentFromStats(name, stats) { - return new DirentFromStats(name, stats); -} -exports.createDirentFromStats = createDirentFromStats; + if (input === '') { + return { isMatch: false, output: '' }; + } + let opts = options || {}; + let format = opts.format || (posix ? utils.toPosixSlashes : null); + let match = input === glob; + let output = (match && format) ? format(input) : input; -/***/ }), -/* 637 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const fsStat = __webpack_require__(623); -const constants_1 = __webpack_require__(634); -const utils = __webpack_require__(635); -function read(dir, settings) { - if (!settings.stats && constants_1.IS_SUPPORT_READDIR_WITH_FILE_TYPES) { - return readdirWithFileTypes(dir, settings); - } - return readdir(dir, settings); -} -exports.read = read; -function readdirWithFileTypes(dir, settings) { - const dirents = settings.fs.readdirSync(dir, { withFileTypes: true }); - return dirents.map((dirent) => { - const entry = { - dirent, - name: dirent.name, - path: `${dir}${settings.pathSegmentSeparator}${dirent.name}` - }; - if (entry.dirent.isSymbolicLink() && settings.followSymbolicLinks) { - try { - const stats = settings.fs.statSync(entry.path); - entry.dirent = utils.fs.createDirentFromStats(entry.name, stats); - } - catch (error) { - if (settings.throwErrorOnBrokenSymbolicLink) { - throw error; - } - } - } - return entry; - }); -} -exports.readdirWithFileTypes = readdirWithFileTypes; -function readdir(dir, settings) { - const names = settings.fs.readdirSync(dir); - return names.map((name) => { - const entryPath = `${dir}${settings.pathSegmentSeparator}${name}`; - const stats = fsStat.statSync(entryPath, settings.fsStatSettings); - const entry = { - name, - path: entryPath, - dirent: utils.fs.createDirentFromStats(name, stats) - }; - if (settings.stats) { - entry.stats = stats; - } - return entry; - }); -} -exports.readdir = readdir; + if (match === false) { + output = format ? format(input) : input; + match = output === glob; + } + if (match === false || opts.capture === true) { + if (opts.matchBase === true || opts.basename === true) { + match = picomatch.matchBase(input, regex, options, posix); + } else { + match = regex.exec(output); + } + } -/***/ }), -/* 638 */ -/***/ (function(module, exports, __webpack_require__) { + return { isMatch: !!match, match, output }; +}; -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const path = __webpack_require__(16); -const fsStat = __webpack_require__(623); -const fs = __webpack_require__(639); -class Settings { - constructor(_options = {}) { - this._options = _options; - this.followSymbolicLinks = this._getValue(this._options.followSymbolicLinks, false); - this.fs = fs.createFileSystemAdapter(this._options.fs); - this.pathSegmentSeparator = this._getValue(this._options.pathSegmentSeparator, path.sep); - this.stats = this._getValue(this._options.stats, false); - this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, true); - this.fsStatSettings = new fsStat.Settings({ - followSymbolicLink: this.followSymbolicLinks, - fs: this.fs, - throwErrorOnBrokenSymbolicLink: this.throwErrorOnBrokenSymbolicLink - }); - } - _getValue(option, value) { - return option === undefined ? value : option; - } -} -exports.default = Settings; +/** + * Match the basename of a filepath. + * + * ```js + * const picomatch = require('picomatch'); + * // picomatch.matchBase(input, glob[, options]); + * console.log(picomatch.matchBase('foo/bar.js', '*.js'); // true + * ``` + * @param {String} `input` String to test. + * @param {RegExp|String} `glob` Glob pattern or regex created by [.makeRe](#makeRe). + * @return {Boolean} + * @api public + */ +picomatch.matchBase = (input, glob, options, posix = utils.isWindows(options)) => { + let regex = glob instanceof RegExp ? glob : picomatch.makeRe(glob, options); + return regex.test(path.basename(input)); +}; -/***/ }), -/* 639 */ -/***/ (function(module, exports, __webpack_require__) { +/** + * Returns true if **any** of the given glob `patterns` match the specified `string`. + * + * ```js + * const picomatch = require('picomatch'); + * // picomatch.isMatch(string, patterns[, options]); + * + * console.log(picomatch.isMatch('a.a', ['b.*', '*.a'])); //=> true + * console.log(picomatch.isMatch('a.a', 'b.*')); //=> false + * ``` + * @param {String|Array} str The string to test. + * @param {String|Array} patterns One or more glob patterns to use for matching. + * @param {Object} [options] See available [options](#options). + * @return {Boolean} Returns true if any patterns match `str` + * @api public + */ -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const fs = __webpack_require__(23); -exports.FILE_SYSTEM_ADAPTER = { - lstat: fs.lstat, - stat: fs.stat, - lstatSync: fs.lstatSync, - statSync: fs.statSync, - readdir: fs.readdir, - readdirSync: fs.readdirSync -}; -function createFileSystemAdapter(fsMethods) { - if (!fsMethods) { - return exports.FILE_SYSTEM_ADAPTER; - } - return Object.assign({}, exports.FILE_SYSTEM_ADAPTER, fsMethods); -} -exports.createFileSystemAdapter = createFileSystemAdapter; +picomatch.isMatch = (str, patterns, options) => picomatch(patterns, options)(str); +/** + * Parse a glob pattern to create the source string for a regular + * expression. + * + * ```js + * const picomatch = require('picomatch'); + * const result = picomatch.parse(glob[, options]); + * ``` + * @param {String} `glob` + * @param {Object} `options` + * @return {Object} Returns an object with useful properties and output to be used as a regex source string. + * @api public + */ -/***/ }), -/* 640 */ -/***/ (function(module, exports, __webpack_require__) { +picomatch.parse = (glob, options) => parse(glob, options); -"use strict"; +/** + * Scan a glob pattern to separate the pattern into segments. + * + * ```js + * const picomatch = require('picomatch'); + * // picomatch.scan(input[, options]); + * + * const result = picomatch.scan('!./foo/*.js'); + * console.log(result); + * // { prefix: '!./', + * // input: '!./foo/*.js', + * // base: 'foo', + * // glob: '*.js', + * // negated: true, + * // isGlob: true } + * ``` + * @param {String} `input` Glob pattern to scan. + * @param {Object} `options` + * @return {Object} Returns an object with + * @api public + */ +picomatch.scan = (input, options) => scan(input, options); -var reusify = __webpack_require__(641) +/** + * Create a regular expression from a glob pattern. + * + * ```js + * const picomatch = require('picomatch'); + * // picomatch.makeRe(input[, options]); + * + * console.log(picomatch.makeRe('*.js')); + * //=> /^(?:(?!\.)(?=.)[^/]*?\.js)$/ + * ``` + * @param {String} `input` A glob pattern to convert to regex. + * @param {Object} `options` + * @return {RegExp} Returns a regex created from the given pattern. + * @api public + */ -function fastqueue (context, worker, concurrency) { - if (typeof context === 'function') { - concurrency = worker - worker = context - context = null +picomatch.makeRe = (input, options, returnOutput = false, returnState = false) => { + if (!input || typeof input !== 'string') { + throw new TypeError('Expected a non-empty string'); } - var cache = reusify(Task) - var queueHead = null - var queueTail = null - var _running = 0 + let opts = options || {}; + let prepend = opts.contains ? '' : '^'; + let append = opts.contains ? '' : '$'; + let state = { negated: false, fastpaths: true }; + let prefix = ''; + let output; - var self = { - push: push, - drain: noop, - saturated: noop, - pause: pause, - paused: false, - concurrency: concurrency, - running: running, - resume: resume, - idle: idle, - length: length, - unshift: unshift, - empty: noop, - kill: kill, - killAndDrain: killAndDrain + if (input.startsWith('./')) { + input = input.slice(2); + prefix = state.prefix = './'; } - return self - - function running () { - return _running + if (opts.fastpaths !== false && (input[0] === '.' || input[0] === '*')) { + output = parse.fastpaths(input, options); } - function pause () { - self.paused = true + if (output === void 0) { + state = picomatch.parse(input, options); + state.prefix = prefix + (state.prefix || ''); + output = state.output; } - function length () { - var current = queueHead - var counter = 0 - - while (current) { - current = current.next - counter++ - } - - return counter + if (returnOutput === true) { + return output; } - function resume () { - if (!self.paused) return - self.paused = false - for (var i = 0; i < self.concurrency; i++) { - _running++ - release() - } + let source = `${prepend}(?:${output})${append}`; + if (state && state.negated === true) { + source = `^(?!${source}).*$`; } - function idle () { - return _running === 0 && self.length() === 0 + let regex = picomatch.toRegex(source, options); + if (returnState === true) { + regex.state = state; } - function push (value, done) { - var current = cache.get() + return regex; +}; - current.context = context - current.release = release - current.value = value - current.callback = done || noop +/** + * Create a regular expression from the given regex source string. + * + * ```js + * const picomatch = require('picomatch'); + * // picomatch.toRegex(source[, options]); + * + * const { output } = picomatch.parse('*.js'); + * console.log(picomatch.toRegex(output)); + * //=> /^(?:(?!\.)(?=.)[^/]*?\.js)$/ + * ``` + * @param {String} `source` Regular expression source string. + * @param {Object} `options` + * @return {RegExp} + * @api public + */ - if (_running === self.concurrency || self.paused) { - if (queueTail) { - queueTail.next = current - queueTail = current - } else { - queueHead = current - queueTail = current - self.saturated() - } - } else { - _running++ - worker.call(context, current.value, current.worked) - } +picomatch.toRegex = (source, options) => { + try { + let opts = options || {}; + return new RegExp(source, opts.flags || (opts.nocase ? 'i' : '')); + } catch (err) { + if (options && options.debug === true) throw err; + return /$^/; } +}; - function unshift (value, done) { - var current = cache.get() +/** + * Picomatch constants. + * @return {Object} + */ - current.context = context - current.release = release - current.value = value - current.callback = done || noop +picomatch.constants = __webpack_require__(623); - if (_running === self.concurrency || self.paused) { - if (queueHead) { - current.next = queueHead - queueHead = current - } else { - queueHead = current - queueTail = current - self.saturated() - } - } else { - _running++ - worker.call(context, current.value, current.worked) - } - } +/** + * Expose "picomatch" + */ - function release (holder) { - if (holder) { - cache.release(holder) - } - var next = queueHead - if (next) { - if (!self.paused) { - if (queueTail === queueHead) { - queueTail = null - } - queueHead = next.next - next.next = null - worker.call(context, next.value, next.worked) - if (queueTail === null) { - self.empty() - } - } else { - _running-- - } - } else if (--_running === 0) { - self.drain() - } - } +module.exports = picomatch; - function kill () { - queueHead = null - queueTail = null - self.drain = noop - } - function killAndDrain () { - queueHead = null - queueTail = null - self.drain() - self.drain = noop - } -} +/***/ }), +/* 621 */ +/***/ (function(module, exports, __webpack_require__) { -function noop () {} +"use strict"; -function Task () { - this.value = null - this.callback = noop - this.next = null - this.release = noop - this.context = null - var self = this +const utils = __webpack_require__(622); - this.worked = function worked (err, result) { - var callback = self.callback - self.value = null - self.callback = noop - callback.call(self.context, err, result) - self.release(self) - } -} +const { + CHAR_ASTERISK, /* * */ + CHAR_AT, /* @ */ + CHAR_BACKWARD_SLASH, /* \ */ + CHAR_COMMA, /* , */ + CHAR_DOT, /* . */ + CHAR_EXCLAMATION_MARK, /* ! */ + CHAR_FORWARD_SLASH, /* / */ + CHAR_LEFT_CURLY_BRACE, /* { */ + CHAR_LEFT_PARENTHESES, /* ( */ + CHAR_LEFT_SQUARE_BRACKET, /* [ */ + CHAR_PLUS, /* + */ + CHAR_QUESTION_MARK, /* ? */ + CHAR_RIGHT_CURLY_BRACE, /* } */ + CHAR_RIGHT_PARENTHESES, /* ) */ + CHAR_RIGHT_SQUARE_BRACKET /* ] */ +} = __webpack_require__(623); -module.exports = fastqueue +const isPathSeparator = code => { + return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH; +}; +/** + * Quickly scans a glob pattern and returns an object with a handful of + * useful properties, like `isGlob`, `path` (the leading non-glob, if it exists), + * `glob` (the actual pattern), and `negated` (true if the path starts with `!`). + * + * ```js + * const pm = require('picomatch'); + * console.log(pm.scan('foo/bar/*.js')); + * { isGlob: true, input: 'foo/bar/*.js', base: 'foo/bar', glob: '*.js' } + * ``` + * @param {String} `str` + * @param {Object} `options` + * @return {Object} Returns an object with tokens and regex source string. + * @api public + */ -/***/ }), -/* 641 */ -/***/ (function(module, exports, __webpack_require__) { +module.exports = (input, options) => { + let opts = options || {}; + let length = input.length - 1; + let index = -1; + let start = 0; + let lastIndex = 0; + let isGlob = false; + let backslashes = false; + let negated = false; + let braces = 0; + let prev; + let code; -"use strict"; + let braceEscaped = false; + let eos = () => index >= length; + let advance = () => { + prev = code; + return input.charCodeAt(++index); + }; -function reusify (Constructor) { - var head = new Constructor() - var tail = head + while (index < length) { + code = advance(); + let next; - function get () { - var current = head + if (code === CHAR_BACKWARD_SLASH) { + backslashes = true; + next = advance(); - if (current.next) { - head = current.next - } else { - head = new Constructor() - tail = head + if (next === CHAR_LEFT_CURLY_BRACE) { + braceEscaped = true; + } + continue; } - current.next = null + if (braceEscaped === true || code === CHAR_LEFT_CURLY_BRACE) { + braces++; - return current - } + while (!eos() && (next = advance())) { + if (next === CHAR_BACKWARD_SLASH) { + backslashes = true; + next = advance(); + continue; + } - function release (obj) { - tail.next = obj - tail = obj - } + if (next === CHAR_LEFT_CURLY_BRACE) { + braces++; + continue; + } - return { - get: get, - release: release - } -} + if (!braceEscaped && next === CHAR_DOT && (next = advance()) === CHAR_DOT) { + isGlob = true; + break; + } -module.exports = reusify + if (!braceEscaped && next === CHAR_COMMA) { + isGlob = true; + break; + } + if (next === CHAR_RIGHT_CURLY_BRACE) { + braces--; + if (braces === 0) { + braceEscaped = false; + break; + } + } + } + } -/***/ }), -/* 642 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -function isFatalError(settings, error) { - if (settings.errorFilter === null) { - return true; - } - return !settings.errorFilter(error); -} -exports.isFatalError = isFatalError; -function isAppliedFilter(filter, value) { - return filter === null || filter(value); -} -exports.isAppliedFilter = isAppliedFilter; -function replacePathSegmentSeparator(filepath, separator) { - return filepath.split(/[\\\/]/).join(separator); -} -exports.replacePathSegmentSeparator = replacePathSegmentSeparator; -function joinPathSegments(a, b, separator) { - if (a === '') { - return b; - } - return a + separator + b; -} -exports.joinPathSegments = joinPathSegments; + if (code === CHAR_FORWARD_SLASH) { + if (prev === CHAR_DOT && index === (start + 1)) { + start += 2; + continue; + } + lastIndex = index + 1; + continue; + } -/***/ }), -/* 643 */ -/***/ (function(module, exports, __webpack_require__) { + if (code === CHAR_ASTERISK) { + isGlob = true; + break; + } -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const common = __webpack_require__(642); -class Reader { - constructor(_root, _settings) { - this._root = _root; - this._settings = _settings; - this._root = common.replacePathSegmentSeparator(_root, _settings.pathSegmentSeparator); - } -} -exports.default = Reader; + if (code === CHAR_ASTERISK || code === CHAR_QUESTION_MARK) { + isGlob = true; + break; + } + if (code === CHAR_LEFT_SQUARE_BRACKET) { + while (!eos() && (next = advance())) { + if (next === CHAR_BACKWARD_SLASH) { + backslashes = true; + next = advance(); + continue; + } -/***/ }), -/* 644 */ -/***/ (function(module, exports, __webpack_require__) { + if (next === CHAR_RIGHT_SQUARE_BRACKET) { + isGlob = true; + break; + } + } + } -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const stream_1 = __webpack_require__(27); -const async_1 = __webpack_require__(630); -class StreamProvider { - constructor(_root, _settings) { - this._root = _root; - this._settings = _settings; - this._reader = new async_1.default(this._root, this._settings); - this._stream = new stream_1.Readable({ - objectMode: true, - read: () => { }, - destroy: this._reader.destroy.bind(this._reader) - }); - } - read() { - this._reader.onError((error) => { - this._stream.emit('error', error); - }); - this._reader.onEntry((entry) => { - this._stream.push(entry); - }); - this._reader.onEnd(() => { - this._stream.push(null); - }); - this._reader.read(); - return this._stream; - } -} -exports.default = StreamProvider; + let isExtglobChar = code === CHAR_PLUS + || code === CHAR_AT + || code === CHAR_EXCLAMATION_MARK; + if (isExtglobChar && input.charCodeAt(index + 1) === CHAR_LEFT_PARENTHESES) { + isGlob = true; + break; + } -/***/ }), -/* 645 */ -/***/ (function(module, exports, __webpack_require__) { + if (code === CHAR_EXCLAMATION_MARK && index === start) { + negated = true; + start++; + continue; + } -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const sync_1 = __webpack_require__(646); -class SyncProvider { - constructor(_root, _settings) { - this._root = _root; - this._settings = _settings; - this._reader = new sync_1.default(this._root, this._settings); - } - read() { - return this._reader.read(); - } -} -exports.default = SyncProvider; + if (code === CHAR_LEFT_PARENTHESES) { + while (!eos() && (next = advance())) { + if (next === CHAR_BACKWARD_SLASH) { + backslashes = true; + next = advance(); + continue; + } + if (next === CHAR_RIGHT_PARENTHESES) { + isGlob = true; + break; + } + } + } -/***/ }), -/* 646 */ -/***/ (function(module, exports, __webpack_require__) { + if (isGlob) { + break; + } + } -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const fsScandir = __webpack_require__(631); -const common = __webpack_require__(642); -const reader_1 = __webpack_require__(643); -class SyncReader extends reader_1.default { - constructor() { - super(...arguments); - this._scandir = fsScandir.scandirSync; - this._storage = new Set(); - this._queue = new Set(); - } - read() { - this._pushToQueue(this._root, this._settings.basePath); - this._handleQueue(); - return Array.from(this._storage); - } - _pushToQueue(dir, base) { - this._queue.add({ dir, base }); - } - _handleQueue() { - for (const item of this._queue.values()) { - this._handleDirectory(item.dir, item.base); - } - } - _handleDirectory(dir, base) { - try { - const entries = this._scandir(dir, this._settings.fsScandirSettings); - for (const entry of entries) { - this._handleEntry(entry, base); - } - } - catch (error) { - this._handleError(error); - } - } - _handleError(error) { - if (!common.isFatalError(this._settings, error)) { - return; - } - throw error; - } - _handleEntry(entry, base) { - const fullpath = entry.path; - if (base !== undefined) { - entry.path = common.joinPathSegments(base, entry.name, this._settings.pathSegmentSeparator); - } - if (common.isAppliedFilter(this._settings.entryFilter, entry)) { - this._pushToStorage(entry); - } - if (entry.dirent.isDirectory() && common.isAppliedFilter(this._settings.deepFilter, entry)) { - this._pushToQueue(fullpath, entry.path); - } - } - _pushToStorage(entry) { - this._storage.add(entry); - } -} -exports.default = SyncReader; + let prefix = ''; + let orig = input; + let base = input; + let glob = ''; + if (start > 0) { + prefix = input.slice(0, start); + input = input.slice(start); + lastIndex -= start; + } -/***/ }), -/* 647 */ -/***/ (function(module, exports, __webpack_require__) { + if (base && isGlob === true && lastIndex > 0) { + base = input.slice(0, lastIndex); + glob = input.slice(lastIndex); + } else if (isGlob === true) { + base = ''; + glob = input; + } else { + base = input; + } -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const path = __webpack_require__(16); -const fsScandir = __webpack_require__(631); -class Settings { - constructor(_options = {}) { - this._options = _options; - this.basePath = this._getValue(this._options.basePath, undefined); - this.concurrency = this._getValue(this._options.concurrency, Infinity); - this.deepFilter = this._getValue(this._options.deepFilter, null); - this.entryFilter = this._getValue(this._options.entryFilter, null); - this.errorFilter = this._getValue(this._options.errorFilter, null); - this.pathSegmentSeparator = this._getValue(this._options.pathSegmentSeparator, path.sep); - this.fsScandirSettings = new fsScandir.Settings({ - followSymbolicLinks: this._options.followSymbolicLinks, - fs: this._options.fs, - pathSegmentSeparator: this._options.pathSegmentSeparator, - stats: this._options.stats, - throwErrorOnBrokenSymbolicLink: this._options.throwErrorOnBrokenSymbolicLink - }); - } - _getValue(option, value) { - return option === undefined ? value : option; - } -} -exports.default = Settings; + if (base && base !== '' && base !== '/' && base !== input) { + if (isPathSeparator(base.charCodeAt(base.length - 1))) { + base = base.slice(0, -1); + } + } + if (opts.unescape === true) { + if (glob) glob = utils.removeBackslashes(glob); -/***/ }), -/* 648 */ -/***/ (function(module, exports, __webpack_require__) { + if (base && backslashes === true) { + base = utils.removeBackslashes(base); + } + } -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const path = __webpack_require__(16); -const fsStat = __webpack_require__(623); -const utils = __webpack_require__(594); -class Reader { - constructor(_settings) { - this._settings = _settings; - this._fsStatSettings = new fsStat.Settings({ - followSymbolicLink: this._settings.followSymbolicLinks, - fs: this._settings.fs, - throwErrorOnBrokenSymbolicLink: this._settings.followSymbolicLinks - }); - } - _getFullEntryPath(filepath) { - return path.resolve(this._settings.cwd, filepath); - } - _makeEntry(stats, pattern) { - const entry = { - name: pattern, - path: pattern, - dirent: utils.fs.createDirentFromStats(pattern, stats) - }; - if (this._settings.stats) { - entry.stats = stats; - } - return entry; - } - _isFatalError(error) { - return !utils.errno.isEnoentCodeError(error) && !this._settings.suppressErrors; - } -} -exports.default = Reader; + return { prefix, input: orig, base, glob, negated, isGlob }; +}; /***/ }), -/* 649 */ +/* 622 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const path = __webpack_require__(16); -const deep_1 = __webpack_require__(650); -const entry_1 = __webpack_require__(651); -const error_1 = __webpack_require__(652); -const entry_2 = __webpack_require__(653); -class Provider { - constructor(_settings) { - this._settings = _settings; - this.errorFilter = new error_1.default(this._settings); - this.entryFilter = new entry_1.default(this._settings, this._getMicromatchOptions()); - this.deepFilter = new deep_1.default(this._settings, this._getMicromatchOptions()); - this.entryTransformer = new entry_2.default(this._settings); - } - _getRootDirectory(task) { - return path.resolve(this._settings.cwd, task.base); - } - _getReaderOptions(task) { - const basePath = task.base === '.' ? '' : task.base; - return { - basePath, - pathSegmentSeparator: '/', - concurrency: this._settings.concurrency, - deepFilter: this.deepFilter.getFilter(basePath, task.positive, task.negative), - entryFilter: this.entryFilter.getFilter(task.positive, task.negative), - errorFilter: this.errorFilter.getFilter(), - followSymbolicLinks: this._settings.followSymbolicLinks, - fs: this._settings.fs, - stats: this._settings.stats, - throwErrorOnBrokenSymbolicLink: this._settings.throwErrorOnBrokenSymbolicLink, - transform: this.entryTransformer.getTransformer() - }; - } - _getMicromatchOptions() { - return { - dot: this._settings.dot, - matchBase: this._settings.baseNameMatch, - nobrace: !this._settings.braceExpansion, - nocase: !this._settings.caseSensitiveMatch, - noext: !this._settings.extglob, - noglobstar: !this._settings.globstar, - posix: true, - strictSlashes: false - }; - } -} -exports.default = Provider; -/***/ }), -/* 650 */ -/***/ (function(module, exports, __webpack_require__) { +const path = __webpack_require__(16); +const win32 = process.platform === 'win32'; +const { + REGEX_SPECIAL_CHARS, + REGEX_SPECIAL_CHARS_GLOBAL, + REGEX_REMOVE_BACKSLASH +} = __webpack_require__(623); -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const utils = __webpack_require__(594); -class DeepFilter { - constructor(_settings, _micromatchOptions) { - this._settings = _settings; - this._micromatchOptions = _micromatchOptions; - } - getFilter(basePath, positive, negative) { - const maxPatternDepth = this._getMaxPatternDepth(positive); - const negativeRe = this._getNegativePatternsRe(negative); - return (entry) => this._filter(basePath, entry, negativeRe, maxPatternDepth); - } - _getMaxPatternDepth(patterns) { - const globstar = patterns.some(utils.pattern.hasGlobStar); - return globstar ? Infinity : utils.pattern.getMaxNaivePatternsDepth(patterns); - } - _getNegativePatternsRe(patterns) { - const affectDepthOfReadingPatterns = patterns.filter(utils.pattern.isAffectDepthOfReadingPattern); - return utils.pattern.convertPatternsToRe(affectDepthOfReadingPatterns, this._micromatchOptions); - } - _filter(basePath, entry, negativeRe, maxPatternDepth) { - const depth = this._getEntryDepth(basePath, entry.path); - if (this._isSkippedByDeep(depth)) { - return false; - } - if (this._isSkippedByMaxPatternDepth(depth, maxPatternDepth)) { - return false; - } - if (this._isSkippedSymbolicLink(entry)) { - return false; - } - if (this._isSkippedDotDirectory(entry)) { - return false; - } - return this._isSkippedByNegativePatterns(entry, negativeRe); - } - _getEntryDepth(basePath, entryPath) { - const basePathDepth = basePath.split('/').length; - const entryPathDepth = entryPath.split('/').length; - return entryPathDepth - (basePath === '' ? 0 : basePathDepth); - } - _isSkippedByDeep(entryDepth) { - return entryDepth >= this._settings.deep; - } - _isSkippedByMaxPatternDepth(entryDepth, maxPatternDepth) { - return !this._settings.baseNameMatch && maxPatternDepth !== Infinity && entryDepth > maxPatternDepth; - } - _isSkippedSymbolicLink(entry) { - return !this._settings.followSymbolicLinks && entry.dirent.isSymbolicLink(); - } - _isSkippedDotDirectory(entry) { - return !this._settings.dot && entry.name.startsWith('.'); - } - _isSkippedByNegativePatterns(entry, negativeRe) { - return !utils.pattern.matchAny(entry.path, negativeRe); - } -} -exports.default = DeepFilter; +exports.isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val); +exports.hasRegexChars = str => REGEX_SPECIAL_CHARS.test(str); +exports.isRegexChar = str => str.length === 1 && exports.hasRegexChars(str); +exports.escapeRegex = str => str.replace(REGEX_SPECIAL_CHARS_GLOBAL, '\\$1'); +exports.toPosixSlashes = str => str.replace(/\\/g, '/'); +exports.removeBackslashes = str => { + return str.replace(REGEX_REMOVE_BACKSLASH, match => { + return match === '\\' ? '' : match; + }); +} -/***/ }), -/* 651 */ -/***/ (function(module, exports, __webpack_require__) { +exports.supportsLookbehinds = () => { + let segs = process.version.slice(1).split('.'); + if (segs.length === 3 && +segs[0] >= 9 || (+segs[0] === 8 && +segs[1] >= 10)) { + return true; + } + return false; +}; -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const utils = __webpack_require__(594); -class EntryFilter { - constructor(_settings, _micromatchOptions) { - this._settings = _settings; - this._micromatchOptions = _micromatchOptions; - this.index = new Map(); - } - getFilter(positive, negative) { - const positiveRe = utils.pattern.convertPatternsToRe(positive, this._micromatchOptions); - const negativeRe = utils.pattern.convertPatternsToRe(negative, this._micromatchOptions); - return (entry) => this._filter(entry, positiveRe, negativeRe); - } - _filter(entry, positiveRe, negativeRe) { - if (this._settings.unique) { - if (this._isDuplicateEntry(entry)) { - return false; - } - this._createIndexRecord(entry); - } - if (this._onlyFileFilter(entry) || this._onlyDirectoryFilter(entry)) { - return false; - } - if (this._isSkippedByAbsoluteNegativePatterns(entry, negativeRe)) { - return false; - } - const filepath = this._settings.baseNameMatch ? entry.name : entry.path; - return this._isMatchToPatterns(filepath, positiveRe) && !this._isMatchToPatterns(entry.path, negativeRe); - } - _isDuplicateEntry(entry) { - return this.index.has(entry.path); - } - _createIndexRecord(entry) { - this.index.set(entry.path, undefined); - } - _onlyFileFilter(entry) { - return this._settings.onlyFiles && !entry.dirent.isFile(); - } - _onlyDirectoryFilter(entry) { - return this._settings.onlyDirectories && !entry.dirent.isDirectory(); - } - _isSkippedByAbsoluteNegativePatterns(entry, negativeRe) { - if (!this._settings.absolute) { - return false; - } - const fullpath = utils.path.makeAbsolute(this._settings.cwd, entry.path); - return this._isMatchToPatterns(fullpath, negativeRe); - } - _isMatchToPatterns(filepath, patternsRe) { - return utils.pattern.matchAny(filepath, patternsRe); - } -} -exports.default = EntryFilter; +exports.isWindows = options => { + if (options && typeof options.windows === 'boolean') { + return options.windows; + } + return win32 === true || path.sep === '\\'; +}; + +exports.escapeLast = (input, char, lastIdx) => { + let idx = input.lastIndexOf(char, lastIdx); + if (idx === -1) return input; + if (input[idx - 1] === '\\') return exports.escapeLast(input, char, idx - 1); + return input.slice(0, idx) + '\\' + input.slice(idx); +}; /***/ }), -/* 652 */ +/* 623 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const utils = __webpack_require__(594); -class ErrorFilter { - constructor(_settings) { - this._settings = _settings; - } - getFilter() { - return (error) => this._isNonFatalError(error); - } - _isNonFatalError(error) { - return utils.errno.isEnoentCodeError(error) || this._settings.suppressErrors; - } -} -exports.default = ErrorFilter; + + +const path = __webpack_require__(16); +const WIN_SLASH = '\\\\/'; +const WIN_NO_SLASH = `[^${WIN_SLASH}]`; + +/** + * Posix glob regex + */ + +const DOT_LITERAL = '\\.'; +const PLUS_LITERAL = '\\+'; +const QMARK_LITERAL = '\\?'; +const SLASH_LITERAL = '\\/'; +const ONE_CHAR = '(?=.)'; +const QMARK = '[^/]'; +const END_ANCHOR = `(?:${SLASH_LITERAL}|$)`; +const START_ANCHOR = `(?:^|${SLASH_LITERAL})`; +const DOTS_SLASH = `${DOT_LITERAL}{1,2}${END_ANCHOR}`; +const NO_DOT = `(?!${DOT_LITERAL})`; +const NO_DOTS = `(?!${START_ANCHOR}${DOTS_SLASH})`; +const NO_DOT_SLASH = `(?!${DOT_LITERAL}{0,1}${END_ANCHOR})`; +const NO_DOTS_SLASH = `(?!${DOTS_SLASH})`; +const QMARK_NO_DOT = `[^.${SLASH_LITERAL}]`; +const STAR = `${QMARK}*?`; + +const POSIX_CHARS = { + DOT_LITERAL, + PLUS_LITERAL, + QMARK_LITERAL, + SLASH_LITERAL, + ONE_CHAR, + QMARK, + END_ANCHOR, + DOTS_SLASH, + NO_DOT, + NO_DOTS, + NO_DOT_SLASH, + NO_DOTS_SLASH, + QMARK_NO_DOT, + STAR, + START_ANCHOR +}; + +/** + * Windows glob regex + */ + +const WINDOWS_CHARS = { + ...POSIX_CHARS, + + SLASH_LITERAL: `[${WIN_SLASH}]`, + QMARK: WIN_NO_SLASH, + STAR: `${WIN_NO_SLASH}*?`, + DOTS_SLASH: `${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$)`, + NO_DOT: `(?!${DOT_LITERAL})`, + NO_DOTS: `(?!(?:^|[${WIN_SLASH}])${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`, + NO_DOT_SLASH: `(?!${DOT_LITERAL}{0,1}(?:[${WIN_SLASH}]|$))`, + NO_DOTS_SLASH: `(?!${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`, + QMARK_NO_DOT: `[^.${WIN_SLASH}]`, + START_ANCHOR: `(?:^|[${WIN_SLASH}])`, + END_ANCHOR: `(?:[${WIN_SLASH}]|$)` +}; + +/** + * POSIX Bracket Regex + */ + +const POSIX_REGEX_SOURCE = { + alnum: 'a-zA-Z0-9', + alpha: 'a-zA-Z', + ascii: '\\x00-\\x7F', + blank: ' \\t', + cntrl: '\\x00-\\x1F\\x7F', + digit: '0-9', + graph: '\\x21-\\x7E', + lower: 'a-z', + print: '\\x20-\\x7E ', + punct: '\\-!"#$%&\'()\\*+,./:;<=>?@[\\]^_`{|}~', + space: ' \\t\\r\\n\\v\\f', + upper: 'A-Z', + word: 'A-Za-z0-9_', + xdigit: 'A-Fa-f0-9' +}; + +module.exports = { + MAX_LENGTH: 1024 * 64, + POSIX_REGEX_SOURCE, + + // regular expressions + REGEX_BACKSLASH: /\\(?![*+?^${}(|)[\]])/g, + REGEX_NON_SPECIAL_CHAR: /^[^@![\].,$*+?^{}()|\\/]+/, + REGEX_SPECIAL_CHARS: /[-*+?.^${}(|)[\]]/, + REGEX_SPECIAL_CHARS_BACKREF: /(\\?)((\W)(\3*))/g, + REGEX_SPECIAL_CHARS_GLOBAL: /([-*+?.^${}(|)[\]])/g, + REGEX_REMOVE_BACKSLASH: /(?:\[.*?[^\\]\]|\\(?=.))/g, + + // Replace globs with equivalent patterns to reduce parsing time. + REPLACEMENTS: { + '***': '*', + '**/**': '**', + '**/**/**': '**' + }, + + // Digits + CHAR_0: 48, /* 0 */ + CHAR_9: 57, /* 9 */ + + // Alphabet chars. + CHAR_UPPERCASE_A: 65, /* A */ + CHAR_LOWERCASE_A: 97, /* a */ + CHAR_UPPERCASE_Z: 90, /* Z */ + CHAR_LOWERCASE_Z: 122, /* z */ + + CHAR_LEFT_PARENTHESES: 40, /* ( */ + CHAR_RIGHT_PARENTHESES: 41, /* ) */ + + CHAR_ASTERISK: 42, /* * */ + + // Non-alphabetic chars. + CHAR_AMPERSAND: 38, /* & */ + CHAR_AT: 64, /* @ */ + CHAR_BACKWARD_SLASH: 92, /* \ */ + CHAR_CARRIAGE_RETURN: 13, /* \r */ + CHAR_CIRCUMFLEX_ACCENT: 94, /* ^ */ + CHAR_COLON: 58, /* : */ + CHAR_COMMA: 44, /* , */ + CHAR_DOT: 46, /* . */ + CHAR_DOUBLE_QUOTE: 34, /* " */ + CHAR_EQUAL: 61, /* = */ + CHAR_EXCLAMATION_MARK: 33, /* ! */ + CHAR_FORM_FEED: 12, /* \f */ + CHAR_FORWARD_SLASH: 47, /* / */ + CHAR_GRAVE_ACCENT: 96, /* ` */ + CHAR_HASH: 35, /* # */ + CHAR_HYPHEN_MINUS: 45, /* - */ + CHAR_LEFT_ANGLE_BRACKET: 60, /* < */ + CHAR_LEFT_CURLY_BRACE: 123, /* { */ + CHAR_LEFT_SQUARE_BRACKET: 91, /* [ */ + CHAR_LINE_FEED: 10, /* \n */ + CHAR_NO_BREAK_SPACE: 160, /* \u00A0 */ + CHAR_PERCENT: 37, /* % */ + CHAR_PLUS: 43, /* + */ + CHAR_QUESTION_MARK: 63, /* ? */ + CHAR_RIGHT_ANGLE_BRACKET: 62, /* > */ + CHAR_RIGHT_CURLY_BRACE: 125, /* } */ + CHAR_RIGHT_SQUARE_BRACKET: 93, /* ] */ + CHAR_SEMICOLON: 59, /* ; */ + CHAR_SINGLE_QUOTE: 39, /* ' */ + CHAR_SPACE: 32, /* */ + CHAR_TAB: 9, /* \t */ + CHAR_UNDERSCORE: 95, /* _ */ + CHAR_VERTICAL_LINE: 124, /* | */ + CHAR_ZERO_WIDTH_NOBREAK_SPACE: 65279, /* \uFEFF */ + + SEP: path.sep, + + /** + * Create EXTGLOB_CHARS + */ + + extglobChars(chars) { + return { + '!': { type: 'negate', open: '(?:(?!(?:', close: `))${chars.STAR})` }, + '?': { type: 'qmark', open: '(?:', close: ')?' }, + '+': { type: 'plus', open: '(?:', close: ')+' }, + '*': { type: 'star', open: '(?:', close: ')*' }, + '@': { type: 'at', open: '(?:', close: ')' } + }; + }, + + /** + * Create GLOB_CHARS + */ + + globChars(win32) { + return win32 === true ? WINDOWS_CHARS : POSIX_CHARS; + } +}; + + +/***/ }), +/* 624 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +const utils = __webpack_require__(622); +const constants = __webpack_require__(623); + +/** + * Constants + */ + +const { + MAX_LENGTH, + POSIX_REGEX_SOURCE, + REGEX_NON_SPECIAL_CHAR, + REGEX_SPECIAL_CHARS_BACKREF, + REPLACEMENTS +} = constants; + +/** + * Helpers + */ + +const expandRange = (args, options) => { + if (typeof options.expandRange === 'function') { + return options.expandRange(...args, options); + } + + args.sort(); + let value = `[${args.join('-')}]`; + + try { + /* eslint-disable no-new */ + new RegExp(value); + } catch (ex) { + return args.map(v => utils.escapeRegex(v)).join('..'); + } + + return value; +}; + +const negate = state => { + let count = 1; + + while (state.peek() === '!' && (state.peek(2) !== '(' || state.peek(3) === '?')) { + state.advance(); + state.start++; + count++; + } + + if (count % 2 === 0) { + return false; + } + + state.negated = true; + state.start++; + return true; +}; + +/** + * Create the message for a syntax error + */ + +const syntaxError = (type, char) => { + return `Missing ${type}: "${char}" - use "\\\\${char}" to match literal characters`; +}; + +/** + * Parse the given input string. + * @param {String} input + * @param {Object} options + * @return {Object} + */ + +const parse = (input, options) => { + if (typeof input !== 'string') { + throw new TypeError('Expected a string'); + } + + input = REPLACEMENTS[input] || input; + + let opts = { ...options }; + let max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH; + let len = input.length; + if (len > max) { + throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`); + } + + let bos = { type: 'bos', value: '', output: opts.prepend || '' }; + let tokens = [bos]; + + let capture = opts.capture ? '' : '?:'; + let win32 = utils.isWindows(options); + + // create constants based on platform, for windows or posix + const PLATFORM_CHARS = constants.globChars(win32); + const EXTGLOB_CHARS = constants.extglobChars(PLATFORM_CHARS); + + const { + DOT_LITERAL, + PLUS_LITERAL, + SLASH_LITERAL, + ONE_CHAR, + DOTS_SLASH, + NO_DOT, + NO_DOT_SLASH, + NO_DOTS_SLASH, + QMARK, + QMARK_NO_DOT, + STAR, + START_ANCHOR + } = PLATFORM_CHARS; + + const globstar = (opts) => { + return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`; + }; + + let nodot = opts.dot ? '' : NO_DOT; + let star = opts.bash === true ? globstar(opts) : STAR; + let qmarkNoDot = opts.dot ? QMARK : QMARK_NO_DOT; + + if (opts.capture) { + star = `(${star})`; + } + + // minimatch options support + if (typeof opts.noext === 'boolean') { + opts.noextglob = opts.noext; + } + + let state = { + index: -1, + start: 0, + consumed: '', + output: '', + backtrack: false, + brackets: 0, + braces: 0, + parens: 0, + quotes: 0, + tokens + }; + + let extglobs = []; + let stack = []; + let prev = bos; + let value; + + /** + * Tokenizing helpers + */ + + const eos = () => state.index === len - 1; + const peek = state.peek = (n = 1) => input[state.index + n]; + const advance = state.advance = () => input[++state.index]; + const append = token => { + state.output += token.output != null ? token.output : token.value; + state.consumed += token.value || ''; + }; + + const increment = type => { + state[type]++; + stack.push(type); + }; + + const decrement = type => { + state[type]--; + stack.pop(); + }; + + /** + * Push tokens onto the tokens array. This helper speeds up + * tokenizing by 1) helping us avoid backtracking as much as possible, + * and 2) helping us avoid creating extra tokens when consecutive + * characters are plain text. This improves performance and simplifies + * lookbehinds. + */ + + const push = tok => { + if (prev.type === 'globstar') { + let isBrace = state.braces > 0 && (tok.type === 'comma' || tok.type === 'brace'); + let isExtglob = extglobs.length && (tok.type === 'pipe' || tok.type === 'paren'); + if (tok.type !== 'slash' && tok.type !== 'paren' && !isBrace && !isExtglob) { + state.output = state.output.slice(0, -prev.output.length); + prev.type = 'star'; + prev.value = '*'; + prev.output = star; + state.output += prev.output; + } + } + + if (extglobs.length && tok.type !== 'paren' && !EXTGLOB_CHARS[tok.value]) { + extglobs[extglobs.length - 1].inner += tok.value; + } + + if (tok.value || tok.output) append(tok); + if (prev && prev.type === 'text' && tok.type === 'text') { + prev.value += tok.value; + return; + } + + tok.prev = prev; + tokens.push(tok); + prev = tok; + }; + + const extglobOpen = (type, value) => { + let token = { ...EXTGLOB_CHARS[value], conditions: 1, inner: '' }; + + token.prev = prev; + token.parens = state.parens; + token.output = state.output; + let output = (opts.capture ? '(' : '') + token.open; + + push({ type, value, output: state.output ? '' : ONE_CHAR }); + push({ type: 'paren', extglob: true, value: advance(), output }); + increment('parens'); + extglobs.push(token); + }; + + const extglobClose = token => { + let output = token.close + (opts.capture ? ')' : ''); + + if (token.type === 'negate') { + let extglobStar = star; + + if (token.inner && token.inner.length > 1 && token.inner.includes('/')) { + extglobStar = globstar(opts); + } + + if (extglobStar !== star || eos() || /^\)+$/.test(input.slice(state.index + 1))) { + output = token.close = ')$))' + extglobStar; + } + + if (token.prev.type === 'bos' && eos()) { + state.negatedExtglob = true; + } + } + + push({ type: 'paren', extglob: true, value, output }); + decrement('parens'); + }; + + if (opts.fastpaths !== false && !/(^[*!]|[/{[()\]}"])/.test(input)) { + let backslashes = false; + + let output = input.replace(REGEX_SPECIAL_CHARS_BACKREF, (m, esc, chars, first, rest, index) => { + if (first === '\\') { + backslashes = true; + return m; + } + + if (first === '?') { + if (esc) { + return esc + first + (rest ? QMARK.repeat(rest.length) : ''); + } + if (index === 0) { + return qmarkNoDot + (rest ? QMARK.repeat(rest.length) : ''); + } + return QMARK.repeat(chars.length); + } + + if (first === '.') { + return DOT_LITERAL.repeat(chars.length); + } + + if (first === '*') { + if (esc) { + return esc + first + (rest ? star : ''); + } + return star; + } + return esc ? m : '\\' + m; + }); + + if (backslashes === true) { + if (opts.unescape === true) { + output = output.replace(/\\/g, ''); + } else { + output = output.replace(/\\+/g, m => { + return m.length % 2 === 0 ? '\\\\' : (m ? '\\' : ''); + }); + } + } + + state.output = output; + return state; + } + + /** + * Tokenize input until we reach end-of-string + */ + + while (!eos()) { + value = advance(); + + if (value === '\u0000') { + continue; + } + + /** + * Escaped characters + */ + + if (value === '\\') { + let next = peek(); + + if (next === '/' && opts.bash !== true) { + continue; + } + + if (next === '.' || next === ';') { + continue; + } + + if (!next) { + value += '\\'; + push({ type: 'text', value }); + continue; + } + + // collapse slashes to reduce potential for exploits + let match = /^\\+/.exec(input.slice(state.index + 1)); + let slashes = 0; + + if (match && match[0].length > 2) { + slashes = match[0].length; + state.index += slashes; + if (slashes % 2 !== 0) { + value += '\\'; + } + } + + if (opts.unescape === true) { + value = advance() || ''; + } else { + value += advance() || ''; + } + + if (state.brackets === 0) { + push({ type: 'text', value }); + continue; + } + } + + /** + * If we're inside a regex character class, continue + * until we reach the closing bracket. + */ + + if (state.brackets > 0 && (value !== ']' || prev.value === '[' || prev.value === '[^')) { + if (opts.posix !== false && value === ':') { + let inner = prev.value.slice(1); + if (inner.includes('[')) { + prev.posix = true; + + if (inner.includes(':')) { + let idx = prev.value.lastIndexOf('['); + let pre = prev.value.slice(0, idx); + let rest = prev.value.slice(idx + 2); + let posix = POSIX_REGEX_SOURCE[rest]; + if (posix) { + prev.value = pre + posix; + state.backtrack = true; + advance(); + + if (!bos.output && tokens.indexOf(prev) === 1) { + bos.output = ONE_CHAR; + } + continue; + } + } + } + } + + if ((value === '[' && peek() !== ':') || (value === '-' && peek() === ']')) { + value = '\\' + value; + } + + if (value === ']' && (prev.value === '[' || prev.value === '[^')) { + value = '\\' + value; + } + + if (opts.posix === true && value === '!' && prev.value === '[') { + value = '^'; + } + + prev.value += value; + append({ value }); + continue; + } + + /** + * If we're inside a quoted string, continue + * until we reach the closing double quote. + */ + + if (state.quotes === 1 && value !== '"') { + value = utils.escapeRegex(value); + prev.value += value; + append({ value }); + continue; + } + + /** + * Double quotes + */ + + if (value === '"') { + state.quotes = state.quotes === 1 ? 0 : 1; + if (opts.keepQuotes === true) { + push({ type: 'text', value }); + } + continue; + } + + /** + * Parentheses + */ + + if (value === '(') { + push({ type: 'paren', value }); + increment('parens'); + continue; + } + + if (value === ')') { + if (state.parens === 0 && opts.strictBrackets === true) { + throw new SyntaxError(syntaxError('opening', '(')); + } + + let extglob = extglobs[extglobs.length - 1]; + if (extglob && state.parens === extglob.parens + 1) { + extglobClose(extglobs.pop()); + continue; + } + + push({ type: 'paren', value, output: state.parens ? ')' : '\\)' }); + decrement('parens'); + continue; + } + + /** + * Brackets + */ + + if (value === '[') { + if (opts.nobracket === true || !input.slice(state.index + 1).includes(']')) { + if (opts.nobracket !== true && opts.strictBrackets === true) { + throw new SyntaxError(syntaxError('closing', ']')); + } + + value = '\\' + value; + } else { + increment('brackets'); + } + + push({ type: 'bracket', value }); + continue; + } + + if (value === ']') { + if (opts.nobracket === true || (prev && prev.type === 'bracket' && prev.value.length === 1)) { + push({ type: 'text', value, output: '\\' + value }); + continue; + } + + if (state.brackets === 0) { + if (opts.strictBrackets === true) { + throw new SyntaxError(syntaxError('opening', '[')); + } + + push({ type: 'text', value, output: '\\' + value }); + continue; + } + + decrement('brackets'); + + let prevValue = prev.value.slice(1); + if (prev.posix !== true && prevValue[0] === '^' && !prevValue.includes('/')) { + value = '/' + value; + } + + prev.value += value; + append({ value }); + + // when literal brackets are explicitly disabled + // assume we should match with a regex character class + if (opts.literalBrackets === false || utils.hasRegexChars(prevValue)) { + continue; + } + + let escaped = utils.escapeRegex(prev.value); + state.output = state.output.slice(0, -prev.value.length); + + // when literal brackets are explicitly enabled + // assume we should escape the brackets to match literal characters + if (opts.literalBrackets === true) { + state.output += escaped; + prev.value = escaped; + continue; + } + + // when the user specifies nothing, try to match both + prev.value = `(${capture}${escaped}|${prev.value})`; + state.output += prev.value; + continue; + } + + /** + * Braces + */ + + if (value === '{' && opts.nobrace !== true) { + push({ type: 'brace', value, output: '(' }); + increment('braces'); + continue; + } + + if (value === '}') { + if (opts.nobrace === true || state.braces === 0) { + push({ type: 'text', value, output: '\\' + value }); + continue; + } + + let output = ')'; + + if (state.dots === true) { + let arr = tokens.slice(); + let range = []; + + for (let i = arr.length - 1; i >= 0; i--) { + tokens.pop(); + if (arr[i].type === 'brace') { + break; + } + if (arr[i].type !== 'dots') { + range.unshift(arr[i].value); + } + } + + output = expandRange(range, opts); + state.backtrack = true; + } + + push({ type: 'brace', value, output }); + decrement('braces'); + continue; + } + + /** + * Pipes + */ + + if (value === '|') { + if (extglobs.length > 0) { + extglobs[extglobs.length - 1].conditions++; + } + push({ type: 'text', value }); + continue; + } + + /** + * Commas + */ + + if (value === ',') { + let output = value; + + if (state.braces > 0 && stack[stack.length - 1] === 'braces') { + output = '|'; + } + + push({ type: 'comma', value, output }); + continue; + } + + /** + * Slashes + */ + + if (value === '/') { + // if the beginning of the glob is "./", advance the start + // to the current index, and don't add the "./" characters + // to the state. This greatly simplifies lookbehinds when + // checking for BOS characters like "!" and "." (not "./") + if (prev.type === 'dot' && state.index === 1) { + state.start = state.index + 1; + state.consumed = ''; + state.output = ''; + tokens.pop(); + prev = bos; // reset "prev" to the first token + continue; + } + + push({ type: 'slash', value, output: SLASH_LITERAL }); + continue; + } + + /** + * Dots + */ + + if (value === '.') { + if (state.braces > 0 && prev.type === 'dot') { + if (prev.value === '.') prev.output = DOT_LITERAL; + prev.type = 'dots'; + prev.output += value; + prev.value += value; + state.dots = true; + continue; + } + + push({ type: 'dot', value, output: DOT_LITERAL }); + continue; + } + + /** + * Question marks + */ + + if (value === '?') { + if (prev && prev.type === 'paren') { + let next = peek(); + let output = value; + + if (next === '<' && !utils.supportsLookbehinds()) { + throw new Error('Node.js v10 or higher is required for regex lookbehinds'); + } + + if (prev.value === '(' && !/[!=<:]/.test(next) || (next === '<' && !/[!=]/.test(peek(2)))) { + output = '\\' + value; + } + + push({ type: 'text', value, output }); + continue; + } + + if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') { + extglobOpen('qmark', value); + continue; + } + + if (opts.dot !== true && (prev.type === 'slash' || prev.type === 'bos')) { + push({ type: 'qmark', value, output: QMARK_NO_DOT }); + continue; + } + + push({ type: 'qmark', value, output: QMARK }); + continue; + } + + /** + * Exclamation + */ + + if (value === '!') { + if (opts.noextglob !== true && peek() === '(') { + if (peek(2) !== '?' || !/[!=<:]/.test(peek(3))) { + extglobOpen('negate', value); + continue; + } + } + + if (opts.nonegate !== true && state.index === 0) { + negate(state); + continue; + } + } + + /** + * Plus + */ + + if (value === '+') { + if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') { + extglobOpen('plus', value); + continue; + } + + if (prev && (prev.type === 'bracket' || prev.type === 'paren' || prev.type === 'brace')) { + let output = prev.extglob === true ? '\\' + value : value; + push({ type: 'plus', value, output }); + continue; + } + + // use regex behavior inside parens + if (state.parens > 0 && opts.regex !== false) { + push({ type: 'plus', value }); + continue; + } + + push({ type: 'plus', value: PLUS_LITERAL }); + continue; + } + + /** + * Plain text + */ + + if (value === '@') { + if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') { + push({ type: 'at', value, output: '' }); + continue; + } + + push({ type: 'text', value }); + continue; + } + + /** + * Plain text + */ + + if (value !== '*') { + if (value === '$' || value === '^') { + value = '\\' + value; + } + + let match = REGEX_NON_SPECIAL_CHAR.exec(input.slice(state.index + 1)); + if (match) { + value += match[0]; + state.index += match[0].length; + } + + push({ type: 'text', value }); + continue; + } + + /** + * Stars + */ + + if (prev && (prev.type === 'globstar' || prev.star === true)) { + prev.type = 'star'; + prev.star = true; + prev.value += value; + prev.output = star; + state.backtrack = true; + state.consumed += value; + continue; + } + + if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') { + extglobOpen('star', value); + continue; + } + + if (prev.type === 'star') { + if (opts.noglobstar === true) { + state.consumed += value; + continue; + } + + let prior = prev.prev; + let before = prior.prev; + let isStart = prior.type === 'slash' || prior.type === 'bos'; + let afterStar = before && (before.type === 'star' || before.type === 'globstar'); + + if (opts.bash === true && (!isStart || (!eos() && peek() !== '/'))) { + push({ type: 'star', value, output: '' }); + continue; + } + + let isBrace = state.braces > 0 && (prior.type === 'comma' || prior.type === 'brace'); + let isExtglob = extglobs.length && (prior.type === 'pipe' || prior.type === 'paren'); + if (!isStart && prior.type !== 'paren' && !isBrace && !isExtglob) { + push({ type: 'star', value, output: '' }); + continue; + } + + // strip consecutive `/**/` + while (input.slice(state.index + 1, state.index + 4) === '/**') { + let after = input[state.index + 4]; + if (after && after !== '/') { + break; + } + state.consumed += '/**'; + state.index += 3; + } + + if (prior.type === 'bos' && eos()) { + prev.type = 'globstar'; + prev.value += value; + prev.output = globstar(opts); + state.output = prev.output; + state.consumed += value; + continue; + } + + if (prior.type === 'slash' && prior.prev.type !== 'bos' && !afterStar && eos()) { + state.output = state.output.slice(0, -(prior.output + prev.output).length); + prior.output = '(?:' + prior.output; + + prev.type = 'globstar'; + prev.output = globstar(opts) + '|$)'; + prev.value += value; + + state.output += prior.output + prev.output; + state.consumed += value; + continue; + } + + let next = peek(); + if (prior.type === 'slash' && prior.prev.type !== 'bos' && next === '/') { + let end = peek(2) !== void 0 ? '|$' : ''; + + state.output = state.output.slice(0, -(prior.output + prev.output).length); + prior.output = '(?:' + prior.output; + + prev.type = 'globstar'; + prev.output = `${globstar(opts)}${SLASH_LITERAL}|${SLASH_LITERAL}${end})`; + prev.value += value; + + state.output += prior.output + prev.output; + state.consumed += value + advance(); + + push({ type: 'slash', value, output: '' }); + continue; + } + + if (prior.type === 'bos' && next === '/') { + prev.type = 'globstar'; + prev.value += value; + prev.output = `(?:^|${SLASH_LITERAL}|${globstar(opts)}${SLASH_LITERAL})`; + state.output = prev.output; + state.consumed += value + advance(); + push({ type: 'slash', value, output: '' }); + continue; + } + + // remove single star from output + state.output = state.output.slice(0, -prev.output.length); + + // reset previous token to globstar + prev.type = 'globstar'; + prev.output = globstar(opts); + prev.value += value; + + // reset output with globstar + state.output += prev.output; + state.consumed += value; + continue; + } + + let token = { type: 'star', value, output: star }; + + if (opts.bash === true) { + token.output = '.*?'; + if (prev.type === 'bos' || prev.type === 'slash') { + token.output = nodot + token.output; + } + push(token); + continue; + } + + if (prev && (prev.type === 'bracket' || prev.type === 'paren') && opts.regex === true) { + token.output = value; + push(token); + continue; + } + + if (state.index === state.start || prev.type === 'slash' || prev.type === 'dot') { + if (prev.type === 'dot') { + state.output += NO_DOT_SLASH; + prev.output += NO_DOT_SLASH; + + } else if (opts.dot === true) { + state.output += NO_DOTS_SLASH; + prev.output += NO_DOTS_SLASH; + + } else { + state.output += nodot; + prev.output += nodot; + } + + if (peek() !== '*') { + state.output += ONE_CHAR; + prev.output += ONE_CHAR; + } + } + + push(token); + } + + while (state.brackets > 0) { + if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ']')); + state.output = utils.escapeLast(state.output, '['); + decrement('brackets'); + } + + while (state.parens > 0) { + if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ')')); + state.output = utils.escapeLast(state.output, '('); + decrement('parens'); + } + + while (state.braces > 0) { + if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', '}')); + state.output = utils.escapeLast(state.output, '{'); + decrement('braces'); + } + + if (opts.strictSlashes !== true && (prev.type === 'star' || prev.type === 'bracket')) { + push({ type: 'maybe_slash', value: '', output: `${SLASH_LITERAL}?` }); + } + + // rebuild the output if we had to backtrack at any point + if (state.backtrack === true) { + state.output = ''; + + for (let token of state.tokens) { + state.output += token.output != null ? token.output : token.value; + + if (token.suffix) { + state.output += token.suffix; + } + } + } + + return state; +}; + +/** + * Fast paths for creating regular expressions for common glob patterns. + * This can significantly speed up processing and has very little downside + * impact when none of the fast paths match. + */ + +parse.fastpaths = (input, options) => { + let opts = { ...options }; + let max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH; + let len = input.length; + if (len > max) { + throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`); + } + + input = REPLACEMENTS[input] || input; + let win32 = utils.isWindows(options); + + // create constants based on platform, for windows or posix + const { + DOT_LITERAL, + SLASH_LITERAL, + ONE_CHAR, + DOTS_SLASH, + NO_DOT, + NO_DOTS, + NO_DOTS_SLASH, + STAR, + START_ANCHOR + } = constants.globChars(win32); + + let capture = opts.capture ? '' : '?:'; + let star = opts.bash === true ? '.*?' : STAR; + let nodot = opts.dot ? NO_DOTS : NO_DOT; + let slashDot = opts.dot ? NO_DOTS_SLASH : NO_DOT; + + if (opts.capture) { + star = `(${star})`; + } + + const globstar = (opts) => { + return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`; + }; + + const create = str => { + switch (str) { + case '*': + return `${nodot}${ONE_CHAR}${star}`; + + case '.*': + return `${DOT_LITERAL}${ONE_CHAR}${star}`; + + case '*.*': + return `${nodot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`; + + case '*/*': + return `${nodot}${star}${SLASH_LITERAL}${ONE_CHAR}${slashDot}${star}`; + + case '**': + return nodot + globstar(opts); + + case '**/*': + return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${ONE_CHAR}${star}`; + + case '**/*.*': + return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`; + + case '**/.*': + return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${DOT_LITERAL}${ONE_CHAR}${star}`; + + default: { + let match = /^(.*?)\.(\w+)$/.exec(str); + if (!match) return; + + let source = create(match[1], options); + if (!source) return; + + return source + DOT_LITERAL + match[2]; + } + } + }; + + let output = create(input); + if (output && opts.strictSlashes !== true) { + output += `${SLASH_LITERAL}?`; + } + + return output; +}; + +module.exports = parse; + + +/***/ }), +/* 625 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const merge2 = __webpack_require__(591); +function merge(streams) { + const mergedStream = merge2(streams); + streams.forEach((stream) => { + stream.once('error', (err) => mergedStream.emit('error', err)); + }); + return mergedStream; +} +exports.merge = merge; + + +/***/ }), +/* 626 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const stream_1 = __webpack_require__(627); +const provider_1 = __webpack_require__(654); +class ProviderAsync extends provider_1.default { + constructor() { + super(...arguments); + this._reader = new stream_1.default(this._settings); + } + read(task) { + const root = this._getRootDirectory(task); + const options = this._getReaderOptions(task); + const entries = []; + return new Promise((resolve, reject) => { + const stream = this.api(root, task, options); + stream.once('error', reject); + stream.on('data', (entry) => entries.push(options.transform(entry))); + stream.once('end', () => resolve(entries)); + }); + } + api(root, task, options) { + if (task.dynamic) { + return this._reader.dynamic(root, options); + } + return this._reader.static(task.patterns, options); + } +} +exports.default = ProviderAsync; + + +/***/ }), +/* 627 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const stream_1 = __webpack_require__(27); +const fsStat = __webpack_require__(628); +const fsWalk = __webpack_require__(633); +const reader_1 = __webpack_require__(653); +class ReaderStream extends reader_1.default { + constructor() { + super(...arguments); + this._walkStream = fsWalk.walkStream; + this._stat = fsStat.stat; + } + dynamic(root, options) { + return this._walkStream(root, options); + } + static(patterns, options) { + const filepaths = patterns.map(this._getFullEntryPath, this); + const stream = new stream_1.PassThrough({ objectMode: true }); + stream._write = (index, _enc, done) => { + return this._getEntry(filepaths[index], patterns[index], options) + .then((entry) => { + if (entry !== null && options.entryFilter(entry)) { + stream.push(entry); + } + if (index === filepaths.length - 1) { + stream.end(); + } + done(); + }) + .catch(done); + }; + for (let i = 0; i < filepaths.length; i++) { + stream.write(i); + } + return stream; + } + _getEntry(filepath, pattern, options) { + return this._getStat(filepath) + .then((stats) => this._makeEntry(stats, pattern)) + .catch((error) => { + if (options.errorFilter(error)) { + return null; + } + throw error; + }); + } + _getStat(filepath) { + return new Promise((resolve, reject) => { + this._stat(filepath, this._fsStatSettings, (error, stats) => { + error ? reject(error) : resolve(stats); + }); + }); + } +} +exports.default = ReaderStream; + + +/***/ }), +/* 628 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const async = __webpack_require__(629); +const sync = __webpack_require__(630); +const settings_1 = __webpack_require__(631); +exports.Settings = settings_1.default; +function stat(path, optionsOrSettingsOrCallback, callback) { + if (typeof optionsOrSettingsOrCallback === 'function') { + return async.read(path, getSettings(), optionsOrSettingsOrCallback); + } + async.read(path, getSettings(optionsOrSettingsOrCallback), callback); +} +exports.stat = stat; +function statSync(path, optionsOrSettings) { + const settings = getSettings(optionsOrSettings); + return sync.read(path, settings); +} +exports.statSync = statSync; +function getSettings(settingsOrOptions = {}) { + if (settingsOrOptions instanceof settings_1.default) { + return settingsOrOptions; + } + return new settings_1.default(settingsOrOptions); +} + + +/***/ }), +/* 629 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +function read(path, settings, callback) { + settings.fs.lstat(path, (lstatError, lstat) => { + if (lstatError) { + return callFailureCallback(callback, lstatError); + } + if (!lstat.isSymbolicLink() || !settings.followSymbolicLink) { + return callSuccessCallback(callback, lstat); + } + settings.fs.stat(path, (statError, stat) => { + if (statError) { + if (settings.throwErrorOnBrokenSymbolicLink) { + return callFailureCallback(callback, statError); + } + return callSuccessCallback(callback, lstat); + } + if (settings.markSymbolicLink) { + stat.isSymbolicLink = () => true; + } + callSuccessCallback(callback, stat); + }); + }); +} +exports.read = read; +function callFailureCallback(callback, error) { + callback(error); +} +function callSuccessCallback(callback, result) { + callback(null, result); +} + + +/***/ }), +/* 630 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +function read(path, settings) { + const lstat = settings.fs.lstatSync(path); + if (!lstat.isSymbolicLink() || !settings.followSymbolicLink) { + return lstat; + } + try { + const stat = settings.fs.statSync(path); + if (settings.markSymbolicLink) { + stat.isSymbolicLink = () => true; + } + return stat; + } + catch (error) { + if (!settings.throwErrorOnBrokenSymbolicLink) { + return lstat; + } + throw error; + } +} +exports.read = read; + + +/***/ }), +/* 631 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const fs = __webpack_require__(632); +class Settings { + constructor(_options = {}) { + this._options = _options; + this.followSymbolicLink = this._getValue(this._options.followSymbolicLink, true); + this.fs = fs.createFileSystemAdapter(this._options.fs); + this.markSymbolicLink = this._getValue(this._options.markSymbolicLink, false); + this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, true); + } + _getValue(option, value) { + return option === undefined ? value : option; + } +} +exports.default = Settings; + + +/***/ }), +/* 632 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const fs = __webpack_require__(23); +exports.FILE_SYSTEM_ADAPTER = { + lstat: fs.lstat, + stat: fs.stat, + lstatSync: fs.lstatSync, + statSync: fs.statSync +}; +function createFileSystemAdapter(fsMethods) { + if (!fsMethods) { + return exports.FILE_SYSTEM_ADAPTER; + } + return Object.assign({}, exports.FILE_SYSTEM_ADAPTER, fsMethods); +} +exports.createFileSystemAdapter = createFileSystemAdapter; + + +/***/ }), +/* 633 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const async_1 = __webpack_require__(634); +const stream_1 = __webpack_require__(649); +const sync_1 = __webpack_require__(650); +const settings_1 = __webpack_require__(652); +exports.Settings = settings_1.default; +function walk(dir, optionsOrSettingsOrCallback, callback) { + if (typeof optionsOrSettingsOrCallback === 'function') { + return new async_1.default(dir, getSettings()).read(optionsOrSettingsOrCallback); + } + new async_1.default(dir, getSettings(optionsOrSettingsOrCallback)).read(callback); +} +exports.walk = walk; +function walkSync(dir, optionsOrSettings) { + const settings = getSettings(optionsOrSettings); + const provider = new sync_1.default(dir, settings); + return provider.read(); +} +exports.walkSync = walkSync; +function walkStream(dir, optionsOrSettings) { + const settings = getSettings(optionsOrSettings); + const provider = new stream_1.default(dir, settings); + return provider.read(); +} +exports.walkStream = walkStream; +function getSettings(settingsOrOptions = {}) { + if (settingsOrOptions instanceof settings_1.default) { + return settingsOrOptions; + } + return new settings_1.default(settingsOrOptions); +} + + +/***/ }), +/* 634 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const async_1 = __webpack_require__(635); +class AsyncProvider { + constructor(_root, _settings) { + this._root = _root; + this._settings = _settings; + this._reader = new async_1.default(this._root, this._settings); + this._storage = new Set(); + } + read(callback) { + this._reader.onError((error) => { + callFailureCallback(callback, error); + }); + this._reader.onEntry((entry) => { + this._storage.add(entry); + }); + this._reader.onEnd(() => { + callSuccessCallback(callback, Array.from(this._storage)); + }); + this._reader.read(); + } +} +exports.default = AsyncProvider; +function callFailureCallback(callback, error) { + callback(error); +} +function callSuccessCallback(callback, entries) { + callback(null, entries); +} + + +/***/ }), +/* 635 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const events_1 = __webpack_require__(379); +const fsScandir = __webpack_require__(636); +const fastq = __webpack_require__(645); +const common = __webpack_require__(647); +const reader_1 = __webpack_require__(648); +class AsyncReader extends reader_1.default { + constructor(_root, _settings) { + super(_root, _settings); + this._settings = _settings; + this._scandir = fsScandir.scandir; + this._emitter = new events_1.EventEmitter(); + this._queue = fastq(this._worker.bind(this), this._settings.concurrency); + this._isFatalError = false; + this._isDestroyed = false; + this._queue.drain = () => { + if (!this._isFatalError) { + this._emitter.emit('end'); + } + }; + } + read() { + this._isFatalError = false; + this._isDestroyed = false; + setImmediate(() => { + this._pushToQueue(this._root, this._settings.basePath); + }); + return this._emitter; + } + destroy() { + if (this._isDestroyed) { + throw new Error('The reader is already destroyed'); + } + this._isDestroyed = true; + this._queue.killAndDrain(); + } + onEntry(callback) { + this._emitter.on('entry', callback); + } + onError(callback) { + this._emitter.once('error', callback); + } + onEnd(callback) { + this._emitter.once('end', callback); + } + _pushToQueue(dir, base) { + const queueItem = { dir, base }; + this._queue.push(queueItem, (error) => { + if (error) { + this._handleError(error); + } + }); + } + _worker(item, done) { + this._scandir(item.dir, this._settings.fsScandirSettings, (error, entries) => { + if (error) { + return done(error, undefined); + } + for (const entry of entries) { + this._handleEntry(entry, item.base); + } + done(null, undefined); + }); + } + _handleError(error) { + if (!common.isFatalError(this._settings, error)) { + return; + } + this._isFatalError = true; + this._isDestroyed = true; + this._emitter.emit('error', error); + } + _handleEntry(entry, base) { + if (this._isDestroyed || this._isFatalError) { + return; + } + const fullpath = entry.path; + if (base !== undefined) { + entry.path = common.joinPathSegments(base, entry.name, this._settings.pathSegmentSeparator); + } + if (common.isAppliedFilter(this._settings.entryFilter, entry)) { + this._emitEntry(entry); + } + if (entry.dirent.isDirectory() && common.isAppliedFilter(this._settings.deepFilter, entry)) { + this._pushToQueue(fullpath, entry.path); + } + } + _emitEntry(entry) { + this._emitter.emit('entry', entry); + } +} +exports.default = AsyncReader; + + +/***/ }), +/* 636 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const async = __webpack_require__(637); +const sync = __webpack_require__(642); +const settings_1 = __webpack_require__(643); +exports.Settings = settings_1.default; +function scandir(path, optionsOrSettingsOrCallback, callback) { + if (typeof optionsOrSettingsOrCallback === 'function') { + return async.read(path, getSettings(), optionsOrSettingsOrCallback); + } + async.read(path, getSettings(optionsOrSettingsOrCallback), callback); +} +exports.scandir = scandir; +function scandirSync(path, optionsOrSettings) { + const settings = getSettings(optionsOrSettings); + return sync.read(path, settings); +} +exports.scandirSync = scandirSync; +function getSettings(settingsOrOptions = {}) { + if (settingsOrOptions instanceof settings_1.default) { + return settingsOrOptions; + } + return new settings_1.default(settingsOrOptions); +} + + +/***/ }), +/* 637 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const fsStat = __webpack_require__(628); +const rpl = __webpack_require__(638); +const constants_1 = __webpack_require__(639); +const utils = __webpack_require__(640); +function read(dir, settings, callback) { + if (!settings.stats && constants_1.IS_SUPPORT_READDIR_WITH_FILE_TYPES) { + return readdirWithFileTypes(dir, settings, callback); + } + return readdir(dir, settings, callback); +} +exports.read = read; +function readdirWithFileTypes(dir, settings, callback) { + settings.fs.readdir(dir, { withFileTypes: true }, (readdirError, dirents) => { + if (readdirError) { + return callFailureCallback(callback, readdirError); + } + const entries = dirents.map((dirent) => ({ + dirent, + name: dirent.name, + path: `${dir}${settings.pathSegmentSeparator}${dirent.name}` + })); + if (!settings.followSymbolicLinks) { + return callSuccessCallback(callback, entries); + } + const tasks = entries.map((entry) => makeRplTaskEntry(entry, settings)); + rpl(tasks, (rplError, rplEntries) => { + if (rplError) { + return callFailureCallback(callback, rplError); + } + callSuccessCallback(callback, rplEntries); + }); + }); +} +exports.readdirWithFileTypes = readdirWithFileTypes; +function makeRplTaskEntry(entry, settings) { + return (done) => { + if (!entry.dirent.isSymbolicLink()) { + return done(null, entry); + } + settings.fs.stat(entry.path, (statError, stats) => { + if (statError) { + if (settings.throwErrorOnBrokenSymbolicLink) { + return done(statError); + } + return done(null, entry); + } + entry.dirent = utils.fs.createDirentFromStats(entry.name, stats); + return done(null, entry); + }); + }; +} +function readdir(dir, settings, callback) { + settings.fs.readdir(dir, (readdirError, names) => { + if (readdirError) { + return callFailureCallback(callback, readdirError); + } + const filepaths = names.map((name) => `${dir}${settings.pathSegmentSeparator}${name}`); + const tasks = filepaths.map((filepath) => { + return (done) => fsStat.stat(filepath, settings.fsStatSettings, done); + }); + rpl(tasks, (rplError, results) => { + if (rplError) { + return callFailureCallback(callback, rplError); + } + const entries = []; + for (let index = 0; index < names.length; index++) { + const name = names[index]; + const stats = results[index]; + const entry = { + name, + path: filepaths[index], + dirent: utils.fs.createDirentFromStats(name, stats) + }; + if (settings.stats) { + entry.stats = stats; + } + entries.push(entry); + } + callSuccessCallback(callback, entries); + }); + }); +} +exports.readdir = readdir; +function callFailureCallback(callback, error) { + callback(error); +} +function callSuccessCallback(callback, result) { + callback(null, result); +} + + +/***/ }), +/* 638 */ +/***/ (function(module, exports) { + +module.exports = runParallel + +function runParallel (tasks, cb) { + var results, pending, keys + var isSync = true + + if (Array.isArray(tasks)) { + results = [] + pending = tasks.length + } else { + keys = Object.keys(tasks) + results = {} + pending = keys.length + } + + function done (err) { + function end () { + if (cb) cb(err, results) + cb = null + } + if (isSync) process.nextTick(end) + else end() + } + + function each (i, err, result) { + results[i] = result + if (--pending === 0 || err) { + done(err) + } + } + + if (!pending) { + // empty + done(null) + } else if (keys) { + // object + keys.forEach(function (key) { + tasks[key](function (err, result) { each(key, err, result) }) + }) + } else { + // array + tasks.forEach(function (task, i) { + task(function (err, result) { each(i, err, result) }) + }) + } + + isSync = false +} + + +/***/ }), +/* 639 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const NODE_PROCESS_VERSION_PARTS = process.versions.node.split('.'); +const MAJOR_VERSION = parseInt(NODE_PROCESS_VERSION_PARTS[0], 10); +const MINOR_VERSION = parseInt(NODE_PROCESS_VERSION_PARTS[1], 10); +/** + * IS `true` for Node.js 10.10 and greater. + */ +exports.IS_SUPPORT_READDIR_WITH_FILE_TYPES = MAJOR_VERSION > 10 || (MAJOR_VERSION === 10 && MINOR_VERSION >= 10); + + +/***/ }), +/* 640 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const fs = __webpack_require__(641); +exports.fs = fs; + + +/***/ }), +/* 641 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +class DirentFromStats { + constructor(name, stats) { + this.name = name; + this.isBlockDevice = stats.isBlockDevice.bind(stats); + this.isCharacterDevice = stats.isCharacterDevice.bind(stats); + this.isDirectory = stats.isDirectory.bind(stats); + this.isFIFO = stats.isFIFO.bind(stats); + this.isFile = stats.isFile.bind(stats); + this.isSocket = stats.isSocket.bind(stats); + this.isSymbolicLink = stats.isSymbolicLink.bind(stats); + } +} +function createDirentFromStats(name, stats) { + return new DirentFromStats(name, stats); +} +exports.createDirentFromStats = createDirentFromStats; + + +/***/ }), +/* 642 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const fsStat = __webpack_require__(628); +const constants_1 = __webpack_require__(639); +const utils = __webpack_require__(640); +function read(dir, settings) { + if (!settings.stats && constants_1.IS_SUPPORT_READDIR_WITH_FILE_TYPES) { + return readdirWithFileTypes(dir, settings); + } + return readdir(dir, settings); +} +exports.read = read; +function readdirWithFileTypes(dir, settings) { + const dirents = settings.fs.readdirSync(dir, { withFileTypes: true }); + return dirents.map((dirent) => { + const entry = { + dirent, + name: dirent.name, + path: `${dir}${settings.pathSegmentSeparator}${dirent.name}` + }; + if (entry.dirent.isSymbolicLink() && settings.followSymbolicLinks) { + try { + const stats = settings.fs.statSync(entry.path); + entry.dirent = utils.fs.createDirentFromStats(entry.name, stats); + } + catch (error) { + if (settings.throwErrorOnBrokenSymbolicLink) { + throw error; + } + } + } + return entry; + }); +} +exports.readdirWithFileTypes = readdirWithFileTypes; +function readdir(dir, settings) { + const names = settings.fs.readdirSync(dir); + return names.map((name) => { + const entryPath = `${dir}${settings.pathSegmentSeparator}${name}`; + const stats = fsStat.statSync(entryPath, settings.fsStatSettings); + const entry = { + name, + path: entryPath, + dirent: utils.fs.createDirentFromStats(name, stats) + }; + if (settings.stats) { + entry.stats = stats; + } + return entry; + }); +} +exports.readdir = readdir; + + +/***/ }), +/* 643 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const path = __webpack_require__(16); +const fsStat = __webpack_require__(628); +const fs = __webpack_require__(644); +class Settings { + constructor(_options = {}) { + this._options = _options; + this.followSymbolicLinks = this._getValue(this._options.followSymbolicLinks, false); + this.fs = fs.createFileSystemAdapter(this._options.fs); + this.pathSegmentSeparator = this._getValue(this._options.pathSegmentSeparator, path.sep); + this.stats = this._getValue(this._options.stats, false); + this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, true); + this.fsStatSettings = new fsStat.Settings({ + followSymbolicLink: this.followSymbolicLinks, + fs: this.fs, + throwErrorOnBrokenSymbolicLink: this.throwErrorOnBrokenSymbolicLink + }); + } + _getValue(option, value) { + return option === undefined ? value : option; + } +} +exports.default = Settings; + + +/***/ }), +/* 644 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const fs = __webpack_require__(23); +exports.FILE_SYSTEM_ADAPTER = { + lstat: fs.lstat, + stat: fs.stat, + lstatSync: fs.lstatSync, + statSync: fs.statSync, + readdir: fs.readdir, + readdirSync: fs.readdirSync +}; +function createFileSystemAdapter(fsMethods) { + if (!fsMethods) { + return exports.FILE_SYSTEM_ADAPTER; + } + return Object.assign({}, exports.FILE_SYSTEM_ADAPTER, fsMethods); +} +exports.createFileSystemAdapter = createFileSystemAdapter; + + +/***/ }), +/* 645 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var reusify = __webpack_require__(646) + +function fastqueue (context, worker, concurrency) { + if (typeof context === 'function') { + concurrency = worker + worker = context + context = null + } + + var cache = reusify(Task) + var queueHead = null + var queueTail = null + var _running = 0 + + var self = { + push: push, + drain: noop, + saturated: noop, + pause: pause, + paused: false, + concurrency: concurrency, + running: running, + resume: resume, + idle: idle, + length: length, + unshift: unshift, + empty: noop, + kill: kill, + killAndDrain: killAndDrain + } + + return self + + function running () { + return _running + } + + function pause () { + self.paused = true + } + + function length () { + var current = queueHead + var counter = 0 + + while (current) { + current = current.next + counter++ + } + + return counter + } + + function resume () { + if (!self.paused) return + self.paused = false + for (var i = 0; i < self.concurrency; i++) { + _running++ + release() + } + } + + function idle () { + return _running === 0 && self.length() === 0 + } + + function push (value, done) { + var current = cache.get() + + current.context = context + current.release = release + current.value = value + current.callback = done || noop + + if (_running === self.concurrency || self.paused) { + if (queueTail) { + queueTail.next = current + queueTail = current + } else { + queueHead = current + queueTail = current + self.saturated() + } + } else { + _running++ + worker.call(context, current.value, current.worked) + } + } + + function unshift (value, done) { + var current = cache.get() + + current.context = context + current.release = release + current.value = value + current.callback = done || noop + + if (_running === self.concurrency || self.paused) { + if (queueHead) { + current.next = queueHead + queueHead = current + } else { + queueHead = current + queueTail = current + self.saturated() + } + } else { + _running++ + worker.call(context, current.value, current.worked) + } + } + + function release (holder) { + if (holder) { + cache.release(holder) + } + var next = queueHead + if (next) { + if (!self.paused) { + if (queueTail === queueHead) { + queueTail = null + } + queueHead = next.next + next.next = null + worker.call(context, next.value, next.worked) + if (queueTail === null) { + self.empty() + } + } else { + _running-- + } + } else if (--_running === 0) { + self.drain() + } + } + + function kill () { + queueHead = null + queueTail = null + self.drain = noop + } + + function killAndDrain () { + queueHead = null + queueTail = null + self.drain() + self.drain = noop + } +} + +function noop () {} + +function Task () { + this.value = null + this.callback = noop + this.next = null + this.release = noop + this.context = null + + var self = this + + this.worked = function worked (err, result) { + var callback = self.callback + self.value = null + self.callback = noop + callback.call(self.context, err, result) + self.release(self) + } +} + +module.exports = fastqueue + + +/***/ }), +/* 646 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function reusify (Constructor) { + var head = new Constructor() + var tail = head + + function get () { + var current = head + + if (current.next) { + head = current.next + } else { + head = new Constructor() + tail = head + } + + current.next = null + + return current + } + + function release (obj) { + tail.next = obj + tail = obj + } + + return { + get: get, + release: release + } +} + +module.exports = reusify + + +/***/ }), +/* 647 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +function isFatalError(settings, error) { + if (settings.errorFilter === null) { + return true; + } + return !settings.errorFilter(error); +} +exports.isFatalError = isFatalError; +function isAppliedFilter(filter, value) { + return filter === null || filter(value); +} +exports.isAppliedFilter = isAppliedFilter; +function replacePathSegmentSeparator(filepath, separator) { + return filepath.split(/[\\\/]/).join(separator); +} +exports.replacePathSegmentSeparator = replacePathSegmentSeparator; +function joinPathSegments(a, b, separator) { + if (a === '') { + return b; + } + return a + separator + b; +} +exports.joinPathSegments = joinPathSegments; + + +/***/ }), +/* 648 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const common = __webpack_require__(647); +class Reader { + constructor(_root, _settings) { + this._root = _root; + this._settings = _settings; + this._root = common.replacePathSegmentSeparator(_root, _settings.pathSegmentSeparator); + } +} +exports.default = Reader; + + +/***/ }), +/* 649 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const stream_1 = __webpack_require__(27); +const async_1 = __webpack_require__(635); +class StreamProvider { + constructor(_root, _settings) { + this._root = _root; + this._settings = _settings; + this._reader = new async_1.default(this._root, this._settings); + this._stream = new stream_1.Readable({ + objectMode: true, + read: () => { }, + destroy: this._reader.destroy.bind(this._reader) + }); + } + read() { + this._reader.onError((error) => { + this._stream.emit('error', error); + }); + this._reader.onEntry((entry) => { + this._stream.push(entry); + }); + this._reader.onEnd(() => { + this._stream.push(null); + }); + this._reader.read(); + return this._stream; + } +} +exports.default = StreamProvider; + + +/***/ }), +/* 650 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const sync_1 = __webpack_require__(651); +class SyncProvider { + constructor(_root, _settings) { + this._root = _root; + this._settings = _settings; + this._reader = new sync_1.default(this._root, this._settings); + } + read() { + return this._reader.read(); + } +} +exports.default = SyncProvider; + + +/***/ }), +/* 651 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const fsScandir = __webpack_require__(636); +const common = __webpack_require__(647); +const reader_1 = __webpack_require__(648); +class SyncReader extends reader_1.default { + constructor() { + super(...arguments); + this._scandir = fsScandir.scandirSync; + this._storage = new Set(); + this._queue = new Set(); + } + read() { + this._pushToQueue(this._root, this._settings.basePath); + this._handleQueue(); + return Array.from(this._storage); + } + _pushToQueue(dir, base) { + this._queue.add({ dir, base }); + } + _handleQueue() { + for (const item of this._queue.values()) { + this._handleDirectory(item.dir, item.base); + } + } + _handleDirectory(dir, base) { + try { + const entries = this._scandir(dir, this._settings.fsScandirSettings); + for (const entry of entries) { + this._handleEntry(entry, base); + } + } + catch (error) { + this._handleError(error); + } + } + _handleError(error) { + if (!common.isFatalError(this._settings, error)) { + return; + } + throw error; + } + _handleEntry(entry, base) { + const fullpath = entry.path; + if (base !== undefined) { + entry.path = common.joinPathSegments(base, entry.name, this._settings.pathSegmentSeparator); + } + if (common.isAppliedFilter(this._settings.entryFilter, entry)) { + this._pushToStorage(entry); + } + if (entry.dirent.isDirectory() && common.isAppliedFilter(this._settings.deepFilter, entry)) { + this._pushToQueue(fullpath, entry.path); + } + } + _pushToStorage(entry) { + this._storage.add(entry); + } +} +exports.default = SyncReader; + + +/***/ }), +/* 652 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const path = __webpack_require__(16); +const fsScandir = __webpack_require__(636); +class Settings { + constructor(_options = {}) { + this._options = _options; + this.basePath = this._getValue(this._options.basePath, undefined); + this.concurrency = this._getValue(this._options.concurrency, Infinity); + this.deepFilter = this._getValue(this._options.deepFilter, null); + this.entryFilter = this._getValue(this._options.entryFilter, null); + this.errorFilter = this._getValue(this._options.errorFilter, null); + this.pathSegmentSeparator = this._getValue(this._options.pathSegmentSeparator, path.sep); + this.fsScandirSettings = new fsScandir.Settings({ + followSymbolicLinks: this._options.followSymbolicLinks, + fs: this._options.fs, + pathSegmentSeparator: this._options.pathSegmentSeparator, + stats: this._options.stats, + throwErrorOnBrokenSymbolicLink: this._options.throwErrorOnBrokenSymbolicLink + }); + } + _getValue(option, value) { + return option === undefined ? value : option; + } +} +exports.default = Settings; + + +/***/ }), +/* 653 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const path = __webpack_require__(16); +const fsStat = __webpack_require__(628); +const utils = __webpack_require__(599); +class Reader { + constructor(_settings) { + this._settings = _settings; + this._fsStatSettings = new fsStat.Settings({ + followSymbolicLink: this._settings.followSymbolicLinks, + fs: this._settings.fs, + throwErrorOnBrokenSymbolicLink: this._settings.followSymbolicLinks + }); + } + _getFullEntryPath(filepath) { + return path.resolve(this._settings.cwd, filepath); + } + _makeEntry(stats, pattern) { + const entry = { + name: pattern, + path: pattern, + dirent: utils.fs.createDirentFromStats(pattern, stats) + }; + if (this._settings.stats) { + entry.stats = stats; + } + return entry; + } + _isFatalError(error) { + return !utils.errno.isEnoentCodeError(error) && !this._settings.suppressErrors; + } +} +exports.default = Reader; /***/ }), -/* 653 */ +/* 654 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const path = __webpack_require__(16); +const deep_1 = __webpack_require__(655); +const entry_1 = __webpack_require__(656); +const error_1 = __webpack_require__(657); +const entry_2 = __webpack_require__(658); +class Provider { + constructor(_settings) { + this._settings = _settings; + this.errorFilter = new error_1.default(this._settings); + this.entryFilter = new entry_1.default(this._settings, this._getMicromatchOptions()); + this.deepFilter = new deep_1.default(this._settings, this._getMicromatchOptions()); + this.entryTransformer = new entry_2.default(this._settings); + } + _getRootDirectory(task) { + return path.resolve(this._settings.cwd, task.base); + } + _getReaderOptions(task) { + const basePath = task.base === '.' ? '' : task.base; + return { + basePath, + pathSegmentSeparator: '/', + concurrency: this._settings.concurrency, + deepFilter: this.deepFilter.getFilter(basePath, task.positive, task.negative), + entryFilter: this.entryFilter.getFilter(task.positive, task.negative), + errorFilter: this.errorFilter.getFilter(), + followSymbolicLinks: this._settings.followSymbolicLinks, + fs: this._settings.fs, + stats: this._settings.stats, + throwErrorOnBrokenSymbolicLink: this._settings.throwErrorOnBrokenSymbolicLink, + transform: this.entryTransformer.getTransformer() + }; + } + _getMicromatchOptions() { + return { + dot: this._settings.dot, + matchBase: this._settings.baseNameMatch, + nobrace: !this._settings.braceExpansion, + nocase: !this._settings.caseSensitiveMatch, + noext: !this._settings.extglob, + noglobstar: !this._settings.globstar, + posix: true, + strictSlashes: false + }; + } +} +exports.default = Provider; + + +/***/ }), +/* 655 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const utils = __webpack_require__(599); +class DeepFilter { + constructor(_settings, _micromatchOptions) { + this._settings = _settings; + this._micromatchOptions = _micromatchOptions; + } + getFilter(basePath, positive, negative) { + const maxPatternDepth = this._getMaxPatternDepth(positive); + const negativeRe = this._getNegativePatternsRe(negative); + return (entry) => this._filter(basePath, entry, negativeRe, maxPatternDepth); + } + _getMaxPatternDepth(patterns) { + const globstar = patterns.some(utils.pattern.hasGlobStar); + return globstar ? Infinity : utils.pattern.getMaxNaivePatternsDepth(patterns); + } + _getNegativePatternsRe(patterns) { + const affectDepthOfReadingPatterns = patterns.filter(utils.pattern.isAffectDepthOfReadingPattern); + return utils.pattern.convertPatternsToRe(affectDepthOfReadingPatterns, this._micromatchOptions); + } + _filter(basePath, entry, negativeRe, maxPatternDepth) { + const depth = this._getEntryDepth(basePath, entry.path); + if (this._isSkippedByDeep(depth)) { + return false; + } + if (this._isSkippedByMaxPatternDepth(depth, maxPatternDepth)) { + return false; + } + if (this._isSkippedSymbolicLink(entry)) { + return false; + } + if (this._isSkippedDotDirectory(entry)) { + return false; + } + return this._isSkippedByNegativePatterns(entry, negativeRe); + } + _getEntryDepth(basePath, entryPath) { + const basePathDepth = basePath.split('/').length; + const entryPathDepth = entryPath.split('/').length; + return entryPathDepth - (basePath === '' ? 0 : basePathDepth); + } + _isSkippedByDeep(entryDepth) { + return entryDepth >= this._settings.deep; + } + _isSkippedByMaxPatternDepth(entryDepth, maxPatternDepth) { + return !this._settings.baseNameMatch && maxPatternDepth !== Infinity && entryDepth > maxPatternDepth; + } + _isSkippedSymbolicLink(entry) { + return !this._settings.followSymbolicLinks && entry.dirent.isSymbolicLink(); + } + _isSkippedDotDirectory(entry) { + return !this._settings.dot && entry.name.startsWith('.'); + } + _isSkippedByNegativePatterns(entry, negativeRe) { + return !utils.pattern.matchAny(entry.path, negativeRe); + } +} +exports.default = DeepFilter; + + +/***/ }), +/* 656 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const utils = __webpack_require__(599); +class EntryFilter { + constructor(_settings, _micromatchOptions) { + this._settings = _settings; + this._micromatchOptions = _micromatchOptions; + this.index = new Map(); + } + getFilter(positive, negative) { + const positiveRe = utils.pattern.convertPatternsToRe(positive, this._micromatchOptions); + const negativeRe = utils.pattern.convertPatternsToRe(negative, this._micromatchOptions); + return (entry) => this._filter(entry, positiveRe, negativeRe); + } + _filter(entry, positiveRe, negativeRe) { + if (this._settings.unique) { + if (this._isDuplicateEntry(entry)) { + return false; + } + this._createIndexRecord(entry); + } + if (this._onlyFileFilter(entry) || this._onlyDirectoryFilter(entry)) { + return false; + } + if (this._isSkippedByAbsoluteNegativePatterns(entry, negativeRe)) { + return false; + } + const filepath = this._settings.baseNameMatch ? entry.name : entry.path; + return this._isMatchToPatterns(filepath, positiveRe) && !this._isMatchToPatterns(entry.path, negativeRe); + } + _isDuplicateEntry(entry) { + return this.index.has(entry.path); + } + _createIndexRecord(entry) { + this.index.set(entry.path, undefined); + } + _onlyFileFilter(entry) { + return this._settings.onlyFiles && !entry.dirent.isFile(); + } + _onlyDirectoryFilter(entry) { + return this._settings.onlyDirectories && !entry.dirent.isDirectory(); + } + _isSkippedByAbsoluteNegativePatterns(entry, negativeRe) { + if (!this._settings.absolute) { + return false; + } + const fullpath = utils.path.makeAbsolute(this._settings.cwd, entry.path); + return this._isMatchToPatterns(fullpath, negativeRe); + } + _isMatchToPatterns(filepath, patternsRe) { + return utils.pattern.matchAny(filepath, patternsRe); + } +} +exports.default = EntryFilter; + + +/***/ }), +/* 657 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const utils = __webpack_require__(599); +class ErrorFilter { + constructor(_settings) { + this._settings = _settings; + } + getFilter() { + return (error) => this._isNonFatalError(error); + } + _isNonFatalError(error) { + return utils.errno.isEnoentCodeError(error) || this._settings.suppressErrors; + } +} +exports.default = ErrorFilter; + + +/***/ }), +/* 658 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const utils = __webpack_require__(594); +const utils = __webpack_require__(599); class EntryTransformer { constructor(_settings) { this._settings = _settings; @@ -75236,2515 +76824,3068 @@ exports.default = EntryTransformer; /***/ }), -/* 654 */ +/* 659 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const stream_1 = __webpack_require__(27); +const stream_2 = __webpack_require__(627); +const provider_1 = __webpack_require__(654); +class ProviderStream extends provider_1.default { + constructor() { + super(...arguments); + this._reader = new stream_2.default(this._settings); + } + read(task) { + const root = this._getRootDirectory(task); + const options = this._getReaderOptions(task); + const source = this.api(root, task, options); + const dest = new stream_1.Readable({ objectMode: true, read: () => { } }); + source + .once('error', (error) => dest.emit('error', error)) + .on('data', (entry) => dest.emit('data', options.transform(entry))) + .once('end', () => dest.emit('end')); + return dest; + } + api(root, task, options) { + if (task.dynamic) { + return this._reader.dynamic(root, options); + } + return this._reader.static(task.patterns, options); + } +} +exports.default = ProviderStream; + + +/***/ }), +/* 660 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const sync_1 = __webpack_require__(661); +const provider_1 = __webpack_require__(654); +class ProviderSync extends provider_1.default { + constructor() { + super(...arguments); + this._reader = new sync_1.default(this._settings); + } + read(task) { + const root = this._getRootDirectory(task); + const options = this._getReaderOptions(task); + const entries = this.api(root, task, options); + return entries.map(options.transform); + } + api(root, task, options) { + if (task.dynamic) { + return this._reader.dynamic(root, options); + } + return this._reader.static(task.patterns, options); + } +} +exports.default = ProviderSync; + + +/***/ }), +/* 661 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const fsStat = __webpack_require__(628); +const fsWalk = __webpack_require__(633); +const reader_1 = __webpack_require__(653); +class ReaderSync extends reader_1.default { + constructor() { + super(...arguments); + this._walkSync = fsWalk.walkSync; + this._statSync = fsStat.statSync; + } + dynamic(root, options) { + return this._walkSync(root, options); + } + static(patterns, options) { + const entries = []; + for (const pattern of patterns) { + const filepath = this._getFullEntryPath(pattern); + const entry = this._getEntry(filepath, pattern, options); + if (entry === null || !options.entryFilter(entry)) { + continue; + } + entries.push(entry); + } + return entries; + } + _getEntry(filepath, pattern, options) { + try { + const stats = this._getStat(filepath); + return this._makeEntry(stats, pattern); + } + catch (error) { + if (options.errorFilter(error)) { + return null; + } + throw error; + } + } + _getStat(filepath) { + return this._statSync(filepath, this._fsStatSettings); + } +} +exports.default = ReaderSync; + + +/***/ }), +/* 662 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const fs = __webpack_require__(23); +const os = __webpack_require__(11); +const CPU_COUNT = os.cpus().length; +exports.DEFAULT_FILE_SYSTEM_ADAPTER = { + lstat: fs.lstat, + lstatSync: fs.lstatSync, + stat: fs.stat, + statSync: fs.statSync, + readdir: fs.readdir, + readdirSync: fs.readdirSync +}; +// tslint:enable no-redundant-jsdoc +class Settings { + constructor(_options = {}) { + this._options = _options; + this.absolute = this._getValue(this._options.absolute, false); + this.baseNameMatch = this._getValue(this._options.baseNameMatch, false); + this.braceExpansion = this._getValue(this._options.braceExpansion, true); + this.caseSensitiveMatch = this._getValue(this._options.caseSensitiveMatch, true); + this.concurrency = this._getValue(this._options.concurrency, CPU_COUNT); + this.cwd = this._getValue(this._options.cwd, process.cwd()); + this.deep = this._getValue(this._options.deep, Infinity); + this.dot = this._getValue(this._options.dot, false); + this.extglob = this._getValue(this._options.extglob, true); + this.followSymbolicLinks = this._getValue(this._options.followSymbolicLinks, true); + this.fs = this._getFileSystemMethods(this._options.fs); + this.globstar = this._getValue(this._options.globstar, true); + this.ignore = this._getValue(this._options.ignore, []); + this.markDirectories = this._getValue(this._options.markDirectories, false); + this.objectMode = this._getValue(this._options.objectMode, false); + this.onlyDirectories = this._getValue(this._options.onlyDirectories, false); + this.onlyFiles = this._getValue(this._options.onlyFiles, true); + this.stats = this._getValue(this._options.stats, false); + this.suppressErrors = this._getValue(this._options.suppressErrors, false); + this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, false); + this.unique = this._getValue(this._options.unique, true); + if (this.onlyDirectories) { + this.onlyFiles = false; + } + if (this.stats) { + this.objectMode = true; + } + } + _getValue(option, value) { + return option === undefined ? value : option; + } + _getFileSystemMethods(methods = {}) { + return Object.assign({}, exports.DEFAULT_FILE_SYSTEM_ADAPTER, methods); + } +} +exports.default = Settings; + + +/***/ }), +/* 663 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +const path = __webpack_require__(16); +const pathType = __webpack_require__(664); + +const getExtensions = extensions => extensions.length > 1 ? `{${extensions.join(',')}}` : extensions[0]; + +const getPath = (filepath, cwd) => { + const pth = filepath[0] === '!' ? filepath.slice(1) : filepath; + return path.isAbsolute(pth) ? pth : path.join(cwd, pth); +}; + +const addExtensions = (file, extensions) => { + if (path.extname(file)) { + return `**/${file}`; + } + + return `**/${file}.${getExtensions(extensions)}`; +}; + +const getGlob = (directory, options) => { + if (options.files && !Array.isArray(options.files)) { + throw new TypeError(`Expected \`files\` to be of type \`Array\` but received type \`${typeof options.files}\``); + } + + if (options.extensions && !Array.isArray(options.extensions)) { + throw new TypeError(`Expected \`extensions\` to be of type \`Array\` but received type \`${typeof options.extensions}\``); + } + + if (options.files && options.extensions) { + return options.files.map(x => path.posix.join(directory, addExtensions(x, options.extensions))); + } + + if (options.files) { + return options.files.map(x => path.posix.join(directory, `**/${x}`)); + } + + if (options.extensions) { + return [path.posix.join(directory, `**/*.${getExtensions(options.extensions)}`)]; + } + + return [path.posix.join(directory, '**')]; +}; + +module.exports = async (input, options) => { + options = { + cwd: process.cwd(), + ...options + }; + + if (typeof options.cwd !== 'string') { + throw new TypeError(`Expected \`cwd\` to be of type \`string\` but received type \`${typeof options.cwd}\``); + } + + const globs = await Promise.all([].concat(input).map(async x => { + const isDirectory = await pathType.isDirectory(getPath(x, options.cwd)); + return isDirectory ? getGlob(x, options) : x; + })); + + return [].concat.apply([], globs); // eslint-disable-line prefer-spread +}; + +module.exports.sync = (input, options) => { + options = { + cwd: process.cwd(), + ...options + }; + + if (typeof options.cwd !== 'string') { + throw new TypeError(`Expected \`cwd\` to be of type \`string\` but received type \`${typeof options.cwd}\``); + } + + const globs = [].concat(input).map(x => pathType.isDirectorySync(getPath(x, options.cwd)) ? getGlob(x, options) : x); + + return [].concat.apply([], globs); // eslint-disable-line prefer-spread +}; + + +/***/ }), +/* 664 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +const {promisify} = __webpack_require__(29); +const fs = __webpack_require__(23); + +async function isType(fsStatType, statsMethodName, filePath) { + if (typeof filePath !== 'string') { + throw new TypeError(`Expected a string, got ${typeof filePath}`); + } + + try { + const stats = await promisify(fs[fsStatType])(filePath); + return stats[statsMethodName](); + } catch (error) { + if (error.code === 'ENOENT') { + return false; + } + + throw error; + } +} + +function isTypeSync(fsStatType, statsMethodName, filePath) { + if (typeof filePath !== 'string') { + throw new TypeError(`Expected a string, got ${typeof filePath}`); + } + + try { + return fs[fsStatType](filePath)[statsMethodName](); + } catch (error) { + if (error.code === 'ENOENT') { + return false; + } + + throw error; + } +} + +exports.isFile = isType.bind(null, 'stat', 'isFile'); +exports.isDirectory = isType.bind(null, 'stat', 'isDirectory'); +exports.isSymlink = isType.bind(null, 'lstat', 'isSymbolicLink'); +exports.isFileSync = isTypeSync.bind(null, 'statSync', 'isFile'); +exports.isDirectorySync = isTypeSync.bind(null, 'statSync', 'isDirectory'); +exports.isSymlinkSync = isTypeSync.bind(null, 'lstatSync', 'isSymbolicLink'); + + +/***/ }), +/* 665 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const stream_1 = __webpack_require__(27); -const stream_2 = __webpack_require__(622); -const provider_1 = __webpack_require__(649); -class ProviderStream extends provider_1.default { - constructor() { - super(...arguments); - this._reader = new stream_2.default(this._settings); - } - read(task) { - const root = this._getRootDirectory(task); - const options = this._getReaderOptions(task); - const source = this.api(root, task, options); - const dest = new stream_1.Readable({ objectMode: true, read: () => { } }); - source - .once('error', (error) => dest.emit('error', error)) - .on('data', (entry) => dest.emit('data', options.transform(entry))) - .once('end', () => dest.emit('end')); - return dest; - } - api(root, task, options) { - if (task.dynamic) { - return this._reader.dynamic(root, options); - } - return this._reader.static(task.patterns, options); - } -} -exports.default = ProviderStream; + +const {promisify} = __webpack_require__(29); +const fs = __webpack_require__(23); +const path = __webpack_require__(16); +const fastGlob = __webpack_require__(597); +const gitIgnore = __webpack_require__(666); +const slash = __webpack_require__(667); + +const DEFAULT_IGNORE = [ + '**/node_modules/**', + '**/flow-typed/**', + '**/coverage/**', + '**/.git' +]; + +const readFileP = promisify(fs.readFile); + +const mapGitIgnorePatternTo = base => ignore => { + if (ignore.startsWith('!')) { + return '!' + path.posix.join(base, ignore.slice(1)); + } + + return path.posix.join(base, ignore); +}; + +const parseGitIgnore = (content, options) => { + const base = slash(path.relative(options.cwd, path.dirname(options.fileName))); + + return content + .split(/\r?\n/) + .filter(Boolean) + .filter(line => !line.startsWith('#')) + .map(mapGitIgnorePatternTo(base)); +}; + +const reduceIgnore = files => { + return files.reduce((ignores, file) => { + ignores.add(parseGitIgnore(file.content, { + cwd: file.cwd, + fileName: file.filePath + })); + return ignores; + }, gitIgnore()); +}; + +const ensureAbsolutePathForCwd = (cwd, p) => { + if (path.isAbsolute(p)) { + if (p.startsWith(cwd)) { + return p; + } + + throw new Error(`Path ${p} is not in cwd ${cwd}`); + } + + return path.join(cwd, p); +}; + +const getIsIgnoredPredecate = (ignores, cwd) => { + return p => ignores.ignores(slash(path.relative(cwd, ensureAbsolutePathForCwd(cwd, p)))); +}; + +const getFile = async (file, cwd) => { + const filePath = path.join(cwd, file); + const content = await readFileP(filePath, 'utf8'); + + return { + cwd, + filePath, + content + }; +}; + +const getFileSync = (file, cwd) => { + const filePath = path.join(cwd, file); + const content = fs.readFileSync(filePath, 'utf8'); + + return { + cwd, + filePath, + content + }; +}; + +const normalizeOptions = ({ + ignore = [], + cwd = process.cwd() +} = {}) => { + return {ignore, cwd}; +}; + +module.exports = async options => { + options = normalizeOptions(options); + + const paths = await fastGlob('**/.gitignore', { + ignore: DEFAULT_IGNORE.concat(options.ignore), + cwd: options.cwd + }); + + const files = await Promise.all(paths.map(file => getFile(file, options.cwd))); + const ignores = reduceIgnore(files); + + return getIsIgnoredPredecate(ignores, options.cwd); +}; + +module.exports.sync = options => { + options = normalizeOptions(options); + + const paths = fastGlob.sync('**/.gitignore', { + ignore: DEFAULT_IGNORE.concat(options.ignore), + cwd: options.cwd + }); + + const files = paths.map(file => getFileSync(file, options.cwd)); + const ignores = reduceIgnore(files); + + return getIsIgnoredPredecate(ignores, options.cwd); +}; /***/ }), -/* 655 */ -/***/ (function(module, exports, __webpack_require__) { +/* 666 */ +/***/ (function(module, exports) { -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const sync_1 = __webpack_require__(656); -const provider_1 = __webpack_require__(649); -class ProviderSync extends provider_1.default { - constructor() { - super(...arguments); - this._reader = new sync_1.default(this._settings); - } - read(task) { - const root = this._getRootDirectory(task); - const options = this._getReaderOptions(task); - const entries = this.api(root, task, options); - return entries.map(options.transform); - } - api(root, task, options) { - if (task.dynamic) { - return this._reader.dynamic(root, options); - } - return this._reader.static(task.patterns, options); - } -} -exports.default = ProviderSync; +// A simple implementation of make-array +function makeArray (subject) { + return Array.isArray(subject) + ? subject + : [subject] +} + +const REGEX_TEST_BLANK_LINE = /^\s+$/ +const REGEX_REPLACE_LEADING_EXCAPED_EXCLAMATION = /^\\!/ +const REGEX_REPLACE_LEADING_EXCAPED_HASH = /^\\#/ +const REGEX_SPLITALL_CRLF = /\r?\n/g +// /foo, +// ./foo, +// ../foo, +// . +// .. +const REGEX_TEST_INVALID_PATH = /^\.*\/|^\.+$/ + +const SLASH = '/' +const KEY_IGNORE = typeof Symbol !== 'undefined' + ? Symbol.for('node-ignore') + /* istanbul ignore next */ + : 'node-ignore' + +const define = (object, key, value) => + Object.defineProperty(object, key, {value}) + +const REGEX_REGEXP_RANGE = /([0-z])-([0-z])/g + +// Sanitize the range of a regular expression +// The cases are complicated, see test cases for details +const sanitizeRange = range => range.replace( + REGEX_REGEXP_RANGE, + (match, from, to) => from.charCodeAt(0) <= to.charCodeAt(0) + ? match + // Invalid range (out of order) which is ok for gitignore rules but + // fatal for JavaScript regular expression, so eliminate it. + : '' +) + +// > If the pattern ends with a slash, +// > it is removed for the purpose of the following description, +// > but it would only find a match with a directory. +// > In other words, foo/ will match a directory foo and paths underneath it, +// > but will not match a regular file or a symbolic link foo +// > (this is consistent with the way how pathspec works in general in Git). +// '`foo/`' will not match regular file '`foo`' or symbolic link '`foo`' +// -> ignore-rules will not deal with it, because it costs extra `fs.stat` call +// you could use option `mark: true` with `glob` + +// '`foo/`' should not continue with the '`..`' +const DEFAULT_REPLACER_PREFIX = [ + + // > Trailing spaces are ignored unless they are quoted with backslash ("\") + [ + // (a\ ) -> (a ) + // (a ) -> (a) + // (a \ ) -> (a ) + /\\?\s+$/, + match => match.indexOf('\\') === 0 + ? ' ' + : '' + ], + + // replace (\ ) with ' ' + [ + /\\\s/g, + () => ' ' + ], + + // Escape metacharacters + // which is written down by users but means special for regular expressions. + + // > There are 12 characters with special meanings: + // > - the backslash \, + // > - the caret ^, + // > - the dollar sign $, + // > - the period or dot ., + // > - the vertical bar or pipe symbol |, + // > - the question mark ?, + // > - the asterisk or star *, + // > - the plus sign +, + // > - the opening parenthesis (, + // > - the closing parenthesis ), + // > - and the opening square bracket [, + // > - the opening curly brace {, + // > These special characters are often called "metacharacters". + [ + /[\\^$.|*+(){]/g, + match => `\\${match}` + ], + + [ + // > [abc] matches any character inside the brackets + // > (in this case a, b, or c); + /\[([^\]/]*)($|\])/g, + (match, p1, p2) => p2 === ']' + ? `[${sanitizeRange(p1)}]` + : `\\${match}` + ], + + [ + // > a question mark (?) matches a single character + /(?!\\)\?/g, + () => '[^/]' + ], + + // leading slash + [ + + // > A leading slash matches the beginning of the pathname. + // > For example, "/*.c" matches "cat-file.c" but not "mozilla-sha1/sha1.c". + // A leading slash matches the beginning of the pathname + /^\//, + () => '^' + ], + + // replace special metacharacter slash after the leading slash + [ + /\//g, + () => '\\/' + ], + + [ + // > A leading "**" followed by a slash means match in all directories. + // > For example, "**/foo" matches file or directory "foo" anywhere, + // > the same as pattern "foo". + // > "**/foo/bar" matches file or directory "bar" anywhere that is directly + // > under directory "foo". + // Notice that the '*'s have been replaced as '\\*' + /^\^*\\\*\\\*\\\//, + + // '**/foo' <-> 'foo' + () => '^(?:.*\\/)?' + ] +] + +const DEFAULT_REPLACER_SUFFIX = [ + // starting + [ + // there will be no leading '/' + // (which has been replaced by section "leading slash") + // If starts with '**', adding a '^' to the regular expression also works + /^(?=[^^])/, + function startingReplacer () { + return !/\/(?!$)/.test(this) + // > If the pattern does not contain a slash /, + // > Git treats it as a shell glob pattern + // Actually, if there is only a trailing slash, + // git also treats it as a shell glob pattern + ? '(?:^|\\/)' + + // > Otherwise, Git treats the pattern as a shell glob suitable for + // > consumption by fnmatch(3) + : '^' + } + ], + + // two globstars + [ + // Use lookahead assertions so that we could match more than one `'/**'` + /\\\/\\\*\\\*(?=\\\/|$)/g, + + // Zero, one or several directories + // should not use '*', or it will be replaced by the next replacer + + // Check if it is not the last `'/**'` + (_, index, str) => index + 6 < str.length + + // case: /**/ + // > A slash followed by two consecutive asterisks then a slash matches + // > zero or more directories. + // > For example, "a/**/b" matches "a/b", "a/x/b", "a/x/y/b" and so on. + // '/**/' + ? '(?:\\/[^\\/]+)*' + + // case: /** + // > A trailing `"/**"` matches everything inside. + + // #21: everything inside but it should not include the current folder + : '\\/.+' + ], + + // intermediate wildcards + [ + // Never replace escaped '*' + // ignore rule '\*' will match the path '*' + + // 'abc.*/' -> go + // 'abc.*' -> skip this rule + /(^|[^\\]+)\\\*(?=.+)/g, + + // '*.js' matches '.js' + // '*.js' doesn't match 'abc' + (_, p1) => `${p1}[^\\/]*` + ], + + // trailing wildcard + [ + /(\^|\\\/)?\\\*$/, + (_, p1) => { + const prefix = p1 + // '\^': + // '/*' does not match '' + // '/*' does not match everything + + // '\\\/': + // 'abc/*' does not match 'abc/' + ? `${p1}[^/]+` + + // 'a*' matches 'a' + // 'a*' matches 'aa' + : '[^/]*' + + return `${prefix}(?=$|\\/$)` + } + ], + + [ + // unescape + /\\\\\\/g, + () => '\\' + ] +] + +const POSITIVE_REPLACERS = [ + ...DEFAULT_REPLACER_PREFIX, + + // 'f' + // matches + // - /f(end) + // - /f/ + // - (start)f(end) + // - (start)f/ + // doesn't match + // - oof + // - foo + // pseudo: + // -> (^|/)f(/|$) + + // ending + [ + // 'js' will not match 'js.' + // 'ab' will not match 'abc' + /(?:[^*/])$/, + + // 'js*' will not match 'a.js' + // 'js/' will not match 'a.js' + // 'js' will match 'a.js' and 'a.js/' + match => `${match}(?=$|\\/)` + ], + + ...DEFAULT_REPLACER_SUFFIX +] + +const NEGATIVE_REPLACERS = [ + ...DEFAULT_REPLACER_PREFIX, + + // #24, #38 + // The MISSING rule of [gitignore docs](https://git-scm.com/docs/gitignore) + // A negative pattern without a trailing wildcard should not + // re-include the things inside that directory. + + // eg: + // ['node_modules/*', '!node_modules'] + // should ignore `node_modules/a.js` + [ + /(?:[^*])$/, + match => `${match}(?=$|\\/$)` + ], + + ...DEFAULT_REPLACER_SUFFIX +] + +// A simple cache, because an ignore rule only has only one certain meaning +const regexCache = Object.create(null) + +// @param {pattern} +const makeRegex = (pattern, negative, ignorecase) => { + const r = regexCache[pattern] + if (r) { + return r + } + + const replacers = negative + ? NEGATIVE_REPLACERS + : POSITIVE_REPLACERS + + const source = replacers.reduce( + (prev, current) => prev.replace(current[0], current[1].bind(pattern)), + pattern + ) + + return regexCache[pattern] = ignorecase + ? new RegExp(source, 'i') + : new RegExp(source) +} + +const isString = subject => typeof subject === 'string' + +// > A blank line matches no files, so it can serve as a separator for readability. +const checkPattern = pattern => pattern + && isString(pattern) + && !REGEX_TEST_BLANK_LINE.test(pattern) + + // > A line starting with # serves as a comment. + && pattern.indexOf('#') !== 0 + +const splitPattern = pattern => pattern.split(REGEX_SPLITALL_CRLF) + +class IgnoreRule { + constructor ( + origin, + pattern, + negative, + regex + ) { + this.origin = origin + this.pattern = pattern + this.negative = negative + this.regex = regex + } +} + +const createRule = (pattern, ignorecase) => { + const origin = pattern + let negative = false + + // > An optional prefix "!" which negates the pattern; + if (pattern.indexOf('!') === 0) { + negative = true + pattern = pattern.substr(1) + } + pattern = pattern + // > Put a backslash ("\") in front of the first "!" for patterns that + // > begin with a literal "!", for example, `"\!important!.txt"`. + .replace(REGEX_REPLACE_LEADING_EXCAPED_EXCLAMATION, '!') + // > Put a backslash ("\") in front of the first hash for patterns that + // > begin with a hash. + .replace(REGEX_REPLACE_LEADING_EXCAPED_HASH, '#') -/***/ }), -/* 656 */ -/***/ (function(module, exports, __webpack_require__) { + const regex = makeRegex(pattern, negative, ignorecase) -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const fsStat = __webpack_require__(623); -const fsWalk = __webpack_require__(628); -const reader_1 = __webpack_require__(648); -class ReaderSync extends reader_1.default { - constructor() { - super(...arguments); - this._walkSync = fsWalk.walkSync; - this._statSync = fsStat.statSync; - } - dynamic(root, options) { - return this._walkSync(root, options); - } - static(patterns, options) { - const entries = []; - for (const pattern of patterns) { - const filepath = this._getFullEntryPath(pattern); - const entry = this._getEntry(filepath, pattern, options); - if (entry === null || !options.entryFilter(entry)) { - continue; - } - entries.push(entry); - } - return entries; - } - _getEntry(filepath, pattern, options) { - try { - const stats = this._getStat(filepath); - return this._makeEntry(stats, pattern); - } - catch (error) { - if (options.errorFilter(error)) { - return null; - } - throw error; - } - } - _getStat(filepath) { - return this._statSync(filepath, this._fsStatSettings); - } -} -exports.default = ReaderSync; + return new IgnoreRule( + origin, + pattern, + negative, + regex + ) +} +const throwError = (message, Ctor) => { + throw new Ctor(message) +} -/***/ }), -/* 657 */ -/***/ (function(module, exports, __webpack_require__) { +const checkPath = (path, originalPath, doThrow) => { + if (!isString(path)) { + return doThrow( + `path must be a string, but got \`${originalPath}\``, + TypeError + ) + } -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const fs = __webpack_require__(23); -const os = __webpack_require__(11); -const CPU_COUNT = os.cpus().length; -exports.DEFAULT_FILE_SYSTEM_ADAPTER = { - lstat: fs.lstat, - lstatSync: fs.lstatSync, - stat: fs.stat, - statSync: fs.statSync, - readdir: fs.readdir, - readdirSync: fs.readdirSync -}; -// tslint:enable no-redundant-jsdoc -class Settings { - constructor(_options = {}) { - this._options = _options; - this.absolute = this._getValue(this._options.absolute, false); - this.baseNameMatch = this._getValue(this._options.baseNameMatch, false); - this.braceExpansion = this._getValue(this._options.braceExpansion, true); - this.caseSensitiveMatch = this._getValue(this._options.caseSensitiveMatch, true); - this.concurrency = this._getValue(this._options.concurrency, CPU_COUNT); - this.cwd = this._getValue(this._options.cwd, process.cwd()); - this.deep = this._getValue(this._options.deep, Infinity); - this.dot = this._getValue(this._options.dot, false); - this.extglob = this._getValue(this._options.extglob, true); - this.followSymbolicLinks = this._getValue(this._options.followSymbolicLinks, true); - this.fs = this._getFileSystemMethods(this._options.fs); - this.globstar = this._getValue(this._options.globstar, true); - this.ignore = this._getValue(this._options.ignore, []); - this.markDirectories = this._getValue(this._options.markDirectories, false); - this.objectMode = this._getValue(this._options.objectMode, false); - this.onlyDirectories = this._getValue(this._options.onlyDirectories, false); - this.onlyFiles = this._getValue(this._options.onlyFiles, true); - this.stats = this._getValue(this._options.stats, false); - this.suppressErrors = this._getValue(this._options.suppressErrors, false); - this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, false); - this.unique = this._getValue(this._options.unique, true); - if (this.onlyDirectories) { - this.onlyFiles = false; - } - if (this.stats) { - this.objectMode = true; - } - } - _getValue(option, value) { - return option === undefined ? value : option; - } - _getFileSystemMethods(methods = {}) { - return Object.assign({}, exports.DEFAULT_FILE_SYSTEM_ADAPTER, methods); - } -} -exports.default = Settings; + // We don't know if we should ignore '', so throw + if (!path) { + return doThrow(`path must not be empty`, TypeError) + } + // Check if it is a relative path + if (checkPath.isNotRelative(path)) { + const r = '`path.relative()`d' + return doThrow( + `path should be a ${r} string, but got "${originalPath}"`, + RangeError + ) + } -/***/ }), -/* 658 */ -/***/ (function(module, exports, __webpack_require__) { + return true +} -"use strict"; +const isNotRelative = path => REGEX_TEST_INVALID_PATH.test(path) -const path = __webpack_require__(16); -const pathType = __webpack_require__(659); +checkPath.isNotRelative = isNotRelative +checkPath.convert = p => p -const getExtensions = extensions => extensions.length > 1 ? `{${extensions.join(',')}}` : extensions[0]; +class Ignore { + constructor ({ + ignorecase = true + } = {}) { + this._rules = [] + this._ignorecase = ignorecase + define(this, KEY_IGNORE, true) + this._initCache() + } -const getPath = (filepath, cwd) => { - const pth = filepath[0] === '!' ? filepath.slice(1) : filepath; - return path.isAbsolute(pth) ? pth : path.join(cwd, pth); -}; + _initCache () { + this._ignoreCache = Object.create(null) + this._testCache = Object.create(null) + } -const addExtensions = (file, extensions) => { - if (path.extname(file)) { - return `**/${file}`; - } + _addPattern (pattern) { + // #32 + if (pattern && pattern[KEY_IGNORE]) { + this._rules = this._rules.concat(pattern._rules) + this._added = true + return + } - return `**/${file}.${getExtensions(extensions)}`; -}; + if (checkPattern(pattern)) { + const rule = createRule(pattern, this._ignorecase) + this._added = true + this._rules.push(rule) + } + } -const getGlob = (directory, options) => { - if (options.files && !Array.isArray(options.files)) { - throw new TypeError(`Expected \`files\` to be of type \`Array\` but received type \`${typeof options.files}\``); - } + // @param {Array | string | Ignore} pattern + add (pattern) { + this._added = false - if (options.extensions && !Array.isArray(options.extensions)) { - throw new TypeError(`Expected \`extensions\` to be of type \`Array\` but received type \`${typeof options.extensions}\``); - } + makeArray( + isString(pattern) + ? splitPattern(pattern) + : pattern + ).forEach(this._addPattern, this) - if (options.files && options.extensions) { - return options.files.map(x => path.posix.join(directory, addExtensions(x, options.extensions))); - } + // Some rules have just added to the ignore, + // making the behavior changed. + if (this._added) { + this._initCache() + } - if (options.files) { - return options.files.map(x => path.posix.join(directory, `**/${x}`)); - } + return this + } - if (options.extensions) { - return [path.posix.join(directory, `**/*.${getExtensions(options.extensions)}`)]; - } + // legacy + addPattern (pattern) { + return this.add(pattern) + } - return [path.posix.join(directory, '**')]; -}; + // | ignored : unignored + // negative | 0:0 | 0:1 | 1:0 | 1:1 + // -------- | ------- | ------- | ------- | -------- + // 0 | TEST | TEST | SKIP | X + // 1 | TESTIF | SKIP | TEST | X -module.exports = async (input, options) => { - options = { - cwd: process.cwd(), - ...options - }; + // - SKIP: always skip + // - TEST: always test + // - TESTIF: only test if checkUnignored + // - X: that never happen - if (typeof options.cwd !== 'string') { - throw new TypeError(`Expected \`cwd\` to be of type \`string\` but received type \`${typeof options.cwd}\``); - } + // @param {boolean} whether should check if the path is unignored, + // setting `checkUnignored` to `false` could reduce additional + // path matching. - const globs = await Promise.all([].concat(input).map(async x => { - const isDirectory = await pathType.isDirectory(getPath(x, options.cwd)); - return isDirectory ? getGlob(x, options) : x; - })); + // @returns {TestResult} true if a file is ignored + _testOne (path, checkUnignored) { + let ignored = false + let unignored = false - return [].concat.apply([], globs); // eslint-disable-line prefer-spread -}; + this._rules.forEach(rule => { + const {negative} = rule + if ( + unignored === negative && ignored !== unignored + || negative && !ignored && !unignored && !checkUnignored + ) { + return + } -module.exports.sync = (input, options) => { - options = { - cwd: process.cwd(), - ...options - }; + const matched = rule.regex.test(path) - if (typeof options.cwd !== 'string') { - throw new TypeError(`Expected \`cwd\` to be of type \`string\` but received type \`${typeof options.cwd}\``); - } + if (matched) { + ignored = !negative + unignored = negative + } + }) - const globs = [].concat(input).map(x => pathType.isDirectorySync(getPath(x, options.cwd)) ? getGlob(x, options) : x); + return { + ignored, + unignored + } + } - return [].concat.apply([], globs); // eslint-disable-line prefer-spread -}; + // @returns {TestResult} + _test (originalPath, cache, checkUnignored, slices) { + const path = originalPath + // Supports nullable path + && checkPath.convert(originalPath) + checkPath(path, originalPath, throwError) -/***/ }), -/* 659 */ -/***/ (function(module, exports, __webpack_require__) { + return this._t(path, cache, checkUnignored, slices) + } -"use strict"; + _t (path, cache, checkUnignored, slices) { + if (path in cache) { + return cache[path] + } -const {promisify} = __webpack_require__(29); -const fs = __webpack_require__(23); + if (!slices) { + // path/to/a.js + // ['path', 'to', 'a.js'] + slices = path.split(SLASH) + } -async function isType(fsStatType, statsMethodName, filePath) { - if (typeof filePath !== 'string') { - throw new TypeError(`Expected a string, got ${typeof filePath}`); - } + slices.pop() - try { - const stats = await promisify(fs[fsStatType])(filePath); - return stats[statsMethodName](); - } catch (error) { - if (error.code === 'ENOENT') { - return false; - } + // If the path has no parent directory, just test it + if (!slices.length) { + return cache[path] = this._testOne(path, checkUnignored) + } - throw error; - } -} + const parent = this._t( + slices.join(SLASH) + SLASH, + cache, + checkUnignored, + slices + ) -function isTypeSync(fsStatType, statsMethodName, filePath) { - if (typeof filePath !== 'string') { - throw new TypeError(`Expected a string, got ${typeof filePath}`); - } + // If the path contains a parent directory, check the parent first + return cache[path] = parent.ignored + // > It is not possible to re-include a file if a parent directory of + // > that file is excluded. + ? parent + : this._testOne(path, checkUnignored) + } - try { - return fs[fsStatType](filePath)[statsMethodName](); - } catch (error) { - if (error.code === 'ENOENT') { - return false; - } + ignores (path) { + return this._test(path, this._ignoreCache, false).ignored + } - throw error; - } + createFilter () { + return path => !this.ignores(path) + } + + filter (paths) { + return makeArray(paths).filter(this.createFilter()) + } + + // @returns {TestResult} + test (path) { + return this._test(path, this._testCache, true) + } } -exports.isFile = isType.bind(null, 'stat', 'isFile'); -exports.isDirectory = isType.bind(null, 'stat', 'isDirectory'); -exports.isSymlink = isType.bind(null, 'lstat', 'isSymbolicLink'); -exports.isFileSync = isTypeSync.bind(null, 'statSync', 'isFile'); -exports.isDirectorySync = isTypeSync.bind(null, 'statSync', 'isDirectory'); -exports.isSymlinkSync = isTypeSync.bind(null, 'lstatSync', 'isSymbolicLink'); +const factory = options => new Ignore(options) +const returnFalse = () => false -/***/ }), -/* 660 */ -/***/ (function(module, exports, __webpack_require__) { +const isPathValid = path => + checkPath(path && checkPath.convert(path), path, returnFalse) -"use strict"; +factory.isPathValid = isPathValid -const {promisify} = __webpack_require__(29); -const fs = __webpack_require__(23); -const path = __webpack_require__(16); -const fastGlob = __webpack_require__(592); -const gitIgnore = __webpack_require__(661); -const slash = __webpack_require__(662); +// Fixes typescript +factory.default = factory -const DEFAULT_IGNORE = [ - '**/node_modules/**', - '**/flow-typed/**', - '**/coverage/**', - '**/.git' -]; +module.exports = factory -const readFileP = promisify(fs.readFile); +// Windows +// -------------------------------------------------------------- +/* istanbul ignore if */ +if ( + // Detect `process` so that it can run in browsers. + typeof process !== 'undefined' + && ( + process.env && process.env.IGNORE_TEST_WIN32 + || process.platform === 'win32' + ) +) { + /* eslint no-control-regex: "off" */ + const makePosix = str => /^\\\\\?\\/.test(str) + || /["<>|\u0000-\u001F]+/u.test(str) + ? str + : str.replace(/\\/g, '/') -const mapGitIgnorePatternTo = base => ignore => { - if (ignore.startsWith('!')) { - return '!' + path.posix.join(base, ignore.slice(1)); - } + checkPath.convert = makePosix - return path.posix.join(base, ignore); -}; + // 'C:\\foo' <- 'C:\\foo' has been converted to 'C:/' + // 'd:\\foo' + const REGIX_IS_WINDOWS_PATH_ABSOLUTE = /^[a-z]:\//i + checkPath.isNotRelative = path => + REGIX_IS_WINDOWS_PATH_ABSOLUTE.test(path) + || isNotRelative(path) +} -const parseGitIgnore = (content, options) => { - const base = slash(path.relative(options.cwd, path.dirname(options.fileName))); - return content - .split(/\r?\n/) - .filter(Boolean) - .filter(line => !line.startsWith('#')) - .map(mapGitIgnorePatternTo(base)); -}; +/***/ }), +/* 667 */ +/***/ (function(module, exports, __webpack_require__) { -const reduceIgnore = files => { - return files.reduce((ignores, file) => { - ignores.add(parseGitIgnore(file.content, { - cwd: file.cwd, - fileName: file.filePath - })); - return ignores; - }, gitIgnore()); -}; +"use strict"; -const ensureAbsolutePathForCwd = (cwd, p) => { - if (path.isAbsolute(p)) { - if (p.startsWith(cwd)) { - return p; - } +module.exports = path => { + const isExtendedLengthPath = /^\\\\\?\\/.test(path); + const hasNonAscii = /[^\u0000-\u0080]+/.test(path); // eslint-disable-line no-control-regex - throw new Error(`Path ${p} is not in cwd ${cwd}`); + if (isExtendedLengthPath || hasNonAscii) { + return path; } - return path.join(cwd, p); -}; - -const getIsIgnoredPredecate = (ignores, cwd) => { - return p => ignores.ignores(slash(path.relative(cwd, ensureAbsolutePathForCwd(cwd, p)))); + return path.replace(/\\/g, '/'); }; -const getFile = async (file, cwd) => { - const filePath = path.join(cwd, file); - const content = await readFileP(filePath, 'utf8'); - - return { - cwd, - filePath, - content - }; -}; -const getFileSync = (file, cwd) => { - const filePath = path.join(cwd, file); - const content = fs.readFileSync(filePath, 'utf8'); +/***/ }), +/* 668 */ +/***/ (function(module, exports, __webpack_require__) { - return { - cwd, - filePath, - content - }; -}; +"use strict"; -const normalizeOptions = ({ - ignore = [], - cwd = process.cwd() -} = {}) => { - return {ignore, cwd}; -}; +const {Transform} = __webpack_require__(27); -module.exports = async options => { - options = normalizeOptions(options); +class ObjectTransform extends Transform { + constructor() { + super({ + objectMode: true + }); + } +} - const paths = await fastGlob('**/.gitignore', { - ignore: DEFAULT_IGNORE.concat(options.ignore), - cwd: options.cwd - }); +class FilterStream extends ObjectTransform { + constructor(filter) { + super(); + this._filter = filter; + } - const files = await Promise.all(paths.map(file => getFile(file, options.cwd))); - const ignores = reduceIgnore(files); + _transform(data, encoding, callback) { + if (this._filter(data)) { + this.push(data); + } - return getIsIgnoredPredecate(ignores, options.cwd); -}; + callback(); + } +} -module.exports.sync = options => { - options = normalizeOptions(options); +class UniqueStream extends ObjectTransform { + constructor() { + super(); + this._pushed = new Set(); + } - const paths = fastGlob.sync('**/.gitignore', { - ignore: DEFAULT_IGNORE.concat(options.ignore), - cwd: options.cwd - }); + _transform(data, encoding, callback) { + if (!this._pushed.has(data)) { + this.push(data); + this._pushed.add(data); + } - const files = paths.map(file => getFileSync(file, options.cwd)); - const ignores = reduceIgnore(files); + callback(); + } +} - return getIsIgnoredPredecate(ignores, options.cwd); +module.exports = { + FilterStream, + UniqueStream }; /***/ }), -/* 661 */ -/***/ (function(module, exports) { +/* 669 */ +/***/ (function(module, exports, __webpack_require__) { -// A simple implementation of make-array -function makeArray (subject) { - return Array.isArray(subject) - ? subject - : [subject] -} +"use strict"; -const REGEX_TEST_BLANK_LINE = /^\s+$/ -const REGEX_REPLACE_LEADING_EXCAPED_EXCLAMATION = /^\\!/ -const REGEX_REPLACE_LEADING_EXCAPED_HASH = /^\\#/ -const REGEX_SPLITALL_CRLF = /\r?\n/g -// /foo, -// ./foo, -// ../foo, -// . -// .. -const REGEX_TEST_INVALID_PATH = /^\.*\/|^\.+$/ +const path = __webpack_require__(16); -const SLASH = '/' -const KEY_IGNORE = typeof Symbol !== 'undefined' - ? Symbol.for('node-ignore') - /* istanbul ignore next */ - : 'node-ignore' +module.exports = path_ => { + let cwd = process.cwd(); -const define = (object, key, value) => - Object.defineProperty(object, key, {value}) + path_ = path.resolve(path_); -const REGEX_REGEXP_RANGE = /([0-z])-([0-z])/g + if (process.platform === 'win32') { + cwd = cwd.toLowerCase(); + path_ = path_.toLowerCase(); + } -// Sanitize the range of a regular expression -// The cases are complicated, see test cases for details -const sanitizeRange = range => range.replace( - REGEX_REGEXP_RANGE, - (match, from, to) => from.charCodeAt(0) <= to.charCodeAt(0) - ? match - // Invalid range (out of order) which is ok for gitignore rules but - // fatal for JavaScript regular expression, so eliminate it. - : '' -) + return path_ === cwd; +}; -// > If the pattern ends with a slash, -// > it is removed for the purpose of the following description, -// > but it would only find a match with a directory. -// > In other words, foo/ will match a directory foo and paths underneath it, -// > but will not match a regular file or a symbolic link foo -// > (this is consistent with the way how pathspec works in general in Git). -// '`foo/`' will not match regular file '`foo`' or symbolic link '`foo`' -// -> ignore-rules will not deal with it, because it costs extra `fs.stat` call -// you could use option `mark: true` with `glob` -// '`foo/`' should not continue with the '`..`' -const DEFAULT_REPLACER_PREFIX = [ +/***/ }), +/* 670 */ +/***/ (function(module, exports, __webpack_require__) { - // > Trailing spaces are ignored unless they are quoted with backslash ("\") - [ - // (a\ ) -> (a ) - // (a ) -> (a) - // (a \ ) -> (a ) - /\\?\s+$/, - match => match.indexOf('\\') === 0 - ? ' ' - : '' - ], +"use strict"; - // replace (\ ) with ' ' - [ - /\\\s/g, - () => ' ' - ], +const path = __webpack_require__(16); - // Escape metacharacters - // which is written down by users but means special for regular expressions. +module.exports = (childPath, parentPath) => { + childPath = path.resolve(childPath); + parentPath = path.resolve(parentPath); - // > There are 12 characters with special meanings: - // > - the backslash \, - // > - the caret ^, - // > - the dollar sign $, - // > - the period or dot ., - // > - the vertical bar or pipe symbol |, - // > - the question mark ?, - // > - the asterisk or star *, - // > - the plus sign +, - // > - the opening parenthesis (, - // > - the closing parenthesis ), - // > - and the opening square bracket [, - // > - the opening curly brace {, - // > These special characters are often called "metacharacters". - [ - /[\\^$.|*+(){]/g, - match => `\\${match}` - ], + if (process.platform === 'win32') { + childPath = childPath.toLowerCase(); + parentPath = parentPath.toLowerCase(); + } - [ - // > [abc] matches any character inside the brackets - // > (in this case a, b, or c); - /\[([^\]/]*)($|\])/g, - (match, p1, p2) => p2 === ']' - ? `[${sanitizeRange(p1)}]` - : `\\${match}` - ], + if (childPath === parentPath) { + return false; + } - [ - // > a question mark (?) matches a single character - /(?!\\)\?/g, - () => '[^/]' - ], + childPath += path.sep; + parentPath += path.sep; - // leading slash - [ + return childPath.startsWith(parentPath); +}; - // > A leading slash matches the beginning of the pathname. - // > For example, "/*.c" matches "cat-file.c" but not "mozilla-sha1/sha1.c". - // A leading slash matches the beginning of the pathname - /^\//, - () => '^' - ], - // replace special metacharacter slash after the leading slash - [ - /\//g, - () => '\\/' - ], +/***/ }), +/* 671 */ +/***/ (function(module, exports, __webpack_require__) { - [ - // > A leading "**" followed by a slash means match in all directories. - // > For example, "**/foo" matches file or directory "foo" anywhere, - // > the same as pattern "foo". - // > "**/foo/bar" matches file or directory "bar" anywhere that is directly - // > under directory "foo". - // Notice that the '*'s have been replaced as '\\*' - /^\^*\\\*\\\*\\\//, +const assert = __webpack_require__(30) +const path = __webpack_require__(16) +const fs = __webpack_require__(23) +let glob = undefined +try { + glob = __webpack_require__(592) +} catch (_err) { + // treat glob as optional. +} - // '**/foo' <-> 'foo' - () => '^(?:.*\\/)?' - ] -] +const defaultGlobOpts = { + nosort: true, + silent: true +} -const DEFAULT_REPLACER_SUFFIX = [ - // starting - [ - // there will be no leading '/' - // (which has been replaced by section "leading slash") - // If starts with '**', adding a '^' to the regular expression also works - /^(?=[^^])/, - function startingReplacer () { - return !/\/(?!$)/.test(this) - // > If the pattern does not contain a slash /, - // > Git treats it as a shell glob pattern - // Actually, if there is only a trailing slash, - // git also treats it as a shell glob pattern - ? '(?:^|\\/)' +// for EMFILE handling +let timeout = 0 - // > Otherwise, Git treats the pattern as a shell glob suitable for - // > consumption by fnmatch(3) - : '^' - } - ], +const isWindows = (process.platform === "win32") - // two globstars - [ - // Use lookahead assertions so that we could match more than one `'/**'` - /\\\/\\\*\\\*(?=\\\/|$)/g, +const defaults = options => { + const methods = [ + 'unlink', + 'chmod', + 'stat', + 'lstat', + 'rmdir', + 'readdir' + ] + methods.forEach(m => { + options[m] = options[m] || fs[m] + m = m + 'Sync' + options[m] = options[m] || fs[m] + }) - // Zero, one or several directories - // should not use '*', or it will be replaced by the next replacer + options.maxBusyTries = options.maxBusyTries || 3 + options.emfileWait = options.emfileWait || 1000 + if (options.glob === false) { + options.disableGlob = true + } + if (options.disableGlob !== true && glob === undefined) { + throw Error('glob dependency not found, set `options.disableGlob = true` if intentional') + } + options.disableGlob = options.disableGlob || false + options.glob = options.glob || defaultGlobOpts +} - // Check if it is not the last `'/**'` - (_, index, str) => index + 6 < str.length +const rimraf = (p, options, cb) => { + if (typeof options === 'function') { + cb = options + options = {} + } - // case: /**/ - // > A slash followed by two consecutive asterisks then a slash matches - // > zero or more directories. - // > For example, "a/**/b" matches "a/b", "a/x/b", "a/x/y/b" and so on. - // '/**/' - ? '(?:\\/[^\\/]+)*' + assert(p, 'rimraf: missing path') + assert.equal(typeof p, 'string', 'rimraf: path should be a string') + assert.equal(typeof cb, 'function', 'rimraf: callback function required') + assert(options, 'rimraf: invalid options argument provided') + assert.equal(typeof options, 'object', 'rimraf: options should be object') - // case: /** - // > A trailing `"/**"` matches everything inside. + defaults(options) - // #21: everything inside but it should not include the current folder - : '\\/.+' - ], + let busyTries = 0 + let errState = null + let n = 0 - // intermediate wildcards - [ - // Never replace escaped '*' - // ignore rule '\*' will match the path '*' + const next = (er) => { + errState = errState || er + if (--n === 0) + cb(errState) + } - // 'abc.*/' -> go - // 'abc.*' -> skip this rule - /(^|[^\\]+)\\\*(?=.+)/g, + const afterGlob = (er, results) => { + if (er) + return cb(er) - // '*.js' matches '.js' - // '*.js' doesn't match 'abc' - (_, p1) => `${p1}[^\\/]*` - ], + n = results.length + if (n === 0) + return cb() - // trailing wildcard - [ - /(\^|\\\/)?\\\*$/, - (_, p1) => { - const prefix = p1 - // '\^': - // '/*' does not match '' - // '/*' does not match everything + results.forEach(p => { + const CB = (er) => { + if (er) { + if ((er.code === "EBUSY" || er.code === "ENOTEMPTY" || er.code === "EPERM") && + busyTries < options.maxBusyTries) { + busyTries ++ + // try again, with the same exact callback as this one. + return setTimeout(() => rimraf_(p, options, CB), busyTries * 100) + } - // '\\\/': - // 'abc/*' does not match 'abc/' - ? `${p1}[^/]+` + // this one won't happen if graceful-fs is used. + if (er.code === "EMFILE" && timeout < options.emfileWait) { + return setTimeout(() => rimraf_(p, options, CB), timeout ++) + } - // 'a*' matches 'a' - // 'a*' matches 'aa' - : '[^/]*' + // already gone + if (er.code === "ENOENT") er = null + } - return `${prefix}(?=$|\\/$)` - } - ], + timeout = 0 + next(er) + } + rimraf_(p, options, CB) + }) + } - [ - // unescape - /\\\\\\/g, - () => '\\' - ] -] + if (options.disableGlob || !glob.hasMagic(p)) + return afterGlob(null, [p]) -const POSITIVE_REPLACERS = [ - ...DEFAULT_REPLACER_PREFIX, + options.lstat(p, (er, stat) => { + if (!er) + return afterGlob(null, [p]) - // 'f' - // matches - // - /f(end) - // - /f/ - // - (start)f(end) - // - (start)f/ - // doesn't match - // - oof - // - foo - // pseudo: - // -> (^|/)f(/|$) + glob(p, options.glob, afterGlob) + }) - // ending - [ - // 'js' will not match 'js.' - // 'ab' will not match 'abc' - /(?:[^*/])$/, +} - // 'js*' will not match 'a.js' - // 'js/' will not match 'a.js' - // 'js' will match 'a.js' and 'a.js/' - match => `${match}(?=$|\\/)` - ], +// Two possible strategies. +// 1. Assume it's a file. unlink it, then do the dir stuff on EPERM or EISDIR +// 2. Assume it's a directory. readdir, then do the file stuff on ENOTDIR +// +// Both result in an extra syscall when you guess wrong. However, there +// are likely far more normal files in the world than directories. This +// is based on the assumption that a the average number of files per +// directory is >= 1. +// +// If anyone ever complains about this, then I guess the strategy could +// be made configurable somehow. But until then, YAGNI. +const rimraf_ = (p, options, cb) => { + assert(p) + assert(options) + assert(typeof cb === 'function') - ...DEFAULT_REPLACER_SUFFIX -] + // sunos lets the root user unlink directories, which is... weird. + // so we have to lstat here and make sure it's not a dir. + options.lstat(p, (er, st) => { + if (er && er.code === "ENOENT") + return cb(null) -const NEGATIVE_REPLACERS = [ - ...DEFAULT_REPLACER_PREFIX, + // Windows can EPERM on stat. Life is suffering. + if (er && er.code === "EPERM" && isWindows) + fixWinEPERM(p, options, er, cb) - // #24, #38 - // The MISSING rule of [gitignore docs](https://git-scm.com/docs/gitignore) - // A negative pattern without a trailing wildcard should not - // re-include the things inside that directory. + if (st && st.isDirectory()) + return rmdir(p, options, er, cb) - // eg: - // ['node_modules/*', '!node_modules'] - // should ignore `node_modules/a.js` - [ - /(?:[^*])$/, - match => `${match}(?=$|\\/$)` - ], + options.unlink(p, er => { + if (er) { + if (er.code === "ENOENT") + return cb(null) + if (er.code === "EPERM") + return (isWindows) + ? fixWinEPERM(p, options, er, cb) + : rmdir(p, options, er, cb) + if (er.code === "EISDIR") + return rmdir(p, options, er, cb) + } + return cb(er) + }) + }) +} - ...DEFAULT_REPLACER_SUFFIX -] +const fixWinEPERM = (p, options, er, cb) => { + assert(p) + assert(options) + assert(typeof cb === 'function') + if (er) + assert(er instanceof Error) -// A simple cache, because an ignore rule only has only one certain meaning -const regexCache = Object.create(null) + options.chmod(p, 0o666, er2 => { + if (er2) + cb(er2.code === "ENOENT" ? null : er) + else + options.stat(p, (er3, stats) => { + if (er3) + cb(er3.code === "ENOENT" ? null : er) + else if (stats.isDirectory()) + rmdir(p, options, er, cb) + else + options.unlink(p, cb) + }) + }) +} -// @param {pattern} -const makeRegex = (pattern, negative, ignorecase) => { - const r = regexCache[pattern] - if (r) { - return r +const fixWinEPERMSync = (p, options, er) => { + assert(p) + assert(options) + if (er) + assert(er instanceof Error) + + try { + options.chmodSync(p, 0o666) + } catch (er2) { + if (er2.code === "ENOENT") + return + else + throw er } - const replacers = negative - ? NEGATIVE_REPLACERS - : POSITIVE_REPLACERS + let stats + try { + stats = options.statSync(p) + } catch (er3) { + if (er3.code === "ENOENT") + return + else + throw er + } - const source = replacers.reduce( - (prev, current) => prev.replace(current[0], current[1].bind(pattern)), - pattern - ) + if (stats.isDirectory()) + rmdirSync(p, options, er) + else + options.unlinkSync(p) +} - return regexCache[pattern] = ignorecase - ? new RegExp(source, 'i') - : new RegExp(source) +const rmdir = (p, options, originalEr, cb) => { + assert(p) + assert(options) + if (originalEr) + assert(originalEr instanceof Error) + assert(typeof cb === 'function') + + // try to rmdir first, and only readdir on ENOTEMPTY or EEXIST (SunOS) + // if we guessed wrong, and it's not a directory, then + // raise the original error. + options.rmdir(p, er => { + if (er && (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM")) + rmkids(p, options, cb) + else if (er && er.code === "ENOTDIR") + cb(originalEr) + else + cb(er) + }) } -const isString = subject => typeof subject === 'string' +const rmkids = (p, options, cb) => { + assert(p) + assert(options) + assert(typeof cb === 'function') -// > A blank line matches no files, so it can serve as a separator for readability. -const checkPattern = pattern => pattern - && isString(pattern) - && !REGEX_TEST_BLANK_LINE.test(pattern) + options.readdir(p, (er, files) => { + if (er) + return cb(er) + let n = files.length + if (n === 0) + return options.rmdir(p, cb) + let errState + files.forEach(f => { + rimraf(path.join(p, f), options, er => { + if (errState) + return + if (er) + return cb(errState = er) + if (--n === 0) + options.rmdir(p, cb) + }) + }) + }) +} - // > A line starting with # serves as a comment. - && pattern.indexOf('#') !== 0 +// this looks simpler, and is strictly *faster*, but will +// tie up the JavaScript thread and fail on excessively +// deep directory trees. +const rimrafSync = (p, options) => { + options = options || {} + defaults(options) -const splitPattern = pattern => pattern.split(REGEX_SPLITALL_CRLF) + assert(p, 'rimraf: missing path') + assert.equal(typeof p, 'string', 'rimraf: path should be a string') + assert(options, 'rimraf: missing options') + assert.equal(typeof options, 'object', 'rimraf: options should be object') -class IgnoreRule { - constructor ( - origin, - pattern, - negative, - regex - ) { - this.origin = origin - this.pattern = pattern - this.negative = negative - this.regex = regex + let results + + if (options.disableGlob || !glob.hasMagic(p)) { + results = [p] + } else { + try { + options.lstatSync(p) + results = [p] + } catch (er) { + results = glob.sync(p, options.glob) + } } -} -const createRule = (pattern, ignorecase) => { - const origin = pattern - let negative = false + if (!results.length) + return - // > An optional prefix "!" which negates the pattern; - if (pattern.indexOf('!') === 0) { - negative = true - pattern = pattern.substr(1) - } + for (let i = 0; i < results.length; i++) { + const p = results[i] - pattern = pattern - // > Put a backslash ("\") in front of the first "!" for patterns that - // > begin with a literal "!", for example, `"\!important!.txt"`. - .replace(REGEX_REPLACE_LEADING_EXCAPED_EXCLAMATION, '!') - // > Put a backslash ("\") in front of the first hash for patterns that - // > begin with a hash. - .replace(REGEX_REPLACE_LEADING_EXCAPED_HASH, '#') + let st + try { + st = options.lstatSync(p) + } catch (er) { + if (er.code === "ENOENT") + return - const regex = makeRegex(pattern, negative, ignorecase) + // Windows can EPERM on stat. Life is suffering. + if (er.code === "EPERM" && isWindows) + fixWinEPERMSync(p, options, er) + } - return new IgnoreRule( - origin, - pattern, - negative, - regex - ) -} + try { + // sunos lets the root user unlink directories, which is... weird. + if (st && st.isDirectory()) + rmdirSync(p, options, null) + else + options.unlinkSync(p) + } catch (er) { + if (er.code === "ENOENT") + return + if (er.code === "EPERM") + return isWindows ? fixWinEPERMSync(p, options, er) : rmdirSync(p, options, er) + if (er.code !== "EISDIR") + throw er -const throwError = (message, Ctor) => { - throw new Ctor(message) + rmdirSync(p, options, er) + } + } } -const checkPath = (path, originalPath, doThrow) => { - if (!isString(path)) { - return doThrow( - `path must be a string, but got \`${originalPath}\``, - TypeError - ) - } +const rmdirSync = (p, options, originalEr) => { + assert(p) + assert(options) + if (originalEr) + assert(originalEr instanceof Error) - // We don't know if we should ignore '', so throw - if (!path) { - return doThrow(`path must not be empty`, TypeError) + try { + options.rmdirSync(p) + } catch (er) { + if (er.code === "ENOENT") + return + if (er.code === "ENOTDIR") + throw originalEr + if (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM") + rmkidsSync(p, options) } +} - // Check if it is a relative path - if (checkPath.isNotRelative(path)) { - const r = '`path.relative()`d' - return doThrow( - `path should be a ${r} string, but got "${originalPath}"`, - RangeError - ) - } +const rmkidsSync = (p, options) => { + assert(p) + assert(options) + options.readdirSync(p).forEach(f => rimrafSync(path.join(p, f), options)) - return true + // We only end up here once we got ENOTEMPTY at least once, and + // at this point, we are guaranteed to have removed all the kids. + // So, we know that it won't be ENOENT or ENOTDIR or anything else. + // try really hard to delete stuff on windows, because it has a + // PROFOUNDLY annoying habit of not closing handles promptly when + // files are deleted, resulting in spurious ENOTEMPTY errors. + const retries = isWindows ? 100 : 1 + let i = 0 + do { + let threw = true + try { + const ret = options.rmdirSync(p, options) + threw = false + return ret + } finally { + if (++i < retries && threw) + continue + } + } while (true) } -const isNotRelative = path => REGEX_TEST_INVALID_PATH.test(path) +module.exports = rimraf +rimraf.sync = rimrafSync -checkPath.isNotRelative = isNotRelative -checkPath.convert = p => p -class Ignore { - constructor ({ - ignorecase = true - } = {}) { - this._rules = [] - this._ignorecase = ignorecase - define(this, KEY_IGNORE, true) - this._initCache() - } +/***/ }), +/* 672 */ +/***/ (function(module, exports, __webpack_require__) { - _initCache () { - this._ignoreCache = Object.create(null) - this._testCache = Object.create(null) - } +"use strict"; - _addPattern (pattern) { - // #32 - if (pattern && pattern[KEY_IGNORE]) { - this._rules = this._rules.concat(pattern._rules) - this._added = true - return - } +const AggregateError = __webpack_require__(673); - if (checkPattern(pattern)) { - const rule = createRule(pattern, this._ignorecase) - this._added = true - this._rules.push(rule) - } - } +module.exports = async ( + iterable, + mapper, + { + concurrency = Infinity, + stopOnError = true + } = {} +) => { + return new Promise((resolve, reject) => { + if (typeof mapper !== 'function') { + throw new TypeError('Mapper function is required'); + } - // @param {Array | string | Ignore} pattern - add (pattern) { - this._added = false + if (!(typeof concurrency === 'number' && concurrency >= 1)) { + throw new TypeError(`Expected \`concurrency\` to be a number from 1 and up, got \`${concurrency}\` (${typeof concurrency})`); + } - makeArray( - isString(pattern) - ? splitPattern(pattern) - : pattern - ).forEach(this._addPattern, this) + const ret = []; + const errors = []; + const iterator = iterable[Symbol.iterator](); + let isRejected = false; + let isIterableDone = false; + let resolvingCount = 0; + let currentIndex = 0; - // Some rules have just added to the ignore, - // making the behavior changed. - if (this._added) { - this._initCache() - } + const next = () => { + if (isRejected) { + return; + } - return this - } + const nextItem = iterator.next(); + const i = currentIndex; + currentIndex++; - // legacy - addPattern (pattern) { - return this.add(pattern) - } + if (nextItem.done) { + isIterableDone = true; - // | ignored : unignored - // negative | 0:0 | 0:1 | 1:0 | 1:1 - // -------- | ------- | ------- | ------- | -------- - // 0 | TEST | TEST | SKIP | X - // 1 | TESTIF | SKIP | TEST | X + if (resolvingCount === 0) { + if (!stopOnError && errors.length !== 0) { + reject(new AggregateError(errors)); + } else { + resolve(ret); + } + } - // - SKIP: always skip - // - TEST: always test - // - TESTIF: only test if checkUnignored - // - X: that never happen + return; + } - // @param {boolean} whether should check if the path is unignored, - // setting `checkUnignored` to `false` could reduce additional - // path matching. + resolvingCount++; - // @returns {TestResult} true if a file is ignored - _testOne (path, checkUnignored) { - let ignored = false - let unignored = false + (async () => { + try { + const element = await nextItem.value; + ret[i] = await mapper(element, i); + resolvingCount--; + next(); + } catch (error) { + if (stopOnError) { + isRejected = true; + reject(error); + } else { + errors.push(error); + resolvingCount--; + next(); + } + } + })(); + }; - this._rules.forEach(rule => { - const {negative} = rule - if ( - unignored === negative && ignored !== unignored - || negative && !ignored && !unignored && !checkUnignored - ) { - return - } + for (let i = 0; i < concurrency; i++) { + next(); - const matched = rule.regex.test(path) + if (isIterableDone) { + break; + } + } + }); +}; - if (matched) { - ignored = !negative - unignored = negative - } - }) - return { - ignored, - unignored - } - } +/***/ }), +/* 673 */ +/***/ (function(module, exports, __webpack_require__) { - // @returns {TestResult} - _test (originalPath, cache, checkUnignored, slices) { - const path = originalPath - // Supports nullable path - && checkPath.convert(originalPath) +"use strict"; - checkPath(path, originalPath, throwError) +const indentString = __webpack_require__(674); +const cleanStack = __webpack_require__(675); - return this._t(path, cache, checkUnignored, slices) - } +const cleanInternalStack = stack => stack.replace(/\s+at .*aggregate-error\/index.js:\d+:\d+\)?/g, ''); - _t (path, cache, checkUnignored, slices) { - if (path in cache) { - return cache[path] - } +class AggregateError extends Error { + constructor(errors) { + if (!Array.isArray(errors)) { + throw new TypeError(`Expected input to be an Array, got ${typeof errors}`); + } - if (!slices) { - // path/to/a.js - // ['path', 'to', 'a.js'] - slices = path.split(SLASH) - } + errors = [...errors].map(error => { + if (error instanceof Error) { + return error; + } - slices.pop() + if (error !== null && typeof error === 'object') { + // Handle plain error objects with message property and/or possibly other metadata + return Object.assign(new Error(error.message), error); + } - // If the path has no parent directory, just test it - if (!slices.length) { - return cache[path] = this._testOne(path, checkUnignored) - } + return new Error(error); + }); - const parent = this._t( - slices.join(SLASH) + SLASH, - cache, - checkUnignored, - slices - ) + let message = errors + .map(error => { + // The `stack` property is not standardized, so we can't assume it exists + return typeof error.stack === 'string' ? cleanInternalStack(cleanStack(error.stack)) : String(error); + }) + .join('\n'); + message = '\n' + indentString(message, 4); + super(message); - // If the path contains a parent directory, check the parent first - return cache[path] = parent.ignored - // > It is not possible to re-include a file if a parent directory of - // > that file is excluded. - ? parent - : this._testOne(path, checkUnignored) - } + this.name = 'AggregateError'; - ignores (path) { - return this._test(path, this._ignoreCache, false).ignored - } + Object.defineProperty(this, '_errors', {value: errors}); + } - createFilter () { - return path => !this.ignores(path) - } + * [Symbol.iterator]() { + for (const error of this._errors) { + yield error; + } + } +} - filter (paths) { - return makeArray(paths).filter(this.createFilter()) - } +module.exports = AggregateError; - // @returns {TestResult} - test (path) { - return this._test(path, this._testCache, true) - } -} -const factory = options => new Ignore(options) +/***/ }), +/* 674 */ +/***/ (function(module, exports, __webpack_require__) { -const returnFalse = () => false +"use strict"; -const isPathValid = path => - checkPath(path && checkPath.convert(path), path, returnFalse) -factory.isPathValid = isPathValid +module.exports = (string, count = 1, options) => { + options = { + indent: ' ', + includeEmptyLines: false, + ...options + }; -// Fixes typescript -factory.default = factory + if (typeof string !== 'string') { + throw new TypeError( + `Expected \`input\` to be a \`string\`, got \`${typeof string}\`` + ); + } -module.exports = factory + if (typeof count !== 'number') { + throw new TypeError( + `Expected \`count\` to be a \`number\`, got \`${typeof count}\`` + ); + } -// Windows -// -------------------------------------------------------------- -/* istanbul ignore if */ -if ( - // Detect `process` so that it can run in browsers. - typeof process !== 'undefined' - && ( - process.env && process.env.IGNORE_TEST_WIN32 - || process.platform === 'win32' - ) -) { - /* eslint no-control-regex: "off" */ - const makePosix = str => /^\\\\\?\\/.test(str) - || /["<>|\u0000-\u001F]+/u.test(str) - ? str - : str.replace(/\\/g, '/') + if (typeof options.indent !== 'string') { + throw new TypeError( + `Expected \`options.indent\` to be a \`string\`, got \`${typeof options.indent}\`` + ); + } - checkPath.convert = makePosix + if (count === 0) { + return string; + } - // 'C:\\foo' <- 'C:\\foo' has been converted to 'C:/' - // 'd:\\foo' - const REGIX_IS_WINDOWS_PATH_ABSOLUTE = /^[a-z]:\//i - checkPath.isNotRelative = path => - REGIX_IS_WINDOWS_PATH_ABSOLUTE.test(path) - || isNotRelative(path) -} + const regex = options.includeEmptyLines ? /^/gm : /^(?!\s*$)/gm; + + return string.replace(regex, options.indent.repeat(count)); +}; /***/ }), -/* 662 */ +/* 675 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -module.exports = path => { - const isExtendedLengthPath = /^\\\\\?\\/.test(path); - const hasNonAscii = /[^\u0000-\u0080]+/.test(path); // eslint-disable-line no-control-regex +const os = __webpack_require__(11); - if (isExtendedLengthPath || hasNonAscii) { - return path; - } +const extractPathRegex = /\s+at.*(?:\(|\s)(.*)\)?/; +const pathRegex = /^(?:(?:(?:node|(?:internal\/[\w/]*|.*node_modules\/(?:babel-polyfill|pirates)\/.*)?\w+)\.js:\d+:\d+)|native)/; +const homeDir = typeof os.homedir === 'undefined' ? '' : os.homedir(); + +module.exports = (stack, options) => { + options = Object.assign({pretty: false}, options); + + return stack.replace(/\\/g, '/') + .split('\n') + .filter(line => { + const pathMatches = line.match(extractPathRegex); + if (pathMatches === null || !pathMatches[1]) { + return true; + } + + const match = pathMatches[1]; + + // Electron + if ( + match.includes('.app/Contents/Resources/electron.asar') || + match.includes('.app/Contents/Resources/default_app.asar') + ) { + return false; + } + + return !pathRegex.test(match); + }) + .filter(line => line.trim() !== '') + .map(line => { + if (options.pretty) { + return line.replace(extractPathRegex, (m, p1) => m.replace(p1, p1.replace(homeDir, '~'))); + } - return path.replace(/\\/g, '/'); + return line; + }) + .join('\n'); }; /***/ }), -/* 663 */ +/* 676 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const {Transform} = __webpack_require__(27); +const chalk = __webpack_require__(677); +const cliCursor = __webpack_require__(681); +const cliSpinners = __webpack_require__(685); +const logSymbols = __webpack_require__(566); -class ObjectTransform extends Transform { - constructor() { - super({ - objectMode: true - }); - } -} +class Ora { + constructor(options) { + if (typeof options === 'string') { + options = { + text: options + }; + } -class FilterStream extends ObjectTransform { - constructor(filter) { - super(); - this._filter = filter; - } + this.options = Object.assign({ + text: '', + color: 'cyan', + stream: process.stderr + }, options); - _transform(data, encoding, callback) { - if (this._filter(data)) { - this.push(data); - } + const sp = this.options.spinner; + this.spinner = typeof sp === 'object' ? sp : (process.platform === 'win32' ? cliSpinners.line : (cliSpinners[sp] || cliSpinners.dots)); // eslint-disable-line no-nested-ternary - callback(); - } -} + if (this.spinner.frames === undefined) { + throw new Error('Spinner must define `frames`'); + } -class UniqueStream extends ObjectTransform { - constructor() { - super(); - this._pushed = new Set(); + this.text = this.options.text; + this.color = this.options.color; + this.interval = this.options.interval || this.spinner.interval || 100; + this.stream = this.options.stream; + this.id = null; + this.frameIndex = 0; + this.enabled = typeof this.options.enabled === 'boolean' ? this.options.enabled : ((this.stream && this.stream.isTTY) && !process.env.CI); } + frame() { + const frames = this.spinner.frames; + let frame = frames[this.frameIndex]; - _transform(data, encoding, callback) { - if (!this._pushed.has(data)) { - this.push(data); - this._pushed.add(data); + if (this.color) { + frame = chalk[this.color](frame); } - callback(); - } -} + this.frameIndex = ++this.frameIndex % frames.length; -module.exports = { - FilterStream, - UniqueStream -}; + return frame + ' ' + this.text; + } + clear() { + if (!this.enabled) { + return this; + } + this.stream.clearLine(); + this.stream.cursorTo(0); -/***/ }), -/* 664 */ -/***/ (function(module, exports, __webpack_require__) { + return this; + } + render() { + this.clear(); + this.stream.write(this.frame()); -var fs = __webpack_require__(23) -var polyfills = __webpack_require__(665) -var legacy = __webpack_require__(666) -var clone = __webpack_require__(667) + return this; + } + start(text) { + if (text) { + this.text = text; + } -var util = __webpack_require__(29) + if (!this.enabled || this.id) { + return this; + } -/* istanbul ignore next - node 0.x polyfill */ -var gracefulQueue -var previousSymbol + cliCursor.hide(this.stream); + this.render(); + this.id = setInterval(this.render.bind(this), this.interval); -/* istanbul ignore else - node 0.x polyfill */ -if (typeof Symbol === 'function' && typeof Symbol.for === 'function') { - gracefulQueue = Symbol.for('graceful-fs.queue') - // This is used in testing by future versions - previousSymbol = Symbol.for('graceful-fs.previous') -} else { - gracefulQueue = '___graceful-fs.queue' - previousSymbol = '___graceful-fs.previous' -} + return this; + } + stop() { + if (!this.enabled) { + return this; + } -function noop () {} + clearInterval(this.id); + this.id = null; + this.frameIndex = 0; + this.clear(); + cliCursor.show(this.stream); -var debug = noop -if (util.debuglog) - debug = util.debuglog('gfs4') -else if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) - debug = function() { - var m = util.format.apply(util, arguments) - m = 'GFS4: ' + m.split(/\n/).join('\nGFS4: ') - console.error(m) - } + return this; + } + succeed(text) { + return this.stopAndPersist({symbol: logSymbols.success, text}); + } + fail(text) { + return this.stopAndPersist({symbol: logSymbols.error, text}); + } + warn(text) { + return this.stopAndPersist({symbol: logSymbols.warning, text}); + } + info(text) { + return this.stopAndPersist({symbol: logSymbols.info, text}); + } + stopAndPersist(options) { + if (!this.enabled) { + return this; + } -// Once time initialization -if (!global[gracefulQueue]) { - // This queue can be shared by multiple loaded instances - var queue = [] - Object.defineProperty(global, gracefulQueue, { - get: function() { - return queue - } - }) + // Legacy argument + // TODO: Deprecate sometime in the future + if (typeof options === 'string') { + options = { + symbol: options + }; + } - // Patch fs.close/closeSync to shared queue version, because we need - // to retry() whenever a close happens *anywhere* in the program. - // This is essential when multiple graceful-fs instances are - // in play at the same time. - fs.close = (function (fs$close) { - function close (fd, cb) { - return fs$close.call(fs, fd, function (err) { - // This function uses the graceful-fs shared queue - if (!err) { - retry() - } + options = options || {}; - if (typeof cb === 'function') - cb.apply(this, arguments) - }) - } + this.stop(); + this.stream.write(`${options.symbol || ' '} ${options.text || this.text}\n`); - Object.defineProperty(close, previousSymbol, { - value: fs$close - }) - return close - })(fs.close) + return this; + } +} - fs.closeSync = (function (fs$closeSync) { - function closeSync (fd) { - // This function uses the graceful-fs shared queue - fs$closeSync.apply(fs, arguments) - retry() - } +module.exports = function (opts) { + return new Ora(opts); +}; - Object.defineProperty(closeSync, previousSymbol, { - value: fs$closeSync - }) - return closeSync - })(fs.closeSync) +module.exports.promise = (action, options) => { + if (typeof action.then !== 'function') { + throw new TypeError('Parameter `action` must be a Promise'); + } - if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) { - process.on('exit', function() { - debug(global[gracefulQueue]) - __webpack_require__(30).equal(global[gracefulQueue].length, 0) - }) - } -} + const spinner = new Ora(options); + spinner.start(); -module.exports = patch(clone(fs)) -if (process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH && !fs.__patched) { - module.exports = patch(fs) - fs.__patched = true; -} + action.then( + () => { + spinner.succeed(); + }, + () => { + spinner.fail(); + } + ); -function patch (fs) { - // Everything that references the open() function needs to be in here - polyfills(fs) - fs.gracefulify = patch + return spinner; +}; - fs.createReadStream = createReadStream - fs.createWriteStream = createWriteStream - var fs$readFile = fs.readFile - fs.readFile = readFile - function readFile (path, options, cb) { - if (typeof options === 'function') - cb = options, options = null - return go$readFile(path, options, cb) +/***/ }), +/* 677 */ +/***/ (function(module, exports, __webpack_require__) { - function go$readFile (path, options, cb) { - return fs$readFile(path, options, function (err) { - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$readFile, [path, options, cb]]) - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() - } - }) - } - } +"use strict"; - var fs$writeFile = fs.writeFile - fs.writeFile = writeFile - function writeFile (path, data, options, cb) { - if (typeof options === 'function') - cb = options, options = null +const escapeStringRegexp = __webpack_require__(3); +const ansiStyles = __webpack_require__(678); +const stdoutColor = __webpack_require__(679).stdout; - return go$writeFile(path, data, options, cb) +const template = __webpack_require__(680); - function go$writeFile (path, data, options, cb) { - return fs$writeFile(path, data, options, function (err) { - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$writeFile, [path, data, options, cb]]) - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() - } - }) - } - } +const isSimpleWindowsTerm = process.platform === 'win32' && !(process.env.TERM || '').toLowerCase().startsWith('xterm'); - var fs$appendFile = fs.appendFile - if (fs$appendFile) - fs.appendFile = appendFile - function appendFile (path, data, options, cb) { - if (typeof options === 'function') - cb = options, options = null +// `supportsColor.level` → `ansiStyles.color[name]` mapping +const levelMapping = ['ansi', 'ansi', 'ansi256', 'ansi16m']; - return go$appendFile(path, data, options, cb) +// `color-convert` models to exclude from the Chalk API due to conflicts and such +const skipModels = new Set(['gray']); - function go$appendFile (path, data, options, cb) { - return fs$appendFile(path, data, options, function (err) { - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$appendFile, [path, data, options, cb]]) - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() - } - }) - } - } +const styles = Object.create(null); - var fs$readdir = fs.readdir - fs.readdir = readdir - function readdir (path, options, cb) { - var args = [path] - if (typeof options !== 'function') { - args.push(options) - } else { - cb = options - } - args.push(go$readdir$cb) +function applyOptions(obj, options) { + options = options || {}; - return go$readdir(args) + // Detect level if not set manually + const scLevel = stdoutColor ? stdoutColor.level : 0; + obj.level = options.level === undefined ? scLevel : options.level; + obj.enabled = 'enabled' in options ? options.enabled : obj.level > 0; +} - function go$readdir$cb (err, files) { - if (files && files.sort) - files.sort() +function Chalk(options) { + // We check for this.template here since calling `chalk.constructor()` + // by itself will have a `this` of a previously constructed chalk object + if (!this || !(this instanceof Chalk) || this.template) { + const chalk = {}; + applyOptions(chalk, options); - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$readdir, [args]]) + chalk.template = function () { + const args = [].slice.call(arguments); + return chalkTag.apply(null, [chalk.template].concat(args)); + }; - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() - } - } - } + Object.setPrototypeOf(chalk, Chalk.prototype); + Object.setPrototypeOf(chalk.template, chalk); - function go$readdir (args) { - return fs$readdir.apply(fs, args) - } + chalk.template.constructor = Chalk; - if (process.version.substr(0, 4) === 'v0.8') { - var legStreams = legacy(fs) - ReadStream = legStreams.ReadStream - WriteStream = legStreams.WriteStream - } + return chalk.template; + } - var fs$ReadStream = fs.ReadStream - if (fs$ReadStream) { - ReadStream.prototype = Object.create(fs$ReadStream.prototype) - ReadStream.prototype.open = ReadStream$open - } + applyOptions(this, options); +} - var fs$WriteStream = fs.WriteStream - if (fs$WriteStream) { - WriteStream.prototype = Object.create(fs$WriteStream.prototype) - WriteStream.prototype.open = WriteStream$open - } +// Use bright blue on Windows as the normal blue color is illegible +if (isSimpleWindowsTerm) { + ansiStyles.blue.open = '\u001B[94m'; +} - Object.defineProperty(fs, 'ReadStream', { - get: function () { - return ReadStream - }, - set: function (val) { - ReadStream = val - }, - enumerable: true, - configurable: true - }) - Object.defineProperty(fs, 'WriteStream', { - get: function () { - return WriteStream - }, - set: function (val) { - WriteStream = val - }, - enumerable: true, - configurable: true - }) +for (const key of Object.keys(ansiStyles)) { + ansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g'); - // legacy names - Object.defineProperty(fs, 'FileReadStream', { - get: function () { - return ReadStream - }, - set: function (val) { - ReadStream = val - }, - enumerable: true, - configurable: true - }) - Object.defineProperty(fs, 'FileWriteStream', { - get: function () { - return WriteStream - }, - set: function (val) { - WriteStream = val - }, - enumerable: true, - configurable: true - }) + styles[key] = { + get() { + const codes = ansiStyles[key]; + return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, key); + } + }; +} - function ReadStream (path, options) { - if (this instanceof ReadStream) - return fs$ReadStream.apply(this, arguments), this - else - return ReadStream.apply(Object.create(ReadStream.prototype), arguments) - } +styles.visible = { + get() { + return build.call(this, this._styles || [], true, 'visible'); + } +}; - function ReadStream$open () { - var that = this - open(that.path, that.flags, that.mode, function (err, fd) { - if (err) { - if (that.autoClose) - that.destroy() +ansiStyles.color.closeRe = new RegExp(escapeStringRegexp(ansiStyles.color.close), 'g'); +for (const model of Object.keys(ansiStyles.color.ansi)) { + if (skipModels.has(model)) { + continue; + } - that.emit('error', err) - } else { - that.fd = fd - that.emit('open', fd) - that.read() - } - }) - } + styles[model] = { + get() { + const level = this.level; + return function () { + const open = ansiStyles.color[levelMapping[level]][model].apply(null, arguments); + const codes = { + open, + close: ansiStyles.color.close, + closeRe: ansiStyles.color.closeRe + }; + return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); + }; + } + }; +} - function WriteStream (path, options) { - if (this instanceof WriteStream) - return fs$WriteStream.apply(this, arguments), this - else - return WriteStream.apply(Object.create(WriteStream.prototype), arguments) - } +ansiStyles.bgColor.closeRe = new RegExp(escapeStringRegexp(ansiStyles.bgColor.close), 'g'); +for (const model of Object.keys(ansiStyles.bgColor.ansi)) { + if (skipModels.has(model)) { + continue; + } - function WriteStream$open () { - var that = this - open(that.path, that.flags, that.mode, function (err, fd) { - if (err) { - that.destroy() - that.emit('error', err) - } else { - that.fd = fd - that.emit('open', fd) - } - }) - } + const bgModel = 'bg' + model[0].toUpperCase() + model.slice(1); + styles[bgModel] = { + get() { + const level = this.level; + return function () { + const open = ansiStyles.bgColor[levelMapping[level]][model].apply(null, arguments); + const codes = { + open, + close: ansiStyles.bgColor.close, + closeRe: ansiStyles.bgColor.closeRe + }; + return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); + }; + } + }; +} - function createReadStream (path, options) { - return new fs.ReadStream(path, options) - } +const proto = Object.defineProperties(() => {}, styles); - function createWriteStream (path, options) { - return new fs.WriteStream(path, options) - } +function build(_styles, _empty, key) { + const builder = function () { + return applyStyle.apply(builder, arguments); + }; - var fs$open = fs.open - fs.open = open - function open (path, flags, mode, cb) { - if (typeof mode === 'function') - cb = mode, mode = null + builder._styles = _styles; + builder._empty = _empty; - return go$open(path, flags, mode, cb) + const self = this; - function go$open (path, flags, mode, cb) { - return fs$open(path, flags, mode, function (err, fd) { - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$open, [path, flags, mode, cb]]) - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() - } - }) - } - } + Object.defineProperty(builder, 'level', { + enumerable: true, + get() { + return self.level; + }, + set(level) { + self.level = level; + } + }); - return fs -} + Object.defineProperty(builder, 'enabled', { + enumerable: true, + get() { + return self.enabled; + }, + set(enabled) { + self.enabled = enabled; + } + }); -function enqueue (elem) { - debug('ENQUEUE', elem[0].name, elem[1]) - global[gracefulQueue].push(elem) -} + // See below for fix regarding invisible grey/dim combination on Windows + builder.hasGrey = this.hasGrey || key === 'gray' || key === 'grey'; -function retry () { - var elem = global[gracefulQueue].shift() - if (elem) { - debug('RETRY', elem[0].name, elem[1]) - elem[0].apply(null, elem[1]) - } + // `__proto__` is used because we must return a function, but there is + // no way to create a function with a different prototype + builder.__proto__ = proto; // eslint-disable-line no-proto + + return builder; } +function applyStyle() { + // Support varags, but simply cast to string in case there's only one arg + const args = arguments; + const argsLen = args.length; + let str = String(arguments[0]); -/***/ }), -/* 665 */ -/***/ (function(module, exports, __webpack_require__) { + if (argsLen === 0) { + return ''; + } -var constants = __webpack_require__(25) + if (argsLen > 1) { + // Don't slice `arguments`, it prevents V8 optimizations + for (let a = 1; a < argsLen; a++) { + str += ' ' + args[a]; + } + } -var origCwd = process.cwd -var cwd = null + if (!this.enabled || this.level <= 0 || !str) { + return this._empty ? '' : str; + } -var platform = process.env.GRACEFUL_FS_PLATFORM || process.platform + // Turns out that on Windows dimmed gray text becomes invisible in cmd.exe, + // see https://github.com/chalk/chalk/issues/58 + // If we're on Windows and we're dealing with a gray color, temporarily make 'dim' a noop. + const originalDim = ansiStyles.dim.open; + if (isSimpleWindowsTerm && this.hasGrey) { + ansiStyles.dim.open = ''; + } -process.cwd = function() { - if (!cwd) - cwd = origCwd.call(process) - return cwd -} -try { - process.cwd() -} catch (er) {} + for (const code of this._styles.slice().reverse()) { + // Replace any instances already present with a re-opening code + // otherwise only the part of the string until said closing code + // will be colored, and the rest will simply be 'plain'. + str = code.open + str.replace(code.closeRe, code.open) + code.close; -var chdir = process.chdir -process.chdir = function(d) { - cwd = null - chdir.call(process, d) -} + // Close the styling before a linebreak and reopen + // after next line to fix a bleed issue on macOS + // https://github.com/chalk/chalk/pull/92 + str = str.replace(/\r?\n/g, `${code.close}$&${code.open}`); + } -module.exports = patch + // Reset the original `dim` if we changed it to work around the Windows dimmed gray issue + ansiStyles.dim.open = originalDim; -function patch (fs) { - // (re-)implement some things that are known busted or missing. + return str; +} - // lchmod, broken prior to 0.6.2 - // back-port the fix here. - if (constants.hasOwnProperty('O_SYMLINK') && - process.version.match(/^v0\.6\.[0-2]|^v0\.5\./)) { - patchLchmod(fs) - } +function chalkTag(chalk, strings) { + if (!Array.isArray(strings)) { + // If chalk() was called by itself or with a string, + // return the string itself as a string. + return [].slice.call(arguments, 1).join(' '); + } - // lutimes implementation, or no-op - if (!fs.lutimes) { - patchLutimes(fs) - } + const args = [].slice.call(arguments, 2); + const parts = [strings.raw[0]]; - // https://github.com/isaacs/node-graceful-fs/issues/4 - // Chown should not fail on einval or eperm if non-root. - // It should not fail on enosys ever, as this just indicates - // that a fs doesn't support the intended operation. + for (let i = 1; i < strings.length; i++) { + parts.push(String(args[i - 1]).replace(/[{}\\]/g, '\\$&')); + parts.push(String(strings.raw[i])); + } - fs.chown = chownFix(fs.chown) - fs.fchown = chownFix(fs.fchown) - fs.lchown = chownFix(fs.lchown) + return template(chalk, parts.join('')); +} - fs.chmod = chmodFix(fs.chmod) - fs.fchmod = chmodFix(fs.fchmod) - fs.lchmod = chmodFix(fs.lchmod) +Object.defineProperties(Chalk.prototype, styles); - fs.chownSync = chownFixSync(fs.chownSync) - fs.fchownSync = chownFixSync(fs.fchownSync) - fs.lchownSync = chownFixSync(fs.lchownSync) +module.exports = Chalk(); // eslint-disable-line new-cap +module.exports.supportsColor = stdoutColor; +module.exports.default = module.exports; // For TypeScript - fs.chmodSync = chmodFixSync(fs.chmodSync) - fs.fchmodSync = chmodFixSync(fs.fchmodSync) - fs.lchmodSync = chmodFixSync(fs.lchmodSync) - fs.stat = statFix(fs.stat) - fs.fstat = statFix(fs.fstat) - fs.lstat = statFix(fs.lstat) +/***/ }), +/* 678 */ +/***/ (function(module, exports, __webpack_require__) { - fs.statSync = statFixSync(fs.statSync) - fs.fstatSync = statFixSync(fs.fstatSync) - fs.lstatSync = statFixSync(fs.lstatSync) +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { +const colorConvert = __webpack_require__(6); - // if lchmod/lchown do not exist, then make them no-ops - if (!fs.lchmod) { - fs.lchmod = function (path, mode, cb) { - if (cb) process.nextTick(cb) - } - fs.lchmodSync = function () {} - } - if (!fs.lchown) { - fs.lchown = function (path, uid, gid, cb) { - if (cb) process.nextTick(cb) - } - fs.lchownSync = function () {} - } +const wrapAnsi16 = (fn, offset) => function () { + const code = fn.apply(colorConvert, arguments); + return `\u001B[${code + offset}m`; +}; - // on Windows, A/V software can lock the directory, causing this - // to fail with an EACCES or EPERM if the directory contains newly - // created files. Try again on failure, for up to 60 seconds. +const wrapAnsi256 = (fn, offset) => function () { + const code = fn.apply(colorConvert, arguments); + return `\u001B[${38 + offset};5;${code}m`; +}; - // Set the timeout this long because some Windows Anti-Virus, such as Parity - // bit9, may lock files for up to a minute, causing npm package install - // failures. Also, take care to yield the scheduler. Windows scheduling gives - // CPU to a busy looping process, which can cause the program causing the lock - // contention to be starved of CPU by node, so the contention doesn't resolve. - if (platform === "win32") { - fs.rename = (function (fs$rename) { return function (from, to, cb) { - var start = Date.now() - var backoff = 0; - fs$rename(from, to, function CB (er) { - if (er - && (er.code === "EACCES" || er.code === "EPERM") - && Date.now() - start < 60000) { - setTimeout(function() { - fs.stat(to, function (stater, st) { - if (stater && stater.code === "ENOENT") - fs$rename(from, to, CB); - else - cb(er) - }) - }, backoff) - if (backoff < 100) - backoff += 10; - return; - } - if (cb) cb(er) - }) - }})(fs.rename) - } +const wrapAnsi16m = (fn, offset) => function () { + const rgb = fn.apply(colorConvert, arguments); + return `\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`; +}; - // if read() returns EAGAIN, then just try it again. - fs.read = (function (fs$read) { - function read (fd, buffer, offset, length, position, callback_) { - var callback - if (callback_ && typeof callback_ === 'function') { - var eagCounter = 0 - callback = function (er, _, __) { - if (er && er.code === 'EAGAIN' && eagCounter < 10) { - eagCounter ++ - return fs$read.call(fs, fd, buffer, offset, length, position, callback) - } - callback_.apply(this, arguments) - } - } - return fs$read.call(fs, fd, buffer, offset, length, position, callback) - } +function assembleStyles() { + const codes = new Map(); + const styles = { + modifier: { + reset: [0, 0], + // 21 isn't widely supported and 22 does the same thing + bold: [1, 22], + dim: [2, 22], + italic: [3, 23], + underline: [4, 24], + inverse: [7, 27], + hidden: [8, 28], + strikethrough: [9, 29] + }, + color: { + black: [30, 39], + red: [31, 39], + green: [32, 39], + yellow: [33, 39], + blue: [34, 39], + magenta: [35, 39], + cyan: [36, 39], + white: [37, 39], + gray: [90, 39], - // This ensures `util.promisify` works as it does for native `fs.read`. - read.__proto__ = fs$read - return read - })(fs.read) + // Bright color + redBright: [91, 39], + greenBright: [92, 39], + yellowBright: [93, 39], + blueBright: [94, 39], + magentaBright: [95, 39], + cyanBright: [96, 39], + whiteBright: [97, 39] + }, + bgColor: { + bgBlack: [40, 49], + bgRed: [41, 49], + bgGreen: [42, 49], + bgYellow: [43, 49], + bgBlue: [44, 49], + bgMagenta: [45, 49], + bgCyan: [46, 49], + bgWhite: [47, 49], - fs.readSync = (function (fs$readSync) { return function (fd, buffer, offset, length, position) { - var eagCounter = 0 - while (true) { - try { - return fs$readSync.call(fs, fd, buffer, offset, length, position) - } catch (er) { - if (er.code === 'EAGAIN' && eagCounter < 10) { - eagCounter ++ - continue - } - throw er - } - } - }})(fs.readSync) + // Bright color + bgBlackBright: [100, 49], + bgRedBright: [101, 49], + bgGreenBright: [102, 49], + bgYellowBright: [103, 49], + bgBlueBright: [104, 49], + bgMagentaBright: [105, 49], + bgCyanBright: [106, 49], + bgWhiteBright: [107, 49] + } + }; - function patchLchmod (fs) { - fs.lchmod = function (path, mode, callback) { - fs.open( path - , constants.O_WRONLY | constants.O_SYMLINK - , mode - , function (err, fd) { - if (err) { - if (callback) callback(err) - return - } - // prefer to return the chmod error, if one occurs, - // but still try to close, and report closing errors if they occur. - fs.fchmod(fd, mode, function (err) { - fs.close(fd, function(err2) { - if (callback) callback(err || err2) - }) - }) - }) - } + // Fix humans + styles.color.grey = styles.color.gray; - fs.lchmodSync = function (path, mode) { - var fd = fs.openSync(path, constants.O_WRONLY | constants.O_SYMLINK, mode) + for (const groupName of Object.keys(styles)) { + const group = styles[groupName]; - // prefer to return the chmod error, if one occurs, - // but still try to close, and report closing errors if they occur. - var threw = true - var ret - try { - ret = fs.fchmodSync(fd, mode) - threw = false - } finally { - if (threw) { - try { - fs.closeSync(fd) - } catch (er) {} - } else { - fs.closeSync(fd) - } - } - return ret - } - } + for (const styleName of Object.keys(group)) { + const style = group[styleName]; - function patchLutimes (fs) { - if (constants.hasOwnProperty("O_SYMLINK")) { - fs.lutimes = function (path, at, mt, cb) { - fs.open(path, constants.O_SYMLINK, function (er, fd) { - if (er) { - if (cb) cb(er) - return - } - fs.futimes(fd, at, mt, function (er) { - fs.close(fd, function (er2) { - if (cb) cb(er || er2) - }) - }) - }) - } + styles[styleName] = { + open: `\u001B[${style[0]}m`, + close: `\u001B[${style[1]}m` + }; - fs.lutimesSync = function (path, at, mt) { - var fd = fs.openSync(path, constants.O_SYMLINK) - var ret - var threw = true - try { - ret = fs.futimesSync(fd, at, mt) - threw = false - } finally { - if (threw) { - try { - fs.closeSync(fd) - } catch (er) {} - } else { - fs.closeSync(fd) - } - } - return ret - } + group[styleName] = styles[styleName]; - } else { - fs.lutimes = function (_a, _b, _c, cb) { if (cb) process.nextTick(cb) } - fs.lutimesSync = function () {} - } - } + codes.set(style[0], style[1]); + } - function chmodFix (orig) { - if (!orig) return orig - return function (target, mode, cb) { - return orig.call(fs, target, mode, function (er) { - if (chownErOk(er)) er = null - if (cb) cb.apply(this, arguments) - }) - } - } + Object.defineProperty(styles, groupName, { + value: group, + enumerable: false + }); - function chmodFixSync (orig) { - if (!orig) return orig - return function (target, mode) { - try { - return orig.call(fs, target, mode) - } catch (er) { - if (!chownErOk(er)) throw er - } - } - } + Object.defineProperty(styles, 'codes', { + value: codes, + enumerable: false + }); + } + const ansi2ansi = n => n; + const rgb2rgb = (r, g, b) => [r, g, b]; - function chownFix (orig) { - if (!orig) return orig - return function (target, uid, gid, cb) { - return orig.call(fs, target, uid, gid, function (er) { - if (chownErOk(er)) er = null - if (cb) cb.apply(this, arguments) - }) - } - } + styles.color.close = '\u001B[39m'; + styles.bgColor.close = '\u001B[49m'; - function chownFixSync (orig) { - if (!orig) return orig - return function (target, uid, gid) { - try { - return orig.call(fs, target, uid, gid) - } catch (er) { - if (!chownErOk(er)) throw er - } - } - } + styles.color.ansi = { + ansi: wrapAnsi16(ansi2ansi, 0) + }; + styles.color.ansi256 = { + ansi256: wrapAnsi256(ansi2ansi, 0) + }; + styles.color.ansi16m = { + rgb: wrapAnsi16m(rgb2rgb, 0) + }; - function statFix (orig) { - if (!orig) return orig - // Older versions of Node erroneously returned signed integers for - // uid + gid. - return function (target, options, cb) { - if (typeof options === 'function') { - cb = options - options = null - } - function callback (er, stats) { - if (stats) { - if (stats.uid < 0) stats.uid += 0x100000000 - if (stats.gid < 0) stats.gid += 0x100000000 - } - if (cb) cb.apply(this, arguments) - } - return options ? orig.call(fs, target, options, callback) - : orig.call(fs, target, callback) - } - } + styles.bgColor.ansi = { + ansi: wrapAnsi16(ansi2ansi, 10) + }; + styles.bgColor.ansi256 = { + ansi256: wrapAnsi256(ansi2ansi, 10) + }; + styles.bgColor.ansi16m = { + rgb: wrapAnsi16m(rgb2rgb, 10) + }; - function statFixSync (orig) { - if (!orig) return orig - // Older versions of Node erroneously returned signed integers for - // uid + gid. - return function (target, options) { - var stats = options ? orig.call(fs, target, options) - : orig.call(fs, target) - if (stats.uid < 0) stats.uid += 0x100000000 - if (stats.gid < 0) stats.gid += 0x100000000 - return stats; - } - } + for (let key of Object.keys(colorConvert)) { + if (typeof colorConvert[key] !== 'object') { + continue; + } - // ENOSYS means that the fs doesn't support the op. Just ignore - // that, because it doesn't matter. - // - // if there's no getuid, or if getuid() is something other - // than 0, and the error is EINVAL or EPERM, then just ignore - // it. - // - // This specific case is a silent failure in cp, install, tar, - // and most other unix tools that manage permissions. - // - // When running as root, or if other types of errors are - // encountered, then it's strict. - function chownErOk (er) { - if (!er) - return true + const suite = colorConvert[key]; - if (er.code === "ENOSYS") - return true + if (key === 'ansi16') { + key = 'ansi'; + } - var nonroot = !process.getuid || process.getuid() !== 0 - if (nonroot) { - if (er.code === "EINVAL" || er.code === "EPERM") - return true - } + if ('ansi16' in suite) { + styles.color.ansi[key] = wrapAnsi16(suite.ansi16, 0); + styles.bgColor.ansi[key] = wrapAnsi16(suite.ansi16, 10); + } - return false - } + if ('ansi256' in suite) { + styles.color.ansi256[key] = wrapAnsi256(suite.ansi256, 0); + styles.bgColor.ansi256[key] = wrapAnsi256(suite.ansi256, 10); + } + + if ('rgb' in suite) { + styles.color.ansi16m[key] = wrapAnsi16m(suite.rgb, 0); + styles.bgColor.ansi16m[key] = wrapAnsi16m(suite.rgb, 10); + } + } + + return styles; } +// Make the export immutable +Object.defineProperty(module, 'exports', { + enumerable: true, + get: assembleStyles +}); + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(5)(module))) /***/ }), -/* 666 */ +/* 679 */ /***/ (function(module, exports, __webpack_require__) { -var Stream = __webpack_require__(27).Stream - -module.exports = legacy - -function legacy (fs) { - return { - ReadStream: ReadStream, - WriteStream: WriteStream - } +"use strict"; - function ReadStream (path, options) { - if (!(this instanceof ReadStream)) return new ReadStream(path, options); +const os = __webpack_require__(11); +const hasFlag = __webpack_require__(12); - Stream.call(this); +const env = process.env; - var self = this; +let forceColor; +if (hasFlag('no-color') || + hasFlag('no-colors') || + hasFlag('color=false')) { + forceColor = false; +} else if (hasFlag('color') || + hasFlag('colors') || + hasFlag('color=true') || + hasFlag('color=always')) { + forceColor = true; +} +if ('FORCE_COLOR' in env) { + forceColor = env.FORCE_COLOR.length === 0 || parseInt(env.FORCE_COLOR, 10) !== 0; +} - this.path = path; - this.fd = null; - this.readable = true; - this.paused = false; +function translateLevel(level) { + if (level === 0) { + return false; + } - this.flags = 'r'; - this.mode = 438; /*=0666*/ - this.bufferSize = 64 * 1024; + return { + level, + hasBasic: true, + has256: level >= 2, + has16m: level >= 3 + }; +} - options = options || {}; +function supportsColor(stream) { + if (forceColor === false) { + return 0; + } - // Mixin options into this - var keys = Object.keys(options); - for (var index = 0, length = keys.length; index < length; index++) { - var key = keys[index]; - this[key] = options[key]; - } + if (hasFlag('color=16m') || + hasFlag('color=full') || + hasFlag('color=truecolor')) { + return 3; + } - if (this.encoding) this.setEncoding(this.encoding); + if (hasFlag('color=256')) { + return 2; + } - if (this.start !== undefined) { - if ('number' !== typeof this.start) { - throw TypeError('start must be a Number'); - } - if (this.end === undefined) { - this.end = Infinity; - } else if ('number' !== typeof this.end) { - throw TypeError('end must be a Number'); - } + if (stream && !stream.isTTY && forceColor !== true) { + // VS code debugger doesn't have isTTY set + if (env.VSCODE_PID) { + return 1; + } + return 0; + } - if (this.start > this.end) { - throw new Error('start must be <= end'); - } + const min = forceColor ? 1 : 0; - this.pos = this.start; - } + if (process.platform === 'win32') { + // Node.js 7.5.0 is the first version of Node.js to include a patch to + // libuv that enables 256 color output on Windows. Anything earlier and it + // won't work. However, here we target Node.js 8 at minimum as it is an LTS + // release, and Node.js 7 is not. Windows 10 build 10586 is the first Windows + // release that supports 256 colors. Windows 10 build 14931 is the first release + // that supports 16m/TrueColor. + const osRelease = os.release().split('.'); + if ( + Number(process.versions.node.split('.')[0]) >= 8 && + Number(osRelease[0]) >= 10 && + Number(osRelease[2]) >= 10586 + ) { + return Number(osRelease[2]) >= 14931 ? 3 : 2; + } - if (this.fd !== null) { - process.nextTick(function() { - self._read(); - }); - return; - } + return 1; + } - fs.open(this.path, this.flags, this.mode, function (err, fd) { - if (err) { - self.emit('error', err); - self.readable = false; - return; - } + if ('CI' in env) { + if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(sign => sign in env) || env.CI_NAME === 'codeship') { + return 1; + } - self.fd = fd; - self.emit('open', fd); - self._read(); - }) - } + return min; + } - function WriteStream (path, options) { - if (!(this instanceof WriteStream)) return new WriteStream(path, options); + if ('TEAMCITY_VERSION' in env) { + return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0; + } - Stream.call(this); + if (env.COLORTERM === 'truecolor') { + return 3; + } - this.path = path; - this.fd = null; - this.writable = true; + if ('TERM_PROGRAM' in env) { + const version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10); - this.flags = 'w'; - this.encoding = 'binary'; - this.mode = 438; /*=0666*/ - this.bytesWritten = 0; + switch (env.TERM_PROGRAM) { + case 'iTerm.app': + return version >= 3 ? 3 : 2; + case 'Apple_Terminal': + return 2; + // No default + } + } - options = options || {}; + if (/-256(color)?$/i.test(env.TERM)) { + return 2; + } - // Mixin options into this - var keys = Object.keys(options); - for (var index = 0, length = keys.length; index < length; index++) { - var key = keys[index]; - this[key] = options[key]; - } + if (/^screen|^xterm|^vt100|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { + return 1; + } - if (this.start !== undefined) { - if ('number' !== typeof this.start) { - throw TypeError('start must be a Number'); - } - if (this.start < 0) { - throw new Error('start must be >= zero'); - } + if ('COLORTERM' in env) { + return 1; + } - this.pos = this.start; - } + if (env.TERM === 'dumb') { + return min; + } - this.busy = false; - this._queue = []; + return min; +} - if (this.fd === null) { - this._open = fs.open; - this._queue.push([this._open, this.path, this.flags, this.mode, undefined]); - this.flush(); - } - } +function getSupportLevel(stream) { + const level = supportsColor(stream); + return translateLevel(level); } +module.exports = { + supportsColor: getSupportLevel, + stdout: getSupportLevel(process.stdout), + stderr: getSupportLevel(process.stderr) +}; + /***/ }), -/* 667 */ +/* 680 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +const TEMPLATE_REGEX = /(?:\\(u[a-f\d]{4}|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi; +const STYLE_REGEX = /(?:^|\.)(\w+)(?:\(([^)]*)\))?/g; +const STRING_REGEX = /^(['"])((?:\\.|(?!\1)[^\\])*)\1$/; +const ESCAPE_REGEX = /\\(u[a-f\d]{4}|x[a-f\d]{2}|.)|([^\\])/gi; -module.exports = clone +const ESCAPES = new Map([ + ['n', '\n'], + ['r', '\r'], + ['t', '\t'], + ['b', '\b'], + ['f', '\f'], + ['v', '\v'], + ['0', '\0'], + ['\\', '\\'], + ['e', '\u001B'], + ['a', '\u0007'] +]); -function clone (obj) { - if (obj === null || typeof obj !== 'object') - return obj +function unescape(c) { + if ((c[0] === 'u' && c.length === 5) || (c[0] === 'x' && c.length === 3)) { + return String.fromCharCode(parseInt(c.slice(1), 16)); + } - if (obj instanceof Object) - var copy = { __proto__: obj.__proto__ } - else - var copy = Object.create(null) + return ESCAPES.get(c) || c; +} - Object.getOwnPropertyNames(obj).forEach(function (key) { - Object.defineProperty(copy, key, Object.getOwnPropertyDescriptor(obj, key)) - }) +function parseArguments(name, args) { + const results = []; + const chunks = args.trim().split(/\s*,\s*/g); + let matches; - return copy + for (const chunk of chunks) { + if (!isNaN(chunk)) { + results.push(Number(chunk)); + } else if ((matches = chunk.match(STRING_REGEX))) { + results.push(matches[2].replace(ESCAPE_REGEX, (m, escape, chr) => escape ? unescape(escape) : chr)); + } else { + throw new Error(`Invalid Chalk template style argument: ${chunk} (in style '${name}')`); + } + } + + return results; } +function parseStyle(style) { + STYLE_REGEX.lastIndex = 0; -/***/ }), -/* 668 */ -/***/ (function(module, exports, __webpack_require__) { + const results = []; + let matches; -"use strict"; + while ((matches = STYLE_REGEX.exec(style)) !== null) { + const name = matches[1]; -const path = __webpack_require__(16); + if (matches[2]) { + const args = parseArguments(name, matches[2]); + results.push([name].concat(args)); + } else { + results.push([name]); + } + } -module.exports = path_ => { - let cwd = process.cwd(); + return results; +} - path_ = path.resolve(path_); +function buildStyle(chalk, styles) { + const enabled = {}; - if (process.platform === 'win32') { - cwd = cwd.toLowerCase(); - path_ = path_.toLowerCase(); + for (const layer of styles) { + for (const style of layer.styles) { + enabled[style[0]] = layer.inverse ? null : style.slice(1); + } } - return path_ === cwd; + let current = chalk; + for (const styleName of Object.keys(enabled)) { + if (Array.isArray(enabled[styleName])) { + if (!(styleName in current)) { + throw new Error(`Unknown Chalk style: ${styleName}`); + } + + if (enabled[styleName].length > 0) { + current = current[styleName].apply(current, enabled[styleName]); + } else { + current = current[styleName]; + } + } + } + + return current; +} + +module.exports = (chalk, tmp) => { + const styles = []; + const chunks = []; + let chunk = []; + + // eslint-disable-next-line max-params + tmp.replace(TEMPLATE_REGEX, (m, escapeChar, inverse, style, close, chr) => { + if (escapeChar) { + chunk.push(unescape(escapeChar)); + } else if (style) { + const str = chunk.join(''); + chunk = []; + chunks.push(styles.length === 0 ? str : buildStyle(chalk, styles)(str)); + styles.push({inverse, styles: parseStyle(style)}); + } else if (close) { + if (styles.length === 0) { + throw new Error('Found extraneous } in Chalk template literal'); + } + + chunks.push(buildStyle(chalk, styles)(chunk.join(''))); + chunk = []; + styles.pop(); + } else { + chunk.push(chr); + } + }); + + chunks.push(chunk.join('')); + + if (styles.length > 0) { + const errMsg = `Chalk template literal is missing ${styles.length} closing bracket${styles.length === 1 ? '' : 's'} (\`}\`)`; + throw new Error(errMsg); + } + + return chunks.join(''); }; /***/ }), -/* 669 */ +/* 681 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const path = __webpack_require__(16); +const restoreCursor = __webpack_require__(682); -module.exports = (childPath, parentPath) => { - childPath = path.resolve(childPath); - parentPath = path.resolve(parentPath); +let hidden = false; - if (process.platform === 'win32') { - childPath = childPath.toLowerCase(); - parentPath = parentPath.toLowerCase(); +exports.show = stream => { + const s = stream || process.stderr; + + if (!s.isTTY) { + return; } - if (childPath === parentPath) { - return false; + hidden = false; + s.write('\u001b[?25h'); +}; + +exports.hide = stream => { + const s = stream || process.stderr; + + if (!s.isTTY) { + return; } - childPath += path.sep; - parentPath += path.sep; + restoreCursor(); + hidden = true; + s.write('\u001b[?25l'); +}; - return childPath.startsWith(parentPath); +exports.toggle = (force, stream) => { + if (force !== undefined) { + hidden = force; + } + + if (hidden) { + exports.show(stream); + } else { + exports.hide(stream); + } }; /***/ }), -/* 670 */ +/* 682 */ /***/ (function(module, exports, __webpack_require__) { -const assert = __webpack_require__(30) -const path = __webpack_require__(16) -const fs = __webpack_require__(23) -let glob = undefined -try { - glob = __webpack_require__(502) -} catch (_err) { - // treat glob as optional. -} +"use strict"; -const defaultGlobOpts = { - nosort: true, - silent: true -} +const onetime = __webpack_require__(683); +const signalExit = __webpack_require__(377); -// for EMFILE handling -let timeout = 0 +module.exports = onetime(() => { + signalExit(() => { + process.stderr.write('\u001b[?25h'); + }, {alwaysLast: true}); +}); -const isWindows = (process.platform === "win32") -const defaults = options => { - const methods = [ - 'unlink', - 'chmod', - 'stat', - 'lstat', - 'rmdir', - 'readdir' - ] - methods.forEach(m => { - options[m] = options[m] || fs[m] - m = m + 'Sync' - options[m] = options[m] || fs[m] - }) +/***/ }), +/* 683 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +const mimicFn = __webpack_require__(684); + +module.exports = (fn, opts) => { + // TODO: Remove this in v3 + if (opts === true) { + throw new TypeError('The second argument is now an options object'); + } + + if (typeof fn !== 'function') { + throw new TypeError('Expected a function'); + } + + opts = opts || {}; + + let ret; + let called = false; + const fnName = fn.displayName || fn.name || ''; - options.maxBusyTries = options.maxBusyTries || 3 - options.emfileWait = options.emfileWait || 1000 - if (options.glob === false) { - options.disableGlob = true - } - if (options.disableGlob !== true && glob === undefined) { - throw Error('glob dependency not found, set `options.disableGlob = true` if intentional') - } - options.disableGlob = options.disableGlob || false - options.glob = options.glob || defaultGlobOpts -} + const onetime = function () { + if (called) { + if (opts.throw === true) { + throw new Error(`Function \`${fnName}\` can only be called once`); + } -const rimraf = (p, options, cb) => { - if (typeof options === 'function') { - cb = options - options = {} - } + return ret; + } - assert(p, 'rimraf: missing path') - assert.equal(typeof p, 'string', 'rimraf: path should be a string') - assert.equal(typeof cb, 'function', 'rimraf: callback function required') - assert(options, 'rimraf: invalid options argument provided') - assert.equal(typeof options, 'object', 'rimraf: options should be object') + called = true; + ret = fn.apply(this, arguments); + fn = null; - defaults(options) + return ret; + }; - let busyTries = 0 - let errState = null - let n = 0 + mimicFn(onetime, fn); - const next = (er) => { - errState = errState || er - if (--n === 0) - cb(errState) - } + return onetime; +}; - const afterGlob = (er, results) => { - if (er) - return cb(er) - n = results.length - if (n === 0) - return cb() +/***/ }), +/* 684 */ +/***/ (function(module, exports, __webpack_require__) { - results.forEach(p => { - const CB = (er) => { - if (er) { - if ((er.code === "EBUSY" || er.code === "ENOTEMPTY" || er.code === "EPERM") && - busyTries < options.maxBusyTries) { - busyTries ++ - // try again, with the same exact callback as this one. - return setTimeout(() => rimraf_(p, options, CB), busyTries * 100) - } +"use strict"; - // this one won't happen if graceful-fs is used. - if (er.code === "EMFILE" && timeout < options.emfileWait) { - return setTimeout(() => rimraf_(p, options, CB), timeout ++) - } +module.exports = (to, from) => { + // TODO: use `Reflect.ownKeys()` when targeting Node.js 6 + for (const prop of Object.getOwnPropertyNames(from).concat(Object.getOwnPropertySymbols(from))) { + Object.defineProperty(to, prop, Object.getOwnPropertyDescriptor(from, prop)); + } - // already gone - if (er.code === "ENOENT") er = null - } + return to; +}; - timeout = 0 - next(er) - } - rimraf_(p, options, CB) - }) - } - if (options.disableGlob || !glob.hasMagic(p)) - return afterGlob(null, [p]) +/***/ }), +/* 685 */ +/***/ (function(module, exports, __webpack_require__) { - options.lstat(p, (er, stat) => { - if (!er) - return afterGlob(null, [p]) +"use strict"; - glob(p, options.glob, afterGlob) - }) +module.exports = __webpack_require__(686); -} -// Two possible strategies. -// 1. Assume it's a file. unlink it, then do the dir stuff on EPERM or EISDIR -// 2. Assume it's a directory. readdir, then do the file stuff on ENOTDIR -// -// Both result in an extra syscall when you guess wrong. However, there -// are likely far more normal files in the world than directories. This -// is based on the assumption that a the average number of files per -// directory is >= 1. -// -// If anyone ever complains about this, then I guess the strategy could -// be made configurable somehow. But until then, YAGNI. -const rimraf_ = (p, options, cb) => { - assert(p) - assert(options) - assert(typeof cb === 'function') +/***/ }), +/* 686 */ +/***/ (function(module) { - // sunos lets the root user unlink directories, which is... weird. - // so we have to lstat here and make sure it's not a dir. - options.lstat(p, (er, st) => { - if (er && er.code === "ENOENT") - return cb(null) +module.exports = JSON.parse("{\"dots\":{\"interval\":80,\"frames\":[\"⠋\",\"⠙\",\"⠹\",\"⠸\",\"⠼\",\"⠴\",\"⠦\",\"⠧\",\"⠇\",\"⠏\"]},\"dots2\":{\"interval\":80,\"frames\":[\"⣾\",\"⣽\",\"⣻\",\"⢿\",\"⡿\",\"⣟\",\"⣯\",\"⣷\"]},\"dots3\":{\"interval\":80,\"frames\":[\"⠋\",\"⠙\",\"⠚\",\"⠞\",\"⠖\",\"⠦\",\"⠴\",\"⠲\",\"⠳\",\"⠓\"]},\"dots4\":{\"interval\":80,\"frames\":[\"⠄\",\"⠆\",\"⠇\",\"⠋\",\"⠙\",\"⠸\",\"⠰\",\"⠠\",\"⠰\",\"⠸\",\"⠙\",\"⠋\",\"⠇\",\"⠆\"]},\"dots5\":{\"interval\":80,\"frames\":[\"⠋\",\"⠙\",\"⠚\",\"⠒\",\"⠂\",\"⠂\",\"⠒\",\"⠲\",\"⠴\",\"⠦\",\"⠖\",\"⠒\",\"⠐\",\"⠐\",\"⠒\",\"⠓\",\"⠋\"]},\"dots6\":{\"interval\":80,\"frames\":[\"⠁\",\"⠉\",\"⠙\",\"⠚\",\"⠒\",\"⠂\",\"⠂\",\"⠒\",\"⠲\",\"⠴\",\"⠤\",\"⠄\",\"⠄\",\"⠤\",\"⠴\",\"⠲\",\"⠒\",\"⠂\",\"⠂\",\"⠒\",\"⠚\",\"⠙\",\"⠉\",\"⠁\"]},\"dots7\":{\"interval\":80,\"frames\":[\"⠈\",\"⠉\",\"⠋\",\"⠓\",\"⠒\",\"⠐\",\"⠐\",\"⠒\",\"⠖\",\"⠦\",\"⠤\",\"⠠\",\"⠠\",\"⠤\",\"⠦\",\"⠖\",\"⠒\",\"⠐\",\"⠐\",\"⠒\",\"⠓\",\"⠋\",\"⠉\",\"⠈\"]},\"dots8\":{\"interval\":80,\"frames\":[\"⠁\",\"⠁\",\"⠉\",\"⠙\",\"⠚\",\"⠒\",\"⠂\",\"⠂\",\"⠒\",\"⠲\",\"⠴\",\"⠤\",\"⠄\",\"⠄\",\"⠤\",\"⠠\",\"⠠\",\"⠤\",\"⠦\",\"⠖\",\"⠒\",\"⠐\",\"⠐\",\"⠒\",\"⠓\",\"⠋\",\"⠉\",\"⠈\",\"⠈\"]},\"dots9\":{\"interval\":80,\"frames\":[\"⢹\",\"⢺\",\"⢼\",\"⣸\",\"⣇\",\"⡧\",\"⡗\",\"⡏\"]},\"dots10\":{\"interval\":80,\"frames\":[\"⢄\",\"⢂\",\"⢁\",\"⡁\",\"⡈\",\"⡐\",\"⡠\"]},\"dots11\":{\"interval\":100,\"frames\":[\"⠁\",\"⠂\",\"⠄\",\"⡀\",\"⢀\",\"⠠\",\"⠐\",\"⠈\"]},\"dots12\":{\"interval\":80,\"frames\":[\"⢀⠀\",\"⡀⠀\",\"⠄⠀\",\"⢂⠀\",\"⡂⠀\",\"⠅⠀\",\"⢃⠀\",\"⡃⠀\",\"⠍⠀\",\"⢋⠀\",\"⡋⠀\",\"⠍⠁\",\"⢋⠁\",\"⡋⠁\",\"⠍⠉\",\"⠋⠉\",\"⠋⠉\",\"⠉⠙\",\"⠉⠙\",\"⠉⠩\",\"⠈⢙\",\"⠈⡙\",\"⢈⠩\",\"⡀⢙\",\"⠄⡙\",\"⢂⠩\",\"⡂⢘\",\"⠅⡘\",\"⢃⠨\",\"⡃⢐\",\"⠍⡐\",\"⢋⠠\",\"⡋⢀\",\"⠍⡁\",\"⢋⠁\",\"⡋⠁\",\"⠍⠉\",\"⠋⠉\",\"⠋⠉\",\"⠉⠙\",\"⠉⠙\",\"⠉⠩\",\"⠈⢙\",\"⠈⡙\",\"⠈⠩\",\"⠀⢙\",\"⠀⡙\",\"⠀⠩\",\"⠀⢘\",\"⠀⡘\",\"⠀⠨\",\"⠀⢐\",\"⠀⡐\",\"⠀⠠\",\"⠀⢀\",\"⠀⡀\"]},\"line\":{\"interval\":130,\"frames\":[\"-\",\"\\\\\",\"|\",\"/\"]},\"line2\":{\"interval\":100,\"frames\":[\"⠂\",\"-\",\"–\",\"—\",\"–\",\"-\"]},\"pipe\":{\"interval\":100,\"frames\":[\"┤\",\"┘\",\"┴\",\"└\",\"├\",\"┌\",\"┬\",\"┐\"]},\"simpleDots\":{\"interval\":400,\"frames\":[\". \",\".. \",\"...\",\" \"]},\"simpleDotsScrolling\":{\"interval\":200,\"frames\":[\". \",\".. \",\"...\",\" ..\",\" .\",\" \"]},\"star\":{\"interval\":70,\"frames\":[\"✶\",\"✸\",\"✹\",\"✺\",\"✹\",\"✷\"]},\"star2\":{\"interval\":80,\"frames\":[\"+\",\"x\",\"*\"]},\"flip\":{\"interval\":70,\"frames\":[\"_\",\"_\",\"_\",\"-\",\"`\",\"`\",\"'\",\"´\",\"-\",\"_\",\"_\",\"_\"]},\"hamburger\":{\"interval\":100,\"frames\":[\"☱\",\"☲\",\"☴\"]},\"growVertical\":{\"interval\":120,\"frames\":[\"▁\",\"▃\",\"▄\",\"▅\",\"▆\",\"▇\",\"▆\",\"▅\",\"▄\",\"▃\"]},\"growHorizontal\":{\"interval\":120,\"frames\":[\"▏\",\"▎\",\"▍\",\"▌\",\"▋\",\"▊\",\"▉\",\"▊\",\"▋\",\"▌\",\"▍\",\"▎\"]},\"balloon\":{\"interval\":140,\"frames\":[\" \",\".\",\"o\",\"O\",\"@\",\"*\",\" \"]},\"balloon2\":{\"interval\":120,\"frames\":[\".\",\"o\",\"O\",\"°\",\"O\",\"o\",\".\"]},\"noise\":{\"interval\":100,\"frames\":[\"▓\",\"▒\",\"░\"]},\"bounce\":{\"interval\":120,\"frames\":[\"⠁\",\"⠂\",\"⠄\",\"⠂\"]},\"boxBounce\":{\"interval\":120,\"frames\":[\"▖\",\"▘\",\"▝\",\"▗\"]},\"boxBounce2\":{\"interval\":100,\"frames\":[\"▌\",\"▀\",\"▐\",\"▄\"]},\"triangle\":{\"interval\":50,\"frames\":[\"◢\",\"◣\",\"◤\",\"◥\"]},\"arc\":{\"interval\":100,\"frames\":[\"◜\",\"◠\",\"◝\",\"◞\",\"◡\",\"◟\"]},\"circle\":{\"interval\":120,\"frames\":[\"◡\",\"⊙\",\"◠\"]},\"squareCorners\":{\"interval\":180,\"frames\":[\"◰\",\"◳\",\"◲\",\"◱\"]},\"circleQuarters\":{\"interval\":120,\"frames\":[\"◴\",\"◷\",\"◶\",\"◵\"]},\"circleHalves\":{\"interval\":50,\"frames\":[\"◐\",\"◓\",\"◑\",\"◒\"]},\"squish\":{\"interval\":100,\"frames\":[\"╫\",\"╪\"]},\"toggle\":{\"interval\":250,\"frames\":[\"⊶\",\"⊷\"]},\"toggle2\":{\"interval\":80,\"frames\":[\"▫\",\"▪\"]},\"toggle3\":{\"interval\":120,\"frames\":[\"□\",\"■\"]},\"toggle4\":{\"interval\":100,\"frames\":[\"■\",\"□\",\"▪\",\"▫\"]},\"toggle5\":{\"interval\":100,\"frames\":[\"▮\",\"▯\"]},\"toggle6\":{\"interval\":300,\"frames\":[\"ဝ\",\"၀\"]},\"toggle7\":{\"interval\":80,\"frames\":[\"⦾\",\"⦿\"]},\"toggle8\":{\"interval\":100,\"frames\":[\"◍\",\"◌\"]},\"toggle9\":{\"interval\":100,\"frames\":[\"◉\",\"◎\"]},\"toggle10\":{\"interval\":100,\"frames\":[\"㊂\",\"㊀\",\"㊁\"]},\"toggle11\":{\"interval\":50,\"frames\":[\"⧇\",\"⧆\"]},\"toggle12\":{\"interval\":120,\"frames\":[\"☗\",\"☖\"]},\"toggle13\":{\"interval\":80,\"frames\":[\"=\",\"*\",\"-\"]},\"arrow\":{\"interval\":100,\"frames\":[\"←\",\"↖\",\"↑\",\"↗\",\"→\",\"↘\",\"↓\",\"↙\"]},\"arrow2\":{\"interval\":80,\"frames\":[\"⬆️ \",\"↗️ \",\"➡️ \",\"↘️ \",\"⬇️ \",\"↙️ \",\"⬅️ \",\"↖️ \"]},\"arrow3\":{\"interval\":120,\"frames\":[\"▹▹▹▹▹\",\"▸▹▹▹▹\",\"▹▸▹▹▹\",\"▹▹▸▹▹\",\"▹▹▹▸▹\",\"▹▹▹▹▸\"]},\"bouncingBar\":{\"interval\":80,\"frames\":[\"[ ]\",\"[= ]\",\"[== ]\",\"[=== ]\",\"[ ===]\",\"[ ==]\",\"[ =]\",\"[ ]\",\"[ =]\",\"[ ==]\",\"[ ===]\",\"[====]\",\"[=== ]\",\"[== ]\",\"[= ]\"]},\"bouncingBall\":{\"interval\":80,\"frames\":[\"( ● )\",\"( ● )\",\"( ● )\",\"( ● )\",\"( ●)\",\"( ● )\",\"( ● )\",\"( ● )\",\"( ● )\",\"(● )\"]},\"smiley\":{\"interval\":200,\"frames\":[\"😄 \",\"😝 \"]},\"monkey\":{\"interval\":300,\"frames\":[\"🙈 \",\"🙈 \",\"🙉 \",\"🙊 \"]},\"hearts\":{\"interval\":100,\"frames\":[\"💛 \",\"💙 \",\"💜 \",\"💚 \",\"❤️ \"]},\"clock\":{\"interval\":100,\"frames\":[\"🕐 \",\"🕑 \",\"🕒 \",\"🕓 \",\"🕔 \",\"🕕 \",\"🕖 \",\"🕗 \",\"🕘 \",\"🕙 \",\"🕚 \"]},\"earth\":{\"interval\":180,\"frames\":[\"🌍 \",\"🌎 \",\"🌏 \"]},\"moon\":{\"interval\":80,\"frames\":[\"🌑 \",\"🌒 \",\"🌓 \",\"🌔 \",\"🌕 \",\"🌖 \",\"🌗 \",\"🌘 \"]},\"runner\":{\"interval\":140,\"frames\":[\"🚶 \",\"🏃 \"]},\"pong\":{\"interval\":80,\"frames\":[\"▐⠂ ▌\",\"▐⠈ ▌\",\"▐ ⠂ ▌\",\"▐ ⠠ ▌\",\"▐ ⡀ ▌\",\"▐ ⠠ ▌\",\"▐ ⠂ ▌\",\"▐ ⠈ ▌\",\"▐ ⠂ ▌\",\"▐ ⠠ ▌\",\"▐ ⡀ ▌\",\"▐ ⠠ ▌\",\"▐ ⠂ ▌\",\"▐ ⠈ ▌\",\"▐ ⠂▌\",\"▐ ⠠▌\",\"▐ ⡀▌\",\"▐ ⠠ ▌\",\"▐ ⠂ ▌\",\"▐ ⠈ ▌\",\"▐ ⠂ ▌\",\"▐ ⠠ ▌\",\"▐ ⡀ ▌\",\"▐ ⠠ ▌\",\"▐ ⠂ ▌\",\"▐ ⠈ ▌\",\"▐ ⠂ ▌\",\"▐ ⠠ ▌\",\"▐ ⡀ ▌\",\"▐⠠ ▌\"]},\"shark\":{\"interval\":120,\"frames\":[\"▐|\\\\____________▌\",\"▐_|\\\\___________▌\",\"▐__|\\\\__________▌\",\"▐___|\\\\_________▌\",\"▐____|\\\\________▌\",\"▐_____|\\\\_______▌\",\"▐______|\\\\______▌\",\"▐_______|\\\\_____▌\",\"▐________|\\\\____▌\",\"▐_________|\\\\___▌\",\"▐__________|\\\\__▌\",\"▐___________|\\\\_▌\",\"▐____________|\\\\▌\",\"▐____________/|▌\",\"▐___________/|_▌\",\"▐__________/|__▌\",\"▐_________/|___▌\",\"▐________/|____▌\",\"▐_______/|_____▌\",\"▐______/|______▌\",\"▐_____/|_______▌\",\"▐____/|________▌\",\"▐___/|_________▌\",\"▐__/|__________▌\",\"▐_/|___________▌\",\"▐/|____________▌\"]},\"dqpb\":{\"interval\":100,\"frames\":[\"d\",\"q\",\"p\",\"b\"]},\"weather\":{\"interval\":100,\"frames\":[\"☀️ \",\"☀️ \",\"☀️ \",\"🌤 \",\"⛅️ \",\"🌥 \",\"☁️ \",\"🌧 \",\"🌨 \",\"🌧 \",\"🌨 \",\"🌧 \",\"🌨 \",\"⛈ \",\"🌨 \",\"🌧 \",\"🌨 \",\"☁️ \",\"🌥 \",\"⛅️ \",\"🌤 \",\"☀️ \",\"☀️ \"]},\"christmas\":{\"interval\":400,\"frames\":[\"🌲\",\"🎄\"]}}"); - // Windows can EPERM on stat. Life is suffering. - if (er && er.code === "EPERM" && isWindows) - fixWinEPERM(p, options, er, cb) +/***/ }), +/* 687 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - if (st && st.isDirectory()) - return rmdir(p, options, er, cb) +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RunCommand", function() { return RunCommand; }); +/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2); +/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(chalk__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(34); +/* harmony import */ var _utils_parallelize__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(500); +/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(501); +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ - options.unlink(p, er => { - if (er) { - if (er.code === "ENOENT") - return cb(null) - if (er.code === "EPERM") - return (isWindows) - ? fixWinEPERM(p, options, er, cb) - : rmdir(p, options, er, cb) - if (er.code === "EISDIR") - return rmdir(p, options, er, cb) - } - return cb(er) - }) - }) -} -const fixWinEPERM = (p, options, er, cb) => { - assert(p) - assert(options) - assert(typeof cb === 'function') - if (er) - assert(er instanceof Error) - options.chmod(p, 0o666, er2 => { - if (er2) - cb(er2.code === "ENOENT" ? null : er) - else - options.stat(p, (er3, stats) => { - if (er3) - cb(er3.code === "ENOENT" ? null : er) - else if (stats.isDirectory()) - rmdir(p, options, er, cb) - else - options.unlink(p, cb) - }) - }) -} -const fixWinEPERMSync = (p, options, er) => { - assert(p) - assert(options) - if (er) - assert(er instanceof Error) +const RunCommand = { + description: 'Run script defined in package.json in each package that contains that script.', + name: 'run', - try { - options.chmodSync(p, 0o666) - } catch (er2) { - if (er2.code === "ENOENT") - return - else - throw er - } + async run(projects, projectGraph, { + extraArgs + }) { + const batchedProjects = Object(_utils_projects__WEBPACK_IMPORTED_MODULE_3__["topologicallyBatchProjects"])(projects, projectGraph); - let stats - try { - stats = options.statSync(p) - } catch (er3) { - if (er3.code === "ENOENT") - return - else - throw er + if (extraArgs.length === 0) { + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.red.bold('\nNo script specified')); + process.exit(1); + } + + const scriptName = extraArgs[0]; + const scriptArgs = extraArgs.slice(1); + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.bold(`\nRunning script [${chalk__WEBPACK_IMPORTED_MODULE_0___default.a.green(scriptName)}] in batched topological order\n`)); + await Object(_utils_parallelize__WEBPACK_IMPORTED_MODULE_2__["parallelizeBatches"])(batchedProjects, async pkg => { + if (pkg.hasScript(scriptName)) { + await pkg.runScriptStreaming(scriptName, scriptArgs); + } + }); } - if (stats.isDirectory()) - rmdirSync(p, options, er) - else - options.unlinkSync(p) -} +}; -const rmdir = (p, options, originalEr, cb) => { - assert(p) - assert(options) - if (originalEr) - assert(originalEr instanceof Error) - assert(typeof cb === 'function') +/***/ }), +/* 688 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - // try to rmdir first, and only readdir on ENOTEMPTY or EEXIST (SunOS) - // if we guessed wrong, and it's not a directory, then - // raise the original error. - options.rmdir(p, er => { - if (er && (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM")) - rmkids(p, options, cb) - else if (er && er.code === "ENOTDIR") - cb(originalEr) - else - cb(er) - }) -} +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "WatchCommand", function() { return WatchCommand; }); +/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2); +/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(chalk__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(34); +/* harmony import */ var _utils_parallelize__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(500); +/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(501); +/* harmony import */ var _utils_watch__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(689); +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ -const rmkids = (p, options, cb) => { - assert(p) - assert(options) - assert(typeof cb === 'function') - options.readdir(p, (er, files) => { - if (er) - return cb(er) - let n = files.length - if (n === 0) - return options.rmdir(p, cb) - let errState - files.forEach(f => { - rimraf(path.join(p, f), options, er => { - if (errState) - return - if (er) - return cb(errState = er) - if (--n === 0) - options.rmdir(p, cb) - }) - }) - }) -} -// this looks simpler, and is strictly *faster*, but will -// tie up the JavaScript thread and fail on excessively -// deep directory trees. -const rimrafSync = (p, options) => { - options = options || {} - defaults(options) - assert(p, 'rimraf: missing path') - assert.equal(typeof p, 'string', 'rimraf: path should be a string') - assert(options, 'rimraf: missing options') - assert.equal(typeof options, 'object', 'rimraf: options should be object') - let results - if (options.disableGlob || !glob.hasMagic(p)) { - results = [p] - } else { - try { - options.lstatSync(p) - results = [p] - } catch (er) { - results = glob.sync(p, options.glob) - } - } +/** + * Name of the script in the package/project package.json file to run during `kbn watch`. + */ +const watchScriptName = 'kbn:watch'; +/** + * Name of the Kibana project. + */ - if (!results.length) - return +const kibanaProjectName = 'kibana'; +/** + * Command that traverses through list of available projects/packages that have `kbn:watch` script in their + * package.json files, groups them into topology aware batches and then processes theses batches one by one + * running `kbn:watch` scripts in parallel within the same batch. + * + * Command internally relies on the fact that most of the build systems that are triggered by `kbn:watch` + * will emit special "marker" once build/watch process is ready that we can use as completion condition for + * the `kbn:watch` script and eventually for the entire batch. Currently we support completion "markers" for + * `webpack` and `tsc` only, for the rest we rely on predefined timeouts. + */ - for (let i = 0; i < results.length; i++) { - const p = results[i] +const WatchCommand = { + description: 'Runs `kbn:watch` script for every project.', + name: 'watch', - let st - try { - st = options.lstatSync(p) - } catch (er) { - if (er.code === "ENOENT") - return + async run(projects, projectGraph) { + const projectsToWatch = new Map(); - // Windows can EPERM on stat. Life is suffering. - if (er.code === "EPERM" && isWindows) - fixWinEPERMSync(p, options, er) + for (const project of projects.values()) { + // We can't watch project that doesn't have `kbn:watch` script. + if (project.hasScript(watchScriptName)) { + projectsToWatch.set(project.name, project); + } } - try { - // sunos lets the root user unlink directories, which is... weird. - if (st && st.isDirectory()) - rmdirSync(p, options, null) - else - options.unlinkSync(p) - } catch (er) { - if (er.code === "ENOENT") - return - if (er.code === "EPERM") - return isWindows ? fixWinEPERMSync(p, options, er) : rmdirSync(p, options, er) - if (er.code !== "EISDIR") - throw er - - rmdirSync(p, options, er) + if (projectsToWatch.size === 0) { + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.red(`\nThere are no projects to watch found. Make sure that projects define 'kbn:watch' script in 'package.json'.\n`)); + return; } - } -} - -const rmdirSync = (p, options, originalEr) => { - assert(p) - assert(options) - if (originalEr) - assert(originalEr instanceof Error) - try { - options.rmdirSync(p) - } catch (er) { - if (er.code === "ENOENT") - return - if (er.code === "ENOTDIR") - throw originalEr - if (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM") - rmkidsSync(p, options) - } -} + const projectNames = Array.from(projectsToWatch.keys()); + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.bold(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.green(`Running ${watchScriptName} scripts for [${projectNames.join(', ')}].`))); // Kibana should always be run the last, so we don't rely on automatic + // topological batching and push it to the last one-entry batch manually. -const rmkidsSync = (p, options) => { - assert(p) - assert(options) - options.readdirSync(p).forEach(f => rimrafSync(path.join(p, f), options)) + const shouldWatchKibanaProject = projectsToWatch.delete(kibanaProjectName); + const batchedProjects = Object(_utils_projects__WEBPACK_IMPORTED_MODULE_3__["topologicallyBatchProjects"])(projectsToWatch, projectGraph); - // We only end up here once we got ENOTEMPTY at least once, and - // at this point, we are guaranteed to have removed all the kids. - // So, we know that it won't be ENOENT or ENOTDIR or anything else. - // try really hard to delete stuff on windows, because it has a - // PROFOUNDLY annoying habit of not closing handles promptly when - // files are deleted, resulting in spurious ENOTEMPTY errors. - const retries = isWindows ? 100 : 1 - let i = 0 - do { - let threw = true - try { - const ret = options.rmdirSync(p, options) - threw = false - return ret - } finally { - if (++i < retries && threw) - continue + if (shouldWatchKibanaProject) { + batchedProjects.push([projects.get(kibanaProjectName)]); } - } while (true) -} -module.exports = rimraf -rimraf.sync = rimrafSync + await Object(_utils_parallelize__WEBPACK_IMPORTED_MODULE_2__["parallelizeBatches"])(batchedProjects, async pkg => { + const completionHint = await Object(_utils_watch__WEBPACK_IMPORTED_MODULE_4__["waitUntilWatchIsReady"])(pkg.runScriptStreaming(watchScriptName).stdout); + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.bold(`[${chalk__WEBPACK_IMPORTED_MODULE_0___default.a.green(pkg.name)}] Initial build completed (${completionHint}).`)); + }); + } +}; /***/ }), -/* 671 */ -/***/ (function(module, exports, __webpack_require__) { +/* 689 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "waitUntilWatchIsReady", function() { return waitUntilWatchIsReady; }); +/* harmony import */ var rxjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(392); +/* harmony import */ var rxjs_operators__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(169); +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ -const AggregateError = __webpack_require__(672); -module.exports = async ( - iterable, - mapper, - { - concurrency = Infinity, - stopOnError = true - } = {} -) => { - return new Promise((resolve, reject) => { - if (typeof mapper !== 'function') { - throw new TypeError('Mapper function is required'); - } +/** + * Number of milliseconds we wait before we fall back to the default watch handler. + */ - if (!(typeof concurrency === 'number' && concurrency >= 1)) { - throw new TypeError(`Expected \`concurrency\` to be a number from 1 and up, got \`${concurrency}\` (${typeof concurrency})`); - } +const defaultHandlerDelay = 3000; +/** + * If default watch handler is used, then it's the number of milliseconds we wait for + * any build output before we consider watch task ready. + */ - const ret = []; - const errors = []; - const iterator = iterable[Symbol.iterator](); - let isRejected = false; - let isIterableDone = false; - let resolvingCount = 0; - let currentIndex = 0; +const defaultHandlerReadinessTimeout = 2000; +/** + * Describes configurable watch options. + */ + +function getWatchHandlers(buildOutput$, { + handlerDelay = defaultHandlerDelay, + handlerReadinessTimeout = defaultHandlerReadinessTimeout +}) { + const typescriptHandler = buildOutput$.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["first"])(data => data.includes('$ tsc')), Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["map"])(() => buildOutput$.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["first"])(data => data.includes('Compilation complete.')), Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["mapTo"])('tsc')))); + const webpackHandler = buildOutput$.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["first"])(data => data.includes('$ webpack')), Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["map"])(() => buildOutput$.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["first"])(data => data.includes('Chunk Names')), Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["mapTo"])('webpack')))); + const defaultHandler = rxjs__WEBPACK_IMPORTED_MODULE_0__["of"](undefined).pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["delay"])(handlerReadinessTimeout), Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["map"])(() => buildOutput$.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["timeout"])(handlerDelay), Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["catchError"])(() => rxjs__WEBPACK_IMPORTED_MODULE_0__["of"]('timeout'))))); + return [typescriptHandler, webpackHandler, defaultHandler]; +} - const next = () => { - if (isRejected) { - return; - } +function waitUntilWatchIsReady(stream, opts = {}) { + const buildOutput$ = new rxjs__WEBPACK_IMPORTED_MODULE_0__["Subject"](); - const nextItem = iterator.next(); - const i = currentIndex; - currentIndex++; + const onDataListener = data => buildOutput$.next(data.toString('utf-8')); - if (nextItem.done) { - isIterableDone = true; + const onEndListener = () => buildOutput$.complete(); - if (resolvingCount === 0) { - if (!stopOnError && errors.length !== 0) { - reject(new AggregateError(errors)); - } else { - resolve(ret); - } - } + const onErrorListener = e => buildOutput$.error(e); - return; - } + stream.once('end', onEndListener); + stream.once('error', onErrorListener); + stream.on('data', onDataListener); + return rxjs__WEBPACK_IMPORTED_MODULE_0__["race"](getWatchHandlers(buildOutput$, opts)).pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["mergeMap"])(whenReady => whenReady), Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["finalize"])(() => { + stream.removeListener('data', onDataListener); + stream.removeListener('end', onEndListener); + stream.removeListener('error', onErrorListener); + buildOutput$.complete(); + })).toPromise(); +} - resolvingCount++; +/***/ }), +/* 690 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - (async () => { - try { - const element = await nextItem.value; - ret[i] = await mapper(element, i); - resolvingCount--; - next(); - } catch (error) { - if (stopOnError) { - isRejected = true; - reject(error); - } else { - errors.push(error); - resolvingCount--; - next(); - } - } - })(); - }; +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "runCommand", function() { return runCommand; }); +/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2); +/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(chalk__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var indent_string__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(691); +/* harmony import */ var indent_string__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(indent_string__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var wrap_ansi__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(692); +/* harmony import */ var wrap_ansi__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(wrap_ansi__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _utils_errors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(515); +/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(34); +/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(501); +/* harmony import */ var _utils_projects_tree__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(699); +/* harmony import */ var _utils_kibana__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(700); +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } - for (let i = 0; i < concurrency; i++) { - next(); +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } - if (isIterableDone) { - break; - } - } - }); -}; +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ -/***/ }), -/* 672 */ -/***/ (function(module, exports, __webpack_require__) { -"use strict"; -const indentString = __webpack_require__(673); -const cleanStack = __webpack_require__(674); -const cleanInternalStack = stack => stack.replace(/\s+at .*aggregate-error\/index.js:\d+:\d+\)?/g, ''); -class AggregateError extends Error { - constructor(errors) { - if (!Array.isArray(errors)) { - throw new TypeError(`Expected input to be an Array, got ${typeof errors}`); - } - errors = [...errors].map(error => { - if (error instanceof Error) { - return error; - } - if (error !== null && typeof error === 'object') { - // Handle plain error objects with message property and/or possibly other metadata - return Object.assign(new Error(error.message), error); - } - return new Error(error); - }); +async function runCommand(command, config) { + try { + _utils_log__WEBPACK_IMPORTED_MODULE_4__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.bold(`Running [${chalk__WEBPACK_IMPORTED_MODULE_0___default.a.green(command.name)}] command from [${chalk__WEBPACK_IMPORTED_MODULE_0___default.a.yellow(config.rootPath)}]:\n`)); + const kbn = await _utils_kibana__WEBPACK_IMPORTED_MODULE_7__["Kibana"].loadFrom(config.rootPath); + const projects = kbn.getFilteredProjects({ + skipKibanaPlugins: Boolean(config.options['skip-kibana-plugins']), + ossOnly: Boolean(config.options.oss), + exclude: toArray(config.options.exclude), + include: toArray(config.options.include) + }); - let message = errors - .map(error => { - // The `stack` property is not standardized, so we can't assume it exists - return typeof error.stack === 'string' ? cleanInternalStack(cleanStack(error.stack)) : String(error); - }) - .join('\n'); - message = '\n' + indentString(message, 4); - super(message); + if (projects.size === 0) { + _utils_log__WEBPACK_IMPORTED_MODULE_4__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.red(`There are no projects found. Double check project name(s) in '-i/--include' and '-e/--exclude' filters.\n`)); + return process.exit(1); + } - this.name = 'AggregateError'; + const projectGraph = Object(_utils_projects__WEBPACK_IMPORTED_MODULE_5__["buildProjectGraph"])(projects); + _utils_log__WEBPACK_IMPORTED_MODULE_4__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.bold(`Found [${chalk__WEBPACK_IMPORTED_MODULE_0___default.a.green(projects.size.toString())}] projects:\n`)); + _utils_log__WEBPACK_IMPORTED_MODULE_4__["log"].write(Object(_utils_projects_tree__WEBPACK_IMPORTED_MODULE_6__["renderProjectsTree"])(config.rootPath, projects)); + await command.run(projects, projectGraph, _objectSpread({}, config, { + kbn + })); + } catch (e) { + _utils_log__WEBPACK_IMPORTED_MODULE_4__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.bold.red(`\n[${command.name}] failed:\n`)); - Object.defineProperty(this, '_errors', {value: errors}); - } + if (e instanceof _utils_errors__WEBPACK_IMPORTED_MODULE_3__["CliError"]) { + const msg = chalk__WEBPACK_IMPORTED_MODULE_0___default.a.red(`CliError: ${e.message}\n`); + _utils_log__WEBPACK_IMPORTED_MODULE_4__["log"].write(wrap_ansi__WEBPACK_IMPORTED_MODULE_2___default()(msg, 80)); + const keys = Object.keys(e.meta); - * [Symbol.iterator]() { - for (const error of this._errors) { - yield error; - } - } + if (keys.length > 0) { + const metaOutput = keys.map(key => { + const value = e.meta[key]; + return `${key}: ${value}`; + }); + _utils_log__WEBPACK_IMPORTED_MODULE_4__["log"].write('Additional debugging info:\n'); + _utils_log__WEBPACK_IMPORTED_MODULE_4__["log"].write(indent_string__WEBPACK_IMPORTED_MODULE_1___default()(metaOutput.join('\n'), 3)); + } + } else { + _utils_log__WEBPACK_IMPORTED_MODULE_4__["log"].write(e.stack); + } + + process.exit(1); + } } -module.exports = AggregateError; +function toArray(value) { + if (value == null) { + return []; + } + return Array.isArray(value) ? value : [value]; +} /***/ }), -/* 673 */ +/* 691 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -77778,1043 +79919,754 @@ module.exports = (str, count, opts) => { /***/ }), -/* 674 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -const os = __webpack_require__(11); - -const extractPathRegex = /\s+at.*(?:\(|\s)(.*)\)?/; -const pathRegex = /^(?:(?:(?:node|(?:internal\/[\w/]*|.*node_modules\/(?:babel-polyfill|pirates)\/.*)?\w+)\.js:\d+:\d+)|native)/; -const homeDir = os.homedir(); - -module.exports = (stack, options) => { - options = Object.assign({pretty: false}, options); - - return stack.replace(/\\/g, '/') - .split('\n') - .filter(line => { - const pathMatches = line.match(extractPathRegex); - if (pathMatches === null || !pathMatches[1]) { - return true; - } - - const match = pathMatches[1]; - - // Electron - if ( - match.includes('.app/Contents/Resources/electron.asar') || - match.includes('.app/Contents/Resources/default_app.asar') - ) { - return false; - } - - return !pathRegex.test(match); - }) - .filter(line => line.trim() !== '') - .map(line => { - if (options.pretty) { - return line.replace(extractPathRegex, (m, p1) => m.replace(p1, p1.replace(homeDir, '~'))); - } - - return line; - }) - .join('\n'); -}; - - -/***/ }), -/* 675 */ +/* 692 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const chalk = __webpack_require__(676); -const cliCursor = __webpack_require__(680); -const cliSpinners = __webpack_require__(684); -const logSymbols = __webpack_require__(566); - -class Ora { - constructor(options) { - if (typeof options === 'string') { - options = { - text: options - }; - } - - this.options = Object.assign({ - text: '', - color: 'cyan', - stream: process.stderr - }, options); - - const sp = this.options.spinner; - this.spinner = typeof sp === 'object' ? sp : (process.platform === 'win32' ? cliSpinners.line : (cliSpinners[sp] || cliSpinners.dots)); // eslint-disable-line no-nested-ternary - - if (this.spinner.frames === undefined) { - throw new Error('Spinner must define `frames`'); - } - - this.text = this.options.text; - this.color = this.options.color; - this.interval = this.options.interval || this.spinner.interval || 100; - this.stream = this.options.stream; - this.id = null; - this.frameIndex = 0; - this.enabled = typeof this.options.enabled === 'boolean' ? this.options.enabled : ((this.stream && this.stream.isTTY) && !process.env.CI); - } - frame() { - const frames = this.spinner.frames; - let frame = frames[this.frameIndex]; - - if (this.color) { - frame = chalk[this.color](frame); - } - - this.frameIndex = ++this.frameIndex % frames.length; - - return frame + ' ' + this.text; - } - clear() { - if (!this.enabled) { - return this; - } - - this.stream.clearLine(); - this.stream.cursorTo(0); - - return this; - } - render() { - this.clear(); - this.stream.write(this.frame()); - - return this; - } - start(text) { - if (text) { - this.text = text; - } - - if (!this.enabled || this.id) { - return this; - } - - cliCursor.hide(this.stream); - this.render(); - this.id = setInterval(this.render.bind(this), this.interval); - - return this; - } - stop() { - if (!this.enabled) { - return this; - } - - clearInterval(this.id); - this.id = null; - this.frameIndex = 0; - this.clear(); - cliCursor.show(this.stream); +const stringWidth = __webpack_require__(693); +const stripAnsi = __webpack_require__(697); - return this; - } - succeed(text) { - return this.stopAndPersist({symbol: logSymbols.success, text}); - } - fail(text) { - return this.stopAndPersist({symbol: logSymbols.error, text}); - } - warn(text) { - return this.stopAndPersist({symbol: logSymbols.warning, text}); - } - info(text) { - return this.stopAndPersist({symbol: logSymbols.info, text}); - } - stopAndPersist(options) { - if (!this.enabled) { - return this; - } +const ESCAPES = new Set([ + '\u001B', + '\u009B' +]); - // Legacy argument - // TODO: Deprecate sometime in the future - if (typeof options === 'string') { - options = { - symbol: options - }; - } +const END_CODE = 39; - options = options || {}; +const ESCAPE_CODES = new Map([ + [0, 0], + [1, 22], + [2, 22], + [3, 23], + [4, 24], + [7, 27], + [8, 28], + [9, 29], + [30, 39], + [31, 39], + [32, 39], + [33, 39], + [34, 39], + [35, 39], + [36, 39], + [37, 39], + [90, 39], + [40, 49], + [41, 49], + [42, 49], + [43, 49], + [44, 49], + [45, 49], + [46, 49], + [47, 49] +]); - this.stop(); - this.stream.write(`${options.symbol || ' '} ${options.text || this.text}\n`); +const wrapAnsi = code => `${ESCAPES.values().next().value}[${code}m`; - return this; - } -} +// Calculate the length of words split on ' ', ignoring +// the extra characters added by ansi escape codes +const wordLengths = str => str.split(' ').map(s => stringWidth(s)); -module.exports = function (opts) { - return new Ora(opts); -}; +// Wrap a long word across multiple rows +// Ansi escape codes do not count towards length +const wrapWord = (rows, word, cols) => { + const arr = Array.from(word); -module.exports.promise = (action, options) => { - if (typeof action.then !== 'function') { - throw new TypeError('Parameter `action` must be a Promise'); - } + let insideEscape = false; + let visible = stringWidth(stripAnsi(rows[rows.length - 1])); - const spinner = new Ora(options); - spinner.start(); + for (const item of arr.entries()) { + const i = item[0]; + const char = item[1]; + const charLength = stringWidth(char); - action.then( - () => { - spinner.succeed(); - }, - () => { - spinner.fail(); + if (visible + charLength <= cols) { + rows[rows.length - 1] += char; + } else { + rows.push(char); + visible = 0; } - ); - - return spinner; -}; - - -/***/ }), -/* 676 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -const escapeStringRegexp = __webpack_require__(3); -const ansiStyles = __webpack_require__(677); -const stdoutColor = __webpack_require__(678).stdout; - -const template = __webpack_require__(679); - -const isSimpleWindowsTerm = process.platform === 'win32' && !(process.env.TERM || '').toLowerCase().startsWith('xterm'); - -// `supportsColor.level` → `ansiStyles.color[name]` mapping -const levelMapping = ['ansi', 'ansi', 'ansi256', 'ansi16m']; - -// `color-convert` models to exclude from the Chalk API due to conflicts and such -const skipModels = new Set(['gray']); - -const styles = Object.create(null); - -function applyOptions(obj, options) { - options = options || {}; - - // Detect level if not set manually - const scLevel = stdoutColor ? stdoutColor.level : 0; - obj.level = options.level === undefined ? scLevel : options.level; - obj.enabled = 'enabled' in options ? options.enabled : obj.level > 0; -} - -function Chalk(options) { - // We check for this.template here since calling `chalk.constructor()` - // by itself will have a `this` of a previously constructed chalk object - if (!this || !(this instanceof Chalk) || this.template) { - const chalk = {}; - applyOptions(chalk, options); - - chalk.template = function () { - const args = [].slice.call(arguments); - return chalkTag.apply(null, [chalk.template].concat(args)); - }; - - Object.setPrototypeOf(chalk, Chalk.prototype); - Object.setPrototypeOf(chalk.template, chalk); - - chalk.template.constructor = Chalk; - - return chalk.template; - } - - applyOptions(this, options); -} - -// Use bright blue on Windows as the normal blue color is illegible -if (isSimpleWindowsTerm) { - ansiStyles.blue.open = '\u001B[94m'; -} - -for (const key of Object.keys(ansiStyles)) { - ansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g'); - styles[key] = { - get() { - const codes = ansiStyles[key]; - return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, key); + if (ESCAPES.has(char)) { + insideEscape = true; + } else if (insideEscape && char === 'm') { + insideEscape = false; + continue; } - }; -} - -styles.visible = { - get() { - return build.call(this, this._styles || [], true, 'visible'); - } -}; - -ansiStyles.color.closeRe = new RegExp(escapeStringRegexp(ansiStyles.color.close), 'g'); -for (const model of Object.keys(ansiStyles.color.ansi)) { - if (skipModels.has(model)) { - continue; - } - - styles[model] = { - get() { - const level = this.level; - return function () { - const open = ansiStyles.color[levelMapping[level]][model].apply(null, arguments); - const codes = { - open, - close: ansiStyles.color.close, - closeRe: ansiStyles.color.closeRe - }; - return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); - }; + + if (insideEscape) { + continue; } - }; -} -ansiStyles.bgColor.closeRe = new RegExp(escapeStringRegexp(ansiStyles.bgColor.close), 'g'); -for (const model of Object.keys(ansiStyles.bgColor.ansi)) { - if (skipModels.has(model)) { - continue; - } + visible += charLength; - const bgModel = 'bg' + model[0].toUpperCase() + model.slice(1); - styles[bgModel] = { - get() { - const level = this.level; - return function () { - const open = ansiStyles.bgColor[levelMapping[level]][model].apply(null, arguments); - const codes = { - open, - close: ansiStyles.bgColor.close, - closeRe: ansiStyles.bgColor.closeRe - }; - return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); - }; + if (visible === cols && i < arr.length - 1) { + rows.push(''); + visible = 0; } - }; -} + } -const proto = Object.defineProperties(() => {}, styles); + // It's possible that the last row we copy over is only + // ansi escape characters, handle this edge-case + if (!visible && rows[rows.length - 1].length > 0 && rows.length > 1) { + rows[rows.length - 2] += rows.pop(); + } +}; -function build(_styles, _empty, key) { - const builder = function () { - return applyStyle.apply(builder, arguments); - }; +// The wrap-ansi module can be invoked +// in either 'hard' or 'soft' wrap mode +// +// 'hard' will never allow a string to take up more +// than cols characters +// +// 'soft' allows long words to expand past the column length +const exec = (str, cols, opts) => { + const options = opts || {}; - builder._styles = _styles; - builder._empty = _empty; + if (str.trim() === '') { + return options.trim === false ? str : str.trim(); + } - const self = this; + let pre = ''; + let ret = ''; + let escapeCode; - Object.defineProperty(builder, 'level', { - enumerable: true, - get() { - return self.level; - }, - set(level) { - self.level = level; - } - }); + const lengths = wordLengths(str); + const words = str.split(' '); + const rows = ['']; - Object.defineProperty(builder, 'enabled', { - enumerable: true, - get() { - return self.enabled; - }, - set(enabled) { - self.enabled = enabled; - } - }); + for (const item of Array.from(words).entries()) { + const i = item[0]; + const word = item[1]; - // See below for fix regarding invisible grey/dim combination on Windows - builder.hasGrey = this.hasGrey || key === 'gray' || key === 'grey'; + rows[rows.length - 1] = options.trim === false ? rows[rows.length - 1] : rows[rows.length - 1].trim(); + let rowLength = stringWidth(rows[rows.length - 1]); - // `__proto__` is used because we must return a function, but there is - // no way to create a function with a different prototype - builder.__proto__ = proto; // eslint-disable-line no-proto + if (rowLength || word === '') { + if (rowLength === cols && options.wordWrap === false) { + // If we start with a new word but the current row length equals the length of the columns, add a new row + rows.push(''); + rowLength = 0; + } - return builder; -} + rows[rows.length - 1] += ' '; + rowLength++; + } -function applyStyle() { - // Support varags, but simply cast to string in case there's only one arg - const args = arguments; - const argsLen = args.length; - let str = String(arguments[0]); + // In 'hard' wrap mode, the length of a line is + // never allowed to extend past 'cols' + if (lengths[i] > cols && options.hard) { + if (rowLength) { + rows.push(''); + } + wrapWord(rows, word, cols); + continue; + } - if (argsLen === 0) { - return ''; - } + if (rowLength + lengths[i] > cols && rowLength > 0) { + if (options.wordWrap === false && rowLength < cols) { + wrapWord(rows, word, cols); + continue; + } - if (argsLen > 1) { - // Don't slice `arguments`, it prevents V8 optimizations - for (let a = 1; a < argsLen; a++) { - str += ' ' + args[a]; + rows.push(''); } - } - if (!this.enabled || this.level <= 0 || !str) { - return this._empty ? '' : str; - } + if (rowLength + lengths[i] > cols && options.wordWrap === false) { + wrapWord(rows, word, cols); + continue; + } - // Turns out that on Windows dimmed gray text becomes invisible in cmd.exe, - // see https://github.com/chalk/chalk/issues/58 - // If we're on Windows and we're dealing with a gray color, temporarily make 'dim' a noop. - const originalDim = ansiStyles.dim.open; - if (isSimpleWindowsTerm && this.hasGrey) { - ansiStyles.dim.open = ''; + rows[rows.length - 1] += word; } - for (const code of this._styles.slice().reverse()) { - // Replace any instances already present with a re-opening code - // otherwise only the part of the string until said closing code - // will be colored, and the rest will simply be 'plain'. - str = code.open + str.replace(code.closeRe, code.open) + code.close; - - // Close the styling before a linebreak and reopen - // after next line to fix a bleed issue on macOS - // https://github.com/chalk/chalk/pull/92 - str = str.replace(/\r?\n/g, `${code.close}$&${code.open}`); - } + pre = rows.map(r => options.trim === false ? r : r.trim()).join('\n'); - // Reset the original `dim` if we changed it to work around the Windows dimmed gray issue - ansiStyles.dim.open = originalDim; + for (const item of Array.from(pre).entries()) { + const i = item[0]; + const char = item[1]; - return str; -} + ret += char; -function chalkTag(chalk, strings) { - if (!Array.isArray(strings)) { - // If chalk() was called by itself or with a string, - // return the string itself as a string. - return [].slice.call(arguments, 1).join(' '); - } + if (ESCAPES.has(char)) { + const code = parseFloat(/\d[^m]*/.exec(pre.slice(i, i + 4))); + escapeCode = code === END_CODE ? null : code; + } - const args = [].slice.call(arguments, 2); - const parts = [strings.raw[0]]; + const code = ESCAPE_CODES.get(Number(escapeCode)); - for (let i = 1; i < strings.length; i++) { - parts.push(String(args[i - 1]).replace(/[{}\\]/g, '\\$&')); - parts.push(String(strings.raw[i])); + if (escapeCode && code) { + if (pre[i + 1] === '\n') { + ret += wrapAnsi(code); + } else if (char === '\n') { + ret += wrapAnsi(escapeCode); + } + } } - return template(chalk, parts.join('')); -} - -Object.defineProperties(Chalk.prototype, styles); + return ret; +}; -module.exports = Chalk(); // eslint-disable-line new-cap -module.exports.supportsColor = stdoutColor; -module.exports.default = module.exports; // For TypeScript +// For each newline, invoke the method separately +module.exports = (str, cols, opts) => { + return String(str) + .normalize() + .split('\n') + .map(line => exec(line, cols, opts)) + .join('\n'); +}; /***/ }), -/* 677 */ +/* 693 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -/* WEBPACK VAR INJECTION */(function(module) { -const colorConvert = __webpack_require__(6); -const wrapAnsi16 = (fn, offset) => function () { - const code = fn.apply(colorConvert, arguments); - return `\u001B[${code + offset}m`; -}; +const stripAnsi = __webpack_require__(694); +const isFullwidthCodePoint = __webpack_require__(696); -const wrapAnsi256 = (fn, offset) => function () { - const code = fn.apply(colorConvert, arguments); - return `\u001B[${38 + offset};5;${code}m`; -}; +module.exports = str => { + if (typeof str !== 'string' || str.length === 0) { + return 0; + } -const wrapAnsi16m = (fn, offset) => function () { - const rgb = fn.apply(colorConvert, arguments); - return `\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`; -}; + str = stripAnsi(str); -function assembleStyles() { - const codes = new Map(); - const styles = { - modifier: { - reset: [0, 0], - // 21 isn't widely supported and 22 does the same thing - bold: [1, 22], - dim: [2, 22], - italic: [3, 23], - underline: [4, 24], - inverse: [7, 27], - hidden: [8, 28], - strikethrough: [9, 29] - }, - color: { - black: [30, 39], - red: [31, 39], - green: [32, 39], - yellow: [33, 39], - blue: [34, 39], - magenta: [35, 39], - cyan: [36, 39], - white: [37, 39], - gray: [90, 39], + let width = 0; - // Bright color - redBright: [91, 39], - greenBright: [92, 39], - yellowBright: [93, 39], - blueBright: [94, 39], - magentaBright: [95, 39], - cyanBright: [96, 39], - whiteBright: [97, 39] - }, - bgColor: { - bgBlack: [40, 49], - bgRed: [41, 49], - bgGreen: [42, 49], - bgYellow: [43, 49], - bgBlue: [44, 49], - bgMagenta: [45, 49], - bgCyan: [46, 49], - bgWhite: [47, 49], + for (let i = 0; i < str.length; i++) { + const code = str.codePointAt(i); - // Bright color - bgBlackBright: [100, 49], - bgRedBright: [101, 49], - bgGreenBright: [102, 49], - bgYellowBright: [103, 49], - bgBlueBright: [104, 49], - bgMagentaBright: [105, 49], - bgCyanBright: [106, 49], - bgWhiteBright: [107, 49] + // Ignore control characters + if (code <= 0x1F || (code >= 0x7F && code <= 0x9F)) { + continue; } - }; - // Fix humans - styles.color.grey = styles.color.gray; + // Ignore combining characters + if (code >= 0x300 && code <= 0x36F) { + continue; + } - for (const groupName of Object.keys(styles)) { - const group = styles[groupName]; + // Surrogates + if (code > 0xFFFF) { + i++; + } - for (const styleName of Object.keys(group)) { - const style = group[styleName]; + width += isFullwidthCodePoint(code) ? 2 : 1; + } - styles[styleName] = { - open: `\u001B[${style[0]}m`, - close: `\u001B[${style[1]}m` - }; + return width; +}; - group[styleName] = styles[styleName]; - codes.set(style[0], style[1]); - } +/***/ }), +/* 694 */ +/***/ (function(module, exports, __webpack_require__) { - Object.defineProperty(styles, groupName, { - value: group, - enumerable: false - }); +"use strict"; - Object.defineProperty(styles, 'codes', { - value: codes, - enumerable: false - }); - } +const ansiRegex = __webpack_require__(695); - const ansi2ansi = n => n; - const rgb2rgb = (r, g, b) => [r, g, b]; +module.exports = input => typeof input === 'string' ? input.replace(ansiRegex(), '') : input; - styles.color.close = '\u001B[39m'; - styles.bgColor.close = '\u001B[49m'; - styles.color.ansi = { - ansi: wrapAnsi16(ansi2ansi, 0) - }; - styles.color.ansi256 = { - ansi256: wrapAnsi256(ansi2ansi, 0) - }; - styles.color.ansi16m = { - rgb: wrapAnsi16m(rgb2rgb, 0) - }; +/***/ }), +/* 695 */ +/***/ (function(module, exports, __webpack_require__) { - styles.bgColor.ansi = { - ansi: wrapAnsi16(ansi2ansi, 10) - }; - styles.bgColor.ansi256 = { - ansi256: wrapAnsi256(ansi2ansi, 10) - }; - styles.bgColor.ansi16m = { - rgb: wrapAnsi16m(rgb2rgb, 10) - }; +"use strict"; - for (let key of Object.keys(colorConvert)) { - if (typeof colorConvert[key] !== 'object') { - continue; - } - const suite = colorConvert[key]; +module.exports = () => { + const pattern = [ + '[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[a-zA-Z\\d]*)*)?\\u0007)', + '(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PRZcf-ntqry=><~]))' + ].join('|'); - if (key === 'ansi16') { - key = 'ansi'; - } + return new RegExp(pattern, 'g'); +}; - if ('ansi16' in suite) { - styles.color.ansi[key] = wrapAnsi16(suite.ansi16, 0); - styles.bgColor.ansi[key] = wrapAnsi16(suite.ansi16, 10); - } - if ('ansi256' in suite) { - styles.color.ansi256[key] = wrapAnsi256(suite.ansi256, 0); - styles.bgColor.ansi256[key] = wrapAnsi256(suite.ansi256, 10); - } +/***/ }), +/* 696 */ +/***/ (function(module, exports, __webpack_require__) { - if ('rgb' in suite) { - styles.color.ansi16m[key] = wrapAnsi16m(suite.rgb, 0); - styles.bgColor.ansi16m[key] = wrapAnsi16m(suite.rgb, 10); - } +"use strict"; + +/* eslint-disable yoda */ +module.exports = x => { + if (Number.isNaN(x)) { + return false; } - return styles; -} + // code points are derived from: + // http://www.unix.org/Public/UNIDATA/EastAsianWidth.txt + if ( + x >= 0x1100 && ( + x <= 0x115f || // Hangul Jamo + x === 0x2329 || // LEFT-POINTING ANGLE BRACKET + x === 0x232a || // RIGHT-POINTING ANGLE BRACKET + // CJK Radicals Supplement .. Enclosed CJK Letters and Months + (0x2e80 <= x && x <= 0x3247 && x !== 0x303f) || + // Enclosed CJK Letters and Months .. CJK Unified Ideographs Extension A + (0x3250 <= x && x <= 0x4dbf) || + // CJK Unified Ideographs .. Yi Radicals + (0x4e00 <= x && x <= 0xa4c6) || + // Hangul Jamo Extended-A + (0xa960 <= x && x <= 0xa97c) || + // Hangul Syllables + (0xac00 <= x && x <= 0xd7a3) || + // CJK Compatibility Ideographs + (0xf900 <= x && x <= 0xfaff) || + // Vertical Forms + (0xfe10 <= x && x <= 0xfe19) || + // CJK Compatibility Forms .. Small Form Variants + (0xfe30 <= x && x <= 0xfe6b) || + // Halfwidth and Fullwidth Forms + (0xff01 <= x && x <= 0xff60) || + (0xffe0 <= x && x <= 0xffe6) || + // Kana Supplement + (0x1b000 <= x && x <= 0x1b001) || + // Enclosed Ideographic Supplement + (0x1f200 <= x && x <= 0x1f251) || + // CJK Unified Ideographs Extension B .. Tertiary Ideographic Plane + (0x20000 <= x && x <= 0x3fffd) + ) + ) { + return true; + } -// Make the export immutable -Object.defineProperty(module, 'exports', { - enumerable: true, - get: assembleStyles -}); + return false; +}; -/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(5)(module))) /***/ }), -/* 678 */ +/* 697 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const os = __webpack_require__(11); -const hasFlag = __webpack_require__(12); +const ansiRegex = __webpack_require__(698); -const env = process.env; +module.exports = input => typeof input === 'string' ? input.replace(ansiRegex(), '') : input; -let forceColor; -if (hasFlag('no-color') || - hasFlag('no-colors') || - hasFlag('color=false')) { - forceColor = false; -} else if (hasFlag('color') || - hasFlag('colors') || - hasFlag('color=true') || - hasFlag('color=always')) { - forceColor = true; -} -if ('FORCE_COLOR' in env) { - forceColor = env.FORCE_COLOR.length === 0 || parseInt(env.FORCE_COLOR, 10) !== 0; -} -function translateLevel(level) { - if (level === 0) { - return false; - } +/***/ }), +/* 698 */ +/***/ (function(module, exports, __webpack_require__) { - return { - level, - hasBasic: true, - has256: level >= 2, - has16m: level >= 3 - }; -} +"use strict"; -function supportsColor(stream) { - if (forceColor === false) { - return 0; - } - if (hasFlag('color=16m') || - hasFlag('color=full') || - hasFlag('color=truecolor')) { - return 3; - } +module.exports = () => { + const pattern = [ + '[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[a-zA-Z\\d]*)*)?\\u0007)', + '(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PRZcf-ntqry=><~]))' + ].join('|'); - if (hasFlag('color=256')) { - return 2; - } + return new RegExp(pattern, 'g'); +}; + + +/***/ }), +/* 699 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "renderProjectsTree", function() { return renderProjectsTree; }); +/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2); +/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(chalk__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(16); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_1__); +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ - if (stream && !stream.isTTY && forceColor !== true) { - // VS code debugger doesn't have isTTY set - if (env.VSCODE_PID) { - return 1; - } - return 0; - } - const min = forceColor ? 1 : 0; +const projectKey = Symbol('__project'); +function renderProjectsTree(rootPath, projects) { + const projectsTree = buildProjectsTree(rootPath, projects); + return treeToString(createTreeStructure(projectsTree)); +} - if (process.platform === 'win32') { - // Node.js 7.5.0 is the first version of Node.js to include a patch to - // libuv that enables 256 color output on Windows. Anything earlier and it - // won't work. However, here we target Node.js 8 at minimum as it is an LTS - // release, and Node.js 7 is not. Windows 10 build 10586 is the first Windows - // release that supports 256 colors. Windows 10 build 14931 is the first release - // that supports 16m/TrueColor. - const osRelease = os.release().split('.'); - if ( - Number(process.versions.node.split('.')[0]) >= 8 && - Number(osRelease[0]) >= 10 && - Number(osRelease[2]) >= 10586 - ) { - return Number(osRelease[2]) >= 14931 ? 3 : 2; - } +function treeToString(tree) { + return [tree.name].concat(childrenToStrings(tree.children, '')).join('\n'); +} - return 1; - } +function childrenToStrings(tree, treePrefix) { + if (tree === undefined) { + return []; + } - if ('CI' in env) { - if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(sign => sign in env) || env.CI_NAME === 'codeship') { - return 1; - } + let strings = []; + tree.forEach((node, index) => { + const isLastNode = tree.length - 1 === index; + const nodePrefix = isLastNode ? '└── ' : '├── '; + const childPrefix = isLastNode ? ' ' : '│ '; + const childrenPrefix = treePrefix + childPrefix; + strings.push(`${treePrefix}${nodePrefix}${node.name}`); + strings = strings.concat(childrenToStrings(node.children, childrenPrefix)); + }); + return strings; +} - return min; - } +function createTreeStructure(tree) { + let name; + const children = []; - if ('TEAMCITY_VERSION' in env) { - return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0; - } + for (const [dir, project] of tree.entries()) { + // This is a leaf node (aka a project) + if (typeof project === 'string') { + name = chalk__WEBPACK_IMPORTED_MODULE_0___default.a.green(project); + continue; + } // If there's only one project and the key indicates it's a leaf node, we + // know that we're at a package folder that contains a package.json, so we + // "inline it" so we don't get unnecessary levels, i.e. we'll just see + // `foo` instead of `foo -> foo`. - if (env.COLORTERM === 'truecolor') { - return 3; - } - if ('TERM_PROGRAM' in env) { - const version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10); + if (project.size === 1 && project.has(projectKey)) { + const projectName = project.get(projectKey); + children.push({ + children: [], + name: dirOrProjectName(dir, projectName) + }); + continue; + } - switch (env.TERM_PROGRAM) { - case 'iTerm.app': - return version >= 3 ? 3 : 2; - case 'Apple_Terminal': - return 2; - // No default - } - } + const subtree = createTreeStructure(project); // If the name is specified, we know there's a package at the "root" of the + // subtree itself. - if (/-256(color)?$/i.test(env.TERM)) { - return 2; - } + if (subtree.name !== undefined) { + const projectName = subtree.name; + children.push({ + children: subtree.children, + name: dirOrProjectName(dir, projectName) + }); + continue; + } // Special-case whenever we have one child, so we don't get unnecessary + // folders in the output. E.g. instead of `foo -> bar -> baz` we get + // `foo/bar/baz` instead. - if (/^screen|^xterm|^vt100|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { - return 1; - } - if ('COLORTERM' in env) { - return 1; - } + if (subtree.children && subtree.children.length === 1) { + const child = subtree.children[0]; + const newName = chalk__WEBPACK_IMPORTED_MODULE_0___default.a.dim(path__WEBPACK_IMPORTED_MODULE_1___default.a.join(dir.toString(), child.name)); + children.push({ + children: child.children, + name: newName + }); + continue; + } - if (env.TERM === 'dumb') { - return min; - } + children.push({ + children: subtree.children, + name: chalk__WEBPACK_IMPORTED_MODULE_0___default.a.dim(dir.toString()) + }); + } - return min; + return { + name, + children + }; } -function getSupportLevel(stream) { - const level = supportsColor(stream); - return translateLevel(level); +function dirOrProjectName(dir, projectName) { + return dir === projectName ? chalk__WEBPACK_IMPORTED_MODULE_0___default.a.green(dir) : chalk__WEBPACK_IMPORTED_MODULE_0___default.a`{dim ${dir.toString()} ({reset.green ${projectName}})}`; } -module.exports = { - supportsColor: getSupportLevel, - stdout: getSupportLevel(process.stdout), - stderr: getSupportLevel(process.stderr) -}; - - -/***/ }), -/* 679 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -const TEMPLATE_REGEX = /(?:\\(u[a-f\d]{4}|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi; -const STYLE_REGEX = /(?:^|\.)(\w+)(?:\(([^)]*)\))?/g; -const STRING_REGEX = /^(['"])((?:\\.|(?!\1)[^\\])*)\1$/; -const ESCAPE_REGEX = /\\(u[a-f\d]{4}|x[a-f\d]{2}|.)|([^\\])/gi; - -const ESCAPES = new Map([ - ['n', '\n'], - ['r', '\r'], - ['t', '\t'], - ['b', '\b'], - ['f', '\f'], - ['v', '\v'], - ['0', '\0'], - ['\\', '\\'], - ['e', '\u001B'], - ['a', '\u0007'] -]); +function buildProjectsTree(rootPath, projects) { + const tree = new Map(); -function unescape(c) { - if ((c[0] === 'u' && c.length === 5) || (c[0] === 'x' && c.length === 3)) { - return String.fromCharCode(parseInt(c.slice(1), 16)); - } + for (const project of projects.values()) { + if (rootPath === project.path) { + tree.set(projectKey, project.name); + } else { + const relativeProjectPath = path__WEBPACK_IMPORTED_MODULE_1___default.a.relative(rootPath, project.path); + addProjectToTree(tree, relativeProjectPath.split(path__WEBPACK_IMPORTED_MODULE_1___default.a.sep), project); + } + } - return ESCAPES.get(c) || c; + return tree; } -function parseArguments(name, args) { - const results = []; - const chunks = args.trim().split(/\s*,\s*/g); - let matches; +function addProjectToTree(tree, pathParts, project) { + if (pathParts.length === 0) { + tree.set(projectKey, project.name); + } else { + const [currentDir, ...rest] = pathParts; - for (const chunk of chunks) { - if (!isNaN(chunk)) { - results.push(Number(chunk)); - } else if ((matches = chunk.match(STRING_REGEX))) { - results.push(matches[2].replace(ESCAPE_REGEX, (m, escape, chr) => escape ? unescape(escape) : chr)); - } else { - throw new Error(`Invalid Chalk template style argument: ${chunk} (in style '${name}')`); - } - } + if (!tree.has(currentDir)) { + tree.set(currentDir, new Map()); + } - return results; + const subtree = tree.get(currentDir); + addProjectToTree(subtree, rest, project); + } } -function parseStyle(style) { - STYLE_REGEX.lastIndex = 0; +/***/ }), +/* 700 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - const results = []; - let matches; +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Kibana", function() { return Kibana; }); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(16); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var multimatch__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(701); +/* harmony import */ var multimatch__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(multimatch__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _projects__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(501); +/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(580); +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } - while ((matches = STYLE_REGEX.exec(style)) !== null) { - const name = matches[1]; +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } - if (matches[2]) { - const args = parseArguments(name, matches[2]); - results.push([name].concat(args)); - } else { - results.push([name]); - } - } +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - return results; -} +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ -function buildStyle(chalk, styles) { - const enabled = {}; - for (const layer of styles) { - for (const style of layer.styles) { - enabled[style[0]] = layer.inverse ? null : style.slice(1); - } - } - let current = chalk; - for (const styleName of Object.keys(enabled)) { - if (Array.isArray(enabled[styleName])) { - if (!(styleName in current)) { - throw new Error(`Unknown Chalk style: ${styleName}`); - } - if (enabled[styleName].length > 0) { - current = current[styleName].apply(current, enabled[styleName]); - } else { - current = current[styleName]; - } - } - } +/** + * Helper class for dealing with a set of projects as children of + * the Kibana project. The kbn/pm is currently implemented to be + * more generic, where everything is an operation of generic projects, + * but that leads to exceptions where we need the kibana project and + * do things like `project.get('kibana')!`. + * + * Using this helper we can restructre the generic list of projects + * as a Kibana object which encapulates all the projects in the + * workspace and knows about the root Kibana project. + */ - return current; -} +class Kibana { + static async loadFrom(rootPath) { + return new Kibana((await Object(_projects__WEBPACK_IMPORTED_MODULE_2__["getProjects"])(rootPath, Object(_config__WEBPACK_IMPORTED_MODULE_3__["getProjectPaths"])({ + rootPath + })))); + } -module.exports = (chalk, tmp) => { - const styles = []; - const chunks = []; - let chunk = []; + constructor(allWorkspaceProjects) { + this.allWorkspaceProjects = allWorkspaceProjects; - // eslint-disable-next-line max-params - tmp.replace(TEMPLATE_REGEX, (m, escapeChar, inverse, style, close, chr) => { - if (escapeChar) { - chunk.push(unescape(escapeChar)); - } else if (style) { - const str = chunk.join(''); - chunk = []; - chunks.push(styles.length === 0 ? str : buildStyle(chalk, styles)(str)); - styles.push({inverse, styles: parseStyle(style)}); - } else if (close) { - if (styles.length === 0) { - throw new Error('Found extraneous } in Chalk template literal'); - } + _defineProperty(this, "kibanaProject", void 0); - chunks.push(buildStyle(chalk, styles)(chunk.join(''))); - chunk = []; - styles.pop(); - } else { - chunk.push(chr); - } - }); + const kibanaProject = allWorkspaceProjects.get('kibana'); - chunks.push(chunk.join('')); + if (!kibanaProject) { + throw new TypeError('Unable to create Kibana object without all projects, including the Kibana project.'); + } - if (styles.length > 0) { - const errMsg = `Chalk template literal is missing ${styles.length} closing bracket${styles.length === 1 ? '' : 's'} (\`}\`)`; - throw new Error(errMsg); - } + this.kibanaProject = kibanaProject; + } + /** make an absolute path by resolving subPath relative to the kibana repo */ - return chunks.join(''); -}; + getAbsolute(...subPath) { + return path__WEBPACK_IMPORTED_MODULE_0___default.a.resolve(this.kibanaProject.path, ...subPath); + } + /** convert an absolute path to a relative path, relative to the kibana repo */ -/***/ }), -/* 680 */ -/***/ (function(module, exports, __webpack_require__) { -"use strict"; + getRelative(absolute) { + return path__WEBPACK_IMPORTED_MODULE_0___default.a.relative(this.kibanaProject.path, absolute); + } + /** get a copy of the map of all projects in the kibana workspace */ -const restoreCursor = __webpack_require__(681); -let hidden = false; + getAllProjects() { + return new Map(this.allWorkspaceProjects); + } + /** determine if a project with the given name exists */ -exports.show = stream => { - const s = stream || process.stderr; - if (!s.isTTY) { - return; - } + hasProject(name) { + return this.allWorkspaceProjects.has(name); + } + /** get a specific project, throws if the name is not known (use hasProject() first) */ - hidden = false; - s.write('\u001b[?25h'); -}; -exports.hide = stream => { - const s = stream || process.stderr; + getProject(name) { + const project = this.allWorkspaceProjects.get(name); - if (!s.isTTY) { - return; - } + if (!project) { + throw new Error(`No package with name "${name}" in the workspace`); + } - restoreCursor(); - hidden = true; - s.write('\u001b[?25l'); -}; + return project; + } + /** get a project and all of the projects it depends on in a ProjectMap */ -exports.toggle = (force, stream) => { - if (force !== undefined) { - hidden = force; - } - if (hidden) { - exports.show(stream); - } else { - exports.hide(stream); - } -}; + getProjectAndDeps(name) { + const project = this.getProject(name); + return Object(_projects__WEBPACK_IMPORTED_MODULE_2__["includeTransitiveProjects"])([project], this.allWorkspaceProjects); + } + /** filter the projects to just those matching certain paths/include/exclude tags */ -/***/ }), -/* 681 */ -/***/ (function(module, exports, __webpack_require__) { + getFilteredProjects(options) { + const allProjects = this.getAllProjects(); + const filteredProjects = new Map(); + const pkgJsonPaths = Array.from(allProjects.values()).map(p => p.packageJsonLocation); + const filteredPkgJsonGlobs = Object(_config__WEBPACK_IMPORTED_MODULE_3__["getProjectPaths"])(_objectSpread({}, options, { + rootPath: this.kibanaProject.path + })).map(g => path__WEBPACK_IMPORTED_MODULE_0___default.a.resolve(g, 'package.json')); + const matchingPkgJsonPaths = multimatch__WEBPACK_IMPORTED_MODULE_1___default()(pkgJsonPaths, filteredPkgJsonGlobs); -"use strict"; + for (const project of allProjects.values()) { + const pathMatches = matchingPkgJsonPaths.includes(project.packageJsonLocation); + const notExcluded = !options.exclude.includes(project.name); + const isIncluded = !options.include.length || options.include.includes(project.name); -const onetime = __webpack_require__(682); -const signalExit = __webpack_require__(377); + if (pathMatches && notExcluded && isIncluded) { + filteredProjects.set(project.name, project); + } + } -module.exports = onetime(() => { - signalExit(() => { - process.stderr.write('\u001b[?25h'); - }, {alwaysLast: true}); -}); + return filteredProjects; + } +} /***/ }), -/* 682 */ +/* 701 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const mimicFn = __webpack_require__(683); +const minimatch = __webpack_require__(505); +const arrayUnion = __webpack_require__(702); +const arrayDiffer = __webpack_require__(703); +const arrify = __webpack_require__(704); -module.exports = (fn, opts) => { - // TODO: Remove this in v3 - if (opts === true) { - throw new TypeError('The second argument is now an options object'); - } +module.exports = (list, patterns, options = {}) => { + list = arrify(list); + patterns = arrify(patterns); - if (typeof fn !== 'function') { - throw new TypeError('Expected a function'); + if (list.length === 0 || patterns.length === 0) { + return []; } - opts = opts || {}; + return patterns.reduce((result, pattern) => { + let process = arrayUnion; - let ret; - let called = false; - const fnName = fn.displayName || fn.name || ''; + if (pattern[0] === '!') { + pattern = pattern.slice(1); + process = arrayDiffer; + } - const onetime = function () { - if (called) { - if (opts.throw === true) { - throw new Error(`Function \`${fnName}\` can only be called once`); - } + return process(result, minimatch.match(list, pattern, options)); + }, []); +}; - return ret; - } - called = true; - ret = fn.apply(this, arguments); - fn = null; +/***/ }), +/* 702 */ +/***/ (function(module, exports, __webpack_require__) { - return ret; - }; +"use strict"; - mimicFn(onetime, fn); - return onetime; +module.exports = (...arguments_) => { + return [...new Set([].concat(...arguments_))]; }; /***/ }), -/* 683 */ +/* 703 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -module.exports = (to, from) => { - // TODO: use `Reflect.ownKeys()` when targeting Node.js 6 - for (const prop of Object.getOwnPropertyNames(from).concat(Object.getOwnPropertySymbols(from))) { - Object.defineProperty(to, prop, Object.getOwnPropertyDescriptor(from, prop)); - } - return to; +const arrayDiffer = (array, ...values) => { + const rest = new Set([].concat(...values)); + return array.filter(element => !rest.has(element)); }; +module.exports = arrayDiffer; + /***/ }), -/* 684 */ +/* 704 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -module.exports = __webpack_require__(685); +const arrify = value => { + if (value === null || value === undefined) { + return []; + } -/***/ }), -/* 685 */ -/***/ (function(module) { + if (Array.isArray(value)) { + return value; + } + + if (typeof value === 'string') { + return [value]; + } + + if (typeof value[Symbol.iterator] === 'function') { + return [...value]; + } + + return [value]; +}; + +module.exports = arrify; -module.exports = JSON.parse("{\"dots\":{\"interval\":80,\"frames\":[\"⠋\",\"⠙\",\"⠹\",\"⠸\",\"⠼\",\"⠴\",\"⠦\",\"⠧\",\"⠇\",\"⠏\"]},\"dots2\":{\"interval\":80,\"frames\":[\"⣾\",\"⣽\",\"⣻\",\"⢿\",\"⡿\",\"⣟\",\"⣯\",\"⣷\"]},\"dots3\":{\"interval\":80,\"frames\":[\"⠋\",\"⠙\",\"⠚\",\"⠞\",\"⠖\",\"⠦\",\"⠴\",\"⠲\",\"⠳\",\"⠓\"]},\"dots4\":{\"interval\":80,\"frames\":[\"⠄\",\"⠆\",\"⠇\",\"⠋\",\"⠙\",\"⠸\",\"⠰\",\"⠠\",\"⠰\",\"⠸\",\"⠙\",\"⠋\",\"⠇\",\"⠆\"]},\"dots5\":{\"interval\":80,\"frames\":[\"⠋\",\"⠙\",\"⠚\",\"⠒\",\"⠂\",\"⠂\",\"⠒\",\"⠲\",\"⠴\",\"⠦\",\"⠖\",\"⠒\",\"⠐\",\"⠐\",\"⠒\",\"⠓\",\"⠋\"]},\"dots6\":{\"interval\":80,\"frames\":[\"⠁\",\"⠉\",\"⠙\",\"⠚\",\"⠒\",\"⠂\",\"⠂\",\"⠒\",\"⠲\",\"⠴\",\"⠤\",\"⠄\",\"⠄\",\"⠤\",\"⠴\",\"⠲\",\"⠒\",\"⠂\",\"⠂\",\"⠒\",\"⠚\",\"⠙\",\"⠉\",\"⠁\"]},\"dots7\":{\"interval\":80,\"frames\":[\"⠈\",\"⠉\",\"⠋\",\"⠓\",\"⠒\",\"⠐\",\"⠐\",\"⠒\",\"⠖\",\"⠦\",\"⠤\",\"⠠\",\"⠠\",\"⠤\",\"⠦\",\"⠖\",\"⠒\",\"⠐\",\"⠐\",\"⠒\",\"⠓\",\"⠋\",\"⠉\",\"⠈\"]},\"dots8\":{\"interval\":80,\"frames\":[\"⠁\",\"⠁\",\"⠉\",\"⠙\",\"⠚\",\"⠒\",\"⠂\",\"⠂\",\"⠒\",\"⠲\",\"⠴\",\"⠤\",\"⠄\",\"⠄\",\"⠤\",\"⠠\",\"⠠\",\"⠤\",\"⠦\",\"⠖\",\"⠒\",\"⠐\",\"⠐\",\"⠒\",\"⠓\",\"⠋\",\"⠉\",\"⠈\",\"⠈\"]},\"dots9\":{\"interval\":80,\"frames\":[\"⢹\",\"⢺\",\"⢼\",\"⣸\",\"⣇\",\"⡧\",\"⡗\",\"⡏\"]},\"dots10\":{\"interval\":80,\"frames\":[\"⢄\",\"⢂\",\"⢁\",\"⡁\",\"⡈\",\"⡐\",\"⡠\"]},\"dots11\":{\"interval\":100,\"frames\":[\"⠁\",\"⠂\",\"⠄\",\"⡀\",\"⢀\",\"⠠\",\"⠐\",\"⠈\"]},\"dots12\":{\"interval\":80,\"frames\":[\"⢀⠀\",\"⡀⠀\",\"⠄⠀\",\"⢂⠀\",\"⡂⠀\",\"⠅⠀\",\"⢃⠀\",\"⡃⠀\",\"⠍⠀\",\"⢋⠀\",\"⡋⠀\",\"⠍⠁\",\"⢋⠁\",\"⡋⠁\",\"⠍⠉\",\"⠋⠉\",\"⠋⠉\",\"⠉⠙\",\"⠉⠙\",\"⠉⠩\",\"⠈⢙\",\"⠈⡙\",\"⢈⠩\",\"⡀⢙\",\"⠄⡙\",\"⢂⠩\",\"⡂⢘\",\"⠅⡘\",\"⢃⠨\",\"⡃⢐\",\"⠍⡐\",\"⢋⠠\",\"⡋⢀\",\"⠍⡁\",\"⢋⠁\",\"⡋⠁\",\"⠍⠉\",\"⠋⠉\",\"⠋⠉\",\"⠉⠙\",\"⠉⠙\",\"⠉⠩\",\"⠈⢙\",\"⠈⡙\",\"⠈⠩\",\"⠀⢙\",\"⠀⡙\",\"⠀⠩\",\"⠀⢘\",\"⠀⡘\",\"⠀⠨\",\"⠀⢐\",\"⠀⡐\",\"⠀⠠\",\"⠀⢀\",\"⠀⡀\"]},\"line\":{\"interval\":130,\"frames\":[\"-\",\"\\\\\",\"|\",\"/\"]},\"line2\":{\"interval\":100,\"frames\":[\"⠂\",\"-\",\"–\",\"—\",\"–\",\"-\"]},\"pipe\":{\"interval\":100,\"frames\":[\"┤\",\"┘\",\"┴\",\"└\",\"├\",\"┌\",\"┬\",\"┐\"]},\"simpleDots\":{\"interval\":400,\"frames\":[\". \",\".. \",\"...\",\" \"]},\"simpleDotsScrolling\":{\"interval\":200,\"frames\":[\". \",\".. \",\"...\",\" ..\",\" .\",\" \"]},\"star\":{\"interval\":70,\"frames\":[\"✶\",\"✸\",\"✹\",\"✺\",\"✹\",\"✷\"]},\"star2\":{\"interval\":80,\"frames\":[\"+\",\"x\",\"*\"]},\"flip\":{\"interval\":70,\"frames\":[\"_\",\"_\",\"_\",\"-\",\"`\",\"`\",\"'\",\"´\",\"-\",\"_\",\"_\",\"_\"]},\"hamburger\":{\"interval\":100,\"frames\":[\"☱\",\"☲\",\"☴\"]},\"growVertical\":{\"interval\":120,\"frames\":[\"▁\",\"▃\",\"▄\",\"▅\",\"▆\",\"▇\",\"▆\",\"▅\",\"▄\",\"▃\"]},\"growHorizontal\":{\"interval\":120,\"frames\":[\"▏\",\"▎\",\"▍\",\"▌\",\"▋\",\"▊\",\"▉\",\"▊\",\"▋\",\"▌\",\"▍\",\"▎\"]},\"balloon\":{\"interval\":140,\"frames\":[\" \",\".\",\"o\",\"O\",\"@\",\"*\",\" \"]},\"balloon2\":{\"interval\":120,\"frames\":[\".\",\"o\",\"O\",\"°\",\"O\",\"o\",\".\"]},\"noise\":{\"interval\":100,\"frames\":[\"▓\",\"▒\",\"░\"]},\"bounce\":{\"interval\":120,\"frames\":[\"⠁\",\"⠂\",\"⠄\",\"⠂\"]},\"boxBounce\":{\"interval\":120,\"frames\":[\"▖\",\"▘\",\"▝\",\"▗\"]},\"boxBounce2\":{\"interval\":100,\"frames\":[\"▌\",\"▀\",\"▐\",\"▄\"]},\"triangle\":{\"interval\":50,\"frames\":[\"◢\",\"◣\",\"◤\",\"◥\"]},\"arc\":{\"interval\":100,\"frames\":[\"◜\",\"◠\",\"◝\",\"◞\",\"◡\",\"◟\"]},\"circle\":{\"interval\":120,\"frames\":[\"◡\",\"⊙\",\"◠\"]},\"squareCorners\":{\"interval\":180,\"frames\":[\"◰\",\"◳\",\"◲\",\"◱\"]},\"circleQuarters\":{\"interval\":120,\"frames\":[\"◴\",\"◷\",\"◶\",\"◵\"]},\"circleHalves\":{\"interval\":50,\"frames\":[\"◐\",\"◓\",\"◑\",\"◒\"]},\"squish\":{\"interval\":100,\"frames\":[\"╫\",\"╪\"]},\"toggle\":{\"interval\":250,\"frames\":[\"⊶\",\"⊷\"]},\"toggle2\":{\"interval\":80,\"frames\":[\"▫\",\"▪\"]},\"toggle3\":{\"interval\":120,\"frames\":[\"□\",\"■\"]},\"toggle4\":{\"interval\":100,\"frames\":[\"■\",\"□\",\"▪\",\"▫\"]},\"toggle5\":{\"interval\":100,\"frames\":[\"▮\",\"▯\"]},\"toggle6\":{\"interval\":300,\"frames\":[\"ဝ\",\"၀\"]},\"toggle7\":{\"interval\":80,\"frames\":[\"⦾\",\"⦿\"]},\"toggle8\":{\"interval\":100,\"frames\":[\"◍\",\"◌\"]},\"toggle9\":{\"interval\":100,\"frames\":[\"◉\",\"◎\"]},\"toggle10\":{\"interval\":100,\"frames\":[\"㊂\",\"㊀\",\"㊁\"]},\"toggle11\":{\"interval\":50,\"frames\":[\"⧇\",\"⧆\"]},\"toggle12\":{\"interval\":120,\"frames\":[\"☗\",\"☖\"]},\"toggle13\":{\"interval\":80,\"frames\":[\"=\",\"*\",\"-\"]},\"arrow\":{\"interval\":100,\"frames\":[\"←\",\"↖\",\"↑\",\"↗\",\"→\",\"↘\",\"↓\",\"↙\"]},\"arrow2\":{\"interval\":80,\"frames\":[\"⬆️ \",\"↗️ \",\"➡️ \",\"↘️ \",\"⬇️ \",\"↙️ \",\"⬅️ \",\"↖️ \"]},\"arrow3\":{\"interval\":120,\"frames\":[\"▹▹▹▹▹\",\"▸▹▹▹▹\",\"▹▸▹▹▹\",\"▹▹▸▹▹\",\"▹▹▹▸▹\",\"▹▹▹▹▸\"]},\"bouncingBar\":{\"interval\":80,\"frames\":[\"[ ]\",\"[= ]\",\"[== ]\",\"[=== ]\",\"[ ===]\",\"[ ==]\",\"[ =]\",\"[ ]\",\"[ =]\",\"[ ==]\",\"[ ===]\",\"[====]\",\"[=== ]\",\"[== ]\",\"[= ]\"]},\"bouncingBall\":{\"interval\":80,\"frames\":[\"( ● )\",\"( ● )\",\"( ● )\",\"( ● )\",\"( ●)\",\"( ● )\",\"( ● )\",\"( ● )\",\"( ● )\",\"(● )\"]},\"smiley\":{\"interval\":200,\"frames\":[\"😄 \",\"😝 \"]},\"monkey\":{\"interval\":300,\"frames\":[\"🙈 \",\"🙈 \",\"🙉 \",\"🙊 \"]},\"hearts\":{\"interval\":100,\"frames\":[\"💛 \",\"💙 \",\"💜 \",\"💚 \",\"❤️ \"]},\"clock\":{\"interval\":100,\"frames\":[\"🕐 \",\"🕑 \",\"🕒 \",\"🕓 \",\"🕔 \",\"🕕 \",\"🕖 \",\"🕗 \",\"🕘 \",\"🕙 \",\"🕚 \"]},\"earth\":{\"interval\":180,\"frames\":[\"🌍 \",\"🌎 \",\"🌏 \"]},\"moon\":{\"interval\":80,\"frames\":[\"🌑 \",\"🌒 \",\"🌓 \",\"🌔 \",\"🌕 \",\"🌖 \",\"🌗 \",\"🌘 \"]},\"runner\":{\"interval\":140,\"frames\":[\"🚶 \",\"🏃 \"]},\"pong\":{\"interval\":80,\"frames\":[\"▐⠂ ▌\",\"▐⠈ ▌\",\"▐ ⠂ ▌\",\"▐ ⠠ ▌\",\"▐ ⡀ ▌\",\"▐ ⠠ ▌\",\"▐ ⠂ ▌\",\"▐ ⠈ ▌\",\"▐ ⠂ ▌\",\"▐ ⠠ ▌\",\"▐ ⡀ ▌\",\"▐ ⠠ ▌\",\"▐ ⠂ ▌\",\"▐ ⠈ ▌\",\"▐ ⠂▌\",\"▐ ⠠▌\",\"▐ ⡀▌\",\"▐ ⠠ ▌\",\"▐ ⠂ ▌\",\"▐ ⠈ ▌\",\"▐ ⠂ ▌\",\"▐ ⠠ ▌\",\"▐ ⡀ ▌\",\"▐ ⠠ ▌\",\"▐ ⠂ ▌\",\"▐ ⠈ ▌\",\"▐ ⠂ ▌\",\"▐ ⠠ ▌\",\"▐ ⡀ ▌\",\"▐⠠ ▌\"]},\"shark\":{\"interval\":120,\"frames\":[\"▐|\\\\____________▌\",\"▐_|\\\\___________▌\",\"▐__|\\\\__________▌\",\"▐___|\\\\_________▌\",\"▐____|\\\\________▌\",\"▐_____|\\\\_______▌\",\"▐______|\\\\______▌\",\"▐_______|\\\\_____▌\",\"▐________|\\\\____▌\",\"▐_________|\\\\___▌\",\"▐__________|\\\\__▌\",\"▐___________|\\\\_▌\",\"▐____________|\\\\▌\",\"▐____________/|▌\",\"▐___________/|_▌\",\"▐__________/|__▌\",\"▐_________/|___▌\",\"▐________/|____▌\",\"▐_______/|_____▌\",\"▐______/|______▌\",\"▐_____/|_______▌\",\"▐____/|________▌\",\"▐___/|_________▌\",\"▐__/|__________▌\",\"▐_/|___________▌\",\"▐/|____________▌\"]},\"dqpb\":{\"interval\":100,\"frames\":[\"d\",\"q\",\"p\",\"b\"]},\"weather\":{\"interval\":100,\"frames\":[\"☀️ \",\"☀️ \",\"☀️ \",\"🌤 \",\"⛅️ \",\"🌥 \",\"☁️ \",\"🌧 \",\"🌨 \",\"🌧 \",\"🌨 \",\"🌧 \",\"🌨 \",\"⛈ \",\"🌨 \",\"🌧 \",\"🌨 \",\"☁️ \",\"🌥 \",\"⛅️ \",\"🌤 \",\"☀️ \",\"☀️ \"]},\"christmas\":{\"interval\":400,\"frames\":[\"🌲\",\"🎄\"]}}"); /***/ }), -/* 686 */ +/* 705 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RunCommand", function() { return RunCommand; }); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(chalk__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(34); -/* harmony import */ var _utils_parallelize__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(500); -/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(501); +/* harmony import */ var _build_production_projects__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(706); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "buildProductionProjects", function() { return _build_production_projects__WEBPACK_IMPORTED_MODULE_0__["buildProductionProjects"]; }); + +/* harmony import */ var _prepare_project_dependencies__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(923); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "prepareExternalProjectDependencies", function() { return _prepare_project_dependencies__WEBPACK_IMPORTED_MODULE_1__["prepareExternalProjectDependencies"]; }); + /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with @@ -78836,46 +80688,24 @@ __webpack_require__.r(__webpack_exports__); - -const RunCommand = { - description: 'Run script defined in package.json in each package that contains that script.', - name: 'run', - - async run(projects, projectGraph, { - extraArgs - }) { - const batchedProjects = Object(_utils_projects__WEBPACK_IMPORTED_MODULE_3__["topologicallyBatchProjects"])(projects, projectGraph); - - if (extraArgs.length === 0) { - _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.red.bold('\nNo script specified')); - process.exit(1); - } - - const scriptName = extraArgs[0]; - const scriptArgs = extraArgs.slice(1); - _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.bold(`\nRunning script [${chalk__WEBPACK_IMPORTED_MODULE_0___default.a.green(scriptName)}] in batched topological order\n`)); - await Object(_utils_parallelize__WEBPACK_IMPORTED_MODULE_2__["parallelizeBatches"])(batchedProjects, async pkg => { - if (pkg.hasScript(scriptName)) { - await pkg.runScriptStreaming(scriptName, scriptArgs); - } - }); - } - -}; - /***/ }), -/* 687 */ +/* 706 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "WatchCommand", function() { return WatchCommand; }); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(chalk__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(34); -/* harmony import */ var _utils_parallelize__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(500); -/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(501); -/* harmony import */ var _utils_watch__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(688); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "buildProductionProjects", function() { return buildProductionProjects; }); +/* harmony import */ var cpy__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(707); +/* harmony import */ var cpy__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(cpy__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var del__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(588); +/* harmony import */ var del__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(del__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(16); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(580); +/* harmony import */ var _utils_fs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(20); +/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(34); +/* harmony import */ var _utils_package_json__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(517); +/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(501); /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with @@ -78900,1532 +80730,2066 @@ __webpack_require__.r(__webpack_exports__); + + +async function buildProductionProjects({ + kibanaRoot, + buildRoot, + onlyOSS +}) { + const projects = await getProductionProjects(kibanaRoot, onlyOSS); + const projectGraph = Object(_utils_projects__WEBPACK_IMPORTED_MODULE_7__["buildProjectGraph"])(projects); + const batchedProjects = Object(_utils_projects__WEBPACK_IMPORTED_MODULE_7__["topologicallyBatchProjects"])(projects, projectGraph); + const projectNames = [...projects.values()].map(project => project.name); + _utils_log__WEBPACK_IMPORTED_MODULE_5__["log"].write(`Preparing production build for [${projectNames.join(', ')}]`); + + for (const batch of batchedProjects) { + for (const project of batch) { + await deleteTarget(project); + await buildProject(project); + await copyToBuild(project, kibanaRoot, buildRoot); + } + } +} /** - * Name of the script in the package/project package.json file to run during `kbn watch`. - */ -const watchScriptName = 'kbn:watch'; -/** - * Name of the Kibana project. + * Returns the subset of projects that should be built into the production + * bundle. As we copy these into Kibana's `node_modules` during the build step, + * and let Kibana's build process be responsible for installing dependencies, + * we only include Kibana's transitive _production_ dependencies. If onlyOSS + * is supplied, we omit projects with build.oss in their package.json set to false. */ -const kibanaProjectName = 'kibana'; +async function getProductionProjects(rootPath, onlyOSS) { + const projectPaths = Object(_config__WEBPACK_IMPORTED_MODULE_3__["getProjectPaths"])({ + rootPath + }); + const projects = await Object(_utils_projects__WEBPACK_IMPORTED_MODULE_7__["getProjects"])(rootPath, projectPaths); + const projectsSubset = [projects.get('kibana')]; + + if (projects.has('x-pack')) { + projectsSubset.push(projects.get('x-pack')); + } + + const productionProjects = Object(_utils_projects__WEBPACK_IMPORTED_MODULE_7__["includeTransitiveProjects"])(projectsSubset, projects, { + onlyProductionDependencies: true + }); // We remove Kibana, as we're already building Kibana + + productionProjects.delete('kibana'); + + if (onlyOSS) { + productionProjects.forEach(project => { + if (project.getBuildConfig().oss === false) { + productionProjects.delete(project.json.name); + } + }); + } + + return productionProjects; +} + +async function deleteTarget(project) { + const targetDir = project.targetLocation; + + if (await Object(_utils_fs__WEBPACK_IMPORTED_MODULE_4__["isDirectory"])(targetDir)) { + await del__WEBPACK_IMPORTED_MODULE_1___default()(targetDir, { + force: true + }); + } +} + +async function buildProject(project) { + if (project.hasScript('build')) { + await project.runScript('build'); + } +} /** - * Command that traverses through list of available projects/packages that have `kbn:watch` script in their - * package.json files, groups them into topology aware batches and then processes theses batches one by one - * running `kbn:watch` scripts in parallel within the same batch. + * Copy all the project's files from its "intermediate build directory" and + * into the build. The intermediate directory can either be the root of the + * project or some other location defined in the project's `package.json`. * - * Command internally relies on the fact that most of the build systems that are triggered by `kbn:watch` - * will emit special "marker" once build/watch process is ready that we can use as completion condition for - * the `kbn:watch` script and eventually for the entire batch. Currently we support completion "markers" for - * `webpack` and `tsc` only, for the rest we rely on predefined timeouts. + * When copying all the files into the build, we exclude `node_modules` because + * we want the Kibana build to be responsible for actually installing all + * dependencies. The primary reason for allowing the Kibana build process to + * manage dependencies is that it will "dedupe" them, so we don't include + * unnecessary copies of dependencies. */ -const WatchCommand = { - description: 'Runs `kbn:watch` script for every project.', - name: 'watch', - async run(projects, projectGraph) { - const projectsToWatch = new Map(); +async function copyToBuild(project, kibanaRoot, buildRoot) { + // We want the package to have the same relative location within the build + const relativeProjectPath = Object(path__WEBPACK_IMPORTED_MODULE_2__["relative"])(kibanaRoot, project.path); + const buildProjectPath = Object(path__WEBPACK_IMPORTED_MODULE_2__["resolve"])(buildRoot, relativeProjectPath); + await cpy__WEBPACK_IMPORTED_MODULE_0___default()(['**/*', '!node_modules/**'], buildProjectPath, { + cwd: project.getIntermediateBuildDirectory(), + dot: true, + nodir: true, + parents: true + }); // If a project is using an intermediate build directory, we special-case our + // handling of `package.json`, as the project build process might have copied + // (a potentially modified) `package.json` into the intermediate build + // directory already. If so, we want to use that `package.json` as the basis + // for creating the production-ready `package.json`. If it's not present in + // the intermediate build, we fall back to using the project's already defined + // `package.json`. - for (const project of projects.values()) { - // We can't watch project that doesn't have `kbn:watch` script. - if (project.hasScript(watchScriptName)) { - projectsToWatch.set(project.name, project); - } - } + const packageJson = (await Object(_utils_fs__WEBPACK_IMPORTED_MODULE_4__["isFile"])(Object(path__WEBPACK_IMPORTED_MODULE_2__["join"])(buildProjectPath, 'package.json'))) ? await Object(_utils_package_json__WEBPACK_IMPORTED_MODULE_6__["readPackageJson"])(buildProjectPath) : project.json; + await Object(_utils_package_json__WEBPACK_IMPORTED_MODULE_6__["writePackageJson"])(buildProjectPath, packageJson); +} - if (projectsToWatch.size === 0) { - _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.red(`\nThere are no projects to watch found. Make sure that projects define 'kbn:watch' script in 'package.json'.\n`)); - return; - } +/***/ }), +/* 707 */ +/***/ (function(module, exports, __webpack_require__) { - const projectNames = Array.from(projectsToWatch.keys()); - _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.bold(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.green(`Running ${watchScriptName} scripts for [${projectNames.join(', ')}].`))); // Kibana should always be run the last, so we don't rely on automatic - // topological batching and push it to the last one-entry batch manually. +"use strict"; - const shouldWatchKibanaProject = projectsToWatch.delete(kibanaProjectName); - const batchedProjects = Object(_utils_projects__WEBPACK_IMPORTED_MODULE_3__["topologicallyBatchProjects"])(projectsToWatch, projectGraph); +const EventEmitter = __webpack_require__(379); +const path = __webpack_require__(16); +const arrify = __webpack_require__(708); +const globby = __webpack_require__(709); +const cpFile = __webpack_require__(912); +const CpyError = __webpack_require__(921); - if (shouldWatchKibanaProject) { - batchedProjects.push([projects.get(kibanaProjectName)]); - } +const preprocessSrcPath = (srcPath, options) => options.cwd ? path.resolve(options.cwd, srcPath) : srcPath; - await Object(_utils_parallelize__WEBPACK_IMPORTED_MODULE_2__["parallelizeBatches"])(batchedProjects, async pkg => { - const completionHint = await Object(_utils_watch__WEBPACK_IMPORTED_MODULE_4__["waitUntilWatchIsReady"])(pkg.runScriptStreaming(watchScriptName).stdout); - _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.bold(`[${chalk__WEBPACK_IMPORTED_MODULE_0___default.a.green(pkg.name)}] Initial build completed (${completionHint}).`)); - }); - } +const preprocessDestPath = (srcPath, dest, options) => { + let basename = path.basename(srcPath); + const dirname = path.dirname(srcPath); + + if (typeof options.rename === 'string') { + basename = options.rename; + } else if (typeof options.rename === 'function') { + basename = options.rename(basename); + } + + if (options.cwd) { + dest = path.resolve(options.cwd, dest); + } + + if (options.parents) { + return path.join(dest, dirname, basename); + } + + return path.join(dest, basename); +}; + +const cpy = (src, dest, options = {}) => { + src = arrify(src); + + const progressEmitter = new EventEmitter(); + + if (src.length === 0 || !dest) { + const promise = Promise.reject(new CpyError('`files` and `destination` required')); + promise.on = (...args) => { + progressEmitter.on(...args); + return promise; + }; + + return promise; + } + + const copyStatus = new Map(); + let completedFiles = 0; + let completedSize = 0; + + const promise = globby(src, options) + .catch(error => { + throw new CpyError(`Cannot glob \`${src}\`: ${error.message}`, error); + }) + .then(files => { + if (files.length === 0) { + progressEmitter.emit('progress', { + totalFiles: 0, + percent: 1, + completedFiles: 0, + completedSize: 0 + }); + } + + return Promise.all(files.map(srcPath => { + const from = preprocessSrcPath(srcPath, options); + const to = preprocessDestPath(srcPath, dest, options); + + return cpFile(from, to, options) + .on('progress', event => { + const fileStatus = copyStatus.get(event.src) || {written: 0, percent: 0}; + + if (fileStatus.written !== event.written || fileStatus.percent !== event.percent) { + completedSize -= fileStatus.written; + completedSize += event.written; + + if (event.percent === 1 && fileStatus.percent !== 1) { + completedFiles++; + } + + copyStatus.set(event.src, {written: event.written, percent: event.percent}); + + progressEmitter.emit('progress', { + totalFiles: files.length, + percent: completedFiles / files.length, + completedFiles, + completedSize + }); + } + }) + .then(() => to) + .catch(error => { + throw new CpyError(`Cannot copy from \`${from}\` to \`${to}\`: ${error.message}`, error); + }); + })); + }); + + promise.on = (...args) => { + progressEmitter.on(...args); + return promise; + }; + return promise; }; +module.exports = cpy; +// TODO: Remove this for the next major release +module.exports.default = cpy; + + /***/ }), -/* 688 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 708 */ +/***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "waitUntilWatchIsReady", function() { return waitUntilWatchIsReady; }); -/* harmony import */ var rxjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(392); -/* harmony import */ var rxjs_operators__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(169); -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ +module.exports = function (val) { + if (val === null || val === undefined) { + return []; + } -/** - * Number of milliseconds we wait before we fall back to the default watch handler. - */ + return Array.isArray(val) ? val : [val]; +}; -const defaultHandlerDelay = 3000; -/** - * If default watch handler is used, then it's the number of milliseconds we wait for - * any build output before we consider watch task ready. - */ -const defaultHandlerReadinessTimeout = 2000; -/** - * Describes configurable watch options. - */ +/***/ }), +/* 709 */ +/***/ (function(module, exports, __webpack_require__) { -function getWatchHandlers(buildOutput$, { - handlerDelay = defaultHandlerDelay, - handlerReadinessTimeout = defaultHandlerReadinessTimeout -}) { - const typescriptHandler = buildOutput$.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["first"])(data => data.includes('$ tsc')), Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["map"])(() => buildOutput$.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["first"])(data => data.includes('Compilation complete.')), Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["mapTo"])('tsc')))); - const webpackHandler = buildOutput$.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["first"])(data => data.includes('$ webpack')), Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["map"])(() => buildOutput$.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["first"])(data => data.includes('Chunk Names')), Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["mapTo"])('webpack')))); - const defaultHandler = rxjs__WEBPACK_IMPORTED_MODULE_0__["of"](undefined).pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["delay"])(handlerReadinessTimeout), Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["map"])(() => buildOutput$.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["timeout"])(handlerDelay), Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["catchError"])(() => rxjs__WEBPACK_IMPORTED_MODULE_0__["of"]('timeout'))))); - return [typescriptHandler, webpackHandler, defaultHandler]; -} +"use strict"; -function waitUntilWatchIsReady(stream, opts = {}) { - const buildOutput$ = new rxjs__WEBPACK_IMPORTED_MODULE_0__["Subject"](); +const fs = __webpack_require__(23); +const arrayUnion = __webpack_require__(710); +const glob = __webpack_require__(712); +const fastGlob = __webpack_require__(717); +const dirGlob = __webpack_require__(905); +const gitignore = __webpack_require__(908); - const onDataListener = data => buildOutput$.next(data.toString('utf-8')); +const DEFAULT_FILTER = () => false; - const onEndListener = () => buildOutput$.complete(); +const isNegative = pattern => pattern[0] === '!'; - const onErrorListener = e => buildOutput$.error(e); +const assertPatternsInput = patterns => { + if (!patterns.every(x => typeof x === 'string')) { + throw new TypeError('Patterns must be a string or an array of strings'); + } +}; + +const checkCwdOption = options => { + if (options && options.cwd && !fs.statSync(options.cwd).isDirectory()) { + throw new Error('The `cwd` option must be a path to a directory'); + } +}; + +const generateGlobTasks = (patterns, taskOptions) => { + patterns = arrayUnion([].concat(patterns)); + assertPatternsInput(patterns); + checkCwdOption(taskOptions); + + const globTasks = []; + + taskOptions = Object.assign({ + ignore: [], + expandDirectories: true + }, taskOptions); + + patterns.forEach((pattern, i) => { + if (isNegative(pattern)) { + return; + } + + const ignore = patterns + .slice(i) + .filter(isNegative) + .map(pattern => pattern.slice(1)); + + const options = Object.assign({}, taskOptions, { + ignore: taskOptions.ignore.concat(ignore) + }); + + globTasks.push({pattern, options}); + }); + + return globTasks; +}; + +const globDirs = (task, fn) => { + let options = {}; + if (task.options.cwd) { + options.cwd = task.options.cwd; + } + + if (Array.isArray(task.options.expandDirectories)) { + options = Object.assign(options, {files: task.options.expandDirectories}); + } else if (typeof task.options.expandDirectories === 'object') { + options = Object.assign(options, task.options.expandDirectories); + } + + return fn(task.pattern, options); +}; + +const getPattern = (task, fn) => task.options.expandDirectories ? globDirs(task, fn) : [task.pattern]; + +const globToTask = task => glob => { + const {options} = task; + if (options.ignore && Array.isArray(options.ignore) && options.expandDirectories) { + options.ignore = dirGlob.sync(options.ignore); + } + + return { + pattern: glob, + options + }; +}; + +const globby = (patterns, options) => { + let globTasks; + + try { + globTasks = generateGlobTasks(patterns, options); + } catch (error) { + return Promise.reject(error); + } + + const getTasks = Promise.all(globTasks.map(task => Promise.resolve(getPattern(task, dirGlob)) + .then(globs => Promise.all(globs.map(globToTask(task)))) + )) + .then(tasks => arrayUnion(...tasks)); + + const getFilter = () => { + return Promise.resolve( + options && options.gitignore ? + gitignore({cwd: options.cwd, ignore: options.ignore}) : + DEFAULT_FILTER + ); + }; + + return getFilter() + .then(filter => { + return getTasks + .then(tasks => Promise.all(tasks.map(task => fastGlob(task.pattern, task.options)))) + .then(paths => arrayUnion(...paths)) + .then(paths => paths.filter(p => !filter(p))); + }); +}; + +module.exports = globby; +// TODO: Remove this for the next major release +module.exports.default = globby; + +module.exports.sync = (patterns, options) => { + const globTasks = generateGlobTasks(patterns, options); + + const getFilter = () => { + return options && options.gitignore ? + gitignore.sync({cwd: options.cwd, ignore: options.ignore}) : + DEFAULT_FILTER; + }; + + const tasks = globTasks.reduce((tasks, task) => { + const newTask = getPattern(task, dirGlob.sync).map(globToTask(task)); + return tasks.concat(newTask); + }, []); + + const filter = getFilter(); + return tasks.reduce( + (matches, task) => arrayUnion(matches, fastGlob.sync(task.pattern, task.options)), + [] + ).filter(p => !filter(p)); +}; + +module.exports.generateGlobTasks = generateGlobTasks; + +module.exports.hasMagic = (patterns, options) => [] + .concat(patterns) + .some(pattern => glob.hasMagic(pattern, options)); + +module.exports.gitignore = gitignore; - stream.once('end', onEndListener); - stream.once('error', onErrorListener); - stream.on('data', onDataListener); - return rxjs__WEBPACK_IMPORTED_MODULE_0__["race"](getWatchHandlers(buildOutput$, opts)).pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["mergeMap"])(whenReady => whenReady), Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["finalize"])(() => { - stream.removeListener('data', onDataListener); - stream.removeListener('end', onEndListener); - stream.removeListener('error', onErrorListener); - buildOutput$.complete(); - })).toPromise(); -} /***/ }), -/* 689 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 710 */ +/***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "runCommand", function() { return runCommand; }); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(chalk__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var indent_string__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(673); -/* harmony import */ var indent_string__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(indent_string__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var wrap_ansi__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(690); -/* harmony import */ var wrap_ansi__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(wrap_ansi__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _utils_errors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(515); -/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(34); -/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(501); -/* harmony import */ var _utils_projects_tree__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(697); -/* harmony import */ var _utils_kibana__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(698); -function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } - -function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } +var arrayUniq = __webpack_require__(711); -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ +module.exports = function () { + return arrayUniq([].concat.apply([], arguments)); +}; +/***/ }), +/* 711 */ +/***/ (function(module, exports, __webpack_require__) { +"use strict"; +// there's 3 implementations written in increasing order of efficiency +// 1 - no Set type is defined +function uniqNoSet(arr) { + var ret = []; + for (var i = 0; i < arr.length; i++) { + if (ret.indexOf(arr[i]) === -1) { + ret.push(arr[i]); + } + } -async function runCommand(command, config) { - try { - _utils_log__WEBPACK_IMPORTED_MODULE_4__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.bold(`Running [${chalk__WEBPACK_IMPORTED_MODULE_0___default.a.green(command.name)}] command from [${chalk__WEBPACK_IMPORTED_MODULE_0___default.a.yellow(config.rootPath)}]:\n`)); - const kbn = await _utils_kibana__WEBPACK_IMPORTED_MODULE_7__["Kibana"].loadFrom(config.rootPath); - const projects = kbn.getFilteredProjects({ - skipKibanaPlugins: Boolean(config.options['skip-kibana-plugins']), - ossOnly: Boolean(config.options.oss), - exclude: toArray(config.options.exclude), - include: toArray(config.options.include) - }); + return ret; +} - if (projects.size === 0) { - _utils_log__WEBPACK_IMPORTED_MODULE_4__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.red(`There are no projects found. Double check project name(s) in '-i/--include' and '-e/--exclude' filters.\n`)); - return process.exit(1); - } +// 2 - a simple Set type is defined +function uniqSet(arr) { + var seen = new Set(); + return arr.filter(function (el) { + if (!seen.has(el)) { + seen.add(el); + return true; + } - const projectGraph = Object(_utils_projects__WEBPACK_IMPORTED_MODULE_5__["buildProjectGraph"])(projects); - _utils_log__WEBPACK_IMPORTED_MODULE_4__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.bold(`Found [${chalk__WEBPACK_IMPORTED_MODULE_0___default.a.green(projects.size.toString())}] projects:\n`)); - _utils_log__WEBPACK_IMPORTED_MODULE_4__["log"].write(Object(_utils_projects_tree__WEBPACK_IMPORTED_MODULE_6__["renderProjectsTree"])(config.rootPath, projects)); - await command.run(projects, projectGraph, _objectSpread({}, config, { - kbn - })); - } catch (e) { - _utils_log__WEBPACK_IMPORTED_MODULE_4__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.bold.red(`\n[${command.name}] failed:\n`)); + return false; + }); +} - if (e instanceof _utils_errors__WEBPACK_IMPORTED_MODULE_3__["CliError"]) { - const msg = chalk__WEBPACK_IMPORTED_MODULE_0___default.a.red(`CliError: ${e.message}\n`); - _utils_log__WEBPACK_IMPORTED_MODULE_4__["log"].write(wrap_ansi__WEBPACK_IMPORTED_MODULE_2___default()(msg, 80)); - const keys = Object.keys(e.meta); +// 3 - a standard Set type is defined and it has a forEach method +function uniqSetWithForEach(arr) { + var ret = []; - if (keys.length > 0) { - const metaOutput = keys.map(key => { - const value = e.meta[key]; - return `${key}: ${value}`; - }); - _utils_log__WEBPACK_IMPORTED_MODULE_4__["log"].write('Additional debugging info:\n'); - _utils_log__WEBPACK_IMPORTED_MODULE_4__["log"].write(indent_string__WEBPACK_IMPORTED_MODULE_1___default()(metaOutput.join('\n'), 3)); - } - } else { - _utils_log__WEBPACK_IMPORTED_MODULE_4__["log"].write(e.stack); - } + (new Set(arr)).forEach(function (el) { + ret.push(el); + }); - process.exit(1); - } + return ret; } -function toArray(value) { - if (value == null) { - return []; - } +// V8 currently has a broken implementation +// https://github.com/joyent/node/issues/8449 +function doesForEachActuallyWork() { + var ret = false; - return Array.isArray(value) ? value : [value]; + (new Set([true])).forEach(function (el) { + ret = el; + }); + + return ret === true; +} + +if ('Set' in global) { + if (typeof Set.prototype.forEach === 'function' && doesForEachActuallyWork()) { + module.exports = uniqSetWithForEach; + } else { + module.exports = uniqSet; + } +} else { + module.exports = uniqNoSet; } + /***/ }), -/* 690 */ +/* 712 */ /***/ (function(module, exports, __webpack_require__) { -"use strict"; +// Approach: +// +// 1. Get the minimatch set +// 2. For each pattern in the set, PROCESS(pattern, false) +// 3. Store matches per-set, then uniq them +// +// PROCESS(pattern, inGlobStar) +// Get the first [n] items from pattern that are all strings +// Join these together. This is PREFIX. +// If there is no more remaining, then stat(PREFIX) and +// add to matches if it succeeds. END. +// +// If inGlobStar and PREFIX is symlink and points to dir +// set ENTRIES = [] +// else readdir(PREFIX) as ENTRIES +// If fail, END +// +// with ENTRIES +// If pattern[n] is GLOBSTAR +// // handle the case where the globstar match is empty +// // by pruning it out, and testing the resulting pattern +// PROCESS(pattern[0..n] + pattern[n+1 .. $], false) +// // handle other cases. +// for ENTRY in ENTRIES (not dotfiles) +// // attach globstar + tail onto the entry +// // Mark that this entry is a globstar match +// PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true) +// +// else // not globstar +// for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot) +// Test ENTRY against pattern[n] +// If fails, continue +// If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $]) +// +// Caveat: +// Cache all stats and readdirs results to minimize syscall. Since all +// we ever care about is existence and directory-ness, we can just keep +// `true` for files, and [children,...] for directories, or `false` for +// things that don't exist. -const stringWidth = __webpack_require__(691); -const stripAnsi = __webpack_require__(695); +module.exports = glob -const ESCAPES = new Set([ - '\u001B', - '\u009B' -]); +var fs = __webpack_require__(23) +var rp = __webpack_require__(503) +var minimatch = __webpack_require__(505) +var Minimatch = minimatch.Minimatch +var inherits = __webpack_require__(713) +var EE = __webpack_require__(379).EventEmitter +var path = __webpack_require__(16) +var assert = __webpack_require__(30) +var isAbsolute = __webpack_require__(511) +var globSync = __webpack_require__(715) +var common = __webpack_require__(716) +var alphasort = common.alphasort +var alphasorti = common.alphasorti +var setopts = common.setopts +var ownProp = common.ownProp +var inflight = __webpack_require__(514) +var util = __webpack_require__(29) +var childrenIgnored = common.childrenIgnored +var isIgnored = common.isIgnored -const END_CODE = 39; +var once = __webpack_require__(385) -const ESCAPE_CODES = new Map([ - [0, 0], - [1, 22], - [2, 22], - [3, 23], - [4, 24], - [7, 27], - [8, 28], - [9, 29], - [30, 39], - [31, 39], - [32, 39], - [33, 39], - [34, 39], - [35, 39], - [36, 39], - [37, 39], - [90, 39], - [40, 49], - [41, 49], - [42, 49], - [43, 49], - [44, 49], - [45, 49], - [46, 49], - [47, 49] -]); +function glob (pattern, options, cb) { + if (typeof options === 'function') cb = options, options = {} + if (!options) options = {} -const wrapAnsi = code => `${ESCAPES.values().next().value}[${code}m`; + if (options.sync) { + if (cb) + throw new TypeError('callback provided to sync glob') + return globSync(pattern, options) + } -// Calculate the length of words split on ' ', ignoring -// the extra characters added by ansi escape codes -const wordLengths = str => str.split(' ').map(s => stringWidth(s)); + return new Glob(pattern, options, cb) +} -// Wrap a long word across multiple rows -// Ansi escape codes do not count towards length -const wrapWord = (rows, word, cols) => { - const arr = Array.from(word); +glob.sync = globSync +var GlobSync = glob.GlobSync = globSync.GlobSync - let insideEscape = false; - let visible = stringWidth(stripAnsi(rows[rows.length - 1])); +// old api surface +glob.glob = glob - for (const item of arr.entries()) { - const i = item[0]; - const char = item[1]; - const charLength = stringWidth(char); +function extend (origin, add) { + if (add === null || typeof add !== 'object') { + return origin + } - if (visible + charLength <= cols) { - rows[rows.length - 1] += char; - } else { - rows.push(char); - visible = 0; - } + var keys = Object.keys(add) + var i = keys.length + while (i--) { + origin[keys[i]] = add[keys[i]] + } + return origin +} - if (ESCAPES.has(char)) { - insideEscape = true; - } else if (insideEscape && char === 'm') { - insideEscape = false; - continue; - } +glob.hasMagic = function (pattern, options_) { + var options = extend({}, options_) + options.noprocess = true - if (insideEscape) { - continue; - } + var g = new Glob(pattern, options) + var set = g.minimatch.set - visible += charLength; + if (!pattern) + return false - if (visible === cols && i < arr.length - 1) { - rows.push(''); - visible = 0; - } - } + if (set.length > 1) + return true - // It's possible that the last row we copy over is only - // ansi escape characters, handle this edge-case - if (!visible && rows[rows.length - 1].length > 0 && rows.length > 1) { - rows[rows.length - 2] += rows.pop(); - } -}; + for (var j = 0; j < set[0].length; j++) { + if (typeof set[0][j] !== 'string') + return true + } -// The wrap-ansi module can be invoked -// in either 'hard' or 'soft' wrap mode -// -// 'hard' will never allow a string to take up more -// than cols characters -// -// 'soft' allows long words to expand past the column length -const exec = (str, cols, opts) => { - const options = opts || {}; + return false +} - if (str.trim() === '') { - return options.trim === false ? str : str.trim(); - } +glob.Glob = Glob +inherits(Glob, EE) +function Glob (pattern, options, cb) { + if (typeof options === 'function') { + cb = options + options = null + } - let pre = ''; - let ret = ''; - let escapeCode; + if (options && options.sync) { + if (cb) + throw new TypeError('callback provided to sync glob') + return new GlobSync(pattern, options) + } - const lengths = wordLengths(str); - const words = str.split(' '); - const rows = ['']; + if (!(this instanceof Glob)) + return new Glob(pattern, options, cb) - for (const item of Array.from(words).entries()) { - const i = item[0]; - const word = item[1]; + setopts(this, pattern, options) + this._didRealPath = false - rows[rows.length - 1] = options.trim === false ? rows[rows.length - 1] : rows[rows.length - 1].trim(); - let rowLength = stringWidth(rows[rows.length - 1]); + // process each pattern in the minimatch set + var n = this.minimatch.set.length - if (rowLength || word === '') { - if (rowLength === cols && options.wordWrap === false) { - // If we start with a new word but the current row length equals the length of the columns, add a new row - rows.push(''); - rowLength = 0; - } + // The matches are stored as {: true,...} so that + // duplicates are automagically pruned. + // Later, we do an Object.keys() on these. + // Keep them as a list so we can fill in when nonull is set. + this.matches = new Array(n) - rows[rows.length - 1] += ' '; - rowLength++; - } + if (typeof cb === 'function') { + cb = once(cb) + this.on('error', cb) + this.on('end', function (matches) { + cb(null, matches) + }) + } - // In 'hard' wrap mode, the length of a line is - // never allowed to extend past 'cols' - if (lengths[i] > cols && options.hard) { - if (rowLength) { - rows.push(''); - } - wrapWord(rows, word, cols); - continue; - } + var self = this + this._processing = 0 - if (rowLength + lengths[i] > cols && rowLength > 0) { - if (options.wordWrap === false && rowLength < cols) { - wrapWord(rows, word, cols); - continue; - } + this._emitQueue = [] + this._processQueue = [] + this.paused = false - rows.push(''); - } + if (this.noprocess) + return this - if (rowLength + lengths[i] > cols && options.wordWrap === false) { - wrapWord(rows, word, cols); - continue; - } + if (n === 0) + return done() - rows[rows.length - 1] += word; - } + var sync = true + for (var i = 0; i < n; i ++) { + this._process(this.minimatch.set[i], i, false, done) + } + sync = false - pre = rows.map(r => options.trim === false ? r : r.trim()).join('\n'); + function done () { + --self._processing + if (self._processing <= 0) { + if (sync) { + process.nextTick(function () { + self._finish() + }) + } else { + self._finish() + } + } + } +} - for (const item of Array.from(pre).entries()) { - const i = item[0]; - const char = item[1]; +Glob.prototype._finish = function () { + assert(this instanceof Glob) + if (this.aborted) + return - ret += char; + if (this.realpath && !this._didRealpath) + return this._realpath() - if (ESCAPES.has(char)) { - const code = parseFloat(/\d[^m]*/.exec(pre.slice(i, i + 4))); - escapeCode = code === END_CODE ? null : code; - } + common.finish(this) + this.emit('end', this.found) +} - const code = ESCAPE_CODES.get(Number(escapeCode)); +Glob.prototype._realpath = function () { + if (this._didRealpath) + return - if (escapeCode && code) { - if (pre[i + 1] === '\n') { - ret += wrapAnsi(code); - } else if (char === '\n') { - ret += wrapAnsi(escapeCode); - } - } - } + this._didRealpath = true - return ret; -}; + var n = this.matches.length + if (n === 0) + return this._finish() -// For each newline, invoke the method separately -module.exports = (str, cols, opts) => { - return String(str) - .normalize() - .split('\n') - .map(line => exec(line, cols, opts)) - .join('\n'); -}; + var self = this + for (var i = 0; i < this.matches.length; i++) + this._realpathSet(i, next) + + function next () { + if (--n === 0) + self._finish() + } +} +Glob.prototype._realpathSet = function (index, cb) { + var matchset = this.matches[index] + if (!matchset) + return cb() -/***/ }), -/* 691 */ -/***/ (function(module, exports, __webpack_require__) { + var found = Object.keys(matchset) + var self = this + var n = found.length + + if (n === 0) + return cb() + + var set = this.matches[index] = Object.create(null) + found.forEach(function (p, i) { + // If there's a problem with the stat, then it means that + // one or more of the links in the realpath couldn't be + // resolved. just return the abs value in that case. + p = self._makeAbs(p) + rp.realpath(p, self.realpathCache, function (er, real) { + if (!er) + set[real] = true + else if (er.syscall === 'stat') + set[p] = true + else + self.emit('error', er) // srsly wtf right here + + if (--n === 0) { + self.matches[index] = set + cb() + } + }) + }) +} + +Glob.prototype._mark = function (p) { + return common.mark(this, p) +} -"use strict"; +Glob.prototype._makeAbs = function (f) { + return common.makeAbs(this, f) +} -const stripAnsi = __webpack_require__(692); -const isFullwidthCodePoint = __webpack_require__(694); +Glob.prototype.abort = function () { + this.aborted = true + this.emit('abort') +} -module.exports = str => { - if (typeof str !== 'string' || str.length === 0) { - return 0; - } +Glob.prototype.pause = function () { + if (!this.paused) { + this.paused = true + this.emit('pause') + } +} - str = stripAnsi(str); +Glob.prototype.resume = function () { + if (this.paused) { + this.emit('resume') + this.paused = false + if (this._emitQueue.length) { + var eq = this._emitQueue.slice(0) + this._emitQueue.length = 0 + for (var i = 0; i < eq.length; i ++) { + var e = eq[i] + this._emitMatch(e[0], e[1]) + } + } + if (this._processQueue.length) { + var pq = this._processQueue.slice(0) + this._processQueue.length = 0 + for (var i = 0; i < pq.length; i ++) { + var p = pq[i] + this._processing-- + this._process(p[0], p[1], p[2], p[3]) + } + } + } +} - let width = 0; +Glob.prototype._process = function (pattern, index, inGlobStar, cb) { + assert(this instanceof Glob) + assert(typeof cb === 'function') - for (let i = 0; i < str.length; i++) { - const code = str.codePointAt(i); + if (this.aborted) + return - // Ignore control characters - if (code <= 0x1F || (code >= 0x7F && code <= 0x9F)) { - continue; - } + this._processing++ + if (this.paused) { + this._processQueue.push([pattern, index, inGlobStar, cb]) + return + } - // Ignore combining characters - if (code >= 0x300 && code <= 0x36F) { - continue; - } + //console.error('PROCESS %d', this._processing, pattern) - // Surrogates - if (code > 0xFFFF) { - i++; - } + // Get the first [n] parts of pattern that are all strings. + var n = 0 + while (typeof pattern[n] === 'string') { + n ++ + } + // now n is the index of the first one that is *not* a string. - width += isFullwidthCodePoint(code) ? 2 : 1; - } + // see if there's anything else + var prefix + switch (n) { + // if not, then this is rather simple + case pattern.length: + this._processSimple(pattern.join('/'), index, cb) + return - return width; -}; + case 0: + // pattern *starts* with some non-trivial item. + // going to readdir(cwd), but not include the prefix in matches. + prefix = null + break + default: + // pattern has some string bits in the front. + // whatever it starts with, whether that's 'absolute' like /foo/bar, + // or 'relative' like '../baz' + prefix = pattern.slice(0, n).join('/') + break + } -/***/ }), -/* 692 */ -/***/ (function(module, exports, __webpack_require__) { + var remain = pattern.slice(n) -"use strict"; + // get the list of entries. + var read + if (prefix === null) + read = '.' + else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) { + if (!prefix || !isAbsolute(prefix)) + prefix = '/' + prefix + read = prefix + } else + read = prefix -const ansiRegex = __webpack_require__(693); + var abs = this._makeAbs(read) -module.exports = input => typeof input === 'string' ? input.replace(ansiRegex(), '') : input; + //if ignored, skip _processing + if (childrenIgnored(this, read)) + return cb() + var isGlobStar = remain[0] === minimatch.GLOBSTAR + if (isGlobStar) + this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb) + else + this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb) +} -/***/ }), -/* 693 */ -/***/ (function(module, exports, __webpack_require__) { +Glob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) { + var self = this + this._readdir(abs, inGlobStar, function (er, entries) { + return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb) + }) +} -"use strict"; +Glob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) { + // if the abs isn't a dir, then nothing can match! + if (!entries) + return cb() -module.exports = () => { - const pattern = [ - '[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[a-zA-Z\\d]*)*)?\\u0007)', - '(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PRZcf-ntqry=><~]))' - ].join('|'); + // It will only match dot entries if it starts with a dot, or if + // dot is set. Stuff like @(.foo|.bar) isn't allowed. + var pn = remain[0] + var negate = !!this.minimatch.negate + var rawGlob = pn._glob + var dotOk = this.dot || rawGlob.charAt(0) === '.' - return new RegExp(pattern, 'g'); -}; + var matchedEntries = [] + for (var i = 0; i < entries.length; i++) { + var e = entries[i] + if (e.charAt(0) !== '.' || dotOk) { + var m + if (negate && !prefix) { + m = !e.match(pn) + } else { + m = e.match(pn) + } + if (m) + matchedEntries.push(e) + } + } + //console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries) -/***/ }), -/* 694 */ -/***/ (function(module, exports, __webpack_require__) { + var len = matchedEntries.length + // If there are no matched entries, then nothing matches. + if (len === 0) + return cb() -"use strict"; + // if this is the last remaining pattern bit, then no need for + // an additional stat *unless* the user has specified mark or + // stat explicitly. We know they exist, since readdir returned + // them. -/* eslint-disable yoda */ -module.exports = x => { - if (Number.isNaN(x)) { - return false; - } + if (remain.length === 1 && !this.mark && !this.stat) { + if (!this.matches[index]) + this.matches[index] = Object.create(null) - // code points are derived from: - // http://www.unix.org/Public/UNIDATA/EastAsianWidth.txt - if ( - x >= 0x1100 && ( - x <= 0x115f || // Hangul Jamo - x === 0x2329 || // LEFT-POINTING ANGLE BRACKET - x === 0x232a || // RIGHT-POINTING ANGLE BRACKET - // CJK Radicals Supplement .. Enclosed CJK Letters and Months - (0x2e80 <= x && x <= 0x3247 && x !== 0x303f) || - // Enclosed CJK Letters and Months .. CJK Unified Ideographs Extension A - (0x3250 <= x && x <= 0x4dbf) || - // CJK Unified Ideographs .. Yi Radicals - (0x4e00 <= x && x <= 0xa4c6) || - // Hangul Jamo Extended-A - (0xa960 <= x && x <= 0xa97c) || - // Hangul Syllables - (0xac00 <= x && x <= 0xd7a3) || - // CJK Compatibility Ideographs - (0xf900 <= x && x <= 0xfaff) || - // Vertical Forms - (0xfe10 <= x && x <= 0xfe19) || - // CJK Compatibility Forms .. Small Form Variants - (0xfe30 <= x && x <= 0xfe6b) || - // Halfwidth and Fullwidth Forms - (0xff01 <= x && x <= 0xff60) || - (0xffe0 <= x && x <= 0xffe6) || - // Kana Supplement - (0x1b000 <= x && x <= 0x1b001) || - // Enclosed Ideographic Supplement - (0x1f200 <= x && x <= 0x1f251) || - // CJK Unified Ideographs Extension B .. Tertiary Ideographic Plane - (0x20000 <= x && x <= 0x3fffd) - ) - ) { - return true; - } + for (var i = 0; i < len; i ++) { + var e = matchedEntries[i] + if (prefix) { + if (prefix !== '/') + e = prefix + '/' + e + else + e = prefix + e + } - return false; -}; + if (e.charAt(0) === '/' && !this.nomount) { + e = path.join(this.root, e) + } + this._emitMatch(index, e) + } + // This was the last one, and no stats were needed + return cb() + } + // now test all matched entries as stand-ins for that part + // of the pattern. + remain.shift() + for (var i = 0; i < len; i ++) { + var e = matchedEntries[i] + var newPattern + if (prefix) { + if (prefix !== '/') + e = prefix + '/' + e + else + e = prefix + e + } + this._process([e].concat(remain), index, inGlobStar, cb) + } + cb() +} -/***/ }), -/* 695 */ -/***/ (function(module, exports, __webpack_require__) { +Glob.prototype._emitMatch = function (index, e) { + if (this.aborted) + return -"use strict"; + if (isIgnored(this, e)) + return -const ansiRegex = __webpack_require__(696); + if (this.paused) { + this._emitQueue.push([index, e]) + return + } -module.exports = input => typeof input === 'string' ? input.replace(ansiRegex(), '') : input; + var abs = isAbsolute(e) ? e : this._makeAbs(e) + if (this.mark) + e = this._mark(e) -/***/ }), -/* 696 */ -/***/ (function(module, exports, __webpack_require__) { + if (this.absolute) + e = abs -"use strict"; + if (this.matches[index][e]) + return + if (this.nodir) { + var c = this.cache[abs] + if (c === 'DIR' || Array.isArray(c)) + return + } -module.exports = () => { - const pattern = [ - '[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[a-zA-Z\\d]*)*)?\\u0007)', - '(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PRZcf-ntqry=><~]))' - ].join('|'); + this.matches[index][e] = true - return new RegExp(pattern, 'g'); -}; + var st = this.statCache[abs] + if (st) + this.emit('stat', e, st) + this.emit('match', e) +} -/***/ }), -/* 697 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +Glob.prototype._readdirInGlobStar = function (abs, cb) { + if (this.aborted) + return -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "renderProjectsTree", function() { return renderProjectsTree; }); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(chalk__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(16); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_1__); -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ + // follow all symlinked directories forever + // just proceed as if this is a non-globstar situation + if (this.follow) + return this._readdir(abs, false, cb) + var lstatkey = 'lstat\0' + abs + var self = this + var lstatcb = inflight(lstatkey, lstatcb_) -const projectKey = Symbol('__project'); -function renderProjectsTree(rootPath, projects) { - const projectsTree = buildProjectsTree(rootPath, projects); - return treeToString(createTreeStructure(projectsTree)); -} + if (lstatcb) + fs.lstat(abs, lstatcb) -function treeToString(tree) { - return [tree.name].concat(childrenToStrings(tree.children, '')).join('\n'); -} + function lstatcb_ (er, lstat) { + if (er && er.code === 'ENOENT') + return cb() -function childrenToStrings(tree, treePrefix) { - if (tree === undefined) { - return []; - } + var isSym = lstat && lstat.isSymbolicLink() + self.symlinks[abs] = isSym - let strings = []; - tree.forEach((node, index) => { - const isLastNode = tree.length - 1 === index; - const nodePrefix = isLastNode ? '└── ' : '├── '; - const childPrefix = isLastNode ? ' ' : '│ '; - const childrenPrefix = treePrefix + childPrefix; - strings.push(`${treePrefix}${nodePrefix}${node.name}`); - strings = strings.concat(childrenToStrings(node.children, childrenPrefix)); - }); - return strings; + // If it's not a symlink or a dir, then it's definitely a regular file. + // don't bother doing a readdir in that case. + if (!isSym && lstat && !lstat.isDirectory()) { + self.cache[abs] = 'FILE' + cb() + } else + self._readdir(abs, false, cb) + } } -function createTreeStructure(tree) { - let name; - const children = []; +Glob.prototype._readdir = function (abs, inGlobStar, cb) { + if (this.aborted) + return - for (const [dir, project] of tree.entries()) { - // This is a leaf node (aka a project) - if (typeof project === 'string') { - name = chalk__WEBPACK_IMPORTED_MODULE_0___default.a.green(project); - continue; - } // If there's only one project and the key indicates it's a leaf node, we - // know that we're at a package folder that contains a package.json, so we - // "inline it" so we don't get unnecessary levels, i.e. we'll just see - // `foo` instead of `foo -> foo`. + cb = inflight('readdir\0'+abs+'\0'+inGlobStar, cb) + if (!cb) + return + //console.error('RD %j %j', +inGlobStar, abs) + if (inGlobStar && !ownProp(this.symlinks, abs)) + return this._readdirInGlobStar(abs, cb) - if (project.size === 1 && project.has(projectKey)) { - const projectName = project.get(projectKey); - children.push({ - children: [], - name: dirOrProjectName(dir, projectName) - }); - continue; - } + if (ownProp(this.cache, abs)) { + var c = this.cache[abs] + if (!c || c === 'FILE') + return cb() - const subtree = createTreeStructure(project); // If the name is specified, we know there's a package at the "root" of the - // subtree itself. + if (Array.isArray(c)) + return cb(null, c) + } - if (subtree.name !== undefined) { - const projectName = subtree.name; - children.push({ - children: subtree.children, - name: dirOrProjectName(dir, projectName) - }); - continue; - } // Special-case whenever we have one child, so we don't get unnecessary - // folders in the output. E.g. instead of `foo -> bar -> baz` we get - // `foo/bar/baz` instead. + var self = this + fs.readdir(abs, readdirCb(this, abs, cb)) +} +function readdirCb (self, abs, cb) { + return function (er, entries) { + if (er) + self._readdirError(abs, er, cb) + else + self._readdirEntries(abs, entries, cb) + } +} - if (subtree.children && subtree.children.length === 1) { - const child = subtree.children[0]; - const newName = chalk__WEBPACK_IMPORTED_MODULE_0___default.a.dim(path__WEBPACK_IMPORTED_MODULE_1___default.a.join(dir.toString(), child.name)); - children.push({ - children: child.children, - name: newName - }); - continue; - } +Glob.prototype._readdirEntries = function (abs, entries, cb) { + if (this.aborted) + return - children.push({ - children: subtree.children, - name: chalk__WEBPACK_IMPORTED_MODULE_0___default.a.dim(dir.toString()) - }); + // if we haven't asked to stat everything, then just + // assume that everything in there exists, so we can avoid + // having to stat it a second time. + if (!this.mark && !this.stat) { + for (var i = 0; i < entries.length; i ++) { + var e = entries[i] + if (abs === '/') + e = abs + e + else + e = abs + '/' + e + this.cache[e] = true + } } - return { - name, - children - }; + this.cache[abs] = entries + return cb(null, entries) } -function dirOrProjectName(dir, projectName) { - return dir === projectName ? chalk__WEBPACK_IMPORTED_MODULE_0___default.a.green(dir) : chalk__WEBPACK_IMPORTED_MODULE_0___default.a`{dim ${dir.toString()} ({reset.green ${projectName}})}`; -} +Glob.prototype._readdirError = function (f, er, cb) { + if (this.aborted) + return -function buildProjectsTree(rootPath, projects) { - const tree = new Map(); + // handle errors, and cache the information + switch (er.code) { + case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205 + case 'ENOTDIR': // totally normal. means it *does* exist. + var abs = this._makeAbs(f) + this.cache[abs] = 'FILE' + if (abs === this.cwdAbs) { + var error = new Error(er.code + ' invalid cwd ' + this.cwd) + error.path = this.cwd + error.code = er.code + this.emit('error', error) + this.abort() + } + break - for (const project of projects.values()) { - if (rootPath === project.path) { - tree.set(projectKey, project.name); - } else { - const relativeProjectPath = path__WEBPACK_IMPORTED_MODULE_1___default.a.relative(rootPath, project.path); - addProjectToTree(tree, relativeProjectPath.split(path__WEBPACK_IMPORTED_MODULE_1___default.a.sep), project); - } + case 'ENOENT': // not terribly unusual + case 'ELOOP': + case 'ENAMETOOLONG': + case 'UNKNOWN': + this.cache[this._makeAbs(f)] = false + break + + default: // some unusual error. Treat as failure. + this.cache[this._makeAbs(f)] = false + if (this.strict) { + this.emit('error', er) + // If the error is handled, then we abort + // if not, we threw out of here + this.abort() + } + if (!this.silent) + console.error('glob error', er) + break } - return tree; + return cb() } -function addProjectToTree(tree, pathParts, project) { - if (pathParts.length === 0) { - tree.set(projectKey, project.name); - } else { - const [currentDir, ...rest] = pathParts; - - if (!tree.has(currentDir)) { - tree.set(currentDir, new Map()); - } - - const subtree = tree.get(currentDir); - addProjectToTree(subtree, rest, project); - } +Glob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) { + var self = this + this._readdir(abs, inGlobStar, function (er, entries) { + self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb) + }) } -/***/ }), -/* 698 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Kibana", function() { return Kibana; }); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(16); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var multimatch__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(699); -/* harmony import */ var multimatch__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(multimatch__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _projects__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(501); -/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(580); -function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } +Glob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) { + //console.error('pgs2', prefix, remain[0], entries) -function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + // no entries means not a dir, so it can never have matches + // foo.txt/** doesn't match foo.txt + if (!entries) + return cb() -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + // test without the globstar, and with every child both below + // and replacing the globstar. + var remainWithoutGlobStar = remain.slice(1) + var gspref = prefix ? [ prefix ] : [] + var noGlobStar = gspref.concat(remainWithoutGlobStar) -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ + // the noGlobStar pattern exits the inGlobStar state + this._process(noGlobStar, index, false, cb) + var isSym = this.symlinks[abs] + var len = entries.length + // If it's a symlink, and we're in a globstar, then stop + if (isSym && inGlobStar) + return cb() + for (var i = 0; i < len; i++) { + var e = entries[i] + if (e.charAt(0) === '.' && !this.dot) + continue -/** - * Helper class for dealing with a set of projects as children of - * the Kibana project. The kbn/pm is currently implemented to be - * more generic, where everything is an operation of generic projects, - * but that leads to exceptions where we need the kibana project and - * do things like `project.get('kibana')!`. - * - * Using this helper we can restructre the generic list of projects - * as a Kibana object which encapulates all the projects in the - * workspace and knows about the root Kibana project. - */ + // these two cases enter the inGlobStar state + var instead = gspref.concat(entries[i], remainWithoutGlobStar) + this._process(instead, index, true, cb) -class Kibana { - static async loadFrom(rootPath) { - return new Kibana((await Object(_projects__WEBPACK_IMPORTED_MODULE_2__["getProjects"])(rootPath, Object(_config__WEBPACK_IMPORTED_MODULE_3__["getProjectPaths"])({ - rootPath - })))); + var below = gspref.concat(entries[i], remain) + this._process(below, index, true, cb) } - constructor(allWorkspaceProjects) { - this.allWorkspaceProjects = allWorkspaceProjects; - - _defineProperty(this, "kibanaProject", void 0); + cb() +} - const kibanaProject = allWorkspaceProjects.get('kibana'); +Glob.prototype._processSimple = function (prefix, index, cb) { + // XXX review this. Shouldn't it be doing the mounting etc + // before doing stat? kinda weird? + var self = this + this._stat(prefix, function (er, exists) { + self._processSimple2(prefix, index, er, exists, cb) + }) +} +Glob.prototype._processSimple2 = function (prefix, index, er, exists, cb) { - if (!kibanaProject) { - throw new TypeError('Unable to create Kibana object without all projects, including the Kibana project.'); - } + //console.error('ps2', prefix, exists) - this.kibanaProject = kibanaProject; - } - /** make an absolute path by resolving subPath relative to the kibana repo */ + if (!this.matches[index]) + this.matches[index] = Object.create(null) + // If it doesn't exist, then just mark the lack of results + if (!exists) + return cb() - getAbsolute(...subPath) { - return path__WEBPACK_IMPORTED_MODULE_0___default.a.resolve(this.kibanaProject.path, ...subPath); + if (prefix && isAbsolute(prefix) && !this.nomount) { + var trail = /[\/\\]$/.test(prefix) + if (prefix.charAt(0) === '/') { + prefix = path.join(this.root, prefix) + } else { + prefix = path.resolve(this.root, prefix) + if (trail) + prefix += '/' + } } - /** convert an absolute path to a relative path, relative to the kibana repo */ + if (process.platform === 'win32') + prefix = prefix.replace(/\\/g, '/') - getRelative(absolute) { - return path__WEBPACK_IMPORTED_MODULE_0___default.a.relative(this.kibanaProject.path, absolute); - } - /** get a copy of the map of all projects in the kibana workspace */ - + // Mark this as a match + this._emitMatch(index, prefix) + cb() +} - getAllProjects() { - return new Map(this.allWorkspaceProjects); - } - /** determine if a project with the given name exists */ +// Returns either 'DIR', 'FILE', or false +Glob.prototype._stat = function (f, cb) { + var abs = this._makeAbs(f) + var needDir = f.slice(-1) === '/' + if (f.length > this.maxLength) + return cb() - hasProject(name) { - return this.allWorkspaceProjects.has(name); - } - /** get a specific project, throws if the name is not known (use hasProject() first) */ + if (!this.stat && ownProp(this.cache, abs)) { + var c = this.cache[abs] + if (Array.isArray(c)) + c = 'DIR' - getProject(name) { - const project = this.allWorkspaceProjects.get(name); + // It exists, but maybe not how we need it + if (!needDir || c === 'DIR') + return cb(null, c) - if (!project) { - throw new Error(`No package with name "${name}" in the workspace`); - } + if (needDir && c === 'FILE') + return cb() - return project; + // otherwise we have to stat, because maybe c=true + // if we know it exists, but not what it is. } - /** get a project and all of the projects it depends on in a ProjectMap */ - - getProjectAndDeps(name) { - const project = this.getProject(name); - return Object(_projects__WEBPACK_IMPORTED_MODULE_2__["includeTransitiveProjects"])([project], this.allWorkspaceProjects); + var exists + var stat = this.statCache[abs] + if (stat !== undefined) { + if (stat === false) + return cb(null, stat) + else { + var type = stat.isDirectory() ? 'DIR' : 'FILE' + if (needDir && type === 'FILE') + return cb() + else + return cb(null, type, stat) + } } - /** filter the projects to just those matching certain paths/include/exclude tags */ - - - getFilteredProjects(options) { - const allProjects = this.getAllProjects(); - const filteredProjects = new Map(); - const pkgJsonPaths = Array.from(allProjects.values()).map(p => p.packageJsonLocation); - const filteredPkgJsonGlobs = Object(_config__WEBPACK_IMPORTED_MODULE_3__["getProjectPaths"])(_objectSpread({}, options, { - rootPath: this.kibanaProject.path - })).map(g => path__WEBPACK_IMPORTED_MODULE_0___default.a.resolve(g, 'package.json')); - const matchingPkgJsonPaths = multimatch__WEBPACK_IMPORTED_MODULE_1___default()(pkgJsonPaths, filteredPkgJsonGlobs); - for (const project of allProjects.values()) { - const pathMatches = matchingPkgJsonPaths.includes(project.packageJsonLocation); - const notExcluded = !options.exclude.includes(project.name); - const isIncluded = !options.include.length || options.include.includes(project.name); + var self = this + var statcb = inflight('stat\0' + abs, lstatcb_) + if (statcb) + fs.lstat(abs, statcb) - if (pathMatches && notExcluded && isIncluded) { - filteredProjects.set(project.name, project); - } + function lstatcb_ (er, lstat) { + if (lstat && lstat.isSymbolicLink()) { + // If it's a symlink, then treat it as the target, unless + // the target does not exist, then treat it as a file. + return fs.stat(abs, function (er, stat) { + if (er) + self._stat2(f, abs, null, lstat, cb) + else + self._stat2(f, abs, er, stat, cb) + }) + } else { + self._stat2(f, abs, er, lstat, cb) } - - return filteredProjects; } - } -/***/ }), -/* 699 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -const minimatch = __webpack_require__(505); -const arrayUnion = __webpack_require__(700); -const arrayDiffer = __webpack_require__(701); -const arrify = __webpack_require__(702); +Glob.prototype._stat2 = function (f, abs, er, stat, cb) { + if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) { + this.statCache[abs] = false + return cb() + } -module.exports = (list, patterns, options = {}) => { - list = arrify(list); - patterns = arrify(patterns); + var needDir = f.slice(-1) === '/' + this.statCache[abs] = stat - if (list.length === 0 || patterns.length === 0) { - return []; - } + if (abs.slice(-1) === '/' && stat && !stat.isDirectory()) + return cb(null, false, stat) - return patterns.reduce((result, pattern) => { - let process = arrayUnion; + var c = true + if (stat) + c = stat.isDirectory() ? 'DIR' : 'FILE' + this.cache[abs] = this.cache[abs] || c - if (pattern[0] === '!') { - pattern = pattern.slice(1); - process = arrayDiffer; - } + if (needDir && c === 'FILE') + return cb() - return process(result, minimatch.match(list, pattern, options)); - }, []); -}; + return cb(null, c, stat) +} /***/ }), -/* 700 */ +/* 713 */ /***/ (function(module, exports, __webpack_require__) { -"use strict"; +try { + var util = __webpack_require__(29); + /* istanbul ignore next */ + if (typeof util.inherits !== 'function') throw ''; + module.exports = util.inherits; +} catch (e) { + /* istanbul ignore next */ + module.exports = __webpack_require__(714); +} -module.exports = (...arguments_) => { - return [...new Set([].concat(...arguments_))]; -}; +/***/ }), +/* 714 */ +/***/ (function(module, exports) { + +if (typeof Object.create === 'function') { + // implementation from standard node.js 'util' module + module.exports = function inherits(ctor, superCtor) { + if (superCtor) { + ctor.super_ = superCtor + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }) + } + }; +} else { + // old school shim for old browsers + module.exports = function inherits(ctor, superCtor) { + if (superCtor) { + ctor.super_ = superCtor + var TempCtor = function () {} + TempCtor.prototype = superCtor.prototype + ctor.prototype = new TempCtor() + ctor.prototype.constructor = ctor + } + } +} /***/ }), -/* 701 */ +/* 715 */ /***/ (function(module, exports, __webpack_require__) { -"use strict"; +module.exports = globSync +globSync.GlobSync = GlobSync +var fs = __webpack_require__(23) +var rp = __webpack_require__(503) +var minimatch = __webpack_require__(505) +var Minimatch = minimatch.Minimatch +var Glob = __webpack_require__(712).Glob +var util = __webpack_require__(29) +var path = __webpack_require__(16) +var assert = __webpack_require__(30) +var isAbsolute = __webpack_require__(511) +var common = __webpack_require__(716) +var alphasort = common.alphasort +var alphasorti = common.alphasorti +var setopts = common.setopts +var ownProp = common.ownProp +var childrenIgnored = common.childrenIgnored +var isIgnored = common.isIgnored -const arrayDiffer = (array, ...values) => { - const rest = new Set([].concat(...values)); - return array.filter(element => !rest.has(element)); -}; +function globSync (pattern, options) { + if (typeof options === 'function' || arguments.length === 3) + throw new TypeError('callback provided to sync glob\n'+ + 'See: https://github.com/isaacs/node-glob/issues/167') -module.exports = arrayDiffer; + return new GlobSync(pattern, options).found +} +function GlobSync (pattern, options) { + if (!pattern) + throw new Error('must provide pattern') -/***/ }), -/* 702 */ -/***/ (function(module, exports, __webpack_require__) { + if (typeof options === 'function' || arguments.length === 3) + throw new TypeError('callback provided to sync glob\n'+ + 'See: https://github.com/isaacs/node-glob/issues/167') -"use strict"; + if (!(this instanceof GlobSync)) + return new GlobSync(pattern, options) + setopts(this, pattern, options) -const arrify = value => { - if (value === null || value === undefined) { - return []; - } + if (this.noprocess) + return this - if (Array.isArray(value)) { - return value; - } + var n = this.minimatch.set.length + this.matches = new Array(n) + for (var i = 0; i < n; i ++) { + this._process(this.minimatch.set[i], i, false) + } + this._finish() +} - if (typeof value === 'string') { - return [value]; - } +GlobSync.prototype._finish = function () { + assert(this instanceof GlobSync) + if (this.realpath) { + var self = this + this.matches.forEach(function (matchset, index) { + var set = self.matches[index] = Object.create(null) + for (var p in matchset) { + try { + p = self._makeAbs(p) + var real = rp.realpathSync(p, self.realpathCache) + set[real] = true + } catch (er) { + if (er.syscall === 'stat') + set[self._makeAbs(p)] = true + else + throw er + } + } + }) + } + common.finish(this) +} - if (typeof value[Symbol.iterator] === 'function') { - return [...value]; - } - return [value]; -}; +GlobSync.prototype._process = function (pattern, index, inGlobStar) { + assert(this instanceof GlobSync) -module.exports = arrify; + // Get the first [n] parts of pattern that are all strings. + var n = 0 + while (typeof pattern[n] === 'string') { + n ++ + } + // now n is the index of the first one that is *not* a string. + // See if there's anything else + var prefix + switch (n) { + // if not, then this is rather simple + case pattern.length: + this._processSimple(pattern.join('/'), index) + return -/***/ }), -/* 703 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + case 0: + // pattern *starts* with some non-trivial item. + // going to readdir(cwd), but not include the prefix in matches. + prefix = null + break -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _build_production_projects__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(704); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "buildProductionProjects", function() { return _build_production_projects__WEBPACK_IMPORTED_MODULE_0__["buildProductionProjects"]; }); + default: + // pattern has some string bits in the front. + // whatever it starts with, whether that's 'absolute' like /foo/bar, + // or 'relative' like '../baz' + prefix = pattern.slice(0, n).join('/') + break + } -/* harmony import */ var _prepare_project_dependencies__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(914); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "prepareExternalProjectDependencies", function() { return _prepare_project_dependencies__WEBPACK_IMPORTED_MODULE_1__["prepareExternalProjectDependencies"]; }); + var remain = pattern.slice(n) -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ + // get the list of entries. + var read + if (prefix === null) + read = '.' + else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) { + if (!prefix || !isAbsolute(prefix)) + prefix = '/' + prefix + read = prefix + } else + read = prefix + var abs = this._makeAbs(read) + //if ignored, skip processing + if (childrenIgnored(this, read)) + return -/***/ }), -/* 704 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + var isGlobStar = remain[0] === minimatch.GLOBSTAR + if (isGlobStar) + this._processGlobStar(prefix, read, abs, remain, index, inGlobStar) + else + this._processReaddir(prefix, read, abs, remain, index, inGlobStar) +} -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "buildProductionProjects", function() { return buildProductionProjects; }); -/* harmony import */ var cpy__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(705); -/* harmony import */ var cpy__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(cpy__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var del__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(588); -/* harmony import */ var del__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(del__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(16); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(580); -/* harmony import */ var _utils_fs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(20); -/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(34); -/* harmony import */ var _utils_package_json__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(517); -/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(501); -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ +GlobSync.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar) { + var entries = this._readdir(abs, inGlobStar) + // if the abs isn't a dir, then nothing can match! + if (!entries) + return + // It will only match dot entries if it starts with a dot, or if + // dot is set. Stuff like @(.foo|.bar) isn't allowed. + var pn = remain[0] + var negate = !!this.minimatch.negate + var rawGlob = pn._glob + var dotOk = this.dot || rawGlob.charAt(0) === '.' + var matchedEntries = [] + for (var i = 0; i < entries.length; i++) { + var e = entries[i] + if (e.charAt(0) !== '.' || dotOk) { + var m + if (negate && !prefix) { + m = !e.match(pn) + } else { + m = e.match(pn) + } + if (m) + matchedEntries.push(e) + } + } + var len = matchedEntries.length + // If there are no matched entries, then nothing matches. + if (len === 0) + return + // if this is the last remaining pattern bit, then no need for + // an additional stat *unless* the user has specified mark or + // stat explicitly. We know they exist, since readdir returned + // them. + if (remain.length === 1 && !this.mark && !this.stat) { + if (!this.matches[index]) + this.matches[index] = Object.create(null) -async function buildProductionProjects({ - kibanaRoot, - buildRoot, - onlyOSS -}) { - const projects = await getProductionProjects(kibanaRoot, onlyOSS); - const projectGraph = Object(_utils_projects__WEBPACK_IMPORTED_MODULE_7__["buildProjectGraph"])(projects); - const batchedProjects = Object(_utils_projects__WEBPACK_IMPORTED_MODULE_7__["topologicallyBatchProjects"])(projects, projectGraph); - const projectNames = [...projects.values()].map(project => project.name); - _utils_log__WEBPACK_IMPORTED_MODULE_5__["log"].write(`Preparing production build for [${projectNames.join(', ')}]`); + for (var i = 0; i < len; i ++) { + var e = matchedEntries[i] + if (prefix) { + if (prefix.slice(-1) !== '/') + e = prefix + '/' + e + else + e = prefix + e + } - for (const batch of batchedProjects) { - for (const project of batch) { - await deleteTarget(project); - await buildProject(project); - await copyToBuild(project, kibanaRoot, buildRoot); + if (e.charAt(0) === '/' && !this.nomount) { + e = path.join(this.root, e) + } + this._emitMatch(index, e) } + // This was the last one, and no stats were needed + return + } + + // now test all matched entries as stand-ins for that part + // of the pattern. + remain.shift() + for (var i = 0; i < len; i ++) { + var e = matchedEntries[i] + var newPattern + if (prefix) + newPattern = [prefix, e] + else + newPattern = [e] + this._process(newPattern.concat(remain), index, inGlobStar) } } -/** - * Returns the subset of projects that should be built into the production - * bundle. As we copy these into Kibana's `node_modules` during the build step, - * and let Kibana's build process be responsible for installing dependencies, - * we only include Kibana's transitive _production_ dependencies. If onlyOSS - * is supplied, we omit projects with build.oss in their package.json set to false. - */ -async function getProductionProjects(rootPath, onlyOSS) { - const projectPaths = Object(_config__WEBPACK_IMPORTED_MODULE_3__["getProjectPaths"])({ - rootPath - }); - const projects = await Object(_utils_projects__WEBPACK_IMPORTED_MODULE_7__["getProjects"])(rootPath, projectPaths); - const projectsSubset = [projects.get('kibana')]; - if (projects.has('x-pack')) { - projectsSubset.push(projects.get('x-pack')); - } +GlobSync.prototype._emitMatch = function (index, e) { + if (isIgnored(this, e)) + return - const productionProjects = Object(_utils_projects__WEBPACK_IMPORTED_MODULE_7__["includeTransitiveProjects"])(projectsSubset, projects, { - onlyProductionDependencies: true - }); // We remove Kibana, as we're already building Kibana + var abs = this._makeAbs(e) - productionProjects.delete('kibana'); + if (this.mark) + e = this._mark(e) - if (onlyOSS) { - productionProjects.forEach(project => { - if (project.getBuildConfig().oss === false) { - productionProjects.delete(project.json.name); - } - }); + if (this.absolute) { + e = abs } - return productionProjects; -} - -async function deleteTarget(project) { - const targetDir = project.targetLocation; + if (this.matches[index][e]) + return - if (await Object(_utils_fs__WEBPACK_IMPORTED_MODULE_4__["isDirectory"])(targetDir)) { - await del__WEBPACK_IMPORTED_MODULE_1___default()(targetDir, { - force: true - }); + if (this.nodir) { + var c = this.cache[abs] + if (c === 'DIR' || Array.isArray(c)) + return } -} -async function buildProject(project) { - if (project.hasScript('build')) { - await project.runScript('build'); - } + this.matches[index][e] = true + + if (this.stat) + this._stat(e) } -/** - * Copy all the project's files from its "intermediate build directory" and - * into the build. The intermediate directory can either be the root of the - * project or some other location defined in the project's `package.json`. - * - * When copying all the files into the build, we exclude `node_modules` because - * we want the Kibana build to be responsible for actually installing all - * dependencies. The primary reason for allowing the Kibana build process to - * manage dependencies is that it will "dedupe" them, so we don't include - * unnecessary copies of dependencies. - */ -async function copyToBuild(project, kibanaRoot, buildRoot) { - // We want the package to have the same relative location within the build - const relativeProjectPath = Object(path__WEBPACK_IMPORTED_MODULE_2__["relative"])(kibanaRoot, project.path); - const buildProjectPath = Object(path__WEBPACK_IMPORTED_MODULE_2__["resolve"])(buildRoot, relativeProjectPath); - await cpy__WEBPACK_IMPORTED_MODULE_0___default()(['**/*', '!node_modules/**'], buildProjectPath, { - cwd: project.getIntermediateBuildDirectory(), - dot: true, - nodir: true, - parents: true - }); // If a project is using an intermediate build directory, we special-case our - // handling of `package.json`, as the project build process might have copied - // (a potentially modified) `package.json` into the intermediate build - // directory already. If so, we want to use that `package.json` as the basis - // for creating the production-ready `package.json`. If it's not present in - // the intermediate build, we fall back to using the project's already defined - // `package.json`. +GlobSync.prototype._readdirInGlobStar = function (abs) { + // follow all symlinked directories forever + // just proceed as if this is a non-globstar situation + if (this.follow) + return this._readdir(abs, false) - const packageJson = (await Object(_utils_fs__WEBPACK_IMPORTED_MODULE_4__["isFile"])(Object(path__WEBPACK_IMPORTED_MODULE_2__["join"])(buildProjectPath, 'package.json'))) ? await Object(_utils_package_json__WEBPACK_IMPORTED_MODULE_6__["readPackageJson"])(buildProjectPath) : project.json; - await Object(_utils_package_json__WEBPACK_IMPORTED_MODULE_6__["writePackageJson"])(buildProjectPath, packageJson); -} + var entries + var lstat + var stat + try { + lstat = fs.lstatSync(abs) + } catch (er) { + if (er.code === 'ENOENT') { + // lstat failed, doesn't exist + return null + } + } -/***/ }), -/* 705 */ -/***/ (function(module, exports, __webpack_require__) { + var isSym = lstat && lstat.isSymbolicLink() + this.symlinks[abs] = isSym -"use strict"; + // If it's not a symlink or a dir, then it's definitely a regular file. + // don't bother doing a readdir in that case. + if (!isSym && lstat && !lstat.isDirectory()) + this.cache[abs] = 'FILE' + else + entries = this._readdir(abs, false) -const EventEmitter = __webpack_require__(379); -const path = __webpack_require__(16); -const arrify = __webpack_require__(706); -const globby = __webpack_require__(707); -const cpFile = __webpack_require__(905); -const CpyError = __webpack_require__(912); + return entries +} -const preprocessSrcPath = (srcPath, options) => options.cwd ? path.resolve(options.cwd, srcPath) : srcPath; +GlobSync.prototype._readdir = function (abs, inGlobStar) { + var entries -const preprocessDestPath = (srcPath, dest, options) => { - let basename = path.basename(srcPath); - const dirname = path.dirname(srcPath); + if (inGlobStar && !ownProp(this.symlinks, abs)) + return this._readdirInGlobStar(abs) - if (typeof options.rename === 'string') { - basename = options.rename; - } else if (typeof options.rename === 'function') { - basename = options.rename(basename); - } + if (ownProp(this.cache, abs)) { + var c = this.cache[abs] + if (!c || c === 'FILE') + return null - if (options.cwd) { - dest = path.resolve(options.cwd, dest); - } + if (Array.isArray(c)) + return c + } - if (options.parents) { - return path.join(dest, dirname, basename); - } + try { + return this._readdirEntries(abs, fs.readdirSync(abs)) + } catch (er) { + this._readdirError(abs, er) + return null + } +} - return path.join(dest, basename); -}; +GlobSync.prototype._readdirEntries = function (abs, entries) { + // if we haven't asked to stat everything, then just + // assume that everything in there exists, so we can avoid + // having to stat it a second time. + if (!this.mark && !this.stat) { + for (var i = 0; i < entries.length; i ++) { + var e = entries[i] + if (abs === '/') + e = abs + e + else + e = abs + '/' + e + this.cache[e] = true + } + } -const cpy = (src, dest, options = {}) => { - src = arrify(src); + this.cache[abs] = entries - const progressEmitter = new EventEmitter(); + // mark and cache dir-ness + return entries +} - if (src.length === 0 || !dest) { - const promise = Promise.reject(new CpyError('`files` and `destination` required')); - promise.on = (...args) => { - progressEmitter.on(...args); - return promise; - }; +GlobSync.prototype._readdirError = function (f, er) { + // handle errors, and cache the information + switch (er.code) { + case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205 + case 'ENOTDIR': // totally normal. means it *does* exist. + var abs = this._makeAbs(f) + this.cache[abs] = 'FILE' + if (abs === this.cwdAbs) { + var error = new Error(er.code + ' invalid cwd ' + this.cwd) + error.path = this.cwd + error.code = er.code + throw error + } + break - return promise; - } + case 'ENOENT': // not terribly unusual + case 'ELOOP': + case 'ENAMETOOLONG': + case 'UNKNOWN': + this.cache[this._makeAbs(f)] = false + break - const copyStatus = new Map(); - let completedFiles = 0; - let completedSize = 0; + default: // some unusual error. Treat as failure. + this.cache[this._makeAbs(f)] = false + if (this.strict) + throw er + if (!this.silent) + console.error('glob error', er) + break + } +} - const promise = globby(src, options) - .catch(error => { - throw new CpyError(`Cannot glob \`${src}\`: ${error.message}`, error); - }) - .then(files => { - if (files.length === 0) { - progressEmitter.emit('progress', { - totalFiles: 0, - percent: 1, - completedFiles: 0, - completedSize: 0 - }); - } +GlobSync.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar) { - return Promise.all(files.map(srcPath => { - const from = preprocessSrcPath(srcPath, options); - const to = preprocessDestPath(srcPath, dest, options); + var entries = this._readdir(abs, inGlobStar) - return cpFile(from, to, options) - .on('progress', event => { - const fileStatus = copyStatus.get(event.src) || {written: 0, percent: 0}; + // no entries means not a dir, so it can never have matches + // foo.txt/** doesn't match foo.txt + if (!entries) + return - if (fileStatus.written !== event.written || fileStatus.percent !== event.percent) { - completedSize -= fileStatus.written; - completedSize += event.written; + // test without the globstar, and with every child both below + // and replacing the globstar. + var remainWithoutGlobStar = remain.slice(1) + var gspref = prefix ? [ prefix ] : [] + var noGlobStar = gspref.concat(remainWithoutGlobStar) - if (event.percent === 1 && fileStatus.percent !== 1) { - completedFiles++; - } + // the noGlobStar pattern exits the inGlobStar state + this._process(noGlobStar, index, false) - copyStatus.set(event.src, {written: event.written, percent: event.percent}); + var len = entries.length + var isSym = this.symlinks[abs] - progressEmitter.emit('progress', { - totalFiles: files.length, - percent: completedFiles / files.length, - completedFiles, - completedSize - }); - } - }) - .then(() => to) - .catch(error => { - throw new CpyError(`Cannot copy from \`${from}\` to \`${to}\`: ${error.message}`, error); - }); - })); - }); + // If it's a symlink, and we're in a globstar, then stop + if (isSym && inGlobStar) + return - promise.on = (...args) => { - progressEmitter.on(...args); - return promise; - }; + for (var i = 0; i < len; i++) { + var e = entries[i] + if (e.charAt(0) === '.' && !this.dot) + continue - return promise; -}; + // these two cases enter the inGlobStar state + var instead = gspref.concat(entries[i], remainWithoutGlobStar) + this._process(instead, index, true) -module.exports = cpy; -// TODO: Remove this for the next major release -module.exports.default = cpy; + var below = gspref.concat(entries[i], remain) + this._process(below, index, true) + } +} +GlobSync.prototype._processSimple = function (prefix, index) { + // XXX review this. Shouldn't it be doing the mounting etc + // before doing stat? kinda weird? + var exists = this._stat(prefix) -/***/ }), -/* 706 */ -/***/ (function(module, exports, __webpack_require__) { + if (!this.matches[index]) + this.matches[index] = Object.create(null) -"use strict"; + // If it doesn't exist, then just mark the lack of results + if (!exists) + return -module.exports = function (val) { - if (val === null || val === undefined) { - return []; - } + if (prefix && isAbsolute(prefix) && !this.nomount) { + var trail = /[\/\\]$/.test(prefix) + if (prefix.charAt(0) === '/') { + prefix = path.join(this.root, prefix) + } else { + prefix = path.resolve(this.root, prefix) + if (trail) + prefix += '/' + } + } - return Array.isArray(val) ? val : [val]; -}; + if (process.platform === 'win32') + prefix = prefix.replace(/\\/g, '/') + // Mark this as a match + this._emitMatch(index, prefix) +} -/***/ }), -/* 707 */ -/***/ (function(module, exports, __webpack_require__) { +// Returns either 'DIR', 'FILE', or false +GlobSync.prototype._stat = function (f) { + var abs = this._makeAbs(f) + var needDir = f.slice(-1) === '/' -"use strict"; + if (f.length > this.maxLength) + return false -const fs = __webpack_require__(23); -const arrayUnion = __webpack_require__(708); -const glob = __webpack_require__(502); -const fastGlob = __webpack_require__(710); -const dirGlob = __webpack_require__(898); -const gitignore = __webpack_require__(901); + if (!this.stat && ownProp(this.cache, abs)) { + var c = this.cache[abs] -const DEFAULT_FILTER = () => false; + if (Array.isArray(c)) + c = 'DIR' -const isNegative = pattern => pattern[0] === '!'; + // It exists, but maybe not how we need it + if (!needDir || c === 'DIR') + return c -const assertPatternsInput = patterns => { - if (!patterns.every(x => typeof x === 'string')) { - throw new TypeError('Patterns must be a string or an array of strings'); - } -}; + if (needDir && c === 'FILE') + return false -const checkCwdOption = options => { - if (options && options.cwd && !fs.statSync(options.cwd).isDirectory()) { - throw new Error('The `cwd` option must be a path to a directory'); - } -}; + // otherwise we have to stat, because maybe c=true + // if we know it exists, but not what it is. + } -const generateGlobTasks = (patterns, taskOptions) => { - patterns = arrayUnion([].concat(patterns)); - assertPatternsInput(patterns); - checkCwdOption(taskOptions); + var exists + var stat = this.statCache[abs] + if (!stat) { + var lstat + try { + lstat = fs.lstatSync(abs) + } catch (er) { + if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) { + this.statCache[abs] = false + return false + } + } - const globTasks = []; + if (lstat && lstat.isSymbolicLink()) { + try { + stat = fs.statSync(abs) + } catch (er) { + stat = lstat + } + } else { + stat = lstat + } + } - taskOptions = Object.assign({ - ignore: [], - expandDirectories: true - }, taskOptions); + this.statCache[abs] = stat - patterns.forEach((pattern, i) => { - if (isNegative(pattern)) { - return; - } + var c = true + if (stat) + c = stat.isDirectory() ? 'DIR' : 'FILE' - const ignore = patterns - .slice(i) - .filter(isNegative) - .map(pattern => pattern.slice(1)); + this.cache[abs] = this.cache[abs] || c - const options = Object.assign({}, taskOptions, { - ignore: taskOptions.ignore.concat(ignore) - }); + if (needDir && c === 'FILE') + return false - globTasks.push({pattern, options}); - }); + return c +} - return globTasks; -}; +GlobSync.prototype._mark = function (p) { + return common.mark(this, p) +} -const globDirs = (task, fn) => { - let options = {}; - if (task.options.cwd) { - options.cwd = task.options.cwd; - } +GlobSync.prototype._makeAbs = function (f) { + return common.makeAbs(this, f) +} - if (Array.isArray(task.options.expandDirectories)) { - options = Object.assign(options, {files: task.options.expandDirectories}); - } else if (typeof task.options.expandDirectories === 'object') { - options = Object.assign(options, task.options.expandDirectories); - } - return fn(task.pattern, options); -}; +/***/ }), +/* 716 */ +/***/ (function(module, exports, __webpack_require__) { -const getPattern = (task, fn) => task.options.expandDirectories ? globDirs(task, fn) : [task.pattern]; +exports.alphasort = alphasort +exports.alphasorti = alphasorti +exports.setopts = setopts +exports.ownProp = ownProp +exports.makeAbs = makeAbs +exports.finish = finish +exports.mark = mark +exports.isIgnored = isIgnored +exports.childrenIgnored = childrenIgnored -const globToTask = task => glob => { - const {options} = task; - if (options.ignore && Array.isArray(options.ignore) && options.expandDirectories) { - options.ignore = dirGlob.sync(options.ignore); - } +function ownProp (obj, field) { + return Object.prototype.hasOwnProperty.call(obj, field) +} - return { - pattern: glob, - options - }; -}; +var path = __webpack_require__(16) +var minimatch = __webpack_require__(505) +var isAbsolute = __webpack_require__(511) +var Minimatch = minimatch.Minimatch -const globby = (patterns, options) => { - let globTasks; +function alphasorti (a, b) { + return a.toLowerCase().localeCompare(b.toLowerCase()) +} - try { - globTasks = generateGlobTasks(patterns, options); - } catch (error) { - return Promise.reject(error); - } +function alphasort (a, b) { + return a.localeCompare(b) +} - const getTasks = Promise.all(globTasks.map(task => Promise.resolve(getPattern(task, dirGlob)) - .then(globs => Promise.all(globs.map(globToTask(task)))) - )) - .then(tasks => arrayUnion(...tasks)); +function setupIgnores (self, options) { + self.ignore = options.ignore || [] - const getFilter = () => { - return Promise.resolve( - options && options.gitignore ? - gitignore({cwd: options.cwd, ignore: options.ignore}) : - DEFAULT_FILTER - ); - }; + if (!Array.isArray(self.ignore)) + self.ignore = [self.ignore] - return getFilter() - .then(filter => { - return getTasks - .then(tasks => Promise.all(tasks.map(task => fastGlob(task.pattern, task.options)))) - .then(paths => arrayUnion(...paths)) - .then(paths => paths.filter(p => !filter(p))); - }); -}; + if (self.ignore.length) { + self.ignore = self.ignore.map(ignoreMap) + } +} -module.exports = globby; -// TODO: Remove this for the next major release -module.exports.default = globby; +// ignore patterns are always in dot:true mode. +function ignoreMap (pattern) { + var gmatcher = null + if (pattern.slice(-3) === '/**') { + var gpattern = pattern.replace(/(\/\*\*)+$/, '') + gmatcher = new Minimatch(gpattern, { dot: true }) + } -module.exports.sync = (patterns, options) => { - const globTasks = generateGlobTasks(patterns, options); + return { + matcher: new Minimatch(pattern, { dot: true }), + gmatcher: gmatcher + } +} - const getFilter = () => { - return options && options.gitignore ? - gitignore.sync({cwd: options.cwd, ignore: options.ignore}) : - DEFAULT_FILTER; - }; +function setopts (self, pattern, options) { + if (!options) + options = {} - const tasks = globTasks.reduce((tasks, task) => { - const newTask = getPattern(task, dirGlob.sync).map(globToTask(task)); - return tasks.concat(newTask); - }, []); + // base-matching: just use globstar for that. + if (options.matchBase && -1 === pattern.indexOf("/")) { + if (options.noglobstar) { + throw new Error("base matching requires globstar") + } + pattern = "**/" + pattern + } - const filter = getFilter(); - return tasks.reduce( - (matches, task) => arrayUnion(matches, fastGlob.sync(task.pattern, task.options)), - [] - ).filter(p => !filter(p)); -}; + self.silent = !!options.silent + self.pattern = pattern + self.strict = options.strict !== false + self.realpath = !!options.realpath + self.realpathCache = options.realpathCache || Object.create(null) + self.follow = !!options.follow + self.dot = !!options.dot + self.mark = !!options.mark + self.nodir = !!options.nodir + if (self.nodir) + self.mark = true + self.sync = !!options.sync + self.nounique = !!options.nounique + self.nonull = !!options.nonull + self.nosort = !!options.nosort + self.nocase = !!options.nocase + self.stat = !!options.stat + self.noprocess = !!options.noprocess + self.absolute = !!options.absolute -module.exports.generateGlobTasks = generateGlobTasks; + self.maxLength = options.maxLength || Infinity + self.cache = options.cache || Object.create(null) + self.statCache = options.statCache || Object.create(null) + self.symlinks = options.symlinks || Object.create(null) -module.exports.hasMagic = (patterns, options) => [] - .concat(patterns) - .some(pattern => glob.hasMagic(pattern, options)); + setupIgnores(self, options) -module.exports.gitignore = gitignore; + self.changedCwd = false + var cwd = process.cwd() + if (!ownProp(options, "cwd")) + self.cwd = cwd + else { + self.cwd = path.resolve(options.cwd) + self.changedCwd = self.cwd !== cwd + } + self.root = options.root || path.resolve(self.cwd, "/") + self.root = path.resolve(self.root) + if (process.platform === "win32") + self.root = self.root.replace(/\\/g, "/") -/***/ }), -/* 708 */ -/***/ (function(module, exports, __webpack_require__) { + // TODO: is an absolute `cwd` supposed to be resolved against `root`? + // e.g. { cwd: '/test', root: __dirname } === path.join(__dirname, '/test') + self.cwdAbs = isAbsolute(self.cwd) ? self.cwd : makeAbs(self, self.cwd) + if (process.platform === "win32") + self.cwdAbs = self.cwdAbs.replace(/\\/g, "/") + self.nomount = !!options.nomount -"use strict"; + // disable comments and negation in Minimatch. + // Note that they are not supported in Glob itself anyway. + options.nonegate = true + options.nocomment = true -var arrayUniq = __webpack_require__(709); + self.minimatch = new Minimatch(pattern, options) + self.options = self.minimatch.options +} -module.exports = function () { - return arrayUniq([].concat.apply([], arguments)); -}; +function finish (self) { + var nou = self.nounique + var all = nou ? [] : Object.create(null) + for (var i = 0, l = self.matches.length; i < l; i ++) { + var matches = self.matches[i] + if (!matches || Object.keys(matches).length === 0) { + if (self.nonull) { + // do like the shell, and spit out the literal glob + var literal = self.minimatch.globSet[i] + if (nou) + all.push(literal) + else + all[literal] = true + } + } else { + // had matches + var m = Object.keys(matches) + if (nou) + all.push.apply(all, m) + else + m.forEach(function (m) { + all[m] = true + }) + } + } -/***/ }), -/* 709 */ -/***/ (function(module, exports, __webpack_require__) { + if (!nou) + all = Object.keys(all) -"use strict"; + if (!self.nosort) + all = all.sort(self.nocase ? alphasorti : alphasort) + // at *some* point we statted all of these + if (self.mark) { + for (var i = 0; i < all.length; i++) { + all[i] = self._mark(all[i]) + } + if (self.nodir) { + all = all.filter(function (e) { + var notDir = !(/\/$/.test(e)) + var c = self.cache[e] || self.cache[makeAbs(self, e)] + if (notDir && c) + notDir = c !== 'DIR' && !Array.isArray(c) + return notDir + }) + } + } -// there's 3 implementations written in increasing order of efficiency + if (self.ignore.length) + all = all.filter(function(m) { + return !isIgnored(self, m) + }) -// 1 - no Set type is defined -function uniqNoSet(arr) { - var ret = []; + self.found = all +} - for (var i = 0; i < arr.length; i++) { - if (ret.indexOf(arr[i]) === -1) { - ret.push(arr[i]); - } - } +function mark (self, p) { + var abs = makeAbs(self, p) + var c = self.cache[abs] + var m = p + if (c) { + var isDir = c === 'DIR' || Array.isArray(c) + var slash = p.slice(-1) === '/' - return ret; -} + if (isDir && !slash) + m += '/' + else if (!isDir && slash) + m = m.slice(0, -1) -// 2 - a simple Set type is defined -function uniqSet(arr) { - var seen = new Set(); - return arr.filter(function (el) { - if (!seen.has(el)) { - seen.add(el); - return true; - } + if (m !== p) { + var mabs = makeAbs(self, m) + self.statCache[mabs] = self.statCache[abs] + self.cache[mabs] = self.cache[abs] + } + } - return false; - }); + return m } -// 3 - a standard Set type is defined and it has a forEach method -function uniqSetWithForEach(arr) { - var ret = []; +// lotta situps... +function makeAbs (self, f) { + var abs = f + if (f.charAt(0) === '/') { + abs = path.join(self.root, f) + } else if (isAbsolute(f) || f === '') { + abs = f + } else if (self.changedCwd) { + abs = path.resolve(self.cwd, f) + } else { + abs = path.resolve(f) + } - (new Set(arr)).forEach(function (el) { - ret.push(el); - }); + if (process.platform === 'win32') + abs = abs.replace(/\\/g, '/') - return ret; + return abs } -// V8 currently has a broken implementation -// https://github.com/joyent/node/issues/8449 -function doesForEachActuallyWork() { - var ret = false; - (new Set([true])).forEach(function (el) { - ret = el; - }); +// Return true, if pattern ends with globstar '**', for the accompanying parent directory. +// Ex:- If node_modules/** is the pattern, add 'node_modules' to ignore list along with it's contents +function isIgnored (self, path) { + if (!self.ignore.length) + return false - return ret === true; + return self.ignore.some(function(item) { + return item.matcher.match(path) || !!(item.gmatcher && item.gmatcher.match(path)) + }) } -if ('Set' in global) { - if (typeof Set.prototype.forEach === 'function' && doesForEachActuallyWork()) { - module.exports = uniqSetWithForEach; - } else { - module.exports = uniqSet; - } -} else { - module.exports = uniqNoSet; +function childrenIgnored (self, path) { + if (!self.ignore.length) + return false + + return self.ignore.some(function(item) { + return !!(item.gmatcher && item.gmatcher.match(path)) + }) } /***/ }), -/* 710 */ +/* 717 */ /***/ (function(module, exports, __webpack_require__) { -const pkg = __webpack_require__(711); +const pkg = __webpack_require__(718); module.exports = pkg.async; module.exports.default = pkg.async; @@ -80438,19 +82802,19 @@ module.exports.generateTasks = pkg.generateTasks; /***/ }), -/* 711 */ +/* 718 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var optionsManager = __webpack_require__(712); -var taskManager = __webpack_require__(713); -var reader_async_1 = __webpack_require__(869); -var reader_stream_1 = __webpack_require__(893); -var reader_sync_1 = __webpack_require__(894); -var arrayUtils = __webpack_require__(896); -var streamUtils = __webpack_require__(897); +var optionsManager = __webpack_require__(719); +var taskManager = __webpack_require__(720); +var reader_async_1 = __webpack_require__(876); +var reader_stream_1 = __webpack_require__(900); +var reader_sync_1 = __webpack_require__(901); +var arrayUtils = __webpack_require__(903); +var streamUtils = __webpack_require__(904); /** * Synchronous API. */ @@ -80516,7 +82880,7 @@ function isString(source) { /***/ }), -/* 712 */ +/* 719 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -80554,13 +82918,13 @@ exports.prepare = prepare; /***/ }), -/* 713 */ +/* 720 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var patternUtils = __webpack_require__(714); +var patternUtils = __webpack_require__(721); /** * Generate tasks based on parent directory of each pattern. */ @@ -80651,16 +83015,16 @@ exports.convertPatternGroupToTask = convertPatternGroupToTask; /***/ }), -/* 714 */ +/* 721 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var path = __webpack_require__(16); -var globParent = __webpack_require__(715); -var isGlob = __webpack_require__(718); -var micromatch = __webpack_require__(719); +var globParent = __webpack_require__(722); +var isGlob = __webpack_require__(725); +var micromatch = __webpack_require__(726); var GLOBSTAR = '**'; /** * Return true for static pattern. @@ -80806,15 +83170,15 @@ exports.matchAny = matchAny; /***/ }), -/* 715 */ +/* 722 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var path = __webpack_require__(16); -var isglob = __webpack_require__(716); -var pathDirname = __webpack_require__(717); +var isglob = __webpack_require__(723); +var pathDirname = __webpack_require__(724); var isWin32 = __webpack_require__(11).platform() === 'win32'; module.exports = function globParent(str) { @@ -80837,7 +83201,7 @@ module.exports = function globParent(str) { /***/ }), -/* 716 */ +/* 723 */ /***/ (function(module, exports, __webpack_require__) { /*! @@ -80847,7 +83211,7 @@ module.exports = function globParent(str) { * Licensed under the MIT License. */ -var isExtglob = __webpack_require__(602); +var isExtglob = __webpack_require__(607); module.exports = function isGlob(str) { if (typeof str !== 'string' || str === '') { @@ -80868,7 +83232,7 @@ module.exports = function isGlob(str) { /***/ }), -/* 717 */ +/* 724 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -81018,7 +83382,7 @@ module.exports.win32 = win32; /***/ }), -/* 718 */ +/* 725 */ /***/ (function(module, exports, __webpack_require__) { /*! @@ -81028,7 +83392,7 @@ module.exports.win32 = win32; * Released under the MIT License. */ -var isExtglob = __webpack_require__(602); +var isExtglob = __webpack_require__(607); var chars = { '{': '}', '(': ')', '[': ']'}; module.exports = function isGlob(str, options) { @@ -81070,7 +83434,7 @@ module.exports = function isGlob(str, options) { /***/ }), -/* 719 */ +/* 726 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -81081,18 +83445,18 @@ module.exports = function isGlob(str, options) { */ var util = __webpack_require__(29); -var braces = __webpack_require__(720); -var toRegex = __webpack_require__(822); -var extend = __webpack_require__(830); +var braces = __webpack_require__(727); +var toRegex = __webpack_require__(829); +var extend = __webpack_require__(837); /** * Local dependencies */ -var compilers = __webpack_require__(833); -var parsers = __webpack_require__(865); -var cache = __webpack_require__(866); -var utils = __webpack_require__(867); +var compilers = __webpack_require__(840); +var parsers = __webpack_require__(872); +var cache = __webpack_require__(873); +var utils = __webpack_require__(874); var MAX_LENGTH = 1024 * 64; /** @@ -81954,7 +84318,7 @@ module.exports = micromatch; /***/ }), -/* 720 */ +/* 727 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -81964,18 +84328,18 @@ module.exports = micromatch; * Module dependencies */ -var toRegex = __webpack_require__(721); -var unique = __webpack_require__(733); -var extend = __webpack_require__(730); +var toRegex = __webpack_require__(728); +var unique = __webpack_require__(740); +var extend = __webpack_require__(737); /** * Local dependencies */ -var compilers = __webpack_require__(734); -var parsers = __webpack_require__(749); -var Braces = __webpack_require__(759); -var utils = __webpack_require__(735); +var compilers = __webpack_require__(741); +var parsers = __webpack_require__(756); +var Braces = __webpack_require__(766); +var utils = __webpack_require__(742); var MAX_LENGTH = 1024 * 64; var cache = {}; @@ -82279,15 +84643,15 @@ module.exports = braces; /***/ }), -/* 721 */ +/* 728 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var define = __webpack_require__(722); -var extend = __webpack_require__(730); -var not = __webpack_require__(732); +var define = __webpack_require__(729); +var extend = __webpack_require__(737); +var not = __webpack_require__(739); var MAX_LENGTH = 1024 * 64; /** @@ -82434,7 +84798,7 @@ module.exports.makeRe = makeRe; /***/ }), -/* 722 */ +/* 729 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -82447,7 +84811,7 @@ module.exports.makeRe = makeRe; -var isDescriptor = __webpack_require__(723); +var isDescriptor = __webpack_require__(730); module.exports = function defineProperty(obj, prop, val) { if (typeof obj !== 'object' && typeof obj !== 'function') { @@ -82472,7 +84836,7 @@ module.exports = function defineProperty(obj, prop, val) { /***/ }), -/* 723 */ +/* 730 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -82485,9 +84849,9 @@ module.exports = function defineProperty(obj, prop, val) { -var typeOf = __webpack_require__(724); -var isAccessor = __webpack_require__(725); -var isData = __webpack_require__(728); +var typeOf = __webpack_require__(731); +var isAccessor = __webpack_require__(732); +var isData = __webpack_require__(735); module.exports = function isDescriptor(obj, key) { if (typeOf(obj) !== 'object') { @@ -82501,7 +84865,7 @@ module.exports = function isDescriptor(obj, key) { /***/ }), -/* 724 */ +/* 731 */ /***/ (function(module, exports) { var toString = Object.prototype.toString; @@ -82654,7 +85018,7 @@ function isBuffer(val) { /***/ }), -/* 725 */ +/* 732 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -82667,7 +85031,7 @@ function isBuffer(val) { -var typeOf = __webpack_require__(726); +var typeOf = __webpack_require__(733); // accessor descriptor properties var accessor = { @@ -82730,10 +85094,10 @@ module.exports = isAccessorDescriptor; /***/ }), -/* 726 */ +/* 733 */ /***/ (function(module, exports, __webpack_require__) { -var isBuffer = __webpack_require__(727); +var isBuffer = __webpack_require__(734); var toString = Object.prototype.toString; /** @@ -82852,7 +85216,7 @@ module.exports = function kindOf(val) { /***/ }), -/* 727 */ +/* 734 */ /***/ (function(module, exports) { /*! @@ -82879,7 +85243,7 @@ function isSlowBuffer (obj) { /***/ }), -/* 728 */ +/* 735 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -82892,7 +85256,7 @@ function isSlowBuffer (obj) { -var typeOf = __webpack_require__(729); +var typeOf = __webpack_require__(736); // data descriptor properties var data = { @@ -82941,10 +85305,10 @@ module.exports = isDataDescriptor; /***/ }), -/* 729 */ +/* 736 */ /***/ (function(module, exports, __webpack_require__) { -var isBuffer = __webpack_require__(727); +var isBuffer = __webpack_require__(734); var toString = Object.prototype.toString; /** @@ -83063,13 +85427,13 @@ module.exports = function kindOf(val) { /***/ }), -/* 730 */ +/* 737 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isObject = __webpack_require__(731); +var isObject = __webpack_require__(738); module.exports = function extend(o/*, objects*/) { if (!isObject(o)) { o = {}; } @@ -83103,7 +85467,7 @@ function hasOwn(obj, key) { /***/ }), -/* 731 */ +/* 738 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -83123,13 +85487,13 @@ module.exports = function isExtendable(val) { /***/ }), -/* 732 */ +/* 739 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var extend = __webpack_require__(730); +var extend = __webpack_require__(737); /** * The main export is a function that takes a `pattern` string and an `options` object. @@ -83196,7 +85560,7 @@ module.exports = toRegex; /***/ }), -/* 733 */ +/* 740 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -83246,13 +85610,13 @@ module.exports.immutable = function uniqueImmutable(arr) { /***/ }), -/* 734 */ +/* 741 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var utils = __webpack_require__(735); +var utils = __webpack_require__(742); module.exports = function(braces, options) { braces.compiler @@ -83535,25 +85899,25 @@ function hasQueue(node) { /***/ }), -/* 735 */ +/* 742 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var splitString = __webpack_require__(736); +var splitString = __webpack_require__(743); var utils = module.exports; /** * Module dependencies */ -utils.extend = __webpack_require__(730); -utils.flatten = __webpack_require__(742); -utils.isObject = __webpack_require__(740); -utils.fillRange = __webpack_require__(743); -utils.repeat = __webpack_require__(748); -utils.unique = __webpack_require__(733); +utils.extend = __webpack_require__(737); +utils.flatten = __webpack_require__(749); +utils.isObject = __webpack_require__(747); +utils.fillRange = __webpack_require__(750); +utils.repeat = __webpack_require__(755); +utils.unique = __webpack_require__(740); utils.define = function(obj, key, val) { Object.defineProperty(obj, key, { @@ -83885,7 +86249,7 @@ utils.escapeRegex = function(str) { /***/ }), -/* 736 */ +/* 743 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -83898,7 +86262,7 @@ utils.escapeRegex = function(str) { -var extend = __webpack_require__(737); +var extend = __webpack_require__(744); module.exports = function(str, options, fn) { if (typeof str !== 'string') { @@ -84063,14 +86427,14 @@ function keepEscaping(opts, str, idx) { /***/ }), -/* 737 */ +/* 744 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isExtendable = __webpack_require__(738); -var assignSymbols = __webpack_require__(741); +var isExtendable = __webpack_require__(745); +var assignSymbols = __webpack_require__(748); module.exports = Object.assign || function(obj/*, objects*/) { if (obj === null || typeof obj === 'undefined') { @@ -84130,7 +86494,7 @@ function isEnum(obj, key) { /***/ }), -/* 738 */ +/* 745 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -84143,7 +86507,7 @@ function isEnum(obj, key) { -var isPlainObject = __webpack_require__(739); +var isPlainObject = __webpack_require__(746); module.exports = function isExtendable(val) { return isPlainObject(val) || typeof val === 'function' || Array.isArray(val); @@ -84151,7 +86515,7 @@ module.exports = function isExtendable(val) { /***/ }), -/* 739 */ +/* 746 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -84164,7 +86528,7 @@ module.exports = function isExtendable(val) { -var isObject = __webpack_require__(740); +var isObject = __webpack_require__(747); function isObjectObject(o) { return isObject(o) === true @@ -84195,7 +86559,7 @@ module.exports = function isPlainObject(o) { /***/ }), -/* 740 */ +/* 747 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -84214,7 +86578,7 @@ module.exports = function isObject(val) { /***/ }), -/* 741 */ +/* 748 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -84261,7 +86625,7 @@ module.exports = function(receiver, objects) { /***/ }), -/* 742 */ +/* 749 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -84290,7 +86654,7 @@ function flat(arr, res) { /***/ }), -/* 743 */ +/* 750 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -84304,10 +86668,10 @@ function flat(arr, res) { var util = __webpack_require__(29); -var isNumber = __webpack_require__(744); -var extend = __webpack_require__(730); -var repeat = __webpack_require__(746); -var toRegex = __webpack_require__(747); +var isNumber = __webpack_require__(751); +var extend = __webpack_require__(737); +var repeat = __webpack_require__(753); +var toRegex = __webpack_require__(754); /** * Return a range of numbers or letters. @@ -84505,7 +86869,7 @@ module.exports = fillRange; /***/ }), -/* 744 */ +/* 751 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -84518,7 +86882,7 @@ module.exports = fillRange; -var typeOf = __webpack_require__(745); +var typeOf = __webpack_require__(752); module.exports = function isNumber(num) { var type = typeOf(num); @@ -84534,10 +86898,10 @@ module.exports = function isNumber(num) { /***/ }), -/* 745 */ +/* 752 */ /***/ (function(module, exports, __webpack_require__) { -var isBuffer = __webpack_require__(727); +var isBuffer = __webpack_require__(734); var toString = Object.prototype.toString; /** @@ -84656,7 +87020,7 @@ module.exports = function kindOf(val) { /***/ }), -/* 746 */ +/* 753 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -84733,7 +87097,7 @@ function repeat(str, num) { /***/ }), -/* 747 */ +/* 754 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -84746,8 +87110,8 @@ function repeat(str, num) { -var repeat = __webpack_require__(746); -var isNumber = __webpack_require__(744); +var repeat = __webpack_require__(753); +var isNumber = __webpack_require__(751); var cache = {}; function toRegexRange(min, max, options) { @@ -85034,7 +87398,7 @@ module.exports = toRegexRange; /***/ }), -/* 748 */ +/* 755 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -85059,14 +87423,14 @@ module.exports = function repeat(ele, num) { /***/ }), -/* 749 */ +/* 756 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var Node = __webpack_require__(750); -var utils = __webpack_require__(735); +var Node = __webpack_require__(757); +var utils = __webpack_require__(742); /** * Braces parsers @@ -85426,15 +87790,15 @@ function concatNodes(pos, node, parent, options) { /***/ }), -/* 750 */ +/* 757 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isObject = __webpack_require__(740); -var define = __webpack_require__(751); -var utils = __webpack_require__(758); +var isObject = __webpack_require__(747); +var define = __webpack_require__(758); +var utils = __webpack_require__(765); var ownNames; /** @@ -85925,7 +88289,7 @@ exports = module.exports = Node; /***/ }), -/* 751 */ +/* 758 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -85938,7 +88302,7 @@ exports = module.exports = Node; -var isDescriptor = __webpack_require__(752); +var isDescriptor = __webpack_require__(759); module.exports = function defineProperty(obj, prop, val) { if (typeof obj !== 'object' && typeof obj !== 'function') { @@ -85963,7 +88327,7 @@ module.exports = function defineProperty(obj, prop, val) { /***/ }), -/* 752 */ +/* 759 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -85976,9 +88340,9 @@ module.exports = function defineProperty(obj, prop, val) { -var typeOf = __webpack_require__(753); -var isAccessor = __webpack_require__(754); -var isData = __webpack_require__(756); +var typeOf = __webpack_require__(760); +var isAccessor = __webpack_require__(761); +var isData = __webpack_require__(763); module.exports = function isDescriptor(obj, key) { if (typeOf(obj) !== 'object') { @@ -85992,7 +88356,7 @@ module.exports = function isDescriptor(obj, key) { /***/ }), -/* 753 */ +/* 760 */ /***/ (function(module, exports) { var toString = Object.prototype.toString; @@ -86127,7 +88491,7 @@ function isBuffer(val) { /***/ }), -/* 754 */ +/* 761 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -86140,7 +88504,7 @@ function isBuffer(val) { -var typeOf = __webpack_require__(755); +var typeOf = __webpack_require__(762); // accessor descriptor properties var accessor = { @@ -86203,7 +88567,7 @@ module.exports = isAccessorDescriptor; /***/ }), -/* 755 */ +/* 762 */ /***/ (function(module, exports) { var toString = Object.prototype.toString; @@ -86338,7 +88702,7 @@ function isBuffer(val) { /***/ }), -/* 756 */ +/* 763 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -86351,7 +88715,7 @@ function isBuffer(val) { -var typeOf = __webpack_require__(757); +var typeOf = __webpack_require__(764); module.exports = function isDataDescriptor(obj, prop) { // data descriptor properties @@ -86394,7 +88758,7 @@ module.exports = function isDataDescriptor(obj, prop) { /***/ }), -/* 757 */ +/* 764 */ /***/ (function(module, exports) { var toString = Object.prototype.toString; @@ -86529,13 +88893,13 @@ function isBuffer(val) { /***/ }), -/* 758 */ +/* 765 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var typeOf = __webpack_require__(745); +var typeOf = __webpack_require__(752); var utils = module.exports; /** @@ -87555,17 +89919,17 @@ function assert(val, message) { /***/ }), -/* 759 */ +/* 766 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var extend = __webpack_require__(730); -var Snapdragon = __webpack_require__(760); -var compilers = __webpack_require__(734); -var parsers = __webpack_require__(749); -var utils = __webpack_require__(735); +var extend = __webpack_require__(737); +var Snapdragon = __webpack_require__(767); +var compilers = __webpack_require__(741); +var parsers = __webpack_require__(756); +var utils = __webpack_require__(742); /** * Customize Snapdragon parser and renderer @@ -87666,17 +90030,17 @@ module.exports = Braces; /***/ }), -/* 760 */ +/* 767 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var Base = __webpack_require__(761); -var define = __webpack_require__(722); -var Compiler = __webpack_require__(790); -var Parser = __webpack_require__(819); -var utils = __webpack_require__(799); +var Base = __webpack_require__(768); +var define = __webpack_require__(729); +var Compiler = __webpack_require__(797); +var Parser = __webpack_require__(826); +var utils = __webpack_require__(806); var regexCache = {}; var cache = {}; @@ -87847,20 +90211,20 @@ module.exports.Parser = Parser; /***/ }), -/* 761 */ +/* 768 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var util = __webpack_require__(29); -var define = __webpack_require__(762); -var CacheBase = __webpack_require__(763); -var Emitter = __webpack_require__(764); -var isObject = __webpack_require__(740); -var merge = __webpack_require__(781); -var pascal = __webpack_require__(784); -var cu = __webpack_require__(785); +var define = __webpack_require__(769); +var CacheBase = __webpack_require__(770); +var Emitter = __webpack_require__(771); +var isObject = __webpack_require__(747); +var merge = __webpack_require__(788); +var pascal = __webpack_require__(791); +var cu = __webpack_require__(792); /** * Optionally define a custom `cache` namespace to use. @@ -88289,7 +90653,7 @@ module.exports.namespace = namespace; /***/ }), -/* 762 */ +/* 769 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -88302,7 +90666,7 @@ module.exports.namespace = namespace; -var isDescriptor = __webpack_require__(752); +var isDescriptor = __webpack_require__(759); module.exports = function defineProperty(obj, prop, val) { if (typeof obj !== 'object' && typeof obj !== 'function') { @@ -88327,21 +90691,21 @@ module.exports = function defineProperty(obj, prop, val) { /***/ }), -/* 763 */ +/* 770 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isObject = __webpack_require__(740); -var Emitter = __webpack_require__(764); -var visit = __webpack_require__(765); -var toPath = __webpack_require__(768); -var union = __webpack_require__(769); -var del = __webpack_require__(773); -var get = __webpack_require__(771); -var has = __webpack_require__(778); -var set = __webpack_require__(772); +var isObject = __webpack_require__(747); +var Emitter = __webpack_require__(771); +var visit = __webpack_require__(772); +var toPath = __webpack_require__(775); +var union = __webpack_require__(776); +var del = __webpack_require__(780); +var get = __webpack_require__(778); +var has = __webpack_require__(785); +var set = __webpack_require__(779); /** * Create a `Cache` constructor that when instantiated will @@ -88595,7 +90959,7 @@ module.exports.namespace = namespace; /***/ }), -/* 764 */ +/* 771 */ /***/ (function(module, exports, __webpack_require__) { @@ -88764,7 +91128,7 @@ Emitter.prototype.hasListeners = function(event){ /***/ }), -/* 765 */ +/* 772 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -88777,8 +91141,8 @@ Emitter.prototype.hasListeners = function(event){ -var visit = __webpack_require__(766); -var mapVisit = __webpack_require__(767); +var visit = __webpack_require__(773); +var mapVisit = __webpack_require__(774); module.exports = function(collection, method, val) { var result; @@ -88801,7 +91165,7 @@ module.exports = function(collection, method, val) { /***/ }), -/* 766 */ +/* 773 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -88814,7 +91178,7 @@ module.exports = function(collection, method, val) { -var isObject = __webpack_require__(740); +var isObject = __webpack_require__(747); module.exports = function visit(thisArg, method, target, val) { if (!isObject(thisArg) && typeof thisArg !== 'function') { @@ -88841,14 +91205,14 @@ module.exports = function visit(thisArg, method, target, val) { /***/ }), -/* 767 */ +/* 774 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var util = __webpack_require__(29); -var visit = __webpack_require__(766); +var visit = __webpack_require__(773); /** * Map `visit` over an array of objects. @@ -88885,7 +91249,7 @@ function isObject(val) { /***/ }), -/* 768 */ +/* 775 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -88898,7 +91262,7 @@ function isObject(val) { -var typeOf = __webpack_require__(745); +var typeOf = __webpack_require__(752); module.exports = function toPath(args) { if (typeOf(args) !== 'arguments') { @@ -88925,16 +91289,16 @@ function filter(arr) { /***/ }), -/* 769 */ +/* 776 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isObject = __webpack_require__(731); -var union = __webpack_require__(770); -var get = __webpack_require__(771); -var set = __webpack_require__(772); +var isObject = __webpack_require__(738); +var union = __webpack_require__(777); +var get = __webpack_require__(778); +var set = __webpack_require__(779); module.exports = function unionValue(obj, prop, value) { if (!isObject(obj)) { @@ -88962,7 +91326,7 @@ function arrayify(val) { /***/ }), -/* 770 */ +/* 777 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -88998,7 +91362,7 @@ module.exports = function union(init) { /***/ }), -/* 771 */ +/* 778 */ /***/ (function(module, exports) { /*! @@ -89054,7 +91418,7 @@ function toString(val) { /***/ }), -/* 772 */ +/* 779 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -89067,10 +91431,10 @@ function toString(val) { -var split = __webpack_require__(736); -var extend = __webpack_require__(730); -var isPlainObject = __webpack_require__(739); -var isObject = __webpack_require__(731); +var split = __webpack_require__(743); +var extend = __webpack_require__(737); +var isPlainObject = __webpack_require__(746); +var isObject = __webpack_require__(738); module.exports = function(obj, prop, val) { if (!isObject(obj)) { @@ -89116,7 +91480,7 @@ function isValidKey(key) { /***/ }), -/* 773 */ +/* 780 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -89129,8 +91493,8 @@ function isValidKey(key) { -var isObject = __webpack_require__(740); -var has = __webpack_require__(774); +var isObject = __webpack_require__(747); +var has = __webpack_require__(781); module.exports = function unset(obj, prop) { if (!isObject(obj)) { @@ -89155,7 +91519,7 @@ module.exports = function unset(obj, prop) { /***/ }), -/* 774 */ +/* 781 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -89168,9 +91532,9 @@ module.exports = function unset(obj, prop) { -var isObject = __webpack_require__(775); -var hasValues = __webpack_require__(777); -var get = __webpack_require__(771); +var isObject = __webpack_require__(782); +var hasValues = __webpack_require__(784); +var get = __webpack_require__(778); module.exports = function(obj, prop, noZero) { if (isObject(obj)) { @@ -89181,7 +91545,7 @@ module.exports = function(obj, prop, noZero) { /***/ }), -/* 775 */ +/* 782 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -89194,7 +91558,7 @@ module.exports = function(obj, prop, noZero) { -var isArray = __webpack_require__(776); +var isArray = __webpack_require__(783); module.exports = function isObject(val) { return val != null && typeof val === 'object' && isArray(val) === false; @@ -89202,7 +91566,7 @@ module.exports = function isObject(val) { /***/ }), -/* 776 */ +/* 783 */ /***/ (function(module, exports) { var toString = {}.toString; @@ -89213,7 +91577,7 @@ module.exports = Array.isArray || function (arr) { /***/ }), -/* 777 */ +/* 784 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -89256,7 +91620,7 @@ module.exports = function hasValue(o, noZero) { /***/ }), -/* 778 */ +/* 785 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -89269,9 +91633,9 @@ module.exports = function hasValue(o, noZero) { -var isObject = __webpack_require__(740); -var hasValues = __webpack_require__(779); -var get = __webpack_require__(771); +var isObject = __webpack_require__(747); +var hasValues = __webpack_require__(786); +var get = __webpack_require__(778); module.exports = function(val, prop) { return hasValues(isObject(val) && prop ? get(val, prop) : val); @@ -89279,7 +91643,7 @@ module.exports = function(val, prop) { /***/ }), -/* 779 */ +/* 786 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -89292,8 +91656,8 @@ module.exports = function(val, prop) { -var typeOf = __webpack_require__(780); -var isNumber = __webpack_require__(744); +var typeOf = __webpack_require__(787); +var isNumber = __webpack_require__(751); module.exports = function hasValue(val) { // is-number checks for NaN and other edge cases @@ -89346,10 +91710,10 @@ module.exports = function hasValue(val) { /***/ }), -/* 780 */ +/* 787 */ /***/ (function(module, exports, __webpack_require__) { -var isBuffer = __webpack_require__(727); +var isBuffer = __webpack_require__(734); var toString = Object.prototype.toString; /** @@ -89471,14 +91835,14 @@ module.exports = function kindOf(val) { /***/ }), -/* 781 */ +/* 788 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isExtendable = __webpack_require__(782); -var forIn = __webpack_require__(783); +var isExtendable = __webpack_require__(789); +var forIn = __webpack_require__(790); function mixinDeep(target, objects) { var len = arguments.length, i = 0; @@ -89542,7 +91906,7 @@ module.exports = mixinDeep; /***/ }), -/* 782 */ +/* 789 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -89555,7 +91919,7 @@ module.exports = mixinDeep; -var isPlainObject = __webpack_require__(739); +var isPlainObject = __webpack_require__(746); module.exports = function isExtendable(val) { return isPlainObject(val) || typeof val === 'function' || Array.isArray(val); @@ -89563,7 +91927,7 @@ module.exports = function isExtendable(val) { /***/ }), -/* 783 */ +/* 790 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -89586,7 +91950,7 @@ module.exports = function forIn(obj, fn, thisArg) { /***/ }), -/* 784 */ +/* 791 */ /***/ (function(module, exports) { /*! @@ -89613,14 +91977,14 @@ module.exports = pascalcase; /***/ }), -/* 785 */ +/* 792 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var util = __webpack_require__(29); -var utils = __webpack_require__(786); +var utils = __webpack_require__(793); /** * Expose class utils @@ -89985,7 +92349,7 @@ cu.bubble = function(Parent, events) { /***/ }), -/* 786 */ +/* 793 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -89999,10 +92363,10 @@ var utils = {}; * Lazily required module dependencies */ -utils.union = __webpack_require__(770); -utils.define = __webpack_require__(722); -utils.isObj = __webpack_require__(740); -utils.staticExtend = __webpack_require__(787); +utils.union = __webpack_require__(777); +utils.define = __webpack_require__(729); +utils.isObj = __webpack_require__(747); +utils.staticExtend = __webpack_require__(794); /** @@ -90013,7 +92377,7 @@ module.exports = utils; /***/ }), -/* 787 */ +/* 794 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -90026,8 +92390,8 @@ module.exports = utils; -var copy = __webpack_require__(788); -var define = __webpack_require__(722); +var copy = __webpack_require__(795); +var define = __webpack_require__(729); var util = __webpack_require__(29); /** @@ -90110,15 +92474,15 @@ module.exports = extend; /***/ }), -/* 788 */ +/* 795 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var typeOf = __webpack_require__(745); -var copyDescriptor = __webpack_require__(789); -var define = __webpack_require__(722); +var typeOf = __webpack_require__(752); +var copyDescriptor = __webpack_require__(796); +var define = __webpack_require__(729); /** * Copy static properties, prototype properties, and descriptors from one object to another. @@ -90291,7 +92655,7 @@ module.exports.has = has; /***/ }), -/* 789 */ +/* 796 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -90379,16 +92743,16 @@ function isObject(val) { /***/ }), -/* 790 */ +/* 797 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var use = __webpack_require__(791); -var define = __webpack_require__(722); -var debug = __webpack_require__(793)('snapdragon:compiler'); -var utils = __webpack_require__(799); +var use = __webpack_require__(798); +var define = __webpack_require__(729); +var debug = __webpack_require__(800)('snapdragon:compiler'); +var utils = __webpack_require__(806); /** * Create a new `Compiler` with the given `options`. @@ -90542,7 +92906,7 @@ Compiler.prototype = { // source map support if (opts.sourcemap) { - var sourcemaps = __webpack_require__(818); + var sourcemaps = __webpack_require__(825); sourcemaps(this); this.mapVisit(this.ast.nodes); this.applySourceMaps(); @@ -90563,7 +92927,7 @@ module.exports = Compiler; /***/ }), -/* 791 */ +/* 798 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -90576,7 +92940,7 @@ module.exports = Compiler; -var utils = __webpack_require__(792); +var utils = __webpack_require__(799); module.exports = function base(app, opts) { if (!utils.isObject(app) && typeof app !== 'function') { @@ -90691,7 +93055,7 @@ module.exports = function base(app, opts) { /***/ }), -/* 792 */ +/* 799 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -90705,8 +93069,8 @@ var utils = {}; * Lazily required module dependencies */ -utils.define = __webpack_require__(722); -utils.isObject = __webpack_require__(740); +utils.define = __webpack_require__(729); +utils.isObject = __webpack_require__(747); utils.isString = function(val) { @@ -90721,7 +93085,7 @@ module.exports = utils; /***/ }), -/* 793 */ +/* 800 */ /***/ (function(module, exports, __webpack_require__) { /** @@ -90730,14 +93094,14 @@ module.exports = utils; */ if (typeof process !== 'undefined' && process.type === 'renderer') { - module.exports = __webpack_require__(794); + module.exports = __webpack_require__(801); } else { - module.exports = __webpack_require__(797); + module.exports = __webpack_require__(804); } /***/ }), -/* 794 */ +/* 801 */ /***/ (function(module, exports, __webpack_require__) { /** @@ -90746,7 +93110,7 @@ if (typeof process !== 'undefined' && process.type === 'renderer') { * Expose `debug()` as the module. */ -exports = module.exports = __webpack_require__(795); +exports = module.exports = __webpack_require__(802); exports.log = log; exports.formatArgs = formatArgs; exports.save = save; @@ -90928,7 +93292,7 @@ function localstorage() { /***/ }), -/* 795 */ +/* 802 */ /***/ (function(module, exports, __webpack_require__) { @@ -90944,7 +93308,7 @@ exports.coerce = coerce; exports.disable = disable; exports.enable = enable; exports.enabled = enabled; -exports.humanize = __webpack_require__(796); +exports.humanize = __webpack_require__(803); /** * The currently active debug mode names, and names to skip. @@ -91136,7 +93500,7 @@ function coerce(val) { /***/ }), -/* 796 */ +/* 803 */ /***/ (function(module, exports) { /** @@ -91294,7 +93658,7 @@ function plural(ms, n, name) { /***/ }), -/* 797 */ +/* 804 */ /***/ (function(module, exports, __webpack_require__) { /** @@ -91310,7 +93674,7 @@ var util = __webpack_require__(29); * Expose `debug()` as the module. */ -exports = module.exports = __webpack_require__(795); +exports = module.exports = __webpack_require__(802); exports.init = init; exports.log = log; exports.formatArgs = formatArgs; @@ -91489,7 +93853,7 @@ function createWritableStdioStream (fd) { case 'PIPE': case 'TCP': - var net = __webpack_require__(798); + var net = __webpack_require__(805); stream = new net.Socket({ fd: fd, readable: false, @@ -91548,13 +93912,13 @@ exports.enable(load()); /***/ }), -/* 798 */ +/* 805 */ /***/ (function(module, exports) { module.exports = require("net"); /***/ }), -/* 799 */ +/* 806 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -91564,9 +93928,9 @@ module.exports = require("net"); * Module dependencies */ -exports.extend = __webpack_require__(730); -exports.SourceMap = __webpack_require__(800); -exports.sourceMapResolve = __webpack_require__(811); +exports.extend = __webpack_require__(737); +exports.SourceMap = __webpack_require__(807); +exports.sourceMapResolve = __webpack_require__(818); /** * Convert backslash in the given string to forward slashes @@ -91609,7 +93973,7 @@ exports.last = function(arr, n) { /***/ }), -/* 800 */ +/* 807 */ /***/ (function(module, exports, __webpack_require__) { /* @@ -91617,13 +93981,13 @@ exports.last = function(arr, n) { * Licensed under the New BSD license. See LICENSE.txt or: * http://opensource.org/licenses/BSD-3-Clause */ -exports.SourceMapGenerator = __webpack_require__(801).SourceMapGenerator; -exports.SourceMapConsumer = __webpack_require__(807).SourceMapConsumer; -exports.SourceNode = __webpack_require__(810).SourceNode; +exports.SourceMapGenerator = __webpack_require__(808).SourceMapGenerator; +exports.SourceMapConsumer = __webpack_require__(814).SourceMapConsumer; +exports.SourceNode = __webpack_require__(817).SourceNode; /***/ }), -/* 801 */ +/* 808 */ /***/ (function(module, exports, __webpack_require__) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -91633,10 +93997,10 @@ exports.SourceNode = __webpack_require__(810).SourceNode; * http://opensource.org/licenses/BSD-3-Clause */ -var base64VLQ = __webpack_require__(802); -var util = __webpack_require__(804); -var ArraySet = __webpack_require__(805).ArraySet; -var MappingList = __webpack_require__(806).MappingList; +var base64VLQ = __webpack_require__(809); +var util = __webpack_require__(811); +var ArraySet = __webpack_require__(812).ArraySet; +var MappingList = __webpack_require__(813).MappingList; /** * An instance of the SourceMapGenerator represents a source map which is @@ -92045,7 +94409,7 @@ exports.SourceMapGenerator = SourceMapGenerator; /***/ }), -/* 802 */ +/* 809 */ /***/ (function(module, exports, __webpack_require__) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -92085,7 +94449,7 @@ exports.SourceMapGenerator = SourceMapGenerator; * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -var base64 = __webpack_require__(803); +var base64 = __webpack_require__(810); // A single base 64 digit can contain 6 bits of data. For the base 64 variable // length quantities we use in the source map spec, the first bit is the sign, @@ -92191,7 +94555,7 @@ exports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) { /***/ }), -/* 803 */ +/* 810 */ /***/ (function(module, exports) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -92264,7 +94628,7 @@ exports.decode = function (charCode) { /***/ }), -/* 804 */ +/* 811 */ /***/ (function(module, exports) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -92687,7 +95051,7 @@ exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflate /***/ }), -/* 805 */ +/* 812 */ /***/ (function(module, exports, __webpack_require__) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -92697,7 +95061,7 @@ exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflate * http://opensource.org/licenses/BSD-3-Clause */ -var util = __webpack_require__(804); +var util = __webpack_require__(811); var has = Object.prototype.hasOwnProperty; var hasNativeMap = typeof Map !== "undefined"; @@ -92814,7 +95178,7 @@ exports.ArraySet = ArraySet; /***/ }), -/* 806 */ +/* 813 */ /***/ (function(module, exports, __webpack_require__) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -92824,7 +95188,7 @@ exports.ArraySet = ArraySet; * http://opensource.org/licenses/BSD-3-Clause */ -var util = __webpack_require__(804); +var util = __webpack_require__(811); /** * Determine whether mappingB is after mappingA with respect to generated @@ -92899,7 +95263,7 @@ exports.MappingList = MappingList; /***/ }), -/* 807 */ +/* 814 */ /***/ (function(module, exports, __webpack_require__) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -92909,11 +95273,11 @@ exports.MappingList = MappingList; * http://opensource.org/licenses/BSD-3-Clause */ -var util = __webpack_require__(804); -var binarySearch = __webpack_require__(808); -var ArraySet = __webpack_require__(805).ArraySet; -var base64VLQ = __webpack_require__(802); -var quickSort = __webpack_require__(809).quickSort; +var util = __webpack_require__(811); +var binarySearch = __webpack_require__(815); +var ArraySet = __webpack_require__(812).ArraySet; +var base64VLQ = __webpack_require__(809); +var quickSort = __webpack_require__(816).quickSort; function SourceMapConsumer(aSourceMap) { var sourceMap = aSourceMap; @@ -93987,7 +96351,7 @@ exports.IndexedSourceMapConsumer = IndexedSourceMapConsumer; /***/ }), -/* 808 */ +/* 815 */ /***/ (function(module, exports) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -94104,7 +96468,7 @@ exports.search = function search(aNeedle, aHaystack, aCompare, aBias) { /***/ }), -/* 809 */ +/* 816 */ /***/ (function(module, exports) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -94224,7 +96588,7 @@ exports.quickSort = function (ary, comparator) { /***/ }), -/* 810 */ +/* 817 */ /***/ (function(module, exports, __webpack_require__) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -94234,8 +96598,8 @@ exports.quickSort = function (ary, comparator) { * http://opensource.org/licenses/BSD-3-Clause */ -var SourceMapGenerator = __webpack_require__(801).SourceMapGenerator; -var util = __webpack_require__(804); +var SourceMapGenerator = __webpack_require__(808).SourceMapGenerator; +var util = __webpack_require__(811); // Matches a Windows-style `\r\n` newline or a `\n` newline used by all other // operating systems these days (capturing the result). @@ -94643,17 +97007,17 @@ exports.SourceNode = SourceNode; /***/ }), -/* 811 */ +/* 818 */ /***/ (function(module, exports, __webpack_require__) { // Copyright 2014, 2015, 2016, 2017 Simon Lydell // X11 (“MIT”) Licensed. (See LICENSE.) -var sourceMappingURL = __webpack_require__(812) -var resolveUrl = __webpack_require__(813) -var decodeUriComponent = __webpack_require__(814) -var urix = __webpack_require__(816) -var atob = __webpack_require__(817) +var sourceMappingURL = __webpack_require__(819) +var resolveUrl = __webpack_require__(820) +var decodeUriComponent = __webpack_require__(821) +var urix = __webpack_require__(823) +var atob = __webpack_require__(824) @@ -94951,7 +97315,7 @@ module.exports = { /***/ }), -/* 812 */ +/* 819 */ /***/ (function(module, exports, __webpack_require__) { var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;// Copyright 2014 Simon Lydell @@ -95014,7 +97378,7 @@ void (function(root, factory) { /***/ }), -/* 813 */ +/* 820 */ /***/ (function(module, exports, __webpack_require__) { // Copyright 2014 Simon Lydell @@ -95032,13 +97396,13 @@ module.exports = resolveUrl /***/ }), -/* 814 */ +/* 821 */ /***/ (function(module, exports, __webpack_require__) { // Copyright 2017 Simon Lydell // X11 (“MIT”) Licensed. (See LICENSE.) -var decodeUriComponent = __webpack_require__(815) +var decodeUriComponent = __webpack_require__(822) function customDecodeUriComponent(string) { // `decodeUriComponent` turns `+` into ` `, but that's not wanted. @@ -95049,7 +97413,7 @@ module.exports = customDecodeUriComponent /***/ }), -/* 815 */ +/* 822 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -95150,7 +97514,7 @@ module.exports = function (encodedURI) { /***/ }), -/* 816 */ +/* 823 */ /***/ (function(module, exports, __webpack_require__) { // Copyright 2014 Simon Lydell @@ -95173,7 +97537,7 @@ module.exports = urix /***/ }), -/* 817 */ +/* 824 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -95187,7 +97551,7 @@ module.exports = atob.atob = atob; /***/ }), -/* 818 */ +/* 825 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -95195,8 +97559,8 @@ module.exports = atob.atob = atob; var fs = __webpack_require__(23); var path = __webpack_require__(16); -var define = __webpack_require__(722); -var utils = __webpack_require__(799); +var define = __webpack_require__(729); +var utils = __webpack_require__(806); /** * Expose `mixin()`. @@ -95339,19 +97703,19 @@ exports.comment = function(node) { /***/ }), -/* 819 */ +/* 826 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var use = __webpack_require__(791); +var use = __webpack_require__(798); var util = __webpack_require__(29); -var Cache = __webpack_require__(820); -var define = __webpack_require__(722); -var debug = __webpack_require__(793)('snapdragon:parser'); -var Position = __webpack_require__(821); -var utils = __webpack_require__(799); +var Cache = __webpack_require__(827); +var define = __webpack_require__(729); +var debug = __webpack_require__(800)('snapdragon:parser'); +var Position = __webpack_require__(828); +var utils = __webpack_require__(806); /** * Create a new `Parser` with the given `input` and `options`. @@ -95879,7 +98243,7 @@ module.exports = Parser; /***/ }), -/* 820 */ +/* 827 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -95986,13 +98350,13 @@ MapCache.prototype.del = function mapDelete(key) { /***/ }), -/* 821 */ +/* 828 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var define = __webpack_require__(722); +var define = __webpack_require__(729); /** * Store position for a node @@ -96007,16 +98371,16 @@ module.exports = function Position(start, parser) { /***/ }), -/* 822 */ +/* 829 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var safe = __webpack_require__(823); -var define = __webpack_require__(829); -var extend = __webpack_require__(830); -var not = __webpack_require__(832); +var safe = __webpack_require__(830); +var define = __webpack_require__(836); +var extend = __webpack_require__(837); +var not = __webpack_require__(839); var MAX_LENGTH = 1024 * 64; /** @@ -96169,10 +98533,10 @@ module.exports.makeRe = makeRe; /***/ }), -/* 823 */ +/* 830 */ /***/ (function(module, exports, __webpack_require__) { -var parse = __webpack_require__(824); +var parse = __webpack_require__(831); var types = parse.types; module.exports = function (re, opts) { @@ -96218,13 +98582,13 @@ function isRegExp (x) { /***/ }), -/* 824 */ +/* 831 */ /***/ (function(module, exports, __webpack_require__) { -var util = __webpack_require__(825); -var types = __webpack_require__(826); -var sets = __webpack_require__(827); -var positions = __webpack_require__(828); +var util = __webpack_require__(832); +var types = __webpack_require__(833); +var sets = __webpack_require__(834); +var positions = __webpack_require__(835); module.exports = function(regexpStr) { @@ -96506,11 +98870,11 @@ module.exports.types = types; /***/ }), -/* 825 */ +/* 832 */ /***/ (function(module, exports, __webpack_require__) { -var types = __webpack_require__(826); -var sets = __webpack_require__(827); +var types = __webpack_require__(833); +var sets = __webpack_require__(834); // All of these are private and only used by randexp. @@ -96623,7 +98987,7 @@ exports.error = function(regexp, msg) { /***/ }), -/* 826 */ +/* 833 */ /***/ (function(module, exports) { module.exports = { @@ -96639,10 +99003,10 @@ module.exports = { /***/ }), -/* 827 */ +/* 834 */ /***/ (function(module, exports, __webpack_require__) { -var types = __webpack_require__(826); +var types = __webpack_require__(833); var INTS = function() { return [{ type: types.RANGE , from: 48, to: 57 }]; @@ -96727,10 +99091,10 @@ exports.anyChar = function() { /***/ }), -/* 828 */ +/* 835 */ /***/ (function(module, exports, __webpack_require__) { -var types = __webpack_require__(826); +var types = __webpack_require__(833); exports.wordBoundary = function() { return { type: types.POSITION, value: 'b' }; @@ -96750,7 +99114,7 @@ exports.end = function() { /***/ }), -/* 829 */ +/* 836 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -96763,8 +99127,8 @@ exports.end = function() { -var isobject = __webpack_require__(740); -var isDescriptor = __webpack_require__(752); +var isobject = __webpack_require__(747); +var isDescriptor = __webpack_require__(759); var define = (typeof Reflect !== 'undefined' && Reflect.defineProperty) ? Reflect.defineProperty : Object.defineProperty; @@ -96795,14 +99159,14 @@ module.exports = function defineProperty(obj, key, val) { /***/ }), -/* 830 */ +/* 837 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isExtendable = __webpack_require__(831); -var assignSymbols = __webpack_require__(741); +var isExtendable = __webpack_require__(838); +var assignSymbols = __webpack_require__(748); module.exports = Object.assign || function(obj/*, objects*/) { if (obj === null || typeof obj === 'undefined') { @@ -96862,7 +99226,7 @@ function isEnum(obj, key) { /***/ }), -/* 831 */ +/* 838 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -96875,7 +99239,7 @@ function isEnum(obj, key) { -var isPlainObject = __webpack_require__(739); +var isPlainObject = __webpack_require__(746); module.exports = function isExtendable(val) { return isPlainObject(val) || typeof val === 'function' || Array.isArray(val); @@ -96883,14 +99247,14 @@ module.exports = function isExtendable(val) { /***/ }), -/* 832 */ +/* 839 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var extend = __webpack_require__(830); -var safe = __webpack_require__(823); +var extend = __webpack_require__(837); +var safe = __webpack_require__(830); /** * The main export is a function that takes a `pattern` string and an `options` object. @@ -96962,14 +99326,14 @@ module.exports = toRegex; /***/ }), -/* 833 */ +/* 840 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var nanomatch = __webpack_require__(834); -var extglob = __webpack_require__(849); +var nanomatch = __webpack_require__(841); +var extglob = __webpack_require__(856); module.exports = function(snapdragon) { var compilers = snapdragon.compiler.compilers; @@ -97046,7 +99410,7 @@ function escapeExtglobs(compiler) { /***/ }), -/* 834 */ +/* 841 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -97057,17 +99421,17 @@ function escapeExtglobs(compiler) { */ var util = __webpack_require__(29); -var toRegex = __webpack_require__(721); -var extend = __webpack_require__(835); +var toRegex = __webpack_require__(728); +var extend = __webpack_require__(842); /** * Local dependencies */ -var compilers = __webpack_require__(837); -var parsers = __webpack_require__(838); -var cache = __webpack_require__(841); -var utils = __webpack_require__(843); +var compilers = __webpack_require__(844); +var parsers = __webpack_require__(845); +var cache = __webpack_require__(848); +var utils = __webpack_require__(850); var MAX_LENGTH = 1024 * 64; /** @@ -97891,14 +100255,14 @@ module.exports = nanomatch; /***/ }), -/* 835 */ +/* 842 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isExtendable = __webpack_require__(836); -var assignSymbols = __webpack_require__(741); +var isExtendable = __webpack_require__(843); +var assignSymbols = __webpack_require__(748); module.exports = Object.assign || function(obj/*, objects*/) { if (obj === null || typeof obj === 'undefined') { @@ -97958,7 +100322,7 @@ function isEnum(obj, key) { /***/ }), -/* 836 */ +/* 843 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -97971,7 +100335,7 @@ function isEnum(obj, key) { -var isPlainObject = __webpack_require__(739); +var isPlainObject = __webpack_require__(746); module.exports = function isExtendable(val) { return isPlainObject(val) || typeof val === 'function' || Array.isArray(val); @@ -97979,7 +100343,7 @@ module.exports = function isExtendable(val) { /***/ }), -/* 837 */ +/* 844 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -98325,15 +100689,15 @@ module.exports = function(nanomatch, options) { /***/ }), -/* 838 */ +/* 845 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var regexNot = __webpack_require__(732); -var toRegex = __webpack_require__(721); -var isOdd = __webpack_require__(839); +var regexNot = __webpack_require__(739); +var toRegex = __webpack_require__(728); +var isOdd = __webpack_require__(846); /** * Characters to use in negation regex (we want to "not" match @@ -98719,7 +101083,7 @@ module.exports.not = NOT_REGEX; /***/ }), -/* 839 */ +/* 846 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -98732,7 +101096,7 @@ module.exports.not = NOT_REGEX; -var isNumber = __webpack_require__(840); +var isNumber = __webpack_require__(847); module.exports = function isOdd(i) { if (!isNumber(i)) { @@ -98746,7 +101110,7 @@ module.exports = function isOdd(i) { /***/ }), -/* 840 */ +/* 847 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -98774,14 +101138,14 @@ module.exports = function isNumber(num) { /***/ }), -/* 841 */ +/* 848 */ /***/ (function(module, exports, __webpack_require__) { -module.exports = new (__webpack_require__(842))(); +module.exports = new (__webpack_require__(849))(); /***/ }), -/* 842 */ +/* 849 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -98794,7 +101158,7 @@ module.exports = new (__webpack_require__(842))(); -var MapCache = __webpack_require__(820); +var MapCache = __webpack_require__(827); /** * Create a new `FragmentCache` with an optional object to use for `caches`. @@ -98916,7 +101280,7 @@ exports = module.exports = FragmentCache; /***/ }), -/* 843 */ +/* 850 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -98929,14 +101293,14 @@ var path = __webpack_require__(16); * Module dependencies */ -var isWindows = __webpack_require__(844)(); -var Snapdragon = __webpack_require__(760); -utils.define = __webpack_require__(845); -utils.diff = __webpack_require__(846); -utils.extend = __webpack_require__(835); -utils.pick = __webpack_require__(847); -utils.typeOf = __webpack_require__(848); -utils.unique = __webpack_require__(733); +var isWindows = __webpack_require__(851)(); +var Snapdragon = __webpack_require__(767); +utils.define = __webpack_require__(852); +utils.diff = __webpack_require__(853); +utils.extend = __webpack_require__(842); +utils.pick = __webpack_require__(854); +utils.typeOf = __webpack_require__(855); +utils.unique = __webpack_require__(740); /** * Returns true if the given value is effectively an empty string @@ -99302,7 +101666,7 @@ utils.unixify = function(options) { /***/ }), -/* 844 */ +/* 851 */ /***/ (function(module, exports, __webpack_require__) { var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! @@ -99330,7 +101694,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ /***/ }), -/* 845 */ +/* 852 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -99343,8 +101707,8 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ -var isobject = __webpack_require__(740); -var isDescriptor = __webpack_require__(752); +var isobject = __webpack_require__(747); +var isDescriptor = __webpack_require__(759); var define = (typeof Reflect !== 'undefined' && Reflect.defineProperty) ? Reflect.defineProperty : Object.defineProperty; @@ -99375,7 +101739,7 @@ module.exports = function defineProperty(obj, key, val) { /***/ }), -/* 846 */ +/* 853 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -99429,7 +101793,7 @@ function diffArray(one, two) { /***/ }), -/* 847 */ +/* 854 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -99442,7 +101806,7 @@ function diffArray(one, two) { -var isObject = __webpack_require__(740); +var isObject = __webpack_require__(747); module.exports = function pick(obj, keys) { if (!isObject(obj) && typeof obj !== 'function') { @@ -99471,7 +101835,7 @@ module.exports = function pick(obj, keys) { /***/ }), -/* 848 */ +/* 855 */ /***/ (function(module, exports) { var toString = Object.prototype.toString; @@ -99606,7 +101970,7 @@ function isBuffer(val) { /***/ }), -/* 849 */ +/* 856 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -99616,18 +101980,18 @@ function isBuffer(val) { * Module dependencies */ -var extend = __webpack_require__(730); -var unique = __webpack_require__(733); -var toRegex = __webpack_require__(721); +var extend = __webpack_require__(737); +var unique = __webpack_require__(740); +var toRegex = __webpack_require__(728); /** * Local dependencies */ -var compilers = __webpack_require__(850); -var parsers = __webpack_require__(861); -var Extglob = __webpack_require__(864); -var utils = __webpack_require__(863); +var compilers = __webpack_require__(857); +var parsers = __webpack_require__(868); +var Extglob = __webpack_require__(871); +var utils = __webpack_require__(870); var MAX_LENGTH = 1024 * 64; /** @@ -99944,13 +102308,13 @@ module.exports = extglob; /***/ }), -/* 850 */ +/* 857 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var brackets = __webpack_require__(851); +var brackets = __webpack_require__(858); /** * Extglob compilers @@ -100120,7 +102484,7 @@ module.exports = function(extglob) { /***/ }), -/* 851 */ +/* 858 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -100130,17 +102494,17 @@ module.exports = function(extglob) { * Local dependencies */ -var compilers = __webpack_require__(852); -var parsers = __webpack_require__(854); +var compilers = __webpack_require__(859); +var parsers = __webpack_require__(861); /** * Module dependencies */ -var debug = __webpack_require__(856)('expand-brackets'); -var extend = __webpack_require__(730); -var Snapdragon = __webpack_require__(760); -var toRegex = __webpack_require__(721); +var debug = __webpack_require__(863)('expand-brackets'); +var extend = __webpack_require__(737); +var Snapdragon = __webpack_require__(767); +var toRegex = __webpack_require__(728); /** * Parses the given POSIX character class `pattern` and returns a @@ -100338,13 +102702,13 @@ module.exports = brackets; /***/ }), -/* 852 */ +/* 859 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var posix = __webpack_require__(853); +var posix = __webpack_require__(860); module.exports = function(brackets) { brackets.compiler @@ -100432,7 +102796,7 @@ module.exports = function(brackets) { /***/ }), -/* 853 */ +/* 860 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -100461,14 +102825,14 @@ module.exports = { /***/ }), -/* 854 */ +/* 861 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var utils = __webpack_require__(855); -var define = __webpack_require__(722); +var utils = __webpack_require__(862); +var define = __webpack_require__(729); /** * Text regex @@ -100687,14 +103051,14 @@ module.exports.TEXT_REGEX = TEXT_REGEX; /***/ }), -/* 855 */ +/* 862 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var toRegex = __webpack_require__(721); -var regexNot = __webpack_require__(732); +var toRegex = __webpack_require__(728); +var regexNot = __webpack_require__(739); var cached; /** @@ -100728,7 +103092,7 @@ exports.createRegex = function(pattern, include) { /***/ }), -/* 856 */ +/* 863 */ /***/ (function(module, exports, __webpack_require__) { /** @@ -100737,14 +103101,14 @@ exports.createRegex = function(pattern, include) { */ if (typeof process !== 'undefined' && process.type === 'renderer') { - module.exports = __webpack_require__(857); + module.exports = __webpack_require__(864); } else { - module.exports = __webpack_require__(860); + module.exports = __webpack_require__(867); } /***/ }), -/* 857 */ +/* 864 */ /***/ (function(module, exports, __webpack_require__) { /** @@ -100753,7 +103117,7 @@ if (typeof process !== 'undefined' && process.type === 'renderer') { * Expose `debug()` as the module. */ -exports = module.exports = __webpack_require__(858); +exports = module.exports = __webpack_require__(865); exports.log = log; exports.formatArgs = formatArgs; exports.save = save; @@ -100935,7 +103299,7 @@ function localstorage() { /***/ }), -/* 858 */ +/* 865 */ /***/ (function(module, exports, __webpack_require__) { @@ -100951,7 +103315,7 @@ exports.coerce = coerce; exports.disable = disable; exports.enable = enable; exports.enabled = enabled; -exports.humanize = __webpack_require__(859); +exports.humanize = __webpack_require__(866); /** * The currently active debug mode names, and names to skip. @@ -101143,7 +103507,7 @@ function coerce(val) { /***/ }), -/* 859 */ +/* 866 */ /***/ (function(module, exports) { /** @@ -101301,7 +103665,7 @@ function plural(ms, n, name) { /***/ }), -/* 860 */ +/* 867 */ /***/ (function(module, exports, __webpack_require__) { /** @@ -101317,7 +103681,7 @@ var util = __webpack_require__(29); * Expose `debug()` as the module. */ -exports = module.exports = __webpack_require__(858); +exports = module.exports = __webpack_require__(865); exports.init = init; exports.log = log; exports.formatArgs = formatArgs; @@ -101496,7 +103860,7 @@ function createWritableStdioStream (fd) { case 'PIPE': case 'TCP': - var net = __webpack_require__(798); + var net = __webpack_require__(805); stream = new net.Socket({ fd: fd, readable: false, @@ -101555,15 +103919,15 @@ exports.enable(load()); /***/ }), -/* 861 */ +/* 868 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var brackets = __webpack_require__(851); -var define = __webpack_require__(862); -var utils = __webpack_require__(863); +var brackets = __webpack_require__(858); +var define = __webpack_require__(869); +var utils = __webpack_require__(870); /** * Characters to use in text regex (we want to "not" match @@ -101718,7 +104082,7 @@ module.exports = parsers; /***/ }), -/* 862 */ +/* 869 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -101731,7 +104095,7 @@ module.exports = parsers; -var isDescriptor = __webpack_require__(752); +var isDescriptor = __webpack_require__(759); module.exports = function defineProperty(obj, prop, val) { if (typeof obj !== 'object' && typeof obj !== 'function') { @@ -101756,14 +104120,14 @@ module.exports = function defineProperty(obj, prop, val) { /***/ }), -/* 863 */ +/* 870 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var regex = __webpack_require__(732); -var Cache = __webpack_require__(842); +var regex = __webpack_require__(739); +var Cache = __webpack_require__(849); /** * Utils @@ -101832,7 +104196,7 @@ utils.createRegex = function(str) { /***/ }), -/* 864 */ +/* 871 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -101842,16 +104206,16 @@ utils.createRegex = function(str) { * Module dependencies */ -var Snapdragon = __webpack_require__(760); -var define = __webpack_require__(862); -var extend = __webpack_require__(730); +var Snapdragon = __webpack_require__(767); +var define = __webpack_require__(869); +var extend = __webpack_require__(737); /** * Local dependencies */ -var compilers = __webpack_require__(850); -var parsers = __webpack_require__(861); +var compilers = __webpack_require__(857); +var parsers = __webpack_require__(868); /** * Customize Snapdragon parser and renderer @@ -101917,16 +104281,16 @@ module.exports = Extglob; /***/ }), -/* 865 */ +/* 872 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var extglob = __webpack_require__(849); -var nanomatch = __webpack_require__(834); -var regexNot = __webpack_require__(732); -var toRegex = __webpack_require__(822); +var extglob = __webpack_require__(856); +var nanomatch = __webpack_require__(841); +var regexNot = __webpack_require__(739); +var toRegex = __webpack_require__(829); var not; /** @@ -102007,14 +104371,14 @@ function textRegex(pattern) { /***/ }), -/* 866 */ +/* 873 */ /***/ (function(module, exports, __webpack_require__) { -module.exports = new (__webpack_require__(842))(); +module.exports = new (__webpack_require__(849))(); /***/ }), -/* 867 */ +/* 874 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -102027,13 +104391,13 @@ var path = __webpack_require__(16); * Module dependencies */ -var Snapdragon = __webpack_require__(760); -utils.define = __webpack_require__(829); -utils.diff = __webpack_require__(846); -utils.extend = __webpack_require__(830); -utils.pick = __webpack_require__(847); -utils.typeOf = __webpack_require__(868); -utils.unique = __webpack_require__(733); +var Snapdragon = __webpack_require__(767); +utils.define = __webpack_require__(836); +utils.diff = __webpack_require__(853); +utils.extend = __webpack_require__(837); +utils.pick = __webpack_require__(854); +utils.typeOf = __webpack_require__(875); +utils.unique = __webpack_require__(740); /** * Returns true if the platform is windows, or `path.sep` is `\\`. @@ -102330,7 +104694,7 @@ utils.unixify = function(options) { /***/ }), -/* 868 */ +/* 875 */ /***/ (function(module, exports) { var toString = Object.prototype.toString; @@ -102465,7 +104829,7 @@ function isBuffer(val) { /***/ }), -/* 869 */ +/* 876 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -102484,9 +104848,9 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var readdir = __webpack_require__(870); -var reader_1 = __webpack_require__(883); -var fs_stream_1 = __webpack_require__(887); +var readdir = __webpack_require__(877); +var reader_1 = __webpack_require__(890); +var fs_stream_1 = __webpack_require__(894); var ReaderAsync = /** @class */ (function (_super) { __extends(ReaderAsync, _super); function ReaderAsync() { @@ -102547,15 +104911,15 @@ exports.default = ReaderAsync; /***/ }), -/* 870 */ +/* 877 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const readdirSync = __webpack_require__(871); -const readdirAsync = __webpack_require__(879); -const readdirStream = __webpack_require__(882); +const readdirSync = __webpack_require__(878); +const readdirAsync = __webpack_require__(886); +const readdirStream = __webpack_require__(889); module.exports = exports = readdirAsyncPath; exports.readdir = exports.readdirAsync = exports.async = readdirAsyncPath; @@ -102639,7 +105003,7 @@ function readdirStreamStat (dir, options) { /***/ }), -/* 871 */ +/* 878 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -102647,11 +105011,11 @@ function readdirStreamStat (dir, options) { module.exports = readdirSync; -const DirectoryReader = __webpack_require__(872); +const DirectoryReader = __webpack_require__(879); let syncFacade = { - fs: __webpack_require__(877), - forEach: __webpack_require__(878), + fs: __webpack_require__(884), + forEach: __webpack_require__(885), sync: true }; @@ -102680,7 +105044,7 @@ function readdirSync (dir, options, internalOptions) { /***/ }), -/* 872 */ +/* 879 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -102689,9 +105053,9 @@ function readdirSync (dir, options, internalOptions) { const Readable = __webpack_require__(27).Readable; const EventEmitter = __webpack_require__(379).EventEmitter; const path = __webpack_require__(16); -const normalizeOptions = __webpack_require__(873); -const stat = __webpack_require__(875); -const call = __webpack_require__(876); +const normalizeOptions = __webpack_require__(880); +const stat = __webpack_require__(882); +const call = __webpack_require__(883); /** * Asynchronously reads the contents of a directory and streams the results @@ -103067,14 +105431,14 @@ module.exports = DirectoryReader; /***/ }), -/* 873 */ +/* 880 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const path = __webpack_require__(16); -const globToRegExp = __webpack_require__(874); +const globToRegExp = __webpack_require__(881); module.exports = normalizeOptions; @@ -103251,7 +105615,7 @@ function normalizeOptions (options, internalOptions) { /***/ }), -/* 874 */ +/* 881 */ /***/ (function(module, exports) { module.exports = function (glob, opts) { @@ -103388,13 +105752,13 @@ module.exports = function (glob, opts) { /***/ }), -/* 875 */ +/* 882 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const call = __webpack_require__(876); +const call = __webpack_require__(883); module.exports = stat; @@ -103469,7 +105833,7 @@ function symlinkStat (fs, path, lstats, callback) { /***/ }), -/* 876 */ +/* 883 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -103530,14 +105894,14 @@ function callOnce (fn) { /***/ }), -/* 877 */ +/* 884 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const fs = __webpack_require__(23); -const call = __webpack_require__(876); +const call = __webpack_require__(883); /** * A facade around {@link fs.readdirSync} that allows it to be called @@ -103601,7 +105965,7 @@ exports.lstat = function (path, callback) { /***/ }), -/* 878 */ +/* 885 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -103630,7 +105994,7 @@ function syncForEach (array, iterator, done) { /***/ }), -/* 879 */ +/* 886 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -103638,12 +106002,12 @@ function syncForEach (array, iterator, done) { module.exports = readdirAsync; -const maybe = __webpack_require__(880); -const DirectoryReader = __webpack_require__(872); +const maybe = __webpack_require__(887); +const DirectoryReader = __webpack_require__(879); let asyncFacade = { fs: __webpack_require__(23), - forEach: __webpack_require__(881), + forEach: __webpack_require__(888), async: true }; @@ -103685,7 +106049,7 @@ function readdirAsync (dir, options, callback, internalOptions) { /***/ }), -/* 880 */ +/* 887 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -103712,7 +106076,7 @@ module.exports = function maybe (cb, promise) { /***/ }), -/* 881 */ +/* 888 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -103748,7 +106112,7 @@ function asyncForEach (array, iterator, done) { /***/ }), -/* 882 */ +/* 889 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -103756,11 +106120,11 @@ function asyncForEach (array, iterator, done) { module.exports = readdirStream; -const DirectoryReader = __webpack_require__(872); +const DirectoryReader = __webpack_require__(879); let streamFacade = { fs: __webpack_require__(23), - forEach: __webpack_require__(881), + forEach: __webpack_require__(888), async: true }; @@ -103780,16 +106144,16 @@ function readdirStream (dir, options, internalOptions) { /***/ }), -/* 883 */ +/* 890 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var path = __webpack_require__(16); -var deep_1 = __webpack_require__(884); -var entry_1 = __webpack_require__(886); -var pathUtil = __webpack_require__(885); +var deep_1 = __webpack_require__(891); +var entry_1 = __webpack_require__(893); +var pathUtil = __webpack_require__(892); var Reader = /** @class */ (function () { function Reader(options) { this.options = options; @@ -103855,14 +106219,14 @@ exports.default = Reader; /***/ }), -/* 884 */ +/* 891 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var pathUtils = __webpack_require__(885); -var patternUtils = __webpack_require__(714); +var pathUtils = __webpack_require__(892); +var patternUtils = __webpack_require__(721); var DeepFilter = /** @class */ (function () { function DeepFilter(options, micromatchOptions) { this.options = options; @@ -103945,7 +106309,7 @@ exports.default = DeepFilter; /***/ }), -/* 885 */ +/* 892 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -103976,14 +106340,14 @@ exports.makeAbsolute = makeAbsolute; /***/ }), -/* 886 */ +/* 893 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var pathUtils = __webpack_require__(885); -var patternUtils = __webpack_require__(714); +var pathUtils = __webpack_require__(892); +var patternUtils = __webpack_require__(721); var EntryFilter = /** @class */ (function () { function EntryFilter(options, micromatchOptions) { this.options = options; @@ -104068,7 +106432,7 @@ exports.default = EntryFilter; /***/ }), -/* 887 */ +/* 894 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -104088,8 +106452,8 @@ var __extends = (this && this.__extends) || (function () { })(); Object.defineProperty(exports, "__esModule", { value: true }); var stream = __webpack_require__(27); -var fsStat = __webpack_require__(888); -var fs_1 = __webpack_require__(892); +var fsStat = __webpack_require__(895); +var fs_1 = __webpack_require__(899); var FileSystemStream = /** @class */ (function (_super) { __extends(FileSystemStream, _super); function FileSystemStream() { @@ -104139,14 +106503,14 @@ exports.default = FileSystemStream; /***/ }), -/* 888 */ +/* 895 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const optionsManager = __webpack_require__(889); -const statProvider = __webpack_require__(891); +const optionsManager = __webpack_require__(896); +const statProvider = __webpack_require__(898); /** * Asynchronous API. */ @@ -104177,13 +106541,13 @@ exports.statSync = statSync; /***/ }), -/* 889 */ +/* 896 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const fsAdapter = __webpack_require__(890); +const fsAdapter = __webpack_require__(897); function prepare(opts) { const options = Object.assign({ fs: fsAdapter.getFileSystemAdapter(opts ? opts.fs : undefined), @@ -104196,7 +106560,7 @@ exports.prepare = prepare; /***/ }), -/* 890 */ +/* 897 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -104219,7 +106583,7 @@ exports.getFileSystemAdapter = getFileSystemAdapter; /***/ }), -/* 891 */ +/* 898 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -104271,7 +106635,7 @@ exports.isFollowedSymlink = isFollowedSymlink; /***/ }), -/* 892 */ +/* 899 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -104302,7 +106666,7 @@ exports.default = FileSystem; /***/ }), -/* 893 */ +/* 900 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -104322,9 +106686,9 @@ var __extends = (this && this.__extends) || (function () { })(); Object.defineProperty(exports, "__esModule", { value: true }); var stream = __webpack_require__(27); -var readdir = __webpack_require__(870); -var reader_1 = __webpack_require__(883); -var fs_stream_1 = __webpack_require__(887); +var readdir = __webpack_require__(877); +var reader_1 = __webpack_require__(890); +var fs_stream_1 = __webpack_require__(894); var TransformStream = /** @class */ (function (_super) { __extends(TransformStream, _super); function TransformStream(reader) { @@ -104392,7 +106756,7 @@ exports.default = ReaderStream; /***/ }), -/* 894 */ +/* 901 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -104411,9 +106775,9 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var readdir = __webpack_require__(870); -var reader_1 = __webpack_require__(883); -var fs_sync_1 = __webpack_require__(895); +var readdir = __webpack_require__(877); +var reader_1 = __webpack_require__(890); +var fs_sync_1 = __webpack_require__(902); var ReaderSync = /** @class */ (function (_super) { __extends(ReaderSync, _super); function ReaderSync() { @@ -104473,7 +106837,7 @@ exports.default = ReaderSync; /***/ }), -/* 895 */ +/* 902 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -104492,8 +106856,8 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var fsStat = __webpack_require__(888); -var fs_1 = __webpack_require__(892); +var fsStat = __webpack_require__(895); +var fs_1 = __webpack_require__(899); var FileSystemSync = /** @class */ (function (_super) { __extends(FileSystemSync, _super); function FileSystemSync() { @@ -104539,7 +106903,7 @@ exports.default = FileSystemSync; /***/ }), -/* 896 */ +/* 903 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -104555,7 +106919,7 @@ exports.flatten = flatten; /***/ }), -/* 897 */ +/* 904 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -104576,13 +106940,13 @@ exports.merge = merge; /***/ }), -/* 898 */ +/* 905 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const path = __webpack_require__(16); -const pathType = __webpack_require__(899); +const pathType = __webpack_require__(906); const getExtensions = extensions => extensions.length > 1 ? `{${extensions.join(',')}}` : extensions[0]; @@ -104648,13 +107012,13 @@ module.exports.sync = (input, opts) => { /***/ }), -/* 899 */ +/* 906 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const fs = __webpack_require__(23); -const pify = __webpack_require__(900); +const pify = __webpack_require__(907); function type(fn, fn2, fp) { if (typeof fp !== 'string') { @@ -104697,7 +107061,7 @@ exports.symlinkSync = typeSync.bind(null, 'lstatSync', 'isSymbolicLink'); /***/ }), -/* 900 */ +/* 907 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -104788,17 +107152,17 @@ module.exports = (obj, opts) => { /***/ }), -/* 901 */ +/* 908 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const fs = __webpack_require__(23); const path = __webpack_require__(16); -const fastGlob = __webpack_require__(710); -const gitIgnore = __webpack_require__(902); -const pify = __webpack_require__(903); -const slash = __webpack_require__(904); +const fastGlob = __webpack_require__(717); +const gitIgnore = __webpack_require__(909); +const pify = __webpack_require__(910); +const slash = __webpack_require__(911); const DEFAULT_IGNORE = [ '**/node_modules/**', @@ -104896,7 +107260,7 @@ module.exports.sync = options => { /***/ }), -/* 902 */ +/* 909 */ /***/ (function(module, exports) { // A simple implementation of make-array @@ -105365,7 +107729,7 @@ module.exports = options => new IgnoreBase(options) /***/ }), -/* 903 */ +/* 910 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -105440,7 +107804,7 @@ module.exports = (input, options) => { /***/ }), -/* 904 */ +/* 911 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -105458,17 +107822,17 @@ module.exports = input => { /***/ }), -/* 905 */ +/* 912 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const path = __webpack_require__(16); const {constants: fsConstants} = __webpack_require__(23); -const {Buffer} = __webpack_require__(906); -const CpFileError = __webpack_require__(907); -const fs = __webpack_require__(909); -const ProgressEmitter = __webpack_require__(911); +const {Buffer} = __webpack_require__(913); +const CpFileError = __webpack_require__(914); +const fs = __webpack_require__(918); +const ProgressEmitter = __webpack_require__(920); const cpFile = (source, destination, options) => { if (!source || !destination) { @@ -105622,7 +107986,7 @@ module.exports.sync = (source, destination, options) => { /***/ }), -/* 906 */ +/* 913 */ /***/ (function(module, exports, __webpack_require__) { /* eslint-disable node/no-deprecated-api */ @@ -105690,12 +108054,12 @@ SafeBuffer.allocUnsafeSlow = function (size) { /***/ }), -/* 907 */ +/* 914 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const NestedError = __webpack_require__(908); +const NestedError = __webpack_require__(915); class CpFileError extends NestedError { constructor(message, nested) { @@ -105709,10 +108073,10 @@ module.exports = CpFileError; /***/ }), -/* 908 */ +/* 915 */ /***/ (function(module, exports, __webpack_require__) { -var inherits = __webpack_require__(509); +var inherits = __webpack_require__(916); var NestedError = function (message, nested) { this.nested = nested; @@ -105763,15 +108127,57 @@ module.exports = NestedError; /***/ }), -/* 909 */ +/* 916 */ +/***/ (function(module, exports, __webpack_require__) { + +try { + var util = __webpack_require__(29); + if (typeof util.inherits !== 'function') throw ''; + module.exports = util.inherits; +} catch (e) { + module.exports = __webpack_require__(917); +} + + +/***/ }), +/* 917 */ +/***/ (function(module, exports) { + +if (typeof Object.create === 'function') { + // implementation from standard node.js 'util' module + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); + }; +} else { + // old school shim for old browsers + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + var TempCtor = function () {} + TempCtor.prototype = superCtor.prototype + ctor.prototype = new TempCtor() + ctor.prototype.constructor = ctor + } +} + + +/***/ }), +/* 918 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const fs = __webpack_require__(22); const makeDir = __webpack_require__(559); -const pify = __webpack_require__(910); -const CpFileError = __webpack_require__(907); +const pify = __webpack_require__(919); +const CpFileError = __webpack_require__(914); const fsP = pify(fs); @@ -105916,7 +108322,7 @@ if (fs.copyFileSync) { /***/ }), -/* 910 */ +/* 919 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -105991,7 +108397,7 @@ module.exports = (input, options) => { /***/ }), -/* 911 */ +/* 920 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -106032,12 +108438,12 @@ module.exports = ProgressEmitter; /***/ }), -/* 912 */ +/* 921 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const NestedError = __webpack_require__(913); +const NestedError = __webpack_require__(922); class CpyError extends NestedError { constructor(message, nested) { @@ -106051,7 +108457,7 @@ module.exports = CpyError; /***/ }), -/* 913 */ +/* 922 */ /***/ (function(module, exports, __webpack_require__) { var inherits = __webpack_require__(29).inherits; @@ -106107,7 +108513,7 @@ module.exports = NestedError; /***/ }), -/* 914 */ +/* 923 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; diff --git a/yarn.lock b/yarn.lock index caa5587a0bbd0..a36c3e1501695 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5860,12 +5860,12 @@ aggregate-error@^1.0.0: indent-string "^3.0.0" aggregate-error@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.0.tgz#5b5a3c95e9095f311c9ab16c19fb4f3527cd3f79" - integrity sha512-yKD9kEoJIR+2IFqhMwayIBgheLYbB3PS2OBhWae1L/ODTd/JF/30cW0bc9TqzRL3k4U41Dieu3BF4I29p8xesA== + version "3.0.1" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0" + integrity sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA== dependencies: clean-stack "^2.0.0" - indent-string "^3.2.0" + indent-string "^4.0.0" "airbnb-js-shims@^1 || ^2": version "2.1.1" @@ -5952,7 +5952,7 @@ ajv@^6.1.0, ajv@^6.5.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^6.10.0, ajv@^6.10.2: +ajv@^6.10.0: version "6.10.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== @@ -5962,6 +5962,16 @@ ajv@^6.10.0, ajv@^6.10.2: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^6.10.2: + version "6.11.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.11.0.tgz#c3607cbc8ae392d8a5a536f25b21f8e5f3f87fe9" + integrity sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + ajv@^6.9.1: version "6.9.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.9.2.tgz#4927adb83e7f48e5a32b45729744c71ec39c9c7b" @@ -8341,7 +8351,7 @@ cacache@^12.0.2: unique-filename "^1.1.1" y18n "^4.0.0" -cacache@^13.0.0: +cacache@^13.0.1: version "13.0.1" resolved "https://registry.yarnpkg.com/cacache/-/cacache-13.0.1.tgz#a8000c21697089082f85287a1aec6e382024a71c" integrity sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w== @@ -9021,9 +9031,9 @@ clean-stack@^1.0.0, clean-stack@^1.3.0: integrity sha1-noIVAa6XmYbEax1m0tQy2y/UrjE= clean-stack@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.1.0.tgz#9e7fec7f3f8340a2ab4f127c80273085e8fbbdd0" - integrity sha512-uQWrpRm+iZZUCAp7ZZJQbd4Za9I3AjR/3YTjmcnAtkauaIm/T5CT6U8zVI6e60T6OANqBFAzuR9/HB3NzuZCRA== + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== cli-boxes@^1.0.0: version "1.0.0" @@ -9461,12 +9471,12 @@ commander@3.0.2: resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== -commander@^2.13.0, commander@^2.15.1, commander@^2.16.0, commander@^2.19.0, commander@^2.20.0: +commander@^2.13.0, commander@^2.15.1, commander@^2.16.0, commander@^2.19.0: version "2.20.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== -commander@^2.7.1: +commander@^2.20.0, commander@^2.7.1: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -13363,9 +13373,9 @@ fast-glob@^3.0.3: micromatch "^4.0.2" fast-json-stable-stringify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" - integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.4, fast-levenshtein@~2.0.6: version "2.0.6" @@ -13724,10 +13734,10 @@ find-cache-dir@^2.1.0: make-dir "^2.0.0" pkg-dir "^3.0.0" -find-cache-dir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.0.0.tgz#cd4b7dd97b7185b7e17dbfe2d6e4115ee3eeb8fc" - integrity sha512-t7ulV1fmbxh5G9l/492O1p5+EBbr3uwpt6odhFTMc+nWyhmbloe+ja9BZ8pIBtqFWhOmCWVjx+pTW4zDkFoclw== +find-cache-dir@^3.0.0, find-cache-dir@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.2.0.tgz#e7fe44c1abc1299f516146e563108fd1006c1874" + integrity sha512-1JKclkYYsf1q9WIJKLZa9S9muC+08RIjzAlLrK4QcYLJMS6mk9yombQ9qf+zJ7H9LS800k0s44L4sDq9VYzqyg== dependencies: commondir "^1.0.1" make-dir "^3.0.0" @@ -14204,9 +14214,9 @@ fs-minipass@^1.2.5: minipass "^2.2.1" fs-minipass@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.0.0.tgz#a6415edab02fae4b9e9230bc87ee2e4472003cd1" - integrity sha512-40Qz+LFXmd9tzYVnnBmZvFfvAADfUA14TXPK1s7IfElJTIZ97rA8w4Kin7Wt5JBrC3ShnnFJO/5vPjPEeJIq9A== + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== dependencies: minipass "^3.0.0" @@ -14675,7 +14685,7 @@ glob-watcher@5.0.3, glob-watcher@^5.0.3: just-debounce "^1.0.0" object.defaults "^1.1.0" -glob@7.1.3, glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@~7.1.1: +glob@7.1.3, glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== @@ -14687,7 +14697,7 @@ glob@7.1.3, glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glo once "^1.3.0" path-is-absolute "^1.0.0" -glob@7.1.4, glob@^7.1.4, glob@~7.1.4: +glob@7.1.4, glob@~7.1.4: version "7.1.4" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== @@ -14721,7 +14731,7 @@ glob@^6.0.1, glob@^6.0.4: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.1.6: +glob@^7.0.5, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -15090,12 +15100,12 @@ graceful-fs@^4.1.15, graceful-fs@^4.1.9: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== -graceful-fs@^4.1.2, graceful-fs@^4.1.6: +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.2: version "4.2.3" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== -graceful-fs@^4.2.0, graceful-fs@^4.2.2: +graceful-fs@^4.2.0: version "4.2.2" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02" integrity sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q== @@ -16551,16 +16561,21 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= +inherits@2, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== inherits@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= +inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + ini@^1.2.0, ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" @@ -18203,6 +18218,14 @@ jest-worker@^24.9.0: merge-stream "^2.0.0" supports-color "^6.1.0" +jest-worker@^25.1.0: + version "25.1.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.1.0.tgz#75d038bad6fdf58eba0d2ec1835856c497e3907a" + integrity sha512-ZHhHtlxOWSxCoNOKHGbiLzXnl42ga9CxDr27H36Qn+15pQZd3R/F24jrmjDelw9j/iHUIWMWs08/u2QN50HHOg== + dependencies: + merge-stream "^2.0.0" + supports-color "^7.0.0" + jest@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/jest/-/jest-24.9.0.tgz#987d290c05a08b52c56188c1002e368edb007171" @@ -20602,10 +20625,10 @@ minipass@^2.8.6: safe-buffer "^5.1.2" yallist "^3.0.0" -minipass@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.0.1.tgz#b4fec73bd61e8a40f0b374ddd04260ade2c8ec20" - integrity sha512-2y5okJ4uBsjoD2vAbLKL9EUQPPkC0YMIp+2mZOXG3nBba++pdfJWRxx2Ewirc0pwAJYu4XtWg2EkVo1nRXuO/w== +minipass@^3.0.0, minipass@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.1.tgz#7607ce778472a185ad6d89082aa2070f79cedcd5" + integrity sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w== dependencies: yallist "^4.0.0" @@ -22215,10 +22238,10 @@ p-limit@^2.0.0: dependencies: p-try "^2.0.0" -p-limit@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2" - integrity sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ== +p-limit@^2.2.0, p-limit@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.2.tgz#61279b67721f5287aa1c13a9a7fbbc48c9291b1e" + integrity sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ== dependencies: p-try "^2.0.0" @@ -22299,9 +22322,9 @@ p-try@^1.0.0: integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= p-try@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1" - integrity sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ== + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== package-hash@^3.0.0: version "3.0.0" @@ -23292,7 +23315,7 @@ private@^0.1.6, private@^0.1.8, private@~0.1.5: resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== -process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: +process-nextick-args@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== @@ -23302,6 +23325,11 @@ process-nextick-args@~1.0.6: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" integrity sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M= +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + process@^0.11.10: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" @@ -24931,10 +24959,10 @@ read-pkg@^5.1.1, read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.3, readable-stream@~2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" - integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== +"readable-stream@1 || 2": + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -24963,6 +24991,19 @@ readable-stream@1.0: string_decoder "^1.1.1" util-deprecate "^1.0.1" +readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.3, readable-stream@~2.3.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + readable-stream@~1.1.0: version "1.1.14" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" @@ -25993,7 +26034,7 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" -rimraf@2, rimraf@^2.2.0, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.5.4, rimraf@^2.6.0, rimraf@^2.6.1, rimraf@^2.6.2: +rimraf@2, rimraf@^2.2.0, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.6.0, rimraf@^2.6.1, rimraf@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w== @@ -26014,7 +26055,7 @@ rimraf@3.0.0, rimraf@^3.0.0: dependencies: glob "^7.1.3" -rimraf@^2.7.1: +rimraf@^2.5.4, rimraf@^2.7.1: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -26397,10 +26438,10 @@ schema-utils@^2.0.0, schema-utils@^2.0.1: ajv "^6.1.0" ajv-keywords "^3.1.0" -schema-utils@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.4.1.tgz#e89ade5d056dc8bcaca377574bb4a9c4e1b8be56" - integrity sha512-RqYLpkPZX5Oc3fw/kHHHyP56fg5Y+XBpIpV8nCg0znIALfq3OH+Ea9Hfeac9BAMwG5IICltiZ0vxFvJQONfA5w== +schema-utils@^2.4.1, schema-utils@^2.6.4: + version "2.6.4" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.4.tgz#a27efbf6e4e78689d91872ee3ccfa57d7bdd0f53" + integrity sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ== dependencies: ajv "^6.10.2" ajv-keywords "^3.4.1" @@ -26532,21 +26573,16 @@ semver@^5.5.1: resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477" integrity sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw== -semver@^6.0.0: - version "6.1.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.1.2.tgz#079960381376a3db62eb2edc8a3bfb10c7cfe318" - integrity sha512-z4PqiCpomGtWj8633oeAdXm1Kn1W++3T8epkZYnwiVgIYIJ0QHszhInYSJTYxebByQH7KVCEAn8R9duzZW2PhQ== +semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== semver@^6.1.0: version "6.1.1" resolved "https://registry.yarnpkg.com/semver/-/semver-6.1.1.tgz#53f53da9b30b2103cd4f15eab3a18ecbcb210c9b" integrity sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ== -semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - semver@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" @@ -26598,7 +26634,7 @@ sentence-case@^2.1.0: no-case "^2.2.0" upper-case-first "^1.1.2" -serialize-javascript@^1.7.0, serialize-javascript@^2.1.0, serialize-javascript@^2.1.1, serialize-javascript@^2.1.2: +serialize-javascript@^1.7.0, serialize-javascript@^2.1.1, serialize-javascript@^2.1.2: version "2.1.1" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.1.tgz#952907a04a3e3a75af7f73d92d15e233862048b2" integrity sha512-MPLPRpD4FNqWq9tTIjYG5LesFouDhdyH0EPY3gVK4DRD5+g4aDqdNSzLIwceulo3Yj+PL1bPh6laE5+H6LTcrQ== @@ -27123,9 +27159,9 @@ sort-on@^3.0.0: dot-prop "^4.1.1" source-list-map@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085" - integrity sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A== + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: version "0.5.2" @@ -27395,12 +27431,12 @@ ssri@^6.0.1: figgy-pudding "^3.5.1" ssri@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-7.0.1.tgz#b0cab7bbb11ac9ea07f003453e2011f8cbed9f34" - integrity sha512-FfndBvkXL9AHyGLNzU3r9AvYIBBZ7gm+m+kd0p8cT3/v4OliMAyipZAhLVEv1Zi/k4QFq9CstRGVd9pW/zcHFQ== + version "7.1.0" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-7.1.0.tgz#92c241bf6de82365b5c7fb4bd76e975522e1294d" + integrity sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g== dependencies: figgy-pudding "^3.5.1" - minipass "^3.0.0" + minipass "^3.1.1" stable@^0.1.8: version "0.1.8" @@ -28491,21 +28527,22 @@ terser-webpack-plugin@^1.2.4, terser-webpack-plugin@^1.4.1: webpack-sources "^1.4.0" worker-farm "^1.7.0" -terser-webpack-plugin@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-2.1.2.tgz#2b9b8147a6f18918348200800cf9560c50f701bb" - integrity sha512-MF/C4KABwqYOfRDi87f7gG07GP7Wj/kyiX938UxIGIO6l5mkh8XJL7xtS0hX/CRdVQaZI7ThGUPZbznrCjsGpg== - dependencies: - cacache "^13.0.0" - find-cache-dir "^3.0.0" - jest-worker "^24.9.0" - schema-utils "^2.4.1" - serialize-javascript "^2.1.0" +terser-webpack-plugin@^2.3.4: + version "2.3.4" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-2.3.4.tgz#ac045703bd8da0936ce910d8fb6350d0e1dee5fe" + integrity sha512-Nv96Nws2R2nrFOpbzF6IxRDpIkkIfmhvOws+IqMvYdFLO7o6wAILWFKONFgaYy8+T4LVz77DQW0f7wOeDEAjrg== + dependencies: + cacache "^13.0.1" + find-cache-dir "^3.2.0" + jest-worker "^25.1.0" + p-limit "^2.2.2" + schema-utils "^2.6.4" + serialize-javascript "^2.1.2" source-map "^0.6.1" - terser "^4.3.4" + terser "^4.4.3" webpack-sources "^1.4.3" -terser@^4.1.2, terser@^4.3.4: +terser@^4.1.2: version "4.6.1" resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.1.tgz#913e35e0d38a75285a7913ba01d753c4089ebdbd" integrity sha512-w0f2OWFD7ka3zwetgVAhNMeyzEbj39ht2Tb0qKflw9PmW9Qbo5tjTh01QJLkhO9t9RDDQYvk+WXqpECI2C6i2A== @@ -28514,6 +28551,15 @@ terser@^4.1.2, terser@^4.3.4: source-map "~0.6.1" source-map-support "~0.5.12" +terser@^4.4.3: + version "4.6.3" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.3.tgz#e33aa42461ced5238d352d2df2a67f21921f8d87" + integrity sha512-Lw+ieAXmY69d09IIc/yqeBqXpEQIpDGZqT34ui1QWXIUpR2RjbqEkT8X7Lgex19hslSqcWM5iMN2kM11eMsESQ== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + test-exclude@^5.0.0, test-exclude@^5.2.3: version "5.2.3" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.3.tgz#c3d3e1e311eb7ee405e092dac10aefd09091eac0" @@ -29906,9 +29952,9 @@ unique-filename@^1.1.1: unique-slug "^2.0.0" unique-slug@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.1.tgz#5e9edc6d1ce8fb264db18a507ef9bd8544451ca6" - integrity sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg== + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== dependencies: imurmurhash "^0.1.4" @@ -31825,11 +31871,16 @@ yallist@^2.1.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= -yallist@^3.0.0, yallist@^3.0.2: +yallist@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" integrity sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k= +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + yallist@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" From e74ab191fecf2d7ce64a1229c7a37c7ec1166069 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20C=C3=B4t=C3=A9?= Date: Tue, 4 Feb 2020 14:54:27 -0500 Subject: [PATCH 14/86] Disable creating alerts client instances when ESO plugin is using an ephemeral encryption key (#56676) --- .../legacy/plugins/alerting/server/index.ts | 5 +- .../plugins/alerting/server/plugin.test.ts | 113 ++++++++++++++++++ .../legacy/plugins/alerting/server/plugin.ts | 18 ++- .../lib/detection_engine/rules/types.ts | 2 +- 4 files changed, 131 insertions(+), 7 deletions(-) create mode 100644 x-pack/legacy/plugins/alerting/server/plugin.test.ts diff --git a/x-pack/legacy/plugins/alerting/server/index.ts b/x-pack/legacy/plugins/alerting/server/index.ts index 2f8356c0e9d01..44ae1964ec98a 100644 --- a/x-pack/legacy/plugins/alerting/server/index.ts +++ b/x-pack/legacy/plugins/alerting/server/index.ts @@ -4,7 +4,10 @@ * you may not use this file except in compliance with the Elastic License. */ +import { AlertsClient as AlertsClientClass } from './alerts_client'; + +export type AlertsClient = PublicMethodsOf; + export { init } from './init'; export { AlertType, AlertingPlugin, AlertExecutorOptions } from './types'; -export { AlertsClient } from './alerts_client'; export { PluginSetupContract, PluginStartContract } from './plugin'; diff --git a/x-pack/legacy/plugins/alerting/server/plugin.test.ts b/x-pack/legacy/plugins/alerting/server/plugin.test.ts new file mode 100644 index 0000000000000..50142434a86dd --- /dev/null +++ b/x-pack/legacy/plugins/alerting/server/plugin.test.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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { Plugin } from './plugin'; +import { coreMock } from '../../../../../src/core/server/mocks'; +import { licensingMock } from '../../../../plugins/licensing/server/mocks'; +import { encryptedSavedObjectsMock } from '../../../../plugins/encrypted_saved_objects/server/mocks'; + +describe('Alerting Plugin', () => { + describe('start()', () => { + /** + * HACK: This test has put together to ensuire the function "getAlertsClientWithRequest" + * throws when needed. There's a lot of blockers for writing a proper test like + * misisng plugin start/setup mocks for taskManager and actions plugin, core.http.route + * is actually not a function in Kibana Platform, etc. This test contains what is needed + * to get to the necessary function within start(). + */ + describe('getAlertsClientWithRequest()', () => { + it('throws error when encryptedSavedObjects plugin has usingEphemeralEncryptionKey set to true', async () => { + const context = coreMock.createPluginInitializerContext(); + const plugin = new Plugin(context); + + const coreSetup = coreMock.createSetup(); + const encryptedSavedObjectsSetup = encryptedSavedObjectsMock.createSetup(); + await plugin.setup( + { + ...coreSetup, + http: { + ...coreSetup.http, + route: jest.fn(), + }, + } as any, + { + licensing: licensingMock.createSetup(), + encryptedSavedObjects: encryptedSavedObjectsSetup, + } as any + ); + + const startContract = plugin.start( + coreMock.createStart() as any, + { + actions: { + execute: jest.fn(), + getActionsClientWithRequest: jest.fn(), + }, + } as any + ); + + expect(encryptedSavedObjectsSetup.usingEphemeralEncryptionKey).toEqual(true); + expect(() => + startContract.getAlertsClientWithRequest({} as any) + ).toThrowErrorMatchingInlineSnapshot( + `"Unable to create alerts client due to the Encrypted Saved Objects plugin using an ephemeral encryption key. Please set xpack.encryptedSavedObjects.encryptionKey in kibana.yml"` + ); + }); + + it(`doesn't throw error when encryptedSavedObjects plugin has usingEphemeralEncryptionKey set to false`, async () => { + const context = coreMock.createPluginInitializerContext(); + const plugin = new Plugin(context); + + const coreSetup = coreMock.createSetup(); + const encryptedSavedObjectsSetup = { + ...encryptedSavedObjectsMock.createSetup(), + usingEphemeralEncryptionKey: false, + }; + await plugin.setup( + { + ...coreSetup, + http: { + ...coreSetup.http, + route: jest.fn(), + }, + } as any, + { + licensing: licensingMock.createSetup(), + encryptedSavedObjects: encryptedSavedObjectsSetup, + } as any + ); + + const startContract = plugin.start( + coreMock.createStart() as any, + { + actions: { + execute: jest.fn(), + getActionsClientWithRequest: jest.fn(), + }, + spaces: () => null, + } as any + ); + + const fakeRequest = { + headers: {}, + getBasePath: () => '', + path: '/', + route: { settings: {} }, + url: { + href: '/', + }, + raw: { + req: { + url: '/', + }, + }, + getSavedObjectsClient: jest.fn(), + }; + await startContract.getAlertsClientWithRequest(fakeRequest as any); + }); + }); + }); +}); diff --git a/x-pack/legacy/plugins/alerting/server/plugin.ts b/x-pack/legacy/plugins/alerting/server/plugin.ts index 3218d9eeb2ef4..a4de7af376fb0 100644 --- a/x-pack/legacy/plugins/alerting/server/plugin.ts +++ b/x-pack/legacy/plugins/alerting/server/plugin.ts @@ -42,7 +42,7 @@ export interface PluginSetupContract { } export interface PluginStartContract { listTypes: AlertTypeRegistry['list']; - getAlertsClientWithRequest(request: Hapi.Request): AlertsClient; + getAlertsClientWithRequest(request: Hapi.Request): PublicMethodsOf; } export class Plugin { @@ -52,6 +52,7 @@ export class Plugin { private adminClient?: IClusterClient; private serverBasePath?: string; private licenseState: LicenseState | null = null; + private isESOUsingEphemeralEncryptionKey?: boolean; constructor(initializerContext: AlertingPluginInitializerContext) { this.logger = initializerContext.logger.get('plugins', 'alerting'); @@ -63,8 +64,9 @@ export class Plugin { plugins: AlertingPluginsSetup ): Promise { this.adminClient = core.elasticsearch.adminClient; - this.licenseState = new LicenseState(plugins.licensing.license$); + this.isESOUsingEphemeralEncryptionKey = + plugins.encryptedSavedObjects.usingEphemeralEncryptionKey; // Encrypted attributes plugins.encryptedSavedObjects.registerType({ @@ -106,7 +108,7 @@ export class Plugin { } public start(core: AlertingCoreStart, plugins: AlertingPluginsStart): PluginStartContract { - const { adminClient, serverBasePath } = this; + const { adminClient, serverBasePath, isESOUsingEphemeralEncryptionKey } = this; function spaceIdToNamespace(spaceId?: string): string | undefined { const spacesPlugin = plugins.spaces(); @@ -147,8 +149,14 @@ export class Plugin { return { listTypes: this.alertTypeRegistry!.list.bind(this.alertTypeRegistry!), - getAlertsClientWithRequest: (request: Hapi.Request) => - alertsClientFactory!.create(KibanaRequest.from(request), request), + getAlertsClientWithRequest: (request: Hapi.Request) => { + if (isESOUsingEphemeralEncryptionKey === true) { + throw new Error( + `Unable to create alerts client due to the Encrypted Saved Objects plugin using an ephemeral encryption key. Please set xpack.encryptedSavedObjects.encryptionKey in kibana.yml` + ); + } + return alertsClientFactory!.create(KibanaRequest.from(request), request); + }, }; } diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/types.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/types.ts index 1b13a010bbea3..1d423c8b375d1 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/types.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/types.ts @@ -14,7 +14,7 @@ import { SavedObjectsClientContract, } from 'kibana/server'; import { SIGNALS_ID } from '../../../../common/constants'; -import { AlertsClient } from '../../../../../alerting/server/alerts_client'; +import { AlertsClient } from '../../../../../alerting/server'; import { ActionsClient } from '../../../../../../../plugins/actions/server'; import { RuleAlertParams, RuleTypeParams, RuleAlertParamsRest } from '../types'; import { RequestFacade } from '../../../types'; From 954cbee48654b79b528517a1df471dfbabdd9476 Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Tue, 4 Feb 2020 14:24:57 -0600 Subject: [PATCH 15/86] Prevent http client from converting our form data (#56772) If we don't specify an undefined content-type like so, the client attempts to convert our form data into a JSON string, and the backend returns an understandable 415. This fixes rule imports. --- .../plugins/siem/public/containers/detection_engine/rules/api.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/legacy/plugins/siem/public/containers/detection_engine/rules/api.ts b/x-pack/legacy/plugins/siem/public/containers/detection_engine/rules/api.ts index 4f50a9bd14788..06fb0c6dc3480 100644 --- a/x-pack/legacy/plugins/siem/public/containers/detection_engine/rules/api.ts +++ b/x-pack/legacy/plugins/siem/public/containers/detection_engine/rules/api.ts @@ -246,6 +246,7 @@ export const importRules = async ({ `${DETECTION_ENGINE_RULES_URL}/_import`, { method: 'POST', + headers: { 'Content-Type': undefined }, query: { overwrite }, body: formData, asResponse: true, From f18d5913590bb3b8949d534436d4c0824f387266 Mon Sep 17 00:00:00 2001 From: Alison Goryachev Date: Tue, 4 Feb 2020 15:37:39 -0500 Subject: [PATCH 16/86] [Rollups] Adjust max width for job detail panel (#56674) --- .../crud_app/sections/job_list/detail_panel/detail_panel.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/legacy/plugins/rollup/public/crud_app/sections/job_list/detail_panel/detail_panel.js b/x-pack/legacy/plugins/rollup/public/crud_app/sections/job_list/detail_panel/detail_panel.js index 4534ef698b718..f774b1d7f63b7 100644 --- a/x-pack/legacy/plugins/rollup/public/crud_app/sections/job_list/detail_panel/detail_panel.js +++ b/x-pack/legacy/plugins/rollup/public/crud_app/sections/job_list/detail_panel/detail_panel.js @@ -232,7 +232,7 @@ export class DetailPanel extends Component { onClose={closeDetailPanel} aria-labelledby="rollupJobDetailsFlyoutTitle" size="m" - maxWidth={400} + maxWidth={550} > Date: Tue, 4 Feb 2020 16:41:02 -0500 Subject: [PATCH 17/86] [Canvas] Use unique Id for Canvas Embeddables (#56783) * Use uniqueID for embeddable registry * Adds type to renderer --- .../renderers/embeddable/embeddable.tsx | 10 ++++++---- .../components/element_content/element_content.js | 10 +++++++++- .../public/components/element_wrapper/lib/handlers.js | 2 ++ .../shareable_runtime/components/rendered_element.tsx | 1 + x-pack/legacy/plugins/canvas/types/renderers.ts | 2 ++ 5 files changed, 20 insertions(+), 5 deletions(-) diff --git a/x-pack/legacy/plugins/canvas/canvas_plugin_src/renderers/embeddable/embeddable.tsx b/x-pack/legacy/plugins/canvas/canvas_plugin_src/renderers/embeddable/embeddable.tsx index 8642ebd901bb4..c8cc1fe389619 100644 --- a/x-pack/legacy/plugins/canvas/canvas_plugin_src/renderers/embeddable/embeddable.tsx +++ b/x-pack/legacy/plugins/canvas/canvas_plugin_src/renderers/embeddable/embeddable.tsx @@ -70,7 +70,9 @@ const embeddable = () => ({ { input, embeddableType }: EmbeddableExpression, handlers: RendererHandlers ) => { - if (!embeddablesRegistry[input.id]) { + const uniqueId = handlers.getElementId(); + + if (!embeddablesRegistry[uniqueId]) { const factory = Array.from(start.getEmbeddableFactories()).find( embeddableFactory => embeddableFactory.type === embeddableType ) as EmbeddableFactory; @@ -82,7 +84,7 @@ const embeddable = () => ({ const embeddableObject = await factory.createFromSavedObject(input.id, input); - embeddablesRegistry[input.id] = embeddableObject; + embeddablesRegistry[uniqueId] = embeddableObject; ReactDOM.unmountComponentAtNode(domNode); const subscription = embeddableObject.getInput$().subscribe(function(updatedInput) { @@ -100,12 +102,12 @@ const embeddable = () => ({ subscription.unsubscribe(); handlers.onEmbeddableDestroyed(); - delete embeddablesRegistry[input.id]; + delete embeddablesRegistry[uniqueId]; return ReactDOM.unmountComponentAtNode(domNode); }); } else { - embeddablesRegistry[input.id].updateInput(input); + embeddablesRegistry[uniqueId].updateInput(input); } }, }); diff --git a/x-pack/legacy/plugins/canvas/public/components/element_content/element_content.js b/x-pack/legacy/plugins/canvas/public/components/element_content/element_content.js index 1926fb4aaa5eb..114a457d167e7 100644 --- a/x-pack/legacy/plugins/canvas/public/components/element_content/element_content.js +++ b/x-pack/legacy/plugins/canvas/public/components/element_content/element_content.js @@ -54,6 +54,7 @@ export const ElementContent = compose( onComplete, onEmbeddableInputChange, onEmbeddableDestroyed, + getElementId, } = handlers; return Style.it( @@ -76,7 +77,14 @@ export const ElementContent = compose( config={renderable.value} css={renderable.css} // This is an actual CSS stylesheet string, it will be scoped by RenderElement size={size} // Size is only passed for the purpose of triggering the resize event, it isn't really used otherwise - handlers={{ getFilter, setFilter, done, onEmbeddableInputChange, onEmbeddableDestroyed }} + handlers={{ + getFilter, + setFilter, + done, + onEmbeddableInputChange, + onEmbeddableDestroyed, + getElementId, + }} />
diff --git a/x-pack/legacy/plugins/canvas/public/components/element_wrapper/lib/handlers.js b/x-pack/legacy/plugins/canvas/public/components/element_wrapper/lib/handlers.js index e93cea597901f..d71c5ead2c802 100644 --- a/x-pack/legacy/plugins/canvas/public/components/element_wrapper/lib/handlers.js +++ b/x-pack/legacy/plugins/canvas/public/components/element_wrapper/lib/handlers.js @@ -36,6 +36,8 @@ export const createHandlers = dispatch => { completeFn = fn; }, + getElementId: () => element.id, + onEmbeddableInputChange(embeddableExpression) { dispatch(updateEmbeddableExpression({ elementId: element.id, embeddableExpression })); }, diff --git a/x-pack/legacy/plugins/canvas/shareable_runtime/components/rendered_element.tsx b/x-pack/legacy/plugins/canvas/shareable_runtime/components/rendered_element.tsx index 317a3417841b8..c4a009db3a376 100644 --- a/x-pack/legacy/plugins/canvas/shareable_runtime/components/rendered_element.tsx +++ b/x-pack/legacy/plugins/canvas/shareable_runtime/components/rendered_element.tsx @@ -67,6 +67,7 @@ export class RenderedElementComponent extends PureComponent { done: () => {}, onDestroy: () => {}, onResize: () => {}, + getElementId: () => '', setFilter: () => {}, getFilter: () => '', onEmbeddableInputChange: () => {}, diff --git a/x-pack/legacy/plugins/canvas/types/renderers.ts b/x-pack/legacy/plugins/canvas/types/renderers.ts index af1710e69c257..2564b045d1cf7 100644 --- a/x-pack/legacy/plugins/canvas/types/renderers.ts +++ b/x-pack/legacy/plugins/canvas/types/renderers.ts @@ -9,6 +9,8 @@ type GenericCallback = (callback: () => void) => void; export interface RendererHandlers { /** Handler to invoke when an element has finished rendering */ done: () => void; + /** Get the id of the element being rendered. Can be used as a unique ID in a render function */ + getElementId: () => string; /** Handler to invoke when an element is deleted or changes to a different render type */ onDestroy: GenericCallback; /** Handler to invoke when an element's dimensions have changed*/ From 9af0157b4f6c6319022f1edf49c4e5a9452c0135 Mon Sep 17 00:00:00 2001 From: Tyler Smalley Date: Tue, 4 Feb 2020 14:00:15 -0800 Subject: [PATCH 18/86] [docs] Update upgrade version path (#56658) When upgrading to the next major version, users should first upgrade to the last minor in the previous release. In 6.x this is 6.8. Signed-off-by: Tyler Smalley --- docs/setup/upgrade.asciidoc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/setup/upgrade.asciidoc b/docs/setup/upgrade.asciidoc index 8c03032bb8ac3..982f1167f3871 100644 --- a/docs/setup/upgrade.asciidoc +++ b/docs/setup/upgrade.asciidoc @@ -50,7 +50,7 @@ instructions. [[upgrade-6x]] === Upgrading from 6.x -The recommended path is to upgrade to 6.7 before upgrading to 7.0. This makes it +The recommended path is to upgrade to 6.8 before upgrading to 7.0. This makes it easier to identify the required changes, and enables you to use the Upgrade Assistant to prepare for your upgrade to 7.0. @@ -59,11 +59,11 @@ dashboards is supported. [float] [[upgrade-67]] -=== Upgrading from 6.7 -To help you prepare for your upgrade to 7.0, 6.7 includes an https://www.elastic.co/guide/en/kibana/6.7/upgrade-assistant.html[Upgrade Assistant] -To access the assistant, go to *Management > 7.0 Upgrade Assistant*. +=== Upgrading from 6.8 +To help you prepare for your upgrade to 7.0, 6.8 includes an https://www.elastic.co/guide/en/kibana/6.8/upgrade-assistant.html[Upgrade Assistant] +To access the assistant, go to *Management > 7.0 Upgrade Assistant*. -After you have addressed any issues that were identified by the Upgrade +After you have addressed any issues that were identified by the Upgrade Assistant, <>. From 2fc1f791c978af5235995508d82a3e90cb40eb4a Mon Sep 17 00:00:00 2001 From: Andrew Goldstein Date: Tue, 4 Feb 2020 15:24:10 -0700 Subject: [PATCH 19/86] [SIEM] Fixes Signals count spinner (#56797) ## Fixes an issue where the Signals count spinner can spin forever Per the animated gif below, in `7.6` `BC 4`, the `Signals count` spinner on the Overview page spins forever until the signals index is created (in the current Kibana space): ![signals-count-loading-spinner](https://user-images.githubusercontent.com/4459398/73785251-2ca42000-4754-11ea-8671-daa81f351c9b.gif) The `Signals count` spinner will spin forever until the user clicks the `Detections` tab, which-in turn creates the signals index (if it doesn't exist), per the animated gif below: ![create-signals-index](https://user-images.githubusercontent.com/4459398/73785319-4ba2b200-4754-11ea-9bb0-a745a8b2be5d.gif) This behavior is an issue because: - When a fresh deployment is created on Elastic Cloud, a user won't understand why the `Signals count` widget is always spinning on the `Overview` page. (The user must click the `Detections` page to resolve this.) - In deployments where authentication is disabled, or, for _reasons_, a Detections index will never be created, the `Signals count` spinner on the Overview page will always spin. To reproduce: 1. Spin up a new `7.6` `BC 4` deployment on Elastic Cloud 2. Login to Kibana for the first time 3. Navigate to the SIEM app **Expected result** - All histograms on the Overview page eventually stop displaying their respective loading spinners **Actual result** - The `Signals count` widget spinner spins forever. (The user must click the `Detections` tab to create the signals index.) ## Deleting the signals index To reproduce the issue above when a signals index has already been created (by clicking on the Detections tab), run the following from the Kibana `Dev Tools` `Console`: ``` DELETE /.siem-signals-default-000001 ``` It is also possible to reproduce this issue by creating a new space, because it won't have a signals index. https://github.com/elastic/siem-team/issues/514 --- .../signals_histogram_panel/helpers.test.tsx | 35 +++++++++++++++++++ .../signals_histogram_panel/helpers.tsx | 14 ++++++++ .../signals_histogram_panel/index.tsx | 16 +++++---- .../detection_engine/detection_engine.tsx | 1 - 4 files changed, 59 insertions(+), 7 deletions(-) create mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/components/signals_histogram_panel/helpers.test.tsx diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/signals_histogram_panel/helpers.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/signals_histogram_panel/helpers.test.tsx new file mode 100644 index 0000000000000..2758625c0d4af --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/signals_histogram_panel/helpers.test.tsx @@ -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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { showInitialLoadingSpinner } from './helpers'; + +describe('helpers', () => { + describe('showInitialLoadingSpinner', () => { + test('it should (only) show the spinner during initial loading, while we are fetching data', () => { + expect(showInitialLoadingSpinner({ isInitialLoading: true, isLoadingSignals: true })).toBe( + true + ); + }); + + test('it should STOP showing the spinner (during initial loading) when the first data fetch completes', () => { + expect(showInitialLoadingSpinner({ isInitialLoading: true, isLoadingSignals: false })).toBe( + false + ); + }); + + test('it should NOT show the spinner after initial loading has completed, even if the user requests more data (e.g. by clicking Refresh)', () => { + expect(showInitialLoadingSpinner({ isInitialLoading: false, isLoadingSignals: true })).toBe( + false + ); + }); + + test('it should NOT show the spinner after initial loading has completed', () => { + expect(showInitialLoadingSpinner({ isInitialLoading: false, isLoadingSignals: false })).toBe( + false + ); + }); + }); +}); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/signals_histogram_panel/helpers.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/signals_histogram_panel/helpers.tsx index 551850fa610db..27ee552146092 100644 --- a/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/signals_histogram_panel/helpers.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/signals_histogram_panel/helpers.tsx @@ -76,3 +76,17 @@ export const getSignalsHistogramQuery = ( }, }, }); + +/** + * Returns `true` when the signals histogram initial loading spinner should be shown + * + * @param isInitialLoading The loading spinner will only be displayed if this value is `true`, because after initial load, a different, non-spinner loading indicator is displayed + * @param isLoadingSignals When `true`, IO is being performed to request signals (for rendering in the histogram) + */ +export const showInitialLoadingSpinner = ({ + isInitialLoading, + isLoadingSignals, +}: { + isInitialLoading: boolean; + isLoadingSignals: boolean; +}): boolean => isInitialLoading && isLoadingSignals; diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/signals_histogram_panel/index.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/signals_histogram_panel/index.tsx index 29aaa951ff71a..4de471d6733cf 100644 --- a/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/signals_histogram_panel/index.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/signals_histogram_panel/index.tsx @@ -23,7 +23,7 @@ import { InspectButtonContainer } from '../../../../components/inspect'; import { useQuerySignals } from '../../../../containers/detection_engine/signals/use_query'; import { MatrixLoader } from '../../../../components/matrix_histogram/matrix_loader'; -import { formatSignalsData, getSignalsHistogramQuery } from './helpers'; +import { formatSignalsData, getSignalsHistogramQuery, showInitialLoadingSpinner } from './helpers'; import * as i18n from './translations'; const DEFAULT_PANEL_HEIGHT = 300; @@ -54,7 +54,6 @@ interface SignalsHistogramPanelProps { from: number; query?: Query; legendPosition?: Position; - loadingInitial?: boolean; panelHeight?: number; signalIndexName: string | null; setQuery: (params: RegisterQuery) => void; @@ -75,7 +74,6 @@ export const SignalsHistogramPanel = memo( query, from, legendPosition = 'right', - loadingInitial = false, panelHeight = DEFAULT_PANEL_HEIGHT, setQuery, signalIndexName, @@ -86,7 +84,7 @@ export const SignalsHistogramPanel = memo( title = i18n.HISTOGRAM_HEADER, updateDateRange, }) => { - const [isInitialLoading, setIsInitialLoading] = useState(loadingInitial || true); + const [isInitialLoading, setIsInitialLoading] = useState(true); const [defaultNumberFormat] = useUiSetting$(DEFAULT_NUMBER_FORMAT); const [totalSignalsObj, setTotalSignalsObj] = useState(defaultTotalSignalsObj); const [selectedStackByOption, setSelectedStackByOption] = useState( @@ -124,10 +122,16 @@ export const SignalsHistogramPanel = memo( const formattedSignalsData = useMemo(() => formatSignalsData(signalsData), [signalsData]); useEffect(() => { - if (!loadingInitial && isInitialLoading && !isLoadingSignals && signalsData) { + let canceled = false; + + if (!canceled && !showInitialLoadingSpinner({ isInitialLoading, isLoadingSignals })) { setIsInitialLoading(false); } - }, [loadingInitial, isLoadingSignals, signalsData]); + + return () => { + canceled = true; // prevent long running data fetches from updating state after unmounting + }; + }, [isInitialLoading, isLoadingSignals, setIsInitialLoading]); useEffect(() => { return () => { diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/detection_engine.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/detection_engine.tsx index d854c377e6ec8..ff6722840fd6b 100644 --- a/x-pack/legacy/plugins/siem/public/pages/detection_engine/detection_engine.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/detection_engine.tsx @@ -177,7 +177,6 @@ const DetectionEnginePageComponent: React.FC deleteQuery={deleteQuery} filters={filters} from={from} - loadingInitial={loading} query={query} setQuery={setQuery} showTotalSignalsCount={true} From 5f9386471b24913cd08e23573990ef82c73028fb Mon Sep 17 00:00:00 2001 From: Luke Elmers Date: Tue, 4 Feb 2020 17:35:49 -0700 Subject: [PATCH 20/86] Move ui/agg_types in to shim data plugin (#56353) --- .../actions/filters/brush_event.test.js | 2 +- src/legacy/core_plugins/data/public/index.ts | 50 ++++- src/legacy/core_plugins/data/public/plugin.ts | 28 ++- .../buckets/_terms_other_bucket_helper.js | 2 +- .../data/public/search/aggs}/agg_config.ts | 33 +-- .../data/public/search/aggs}/agg_configs.ts | 5 +- .../data/public/search/aggs}/agg_groups.ts | 4 +- .../public/search/aggs}/agg_params.test.ts | 2 +- .../data/public/search/aggs}/agg_params.ts | 4 +- .../data/public/search/aggs}/agg_type.test.ts | 12 +- .../data/public/search/aggs}/agg_type.ts | 21 +- .../data/public/search/aggs}/agg_types.ts | 26 ++- .../search/aggs}/buckets/_bucket_agg_type.ts | 2 +- .../search/aggs}/buckets/_interval_options.ts | 18 +- .../buckets/_terms_other_bucket_helper.js | 2 +- .../search/aggs}/buckets/bucket_agg_types.ts | 0 .../create_filter/date_histogram.test.ts | 2 +- .../buckets/create_filter/date_histogram.ts | 2 +- .../buckets/create_filter/date_range.test.ts | 2 +- .../aggs}/buckets/create_filter/date_range.ts | 2 +- .../buckets/create_filter/filters.test.ts | 0 .../aggs}/buckets/create_filter/filters.ts | 2 +- .../buckets/create_filter/histogram.test.ts | 2 +- .../aggs}/buckets/create_filter/histogram.ts | 2 +- .../buckets/create_filter/ip_range.test.ts | 2 +- .../aggs}/buckets/create_filter/ip_range.ts | 2 +- .../aggs}/buckets/create_filter/range.test.ts | 2 +- .../aggs}/buckets/create_filter/range.ts | 2 +- .../aggs}/buckets/create_filter/terms.test.ts | 2 +- .../aggs}/buckets/create_filter/terms.ts | 2 +- .../search/aggs}/buckets/date_histogram.ts | 14 +- .../search/aggs}/buckets/date_range.test.ts | 0 .../public/search/aggs}/buckets/date_range.ts | 4 +- .../public/search/aggs}/buckets/filter.ts | 2 +- .../public/search/aggs}/buckets/filters.ts | 6 +- .../search/aggs}/buckets/geo_hash.test.ts | 4 +- .../public/search/aggs}/buckets/geo_hash.ts | 6 +- .../public/search/aggs}/buckets/geo_tile.ts | 4 +- .../search/aggs}/buckets/histogram.test.ts | 0 .../public/search/aggs}/buckets/histogram.ts | 6 +- .../public/search/aggs}/buckets/ip_range.ts | 6 +- .../aggs}/buckets/lib/cidr_mask.test.ts | 0 .../search/aggs}/buckets/lib/cidr_mask.ts | 2 +- .../search/aggs}/buckets/lib/geo_utils.ts | 0 .../buckets/migrate_include_exclude_format.ts | 0 .../public/search/aggs}/buckets/range.test.ts | 2 +- .../data/public/search/aggs}/buckets/range.ts | 8 +- .../public/search/aggs}/buckets/range_key.ts | 0 .../aggs}/buckets/significant_terms.test.ts | 3 +- .../search/aggs}/buckets/significant_terms.ts | 10 +- .../public/search/aggs}/buckets/terms.test.ts | 0 .../data/public/search/aggs}/buckets/terms.ts | 39 ++-- .../aggs}/filter/agg_type_filters.test.ts | 11 +- .../search/aggs}/filter/agg_type_filters.ts | 8 +- .../data/public/search/aggs}/filter/index.ts | 0 .../search/aggs}/filter/prop_filter.test.ts | 0 .../public/search/aggs}/filter/prop_filter.ts | 0 .../data/public/search/aggs}/index.test.ts | 0 .../data/public/search/aggs/index.ts | 52 +++++ .../data/public/search/aggs}/metrics/avg.ts | 6 +- .../public/search/aggs}/metrics/bucket_avg.ts | 4 +- .../public/search/aggs}/metrics/bucket_max.ts | 4 +- .../public/search/aggs}/metrics/bucket_min.ts | 4 +- .../public/search/aggs}/metrics/bucket_sum.ts | 4 +- .../search/aggs}/metrics/cardinality.ts | 6 +- .../data/public/search/aggs}/metrics/count.ts | 6 +- .../search/aggs}/metrics/cumulative_sum.ts | 4 +- .../public/search/aggs}/metrics/derivative.ts | 4 +- .../public/search/aggs}/metrics/geo_bounds.ts | 6 +- .../search/aggs}/metrics/geo_centroid.ts | 6 +- .../lib/get_response_agg_config_class.ts | 0 .../metrics/lib/make_nested_label.test.ts | 0 .../aggs}/metrics/lib/make_nested_label.ts | 0 .../aggs}/metrics/lib/nested_agg_helpers.ts | 0 .../aggs}/metrics/lib/ordinal_suffix.test.ts | 0 .../aggs}/metrics/lib/ordinal_suffix.ts | 0 .../metrics/lib/parent_pipeline_agg_helper.ts | 4 +- .../metrics/lib/parent_pipeline_agg_writer.ts | 4 +- .../lib/sibling_pipeline_agg_helper.ts | 6 +- .../lib/sibling_pipeline_agg_writer.ts | 0 .../data/public/search/aggs}/metrics/max.ts | 6 +- .../search/aggs}/metrics/median.test.ts | 4 +- .../public/search/aggs}/metrics/median.ts | 6 +- .../search/aggs}/metrics/metric_agg_type.ts | 7 +- .../search/aggs}/metrics/metric_agg_types.ts | 0 .../data/public/search/aggs}/metrics/min.ts | 6 +- .../public/search/aggs}/metrics/moving_avg.ts | 4 +- .../aggs}/metrics/parent_pipeline.test.ts | 0 .../aggs}/metrics/percentile_ranks.test.ts | 4 +- .../search/aggs}/metrics/percentile_ranks.ts | 8 +- .../search/aggs}/metrics/percentiles.test.ts | 4 +- .../search/aggs}/metrics/percentiles.ts | 8 +- .../aggs}/metrics/percentiles_get_value.ts | 0 .../search/aggs}/metrics/serial_diff.ts | 4 +- .../aggs}/metrics/sibling_pipeline.test.ts | 0 .../aggs}/metrics/std_deviation.test.ts | 0 .../search/aggs}/metrics/std_deviation.ts | 12 +- .../data/public/search/aggs}/metrics/sum.ts | 6 +- .../search/aggs}/metrics/top_hit.test.ts | 2 +- .../public/search/aggs}/metrics/top_hit.ts | 22 +- .../public/search/aggs}/param_types/agg.ts | 0 .../public/search/aggs}/param_types/base.ts | 6 +- .../search/aggs}/param_types/field.test.ts | 2 +- .../public/search/aggs}/param_types/field.ts | 27 ++- .../param_types/filter/field_filters.test.ts | 2 +- .../aggs}/param_types/filter/field_filters.ts | 0 .../search/aggs}/param_types/filter/index.ts | 0 .../public/search/aggs}/param_types/index.ts | 0 .../search/aggs}/param_types/json.test.ts | 0 .../public/search/aggs}/param_types/json.ts | 0 .../search/aggs}/param_types/optioned.test.ts | 0 .../search/aggs}/param_types/optioned.ts | 0 .../search/aggs}/param_types/string.test.ts | 0 .../public/search/aggs}/param_types/string.ts | 0 .../data/public/search/aggs}/schemas.ts | 4 +- .../data/public/search/aggs/types.ts | 29 +++ .../data/public/search/aggs}/utils.test.tsx | 0 .../data/public/search/aggs}/utils.ts | 4 +- .../data/public/search/expressions/esaggs.ts | 4 +- .../data/public/search/expressions/utils.ts | 6 +- .../core_plugins/data/public/search/index.ts | 1 + .../data/public/search/search_service.ts | 93 ++++++++ .../core_plugins/data/public/search/types.ts | 1 + .../kibana/public/discover/kibana_services.ts | 2 +- .../public/components/agg.test.tsx | 14 +- .../public/components/agg.tsx | 4 +- .../public/components/agg_add.tsx | 4 +- .../public/components/agg_common_props.ts | 12 +- .../public/components/agg_group.test.tsx | 12 +- .../public/components/agg_group.tsx | 8 +- .../components/agg_group_helper.test.ts | 8 +- .../public/components/agg_group_helper.tsx | 14 +- .../public/components/agg_group_state.tsx | 4 +- .../public/components/agg_param_props.ts | 6 +- .../public/components/agg_params.test.tsx | 4 +- .../public/components/agg_params.tsx | 4 +- .../components/agg_params_helper.test.ts | 22 +- .../public/components/agg_params_helper.ts | 18 +- .../public/components/agg_select.tsx | 12 +- .../components/controls/agg_control_props.tsx | 4 +- .../components/controls/agg_utils.test.tsx | 8 +- .../public/components/controls/field.test.tsx | 6 +- .../public/components/controls/field.tsx | 7 +- .../public/components/controls/filter.tsx | 4 +- .../components/controls/metric_agg.test.tsx | 6 +- .../public/components/controls/order_agg.tsx | 8 +- .../public/components/controls/sub_agg.tsx | 4 +- .../public/components/controls/sub_metric.tsx | 4 +- .../public/components/controls/test_utils.ts | 6 +- .../controls/top_aggregate.test.tsx | 18 +- .../components/controls/top_aggregate.tsx | 6 +- .../components/controls/utils/agg_utils.ts | 10 +- .../components/controls/utils/use_handlers.ts | 8 +- .../public/components/sidebar/data_tab.tsx | 8 +- .../components/sidebar/state/actions.ts | 18 +- .../components/sidebar/state/reducers.ts | 4 +- .../public/legacy_imports.ts | 31 ++- .../public/vis_options_props.tsx | 4 +- .../public/vis_type_agg_filter.ts | 12 +- .../vis_type_table/public/legacy_imports.ts | 2 +- .../public/table_vis_controller.test.ts | 4 +- .../options/metrics_axes/index.test.tsx | 12 +- .../components/options/metrics_axes/index.tsx | 4 +- .../vis_type_vislib/public/legacy_imports.ts | 2 +- .../public/embeddable/query_geohash_bounds.ts | 4 +- .../visualizations/public/legacy_imports.ts | 7 +- .../public/legacy/build_pipeline.test.ts | 10 +- .../np_ready/public/legacy/build_pipeline.ts | 12 +- .../public/np_ready/public/vis.d.ts | 4 +- .../public/np_ready/public/vis.js | 2 +- .../agg_response/tabify/_get_columns.ts | 8 +- src/legacy/ui/public/agg_types/index.ts | 78 ++++++- .../ui/public/time_buckets/time_buckets.js | 2 +- .../ui/public/vis/__tests__/_agg_config.js | 4 +- .../config/editor_config_providers.test.ts | 8 +- .../vis/config/editor_config_providers.ts | 6 +- .../loader/pipeline_helpers/utilities.ts | 12 +- .../editor_frame_plugin/plugin.test.tsx | 3 - .../definitions/date_histogram.test.tsx | 34 ++- .../operations/definitions/date_histogram.tsx | 2 +- x-pack/legacy/plugins/rollup/public/legacy.ts | 4 +- .../plugins/rollup/public/legacy_imports.ts | 4 +- .../translations/translations/ja-JP.json | 209 +++++++++--------- .../translations/translations/zh-CN.json | 209 +++++++++--------- .../watcher/public/legacy/time_buckets.js | 2 +- 185 files changed, 1039 insertions(+), 707 deletions(-) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/__tests__/buckets/_terms_other_bucket_helper.js (99%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/agg_config.ts (93%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/agg_configs.ts (98%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/agg_groups.ts (87%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/agg_params.test.ts (97%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/agg_params.ts (97%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/agg_type.test.ts (94%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/agg_type.ts (94%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/agg_types.ts (73%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/buckets/_bucket_agg_type.ts (96%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/buckets/_interval_options.ts (66%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/buckets/_terms_other_bucket_helper.js (99%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/buckets/bucket_agg_types.ts (100%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/buckets/create_filter/date_histogram.test.ts (98%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/buckets/create_filter/date_histogram.ts (94%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/buckets/create_filter/date_range.test.ts (97%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/buckets/create_filter/date_range.ts (94%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/buckets/create_filter/filters.test.ts (100%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/buckets/create_filter/filters.ts (94%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/buckets/create_filter/histogram.test.ts (97%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/buckets/create_filter/histogram.ts (94%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/buckets/create_filter/ip_range.test.ts (97%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/buckets/create_filter/ip_range.ts (95%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/buckets/create_filter/range.test.ts (97%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/buckets/create_filter/range.ts (93%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/buckets/create_filter/terms.test.ts (98%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/buckets/create_filter/terms.ts (95%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/buckets/date_histogram.ts (95%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/buckets/date_range.test.ts (100%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/buckets/date_range.ts (95%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/buckets/filter.ts (93%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/buckets/filters.ts (93%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/buckets/geo_hash.test.ts (98%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/buckets/geo_hash.ts (96%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/buckets/geo_tile.ts (92%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/buckets/histogram.test.ts (100%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/buckets/histogram.ts (96%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/buckets/ip_range.ts (93%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/buckets/lib/cidr_mask.test.ts (100%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/buckets/lib/cidr_mask.ts (95%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/buckets/lib/geo_utils.ts (100%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/buckets/migrate_include_exclude_format.ts (100%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/buckets/range.test.ts (97%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/buckets/range.ts (89%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/buckets/range_key.ts (100%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/buckets/significant_terms.test.ts (96%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/buckets/significant_terms.ts (82%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/buckets/terms.test.ts (100%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/buckets/terms.ts (85%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/filter/agg_type_filters.test.ts (88%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/filter/agg_type_filters.ts (92%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/filter/index.ts (100%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/filter/prop_filter.test.ts (100%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/filter/prop_filter.ts (100%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/index.test.ts (100%) create mode 100644 src/legacy/core_plugins/data/public/search/aggs/index.ts rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/metrics/avg.ts (85%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/metrics/bucket_avg.ts (91%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/metrics/bucket_max.ts (89%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/metrics/bucket_min.ts (89%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/metrics/bucket_sum.ts (89%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/metrics/cardinality.ts (86%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/metrics/count.ts (87%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/metrics/cumulative_sum.ts (88%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/metrics/derivative.ts (89%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/metrics/geo_bounds.ts (84%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/metrics/geo_centroid.ts (84%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/metrics/lib/get_response_agg_config_class.ts (100%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/metrics/lib/make_nested_label.test.ts (100%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/metrics/lib/make_nested_label.ts (100%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/metrics/lib/nested_agg_helpers.ts (100%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/metrics/lib/ordinal_suffix.test.ts (100%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/metrics/lib/ordinal_suffix.ts (100%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/metrics/lib/parent_pipeline_agg_helper.ts (94%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/metrics/lib/parent_pipeline_agg_writer.ts (94%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/metrics/lib/sibling_pipeline_agg_helper.ts (93%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/metrics/lib/sibling_pipeline_agg_writer.ts (100%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/metrics/max.ts (86%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/metrics/median.test.ts (95%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/metrics/median.ts (88%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/metrics/metric_agg_type.ts (92%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/metrics/metric_agg_types.ts (100%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/metrics/min.ts (86%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/metrics/moving_avg.ts (92%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/metrics/parent_pipeline.test.ts (100%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/metrics/percentile_ranks.test.ts (96%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/metrics/percentile_ranks.ts (89%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/metrics/percentiles.test.ts (95%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/metrics/percentiles.ts (88%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/metrics/percentiles_get_value.ts (100%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/metrics/serial_diff.ts (89%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/metrics/sibling_pipeline.test.ts (100%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/metrics/std_deviation.test.ts (100%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/metrics/std_deviation.ts (85%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/metrics/sum.ts (86%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/metrics/top_hit.test.ts (99%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/metrics/top_hit.ts (87%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/param_types/agg.ts (100%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/param_types/base.ts (94%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/param_types/field.test.ts (98%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/param_types/field.ts (83%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/param_types/filter/field_filters.test.ts (97%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/param_types/filter/field_filters.ts (100%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/param_types/filter/index.ts (100%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/param_types/index.ts (100%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/param_types/json.test.ts (100%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/param_types/json.ts (100%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/param_types/optioned.test.ts (100%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/param_types/optioned.ts (100%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/param_types/string.test.ts (100%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/param_types/string.ts (100%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/schemas.ts (98%) create mode 100644 src/legacy/core_plugins/data/public/search/aggs/types.ts rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/utils.test.tsx (100%) rename src/legacy/{ui/public/agg_types => core_plugins/data/public/search/aggs}/utils.ts (92%) create mode 100644 src/legacy/core_plugins/data/public/search/search_service.ts diff --git a/src/legacy/core_plugins/data/public/actions/filters/brush_event.test.js b/src/legacy/core_plugins/data/public/actions/filters/brush_event.test.js index a6fe58503cd02..743f6caee4edd 100644 --- a/src/legacy/core_plugins/data/public/actions/filters/brush_event.test.js +++ b/src/legacy/core_plugins/data/public/actions/filters/brush_event.test.js @@ -21,7 +21,7 @@ import _ from 'lodash'; import moment from 'moment'; import expect from '@kbn/expect'; -jest.mock('../../../../../ui/public/agg_types/agg_configs', () => ({ +jest.mock('../../search/aggs', () => ({ AggConfigs: function AggConfigs() { return { createAggConfig: ({ params }) => ({ diff --git a/src/legacy/core_plugins/data/public/index.ts b/src/legacy/core_plugins/data/public/index.ts index 7fe487667f94e..50120292a627a 100644 --- a/src/legacy/core_plugins/data/public/index.ts +++ b/src/legacy/core_plugins/data/public/index.ts @@ -18,7 +18,7 @@ */ // /// Define plugin function -import { DataPlugin as Plugin, DataStart } from './plugin'; +import { DataPlugin as Plugin } from './plugin'; export function plugin() { return new Plugin(); @@ -27,14 +27,58 @@ export function plugin() { // /// Export types & static code /** @public types */ -export { DataStart }; +export { DataSetup, DataStart } from './plugin'; export { SavedQueryAttributes, SavedQuery, SavedQueryTimeFilter, } from '../../../../plugins/data/public'; +export { + // agg_types + AggParam, + AggParamOption, + DateRangeKey, + IAggConfig, + IAggConfigs, + IAggType, + IFieldParamType, + IMetricAggType, + IpRangeKey, + ISchemas, + OptionedParamEditorProps, + OptionedValueProp, +} from './search/types'; /** @public static code */ export * from '../common'; export { FilterStateManager } from './filter/filter_manager'; -export { getRequestInspectorStats, getResponseInspectorStats } from './search'; +export { + // agg_types TODO need to group these under a namespace or prefix + AggParamType, + AggTypeFilters, // TODO convert to interface + aggTypeFilters, + AggTypeFieldFilters, // TODO convert to interface + AggGroupNames, + aggGroupNamesMap, + BUCKET_TYPES, + CidrMask, + convertDateRangeToString, + convertIPRangeToString, + intervalOptions, // only used in Discover + isDateHistogramBucketAggConfig, + isStringType, + isType, + isValidInterval, + isValidJson, + METRIC_TYPES, + OptionedParamType, + parentPipelineType, + propFilter, + Schema, + Schemas, + siblingPipelineType, + termsAggFilter, + // search_source + getRequestInspectorStats, + getResponseInspectorStats, +} from './search'; diff --git a/src/legacy/core_plugins/data/public/plugin.ts b/src/legacy/core_plugins/data/public/plugin.ts index da35366cdff31..ebc470555d87c 100644 --- a/src/legacy/core_plugins/data/public/plugin.ts +++ b/src/legacy/core_plugins/data/public/plugin.ts @@ -45,6 +45,8 @@ import { } from '../../../../plugins/embeddable/public/lib/triggers'; import { IUiActionsSetup, IUiActionsStart } from '../../../../plugins/ui_actions/public'; +import { SearchSetup, SearchStart, SearchService } from './search/search_service'; + export interface DataPluginSetupDependencies { data: DataPublicPluginSetup; expressions: ExpressionsSetup; @@ -56,12 +58,23 @@ export interface DataPluginStartDependencies { uiActions: IUiActionsStart; } +/** + * Interface for this plugin's returned `setup` contract. + * + * @public + */ +export interface DataSetup { + search: SearchSetup; +} + /** * Interface for this plugin's returned `start` contract. * * @public */ -export interface DataStart {} // eslint-disable-line @typescript-eslint/no-empty-interface +export interface DataStart { + search: SearchStart; +} /** * Data Plugin - public @@ -76,7 +89,10 @@ export interface DataStart {} // eslint-disable-line @typescript-eslint/no-empty */ export class DataPlugin - implements Plugin { + implements + Plugin { + private readonly search = new SearchService(); + public setup(core: CoreSetup, { data, uiActions }: DataPluginSetupDependencies) { setInjectedMetadata(core.injectedMetadata); @@ -89,6 +105,10 @@ export class DataPlugin uiActions.registerAction( valueClickAction(data.query.filterManager, data.query.timefilter.timefilter) ); + + return { + search: this.search.setup(core), + }; } public start(core: CoreStart, { data, uiActions }: DataPluginStartDependencies): DataStart { @@ -102,7 +122,9 @@ export class DataPlugin uiActions.attachAction(SELECT_RANGE_TRIGGER, SELECT_RANGE_ACTION); uiActions.attachAction(VALUE_CLICK_TRIGGER, VALUE_CLICK_ACTION); - return {}; + return { + search: this.search.start(core), + }; } public stop() {} diff --git a/src/legacy/ui/public/agg_types/__tests__/buckets/_terms_other_bucket_helper.js b/src/legacy/core_plugins/data/public/search/aggs/__tests__/buckets/_terms_other_bucket_helper.js similarity index 99% rename from src/legacy/ui/public/agg_types/__tests__/buckets/_terms_other_bucket_helper.js rename to src/legacy/core_plugins/data/public/search/aggs/__tests__/buckets/_terms_other_bucket_helper.js index acf932c1fb451..247290731df57 100644 --- a/src/legacy/ui/public/agg_types/__tests__/buckets/_terms_other_bucket_helper.js +++ b/src/legacy/core_plugins/data/public/search/aggs/__tests__/buckets/_terms_other_bucket_helper.js @@ -24,7 +24,7 @@ import { mergeOtherBucketAggResponse, updateMissingBucket, } from '../../buckets/_terms_other_bucket_helper'; -import { Vis } from '../../../../../core_plugins/visualizations/public'; +import { Vis } from '../../../../../../../core_plugins/visualizations/public'; import FixturesStubbedLogstashIndexPatternProvider from 'fixtures/stubbed_logstash_index_pattern'; const visConfigSingleTerm = { diff --git a/src/legacy/ui/public/agg_types/agg_config.ts b/src/legacy/core_plugins/data/public/search/aggs/agg_config.ts similarity index 93% rename from src/legacy/ui/public/agg_types/agg_config.ts rename to src/legacy/core_plugins/data/public/search/aggs/agg_config.ts index 17a8b14b57d02..769347a26c34c 100644 --- a/src/legacy/ui/public/agg_types/agg_config.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/agg_config.ts @@ -27,17 +27,17 @@ import _ from 'lodash'; import { i18n } from '@kbn/i18n'; import { npStart } from 'ui/new_platform'; -import { AggType } from './agg_type'; +import { IAggType } from './agg_type'; import { AggGroupNames } from './agg_groups'; import { writeParams } from './agg_params'; -import { AggConfigs } from './agg_configs'; +import { IAggConfigs } from './agg_configs'; import { Schema } from './schemas'; import { ISearchSource, FetchOptions, fieldFormats, KBN_FIELD_TYPES, -} from '../../../../plugins/data/public'; +} from '../../../../../../plugins/data/public'; export interface AggConfigOptions { enabled: boolean; @@ -60,13 +60,13 @@ const unknownSchema: Schema = { group: AggGroupNames.Metrics, }; -const getTypeFromRegistry = (type: string): AggType => { +const getTypeFromRegistry = (type: string): IAggType => { // We need to inline require here, since we're having a cyclic dependency // from somewhere inside agg_types back to AggConfig. - const aggTypes = require('./agg_types').aggTypes; + const aggTypes = require('../aggs').aggTypes; const registeredType = - aggTypes.metrics.find((agg: AggType) => agg.name === type) || - aggTypes.buckets.find((agg: AggType) => agg.name === type); + aggTypes.metrics.find((agg: IAggType) => agg.name === type) || + aggTypes.buckets.find((agg: IAggType) => agg.name === type); if (!registeredType) { throw new Error('unknown type'); @@ -85,6 +85,9 @@ const getSchemaFromRegistry = (schemas: any, schema: string): Schema => { return registeredSchema; }; +// TODO need to make a more explicit interface for this +export type IAggConfig = AggConfig; + export class AggConfig { /** * Ensure that all of the objects in the list have ids, the objects @@ -122,19 +125,19 @@ export class AggConfig { ); } - public aggConfigs: AggConfigs; + public aggConfigs: IAggConfigs; public id: string; public enabled: boolean; public params: any; - public parent?: AggConfigs; + public parent?: IAggConfigs; public brandNew?: boolean; private __schema: Schema; - private __type: AggType; + private __type: IAggType; private __typeDecorations: any; private subAggs: AggConfig[] = []; - constructor(aggConfigs: AggConfigs, opts: AggConfigOptions) { + constructor(aggConfigs: IAggConfigs, opts: AggConfigOptions) { this.aggConfigs = aggConfigs; this.id = String(opts.id || AggConfig.nextId(aggConfigs.aggs as any)); this.enabled = typeof opts.enabled === 'boolean' ? opts.enabled : true; @@ -207,7 +210,7 @@ export class AggConfig { return _.get(this.params, key); } - write(aggs?: AggConfigs) { + write(aggs?: IAggConfigs) { return writeParams(this.type.params, this, aggs); } @@ -262,7 +265,7 @@ export class AggConfig { * @return {void|Object} - if the config has a dsl representation, it is * returned, else undefined is returned */ - toDsl(aggConfigs?: AggConfigs) { + toDsl(aggConfigs?: IAggConfigs) { if (this.type.hasNoDsl) return; const output = this.write(aggConfigs) as any; @@ -360,7 +363,7 @@ export class AggConfig { if (!this.type) return ''; return percentageMode - ? i18n.translate('common.ui.vis.aggConfig.percentageOfLabel', { + ? i18n.translate('data.search.aggs.percentageOfLabel', { defaultMessage: 'Percentage of {label}', values: { label: this.type.makeLabel(this) }, }) @@ -448,7 +451,7 @@ export class AggConfig { }); } - public setType(type: string | AggType) { + public setType(type: string | IAggType) { this.type = typeof type === 'string' ? getTypeFromRegistry(type) : type; } diff --git a/src/legacy/ui/public/agg_types/agg_configs.ts b/src/legacy/core_plugins/data/public/search/aggs/agg_configs.ts similarity index 98% rename from src/legacy/ui/public/agg_types/agg_configs.ts rename to src/legacy/core_plugins/data/public/search/aggs/agg_configs.ts index 47e2222abe1e8..7e7e4944b00da 100644 --- a/src/legacy/ui/public/agg_types/agg_configs.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/agg_configs.ts @@ -35,7 +35,7 @@ import { ISearchSource, FetchOptions, TimeRange, -} from '../../../../plugins/data/public'; +} from '../../../../../../plugins/data/public'; type Schemas = Record; @@ -55,6 +55,9 @@ function parseParentAggs(dslLvlCursor: any, dsl: any) { } } +// TODO need to make a more explicit interface for this +export type IAggConfigs = AggConfigs; + export class AggConfigs { public indexPattern: IndexPattern; public schemas: any; diff --git a/src/legacy/ui/public/agg_types/agg_groups.ts b/src/legacy/core_plugins/data/public/search/aggs/agg_groups.ts similarity index 87% rename from src/legacy/ui/public/agg_types/agg_groups.ts rename to src/legacy/core_plugins/data/public/search/aggs/agg_groups.ts index d08e875bf213e..d21f5c8968840 100644 --- a/src/legacy/ui/public/agg_types/agg_groups.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/agg_groups.ts @@ -28,10 +28,10 @@ export const AggGroupNames = Object.freeze({ export type AggGroupNames = $Values; export const aggGroupNamesMap = () => ({ - [AggGroupNames.Metrics]: i18n.translate('common.ui.aggTypes.aggGroups.metricsText', { + [AggGroupNames.Metrics]: i18n.translate('data.search.aggs.aggGroups.metricsText', { defaultMessage: 'Metrics', }), - [AggGroupNames.Buckets]: i18n.translate('common.ui.aggTypes.aggGroups.bucketsText', { + [AggGroupNames.Buckets]: i18n.translate('data.search.aggs.aggGroups.bucketsText', { defaultMessage: 'Buckets', }), }); diff --git a/src/legacy/ui/public/agg_types/agg_params.test.ts b/src/legacy/core_plugins/data/public/search/aggs/agg_params.test.ts similarity index 97% rename from src/legacy/ui/public/agg_types/agg_params.test.ts rename to src/legacy/core_plugins/data/public/search/aggs/agg_params.test.ts index 25e62e06d52d7..30ab272537dad 100644 --- a/src/legacy/ui/public/agg_types/agg_params.test.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/agg_params.test.ts @@ -21,7 +21,7 @@ import { initParams } from './agg_params'; import { BaseParamType } from './param_types/base'; import { FieldParamType } from './param_types/field'; import { OptionedParamType } from './param_types/optioned'; -import { AggParamType } from '../agg_types/param_types/agg'; +import { AggParamType } from '../aggs/param_types/agg'; jest.mock('ui/new_platform'); diff --git a/src/legacy/ui/public/agg_types/agg_params.ts b/src/legacy/core_plugins/data/public/search/aggs/agg_params.ts similarity index 97% rename from src/legacy/ui/public/agg_types/agg_params.ts rename to src/legacy/core_plugins/data/public/search/aggs/agg_params.ts index 262a57f4a5aa3..34727ff4614b9 100644 --- a/src/legacy/ui/public/agg_types/agg_params.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/agg_params.ts @@ -25,7 +25,7 @@ import { JsonParamType } from './param_types/json'; import { BaseParamType } from './param_types/base'; import { AggConfig } from './agg_config'; -import { AggConfigs } from './agg_configs'; +import { IAggConfigs } from './agg_configs'; const paramTypeMap = { field: FieldParamType, @@ -73,7 +73,7 @@ export const writeParams = < >( params: Array> = [], aggConfig: TAggConfig, - aggs?: AggConfigs, + aggs?: IAggConfigs, locals?: Record ) => { const output = { params: {} as Record }; diff --git a/src/legacy/ui/public/agg_types/agg_type.test.ts b/src/legacy/core_plugins/data/public/search/aggs/agg_type.test.ts similarity index 94% rename from src/legacy/ui/public/agg_types/agg_type.test.ts rename to src/legacy/core_plugins/data/public/search/aggs/agg_type.test.ts index 9b34910e81e88..6d4c2d1317f50 100644 --- a/src/legacy/ui/public/agg_types/agg_type.test.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/agg_type.test.ts @@ -18,7 +18,7 @@ */ import { AggType, AggTypeConfig } from './agg_type'; -import { AggConfig } from './agg_config'; +import { IAggConfig } from './agg_config'; import { npStart } from 'ui/new_platform'; jest.mock('ui/new_platform'); @@ -48,7 +48,7 @@ describe('AggType Class', () => { describe('makeLabel', () => { it('makes a function when the makeLabel config is not specified', () => { const makeLabel = () => 'label'; - const aggConfig = {} as AggConfig; + const aggConfig = {} as IAggConfig; const config: AggTypeConfig = { name: 'name', title: 'title', @@ -64,7 +64,7 @@ describe('AggType Class', () => { describe('getResponseAggs/getRequestAggs', () => { it('copies the value', () => { - const testConfig = (aggConfig: AggConfig) => [aggConfig]; + const testConfig = (aggConfig: IAggConfig) => [aggConfig]; const aggType = new AggType({ name: 'name', @@ -78,7 +78,7 @@ describe('AggType Class', () => { }); it('defaults to noop', () => { - const aggConfig = {} as AggConfig; + const aggConfig = {} as IAggConfig; const aggType = new AggType({ name: 'name', title: 'title', @@ -130,13 +130,13 @@ describe('AggType Class', () => { }); describe('getFormat', function() { - let aggConfig: AggConfig; + let aggConfig: IAggConfig; let field: any; beforeEach(() => { aggConfig = ({ getField: jest.fn(() => field), - } as unknown) as AggConfig; + } as unknown) as IAggConfig; }); it('returns the formatter for the aggConfig', () => { diff --git a/src/legacy/ui/public/agg_types/agg_type.ts b/src/legacy/core_plugins/data/public/search/aggs/agg_type.ts similarity index 94% rename from src/legacy/ui/public/agg_types/agg_type.ts rename to src/legacy/core_plugins/data/public/search/aggs/agg_type.ts index 7ec688277b9c4..56299839d0a6d 100644 --- a/src/legacy/ui/public/agg_types/agg_type.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/agg_type.ts @@ -23,11 +23,15 @@ import { npStart } from 'ui/new_platform'; import { initParams } from './agg_params'; import { AggConfig } from './agg_config'; -import { AggConfigs } from './agg_configs'; -import { Adapters } from '../../../../plugins/inspector/public'; +import { IAggConfigs } from './agg_configs'; +import { Adapters } from '../../../../../../plugins/inspector/public'; import { BaseParamType } from './param_types/base'; -import { AggParamType } from '../agg_types/param_types/agg'; -import { KBN_FIELD_TYPES, fieldFormats, ISearchSource } from '../../../../plugins/data/public'; +import { AggParamType } from './param_types/agg'; +import { + KBN_FIELD_TYPES, + fieldFormats, + ISearchSource, +} from '../../../../../../plugins/data/public'; export interface AggTypeConfig< TAggConfig extends AggConfig = AggConfig, @@ -48,7 +52,7 @@ export interface AggTypeConfig< decorateAggConfig?: () => any; postFlightRequest?: ( resp: any, - aggConfigs: AggConfigs, + aggConfigs: IAggConfigs, aggConfig: TAggConfig, searchSource: ISearchSource, inspectorAdapters: Adapters, @@ -66,6 +70,9 @@ const getFormat = (agg: AggConfig) => { return field ? field.format : fieldFormatsService.getDefaultInstance(KBN_FIELD_TYPES.STRING); }; +// TODO need to make a more explicit interface for this +export type IAggType = AggType; + export class AggType< TAggConfig extends AggConfig = AggConfig, TParam extends AggParamType = AggParamType @@ -178,7 +185,7 @@ export class AggType< */ postFlightRequest: ( resp: any, - aggConfigs: AggConfigs, + aggConfigs: IAggConfigs, aggConfig: TAggConfig, searchSource: ISearchSource, inspectorAdapters: Adapters, @@ -239,7 +246,7 @@ export class AggType< if (config.customLabels !== false) { params.push({ name: 'customLabel', - displayName: i18n.translate('common.ui.aggTypes.string.customLabel', { + displayName: i18n.translate('data.search.aggs.string.customLabel', { defaultMessage: 'Custom label', }), type: 'string', diff --git a/src/legacy/ui/public/agg_types/agg_types.ts b/src/legacy/core_plugins/data/public/search/aggs/agg_types.ts similarity index 73% rename from src/legacy/ui/public/agg_types/agg_types.ts rename to src/legacy/core_plugins/data/public/search/aggs/agg_types.ts index 1b05f5926ebfc..c16eb06eeb116 100644 --- a/src/legacy/ui/public/agg_types/agg_types.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/agg_types.ts @@ -50,8 +50,6 @@ import { bucketAvgMetricAgg } from './metrics/bucket_avg'; import { bucketMinMetricAgg } from './metrics/bucket_min'; import { bucketMaxMetricAgg } from './metrics/bucket_max'; -export { AggType } from './agg_type'; - export const aggTypes = { metrics: [ countMetricAgg, @@ -90,3 +88,27 @@ export const aggTypes = { geoTileBucketAgg, ], }; + +export { AggType } from './agg_type'; +export { AggConfig } from './agg_config'; +export { AggConfigs } from './agg_configs'; +export { FieldParamType } from './param_types'; +export { aggTypeFieldFilters } from './param_types/filter'; +export { parentPipelineAggHelper } from './metrics/lib/parent_pipeline_agg_helper'; + +// static code +export { AggParamType } from './param_types/agg'; +export { AggGroupNames, aggGroupNamesMap } from './agg_groups'; +export { intervalOptions } from './buckets/_interval_options'; // only used in Discover +export { isDateHistogramBucketAggConfig, setBounds } from './buckets/date_histogram'; +export { termsAggFilter } from './buckets/terms'; +export { isType, isStringType } from './buckets/migrate_include_exclude_format'; +export { CidrMask } from './buckets/lib/cidr_mask'; +export { convertDateRangeToString } from './buckets/date_range'; +export { convertIPRangeToString } from './buckets/ip_range'; +export { aggTypeFilters, propFilter } from './filter'; +export { OptionedParamType } from './param_types/optioned'; +export { isValidJson, isValidInterval } from './utils'; +export { BUCKET_TYPES } from './buckets/bucket_agg_types'; +export { METRIC_TYPES } from './metrics/metric_agg_types'; +export { ISchemas, Schema, Schemas } from './schemas'; diff --git a/src/legacy/ui/public/agg_types/buckets/_bucket_agg_type.ts b/src/legacy/core_plugins/data/public/search/aggs/buckets/_bucket_agg_type.ts similarity index 96% rename from src/legacy/ui/public/agg_types/buckets/_bucket_agg_type.ts rename to src/legacy/core_plugins/data/public/search/aggs/buckets/_bucket_agg_type.ts index 9b7c97a8f11b6..546d054c5af97 100644 --- a/src/legacy/ui/public/agg_types/buckets/_bucket_agg_type.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/buckets/_bucket_agg_type.ts @@ -18,7 +18,7 @@ */ import { AggConfig } from '../agg_config'; -import { KBN_FIELD_TYPES } from '../../../../../plugins/data/public'; +import { KBN_FIELD_TYPES } from '../../../../../../../plugins/data/public'; import { AggType, AggTypeConfig } from '../agg_type'; import { AggParamType } from '../param_types/agg'; diff --git a/src/legacy/ui/public/agg_types/buckets/_interval_options.ts b/src/legacy/core_plugins/data/public/search/aggs/buckets/_interval_options.ts similarity index 66% rename from src/legacy/ui/public/agg_types/buckets/_interval_options.ts rename to src/legacy/core_plugins/data/public/search/aggs/buckets/_interval_options.ts index 01d0abb7a366c..e196687607d19 100644 --- a/src/legacy/ui/public/agg_types/buckets/_interval_options.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/buckets/_interval_options.ts @@ -21,7 +21,7 @@ import { IBucketAggConfig } from './_bucket_agg_type'; export const intervalOptions = [ { - display: i18n.translate('common.ui.aggTypes.buckets.intervalOptions.autoDisplayName', { + display: i18n.translate('data.search.aggs.buckets.intervalOptions.autoDisplayName', { defaultMessage: 'Auto', }), val: 'auto', @@ -32,49 +32,49 @@ export const intervalOptions = [ }, }, { - display: i18n.translate('common.ui.aggTypes.buckets.intervalOptions.millisecondDisplayName', { + display: i18n.translate('data.search.aggs.buckets.intervalOptions.millisecondDisplayName', { defaultMessage: 'Millisecond', }), val: 'ms', }, { - display: i18n.translate('common.ui.aggTypes.buckets.intervalOptions.secondDisplayName', { + display: i18n.translate('data.search.aggs.buckets.intervalOptions.secondDisplayName', { defaultMessage: 'Second', }), val: 's', }, { - display: i18n.translate('common.ui.aggTypes.buckets.intervalOptions.minuteDisplayName', { + display: i18n.translate('data.search.aggs.buckets.intervalOptions.minuteDisplayName', { defaultMessage: 'Minute', }), val: 'm', }, { - display: i18n.translate('common.ui.aggTypes.buckets.intervalOptions.hourlyDisplayName', { + display: i18n.translate('data.search.aggs.buckets.intervalOptions.hourlyDisplayName', { defaultMessage: 'Hourly', }), val: 'h', }, { - display: i18n.translate('common.ui.aggTypes.buckets.intervalOptions.dailyDisplayName', { + display: i18n.translate('data.search.aggs.buckets.intervalOptions.dailyDisplayName', { defaultMessage: 'Daily', }), val: 'd', }, { - display: i18n.translate('common.ui.aggTypes.buckets.intervalOptions.weeklyDisplayName', { + display: i18n.translate('data.search.aggs.buckets.intervalOptions.weeklyDisplayName', { defaultMessage: 'Weekly', }), val: 'w', }, { - display: i18n.translate('common.ui.aggTypes.buckets.intervalOptions.monthlyDisplayName', { + display: i18n.translate('data.search.aggs.buckets.intervalOptions.monthlyDisplayName', { defaultMessage: 'Monthly', }), val: 'M', }, { - display: i18n.translate('common.ui.aggTypes.buckets.intervalOptions.yearlyDisplayName', { + display: i18n.translate('data.search.aggs.buckets.intervalOptions.yearlyDisplayName', { defaultMessage: 'Yearly', }), val: 'y', diff --git a/src/legacy/ui/public/agg_types/buckets/_terms_other_bucket_helper.js b/src/legacy/core_plugins/data/public/search/aggs/buckets/_terms_other_bucket_helper.js similarity index 99% rename from src/legacy/ui/public/agg_types/buckets/_terms_other_bucket_helper.js rename to src/legacy/core_plugins/data/public/search/aggs/buckets/_terms_other_bucket_helper.js index c8580183756f4..ddab360161744 100644 --- a/src/legacy/ui/public/agg_types/buckets/_terms_other_bucket_helper.js +++ b/src/legacy/core_plugins/data/public/search/aggs/buckets/_terms_other_bucket_helper.js @@ -18,7 +18,7 @@ */ import _ from 'lodash'; -import { esFilters, esQuery } from '../../../../../plugins/data/public'; +import { esFilters, esQuery } from '../../../../../../../plugins/data/public'; import { AggGroupNames } from '../agg_groups'; /** diff --git a/src/legacy/ui/public/agg_types/buckets/bucket_agg_types.ts b/src/legacy/core_plugins/data/public/search/aggs/buckets/bucket_agg_types.ts similarity index 100% rename from src/legacy/ui/public/agg_types/buckets/bucket_agg_types.ts rename to src/legacy/core_plugins/data/public/search/aggs/buckets/bucket_agg_types.ts diff --git a/src/legacy/ui/public/agg_types/buckets/create_filter/date_histogram.test.ts b/src/legacy/core_plugins/data/public/search/aggs/buckets/create_filter/date_histogram.test.ts similarity index 98% rename from src/legacy/ui/public/agg_types/buckets/create_filter/date_histogram.test.ts rename to src/legacy/core_plugins/data/public/search/aggs/buckets/create_filter/date_histogram.test.ts index 9426df7d34c29..e212132257ef6 100644 --- a/src/legacy/ui/public/agg_types/buckets/create_filter/date_histogram.test.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/buckets/create_filter/date_histogram.test.ts @@ -23,7 +23,7 @@ import { intervalOptions } from '../_interval_options'; import { AggConfigs } from '../../agg_configs'; import { IBucketDateHistogramAggConfig } from '../date_histogram'; import { BUCKET_TYPES } from '../bucket_agg_types'; -import { esFilters } from '../../../../../../plugins/data/public'; +import { esFilters } from '../../../../../../../../plugins/data/public'; jest.mock('ui/new_platform'); diff --git a/src/legacy/ui/public/agg_types/buckets/create_filter/date_histogram.ts b/src/legacy/core_plugins/data/public/search/aggs/buckets/create_filter/date_histogram.ts similarity index 94% rename from src/legacy/ui/public/agg_types/buckets/create_filter/date_histogram.ts rename to src/legacy/core_plugins/data/public/search/aggs/buckets/create_filter/date_histogram.ts index f91a92eab1c33..e634b5daf0ac3 100644 --- a/src/legacy/ui/public/agg_types/buckets/create_filter/date_histogram.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/buckets/create_filter/date_histogram.ts @@ -19,7 +19,7 @@ import moment from 'moment'; import { IBucketDateHistogramAggConfig } from '../date_histogram'; -import { esFilters } from '../../../../../../plugins/data/public'; +import { esFilters } from '../../../../../../../../plugins/data/public'; export const createFilterDateHistogram = ( agg: IBucketDateHistogramAggConfig, diff --git a/src/legacy/ui/public/agg_types/buckets/create_filter/date_range.test.ts b/src/legacy/core_plugins/data/public/search/aggs/buckets/create_filter/date_range.test.ts similarity index 97% rename from src/legacy/ui/public/agg_types/buckets/create_filter/date_range.test.ts rename to src/legacy/core_plugins/data/public/search/aggs/buckets/create_filter/date_range.test.ts index 9c2c4f72704f4..e224253a6e314 100644 --- a/src/legacy/ui/public/agg_types/buckets/create_filter/date_range.test.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/buckets/create_filter/date_range.test.ts @@ -19,7 +19,7 @@ import moment from 'moment'; import { createFilterDateRange } from './date_range'; -import { fieldFormats } from '../../../../../../plugins/data/public'; +import { fieldFormats } from '../../../../../../../../plugins/data/public'; import { AggConfigs } from '../../agg_configs'; import { BUCKET_TYPES } from '../bucket_agg_types'; import { IBucketAggConfig } from '../_bucket_agg_type'; diff --git a/src/legacy/ui/public/agg_types/buckets/create_filter/date_range.ts b/src/legacy/core_plugins/data/public/search/aggs/buckets/create_filter/date_range.ts similarity index 94% rename from src/legacy/ui/public/agg_types/buckets/create_filter/date_range.ts rename to src/legacy/core_plugins/data/public/search/aggs/buckets/create_filter/date_range.ts index 01689d954a072..f7f2cfdb7bb61 100644 --- a/src/legacy/ui/public/agg_types/buckets/create_filter/date_range.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/buckets/create_filter/date_range.ts @@ -20,7 +20,7 @@ import moment from 'moment'; import { IBucketAggConfig } from '../_bucket_agg_type'; import { DateRangeKey } from '../date_range'; -import { esFilters } from '../../../../../../plugins/data/public'; +import { esFilters } from '../../../../../../../../plugins/data/public'; export const createFilterDateRange = (agg: IBucketAggConfig, { from, to }: DateRangeKey) => { const filter: esFilters.RangeFilterParams = {}; diff --git a/src/legacy/ui/public/agg_types/buckets/create_filter/filters.test.ts b/src/legacy/core_plugins/data/public/search/aggs/buckets/create_filter/filters.test.ts similarity index 100% rename from src/legacy/ui/public/agg_types/buckets/create_filter/filters.test.ts rename to src/legacy/core_plugins/data/public/search/aggs/buckets/create_filter/filters.test.ts diff --git a/src/legacy/ui/public/agg_types/buckets/create_filter/filters.ts b/src/legacy/core_plugins/data/public/search/aggs/buckets/create_filter/filters.ts similarity index 94% rename from src/legacy/ui/public/agg_types/buckets/create_filter/filters.ts rename to src/legacy/core_plugins/data/public/search/aggs/buckets/create_filter/filters.ts index 6b614514580b6..715f6895374e6 100644 --- a/src/legacy/ui/public/agg_types/buckets/create_filter/filters.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/buckets/create_filter/filters.ts @@ -19,7 +19,7 @@ import { get } from 'lodash'; import { IBucketAggConfig } from '../_bucket_agg_type'; -import { esFilters } from '../../../../../../plugins/data/public'; +import { esFilters } from '../../../../../../../../plugins/data/public'; export const createFilterFilters = (aggConfig: IBucketAggConfig, key: string) => { // have the aggConfig write agg dsl params diff --git a/src/legacy/ui/public/agg_types/buckets/create_filter/histogram.test.ts b/src/legacy/core_plugins/data/public/search/aggs/buckets/create_filter/histogram.test.ts similarity index 97% rename from src/legacy/ui/public/agg_types/buckets/create_filter/histogram.test.ts rename to src/legacy/core_plugins/data/public/search/aggs/buckets/create_filter/histogram.test.ts index ef49636f9e0c1..1a78967261fa6 100644 --- a/src/legacy/ui/public/agg_types/buckets/create_filter/histogram.test.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/buckets/create_filter/histogram.test.ts @@ -20,7 +20,7 @@ import { createFilterHistogram } from './histogram'; import { AggConfigs } from '../../agg_configs'; import { BUCKET_TYPES } from '../bucket_agg_types'; import { IBucketAggConfig } from '../_bucket_agg_type'; -import { fieldFormats } from '../../../../../../plugins/data/public'; +import { fieldFormats } from '../../../../../../../../plugins/data/public'; jest.mock('ui/new_platform'); diff --git a/src/legacy/ui/public/agg_types/buckets/create_filter/histogram.ts b/src/legacy/core_plugins/data/public/search/aggs/buckets/create_filter/histogram.ts similarity index 94% rename from src/legacy/ui/public/agg_types/buckets/create_filter/histogram.ts rename to src/legacy/core_plugins/data/public/search/aggs/buckets/create_filter/histogram.ts index fc587fa9ecdb6..820f3de5ae9f0 100644 --- a/src/legacy/ui/public/agg_types/buckets/create_filter/histogram.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/buckets/create_filter/histogram.ts @@ -18,7 +18,7 @@ */ import { IBucketAggConfig } from '../_bucket_agg_type'; -import { esFilters } from '../../../../../../plugins/data/public'; +import { esFilters } from '../../../../../../../../plugins/data/public'; export const createFilterHistogram = (aggConfig: IBucketAggConfig, key: string) => { const value = parseInt(key, 10); diff --git a/src/legacy/ui/public/agg_types/buckets/create_filter/ip_range.test.ts b/src/legacy/core_plugins/data/public/search/aggs/buckets/create_filter/ip_range.test.ts similarity index 97% rename from src/legacy/ui/public/agg_types/buckets/create_filter/ip_range.test.ts rename to src/legacy/core_plugins/data/public/search/aggs/buckets/create_filter/ip_range.test.ts index a9eca3bbb7a56..e92ba5cb2852a 100644 --- a/src/legacy/ui/public/agg_types/buckets/create_filter/ip_range.test.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/buckets/create_filter/ip_range.test.ts @@ -19,7 +19,7 @@ import { createFilterIpRange } from './ip_range'; import { AggConfigs } from '../../agg_configs'; -import { fieldFormats } from '../../../../../../plugins/data/public'; +import { fieldFormats } from '../../../../../../../../plugins/data/public'; import { BUCKET_TYPES } from '../bucket_agg_types'; import { IBucketAggConfig } from '../_bucket_agg_type'; diff --git a/src/legacy/ui/public/agg_types/buckets/create_filter/ip_range.ts b/src/legacy/core_plugins/data/public/search/aggs/buckets/create_filter/ip_range.ts similarity index 95% rename from src/legacy/ui/public/agg_types/buckets/create_filter/ip_range.ts rename to src/legacy/core_plugins/data/public/search/aggs/buckets/create_filter/ip_range.ts index a513b8c782739..d78f4579cd713 100644 --- a/src/legacy/ui/public/agg_types/buckets/create_filter/ip_range.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/buckets/create_filter/ip_range.ts @@ -20,7 +20,7 @@ import { CidrMask } from '../lib/cidr_mask'; import { IBucketAggConfig } from '../_bucket_agg_type'; import { IpRangeKey } from '../ip_range'; -import { esFilters } from '../../../../../../plugins/data/public'; +import { esFilters } from '../../../../../../../../plugins/data/public'; export const createFilterIpRange = (aggConfig: IBucketAggConfig, key: IpRangeKey) => { let range: esFilters.RangeFilterParams; diff --git a/src/legacy/ui/public/agg_types/buckets/create_filter/range.test.ts b/src/legacy/core_plugins/data/public/search/aggs/buckets/create_filter/range.test.ts similarity index 97% rename from src/legacy/ui/public/agg_types/buckets/create_filter/range.test.ts rename to src/legacy/core_plugins/data/public/search/aggs/buckets/create_filter/range.test.ts index 720e952c28821..2f74f23721813 100644 --- a/src/legacy/ui/public/agg_types/buckets/create_filter/range.test.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/buckets/create_filter/range.test.ts @@ -18,7 +18,7 @@ */ import { createFilterRange } from './range'; -import { fieldFormats } from '../../../../../../plugins/data/public'; +import { fieldFormats } from '../../../../../../../../plugins/data/public'; import { AggConfigs } from '../../agg_configs'; import { BUCKET_TYPES } from '../bucket_agg_types'; import { IBucketAggConfig } from '../_bucket_agg_type'; diff --git a/src/legacy/ui/public/agg_types/buckets/create_filter/range.ts b/src/legacy/core_plugins/data/public/search/aggs/buckets/create_filter/range.ts similarity index 93% rename from src/legacy/ui/public/agg_types/buckets/create_filter/range.ts rename to src/legacy/core_plugins/data/public/search/aggs/buckets/create_filter/range.ts index 929827c6e3fec..125a30a1ab1dd 100644 --- a/src/legacy/ui/public/agg_types/buckets/create_filter/range.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/buckets/create_filter/range.ts @@ -18,7 +18,7 @@ */ import { IBucketAggConfig } from '../_bucket_agg_type'; -import { esFilters } from '../../../../../../plugins/data/public'; +import { esFilters } from '../../../../../../../../plugins/data/public'; export const createFilterRange = (aggConfig: IBucketAggConfig, params: any) => { return esFilters.buildRangeFilter( diff --git a/src/legacy/ui/public/agg_types/buckets/create_filter/terms.test.ts b/src/legacy/core_plugins/data/public/search/aggs/buckets/create_filter/terms.test.ts similarity index 98% rename from src/legacy/ui/public/agg_types/buckets/create_filter/terms.test.ts rename to src/legacy/core_plugins/data/public/search/aggs/buckets/create_filter/terms.test.ts index 86c0aa24f529a..d5fd1337f2cb2 100644 --- a/src/legacy/ui/public/agg_types/buckets/create_filter/terms.test.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/buckets/create_filter/terms.test.ts @@ -21,7 +21,7 @@ import { createFilterTerms } from './terms'; import { AggConfigs } from '../../agg_configs'; import { BUCKET_TYPES } from '../bucket_agg_types'; import { IBucketAggConfig } from '../_bucket_agg_type'; -import { esFilters } from '../../../../../../plugins/data/public'; +import { esFilters } from '../../../../../../../../plugins/data/public'; jest.mock('ui/new_platform'); diff --git a/src/legacy/ui/public/agg_types/buckets/create_filter/terms.ts b/src/legacy/core_plugins/data/public/search/aggs/buckets/create_filter/terms.ts similarity index 95% rename from src/legacy/ui/public/agg_types/buckets/create_filter/terms.ts rename to src/legacy/core_plugins/data/public/search/aggs/buckets/create_filter/terms.ts index 5bd770e672786..e0d1f91c1e16a 100644 --- a/src/legacy/ui/public/agg_types/buckets/create_filter/terms.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/buckets/create_filter/terms.ts @@ -18,7 +18,7 @@ */ import { IBucketAggConfig } from '../_bucket_agg_type'; -import { esFilters } from '../../../../../../plugins/data/public'; +import { esFilters } from '../../../../../../../../plugins/data/public'; export const createFilterTerms = (aggConfig: IBucketAggConfig, key: string, params: any) => { const field = aggConfig.params.field; diff --git a/src/legacy/ui/public/agg_types/buckets/date_histogram.ts b/src/legacy/core_plugins/data/public/search/aggs/buckets/date_histogram.ts similarity index 95% rename from src/legacy/ui/public/agg_types/buckets/date_histogram.ts rename to src/legacy/core_plugins/data/public/search/aggs/buckets/date_histogram.ts index 33672b54b1f2e..dc0f9baa6d0cc 100644 --- a/src/legacy/ui/public/agg_types/buckets/date_histogram.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/buckets/date_histogram.ts @@ -22,19 +22,17 @@ import moment from 'moment-timezone'; import { i18n } from '@kbn/i18n'; import { npStart } from 'ui/new_platform'; +import { timefilter } from 'ui/timefilter'; +import { TimeBuckets } from 'ui/time_buckets'; import { BucketAggType, IBucketAggConfig } from './_bucket_agg_type'; import { BUCKET_TYPES } from './bucket_agg_types'; import { createFilterDateHistogram } from './create_filter/date_histogram'; import { intervalOptions } from './_interval_options'; -import { timefilter } from '../../timefilter'; -import { dateHistogramInterval } from '../../../../core_plugins/data/public'; +import { dateHistogramInterval } from '../../../../common'; import { writeParams } from '../agg_params'; import { isMetricAggType } from '../metrics/metric_agg_type'; -import { KBN_FIELD_TYPES } from '../../../../../plugins/data/public'; - -// @ts-ignore -import { TimeBuckets } from '../../time_buckets'; +import { KBN_FIELD_TYPES } from '../../../../../../../plugins/data/public'; const detectedTimezone = moment.tz.guess(); const tzOffset = moment().format('Z'); @@ -67,7 +65,7 @@ export function isDateHistogramBucketAggConfig(agg: any): agg is IBucketDateHist export const dateHistogramBucketAgg = new BucketAggType({ name: BUCKET_TYPES.DATE_HISTOGRAM, - title: i18n.translate('common.ui.aggTypes.buckets.dateHistogramTitle', { + title: i18n.translate('data.search.aggs.buckets.dateHistogramTitle', { defaultMessage: 'Date Histogram', }), ordered: { @@ -81,7 +79,7 @@ export const dateHistogramBucketAgg = new BucketAggType { describe('getRequestAggs', () => { describe('initial aggregation creation', () => { - let aggConfigs: AggConfigs; + let aggConfigs: IAggConfigs; let geoHashGridAgg: IBucketGeoHashGridAggConfig; beforeEach(() => { diff --git a/src/legacy/ui/public/agg_types/buckets/geo_hash.ts b/src/legacy/core_plugins/data/public/search/aggs/buckets/geo_hash.ts similarity index 96% rename from src/legacy/ui/public/agg_types/buckets/geo_hash.ts rename to src/legacy/core_plugins/data/public/search/aggs/buckets/geo_hash.ts index b2519df6fb175..afd4e18dd266c 100644 --- a/src/legacy/ui/public/agg_types/buckets/geo_hash.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/buckets/geo_hash.ts @@ -19,9 +19,9 @@ import { i18n } from '@kbn/i18n'; import { geohashColumns } from 'ui/vis/map/decode_geo_hash'; -import chrome from '../../chrome'; +import chrome from 'ui/chrome'; import { BucketAggType, IBucketAggConfig } from './_bucket_agg_type'; -import { KBN_FIELD_TYPES } from '../../../../../plugins/data/public'; +import { KBN_FIELD_TYPES } from '../../../../../../../plugins/data/public'; import { geoContains, scaleBounds, GeoBoundingBox } from './lib/geo_utils'; import { BUCKET_TYPES } from './bucket_agg_types'; @@ -68,7 +68,7 @@ function getPrecision(val: string) { const isOutsideCollar = (bounds: GeoBoundingBox, collar: MapCollar) => bounds && collar && !geoContains(collar, bounds); -const geohashGridTitle = i18n.translate('common.ui.aggTypes.buckets.geohashGridTitle', { +const geohashGridTitle = i18n.translate('data.search.aggs.buckets.geohashGridTitle', { defaultMessage: 'Geohash', }); diff --git a/src/legacy/ui/public/agg_types/buckets/geo_tile.ts b/src/legacy/core_plugins/data/public/search/aggs/buckets/geo_tile.ts similarity index 92% rename from src/legacy/ui/public/agg_types/buckets/geo_tile.ts rename to src/legacy/core_plugins/data/public/search/aggs/buckets/geo_tile.ts index ef71e3947566a..57e8f6e8c5ded 100644 --- a/src/legacy/ui/public/agg_types/buckets/geo_tile.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/buckets/geo_tile.ts @@ -23,11 +23,11 @@ import { AggConfigOptions } from '../agg_config'; import { BucketAggType } from './_bucket_agg_type'; import { BUCKET_TYPES } from './bucket_agg_types'; -import { KBN_FIELD_TYPES } from '../../../../../plugins/data/public'; +import { KBN_FIELD_TYPES } from '../../../../../../../plugins/data/public'; import { IBucketAggConfig } from './_bucket_agg_type'; import { METRIC_TYPES } from '../metrics/metric_agg_types'; -const geotileGridTitle = i18n.translate('common.ui.aggTypes.buckets.geotileGridTitle', { +const geotileGridTitle = i18n.translate('data.search.aggs.buckets.geotileGridTitle', { defaultMessage: 'Geotile', }); diff --git a/src/legacy/ui/public/agg_types/buckets/histogram.test.ts b/src/legacy/core_plugins/data/public/search/aggs/buckets/histogram.test.ts similarity index 100% rename from src/legacy/ui/public/agg_types/buckets/histogram.test.ts rename to src/legacy/core_plugins/data/public/search/aggs/buckets/histogram.test.ts diff --git a/src/legacy/ui/public/agg_types/buckets/histogram.ts b/src/legacy/core_plugins/data/public/search/aggs/buckets/histogram.ts similarity index 96% rename from src/legacy/ui/public/agg_types/buckets/histogram.ts rename to src/legacy/core_plugins/data/public/search/aggs/buckets/histogram.ts index 44327c7c19e6d..f7e9ef45961e0 100644 --- a/src/legacy/ui/public/agg_types/buckets/histogram.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/buckets/histogram.ts @@ -24,7 +24,7 @@ import { toastNotifications } from 'ui/notify'; import { npStart } from 'ui/new_platform'; import { BucketAggType, IBucketAggConfig } from './_bucket_agg_type'; import { createFilterHistogram } from './create_filter/histogram'; -import { KBN_FIELD_TYPES } from '../../../../../plugins/data/public'; +import { KBN_FIELD_TYPES } from '../../../../../../../plugins/data/public'; import { BUCKET_TYPES } from './bucket_agg_types'; export interface AutoBounds { @@ -41,7 +41,7 @@ const getUIConfig = () => npStart.core.uiSettings; export const histogramBucketAgg = new BucketAggType({ name: BUCKET_TYPES.HISTOGRAM, - title: i18n.translate('common.ui.aggTypes.buckets.histogramTitle', { + title: i18n.translate('data.search.aggs.buckets.histogramTitle', { defaultMessage: 'Histogram', }), ordered: {}, @@ -117,7 +117,7 @@ export const histogramBucketAgg = new BucketAggType({ .catch((e: Error) => { if (e.name === 'AbortError') return; toastNotifications.addWarning( - i18n.translate('common.ui.aggTypes.histogram.missingMaxMinValuesWarning', { + i18n.translate('data.search.aggs.histogram.missingMaxMinValuesWarning', { defaultMessage: 'Unable to retrieve max and min values to auto-scale histogram buckets. This may lead to poor visualization performance.', }) diff --git a/src/legacy/ui/public/agg_types/buckets/ip_range.ts b/src/legacy/core_plugins/data/public/search/aggs/buckets/ip_range.ts similarity index 93% rename from src/legacy/ui/public/agg_types/buckets/ip_range.ts rename to src/legacy/core_plugins/data/public/search/aggs/buckets/ip_range.ts index 41141dabf507c..e5497bef49165 100644 --- a/src/legacy/ui/public/agg_types/buckets/ip_range.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/buckets/ip_range.ts @@ -25,9 +25,9 @@ import { BUCKET_TYPES } from './bucket_agg_types'; // @ts-ignore import { createFilterIpRange } from './create_filter/ip_range'; -import { KBN_FIELD_TYPES, fieldFormats } from '../../../../../plugins/data/public'; +import { KBN_FIELD_TYPES, fieldFormats } from '../../../../../../../plugins/data/public'; -const ipRangeTitle = i18n.translate('common.ui.aggTypes.buckets.ipRangeTitle', { +const ipRangeTitle = i18n.translate('data.search.aggs.buckets.ipRangeTitle', { defaultMessage: 'IPv4 Range', }); @@ -57,7 +57,7 @@ export const ipRangeBucketAgg = new BucketAggType({ return new IpRangeFormat(); }, makeLabel(aggConfig) { - return i18n.translate('common.ui.aggTypes.buckets.ipRangeLabel', { + return i18n.translate('data.search.aggs.buckets.ipRangeLabel', { defaultMessage: '{fieldName} IP ranges', values: { fieldName: aggConfig.getFieldDisplayName(), diff --git a/src/legacy/ui/public/agg_types/buckets/lib/cidr_mask.test.ts b/src/legacy/core_plugins/data/public/search/aggs/buckets/lib/cidr_mask.test.ts similarity index 100% rename from src/legacy/ui/public/agg_types/buckets/lib/cidr_mask.test.ts rename to src/legacy/core_plugins/data/public/search/aggs/buckets/lib/cidr_mask.test.ts diff --git a/src/legacy/ui/public/agg_types/buckets/lib/cidr_mask.ts b/src/legacy/core_plugins/data/public/search/aggs/buckets/lib/cidr_mask.ts similarity index 95% rename from src/legacy/ui/public/agg_types/buckets/lib/cidr_mask.ts rename to src/legacy/core_plugins/data/public/search/aggs/buckets/lib/cidr_mask.ts index aadbbc8c82276..30c4e400fb806 100644 --- a/src/legacy/ui/public/agg_types/buckets/lib/cidr_mask.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/buckets/lib/cidr_mask.ts @@ -17,7 +17,7 @@ * under the License. */ -import { Ipv4Address } from '../../../../../../plugins/kibana_utils/public'; +import { Ipv4Address } from '../../../../../../../../plugins/kibana_utils/public'; const NUM_BITS = 32; diff --git a/src/legacy/ui/public/agg_types/buckets/lib/geo_utils.ts b/src/legacy/core_plugins/data/public/search/aggs/buckets/lib/geo_utils.ts similarity index 100% rename from src/legacy/ui/public/agg_types/buckets/lib/geo_utils.ts rename to src/legacy/core_plugins/data/public/search/aggs/buckets/lib/geo_utils.ts diff --git a/src/legacy/ui/public/agg_types/buckets/migrate_include_exclude_format.ts b/src/legacy/core_plugins/data/public/search/aggs/buckets/migrate_include_exclude_format.ts similarity index 100% rename from src/legacy/ui/public/agg_types/buckets/migrate_include_exclude_format.ts rename to src/legacy/core_plugins/data/public/search/aggs/buckets/migrate_include_exclude_format.ts diff --git a/src/legacy/ui/public/agg_types/buckets/range.test.ts b/src/legacy/core_plugins/data/public/search/aggs/buckets/range.test.ts similarity index 97% rename from src/legacy/ui/public/agg_types/buckets/range.test.ts rename to src/legacy/core_plugins/data/public/search/aggs/buckets/range.test.ts index dd85c3b31939f..4c0fa7311461e 100644 --- a/src/legacy/ui/public/agg_types/buckets/range.test.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/buckets/range.test.ts @@ -19,7 +19,7 @@ import { AggConfigs } from '../agg_configs'; import { BUCKET_TYPES } from './bucket_agg_types'; -import { fieldFormats } from '../../../../../plugins/data/public'; +import { fieldFormats } from '../../../../../../../plugins/data/public'; jest.mock('ui/new_platform'); diff --git a/src/legacy/ui/public/agg_types/buckets/range.ts b/src/legacy/core_plugins/data/public/search/aggs/buckets/range.ts similarity index 89% rename from src/legacy/ui/public/agg_types/buckets/range.ts rename to src/legacy/core_plugins/data/public/search/aggs/buckets/range.ts index f24473e0c68aa..f35db2cc759bd 100644 --- a/src/legacy/ui/public/agg_types/buckets/range.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/buckets/range.ts @@ -19,7 +19,7 @@ import { i18n } from '@kbn/i18n'; import { BucketAggType } from './_bucket_agg_type'; -import { fieldFormats, KBN_FIELD_TYPES } from '../../../../../plugins/data/public'; +import { fieldFormats, KBN_FIELD_TYPES } from '../../../../../../../plugins/data/public'; import { RangeKey } from './range_key'; import { createFilterRange } from './create_filter/range'; import { BUCKET_TYPES } from './bucket_agg_types'; @@ -27,7 +27,7 @@ import { BUCKET_TYPES } from './bucket_agg_types'; const keyCaches = new WeakMap(); const formats = new WeakMap(); -const rangeTitle = i18n.translate('common.ui.aggTypes.buckets.rangeTitle', { +const rangeTitle = i18n.translate('data.search.aggs.buckets.rangeTitle', { defaultMessage: 'Range', }); @@ -36,7 +36,7 @@ export const rangeBucketAgg = new BucketAggType({ title: rangeTitle, createFilter: createFilterRange, makeLabel(aggConfig) { - return i18n.translate('common.ui.aggTypes.buckets.rangesLabel', { + return i18n.translate('data.search.aggs.aggTypesLabel', { defaultMessage: '{fieldName} ranges', values: { fieldName: aggConfig.getFieldDisplayName(), @@ -69,7 +69,7 @@ export const rangeBucketAgg = new BucketAggType({ const format = agg.fieldOwnFormatter(); const gte = '\u2265'; const lt = '\u003c'; - return i18n.translate('common.ui.aggTypes.buckets.ranges.rangesFormatMessage', { + return i18n.translate('data.search.aggs.aggTypes.rangesFormatMessage', { defaultMessage: '{gte} {from} and {lt} {to}', values: { gte, diff --git a/src/legacy/ui/public/agg_types/buckets/range_key.ts b/src/legacy/core_plugins/data/public/search/aggs/buckets/range_key.ts similarity index 100% rename from src/legacy/ui/public/agg_types/buckets/range_key.ts rename to src/legacy/core_plugins/data/public/search/aggs/buckets/range_key.ts diff --git a/src/legacy/ui/public/agg_types/buckets/significant_terms.test.ts b/src/legacy/core_plugins/data/public/search/aggs/buckets/significant_terms.test.ts similarity index 96% rename from src/legacy/ui/public/agg_types/buckets/significant_terms.test.ts rename to src/legacy/core_plugins/data/public/search/aggs/buckets/significant_terms.test.ts index 8db9226e41eec..37b829bfc20fb 100644 --- a/src/legacy/ui/public/agg_types/buckets/significant_terms.test.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/buckets/significant_terms.test.ts @@ -18,6 +18,7 @@ */ import { AggConfigs } from '../index'; +import { IAggConfigs } from '../types'; import { BUCKET_TYPES } from './bucket_agg_types'; import { significantTermsBucketAgg } from './significant_terms'; import { IBucketAggConfig } from './_bucket_agg_type'; @@ -56,7 +57,7 @@ describe('Significant Terms Agg', () => { ); }; - const testSerializeAndWrite = (aggs: AggConfigs) => { + const testSerializeAndWrite = (aggs: IAggConfigs) => { const agg = aggs.aggs[0]; const { [BUCKET_TYPES.SIGNIFICANT_TERMS]: params } = agg.toDsl(); diff --git a/src/legacy/ui/public/agg_types/buckets/significant_terms.ts b/src/legacy/core_plugins/data/public/search/aggs/buckets/significant_terms.ts similarity index 82% rename from src/legacy/ui/public/agg_types/buckets/significant_terms.ts rename to src/legacy/core_plugins/data/public/search/aggs/buckets/significant_terms.ts index 38ca0768d3bc1..bc6c63d569b11 100644 --- a/src/legacy/ui/public/agg_types/buckets/significant_terms.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/buckets/significant_terms.ts @@ -22,9 +22,9 @@ import { BucketAggType } from './_bucket_agg_type'; import { createFilterTerms } from './create_filter/terms'; import { isStringType, migrateIncludeExcludeFormat } from './migrate_include_exclude_format'; import { BUCKET_TYPES } from './bucket_agg_types'; -import { KBN_FIELD_TYPES } from '../../../../../plugins/data/public'; +import { KBN_FIELD_TYPES } from '../../../../../../../plugins/data/public'; -const significantTermsTitle = i18n.translate('common.ui.aggTypes.buckets.significantTermsTitle', { +const significantTermsTitle = i18n.translate('data.search.aggs.buckets.significantTermsTitle', { defaultMessage: 'Significant Terms', }); @@ -32,7 +32,7 @@ export const significantTermsBucketAgg = new BucketAggType({ name: BUCKET_TYPES.SIGNIFICANT_TERMS, title: significantTermsTitle, makeLabel(aggConfig) { - return i18n.translate('common.ui.aggTypes.buckets.significantTermsLabel', { + return i18n.translate('data.search.aggs.buckets.significantTermsLabel', { defaultMessage: 'Top {size} unusual terms in {fieldName}', values: { size: aggConfig.params.size, @@ -54,7 +54,7 @@ export const significantTermsBucketAgg = new BucketAggType({ }, { name: 'exclude', - displayName: i18n.translate('common.ui.aggTypes.buckets.significantTerms.excludeLabel', { + displayName: i18n.translate('data.search.aggs.buckets.significantTerms.excludeLabel', { defaultMessage: 'Exclude', }), type: 'string', @@ -64,7 +64,7 @@ export const significantTermsBucketAgg = new BucketAggType({ }, { name: 'include', - displayName: i18n.translate('common.ui.aggTypes.buckets.significantTerms.includeLabel', { + displayName: i18n.translate('data.search.aggs.buckets.significantTerms.includeLabel', { defaultMessage: 'Include', }), type: 'string', diff --git a/src/legacy/ui/public/agg_types/buckets/terms.test.ts b/src/legacy/core_plugins/data/public/search/aggs/buckets/terms.test.ts similarity index 100% rename from src/legacy/ui/public/agg_types/buckets/terms.test.ts rename to src/legacy/core_plugins/data/public/search/aggs/buckets/terms.test.ts diff --git a/src/legacy/ui/public/agg_types/buckets/terms.ts b/src/legacy/core_plugins/data/public/search/aggs/buckets/terms.ts similarity index 85% rename from src/legacy/ui/public/agg_types/buckets/terms.ts rename to src/legacy/core_plugins/data/public/search/aggs/buckets/terms.ts index 4ced1417402b5..b41b16af122fa 100644 --- a/src/legacy/ui/public/agg_types/buckets/terms.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/buckets/terms.ts @@ -19,19 +19,20 @@ import { noop } from 'lodash'; import { i18n } from '@kbn/i18n'; -import { - getRequestInspectorStats, - getResponseInspectorStats, -} from '../../../../core_plugins/data/public'; +import { getRequestInspectorStats, getResponseInspectorStats } from '../../../index'; import { BucketAggType } from './_bucket_agg_type'; import { BUCKET_TYPES } from './bucket_agg_types'; import { IBucketAggConfig } from './_bucket_agg_type'; import { createFilterTerms } from './create_filter/terms'; import { isStringType, migrateIncludeExcludeFormat } from './migrate_include_exclude_format'; -import { AggConfigs } from '../agg_configs'; +import { IAggConfigs } from '../agg_configs'; -import { Adapters } from '../../../../../plugins/inspector/public'; -import { ISearchSource, fieldFormats, KBN_FIELD_TYPES } from '../../../../../plugins/data/public'; +import { Adapters } from '../../../../../../../plugins/inspector/public'; +import { + ISearchSource, + fieldFormats, + KBN_FIELD_TYPES, +} from '../../../../../../../plugins/data/public'; import { buildOtherBucketAgg, @@ -68,7 +69,7 @@ const [orderAggSchema] = new Schemas([ }, ]).all; -const termsTitle = i18n.translate('common.ui.aggTypes.buckets.termsTitle', { +const termsTitle = i18n.translate('data.search.aggs.buckets.termsTitle', { defaultMessage: 'Terms', }); @@ -98,7 +99,7 @@ export const termsBucketAgg = new BucketAggType({ createFilter: createFilterTerms, postFlightRequest: async ( resp: any, - aggConfigs: AggConfigs, + aggConfigs: IAggConfigs, aggConfig: IBucketAggConfig, searchSource: ISearchSource, inspectorAdapters: Adapters, @@ -113,11 +114,11 @@ export const termsBucketAgg = new BucketAggType({ nestedSearchSource.setField('aggs', filterAgg); const request = inspectorAdapters.requests.start( - i18n.translate('common.ui.aggTypes.buckets.terms.otherBucketTitle', { + i18n.translate('data.search.aggs.buckets.terms.otherBucketTitle', { defaultMessage: 'Other bucket', }), { - description: i18n.translate('common.ui.aggTypes.buckets.terms.otherBucketDescription', { + description: i18n.translate('data.search.aggs.buckets.terms.otherBucketDescription', { defaultMessage: 'This request counts the number of documents that fall ' + 'outside the criterion of the data buckets.', @@ -212,13 +213,13 @@ export const termsBucketAgg = new BucketAggType({ default: 'desc', options: [ { - text: i18n.translate('common.ui.aggTypes.buckets.terms.orderDescendingTitle', { + text: i18n.translate('data.search.aggs.buckets.terms.orderDescendingTitle', { defaultMessage: 'Descending', }), value: 'desc', }, { - text: i18n.translate('common.ui.aggTypes.buckets.terms.orderAscendingTitle', { + text: i18n.translate('data.search.aggs.buckets.terms.orderAscendingTitle', { defaultMessage: 'Ascending', }), value: 'asc', @@ -238,10 +239,10 @@ export const termsBucketAgg = new BucketAggType({ { name: 'otherBucketLabel', type: 'string', - default: i18n.translate('common.ui.aggTypes.buckets.terms.otherBucketLabel', { + default: i18n.translate('data.search.aggs.buckets.terms.otherBucketLabel', { defaultMessage: 'Other', }), - displayName: i18n.translate('common.ui.aggTypes.otherBucket.labelForOtherBucketLabel', { + displayName: i18n.translate('data.search.aggs.otherBucket.labelForOtherBucketLabel', { defaultMessage: 'Label for other bucket', }), shouldShow: agg => agg.getParam('otherBucket'), @@ -254,13 +255,13 @@ export const termsBucketAgg = new BucketAggType({ }, { name: 'missingBucketLabel', - default: i18n.translate('common.ui.aggTypes.buckets.terms.missingBucketLabel', { + default: i18n.translate('data.search.aggs.buckets.terms.missingBucketLabel', { defaultMessage: 'Missing', description: `Default label used in charts when documents are missing a field. Visible when you create a chart with a terms aggregation and enable "Show missing values"`, }), type: 'string', - displayName: i18n.translate('common.ui.aggTypes.otherBucket.labelForMissingValuesLabel', { + displayName: i18n.translate('data.search.aggs.otherBucket.labelForMissingValuesLabel', { defaultMessage: 'Label for missing values', }), shouldShow: agg => agg.getParam('missingBucket'), @@ -268,7 +269,7 @@ export const termsBucketAgg = new BucketAggType({ }, { name: 'exclude', - displayName: i18n.translate('common.ui.aggTypes.buckets.terms.excludeLabel', { + displayName: i18n.translate('data.search.aggs.buckets.terms.excludeLabel', { defaultMessage: 'Exclude', }), type: 'string', @@ -278,7 +279,7 @@ export const termsBucketAgg = new BucketAggType({ }, { name: 'include', - displayName: i18n.translate('common.ui.aggTypes.buckets.terms.includeLabel', { + displayName: i18n.translate('data.search.aggs.buckets.terms.includeLabel', { defaultMessage: 'Include', }), type: 'string', diff --git a/src/legacy/ui/public/agg_types/filter/agg_type_filters.test.ts b/src/legacy/core_plugins/data/public/search/aggs/filter/agg_type_filters.test.ts similarity index 88% rename from src/legacy/ui/public/agg_types/filter/agg_type_filters.test.ts rename to src/legacy/core_plugins/data/public/search/aggs/filter/agg_type_filters.test.ts index 0344f304877f2..cc1288d339692 100644 --- a/src/legacy/ui/public/agg_types/filter/agg_type_filters.test.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/filter/agg_type_filters.test.ts @@ -17,9 +17,10 @@ * under the License. */ -import { IndexPattern } from '../../../../../plugins/data/public'; +import { IndexPattern } from '../../../../../../../plugins/data/public'; import { AggTypeFilters } from './agg_type_filters'; -import { AggConfig, AggType } from '..'; +import { AggConfig } from '..'; +import { IAggType } from '../types'; describe('AggTypeFilters', () => { let registry: AggTypeFilters; @@ -31,13 +32,13 @@ describe('AggTypeFilters', () => { }); it('should filter nothing without registered filters', async () => { - const aggTypes = [{ name: 'count' }, { name: 'sum' }] as AggType[]; + const aggTypes = [{ name: 'count' }, { name: 'sum' }] as IAggType[]; const filtered = registry.filter(aggTypes, indexPattern, aggConfig); expect(filtered).toEqual(aggTypes); }); it('should pass all aggTypes to the registered filter', async () => { - const aggTypes = [{ name: 'count' }, { name: 'sum' }] as AggType[]; + const aggTypes = [{ name: 'count' }, { name: 'sum' }] as IAggType[]; const filter = jest.fn(); registry.addFilter(filter); registry.filter(aggTypes, indexPattern, aggConfig); @@ -46,7 +47,7 @@ describe('AggTypeFilters', () => { }); it('should allow registered filters to filter out aggTypes', async () => { - const aggTypes = [{ name: 'count' }, { name: 'sum' }, { name: 'avg' }] as AggType[]; + const aggTypes = [{ name: 'count' }, { name: 'sum' }, { name: 'avg' }] as IAggType[]; let filtered = registry.filter(aggTypes, indexPattern, aggConfig); expect(filtered).toEqual(aggTypes); diff --git a/src/legacy/ui/public/agg_types/filter/agg_type_filters.ts b/src/legacy/core_plugins/data/public/search/aggs/filter/agg_type_filters.ts similarity index 92% rename from src/legacy/ui/public/agg_types/filter/agg_type_filters.ts rename to src/legacy/core_plugins/data/public/search/aggs/filter/agg_type_filters.ts index 2cc4a6e962214..d3b38ce041d7e 100644 --- a/src/legacy/ui/public/agg_types/filter/agg_type_filters.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/filter/agg_type_filters.ts @@ -17,12 +17,12 @@ * under the License. */ import { IndexPattern } from 'src/plugins/data/public'; -import { AggType, AggConfig } from '..'; +import { IAggConfig, IAggType } from '../types'; type AggTypeFilter = ( - aggType: AggType, + aggType: IAggType, indexPattern: IndexPattern, - aggConfig: AggConfig + aggConfig: IAggConfig ) => boolean; /** @@ -49,7 +49,7 @@ class AggTypeFilters { * @param aggConfig The aggConfig for which the returning list will be used. * @return A filtered list of the passed aggTypes. */ - public filter(aggTypes: AggType[], indexPattern: IndexPattern, aggConfig: AggConfig) { + public filter(aggTypes: IAggType[], indexPattern: IndexPattern, aggConfig: IAggConfig) { const allFilters = Array.from(this.filters); const allowedAggTypes = aggTypes.filter(aggType => { const isAggTypeAllowed = allFilters.every(filter => filter(aggType, indexPattern, aggConfig)); diff --git a/src/legacy/ui/public/agg_types/filter/index.ts b/src/legacy/core_plugins/data/public/search/aggs/filter/index.ts similarity index 100% rename from src/legacy/ui/public/agg_types/filter/index.ts rename to src/legacy/core_plugins/data/public/search/aggs/filter/index.ts diff --git a/src/legacy/ui/public/agg_types/filter/prop_filter.test.ts b/src/legacy/core_plugins/data/public/search/aggs/filter/prop_filter.test.ts similarity index 100% rename from src/legacy/ui/public/agg_types/filter/prop_filter.test.ts rename to src/legacy/core_plugins/data/public/search/aggs/filter/prop_filter.test.ts diff --git a/src/legacy/ui/public/agg_types/filter/prop_filter.ts b/src/legacy/core_plugins/data/public/search/aggs/filter/prop_filter.ts similarity index 100% rename from src/legacy/ui/public/agg_types/filter/prop_filter.ts rename to src/legacy/core_plugins/data/public/search/aggs/filter/prop_filter.ts diff --git a/src/legacy/ui/public/agg_types/index.test.ts b/src/legacy/core_plugins/data/public/search/aggs/index.test.ts similarity index 100% rename from src/legacy/ui/public/agg_types/index.test.ts rename to src/legacy/core_plugins/data/public/search/aggs/index.test.ts diff --git a/src/legacy/core_plugins/data/public/search/aggs/index.ts b/src/legacy/core_plugins/data/public/search/aggs/index.ts new file mode 100644 index 0000000000000..0fef7f38aae74 --- /dev/null +++ b/src/legacy/core_plugins/data/public/search/aggs/index.ts @@ -0,0 +1,52 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export { aggTypes } from './agg_types'; +export { AggType } from './agg_type'; +export { AggConfig } from './agg_config'; +export { AggConfigs } from './agg_configs'; +export { FieldParamType } from './param_types'; +export { MetricAggType } from './metrics/metric_agg_type'; +export { AggTypeFilters } from './filter'; +export { aggTypeFieldFilters, AggTypeFieldFilters } from './param_types/filter'; +export { + parentPipelineAggHelper, + parentPipelineType, +} from './metrics/lib/parent_pipeline_agg_helper'; +export { + siblingPipelineAggHelper, + siblingPipelineType, +} from './metrics/lib/sibling_pipeline_agg_helper'; + +// static code +export { AggParamType } from './param_types/agg'; +export { AggGroupNames, aggGroupNamesMap } from './agg_groups'; +export { intervalOptions } from './buckets/_interval_options'; // only used in Discover +export { isDateHistogramBucketAggConfig, setBounds } from './buckets/date_histogram'; +export { termsAggFilter } from './buckets/terms'; +export { isType, isStringType } from './buckets/migrate_include_exclude_format'; +export { CidrMask } from './buckets/lib/cidr_mask'; +export { convertDateRangeToString } from './buckets/date_range'; +export { convertIPRangeToString } from './buckets/ip_range'; +export { aggTypeFilters, propFilter } from './filter'; +export { OptionedParamType } from './param_types/optioned'; +export { isValidJson, isValidInterval } from './utils'; +export { BUCKET_TYPES } from './buckets/bucket_agg_types'; +export { METRIC_TYPES } from './metrics/metric_agg_types'; +export { ISchemas, Schema, Schemas } from './schemas'; diff --git a/src/legacy/ui/public/agg_types/metrics/avg.ts b/src/legacy/core_plugins/data/public/search/aggs/metrics/avg.ts similarity index 85% rename from src/legacy/ui/public/agg_types/metrics/avg.ts rename to src/legacy/core_plugins/data/public/search/aggs/metrics/avg.ts index 0222a8e543223..b80671a43d2af 100644 --- a/src/legacy/ui/public/agg_types/metrics/avg.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/metrics/avg.ts @@ -20,9 +20,9 @@ import { i18n } from '@kbn/i18n'; import { MetricAggType } from './metric_agg_type'; import { METRIC_TYPES } from './metric_agg_types'; -import { KBN_FIELD_TYPES } from '../../../../../plugins/data/public'; +import { KBN_FIELD_TYPES } from '../../../../../../../plugins/data/public'; -const averageTitle = i18n.translate('common.ui.aggTypes.metrics.averageTitle', { +const averageTitle = i18n.translate('data.search.aggs.metrics.averageTitle', { defaultMessage: 'Average', }); @@ -30,7 +30,7 @@ export const avgMetricAgg = new MetricAggType({ name: METRIC_TYPES.AVG, title: averageTitle, makeLabel: aggConfig => { - return i18n.translate('common.ui.aggTypes.metrics.averageLabel', { + return i18n.translate('data.search.aggs.metrics.averageLabel', { defaultMessage: 'Average {field}', values: { field: aggConfig.getFieldDisplayName() }, }); diff --git a/src/legacy/ui/public/agg_types/metrics/bucket_avg.ts b/src/legacy/core_plugins/data/public/search/aggs/metrics/bucket_avg.ts similarity index 91% rename from src/legacy/ui/public/agg_types/metrics/bucket_avg.ts rename to src/legacy/core_plugins/data/public/search/aggs/metrics/bucket_avg.ts index 7142546dbd494..9fb28f8631bc6 100644 --- a/src/legacy/ui/public/agg_types/metrics/bucket_avg.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/metrics/bucket_avg.ts @@ -25,11 +25,11 @@ import { makeNestedLabel } from './lib/make_nested_label'; import { siblingPipelineAggHelper } from './lib/sibling_pipeline_agg_helper'; import { METRIC_TYPES } from './metric_agg_types'; -const overallAverageLabel = i18n.translate('common.ui.aggTypes.metrics.overallAverageLabel', { +const overallAverageLabel = i18n.translate('data.search.aggs.metrics.overallAverageLabel', { defaultMessage: 'overall average', }); -const averageBucketTitle = i18n.translate('common.ui.aggTypes.metrics.averageBucketTitle', { +const averageBucketTitle = i18n.translate('data.search.aggs.metrics.averageBucketTitle', { defaultMessage: 'Average Bucket', }); diff --git a/src/legacy/ui/public/agg_types/metrics/bucket_max.ts b/src/legacy/core_plugins/data/public/search/aggs/metrics/bucket_max.ts similarity index 89% rename from src/legacy/ui/public/agg_types/metrics/bucket_max.ts rename to src/legacy/core_plugins/data/public/search/aggs/metrics/bucket_max.ts index aa5b0521709a5..83837f0de5114 100644 --- a/src/legacy/ui/public/agg_types/metrics/bucket_max.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/metrics/bucket_max.ts @@ -24,11 +24,11 @@ import { makeNestedLabel } from './lib/make_nested_label'; import { siblingPipelineAggHelper } from './lib/sibling_pipeline_agg_helper'; import { METRIC_TYPES } from './metric_agg_types'; -const overallMaxLabel = i18n.translate('common.ui.aggTypes.metrics.overallMaxLabel', { +const overallMaxLabel = i18n.translate('data.search.aggs.metrics.overallMaxLabel', { defaultMessage: 'overall max', }); -const maxBucketTitle = i18n.translate('common.ui.aggTypes.metrics.maxBucketTitle', { +const maxBucketTitle = i18n.translate('data.search.aggs.metrics.maxBucketTitle', { defaultMessage: 'Max Bucket', }); diff --git a/src/legacy/ui/public/agg_types/metrics/bucket_min.ts b/src/legacy/core_plugins/data/public/search/aggs/metrics/bucket_min.ts similarity index 89% rename from src/legacy/ui/public/agg_types/metrics/bucket_min.ts rename to src/legacy/core_plugins/data/public/search/aggs/metrics/bucket_min.ts index b5c0b8865e106..d96197693dc2e 100644 --- a/src/legacy/ui/public/agg_types/metrics/bucket_min.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/metrics/bucket_min.ts @@ -22,11 +22,11 @@ import { makeNestedLabel } from './lib/make_nested_label'; import { siblingPipelineAggHelper } from './lib/sibling_pipeline_agg_helper'; import { METRIC_TYPES } from './metric_agg_types'; -const overallMinLabel = i18n.translate('common.ui.aggTypes.metrics.overallMinLabel', { +const overallMinLabel = i18n.translate('data.search.aggs.metrics.overallMinLabel', { defaultMessage: 'overall min', }); -const minBucketTitle = i18n.translate('common.ui.aggTypes.metrics.minBucketTitle', { +const minBucketTitle = i18n.translate('data.search.aggs.metrics.minBucketTitle', { defaultMessage: 'Min Bucket', }); diff --git a/src/legacy/ui/public/agg_types/metrics/bucket_sum.ts b/src/legacy/core_plugins/data/public/search/aggs/metrics/bucket_sum.ts similarity index 89% rename from src/legacy/ui/public/agg_types/metrics/bucket_sum.ts rename to src/legacy/core_plugins/data/public/search/aggs/metrics/bucket_sum.ts index d4faa81c4041c..1f9392c5bec35 100644 --- a/src/legacy/ui/public/agg_types/metrics/bucket_sum.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/metrics/bucket_sum.ts @@ -23,11 +23,11 @@ import { makeNestedLabel } from './lib/make_nested_label'; import { siblingPipelineAggHelper } from './lib/sibling_pipeline_agg_helper'; import { METRIC_TYPES } from './metric_agg_types'; -const overallSumLabel = i18n.translate('common.ui.aggTypes.metrics.overallSumLabel', { +const overallSumLabel = i18n.translate('data.search.aggs.metrics.overallSumLabel', { defaultMessage: 'overall sum', }); -const sumBucketTitle = i18n.translate('common.ui.aggTypes.metrics.sumBucketTitle', { +const sumBucketTitle = i18n.translate('data.search.aggs.metrics.sumBucketTitle', { defaultMessage: 'Sum Bucket', }); diff --git a/src/legacy/ui/public/agg_types/metrics/cardinality.ts b/src/legacy/core_plugins/data/public/search/aggs/metrics/cardinality.ts similarity index 86% rename from src/legacy/ui/public/agg_types/metrics/cardinality.ts rename to src/legacy/core_plugins/data/public/search/aggs/metrics/cardinality.ts index c69ffae3b4871..147e925521088 100644 --- a/src/legacy/ui/public/agg_types/metrics/cardinality.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/metrics/cardinality.ts @@ -21,9 +21,9 @@ import { i18n } from '@kbn/i18n'; import { npStart } from 'ui/new_platform'; import { MetricAggType } from './metric_agg_type'; import { METRIC_TYPES } from './metric_agg_types'; -import { KBN_FIELD_TYPES } from '../../../../../plugins/data/public'; +import { KBN_FIELD_TYPES } from '../../../../../../../plugins/data/public'; -const uniqueCountTitle = i18n.translate('common.ui.aggTypes.metrics.uniqueCountTitle', { +const uniqueCountTitle = i18n.translate('data.search.aggs.metrics.uniqueCountTitle', { defaultMessage: 'Unique Count', }); @@ -31,7 +31,7 @@ export const cardinalityMetricAgg = new MetricAggType({ name: METRIC_TYPES.CARDINALITY, title: uniqueCountTitle, makeLabel(aggConfig) { - return i18n.translate('common.ui.aggTypes.metrics.uniqueCountLabel', { + return i18n.translate('data.search.aggs.metrics.uniqueCountLabel', { defaultMessage: 'Unique count of {field}', values: { field: aggConfig.getFieldDisplayName() }, }); diff --git a/src/legacy/ui/public/agg_types/metrics/count.ts b/src/legacy/core_plugins/data/public/search/aggs/metrics/count.ts similarity index 87% rename from src/legacy/ui/public/agg_types/metrics/count.ts rename to src/legacy/core_plugins/data/public/search/aggs/metrics/count.ts index 22a939cd9a3fd..14a9bd073ff2b 100644 --- a/src/legacy/ui/public/agg_types/metrics/count.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/metrics/count.ts @@ -19,18 +19,18 @@ import { i18n } from '@kbn/i18n'; import { npStart } from 'ui/new_platform'; -import { KBN_FIELD_TYPES } from '../../../../../plugins/data/public'; +import { KBN_FIELD_TYPES } from '../../../../../../../plugins/data/public'; import { MetricAggType } from './metric_agg_type'; import { METRIC_TYPES } from './metric_agg_types'; export const countMetricAgg = new MetricAggType({ name: METRIC_TYPES.COUNT, - title: i18n.translate('common.ui.aggTypes.metrics.countTitle', { + title: i18n.translate('data.search.aggs.metrics.countTitle', { defaultMessage: 'Count', }), hasNoDsl: true, makeLabel() { - return i18n.translate('common.ui.aggTypes.metrics.countLabel', { + return i18n.translate('data.search.aggs.metrics.countLabel', { defaultMessage: 'Count', }); }, diff --git a/src/legacy/ui/public/agg_types/metrics/cumulative_sum.ts b/src/legacy/core_plugins/data/public/search/aggs/metrics/cumulative_sum.ts similarity index 88% rename from src/legacy/ui/public/agg_types/metrics/cumulative_sum.ts rename to src/legacy/core_plugins/data/public/search/aggs/metrics/cumulative_sum.ts index bad2de8cb16dc..a5d02459900bb 100644 --- a/src/legacy/ui/public/agg_types/metrics/cumulative_sum.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/metrics/cumulative_sum.ts @@ -23,11 +23,11 @@ import { parentPipelineAggHelper } from './lib/parent_pipeline_agg_helper'; import { makeNestedLabel } from './lib/make_nested_label'; import { METRIC_TYPES } from './metric_agg_types'; -const cumulativeSumLabel = i18n.translate('common.ui.aggTypes.metrics.cumulativeSumLabel', { +const cumulativeSumLabel = i18n.translate('data.search.aggs.metrics.cumulativeSumLabel', { defaultMessage: 'cumulative sum', }); -const cumulativeSumTitle = i18n.translate('common.ui.aggTypes.metrics.cumulativeSumTitle', { +const cumulativeSumTitle = i18n.translate('data.search.aggs.metrics.cumulativeSumTitle', { defaultMessage: 'Cumulative Sum', }); diff --git a/src/legacy/ui/public/agg_types/metrics/derivative.ts b/src/legacy/core_plugins/data/public/search/aggs/metrics/derivative.ts similarity index 89% rename from src/legacy/ui/public/agg_types/metrics/derivative.ts rename to src/legacy/core_plugins/data/public/search/aggs/metrics/derivative.ts index 42921621a2933..1169a527b0668 100644 --- a/src/legacy/ui/public/agg_types/metrics/derivative.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/metrics/derivative.ts @@ -23,11 +23,11 @@ import { parentPipelineAggHelper } from './lib/parent_pipeline_agg_helper'; import { makeNestedLabel } from './lib/make_nested_label'; import { METRIC_TYPES } from './metric_agg_types'; -const derivativeLabel = i18n.translate('common.ui.aggTypes.metrics.derivativeLabel', { +const derivativeLabel = i18n.translate('data.search.aggs.metrics.derivativeLabel', { defaultMessage: 'derivative', }); -const derivativeTitle = i18n.translate('common.ui.aggTypes.metrics.derivativeTitle', { +const derivativeTitle = i18n.translate('data.search.aggs.metrics.derivativeTitle', { defaultMessage: 'Derivative', }); diff --git a/src/legacy/ui/public/agg_types/metrics/geo_bounds.ts b/src/legacy/core_plugins/data/public/search/aggs/metrics/geo_bounds.ts similarity index 84% rename from src/legacy/ui/public/agg_types/metrics/geo_bounds.ts rename to src/legacy/core_plugins/data/public/search/aggs/metrics/geo_bounds.ts index b8ce03cdf11ec..53bc72f9ce1da 100644 --- a/src/legacy/ui/public/agg_types/metrics/geo_bounds.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/metrics/geo_bounds.ts @@ -20,13 +20,13 @@ import { i18n } from '@kbn/i18n'; import { MetricAggType } from './metric_agg_type'; import { METRIC_TYPES } from './metric_agg_types'; -import { KBN_FIELD_TYPES } from '../../../../../plugins/data/public'; +import { KBN_FIELD_TYPES } from '../../../../../../../plugins/data/public'; -const geoBoundsTitle = i18n.translate('common.ui.aggTypes.metrics.geoBoundsTitle', { +const geoBoundsTitle = i18n.translate('data.search.aggs.metrics.geoBoundsTitle', { defaultMessage: 'Geo Bounds', }); -const geoBoundsLabel = i18n.translate('common.ui.aggTypes.metrics.geoBoundsLabel', { +const geoBoundsLabel = i18n.translate('data.search.aggs.metrics.geoBoundsLabel', { defaultMessage: 'Geo Bounds', }); diff --git a/src/legacy/ui/public/agg_types/metrics/geo_centroid.ts b/src/legacy/core_plugins/data/public/search/aggs/metrics/geo_centroid.ts similarity index 84% rename from src/legacy/ui/public/agg_types/metrics/geo_centroid.ts rename to src/legacy/core_plugins/data/public/search/aggs/metrics/geo_centroid.ts index 5313e31796a5b..a79b2b34ad1ca 100644 --- a/src/legacy/ui/public/agg_types/metrics/geo_centroid.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/metrics/geo_centroid.ts @@ -20,13 +20,13 @@ import { i18n } from '@kbn/i18n'; import { MetricAggType } from './metric_agg_type'; import { METRIC_TYPES } from './metric_agg_types'; -import { KBN_FIELD_TYPES } from '../../../../../plugins/data/public'; +import { KBN_FIELD_TYPES } from '../../../../../../../plugins/data/public'; -const geoCentroidTitle = i18n.translate('common.ui.aggTypes.metrics.geoCentroidTitle', { +const geoCentroidTitle = i18n.translate('data.search.aggs.metrics.geoCentroidTitle', { defaultMessage: 'Geo Centroid', }); -const geoCentroidLabel = i18n.translate('common.ui.aggTypes.metrics.geoCentroidLabel', { +const geoCentroidLabel = i18n.translate('data.search.aggs.metrics.geoCentroidLabel', { defaultMessage: 'Geo Centroid', }); diff --git a/src/legacy/ui/public/agg_types/metrics/lib/get_response_agg_config_class.ts b/src/legacy/core_plugins/data/public/search/aggs/metrics/lib/get_response_agg_config_class.ts similarity index 100% rename from src/legacy/ui/public/agg_types/metrics/lib/get_response_agg_config_class.ts rename to src/legacy/core_plugins/data/public/search/aggs/metrics/lib/get_response_agg_config_class.ts diff --git a/src/legacy/ui/public/agg_types/metrics/lib/make_nested_label.test.ts b/src/legacy/core_plugins/data/public/search/aggs/metrics/lib/make_nested_label.test.ts similarity index 100% rename from src/legacy/ui/public/agg_types/metrics/lib/make_nested_label.test.ts rename to src/legacy/core_plugins/data/public/search/aggs/metrics/lib/make_nested_label.test.ts diff --git a/src/legacy/ui/public/agg_types/metrics/lib/make_nested_label.ts b/src/legacy/core_plugins/data/public/search/aggs/metrics/lib/make_nested_label.ts similarity index 100% rename from src/legacy/ui/public/agg_types/metrics/lib/make_nested_label.ts rename to src/legacy/core_plugins/data/public/search/aggs/metrics/lib/make_nested_label.ts diff --git a/src/legacy/ui/public/agg_types/metrics/lib/nested_agg_helpers.ts b/src/legacy/core_plugins/data/public/search/aggs/metrics/lib/nested_agg_helpers.ts similarity index 100% rename from src/legacy/ui/public/agg_types/metrics/lib/nested_agg_helpers.ts rename to src/legacy/core_plugins/data/public/search/aggs/metrics/lib/nested_agg_helpers.ts diff --git a/src/legacy/ui/public/agg_types/metrics/lib/ordinal_suffix.test.ts b/src/legacy/core_plugins/data/public/search/aggs/metrics/lib/ordinal_suffix.test.ts similarity index 100% rename from src/legacy/ui/public/agg_types/metrics/lib/ordinal_suffix.test.ts rename to src/legacy/core_plugins/data/public/search/aggs/metrics/lib/ordinal_suffix.test.ts diff --git a/src/legacy/ui/public/agg_types/metrics/lib/ordinal_suffix.ts b/src/legacy/core_plugins/data/public/search/aggs/metrics/lib/ordinal_suffix.ts similarity index 100% rename from src/legacy/ui/public/agg_types/metrics/lib/ordinal_suffix.ts rename to src/legacy/core_plugins/data/public/search/aggs/metrics/lib/ordinal_suffix.ts diff --git a/src/legacy/ui/public/agg_types/metrics/lib/parent_pipeline_agg_helper.ts b/src/legacy/core_plugins/data/public/search/aggs/metrics/lib/parent_pipeline_agg_helper.ts similarity index 94% rename from src/legacy/ui/public/agg_types/metrics/lib/parent_pipeline_agg_helper.ts rename to src/legacy/core_plugins/data/public/search/aggs/metrics/lib/parent_pipeline_agg_helper.ts index 4d558e50304e6..0d1b2472bb8e2 100644 --- a/src/legacy/ui/public/agg_types/metrics/lib/parent_pipeline_agg_helper.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/metrics/lib/parent_pipeline_agg_helper.ts @@ -36,7 +36,7 @@ const metricAggFilter = [ '!geo_centroid', ]; -const metricAggTitle = i18n.translate('common.ui.aggTypes.metrics.metricAggTitle', { +const metricAggTitle = i18n.translate('data.search.aggs.metrics.metricAggTitle', { defaultMessage: 'Metric agg', }); @@ -51,7 +51,7 @@ const [metricAggSchema] = new Schemas([ ]).all; const parentPipelineType = i18n.translate( - 'common.ui.aggTypes.metrics.parentPipelineAggregationsSubtypeTitle', + 'data.search.aggs.metrics.parentPipelineAggregationsSubtypeTitle', { defaultMessage: 'Parent Pipeline Aggregations', } diff --git a/src/legacy/ui/public/agg_types/metrics/lib/parent_pipeline_agg_writer.ts b/src/legacy/core_plugins/data/public/search/aggs/metrics/lib/parent_pipeline_agg_writer.ts similarity index 94% rename from src/legacy/ui/public/agg_types/metrics/lib/parent_pipeline_agg_writer.ts rename to src/legacy/core_plugins/data/public/search/aggs/metrics/lib/parent_pipeline_agg_writer.ts index 684fe721a754a..bc0359b2a213d 100644 --- a/src/legacy/ui/public/agg_types/metrics/lib/parent_pipeline_agg_writer.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/metrics/lib/parent_pipeline_agg_writer.ts @@ -17,13 +17,13 @@ * under the License. */ -import { AggConfigs } from '../../agg_configs'; +import { IAggConfigs } from '../../agg_configs'; import { IMetricAggConfig } from '../metric_agg_type'; export const parentPipelineAggWriter = ( agg: IMetricAggConfig, output: Record, - aggConfigs?: AggConfigs + aggConfigs?: IAggConfigs ): void => { const customMetric = agg.getParam('customMetric'); const metricAgg = agg.getParam('metricAgg'); diff --git a/src/legacy/ui/public/agg_types/metrics/lib/sibling_pipeline_agg_helper.ts b/src/legacy/core_plugins/data/public/search/aggs/metrics/lib/sibling_pipeline_agg_helper.ts similarity index 93% rename from src/legacy/ui/public/agg_types/metrics/lib/sibling_pipeline_agg_helper.ts rename to src/legacy/core_plugins/data/public/search/aggs/metrics/lib/sibling_pipeline_agg_helper.ts index 9dd737bd6708e..3956bda1812ad 100644 --- a/src/legacy/ui/public/agg_types/metrics/lib/sibling_pipeline_agg_helper.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/metrics/lib/sibling_pipeline_agg_helper.ts @@ -47,7 +47,7 @@ const [metricAggSchema] = new Schemas([ { group: 'none', name: 'metricAgg', - title: i18n.translate('common.ui.aggTypes.metrics.metricAggTitle', { + title: i18n.translate('data.search.aggs.metrics.metricAggTitle', { defaultMessage: 'Metric agg', }), aggFilter: metricAggFilter, @@ -57,7 +57,7 @@ const [metricAggSchema] = new Schemas([ const [bucketAggSchema] = new Schemas([ { group: 'none', - title: i18n.translate('common.ui.aggTypes.metrics.bucketAggTitle', { + title: i18n.translate('data.search.aggs.metrics.bucketAggTitle', { defaultMessage: 'Bucket agg', }), name: 'bucketAgg', @@ -66,7 +66,7 @@ const [bucketAggSchema] = new Schemas([ ]).all; const siblingPipelineType = i18n.translate( - 'common.ui.aggTypes.metrics.siblingPipelineAggregationsSubtypeTitle', + 'data.search.aggs.metrics.siblingPipelineAggregationsSubtypeTitle', { defaultMessage: 'Sibling pipeline aggregations', } diff --git a/src/legacy/ui/public/agg_types/metrics/lib/sibling_pipeline_agg_writer.ts b/src/legacy/core_plugins/data/public/search/aggs/metrics/lib/sibling_pipeline_agg_writer.ts similarity index 100% rename from src/legacy/ui/public/agg_types/metrics/lib/sibling_pipeline_agg_writer.ts rename to src/legacy/core_plugins/data/public/search/aggs/metrics/lib/sibling_pipeline_agg_writer.ts diff --git a/src/legacy/ui/public/agg_types/metrics/max.ts b/src/legacy/core_plugins/data/public/search/aggs/metrics/max.ts similarity index 86% rename from src/legacy/ui/public/agg_types/metrics/max.ts rename to src/legacy/core_plugins/data/public/search/aggs/metrics/max.ts index 5c43511acee72..d561788936b51 100644 --- a/src/legacy/ui/public/agg_types/metrics/max.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/metrics/max.ts @@ -20,9 +20,9 @@ import { i18n } from '@kbn/i18n'; import { MetricAggType } from './metric_agg_type'; import { METRIC_TYPES } from './metric_agg_types'; -import { KBN_FIELD_TYPES } from '../../../../../plugins/data/public'; +import { KBN_FIELD_TYPES } from '../../../../../../../plugins/data/public'; -const maxTitle = i18n.translate('common.ui.aggTypes.metrics.maxTitle', { +const maxTitle = i18n.translate('data.search.aggs.metrics.maxTitle', { defaultMessage: 'Max', }); @@ -30,7 +30,7 @@ export const maxMetricAgg = new MetricAggType({ name: METRIC_TYPES.MAX, title: maxTitle, makeLabel(aggConfig) { - return i18n.translate('common.ui.aggTypes.metrics.maxLabel', { + return i18n.translate('data.search.aggs.metrics.maxLabel', { defaultMessage: 'Max {field}', values: { field: aggConfig.getFieldDisplayName() }, }); diff --git a/src/legacy/ui/public/agg_types/metrics/median.test.ts b/src/legacy/core_plugins/data/public/search/aggs/metrics/median.test.ts similarity index 95% rename from src/legacy/ui/public/agg_types/metrics/median.test.ts rename to src/legacy/core_plugins/data/public/search/aggs/metrics/median.test.ts index 819c24f135cdc..9affb0e3b2814 100644 --- a/src/legacy/ui/public/agg_types/metrics/median.test.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/metrics/median.test.ts @@ -17,13 +17,13 @@ * under the License. */ -import { AggConfigs } from '../agg_configs'; +import { AggConfigs, IAggConfigs } from '../agg_configs'; import { METRIC_TYPES } from './metric_agg_types'; jest.mock('ui/new_platform'); describe('AggTypeMetricMedianProvider class', () => { - let aggConfigs: AggConfigs; + let aggConfigs: IAggConfigs; beforeEach(() => { const field = { diff --git a/src/legacy/ui/public/agg_types/metrics/median.ts b/src/legacy/core_plugins/data/public/search/aggs/metrics/median.ts similarity index 88% rename from src/legacy/ui/public/agg_types/metrics/median.ts rename to src/legacy/core_plugins/data/public/search/aggs/metrics/median.ts index 5792d4a7c2ba3..be080aaa5ee6f 100644 --- a/src/legacy/ui/public/agg_types/metrics/median.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/metrics/median.ts @@ -22,9 +22,9 @@ import { METRIC_TYPES } from './metric_agg_types'; // @ts-ignore import { percentilesMetricAgg } from './percentiles'; -import { KBN_FIELD_TYPES } from '../../../../../plugins/data/public'; +import { KBN_FIELD_TYPES } from '../../../../../../../plugins/data/public'; -const medianTitle = i18n.translate('common.ui.aggTypes.metrics.medianTitle', { +const medianTitle = i18n.translate('data.search.aggs.metrics.medianTitle', { defaultMessage: 'Median', }); @@ -33,7 +33,7 @@ export const medianMetricAgg = new MetricAggType({ dslName: 'percentiles', title: medianTitle, makeLabel(aggConfig) { - return i18n.translate('common.ui.aggTypes.metrics.medianLabel', { + return i18n.translate('data.search.aggs.metrics.medianLabel', { defaultMessage: 'Median {field}', values: { field: aggConfig.getFieldDisplayName() }, }); diff --git a/src/legacy/ui/public/agg_types/metrics/metric_agg_type.ts b/src/legacy/core_plugins/data/public/search/aggs/metrics/metric_agg_type.ts similarity index 92% rename from src/legacy/ui/public/agg_types/metrics/metric_agg_type.ts rename to src/legacy/core_plugins/data/public/search/aggs/metrics/metric_agg_type.ts index 5cd3dffb10b9d..e7d286c187ef8 100644 --- a/src/legacy/ui/public/agg_types/metrics/metric_agg_type.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/metrics/metric_agg_type.ts @@ -23,7 +23,7 @@ import { AggType, AggTypeConfig } from '../agg_type'; import { AggParamType } from '../param_types/agg'; import { AggConfig } from '../agg_config'; import { METRIC_TYPES } from './metric_agg_types'; -import { KBN_FIELD_TYPES } from '../../../../../plugins/data/public'; +import { KBN_FIELD_TYPES } from '../../../../../../../plugins/data/public'; export interface IMetricAggConfig extends AggConfig { type: InstanceType; @@ -43,6 +43,9 @@ interface MetricAggTypeConfig subtype?: string; } +// TODO need to make a more explicit interface for this +export type IMetricAggType = MetricAggType; + export class MetricAggType extends AggType< TMetricAggConfig, MetricAggParam @@ -83,7 +86,7 @@ export class MetricAggType { const field = { diff --git a/src/legacy/ui/public/agg_types/metrics/percentile_ranks.ts b/src/legacy/core_plugins/data/public/search/aggs/metrics/percentile_ranks.ts similarity index 89% rename from src/legacy/ui/public/agg_types/metrics/percentile_ranks.ts rename to src/legacy/core_plugins/data/public/search/aggs/metrics/percentile_ranks.ts index cbd46e3f5b28d..38b47a7e97d2f 100644 --- a/src/legacy/ui/public/agg_types/metrics/percentile_ranks.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/metrics/percentile_ranks.ts @@ -24,7 +24,7 @@ import { getResponseAggConfigClass, IResponseAggConfig } from './lib/get_respons import { getPercentileValue } from './percentiles_get_value'; import { METRIC_TYPES } from './metric_agg_types'; -import { fieldFormats, KBN_FIELD_TYPES } from '../../../../../plugins/data/public'; +import { fieldFormats, KBN_FIELD_TYPES } from '../../../../../../../plugins/data/public'; // required by the values editor @@ -41,7 +41,7 @@ const valueProps = { const customLabel = this.getParam('customLabel'); const label = customLabel || this.getFieldDisplayName(); - return i18n.translate('common.ui.aggTypes.metrics.percentileRanks.valuePropsLabel', { + return i18n.translate('data.search.aggs.metrics.percentileRanks.valuePropsLabel', { defaultMessage: 'Percentile rank {format} of "{label}"', values: { format: format.convert(this.key, 'text'), label }, }); @@ -50,11 +50,11 @@ const valueProps = { export const percentileRanksMetricAgg = new MetricAggType({ name: METRIC_TYPES.PERCENTILE_RANKS, - title: i18n.translate('common.ui.aggTypes.metrics.percentileRanksTitle', { + title: i18n.translate('data.search.aggs.metrics.percentileRanksTitle', { defaultMessage: 'Percentile Ranks', }), makeLabel(agg) { - return i18n.translate('common.ui.aggTypes.metrics.percentileRanksLabel', { + return i18n.translate('data.search.aggs.metrics.percentileRanksLabel', { defaultMessage: 'Percentile ranks of {field}', values: { field: agg.getFieldDisplayName() }, }); diff --git a/src/legacy/ui/public/agg_types/metrics/percentiles.test.ts b/src/legacy/core_plugins/data/public/search/aggs/metrics/percentiles.test.ts similarity index 95% rename from src/legacy/ui/public/agg_types/metrics/percentiles.test.ts rename to src/legacy/core_plugins/data/public/search/aggs/metrics/percentiles.test.ts index c9f4bcc3862a0..dd1aaca973e47 100644 --- a/src/legacy/ui/public/agg_types/metrics/percentiles.test.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/metrics/percentiles.test.ts @@ -18,13 +18,13 @@ */ import { IPercentileAggConfig, percentilesMetricAgg } from './percentiles'; -import { AggConfigs } from '../agg_configs'; +import { AggConfigs, IAggConfigs } from '../agg_configs'; import { METRIC_TYPES } from './metric_agg_types'; jest.mock('ui/new_platform'); describe('AggTypesMetricsPercentilesProvider class', () => { - let aggConfigs: AggConfigs; + let aggConfigs: IAggConfigs; beforeEach(() => { const field = { diff --git a/src/legacy/ui/public/agg_types/metrics/percentiles.ts b/src/legacy/core_plugins/data/public/search/aggs/metrics/percentiles.ts similarity index 88% rename from src/legacy/ui/public/agg_types/metrics/percentiles.ts rename to src/legacy/core_plugins/data/public/search/aggs/metrics/percentiles.ts index 040324d8da5df..39dc0d0f181e9 100644 --- a/src/legacy/ui/public/agg_types/metrics/percentiles.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/metrics/percentiles.ts @@ -21,7 +21,7 @@ import { i18n } from '@kbn/i18n'; import { MetricAggType } from './metric_agg_type'; import { METRIC_TYPES } from './metric_agg_types'; -import { KBN_FIELD_TYPES } from '../../../../../plugins/data/public'; +import { KBN_FIELD_TYPES } from '../../../../../../../plugins/data/public'; import { getResponseAggConfigClass, IResponseAggConfig } from './lib/get_response_agg_config_class'; import { getPercentileValue } from './percentiles_get_value'; @@ -36,7 +36,7 @@ const valueProps = { const customLabel = this.getParam('customLabel'); const label = customLabel || this.getFieldDisplayName(); - return i18n.translate('common.ui.aggTypes.metrics.percentiles.valuePropsLabel', { + return i18n.translate('data.search.aggs.metrics.percentiles.valuePropsLabel', { defaultMessage: '{percentile} percentile of {label}', values: { percentile: ordinalSuffix(this.key), label }, }); @@ -45,11 +45,11 @@ const valueProps = { export const percentilesMetricAgg = new MetricAggType({ name: METRIC_TYPES.PERCENTILES, - title: i18n.translate('common.ui.aggTypes.metrics.percentilesTitle', { + title: i18n.translate('data.search.aggs.metrics.percentilesTitle', { defaultMessage: 'Percentiles', }), makeLabel(agg) { - return i18n.translate('common.ui.aggTypes.metrics.percentilesLabel', { + return i18n.translate('data.search.aggs.metrics.percentilesLabel', { defaultMessage: 'Percentiles of {field}', values: { field: agg.getFieldDisplayName() }, }); diff --git a/src/legacy/ui/public/agg_types/metrics/percentiles_get_value.ts b/src/legacy/core_plugins/data/public/search/aggs/metrics/percentiles_get_value.ts similarity index 100% rename from src/legacy/ui/public/agg_types/metrics/percentiles_get_value.ts rename to src/legacy/core_plugins/data/public/search/aggs/metrics/percentiles_get_value.ts diff --git a/src/legacy/ui/public/agg_types/metrics/serial_diff.ts b/src/legacy/core_plugins/data/public/search/aggs/metrics/serial_diff.ts similarity index 89% rename from src/legacy/ui/public/agg_types/metrics/serial_diff.ts rename to src/legacy/core_plugins/data/public/search/aggs/metrics/serial_diff.ts index bb5431fbbefd9..5af6e1952d135 100644 --- a/src/legacy/ui/public/agg_types/metrics/serial_diff.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/metrics/serial_diff.ts @@ -23,11 +23,11 @@ import { parentPipelineAggHelper } from './lib/parent_pipeline_agg_helper'; import { makeNestedLabel } from './lib/make_nested_label'; import { METRIC_TYPES } from './metric_agg_types'; -const serialDiffTitle = i18n.translate('common.ui.aggTypes.metrics.serialDiffTitle', { +const serialDiffTitle = i18n.translate('data.search.aggs.metrics.serialDiffTitle', { defaultMessage: 'Serial Diff', }); -const serialDiffLabel = i18n.translate('common.ui.aggTypes.metrics.serialDiffLabel', { +const serialDiffLabel = i18n.translate('data.search.aggs.metrics.serialDiffLabel', { defaultMessage: 'serial diff', }); diff --git a/src/legacy/ui/public/agg_types/metrics/sibling_pipeline.test.ts b/src/legacy/core_plugins/data/public/search/aggs/metrics/sibling_pipeline.test.ts similarity index 100% rename from src/legacy/ui/public/agg_types/metrics/sibling_pipeline.test.ts rename to src/legacy/core_plugins/data/public/search/aggs/metrics/sibling_pipeline.test.ts diff --git a/src/legacy/ui/public/agg_types/metrics/std_deviation.test.ts b/src/legacy/core_plugins/data/public/search/aggs/metrics/std_deviation.test.ts similarity index 100% rename from src/legacy/ui/public/agg_types/metrics/std_deviation.test.ts rename to src/legacy/core_plugins/data/public/search/aggs/metrics/std_deviation.test.ts diff --git a/src/legacy/ui/public/agg_types/metrics/std_deviation.ts b/src/legacy/core_plugins/data/public/search/aggs/metrics/std_deviation.ts similarity index 85% rename from src/legacy/ui/public/agg_types/metrics/std_deviation.ts rename to src/legacy/core_plugins/data/public/search/aggs/metrics/std_deviation.ts index b2e6d3b3ca4d0..caf3bb71dd89a 100644 --- a/src/legacy/ui/public/agg_types/metrics/std_deviation.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/metrics/std_deviation.ts @@ -22,7 +22,7 @@ import { i18n } from '@kbn/i18n'; import { MetricAggType } from './metric_agg_type'; import { METRIC_TYPES } from './metric_agg_types'; import { getResponseAggConfigClass, IResponseAggConfig } from './lib/get_response_agg_config_class'; -import { KBN_FIELD_TYPES } from '../../../../../plugins/data/public'; +import { KBN_FIELD_TYPES } from '../../../../../../../plugins/data/public'; interface ValProp { valProp: string[]; @@ -51,7 +51,7 @@ const responseAggConfigProps = { keyedDetails(this: IStdDevAggConfig, customLabel: string, fieldDisplayName: string) { const label = customLabel || - i18n.translate('common.ui.aggTypes.metrics.standardDeviation.keyDetailsLabel', { + i18n.translate('data.search.aggs.metrics.standardDeviation.keyDetailsLabel', { defaultMessage: 'Standard Deviation of {fieldDisplayName}', values: { fieldDisplayName }, }); @@ -59,14 +59,14 @@ const responseAggConfigProps = { return { std_lower: { valProp: ['std_deviation_bounds', 'lower'], - title: i18n.translate('common.ui.aggTypes.metrics.standardDeviation.lowerKeyDetailsTitle', { + title: i18n.translate('data.search.aggs.metrics.standardDeviation.lowerKeyDetailsTitle', { defaultMessage: 'Lower {label}', values: { label }, }), }, std_upper: { valProp: ['std_deviation_bounds', 'upper'], - title: i18n.translate('common.ui.aggTypes.metrics.standardDeviation.upperKeyDetailsTitle', { + title: i18n.translate('data.search.aggs.metrics.standardDeviation.upperKeyDetailsTitle', { defaultMessage: 'Upper {label}', values: { label }, }), @@ -78,11 +78,11 @@ const responseAggConfigProps = { export const stdDeviationMetricAgg = new MetricAggType({ name: METRIC_TYPES.STD_DEV, dslName: 'extended_stats', - title: i18n.translate('common.ui.aggTypes.metrics.standardDeviationTitle', { + title: i18n.translate('data.search.aggs.metrics.standardDeviationTitle', { defaultMessage: 'Standard Deviation', }), makeLabel(agg) { - return i18n.translate('common.ui.aggTypes.metrics.standardDeviationLabel', { + return i18n.translate('data.search.aggs.metrics.standardDeviationLabel', { defaultMessage: 'Standard Deviation of {field}', values: { field: agg.getFieldDisplayName() }, }); diff --git a/src/legacy/ui/public/agg_types/metrics/sum.ts b/src/legacy/core_plugins/data/public/search/aggs/metrics/sum.ts similarity index 86% rename from src/legacy/ui/public/agg_types/metrics/sum.ts rename to src/legacy/core_plugins/data/public/search/aggs/metrics/sum.ts index ce79c761ce799..f3450ba1700c8 100644 --- a/src/legacy/ui/public/agg_types/metrics/sum.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/metrics/sum.ts @@ -20,9 +20,9 @@ import { i18n } from '@kbn/i18n'; import { MetricAggType } from './metric_agg_type'; import { METRIC_TYPES } from './metric_agg_types'; -import { KBN_FIELD_TYPES } from '../../../../../plugins/data/public'; +import { KBN_FIELD_TYPES } from '../../../../../../../plugins/data/public'; -const sumTitle = i18n.translate('common.ui.aggTypes.metrics.sumTitle', { +const sumTitle = i18n.translate('data.search.aggs.metrics.sumTitle', { defaultMessage: 'Sum', }); @@ -30,7 +30,7 @@ export const sumMetricAgg = new MetricAggType({ name: METRIC_TYPES.SUM, title: sumTitle, makeLabel(aggConfig) { - return i18n.translate('common.ui.aggTypes.metrics.sumLabel', { + return i18n.translate('data.search.aggs.metrics.sumLabel', { defaultMessage: 'Sum of {field}', values: { field: aggConfig.getFieldDisplayName() }, }); diff --git a/src/legacy/ui/public/agg_types/metrics/top_hit.test.ts b/src/legacy/core_plugins/data/public/search/aggs/metrics/top_hit.test.ts similarity index 99% rename from src/legacy/ui/public/agg_types/metrics/top_hit.test.ts rename to src/legacy/core_plugins/data/public/search/aggs/metrics/top_hit.test.ts index 3e861c052d367..a973de4fe8659 100644 --- a/src/legacy/ui/public/agg_types/metrics/top_hit.test.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/metrics/top_hit.test.ts @@ -21,7 +21,7 @@ import { dropRight, last } from 'lodash'; import { topHitMetricAgg } from './top_hit'; import { AggConfigs } from '../agg_configs'; import { IMetricAggConfig } from './metric_agg_type'; -import { KBN_FIELD_TYPES } from '../../../../../plugins/data/public'; +import { KBN_FIELD_TYPES } from '../../../../../../../plugins/data/public'; jest.mock('ui/new_platform'); diff --git a/src/legacy/ui/public/agg_types/metrics/top_hit.ts b/src/legacy/core_plugins/data/public/search/aggs/metrics/top_hit.ts similarity index 87% rename from src/legacy/ui/public/agg_types/metrics/top_hit.ts rename to src/legacy/core_plugins/data/public/search/aggs/metrics/top_hit.ts index 43fe33bdebeb9..81bd14ded75b0 100644 --- a/src/legacy/ui/public/agg_types/metrics/top_hit.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/metrics/top_hit.ts @@ -22,7 +22,7 @@ import { i18n } from '@kbn/i18n'; import { IMetricAggConfig, MetricAggType } from './metric_agg_type'; import { aggTypeFieldFilters } from '../param_types/filter'; import { METRIC_TYPES } from './metric_agg_types'; -import { KBN_FIELD_TYPES } from '../../../../../plugins/data/public'; +import { KBN_FIELD_TYPES } from '../../../../../../../plugins/data/public'; // @ts-ignore import { wrapWithInlineComp } from '../buckets/inline_comp_wrapper'; @@ -46,14 +46,14 @@ aggTypeFieldFilters.addFilter((field, aggConfig) => { export const topHitMetricAgg = new MetricAggType({ name: METRIC_TYPES.TOP_HITS, - title: i18n.translate('common.ui.aggTypes.metrics.topHitTitle', { + title: i18n.translate('data.search.aggs.metrics.topHitTitle', { defaultMessage: 'Top Hit', }), makeLabel(aggConfig) { - const lastPrefixLabel = i18n.translate('common.ui.aggTypes.metrics.topHit.lastPrefixLabel', { + const lastPrefixLabel = i18n.translate('data.search.aggs.metrics.topHit.lastPrefixLabel', { defaultMessage: 'Last', }); - const firstPrefixLabel = i18n.translate('common.ui.aggTypes.metrics.topHit.firstPrefixLabel', { + const firstPrefixLabel = i18n.translate('data.search.aggs.metrics.topHit.firstPrefixLabel', { defaultMessage: 'First', }); @@ -106,7 +106,7 @@ export const topHitMetricAgg = new MetricAggType({ type: 'optioned', options: [ { - text: i18n.translate('common.ui.aggTypes.metrics.topHit.minLabel', { + text: i18n.translate('data.search.aggs.metrics.topHit.minLabel', { defaultMessage: 'Min', }), isCompatible: isNumericFieldSelected, @@ -114,7 +114,7 @@ export const topHitMetricAgg = new MetricAggType({ value: 'min', }, { - text: i18n.translate('common.ui.aggTypes.metrics.topHit.maxLabel', { + text: i18n.translate('data.search.aggs.metrics.topHit.maxLabel', { defaultMessage: 'Max', }), isCompatible: isNumericFieldSelected, @@ -122,7 +122,7 @@ export const topHitMetricAgg = new MetricAggType({ value: 'max', }, { - text: i18n.translate('common.ui.aggTypes.metrics.topHit.sumLabel', { + text: i18n.translate('data.search.aggs.metrics.topHit.sumLabel', { defaultMessage: 'Sum', }), isCompatible: isNumericFieldSelected, @@ -130,7 +130,7 @@ export const topHitMetricAgg = new MetricAggType({ value: 'sum', }, { - text: i18n.translate('common.ui.aggTypes.metrics.topHit.averageLabel', { + text: i18n.translate('data.search.aggs.metrics.topHit.averageLabel', { defaultMessage: 'Average', }), isCompatible: isNumericFieldSelected, @@ -138,7 +138,7 @@ export const topHitMetricAgg = new MetricAggType({ value: 'average', }, { - text: i18n.translate('common.ui.aggTypes.metrics.topHit.concatenateLabel', { + text: i18n.translate('data.search.aggs.metrics.topHit.concatenateLabel', { defaultMessage: 'Concatenate', }), isCompatible(aggConfig: IMetricAggConfig) { @@ -174,13 +174,13 @@ export const topHitMetricAgg = new MetricAggType({ default: 'desc', options: [ { - text: i18n.translate('common.ui.aggTypes.metrics.topHit.descendingLabel', { + text: i18n.translate('data.search.aggs.metrics.topHit.descendingLabel', { defaultMessage: 'Descending', }), value: 'desc', }, { - text: i18n.translate('common.ui.aggTypes.metrics.topHit.ascendingLabel', { + text: i18n.translate('data.search.aggs.metrics.topHit.ascendingLabel', { defaultMessage: 'Ascending', }), value: 'asc', diff --git a/src/legacy/ui/public/agg_types/param_types/agg.ts b/src/legacy/core_plugins/data/public/search/aggs/param_types/agg.ts similarity index 100% rename from src/legacy/ui/public/agg_types/param_types/agg.ts rename to src/legacy/core_plugins/data/public/search/aggs/param_types/agg.ts diff --git a/src/legacy/ui/public/agg_types/param_types/base.ts b/src/legacy/core_plugins/data/public/search/aggs/param_types/base.ts similarity index 94% rename from src/legacy/ui/public/agg_types/param_types/base.ts rename to src/legacy/core_plugins/data/public/search/aggs/param_types/base.ts index 15ec44e2ca5ae..1523cb03eb966 100644 --- a/src/legacy/ui/public/agg_types/param_types/base.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/param_types/base.ts @@ -17,9 +17,9 @@ * under the License. */ -import { AggConfigs } from '../agg_configs'; +import { IAggConfigs } from '../agg_configs'; import { AggConfig } from '../agg_config'; -import { FetchOptions, ISearchSource } from '../../../../../plugins/data/public'; +import { FetchOptions, ISearchSource } from '../../../../../../../plugins/data/public'; export class BaseParamType { name: string; @@ -31,7 +31,7 @@ export class BaseParamType { write: ( aggConfig: TAggConfig, output: Record, - aggConfigs?: AggConfigs, + aggConfigs?: IAggConfigs, locals?: Record ) => void; serialize: (value: any, aggConfig?: TAggConfig) => any; diff --git a/src/legacy/ui/public/agg_types/param_types/field.test.ts b/src/legacy/core_plugins/data/public/search/aggs/param_types/field.test.ts similarity index 98% rename from src/legacy/ui/public/agg_types/param_types/field.test.ts rename to src/legacy/core_plugins/data/public/search/aggs/param_types/field.test.ts index 9cea2934d7459..d0fa711d89c70 100644 --- a/src/legacy/ui/public/agg_types/param_types/field.test.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/param_types/field.test.ts @@ -19,7 +19,7 @@ import { BaseParamType } from './base'; import { FieldParamType } from './field'; -import { ES_FIELD_TYPES, KBN_FIELD_TYPES } from '../../../../../plugins/data/public'; +import { ES_FIELD_TYPES, KBN_FIELD_TYPES } from '../../../../../../../plugins/data/public'; jest.mock('ui/new_platform'); diff --git a/src/legacy/ui/public/agg_types/param_types/field.ts b/src/legacy/core_plugins/data/public/search/aggs/param_types/field.ts similarity index 83% rename from src/legacy/ui/public/agg_types/param_types/field.ts rename to src/legacy/core_plugins/data/public/search/aggs/param_types/field.ts index d01e059c6c616..c41c159ad0f78 100644 --- a/src/legacy/ui/public/agg_types/param_types/field.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/param_types/field.ts @@ -19,16 +19,18 @@ // @ts-ignore import { i18n } from '@kbn/i18n'; +import { npStart } from 'ui/new_platform'; import { AggConfig } from '../agg_config'; -import { SavedObjectNotFound } from '../../../../../plugins/kibana_utils/public'; +import { SavedObjectNotFound } from '../../../../../../../plugins/kibana_utils/public'; import { BaseParamType } from './base'; -import { npStart } from '../../new_platform'; import { propFilter } from '../filter'; -import { Field, IFieldList } from '../../../../../plugins/data/public'; -import { isNestedField } from '../../../../../plugins/data/public'; +import { Field, IFieldList, isNestedField } from '../../../../../../../plugins/data/public'; const filterByType = propFilter('type'); +// TODO need to make a more explicit interface for this +export type IFieldParamType = FieldParamType; + export class FieldParamType extends BaseParamType { required = true; scriptable = true; @@ -47,15 +49,12 @@ export class FieldParamType extends BaseParamType { if (!field) { throw new TypeError( - i18n.translate( - 'common.ui.aggTypes.paramTypes.field.requiredFieldParameterErrorMessage', - { - defaultMessage: '{fieldParameter} is a required parameter', - values: { - fieldParameter: '"field"', - }, - } - ) + i18n.translate('data.search.aggs.paramTypes.field.requiredFieldParameterErrorMessage', { + defaultMessage: '{fieldParameter} is a required parameter', + values: { + fieldParameter: '"field"', + }, + }) ); } @@ -91,7 +90,7 @@ export class FieldParamType extends BaseParamType { if (!validField) { npStart.core.notifications.toasts.addDanger( i18n.translate( - 'common.ui.aggTypes.paramTypes.field.invalidSavedFieldParameterErrorMessage', + 'data.search.aggs.paramTypes.field.invalidSavedFieldParameterErrorMessage', { defaultMessage: 'Saved {fieldParameter} parameter is now invalid. Please select a new field.', diff --git a/src/legacy/ui/public/agg_types/param_types/filter/field_filters.test.ts b/src/legacy/core_plugins/data/public/search/aggs/param_types/filter/field_filters.test.ts similarity index 97% rename from src/legacy/ui/public/agg_types/param_types/filter/field_filters.test.ts rename to src/legacy/core_plugins/data/public/search/aggs/param_types/filter/field_filters.test.ts index 384c142408012..fb53e72b85c60 100644 --- a/src/legacy/ui/public/agg_types/param_types/filter/field_filters.test.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/param_types/filter/field_filters.test.ts @@ -20,7 +20,7 @@ import { IndexedArray } from 'ui/indexed_array'; import { AggTypeFieldFilters } from './field_filters'; import { AggConfig } from '../../agg_config'; -import { Field } from '../../../../../../plugins/data/public'; +import { Field } from '../../../../../../../../plugins/data/public'; describe('AggTypeFieldFilters', () => { let registry: AggTypeFieldFilters; diff --git a/src/legacy/ui/public/agg_types/param_types/filter/field_filters.ts b/src/legacy/core_plugins/data/public/search/aggs/param_types/filter/field_filters.ts similarity index 100% rename from src/legacy/ui/public/agg_types/param_types/filter/field_filters.ts rename to src/legacy/core_plugins/data/public/search/aggs/param_types/filter/field_filters.ts diff --git a/src/legacy/ui/public/agg_types/param_types/filter/index.ts b/src/legacy/core_plugins/data/public/search/aggs/param_types/filter/index.ts similarity index 100% rename from src/legacy/ui/public/agg_types/param_types/filter/index.ts rename to src/legacy/core_plugins/data/public/search/aggs/param_types/filter/index.ts diff --git a/src/legacy/ui/public/agg_types/param_types/index.ts b/src/legacy/core_plugins/data/public/search/aggs/param_types/index.ts similarity index 100% rename from src/legacy/ui/public/agg_types/param_types/index.ts rename to src/legacy/core_plugins/data/public/search/aggs/param_types/index.ts diff --git a/src/legacy/ui/public/agg_types/param_types/json.test.ts b/src/legacy/core_plugins/data/public/search/aggs/param_types/json.test.ts similarity index 100% rename from src/legacy/ui/public/agg_types/param_types/json.test.ts rename to src/legacy/core_plugins/data/public/search/aggs/param_types/json.test.ts diff --git a/src/legacy/ui/public/agg_types/param_types/json.ts b/src/legacy/core_plugins/data/public/search/aggs/param_types/json.ts similarity index 100% rename from src/legacy/ui/public/agg_types/param_types/json.ts rename to src/legacy/core_plugins/data/public/search/aggs/param_types/json.ts diff --git a/src/legacy/ui/public/agg_types/param_types/optioned.test.ts b/src/legacy/core_plugins/data/public/search/aggs/param_types/optioned.test.ts similarity index 100% rename from src/legacy/ui/public/agg_types/param_types/optioned.test.ts rename to src/legacy/core_plugins/data/public/search/aggs/param_types/optioned.test.ts diff --git a/src/legacy/ui/public/agg_types/param_types/optioned.ts b/src/legacy/core_plugins/data/public/search/aggs/param_types/optioned.ts similarity index 100% rename from src/legacy/ui/public/agg_types/param_types/optioned.ts rename to src/legacy/core_plugins/data/public/search/aggs/param_types/optioned.ts diff --git a/src/legacy/ui/public/agg_types/param_types/string.test.ts b/src/legacy/core_plugins/data/public/search/aggs/param_types/string.test.ts similarity index 100% rename from src/legacy/ui/public/agg_types/param_types/string.test.ts rename to src/legacy/core_plugins/data/public/search/aggs/param_types/string.test.ts diff --git a/src/legacy/ui/public/agg_types/param_types/string.ts b/src/legacy/core_plugins/data/public/search/aggs/param_types/string.ts similarity index 100% rename from src/legacy/ui/public/agg_types/param_types/string.ts rename to src/legacy/core_plugins/data/public/search/aggs/param_types/string.ts diff --git a/src/legacy/ui/public/agg_types/schemas.ts b/src/legacy/core_plugins/data/public/search/aggs/schemas.ts similarity index 98% rename from src/legacy/ui/public/agg_types/schemas.ts rename to src/legacy/core_plugins/data/public/search/aggs/schemas.ts index 05723cac1869d..1aa5ebe08656b 100644 --- a/src/legacy/ui/public/agg_types/schemas.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/schemas.ts @@ -45,7 +45,7 @@ export interface Schema { aggSettings?: any; } -class Schemas { +export class Schemas { // @ts-ignore all: IndexedArray; @@ -103,5 +103,3 @@ class Schemas { .commit(); } } - -export { Schemas }; diff --git a/src/legacy/core_plugins/data/public/search/aggs/types.ts b/src/legacy/core_plugins/data/public/search/aggs/types.ts new file mode 100644 index 0000000000000..2c918abf99fca --- /dev/null +++ b/src/legacy/core_plugins/data/public/search/aggs/types.ts @@ -0,0 +1,29 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export { IAggConfig } from './agg_config'; +export { IAggConfigs } from './agg_configs'; +export { IAggType } from './agg_type'; +export { AggParam, AggParamOption } from './agg_params'; +export { IFieldParamType } from './param_types'; +export { IMetricAggType } from './metrics/metric_agg_type'; +export { DateRangeKey } from './buckets/date_range'; +export { IpRangeKey } from './buckets/ip_range'; +export { OptionedValueProp, OptionedParamEditorProps } from './param_types/optioned'; +export { ISchemas } from './schemas'; diff --git a/src/legacy/ui/public/agg_types/utils.test.tsx b/src/legacy/core_plugins/data/public/search/aggs/utils.test.tsx similarity index 100% rename from src/legacy/ui/public/agg_types/utils.test.tsx rename to src/legacy/core_plugins/data/public/search/aggs/utils.test.tsx diff --git a/src/legacy/ui/public/agg_types/utils.ts b/src/legacy/core_plugins/data/public/search/aggs/utils.ts similarity index 92% rename from src/legacy/ui/public/agg_types/utils.ts rename to src/legacy/core_plugins/data/public/search/aggs/utils.ts index e382f821b31a9..62f07ce44ab46 100644 --- a/src/legacy/ui/public/agg_types/utils.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/utils.ts @@ -17,8 +17,8 @@ * under the License. */ -import { isValidEsInterval } from '../../../core_plugins/data/common/parse_es_interval/is_valid_es_interval'; -import { leastCommonInterval } from '../vis/lib/least_common_interval'; +import { leastCommonInterval } from 'ui/vis/lib/least_common_interval'; +import { isValidEsInterval } from '../../../common'; /** * Check a string if it's a valid JSON. diff --git a/src/legacy/core_plugins/data/public/search/expressions/esaggs.ts b/src/legacy/core_plugins/data/public/search/expressions/esaggs.ts index b4ea2cd378d61..43927337ce574 100644 --- a/src/legacy/core_plugins/data/public/search/expressions/esaggs.ts +++ b/src/legacy/core_plugins/data/public/search/expressions/esaggs.ts @@ -19,7 +19,7 @@ import { get, has } from 'lodash'; import { i18n } from '@kbn/i18n'; -import { AggConfigs } from 'ui/agg_types/agg_configs'; +import { AggConfigs, IAggConfigs } from 'ui/agg_types'; import { createFormat } from 'ui/visualize/loader/pipeline_helpers/utilities'; import { KibanaContext, @@ -50,7 +50,7 @@ import { serializeAggConfig } from './utils'; export interface RequestHandlerParams { searchSource: ISearchSource; - aggs: AggConfigs; + aggs: IAggConfigs; timeRange?: TimeRange; query?: Query; filters?: esFilters.Filter[]; diff --git a/src/legacy/core_plugins/data/public/search/expressions/utils.ts b/src/legacy/core_plugins/data/public/search/expressions/utils.ts index 4f104f2569a98..f0958ba20820f 100644 --- a/src/legacy/core_plugins/data/public/search/expressions/utils.ts +++ b/src/legacy/core_plugins/data/public/search/expressions/utils.ts @@ -17,12 +17,12 @@ * under the License. */ -import { AggConfig } from 'ui/agg_types/agg_config'; -import { AggConfigs } from '../../../../../ui/public/agg_types/agg_configs'; +import { AggConfigs } from '../aggs'; +import { IAggConfig } from '../aggs/types'; import { KibanaDatatableColumnMeta } from '../../../../../../plugins/expressions/common/expression_types'; import { IndexPattern } from '../../../../../../plugins/data/public'; -export const serializeAggConfig = (aggConfig: AggConfig): KibanaDatatableColumnMeta => { +export const serializeAggConfig = (aggConfig: IAggConfig): KibanaDatatableColumnMeta => { return { type: aggConfig.type.name, indexPatternId: aggConfig.getIndexPattern().id, diff --git a/src/legacy/core_plugins/data/public/search/index.ts b/src/legacy/core_plugins/data/public/search/index.ts index c975d5772e0a8..90e191b769a8d 100644 --- a/src/legacy/core_plugins/data/public/search/index.ts +++ b/src/legacy/core_plugins/data/public/search/index.ts @@ -17,5 +17,6 @@ * under the License. */ +export * from './aggs'; export { getRequestInspectorStats, getResponseInspectorStats } from './utils'; export { serializeAggConfig } from './expressions/utils'; diff --git a/src/legacy/core_plugins/data/public/search/search_service.ts b/src/legacy/core_plugins/data/public/search/search_service.ts new file mode 100644 index 0000000000000..45f9ff17328ad --- /dev/null +++ b/src/legacy/core_plugins/data/public/search/search_service.ts @@ -0,0 +1,93 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { CoreSetup, CoreStart } from '../../../../../core/public'; +import { + aggTypes, + AggType, + AggConfig, + AggConfigs, + FieldParamType, + MetricAggType, + aggTypeFieldFilters, + setBounds, + parentPipelineAggHelper, + siblingPipelineAggHelper, +} from './aggs'; + +interface AggsSetup { + types: typeof aggTypes; +} + +interface AggsStart { + types: typeof aggTypes; + AggConfig: typeof AggConfig; + AggConfigs: typeof AggConfigs; + AggType: typeof AggType; + aggTypeFieldFilters: typeof aggTypeFieldFilters; + FieldParamType: typeof FieldParamType; + MetricAggType: typeof MetricAggType; + parentPipelineAggHelper: typeof parentPipelineAggHelper; + siblingPipelineAggHelper: typeof siblingPipelineAggHelper; + setBounds: typeof setBounds; +} + +export interface SearchSetup { + aggs: AggsSetup; +} + +export interface SearchStart { + aggs: AggsStart; +} + +/** + * The contract provided here is a new platform shim for ui/agg_types. + * + * Once it has been refactored to work with new platform services, + * it will move into the existing search service in src/plugins/data/public/search + */ +export class SearchService { + public setup(core: CoreSetup): SearchSetup { + return { + aggs: { + types: aggTypes, // TODO convert to registry + // TODO add other items as needed + }, + }; + } + + public start(core: CoreStart): SearchStart { + return { + aggs: { + types: aggTypes, // TODO convert to registry + AggConfig, // TODO make static + AggConfigs, + AggType, + aggTypeFieldFilters, + FieldParamType, + MetricAggType, + parentPipelineAggHelper, // TODO make static + siblingPipelineAggHelper, // TODO make static + setBounds, // TODO make static + }, + }; + } + + public stop() {} +} diff --git a/src/legacy/core_plugins/data/public/search/types.ts b/src/legacy/core_plugins/data/public/search/types.ts index 140ceea487099..47ea1d168f379 100644 --- a/src/legacy/core_plugins/data/public/search/types.ts +++ b/src/legacy/core_plugins/data/public/search/types.ts @@ -17,4 +17,5 @@ * under the License. */ +export * from './aggs/types'; export * from './utils/types'; diff --git a/src/legacy/core_plugins/kibana/public/discover/kibana_services.ts b/src/legacy/core_plugins/kibana/public/discover/kibana_services.ts index d1e1dafe7c878..f698a2ee361e0 100644 --- a/src/legacy/core_plugins/kibana/public/discover/kibana_services.ts +++ b/src/legacy/core_plugins/kibana/public/discover/kibana_services.ts @@ -55,7 +55,7 @@ export { buildVislibDimensions } from '../../../visualizations/public'; export { callAfterBindingsWorkaround } from 'ui/compat'; export { getRequestInspectorStats, getResponseInspectorStats } from '../../../data/public'; // @ts-ignore -export { intervalOptions } from 'ui/agg_types/buckets/_interval_options'; +export { intervalOptions } from 'ui/agg_types'; // @ts-ignore export { migrateLegacyQuery } from 'ui/utils/migrate_legacy_query'; export { SavedObjectSaveModal } from 'ui/saved_objects/components/saved_object_save_modal'; diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/agg.test.tsx b/src/legacy/core_plugins/vis_default_editor/public/components/agg.test.tsx index 81c866923232e..f5ce55e82967d 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/agg.test.tsx +++ b/src/legacy/core_plugins/vis_default_editor/public/components/agg.test.tsx @@ -24,7 +24,7 @@ import { act } from 'react-dom/test-utils'; import { IndexPattern } from 'src/plugins/data/public'; import { VisState } from 'src/legacy/core_plugins/visualizations/public'; -import { AggType, AggGroupNames } from '../legacy_imports'; +import { IAggType, AggGroupNames } from '../legacy_imports'; import { DefaultEditorAgg, DefaultEditorAggProps } from './agg'; import { DefaultEditorAggParams } from './agg_params'; import { AGGS_ACTION_KEYS } from './agg_group_state'; @@ -117,7 +117,7 @@ describe('DefaultEditorAgg component', () => { (defaultProps.agg as any).brandNew = false; defaultProps.agg.type = { makeLabel: () => 'Agg description', - } as AggType; + } as IAggType; const comp = mount(); act(() => { @@ -258,11 +258,11 @@ describe('DefaultEditorAgg component', () => { it('should disable min_doc_count when agg is histogram or date_histogram', () => { defaultProps.agg.type = { name: 'histogram', - } as AggType; + } as IAggType; const compHistogram = shallow(); defaultProps.agg.type = { name: 'date_histogram', - } as AggType; + } as IAggType; const compDateHistogram = shallow(); expect(compHistogram.find(DefaultEditorAggParams).props()).toHaveProperty('disabledParams', [ @@ -276,7 +276,7 @@ describe('DefaultEditorAgg component', () => { it('should set error when agg is not histogram or date_histogram', () => { defaultProps.agg.type = { name: 'aggType', - } as AggType; + } as IAggType; const comp = shallow(); expect(comp.find(DefaultEditorAggParams).prop('aggError')).toBeDefined(); @@ -285,7 +285,7 @@ describe('DefaultEditorAgg component', () => { it('should set min_doc_count to true when agg type was changed to histogram', () => { defaultProps.agg.type = { name: 'aggType', - } as AggType; + } as IAggType; const comp = mount(); comp.setProps({ agg: { ...defaultProps.agg, type: { name: 'histogram' } } }); @@ -299,7 +299,7 @@ describe('DefaultEditorAgg component', () => { it('should set min_doc_count to 0 when agg type was changed to date_histogram', () => { defaultProps.agg.type = { name: 'aggType', - } as AggType; + } as IAggType; const comp = mount(); comp.setProps({ agg: { ...defaultProps.agg, type: { name: 'date_histogram' } } }); diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/agg.tsx b/src/legacy/core_plugins/vis_default_editor/public/components/agg.tsx index 871bd0cdf6811..5450c29450bac 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/agg.tsx +++ b/src/legacy/core_plugins/vis_default_editor/public/components/agg.tsx @@ -28,7 +28,7 @@ import { } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { AggConfig } from '../legacy_imports'; +import { IAggConfig } from '../legacy_imports'; import { DefaultEditorAggParams } from './agg_params'; import { DefaultEditorAggCommonProps } from './agg_common_props'; import { AGGS_ACTION_KEYS, AggsAction } from './agg_group_state'; @@ -36,7 +36,7 @@ import { RowsOrColumnsControl } from './controls/rows_or_columns'; import { RadiusRatioOptionControl } from './controls/radius_ratio_option'; export interface DefaultEditorAggProps extends DefaultEditorAggCommonProps { - agg: AggConfig; + agg: IAggConfig; aggIndex: number; aggIsTooLow: boolean; dragHandleProps: {} | null; diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/agg_add.tsx b/src/legacy/core_plugins/vis_default_editor/public/components/agg_add.tsx index f5175126c31c1..d8df5b315fca0 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/agg_add.tsx +++ b/src/legacy/core_plugins/vis_default_editor/public/components/agg_add.tsx @@ -29,10 +29,10 @@ import { } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import { i18n } from '@kbn/i18n'; -import { AggConfig, AggGroupNames, Schema } from '../legacy_imports'; +import { IAggConfig, AggGroupNames, Schema } from '../legacy_imports'; interface DefaultEditorAggAddProps { - group?: AggConfig[]; + group?: IAggConfig[]; groupName: string; schemas: Schema[]; stats: { diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/agg_common_props.ts b/src/legacy/core_plugins/vis_default_editor/public/components/agg_common_props.ts index 8d803810b647a..17d2c18d2532c 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/agg_common_props.ts +++ b/src/legacy/core_plugins/vis_default_editor/public/components/agg_common_props.ts @@ -18,25 +18,25 @@ */ import { VisState, VisParams } from 'src/legacy/core_plugins/visualizations/public'; -import { AggType, AggConfig, AggGroupNames, Schema } from '../legacy_imports'; +import { IAggType, IAggConfig, AggGroupNames, Schema } from '../legacy_imports'; -type AggId = AggConfig['id']; -type AggParams = AggConfig['params']; +type AggId = IAggConfig['id']; +type AggParams = IAggConfig['params']; export type AddSchema = (schemas: Schema) => void; -export type ReorderAggs = (sourceAgg: AggConfig, destinationAgg: AggConfig) => void; +export type ReorderAggs = (sourceAgg: IAggConfig, destinationAgg: IAggConfig) => void; export interface DefaultEditorCommonProps { formIsTouched: boolean; groupName: AggGroupNames; - metricAggs: AggConfig[]; + metricAggs: IAggConfig[]; state: VisState; setAggParamValue: ( aggId: AggId, paramName: T, value: AggParams[T] ) => void; - onAggTypeChange: (aggId: AggId, aggType: AggType) => void; + onAggTypeChange: (aggId: AggId, aggType: IAggType) => void; } export interface DefaultEditorAggCommonProps extends DefaultEditorCommonProps { diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/agg_group.test.tsx b/src/legacy/core_plugins/vis_default_editor/public/components/agg_group.test.tsx index 9cbcc31bdc60e..c36c0176439f9 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/agg_group.test.tsx +++ b/src/legacy/core_plugins/vis_default_editor/public/components/agg_group.test.tsx @@ -21,7 +21,7 @@ import React from 'react'; import { mount, shallow } from 'enzyme'; import { act } from 'react-dom/test-utils'; import { VisState } from 'src/legacy/core_plugins/visualizations/public'; -import { AggConfigs, AggConfig, Schema } from '../legacy_imports'; +import { IAggConfigs, IAggConfig, Schema } from '../legacy_imports'; import { DefaultEditorAggGroup, DefaultEditorAggGroupProps } from './agg_group'; import { DefaultEditorAgg } from './agg'; import { DefaultEditorAggAdd } from './agg_add'; @@ -56,7 +56,7 @@ jest.mock('./agg_add', () => ({ describe('DefaultEditorAgg component', () => { let defaultProps: DefaultEditorAggGroupProps; - let aggs: AggConfigs; + let aggs: IAggConfigs; let setTouched: jest.Mock; let setValidity: jest.Mock; let reorderAggs: jest.Mock; @@ -76,7 +76,7 @@ describe('DefaultEditorAgg component', () => { }, }, schema: { group: 'metrics' }, - } as AggConfig, + } as IAggConfig, { id: '3', params: { @@ -85,7 +85,7 @@ describe('DefaultEditorAgg component', () => { }, }, schema: { group: 'metrics' }, - } as AggConfig, + } as IAggConfig, { id: '2', params: { @@ -94,9 +94,9 @@ describe('DefaultEditorAgg component', () => { }, }, schema: { group: 'buckets' }, - } as AggConfig, + } as IAggConfig, ], - } as AggConfigs; + } as IAggConfigs; defaultProps = { formIsTouched: false, diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/agg_group.tsx b/src/legacy/core_plugins/vis_default_editor/public/components/agg_group.tsx index 3491414bec809..768a9669025e4 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/agg_group.tsx +++ b/src/legacy/core_plugins/vis_default_editor/public/components/agg_group.tsx @@ -30,7 +30,7 @@ import { } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { AggConfig, aggGroupNamesMap, AggGroupNames, Schema } from '../legacy_imports'; +import { IAggConfig, aggGroupNamesMap, AggGroupNames, Schema } from '../legacy_imports'; import { DefaultEditorAgg } from './agg'; import { DefaultEditorAggAdd } from './agg_add'; import { AddSchema, ReorderAggs, DefaultEditorAggCommonProps } from './agg_common_props'; @@ -69,8 +69,8 @@ function DefaultEditorAggGroup({ }: DefaultEditorAggGroupProps) { const groupNameLabel = (aggGroupNamesMap() as any)[groupName]; // e.g. buckets can have no aggs - const group: AggConfig[] = useMemo( - () => state.aggs.aggs.filter((agg: AggConfig) => agg.schema.group === groupName) || [], + const group: IAggConfig[] = useMemo( + () => state.aggs.aggs.filter((agg: IAggConfig) => agg.schema.group === groupName) || [], [groupName, state.aggs.aggs] ); @@ -151,7 +151,7 @@ function DefaultEditorAggGroup({ )} <> - {group.map((agg: AggConfig, index: number) => ( + {group.map((agg: IAggConfig, index: number) => ( { - let group: AggConfig[]; + let group: IAggConfig[]; beforeEach(() => { group = [ @@ -39,7 +39,7 @@ describe('DefaultEditorGroup helpers', () => { }, }, schema: { name: 'metric', min: 1, mustBeFirst: true }, - } as AggConfig, + } as IAggConfig, { id: '2', params: { @@ -48,7 +48,7 @@ describe('DefaultEditorGroup helpers', () => { }, }, schema: { name: 'metric', min: 2 }, - } as AggConfig, + } as IAggConfig, ]; }); diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/agg_group_helper.tsx b/src/legacy/core_plugins/vis_default_editor/public/components/agg_group_helper.tsx index 87f0d00d50a1d..d2e8e5401c0f7 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/agg_group_helper.tsx +++ b/src/legacy/core_plugins/vis_default_editor/public/components/agg_group_helper.tsx @@ -18,12 +18,12 @@ */ import { findIndex, isEmpty } from 'lodash'; -import { AggConfig } from '../legacy_imports'; +import { IAggConfig } from '../legacy_imports'; import { AggsState } from './agg_group_state'; -const isAggRemovable = (agg: AggConfig, group: AggConfig[]) => { +const isAggRemovable = (agg: IAggConfig, group: IAggConfig[]) => { const metricCount = group.reduce( - (count, aggregation: AggConfig) => + (count, aggregation: IAggConfig) => aggregation.schema.name === agg.schema.name ? ++count : count, 0 ); @@ -31,20 +31,20 @@ const isAggRemovable = (agg: AggConfig, group: AggConfig[]) => { return metricCount > agg.schema.min; }; -const getEnabledMetricAggsCount = (group: AggConfig[]) => { +const getEnabledMetricAggsCount = (group: IAggConfig[]) => { return group.reduce( - (count, aggregation: AggConfig) => + (count, aggregation: IAggConfig) => aggregation.schema.name === 'metric' && aggregation.enabled ? ++count : count, 0 ); }; -const calcAggIsTooLow = (agg: AggConfig, aggIndex: number, group: AggConfig[]) => { +const calcAggIsTooLow = (agg: IAggConfig, aggIndex: number, group: IAggConfig[]) => { if (!agg.schema.mustBeFirst) { return false; } - const firstDifferentSchema = findIndex(group, (aggr: AggConfig) => { + const firstDifferentSchema = findIndex(group, (aggr: IAggConfig) => { return aggr.schema !== agg.schema; }); diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/agg_group_state.tsx b/src/legacy/core_plugins/vis_default_editor/public/components/agg_group_state.tsx index b06ca1c2ce57a..d022297ae72b3 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/agg_group_state.tsx +++ b/src/legacy/core_plugins/vis_default_editor/public/components/agg_group_state.tsx @@ -17,7 +17,7 @@ * under the License. */ -import { AggConfig } from '../legacy_imports'; +import { IAggConfig } from '../legacy_imports'; export enum AGGS_ACTION_KEYS { TOUCHED = 'aggsTouched', @@ -52,7 +52,7 @@ function aggGroupReducer(state: AggsState, action: AggsAction): AggsState { } } -function initAggsState(group: AggConfig[]): AggsState { +function initAggsState(group: IAggConfig[]): AggsState { return group.reduce((state, agg) => { state[agg.id] = { touched: false, valid: true }; return state; diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/agg_param_props.ts b/src/legacy/core_plugins/vis_default_editor/public/components/agg_param_props.ts index 01a41d3c412c2..fc535884c69ff 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/agg_param_props.ts +++ b/src/legacy/core_plugins/vis_default_editor/public/components/agg_param_props.ts @@ -19,7 +19,7 @@ import { Field } from 'src/plugins/data/public'; import { VisState } from 'src/legacy/core_plugins/visualizations/public'; -import { AggConfig, AggParam, EditorConfig } from '../legacy_imports'; +import { IAggConfig, AggParam, EditorConfig } from '../legacy_imports'; import { ComboBoxGroupedOptions } from '../utils'; // NOTE: we cannot export the interface with export { InterfaceName } @@ -27,7 +27,7 @@ import { ComboBoxGroupedOptions } from '../utils'; // https://github.com/babel/babel/issues/7641 // export interface AggParamCommonProps { - agg: AggConfig; + agg: IAggConfig; aggParam: P; disabled?: boolean; editorConfig: EditorConfig; @@ -36,7 +36,7 @@ export interface AggParamCommonProps { showValidation: boolean; state: VisState; value?: T; - metricAggs: AggConfig[]; + metricAggs: IAggConfig[]; } export interface AggParamEditorProps extends AggParamCommonProps { diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/agg_params.test.tsx b/src/legacy/core_plugins/vis_default_editor/public/components/agg_params.test.tsx index d782c819c7c41..5636059394bac 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/agg_params.test.tsx +++ b/src/legacy/core_plugins/vis_default_editor/public/components/agg_params.test.tsx @@ -23,7 +23,7 @@ import { mount, shallow } from 'enzyme'; import { VisState } from 'src/legacy/core_plugins/visualizations/public'; import { IndexPattern } from 'src/plugins/data/public'; import { DefaultEditorAggParams, DefaultEditorAggParamsProps } from './agg_params'; -import { AggConfig, AggGroupNames } from '../legacy_imports'; +import { IAggConfig, AggGroupNames } from '../legacy_imports'; const mockEditorConfig = { useNormalizedEsInterval: { hidden: false, fixedValue: false }, @@ -97,7 +97,7 @@ describe('DefaultEditorAggParams component', () => { schema: { title: '', }, - } as any) as AggConfig, + } as any) as IAggConfig, groupName: AggGroupNames.Metrics, formIsTouched: false, indexPattern: {} as IndexPattern, diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/agg_params.tsx b/src/legacy/core_plugins/vis_default_editor/public/components/agg_params.tsx index 47e98f175ab73..1b450957f3b26 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/agg_params.tsx +++ b/src/legacy/core_plugins/vis_default_editor/public/components/agg_params.tsx @@ -24,7 +24,7 @@ import useUnmount from 'react-use/lib/useUnmount'; import { IndexPattern } from 'src/plugins/data/public'; import { - AggConfig, + IAggConfig, AggGroupNames, editorConfigProviders, FixedParam, @@ -54,7 +54,7 @@ type EditorParamConfigType = EditorParamConfig & { }; export interface DefaultEditorAggParamsProps extends DefaultEditorCommonProps { - agg: AggConfig; + agg: IAggConfig; aggError?: string; aggIndex?: number; aggIsTooLow?: boolean; diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/agg_params_helper.test.ts b/src/legacy/core_plugins/vis_default_editor/public/components/agg_params_helper.test.ts index 6f584b4329500..ec56d22143699 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/agg_params_helper.test.ts +++ b/src/legacy/core_plugins/vis_default_editor/public/components/agg_params_helper.test.ts @@ -20,8 +20,8 @@ import { IndexPattern, Field } from 'src/plugins/data/public'; import { VisState } from 'src/legacy/core_plugins/visualizations/public'; import { - AggConfig, - AggType, + IAggConfig, + IAggType, AggGroupNames, BUCKET_TYPES, IndexedArray, @@ -42,10 +42,10 @@ jest.mock('ui/new_platform'); describe('DefaultEditorAggParams helpers', () => { describe('getAggParamsToRender', () => { - let agg: AggConfig; + let agg: IAggConfig; let editorConfig: EditorConfig; const state = {} as VisState; - const metricAggs: AggConfig[] = []; + const metricAggs: IAggConfig[] = []; const emptyParams = { basic: [], advanced: [], @@ -57,14 +57,14 @@ describe('DefaultEditorAggParams helpers', () => { params: [{ name: 'interval' }], }, schema: {}, - } as AggConfig; + } as IAggConfig; const params = getAggParamsToRender({ agg, editorConfig, metricAggs, state }); expect(params).toEqual(emptyParams); }); it('should not create any param if there is no agg type', () => { - agg = {} as AggConfig; + agg = {} as IAggConfig; const params = getAggParamsToRender({ agg, editorConfig, metricAggs, state }); expect(params).toEqual(emptyParams); @@ -75,7 +75,7 @@ describe('DefaultEditorAggParams helpers', () => { type: { params: [{ name: 'interval' }], }, - } as AggConfig; + } as IAggConfig; editorConfig = { interval: { hidden: true, @@ -94,7 +94,7 @@ describe('DefaultEditorAggParams helpers', () => { schema: { hideCustomLabel: true, }, - } as AggConfig; + } as IAggConfig; const params = getAggParamsToRender({ agg, editorConfig, metricAggs, state }); expect(params).toEqual(emptyParams); @@ -131,7 +131,7 @@ describe('DefaultEditorAggParams helpers', () => { orderBy: 'orderBy', field: 'field', }, - } as any) as AggConfig; + } as any) as IAggConfig; const params = getAggParamsToRender({ agg, editorConfig, metricAggs, state }); expect(params).toEqual({ @@ -166,14 +166,14 @@ describe('DefaultEditorAggParams helpers', () => { describe('getAggTypeOptions', () => { it('should return agg type options grouped by subtype', () => { const indexPattern = {} as IndexPattern; - const aggs = getAggTypeOptions({} as AggConfig, indexPattern, 'metrics'); + const aggs = getAggTypeOptions({} as IAggConfig, indexPattern, 'metrics'); expect(aggs).toEqual(['indexedFields']); }); }); describe('isInvalidParamsTouched', () => { - let aggType: AggType; + let aggType: IAggType; const aggTypeState = { touched: false, valid: true, diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/agg_params_helper.ts b/src/legacy/core_plugins/vis_default_editor/public/components/agg_params_helper.ts index 21154bd7ad603..5a9d95725c8e4 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/agg_params_helper.ts +++ b/src/legacy/core_plugins/vis_default_editor/public/components/agg_params_helper.ts @@ -29,17 +29,17 @@ import { aggTypeFilters, aggTypeFieldFilters, aggTypes, - AggConfig, + IAggConfig, AggParam, - FieldParamType, - AggType, + IFieldParamType, + IAggType, EditorConfig, } from '../legacy_imports'; interface ParamInstanceBase { - agg: AggConfig; + agg: IAggConfig; editorConfig: EditorConfig; - metricAggs: AggConfig[]; + metricAggs: IAggConfig[]; state: VisState; } @@ -73,7 +73,7 @@ function getAggParamsToRender({ agg, editorConfig, metricAggs, state }: ParamIns } // if field param exists, compute allowed fields if (param.type === 'field') { - const availableFields: Field[] = (param as FieldParamType).getAvailableFields( + const availableFields: Field[] = (param as IFieldParamType).getAvailableFields( agg.getIndexPattern().fields ); fields = aggTypeFieldFilters.filter(availableFields, agg); @@ -117,10 +117,10 @@ function getAggParamsToRender({ agg, editorConfig, metricAggs, state }: ParamIns } function getAggTypeOptions( - agg: AggConfig, + agg: IAggConfig, indexPattern: IndexPattern, groupName: string -): ComboBoxGroupedOptions { +): ComboBoxGroupedOptions { const aggTypeOptions = aggTypeFilters.filter((aggTypes as any)[groupName], indexPattern, agg); return groupAndSortBy(aggTypeOptions as any[], 'subtype', 'title'); } @@ -135,7 +135,7 @@ function getAggTypeOptions( * @param aggParams State of aggregation parameters. */ function isInvalidParamsTouched( - aggType: AggType, + aggType: IAggType, aggTypeState: AggTypeState, aggParams: AggParamsState ) { diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/agg_select.tsx b/src/legacy/core_plugins/vis_default_editor/public/components/agg_select.tsx index 2a9c74521e525..0ec19bfa1b843 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/agg_select.tsx +++ b/src/legacy/core_plugins/vis_default_editor/public/components/agg_select.tsx @@ -24,20 +24,20 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import { IndexPattern } from 'src/plugins/data/public'; -import { AggType, documentationLinks } from '../legacy_imports'; +import { IAggType, documentationLinks } from '../legacy_imports'; import { ComboBoxGroupedOptions } from '../utils'; import { AGG_TYPE_ACTION_KEYS, AggTypeAction } from './agg_params_state'; interface DefaultEditorAggSelectProps { aggError?: string; - aggTypeOptions: ComboBoxGroupedOptions; + aggTypeOptions: ComboBoxGroupedOptions; id: string; indexPattern: IndexPattern; showValidation: boolean; isSubAggregation: boolean; - value: AggType; + value: IAggType; onChangeAggType: React.Dispatch; - setValue: (aggType: AggType) => void; + setValue: (aggType: IAggType) => void; } function DefaultEditorAggSelect({ @@ -51,7 +51,7 @@ function DefaultEditorAggSelect({ isSubAggregation, onChangeAggType, }: DefaultEditorAggSelectProps) { - const selectedOptions: ComboBoxGroupedOptions = value + const selectedOptions: ComboBoxGroupedOptions = value ? [{ label: value.title, target: value }] : []; @@ -104,7 +104,7 @@ function DefaultEditorAggSelect({ (options: EuiComboBoxOptionProps[]) => { const selectedOption = get(options, '0.target'); if (selectedOption) { - setValue(selectedOption as AggType); + setValue(selectedOption as IAggType); } }, [setValue] diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/controls/agg_control_props.tsx b/src/legacy/core_plugins/vis_default_editor/public/components/controls/agg_control_props.tsx index c8b5196d3b299..7f04b851902de 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/controls/agg_control_props.tsx +++ b/src/legacy/core_plugins/vis_default_editor/public/components/controls/agg_control_props.tsx @@ -18,11 +18,11 @@ */ import { VisParams } from 'src/legacy/core_plugins/visualizations/public'; -import { AggConfig } from '../../legacy_imports'; +import { IAggConfig } from '../../legacy_imports'; import { DefaultEditorAggCommonProps } from '../agg_common_props'; export interface AggControlProps { - agg: AggConfig; + agg: IAggConfig; editorStateParams: VisParams; setAggParamValue: DefaultEditorAggCommonProps['setAggParamValue']; setStateParamValue: DefaultEditorAggCommonProps['setStateParamValue']; diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/controls/agg_utils.test.tsx b/src/legacy/core_plugins/vis_default_editor/public/components/controls/agg_utils.test.tsx index 5c69fd0f1c091..0b847e3747b30 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/controls/agg_utils.test.tsx +++ b/src/legacy/core_plugins/vis_default_editor/public/components/controls/agg_utils.test.tsx @@ -20,7 +20,7 @@ import React, { FunctionComponent } from 'react'; import { mount, ReactWrapper } from 'enzyme'; -import { AggConfig } from '../../legacy_imports'; +import { IAggConfig } from '../../legacy_imports'; import { safeMakeLabel, useAvailableOptions, @@ -57,7 +57,7 @@ const metricAggs = [ return 'avg'; }, }, -] as AggConfig[]; +] as IAggConfig[]; const incompatibleAggs = [ { @@ -74,7 +74,7 @@ const incompatibleAggs = [ return 'percentiles'; }, }, -] as AggConfig[]; +] as IAggConfig[]; const aggFilter = ['!top_hits', '!percentiles']; describe('Aggregations utils', () => { @@ -222,7 +222,7 @@ describe('Aggregations utils', () => { }); test('should not fail and return a safety string if makeLabel func is not exist', () => { - const label = safeMakeLabel({} as AggConfig); + const label = safeMakeLabel({} as IAggConfig); expect(label).toEqual(expect.any(String)); }); diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/controls/field.test.tsx b/src/legacy/core_plugins/vis_default_editor/public/components/controls/field.test.tsx index e43304fe07347..636ef8f872d0e 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/controls/field.test.tsx +++ b/src/legacy/core_plugins/vis_default_editor/public/components/controls/field.test.tsx @@ -26,7 +26,7 @@ import { Field } from 'src/plugins/data/public'; import { VisState } from 'src/legacy/core_plugins/visualizations/public'; import { ComboBoxGroupedOptions } from '../../utils'; import { FieldParamEditor, FieldParamEditorProps } from './field'; -import { AggConfig } from '../../legacy_imports'; +import { IAggConfig } from '../../legacy_imports'; function callComboBoxOnChange(comp: ReactWrapper, value: any = []) { const comboBoxProps: EuiComboBoxProps = comp.find(EuiComboBox).props(); @@ -64,7 +64,7 @@ describe('FieldParamEditor component', () => { ]; defaultProps = { - agg: {} as AggConfig, + agg: {} as IAggConfig, aggParam: { name: 'field', type: 'field', @@ -80,7 +80,7 @@ describe('FieldParamEditor component', () => { setValidity, setTouched, state: {} as VisState, - metricAggs: [] as AggConfig[], + metricAggs: [] as IAggConfig[], }; }); diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/controls/field.tsx b/src/legacy/core_plugins/vis_default_editor/public/components/controls/field.tsx index 38c55e8fe3f24..f374353afabec 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/controls/field.tsx +++ b/src/legacy/core_plugins/vis_default_editor/public/components/controls/field.tsx @@ -24,7 +24,7 @@ import { EuiComboBox, EuiComboBoxOptionProps, EuiFormRow } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { Field } from 'src/plugins/data/public'; -import { AggConfig, AggParam, FieldParamType } from '../../legacy_imports'; +import { AggParam, IAggConfig, IFieldParamType } from '../../legacy_imports'; import { formatListAsProse, parseCommaSeparatedList, useValidation } from './utils'; import { AggParamEditorProps } from '../agg_param_props'; import { ComboBoxGroupedOptions } from '../../utils'; @@ -126,9 +126,10 @@ function FieldParamEditor({ ); } -function getFieldTypesString(agg: AggConfig) { +function getFieldTypesString(agg: IAggConfig) { const param = - get(agg, 'type.params', []).find((p: AggParam) => p.name === 'field') || ({} as FieldParamType); + get(agg, 'type.params', []).find((p: AggParam) => p.name === 'field') || + ({} as IFieldParamType); return formatListAsProse(parseCommaSeparatedList(param.filterFieldTypes), { inclusive: false }); } diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/controls/filter.tsx b/src/legacy/core_plugins/vis_default_editor/public/components/controls/filter.tsx index 38c5b552553ae..3622b27bad403 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/controls/filter.tsx +++ b/src/legacy/core_plugins/vis_default_editor/public/components/controls/filter.tsx @@ -22,7 +22,7 @@ import { EuiForm, EuiButtonIcon, EuiFieldText, EuiFormRow, EuiSpacer } from '@el import { i18n } from '@kbn/i18n'; import { Query, QueryStringInput } from '../../../../../../plugins/data/public'; -import { AggConfig } from '../../legacy_imports'; +import { IAggConfig } from '../../legacy_imports'; interface FilterRowProps { id: string; @@ -34,7 +34,7 @@ interface FilterRowProps { dataTestSubj: string; onChangeValue(id: string, query: Query, label: string): void; onRemoveFilter(id: string): void; - agg: AggConfig; + agg: IAggConfig; } function FilterRow({ diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/controls/metric_agg.test.tsx b/src/legacy/core_plugins/vis_default_editor/public/components/controls/metric_agg.test.tsx index 9b6fd204e7207..cf7af1aa5cb3a 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/controls/metric_agg.test.tsx +++ b/src/legacy/core_plugins/vis_default_editor/public/components/controls/metric_agg.test.tsx @@ -20,7 +20,7 @@ import React from 'react'; import { mount, shallow } from 'enzyme'; -import { AggConfig } from '../../legacy_imports'; +import { IAggConfig } from '../../legacy_imports'; import { DEFAULT_OPTIONS, aggFilter, MetricAggParamEditor } from './metric_agg'; jest.mock('./utils', () => ({ @@ -44,7 +44,7 @@ const agg = { makeLabel() { return 'cumulative_sum'; }, -} as AggConfig; +} as IAggConfig; const metricAggs = [ agg, @@ -69,7 +69,7 @@ const metricAggs = [ return 'max'; }, }, -] as AggConfig[]; +] as IAggConfig[]; describe('MetricAggParamEditor', () => { let defaultProps: Partial>; diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/controls/order_agg.tsx b/src/legacy/core_plugins/vis_default_editor/public/components/controls/order_agg.tsx index 6bb9ad334d149..10679b578d54e 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/controls/order_agg.tsx +++ b/src/legacy/core_plugins/vis_default_editor/public/components/controls/order_agg.tsx @@ -20,7 +20,7 @@ import React, { useEffect } from 'react'; import { EuiSpacer } from '@elastic/eui'; -import { AggParamType, AggConfig, AggGroupNames } from '../../legacy_imports'; +import { AggParamType, IAggConfig, AggGroupNames } from '../../legacy_imports'; import { useSubAggParamsHandlers } from './utils'; import { AggParamEditorProps } from '../agg_param_props'; import { DefaultEditorAggParams } from '../agg_params'; @@ -35,7 +35,7 @@ function OrderAggParamEditor({ setValue, setValidity, setTouched, -}: AggParamEditorProps) { +}: AggParamEditorProps) { const orderBy = agg.params.orderBy; useEffect(() => { @@ -51,7 +51,7 @@ function OrderAggParamEditor({ const { onAggTypeChange, setAggParamValue } = useSubAggParamsHandlers( agg, aggParam, - value as AggConfig, + value as IAggConfig, setValue ); @@ -63,7 +63,7 @@ function OrderAggParamEditor({ <> ) { +}: AggParamEditorProps) { useEffect(() => { // we aren't creating a custom aggConfig if (agg.params.metricAgg !== 'custom') { diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/controls/sub_metric.tsx b/src/legacy/core_plugins/vis_default_editor/public/components/controls/sub_metric.tsx index 9898d943870bc..45ff0610d88ed 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/controls/sub_metric.tsx +++ b/src/legacy/core_plugins/vis_default_editor/public/components/controls/sub_metric.tsx @@ -21,7 +21,7 @@ import React, { useEffect } from 'react'; import { EuiFormLabel, EuiSpacer } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { AggParamType, AggConfig, AggGroupNames } from '../../legacy_imports'; +import { AggParamType, IAggConfig, AggGroupNames } from '../../legacy_imports'; import { useSubAggParamsHandlers } from './utils'; import { AggParamEditorProps } from '../agg_param_props'; import { DefaultEditorAggParams } from '../agg_params'; @@ -35,7 +35,7 @@ function SubMetricParamEditor({ setValue, setValidity, setTouched, -}: AggParamEditorProps) { +}: AggParamEditorProps) { const metricTitle = i18n.translate('visDefaultEditor.controls.metrics.metricTitle', { defaultMessage: 'Metric', }); diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/controls/test_utils.ts b/src/legacy/core_plugins/vis_default_editor/public/components/controls/test_utils.ts index 4e811f4543412..894bc594a08d7 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/controls/test_utils.ts +++ b/src/legacy/core_plugins/vis_default_editor/public/components/controls/test_utils.ts @@ -18,14 +18,14 @@ */ import { VisState } from 'src/legacy/core_plugins/visualizations/public'; -import { AggConfig, AggParam, EditorConfig } from '../../legacy_imports'; +import { IAggConfig, AggParam, EditorConfig } from '../../legacy_imports'; export const aggParamCommonPropsMock = { - agg: {} as AggConfig, + agg: {} as IAggConfig, aggParam: {} as AggParam, editorConfig: {} as EditorConfig, formIsTouched: false, - metricAggs: [] as AggConfig[], + metricAggs: [] as IAggConfig[], state: {} as VisState, showValidation: false, }; diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/controls/top_aggregate.test.tsx b/src/legacy/core_plugins/vis_default_editor/public/components/controls/top_aggregate.test.tsx index b0c3fe00606aa..4ce0712040bd5 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/controls/top_aggregate.test.tsx +++ b/src/legacy/core_plugins/vis_default_editor/public/components/controls/top_aggregate.test.tsx @@ -25,10 +25,10 @@ import { TopAggregateParamEditorProps, } from './top_aggregate'; import { aggParamCommonPropsMock } from './test_utils'; -import { AggConfig } from '../../legacy_imports'; +import { IAggConfig } from '../../legacy_imports'; describe('TopAggregateParamEditor', () => { - let agg: AggConfig; + let agg: IAggConfig; let aggParam: any; let defaultProps: TopAggregateParamEditorProps; let options: AggregateValueProp[]; @@ -37,17 +37,17 @@ describe('TopAggregateParamEditor', () => { options = [ { text: 'Min', - isCompatible: jest.fn((aggr: AggConfig) => aggr.params.field.type === 'number'), + isCompatible: jest.fn((aggr: IAggConfig) => aggr.params.field.type === 'number'), value: 'min', }, { text: 'Max', - isCompatible: jest.fn((aggr: AggConfig) => aggr.params.field.type === 'number'), + isCompatible: jest.fn((aggr: IAggConfig) => aggr.params.field.type === 'number'), value: 'max', }, { text: 'Average', - isCompatible: jest.fn((aggr: AggConfig) => aggr.params.field.type === 'string'), + isCompatible: jest.fn((aggr: IAggConfig) => aggr.params.field.type === 'string'), value: 'average', }, ]; @@ -69,7 +69,7 @@ describe('TopAggregateParamEditor', () => { }, }, getAggParams: jest.fn(() => [{ name: 'aggregate', options }]), - } as any) as AggConfig; + } as any) as IAggConfig; defaultProps = { ...aggParamCommonPropsMock, agg, @@ -150,7 +150,7 @@ describe('TopAggregateParamEditor', () => { type: 'string', }, }, - } as AggConfig; + } as IAggConfig; comp.setProps({ agg }); @@ -165,7 +165,7 @@ describe('TopAggregateParamEditor', () => { type: 'date', }, }, - } as AggConfig; + } as IAggConfig; comp.setProps({ agg }); @@ -179,7 +179,7 @@ describe('TopAggregateParamEditor', () => { type: 'string', }, }, - } as AggConfig; + } as IAggConfig; comp.setProps({ agg, value: undefined }); diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/controls/top_aggregate.tsx b/src/legacy/core_plugins/vis_default_editor/public/components/controls/top_aggregate.tsx index 338e2fe463a80..346dfc0156f07 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/controls/top_aggregate.tsx +++ b/src/legacy/core_plugins/vis_default_editor/public/components/controls/top_aggregate.tsx @@ -23,7 +23,7 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import { - AggConfig, + IAggConfig, AggParam, OptionedValueProp, OptionedParamEditorProps, @@ -32,13 +32,13 @@ import { import { AggParamEditorProps } from '../agg_param_props'; export interface AggregateValueProp extends OptionedValueProp { - isCompatible(aggConfig: AggConfig): boolean; + isCompatible(aggConfig: IAggConfig): boolean; } export type TopAggregateParamEditorProps = AggParamEditorProps & OptionedParamEditorProps; -export function getCompatibleAggs(agg: AggConfig): AggregateValueProp[] { +export function getCompatibleAggs(agg: IAggConfig): AggregateValueProp[] { const { options = [] } = agg .getAggParams() .find(({ name }: AggParam) => name === 'aggregate') as OptionedParamType; diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/controls/utils/agg_utils.ts b/src/legacy/core_plugins/vis_default_editor/public/components/controls/utils/agg_utils.ts index 4c8ba23e63268..8aeae488942cd 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/controls/utils/agg_utils.ts +++ b/src/legacy/core_plugins/vis_default_editor/public/components/controls/utils/agg_utils.ts @@ -20,7 +20,7 @@ import { useEffect, useCallback, useMemo } from 'react'; import { i18n } from '@kbn/i18n'; -import { AggConfig } from '../../../legacy_imports'; +import { IAggConfig } from '../../../legacy_imports'; type AggFilter = string[]; @@ -43,7 +43,7 @@ function useCompatibleAggCallback(aggFilter: AggFilter) { function useFallbackMetric( setValue: (value?: string) => void, aggFilter: AggFilter, - metricAggs?: AggConfig[], + metricAggs?: IAggConfig[], value?: string, fallbackValue?: string ) { @@ -69,7 +69,7 @@ function useFallbackMetric( */ function useAvailableOptions( aggFilter: AggFilter, - metricAggs: AggConfig[] = [], + metricAggs: IAggConfig[] = [], defaultOptions: Array<{ text: string; value: string }> = [] ) { const isCompatibleAgg = useCompatibleAggCallback(aggFilter); @@ -107,7 +107,7 @@ function useValidation(setValidity: (isValid: boolean) => void, isValid: boolean }, [isValid, setValidity]); } -function safeMakeLabel(agg: AggConfig): string { +function safeMakeLabel(agg: IAggConfig): string { try { return agg.makeLabel(); } catch (e) { @@ -118,7 +118,7 @@ function safeMakeLabel(agg: AggConfig): string { } function isCompatibleAggregation(aggFilter: string[]) { - return (agg: AggConfig) => { + return (agg: IAggConfig) => { return !aggFilter.includes(`!${agg.type.name}`); }; } diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/controls/utils/use_handlers.ts b/src/legacy/core_plugins/vis_default_editor/public/components/controls/utils/use_handlers.ts index c2da648edcf81..c7816d5a9d305 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/controls/utils/use_handlers.ts +++ b/src/legacy/core_plugins/vis_default_editor/public/components/controls/utils/use_handlers.ts @@ -19,14 +19,14 @@ import { useCallback } from 'react'; -import { AggConfig, AggParamType } from '../../../legacy_imports'; +import { IAggConfig, AggParamType } from '../../../legacy_imports'; -type SetValue = (value?: AggConfig) => void; +type SetValue = (value?: IAggConfig) => void; function useSubAggParamsHandlers( - agg: AggConfig, + agg: IAggConfig, aggParam: AggParamType, - subAgg: AggConfig, + subAgg: IAggConfig, setValue: SetValue ) { const setAggParamValue = useCallback( diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/sidebar/data_tab.tsx b/src/legacy/core_plugins/vis_default_editor/public/components/sidebar/data_tab.tsx index c7597ef43dfa6..efd17f02a0e09 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/sidebar/data_tab.tsx +++ b/src/legacy/core_plugins/vis_default_editor/public/components/sidebar/data_tab.tsx @@ -23,11 +23,11 @@ import { EuiSpacer } from '@elastic/eui'; import { VisState } from 'src/legacy/core_plugins/visualizations/public'; import { - AggConfig, + IAggConfig, AggGroupNames, ISchemas, parentPipelineType, - MetricAggType, + IMetricAggType, } from '../../legacy_imports'; import { DefaultEditorAggGroup } from '../agg_group'; import { @@ -45,7 +45,7 @@ export interface DefaultEditorDataTabProps { dispatch: React.Dispatch; formIsTouched: boolean; isTabSelected: boolean; - metricAggs: AggConfig[]; + metricAggs: IAggConfig[]; schemas: ISchemas; state: VisState; setTouched(isTouched: boolean): void; @@ -67,7 +67,7 @@ function DefaultEditorDataTab({ () => findLast( metricAggs, - ({ type }: { type: MetricAggType }) => type.subtype === parentPipelineType + ({ type }: { type: IMetricAggType }) => type.subtype === parentPipelineType ), [metricAggs] ); diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/sidebar/state/actions.ts b/src/legacy/core_plugins/vis_default_editor/public/components/sidebar/state/actions.ts index 5738916d2ff80..93fa1083bebf9 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/sidebar/state/actions.ts +++ b/src/legacy/core_plugins/vis_default_editor/public/components/sidebar/state/actions.ts @@ -18,7 +18,7 @@ */ import { Vis, VisParams } from 'src/legacy/core_plugins/visualizations/public'; -import { AggConfig, Schema } from '../../../legacy_imports'; +import { IAggConfig, Schema } from '../../../legacy_imports'; import { EditorStateActionTypes } from './constants'; export interface ActionType { @@ -26,14 +26,14 @@ export interface ActionType { payload: P; } -type AggId = AggConfig['id']; -type AggParams = AggConfig['params']; +type AggId = IAggConfig['id']; +type AggParams = IAggConfig['params']; type AddNewAgg = ActionType; type DiscardChanges = ActionType; type ChangeAggType = ActionType< EditorStateActionTypes.CHANGE_AGG_TYPE, - { aggId: AggId; value: AggConfig['type'] } + { aggId: AggId; value: IAggConfig['type'] } >; type SetAggParamValue = ActionType< EditorStateActionTypes.SET_AGG_PARAM_VALUE, @@ -50,11 +50,11 @@ type SetStateParamValue = ActionTyp type RemoveAgg = ActionType; type ReorderAggs = ActionType< EditorStateActionTypes.REORDER_AGGS, - { sourceAgg: AggConfig; destinationAgg: AggConfig } + { sourceAgg: IAggConfig; destinationAgg: IAggConfig } >; type ToggleEnabledAgg = ActionType< EditorStateActionTypes.TOGGLE_ENABLED_AGG, - { aggId: AggId; enabled: AggConfig['enabled'] } + { aggId: AggId; enabled: IAggConfig['enabled'] } >; type UpdateStateParams = ActionType< EditorStateActionTypes.UPDATE_STATE_PARAMS, @@ -75,7 +75,7 @@ export type EditorAction = export interface EditorActions { addNewAgg(schema: Schema): AddNewAgg; discardChanges(vis: Vis): DiscardChanges; - changeAggType(aggId: AggId, value: AggConfig['type']): ChangeAggType; + changeAggType(aggId: AggId, value: IAggConfig['type']): ChangeAggType; setAggParamValue( aggId: AggId, paramName: T, @@ -86,8 +86,8 @@ export interface EditorActions { value: AggParams[T] ): SetStateParamValue; removeAgg(aggId: AggId): RemoveAgg; - reorderAggs(sourceAgg: AggConfig, destinationAgg: AggConfig): ReorderAggs; - toggleEnabledAgg(aggId: AggId, enabled: AggConfig['enabled']): ToggleEnabledAgg; + reorderAggs(sourceAgg: IAggConfig, destinationAgg: IAggConfig): ReorderAggs; + toggleEnabledAgg(aggId: AggId, enabled: IAggConfig['enabled']): ToggleEnabledAgg; updateStateParams(params: VisParams): UpdateStateParams; } diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/sidebar/state/reducers.ts b/src/legacy/core_plugins/vis_default_editor/public/components/sidebar/state/reducers.ts index 8e1cfd6bc9c13..851263f0ed702 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/sidebar/state/reducers.ts +++ b/src/legacy/core_plugins/vis_default_editor/public/components/sidebar/state/reducers.ts @@ -20,7 +20,7 @@ import { cloneDeep } from 'lodash'; import { Vis, VisState } from 'src/legacy/core_plugins/visualizations/public'; -import { AggConfigs, AggConfig, AggGroupNames, move } from '../../../legacy_imports'; +import { AggConfigs, IAggConfig, AggGroupNames, move } from '../../../legacy_imports'; import { EditorStateActionTypes } from './constants'; import { getEnabledMetricAggsCount } from '../../agg_group_helper'; import { EditorAction } from './actions'; @@ -32,7 +32,7 @@ function initEditorState(vis: Vis) { function editorStateReducer(state: VisState, action: EditorAction): VisState { switch (action.type) { case EditorStateActionTypes.ADD_NEW_AGG: { - const aggConfig = state.aggs.createAggConfig(action.payload as AggConfig, { + const aggConfig = state.aggs.createAggConfig(action.payload as IAggConfig, { addToAggConfigs: false, }); aggConfig.brandNew = true; diff --git a/src/legacy/core_plugins/vis_default_editor/public/legacy_imports.ts b/src/legacy/core_plugins/vis_default_editor/public/legacy_imports.ts index 5c617f3dc8681..f023b808cb0a7 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/legacy_imports.ts +++ b/src/legacy/core_plugins/vis_default_editor/public/legacy_imports.ts @@ -20,34 +20,33 @@ /* `ui/agg_types` dependencies */ export { AggType, - AggConfig, + IAggType, + IAggConfig, AggConfigs, + IAggConfigs, AggParam, AggGroupNames, aggGroupNamesMap, aggTypes, FieldParamType, + IFieldParamType, BUCKET_TYPES, METRIC_TYPES, ISchemas, Schema, termsAggFilter, } from 'ui/agg_types'; -export { aggTypeFilters, propFilter } from 'ui/agg_types/filter'; -export { aggTypeFieldFilters } from 'ui/agg_types/param_types/filter'; -export { AggParamType } from 'ui/agg_types/param_types/agg'; -export { MetricAggType } from 'ui/agg_types/metrics/metric_agg_type'; -export { parentPipelineType } from 'ui/agg_types/metrics/lib/parent_pipeline_agg_helper'; -export { siblingPipelineType } from 'ui/agg_types/metrics/lib/sibling_pipeline_agg_helper'; -export { isType, isStringType } from 'ui/agg_types/buckets/migrate_include_exclude_format'; -export { - OptionedValueProp, - OptionedParamEditorProps, - OptionedParamType, -} from 'ui/agg_types/param_types/optioned'; -export { isValidJson, isValidInterval } from 'ui/agg_types/utils'; -export { AggParamOption } from 'ui/agg_types/agg_params'; -export { CidrMask } from 'ui/agg_types/buckets/lib/cidr_mask'; +export { aggTypeFilters, propFilter } from 'ui/agg_types'; +export { aggTypeFieldFilters } from 'ui/agg_types'; +export { AggParamType } from 'ui/agg_types'; +export { MetricAggType, IMetricAggType } from 'ui/agg_types'; +export { parentPipelineType } from 'ui/agg_types'; +export { siblingPipelineType } from 'ui/agg_types'; +export { isType, isStringType } from 'ui/agg_types'; +export { OptionedValueProp, OptionedParamEditorProps, OptionedParamType } from 'ui/agg_types'; +export { isValidJson, isValidInterval } from 'ui/agg_types'; +export { AggParamOption } from 'ui/agg_types'; +export { CidrMask } from 'ui/agg_types'; export { PersistedState } from 'ui/persisted_state'; export { IndexedArray } from 'ui/indexed_array'; diff --git a/src/legacy/core_plugins/vis_default_editor/public/vis_options_props.tsx b/src/legacy/core_plugins/vis_default_editor/public/vis_options_props.tsx index f51e359d99573..babcb59c6582e 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/vis_options_props.tsx +++ b/src/legacy/core_plugins/vis_default_editor/public/vis_options_props.tsx @@ -17,11 +17,11 @@ * under the License. */ -import { AggConfigs, PersistedState } from './legacy_imports'; +import { IAggConfigs, PersistedState } from './legacy_imports'; import { Vis } from '../../visualizations/public'; export interface VisOptionsProps { - aggs: AggConfigs; + aggs: IAggConfigs; hasHistogramAgg: boolean; isTabSelected: boolean; stateParams: VisParamType; diff --git a/src/legacy/core_plugins/vis_default_editor/public/vis_type_agg_filter.ts b/src/legacy/core_plugins/vis_default_editor/public/vis_type_agg_filter.ts index c1832d5512817..60b675f50a342 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/vis_type_agg_filter.ts +++ b/src/legacy/core_plugins/vis_default_editor/public/vis_type_agg_filter.ts @@ -17,7 +17,7 @@ * under the License. */ import { IndexPattern } from 'src/plugins/data/public'; -import { AggType, AggConfig, aggTypeFilters, propFilter } from './legacy_imports'; +import { IAggType, IAggConfig, aggTypeFilters, propFilter } from './legacy_imports'; const filterByName = propFilter('name'); @@ -25,7 +25,9 @@ const filterByName = propFilter('name'); * This filter checks the defined aggFilter in the schemas of that visualization * and limits available aggregations based on that. */ -aggTypeFilters.addFilter((aggType: AggType, indexPatterns: IndexPattern, aggConfig: AggConfig) => { - const doesSchemaAllowAggType = filterByName([aggType], aggConfig.schema.aggFilter).length !== 0; - return doesSchemaAllowAggType; -}); +aggTypeFilters.addFilter( + (aggType: IAggType, indexPatterns: IndexPattern, aggConfig: IAggConfig) => { + const doesSchemaAllowAggType = filterByName([aggType], aggConfig.schema.aggFilter).length !== 0; + return doesSchemaAllowAggType; + } +); diff --git a/src/legacy/core_plugins/vis_type_table/public/legacy_imports.ts b/src/legacy/core_plugins/vis_type_table/public/legacy_imports.ts index 8a454957b7ab9..efa6c0029e6d1 100644 --- a/src/legacy/core_plugins/vis_type_table/public/legacy_imports.ts +++ b/src/legacy/core_plugins/vis_type_table/public/legacy_imports.ts @@ -19,7 +19,7 @@ export { npSetup, npStart } from 'ui/new_platform'; export { getFormat } from 'ui/visualize/loader/pipeline_helpers/utilities'; -export { AggConfig, AggGroupNames, Schemas } from 'ui/agg_types'; +export { IAggConfig, AggGroupNames, Schemas } from 'ui/agg_types'; // @ts-ignore export { PrivateProvider } from 'ui/private/private'; diff --git a/src/legacy/core_plugins/vis_type_table/public/table_vis_controller.test.ts b/src/legacy/core_plugins/vis_type_table/public/table_vis_controller.test.ts index 16181a3f70ff1..d8912975227bf 100644 --- a/src/legacy/core_plugins/vis_type_table/public/table_vis_controller.test.ts +++ b/src/legacy/core_plugins/vis_type_table/public/table_vis_controller.test.ts @@ -27,7 +27,7 @@ import './table_vis.mock'; import StubIndexPattern from 'test_utils/stub_index_pattern'; import { getAngularModule } from './get_inner_angular'; import { initTableVisLegacyModule } from './table_vis_legacy_module'; -import { npStart, AggConfig, tabifyAggResponse } from './legacy_imports'; +import { npStart, IAggConfig, tabifyAggResponse } from './legacy_imports'; import { tableVisTypeDefinition } from './table_vis_type'; import { Vis } from '../../visualizations/public'; import { setup as visualizationsSetup } from '../../visualizations/public/np_ready/public/legacy'; @@ -148,7 +148,7 @@ describe('Table Vis - Controller', () => { // basically a parameterized beforeEach function initController(vis: Vis) { - vis.aggs.aggs.forEach((agg: AggConfig, i: number) => { + vis.aggs.aggs.forEach((agg: IAggConfig, i: number) => { agg.id = 'agg_' + (i + 1); }); diff --git a/src/legacy/core_plugins/vis_type_vislib/public/components/options/metrics_axes/index.test.tsx b/src/legacy/core_plugins/vis_type_vislib/public/components/options/metrics_axes/index.test.tsx index 514b957765a99..944ed7e20d1f7 100644 --- a/src/legacy/core_plugins/vis_type_vislib/public/components/options/metrics_axes/index.test.tsx +++ b/src/legacy/core_plugins/vis_type_vislib/public/components/options/metrics_axes/index.test.tsx @@ -27,7 +27,7 @@ import { Positions } from '../../../utils/collections'; import { ValueAxesPanel } from './value_axes_panel'; import { CategoryAxisPanel } from './category_axis_panel'; import { ChartTypes } from '../../../utils/collections'; -import { AggConfig, AggType } from '../../../legacy_imports'; +import { IAggConfig, IAggType } from '../../../legacy_imports'; import { defaultValueAxisId, valueAxis, seriesParam, categoryAxis } from './mocks'; jest.mock('ui/new_platform'); @@ -44,17 +44,17 @@ jest.mock('./value_axes_panel', () => ({ const SERIES_PARAMS = 'seriesParams'; const VALUE_AXES = 'valueAxes'; -const aggCount: AggConfig = { +const aggCount: IAggConfig = { id: '1', type: { name: 'count' }, makeLabel: () => 'Count', -} as AggConfig; +} as IAggConfig; -const aggAverage: AggConfig = { +const aggAverage: IAggConfig = { id: '2', - type: { name: 'average' } as AggType, + type: { name: 'average' } as IAggType, makeLabel: () => 'Average', -} as AggConfig; +} as IAggConfig; const createAggs = (aggs: any[]) => ({ aggs, diff --git a/src/legacy/core_plugins/vis_type_vislib/public/components/options/metrics_axes/index.tsx b/src/legacy/core_plugins/vis_type_vislib/public/components/options/metrics_axes/index.tsx index c4dcbfaa47265..cdc8996f3fdeb 100644 --- a/src/legacy/core_plugins/vis_type_vislib/public/components/options/metrics_axes/index.tsx +++ b/src/legacy/core_plugins/vis_type_vislib/public/components/options/metrics_axes/index.tsx @@ -21,7 +21,7 @@ import React, { useState, useEffect, useCallback, useMemo } from 'react'; import { cloneDeep, uniq, get } from 'lodash'; import { EuiSpacer } from '@elastic/eui'; -import { AggConfig } from '../../../legacy_imports'; +import { IAggConfig } from '../../../legacy_imports'; import { BasicVislibParams, ValueAxis, SeriesParam, Axis } from '../../../types'; import { ValidationVisOptionsProps } from '../../common'; import { SeriesPanel } from './series_panel'; @@ -99,7 +99,7 @@ function MetricsAxisOptions(props: ValidationVisOptionsProps) stateParams.valueAxes.forEach((axis, axisNumber) => { let newCustomLabel = ''; - const matchingSeries: AggConfig[] = []; + const matchingSeries: IAggConfig[] = []; series.forEach((serie, seriesIndex) => { if ((axisNumber === 0 && !serie.valueAxis) || serie.valueAxis === axis.id) { diff --git a/src/legacy/core_plugins/vis_type_vislib/public/legacy_imports.ts b/src/legacy/core_plugins/vis_type_vislib/public/legacy_imports.ts index df7278f2b761f..50a91df01de7c 100644 --- a/src/legacy/core_plugins/vis_type_vislib/public/legacy_imports.ts +++ b/src/legacy/core_plugins/vis_type_vislib/public/legacy_imports.ts @@ -17,7 +17,7 @@ * under the License. */ -export { AggType, AggConfig, AggGroupNames, Schemas } from 'ui/agg_types'; +export { AggType, AggGroupNames, IAggConfig, IAggType, Schemas } from 'ui/agg_types'; // @ts-ignore export { SimpleEmitter } from 'ui/utils/simple_emitter'; // @ts-ignore diff --git a/src/legacy/core_plugins/visualizations/public/embeddable/query_geohash_bounds.ts b/src/legacy/core_plugins/visualizations/public/embeddable/query_geohash_bounds.ts index 46ade8ce465c0..719d69e21a826 100644 --- a/src/legacy/core_plugins/visualizations/public/embeddable/query_geohash_bounds.ts +++ b/src/legacy/core_plugins/visualizations/public/embeddable/query_geohash_bounds.ts @@ -21,7 +21,7 @@ import { i18n } from '@kbn/i18n'; import { get } from 'lodash'; import { toastNotifications } from 'ui/notify'; -import { AggConfig } from 'ui/agg_types'; +import { IAggConfig } from 'ui/agg_types'; import { timefilter } from 'ui/timefilter'; import { Vis } from '../np_ready/public'; import { esFilters, Query, SearchSource, ISearchSource } from '../../../../../plugins/data/public'; @@ -42,7 +42,7 @@ interface QueryGeohashBoundsParams { * TODO: Remove this as a part of elastic/kibana#30593 */ export async function queryGeohashBounds(vis: Vis, params: QueryGeohashBoundsParams) { - const agg = vis.getAggConfig().aggs.find((a: AggConfig) => { + const agg = vis.getAggConfig().aggs.find((a: IAggConfig) => { return get(a, 'type.dslName') === 'geohash_grid'; }); diff --git a/src/legacy/core_plugins/visualizations/public/legacy_imports.ts b/src/legacy/core_plugins/visualizations/public/legacy_imports.ts index 3088c4e67a3b7..5cff588d951b0 100644 --- a/src/legacy/core_plugins/visualizations/public/legacy_imports.ts +++ b/src/legacy/core_plugins/visualizations/public/legacy_imports.ts @@ -18,12 +18,13 @@ */ export { PersistedState } from '../../../ui/public/persisted_state'; -export { AggConfig } from '../../../ui/public/agg_types/agg_config'; -export { AggConfigs } from '../../../ui/public/agg_types/agg_configs'; export { + AggConfigs, + IAggConfig, + IAggConfigs, isDateHistogramBucketAggConfig, setBounds, -} from '../../../ui/public/agg_types/buckets/date_histogram'; +} from '../../../ui/public/agg_types'; export { createFormat } from '../../../ui/public/visualize/loader/pipeline_helpers/utilities'; export { I18nContext } from '../../../ui/public/i18n'; import chrome from '../../../ui/public/chrome'; diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/legacy/build_pipeline.test.ts b/src/legacy/core_plugins/visualizations/public/np_ready/public/legacy/build_pipeline.test.ts index e733bad2c0127..d1017de35474a 100644 --- a/src/legacy/core_plugins/visualizations/public/np_ready/public/legacy/build_pipeline.test.ts +++ b/src/legacy/core_plugins/visualizations/public/np_ready/public/legacy/build_pipeline.test.ts @@ -27,11 +27,11 @@ import { Schemas, } from './build_pipeline'; import { Vis, VisState } from '..'; -import { AggConfig } from '../../../legacy_imports'; +import { IAggConfig } from '../../../legacy_imports'; import { searchSourceMock } from '../../../legacy_mocks'; jest.mock('ui/new_platform'); -jest.mock('ui/agg_types/buckets/date_histogram', () => ({ +jest.mock('ui/agg_types', () => ({ setBounds: () => {}, dateHistogramBucketAgg: () => {}, isDateHistogramBucketAggConfig: () => true, @@ -367,7 +367,7 @@ describe('visualize loader pipeline helpers: build pipeline', () => { }); describe('buildVislibDimensions', () => { - let aggs: AggConfig[]; + let aggs: IAggConfig[]; let visState: any; let vis: Vis; let params: any; @@ -385,7 +385,7 @@ describe('visualize loader pipeline helpers: build pipeline', () => { name: 'metric', }, params: {}, - } as AggConfig, + } as IAggConfig, ]; params = { @@ -453,7 +453,7 @@ describe('visualize loader pipeline helpers: build pipeline', () => { it('with two numeric metrics, mixed normal and percent mode should have corresponding formatters', async () => { const aggConfig = aggs[0]; - aggs = [{ ...aggConfig } as AggConfig, { ...aggConfig, id: '5' } as AggConfig]; + aggs = [{ ...aggConfig } as IAggConfig, { ...aggConfig, id: '5' } as IAggConfig]; visState = { params: { diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/legacy/build_pipeline.ts b/src/legacy/core_plugins/visualizations/public/np_ready/public/legacy/build_pipeline.ts index 6749a44b4d5b3..04a296a888e87 100644 --- a/src/legacy/core_plugins/visualizations/public/np_ready/public/legacy/build_pipeline.ts +++ b/src/legacy/core_plugins/visualizations/public/np_ready/public/legacy/build_pipeline.ts @@ -23,7 +23,7 @@ import moment from 'moment'; import { SerializedFieldFormat } from 'src/plugins/expressions/public'; import { ISearchSource } from 'src/plugins/data/public'; import { - AggConfig, + IAggConfig, setBounds, isDateHistogramBucketAggConfig, createFormat, @@ -85,7 +85,7 @@ const vislibCharts: string[] = [ ]; export const getSchemas = (vis: Vis, timeRange?: any): Schemas => { - const createSchemaConfig = (accessor: number, agg: AggConfig): SchemaConfig => { + const createSchemaConfig = (accessor: number, agg: IAggConfig): SchemaConfig => { if (isDateHistogramBucketAggConfig(agg)) { agg.params.timeRange = timeRange; setBounds(agg, true); @@ -130,10 +130,10 @@ export const getSchemas = (vis: Vis, timeRange?: any): Schemas => { const schemas: Schemas = { metric: [], }; - const responseAggs = vis.aggs.getResponseAggs().filter((agg: AggConfig) => agg.enabled); + const responseAggs = vis.aggs.getResponseAggs().filter((agg: IAggConfig) => agg.enabled); const isHierarchical = vis.isHierarchical(); - const metrics = responseAggs.filter((agg: AggConfig) => agg.type.type === 'metrics'); - responseAggs.forEach((agg: AggConfig) => { + const metrics = responseAggs.filter((agg: IAggConfig) => agg.type.type === 'metrics'); + responseAggs.forEach((agg: IAggConfig) => { let skipMetrics = false; let schemaName = agg.schema ? agg.schema.name || agg.schema : null; if (typeof schemaName === 'object') { @@ -224,7 +224,7 @@ export const prepareDimension = (variable: string, data: any) => { const adjustVislibDimensionFormmaters = (vis: Vis, dimensions: { y: any[] }): void => { const visState = vis.getCurrentState(); const visConfig = visState.params; - const responseAggs = vis.aggs.getResponseAggs().filter((agg: AggConfig) => agg.enabled); + const responseAggs = vis.aggs.getResponseAggs().filter((agg: IAggConfig) => agg.enabled); (dimensions.y || []).forEach(yDimension => { const yAgg = responseAggs[yDimension.accessor]; diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/vis.d.ts b/src/legacy/core_plugins/visualizations/public/np_ready/public/vis.d.ts index 6e6a2174d6ad1..71bf9bcf983ff 100644 --- a/src/legacy/core_plugins/visualizations/public/np_ready/public/vis.d.ts +++ b/src/legacy/core_plugins/visualizations/public/np_ready/public/vis.d.ts @@ -18,7 +18,7 @@ */ import { VisType } from './types'; -import { AggConfigs } from '../../legacy_imports'; +import { IAggConfigs } from '../../legacy_imports'; import { Status } from './legacy/update_status'; export interface Vis { @@ -39,7 +39,7 @@ export interface VisState { title: string; type: VisType; params: VisParams; - aggs: AggConfigs; + aggs: IAggConfigs; } export declare class VisualizationController { diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/vis.js b/src/legacy/core_plugins/visualizations/public/np_ready/public/vis.js index 4f1526c20cb6f..0c2e5012df439 100644 --- a/src/legacy/core_plugins/visualizations/public/np_ready/public/vis.js +++ b/src/legacy/core_plugins/visualizations/public/np_ready/public/vis.js @@ -21,7 +21,7 @@ * @name Vis * * @description This class consists of aggs, params, listeners, title, and type. - * - Aggs: Instances of AggConfig. + * - Aggs: Instances of IAggConfig. * - Params: The settings in the Options tab. * * Not to be confused with vislib/vis.js. diff --git a/src/legacy/ui/public/agg_response/tabify/_get_columns.ts b/src/legacy/ui/public/agg_response/tabify/_get_columns.ts index a3127c039049b..4144d5be16012 100644 --- a/src/legacy/ui/public/agg_response/tabify/_get_columns.ts +++ b/src/legacy/ui/public/agg_response/tabify/_get_columns.ts @@ -18,15 +18,15 @@ */ import { groupBy } from 'lodash'; -import { AggConfig } from '../../agg_types'; +import { IAggConfig } from '../../agg_types'; export interface AggColumn { - aggConfig: AggConfig; + aggConfig: IAggConfig; id: string; name: string; } -const getColumn = (agg: AggConfig, i: number): AggColumn => { +const getColumn = (agg: IAggConfig, i: number): AggColumn => { return { aggConfig: agg, id: `col-${i}-${agg.id}`, @@ -40,7 +40,7 @@ const getColumn = (agg: AggConfig, i: number): AggColumn => { * @param {AggConfigs} aggs - the agg configs object to which the aggregation response correlates * @param {boolean} minimalColumns - setting to true will only return a column for the last bucket/metric instead of one for each level */ -export function tabifyGetColumns(aggs: AggConfig[], minimalColumns: boolean) { +export function tabifyGetColumns(aggs: IAggConfig[], minimalColumns: boolean) { // pick the columns if (minimalColumns) { return aggs.map((agg, i) => getColumn(agg, i)); diff --git a/src/legacy/ui/public/agg_types/index.ts b/src/legacy/ui/public/agg_types/index.ts index cf2733b9a9f36..ac5d0bed7ef15 100644 --- a/src/legacy/ui/public/agg_types/index.ts +++ b/src/legacy/ui/public/agg_types/index.ts @@ -17,15 +17,69 @@ * under the License. */ -export { aggTypes } from './agg_types'; -export { AggParam } from './agg_params'; -export { AggConfig } from './agg_config'; -export { AggConfigs } from './agg_configs'; -export { AggGroupNames, aggGroupNamesMap } from './agg_groups'; -export { FieldParamType } from './param_types'; -export { BUCKET_TYPES } from './buckets/bucket_agg_types'; -export { METRIC_TYPES } from './metrics/metric_agg_types'; -export { ISchemas, Schema, Schemas } from './schemas'; -export { AggType } from './agg_type'; -export { setBounds } from './buckets/date_histogram'; -export { termsAggFilter } from './buckets/terms'; +/** + * Nothing to see here! + * + * Agg Types have moved to the data plugin, and are being + * re-exported from ui/agg_types for backwards compatibility. + */ + +import { start as dataStart } from '../../../core_plugins/data/public/legacy'; + +// runtime contracts +export const { + types: aggTypes, + AggConfig, + AggConfigs, + AggType, + aggTypeFieldFilters, + FieldParamType, + MetricAggType, + parentPipelineAggHelper, + siblingPipelineAggHelper, + setBounds, +} = dataStart.search.aggs; + +// types +export { + IAggConfig, + IAggConfigs, + IAggType, + IFieldParamType, + IMetricAggType, + AggParam, + AggParamOption, + BUCKET_TYPES, + DateRangeKey, + IpRangeKey, + ISchemas, + METRIC_TYPES, + OptionedParamEditorProps, + OptionedValueProp, +} from '../../../core_plugins/data/public'; + +// static code +export { + AggParamType, + AggTypeFilters, + aggTypeFilters, + AggTypeFieldFilters, + AggGroupNames, + aggGroupNamesMap, + CidrMask, + convertDateRangeToString, + convertIPRangeToString, + intervalOptions, + isDateHistogramBucketAggConfig, + isStringType, + isType, + isValidInterval, + isValidJson, + OptionedParamType, + parentPipelineType, + propFilter, + Schema, + Schemas, + siblingPipelineType, + termsAggFilter, +} from '../../../core_plugins/data/public'; diff --git a/src/legacy/ui/public/time_buckets/time_buckets.js b/src/legacy/ui/public/time_buckets/time_buckets.js index 50a57d866099e..a611de45fa859 100644 --- a/src/legacy/ui/public/time_buckets/time_buckets.js +++ b/src/legacy/ui/public/time_buckets/time_buckets.js @@ -144,7 +144,7 @@ TimeBuckets.prototype.getDuration = function() { * generated. * * Input can be one of the following: - * - Any object from src/legacy/ui/agg_types/buckets/_interval_options.js + * - Any object from src/legacy/ui/agg_types.js * - "auto" * - Pass a valid moment unit * - a moment.duration object. diff --git a/src/legacy/ui/public/vis/__tests__/_agg_config.js b/src/legacy/ui/public/vis/__tests__/_agg_config.js index 2ccbaf6c1645e..7dccf3eec18aa 100644 --- a/src/legacy/ui/public/vis/__tests__/_agg_config.js +++ b/src/legacy/ui/public/vis/__tests__/_agg_config.js @@ -21,8 +21,8 @@ import sinon from 'sinon'; import expect from '@kbn/expect'; import ngMock from 'ng_mock'; import { Vis } from '../../../../core_plugins/visualizations/public'; -import { AggType } from '../../agg_types/agg_type'; -import { AggConfig } from '../../agg_types/agg_config'; +import { AggType, AggConfig } from '../../agg_types'; + import FixturesStubbedLogstashIndexPatternProvider from 'fixtures/stubbed_logstash_index_pattern'; describe('AggConfig', function() { diff --git a/src/legacy/ui/public/vis/config/editor_config_providers.test.ts b/src/legacy/ui/public/vis/config/editor_config_providers.test.ts index 9d93930c09ebc..d52c9119dd76a 100644 --- a/src/legacy/ui/public/vis/config/editor_config_providers.test.ts +++ b/src/legacy/ui/public/vis/config/editor_config_providers.test.ts @@ -17,7 +17,7 @@ * under the License. */ -import { AggConfig } from 'ui/agg_types'; +import { IAggConfig } from 'ui/agg_types'; import { EditorConfigProviderRegistry } from './editor_config_providers'; import { EditorParamConfig, FixedParam, NumericIntervalParam, TimeIntervalParam } from './types'; @@ -48,7 +48,7 @@ describe('EditorConfigProvider', () => { const provider = jest.fn(() => ({})); registry.register(provider); expect(provider).not.toHaveBeenCalled(); - const aggConfig = {} as AggConfig; + const aggConfig = {} as IAggConfig; registry.getConfigForAgg(indexPattern, aggConfig); expect(provider).toHaveBeenCalledWith(indexPattern, aggConfig); }); @@ -60,7 +60,7 @@ describe('EditorConfigProvider', () => { registry.register(provider2); expect(provider).not.toHaveBeenCalled(); expect(provider2).not.toHaveBeenCalled(); - const aggConfig = {} as AggConfig; + const aggConfig = {} as IAggConfig; registry.getConfigForAgg(indexPattern, aggConfig); expect(provider).toHaveBeenCalledWith(indexPattern, aggConfig); expect(provider2).toHaveBeenCalledWith(indexPattern, aggConfig); @@ -72,7 +72,7 @@ describe('EditorConfigProvider', () => { } function getOutputConfig(reg: EditorConfigProviderRegistry) { - return reg.getConfigForAgg(indexPattern, {} as AggConfig).singleParam; + return reg.getConfigForAgg(indexPattern, {} as IAggConfig).singleParam; } it('should have hidden true if at least one config was hidden true', () => { diff --git a/src/legacy/ui/public/vis/config/editor_config_providers.ts b/src/legacy/ui/public/vis/config/editor_config_providers.ts index 1e82a3ca2762e..ec82597d5fb19 100644 --- a/src/legacy/ui/public/vis/config/editor_config_providers.ts +++ b/src/legacy/ui/public/vis/config/editor_config_providers.ts @@ -18,7 +18,7 @@ */ import { IndexPattern } from 'src/plugins/data/public'; -import { AggConfig } from 'ui/agg_types'; +import { IAggConfig } from 'ui/agg_types'; import { parseEsInterval } from '../../../../core_plugins/data/public'; import { TimeIntervalParam, @@ -29,7 +29,7 @@ import { } from './types'; import { leastCommonInterval, leastCommonMultiple } from '../lib'; -type EditorConfigProvider = (indexPattern: IndexPattern, aggConfig: AggConfig) => EditorConfig; +type EditorConfigProvider = (indexPattern: IndexPattern, aggConfig: IAggConfig) => EditorConfig; class EditorConfigProviderRegistry { private providers: Set = new Set(); @@ -38,7 +38,7 @@ class EditorConfigProviderRegistry { this.providers.add(configProvider); } - public getConfigForAgg(indexPattern: IndexPattern, aggConfig: AggConfig): EditorConfig { + public getConfigForAgg(indexPattern: IndexPattern, aggConfig: IAggConfig): EditorConfig { const configs = Array.from(this.providers).map(provider => provider(indexPattern, aggConfig)); return this.mergeConfigs(configs); } diff --git a/src/legacy/ui/public/visualize/loader/pipeline_helpers/utilities.ts b/src/legacy/ui/public/visualize/loader/pipeline_helpers/utilities.ts index e763eb1b90791..d8227343159e6 100644 --- a/src/legacy/ui/public/visualize/loader/pipeline_helpers/utilities.ts +++ b/src/legacy/ui/public/visualize/loader/pipeline_helpers/utilities.ts @@ -19,15 +19,15 @@ import { i18n } from '@kbn/i18n'; import { identity } from 'lodash'; -import { AggConfig } from 'ui/agg_types'; +import { IAggConfig } from 'ui/agg_types'; import { npStart } from 'ui/new_platform'; import { SerializedFieldFormat } from 'src/plugins/expressions/public'; import { fieldFormats } from '../../../../../../plugins/data/public'; import { Vis } from '../../../../../core_plugins/visualizations/public'; import { tabifyGetColumns } from '../../../agg_response/tabify/_get_columns'; -import { DateRangeKey, convertDateRangeToString } from '../../../agg_types/buckets/date_range'; -import { IpRangeKey, convertIPRangeToString } from '../../../agg_types/buckets/ip_range'; +import { DateRangeKey, convertDateRangeToString } from '../../../agg_types'; +import { IpRangeKey, convertIPRangeToString } from '../../../agg_types'; interface TermsFieldFormatParams { otherBucketLabel: string; @@ -62,7 +62,7 @@ const getFieldFormat = ( return new DefaultFieldFormat(); }; -export const createFormat = (agg: AggConfig): SerializedFieldFormat => { +export const createFormat = (agg: IAggConfig): SerializedFieldFormat => { const format: SerializedFieldFormat = agg.params.field ? agg.params.field.format.toJSON() : {}; const formats: Record SerializedFieldFormat> = { date_range: () => ({ id: 'date_range', params: format }), @@ -106,7 +106,7 @@ export const getFormat: FormatFactory = mapping => { const format = getFieldFormat(id, mapping.params); const gte = '\u2265'; const lt = '\u003c'; - return i18n.translate('common.ui.aggTypes.buckets.ranges.rangesFormatMessage', { + return i18n.translate('common.ui.aggTypes.rangesFormatMessage', { defaultMessage: '{gte} {from} and {lt} {to}', values: { gte, @@ -155,7 +155,7 @@ export const getFormat: FormatFactory = mapping => { } }; -export const getTableAggs = (vis: Vis): AggConfig[] => { +export const getTableAggs = (vis: Vis): IAggConfig[] => { if (!vis.aggs || !vis.aggs.getResponseAggs) { return []; } diff --git a/x-pack/legacy/plugins/lens/public/editor_frame_plugin/plugin.test.tsx b/x-pack/legacy/plugins/lens/public/editor_frame_plugin/plugin.test.tsx index da9fdd7927d60..7a6067dd5f23c 100644 --- a/x-pack/legacy/plugins/lens/public/editor_frame_plugin/plugin.test.tsx +++ b/x-pack/legacy/plugins/lens/public/editor_frame_plugin/plugin.test.tsx @@ -14,9 +14,6 @@ import { } from './mocks'; jest.mock('ui/new_platform'); -jest.mock('ui/chrome', () => ({ - getSavedObjectsClient: jest.fn(), -})); // mock away actual dependencies to prevent all of it being loaded jest.mock('../../../../../../src/legacy/core_plugins/interpreter/public/registries', () => {}); diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_plugin/operations/definitions/date_histogram.test.tsx b/x-pack/legacy/plugins/lens/public/indexpattern_plugin/operations/definitions/date_histogram.test.tsx index 2bd6c7106a952..5be92e31f4934 100644 --- a/x-pack/legacy/plugins/lens/public/indexpattern_plugin/operations/definitions/date_histogram.test.tsx +++ b/x-pack/legacy/plugins/lens/public/indexpattern_plugin/operations/definitions/date_histogram.test.tsx @@ -14,33 +14,31 @@ import { IStorageWrapper } from 'src/plugins/kibana_utils/public'; import { createMockedIndexPattern } from '../../mocks'; import { IndexPatternPrivateState } from '../../types'; -jest.mock('ui/new_platform', () => { +jest.mock(`ui/new_platform`, () => { // Due to the way we are handling shims in the NP migration, we need // to mock core here so that upstream services don't cause these // tests to fail. Ordinarly `jest.mock('ui/new_platform')` would be // sufficient, however we need to mock one of the `uiSettings` return // values for this suite, so we must manually assemble the mock. // Because babel hoists `jest` we must use an inline `require` - // to ensure the core mocks are available (`jest.doMock` doesn't + // to ensure the mocks are available (`jest.doMock` doesn't // work in this case). This mock should be able to be replaced // altogether once Lens has migrated to the new platform. - const { coreMock } = require('src/core/public/mocks'); // eslint-disable-line @typescript-eslint/no-var-requires + const { + createUiNewPlatformMock, + } = require('../../../../../../../../src/legacy/ui/public/new_platform/__mocks__/helpers'); // eslint-disable-line @typescript-eslint/no-var-requires + // This is basically duplicating what would ordinarily happen in + // `ui/new_platform/__mocks__` + const { npSetup, npStart } = createUiNewPlatformMock(); + // Override the core mock provided by `ui/new_platform` + npStart.core.uiSettings.get = (path: string) => { + if (path === 'histogram:maxBars') { + return 10; + } + }; return { - npSetup: { - core: coreMock.createSetup(), - }, - npStart: { - core: { - ...coreMock.createStart(), - uiSettings: { - get: (path: string) => { - if (path === 'histogram:maxBars') { - return 10; - } - }, - }, - }, - }, + npSetup, + npStart, }; }); diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_plugin/operations/definitions/date_histogram.tsx b/x-pack/legacy/plugins/lens/public/indexpattern_plugin/operations/definitions/date_histogram.tsx index dbb6278352f09..ae12be90ddd05 100644 --- a/x-pack/legacy/plugins/lens/public/indexpattern_plugin/operations/definitions/date_histogram.tsx +++ b/x-pack/legacy/plugins/lens/public/indexpattern_plugin/operations/definitions/date_histogram.tsx @@ -9,7 +9,7 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; // TODO: make this new-platform compatible -import { isValidInterval } from 'ui/agg_types/utils'; +import { isValidInterval } from 'ui/agg_types'; import { EuiForm, diff --git a/x-pack/legacy/plugins/rollup/public/legacy.ts b/x-pack/legacy/plugins/rollup/public/legacy.ts index a2738372ff346..a70f181dc86fb 100644 --- a/x-pack/legacy/plugins/rollup/public/legacy.ts +++ b/x-pack/legacy/plugins/rollup/public/legacy.ts @@ -6,8 +6,8 @@ import { npSetup, npStart } from 'ui/new_platform'; import { editorConfigProviders } from 'ui/vis/config'; -import { aggTypeFilters } from 'ui/agg_types/filter'; -import { aggTypeFieldFilters } from 'ui/agg_types/param_types/filter'; +import { aggTypeFilters } from 'ui/agg_types'; +import { aggTypeFieldFilters } from 'ui/agg_types'; import { addSearchStrategy } from '../../../../../src/plugins/data/public'; import { RollupPlugin } from './plugin'; import { setup as management } from '../../../../../src/legacy/core_plugins/management/public/legacy'; diff --git a/x-pack/legacy/plugins/rollup/public/legacy_imports.ts b/x-pack/legacy/plugins/rollup/public/legacy_imports.ts index 981f97963591e..4fece0fddfa3e 100644 --- a/x-pack/legacy/plugins/rollup/public/legacy_imports.ts +++ b/x-pack/legacy/plugins/rollup/public/legacy_imports.ts @@ -7,6 +7,6 @@ // @ts-ignore export { findIllegalCharactersInIndexName, INDEX_ILLEGAL_CHARACTERS_VISIBLE } from 'ui/indices'; -export { AggTypeFilters } from 'ui/agg_types/filter'; -export { AggTypeFieldFilters } from 'ui/agg_types/param_types/filter'; +export { AggTypeFilters } from 'ui/agg_types'; +export { AggTypeFieldFilters } from 'ui/agg_types'; export { EditorConfigProviderRegistry } from 'ui/vis/config'; diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 58d97ce263bea..351bc9def3082 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -77,109 +77,110 @@ }, "messages": { "common.ui.aggResponse.allDocsTitle": "すべてのドキュメント", - "common.ui.aggTypes.aggGroups.bucketsText": "バケット", - "common.ui.aggTypes.aggGroups.metricsText": "メトリック", - "common.ui.aggTypes.buckets.dateHistogramLabel": "{intervalDescription}ごとの {fieldName}", - "common.ui.aggTypes.buckets.dateHistogramTitle": "日付ヒストグラム", - "common.ui.aggTypes.buckets.dateRangeTitle": "日付範囲", - "common.ui.aggTypes.buckets.filtersTitle": "フィルター", - "common.ui.aggTypes.buckets.filterTitle": "フィルター", - "common.ui.aggTypes.buckets.geohashGridTitle": "ジオハッシュ", - "common.ui.aggTypes.buckets.geotileGridTitle": "ジオタイル", - "common.ui.aggTypes.buckets.histogramTitle": "ヒストグラム", - "common.ui.aggTypes.buckets.intervalOptions.autoDisplayName": "自動", - "common.ui.aggTypes.buckets.intervalOptions.dailyDisplayName": "日ごと", - "common.ui.aggTypes.buckets.intervalOptions.hourlyDisplayName": "1 時間ごと", - "common.ui.aggTypes.buckets.intervalOptions.millisecondDisplayName": "ミリ秒", - "common.ui.aggTypes.buckets.intervalOptions.minuteDisplayName": "分", - "common.ui.aggTypes.buckets.intervalOptions.monthlyDisplayName": "月ごと", - "common.ui.aggTypes.buckets.intervalOptions.secondDisplayName": "秒", - "common.ui.aggTypes.buckets.intervalOptions.weeklyDisplayName": "週ごと", - "common.ui.aggTypes.buckets.intervalOptions.yearlyDisplayName": "1 年ごと", - "common.ui.aggTypes.buckets.ipRangeLabel": "{fieldName} IP 範囲", - "common.ui.aggTypes.buckets.ipRangeTitle": "IPv4 範囲", - "common.ui.aggTypes.buckets.ranges.rangesFormatMessage": "{gte} {from} と {lt} {to}", - "common.ui.aggTypes.buckets.rangesLabel": "{fieldName} の範囲", - "common.ui.aggTypes.buckets.rangeTitle": "範囲", - "common.ui.aggTypes.buckets.significantTerms.excludeLabel": "除外", - "common.ui.aggTypes.buckets.significantTerms.includeLabel": "含める", - "common.ui.aggTypes.buckets.significantTermsLabel": "{fieldName} のトップ {size} の珍しいアイテム", - "common.ui.aggTypes.buckets.significantTermsTitle": "重要な用語", - "common.ui.aggTypes.buckets.terms.excludeLabel": "除外", - "common.ui.aggTypes.buckets.terms.includeLabel": "含める", - "common.ui.aggTypes.buckets.terms.missingBucketLabel": "欠測値", - "common.ui.aggTypes.buckets.terms.orderAscendingTitle": "昇順", - "common.ui.aggTypes.buckets.terms.orderDescendingTitle": "降順", - "common.ui.aggTypes.buckets.terms.otherBucketDescription": "このリクエストは、データバケットの基準外のドキュメントの数をカウントします。", - "common.ui.aggTypes.buckets.terms.otherBucketLabel": "その他", - "common.ui.aggTypes.buckets.terms.otherBucketTitle": "他のバケット", - "common.ui.aggTypes.buckets.termsTitle": "用語", - "common.ui.aggTypes.histogram.missingMaxMinValuesWarning": "自動スケールヒストグラムバケットから最高値と最低値を取得できません。これによりビジュアライゼーションのパフォーマンスが低下する可能性があります。", - "common.ui.aggTypes.metrics.averageBucketTitle": "平均バケット", - "common.ui.aggTypes.metrics.averageLabel": "平均 {field}", - "common.ui.aggTypes.metrics.averageTitle": "平均", - "common.ui.aggTypes.metrics.bucketAggTitle": "バケット集約", - "common.ui.aggTypes.metrics.countLabel": "カウント", - "common.ui.aggTypes.metrics.countTitle": "カウント", - "common.ui.aggTypes.metrics.cumulativeSumLabel": "累積合計", - "common.ui.aggTypes.metrics.cumulativeSumTitle": "累積合計", - "common.ui.aggTypes.metrics.derivativeLabel": "派生", - "common.ui.aggTypes.metrics.derivativeTitle": "派生", - "common.ui.aggTypes.metrics.geoBoundsLabel": "境界", - "common.ui.aggTypes.metrics.geoBoundsTitle": "境界", - "common.ui.aggTypes.metrics.geoCentroidLabel": "ジオセントロイド", - "common.ui.aggTypes.metrics.geoCentroidTitle": "ジオセントロイド", - "common.ui.aggTypes.metrics.maxBucketTitle": "最高バケット", - "common.ui.aggTypes.metrics.maxLabel": "最高 {field}", - "common.ui.aggTypes.metrics.maxTitle": "最高", - "common.ui.aggTypes.metrics.medianLabel": "中央 {field}", - "common.ui.aggTypes.metrics.medianTitle": "中央", - "common.ui.aggTypes.metrics.metricAggregationsSubtypeTitle": "メトリック集約", - "common.ui.aggTypes.metrics.metricAggTitle": "メトリック集約", - "common.ui.aggTypes.metrics.minBucketTitle": "最低バケット", - "common.ui.aggTypes.metrics.minLabel": "最低 {field}", - "common.ui.aggTypes.metrics.minTitle": "最低", - "common.ui.aggTypes.metrics.movingAvgLabel": "移動平均", - "common.ui.aggTypes.metrics.movingAvgTitle": "移動平均", - "common.ui.aggTypes.metrics.overallAverageLabel": "全体平均", - "common.ui.aggTypes.metrics.overallMaxLabel": "全体最高", - "common.ui.aggTypes.metrics.overallMinLabel": "全体最低", - "common.ui.aggTypes.metrics.overallSumLabel": "全体合計", - "common.ui.aggTypes.metrics.parentPipelineAggregationsSubtypeTitle": "親パイプライン集約", - "common.ui.aggTypes.metrics.percentileRanks.valuePropsLabel": "「{label}」の {format} のパーセンタイル順位", - "common.ui.aggTypes.metrics.percentileRanksLabel": "{field} のパーセンタイル順位", - "common.ui.aggTypes.metrics.percentileRanksTitle": "パーセンタイル順位", - "common.ui.aggTypes.metrics.percentiles.valuePropsLabel": "{label} の {percentile} パーセンタイル", - "common.ui.aggTypes.metrics.percentilesLabel": "{field} のパーセンタイル", - "common.ui.aggTypes.metrics.percentilesTitle": "パーセンタイル", - "common.ui.aggTypes.metrics.serialDiffLabel": "差分の推移", - "common.ui.aggTypes.metrics.serialDiffTitle": "差分の推移", - "common.ui.aggTypes.metrics.siblingPipelineAggregationsSubtypeTitle": "シブリングパイプラインアグリゲーション", - "common.ui.aggTypes.metrics.standardDeviation.keyDetailsLabel": "{fieldDisplayName} の標準偏差", - "common.ui.aggTypes.metrics.standardDeviation.lowerKeyDetailsTitle": "下の{label}", - "common.ui.aggTypes.metrics.standardDeviation.upperKeyDetailsTitle": "上の{label}", - "common.ui.aggTypes.metrics.standardDeviationLabel": "{field} の標準偏差", - "common.ui.aggTypes.metrics.standardDeviationTitle": "標準偏差", - "common.ui.aggTypes.metrics.sumBucketTitle": "合計バケット", - "common.ui.aggTypes.metrics.sumLabel": "{field} の合計", - "common.ui.aggTypes.metrics.sumTitle": "合計", - "common.ui.aggTypes.metrics.topHit.ascendingLabel": "昇順", - "common.ui.aggTypes.metrics.topHit.averageLabel": "平均", - "common.ui.aggTypes.metrics.topHit.concatenateLabel": "連結", - "common.ui.aggTypes.metrics.topHit.descendingLabel": "降順", - "common.ui.aggTypes.metrics.topHit.firstPrefixLabel": "最初", - "common.ui.aggTypes.metrics.topHit.lastPrefixLabel": "最後", - "common.ui.aggTypes.metrics.topHit.maxLabel": "最高", - "common.ui.aggTypes.metrics.topHit.minLabel": "最低", - "common.ui.aggTypes.metrics.topHit.sumLabel": "合計", - "common.ui.aggTypes.metrics.topHitTitle": "トップヒット", - "common.ui.aggTypes.metrics.uniqueCountLabel": "{field} のユニークカウント", - "common.ui.aggTypes.metrics.uniqueCountTitle": "ユニークカウント", - "common.ui.aggTypes.otherBucket.labelForMissingValuesLabel": "欠測値のラベル", - "common.ui.aggTypes.otherBucket.labelForOtherBucketLabel": "他のバケットのラベル", - "common.ui.aggTypes.paramTypes.field.invalidSavedFieldParameterErrorMessage": "保存された {fieldParameter} パラメーターが無効になりました。新しいフィールドを選択してください。", - "common.ui.aggTypes.paramTypes.field.requiredFieldParameterErrorMessage": "{fieldParameter} は必須パラメーターです", - "common.ui.aggTypes.string.customLabel": "カスタムラベル", + "common.ui.aggTypes.rangesFormatMessage": "{gte} {from} と {lt} {to}", + "data.search.aggs.aggGroups.bucketsText": "バケット", + "data.search.aggs.aggGroups.metricsText": "メトリック", + "data.search.aggs.buckets.dateHistogramLabel": "{intervalDescription}ごとの {fieldName}", + "data.search.aggs.buckets.dateHistogramTitle": "日付ヒストグラム", + "data.search.aggs.buckets.dateRangeTitle": "日付範囲", + "data.search.aggs.buckets.filtersTitle": "フィルター", + "data.search.aggs.buckets.filterTitle": "フィルター", + "data.search.aggs.buckets.geohashGridTitle": "ジオハッシュ", + "data.search.aggs.buckets.geotileGridTitle": "ジオタイル", + "data.search.aggs.buckets.histogramTitle": "ヒストグラム", + "data.search.aggs.buckets.intervalOptions.autoDisplayName": "自動", + "data.search.aggs.buckets.intervalOptions.dailyDisplayName": "日ごと", + "data.search.aggs.buckets.intervalOptions.hourlyDisplayName": "1 時間ごと", + "data.search.aggs.buckets.intervalOptions.millisecondDisplayName": "ミリ秒", + "data.search.aggs.buckets.intervalOptions.minuteDisplayName": "分", + "data.search.aggs.buckets.intervalOptions.monthlyDisplayName": "月ごと", + "data.search.aggs.buckets.intervalOptions.secondDisplayName": "秒", + "data.search.aggs.buckets.intervalOptions.weeklyDisplayName": "週ごと", + "data.search.aggs.buckets.intervalOptions.yearlyDisplayName": "1 年ごと", + "data.search.aggs.buckets.ipRangeLabel": "{fieldName} IP 範囲", + "data.search.aggs.buckets.ipRangeTitle": "IPv4 範囲", + "data.search.aggs.aggTypes.rangesFormatMessage": "{gte} {from} と {lt} {to}", + "data.search.aggs.aggTypesLabel": "{fieldName} の範囲", + "data.search.aggs.buckets.rangeTitle": "範囲", + "data.search.aggs.buckets.significantTerms.excludeLabel": "除外", + "data.search.aggs.buckets.significantTerms.includeLabel": "含める", + "data.search.aggs.buckets.significantTermsLabel": "{fieldName} のトップ {size} の珍しいアイテム", + "data.search.aggs.buckets.significantTermsTitle": "重要な用語", + "data.search.aggs.buckets.terms.excludeLabel": "除外", + "data.search.aggs.buckets.terms.includeLabel": "含める", + "data.search.aggs.buckets.terms.missingBucketLabel": "欠測値", + "data.search.aggs.buckets.terms.orderAscendingTitle": "昇順", + "data.search.aggs.buckets.terms.orderDescendingTitle": "降順", + "data.search.aggs.buckets.terms.otherBucketDescription": "このリクエストは、データバケットの基準外のドキュメントの数をカウントします。", + "data.search.aggs.buckets.terms.otherBucketLabel": "その他", + "data.search.aggs.buckets.terms.otherBucketTitle": "他のバケット", + "data.search.aggs.buckets.termsTitle": "用語", + "data.search.aggs.histogram.missingMaxMinValuesWarning": "自動スケールヒストグラムバケットから最高値と最低値を取得できません。これによりビジュアライゼーションのパフォーマンスが低下する可能性があります。", + "data.search.aggs.metrics.averageBucketTitle": "平均バケット", + "data.search.aggs.metrics.averageLabel": "平均 {field}", + "data.search.aggs.metrics.averageTitle": "平均", + "data.search.aggs.metrics.bucketAggTitle": "バケット集約", + "data.search.aggs.metrics.countLabel": "カウント", + "data.search.aggs.metrics.countTitle": "カウント", + "data.search.aggs.metrics.cumulativeSumLabel": "累積合計", + "data.search.aggs.metrics.cumulativeSumTitle": "累積合計", + "data.search.aggs.metrics.derivativeLabel": "派生", + "data.search.aggs.metrics.derivativeTitle": "派生", + "data.search.aggs.metrics.geoBoundsLabel": "境界", + "data.search.aggs.metrics.geoBoundsTitle": "境界", + "data.search.aggs.metrics.geoCentroidLabel": "ジオセントロイド", + "data.search.aggs.metrics.geoCentroidTitle": "ジオセントロイド", + "data.search.aggs.metrics.maxBucketTitle": "最高バケット", + "data.search.aggs.metrics.maxLabel": "最高 {field}", + "data.search.aggs.metrics.maxTitle": "最高", + "data.search.aggs.metrics.medianLabel": "中央 {field}", + "data.search.aggs.metrics.medianTitle": "中央", + "data.search.aggs.metrics.metricAggregationsSubtypeTitle": "メトリック集約", + "data.search.aggs.metrics.metricAggTitle": "メトリック集約", + "data.search.aggs.metrics.minBucketTitle": "最低バケット", + "data.search.aggs.metrics.minLabel": "最低 {field}", + "data.search.aggs.metrics.minTitle": "最低", + "data.search.aggs.metrics.movingAvgLabel": "移動平均", + "data.search.aggs.metrics.movingAvgTitle": "移動平均", + "data.search.aggs.metrics.overallAverageLabel": "全体平均", + "data.search.aggs.metrics.overallMaxLabel": "全体最高", + "data.search.aggs.metrics.overallMinLabel": "全体最低", + "data.search.aggs.metrics.overallSumLabel": "全体合計", + "data.search.aggs.metrics.parentPipelineAggregationsSubtypeTitle": "親パイプライン集約", + "data.search.aggs.metrics.percentileRanks.valuePropsLabel": "「{label}」の {format} のパーセンタイル順位", + "data.search.aggs.metrics.percentileRanksLabel": "{field} のパーセンタイル順位", + "data.search.aggs.metrics.percentileRanksTitle": "パーセンタイル順位", + "data.search.aggs.metrics.percentiles.valuePropsLabel": "{label} の {percentile} パーセンタイル", + "data.search.aggs.metrics.percentilesLabel": "{field} のパーセンタイル", + "data.search.aggs.metrics.percentilesTitle": "パーセンタイル", + "data.search.aggs.metrics.serialDiffLabel": "差分の推移", + "data.search.aggs.metrics.serialDiffTitle": "差分の推移", + "data.search.aggs.metrics.siblingPipelineAggregationsSubtypeTitle": "シブリングパイプラインアグリゲーション", + "data.search.aggs.metrics.standardDeviation.keyDetailsLabel": "{fieldDisplayName} の標準偏差", + "data.search.aggs.metrics.standardDeviation.lowerKeyDetailsTitle": "下の{label}", + "data.search.aggs.metrics.standardDeviation.upperKeyDetailsTitle": "上の{label}", + "data.search.aggs.metrics.standardDeviationLabel": "{field} の標準偏差", + "data.search.aggs.metrics.standardDeviationTitle": "標準偏差", + "data.search.aggs.metrics.sumBucketTitle": "合計バケット", + "data.search.aggs.metrics.sumLabel": "{field} の合計", + "data.search.aggs.metrics.sumTitle": "合計", + "data.search.aggs.metrics.topHit.ascendingLabel": "昇順", + "data.search.aggs.metrics.topHit.averageLabel": "平均", + "data.search.aggs.metrics.topHit.concatenateLabel": "連結", + "data.search.aggs.metrics.topHit.descendingLabel": "降順", + "data.search.aggs.metrics.topHit.firstPrefixLabel": "最初", + "data.search.aggs.metrics.topHit.lastPrefixLabel": "最後", + "data.search.aggs.metrics.topHit.maxLabel": "最高", + "data.search.aggs.metrics.topHit.minLabel": "最低", + "data.search.aggs.metrics.topHit.sumLabel": "合計", + "data.search.aggs.metrics.topHitTitle": "トップヒット", + "data.search.aggs.metrics.uniqueCountLabel": "{field} のユニークカウント", + "data.search.aggs.metrics.uniqueCountTitle": "ユニークカウント", + "data.search.aggs.otherBucket.labelForMissingValuesLabel": "欠測値のラベル", + "data.search.aggs.otherBucket.labelForOtherBucketLabel": "他のバケットのラベル", + "data.search.aggs.paramTypes.field.invalidSavedFieldParameterErrorMessage": "保存された {fieldParameter} パラメーターが無効になりました。新しいフィールドを選択してください。", + "data.search.aggs.paramTypes.field.requiredFieldParameterErrorMessage": "{fieldParameter} は必須パラメーターです", + "data.search.aggs.string.customLabel": "カスタムラベル", "common.ui.chrome.bigUrlWarningNotificationMessage": "{advancedSettingsLink}で{storeInSessionStorageParam}オプションを有効にするか、オンスクリーンビジュアルを簡素化してください。", "common.ui.chrome.bigUrlWarningNotificationMessage.advancedSettingsLinkText": "高度な設定", "common.ui.chrome.bigUrlWarningNotificationTitle": "URLが大きく、Kibanaの動作が停止する可能性があります", @@ -375,7 +376,7 @@ "common.ui.stateManagement.unableToStoreHistoryInSessionErrorMessage": "セッションがいっぱいで安全に削除できるアイテムが見つからないため、Kibana は履歴アイテムを保存できません。\n\nこれは大抵新規タブに移動することで解決されますが、より大きな問題が原因である可能性もあります。このメッセージが定期的に表示される場合は、{gitHubIssuesUrl} で問題を報告してください。", "common.ui.url.replacementFailedErrorMessage": "置換に失敗、未解決の表現式: {expr}", "common.ui.url.savedObjectIsMissingNotificationMessage": "保存されたオブジェクトがありません", - "common.ui.vis.aggConfig.percentageOfLabel": "{label} のパーセンテージ", + "data.search.aggs.percentageOfLabel": "{label} のパーセンテージ", "common.ui.vis.defaultFeedbackMessage": "フィードバックがありますか?{link} で問題を報告してください。", "common.ui.vis.kibanaMap.leaflet.fitDataBoundsAriaLabel": "データバウンドを合わせる", "common.ui.vis.kibanaMap.zoomWarning": "ズームレベルが最大に達しました。完全にズームインするには、Elasticsearch と Kibana の {defaultDistribution} にアップグレードしてください。{ems} でより多くのズームレベルが利用できます。または、独自のマップサーバーを構成できます。詳細は { wms } または { configSettings} をご覧ください。", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 5d62e15be2b9f..066bafd990fe3 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -77,109 +77,110 @@ }, "messages": { "common.ui.aggResponse.allDocsTitle": "所有文档", - "common.ui.aggTypes.aggGroups.bucketsText": "存储桶", - "common.ui.aggTypes.aggGroups.metricsText": "指标", - "common.ui.aggTypes.buckets.dateHistogramLabel": "{fieldName}/{intervalDescription}", - "common.ui.aggTypes.buckets.dateHistogramTitle": "Date Histogram", - "common.ui.aggTypes.buckets.dateRangeTitle": "日期范围", - "common.ui.aggTypes.buckets.filtersTitle": "筛选", - "common.ui.aggTypes.buckets.filterTitle": "筛选", - "common.ui.aggTypes.buckets.geohashGridTitle": "Geohash", - "common.ui.aggTypes.buckets.geotileGridTitle": "地理磁贴", - "common.ui.aggTypes.buckets.histogramTitle": "Histogram", - "common.ui.aggTypes.buckets.intervalOptions.autoDisplayName": "自动", - "common.ui.aggTypes.buckets.intervalOptions.dailyDisplayName": "每日", - "common.ui.aggTypes.buckets.intervalOptions.hourlyDisplayName": "每小时", - "common.ui.aggTypes.buckets.intervalOptions.millisecondDisplayName": "毫秒", - "common.ui.aggTypes.buckets.intervalOptions.minuteDisplayName": "分钟", - "common.ui.aggTypes.buckets.intervalOptions.monthlyDisplayName": "每月", - "common.ui.aggTypes.buckets.intervalOptions.secondDisplayName": "秒", - "common.ui.aggTypes.buckets.intervalOptions.weeklyDisplayName": "每周", - "common.ui.aggTypes.buckets.intervalOptions.yearlyDisplayName": "每年", - "common.ui.aggTypes.buckets.ipRangeLabel": "{fieldName} IP 范围", - "common.ui.aggTypes.buckets.ipRangeTitle": "IPv4 范围", - "common.ui.aggTypes.buckets.ranges.rangesFormatMessage": "{gte} {from} 且 {lt} {to}", - "common.ui.aggTypes.buckets.rangesLabel": "{fieldName} 范围", - "common.ui.aggTypes.buckets.rangeTitle": "范围", - "common.ui.aggTypes.buckets.significantTerms.excludeLabel": "排除", - "common.ui.aggTypes.buckets.significantTerms.includeLabel": "包括", - "common.ui.aggTypes.buckets.significantTermsLabel": "{fieldName} 中排名前 {size} 的罕见词", - "common.ui.aggTypes.buckets.significantTermsTitle": "重要词", - "common.ui.aggTypes.buckets.terms.excludeLabel": "排除", - "common.ui.aggTypes.buckets.terms.includeLabel": "包括", - "common.ui.aggTypes.buckets.terms.missingBucketLabel": "缺失", - "common.ui.aggTypes.buckets.terms.orderAscendingTitle": "升序", - "common.ui.aggTypes.buckets.terms.orderDescendingTitle": "降序", - "common.ui.aggTypes.buckets.terms.otherBucketDescription": "此请求计数不符合数据存储桶条件的文档数目。", - "common.ui.aggTypes.buckets.terms.otherBucketLabel": "其他", - "common.ui.aggTypes.buckets.terms.otherBucketTitle": "其他存储桶", - "common.ui.aggTypes.buckets.termsTitle": "词", - "common.ui.aggTypes.histogram.missingMaxMinValuesWarning": "无法检索最大值和最小值以自动缩放直方图存储桶。这可能会导致可视化性能低下。", - "common.ui.aggTypes.metrics.averageBucketTitle": "平均存储桶", - "common.ui.aggTypes.metrics.averageLabel": "{field}平均值", - "common.ui.aggTypes.metrics.averageTitle": "平均值", - "common.ui.aggTypes.metrics.bucketAggTitle": "存储桶聚合", - "common.ui.aggTypes.metrics.countLabel": "计数", - "common.ui.aggTypes.metrics.countTitle": "计数", - "common.ui.aggTypes.metrics.cumulativeSumLabel": "累计和", - "common.ui.aggTypes.metrics.cumulativeSumTitle": "累计和", - "common.ui.aggTypes.metrics.derivativeLabel": "导数", - "common.ui.aggTypes.metrics.derivativeTitle": "导数", - "common.ui.aggTypes.metrics.geoBoundsLabel": "地理边界", - "common.ui.aggTypes.metrics.geoBoundsTitle": "地理边界", - "common.ui.aggTypes.metrics.geoCentroidLabel": "地理重心", - "common.ui.aggTypes.metrics.geoCentroidTitle": "地理重心", - "common.ui.aggTypes.metrics.maxBucketTitle": "最大存储桶", - "common.ui.aggTypes.metrics.maxLabel": "{field}最大值", - "common.ui.aggTypes.metrics.maxTitle": "最大值", - "common.ui.aggTypes.metrics.medianLabel": "{field}中值", - "common.ui.aggTypes.metrics.medianTitle": "中值", - "common.ui.aggTypes.metrics.metricAggregationsSubtypeTitle": "指标聚合", - "common.ui.aggTypes.metrics.metricAggTitle": "指标聚合", - "common.ui.aggTypes.metrics.minBucketTitle": "最小存储桶", - "common.ui.aggTypes.metrics.minLabel": "{field}最小值", - "common.ui.aggTypes.metrics.minTitle": "最小值", - "common.ui.aggTypes.metrics.movingAvgLabel": "移动平均值", - "common.ui.aggTypes.metrics.movingAvgTitle": "移动平均值", - "common.ui.aggTypes.metrics.overallAverageLabel": "总体平均值", - "common.ui.aggTypes.metrics.overallMaxLabel": "总体最大值", - "common.ui.aggTypes.metrics.overallMinLabel": "总体最大值", - "common.ui.aggTypes.metrics.overallSumLabel": "总和", - "common.ui.aggTypes.metrics.parentPipelineAggregationsSubtypeTitle": "父级管道聚合", - "common.ui.aggTypes.metrics.percentileRanks.valuePropsLabel": "“{label}” 的百分位数排名 {format}", - "common.ui.aggTypes.metrics.percentileRanksLabel": "“{field}” 的百分位数排名", - "common.ui.aggTypes.metrics.percentileRanksTitle": "百分位数排名", - "common.ui.aggTypes.metrics.percentiles.valuePropsLabel": "“{label}” 的 {percentile} 百分位数", - "common.ui.aggTypes.metrics.percentilesLabel": "“{field}” 的百分位数", - "common.ui.aggTypes.metrics.percentilesTitle": "百分位数", - "common.ui.aggTypes.metrics.serialDiffLabel": "序列差异", - "common.ui.aggTypes.metrics.serialDiffTitle": "序列差异", - "common.ui.aggTypes.metrics.siblingPipelineAggregationsSubtypeTitle": "同级管道聚合", - "common.ui.aggTypes.metrics.standardDeviation.keyDetailsLabel": "“{fieldDisplayName}” 的标准偏差", - "common.ui.aggTypes.metrics.standardDeviation.lowerKeyDetailsTitle": "下{label}", - "common.ui.aggTypes.metrics.standardDeviation.upperKeyDetailsTitle": "上{label}", - "common.ui.aggTypes.metrics.standardDeviationLabel": "“{field}” 的标准偏差", - "common.ui.aggTypes.metrics.standardDeviationTitle": "标准偏差", - "common.ui.aggTypes.metrics.sumBucketTitle": "求和存储桶", - "common.ui.aggTypes.metrics.sumLabel": "“{field}” 的和", - "common.ui.aggTypes.metrics.sumTitle": "和", - "common.ui.aggTypes.metrics.topHit.ascendingLabel": "升序", - "common.ui.aggTypes.metrics.topHit.averageLabel": "平均值", - "common.ui.aggTypes.metrics.topHit.concatenateLabel": "连接", - "common.ui.aggTypes.metrics.topHit.descendingLabel": "降序", - "common.ui.aggTypes.metrics.topHit.firstPrefixLabel": "第一", - "common.ui.aggTypes.metrics.topHit.lastPrefixLabel": "最后", - "common.ui.aggTypes.metrics.topHit.maxLabel": "最大值", - "common.ui.aggTypes.metrics.topHit.minLabel": "最小值", - "common.ui.aggTypes.metrics.topHit.sumLabel": "和", - "common.ui.aggTypes.metrics.topHitTitle": "最高命中结果", - "common.ui.aggTypes.metrics.uniqueCountLabel": "“{field}” 的唯一计数", - "common.ui.aggTypes.metrics.uniqueCountTitle": "唯一计数", - "common.ui.aggTypes.otherBucket.labelForMissingValuesLabel": "缺失值的标签", - "common.ui.aggTypes.otherBucket.labelForOtherBucketLabel": "其他存储桶的标签", - "common.ui.aggTypes.paramTypes.field.invalidSavedFieldParameterErrorMessage": "已保存的 {fieldParameter} 参数现在无效。请选择新字段。", - "common.ui.aggTypes.paramTypes.field.requiredFieldParameterErrorMessage": "{fieldParameter} 是必需字段", - "common.ui.aggTypes.string.customLabel": "定制标签", + "common.ui.aggTypes.rangesFormatMessage": "{gte} {from} 且 {lt} {to}", + "data.search.aggs.aggGroups.bucketsText": "存储桶", + "data.search.aggs.aggGroups.metricsText": "指标", + "data.search.aggs.buckets.dateHistogramLabel": "{fieldName}/{intervalDescription}", + "data.search.aggs.buckets.dateHistogramTitle": "Date Histogram", + "data.search.aggs.buckets.dateRangeTitle": "日期范围", + "data.search.aggs.buckets.filtersTitle": "筛选", + "data.search.aggs.buckets.filterTitle": "筛选", + "data.search.aggs.buckets.geohashGridTitle": "Geohash", + "data.search.aggs.buckets.geotileGridTitle": "地理磁贴", + "data.search.aggs.buckets.histogramTitle": "Histogram", + "data.search.aggs.buckets.intervalOptions.autoDisplayName": "自动", + "data.search.aggs.buckets.intervalOptions.dailyDisplayName": "每日", + "data.search.aggs.buckets.intervalOptions.hourlyDisplayName": "每小时", + "data.search.aggs.buckets.intervalOptions.millisecondDisplayName": "毫秒", + "data.search.aggs.buckets.intervalOptions.minuteDisplayName": "分钟", + "data.search.aggs.buckets.intervalOptions.monthlyDisplayName": "每月", + "data.search.aggs.buckets.intervalOptions.secondDisplayName": "秒", + "data.search.aggs.buckets.intervalOptions.weeklyDisplayName": "每周", + "data.search.aggs.buckets.intervalOptions.yearlyDisplayName": "每年", + "data.search.aggs.buckets.ipRangeLabel": "{fieldName} IP 范围", + "data.search.aggs.buckets.ipRangeTitle": "IPv4 范围", + "data.search.aggs.aggTypes.rangesFormatMessage": "{gte} {from} 且 {lt} {to}", + "data.search.aggs.aggTypesLabel": "{fieldName} 范围", + "data.search.aggs.buckets.rangeTitle": "范围", + "data.search.aggs.buckets.significantTerms.excludeLabel": "排除", + "data.search.aggs.buckets.significantTerms.includeLabel": "包括", + "data.search.aggs.buckets.significantTermsLabel": "{fieldName} 中排名前 {size} 的罕见词", + "data.search.aggs.buckets.significantTermsTitle": "重要词", + "data.search.aggs.buckets.terms.excludeLabel": "排除", + "data.search.aggs.buckets.terms.includeLabel": "包括", + "data.search.aggs.buckets.terms.missingBucketLabel": "缺失", + "data.search.aggs.buckets.terms.orderAscendingTitle": "升序", + "data.search.aggs.buckets.terms.orderDescendingTitle": "降序", + "data.search.aggs.buckets.terms.otherBucketDescription": "此请求计数不符合数据存储桶条件的文档数目。", + "data.search.aggs.buckets.terms.otherBucketLabel": "其他", + "data.search.aggs.buckets.terms.otherBucketTitle": "其他存储桶", + "data.search.aggs.buckets.termsTitle": "词", + "data.search.aggs.histogram.missingMaxMinValuesWarning": "无法检索最大值和最小值以自动缩放直方图存储桶。这可能会导致可视化性能低下。", + "data.search.aggs.metrics.averageBucketTitle": "平均存储桶", + "data.search.aggs.metrics.averageLabel": "{field}平均值", + "data.search.aggs.metrics.averageTitle": "平均值", + "data.search.aggs.metrics.bucketAggTitle": "存储桶聚合", + "data.search.aggs.metrics.countLabel": "计数", + "data.search.aggs.metrics.countTitle": "计数", + "data.search.aggs.metrics.cumulativeSumLabel": "累计和", + "data.search.aggs.metrics.cumulativeSumTitle": "累计和", + "data.search.aggs.metrics.derivativeLabel": "导数", + "data.search.aggs.metrics.derivativeTitle": "导数", + "data.search.aggs.metrics.geoBoundsLabel": "地理边界", + "data.search.aggs.metrics.geoBoundsTitle": "地理边界", + "data.search.aggs.metrics.geoCentroidLabel": "地理重心", + "data.search.aggs.metrics.geoCentroidTitle": "地理重心", + "data.search.aggs.metrics.maxBucketTitle": "最大存储桶", + "data.search.aggs.metrics.maxLabel": "{field}最大值", + "data.search.aggs.metrics.maxTitle": "最大值", + "data.search.aggs.metrics.medianLabel": "{field}中值", + "data.search.aggs.metrics.medianTitle": "中值", + "data.search.aggs.metrics.metricAggregationsSubtypeTitle": "指标聚合", + "data.search.aggs.metrics.metricAggTitle": "指标聚合", + "data.search.aggs.metrics.minBucketTitle": "最小存储桶", + "data.search.aggs.metrics.minLabel": "{field}最小值", + "data.search.aggs.metrics.minTitle": "最小值", + "data.search.aggs.metrics.movingAvgLabel": "移动平均值", + "data.search.aggs.metrics.movingAvgTitle": "移动平均值", + "data.search.aggs.metrics.overallAverageLabel": "总体平均值", + "data.search.aggs.metrics.overallMaxLabel": "总体最大值", + "data.search.aggs.metrics.overallMinLabel": "总体最大值", + "data.search.aggs.metrics.overallSumLabel": "总和", + "data.search.aggs.metrics.parentPipelineAggregationsSubtypeTitle": "父级管道聚合", + "data.search.aggs.metrics.percentileRanks.valuePropsLabel": "“{label}” 的百分位数排名 {format}", + "data.search.aggs.metrics.percentileRanksLabel": "“{field}” 的百分位数排名", + "data.search.aggs.metrics.percentileRanksTitle": "百分位数排名", + "data.search.aggs.metrics.percentiles.valuePropsLabel": "“{label}” 的 {percentile} 百分位数", + "data.search.aggs.metrics.percentilesLabel": "“{field}” 的百分位数", + "data.search.aggs.metrics.percentilesTitle": "百分位数", + "data.search.aggs.metrics.serialDiffLabel": "序列差异", + "data.search.aggs.metrics.serialDiffTitle": "序列差异", + "data.search.aggs.metrics.siblingPipelineAggregationsSubtypeTitle": "同级管道聚合", + "data.search.aggs.metrics.standardDeviation.keyDetailsLabel": "“{fieldDisplayName}” 的标准偏差", + "data.search.aggs.metrics.standardDeviation.lowerKeyDetailsTitle": "下{label}", + "data.search.aggs.metrics.standardDeviation.upperKeyDetailsTitle": "上{label}", + "data.search.aggs.metrics.standardDeviationLabel": "“{field}” 的标准偏差", + "data.search.aggs.metrics.standardDeviationTitle": "标准偏差", + "data.search.aggs.metrics.sumBucketTitle": "求和存储桶", + "data.search.aggs.metrics.sumLabel": "“{field}” 的和", + "data.search.aggs.metrics.sumTitle": "和", + "data.search.aggs.metrics.topHit.ascendingLabel": "升序", + "data.search.aggs.metrics.topHit.averageLabel": "平均值", + "data.search.aggs.metrics.topHit.concatenateLabel": "连接", + "data.search.aggs.metrics.topHit.descendingLabel": "降序", + "data.search.aggs.metrics.topHit.firstPrefixLabel": "第一", + "data.search.aggs.metrics.topHit.lastPrefixLabel": "最后", + "data.search.aggs.metrics.topHit.maxLabel": "最大值", + "data.search.aggs.metrics.topHit.minLabel": "最小值", + "data.search.aggs.metrics.topHit.sumLabel": "和", + "data.search.aggs.metrics.topHitTitle": "最高命中结果", + "data.search.aggs.metrics.uniqueCountLabel": "“{field}” 的唯一计数", + "data.search.aggs.metrics.uniqueCountTitle": "唯一计数", + "data.search.aggs.otherBucket.labelForMissingValuesLabel": "缺失值的标签", + "data.search.aggs.otherBucket.labelForOtherBucketLabel": "其他存储桶的标签", + "data.search.aggs.paramTypes.field.invalidSavedFieldParameterErrorMessage": "已保存的 {fieldParameter} 参数现在无效。请选择新字段。", + "data.search.aggs.paramTypes.field.requiredFieldParameterErrorMessage": "{fieldParameter} 是必需字段", + "data.search.aggs.string.customLabel": "定制标签", "common.ui.chrome.bigUrlWarningNotificationMessage": "在{advancedSettingsLink}中启用“{storeInSessionStorageParam}”选项或简化屏幕视觉效果。", "common.ui.chrome.bigUrlWarningNotificationMessage.advancedSettingsLinkText": "高级设置", "common.ui.chrome.bigUrlWarningNotificationTitle": "URL 过长,Kibana 可能无法工作", @@ -375,7 +376,7 @@ "common.ui.stateManagement.unableToStoreHistoryInSessionErrorMessage": "Kibana 无法将历史记录项存储在您的会话中,因为其已满,并且似乎没有任何可安全删除的项。\n\n通常可通过移至新的标签页来解决此问题,但这会导致更大的问题。如果您有规律地看到此消息,请在 {gitHubIssuesUrl} 提交问题。", "common.ui.url.replacementFailedErrorMessage": "替换失败,未解析的表达式:{expr}", "common.ui.url.savedObjectIsMissingNotificationMessage": "已保存对象缺失", - "common.ui.vis.aggConfig.percentageOfLabel": "{label} 的百分比", + "data.search.aggs.percentageOfLabel": "{label} 的百分比", "common.ui.vis.defaultFeedbackMessage": "想反馈?请在“{link}中创建问题。", "common.ui.vis.kibanaMap.leaflet.fitDataBoundsAriaLabel": "适应数据边界", "common.ui.vis.kibanaMap.zoomWarning": "已达到缩放级别最大数目。要一直放大,请升级到 Elasticsearch 和 Kibana 的 {defaultDistribution}。您可以通过 {ems} 免费使用其他缩放级别。或者,您可以配置自己的地图服务器。请前往 { wms } 或 { configSettings} 以获取详细信息。", diff --git a/x-pack/plugins/watcher/public/legacy/time_buckets.js b/x-pack/plugins/watcher/public/legacy/time_buckets.js index 8b7e4be784fe7..5d5e9e8dcb1a4 100644 --- a/x-pack/plugins/watcher/public/legacy/time_buckets.js +++ b/x-pack/plugins/watcher/public/legacy/time_buckets.js @@ -130,7 +130,7 @@ TimeBuckets.prototype.getDuration = function() { * generated. * * Input can be one of the following: - * - Any object from src/legacy/ui/agg_types/buckets/_interval_options.js + * - Any object from src/plugins/data/public/search/aggs/buckets/_interval_options.ts * - "auto" * - Pass a valid moment unit * - a moment.duration object. From 8a90e6748969569548250bda4b91f5c6724e1620 Mon Sep 17 00:00:00 2001 From: Frank Hassanabad Date: Tue, 4 Feb 2020 18:10:05 -0700 Subject: [PATCH 21/86] [SIEM][Detection Engine] critical blocker, wrong ilm policy, need to match beats ilm policy ## Summary Need to match ILM policy of auditbeat and we almost forgot this and it would be bad for shipping if we did not have best practices for ILM. ### Checklist Use ~~strikethroughs~~ to remove checklist items you don't feel are applicable to this PR. ~~- [ ] This was checked for cross-browser compatibility, [including a check against IE11](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#cross-browser-compatibility)~~ ~~- [ ] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/master/packages/kbn-i18n/README.md)~~ ~~- [ ] [Documentation](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#writing-documentation) was added for features that require explanation or tutorials~~ ~~- [ ] [Unit or functional tests](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#cross-browser-compatibility) were updated or added to match the most common scenarios~~ ~~- [ ] This was checked for [keyboard-only and screenreader accessibility](https://developer.mozilla.org/en-US/docs/Learn/Tools_and_testing/Cross_browser_testing/Accessibility#Accessibility_testing_checklist)~~ ### For maintainers ~~- [ ] This was checked for breaking API changes and was [labeled appropriately](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#release-notes-process)~~ ~~- [ ] This includes a feature addition or change that requires a release note and was [labeled appropriately](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#release-notes-process)~~ ### Checklist Use ~~strikethroughs~~ to remove checklist items you don't feel are applicable to this PR. - [ ] This was checked for cross-browser compatibility, [including a check against IE11](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#cross-browser-compatibility) - [ ] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/master/packages/kbn-i18n/README.md) - [ ] [Documentation](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#writing-documentation) was added for features that require explanation or tutorials - [ ] [Unit or functional tests](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#cross-browser-compatibility) were updated or added to match the most common scenarios - [ ] This was checked for [keyboard-only and screenreader accessibility](https://developer.mozilla.org/en-US/docs/Learn/Tools_and_testing/Cross_browser_testing/Accessibility#Accessibility_testing_checklist) ### For maintainers - [ ] This was checked for breaking API changes and was [labeled appropriately](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#release-notes-process) - [ ] This includes a feature addition or change that requires a release note and was [labeled appropriately](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#release-notes-process) --- .../lib/detection_engine/routes/index/signals_policy.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/signals_policy.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/signals_policy.json index 640d8e14190cd..4fc7eebd4373c 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/signals_policy.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/signals_policy.json @@ -5,8 +5,8 @@ "min_age": "0ms", "actions": { "rollover": { - "max_size": "10gb", - "max_age": "7d" + "max_size": "50gb", + "max_age": "30d" } } } From fac68730548685d87364db696ae6c3e16fc94f43 Mon Sep 17 00:00:00 2001 From: Frank Hassanabad Date: Tue, 4 Feb 2020 18:19:36 -0700 Subject: [PATCH 22/86] [SIEM][Detection Engine] Final final rule changes (#56806) ## Summary * Final, final, Rule changes ### Checklist Use ~~strikethroughs~~ to remove checklist items you don't feel are applicable to this PR. ~~- [ ] This was checked for cross-browser compatibility, [including a check against IE11](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#cross-browser-compatibility)~~ ~~- [ ] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/master/packages/kbn-i18n/README.md)~~ ~~- [ ] [Documentation](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#writing-documentation) was added for features that require explanation or tutorials~~ ~~- [ ] [Unit or functional tests](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#cross-browser-compatibility) were updated or added to match the most common scenarios~~ ~~- [ ] This was checked for [keyboard-only and screenreader accessibility](https://developer.mozilla.org/en-US/docs/Learn/Tools_and_testing/Cross_browser_testing/Accessibility#Accessibility_testing_checklist)~~ ### For maintainers ~~- [ ] This was checked for breaking API changes and was [labeled appropriately](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#release-notes-process)~~ ~~- [ ] This includes a feature addition or change that requires a release note and was [labeled appropriately](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#release-notes-process)~~ --- NOTICE.txt | 2 - .../403_response_to_a_post.json | 6 +- .../405_response_method_not_allowed.json | 6 +- ..._security_adversary_behavior_detected.json | 6 +- ...dpoint_security_cred_dumping_detected.json | 8 +- ...point_security_cred_dumping_prevented.json | 8 +- ...t_security_cred_manipulation_detected.json | 8 +- ..._security_cred_manipulation_prevented.json | 11 +- ...ic_endpoint_security_exploit_detected.json | 6 +- ...c_endpoint_security_exploit_prevented.json | 6 +- ...ic_endpoint_security_malware_detected.json | 6 +- ...c_endpoint_security_malware_prevented.json | 6 +- ...nt_security_permission_theft_detected.json | 6 +- ...t_security_permission_theft_prevented.json | 6 +- ...t_security_process_injection_detected.json | 6 +- ..._security_process_injection_prevented.json | 6 +- ...endpoint_security_ransomware_detected.json | 6 +- ...ndpoint_security_ransomware_prevented.json | 6 +- ...den_file_attribute_with_via_attribexe.json | 4 +- .../eql_adobe_hijack_persistence.json | 2 +- .../eql_audio_capture_via_powershell.json | 36 ---- .../eql_audio_capture_via_soundrecorder.json | 36 ---- .../eql_bypass_uac_event_viewer.json | 36 ---- .../eql_bypass_uac_via_cmstp.json | 36 ---- .../eql_bypass_uac_via_sdclt.json | 36 ---- .../eql_clearing_windows_event_logs.json | 4 +- ...delete_volume_usn_journal_with_fsutil.json | 2 +- ...deleting_backup_catalogs_with_wbadmin.json | 2 +- .../eql_direct_outbound_smb_connection.json | 2 +- ...ble_windows_firewall_rules_with_netsh.json | 2 +- .../eql_dll_search_order_hijack.json | 51 ----- ...coding_or_decoding_files_via_certutil.json | 2 +- .../eql_local_scheduled_task_commands.json | 2 +- .../eql_local_service_commands.json | 2 +- ...ql_modification_of_boot_configuration.json | 36 ---- ...ql_msbuild_making_network_connections.json | 4 +- .../eql_mshta_making_network_connections.json | 4 +- .../eql_msxsl_making_network_connections.json | 36 ---- .../eql_psexec_lateral_movement_command.json | 4 +- ...ql_suspicious_ms_office_child_process.json | 2 +- ...l_suspicious_ms_outlook_child_process.json | 2 +- ...l_suspicious_pdf_reader_child_process.json | 36 ---- .../eql_system_shells_via_services.json | 2 +- ...usual_network_connection_via_rundll32.json | 2 +- .../eql_unusual_parentchild_relationship.json | 2 +- ...ql_unusual_process_network_connection.json | 2 +- .../eql_user_account_creation.json | 2 +- ...eql_user_added_to_administrator_group.json | 36 ---- ...ume_shadow_copy_deletion_via_vssadmin.json | 2 +- ..._volume_shadow_copy_deletion_via_wmic.json | 4 +- ...l_windows_script_executing_powershell.json | 2 +- .../eql_wmic_command_lateral_movement.json | 39 ---- .../rules/prepackaged_rules/index.ts | 186 +++++++----------- .../linux_hping_activity.json | 6 +- .../linux_iodine_activity.json | 4 +- .../linux_kernel_module_activity.json | 4 +- .../linux_ldso_process_activity.json | 22 --- .../linux_mknod_activity.json | 6 +- .../linux_netcat_network_connection.json | 6 +- .../linux_nmap_activity.json | 6 +- .../linux_nping_activity.json | 6 +- ...nux_process_started_in_temp_directory.json | 4 +- .../linux_shell_activity_by_web_server.json | 4 +- .../linux_socat_activity.json | 6 +- .../linux_strace_activity.json | 2 +- .../linux_tcpdump_activity.json | 4 +- .../linux_whoami_commmand.json | 4 +- .../network_dns_directly_to_the_internet.json | 8 +- ...fer_protocol_activity_to_the_internet.json | 8 +- ...hat_protocol_activity_to_the_internet.json | 8 +- .../network_nat_traversal_port_activity.json | 8 +- .../network_port_26_activity.json | 10 +- ...rk_port_8000_activity_to_the_internet.json | 6 +- ..._to_point_tunneling_protocol_activity.json | 10 +- ...k_proxy_port_activity_to_the_internet.json | 8 +- ...te_desktop_protocol_from_the_internet.json | 8 +- ...mote_desktop_protocol_to_the_internet.json | 8 +- ...mote_procedure_call_from_the_internet.json | 6 +- ...remote_procedure_call_to_the_internet.json | 6 +- ...file_sharing_activity_to_the_internet.json | 6 +- .../network_smtp_to_the_internet.json | 8 +- ..._server_port_activity_to_the_internet.json | 8 +- ...rk_ssh_secure_shell_from_the_internet.json | 8 +- ...work_ssh_secure_shell_to_the_internet.json | 8 +- .../network_telnet_port_activity.json | 8 +- .../network_tor_activity_to_the_internet.json | 8 +- ...l_network_computing_from_the_internet.json | 8 +- ...ual_network_computing_to_the_internet.json | 8 +- .../rules/prepackaged_rules/notice.ts | 2 - .../prepackaged_rules/null_user_agent.json | 4 +- .../prepackaged_rules/sqlmap_user_agent.json | 5 +- ...rvice_bits_connecting_to_the_internet.json | 51 ----- ...s_certutil_connecting_to_the_internet.json | 36 ---- ...and_prompt_connecting_to_the_internet.json | 2 +- ...nd_shell_started_by_internet_explorer.json | 36 ---- ...s_command_shell_started_by_powershell.json | 4 +- ...dows_command_shell_started_by_svchost.json | 4 +- ...ws_defense_evasion_via_filter_manager.json | 5 +- ...dows_execution_via_compiled_html_file.json | 2 +- ...dows_execution_via_connection_manager.json | 37 ---- ...dows_execution_via_net_com_assemblies.json | 40 ---- .../windows_execution_via_regsvr32.json | 2 +- ...ution_via_trusted_developer_utilities.json | 3 +- ...le_program_connecting_to_the_internet.json | 2 +- ...isc_lolbin_connecting_to_the_internet.json | 2 +- ...ommand_activity_by_the_system_account.json | 36 ---- ..._persistence_via_application_shimming.json | 3 +- ...escalation_via_accessibility_features.json | 3 +- ...rocess_discovery_via_tasklist_command.json | 3 +- .../windows_process_execution_via_wmi.json | 39 ---- ...er_program_connecting_to_the_internet.json | 2 +- ...windows_signed_binary_proxy_execution.json | 2 +- ...igned_binary_proxy_execution_download.json | 54 ----- ...uspicious_process_started_by_a_script.json | 4 +- .../windows_whoami_command_activity.json | 2 +- 115 files changed, 312 insertions(+), 1094 deletions(-) delete mode 100644 x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_audio_capture_via_powershell.json delete mode 100644 x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_audio_capture_via_soundrecorder.json delete mode 100644 x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_bypass_uac_event_viewer.json delete mode 100644 x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_bypass_uac_via_cmstp.json delete mode 100644 x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_bypass_uac_via_sdclt.json delete mode 100644 x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_dll_search_order_hijack.json delete mode 100644 x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_modification_of_boot_configuration.json delete mode 100644 x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_msxsl_making_network_connections.json delete mode 100644 x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_suspicious_pdf_reader_child_process.json delete mode 100644 x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_user_added_to_administrator_group.json delete mode 100644 x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_wmic_command_lateral_movement.json delete mode 100644 x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_ldso_process_activity.json delete mode 100644 x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_background_intelligent_transfer_service_bits_connecting_to_the_internet.json delete mode 100644 x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_certutil_connecting_to_the_internet.json delete mode 100644 x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_command_shell_started_by_internet_explorer.json delete mode 100644 x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_execution_via_connection_manager.json delete mode 100644 x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_execution_via_net_com_assemblies.json delete mode 100644 x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_net_command_activity_by_the_system_account.json delete mode 100644 x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_process_execution_via_wmi.json delete mode 100644 x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_signed_binary_proxy_execution_download.json diff --git a/NOTICE.txt b/NOTICE.txt index e0c5d94eff6b3..69be6db72cff2 100644 --- a/NOTICE.txt +++ b/NOTICE.txt @@ -162,8 +162,6 @@ which is available under a "MIT" license. The files based on this license are: - windows_priv_escalation_via_accessibility_features.json - windows_persistence_via_application_shimming.json - windows_execution_via_trusted_developer_utilities.json -- windows_execution_via_net_com_assemblies.json -- windows_execution_via_connection_manager.json MIT License diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/403_response_to_a_post.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/403_response_to_a_post.json index c685d96cdf57b..fd46a09d4ced0 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/403_response_to_a_post.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/403_response_to_a_post.json @@ -1,13 +1,13 @@ { - "description": "A POST request to web application returned a 403 response which indicates the web application declined to process the request because the action requested was disallowed.", + "description": "A POST request to web application returned a 403 response, which indicates the web application declined to process the request because the action requested was not allowed", "false_positives": [ - "Security scans and tests may result in these errors. Misconfigured or buggy applications may produce large numbers of these errors. If the source is unexpected, or the user is unauthorized, or the request is unusual, these may be suspicious or malicious activity." + "Security scans and tests may result in these errors. Misconfigured or buggy applications may produce large numbers of these errors. If the source is unexpected, the user unauthorized, or the request unusual, these may indicate suspicious or malicious activity." ], "index": [ "apm-*-transaction*" ], "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Web Application Suspicious Activity: POST Request Declined", "query": "http.response.status_code:403 and http.request.method:post", "references": [ diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/405_response_method_not_allowed.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/405_response_method_not_allowed.json index 64264452d468b..a6235c889902b 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/405_response_method_not_allowed.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/405_response_method_not_allowed.json @@ -1,13 +1,13 @@ { - "description": "A request to web application returned a 405 response which indicates the web application declined to process the request because the HTTP method was not allowed for the resource.", + "description": "A request to web application returned a 405 response which indicates the web application declined to process the request because the HTTP method is not allowed for the resource", "false_positives": [ - "Security scans and tests may result in these errors. Misconfigured or buggy applications may produce large numbers of these errors. If the source is unexpected, or the user is unauthorized, or the request is unusual, these may be suspicious or malicious activity." + "Security scans and tests may result in these errors. Misconfigured or buggy applications may produce large numbers of these errors. If the source is unexpected, the user unauthorized, or the request unusual, these may indicate suspicious or malicious activity." ], "index": [ "apm-*-transaction*" ], "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Web Application Suspicious Activity: Unauthorized Method", "query": "http.response.status_code:405", "references": [ diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_adversary_behavior_detected.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_adversary_behavior_detected.json index 56d142fdf3ef8..397db1367f402 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_adversary_behavior_detected.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_adversary_behavior_detected.json @@ -1,10 +1,12 @@ { - "description": "Elastic Endpoint Security Alert - Adversary behavior detected.", + "description": "Elastic Endpoint detected an Adversary Behavior. Click the Elastic Endpoint icon in the event.module column or the link in the rule.reference column in the External Alerts tab of the SIEM Detections page for additional information.", + "from": "now-660s", "index": [ "endgame-*" ], + "interval": "10m", "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Adversary Behavior - Detected - Elastic Endpoint", "query": "event.kind:alert and event.module:endgame and event.action:rules_engine_event", "risk_score": 47, diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_cred_dumping_detected.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_cred_dumping_detected.json index 6805696ce6bc9..fdd875e95b3d3 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_cred_dumping_detected.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_cred_dumping_detected.json @@ -1,11 +1,13 @@ { - "description": "Elastic Endpoint Security Alert - Credential dumping detected.", + "description": "Elastic Endpoint detected Credential Dumping. Click the Elastic Endpoint icon in the event.module column or the link in the rule.reference column in the External Alerts tab of the SIEM Detections page for additional information.", + "from": "now-660s", "index": [ "endgame-*" ], + "interval": "10m", "language": "kuery", - "max_signals": 33, - "name": "Cred Dumping - Detected - Elastic Endpoint", + "max_signals": 100, + "name": "Credential Dumping - Detected - Elastic Endpoint", "query": "event.kind:alert and event.module:endgame and event.action:cred_theft_event and endgame.metadata.type:detection", "risk_score": 73, "rule_id": "571afc56-5ed9-465d-a2a9-045f099f6e7e", diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_cred_dumping_prevented.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_cred_dumping_prevented.json index 68c0f5cad8252..8ed63c55ef213 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_cred_dumping_prevented.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_cred_dumping_prevented.json @@ -1,11 +1,13 @@ { - "description": "Elastic Endpoint Security Alert - Credential dumping prevented.", + "description": "Elastic Endpoint prevented Credential Dumping. Click the Elastic Endpoint icon in the event.module column or the link in the rule.reference column in the External Alerts tab of the SIEM Detections page for additional information.", + "from": "now-660s", "index": [ "endgame-*" ], + "interval": "10m", "language": "kuery", - "max_signals": 33, - "name": "Cred Dumping - Prevented - Elastic Endpoint", + "max_signals": 100, + "name": "Credential Dumping - Prevented - Elastic Endpoint", "query": "event.kind:alert and event.module:endgame and event.action:cred_theft_event and endgame.metadata.type:prevention", "risk_score": 47, "rule_id": "db8c33a8-03cd-4988-9e2c-d0a4863adb13", diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_cred_manipulation_detected.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_cred_manipulation_detected.json index 0d0d9c71a2ec1..98c4e5341d9e8 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_cred_manipulation_detected.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_cred_manipulation_detected.json @@ -1,11 +1,13 @@ { - "description": "Elastic Endpoint Security Alert - Credential manipulation detected.", + "description": "Elastic Endpoint detected Credential Manipulation. Click the Elastic Endpoint icon in the event.module column or the link in the rule.reference column in the External Alerts tab of the SIEM Detections page for additional information.", + "from": "now-660s", "index": [ "endgame-*" ], + "interval": "10m", "language": "kuery", - "max_signals": 33, - "name": "Cred Manipulation - Detected - Elastic Endpoint", + "max_signals": 100, + "name": "Credential Manipulation - Detected - Elastic Endpoint", "query": "event.kind:alert and event.module:endgame and event.action:token_manipulation_event and endgame.metadata.type:detection", "risk_score": 73, "rule_id": "c0be5f31-e180-48ed-aa08-96b36899d48f", diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_cred_manipulation_prevented.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_cred_manipulation_prevented.json index df49c80e3097b..4234e3d955794 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_cred_manipulation_prevented.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_cred_manipulation_prevented.json @@ -1,17 +1,20 @@ { - "description": "Elastic Endpoint Security Alert - Credential manipulation prevented.", + "description": "Elastic Endpoint prevented Credential Manipulation. Click the Elastic Endpoint icon in the event.module column or the link in the rule.reference column in the External Alerts tab of the SIEM Detections page for additional information.", + "from": "now-660s", "index": [ "endgame-*" ], + "interval": "10m", "language": "kuery", - "max_signals": 33, - "name": "Cred Manipulation - Prevented - Elastic Endpoint", + "max_signals": 100, + "name": "Credential Manipulation - Prevented - Elastic Endpoint", "query": "event.kind:alert and event.module:endgame and event.action:token_manipulation_event and endgame.metadata.type:prevention", "risk_score": 47, "rule_id": "c9e38e64-3f4c-4bf3-ad48-0e61a60ea1fa", "severity": "medium", "tags": [ - "Elastic" + "Elastic", + "Endpoint" ], "type": "query", "version": 1 diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_exploit_detected.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_exploit_detected.json index 9c3896a70b3a0..9971075d7e617 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_exploit_detected.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_exploit_detected.json @@ -1,10 +1,12 @@ { - "description": "Elastic Endpoint Security Alert - Exploit detected.", + "description": "Elastic Endpoint detected an Exploit. Click the Elastic Endpoint icon in the event.module column or the link in the rule.reference column in the External Alerts tab of the SIEM Detections page for additional information.", + "from": "now-660s", "index": [ "endgame-*" ], + "interval": "10m", "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Exploit - Detected - Elastic Endpoint", "query": "event.kind:alert and event.module:endgame and event.action:exploit_event and endgame.metadata.type:detection", "risk_score": 73, diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_exploit_prevented.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_exploit_prevented.json index 4632ae6a1487b..233552fc1de13 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_exploit_prevented.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_exploit_prevented.json @@ -1,10 +1,12 @@ { - "description": "Elastic Endpoint Security Alert - Exploit prevented.", + "description": "Elastic Endpoint prevented an Exploit. Click the Elastic Endpoint icon in the event.module column or the link in the rule.reference column in the External Alerts tab of the SIEM Detections page for additional information.", + "from": "now-660s", "index": [ "endgame-*" ], + "interval": "10m", "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Exploit - Prevented - Elastic Endpoint", "query": "event.kind:alert and event.module:endgame and event.action:exploit_event and endgame.metadata.type:prevention", "risk_score": 47, diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_malware_detected.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_malware_detected.json index 68831392942d4..64d686fb984c9 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_malware_detected.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_malware_detected.json @@ -1,10 +1,12 @@ { - "description": "Elastic Endpoint Security Alert - Malware detected.", + "description": "Elastic Endpoint detected Malware. Click the Elastic Endpoint icon in the event.module column or the link in the rule.reference column in the External Alerts tab of the SIEM Detections page for additional information.", + "from": "now-660s", "index": [ "endgame-*" ], + "interval": "10m", "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Malware - Detected - Elastic Endpoint", "query": "event.kind:alert and event.module:endgame and event.action:file_classification_event and endgame.metadata.type:detection", "risk_score": 99, diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_malware_prevented.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_malware_prevented.json index 56b41df2a3349..72f2134f23ab2 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_malware_prevented.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_malware_prevented.json @@ -1,10 +1,12 @@ { - "description": "Elastic Endpoint Security Alert - Malware prevented.", + "description": "Elastic Endpoint prevented Malware. Click the Elastic Endpoint icon in the event.module column or the link in the rule.reference column in the External Alerts tab of the SIEM Detections page for additional information.", + "from": "now-660s", "index": [ "endgame-*" ], + "interval": "10m", "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Malware - Prevented - Elastic Endpoint", "query": "event.kind:alert and event.module:endgame and event.action:file_classification_event and endgame.metadata.type:prevention", "risk_score": 73, diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_permission_theft_detected.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_permission_theft_detected.json index 268dc9cf89121..3755dd4cd5dac 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_permission_theft_detected.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_permission_theft_detected.json @@ -1,10 +1,12 @@ { - "description": "Elastic Endpoint Security Alert - Permission theft detected.", + "description": "Elastic Endpoint detected Permission Theft. Click the Elastic Endpoint icon in the event.module column or the link in the rule.reference column in the External Alerts tab of the SIEM Detections page for additional information.", + "from": "now-660s", "index": [ "endgame-*" ], + "interval": "10m", "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Permission Theft - Detected - Elastic Endpoint", "query": "event.kind:alert and event.module:endgame and event.action:token_protection_event and endgame.metadata.type:detection", "risk_score": 73, diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_permission_theft_prevented.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_permission_theft_prevented.json index 6deda3d0453b2..d869407586372 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_permission_theft_prevented.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_permission_theft_prevented.json @@ -1,10 +1,12 @@ { - "description": "Elastic Endpoint Security Alert - Permission theft prevented.", + "description": "Elastic Endpoint prevented Permission Theft. Click the Elastic Endpoint icon in the event.module column or the link in the rule.reference column in the External Alerts tab of the SIEM Detections page for additional information.", + "from": "now-660s", "index": [ "endgame-*" ], + "interval": "10m", "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Permission Theft - Prevented - Elastic Endpoint", "query": "event.kind:alert and event.module:endgame and event.action:token_protection_event and endgame.metadata.type:prevention", "risk_score": 47, diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_process_injection_detected.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_process_injection_detected.json index 25a03e611fe3e..1078cf69394e2 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_process_injection_detected.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_process_injection_detected.json @@ -1,10 +1,12 @@ { - "description": "Elastic Endpoint Security Alert - Process injection detected.", + "description": "Elastic Endpoint detected Process Injection. Click the Elastic Endpoint icon in the event.module column or the link in the rule.reference column in the External Alerts tab of the SIEM Detections page for additional information.", + "from": "now-660s", "index": [ "endgame-*" ], + "interval": "10m", "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Process Injection - Detected - Elastic Endpoint", "query": "event.kind:alert and event.module:endgame and event.action:kernel_shellcode_event and endgame.metadata.type:detection", "risk_score": 73, diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_process_injection_prevented.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_process_injection_prevented.json index 6c549d70a9d41..8b68fc6925f9b 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_process_injection_prevented.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_process_injection_prevented.json @@ -1,10 +1,12 @@ { - "description": "Elastic Endpoint Security Alert - Process injection prevented.", + "description": "Elastic Endpoint prevented Process Injection. Click the Elastic Endpoint icon in the event.module column or the link in the rule.reference column in the External Alerts tab of the SIEM Detections page for additional information.", + "from": "now-660s", "index": [ "endgame-*" ], + "interval": "10m", "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Process Injection - Prevented - Elastic Endpoint", "query": "event.kind:alert and event.module:endgame and event.action:kernel_shellcode_event and endgame.metadata.type:prevention", "risk_score": 47, diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_ransomware_detected.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_ransomware_detected.json index 4a118cf8ab861..a332c7011e94b 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_ransomware_detected.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_ransomware_detected.json @@ -1,10 +1,12 @@ { - "description": "Elastic Endpoint Security Alert - Ransomware detected.", + "description": "Elastic Endpoint detected Ransomware. Click the Elastic Endpoint icon in the event.module column or the link in the rule.reference column in the External Alerts tab of the SIEM Detections page for additional information.", + "from": "now-660s", "index": [ "endgame-*" ], + "interval": "10m", "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Ransomware - Detected - Elastic Endpoint", "query": "event.kind:alert and event.module:endgame and event.action:ransomware_event and endgame.metadata.type:detection", "risk_score": 99, diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_ransomware_prevented.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_ransomware_prevented.json index 8b48e8f4c1758..087c91d2105ce 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_ransomware_prevented.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint_security_ransomware_prevented.json @@ -1,10 +1,12 @@ { - "description": "Elastic Endpoint Security Alert - Ransomware prevented.", + "description": "Elastic Endpoint prevented Ransomware. Click the Elastic Endpoint icon in the event.module column or the link in the rule.reference column in the External Alerts tab of the SIEM Detections page for additional information.", + "from": "now-660s", "index": [ "endgame-*" ], + "interval": "10m", "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Ransomware - Prevented - Elastic Endpoint", "query": "event.kind:alert and event.module:endgame and event.action:ransomware_event and endgame.metadata.type:prevention", "risk_score": 73, diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_adding_the_hidden_file_attribute_with_via_attribexe.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_adding_the_hidden_file_attribute_with_via_attribexe.json index 374691f670b74..43aead33925c1 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_adding_the_hidden_file_attribute_with_via_attribexe.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_adding_the_hidden_file_attribute_with_via_attribexe.json @@ -1,10 +1,10 @@ { - "description": "Adversaries can add the 'hidden' attribute to files to hide them from the user in an attempt to evade detection", + "description": "Adversaries can add the 'hidden' attribute to files to hide them from the user in an attempt to evade detection.", "index": [ "winlogbeat-*" ], "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Adding Hidden File Attribute via Attrib", "query": " event.action:\"Process Create (rule: ProcessCreate)\" and process.name:\"attrib.exe\" and process.args:\"+h\"", "risk_score": 21, diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_adobe_hijack_persistence.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_adobe_hijack_persistence.json index 47f171dd7be0e..387726168cb10 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_adobe_hijack_persistence.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_adobe_hijack_persistence.json @@ -4,7 +4,7 @@ "winlogbeat-*" ], "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Adobe Hijack Persistence", "query": "file.path:(\"C:\\Program Files (x86)\\Adobe\\Acrobat Reader DC\\Reader\\AcroCEF\\RdrCEF.exe\" or \"C:\\Program Files\\Adobe\\Acrobat Reader DC\\Reader\\AcroCEF\\RdrCEF.exe\") and event.action:\"File created (rule: FileCreate)\" and not process.name:msiexeec.exe", "risk_score": 21, diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_audio_capture_via_powershell.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_audio_capture_via_powershell.json deleted file mode 100644 index 7ec960eea6302..0000000000000 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_audio_capture_via_powershell.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "description": "An adversary can leverage a computer's peripheral devices or applications to capture audio recordings for the purpose of listening into sensitive conversations to gather information.", - "index": [ - "winlogbeat-*" - ], - "language": "kuery", - "max_signals": 33, - "name": "Audio Capture via PowerShell", - "query": "event.action:\"Process Create (rule: ProcessCreate)\" and process.name:\"powershell.exe\" and process.args:\"WindowsAudioDevice-Powershell-Cmdlet\"", - "risk_score": 21, - "rule_id": "b27b9f47-0a20-4807-8377-7f899b4fbada", - "severity": "low", - "tags": [ - "Elastic", - "Windows" - ], - "threat": [ - { - "framework": "MITRE ATT&CK", - "tactic": { - "id": "TA0003", - "name": "Collection", - "reference": "https://attack.mitre.org/tactics/TA0009/" - }, - "technique": [ - { - "id": "T1123", - "name": "Audio Capture", - "reference": "https://attack.mitre.org/techniques/T1123/" - } - ] - } - ], - "type": "query", - "version": 1 -} diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_audio_capture_via_soundrecorder.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_audio_capture_via_soundrecorder.json deleted file mode 100644 index 87bdfc4980124..0000000000000 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_audio_capture_via_soundrecorder.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "description": "An adversary can leverage a computer's peripheral devices or applications to capture audio recordings for the purpose of listening into sensitive conversations to gather information.", - "index": [ - "winlogbeat-*" - ], - "language": "kuery", - "max_signals": 33, - "name": "Audio Capture via SoundRecorder", - "query": "event.action:\"Process Create (rule: ProcessCreate)\" and process.name:\"SoundRecorder.exe\" and process.args:\"/FILE\"", - "risk_score": 21, - "rule_id": "f8e06892-ed10-4452-892e-2c5a38d552f1", - "severity": "low", - "tags": [ - "Elastic", - "Windows" - ], - "threat": [ - { - "framework": "MITRE ATT&CK", - "tactic": { - "id": "TA0003", - "name": "Collection", - "reference": "https://attack.mitre.org/tactics/TA0009/" - }, - "technique": [ - { - "id": "T1123", - "name": "Audio Capture", - "reference": "https://attack.mitre.org/techniques/T1123/" - } - ] - } - ], - "type": "query", - "version": 1 -} diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_bypass_uac_event_viewer.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_bypass_uac_event_viewer.json deleted file mode 100644 index 2fa63fa51f7c1..0000000000000 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_bypass_uac_event_viewer.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "description": "Identifies User Account Control (UAC) bypass via eventvwr.exe. Attackers bypass UAC to stealthily execute code with elevated permissions.", - "index": [ - "winlogbeat-*" - ], - "language": "kuery", - "max_signals": 33, - "name": "Bypass UAC via Event Viewer", - "query": "process.parent.name:eventvwr.exe and event.action:\"Process Create (rule: ProcessCreate)\" and not process.executable:(\"C:\\Windows\\System32\\mmc.exe\" or \"C:\\Windows\\SysWOW64\\mmc.exe\")", - "risk_score": 21, - "rule_id": "59547add-a400-4baa-aa0c-66c72efdb77f", - "severity": "low", - "tags": [ - "Elastic", - "Windows" - ], - "threat": [ - { - "framework": "MITRE ATT&CK", - "tactic": { - "id": "TA0004", - "name": "Privilege Escalation", - "reference": "https://attack.mitre.org/tactics/TA0004/" - }, - "technique": [ - { - "id": "T1088", - "name": "Bypass User Account Control", - "reference": "https://attack.mitre.org/techniques/T1088/" - } - ] - } - ], - "type": "query", - "version": 1 -} diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_bypass_uac_via_cmstp.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_bypass_uac_via_cmstp.json deleted file mode 100644 index fdc716dcb3ebe..0000000000000 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_bypass_uac_via_cmstp.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "description": "Identifies User Account Control (UAC) bypass via cmstp.exe. Attackers bypass UAC to stealthily execute code with elevated permissions.", - "index": [ - "winlogbeat-*" - ], - "language": "kuery", - "max_signals": 33, - "name": "Bypass UAC via Cmstp", - "query": "event.action:\"Process Create (rule: ProcessCreate)\" and process.parent.name:\"cmstp.exe\" and process.parent.args:(\"/s\" and \"/au\")", - "risk_score": 21, - "rule_id": "2f7403da-1a4c-46bb-8ecc-c1a596e10cd0", - "severity": "low", - "tags": [ - "Elastic", - "Windows" - ], - "threat": [ - { - "framework": "MITRE ATT&CK", - "tactic": { - "id": "TA0004", - "name": "Privilege Escalation", - "reference": "https://attack.mitre.org/tactics/TA0004/" - }, - "technique": [ - { - "id": "T1088", - "name": "Bypass User Account Control", - "reference": "https://attack.mitre.org/techniques/T1088/" - } - ] - } - ], - "type": "query", - "version": 1 -} diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_bypass_uac_via_sdclt.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_bypass_uac_via_sdclt.json deleted file mode 100644 index 484a01e0211ab..0000000000000 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_bypass_uac_via_sdclt.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "description": "Identifies User Account Control (UAC) bypass via sdclt.exe. Attackers bypass UAC to stealthily execute code with elevated permissions.", - "index": [ - "winlogbeat-*" - ], - "language": "kuery", - "max_signals": 33, - "name": "Bypass UAC via Sdclt", - "query": " event.action:\"Process Create (rule: ProcessCreate)\" and process.name:\"sdclt.exe\" and process.args:\"/kickoffelev\" and not process.executable:(\"C:\\Windows\\System32\\sdclt.exe\" or \"C:\\Windows\\System32\\control.exe\" or \"C:\\Windows\\SysWOW64\\sdclt.exe\" or \"C:\\Windows\\SysWOW64\\control.exe\")", - "risk_score": 21, - "rule_id": "f68d83a1-24cb-4b8d-825b-e8af400b9670", - "severity": "low", - "tags": [ - "Elastic", - "Windows" - ], - "threat": [ - { - "framework": "MITRE ATT&CK", - "tactic": { - "id": "TA0004", - "name": "Privilege Escalation", - "reference": "https://attack.mitre.org/tactics/TA0004/" - }, - "technique": [ - { - "id": "T1088", - "name": "Bypass User Account Control", - "reference": "https://attack.mitre.org/techniques/T1088/" - } - ] - } - ], - "type": "query", - "version": 1 -} diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_clearing_windows_event_logs.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_clearing_windows_event_logs.json index e9729ff102619..135e81148475f 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_clearing_windows_event_logs.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_clearing_windows_event_logs.json @@ -1,10 +1,10 @@ { - "description": "Identifies attempts to clear Windows event log stores. This is often done by attackers in an attempt evade detection or destroy forensic evidence on a system.", + "description": "Identifies attempts to clear Windows event log stores. This is often done by attackers in an attempt to evade detection or destroy forensic evidence on a system.", "index": [ "winlogbeat-*" ], "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Clearing Windows Event Logs", "query": "event.action:\"Process Create (rule: ProcessCreate)\" and (process.name:\"wevtutil.exe\" and process.args:\"cl\") or (process.name:\"powershell.exe\" and process.args:\"Clear-EventLog\")", "risk_score": 21, diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_delete_volume_usn_journal_with_fsutil.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_delete_volume_usn_journal_with_fsutil.json index 479bb4a2a6d7c..815e2abd0fc96 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_delete_volume_usn_journal_with_fsutil.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_delete_volume_usn_journal_with_fsutil.json @@ -4,7 +4,7 @@ "winlogbeat-*" ], "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Delete Volume USN Journal with Fsutil", "query": "event.action:\"Process Create (rule: ProcessCreate)\" and process.name:\"fsutil.exe\" and process.args:(\"usn\" and \"deletejournal\")", "risk_score": 21, diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_deleting_backup_catalogs_with_wbadmin.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_deleting_backup_catalogs_with_wbadmin.json index 204925e4b677b..d990e071b2123 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_deleting_backup_catalogs_with_wbadmin.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_deleting_backup_catalogs_with_wbadmin.json @@ -4,7 +4,7 @@ "winlogbeat-*" ], "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Deleting Backup Catalogs with Wbadmin", "query": "event.action:\"Process Create (rule: ProcessCreate)\" and process.name:\"wbadmin.exe\" and process.args:(\"delete\" and \"catalog\")", "risk_score": 21, diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_direct_outbound_smb_connection.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_direct_outbound_smb_connection.json index b6398a9985e7e..9d1cebb32c865 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_direct_outbound_smb_connection.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_direct_outbound_smb_connection.json @@ -4,7 +4,7 @@ "winlogbeat-*" ], "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Direct Outbound SMB Connection", "query": " event.action:\"Network connection detected (rule: NetworkConnect)\" and destination.port:445 and not process.pid:4 and not destination.ip:(\"127.0.0.1\" or \"::1\")", "risk_score": 47, diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_disable_windows_firewall_rules_with_netsh.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_disable_windows_firewall_rules_with_netsh.json index 32b43cc24e91b..7ead979f27bb1 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_disable_windows_firewall_rules_with_netsh.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_disable_windows_firewall_rules_with_netsh.json @@ -4,7 +4,7 @@ "winlogbeat-*" ], "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Disable Windows Firewall Rules via Netsh", "query": "event.action:\"Process Create (rule: ProcessCreate)\" and process.name:\"netsh.exe\" and process.args:(\"firewall\" and \"set\" and \"disable\") or process.args:(\"advfirewall\" and \"state\" and \"off\")", "risk_score": 47, diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_dll_search_order_hijack.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_dll_search_order_hijack.json deleted file mode 100644 index 5740453b6ae6d..0000000000000 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_dll_search_order_hijack.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "description": "Detects writing DLL files to known locations associated with Windows files vulnerable to DLL search order hijacking.", - "index": [ - "winlogbeat-*" - ], - "language": "kuery", - "max_signals": 33, - "name": "DLL Search Order Hijack", - "query": " event.action:\"File created (rule: FileCreate)\" and not winlog.user.identifier:(\"S-1-5-18\" or \"S-1-5-19\" or \"S-1-5-20\") and file.path:(\"C\\Windows\\ehome\\cryptbase.dll\" or \"C\\Windows\\System32\\Sysprep\\cryptbase.dll\" or \"C\\Windows\\System32\\Sysprep\\cryptsp.dll\" or \"C\\Windows\\System32\\Sysprep\\rpcrtremote.dll\" or \"C\\Windows\\System32\\Sysprep\\uxtheme.dll\" or \"C\\Windows\\System32\\Sysprep\\dwmapi.dll\" or \"C\\Windows\\System32\\Sysprep\\shcore.dll\" or \"C\\Windows\\System32\\Sysprep\\oleacc.dll\" or \"C\\Windows\\System32\\ntwdblib.dll\") ", - "risk_score": 47, - "rule_id": "73fbc44c-c3cd-48a8-a473-f4eb2065c716", - "severity": "medium", - "tags": [ - "Elastic", - "Windows" - ], - "threat": [ - { - "framework": "MITRE ATT&CK", - "tactic": { - "id": "TA0004", - "name": "Privilege Escalation", - "reference": "https://attack.mitre.org/tactics/TA0004/" - }, - "technique": [ - { - "id": "T1088", - "name": "Bypass User Account Control", - "reference": "https://attack.mitre.org/techniques/T1088/" - } - ] - }, - { - "framework": "MITRE ATT&CK", - "tactic": { - "id": "TA0005", - "name": "Defense Evasion", - "reference": "https://attack.mitre.org/tactics/TA0005/" - }, - "technique": [ - { - "id": "T1088", - "name": "Bypass User Account Control", - "reference": "https://attack.mitre.org/techniques/T1088/" - } - ] - } - ], - "type": "query", - "version": 1 -} diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_encoding_or_decoding_files_via_certutil.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_encoding_or_decoding_files_via_certutil.json index 37e1c26885a15..2cb92f0a26c90 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_encoding_or_decoding_files_via_certutil.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_encoding_or_decoding_files_via_certutil.json @@ -4,7 +4,7 @@ "winlogbeat-*" ], "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Encoding or Decoding Files via CertUtil", "query": "event.action:\"Process Create (rule: ProcessCreate)\" and process.name:\"certutil.exe\" and process.args:(\"-encode\" or \"/encode\" or \"-decode\" or \"/decode\")", "risk_score": 47, diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_local_scheduled_task_commands.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_local_scheduled_task_commands.json index dc4991f86a0f5..e7f46b46c2ce2 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_local_scheduled_task_commands.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_local_scheduled_task_commands.json @@ -7,7 +7,7 @@ "winlogbeat-*" ], "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Local Scheduled Task Commands", "query": " event.action:\"Process Create (rule: ProcessCreate)\" and process.name:schtasks.exe and process.args:(\"/create\" or \"-create\" or \"/S\" or \"-s\" or \"/run\" or \"-run\" or \"/change\" or \"-change\")", "risk_score": 21, diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_local_service_commands.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_local_service_commands.json index eb6f2377376f2..b018435ea0214 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_local_service_commands.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_local_service_commands.json @@ -4,7 +4,7 @@ "winlogbeat-*" ], "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Local Service Commands", "query": "event.action:\"Process Create (rule: ProcessCreate)\" and process.name:sc.exe and process.args:(\"create\" or \"config\" or \"failure\" or \"start\")", "risk_score": 21, diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_modification_of_boot_configuration.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_modification_of_boot_configuration.json deleted file mode 100644 index 26bd65b897c63..0000000000000 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_modification_of_boot_configuration.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "description": "Identifies use of bcdedit.exe to delete boot configuration data. This tactic is sometimes used as by malware or an attacker as a destructive technique.", - "index": [ - "winlogbeat-*" - ], - "language": "kuery", - "max_signals": 33, - "name": "Modification of Boot Configuration", - "query": "event.action:\"Process Create (rule: ProcessCreate)\" and process.name:\"bcdedit.exe\" and process.args:\"set\" and process.args:( (\"bootstatuspolicy\" and \"ignoreallfailures\") or (\"recoveryenabled\" and \"no\") ) ", - "risk_score": 73, - "rule_id": "b9ab2f7f-f719-4417-9599-e0252fffe2d8", - "severity": "high", - "tags": [ - "Elastic", - "Windows" - ], - "threat": [ - { - "framework": "MITRE ATT&CK", - "tactic": { - "id": "TA0005", - "name": "Defense Evasion", - "reference": "https://attack.mitre.org/tactics/TA0005/" - }, - "technique": [ - { - "id": "T1107", - "name": "File Deletion", - "reference": "https://attack.mitre.org/techniques/T1107/" - } - ] - } - ], - "type": "query", - "version": 1 -} diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_msbuild_making_network_connections.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_msbuild_making_network_connections.json index d40ffed523c6a..7d84e0bda06e5 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_msbuild_making_network_connections.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_msbuild_making_network_connections.json @@ -4,9 +4,9 @@ "winlogbeat-*" ], "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "MsBuild Making Network Connections", - "query": " event.action:\"Network connection detected (rule: NetworkConnect)\" and process.name:msbuild.exe and not destination.ip:(\"127.0.0.1\" or \"::1\")", + "query": " event.action:\"Network connection detected (rule: NetworkConnect)\" and process.name:MSBuild.exe and not destination.ip:(\"127.0.0.1\" or \"::1\")", "risk_score": 47, "rule_id": "0e79980b-4250-4a50-a509-69294c14e84b", "severity": "medium", diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_mshta_making_network_connections.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_mshta_making_network_connections.json index 7905d80c6e8c2..44141b08fb8f0 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_mshta_making_network_connections.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_mshta_making_network_connections.json @@ -4,9 +4,9 @@ "winlogbeat-*" ], "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Network Connection via Mshta", - "query": "event.action:\"Network connection detected (rule: NetworkConnect)\" and process.name:\"mshta.exe\" and not process.name:\"mshta.exe\"", + "query": "event.action:\"Network connection detected (rule: NetworkConnect)\" and process.name:\"mshta.exe\"", "references": [ "https://www.fireeye.com/blog/threat-research/2017/05/cyber-espionage-apt32.html" ], diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_msxsl_making_network_connections.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_msxsl_making_network_connections.json deleted file mode 100644 index 16ef15589f48f..0000000000000 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_msxsl_making_network_connections.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "description": "Identifies msxsl.exe making a network connection. This may indicate adversarial activity as msxsl.exe is often leveraged by adversaries to execute malicious scripts and evade detection.", - "index": [ - "winlogbeat-*" - ], - "language": "kuery", - "max_signals": 33, - "name": "Network Connection via MsXsl", - "query": "process.name:msxsl.exe and event.action:\"Network connection detected (rule: NetworkConnect)\" and not destination.ip:10.0.0.0/8 and not destination.ip:172.16.0.0/12 and not destination.ip:192.168.0.0/16", - "risk_score": 47, - "rule_id": "d7351b03-135d-43ba-8b36-cc9b07854525", - "severity": "medium", - "tags": [ - "Elastic", - "Windows" - ], - "threat": [ - { - "framework": "MITRE ATT&CK", - "tactic": { - "id": "TA0002", - "name": "Execution", - "reference": "https://attack.mitre.org/tactics/TA0002/" - }, - "technique": [ - { - "id": "T1220", - "name": "XSL Script Processing", - "reference": "https://attack.mitre.org/techniques/T1220/" - } - ] - } - ], - "type": "query", - "version": 1 -} diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_psexec_lateral_movement_command.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_psexec_lateral_movement_command.json index fd210005118b8..580f73c25a4a2 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_psexec_lateral_movement_command.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_psexec_lateral_movement_command.json @@ -7,9 +7,9 @@ "winlogbeat-*" ], "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "PsExec Network Connection", - "query": "process.name:psexec.exe and event.action:\"Network connection detected (rule: NetworkConnect)\" ", + "query": "process.name:PsExec.exe and event.action:\"Network connection detected (rule: NetworkConnect)\" ", "risk_score": 21, "rule_id": "55d551c6-333b-4665-ab7e-5d14a59715ce", "severity": "low", diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_suspicious_ms_office_child_process.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_suspicious_ms_office_child_process.json index a5d71e23a1215..95aabc49b5302 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_suspicious_ms_office_child_process.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_suspicious_ms_office_child_process.json @@ -4,7 +4,7 @@ "winlogbeat-*" ], "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Suspicious MS Office Child Process", "query": " event.action:\"Process Create (rule: ProcessCreate)\" and process.parent.name:(\"winword.exe\" or \"excel.exe\" or \"powerpnt.exe\" or \"eqnedt32.exe\" or \"fltldr.exe\" or \"mspub.exe\" or \"msaccess.exe\") and process.name:(\"arp.exe\" or \"dsquery.exe\" or \"dsget.exe\" or \"gpresult.exe\" or \"hostname.exe\" or \"ipconfig.exe\" or \"nbtstat.exe\" or \"net.exe\" or \"net1.exe\" or \"netsh.exe\" or \"netstat.exe\" or \"nltest.exe\" or \"ping.exe\" or \"qprocess.exe\" or \"quser.exe\" or \"qwinsta.exe\" or \"reg.exe\" or \"sc.exe\" or \"systeminfo.exe\" or \"tasklist.exe\" or \"tracert.exe\" or \"whoami.exe\" or \"bginfo.exe\" or \"cdb.exe\" or \"cmstp.exe\" or \"csi.exe\" or \"dnx.exe\" or \"fsi.exe\" or \"ieexec.exe\" or \"iexpress.exe\" or \"installutil.exe\" or \"Microsoft.Workflow.Compiler.exe\" or \"msbuild.exe\" or \"mshta.exe\" or \"msxsl.exe\" or \"odbcconf.exe\" or \"rcsi.exe\" or \"regsvr32.exe\" or \"xwizard.exe\" or \"atbroker.exe\" or \"forfiles.exe\" or \"schtasks.exe\" or \"regasm.exe\" or \"regsvcs.exe\" or \"cmd.exe\" or \"cscript.exe\" or \"powershell.exe\" or \"pwsh.exe\" or \"wmic.exe\" or \"wscript.exe\" or \"bitsadmin.exe\" or \"certutil.exe\" or \"ftp.exe\") ", "risk_score": 21, diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_suspicious_ms_outlook_child_process.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_suspicious_ms_outlook_child_process.json index 86716d6608049..f31228d0130f8 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_suspicious_ms_outlook_child_process.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_suspicious_ms_outlook_child_process.json @@ -4,7 +4,7 @@ "winlogbeat-*" ], "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Suspicious MS Outlook Child Process", "query": " event.action:\"Process Create (rule: ProcessCreate)\" and process.parent.name:\"outlook.exe\" and process.name:(\"arp.exe\" or \"dsquery.exe\" or \"dsget.exe\" or \"gpresult.exe\" or \"hostname.exe\" or \"ipconfig.exe\" or \"nbtstat.exe\" or \"net.exe\" or \"net1.exe\" or \"netsh.exe\" or \"netstat.exe\" or \"nltest.exe\" or \"ping.exe\" or \"qprocess.exe\" or \"quser.exe\" or \"qwinsta.exe\" or \"reg.exe\" or \"sc.exe\" or \"systeminfo.exe\" or \"tasklist.exe\" or \"tracert.exe\" or \"whoami.exe\" or \"bginfo.exe\" or \"cdb.exe\" or \"cmstp.exe\" or \"csi.exe\" or \"dnx.exe\" or \"fsi.exe\" or \"ieexec.exe\" or \"iexpress.exe\" or \"installutil.exe\" or \"Microsoft.Workflow.Compiler.exe\" or \"msbuild.exe\" or \"mshta.exe\" or \"msxsl.exe\" or \"odbcconf.exe\" or \"rcsi.exe\" or \"regsvr32.exe\" or \"xwizard.exe\" or \"atbroker.exe\" or \"forfiles.exe\" or \"schtasks.exe\" or \"regasm.exe\" or \"regsvcs.exe\" or \"cmd.exe\" or \"cscript.exe\" or \"powershell.exe\" or \"pwsh.exe\" or \"wmic.exe\" or \"wscript.exe\" or \"bitsadmin.exe\" or \"certutil.exe\" or \"ftp.exe\") ", "risk_score": 21, diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_suspicious_pdf_reader_child_process.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_suspicious_pdf_reader_child_process.json deleted file mode 100644 index b0fbccf1b67a7..0000000000000 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_suspicious_pdf_reader_child_process.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "description": "Identifies suspicious child processes of PDF reader applications. These child processes are often launched via exploitation of PDF applications or social engineering.", - "index": [ - "winlogbeat-*" - ], - "language": "kuery", - "max_signals": 33, - "name": "Suspicious PDF Reader Child Process", - "query": " event.action:\"Process Create (rule: ProcessCreate)\" and process.parent.name:(\"acrord32.exe\" or \"rdrcef.exe\" or \"foxitphantomPDF.exe\" or \"foxitreader.exe\") and process.name:(\"arp.exe\" or \"dsquery.exe\" or \"dsget.exe\" or \"gpresult.exe\" or \"hostname.exe\" or \"ipconfig.exe\" or \"nbtstat.exe\" or \"net.exe\" or \"net1.exe\" or \"netsh.exe\" or \"netstat.exe\" or \"nltest.exe\" or \"ping.exe\" or \"qprocess.exe\" or \"quser.exe\" or \"qwinsta.exe\" or \"reg.exe\" or \"sc.exe\" or \"systeminfo.exe\" or \"tasklist.exe\" or \"tracert.exe\" or \"whoami.exe\" or \"bginfo.exe\" or \"cdb.exe\" or \"cmstp.exe\" or \"csi.exe\" or \"dnx.exe\" or \"fsi.exe\" or \"ieexec.exe\" or \"iexpress.exe\" or \"installutil.exe\" or \"Microsoft.Workflow.Compiler.exe\" or \"msbuild.exe\" or \"mshta.exe\" or \"msxsl.exe\" or \"odbcconf.exe\" or \"rcsi.exe\" or \"regsvr32.exe\" or \"xwizard.exe\" or \"atbroker.exe\" or \"forfiles.exe\" or \"schtasks.exe\" or \"regasm.exe\" or \"regsvcs.exe\" or \"cmd.exe\" or \"cscript.exe\" or \"powershell.exe\" or \"pwsh.exe\" or \"wmic.exe\" or \"wscript.exe\" or \"bitsadmin.exe\" or \"certutil.exe\" or \"ftp.exe\") ", - "risk_score": 73, - "rule_id": "afcac7b1-d092-43ff-a136-aa7accbda38f", - "severity": "high", - "tags": [ - "Elastic", - "Windows" - ], - "threat": [ - { - "framework": "MITRE ATT&CK", - "tactic": { - "id": "TA0002", - "name": "Execution", - "reference": "https://attack.mitre.org/tactics/TA0002/" - }, - "technique": [ - { - "id": "T1193", - "name": "Spearphishing Attachment", - "reference": "https://attack.mitre.org/techniques/T1193/" - } - ] - } - ], - "type": "query", - "version": 1 -} diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_system_shells_via_services.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_system_shells_via_services.json index 984b522596c1e..a38232f37843e 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_system_shells_via_services.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_system_shells_via_services.json @@ -4,7 +4,7 @@ "winlogbeat-*" ], "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "System Shells via Services", "query": " event.action:\"Process Create (rule: ProcessCreate)\" and process.parent.name:\"services.exe\" and process.name:(\"cmd.exe\" or \"powershell.exe\")", "risk_score": 47, diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_unusual_network_connection_via_rundll32.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_unusual_network_connection_via_rundll32.json index 03b9bebb655c3..820c69cb3c809 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_unusual_network_connection_via_rundll32.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_unusual_network_connection_via_rundll32.json @@ -4,7 +4,7 @@ "winlogbeat-*" ], "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Unusual Network Connection via RunDLL32", "query": "process.name:rundll32.exe and event.action:\"Network connection detected (rule: NetworkConnect)\" and not destination.ip:10.0.0.0/8 and not destination.ip:172.16.0.0/12 and not destination.ip:192.168.0.0/16", "risk_score": 21, diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_unusual_parentchild_relationship.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_unusual_parentchild_relationship.json index 72eb17863e0d3..21d3d2741378a 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_unusual_parentchild_relationship.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_unusual_parentchild_relationship.json @@ -4,7 +4,7 @@ "winlogbeat-*" ], "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Unusual Parent-Child Relationship ", "query": " event.action:\"Process Create (rule: ProcessCreate)\" and process.parent.executable:* and ( (process.name:\"smss.exe\" and not process.parent.name:(\"System\" or \"smss.exe\")) or (process.name:\"csrss.exe\" and not process.parent.name:(\"smss.exe\" or \"svchost.exe\")) or (process.name:\"wininit.exe\" and not process.parent.name:\"smss.exe\") or (process.name:\"winlogon.exe\" and not process.parent.name:\"smss.exe\") or (process.name:\"lsass.exe\" and not process.parent.name:\"wininit.exe\") or (process.name:\"LogonUI.exe\" and not process.parent.name:(\"winlogon.exe\" or \"wininit.exe\")) or (process.name:\"services.exe\" and not process.parent.name:\"wininit.exe\") or (process.name:\"svchost.exe\" and not process.parent.name:(\"services.exe\" or \"MsMpEng.exe\")) or (process.name:\"spoolsv.exe\" and not process.parent.name:\"services.exe\") or (process.name:\"taskhost.exe\" and not process.parent.name:(\"services.exe\" or \"svchost.exe\")) or (process.name:\"taskhostw.exe\" and not process.parent.name:(\"services.exe\" or \"svchost.exe\")) or (process.name:\"userinit.exe\" and not process.parent.name:(\"dwm.exe\" or \"winlogon.exe\")) )", "risk_score": 47, diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_unusual_process_network_connection.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_unusual_process_network_connection.json index 8ca16198ff175..ee861e19341af 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_unusual_process_network_connection.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_unusual_process_network_connection.json @@ -4,7 +4,7 @@ "winlogbeat-*" ], "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Unusual Process Network Connection", "query": " event.action:\"Network connection detected (rule: NetworkConnect)\" and process.name:(bginfo.exe or cdb.exe or cmstp.exe or csi.exe or dnx.exe or fsi.exe or ieexec.exe or iexpress.exe or Microsoft.Workflow.Compiler.exe or odbcconf.exe or rcsi.exe or xwizard.exe)", "risk_score": 21, diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_user_account_creation.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_user_account_creation.json index dee3d18bd5eda..5a7aeab224548 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_user_account_creation.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_user_account_creation.json @@ -4,7 +4,7 @@ "winlogbeat-*" ], "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "User Account Creation", "query": " event.action:\"Process Create (rule: ProcessCreate)\" and process.name:(\"net.exe\" or \"net1.exe\") and not process.parent.name:\"net.exe\" and process.args:(\"user\" and (\"/add\" or \"/ad\")) ", "risk_score": 21, diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_user_added_to_administrator_group.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_user_added_to_administrator_group.json deleted file mode 100644 index 4ed6a06b18d3b..0000000000000 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_user_added_to_administrator_group.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "description": "Identifies attempts to add a user to an administrative group with the \"net.exe\" command. This is sometimes done by attackers to increase access of a compromised account or create new account.", - "index": [ - "winlogbeat-*" - ], - "language": "kuery", - "max_signals": 33, - "name": "User Added to Administrator Group", - "query": " event.action:\"Process Create (rule: ProcessCreate)\" and process.name:(\"net.exe\" or \"net1.exe\") and not process.parent.name:\"net.exe\" and process.args:(\"group\" and \"admin\" and \"/add\") ", - "risk_score": 47, - "rule_id": "4426de6f-6103-44aa-a77e-49d672836c27", - "severity": "medium", - "tags": [ - "Elastic", - "Windows" - ], - "threat": [ - { - "framework": "MITRE ATT&CK", - "tactic": { - "id": "TA0003", - "name": "Persistence", - "reference": "https://attack.mitre.org/tactics/TA0003/" - }, - "technique": [ - { - "id": "T1098", - "name": "Account Manipulation", - "reference": "https://attack.mitre.org/techniques/T1098/" - } - ] - } - ], - "type": "query", - "version": 1 -} diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_volume_shadow_copy_deletion_via_vssadmin.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_volume_shadow_copy_deletion_via_vssadmin.json index cdeeb1563dfde..80c0dd962c099 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_volume_shadow_copy_deletion_via_vssadmin.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_volume_shadow_copy_deletion_via_vssadmin.json @@ -4,7 +4,7 @@ "winlogbeat-*" ], "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Volume Shadow Copy Deletion via VssAdmin", "query": " event.action:\"Process Create (rule: ProcessCreate)\" and process.name:\"vssadmin.exe\" and process.args:(\"delete\" and \"shadows\") ", "risk_score": 73, diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_volume_shadow_copy_deletion_via_wmic.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_volume_shadow_copy_deletion_via_wmic.json index 9465cf84d73f4..d90aca1e2eaf4 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_volume_shadow_copy_deletion_via_wmic.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_volume_shadow_copy_deletion_via_wmic.json @@ -4,9 +4,9 @@ "winlogbeat-*" ], "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Volume Shadow Copy Deletion via WMIC", - "query": " event.action:\"Process Create (rule: ProcessCreate)\" and process.name:\"wmic.exe\" and process.args:(\"shadowcopy\" and \"delete\")", + "query": " event.action:\"Process Create (rule: ProcessCreate)\" and process.name:\"WMIC.exe\" and process.args:(\"shadowcopy\" and \"delete\")", "risk_score": 73, "rule_id": "dc9c1f74-dac3-48e3-b47f-eb79db358f57", "severity": "high", diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_windows_script_executing_powershell.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_windows_script_executing_powershell.json index f3df1276de53d..8f6e97cdd7bdb 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_windows_script_executing_powershell.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_windows_script_executing_powershell.json @@ -4,7 +4,7 @@ "winlogbeat-*" ], "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Windows Script Executing PowerShell", "query": "event.action:\"Process Create (rule: ProcessCreate)\" and process.parent.name:(\"wscript.exe\" or \"cscript.exe\") and process.name:\"powershell.exe\"", "risk_score": 21, diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_wmic_command_lateral_movement.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_wmic_command_lateral_movement.json deleted file mode 100644 index a50d9e64f2e2b..0000000000000 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/eql_wmic_command_lateral_movement.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "description": "Identifies use of wmic.exe to run commands on remote hosts. This could be indicative of adversary lateral movement but will be noisy if commonly done by admins.", - "false_positives": [ - "The WMIC utility provides a command-line interface for WMI, which can be used for an array of administrative capabilities. It's important to baseline your environment to determine any abnormal use of this tool." - ], - "index": [ - "winlogbeat-*" - ], - "language": "kuery", - "max_signals": 33, - "name": "WMIC Command Lateral Movement", - "query": " event.action:\"Process Create (rule: ProcessCreate)\" and process.name:\"wmic.exe\" and process.args:(\"/node\" or \"-node\") and process.args:(\"call\" or \"set\")", - "risk_score": 21, - "rule_id": "9616587f-6396-42d0-bd31-ef8dbd806210", - "severity": "low", - "tags": [ - "Elastic", - "Windows" - ], - "threat": [ - { - "framework": "MITRE ATT&CK", - "tactic": { - "id": "TA0008", - "name": "Lateral Movement", - "reference": "https://attack.mitre.org/tactics/TA0008/" - }, - "technique": [ - { - "id": "T1047", - "name": "Windows Management Instrumentation", - "reference": "https://attack.mitre.org/techniques/T1047/" - } - ] - } - ], - "type": "query", - "version": 1 -} diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/index.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/index.ts index b454501e9f563..d9841948f35a5 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/index.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/index.ts @@ -26,99 +26,79 @@ import rule16 from './elastic_endpoint_security_ransomware_detected.json'; import rule17 from './elastic_endpoint_security_ransomware_prevented.json'; import rule18 from './eql_adding_the_hidden_file_attribute_with_via_attribexe.json'; import rule19 from './eql_adobe_hijack_persistence.json'; -import rule20 from './eql_audio_capture_via_powershell.json'; -import rule21 from './eql_audio_capture_via_soundrecorder.json'; -import rule22 from './eql_bypass_uac_event_viewer.json'; -import rule23 from './eql_bypass_uac_via_cmstp.json'; -import rule24 from './eql_bypass_uac_via_sdclt.json'; -import rule25 from './eql_clearing_windows_event_logs.json'; -import rule26 from './eql_delete_volume_usn_journal_with_fsutil.json'; -import rule27 from './eql_deleting_backup_catalogs_with_wbadmin.json'; -import rule28 from './eql_direct_outbound_smb_connection.json'; -import rule29 from './eql_disable_windows_firewall_rules_with_netsh.json'; -import rule30 from './eql_dll_search_order_hijack.json'; -import rule31 from './eql_encoding_or_decoding_files_via_certutil.json'; -import rule32 from './eql_local_scheduled_task_commands.json'; -import rule33 from './eql_local_service_commands.json'; -import rule34 from './eql_modification_of_boot_configuration.json'; -import rule35 from './eql_msbuild_making_network_connections.json'; -import rule36 from './eql_mshta_making_network_connections.json'; -import rule37 from './eql_msxsl_making_network_connections.json'; -import rule38 from './eql_psexec_lateral_movement_command.json'; -import rule39 from './eql_suspicious_ms_office_child_process.json'; -import rule40 from './eql_suspicious_ms_outlook_child_process.json'; -import rule41 from './eql_suspicious_pdf_reader_child_process.json'; -import rule42 from './eql_system_shells_via_services.json'; -import rule43 from './eql_unusual_network_connection_via_rundll32.json'; -import rule44 from './eql_unusual_parentchild_relationship.json'; -import rule45 from './eql_unusual_process_network_connection.json'; -import rule46 from './eql_user_account_creation.json'; -import rule47 from './eql_user_added_to_administrator_group.json'; -import rule48 from './eql_volume_shadow_copy_deletion_via_vssadmin.json'; -import rule49 from './eql_volume_shadow_copy_deletion_via_wmic.json'; -import rule50 from './eql_windows_script_executing_powershell.json'; -import rule51 from './eql_wmic_command_lateral_movement.json'; -import rule52 from './linux_hping_activity.json'; -import rule53 from './linux_iodine_activity.json'; -import rule54 from './linux_kernel_module_activity.json'; -import rule55 from './linux_ldso_process_activity.json'; -import rule56 from './linux_mknod_activity.json'; -import rule57 from './linux_netcat_network_connection.json'; -import rule58 from './linux_nmap_activity.json'; -import rule59 from './linux_nping_activity.json'; -import rule60 from './linux_process_started_in_temp_directory.json'; -import rule61 from './linux_shell_activity_by_web_server.json'; -import rule62 from './linux_socat_activity.json'; -import rule63 from './linux_strace_activity.json'; -import rule64 from './linux_tcpdump_activity.json'; -import rule65 from './linux_whoami_commmand.json'; -import rule66 from './network_dns_directly_to_the_internet.json'; -import rule67 from './network_ftp_file_transfer_protocol_activity_to_the_internet.json'; -import rule68 from './network_irc_internet_relay_chat_protocol_activity_to_the_internet.json'; -import rule69 from './network_nat_traversal_port_activity.json'; -import rule70 from './network_port_26_activity.json'; -import rule71 from './network_port_8000_activity_to_the_internet.json'; -import rule72 from './network_pptp_point_to_point_tunneling_protocol_activity.json'; -import rule73 from './network_proxy_port_activity_to_the_internet.json'; -import rule74 from './network_rdp_remote_desktop_protocol_from_the_internet.json'; -import rule75 from './network_rdp_remote_desktop_protocol_to_the_internet.json'; -import rule76 from './network_rpc_remote_procedure_call_from_the_internet.json'; -import rule77 from './network_rpc_remote_procedure_call_to_the_internet.json'; -import rule78 from './network_smb_windows_file_sharing_activity_to_the_internet.json'; -import rule79 from './network_smtp_to_the_internet.json'; -import rule80 from './network_sql_server_port_activity_to_the_internet.json'; -import rule81 from './network_ssh_secure_shell_from_the_internet.json'; -import rule82 from './network_ssh_secure_shell_to_the_internet.json'; -import rule83 from './network_telnet_port_activity.json'; -import rule84 from './network_tor_activity_to_the_internet.json'; -import rule85 from './network_vnc_virtual_network_computing_from_the_internet.json'; -import rule86 from './network_vnc_virtual_network_computing_to_the_internet.json'; -import rule87 from './null_user_agent.json'; -import rule88 from './sqlmap_user_agent.json'; -import rule89 from './windows_background_intelligent_transfer_service_bits_connecting_to_the_internet.json'; -import rule90 from './windows_certutil_connecting_to_the_internet.json'; -import rule91 from './windows_command_prompt_connecting_to_the_internet.json'; -import rule92 from './windows_command_shell_started_by_internet_explorer.json'; -import rule93 from './windows_command_shell_started_by_powershell.json'; -import rule94 from './windows_command_shell_started_by_svchost.json'; -import rule95 from './windows_defense_evasion_via_filter_manager.json'; -import rule96 from './windows_execution_via_compiled_html_file.json'; -import rule97 from './windows_execution_via_connection_manager.json'; -import rule98 from './windows_execution_via_net_com_assemblies.json'; -import rule99 from './windows_execution_via_regsvr32.json'; -import rule100 from './windows_execution_via_trusted_developer_utilities.json'; -import rule101 from './windows_html_help_executable_program_connecting_to_the_internet.json'; -import rule102 from './windows_misc_lolbin_connecting_to_the_internet.json'; -import rule103 from './windows_net_command_activity_by_the_system_account.json'; -import rule104 from './windows_persistence_via_application_shimming.json'; -import rule105 from './windows_priv_escalation_via_accessibility_features.json'; -import rule106 from './windows_process_discovery_via_tasklist_command.json'; -import rule107 from './windows_process_execution_via_wmi.json'; -import rule108 from './windows_register_server_program_connecting_to_the_internet.json'; -import rule109 from './windows_signed_binary_proxy_execution.json'; -import rule110 from './windows_signed_binary_proxy_execution_download.json'; -import rule111 from './windows_suspicious_process_started_by_a_script.json'; -import rule112 from './windows_whoami_command_activity.json'; +import rule20 from './eql_clearing_windows_event_logs.json'; +import rule21 from './eql_delete_volume_usn_journal_with_fsutil.json'; +import rule22 from './eql_deleting_backup_catalogs_with_wbadmin.json'; +import rule23 from './eql_direct_outbound_smb_connection.json'; +import rule24 from './eql_disable_windows_firewall_rules_with_netsh.json'; +import rule25 from './eql_encoding_or_decoding_files_via_certutil.json'; +import rule26 from './eql_local_scheduled_task_commands.json'; +import rule27 from './eql_local_service_commands.json'; +import rule28 from './eql_msbuild_making_network_connections.json'; +import rule29 from './eql_mshta_making_network_connections.json'; +import rule30 from './eql_psexec_lateral_movement_command.json'; +import rule31 from './eql_suspicious_ms_office_child_process.json'; +import rule32 from './eql_suspicious_ms_outlook_child_process.json'; +import rule33 from './eql_system_shells_via_services.json'; +import rule34 from './eql_unusual_network_connection_via_rundll32.json'; +import rule35 from './eql_unusual_parentchild_relationship.json'; +import rule36 from './eql_unusual_process_network_connection.json'; +import rule37 from './eql_user_account_creation.json'; +import rule38 from './eql_volume_shadow_copy_deletion_via_vssadmin.json'; +import rule39 from './eql_volume_shadow_copy_deletion_via_wmic.json'; +import rule40 from './eql_windows_script_executing_powershell.json'; +import rule41 from './linux_hping_activity.json'; +import rule42 from './linux_iodine_activity.json'; +import rule43 from './linux_kernel_module_activity.json'; +import rule44 from './linux_mknod_activity.json'; +import rule45 from './linux_netcat_network_connection.json'; +import rule46 from './linux_nmap_activity.json'; +import rule47 from './linux_nping_activity.json'; +import rule48 from './linux_process_started_in_temp_directory.json'; +import rule49 from './linux_shell_activity_by_web_server.json'; +import rule50 from './linux_socat_activity.json'; +import rule51 from './linux_strace_activity.json'; +import rule52 from './linux_tcpdump_activity.json'; +import rule53 from './linux_whoami_commmand.json'; +import rule54 from './network_dns_directly_to_the_internet.json'; +import rule55 from './network_ftp_file_transfer_protocol_activity_to_the_internet.json'; +import rule56 from './network_irc_internet_relay_chat_protocol_activity_to_the_internet.json'; +import rule57 from './network_nat_traversal_port_activity.json'; +import rule58 from './network_port_26_activity.json'; +import rule59 from './network_port_8000_activity_to_the_internet.json'; +import rule60 from './network_pptp_point_to_point_tunneling_protocol_activity.json'; +import rule61 from './network_proxy_port_activity_to_the_internet.json'; +import rule62 from './network_rdp_remote_desktop_protocol_from_the_internet.json'; +import rule63 from './network_rdp_remote_desktop_protocol_to_the_internet.json'; +import rule64 from './network_rpc_remote_procedure_call_from_the_internet.json'; +import rule65 from './network_rpc_remote_procedure_call_to_the_internet.json'; +import rule66 from './network_smb_windows_file_sharing_activity_to_the_internet.json'; +import rule67 from './network_smtp_to_the_internet.json'; +import rule68 from './network_sql_server_port_activity_to_the_internet.json'; +import rule69 from './network_ssh_secure_shell_from_the_internet.json'; +import rule70 from './network_ssh_secure_shell_to_the_internet.json'; +import rule71 from './network_telnet_port_activity.json'; +import rule72 from './network_tor_activity_to_the_internet.json'; +import rule73 from './network_vnc_virtual_network_computing_from_the_internet.json'; +import rule74 from './network_vnc_virtual_network_computing_to_the_internet.json'; +import rule75 from './null_user_agent.json'; +import rule76 from './sqlmap_user_agent.json'; +import rule77 from './windows_command_prompt_connecting_to_the_internet.json'; +import rule78 from './windows_command_shell_started_by_powershell.json'; +import rule79 from './windows_command_shell_started_by_svchost.json'; +import rule80 from './windows_defense_evasion_via_filter_manager.json'; +import rule81 from './windows_execution_via_compiled_html_file.json'; +import rule82 from './windows_execution_via_regsvr32.json'; +import rule83 from './windows_execution_via_trusted_developer_utilities.json'; +import rule84 from './windows_html_help_executable_program_connecting_to_the_internet.json'; +import rule85 from './windows_misc_lolbin_connecting_to_the_internet.json'; +import rule86 from './windows_persistence_via_application_shimming.json'; +import rule87 from './windows_priv_escalation_via_accessibility_features.json'; +import rule88 from './windows_process_discovery_via_tasklist_command.json'; +import rule89 from './windows_register_server_program_connecting_to_the_internet.json'; +import rule90 from './windows_signed_binary_proxy_execution.json'; +import rule91 from './windows_suspicious_process_started_by_a_script.json'; +import rule92 from './windows_whoami_command_activity.json'; export const rawRules = [ rule1, rule2, @@ -212,24 +192,4 @@ export const rawRules = [ rule90, rule91, rule92, - rule93, - rule94, - rule95, - rule96, - rule97, - rule98, - rule99, - rule100, - rule101, - rule102, - rule103, - rule104, - rule105, - rule106, - rule107, - rule108, - rule109, - rule110, - rule111, - rule112, ]; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_hping_activity.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_hping_activity.json index 517e16fb3d284..c4b14389c0f75 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_hping_activity.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_hping_activity.json @@ -1,5 +1,5 @@ { - "description": "Hping ran on a Linux host. Hping is FOSS command-line packet analyzer and has the ability to construct network packets for a wide variety of network security testing applications including scanning and firewall auditing.", + "description": "Hping ran on a Linux host. Hping is a FOSS command-line packet analyzer and has the ability to construct network packets for a wide variety of network security testing applications, including scanning and firewall auditing.", "false_positives": [ "Normal use of hping is uncommon apart from security testing and research. Use by non-security engineers is very uncommon." ], @@ -7,9 +7,9 @@ "auditbeat-*" ], "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Hping Process Activity", - "query": "process.name: hping and event.action:executed", + "query": "process.name: (hping3 or hping2 or hping) and event.action:executed", "references": [ "https://en.wikipedia.org/wiki/Hping" ], diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_iodine_activity.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_iodine_activity.json index 49f18ef9871a1..b8455a4d2b21d 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_iodine_activity.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_iodine_activity.json @@ -1,5 +1,5 @@ { - "description": "Iodine is a tool for tunneling Internet protocol version 4 (IPV4) traffic over the DNS protocol in order to circumvent firewalls, network security groups or network access lists while evading detection.", + "description": "Iodine is a tool for tunneling Internet protocol version 4 (IPV4) traffic over the DNS protocol to circumvent firewalls, network security groups, and network access lists while evading detection.", "false_positives": [ "Normal use of Iodine is uncommon apart from security testing and research. Use by non-security engineers is very uncommon." ], @@ -7,7 +7,7 @@ "auditbeat-*" ], "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Potential DNS Tunneling via Iodine", "query": "process.name: (iodine or iodined) and event.action:executed", "references": [ diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_kernel_module_activity.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_kernel_module_activity.json index 8c94694ca4d04..f1d12de674488 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_kernel_module_activity.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_kernel_module_activity.json @@ -1,5 +1,5 @@ { - "description": "Identifies loadable kernel module errors, often indicative of potential persistence attempts.", + "description": "Identifies loadable kernel module errors, which are often indicative of potential persistence attempts.", "false_positives": [ "Security tools and device drivers may run these programs in order to load legitimate kernel modules. Use of these programs by ordinary users is uncommon." ], @@ -7,7 +7,7 @@ "auditbeat-*" ], "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Persistence via Kernel Module Modification", "query": "process.name: (insmod or kmod or modprobe or rmod) and event.action:executed", "references": [ diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_ldso_process_activity.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_ldso_process_activity.json deleted file mode 100644 index 82a2a16080160..0000000000000 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_ldso_process_activity.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "description": "The dynamic linker, ld.so, runs in a privileged context and can be used to escape restrictive environments by spawning a shell in order to elevate privileges or move laterally.", - "false_positives": [ - "ld.so is a dual-use tool that can be used for benign or malicious activity. Some normal use of this command may originate from developers or administrators. Use of ld.so by non-engineers or ordinary users is uncommon." - ], - "index": [ - "auditbeat-*" - ], - "language": "kuery", - "max_signals": 33, - "name": "Ld.so Process Activity", - "query": "process.name:ld.so and event.action:executed", - "risk_score": 21, - "rule_id": "3f31a31c-f7cf-4268-a0df-ec1a98099e7f", - "severity": "low", - "tags": [ - "Elastic", - "Linux" - ], - "type": "query", - "version": 1 -} diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_mknod_activity.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_mknod_activity.json index 8f4e1f40fad12..b0d4c29dc00d3 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_mknod_activity.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_mknod_activity.json @@ -1,13 +1,13 @@ { - "description": "The Linux mknod program is sometimes used in the command payload of remote command injection (RCI) and other exploits to export a command shell when the traditional version of netcat is not available to the payload.", + "description": "The Linux mknod program is sometimes used in the command payload of a remote command injection (RCI) and other exploits. It is used to export a command shell when the traditional version of netcat is not available to the payload.", "false_positives": [ - "Mknod is a Linux system program. Some normal use of this program, at varying levels of frequency, may originate from scripts, automation tools and frameworks. Usage by web servers is more likely to be suspicious." + "Mknod is a Linux system program. Some normal use of this program, at varying levels of frequency, may originate from scripts, automation tools, and frameworks. Usage by web servers is more likely to be suspicious." ], "index": [ "auditbeat-*" ], "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Mknod Process Activity", "query": "process.name: mknod and event.action:executed", "references": [ diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_netcat_network_connection.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_netcat_network_connection.json index b06a342d24977..6ab1c1285c0d7 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_netcat_network_connection.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_netcat_network_connection.json @@ -1,13 +1,13 @@ { - "description": "A netcat process is engaging in network activity on a Linux host. Netcat is often used as a persistence mechanism by exporting a reverse shell or by serving a shell on a listening port. Netcat is also sometimes used for data exfiltration. ", + "description": "A netcat process is engaging in network activity on a Linux host. Netcat is often used as a persistence mechanism by exporting a reverse shell or by serving a shell on a listening port. Netcat is also sometimes used for data exfiltration.", "false_positives": [ - "Netcat is a dual-use tool that can be used for benign or malicious activity. Netcat is included in some Linux distributions so its presence is not necessarily suspicious. Some normal use of this program, while uncommon, may originate from scripts, automation tools and frameworks." + "Netcat is a dual-use tool that can be used for benign or malicious activity. Netcat is included in some Linux distributions so its presence is not necessarily suspicious. Some normal use of this program, while uncommon, may originate from scripts, automation tools, and frameworks." ], "index": [ "auditbeat-*" ], "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Netcat Network Activity", "query": "process.name: (nc or ncat or netcat or netcat.openbsd or netcat.traditional) and event.action: (connected-to or bound-socket or socket_opened)", "references": [ diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_nmap_activity.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_nmap_activity.json index 406cd8e026e7a..5d7169219a6f1 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_nmap_activity.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_nmap_activity.json @@ -1,13 +1,13 @@ { - "description": "Nmap was executed on a Linux host. Nmap is a FOSS tool for network scanning and security testing. It can map and discover networks, identify listening services and operating systems. It is sometimes used to gather information in support of exploitation, execution or lateral movement.", + "description": "Nmap was executed on a Linux host. Nmap is a FOSS tool for network scanning and security testing. It can map and discover networks, and identify listening services and operating systems. It is sometimes used to gather information in support of exploitation, execution or lateral movement.", "false_positives": [ - "Security testing tools and frameworks may run nmap in the course of security auditing. Some normal use of this command may originate from security engineers and network or server administrators. Use of nmap by ordinary users is uncommon." + "Security testing tools and frameworks may run `Nmap` in the course of security auditing. Some normal use of this command may originate from security engineers and network or server administrators. Use of nmap by ordinary users is uncommon." ], "index": [ "auditbeat-*" ], "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Nmap Process Activity", "query": "process.name: nmap", "references": [ diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_nping_activity.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_nping_activity.json index de53e05e70fa3..6a713d22e3219 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_nping_activity.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_nping_activity.json @@ -1,13 +1,13 @@ { - "description": "Nping ran on a Linux host. Nping is part of the Nmap tool suite and has the ability to construct raw packets for a wide variety of security testing applications including denial of service testing.", + "description": "Nping ran on a Linux host. Nping is part of the Nmap tool suite and has the ability to construct raw packets for a wide variety of security testing applications, including denial of service testing.", "false_positives": [ - "Some normal use of this command may originate from security engineers and network or server administrators but this is usually not routine or unannounced. Use of nping by non-engineers or ordinary users is uncommon." + "Some normal use of this command may originate from security engineers and network or server administrators, but this is usually not routine or unannounced. Use of `Nping` by non-engineers or ordinary users is uncommon." ], "index": [ "auditbeat-*" ], "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Nping Process Activity", "query": "process.name: nping and event.action:executed", "references": [ diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_process_started_in_temp_directory.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_process_started_in_temp_directory.json index 4ed021a4c864d..c80bb4eb41615 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_process_started_in_temp_directory.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_process_started_in_temp_directory.json @@ -1,13 +1,13 @@ { "description": "Identifies processes running in a temporary folder. This is sometimes done by adversaries to hide malware.", "false_positives": [ - "Build systems like Jenkins may start processes in the /tmp directory. These can be exempted by name or by username." + "Build systems, like Jenkins, may start processes in the `/tmp` directory. These can be exempted by name or by username." ], "index": [ "auditbeat-*" ], "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Unusual Process Execution - Temp", "query": "process.working_directory: /tmp and event.action:executed", "risk_score": 47, diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_shell_activity_by_web_server.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_shell_activity_by_web_server.json index ac817762fdb71..eff3dd0ab1400 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_shell_activity_by_web_server.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_shell_activity_by_web_server.json @@ -7,9 +7,9 @@ "auditbeat-*" ], "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Potential Shell via Web Server", - "query": "process.name: bash and (user.name: apache or www) and event.action:executed", + "query": "process.name: bash and user.name: (apache or www or \"wwww-data\") and event.action:executed", "references": [ "https://pentestlab.blog/tag/web-shell/" ], diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_socat_activity.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_socat_activity.json index 481a99518d4ed..56fb41dc5f78f 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_socat_activity.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_socat_activity.json @@ -1,13 +1,13 @@ { - "description": "A Socat process is running on a Linux host. Socat is often used as a persistence mechanism by exporting a reverse shell or by serving a shell on a listening port. Socat is also sometimes used for lateral movement. ", + "description": "A Socat process is running on a Linux host. Socat is often used as a persistence mechanism by exporting a reverse shell, or by serving a shell on a listening port. Socat is also sometimes used for lateral movement.", "false_positives": [ - "Socat is a dual-use tool that can be used for benign or malicious activity. Some normal use of this program, at varying levels of frequency, may originate from scripts, automation tools and frameworks. Usage by web servers is more likely to be suspicious." + "Socat is a dual-use tool that can be used for benign or malicious activity. Some normal use of this program, at varying levels of frequency, may originate from scripts, automation tools, and frameworks. Usage by web servers is more likely to be suspicious." ], "index": [ "auditbeat-*" ], "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Socat Process Activity", "query": "process.name:socat and not process.args:\"-V\" and event.action:executed", "references": [ diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_strace_activity.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_strace_activity.json index f5488ae49d0fb..fdf52e7c728c6 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_strace_activity.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_strace_activity.json @@ -7,7 +7,7 @@ "auditbeat-*" ], "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Strace Process Activity", "query": "process.name: strace and event.action:executed", "references": [ diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_tcpdump_activity.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_tcpdump_activity.json index b6dc7f1689770..908e892026ee3 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_tcpdump_activity.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_tcpdump_activity.json @@ -1,5 +1,5 @@ { - "description": "The Tcpdump program ran on a Linux host. Tcpdump is a network monitoring or packet 'sniffing' tool that can be used to capture insecure credentials or data in motion. Sniffing can also be used to discover details of network services as a prelude to lateral movement or defense evasion.", + "description": "The Tcpdump program ran on a Linux host. Tcpdump is a network monitoring or packet sniffing tool that can be used to capture insecure credentials or data in motion. Sniffing can also be used to discover details of network services as a prelude to lateral movement or defense evasion.", "false_positives": [ "Some normal use of this command may originate from server or network administrators engaged in network troubleshooting." ], @@ -7,7 +7,7 @@ "auditbeat-*" ], "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Network Sniffing via Tcpdump", "query": "process.name: tcpdump and event.action:executed", "risk_score": 21, diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_whoami_commmand.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_whoami_commmand.json index 91c6d2bcc9f95..052ff34d15dcd 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_whoami_commmand.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_whoami_commmand.json @@ -1,5 +1,5 @@ { - "description": "The whoami application was executed on a Linux host. This is often used by tools and persistence mechanisms to test for privileged access.", + "description": "The whoami application was executed on a Linux host. This is often used by tools and persistence mechanisms to test for privileged access.", "false_positives": [ "Security testing tools and frameworks may run this command. Some normal use of this command may originate from automation tools and frameworks." ], @@ -7,7 +7,7 @@ "auditbeat-*" ], "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "User Discovery via Whoami", "query": "process.name: whoami and event.action:executed", "risk_score": 21, diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_dns_directly_to_the_internet.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_dns_directly_to_the_internet.json index 3d1b07a267eca..72e2ca1490417 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_dns_directly_to_the_internet.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_dns_directly_to_the_internet.json @@ -1,16 +1,16 @@ { - "description": "This signal detects internal network client sending DNS traffic directly to the Internet.\nThis is atypical behavior for a managed network and can be indicative of malware,\nexfiltration, command and control or simply misconfiguration. This also impacts your\norganization's ability to provide enterprise monitoring and logging of DNS and opens\nyour network to a variety of abuses or malicious communications.\n", + "description": "This rule detects when an internal network client sends DNS traffic directly to the Internet.\nThis is atypical behavior for a managed network, and can be indicative of malware,\nexfiltration, command and control, or, simply, misconfiguration. This DNS activity also impacts your\norganization's ability to provide enterprise monitoring and logging of DNS, and opens\nyour network to a variety of abuses and malicious communications.\n", "false_positives": [ - "DNS servers should be excluded from this rule as this is expected behavior for them. Endpoints usually query local DNS servers defined in their DHCP scopes but this may be overridden if a user configures their endpoint to use a remote DNS server. This is uncommon in managed enterprise networks because it would tend to break intra-net name resolution when split horizon DNS is utilized. Some consumer VPN services and browser plug-ins may send DNS traffic to remote Internet destinations; in that case, such devices or networks can be excluded from this rule if this is expected behavior." + "Exclude DNS servers from this rule as this is expected behavior. Endpoints usually query local DNS servers defined in their DHCP scopes, but this may be overridden if a user configures their endpoint to use a remote DNS server. This is uncommon in managed enterprise networks because it could break intranet name resolution when split horizon DNS is utilized. Some consumer VPN services and browser plug-ins may send DNS traffic to remote Internet destinations. In that case, such devices or networks can be excluded from this rule when this is expected behavior." ], "index": [ "auditbeat-*", - "endgame-*", "filebeat-*", "packetbeat-*", "winlogbeat-*" ], "language": "kuery", + "max_signals": 100, "name": "DNS Activity to the Internet", "query": "destination.port:53 and (\n network.direction: outbound or (\n source.ip:(10.0.0.0/8 or 172.16.0.0/12 or 192.168.0.0/16) and\n not destination.ip:( 169.254.169.254/32 or 127.0.0.53/32 or 10.0.0.0/8 or 172.16.0.0/12 or 192.168.0.0/16 or 224.0.0.251 or ff02\\:\\:fb or 255.255.255.255 )\n )\n)\n", "references": [ @@ -22,7 +22,7 @@ "severity": "medium", "tags": [ "Elastic", - "network" + "Network" ], "threat": [ { diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_ftp_file_transfer_protocol_activity_to_the_internet.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_ftp_file_transfer_protocol_activity_to_the_internet.json index ef7b39412c808..54daf8a2091a7 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_ftp_file_transfer_protocol_activity_to_the_internet.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_ftp_file_transfer_protocol_activity_to_the_internet.json @@ -1,16 +1,16 @@ { - "description": "This signal detects events that may indicate the use of FTP network connections to the Internet.\nThe File Transfer Protocol (FTP) has been around in its current form since the\n1980's. It can be an efficient and normal procedure on your network to send and\nreceive files. Because it is common and efficient, adversaries will also often\nuse this protocol to ex-filtrate data from your network or download new tools.\nAdditionally, FTP is a plain-text protocol which may expose your user name and\npassword, if intercepted. FTP activity involving servers subject to regulations or compliance standards may be unauthorized.\n", + "description": "This rule detects events that may indicate the use of FTP network connections to the Internet.\nThe File Transfer Protocol (FTP) has been around in its current form since the\n1980s. It can be a common and efficient procedure on your network to send and\nreceive files. Because of this, adversaries will also often use this protocol\nto exfiltrate data from your network or download new tools. Additionally, FTP\nis a plain-text protocol which, if intercepted, may expose usernames and\npasswords. FTP activity involving servers subject to regulations or compliance\nstandards may be unauthorized.\n", "false_positives": [ - "FTP servers should be excluded from this rule as this is expected behavior for them. Some business work-flows may use FTP for data exchange. These work-flows often have expected characteristics such as users, sources and destinations. FTP activity involving an unusual source or destination may be more suspicious. FTP activity involving a production server that has no known associated FTP work-flow or business requirement is often suspicious. NEW NEW" + "FTP servers should be excluded from this rule as this is expected behavior. Some business workflows may use FTP for data exchange. These workflows often have expected characteristics such as users, sources, and destinations. FTP activity involving an unusual source or destination may be more suspicious. FTP activity involving a production server that has no known associated FTP workflow or business requirement is often suspicious." ], "index": [ "auditbeat-*", - "endgame-*", "filebeat-*", "packetbeat-*", "winlogbeat-*" ], "language": "kuery", + "max_signals": 100, "name": "FTP (File Transfer Protocol) Activity to the Internet", "query": "network.transport: tcp and destination.port: (20 or 21) and (\n network.direction: outbound or (\n source.ip: (10.0.0.0/8 or 172.16.0.0/12 or 192.168.0.0/16) and\n not destination.ip: (10.0.0.0/8 or 172.16.0.0/12 or 192.168.0.0/16)\n )\n)\n", "risk_score": 21, @@ -18,7 +18,7 @@ "severity": "low", "tags": [ "Elastic", - "network" + "Network" ], "threat": [ { diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_irc_internet_relay_chat_protocol_activity_to_the_internet.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_irc_internet_relay_chat_protocol_activity_to_the_internet.json index 2700eae977482..d01006a225886 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_irc_internet_relay_chat_protocol_activity_to_the_internet.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_irc_internet_relay_chat_protocol_activity_to_the_internet.json @@ -1,16 +1,16 @@ { - "description": "This signal detects events that use common ports for IRC to the Internet. IRC (Internet Relay Chat)\nis a common protocol that can be used chat and file transfer. This protocol\nalso makes a good candidate for remote control of malware and data transfer in\nand out of a network.\n", + "description": "This rule detects events that use common ports for Internet Relay Chat (IRC) to the Internet.\nIRC is a common protocol that can be used for chat and file transfers. This\nprotocol is also a good candidate for remote control of malware and data\ntransfers to and from a network.\n", "false_positives": [ - "IRC activity may be normal behavior for developers and engineers but is unusual for non-engineering end users. IRC activity involving an unusual source or destination may be more suspicious. IRC activity involving a production server is often suspicious. Because these ports are in the ephemeral range, this rule may false under certain conditions such as when a NATted web server replies to a client which has used a port in the range by coincidence. In this case, such servers can be excluded if desired. Some legacy applications may use these ports but this is very uncommon and usually appears only in local traffic using private IPs which this rule does not match." + "IRC activity may be normal behavior for developers and engineers but is unusual for non-engineering end users. IRC activity involving an unusual source or destination may be more suspicious. IRC activity involving a production server is often suspicious. Because these ports are in the ephemeral range, this rule may false under certain conditions, such as when a NAT-ed web server replies to a client which has used a port in the range by coincidence. In this case, these servers can be excluded. Some legacy applications may use these ports, but this is very uncommon and usually only appears in local traffic using private IPs, which does not match this rule's conditions." ], "index": [ "auditbeat-*", - "endgame-*", "filebeat-*", "packetbeat-*", "winlogbeat-*" ], "language": "kuery", + "max_signals": 100, "name": "IRC (Internet Relay Chat) Protocol Activity to the Internet", "query": "network.transport: tcp and destination.port:(6667 or 6697) and (\n network.direction: outbound or (\n source.ip: (10.0.0.0/8 or 172.16.0.0/12 or 192.168.0.0/16) and\n not destination.ip: (10.0.0.0/8 or 172.16.0.0/12 or 192.168.0.0/16)\n )\n)\n", "risk_score": 47, @@ -18,7 +18,7 @@ "severity": "medium", "tags": [ "Elastic", - "network" + "Network" ], "threat": [ { diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_nat_traversal_port_activity.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_nat_traversal_port_activity.json index e87e296017a36..c66a9e9d77fe4 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_nat_traversal_port_activity.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_nat_traversal_port_activity.json @@ -1,16 +1,16 @@ { - "description": "This signal detects events that could be describing IPSEC NAT Traversal traffic.\nIPSEC is a VPN technology that allows one system to talk to another using\nencrypted tunnels. NAT Traversal enables these tunnels to communicate over\nthe Internet where one of the sides is behind a NAT router gateway. This may\nbe common on your network, but this technique is also used by threat actors\nto avoid detection.\n", + "description": "This rule detects events that could be describing IPSEC NAT Traversal traffic.\nIPSEC is a VPN technology that allows one system to talk to another using\nencrypted tunnels. NAT Traversal enables these tunnels to communicate over the\nInternet where one of the sides is behind a NAT router gateway. This may be\ncommon on your network, but this technique is also used by threat actors to\navoid detection.\n", "false_positives": [ - "Some networks may utilize these protocols but usage that is unfamiliar to local network administrators can be unexpected and suspicious. Because this port is in the ephemeral range, this rule may false under certain conditions such as when a application server with a public IP address replies to a client which has used a UDP port in the range by coincidence. This is uncommon but such servers can be excluded if desired." + "Some networks may utilize these protocols but usage that is unfamiliar to local network administrators can be unexpected and suspicious. Because this port is in the ephemeral range, this rule may false under certain conditions, such as when an application server with a public IP address replies to a client which has used a UDP port in the range by coincidence. This is uncommon but such servers can be excluded." ], "index": [ "auditbeat-*", - "endgame-*", "filebeat-*", "packetbeat-*", "winlogbeat-*" ], "language": "kuery", + "max_signals": 100, "name": "IPSEC NAT Traversal Port Activity", "query": "network.transport: udp and destination.port: 4500", "risk_score": 21, @@ -18,7 +18,7 @@ "severity": "low", "tags": [ "Elastic", - "network" + "Network" ], "threat": [ { diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_port_26_activity.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_port_26_activity.json index 352fc5e44dc80..7b26141898532 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_port_26_activity.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_port_26_activity.json @@ -1,18 +1,18 @@ { - "description": "This signal detects events that may indicate use of SMTP on TCP port 26. This\nport is commonly used by several popular mail transfer agents to deconflict\nwith the default SMTP port 25. This port has also been used by a malware family\ncalled BadPatch for command and control of Windows systems.\n", + "description": "This rule detects events that may indicate use of SMTP on TCP port 26. This\nport is commonly used by several popular mail transfer agents to deconflict\nwith the default SMTP port 25. This port has also been used by a malware family\ncalled BadPatch for command and control of Windows systems.\n", "false_positives": [ - "Servers that process email traffic may cause false positives and should be excluded from this rule as this is expected behavior for them." + "Servers that process email traffic may cause false positives and should be excluded from this rule as this is expected behavior." ], "index": [ "auditbeat-*", - "endgame-*", "filebeat-*", "packetbeat-*", "winlogbeat-*" ], "language": "kuery", + "max_signals": 100, "name": "SMTP on Port 26/TCP", - "query": "network.transport: tcp and destination.port: 26", + "query": "network.transport: tcp and destination.port: 26\n", "references": [ "https://unit42.paloaltonetworks.com/unit42-badpatch/", "https://isc.sans.edu/forums/diary/Next+up+whats+up+with+TCP+port+26/25564/" @@ -22,7 +22,7 @@ "severity": "low", "tags": [ "Elastic", - "network" + "Network" ], "threat": [ { diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_port_8000_activity_to_the_internet.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_port_8000_activity_to_the_internet.json index 2b3d08a7c80d9..7551119cd5a84 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_port_8000_activity_to_the_internet.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_port_8000_activity_to_the_internet.json @@ -1,16 +1,16 @@ { "description": "TCP Port 8000 is commonly used for development environments of web server\nsoftware. It generally should not be exposed directly to the Internet. If you are\nrunning software like this on the Internet, you should consider placing it behind\na reverse proxy.\n", "false_positives": [ - "Because this port is in the ephemeral range, this rule may false under certain conditions such as when a NATed web server replies to a client which has used a port in the range by coincidence. In this case, such servers can be excluded if desired. Some applications may use this port but this is very uncommon and usually appears in local traffic using private IPs which this rule does not match. Some cloud environments, particularly development environments, may use this port when VPNs or direct connects are not in use and cloud instances are accessed across the Internet." + "Because this port is in the ephemeral range, this rule may false under certain conditions, such as when a NATed web server replies to a client which has used a port in the range by coincidence. In this case, such servers can be excluded. Some applications may use this port but this is very uncommon and usually appears in local traffic using private IPs, which this rule does not match. Some cloud environments, particularly development environments, may use this port when VPNs or direct connects are not in use and cloud instances are accessed across the Internet." ], "index": [ "auditbeat-*", - "endgame-*", "filebeat-*", "packetbeat-*", "winlogbeat-*" ], "language": "kuery", + "max_signals": 100, "name": "TCP Port 8000 Activity to the Internet", "query": "network.transport: tcp and destination.port: 8000 and (\n network.direction: outbound or (\n source.ip: (10.0.0.0/8 or 172.16.0.0/12 or 192.168.0.0/16) and\n not destination.ip: (10.0.0.0/8 or 172.16.0.0/12 or 192.168.0.0/16)\n )\n)\n", "risk_score": 21, @@ -18,7 +18,7 @@ "severity": "low", "tags": [ "Elastic", - "network" + "Network" ], "threat": [ { diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_pptp_point_to_point_tunneling_protocol_activity.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_pptp_point_to_point_tunneling_protocol_activity.json index b008ca2c2bee6..eeb38f756c67a 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_pptp_point_to_point_tunneling_protocol_activity.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_pptp_point_to_point_tunneling_protocol_activity.json @@ -1,24 +1,24 @@ { - "description": "This signal detects events that may indicate use of a PPTP VPN connection. Some threat actors use these types of connections to tunnel their traffic while avoiding detection.", + "description": "This rule detects events that may indicate use of a PPTP VPN connection. Some\nthreat actors use these types of connections to tunnel their traffic while\navoiding detection.\n", "false_positives": [ - "Some networks may utilize PPTP protocols but this is uncommon as more modern VPN technologies are available. Usage that is unfamiliar to local network administrators can be unexpected and suspicious. Torrenting applications may use this port. Because this port is in the ephemeral range, this rule may false under certain conditions such as when an application server with replies to a client which has used this port by coincidence. This is uncommon but such servers can be excluded if desired." + "Some networks may utilize PPTP protocols but this is uncommon as more modern VPN technologies are available. Usage that is unfamiliar to local network administrators can be unexpected and suspicious. Torrenting applications may use this port. Because this port is in the ephemeral range, this rule may false under certain conditions, such as when an application server replies to a client that used this port by coincidence. This is uncommon but such servers can be excluded." ], "index": [ "auditbeat-*", - "endgame-*", "filebeat-*", "packetbeat-*", "winlogbeat-*" ], "language": "kuery", + "max_signals": 100, "name": "PPTP (Point to Point Tunneling Protocol) Activity", - "query": "network.transport: tcp and destination.port: 1723", + "query": "network.transport: tcp and destination.port: 1723\n", "risk_score": 21, "rule_id": "d2053495-8fe7-4168-b3df-dad844046be3", "severity": "low", "tags": [ "Elastic", - "network" + "Network" ], "threat": [ { diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_proxy_port_activity_to_the_internet.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_proxy_port_activity_to_the_internet.json index f7c6ffddcaf9e..981a7bdffcfed 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_proxy_port_activity_to_the_internet.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_proxy_port_activity_to_the_internet.json @@ -1,16 +1,16 @@ { - "description": "This signal detects events that may describe network events of proxy use to the\nInternet. It includes popular HTTP proxy ports and SOCKS proxy ports. Typically\nenvironments will use an internal IP address for a proxy server. It can also\nbe used to circumvent network controls and detection mechanisms.\n", + "description": "This rule detects events that may describe network events of proxy use to the\nInternet. It includes popular HTTP proxy ports and SOCKS proxy ports. Typically,\nenvironments will use an internal IP address for a proxy server. It can also\nbe used to circumvent network controls and detection mechanisms.\n", "false_positives": [ - "Some proxied applications may use these ports but this usually occurs in local traffic using private IPs which this rule does not match. Proxies are widely used as a security technology but in enterprise environments this is usually local traffic which this rule does not match. Internet proxy services using these ports can be white-listed if desired. Some screen recording applications may use these ports. Proxy port activity involving an unusual source or destination may be more suspicious. Some cloud environments may use this port when VPNs or direct connects are not in use and cloud instances are accessed across the Internet. Because these ports are in the ephemeral range, this rule may false under certain conditions such as when a NATed web server replies to a client which has used a port in the range by coincidence. In this case, such servers can be excluded if desired." + "Some proxied applications may use these ports but this usually occurs in local traffic using private IPs\n which this rule does not match. Proxies are widely used as a security technology but in enterprise environments\n this is usually local traffic which this rule does not match. Internet proxy services using these ports can be\n white-listed if desired. Some screen recording applications may use these ports. Proxy port activity involving\n an unusual source or destination may be more suspicious. Some cloud environments may use this port when VPNs or\n direct connects are not in use and cloud instances are accessed across the Internet. Because these ports are in\n the ephemeral range, this rule may false under certain conditions such as when a NATed web server replies to a\n client which has used a port in the range by coincidence. In this case, such servers can be excluded if desired." ], "index": [ "auditbeat-*", - "endgame-*", "filebeat-*", "packetbeat-*", "winlogbeat-*" ], "language": "kuery", + "max_signals": 100, "name": "Proxy Port Activity to the Internet", "query": "network.transport: tcp and destination.port: (3128 or 8080 or 1080) and (\n network.direction: outbound or (\n source.ip: (10.0.0.0/8 or 172.16.0.0/12 or 192.168.0.0/16) and\n not destination.ip: (10.0.0.0/8 or 172.16.0.0/12 or 192.168.0.0/16)\n )\n)\n", "risk_score": 47, @@ -18,7 +18,7 @@ "severity": "medium", "tags": [ "Elastic", - "network" + "Network" ], "threat": [ { diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_rdp_remote_desktop_protocol_from_the_internet.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_rdp_remote_desktop_protocol_from_the_internet.json index e3853c30e6ad9..504df93f2f8ed 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_rdp_remote_desktop_protocol_from_the_internet.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_rdp_remote_desktop_protocol_from_the_internet.json @@ -1,16 +1,16 @@ { - "description": "This signal detects network events that may indicate the use of RDP traffic\nfrom the Internet. RDP is commonly used by system administrators to remotely\ncontrol a system for maintenance or to use shared resources. It should almost\nnever be directly exposed to the Internet, as it is frequently targeted and\nexploited by threat actors as an initial access or back-door vector.\n", + "description": "This rule detects network events that may indicate the use of RDP traffic\nfrom the Internet. RDP is commonly used by system administrators to remotely\ncontrol a system for maintenance or to use shared resources. It should almost\nnever be directly exposed to the Internet, as it is frequently targeted and\nexploited by threat actors as an initial access or back-door vector.\n", "false_positives": [ - "Some network security policies allow RDP directly from the Internet but usage that is unfamiliar to server or network owners can be unexpected and suspicious. RDP services may be exposed directly to the Internet in some networks such as cloud environments. In such cases, only RDP gateways, bastions or jump servers may be expected expose RDP directly to the Internet and can be exempted from this rule. RDP may be required by some work-flows such as remote access and support for specialized software products and servers. Such work-flows are usually known and not unexpected." + " Some network security policies allow RDP directly from the Internet but usage that is unfamiliar to\n server or network owners can be unexpected and suspicious. RDP services may be exposed directly to the\n Internet in some networks such as cloud environments. In such cases, only RDP gateways, bastions or jump\n servers may be expected expose RDP directly to the Internet and can be exempted from this rule. RDP may\n be required by some work-flows such as remote access and support for specialized software products and\n servers. Such work-flows are usually known and not unexpected." ], "index": [ "auditbeat-*", - "endgame-*", "filebeat-*", "packetbeat-*", "winlogbeat-*" ], "language": "kuery", + "max_signals": 100, "name": "RDP (Remote Desktop Protocol) from the Internet", "query": "network.transport: tcp and destination.port: 3389 and (\n network.direction: inbound or (\n not source.ip: (10.0.0.0/8 or 172.16.0.0/12 or 192.168.0.0/16)\n and destination.ip: (10.0.0.0/8 or 172.16.0.0/12 or 192.168.0.0/16)\n )\n)\n", "risk_score": 47, @@ -18,7 +18,7 @@ "severity": "medium", "tags": [ "Elastic", - "network" + "Network" ], "threat": [ { diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_rdp_remote_desktop_protocol_to_the_internet.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_rdp_remote_desktop_protocol_to_the_internet.json index 55b9716af9346..2d9fa6ba06dfd 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_rdp_remote_desktop_protocol_to_the_internet.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_rdp_remote_desktop_protocol_to_the_internet.json @@ -1,16 +1,16 @@ { - "description": "This signal detects network events that may indicate the use of RDP traffic\nto the Internet. RDP is commonly used by system administrators to remotely\ncontrol a system for maintenance or to use shared resources. It should almost\nnever be directly exposed to the Internet, as it is frequently targeted and\nexploited by threat actors as an initial access or back-door vector.\n", + "description": "This rule detects network events that may indicate the use of RDP traffic\nto the Internet. RDP is commonly used by system administrators to remotely\ncontrol a system for maintenance or to use shared resources. It should almost\nnever be directly exposed to the Internet, as it is frequently targeted and\nexploited by threat actors as an initial access or back-door vector.\n", "false_positives": [ - "RDP connections may be made directly to Internet destinations in order to access Windows cloud server instances but such connections are usually made only by engineers. In such cases, only RDP gateways, bastions or jump servers may be expected Internet destinations and can be exempted from this rule. RDP may be required by some work-flows such as remote access and support for specialized software products and servers. Such work-flows are usually known and not unexpected. Usage that is unfamiliar to server or network owners can be unexpected and suspicious." + "RDP connections may be made directly to Internet destinations in order to access\n Windows cloud server instances but such connections are usually made only by engineers.\n In such cases, only RDP gateways, bastions or jump servers may be expected Internet\n destinations and can be exempted from this rule. RDP may be required by some work-flows\n such as remote access and support for specialized software products and servers. Such\n work-flows are usually known and not unexpected. Usage that is unfamiliar to server or\n network owners can be unexpected and suspicious." ], "index": [ "auditbeat-*", - "endgame-*", "filebeat-*", "packetbeat-*", "winlogbeat-*" ], "language": "kuery", + "max_signals": 100, "name": "RDP (Remote Desktop Protocol) to the Internet", "query": "network.transport: tcp and destination.port: 3389 and (\n network.direction: outbound or (\n source.ip: (10.0.0.0/8 or 172.16.0.0/12 or 192.168.0.0/16) and\n not destination.ip: (10.0.0.0/8 or 172.16.0.0/12 or 192.168.0.0/16)\n )\n)\n", "risk_score": 21, @@ -18,7 +18,7 @@ "severity": "low", "tags": [ "Elastic", - "network" + "Network" ], "threat": [ { diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_rpc_remote_procedure_call_from_the_internet.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_rpc_remote_procedure_call_from_the_internet.json index 1570d3d155fea..d50c79db81ba5 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_rpc_remote_procedure_call_from_the_internet.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_rpc_remote_procedure_call_from_the_internet.json @@ -1,13 +1,13 @@ { - "description": "This signal detects network events that may indicate the use of RPC traffic\nfrom the Internet. RPC is commonly used by system administrators to remotely\ncontrol a system for maintenance or to use shared resources. It should almost\nnever be directly exposed to the Internet, as it is frequently targeted and\nexploited by threat actors as an initial access or back-door vector.\n", + "description": "This rule detects network events that may indicate the use of RPC traffic\nfrom the Internet. RPC is commonly used by system administrators to remotely\ncontrol a system for maintenance or to use shared resources. It should almost\nnever be directly exposed to the Internet, as it is frequently targeted and\nexploited by threat actors as an initial access or back-door vector.\n", "index": [ "auditbeat-*", - "endgame-*", "filebeat-*", "packetbeat-*", "winlogbeat-*" ], "language": "kuery", + "max_signals": 100, "name": "RPC (Remote Procedure Call) from the Internet", "query": "network.transport: tcp and destination.port: 135 and (\n network.direction: inbound or (\n not source.ip: (10.0.0.0/8 or 172.16.0.0/12 or 192.168.0.0/16) and\n destination.ip: (10.0.0.0/8 or 172.16.0.0/12 or 192.168.0.0/16)\n )\n)\n", "risk_score": 73, @@ -15,7 +15,7 @@ "severity": "high", "tags": [ "Elastic", - "network" + "Network" ], "threat": [ { diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_rpc_remote_procedure_call_to_the_internet.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_rpc_remote_procedure_call_to_the_internet.json index 91db97dabdd46..ade7b661a7909 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_rpc_remote_procedure_call_to_the_internet.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_rpc_remote_procedure_call_to_the_internet.json @@ -1,13 +1,13 @@ { - "description": "This signal detects network events that may indicate the use of RPC traffic\nto the Internet. RPC is commonly used by system administrators to remotely\ncontrol a system for maintenance or to use shared resources. It should almost\nnever be directly exposed to the Internet, as it is frequently targeted and\nexploited by threat actors as an initial access or back-door vector.\n", + "description": "This rule detects network events that may indicate the use of RPC traffic\nto the Internet. RPC is commonly used by system administrators to remotely\ncontrol a system for maintenance or to use shared resources. It should almost\nnever be directly exposed to the Internet, as it is frequently targeted and\nexploited by threat actors as an initial access or back-door vector.\n", "index": [ "auditbeat-*", - "endgame-*", "filebeat-*", "packetbeat-*", "winlogbeat-*" ], "language": "kuery", + "max_signals": 100, "name": "RPC (Remote Procedure Call) to the Internet", "query": "network.transport: tcp and destination.port: 135 and (\n network.direction: outbound or (\n source.ip: (10.0.0.0/8 or 172.16.0.0/12 or 192.168.0.0/16) and\n not destination.ip: (10.0.0.0/8 or 172.16.0.0/12 or 192.168.0.0/16)\n )\n)\n", "risk_score": 73, @@ -15,7 +15,7 @@ "severity": "high", "tags": [ "Elastic", - "network" + "Network" ], "threat": [ { diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_smb_windows_file_sharing_activity_to_the_internet.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_smb_windows_file_sharing_activity_to_the_internet.json index 991c626c11d33..62c2fafb7404f 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_smb_windows_file_sharing_activity_to_the_internet.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_smb_windows_file_sharing_activity_to_the_internet.json @@ -1,13 +1,13 @@ { - "description": "This signal detects network events that may indicate the use of Windows\nfile sharing (also called SMB or CIFS) traffic to the Internet. SMB is commonly\nused within networks to share files, printers, and other system resources amongst\ntrusted systems. It should almost never be directly exposed to the Internet, as\nit is frequently targeted and exploited by threat actors as an initial access\nor back-door vector or for data exfiltration.\n", + "description": "This rule detects network events that may indicate the use of Windows\nfile sharing (also called SMB or CIFS) traffic to the Internet. SMB is commonly\nused within networks to share files, printers, and other system resources amongst\ntrusted systems. It should almost never be directly exposed to the Internet, as\nit is frequently targeted and exploited by threat actors as an initial access\nor back-door vector or for data exfiltration.\n", "index": [ "auditbeat-*", - "endgame-*", "filebeat-*", "packetbeat-*", "winlogbeat-*" ], "language": "kuery", + "max_signals": 100, "name": "SMB (Windows File Sharing) Activity to the Internet", "query": "network.transport: tcp and destination.port: (139 or 445) and (\n network.direction: outbound or (\n source.ip: (10.0.0.0/8 or 172.16.0.0/12 or 192.168.0.0/16) and\n not destination.ip: (10.0.0.0/8 or 172.16.0.0/12 or 192.168.0.0/16)\n )\n)\n", "risk_score": 73, @@ -15,7 +15,7 @@ "severity": "high", "tags": [ "Elastic", - "network" + "Network" ], "threat": [ { diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_smtp_to_the_internet.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_smtp_to_the_internet.json index 68daf71d9992a..02fca5603910e 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_smtp_to_the_internet.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_smtp_to_the_internet.json @@ -1,16 +1,16 @@ { - "description": "This signal detects events that may describe SMTP traffic from internal\nhosts to a host across the Internet. In an enterprise network, there is typically\na dedicate host that is internal that could perform this function. It is also\nfrequently abused by threat actors for command and control or data exfiltration.\n", + "description": "This rule detects events that may describe SMTP traffic from internal\nhosts to a host across the Internet. In an enterprise network, there is typically\na dedicated internal host that performs this function. It is also\nfrequently abused by threat actors for command and control, or data exfiltration.\n", "false_positives": [ - "NATed servers that process email traffic may false and should be excluded from this rule as this is expected behavior for them. Consumer and / or personal devices may send email traffic to remote Internet destinations; in that case, such devices or networks can be excluded from this rule if this is expected behavior." + "NATed servers that process email traffic may false and should be excluded from this rule as this is expected behavior for them. Consumer and personal devices may send email traffic to remote Internet destinations. In this case, such devices or networks can be excluded from this rule if this is expected behavior." ], "index": [ "auditbeat-*", - "endgame-*", "filebeat-*", "packetbeat-*", "winlogbeat-*" ], "language": "kuery", + "max_signals": 100, "name": "SMTP to the Internet", "query": "network.transport: tcp and destination.port: (25 or 465 or 587) and (\n network.direction: outbound or (\n source.ip: (10.0.0.0/8 or 172.16.0.0/12 or 192.168.0.0/16) and\n not destination.ip: (10.0.0.0/8 or 172.16.0.0/12 or 192.168.0.0/16)\n )\n)\n", "risk_score": 21, @@ -18,7 +18,7 @@ "severity": "low", "tags": [ "Elastic", - "network" + "Network" ], "threat": [ { diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_sql_server_port_activity_to_the_internet.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_sql_server_port_activity_to_the_internet.json index df779d47246a5..67e6a08ddf791 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_sql_server_port_activity_to_the_internet.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_sql_server_port_activity_to_the_internet.json @@ -1,16 +1,16 @@ { - "description": "This signal detects events that may describe database traffic\n(MS SQL, Oracle, MySQL, and Postgresql) across the Internet. Databases\nshould almost never be directly exposed to the Internet, as they are\nfrequently targeted by threat actors to gain initial access to network resources.\n", + "description": "This rule detects events that may describe database traffic\n(MS SQL, Oracle, MySQL, and Postgresql) across the Internet. Databases\nshould almost never be directly exposed to the Internet, as they are\nfrequently targeted by threat actors to gain initial access to network resources.\n", "false_positives": [ - "Because these ports are in the ephemeral range, this rule may false under certain conditions such as when a NATed web server replies to a client which has used a port in the range by coincidence. In this case, such servers can be excluded if desired. Some cloud environments may use this port when VPNs or direct connects are not in use and database instances are accessed directly across the Internet." + "Because these ports are in the ephemeral range, this rule may false under certain conditions\n such as when a NATed web server replies to a client which has used a port in the range by\n coincidence. In this case, such servers can be excluded if desired. Some cloud environments may\n use this port when VPNs or direct connects are not in use and database instances are accessed\n directly across the Internet." ], "index": [ "auditbeat-*", - "endgame-*", "filebeat-*", "packetbeat-*", "winlogbeat-*" ], "language": "kuery", + "max_signals": 100, "name": "SQL Traffic to the Internet", "query": "network.transport: tcp and destination.port: (1433 or 1521 or 3336 or 5432) and (\n network.direction: outbound or (\n source.ip: (10.0.0.0/8 or 172.16.0.0/12 or 192.168.0.0/16) and\n not destination.ip: (10.0.0.0/8 or 172.16.0.0/12 or 192.168.0.0/16)\n )\n)\n", "risk_score": 47, @@ -18,7 +18,7 @@ "severity": "medium", "tags": [ "Elastic", - "network" + "Network" ], "threat": [ { diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_ssh_secure_shell_from_the_internet.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_ssh_secure_shell_from_the_internet.json index 6c278700450b1..052600a0db68a 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_ssh_secure_shell_from_the_internet.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_ssh_secure_shell_from_the_internet.json @@ -1,16 +1,16 @@ { - "description": "This signal detects network events that may indicate the use of SSH traffic\nfrom the Internet. SSH is commonly used by system administrators to remotely\ncontrol a system using the command line shell. If it is exposed to the Internet,\nit should be done with strong security controls as it is frequently targeted and\nexploited by threat actors as an initial access or back-door vector.\n", + "description": "This rule detects network events that may indicate the use of SSH traffic\nfrom the Internet. SSH is commonly used by system administrators to remotely\ncontrol a system using the command line shell. If it is exposed to the Internet,\nit should be done with strong security controls as it is frequently targeted and\nexploited by threat actors as an initial access or back-door vector.\n", "false_positives": [ - "Some network security policies allow SSH directly from the Internet but usage that is unfamiliar to server or network owners can be unexpected and suspicious. SSH services may be exposed directly to the Internet in some networks such as cloud environments. In such cases, only SSH gateways, bastions or jump servers may be expected expose SSH directly to the Internet and can be exempted from this rule. SSH may be required by some work-flows such as remote access and support for specialized software products and servers. Such work-flows are usually known and not unexpected." + "Some network security policies allow SSH directly from the Internet but usage that is\n unfamiliar to server or network owners can be unexpected and suspicious. SSH services may\n be exposed directly to the Internet in some networks such as cloud environments. In such\n cases, only SSH gateways, bastions or jump servers may be expected expose SSH directly to\n the Internet and can be exempted from this rule. SSH may be required by some work-flows\n such as remote access and support for specialized software products and servers. Such\n work-flows are usually known and not unexpected." ], "index": [ "auditbeat-*", - "endgame-*", "filebeat-*", "packetbeat-*", "winlogbeat-*" ], "language": "kuery", + "max_signals": 100, "name": "SSH (Secure Shell) from the Internet", "query": "network.transport: tcp and destination.port:22 and (\n network.direction: inbound or (\n not source.ip: (10.0.0.0/8 or 172.16.0.0/12 or 192.168.0.0/16) and\n destination.ip: (10.0.0.0/8 or 172.16.0.0/12 or 192.168.0.0/16)\n )\n)\n", "risk_score": 47, @@ -18,7 +18,7 @@ "severity": "medium", "tags": [ "Elastic", - "network" + "Network" ], "threat": [ { diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_ssh_secure_shell_to_the_internet.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_ssh_secure_shell_to_the_internet.json index 63f2dbc8a34f1..e3c3135c9240d 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_ssh_secure_shell_to_the_internet.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_ssh_secure_shell_to_the_internet.json @@ -1,16 +1,16 @@ { - "description": "This signal detects network events that may indicate the use of SSH traffic\nfrom the Internet. SSH is commonly used by system administrators to remotely\ncontrol a system using the command line shell. If it is exposed to the Internet,\nit should be done with strong security controls as it is frequently targeted and\nexploited by threat actors as an initial access or back-door vector.\n", + "description": "This rule detects network events that may indicate the use of SSH traffic\nfrom the Internet. SSH is commonly used by system administrators to remotely\ncontrol a system using the command line shell. If it is exposed to the Internet,\nit should be done with strong security controls as it is frequently targeted and\nexploited by threat actors as an initial access or back-door vector.\n", "false_positives": [ - "SSH connections may be made directly to Internet destinations in order to access Linux cloud server instances but such connections are usually made only by engineers. In such cases, only SSH gateways, bastions or jump servers may be expected Internet destinations and can be exempted from this rule. SSH may be required by some work-flows such as remote access and support for specialized software products and servers. Such work-flows are usually known and not unexpected. Usage that is unfamiliar to server or network owners can be unexpected and suspicious." + "SSH connections may be made directly to Internet destinations in order to access Linux\n cloud server instances but such connections are usually made only by engineers. In such cases,\n only SSH gateways, bastions or jump servers may be expected Internet destinations and can be\n exempted from this rule. SSH may be required by some work-flows such as remote access and support\n for specialized software products and servers. Such work-flows are usually known and not unexpected.\n Usage that is unfamiliar to server or network owners can be unexpected and suspicious." ], "index": [ "auditbeat-*", - "endgame-*", "filebeat-*", "packetbeat-*", "winlogbeat-*" ], "language": "kuery", + "max_signals": 100, "name": "SSH (Secure Shell) to the Internet", "query": "network.transport: tcp and destination.port:22 and (\n network.direction: outbound or (\n source.ip: (10.0.0.0/8 or 172.16.0.0/12 or 192.168.0.0/16) and\n not destination.ip: (10.0.0.0/8 or 172.16.0.0/12 or 192.168.0.0/16)\n )\n)\n", "risk_score": 21, @@ -18,7 +18,7 @@ "severity": "low", "tags": [ "Elastic", - "network" + "Network" ], "threat": [ { diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_telnet_port_activity.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_telnet_port_activity.json index 0d28f0ea53d9a..c05791c8a107d 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_telnet_port_activity.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_telnet_port_activity.json @@ -1,16 +1,16 @@ { - "description": "This signal detects network events that may indicate the use of Telnet traffic.\nTelnet is commonly used by system administrators to remotely control older or embed ed\nsystems using the command line shell. It should almost never be directly exposed to\nthe Internet, as it is frequently targeted and exploited by threat actors as an\ninitial access or back-door vector. As a plain-text protocol, it may also expose\n", + "description": "This rule detects network events that may indicate the use of Telnet traffic.\nTelnet is commonly used by system administrators to remotely control older or embed ed\nsystems using the command line shell. It should almost never be directly exposed to\nthe Internet, as it is frequently targeted and exploited by threat actors as an\ninitial access or back-door vector. As a plain-text protocol, it may also expose\nusernames and passwords to anyone capable of observing the traffic.\n", "false_positives": [ - "IoT (Internet of Things) devices and networks may use telnet and can be excluded if desired. Some business work-flows may use Telnet for administration of older devices. These often have a predictable behavior. Telnet activity involving an unusual source or destination may be more suspicious. Telnet activity involving a production server that has no known associated Telnet work-flow or business requirement is often suspicious." + "IoT (Internet of Things) devices and networks may use telnet and can be excluded if\n desired. Some business work-flows may use Telnet for administration of older devices. These\n often have a predictable behavior. Telnet activity involving an unusual source or destination\n may be more suspicious. Telnet activity involving a production server that has no known\n associated Telnet work-flow or business requirement is often suspicious." ], "index": [ "auditbeat-*", - "endgame-*", "filebeat-*", "packetbeat-*", "winlogbeat-*" ], "language": "kuery", + "max_signals": 100, "name": "Telnet Port Activity", "query": "network.transport: tcp and destination.port: 23", "risk_score": 47, @@ -18,7 +18,7 @@ "severity": "medium", "tags": [ "Elastic", - "network" + "Network" ], "threat": [ { diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_tor_activity_to_the_internet.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_tor_activity_to_the_internet.json index 80893e9404f02..64397716eded2 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_tor_activity_to_the_internet.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_tor_activity_to_the_internet.json @@ -1,16 +1,16 @@ { - "description": "This signal detects network events that may indicate the use of Tor traffic\nto the Internet. Tor is a network protocol that sends traffic through a\nseries of encrypted tunnels used to conceal a user's location and usage.\nTor may be used by threat actors as an alternate communication pathway to\nconceal the actor's identity and avoid detection.\n", + "description": "This rule detects network events that may indicate the use of Tor traffic\nto the Internet. Tor is a network protocol that sends traffic through a\nseries of encrypted tunnels used to conceal a user's location and usage.\nTor may be used by threat actors as an alternate communication pathway to\nconceal the actor's identity and avoid detection.\n", "false_positives": [ - "Tor client activity is uncommon in managed enterprise networks but may be common in unmanaged or public networks where few security policies apply. Because these ports are in the ephemeral range, this rule may false under certain conditions such as when a NATed web server replies to a client which has used one of these ports by coincidence. In this case, such servers can be excluded if desired." + "Tor client activity is uncommon in managed enterprise networks but may be common\n in unmanaged or public networks where few security policies apply. Because these ports\n are in the ephemeral range, this rule may false under certain conditions such as when a\n NATed web server replies to a client which has used one of these ports by coincidence.\n In this case, such servers can be excluded if desired." ], "index": [ "auditbeat-*", - "endgame-*", "filebeat-*", "packetbeat-*", "winlogbeat-*" ], "language": "kuery", + "max_signals": 100, "name": "Tor Activity to the Internet", "query": "network.transport: tcp and destination.port: (9001 or 9030) and (\n network.direction: outbound or (\n source.ip: (10.0.0.0/8 or 172.16.0.0/12 or 192.168.0.0/16) and\n not destination.ip: (10.0.0.0/8 or 172.16.0.0/12 or 192.168.0.0/16)\n )\n)\n", "risk_score": 47, @@ -18,7 +18,7 @@ "severity": "medium", "tags": [ "Elastic", - "network" + "Network" ], "threat": [ { diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_vnc_virtual_network_computing_from_the_internet.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_vnc_virtual_network_computing_from_the_internet.json index e64138dd053fa..dc4fbb281f762 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_vnc_virtual_network_computing_from_the_internet.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_vnc_virtual_network_computing_from_the_internet.json @@ -1,16 +1,16 @@ { - "description": "This signal detects network events that may indicate the use of VNC traffic\nfrom the Internet. VNC is commonly used by system administrators to remotely\ncontrol a system for maintenance or to use shared resources. It should almost\nnever be directly exposed to the Internet, as it is frequently targeted and\nexploited by threat actors as an initial access or back-door vector.\n", + "description": "This rule detects network events that may indicate the use of VNC traffic\nfrom the Internet. VNC is commonly used by system administrators to remotely\ncontrol a system for maintenance or to use shared resources. It should almost\nnever be directly exposed to the Internet, as it is frequently targeted and\nexploited by threat actors as an initial access or back-door vector.\n", "false_positives": [ - "VNC connections may be received directly to Linux cloud server instances but such connections are usually made only by engineers. VNC is less common than SSH or RDP but may be required by some work-flows such as remote access and support for specialized software products or servers. Such work-flows are usually known and not unexpected. Usage that is unfamiliar to server or network owners can be unexpected and suspicious." + "VNC connections may be received directly to Linux cloud server instances but\n such connections are usually made only by engineers. VNC is less common than SSH\n or RDP but may be required by some work-flows such as remote access and support\n for specialized software products or servers. Such work-flows are usually known\n and not unexpected. Usage that is unfamiliar to server or network owners can be\n unexpected and suspicious." ], "index": [ "auditbeat-*", - "endgame-*", "filebeat-*", "packetbeat-*", "winlogbeat-*" ], "language": "kuery", + "max_signals": 100, "name": "VNC (Virtual Network Computing) from the Internet", "query": "network.transport: tcp and (destination.port >= 5800 and destination.port <= 5810) and (\n network.direction: inbound or (\n not source.ip: (10.0.0.0/8 or 172.16.0.0/12 or 192.168.0.0/16) and\n destination.ip: (10.0.0.0/8 or 172.16.0.0/12 or 192.168.0.0/16)\n )\n)\n", "risk_score": 73, @@ -18,7 +18,7 @@ "severity": "high", "tags": [ "Elastic", - "network" + "Network" ], "threat": [ { diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_vnc_virtual_network_computing_to_the_internet.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_vnc_virtual_network_computing_to_the_internet.json index 8c43419c3ead5..7da5db39d9bfe 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_vnc_virtual_network_computing_to_the_internet.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/network_vnc_virtual_network_computing_to_the_internet.json @@ -1,16 +1,16 @@ { - "description": "This signal detects network events that may indicate the use of VNC traffic\nto the Internet. VNC is commonly used by system administrators to remotely\ncontrol a system for maintenance or to use shared resources. It should almost\nnever be directly exposed to the Internet, as it is frequently targeted and\nexploited by threat actors as an initial access or back-door vector.\n", + "description": "This rule detects network events that may indicate the use of VNC traffic\nto the Internet. VNC is commonly used by system administrators to remotely\ncontrol a system for maintenance or to use shared resources. It should almost\nnever be directly exposed to the Internet, as it is frequently targeted and\nexploited by threat actors as an initial access or back-door vector.", "false_positives": [ - "VNC connections may be made directly to Linux cloud server instances but such connections are usually made only by engineers. VNC is less common than SSH or RDP but may be required by some work flows such as remote access and support for specialized software products or servers. Such work-flows are usually known and not unexpected. Usage that is unfamiliar to server or network owners can be unexpected and suspicious." + "VNC connections may be made directly to Linux cloud server instances but such\n connections are usually made only by engineers. VNC is less common than SSH or RDP\n but may be required by some work flows such as remote access and support for\n specialized software products or servers. Such work-flows are usually known and not\n unexpected. Usage that is unfamiliar to server or network owners can be unexpected\n and suspicious." ], "index": [ "auditbeat-*", - "endgame-*", "filebeat-*", "packetbeat-*", "winlogbeat-*" ], "language": "kuery", + "max_signals": 100, "name": "VNC (Virtual Network Computing) to the Internet", "query": "network.transport: tcp and (destination.port >= 5800 and destination.port <= 5810) and (\n network.direction: outbound or (\n source.ip: (10.0.0.0/8 or 172.16.0.0/12 or 192.168.0.0/16) and\n not destination.ip: (10.0.0.0/8 or 172.16.0.0/12 or 192.168.0.0/16)\n )\n)\n", "risk_score": 47, @@ -18,7 +18,7 @@ "severity": "medium", "tags": [ "Elastic", - "network" + "Network" ], "threat": [ { diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/notice.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/notice.ts index cd24d823b8cd6..a597220db752f 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/notice.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/notice.ts @@ -9,8 +9,6 @@ * - windows_priv_escalation_via_accessibility_features.json * - windows_persistence_via_application_shimming.json * - windows_execution_via_trusted_developer_utilities.json - * - windows_execution_via_net_com_assemblies.json - * - windows_execution_via_connection_manager.json * * MIT License * diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/null_user_agent.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/null_user_agent.json index 7975c30a4ea38..c08d910a3b355 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/null_user_agent.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/null_user_agent.json @@ -1,7 +1,7 @@ { "description": "A request to a web application server contained no identifying user agent string.", "false_positives": [ - "Some normal applications and scripts may contain no user agent. Most legitimate web requests from the Internet contain a user agent string. Requests from web browsers almost always contain a user agent string. If the source is unexpected, or the user is unauthorized, or the request is unusual, these may be suspicious or malicious activity." + "Some normal applications and scripts may contain no user agent. Most legitimate web requests from the Internet contain a user agent string. Requests from web browsers almost always contain a user agent string. If the source is unexpected, the user unauthorized, or the request unusual, these may indicate suspicious or malicious activity." ], "filters": [ { @@ -25,7 +25,7 @@ "apm-*-transaction*" ], "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Web Application Suspicious Activity: No User Agent", "query": "url.path: *", "references": [ diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/sqlmap_user_agent.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/sqlmap_user_agent.json index 44e112d09a45b..5c03c3a76e4a7 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/sqlmap_user_agent.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/sqlmap_user_agent.json @@ -1,12 +1,13 @@ { - "description": "This is an example of how to detect an unwanted web client user agent. This search matches the user agent for sqlmap 1.3.11 which is a popular FOSS tool for testing web applications for SQL injection vulnerabilities. ", + "description": "This is an example of how to detect an unwanted web client user agent. This search matches the user agent for sqlmap 1.3.11, which is a popular FOSS tool for testing web applications for SQL injection vulnerabilities.", "false_positives": [ - "This signal does not indicate that a SQL injection attack occurred, only that the sqlmap tool was used. Security scans and tests may result in these errors. If the source is not an authorized security tester, this is generally suspicious or malicious activity." + "This rule does not indicate that a SQL injection attack occurred, only that the `sqlmap` tool was used. Security scans and tests may result in these errors. If the source is not an authorized security tester, this is generally suspicious or malicious activity." ], "index": [ "apm-*-transaction*" ], "language": "kuery", + "max_signals": 100, "name": "Web Application Suspicious Activity: sqlmap User Agent", "query": "user_agent.original:\"sqlmap/1.3.11#stable (http://sqlmap.org)\"", "references": [ diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_background_intelligent_transfer_service_bits_connecting_to_the_internet.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_background_intelligent_transfer_service_bits_connecting_to_the_internet.json deleted file mode 100644 index 9b3784345b013..0000000000000 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_background_intelligent_transfer_service_bits_connecting_to_the_internet.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "description": "Adversaries may abuse the Background Intelligent Transfer Service (BITS) to download, execute, or clean up after performing a malicious action.", - "index": [ - "winlogbeat-*" - ], - "language": "kuery", - "max_signals": 33, - "name": "Background Intelligent Transfer Service (BITS) connecting to the Internet", - "query": "process.name:bitsadmin.exe and event.action:\"Network connection detected (rule: NetworkConnect)\" and not destination.ip:10.0.0.0/8 and not destination.ip:172.16.0.0/12 and not destination.ip:192.168.0.0/16", - "risk_score": 21, - "rule_id": "7edadee3-98ae-472c-b1c4-8c0a2c4877cc", - "severity": "low", - "tags": [ - "Elastic", - "Windows" - ], - "threat": [ - { - "framework": "MITRE ATT&CK", - "tactic": { - "id": "TA0005", - "name": "Defense Evasion", - "reference": "https://attack.mitre.org/tactics/TA0005/" - }, - "technique": [ - { - "id": "T1197", - "name": "BITS Jobs", - "reference": "https://attack.mitre.org/techniques/T1197/" - } - ] - }, - { - "framework": "MITRE ATT&CK", - "tactic": { - "id": "TA0003", - "name": "Persistence", - "reference": "https://attack.mitre.org/tactics/TA0003/" - }, - "technique": [ - { - "id": "T1197", - "name": "BITS Jobs", - "reference": "https://attack.mitre.org/techniques/T1197/" - } - ] - } - ], - "type": "query", - "version": 1 -} diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_certutil_connecting_to_the_internet.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_certutil_connecting_to_the_internet.json deleted file mode 100644 index 0a960fc427d7b..0000000000000 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_certutil_connecting_to_the_internet.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "description": "Identifies certutil.exe making a network connection. Adversaries could abuse certutil.exe to download a certificate, or malware, from a remote URL.", - "index": [ - "winlogbeat-*" - ], - "language": "kuery", - "max_signals": 33, - "name": "Certutil Network Connection", - "query": "process.name:certutil.exe and event.action:\"Network connection detected (rule: NetworkConnect)\" and not destination.ip:10.0.0.0/8 and not destination.ip:172.16.0.0/12 and not destination.ip:192.168.0.0/16", - "risk_score": 21, - "rule_id": "1a2cf526-6784-4c51-a2b9-f0adcc05d85c", - "severity": "low", - "tags": [ - "Elastic", - "Windows" - ], - "threat": [ - { - "framework": "MITRE ATT&CK", - "tactic": { - "id": "TA0011", - "name": "Command and Control", - "reference": "https://attack.mitre.org/tactics/TA0011/" - }, - "technique": [ - { - "id": "T1105", - "name": "Remote File Copy", - "reference": "https://attack.mitre.org/techniques/T1105/" - } - ] - } - ], - "type": "query", - "version": 1 -} diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_command_prompt_connecting_to_the_internet.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_command_prompt_connecting_to_the_internet.json index 87dbd4cd70777..7ab8034ef4083 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_command_prompt_connecting_to_the_internet.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_command_prompt_connecting_to_the_internet.json @@ -7,7 +7,7 @@ "winlogbeat-*" ], "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Command Prompt Network Connection", "query": "process.name:cmd.exe and event.action:\"Network connection detected (rule: NetworkConnect)\" and not destination.ip:10.0.0.0/8 and not destination.ip:172.16.0.0/12 and not destination.ip:192.168.0.0/16", "risk_score": 21, diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_command_shell_started_by_internet_explorer.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_command_shell_started_by_internet_explorer.json deleted file mode 100644 index a214ab4544b97..0000000000000 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_command_shell_started_by_internet_explorer.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "description": "Identifies a suspicious parent child process relationship with cmd.exe spawning form Internet Explorer.", - "index": [ - "winlogbeat-*" - ], - "language": "kuery", - "max_signals": 33, - "name": "Internet Explorer spawning cmd.exe", - "query": "process.parent.name:iexplore.exe and process.name:cmd.exe", - "risk_score": 21, - "rule_id": "7a6e1e81-deae-4cf6-b807-9a768fff3c06", - "severity": "low", - "tags": [ - "Elastic", - "Windows" - ], - "threat": [ - { - "framework": "MITRE ATT&CK", - "tactic": { - "id": "TA0002", - "name": "Execution", - "reference": "https://attack.mitre.org/tactics/TA0002/" - }, - "technique": [ - { - "id": "T1059", - "name": "Command-Line Interface", - "reference": "https://attack.mitre.org/techniques/T1059/" - } - ] - } - ], - "type": "query", - "version": 1 -} diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_command_shell_started_by_powershell.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_command_shell_started_by_powershell.json index 187cc9d344902..d914fd2e91a07 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_command_shell_started_by_powershell.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_command_shell_started_by_powershell.json @@ -4,8 +4,8 @@ "winlogbeat-*" ], "language": "kuery", - "max_signals": 33, - "name": "PowerShell spawning cmd.exe", + "max_signals": 100, + "name": "PowerShell spawning Cmd", "query": "process.parent.name:powershell.exe and process.name:cmd.exe", "risk_score": 21, "rule_id": "0f616aee-8161-4120-857e-742366f5eeb3", diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_command_shell_started_by_svchost.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_command_shell_started_by_svchost.json index 81114bf8b8766..b7f0c54fedf62 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_command_shell_started_by_svchost.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_command_shell_started_by_svchost.json @@ -4,8 +4,8 @@ "winlogbeat-*" ], "language": "kuery", - "max_signals": 33, - "name": "Svchost spawning cmd.exe", + "max_signals": 100, + "name": "Svchost spawning Cmd", "query": "process.parent.name:svchost.exe and process.name:cmd.exe", "risk_score": 21, "rule_id": "fd7a6052-58fa-4397-93c3-4795249ccfa2", diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_defense_evasion_via_filter_manager.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_defense_evasion_via_filter_manager.json index 7c999c1fc1e03..86242fd1081a1 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_defense_evasion_via_filter_manager.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_defense_evasion_via_filter_manager.json @@ -4,15 +4,14 @@ "winlogbeat-*" ], "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Potential Evasion via Filter Manager", - "query": "event.code:1 and process.name:fltmc.exe", + "query": "event.code:1 and process.name:fltMC.exe", "risk_score": 21, "rule_id": "06dceabf-adca-48af-ac79-ffdf4c3b1e9a", "severity": "low", "tags": [ "Elastic", - "D-SA", "Windows" ], "threat": [ diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_execution_via_compiled_html_file.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_execution_via_compiled_html_file.json index 62c8942dda9c3..7789b0723b3fc 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_execution_via_compiled_html_file.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_execution_via_compiled_html_file.json @@ -7,7 +7,7 @@ "winlogbeat-*" ], "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Process Activity via Compiled HTML File", "query": "event.code:1 and process.name:hh.exe", "risk_score": 21, diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_execution_via_connection_manager.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_execution_via_connection_manager.json deleted file mode 100644 index 657487232fe81..0000000000000 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_execution_via_connection_manager.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "description": "Various Windows utilities may be used to execute commands, possibly without invoking cmd.exe, including the Program Compatibility Assistant (pcalua.exe) or forfiles.exe.", - "index": [ - "winlogbeat-*" - ], - "language": "kuery", - "max_signals": 33, - "name": "Indirect Command Execution", - "query": "event.code:1 and process.parent.name:pcalua.exe or (process.name:bash.exe or process.name:forfiles.exe or process.name:pcalua.exe)", - "risk_score": 21, - "rule_id": "f2728299-167a-489c-913c-2e0955ac3c40", - "severity": "low", - "tags": [ - "Elastic", - "D-SA", - "Windows" - ], - "threat": [ - { - "framework": "MITRE ATT&CK", - "tactic": { - "id": "TA0005", - "name": "Defense Evasion", - "reference": "https://attack.mitre.org/tactics/TA0005/" - }, - "technique": [ - { - "id": "T1202", - "name": "Indirect Command Execution", - "reference": "https://attack.mitre.org/techniques/T1202/" - } - ] - } - ], - "type": "query", - "version": 1 -} diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_execution_via_net_com_assemblies.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_execution_via_net_com_assemblies.json deleted file mode 100644 index 80d91fa515342..0000000000000 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_execution_via_net_com_assemblies.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "description": "Adversaries can use Regsvcs.exe and Regasm.exe to proxy execution of code through a trusted Windows utility.", - "false_positives": [ - "Administrators may use the command prompt for regular administrative tasks. It's important to baseline your environment for network connections being made from the command prompt to determine any abnormal use of this tool." - ], - "index": [ - "winlogbeat-*" - ], - "language": "kuery", - "max_signals": 33, - "name": "Execution via Regsvcs/Regasm", - "query": "event.code:1 and (process.name:regasm.exe or process.name:regsvcs.exe)", - "risk_score": 21, - "rule_id": "5c12412f-602c-4120-8c4f-69d723dbba04", - "severity": "low", - "tags": [ - "Elastic", - "D-SA", - "Windows" - ], - "threat": [ - { - "framework": "MITRE ATT&CK", - "tactic": { - "id": "TA0002", - "name": "Execution", - "reference": "https://attack.mitre.org/tactics/TA0002/" - }, - "technique": [ - { - "id": "T1121", - "name": "Regsvcs/Regasm", - "reference": "https://attack.mitre.org/techniques/T1121/" - } - ] - } - ], - "type": "query", - "version": 1 -} diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_execution_via_regsvr32.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_execution_via_regsvr32.json index 6b2c54d527963..e8e7ddfc168dc 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_execution_via_regsvr32.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_execution_via_regsvr32.json @@ -4,7 +4,7 @@ "winlogbeat-*" ], "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Suspicious Script Object Execution", "query": "event.code: 1 and scrobj.dll and (process.name:certutil.exe or process.name:regsvr32.exe or process.name:rundll32.exe)", "risk_score": 21, diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_execution_via_trusted_developer_utilities.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_execution_via_trusted_developer_utilities.json index e722d311b86c7..bd2376a0897f4 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_execution_via_trusted_developer_utilities.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_execution_via_trusted_developer_utilities.json @@ -7,7 +7,7 @@ "winlogbeat-*" ], "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Trusted Developer Application Usage", "query": "event.code:1 and (process.name:MSBuild.exe or process.name:msxsl.exe)", "risk_score": 21, @@ -15,7 +15,6 @@ "severity": "low", "tags": [ "Elastic", - "D-SA", "Windows" ], "threat": [ diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_html_help_executable_program_connecting_to_the_internet.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_html_help_executable_program_connecting_to_the_internet.json index 2b4d774281b84..32fa953388be3 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_html_help_executable_program_connecting_to_the_internet.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_html_help_executable_program_connecting_to_the_internet.json @@ -4,7 +4,7 @@ "winlogbeat-*" ], "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Network Connection via Compiled HTML File", "query": "process.name:hh.exe and event.action:\"Network connection detected (rule: NetworkConnect)\" and not destination.ip:10.0.0.0/8 and not destination.ip:172.16.0.0/12 and not destination.ip:192.168.0.0/16", "risk_score": 21, diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_misc_lolbin_connecting_to_the_internet.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_misc_lolbin_connecting_to_the_internet.json index 8a4cb75588bff..0015371f03067 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_misc_lolbin_connecting_to_the_internet.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_misc_lolbin_connecting_to_the_internet.json @@ -4,7 +4,7 @@ "winlogbeat-*" ], "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Network Connection via Signed Binary", "query": "(process.name:expand.exe or process.name:extrac.exe or process.name:ieexec.exe or process.name:makecab.exe) and event.action:\"Network connection detected (rule: NetworkConnect)\" and not destination.ip:10.0.0.0/8 and not destination.ip:172.16.0.0/12 and not destination.ip:192.168.0.0/16", "risk_score": 21, diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_net_command_activity_by_the_system_account.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_net_command_activity_by_the_system_account.json deleted file mode 100644 index 5b3257daec8fb..0000000000000 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_net_command_activity_by_the_system_account.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "description": "Identifies attempts to create new users via the SYSTEM account.", - "index": [ - "winlogbeat-*" - ], - "language": "kuery", - "max_signals": 33, - "name": "Net command via SYSTEM account", - "query": "process.name: (net.exe or net1.exe) and user.name:SYSTEM", - "risk_score": 21, - "rule_id": "c3f5dc81-a8b4-4144-95a7-d0a818d7355d", - "severity": "low", - "tags": [ - "Elastic", - "Windows" - ], - "threat": [ - { - "framework": "MITRE ATT&CK", - "tactic": { - "id": "TA0003", - "name": "Persistence", - "reference": "https://attack.mitre.org/tactics/TA0003/" - }, - "technique": [ - { - "id": "T1136", - "name": "Create Account", - "reference": "https://attack.mitre.org/techniques/T1136/" - } - ] - } - ], - "type": "query", - "version": 1 -} diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_persistence_via_application_shimming.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_persistence_via_application_shimming.json index 2c10382cdbc7c..6eaac7b9e6cab 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_persistence_via_application_shimming.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_persistence_via_application_shimming.json @@ -4,7 +4,7 @@ "winlogbeat-*" ], "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Potential Application Shimming via Sdbinst", "query": "event.code:1 and process.name:sdbinst.exe", "risk_score": 21, @@ -12,7 +12,6 @@ "severity": "low", "tags": [ "Elastic", - "D-SA", "Windows" ], "threat": [ diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_priv_escalation_via_accessibility_features.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_priv_escalation_via_accessibility_features.json index 23d05aaf526e3..b2463633b0c5d 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_priv_escalation_via_accessibility_features.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_priv_escalation_via_accessibility_features.json @@ -4,7 +4,7 @@ "winlogbeat-*" ], "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Potential Modification of Accessibility Binaries", "query": "event.code:1 and process.parent.name:winlogon.exe and (process.name:atbroker.exe or process.name:displayswitch.exe or process.name:magnify.exe or process.name:narrator.exe or process.name:osk.exe or process.name:sethc.exe or process.name:utilman.exe)", "risk_score": 21, @@ -12,7 +12,6 @@ "severity": "low", "tags": [ "Elastic", - "D-SA", "Windows" ], "threat": [ diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_process_discovery_via_tasklist_command.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_process_discovery_via_tasklist_command.json index 5f5215ddff8c6..a0542ef59d8cd 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_process_discovery_via_tasklist_command.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_process_discovery_via_tasklist_command.json @@ -7,7 +7,7 @@ "winlogbeat-*" ], "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Process Discovery via Tasklist", "query": "event.code:1 and process.name:tasklist.exe", "risk_score": 21, @@ -15,7 +15,6 @@ "severity": "low", "tags": [ "Elastic", - "D-SA", "Windows" ], "threat": [ diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_process_execution_via_wmi.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_process_execution_via_wmi.json deleted file mode 100644 index 6d6343330a7ff..0000000000000 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_process_execution_via_wmi.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "description": "Identifies use of scrcons.exe, which is a Windows Management Instrumentation (WMI) Standard Event Consumer scripting application.", - "false_positives": [ - " Windows Management Instrumentation (WMI) processes can be used for an array of administrative capabilities. It's important to baseline your environment to determine any abnormal use of this tool." - ], - "index": [ - "winlogbeat-*" - ], - "language": "kuery", - "max_signals": 33, - "name": "Execution via Scrcons", - "query": "process.name:scrcons.exe", - "risk_score": 21, - "rule_id": "7e6cd4b9-6346-4683-b3e6-6a3e66f3208f", - "severity": "low", - "tags": [ - "Elastic", - "Windows" - ], - "threat": [ - { - "framework": "MITRE ATT&CK", - "tactic": { - "id": "TA0002", - "name": "Execution", - "reference": "https://attack.mitre.org/tactics/TA0002/" - }, - "technique": [ - { - "id": "T1047", - "name": "Windows Management Instrumentation", - "reference": "https://attack.mitre.org/techniques/T1047/" - } - ] - } - ], - "type": "query", - "version": 1 -} diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_register_server_program_connecting_to_the_internet.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_register_server_program_connecting_to_the_internet.json index b35e016be15d7..d0f2e809c1aa7 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_register_server_program_connecting_to_the_internet.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_register_server_program_connecting_to_the_internet.json @@ -7,7 +7,7 @@ "winlogbeat-*" ], "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Network Connection via Regsvr", "query": "(process.name:regsvr32.exe or process.name:regsvr64.exe) and event.action:\"Network connection detected (rule: NetworkConnect)\" and not destination.ip:169.254.169.254/32 and not destination.ip:10.0.0.0/8 and not destination.ip:172.16.0.0/12 and not destination.ip:192.168.0.0/16", "risk_score": 21, diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_signed_binary_proxy_execution.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_signed_binary_proxy_execution.json index cf5135cc490eb..be4ccef2a0887 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_signed_binary_proxy_execution.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_signed_binary_proxy_execution.json @@ -7,7 +7,7 @@ "winlogbeat-*" ], "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Execution via Signed Binary", "query": "event.code:1 and http and (process.name:certutil.exe or process.name:msiexec.exe)", "risk_score": 21, diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_signed_binary_proxy_execution_download.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_signed_binary_proxy_execution_download.json deleted file mode 100644 index 117a40d0fdcee..0000000000000 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_signed_binary_proxy_execution_download.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "description": "Binaries signed with trusted digital certificates can execute on Windows systems protected by digital signature validation. Adversaries may use these binaries to 'live off the land' and execute malicious files that could bypass application whitelisting and signature validation.", - "false_positives": [ - "Security testing may produce events like this. Activity of this kind performed by non-engineers and ordinary users is unusual." - ], - "index": [ - "winlogbeat-*" - ], - "language": "kuery", - "max_signals": 33, - "name": "Potential Download via Signed Binary", - "query": " event.code:3 and http and (process.name:certutil.exe or process.name:replace.exe)", - "risk_score": 21, - "rule_id": "68ecc190-cce2-4021-b976-c7c846ac0a00", - "severity": "low", - "tags": [ - "Elastic", - "Windows" - ], - "threat": [ - { - "framework": "MITRE ATT&CK", - "tactic": { - "id": "TA0005", - "name": "Defense Evasion", - "reference": "https://attack.mitre.org/tactics/TA0005/" - }, - "technique": [ - { - "id": "T1218", - "name": "Signed Binary Proxy Execution", - "reference": "https://attack.mitre.org/techniques/T1218/" - } - ] - }, - { - "framework": "MITRE ATT&CK", - "tactic": { - "id": "TA0002", - "name": "Execution", - "reference": "https://attack.mitre.org/tactics/TA0002/" - }, - "technique": [ - { - "id": "T1218", - "name": "Signed Binary Proxy Execution", - "reference": "https://attack.mitre.org/techniques/T1218/" - } - ] - } - ], - "type": "query", - "version": 1 -} diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_suspicious_process_started_by_a_script.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_suspicious_process_started_by_a_script.json index 3691c59d784fb..235a04f8063fc 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_suspicious_process_started_by_a_script.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_suspicious_process_started_by_a_script.json @@ -7,8 +7,8 @@ "winlogbeat-*" ], "language": "kuery", - "max_signals": 33, - "name": "Suspicious Process Spawning from Script Interpreter", + "max_signals": 100, + "name": "Suspicious Process spawning from Script Interpreter", "query": "(process.parent.name:cmd.exe or process.parent.name:cscript.exe or process.parent.name:mshta.exe or process.parent.name:powershell.exe or process.parent.name:rundll32.exe or process.parent.name:wscript.exe or process.parent.name:wmiprvse.exe) and (process.name:bitsadmin.exe or process.name:certutil.exe or mshta.exe or process.name:nslookup.exe or process.name:schtasks.exe) and event.code:1", "risk_score": 21, "rule_id": "89db767d-99f9-479f-8052-9205fd3090c4", diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_whoami_command_activity.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_whoami_command_activity.json index 3618d304dc32a..678160f945ba0 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_whoami_command_activity.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/windows_whoami_command_activity.json @@ -7,7 +7,7 @@ "winlogbeat-*" ], "language": "kuery", - "max_signals": 33, + "max_signals": 100, "name": "Whoami Process Activity", "query": "process.name:whoami.exe and event.code:1", "risk_score": 21, From ff41f4e56f1dfe9a3d2fcd9ccd508de6eb9b1104 Mon Sep 17 00:00:00 2001 From: Corey Robertson Date: Tue, 4 Feb 2020 21:25:43 -0500 Subject: [PATCH 23/86] Only change handlers as the element changes (#56782) Co-authored-by: Elastic Machine --- .../public/components/element_wrapper/index.js | 6 ++---- .../components/element_wrapper/lib/handlers.js | 4 ++-- .../canvas/public/state/actions/elements.js | 4 ++-- .../canvas/public/state/reducers/elements.js | 15 ++++++++++++++- 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/x-pack/legacy/plugins/canvas/public/components/element_wrapper/index.js b/x-pack/legacy/plugins/canvas/public/components/element_wrapper/index.js index 60c7e731691fa..85882377b7684 100644 --- a/x-pack/legacy/plugins/canvas/public/components/element_wrapper/index.js +++ b/x-pack/legacy/plugins/canvas/public/components/element_wrapper/index.js @@ -58,12 +58,10 @@ function selectorFactory(dispatch) { export const ElementWrapper = compose( connectAdvanced(selectorFactory), withPropsOnChange( - (props, nextProps) => - !isEqual(props.element, nextProps.element) || - !isEqual(props.selectedPage, nextProps.selectedPage), + (props, nextProps) => !isEqual(props.element, nextProps.element), props => { const { element, createHandlers } = props; - const handlers = createHandlers(element, props.selectedPage); + const handlers = createHandlers(element); // this removes element and createHandlers from passed props return { handlers }; } diff --git a/x-pack/legacy/plugins/canvas/public/components/element_wrapper/lib/handlers.js b/x-pack/legacy/plugins/canvas/public/components/element_wrapper/lib/handlers.js index d71c5ead2c802..8ea90974e2c53 100644 --- a/x-pack/legacy/plugins/canvas/public/components/element_wrapper/lib/handlers.js +++ b/x-pack/legacy/plugins/canvas/public/components/element_wrapper/lib/handlers.js @@ -16,7 +16,7 @@ export const createHandlers = dispatch => { let oldElement; let completeFn = () => {}; - return (element, pageId) => { + return element => { // reset isComplete when element changes if (!isEqual(oldElement, element)) { isComplete = false; @@ -25,7 +25,7 @@ export const createHandlers = dispatch => { return { setFilter(text) { - dispatch(setFilter(text, element.id, pageId, true)); + dispatch(setFilter(text, element.id, true)); }, getFilter() { diff --git a/x-pack/legacy/plugins/canvas/public/state/actions/elements.js b/x-pack/legacy/plugins/canvas/public/state/actions/elements.js index 7b7e87b027af5..8b49d16e87b21 100644 --- a/x-pack/legacy/plugins/canvas/public/state/actions/elements.js +++ b/x-pack/legacy/plugins/canvas/public/state/actions/elements.js @@ -254,9 +254,9 @@ export const removeElements = createThunk( export const setFilter = createThunk( 'setFilter', - ({ dispatch }, filter, elementId, pageId, doRender = true) => { + ({ dispatch }, filter, elementId, doRender = true) => { const _setFilter = createAction('setFilter'); - dispatch(_setFilter({ filter, elementId, pageId })); + dispatch(_setFilter({ filter, elementId })); if (doRender === true) { dispatch(fetchAllRenderables()); diff --git a/x-pack/legacy/plugins/canvas/public/state/reducers/elements.js b/x-pack/legacy/plugins/canvas/public/state/reducers/elements.js index c7e8a5c2ff2d8..630694a860aad 100644 --- a/x-pack/legacy/plugins/canvas/public/state/reducers/elements.js +++ b/x-pack/legacy/plugins/canvas/public/state/reducers/elements.js @@ -87,6 +87,18 @@ const trimElement = ({ id, position, expression, filter }) => ({ ...(filter !== void 0 && { filter }), }); +const getPageWithElementId = (workpad, elementId) => { + const matchingPage = workpad.pages.find(page => + page.elements.map(element => element.id).includes(elementId) + ); + + if (matchingPage) { + return matchingPage.id; + } + + return undefined; +}; + export const elementsReducer = handleActions( { // TODO: This takes the entire element, which is not necessary, it could just take the id. @@ -95,7 +107,8 @@ export const elementsReducer = handleActions( return assignNodeProperties(workpadState, pageId, elementId, { expression }); }, [actions.setFilter]: (workpadState, { payload }) => { - const { filter, pageId, elementId } = payload; + const { filter, elementId } = payload; + const pageId = getPageWithElementId(workpadState, elementId); return assignNodeProperties(workpadState, pageId, elementId, { filter }); }, [actions.setMultiplePositions]: (workpadState, { payload }) => From 117bfb5cc72fdb85afa411fa349b5e1735861147 Mon Sep 17 00:00:00 2001 From: Andrew Cholakian Date: Tue, 4 Feb 2020 22:07:37 -0600 Subject: [PATCH 24/86] Improve pull request template proposal (#56756) Looking through Kibana PRs many currently ignore the check boxes or just delete them. The goal here is to make the process easier, delete some unused options and align the checkboxes with what's most useful. We've had some discussions on the Uptime team about ways the PR template could be potentially improved. These changes are based on an extended discussion we had on the topic. We'd love to hear if other teams would be OK with these recommended changes. The changes here are: * Allow authors to just delete unnecessary items rather than strike through. Adding all the `~~` in markdown is painful * Remove the unnecessary checkbox for release notes, the build bot catches this and blocks merges without that being set. * Add a checkbox for testing in various browser sizes / mobile responsive devices * Move IE checkbox to the bottom of the list since it's seldom checked and makes the checklist seem daunting --- .github/PULL_REQUEST_TEMPLATE.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 5a80a11c5cbea..4cc0c8016f1d0 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -4,16 +4,15 @@ Summarize your PR. If it involves visual changes include a screenshot or gif. ### Checklist -Use ~~strikethroughs~~ to remove checklist items you don't feel are applicable to this PR. +Delete any items that are not applicable to this PR. -- [ ] This was checked for cross-browser compatibility, [including a check against IE11](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#cross-browser-compatibility) - [ ] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/master/packages/kbn-i18n/README.md) - [ ] [Documentation](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#writing-documentation) was added for features that require explanation or tutorials - [ ] [Unit or functional tests](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#cross-browser-compatibility) were updated or added to match the most common scenarios - [ ] This was checked for [keyboard-only and screenreader accessibility](https://developer.mozilla.org/en-US/docs/Learn/Tools_and_testing/Cross_browser_testing/Accessibility#Accessibility_testing_checklist) +- [ ] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server) +- [ ] This was checked for cross-browser compatibility, [including a check against IE11](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#cross-browser-compatibility) ### For maintainers - [ ] This was checked for breaking API changes and was [labeled appropriately](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#release-notes-process) -- [ ] This includes a feature addition or change that requires a release note and was [labeled appropriately](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#release-notes-process) - From 4d7c7b55f7df813b69b3a75d78f1bf1234ddf384 Mon Sep 17 00:00:00 2001 From: Aleh Zasypkin Date: Wed, 5 Feb 2020 10:29:21 +0100 Subject: [PATCH 25/86] Properly handle password change for users authenticated with provider other than `basic`. (#55206) --- .../server/alerts_client_factory.test.ts | 2 +- .../plugins/reporting/server/lib/get_user.ts | 19 +--- .../routes/lib/authorized_user_pre_routing.ts | 2 +- x-pack/legacy/plugins/security/index.js | 2 +- .../common/model/authenticated_user.mock.ts | 1 + .../common/model/authenticated_user.ts | 5 + .../account_management_page.test.tsx | 6 +- .../authentication/authenticator.test.ts | 71 +----------- .../server/authentication/authenticator.ts | 23 ++-- .../server/authentication/index.test.ts | 75 ++++++------- .../security/server/authentication/index.ts | 20 +--- .../server/authentication/providers/base.ts | 17 ++- .../server/authentication/providers/basic.ts | 5 + .../authentication/providers/kerberos.test.ts | 10 +- .../authentication/providers/kerberos.ts | 5 + .../authentication/providers/oidc.test.ts | 6 +- .../server/authentication/providers/oidc.ts | 7 +- .../authentication/providers/pki.test.ts | 12 +- .../server/authentication/providers/pki.ts | 5 + .../authentication/providers/saml.test.ts | 6 +- .../server/authentication/providers/saml.ts | 7 +- .../authentication/providers/token.test.ts | 10 +- .../server/authentication/providers/token.ts | 7 +- .../routes/authentication/common.test.ts | 13 +-- .../server/routes/authentication/common.ts | 8 +- .../routes/users/change_password.test.ts | 106 +++++++++++++++--- .../server/routes/users/change_password.ts | 77 +++++++------ .../apis/security/basic_login.js | 2 + .../apis/security/kerberos_login.ts | 2 + .../apis/authorization_code_flow/oidc_auth.js | 2 + .../apis/implicit_flow/oidc_auth.ts | 1 + .../apis/security/pki_auth.ts | 3 + .../apis/security/saml_login.ts | 2 + 33 files changed, 284 insertions(+), 255 deletions(-) diff --git a/x-pack/legacy/plugins/alerting/server/alerts_client_factory.test.ts b/x-pack/legacy/plugins/alerting/server/alerts_client_factory.test.ts index 754e02a3f1e5e..14c685237bf92 100644 --- a/x-pack/legacy/plugins/alerting/server/alerts_client_factory.test.ts +++ b/x-pack/legacy/plugins/alerting/server/alerts_client_factory.test.ts @@ -86,7 +86,7 @@ test('getUserName() returns a name when security is enabled', async () => { factory.create(KibanaRequest.from(fakeRequest), fakeRequest); const constructorCall = jest.requireMock('./alerts_client').AlertsClient.mock.calls[0][0]; - securityPluginSetup.authc.getCurrentUser.mockResolvedValueOnce({ username: 'bob' }); + securityPluginSetup.authc.getCurrentUser.mockReturnValueOnce({ username: 'bob' }); const userNameResult = await constructorCall.getUserName(); expect(userNameResult).toEqual('bob'); }); diff --git a/x-pack/legacy/plugins/reporting/server/lib/get_user.ts b/x-pack/legacy/plugins/reporting/server/lib/get_user.ts index 350004ddb78f8..ab02dfe0743f0 100644 --- a/x-pack/legacy/plugins/reporting/server/lib/get_user.ts +++ b/x-pack/legacy/plugins/reporting/server/lib/get_user.ts @@ -6,27 +6,14 @@ import { Legacy } from 'kibana'; import { KibanaRequest } from '../../../../../../src/core/server'; -import { Logger, ServerFacade } from '../../types'; +import { ServerFacade } from '../../types'; import { ReportingSetupDeps } from '../plugin'; -export function getUserFactory( - server: ServerFacade, - security: ReportingSetupDeps['security'], - logger: Logger -) { +export function getUserFactory(server: ServerFacade, security: ReportingSetupDeps['security']) { /* * Legacy.Request because this is called from routing middleware */ return async (request: Legacy.Request) => { - if (!security) { - return null; - } - - try { - return await security.authc.getCurrentUser(KibanaRequest.from(request)); - } catch (err) { - logger.error(err, ['getUser']); - return null; - } + return security?.authc.getCurrentUser(KibanaRequest.from(request)) ?? null; }; } diff --git a/x-pack/legacy/plugins/reporting/server/routes/lib/authorized_user_pre_routing.ts b/x-pack/legacy/plugins/reporting/server/routes/lib/authorized_user_pre_routing.ts index 874027251570c..57c3fcee222da 100644 --- a/x-pack/legacy/plugins/reporting/server/routes/lib/authorized_user_pre_routing.ts +++ b/x-pack/legacy/plugins/reporting/server/routes/lib/authorized_user_pre_routing.ts @@ -22,7 +22,7 @@ export const authorizedUserPreRoutingFactory = function authorizedUserPreRouting plugins: ReportingSetupDeps, logger: Logger ) { - const getUser = getUserFactory(server, plugins.security, logger); + const getUser = getUserFactory(server, plugins.security); const config = server.config(); return async function authorizedUserPreRouting(request: Legacy.Request) { diff --git a/x-pack/legacy/plugins/security/index.js b/x-pack/legacy/plugins/security/index.js index 4988c30a1398b..9016398463b5f 100644 --- a/x-pack/legacy/plugins/security/index.js +++ b/x-pack/legacy/plugins/security/index.js @@ -130,7 +130,7 @@ export const security = kibana => ); server.expose({ - getUser: request => securityPlugin.authc.getCurrentUser(KibanaRequest.from(request)), + getUser: async request => securityPlugin.authc.getCurrentUser(KibanaRequest.from(request)), }); initLoginView(securityPlugin, server); diff --git a/x-pack/plugins/security/common/model/authenticated_user.mock.ts b/x-pack/plugins/security/common/model/authenticated_user.mock.ts index 3a93efc57b5f6..220b284e76591 100644 --- a/x-pack/plugins/security/common/model/authenticated_user.mock.ts +++ b/x-pack/plugins/security/common/model/authenticated_user.mock.ts @@ -15,6 +15,7 @@ export function mockAuthenticatedUser(user: Partial = {}) { enabled: true, authentication_realm: { name: 'native1', type: 'native' }, lookup_realm: { name: 'native1', type: 'native' }, + authentication_provider: 'basic', ...user, }; } diff --git a/x-pack/plugins/security/common/model/authenticated_user.ts b/x-pack/plugins/security/common/model/authenticated_user.ts index 1b660ae919c09..6465b4a23eb48 100644 --- a/x-pack/plugins/security/common/model/authenticated_user.ts +++ b/x-pack/plugins/security/common/model/authenticated_user.ts @@ -26,6 +26,11 @@ export interface AuthenticatedUser extends User { * The name and type of the Realm where the user information were retrieved from. */ lookup_realm: UserRealm; + + /** + * Name of the Kibana authentication provider that used to authenticate user. + */ + authentication_provider: string; } export function canUserChangePassword(user: AuthenticatedUser) { diff --git a/x-pack/plugins/security/public/account_management/account_management_page.test.tsx b/x-pack/plugins/security/public/account_management/account_management_page.test.tsx index b7cf8e6dd1418..4caf3d25e887b 100644 --- a/x-pack/plugins/security/public/account_management/account_management_page.test.tsx +++ b/x-pack/plugins/security/public/account_management/account_management_page.test.tsx @@ -10,6 +10,7 @@ import { AuthenticatedUser } from '../../common/model'; import { AccountManagementPage } from './account_management_page'; import { coreMock } from 'src/core/public/mocks'; +import { mockAuthenticatedUser } from '../../common/model/authenticated_user.mock'; import { securityMock } from '../mocks'; import { userAPIClientMock } from '../management/users/index.mock'; @@ -19,11 +20,10 @@ interface Options { realm?: string; } const createUser = ({ withFullName = true, withEmail = true, realm = 'native' }: Options = {}) => { - return { + return mockAuthenticatedUser({ full_name: withFullName ? 'Casey Smith' : '', username: 'csmith', email: withEmail ? 'csmith@domain.com' : '', - enabled: true, roles: [], authentication_realm: { type: realm, @@ -33,7 +33,7 @@ const createUser = ({ withFullName = true, withEmail = true, realm = 'native' }: type: realm, name: realm, }, - }; + }); }; function getSecuritySetupMock({ currentUser }: { currentUser: AuthenticatedUser }) { diff --git a/x-pack/plugins/security/server/authentication/authenticator.test.ts b/x-pack/plugins/security/server/authentication/authenticator.test.ts index dd580c890bf94..8be1762133db6 100644 --- a/x-pack/plugins/security/server/authentication/authenticator.test.ts +++ b/x-pack/plugins/security/server/authentication/authenticator.test.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -jest.mock('./providers/basic', () => ({ BasicAuthenticationProvider: jest.fn() })); +jest.mock('./providers/basic'); import Boom from 'boom'; import { duration, Duration } from 'moment'; @@ -225,75 +225,6 @@ describe('Authenticator', () => { expect(mockSessionStorage.set).not.toHaveBeenCalled(); expect(mockSessionStorage.clear).toHaveBeenCalled(); }); - - describe('stateless login', () => { - it('does not create session even if authentication provider returns state', async () => { - const user = mockAuthenticatedUser(); - const request = httpServerMock.createKibanaRequest(); - const authorization = `Basic ${Buffer.from('foo:bar').toString('base64')}`; - - mockBasicAuthenticationProvider.login.mockResolvedValue( - AuthenticationResult.succeeded(user, { state: { authorization } }) - ); - - const authenticationResult = await authenticator.login(request, { - provider: 'basic', - value: {}, - stateless: true, - }); - expect(authenticationResult.succeeded()).toBe(true); - expect(authenticationResult.user).toEqual(user); - - expect(mockBasicAuthenticationProvider.login).toHaveBeenCalledWith(request, {}, null); - expect(mockSessionStorage.get).not.toHaveBeenCalled(); - expect(mockSessionStorage.set).not.toHaveBeenCalled(); - expect(mockSessionStorage.clear).not.toHaveBeenCalled(); - }); - - it('does not clear session even if provider asked to do so.', async () => { - const user = mockAuthenticatedUser(); - const request = httpServerMock.createKibanaRequest(); - - mockBasicAuthenticationProvider.login.mockResolvedValue( - AuthenticationResult.succeeded(user, { state: null }) - ); - - const authenticationResult = await authenticator.login(request, { - provider: 'basic', - value: {}, - stateless: true, - }); - expect(authenticationResult.succeeded()).toBe(true); - expect(authenticationResult.user).toEqual(user); - - expect(mockBasicAuthenticationProvider.login).toHaveBeenCalledWith(request, {}, null); - expect(mockSessionStorage.get).not.toHaveBeenCalled(); - expect(mockSessionStorage.set).not.toHaveBeenCalled(); - expect(mockSessionStorage.clear).not.toHaveBeenCalled(); - }); - - it('does not clear session even if provider failed with 401.', async () => { - const request = httpServerMock.createKibanaRequest(); - - const failureReason = Boom.unauthorized(); - mockBasicAuthenticationProvider.login.mockResolvedValue( - AuthenticationResult.failed(failureReason) - ); - - const authenticationResult = await authenticator.login(request, { - provider: 'basic', - value: {}, - stateless: true, - }); - expect(authenticationResult.failed()).toBe(true); - expect(authenticationResult.error).toBe(failureReason); - - expect(mockBasicAuthenticationProvider.login).toHaveBeenCalledWith(request, {}, null); - expect(mockSessionStorage.get).not.toHaveBeenCalled(); - expect(mockSessionStorage.set).not.toHaveBeenCalled(); - expect(mockSessionStorage.clear).not.toHaveBeenCalled(); - }); - }); }); describe('`authenticate` method', () => { diff --git a/x-pack/plugins/security/server/authentication/authenticator.ts b/x-pack/plugins/security/server/authentication/authenticator.ts index be952a154cee4..ea7792e902ec1 100644 --- a/x-pack/plugins/security/server/authentication/authenticator.ts +++ b/x-pack/plugins/security/server/authentication/authenticator.ts @@ -80,13 +80,6 @@ export interface ProviderLoginAttempt { * Login attempt can have any form and defined by the specific provider. */ value: unknown; - - /** - * Indicates whether login attempt should be performed in a "stateless" manner. If `true` provider - * performing login will neither be able to retrieve or update existing state if any nor persist - * any new state it may produce as a result of the login attempt. It's `false` by default. - */ - stateless?: boolean; } export interface AuthenticatorOptions { @@ -107,12 +100,12 @@ const providerMap = new Map< providerSpecificOptions?: AuthenticationProviderSpecificOptions ) => BaseAuthenticationProvider >([ - ['basic', BasicAuthenticationProvider], - ['kerberos', KerberosAuthenticationProvider], - ['saml', SAMLAuthenticationProvider], - ['token', TokenAuthenticationProvider], - ['oidc', OIDCAuthenticationProvider], - ['pki', PKIAuthenticationProvider], + [BasicAuthenticationProvider.type, BasicAuthenticationProvider], + [KerberosAuthenticationProvider.type, KerberosAuthenticationProvider], + [SAMLAuthenticationProvider.type, SAMLAuthenticationProvider], + [TokenAuthenticationProvider.type, TokenAuthenticationProvider], + [OIDCAuthenticationProvider.type, OIDCAuthenticationProvider], + [PKIAuthenticationProvider.type, PKIAuthenticationProvider], ]); function assertRequest(request: KibanaRequest) { @@ -254,7 +247,7 @@ export class Authenticator { // If we detect an existing session that belongs to a different provider than the one requested // to perform a login we should clear such session. - let existingSession = attempt.stateless ? null : await this.getSessionValue(sessionStorage); + let existingSession = await this.getSessionValue(sessionStorage); if (existingSession && existingSession.provider !== attempt.provider) { this.logger.debug( `Clearing existing session of another ("${existingSession.provider}") provider.` @@ -281,7 +274,7 @@ export class Authenticator { (authenticationResult.failed() && getErrorStatusCode(authenticationResult.error) === 401); if (existingSession && shouldClearSession) { sessionStorage.clear(); - } else if (!attempt.stateless && authenticationResult.shouldUpdateState()) { + } else if (authenticationResult.shouldUpdateState()) { const { idleTimeoutExpiration, lifespanExpiration } = this.calculateExpiry(existingSession); sessionStorage.set({ state: authenticationResult.state, diff --git a/x-pack/plugins/security/server/authentication/index.test.ts b/x-pack/plugins/security/server/authentication/index.test.ts index 0c1095b56e6e2..d0de6d571b7a0 100644 --- a/x-pack/plugins/security/server/authentication/index.test.ts +++ b/x-pack/plugins/security/server/authentication/index.test.ts @@ -10,7 +10,6 @@ jest.mock('./api_keys'); jest.mock('./authenticator'); import Boom from 'boom'; -import { errors } from 'elasticsearch'; import { first } from 'rxjs/operators'; import { @@ -27,7 +26,6 @@ import { AuthToolkit, IClusterClient, CoreSetup, - ElasticsearchErrorHelpers, KibanaRequest, LoggerFactory, ScopedClusterClient, @@ -289,67 +287,66 @@ describe('setupAuthentication()', () => { }); describe('getCurrentUser()', () => { - let getCurrentUser: (r: KibanaRequest) => Promise; + let getCurrentUser: (r: KibanaRequest) => AuthenticatedUser | null; beforeEach(async () => { getCurrentUser = (await setupAuthentication(mockSetupAuthenticationParams)).getCurrentUser; }); - it('returns `null` if Security is disabled', async () => { + it('returns `null` if Security is disabled', () => { mockSetupAuthenticationParams.license.isEnabled.mockReturnValue(false); - await expect(getCurrentUser(httpServerMock.createKibanaRequest())).resolves.toBe(null); + expect(getCurrentUser(httpServerMock.createKibanaRequest())).toBe(null); }); - it('fails if `authenticate` call fails', async () => { - const failureReason = new Error('Something went wrong'); - mockScopedClusterClient.callAsCurrentUser.mockRejectedValue(failureReason); + it('returns user from the auth state.', () => { + const mockUser = mockAuthenticatedUser(); - await expect(getCurrentUser(httpServerMock.createKibanaRequest())).rejects.toBe( - failureReason - ); + const mockAuthGet = mockSetupAuthenticationParams.http.auth.get as jest.Mock; + mockAuthGet.mockReturnValue({ state: mockUser }); + + const mockRequest = httpServerMock.createKibanaRequest(); + expect(getCurrentUser(mockRequest)).toBe(mockUser); + expect(mockAuthGet).toHaveBeenCalledTimes(1); + expect(mockAuthGet).toHaveBeenCalledWith(mockRequest); }); - it('returns result of `authenticate` call.', async () => { - const mockUser = mockAuthenticatedUser(); - mockScopedClusterClient.callAsCurrentUser.mockResolvedValue(mockUser); + it('returns null if auth state is not available.', () => { + const mockAuthGet = mockSetupAuthenticationParams.http.auth.get as jest.Mock; + mockAuthGet.mockReturnValue({}); - await expect(getCurrentUser(httpServerMock.createKibanaRequest())).resolves.toBe(mockUser); + const mockRequest = httpServerMock.createKibanaRequest(); + expect(getCurrentUser(mockRequest)).toBeNull(); + expect(mockAuthGet).toHaveBeenCalledTimes(1); + expect(mockAuthGet).toHaveBeenCalledWith(mockRequest); }); }); describe('isAuthenticated()', () => { - let isAuthenticated: (r: KibanaRequest) => Promise; + let isAuthenticated: (r: KibanaRequest) => boolean; beforeEach(async () => { isAuthenticated = (await setupAuthentication(mockSetupAuthenticationParams)).isAuthenticated; }); - it('returns `true` if Security is disabled', async () => { - mockSetupAuthenticationParams.license.isEnabled.mockReturnValue(false); - - await expect(isAuthenticated(httpServerMock.createKibanaRequest())).resolves.toBe(true); - }); + it('returns `true` if request is authenticated', () => { + const mockIsAuthenticated = mockSetupAuthenticationParams.http.auth + .isAuthenticated as jest.Mock; + mockIsAuthenticated.mockReturnValue(true); - it('returns `true` if `authenticate` succeeds.', async () => { - const mockUser = mockAuthenticatedUser(); - mockScopedClusterClient.callAsCurrentUser.mockResolvedValue(mockUser); - - await expect(isAuthenticated(httpServerMock.createKibanaRequest())).resolves.toBe(true); - }); - - it('returns `false` if `authenticate` fails with 401.', async () => { - const failureReason = ElasticsearchErrorHelpers.decorateNotAuthorizedError(new Error()); - mockScopedClusterClient.callAsCurrentUser.mockRejectedValue(failureReason); - - await expect(isAuthenticated(httpServerMock.createKibanaRequest())).resolves.toBe(false); + const mockRequest = httpServerMock.createKibanaRequest(); + expect(isAuthenticated(mockRequest)).toBe(true); + expect(mockIsAuthenticated).toHaveBeenCalledTimes(1); + expect(mockIsAuthenticated).toHaveBeenCalledWith(mockRequest); }); - it('fails if `authenticate` call fails with unknown reason', async () => { - const failureReason = new errors.BadRequest(); - mockScopedClusterClient.callAsCurrentUser.mockRejectedValue(failureReason); + it('returns `false` if request is not authenticated', () => { + const mockIsAuthenticated = mockSetupAuthenticationParams.http.auth + .isAuthenticated as jest.Mock; + mockIsAuthenticated.mockReturnValue(false); - await expect(isAuthenticated(httpServerMock.createKibanaRequest())).rejects.toBe( - failureReason - ); + const mockRequest = httpServerMock.createKibanaRequest(); + expect(isAuthenticated(mockRequest)).toBe(false); + expect(mockIsAuthenticated).toHaveBeenCalledTimes(1); + expect(mockIsAuthenticated).toHaveBeenCalledWith(mockRequest); }); }); diff --git a/x-pack/plugins/security/server/authentication/index.ts b/x-pack/plugins/security/server/authentication/index.ts index 1002ad7709b80..4b73430ff13c4 100644 --- a/x-pack/plugins/security/server/authentication/index.ts +++ b/x-pack/plugins/security/server/authentication/index.ts @@ -55,14 +55,12 @@ export async function setupAuthentication({ * Retrieves currently authenticated user associated with the specified request. * @param request */ - const getCurrentUser = async (request: KibanaRequest) => { + const getCurrentUser = (request: KibanaRequest) => { if (!license.isEnabled()) { return null; } - return (await clusterClient - .asScoped(request) - .callAsCurrentUser('shield.authenticate')) as AuthenticatedUser; + return (http.auth.get(request).state ?? null) as AuthenticatedUser | null; }; const isValid = (sessionValue: ProviderSession) => { @@ -180,18 +178,6 @@ export async function setupAuthentication({ apiKeys.create(request, params), invalidateAPIKey: (request: KibanaRequest, params: InvalidateAPIKeyParams) => apiKeys.invalidate(request, params), - isAuthenticated: async (request: KibanaRequest) => { - try { - await getCurrentUser(request); - } catch (err) { - // Don't swallow server errors. - if (getErrorStatusCode(err) !== 401) { - throw err; - } - return false; - } - - return true; - }, + isAuthenticated: (request: KibanaRequest) => http.auth.isAuthenticated(request), }; } diff --git a/x-pack/plugins/security/server/authentication/providers/base.ts b/x-pack/plugins/security/server/authentication/providers/base.ts index 12253f8d8f548..a40732768810d 100644 --- a/x-pack/plugins/security/server/authentication/providers/base.ts +++ b/x-pack/plugins/security/server/authentication/providers/base.ts @@ -11,6 +11,7 @@ import { IClusterClient, Headers, } from '../../../../../../src/core/server'; +import { deepFreeze } from '../../../../../../src/core/utils'; import { AuthenticatedUser } from '../../../common/model'; import { AuthenticationResult } from '../authentication_result'; import { DeauthenticationResult } from '../deauthentication_result'; @@ -35,6 +36,11 @@ export type AuthenticationProviderSpecificOptions = Record; * Base class that all authentication providers should extend. */ export abstract class BaseAuthenticationProvider { + /** + * Type of the provider. + */ + static readonly type: string; + /** * Logger instance bound to a specific provider context. */ @@ -85,8 +91,13 @@ export abstract class BaseAuthenticationProvider { * @param [authHeaders] Optional `Headers` dictionary to send with the request. */ protected async getUser(request: KibanaRequest, authHeaders: Headers = {}) { - return (await this.options.client - .asScoped({ headers: { ...request.headers, ...authHeaders } }) - .callAsCurrentUser('shield.authenticate')) as AuthenticatedUser; + return deepFreeze({ + ...(await this.options.client + .asScoped({ headers: { ...request.headers, ...authHeaders } }) + .callAsCurrentUser('shield.authenticate')), + // We use `this.constructor` trick to get access to the static `type` field of the specific + // `BaseAuthenticationProvider` subclass. + authentication_provider: (this.constructor as any).type, + } as AuthenticatedUser); } } diff --git a/x-pack/plugins/security/server/authentication/providers/basic.ts b/x-pack/plugins/security/server/authentication/providers/basic.ts index 07d141b4e1b2b..a8e4e8705a7a8 100644 --- a/x-pack/plugins/security/server/authentication/providers/basic.ts +++ b/x-pack/plugins/security/server/authentication/providers/basic.ts @@ -34,6 +34,11 @@ interface ProviderState { * Provider that supports request authentication via Basic HTTP Authentication. */ export class BasicAuthenticationProvider extends BaseAuthenticationProvider { + /** + * Type of the provider. + */ + static readonly type = 'basic'; + /** * Performs initial login request using username and password. * @param request Request instance. diff --git a/x-pack/plugins/security/server/authentication/providers/kerberos.test.ts b/x-pack/plugins/security/server/authentication/providers/kerberos.test.ts index e609afb6ae3f3..e4b4df3feeae2 100644 --- a/x-pack/plugins/security/server/authentication/providers/kerberos.test.ts +++ b/x-pack/plugins/security/server/authentication/providers/kerberos.test.ts @@ -155,7 +155,7 @@ describe('KerberosAuthenticationProvider', () => { expect(request.headers.authorization).toBe('negotiate spnego'); expect(authenticationResult.succeeded()).toBe(true); - expect(authenticationResult.user).toBe(user); + expect(authenticationResult.user).toEqual({ ...user, authentication_provider: 'kerberos' }); expect(authenticationResult.authHeaders).toEqual({ authorization: 'Bearer some-token' }); expect(authenticationResult.authResponseHeaders).toBeUndefined(); expect(authenticationResult.state).toEqual({ @@ -193,7 +193,7 @@ describe('KerberosAuthenticationProvider', () => { expect(request.headers.authorization).toBe('negotiate spnego'); expect(authenticationResult.succeeded()).toBe(true); - expect(authenticationResult.user).toBe(user); + expect(authenticationResult.user).toEqual({ ...user, authentication_provider: 'kerberos' }); expect(authenticationResult.authHeaders).toEqual({ authorization: 'Bearer some-token' }); expect(authenticationResult.authResponseHeaders).toEqual({ 'WWW-Authenticate': 'Negotiate response-token', @@ -337,7 +337,7 @@ describe('KerberosAuthenticationProvider', () => { expect(request.headers).not.toHaveProperty('authorization'); expect(authenticationResult.succeeded()).toBe(true); expect(authenticationResult.authHeaders).toEqual({ authorization }); - expect(authenticationResult.user).toBe(user); + expect(authenticationResult.user).toEqual({ ...user, authentication_provider: 'kerberos' }); expect(authenticationResult.state).toBeUndefined(); }); @@ -370,7 +370,7 @@ describe('KerberosAuthenticationProvider', () => { expect(authenticationResult.succeeded()).toBe(true); expect(authenticationResult.authHeaders).toEqual({ authorization: 'Bearer newfoo' }); - expect(authenticationResult.user).toEqual(user); + expect(authenticationResult.user).toEqual({ ...user, authentication_provider: 'kerberos' }); expect(authenticationResult.state).toEqual({ accessToken: 'newfoo', refreshToken: 'newbar' }); expect(request.headers).not.toHaveProperty('authorization'); }); @@ -437,7 +437,7 @@ describe('KerberosAuthenticationProvider', () => { expect(request.headers.authorization).toBe('Bearer some-valid-token'); expect(authenticationResult.succeeded()).toBe(true); expect(authenticationResult.authHeaders).toBeUndefined(); - expect(authenticationResult.user).toBe(user); + expect(authenticationResult.user).toEqual({ ...user, authentication_provider: 'kerberos' }); expect(authenticationResult.state).toBeUndefined(); }); diff --git a/x-pack/plugins/security/server/authentication/providers/kerberos.ts b/x-pack/plugins/security/server/authentication/providers/kerberos.ts index 767eab7b4311d..b8e3b7bc23790 100644 --- a/x-pack/plugins/security/server/authentication/providers/kerberos.ts +++ b/x-pack/plugins/security/server/authentication/providers/kerberos.ts @@ -43,6 +43,11 @@ const WWWAuthenticateHeaderName = 'WWW-Authenticate'; * Provider that supports Kerberos request authentication. */ export class KerberosAuthenticationProvider extends BaseAuthenticationProvider { + /** + * Type of the provider. + */ + static readonly type = 'kerberos'; + /** * Performs Kerberos request authentication. * @param request Request instance. diff --git a/x-pack/plugins/security/server/authentication/providers/oidc.test.ts b/x-pack/plugins/security/server/authentication/providers/oidc.test.ts index dd4f6820f89f3..dae3774955859 100644 --- a/x-pack/plugins/security/server/authentication/providers/oidc.test.ts +++ b/x-pack/plugins/security/server/authentication/providers/oidc.test.ts @@ -311,7 +311,7 @@ describe('OIDCAuthenticationProvider', () => { expect(request.headers).not.toHaveProperty('authorization'); expect(authenticationResult.succeeded()).toBe(true); expect(authenticationResult.authHeaders).toEqual({ authorization }); - expect(authenticationResult.user).toBe(user); + expect(authenticationResult.user).toEqual({ ...user, authentication_provider: 'oidc' }); expect(authenticationResult.state).toBeUndefined(); }); @@ -380,7 +380,7 @@ describe('OIDCAuthenticationProvider', () => { expect(authenticationResult.authHeaders).toEqual({ authorization: 'Bearer new-access-token', }); - expect(authenticationResult.user).toBe(user); + expect(authenticationResult.user).toEqual({ ...user, authentication_provider: 'oidc' }); expect(authenticationResult.state).toEqual({ accessToken: 'new-access-token', refreshToken: 'new-refresh-token', @@ -492,7 +492,7 @@ describe('OIDCAuthenticationProvider', () => { expect(request.headers.authorization).toBe('Bearer some-valid-token'); expect(authenticationResult.succeeded()).toBe(true); expect(authenticationResult.authHeaders).toBeUndefined(); - expect(authenticationResult.user).toBe(user); + expect(authenticationResult.user).toEqual({ ...user, authentication_provider: 'oidc' }); expect(authenticationResult.state).toBeUndefined(); }); diff --git a/x-pack/plugins/security/server/authentication/providers/oidc.ts b/x-pack/plugins/security/server/authentication/providers/oidc.ts index 3737123645379..f13a2ec05231a 100644 --- a/x-pack/plugins/security/server/authentication/providers/oidc.ts +++ b/x-pack/plugins/security/server/authentication/providers/oidc.ts @@ -6,9 +6,9 @@ import Boom from 'boom'; import type from 'type-detect'; -import { canRedirectRequest } from '../'; import { KibanaRequest } from '../../../../../../src/core/server'; import { AuthenticationResult } from '../authentication_result'; +import { canRedirectRequest } from '../can_redirect_request'; import { DeauthenticationResult } from '../deauthentication_result'; import { Tokens, TokenPair } from '../tokens'; import { @@ -62,6 +62,11 @@ interface ProviderState extends Partial { * Provider that supports authentication using an OpenID Connect realm in Elasticsearch. */ export class OIDCAuthenticationProvider extends BaseAuthenticationProvider { + /** + * Type of the provider. + */ + static readonly type = 'oidc'; + /** * Specifies Elasticsearch OIDC realm name that Kibana should use. */ diff --git a/x-pack/plugins/security/server/authentication/providers/pki.test.ts b/x-pack/plugins/security/server/authentication/providers/pki.test.ts index 76442733e7368..a2dda88c4680c 100644 --- a/x-pack/plugins/security/server/authentication/providers/pki.test.ts +++ b/x-pack/plugins/security/server/authentication/providers/pki.test.ts @@ -200,7 +200,7 @@ describe('PKIAuthenticationProvider', () => { expect(request.headers).not.toHaveProperty('authorization'); expect(authenticationResult.succeeded()).toBe(true); - expect(authenticationResult.user).toBe(user); + expect(authenticationResult.user).toEqual({ ...user, authentication_provider: 'pki' }); expect(authenticationResult.authHeaders).toEqual({ authorization: 'Bearer access-token' }); expect(authenticationResult.authResponseHeaders).toBeUndefined(); expect(authenticationResult.state).toEqual({ @@ -242,7 +242,7 @@ describe('PKIAuthenticationProvider', () => { expect(request.headers).not.toHaveProperty('authorization'); expect(authenticationResult.succeeded()).toBe(true); - expect(authenticationResult.user).toBe(user); + expect(authenticationResult.user).toEqual({ ...user, authentication_provider: 'pki' }); expect(authenticationResult.authHeaders).toEqual({ authorization: 'Bearer access-token' }); expect(authenticationResult.authResponseHeaders).toBeUndefined(); expect(authenticationResult.state).toEqual({ @@ -287,7 +287,7 @@ describe('PKIAuthenticationProvider', () => { expect(request.headers).not.toHaveProperty('authorization'); expect(authenticationResult.succeeded()).toBe(true); - expect(authenticationResult.user).toBe(user); + expect(authenticationResult.user).toEqual({ ...user, authentication_provider: 'pki' }); expect(authenticationResult.authHeaders).toEqual({ authorization: 'Bearer access-token' }); expect(authenticationResult.authResponseHeaders).toBeUndefined(); expect(authenticationResult.state).toEqual({ @@ -331,7 +331,7 @@ describe('PKIAuthenticationProvider', () => { expect(request.headers).not.toHaveProperty('authorization'); expect(authenticationResult.succeeded()).toBe(true); - expect(authenticationResult.user).toBe(user); + expect(authenticationResult.user).toEqual({ ...user, authentication_provider: 'pki' }); expect(authenticationResult.authHeaders).toEqual({ authorization: 'Bearer access-token' }); expect(authenticationResult.authResponseHeaders).toBeUndefined(); expect(authenticationResult.state).toEqual({ @@ -448,7 +448,7 @@ describe('PKIAuthenticationProvider', () => { expect(authenticationResult.authHeaders).toEqual({ authorization: `Bearer ${state.accessToken}`, }); - expect(authenticationResult.user).toBe(user); + expect(authenticationResult.user).toEqual({ ...user, authentication_provider: 'pki' }); expect(authenticationResult.state).toBeUndefined(); }); @@ -491,7 +491,7 @@ describe('PKIAuthenticationProvider', () => { expect(request.headers.authorization).toBe('Bearer some-valid-token'); expect(authenticationResult.succeeded()).toBe(true); expect(authenticationResult.authHeaders).toBeUndefined(); - expect(authenticationResult.user).toBe(user); + expect(authenticationResult.user).toEqual({ ...user, authentication_provider: 'pki' }); expect(authenticationResult.state).toBeUndefined(); }); diff --git a/x-pack/plugins/security/server/authentication/providers/pki.ts b/x-pack/plugins/security/server/authentication/providers/pki.ts index c7d431422a248..6d5aa9f01f2ea 100644 --- a/x-pack/plugins/security/server/authentication/providers/pki.ts +++ b/x-pack/plugins/security/server/authentication/providers/pki.ts @@ -44,6 +44,11 @@ function getRequestAuthenticationScheme(request: KibanaRequest) { * Provider that supports PKI request authentication. */ export class PKIAuthenticationProvider extends BaseAuthenticationProvider { + /** + * Type of the provider. + */ + static readonly type = 'pki'; + /** * Performs PKI request authentication. * @param request Request instance. diff --git a/x-pack/plugins/security/server/authentication/providers/saml.test.ts b/x-pack/plugins/security/server/authentication/providers/saml.test.ts index a5d1010a1bec8..c4fdf0b25061b 100644 --- a/x-pack/plugins/security/server/authentication/providers/saml.test.ts +++ b/x-pack/plugins/security/server/authentication/providers/saml.test.ts @@ -635,7 +635,7 @@ describe('SAMLAuthenticationProvider', () => { expect(request.headers).not.toHaveProperty('authorization'); expect(authenticationResult.succeeded()).toBe(true); expect(authenticationResult.authHeaders).toEqual({ authorization }); - expect(authenticationResult.user).toBe(user); + expect(authenticationResult.user).toEqual({ ...user, authentication_provider: 'saml' }); expect(authenticationResult.state).toBeUndefined(); }); @@ -696,7 +696,7 @@ describe('SAMLAuthenticationProvider', () => { expect(authenticationResult.authHeaders).toEqual({ authorization: 'Bearer new-access-token', }); - expect(authenticationResult.user).toBe(user); + expect(authenticationResult.user).toEqual({ ...user, authentication_provider: 'saml' }); expect(authenticationResult.state).toEqual({ username: 'user', accessToken: 'new-access-token', @@ -842,7 +842,7 @@ describe('SAMLAuthenticationProvider', () => { expect(request.headers.authorization).toBe('Bearer some-valid-token'); expect(authenticationResult.succeeded()).toBe(true); expect(authenticationResult.authHeaders).toBeUndefined(); - expect(authenticationResult.user).toBe(user); + expect(authenticationResult.user).toEqual({ ...user, authentication_provider: 'saml' }); expect(authenticationResult.state).toBeUndefined(); }); diff --git a/x-pack/plugins/security/server/authentication/providers/saml.ts b/x-pack/plugins/security/server/authentication/providers/saml.ts index faa19239fcc3b..a817159fcd445 100644 --- a/x-pack/plugins/security/server/authentication/providers/saml.ts +++ b/x-pack/plugins/security/server/authentication/providers/saml.ts @@ -10,8 +10,8 @@ import { KibanaRequest } from '../../../../../../src/core/server'; import { AuthenticationResult } from '../authentication_result'; import { DeauthenticationResult } from '../deauthentication_result'; import { AuthenticationProviderOptions, BaseAuthenticationProvider } from './base'; +import { canRedirectRequest } from '../can_redirect_request'; import { Tokens, TokenPair } from '../tokens'; -import { canRedirectRequest } from '..'; /** * The state supported by the provider (for the SAML handshake or established session). @@ -66,6 +66,11 @@ export function isSAMLRequestQuery(query: any): query is { SAMLRequest: string } * Provider that supports SAML request authentication. */ export class SAMLAuthenticationProvider extends BaseAuthenticationProvider { + /** + * Type of the provider. + */ + static readonly type = 'saml'; + /** * Specifies Elasticsearch SAML realm name that Kibana should use. */ diff --git a/x-pack/plugins/security/server/authentication/providers/token.test.ts b/x-pack/plugins/security/server/authentication/providers/token.test.ts index 3d377140cb42e..0a55219e25d91 100644 --- a/x-pack/plugins/security/server/authentication/providers/token.test.ts +++ b/x-pack/plugins/security/server/authentication/providers/token.test.ts @@ -48,7 +48,7 @@ describe('TokenAuthenticationProvider', () => { const authenticationResult = await provider.login(request, credentials); expect(authenticationResult.succeeded()).toBe(true); - expect(authenticationResult.user).toEqual(user); + expect(authenticationResult.user).toEqual({ ...user, authentication_provider: 'token' }); expect(authenticationResult.state).toEqual(tokenPair); expect(authenticationResult.authHeaders).toEqual({ authorization }); }); @@ -140,7 +140,7 @@ describe('TokenAuthenticationProvider', () => { const authenticationResult = await provider.authenticate(request); expect(authenticationResult.succeeded()).toBe(true); - expect(authenticationResult.user).toEqual(user); + expect(authenticationResult.user).toEqual({ ...user, authentication_provider: 'token' }); expect(authenticationResult.authHeaders).toBeUndefined(); expect(authenticationResult.state).toBeUndefined(); }); @@ -158,7 +158,7 @@ describe('TokenAuthenticationProvider', () => { const authenticationResult = await provider.authenticate(request, tokenPair); expect(authenticationResult.succeeded()).toBe(true); - expect(authenticationResult.user).toEqual(user); + expect(authenticationResult.user).toEqual({ ...user, authentication_provider: 'token' }); expect(authenticationResult.state).toBeUndefined(); expect(authenticationResult.authHeaders).toEqual({ authorization }); expect(request.headers).not.toHaveProperty('authorization'); @@ -192,7 +192,7 @@ describe('TokenAuthenticationProvider', () => { sinon.assert.calledOnce(mockOptions.tokens.refresh); expect(authenticationResult.succeeded()).toBe(true); - expect(authenticationResult.user).toEqual(user); + expect(authenticationResult.user).toEqual({ ...user, authentication_provider: 'token' }); expect(authenticationResult.state).toEqual({ accessToken: 'newfoo', refreshToken: 'newbar' }); expect(authenticationResult.authHeaders).toEqual({ authorization: 'Bearer newfoo' }); expect(request.headers).not.toHaveProperty('authorization'); @@ -231,7 +231,7 @@ describe('TokenAuthenticationProvider', () => { const authenticationResult = await provider.authenticate(request, tokenPair); expect(authenticationResult.succeeded()).toBe(true); - expect(authenticationResult.user).toEqual(user); + expect(authenticationResult.user).toEqual({ ...user, authentication_provider: 'token' }); expect(authenticationResult.state).toBeUndefined(); expect(authenticationResult.authHeaders).toBeUndefined(); expect(request.headers.authorization).toEqual('Bearer foo-from-header'); diff --git a/x-pack/plugins/security/server/authentication/providers/token.ts b/x-pack/plugins/security/server/authentication/providers/token.ts index c5f8f07e50b11..03fd003e2cbde 100644 --- a/x-pack/plugins/security/server/authentication/providers/token.ts +++ b/x-pack/plugins/security/server/authentication/providers/token.ts @@ -9,8 +9,8 @@ import { KibanaRequest } from '../../../../../../src/core/server'; import { AuthenticationResult } from '../authentication_result'; import { DeauthenticationResult } from '../deauthentication_result'; import { BaseAuthenticationProvider } from './base'; +import { canRedirectRequest } from '../can_redirect_request'; import { Tokens, TokenPair } from '../tokens'; -import { canRedirectRequest } from '..'; /** * Describes the parameters that are required by the provider to process the initial login request. @@ -29,6 +29,11 @@ type ProviderState = TokenPair; * Provider that supports token-based request authentication. */ export class TokenAuthenticationProvider extends BaseAuthenticationProvider { + /** + * Type of the provider. + */ + static readonly type = 'token'; + /** * Performs initial login request using username and password. * @param request Request instance. diff --git a/x-pack/plugins/security/server/routes/authentication/common.test.ts b/x-pack/plugins/security/server/routes/authentication/common.test.ts index 5d5868d4cc593..4666b5abad756 100644 --- a/x-pack/plugins/security/server/routes/authentication/common.test.ts +++ b/x-pack/plugins/security/server/routes/authentication/common.test.ts @@ -176,20 +176,9 @@ describe('Common authentication routes', () => { expect(routeConfig.validate).toBe(false); }); - it('returns 500 if cannot retrieve current user due to unhandled exception.', async () => { - const unhandledException = new Error('Something went wrong.'); - authc.getCurrentUser.mockRejectedValue(unhandledException); - - const response = await routeHandler(mockContext, mockRequest, kibanaResponseFactory); - - expect(response.status).toBe(500); - expect(response.payload).toEqual(unhandledException); - expect(authc.getCurrentUser).toHaveBeenCalledWith(mockRequest); - }); - it('returns current user.', async () => { const mockUser = mockAuthenticatedUser(); - authc.getCurrentUser.mockResolvedValue(mockUser); + authc.getCurrentUser.mockReturnValue(mockUser); const response = await routeHandler(mockContext, mockRequest, kibanaResponseFactory); diff --git a/x-pack/plugins/security/server/routes/authentication/common.ts b/x-pack/plugins/security/server/routes/authentication/common.ts index cb4ec196459ee..c9856e9dff7f1 100644 --- a/x-pack/plugins/security/server/routes/authentication/common.ts +++ b/x-pack/plugins/security/server/routes/authentication/common.ts @@ -59,7 +59,7 @@ export function defineCommonRoutes({ router, authc, basePath, logger }: RouteDef for (const path of ['/internal/security/me', '/api/security/v1/me']) { router.get( { path, validate: false }, - createLicensedRouteHandler(async (context, request, response) => { + createLicensedRouteHandler((context, request, response) => { if (path === '/api/security/v1/me') { logger.warn( `The "${basePath.serverBasePath}${path}" endpoint is deprecated and will be removed in the next major version.`, @@ -67,11 +67,7 @@ export function defineCommonRoutes({ router, authc, basePath, logger }: RouteDef ); } - try { - return response.ok({ body: (await authc.getCurrentUser(request)) as any }); - } catch (error) { - return response.customError(wrapIntoCustomErrorResponse(error)); - } + return response.ok({ body: authc.getCurrentUser(request)! }); }) ); } diff --git a/x-pack/plugins/security/server/routes/users/change_password.test.ts b/x-pack/plugins/security/server/routes/users/change_password.test.ts index 80a25e03ede62..34509edc2e9d2 100644 --- a/x-pack/plugins/security/server/routes/users/change_password.test.ts +++ b/x-pack/plugins/security/server/routes/users/change_password.test.ts @@ -4,6 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ +import { errors } from 'elasticsearch'; import { ObjectType } from '@kbn/config-schema'; import { IClusterClient, @@ -13,6 +14,7 @@ import { RequestHandler, RequestHandlerContext, RouteConfig, + ScopeableRequest, } from '../../../../../../src/core/server'; import { LICENSE_CHECK_STATE } from '../../../../licensing/server'; import { Authentication, AuthenticationResult } from '../../authentication'; @@ -38,10 +40,7 @@ describe('Change password', () => { let routeConfig: RouteConfig; let mockContext: RequestHandlerContext; - function checkPasswordChangeAPICall( - username: string, - request: ReturnType - ) { + function checkPasswordChangeAPICall(username: string, request: ScopeableRequest) { expect(mockClusterClient.asScoped).toHaveBeenCalledTimes(1); expect(mockClusterClient.asScoped).toHaveBeenCalledWith(request); expect(mockScopedClusterClient.callAsCurrentUser).toHaveBeenCalledTimes(1); @@ -55,8 +54,14 @@ describe('Change password', () => { router = httpServiceMock.createRouter(); authc = authenticationMock.create(); - authc.getCurrentUser.mockResolvedValue(mockAuthenticatedUser({ username: 'user' })); + authc.getCurrentUser.mockReturnValue(mockAuthenticatedUser({ username: 'user' })); authc.login.mockResolvedValue(AuthenticationResult.succeeded(mockAuthenticatedUser())); + authc.getSessionInfo.mockResolvedValue({ + now: Date.now(), + idleTimeoutExpiration: null, + lifespanExpiration: null, + provider: 'basic', + }); mockScopedClusterClient = elasticsearchServiceMock.createScopedClusterClient(); mockClusterClient = elasticsearchServiceMock.createClusterClient(); @@ -122,14 +127,24 @@ describe('Change password', () => { }); it('returns 403 if old password is wrong.', async () => { - const loginFailureReason = new Error('Something went wrong.'); - authc.login.mockResolvedValue(AuthenticationResult.failed(loginFailureReason)); + const changePasswordFailure = new (errors.AuthenticationException as any)('Unauthorized', { + body: { error: { header: { 'WWW-Authenticate': 'Negotiate' } } }, + }); + mockScopedClusterClient.callAsCurrentUser.mockRejectedValue(changePasswordFailure); const response = await routeHandler(mockContext, mockRequest, kibanaResponseFactory); expect(response.status).toBe(403); - expect(response.payload).toEqual(loginFailureReason); - expect(mockScopedClusterClient.callAsCurrentUser).not.toHaveBeenCalled(); + expect(response.payload).toEqual(changePasswordFailure); + + expect(mockScopedClusterClient.callAsCurrentUser).toHaveBeenCalledTimes(1); + expect(mockClusterClient.asScoped).toHaveBeenCalledTimes(1); + expect(mockClusterClient.asScoped).toHaveBeenCalledWith({ + headers: { + ...mockRequest.headers, + authorization: `Basic ${Buffer.from(`${username}:old-password`).toString('base64')}`, + }, + }); }); it(`returns 401 if user can't authenticate with new password.`, async () => { @@ -148,10 +163,15 @@ describe('Change password', () => { expect(response.status).toBe(401); expect(response.payload).toEqual(loginFailureReason); - checkPasswordChangeAPICall(username, mockRequest); + checkPasswordChangeAPICall(username, { + headers: { + ...mockRequest.headers, + authorization: `Basic ${Buffer.from(`${username}:old-password`).toString('base64')}`, + }, + }); }); - it('returns 500 if password update request fails.', async () => { + it('returns 500 if password update request fails with non-401 error.', async () => { const failureReason = new Error('Request failed.'); mockScopedClusterClient.callAsCurrentUser.mockRejectedValue(failureReason); @@ -160,7 +180,12 @@ describe('Change password', () => { expect(response.status).toBe(500); expect(response.payload).toEqual(failureReason); - checkPasswordChangeAPICall(username, mockRequest); + checkPasswordChangeAPICall(username, { + headers: { + ...mockRequest.headers, + authorization: `Basic ${Buffer.from(`${username}:old-password`).toString('base64')}`, + }, + }); }); it('successfully changes own password if provided old password is correct.', async () => { @@ -169,7 +194,62 @@ describe('Change password', () => { expect(response.status).toBe(204); expect(response.payload).toBeUndefined(); - checkPasswordChangeAPICall(username, mockRequest); + checkPasswordChangeAPICall(username, { + headers: { + ...mockRequest.headers, + authorization: `Basic ${Buffer.from(`${username}:old-password`).toString('base64')}`, + }, + }); + + expect(authc.login).toHaveBeenCalledTimes(1); + expect(authc.login).toHaveBeenCalledWith(mockRequest, { + provider: 'basic', + value: { username, password: 'new-password' }, + }); + }); + + it('successfully changes own password if provided old password is correct for non-basic provider.', async () => { + const mockUser = mockAuthenticatedUser({ + username: 'user', + authentication_provider: 'token', + }); + authc.getCurrentUser.mockReturnValue(mockUser); + authc.login.mockResolvedValue(AuthenticationResult.succeeded(mockUser)); + + const response = await routeHandler(mockContext, mockRequest, kibanaResponseFactory); + + expect(response.status).toBe(204); + expect(response.payload).toBeUndefined(); + + checkPasswordChangeAPICall(username, { + headers: { + ...mockRequest.headers, + authorization: `Basic ${Buffer.from(`${username}:old-password`).toString('base64')}`, + }, + }); + + expect(authc.login).toHaveBeenCalledTimes(1); + expect(authc.login).toHaveBeenCalledWith(mockRequest, { + provider: 'token', + value: { username, password: 'new-password' }, + }); + }); + + it('successfully changes own password but does not re-login if current session does not exist.', async () => { + authc.getSessionInfo.mockResolvedValue(null); + const response = await routeHandler(mockContext, mockRequest, kibanaResponseFactory); + + expect(response.status).toBe(204); + expect(response.payload).toBeUndefined(); + + checkPasswordChangeAPICall(username, { + headers: { + ...mockRequest.headers, + authorization: `Basic ${Buffer.from(`${username}:old-password`).toString('base64')}`, + }, + }); + + expect(authc.login).not.toHaveBeenCalled(); }); }); diff --git a/x-pack/plugins/security/server/routes/users/change_password.ts b/x-pack/plugins/security/server/routes/users/change_password.ts index b9d04b4bd1e0e..fc3ca4573d500 100644 --- a/x-pack/plugins/security/server/routes/users/change_password.ts +++ b/x-pack/plugins/security/server/routes/users/change_password.ts @@ -5,7 +5,8 @@ */ import { schema } from '@kbn/config-schema'; -import { wrapIntoCustomErrorResponse } from '../../errors'; +import { canUserChangePassword } from '../../../common/model'; +import { getErrorStatusCode, wrapIntoCustomErrorResponse } from '../../errors'; import { createLicensedRouteHandler } from '../licensed_route_handler'; import { RouteDefinitionParams } from '..'; @@ -13,7 +14,6 @@ export function defineChangeUserPasswordRoutes({ authc, router, clusterClient, - config, }: RouteDefinitionParams) { router.post( { @@ -27,54 +27,65 @@ export function defineChangeUserPasswordRoutes({ }, }, createLicensedRouteHandler(async (context, request, response) => { - const username = request.params.username; - const { password, newPassword } = request.body; - const isCurrentUser = username === (await authc.getCurrentUser(request))!.username; + const { username } = request.params; + const { password: currentPassword, newPassword } = request.body; - // We should prefer `token` over `basic` if possible. - const providerToLoginWith = config.authc.providers.includes('token') ? 'token' : 'basic'; + const currentUser = authc.getCurrentUser(request); + const isUserChangingOwnPassword = + currentUser && currentUser.username === username && canUserChangePassword(currentUser); + const currentSession = isUserChangingOwnPassword ? await authc.getSessionInfo(request) : null; - // If user tries to change own password, let's check if old password is valid first by trying - // to login. - if (isCurrentUser) { - try { - const authenticationResult = await authc.login(request, { - provider: providerToLoginWith, - value: { username, password }, - // We shouldn't alter authentication state just yet. - stateless: true, - }); - - if (!authenticationResult.succeeded()) { - return response.forbidden({ body: authenticationResult.error }); - } - } catch (error) { - return response.customError(wrapIntoCustomErrorResponse(error)); - } - } + // If user is changing their own password they should provide a proof of knowledge their + // current password via sending it in `Authorization: Basic base64(username:current password)` + // HTTP header no matter how they logged in to Kibana. + const scopedClusterClient = clusterClient.asScoped( + isUserChangingOwnPassword + ? { + headers: { + ...request.headers, + authorization: `Basic ${Buffer.from(`${username}:${currentPassword}`).toString( + 'base64' + )}`, + }, + } + : request + ); try { - await clusterClient.asScoped(request).callAsCurrentUser('shield.changePassword', { + await scopedClusterClient.callAsCurrentUser('shield.changePassword', { username, body: { password: newPassword }, }); + } catch (error) { + // This may happen only if user's credentials are rejected meaning that current password + // isn't correct. + if (isUserChangingOwnPassword && getErrorStatusCode(error) === 401) { + return response.forbidden({ body: error }); + } + + return response.customError(wrapIntoCustomErrorResponse(error)); + } - // Now we authenticate user with the new password again updating current session if any. - if (isCurrentUser) { + // If user previously had an active session and changed their own password we should re-login + // user with the new password and update session. We check this since it's possible to update + // password even if user is authenticated via HTTP headers and hence doesn't have an active + // session and in such cases we shouldn't create a new one. + if (isUserChangingOwnPassword && currentSession) { + try { const authenticationResult = await authc.login(request, { - provider: providerToLoginWith, + provider: currentUser!.authentication_provider, value: { username, password: newPassword }, }); if (!authenticationResult.succeeded()) { return response.unauthorized({ body: authenticationResult.error }); } + } catch (error) { + return response.customError(wrapIntoCustomErrorResponse(error)); } - - return response.noContent(); - } catch (error) { - return response.customError(wrapIntoCustomErrorResponse(error)); } + + return response.noContent(); }) ); } diff --git a/x-pack/test/api_integration/apis/security/basic_login.js b/x-pack/test/api_integration/apis/security/basic_login.js index 62deedad6c35c..d4b41603944f6 100644 --- a/x-pack/test/api_integration/apis/security/basic_login.js +++ b/x-pack/test/api_integration/apis/security/basic_login.js @@ -126,6 +126,7 @@ export default function({ getService }) { 'enabled', 'authentication_realm', 'lookup_realm', + 'authentication_provider', ]); expect(apiResponse.body.username).to.be(validUsername); }); @@ -165,6 +166,7 @@ export default function({ getService }) { 'enabled', 'authentication_realm', 'lookup_realm', + 'authentication_provider', ]); expect(apiResponse.body.username).to.be(validUsername); }); diff --git a/x-pack/test/kerberos_api_integration/apis/security/kerberos_login.ts b/x-pack/test/kerberos_api_integration/apis/security/kerberos_login.ts index 203f90c55aa82..570d7026cf99e 100644 --- a/x-pack/test/kerberos_api_integration/apis/security/kerberos_login.ts +++ b/x-pack/test/kerberos_api_integration/apis/security/kerberos_login.ts @@ -74,6 +74,7 @@ export default function({ getService }: FtrProviderContext) { expect(user.username).to.eql(username); expect(user.authentication_realm).to.eql({ name: 'reserved', type: 'reserved' }); + expect(user.authentication_provider).to.eql('basic'); }); describe('initiating SPNEGO', () => { @@ -129,6 +130,7 @@ export default function({ getService }: FtrProviderContext) { enabled: true, authentication_realm: { name: 'kerb1', type: 'kerberos' }, lookup_realm: { name: 'kerb1', type: 'kerberos' }, + authentication_provider: 'kerberos', }); }); diff --git a/x-pack/test/oidc_api_integration/apis/authorization_code_flow/oidc_auth.js b/x-pack/test/oidc_api_integration/apis/authorization_code_flow/oidc_auth.js index 57bcd1b041c49..094537fd61436 100644 --- a/x-pack/test/oidc_api_integration/apis/authorization_code_flow/oidc_auth.js +++ b/x-pack/test/oidc_api_integration/apis/authorization_code_flow/oidc_auth.js @@ -173,6 +173,7 @@ export default function({ getService }) { 'enabled', 'authentication_realm', 'lookup_realm', + 'authentication_provider', ]); expect(apiResponse.body.username).to.be('user1'); @@ -222,6 +223,7 @@ export default function({ getService }) { 'enabled', 'authentication_realm', 'lookup_realm', + 'authentication_provider', ]); expect(apiResponse.body.username).to.be('user2'); diff --git a/x-pack/test/oidc_api_integration/apis/implicit_flow/oidc_auth.ts b/x-pack/test/oidc_api_integration/apis/implicit_flow/oidc_auth.ts index 1f5a64835416a..7d013e97732f9 100644 --- a/x-pack/test/oidc_api_integration/apis/implicit_flow/oidc_auth.ts +++ b/x-pack/test/oidc_api_integration/apis/implicit_flow/oidc_auth.ts @@ -142,6 +142,7 @@ export default function({ getService }: FtrProviderContext) { 'enabled', 'authentication_realm', 'lookup_realm', + 'authentication_provider', ]); expect(apiResponse.body.username).to.be('user1'); diff --git a/x-pack/test/pki_api_integration/apis/security/pki_auth.ts b/x-pack/test/pki_api_integration/apis/security/pki_auth.ts index 186ed824b3b6c..1ae7488fcf379 100644 --- a/x-pack/test/pki_api_integration/apis/security/pki_auth.ts +++ b/x-pack/test/pki_api_integration/apis/security/pki_auth.ts @@ -90,6 +90,7 @@ export default function({ getService }: FtrProviderContext) { expect(user.username).to.eql(username); expect(user.authentication_realm).to.eql({ name: 'reserved', type: 'reserved' }); + expect(user.authentication_provider).to.eql('basic'); }); it('should properly set cookie and authenticate user', async () => { @@ -118,6 +119,7 @@ export default function({ getService }: FtrProviderContext) { }, authentication_realm: { name: 'pki1', type: 'pki' }, lookup_realm: { name: 'pki1', type: 'pki' }, + authentication_provider: 'pki', }); // Cookie should be accepted. @@ -160,6 +162,7 @@ export default function({ getService }: FtrProviderContext) { }, authentication_realm: { name: 'pki1', type: 'pki' }, lookup_realm: { name: 'pki1', type: 'pki' }, + authentication_provider: 'pki', }); checkCookieIsSet(request.cookie(response.headers['set-cookie'][0])!); diff --git a/x-pack/test/saml_api_integration/apis/security/saml_login.ts b/x-pack/test/saml_api_integration/apis/security/saml_login.ts index 0436d59906ea8..6ede8aadeb5a7 100644 --- a/x-pack/test/saml_api_integration/apis/security/saml_login.ts +++ b/x-pack/test/saml_api_integration/apis/security/saml_login.ts @@ -56,6 +56,7 @@ export default function({ getService }: FtrProviderContext) { 'enabled', 'authentication_realm', 'lookup_realm', + 'authentication_provider', ]); expect(apiResponse.body.username).to.be('a@b.c'); @@ -88,6 +89,7 @@ export default function({ getService }: FtrProviderContext) { expect(user.username).to.eql(username); expect(user.authentication_realm).to.eql({ name: 'reserved', type: 'reserved' }); + expect(user.authentication_provider).to.eql('basic'); }); describe('capture URL fragment', () => { From a0b73cf2996863491b75f002d2eaddc86f26c6a2 Mon Sep 17 00:00:00 2001 From: Anton Dosov Date: Wed, 5 Feb 2020 13:43:09 +0100 Subject: [PATCH 26/86] improve validation on tuncate field formater editor (#56521) Co-authored-by: Elastic Machine --- .../__snapshots__/truncate.test.js.snap | 1 + .../editors/truncate/truncate.js | 11 +++- .../editors/truncate/truncate.test.js | 56 +++++++++++++++++++ .../field_formats/converters/truncate.test.ts | 7 +++ 4 files changed, 73 insertions(+), 2 deletions(-) diff --git a/src/legacy/ui/public/field_editor/components/field_format_editor/editors/truncate/__snapshots__/truncate.test.js.snap b/src/legacy/ui/public/field_editor/components/field_format_editor/editors/truncate/__snapshots__/truncate.test.js.snap index c0954491a2a47..729487dfae5d7 100644 --- a/src/legacy/ui/public/field_editor/components/field_format_editor/editors/truncate/__snapshots__/truncate.test.js.snap +++ b/src/legacy/ui/public/field_editor/components/field_format_editor/editors/truncate/__snapshots__/truncate.test.js.snap @@ -21,6 +21,7 @@ exports[`TruncateFormatEditor should render normally 1`] = ` > diff --git a/src/legacy/ui/public/field_editor/components/field_format_editor/editors/truncate/truncate.js b/src/legacy/ui/public/field_editor/components/field_format_editor/editors/truncate/truncate.js index fdae8627ead69..9a9b6c954b78d 100644 --- a/src/legacy/ui/public/field_editor/components/field_format_editor/editors/truncate/truncate.js +++ b/src/legacy/ui/public/field_editor/components/field_format_editor/editors/truncate/truncate.js @@ -38,7 +38,7 @@ export class TruncateFormatEditor extends DefaultFormatEditor { } render() { - const { formatParams } = this.props; + const { formatParams, onError } = this.props; const { error, samples } = this.state; return ( @@ -55,8 +55,15 @@ export class TruncateFormatEditor extends DefaultFormatEditor { > { - this.onChange({ fieldLength: e.target.value ? Number(e.target.value) : null }); + if (e.target.checkValidity()) { + this.onChange({ + fieldLength: e.target.value ? Number(e.target.value) : null, + }); + } else { + onError(e.target.validationMessage); + } }} isInvalid={!!error} /> diff --git a/src/legacy/ui/public/field_editor/components/field_format_editor/editors/truncate/truncate.test.js b/src/legacy/ui/public/field_editor/components/field_format_editor/editors/truncate/truncate.test.js index e98dd4edca386..7ab6f2a9cbeb0 100644 --- a/src/legacy/ui/public/field_editor/components/field_format_editor/editors/truncate/truncate.test.js +++ b/src/legacy/ui/public/field_editor/components/field_format_editor/editors/truncate/truncate.test.js @@ -19,6 +19,7 @@ import React from 'react'; import { shallow } from 'enzyme'; +import { EuiFieldNumber } from '@elastic/eui'; import { TruncateFormatEditor } from './truncate'; @@ -34,6 +35,11 @@ const onChange = jest.fn(); const onError = jest.fn(); describe('TruncateFormatEditor', () => { + beforeEach(() => { + onChange.mockClear(); + onError.mockClear(); + }); + it('should have a formatId', () => { expect(TruncateFormatEditor.formatId).toEqual('truncate'); }); @@ -50,4 +56,54 @@ describe('TruncateFormatEditor', () => { ); expect(component).toMatchSnapshot(); }); + + it('should fire error, when input is invalid', async () => { + const component = shallow( + + ); + const input = component.find(EuiFieldNumber); + + const changeEvent = { + target: { + value: '123.3', + checkValidity: () => false, + validationMessage: 'Error!', + }, + }; + await input.invoke('onChange')(changeEvent); + + expect(onError).toBeCalledWith(changeEvent.target.validationMessage); + expect(onChange).not.toBeCalled(); + }); + + it('should fire change, when input changed and is valid', async () => { + const component = shallow( + + ); + const input = component.find(EuiFieldNumber); + + const changeEvent = { + target: { + value: '123', + checkValidity: () => true, + validationMessage: null, + }, + }; + onError.mockClear(); + await input.invoke('onChange')(changeEvent); + expect(onError).not.toBeCalled(); + expect(onChange).toBeCalledWith({ fieldLength: 123 }); + }); }); diff --git a/src/plugins/data/common/field_formats/converters/truncate.test.ts b/src/plugins/data/common/field_formats/converters/truncate.test.ts index 472d9673346d7..3a0abc918fa98 100644 --- a/src/plugins/data/common/field_formats/converters/truncate.test.ts +++ b/src/plugins/data/common/field_formats/converters/truncate.test.ts @@ -43,4 +43,11 @@ describe('String TruncateFormat', () => { expect(truncate.convert('This is some text')).toBe('This is some text'); }); + + test('does not truncate whole text when non integer is passed in', () => { + // https://github.com/elastic/kibana/issues/29648 + const truncate = new TruncateFormat({ fieldLength: 3.2 }, jest.fn()); + + expect(truncate.convert('This is some text')).toBe('Thi...'); + }); }); From 3cb85d407027a118103ff02c90747673529f1af1 Mon Sep 17 00:00:00 2001 From: Shahzad Date: Wed, 5 Feb 2020 13:53:34 +0100 Subject: [PATCH 27/86] [Uptime] Kuery Bar Filters break overview page (#56793) * update filter * fix status panel not using filter group --- .../components/connected/charts/ping_histogram.tsx | 9 +++++---- .../connected/charts/snapshot_container.tsx | 11 +++++++---- .../connected/pages/overview_container.ts | 11 ++++++++++- .../uptime/public/hooks/update_kuery_string.ts | 14 -------------- .../plugins/uptime/public/pages/overview.tsx | 14 ++++++++++++-- .../plugins/uptime/public/state/selectors/index.ts | 7 ++++++- 6 files changed, 40 insertions(+), 26 deletions(-) diff --git a/x-pack/legacy/plugins/uptime/public/components/connected/charts/ping_histogram.tsx b/x-pack/legacy/plugins/uptime/public/components/connected/charts/ping_histogram.tsx index cbdd921a36e81..50f91be4ff09f 100644 --- a/x-pack/legacy/plugins/uptime/public/components/connected/charts/ping_histogram.tsx +++ b/x-pack/legacy/plugins/uptime/public/components/connected/charts/ping_histogram.tsx @@ -19,7 +19,7 @@ import { useUrlParams } from '../../../hooks'; type Props = ResponsiveWrapperProps & Pick & - DispatchProps & { lastRefresh: number; monitorId?: string }; + DispatchProps & { lastRefresh: number; monitorId?: string; esKuery?: string }; const PingHistogramContainer: React.FC = ({ data, @@ -28,6 +28,7 @@ const PingHistogramContainer: React.FC = ({ lastRefresh, height, loading, + esKuery, }) => { const [getUrlParams] = useUrlParams(); const { @@ -36,12 +37,11 @@ const PingHistogramContainer: React.FC = ({ dateRangeStart: dateStart, dateRangeEnd: dateEnd, statusFilter, - filters, } = getUrlParams(); useEffect(() => { - loadData({ monitorId, dateStart, dateEnd, statusFilter, filters }); - }, [loadData, dateStart, dateEnd, monitorId, filters, statusFilter, lastRefresh]); + loadData({ monitorId, dateStart, dateEnd, statusFilter, filters: esKuery }); + }, [loadData, dateStart, dateEnd, monitorId, statusFilter, lastRefresh, esKuery]); return ( = ({ height, lastRefresh, loading, + esKuery, loadSnapshotCount, }: Props) => { const [getUrlParams] = useUrlParams(); - const { dateRangeStart, dateRangeEnd, statusFilter, filters } = getUrlParams(); + const { dateRangeStart, dateRangeEnd, statusFilter } = getUrlParams(); useEffect(() => { - loadSnapshotCount(dateRangeStart, dateRangeEnd, filters, statusFilter); - }, [dateRangeStart, dateRangeEnd, filters, lastRefresh, loadSnapshotCount, statusFilter]); + loadSnapshotCount(dateRangeStart, dateRangeEnd, esKuery, statusFilter); + }, [dateRangeStart, dateRangeEnd, esKuery, lastRefresh, loadSnapshotCount, statusFilter]); return ; }; @@ -66,11 +68,12 @@ export const Container: React.FC = ({ */ const mapStateToProps = ({ snapshot: { count, loading }, - ui: { lastRefresh }, + ui: { lastRefresh, esKuery }, }: AppState): StoreProps => ({ count, lastRefresh, loading, + esKuery, }); /** diff --git a/x-pack/legacy/plugins/uptime/public/components/connected/pages/overview_container.ts b/x-pack/legacy/plugins/uptime/public/components/connected/pages/overview_container.ts index 406fab8f5bf01..cbd1fae77c518 100644 --- a/x-pack/legacy/plugins/uptime/public/components/connected/pages/overview_container.ts +++ b/x-pack/legacy/plugins/uptime/public/components/connected/pages/overview_container.ts @@ -8,7 +8,16 @@ import { connect } from 'react-redux'; import { OverviewPageComponent } from '../../../pages/overview'; import { selectIndexPattern } from '../../../state/selectors'; import { AppState } from '../../../state'; +import { setEsKueryString } from '../../../state/actions'; + +interface DispatchProps { + setEsKueryFilters: typeof setEsKueryString; +} + +const mapDispatchToProps = (dispatch: any): DispatchProps => ({ + setEsKueryFilters: (esFilters: string) => dispatch(setEsKueryString(esFilters)), +}); const mapStateToProps = (state: AppState) => ({ indexPattern: selectIndexPattern(state) }); -export const OverviewPage = connect(mapStateToProps)(OverviewPageComponent); +export const OverviewPage = connect(mapStateToProps, mapDispatchToProps)(OverviewPageComponent); diff --git a/x-pack/legacy/plugins/uptime/public/hooks/update_kuery_string.ts b/x-pack/legacy/plugins/uptime/public/hooks/update_kuery_string.ts index 8c9eec3abe223..8a4ae01a72b4b 100644 --- a/x-pack/legacy/plugins/uptime/public/hooks/update_kuery_string.ts +++ b/x-pack/legacy/plugins/uptime/public/hooks/update_kuery_string.ts @@ -6,20 +6,8 @@ import { combineFiltersAndUserSearch, stringifyKueries } from '../lib/helper'; import { esKuery } from '../../../../../../src/plugins/data/common/es_query'; -import { store } from '../state'; -import { setEsKueryString } from '../state/actions'; import { IIndexPattern } from '../../../../../../src/plugins/data/common/index_patterns'; -const updateEsQueryForFilterGroup = (filterQueryString: string, indexPattern: IIndexPattern) => { - // Update EsQuery in Redux to be used in FilterGroup - const searchDSL: string = filterQueryString - ? JSON.stringify( - esKuery.toElasticsearchQuery(esKuery.fromKueryExpression(filterQueryString), indexPattern) - ) - : ''; - store.dispatch(setEsKueryString(searchDSL)); -}; - const getKueryString = (urlFilters: string): string => { let kueryString = ''; // We are using try/catch here because this is user entered value @@ -56,8 +44,6 @@ export const useUpdateKueryString = ( esFilters = JSON.stringify(elasticsearchQuery); } - updateEsQueryForFilterGroup(filterQueryString, indexPattern); - return [esFilters]; } catch (err) { return [urlFilters, err]; diff --git a/x-pack/legacy/plugins/uptime/public/pages/overview.tsx b/x-pack/legacy/plugins/uptime/public/pages/overview.tsx index df6ffba6154e5..ce5fb619aca02 100644 --- a/x-pack/legacy/plugins/uptime/public/pages/overview.tsx +++ b/x-pack/legacy/plugins/uptime/public/pages/overview.tsx @@ -5,7 +5,7 @@ */ import { EuiFlexGroup, EuiFlexItem, EuiSpacer } from '@elastic/eui'; -import React, { useContext } from 'react'; +import React, { useContext, useEffect } from 'react'; import styled from 'styled-components'; import { EmptyState, @@ -27,6 +27,7 @@ interface OverviewPageProps { autocomplete: DataPublicPluginStart['autocomplete']; setBreadcrumbs: UMUpdateBreadcrumbs; indexPattern: IIndexPattern; + setEsKueryFilters: (esFilters: string) => void; } type Props = OverviewPageProps; @@ -40,7 +41,12 @@ const EuiFlexItemStyled = styled(EuiFlexItem)` } `; -export const OverviewPageComponent = ({ autocomplete, setBreadcrumbs, indexPattern }: Props) => { +export const OverviewPageComponent = ({ + autocomplete, + setBreadcrumbs, + indexPattern, + setEsKueryFilters, +}: Props) => { const { colors } = useContext(UptimeThemeContext); const [getUrlParams] = useUrlParams(); const { absoluteDateRangeStart, absoluteDateRangeEnd, ...params } = getUrlParams(); @@ -60,6 +66,10 @@ export const OverviewPageComponent = ({ autocomplete, setBreadcrumbs, indexPatte const [esFilters, error] = useUpdateKueryString(indexPattern, search, urlFilters); + useEffect(() => { + setEsKueryFilters(esFilters ?? ''); + }, [esFilters, setEsKueryFilters]); + const sharedProps = { dateRangeStart, dateRangeEnd, diff --git a/x-pack/legacy/plugins/uptime/public/state/selectors/index.ts b/x-pack/legacy/plugins/uptime/public/state/selectors/index.ts index fe6a7a1b7eade..25498cc0cb0ee 100644 --- a/x-pack/legacy/plugins/uptime/public/state/selectors/index.ts +++ b/x-pack/legacy/plugins/uptime/public/state/selectors/index.ts @@ -34,5 +34,10 @@ export const selectIndexPattern = ({ indexPattern }: AppState) => { }; export const selectPingHistogram = ({ ping, ui }: AppState) => { - return { data: ping.pingHistogram, loading: ping.loading, lastRefresh: ui.lastRefresh }; + return { + data: ping.pingHistogram, + loading: ping.loading, + lastRefresh: ui.lastRefresh, + esKuery: ui.esKuery, + }; }; From 2bb46732e19663331a7207df5c015b69a9fc54c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Fern=C3=A1ndez=20Haro?= Date: Wed, 5 Feb 2020 14:08:30 +0000 Subject: [PATCH 28/86] [Telemetry] Report Kibana distro in local collectors + Usage Collectors in TS (#55859) * [Telemetry] Report Kibana distro in local collectors + Usage Collectors in TS * Ensure isReady is a function * Move CollectorSet tests to TS + Jest * Fix test Co-authored-by: Elastic Machine --- .../usage/telemetry_usage_collector.test.ts | 2 +- .../{get_kibana.js => get_kibana.ts} | 45 ++++-- .../telemetry_collection/get_local_stats.ts | 11 +- .../collector/{collector.js => collector.ts} | 67 ++++---- ...collector_set.js => collector_set.test.ts} | 145 +++++++++++++----- .../server/collector/collector_set.ts | 27 ++-- .../server/collector/index.ts | 2 - .../server/collector/usage_collector.js | 51 ------ .../server/collector/usage_collector.ts | 37 +++++ .../collectors/cloud_usage_collector.test.ts | 5 +- 10 files changed, 239 insertions(+), 153 deletions(-) rename src/legacy/core_plugins/telemetry/server/telemetry_collection/{get_kibana.js => get_kibana.ts} (62%) rename src/plugins/usage_collection/server/collector/{collector.js => collector.ts} (59%) rename src/plugins/usage_collection/server/collector/{__tests__/collector_set.js => collector_set.test.ts} (53%) delete mode 100644 src/plugins/usage_collection/server/collector/usage_collector.js create mode 100644 src/plugins/usage_collection/server/collector/usage_collector.ts diff --git a/src/legacy/core_plugins/telemetry/server/collectors/usage/telemetry_usage_collector.test.ts b/src/legacy/core_plugins/telemetry/server/collectors/usage/telemetry_usage_collector.test.ts index cf6059faf0c05..78685cd6becc8 100644 --- a/src/legacy/core_plugins/telemetry/server/collectors/usage/telemetry_usage_collector.test.ts +++ b/src/legacy/core_plugins/telemetry/server/collectors/usage/telemetry_usage_collector.test.ts @@ -136,7 +136,7 @@ describe('telemetry_usage_collector', () => { const collectorOptions = createTelemetryUsageCollector(usageCollector, server); expect(collectorOptions.type).toBe('static_telemetry'); - expect(await collectorOptions.fetch()).toEqual(expectedObject); + expect(await collectorOptions.fetch({} as any)).toEqual(expectedObject); // Sending any as the callCluster client because it's not needed in this collector but TS requires it when calling it. }); }); }); diff --git a/src/legacy/core_plugins/telemetry/server/telemetry_collection/get_kibana.js b/src/legacy/core_plugins/telemetry/server/telemetry_collection/get_kibana.ts similarity index 62% rename from src/legacy/core_plugins/telemetry/server/telemetry_collection/get_kibana.js rename to src/legacy/core_plugins/telemetry/server/telemetry_collection/get_kibana.ts index e65606a83afc8..537d5a85911cd 100644 --- a/src/legacy/core_plugins/telemetry/server/telemetry_collection/get_kibana.js +++ b/src/legacy/core_plugins/telemetry/server/telemetry_collection/get_kibana.ts @@ -17,9 +17,27 @@ * under the License. */ -import { get, omit } from 'lodash'; +import { omit } from 'lodash'; +import { UsageCollectionSetup } from 'src/plugins/usage_collection/server'; +import { CallCluster } from 'src/legacy/core_plugins/elasticsearch'; -export function handleKibanaStats(server, response) { +export interface KibanaUsageStats { + kibana: { + index: string; + }; + kibana_stats: { + os: { + platform: string; + platformRelease: string; + distro?: string; + distroRelease?: string; + }; + }; + + [plugin: string]: any; +} + +export function handleKibanaStats(server: any, response?: KibanaUsageStats) { if (!response) { server.log( ['warning', 'telemetry', 'local-stats'], @@ -30,8 +48,17 @@ export function handleKibanaStats(server, response) { const { kibana, kibana_stats: kibanaStats, ...plugins } = response; - const platform = get(kibanaStats, 'os.platform', 'unknown'); - const platformRelease = get(kibanaStats, 'os.platformRelease', 'unknown'); + const os = { + platform: 'unknown', + platformRelease: 'unknown', + ...kibanaStats.os, + }; + const formattedOsStats = Object.entries(os).reduce((acc, [key, value]) => { + return { + ...acc, + [`${key}s`]: [{ [key]: value, count: 1 }], + }; + }, {}); const version = server .config() @@ -44,16 +71,16 @@ export function handleKibanaStats(server, response) { ...omit(kibana, 'index'), // discard index count: 1, indices: 1, - os: { - platforms: [{ platform, count: 1 }], - platformReleases: [{ platformRelease, count: 1 }], - }, + os: formattedOsStats, versions: [{ version, count: 1 }], plugins, }; } -export async function getKibana(usageCollection, callWithInternalUser) { +export async function getKibana( + usageCollection: UsageCollectionSetup, + callWithInternalUser: CallCluster +): Promise { const usage = await usageCollection.bulkFetch(callWithInternalUser); return usageCollection.toObject(usage); } diff --git a/src/legacy/core_plugins/telemetry/server/telemetry_collection/get_local_stats.ts b/src/legacy/core_plugins/telemetry/server/telemetry_collection/get_local_stats.ts index a4ea2eb534226..8adb6d237bee8 100644 --- a/src/legacy/core_plugins/telemetry/server/telemetry_collection/get_local_stats.ts +++ b/src/legacy/core_plugins/telemetry/server/telemetry_collection/get_local_stats.ts @@ -22,18 +22,25 @@ import { get, omit } from 'lodash'; import { getClusterInfo } from './get_cluster_info'; import { getClusterStats } from './get_cluster_stats'; // @ts-ignore -import { getKibana, handleKibanaStats } from './get_kibana'; +import { getKibana, handleKibanaStats, KibanaUsageStats } from './get_kibana'; import { StatsGetter } from '../collection_manager'; /** * Handle the separate local calls by combining them into a single object response that looks like the * "cluster_stats" document from X-Pack monitoring. * + * @param {Object} server ?? * @param {Object} clusterInfo Cluster info (GET /) * @param {Object} clusterStats Cluster stats (GET /_cluster/stats) + * @param {Object} kibana The Kibana Usage stats * @return {Object} A combined object containing the different responses. */ -export function handleLocalStats(server: any, clusterInfo: any, clusterStats: any, kibana: any) { +export function handleLocalStats( + server: any, + clusterInfo: any, + clusterStats: any, + kibana: KibanaUsageStats +) { return { timestamp: new Date().toISOString(), cluster_uuid: get(clusterInfo, 'cluster_uuid'), diff --git a/src/plugins/usage_collection/server/collector/collector.js b/src/plugins/usage_collection/server/collector/collector.ts similarity index 59% rename from src/plugins/usage_collection/server/collector/collector.js rename to src/plugins/usage_collection/server/collector/collector.ts index 54d18ec2b8a7f..e102dc2a64ee8 100644 --- a/src/plugins/usage_collection/server/collector/collector.js +++ b/src/plugins/usage_collection/server/collector/collector.ts @@ -17,7 +17,30 @@ * under the License. */ -export class Collector { +import { Logger } from 'kibana/server'; +import { CallCluster } from 'src/legacy/core_plugins/elasticsearch'; + +export type CollectorFormatForBulkUpload = (result: T) => { type: string; payload: U }; + +export interface CollectorOptions { + type: string; + init?: Function; + fetch: (callCluster: CallCluster) => Promise | T; + /* + * A hook for allowing the fetched data payload to be organized into a typed + * data model for internal bulk upload. See defaultFormatterForBulkUpload for + * a generic example. + */ + formatForBulkUpload?: CollectorFormatForBulkUpload; + isReady: () => Promise | boolean; +} + +export class Collector { + public readonly type: CollectorOptions['type']; + public readonly init?: CollectorOptions['init']; + public readonly fetch: CollectorOptions['fetch']; + private readonly _formatForBulkUpload?: CollectorFormatForBulkUpload; + public readonly isReady: CollectorOptions['isReady']; /* * @param {Object} logger - logger object * @param {String} options.type - property name as the key for the data @@ -27,8 +50,8 @@ export class Collector { * @param {Function} options.rest - optional other properties */ constructor( - logger, - { type, init, fetch, formatForBulkUpload = null, isReady = null, ...options } = {} + protected readonly log: Logger, + { type, init, fetch, formatForBulkUpload, isReady, ...options }: CollectorOptions ) { if (type === undefined) { throw new Error('Collector must be instantiated with a options.type string property'); @@ -42,41 +65,27 @@ export class Collector { throw new Error('Collector must be instantiated with a options.fetch function property'); } - this.log = logger; - Object.assign(this, options); // spread in other properties and mutate "this" this.type = type; this.init = init; this.fetch = fetch; - - const defaultFormatterForBulkUpload = result => ({ type, payload: result }); - this._formatForBulkUpload = formatForBulkUpload || defaultFormatterForBulkUpload; - if (typeof isReady === 'function') { - this.isReady = isReady; - } + this.isReady = typeof isReady === 'function' ? isReady : () => true; + this._formatForBulkUpload = formatForBulkUpload; } - /* - * @param {Function} callCluster - callCluster function - */ - fetchInternal(callCluster) { - if (typeof callCluster !== 'function') { - throw new Error('A `callCluster` function must be passed to the fetch methods of collectors'); + public formatForBulkUpload(result: T) { + if (this._formatForBulkUpload) { + return this._formatForBulkUpload(result); + } else { + return this.defaultFormatterForBulkUpload(result); } - return this.fetch(callCluster); - } - - /* - * A hook for allowing the fetched data payload to be organized into a typed - * data model for internal bulk upload. See defaultFormatterForBulkUpload for - * a generic example. - */ - formatForBulkUpload(result) { - return this._formatForBulkUpload(result); } - isReady() { - throw `isReady() must be implemented in ${this.type} collector`; + protected defaultFormatterForBulkUpload(result: T) { + return { + type: this.type, + payload: result, + }; } } diff --git a/src/plugins/usage_collection/server/collector/__tests__/collector_set.js b/src/plugins/usage_collection/server/collector/collector_set.test.ts similarity index 53% rename from src/plugins/usage_collection/server/collector/__tests__/collector_set.js rename to src/plugins/usage_collection/server/collector/collector_set.test.ts index 397499650e054..c85880c34d72b 100644 --- a/src/plugins/usage_collection/server/collector/__tests__/collector_set.js +++ b/src/plugins/usage_collection/server/collector/collector_set.test.ts @@ -18,58 +18,62 @@ */ import { noop } from 'lodash'; -import sinon from 'sinon'; -import expect from '@kbn/expect'; -import { Collector } from '../collector'; -import { CollectorSet } from '../collector_set'; -import { UsageCollector } from '../usage_collector'; - -const mockLogger = () => ({ - debug: sinon.spy(), - warn: sinon.spy(), -}); +import { Collector } from './collector'; +import { CollectorSet } from './collector_set'; +import { UsageCollector } from './usage_collector'; +import { loggingServiceMock } from '../../../../core/server/mocks'; + +const logger = loggingServiceMock.createLogger(); + +const loggerSpies = { + debug: jest.spyOn(logger, 'debug'), + warn: jest.spyOn(logger, 'warn'), +}; describe('CollectorSet', () => { describe('registers a collector set and runs lifecycle events', () => { - let init; - let fetch; + let init: Function; + let fetch: Function; beforeEach(() => { init = noop; fetch = noop; + loggerSpies.debug.mockRestore(); + loggerSpies.warn.mockRestore(); }); + const mockCallCluster = () => Promise.resolve({ passTest: 1000 }); + it('should throw an error if non-Collector type of object is registered', () => { - const logger = mockLogger(); const collectors = new CollectorSet({ logger }); const registerPojo = () => { collectors.registerCollector({ type: 'type_collector_test', init, fetch, - }); + } as any); // We are intentionally sending it wrong. }; - expect(registerPojo).to.throwException(({ message }) => { - expect(message).to.be('CollectorSet can only have Collector instances registered'); - }); + expect(registerPojo).toThrowError( + 'CollectorSet can only have Collector instances registered' + ); }); it('should log debug status of fetching from the collector', async () => { - const mockCallCluster = () => Promise.resolve({ passTest: 1000 }); - const logger = mockLogger(); const collectors = new CollectorSet({ logger }); collectors.registerCollector( new Collector(logger, { type: 'MY_TEST_COLLECTOR', - fetch: caller => caller(), + fetch: (caller: any) => caller(), + isReady: () => true, }) ); - const result = await collectors.bulkFetch(mockCallCluster); - const calls = logger.debug.getCalls(); - expect(calls.length).to.be(1); - expect(calls[0].args).to.eql(['Fetching data from MY_TEST_COLLECTOR collector']); - expect(result).to.eql([ + const result = await collectors.bulkFetch(mockCallCluster as any); + expect(loggerSpies.debug).toHaveBeenCalledTimes(1); + expect(loggerSpies.debug).toHaveBeenCalledWith( + 'Fetching data from MY_TEST_COLLECTOR collector' + ); + expect(result).toStrictEqual([ { type: 'MY_TEST_COLLECTOR', result: { passTest: 1000 }, @@ -78,32 +82,90 @@ describe('CollectorSet', () => { }); it('should gracefully handle a collector fetch method throwing an error', async () => { - const mockCallCluster = () => Promise.resolve({ passTest: 1000 }); - const logger = mockLogger(); const collectors = new CollectorSet({ logger }); collectors.registerCollector( new Collector(logger, { type: 'MY_TEST_COLLECTOR', fetch: () => new Promise((_resolve, reject) => reject()), + isReady: () => true, }) ); let result; try { - result = await collectors.bulkFetch(mockCallCluster); + result = await collectors.bulkFetch(mockCallCluster as any); } catch (err) { // Do nothing } // This must return an empty object instead of null/undefined - expect(result).to.eql([]); + expect(result).toStrictEqual([]); + }); + + it('should not break if isReady is not a function', async () => { + const collectors = new CollectorSet({ logger }); + collectors.registerCollector( + new Collector(logger, { + type: 'MY_TEST_COLLECTOR', + fetch: () => ({ test: 1 }), + isReady: true as any, + }) + ); + + const result = await collectors.bulkFetch(mockCallCluster as any); + expect(result).toStrictEqual([ + { + type: 'MY_TEST_COLLECTOR', + result: { test: 1 }, + }, + ]); + }); + + it('should not break if isReady is not provided', async () => { + const collectors = new CollectorSet({ logger }); + collectors.registerCollector( + new Collector(logger, { + type: 'MY_TEST_COLLECTOR', + fetch: () => ({ test: 1 }), + } as any) + ); + + const result = await collectors.bulkFetch(mockCallCluster as any); + expect(result).toStrictEqual([ + { + type: 'MY_TEST_COLLECTOR', + result: { test: 1 }, + }, + ]); + }); + + it('should infer the types from the implementations of fetch and formatForBulkUpload', async () => { + const collectors = new CollectorSet({ logger }); + collectors.registerCollector( + new Collector(logger, { + type: 'MY_TEST_COLLECTOR', + fetch: () => ({ test: 1 }), + formatForBulkUpload: result => ({ + type: 'MY_TEST_COLLECTOR', + payload: { test: result.test * 2 }, + }), + isReady: () => true, + }) + ); + + const result = await collectors.bulkFetch(mockCallCluster as any); + expect(result).toStrictEqual([ + { + type: 'MY_TEST_COLLECTOR', + result: { test: 1 }, // It matches the return of `fetch`. `formatForBulkUpload` is used later on + }, + ]); }); }); describe('toApiFieldNames', () => { - let collectorSet; + let collectorSet: CollectorSet; beforeEach(() => { - const logger = mockLogger(); collectorSet = new CollectorSet({ logger }); }); @@ -126,7 +188,7 @@ describe('CollectorSet', () => { }; const result = collectorSet.toApiFieldNames(apiData); - expect(result).to.eql({ + expect(result).toStrictEqual({ os: { load: { '15m': 2.3525390625, '1m': 2.22412109375, '5m': 2.4462890625 }, memory: { free_bytes: 458280960, total_bytes: 17179869184, used_bytes: 16721588224 }, @@ -155,7 +217,7 @@ describe('CollectorSet', () => { }; const result = collectorSet.toApiFieldNames(apiData); - expect(result).to.eql({ + expect(result).toStrictEqual({ days_of_the_week: [ { day_index: 1, day_name: 'monday' }, { day_index: 2, day_name: 'tuesday' }, @@ -166,21 +228,20 @@ describe('CollectorSet', () => { }); describe('isUsageCollector', () => { - const collectorOptions = { type: 'MY_TEST_COLLECTOR', fetch: () => {} }; + const collectorOptions = { type: 'MY_TEST_COLLECTOR', fetch: () => {}, isReady: () => true }; it('returns true only for UsageCollector instances', () => { - const logger = mockLogger(); const collectors = new CollectorSet({ logger }); const usageCollector = new UsageCollector(logger, collectorOptions); const collector = new Collector(logger, collectorOptions); const randomClass = new (class Random {})(); - expect(collectors.isUsageCollector(usageCollector)).to.be(true); - expect(collectors.isUsageCollector(collector)).to.be(false); - expect(collectors.isUsageCollector(randomClass)).to.be(false); - expect(collectors.isUsageCollector({})).to.be(false); - expect(collectors.isUsageCollector(null)).to.be(false); - expect(collectors.isUsageCollector('')).to.be(false); - expect(collectors.isUsageCollector()).to.be(false); + expect(collectors.isUsageCollector(usageCollector)).toEqual(true); + expect(collectors.isUsageCollector(collector)).toEqual(false); + expect(collectors.isUsageCollector(randomClass)).toEqual(false); + expect(collectors.isUsageCollector({})).toEqual(false); + expect(collectors.isUsageCollector(null)).toEqual(false); + expect(collectors.isUsageCollector('')).toEqual(false); + expect(collectors.isUsageCollector(void 0)).toEqual(false); }); }); }); diff --git a/src/plugins/usage_collection/server/collector/collector_set.ts b/src/plugins/usage_collection/server/collector/collector_set.ts index a87accc47535e..6cc5d057b080a 100644 --- a/src/plugins/usage_collection/server/collector/collector_set.ts +++ b/src/plugins/usage_collection/server/collector/collector_set.ts @@ -20,39 +20,37 @@ import { snakeCase } from 'lodash'; import { Logger } from 'kibana/server'; import { CallCluster } from 'src/legacy/core_plugins/elasticsearch'; -// @ts-ignore -import { Collector } from './collector'; -// @ts-ignore +import { Collector, CollectorOptions } from './collector'; import { UsageCollector } from './usage_collector'; interface CollectorSetConfig { logger: Logger; - maximumWaitTimeForAllCollectorsInS: number; - collectors?: Collector[]; + maximumWaitTimeForAllCollectorsInS?: number; + collectors?: Array>; } export class CollectorSet { private _waitingForAllCollectorsTimestamp?: number; private logger: Logger; private readonly maximumWaitTimeForAllCollectorsInS: number; - private collectors: Collector[] = []; + private collectors: Array> = []; constructor({ logger, maximumWaitTimeForAllCollectorsInS, collectors = [] }: CollectorSetConfig) { this.logger = logger; this.collectors = collectors; this.maximumWaitTimeForAllCollectorsInS = maximumWaitTimeForAllCollectorsInS || 60; } - public makeStatsCollector = (options: any) => { + public makeStatsCollector = (options: CollectorOptions) => { return new Collector(this.logger, options); }; - public makeUsageCollector = (options: any) => { + public makeUsageCollector = (options: CollectorOptions) => { return new UsageCollector(this.logger, options); }; /* * @param collector {Collector} collector object */ - public registerCollector = (collector: Collector) => { + public registerCollector = (collector: Collector) => { // check instanceof if (!(collector instanceof Collector)) { throw new Error('CollectorSet can only have Collector instances registered'); @@ -115,7 +113,7 @@ export class CollectorSet { public bulkFetch = async ( callCluster: CallCluster, - collectors: Collector[] = this.collectors + collectors: Array> = this.collectors ) => { const responses = []; for (const collector of collectors) { @@ -123,7 +121,7 @@ export class CollectorSet { try { responses.push({ type: collector.type, - result: await collector.fetchInternal(callCluster), + result: await collector.fetch(callCluster), }); } catch (err) { this.logger.warn(err); @@ -148,14 +146,13 @@ export class CollectorSet { }; // convert an array of fetched stats results into key/object - public toObject = (statsData: any) => { - if (!statsData) return {}; - return statsData.reduce((accumulatedStats: any, { type, result }: any) => { + public toObject = (statsData: Array<{ type: string; result: T }> = []) => { + return statsData.reduce((accumulatedStats, { type, result }) => { return { ...accumulatedStats, [type]: result, }; - }, {}); + }, {} as Result); }; // rename fields to use api conventions diff --git a/src/plugins/usage_collection/server/collector/index.ts b/src/plugins/usage_collection/server/collector/index.ts index 962f61474c250..0d3939e1dc681 100644 --- a/src/plugins/usage_collection/server/collector/index.ts +++ b/src/plugins/usage_collection/server/collector/index.ts @@ -18,7 +18,5 @@ */ export { CollectorSet } from './collector_set'; -// @ts-ignore export { Collector } from './collector'; -// @ts-ignore export { UsageCollector } from './usage_collector'; diff --git a/src/plugins/usage_collection/server/collector/usage_collector.js b/src/plugins/usage_collection/server/collector/usage_collector.js deleted file mode 100644 index 54863474dbd01..0000000000000 --- a/src/plugins/usage_collection/server/collector/usage_collector.js +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { KIBANA_STATS_TYPE } from '../../common/constants'; -import { Collector } from './collector'; - -export class UsageCollector extends Collector { - /* - * @param {Object} logger - logger object - * @param {String} options.type - property name as the key for the data - * @param {Function} options.init (optional) - initialization function - * @param {Function} options.fetch - function to query data - * @param {Function} options.formatForBulkUpload - optional - * @param {Function} options.rest - optional other properties - */ - constructor(logger, { type, init, fetch, formatForBulkUpload = null, ...options } = {}) { - super(logger, { type, init, fetch, formatForBulkUpload, ...options }); - - /* - * Currently, for internal bulk uploading, usage stats are part of - * `kibana_stats` type, under the `usage` namespace in the document. - */ - const defaultUsageFormatterForBulkUpload = result => { - return { - type: KIBANA_STATS_TYPE, - payload: { - usage: { - [type]: result, - }, - }, - }; - }; - this._formatForBulkUpload = formatForBulkUpload || defaultUsageFormatterForBulkUpload; - } -} diff --git a/src/plugins/usage_collection/server/collector/usage_collector.ts b/src/plugins/usage_collection/server/collector/usage_collector.ts new file mode 100644 index 0000000000000..05c701bd3abf4 --- /dev/null +++ b/src/plugins/usage_collection/server/collector/usage_collector.ts @@ -0,0 +1,37 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { KIBANA_STATS_TYPE } from '../../common/constants'; +import { Collector } from './collector'; + +export class UsageCollector extends Collector< + T, + U +> { + protected defaultUsageFormatterForBulkUpload(result: T) { + return { + type: KIBANA_STATS_TYPE, + payload: { + usage: { + [this.type]: result, + }, + }, + }; + } +} diff --git a/x-pack/plugins/cloud/server/collectors/cloud_usage_collector.test.ts b/x-pack/plugins/cloud/server/collectors/cloud_usage_collector.test.ts index a731de341435c..7ec3888e4e1e4 100644 --- a/x-pack/plugins/cloud/server/collectors/cloud_usage_collector.test.ts +++ b/x-pack/plugins/cloud/server/collectors/cloud_usage_collector.test.ts @@ -21,12 +21,13 @@ describe('createCloudUsageCollector', () => { }); describe('Fetched Usage data', () => { - it('return isCloudEnabled boolean', () => { + it('return isCloudEnabled boolean', async () => { const mockConfigs = getMockConfigs(true); const usageCollection = mockUsageCollection() as any; const collector = createCloudUsageCollector(usageCollection, mockConfigs); + const callCluster = {} as any; // Sending any as the callCluster client because it's not needed in this collector but TS requires it when calling it. - expect(collector.fetch().isCloudEnabled).toBe(true); + expect((await collector.fetch(callCluster)).isCloudEnabled).toBe(true); // Adding the await because the fetch can be a Promise or a synchronous method and TS complains in the test if not awaited }); }); }); From 367086b6fa41220ce5eb4e01cc57c7577dfab883 Mon Sep 17 00:00:00 2001 From: Daniil Suleiman <31325372+sulemanof@users.noreply.github.com> Date: Wed, 5 Feb 2020 17:25:01 +0300 Subject: [PATCH 29/86] Remove the editor config provider registry (#56501) * Remove the editor_config_providers * Remove unused translations * Fix eslint errors Co-authored-by: Elastic Machine --- .../public/components/agg_param_props.ts | 3 +- .../public/components/agg_params.test.tsx | 6 +- .../public/components/agg_params.tsx | 18 +- .../components/agg_params_helper.test.ts | 10 +- .../public/components/agg_params_helper.ts | 2 +- .../public/components/controls/test_utils.ts | 3 +- .../components/controls/time_interval.tsx | 2 +- .../public/components/utils/editor_config.ts | 135 +++++++++++ .../public/components/utils}/index.ts | 3 +- .../public/legacy_imports.ts | 1 - .../config/editor_config_providers.test.ts | 210 ------------------ .../vis/config/editor_config_providers.ts | 168 -------------- src/legacy/ui/public/vis/config/types.ts | 57 ----- .../data/public/index_patterns/index.ts | 8 +- .../index_patterns/index_patterns/index.ts | 1 + .../index_patterns/index_pattern.ts | 7 +- .../index_patterns/index_patterns/types.ts | 35 +++ .../lens/public/indexpattern_plugin/loader.ts | 38 ++-- .../operations/definitions/date_histogram.tsx | 2 +- .../lens/public/indexpattern_plugin/types.ts | 13 +- x-pack/legacy/plugins/rollup/public/legacy.ts | 2 - .../plugins/rollup/public/legacy_imports.ts | 1 - x-pack/legacy/plugins/rollup/public/plugin.ts | 11 +- .../rollup/public/visualize/editor_config.js | 84 ------- .../translations/translations/ja-JP.json | 2 - .../translations/translations/zh-CN.json | 2 - 26 files changed, 221 insertions(+), 603 deletions(-) create mode 100644 src/legacy/core_plugins/vis_default_editor/public/components/utils/editor_config.ts rename src/legacy/{ui/public/vis/config => core_plugins/vis_default_editor/public/components/utils}/index.ts (86%) delete mode 100644 src/legacy/ui/public/vis/config/editor_config_providers.test.ts delete mode 100644 src/legacy/ui/public/vis/config/editor_config_providers.ts delete mode 100644 src/legacy/ui/public/vis/config/types.ts create mode 100644 src/plugins/data/public/index_patterns/index_patterns/types.ts delete mode 100644 x-pack/legacy/plugins/rollup/public/visualize/editor_config.js diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/agg_param_props.ts b/src/legacy/core_plugins/vis_default_editor/public/components/agg_param_props.ts index fc535884c69ff..c858fb62045ca 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/agg_param_props.ts +++ b/src/legacy/core_plugins/vis_default_editor/public/components/agg_param_props.ts @@ -19,8 +19,9 @@ import { Field } from 'src/plugins/data/public'; import { VisState } from 'src/legacy/core_plugins/visualizations/public'; -import { IAggConfig, AggParam, EditorConfig } from '../legacy_imports'; +import { IAggConfig, AggParam } from '../legacy_imports'; import { ComboBoxGroupedOptions } from '../utils'; +import { EditorConfig } from './utils'; // NOTE: we cannot export the interface with export { InterfaceName } // as there is currently a bug on babel typescript transform plugin for it diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/agg_params.test.tsx b/src/legacy/core_plugins/vis_default_editor/public/components/agg_params.test.tsx index 5636059394bac..af851aa9b4418 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/agg_params.test.tsx +++ b/src/legacy/core_plugins/vis_default_editor/public/components/agg_params.test.tsx @@ -36,10 +36,8 @@ const mockEditorConfig = { }; jest.mock('ui/new_platform'); -jest.mock('ui/vis/config', () => ({ - editorConfigProviders: { - getConfigForAgg: jest.fn(() => mockEditorConfig), - }, +jest.mock('./utils', () => ({ + getEditorConfig: jest.fn(() => mockEditorConfig), })); jest.mock('./agg_params_helper', () => ({ getAggParamsToRender: jest.fn(() => ({ diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/agg_params.tsx b/src/legacy/core_plugins/vis_default_editor/public/components/agg_params.tsx index 1b450957f3b26..e9583ab4cec79 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/agg_params.tsx +++ b/src/legacy/core_plugins/vis_default_editor/public/components/agg_params.tsx @@ -23,14 +23,7 @@ import { i18n } from '@kbn/i18n'; import useUnmount from 'react-use/lib/useUnmount'; import { IndexPattern } from 'src/plugins/data/public'; -import { - IAggConfig, - AggGroupNames, - editorConfigProviders, - FixedParam, - TimeIntervalParam, - EditorParamConfig, -} from '../legacy_imports'; +import { IAggConfig, AggGroupNames } from '../legacy_imports'; import { DefaultEditorAggSelect } from './agg_select'; import { DefaultEditorAggParam } from './agg_param'; @@ -46,6 +39,7 @@ import { initAggParamsState, } from './agg_params_state'; import { DefaultEditorCommonProps } from './agg_common_props'; +import { EditorParamConfig, TimeIntervalParam, FixedParam, getEditorConfig } from './utils'; const FIXED_VALUE_PROP = 'fixedValue'; const DEFAULT_PROP = 'default'; @@ -93,10 +87,12 @@ function DefaultEditorAggParams({ values: { schema: agg.schema.title }, }) : ''; - - const editorConfig = useMemo(() => editorConfigProviders.getConfigForAgg(indexPattern, agg), [ + const aggTypeName = agg.type?.name; + const fieldName = agg.params?.field?.name; + const editorConfig = useMemo(() => getEditorConfig(indexPattern, aggTypeName, fieldName), [ indexPattern, - agg, + aggTypeName, + fieldName, ]); const params = useMemo(() => getAggParamsToRender({ agg, editorConfig, metricAggs, state }), [ agg, diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/agg_params_helper.test.ts b/src/legacy/core_plugins/vis_default_editor/public/components/agg_params_helper.test.ts index ec56d22143699..b9fb81fccd32c 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/agg_params_helper.test.ts +++ b/src/legacy/core_plugins/vis_default_editor/public/components/agg_params_helper.test.ts @@ -19,20 +19,14 @@ import { IndexPattern, Field } from 'src/plugins/data/public'; import { VisState } from 'src/legacy/core_plugins/visualizations/public'; -import { - IAggConfig, - IAggType, - AggGroupNames, - BUCKET_TYPES, - IndexedArray, - EditorConfig, -} from '../legacy_imports'; +import { IAggConfig, IAggType, AggGroupNames, BUCKET_TYPES, IndexedArray } from '../legacy_imports'; import { getAggParamsToRender, getAggTypeOptions, isInvalidParamsTouched, } from './agg_params_helper'; import { FieldParamEditor, OrderByParamEditor } from './controls'; +import { EditorConfig } from './utils'; jest.mock('../utils', () => ({ groupAndSortBy: jest.fn(() => ['indexedFields']), diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/agg_params_helper.ts b/src/legacy/core_plugins/vis_default_editor/public/components/agg_params_helper.ts index 5a9d95725c8e4..25aa21fc83b31 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/agg_params_helper.ts +++ b/src/legacy/core_plugins/vis_default_editor/public/components/agg_params_helper.ts @@ -33,8 +33,8 @@ import { AggParam, IFieldParamType, IAggType, - EditorConfig, } from '../legacy_imports'; +import { EditorConfig } from './utils'; interface ParamInstanceBase { agg: IAggConfig; diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/controls/test_utils.ts b/src/legacy/core_plugins/vis_default_editor/public/components/controls/test_utils.ts index 894bc594a08d7..4280f85c901d7 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/controls/test_utils.ts +++ b/src/legacy/core_plugins/vis_default_editor/public/components/controls/test_utils.ts @@ -18,7 +18,8 @@ */ import { VisState } from 'src/legacy/core_plugins/visualizations/public'; -import { IAggConfig, AggParam, EditorConfig } from '../../legacy_imports'; +import { IAggConfig, AggParam } from '../../legacy_imports'; +import { EditorConfig } from '../utils'; export const aggParamCommonPropsMock = { agg: {} as IAggConfig, diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/controls/time_interval.tsx b/src/legacy/core_plugins/vis_default_editor/public/components/controls/time_interval.tsx index 6168890c2f2da..5da0d6462a8ba 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/controls/time_interval.tsx +++ b/src/legacy/core_plugins/vis_default_editor/public/components/controls/time_interval.tsx @@ -107,7 +107,7 @@ function TimeIntervalParamEditor({ const onChange = (opts: EuiComboBoxOptionProps[]) => { const selectedOpt: ComboBoxOption = get(opts, '0'); - setValue(selectedOpt ? selectedOpt.key : selectedOpt); + setValue(selectedOpt ? selectedOpt.key : ''); if (selectedOpt) { agg.write(); diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/utils/editor_config.ts b/src/legacy/core_plugins/vis_default_editor/public/components/utils/editor_config.ts new file mode 100644 index 0000000000000..80a64b7289f8c --- /dev/null +++ b/src/legacy/core_plugins/vis_default_editor/public/components/utils/editor_config.ts @@ -0,0 +1,135 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { i18n } from '@kbn/i18n'; +import { IndexPattern } from 'src/plugins/data/public'; + +/** + * A hidden parameter can be hidden from the UI completely. + */ +interface Param { + hidden?: boolean; + help?: string; +} + +/** + * A fixed parameter has a fixed value for a specific field. + * It can optionally also be hidden. + */ +export type FixedParam = Partial & { + fixedValue: any; +}; + +/** + * Numeric interval parameters must always be set in the editor to a multiple of + * the specified base. It can optionally also be hidden. + */ +export type NumericIntervalParam = Partial & { + base: number; +}; + +/** + * Time interval parameters must always be set in the editor to a multiple of + * the specified base. It can optionally also be hidden. + */ +export type TimeIntervalParam = Partial & { + default: string; + timeBase: string; +}; + +export type EditorParamConfig = NumericIntervalParam | TimeIntervalParam | FixedParam | Param; + +export interface EditorConfig { + [paramName: string]: EditorParamConfig; +} + +export function getEditorConfig( + indexPattern: IndexPattern, + aggTypeName: string, + fieldName: string +): EditorConfig { + const aggRestrictions = indexPattern.getAggregationRestrictions(); + + if (!aggRestrictions || !aggTypeName || !fieldName) { + return {}; + } + + // Exclude certain param options for terms: + // otherBucket, missingBucket, orderBy, orderAgg + if (aggTypeName === 'terms') { + return { + otherBucket: { + hidden: true, + }, + missingBucket: { + hidden: true, + }, + }; + } + + const fieldAgg = aggRestrictions[aggTypeName] && aggRestrictions[aggTypeName][fieldName]; + + if (!fieldAgg) { + return {}; + } + + // Set interval and base interval for histograms based on agg restrictions + if (aggTypeName === 'histogram') { + const interval = fieldAgg.interval; + return interval + ? { + intervalBase: { + fixedValue: interval, + }, + interval: { + base: interval, + help: i18n.translate('visDefaultEditor.editorConfig.histogram.interval.helpText', { + defaultMessage: 'Must be a multiple of configuration interval: {interval}', + values: { interval }, + }), + }, + } + : {}; + } + + // Set date histogram time zone based on agg restrictions + if (aggTypeName === 'date_histogram') { + // Interval is deprecated on date_histogram rollups, but may still be present + // See https://github.com/elastic/kibana/pull/36310 + const interval = fieldAgg.calendar_interval || fieldAgg.fixed_interval; + return { + useNormalizedEsInterval: { + fixedValue: false, + }, + interval: { + default: interval, + timeBase: interval, + help: i18n.translate( + 'visDefaultEditor.editorConfig.dateHistogram.customInterval.helpText', + { + defaultMessage: 'Must be a multiple of configuration interval: {interval}', + values: { interval }, + } + ), + }, + }; + } + + return {}; +} diff --git a/src/legacy/ui/public/vis/config/index.ts b/src/legacy/core_plugins/vis_default_editor/public/components/utils/index.ts similarity index 86% rename from src/legacy/ui/public/vis/config/index.ts rename to src/legacy/core_plugins/vis_default_editor/public/components/utils/index.ts index ee7385518a85d..14570356103b1 100644 --- a/src/legacy/ui/public/vis/config/index.ts +++ b/src/legacy/core_plugins/vis_default_editor/public/components/utils/index.ts @@ -17,5 +17,4 @@ * under the License. */ -export { editorConfigProviders, EditorConfigProviderRegistry } from './editor_config_providers'; -export * from './types'; +export * from './editor_config'; diff --git a/src/legacy/core_plugins/vis_default_editor/public/legacy_imports.ts b/src/legacy/core_plugins/vis_default_editor/public/legacy_imports.ts index f023b808cb0a7..a700995ec596b 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/legacy_imports.ts +++ b/src/legacy/core_plugins/vis_default_editor/public/legacy_imports.ts @@ -54,4 +54,3 @@ export { getDocLink } from 'ui/documentation_links'; export { documentationLinks } from 'ui/documentation_links/documentation_links'; export { move } from 'ui/utils/collection'; export * from 'ui/vis/lib'; -export * from 'ui/vis/config'; diff --git a/src/legacy/ui/public/vis/config/editor_config_providers.test.ts b/src/legacy/ui/public/vis/config/editor_config_providers.test.ts deleted file mode 100644 index d52c9119dd76a..0000000000000 --- a/src/legacy/ui/public/vis/config/editor_config_providers.test.ts +++ /dev/null @@ -1,210 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { IAggConfig } from 'ui/agg_types'; -import { EditorConfigProviderRegistry } from './editor_config_providers'; -import { EditorParamConfig, FixedParam, NumericIntervalParam, TimeIntervalParam } from './types'; - -jest.mock('ui/new_platform'); - -describe('EditorConfigProvider', () => { - let registry: EditorConfigProviderRegistry; - const indexPattern = { - id: '1234', - title: 'logstash-*', - fields: [ - { - name: 'response', - type: 'number', - esTypes: ['integer'], - aggregatable: true, - filterable: true, - searchable: true, - }, - ], - } as any; - - beforeEach(() => { - registry = new EditorConfigProviderRegistry(); - }); - - it('should call registered providers with given parameters', () => { - const provider = jest.fn(() => ({})); - registry.register(provider); - expect(provider).not.toHaveBeenCalled(); - const aggConfig = {} as IAggConfig; - registry.getConfigForAgg(indexPattern, aggConfig); - expect(provider).toHaveBeenCalledWith(indexPattern, aggConfig); - }); - - it('should call all registered providers with given parameters', () => { - const provider = jest.fn(() => ({})); - const provider2 = jest.fn(() => ({})); - registry.register(provider); - registry.register(provider2); - expect(provider).not.toHaveBeenCalled(); - expect(provider2).not.toHaveBeenCalled(); - const aggConfig = {} as IAggConfig; - registry.getConfigForAgg(indexPattern, aggConfig); - expect(provider).toHaveBeenCalledWith(indexPattern, aggConfig); - expect(provider2).toHaveBeenCalledWith(indexPattern, aggConfig); - }); - - describe('merging configs', () => { - function singleConfig(paramConfig: EditorParamConfig) { - return () => ({ singleParam: paramConfig }); - } - - function getOutputConfig(reg: EditorConfigProviderRegistry) { - return reg.getConfigForAgg(indexPattern, {} as IAggConfig).singleParam; - } - - it('should have hidden true if at least one config was hidden true', () => { - registry.register(singleConfig({ hidden: false })); - registry.register(singleConfig({ hidden: true })); - registry.register(singleConfig({ hidden: false })); - const config = getOutputConfig(registry); - expect(config.hidden).toBe(true); - }); - - it('should merge the same fixed values', () => { - registry.register(singleConfig({ fixedValue: 'foo' })); - registry.register(singleConfig({ fixedValue: 'foo' })); - const config = getOutputConfig(registry) as FixedParam; - expect(config).toHaveProperty('fixedValue'); - expect(config.fixedValue).toBe('foo'); - }); - - it('should throw having different fixed values', () => { - registry.register(singleConfig({ fixedValue: 'foo' })); - registry.register(singleConfig({ fixedValue: 'bar' })); - expect(() => { - getOutputConfig(registry); - }).toThrowError(); - }); - - it('should allow same base values', () => { - registry.register(singleConfig({ base: 5 })); - registry.register(singleConfig({ base: 5 })); - const config = getOutputConfig(registry) as NumericIntervalParam; - expect(config).toHaveProperty('base'); - expect(config.base).toBe(5); - }); - - it('should merge multiple base values, using least common multiple', () => { - registry.register(singleConfig({ base: 2 })); - registry.register(singleConfig({ base: 5 })); - registry.register(singleConfig({ base: 8 })); - const config = getOutputConfig(registry) as NumericIntervalParam; - expect(config).toHaveProperty('base'); - expect(config.base).toBe(40); - }); - - it('should throw on combining fixedValue with base', () => { - registry.register(singleConfig({ fixedValue: 'foo' })); - registry.register(singleConfig({ base: 5 })); - expect(() => { - getOutputConfig(registry); - }).toThrowError(); - }); - - it('should allow same timeBase values', () => { - registry.register(singleConfig({ timeBase: '2h', default: '2h' })); - registry.register(singleConfig({ timeBase: '2h', default: '2h' })); - const config = getOutputConfig(registry) as TimeIntervalParam; - expect(config).toHaveProperty('timeBase'); - expect(config).toHaveProperty('default'); - expect(config.timeBase).toBe('2h'); - expect(config.default).toBe('2h'); - }); - - it('should merge multiple compatible timeBase values, using least common interval', () => { - registry.register(singleConfig({ timeBase: '2h', default: '2h' })); - registry.register(singleConfig({ timeBase: '3h', default: '3h' })); - registry.register(singleConfig({ timeBase: '4h', default: '4h' })); - const config = getOutputConfig(registry) as TimeIntervalParam; - expect(config).toHaveProperty('timeBase'); - expect(config).toHaveProperty('default'); - expect(config.timeBase).toBe('12h'); - expect(config.default).toBe('12h'); - }); - - it('should throw on combining incompatible timeBase values', () => { - registry.register(singleConfig({ timeBase: '2h', default: '2h' })); - registry.register(singleConfig({ timeBase: '1d', default: '1d' })); - expect(() => { - getOutputConfig(registry); - }).toThrowError(); - }); - - it('should throw on invalid timeBase values', () => { - registry.register(singleConfig({ timeBase: '2w', default: '2w' })); - expect(() => { - getOutputConfig(registry); - }).toThrowError(); - }); - - it('should throw if timeBase and default are different', () => { - registry.register(singleConfig({ timeBase: '1h', default: '2h' })); - expect(() => { - getOutputConfig(registry); - }).toThrowError(); - }); - - it('should merge hidden together with fixedValue', () => { - registry.register(singleConfig({ fixedValue: 'foo', hidden: true })); - registry.register(singleConfig({ fixedValue: 'foo', hidden: false })); - const config = getOutputConfig(registry) as FixedParam; - expect(config).toHaveProperty('fixedValue'); - expect(config).toHaveProperty('hidden'); - expect(config.fixedValue).toBe('foo'); - expect(config.hidden).toBe(true); - }); - - it('should merge hidden together with base', () => { - registry.register(singleConfig({ base: 2, hidden: false })); - registry.register(singleConfig({ base: 13, hidden: false })); - const config = getOutputConfig(registry) as NumericIntervalParam; - expect(config).toHaveProperty('base'); - expect(config).toHaveProperty('hidden'); - expect(config.base).toBe(26); - expect(config.hidden).toBe(false); - }); - - it('should merge hidden together with timeBase', () => { - registry.register(singleConfig({ timeBase: '2h', default: '2h', hidden: false })); - registry.register(singleConfig({ timeBase: '4h', default: '4h', hidden: false })); - const config = getOutputConfig(registry) as TimeIntervalParam; - expect(config).toHaveProperty('timeBase'); - expect(config).toHaveProperty('default'); - expect(config).toHaveProperty('hidden'); - expect(config.timeBase).toBe('4h'); - expect(config.default).toBe('4h'); - expect(config.hidden).toBe(false); - }); - - it('should merge helps together into one string', () => { - registry.register(singleConfig({ help: 'Warning' })); - registry.register(singleConfig({ help: 'Another help' })); - const config = getOutputConfig(registry); - expect(config).toHaveProperty('help'); - expect(config.help).toBe('Warning\n\nAnother help'); - }); - }); -}); diff --git a/src/legacy/ui/public/vis/config/editor_config_providers.ts b/src/legacy/ui/public/vis/config/editor_config_providers.ts deleted file mode 100644 index ec82597d5fb19..0000000000000 --- a/src/legacy/ui/public/vis/config/editor_config_providers.ts +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { IndexPattern } from 'src/plugins/data/public'; -import { IAggConfig } from 'ui/agg_types'; -import { parseEsInterval } from '../../../../core_plugins/data/public'; -import { - TimeIntervalParam, - EditorConfig, - EditorParamConfig, - FixedParam, - NumericIntervalParam, -} from './types'; -import { leastCommonInterval, leastCommonMultiple } from '../lib'; - -type EditorConfigProvider = (indexPattern: IndexPattern, aggConfig: IAggConfig) => EditorConfig; - -class EditorConfigProviderRegistry { - private providers: Set = new Set(); - - public register(configProvider: EditorConfigProvider): void { - this.providers.add(configProvider); - } - - public getConfigForAgg(indexPattern: IndexPattern, aggConfig: IAggConfig): EditorConfig { - const configs = Array.from(this.providers).map(provider => provider(indexPattern, aggConfig)); - return this.mergeConfigs(configs); - } - - private isTimeBaseParam(config: EditorParamConfig): config is TimeIntervalParam { - return config.hasOwnProperty('default') && config.hasOwnProperty('timeBase'); - } - - private isBaseParam(config: EditorParamConfig): config is NumericIntervalParam { - return config.hasOwnProperty('base'); - } - - private isFixedParam(config: EditorParamConfig): config is FixedParam { - return config.hasOwnProperty('fixedValue'); - } - - private mergeHidden(current: EditorParamConfig, merged: EditorParamConfig): boolean { - return Boolean(current.hidden || merged.hidden); - } - - private mergeHelp(current: EditorParamConfig, merged: EditorParamConfig): string | undefined { - if (!current.help) { - return merged.help; - } - - return merged.help ? `${merged.help}\n\n${current.help}` : current.help; - } - - private mergeFixedAndBase( - current: EditorParamConfig, - merged: EditorParamConfig, - paramName: string - ): { fixedValue: unknown } | { base: number } | {} { - if ( - this.isFixedParam(current) && - this.isFixedParam(merged) && - current.fixedValue !== merged.fixedValue - ) { - // In case multiple configurations provided a fixedValue, these must all be the same. - // If not we'll throw an error. - throw new Error(`Two EditorConfigProviders provided different fixed values for field ${paramName}: - ${merged.fixedValue} !== ${current.fixedValue}`); - } - - if ( - (this.isFixedParam(current) && this.isBaseParam(merged)) || - (this.isBaseParam(current) && this.isFixedParam(merged)) - ) { - // In case one config tries to set a fixed value and another setting a base value, - // we'll throw an error. This could be solved more elegantly, by allowing fixedValues - // that are the multiple of the specific base value, but since there is no use-case for that - // right now, this isn't implemented. - throw new Error(`Tried to provide a fixedValue and a base for param ${paramName}.`); - } - - if (this.isBaseParam(current) && this.isBaseParam(merged)) { - // In case where both had interval values, just use the least common multiple between both interval - return { - base: leastCommonMultiple(current.base, merged.base), - }; - } - - // In this case we haven't had a fixed value of base for that param yet, we use the one specified - // in the current config - if (this.isFixedParam(current)) { - return { - fixedValue: current.fixedValue, - }; - } - if (this.isBaseParam(current)) { - return { - base: current.base, - }; - } - - return {}; - } - - private mergeTimeBase( - current: TimeIntervalParam, - merged: EditorParamConfig, - paramName: string - ): { timeBase: string; default: string } { - if (current.default !== current.timeBase) { - throw new Error(`Tried to provide differing default and timeBase values for ${paramName}.`); - } - - if (this.isTimeBaseParam(merged)) { - // In case both had where interval values, just use the least common multiple between both intervals - const timeBase = leastCommonInterval(current.timeBase, merged.timeBase); - return { - default: timeBase, - timeBase, - }; - } - - // This code is simply here to throw an error in case the `timeBase` is not a valid ES interval - parseEsInterval(current.timeBase); - return { - default: current.timeBase, - timeBase: current.timeBase, - }; - } - - private mergeConfigs(configs: EditorConfig[]): EditorConfig { - return configs.reduce((output, conf) => { - Object.entries(conf).forEach(([paramName, paramConfig]) => { - if (!output[paramName]) { - output[paramName] = {}; - } - - output[paramName] = { - hidden: this.mergeHidden(paramConfig, output[paramName]), - help: this.mergeHelp(paramConfig, output[paramName]), - ...(this.isTimeBaseParam(paramConfig) - ? this.mergeTimeBase(paramConfig, output[paramName], paramName) - : this.mergeFixedAndBase(paramConfig, output[paramName], paramName)), - }; - }); - return output; - }, {}); - } -} - -const editorConfigProviders = new EditorConfigProviderRegistry(); - -export { editorConfigProviders, EditorConfigProviderRegistry }; diff --git a/src/legacy/ui/public/vis/config/types.ts b/src/legacy/ui/public/vis/config/types.ts deleted file mode 100644 index 61c0ced3cd519..0000000000000 --- a/src/legacy/ui/public/vis/config/types.ts +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -/** - * A hidden parameter can be hidden from the UI completely. - */ -interface Param { - hidden?: boolean; - help?: string; -} - -/** - * A fixed parameter has a fixed value for a specific field. - * It can optionally also be hidden. - */ -export type FixedParam = Partial & { - fixedValue: any; -}; - -/** - * Numeric interval parameters must always be set in the editor to a multiple of - * the specified base. It can optionally also be hidden. - */ -export type NumericIntervalParam = Partial & { - base: number; -}; - -/** - * Time interval parameters must always be set in the editor to a multiple of - * the specified base. It can optionally also be hidden. - */ -export type TimeIntervalParam = Partial & { - default: string; - timeBase: string; -}; - -export type EditorParamConfig = NumericIntervalParam | TimeIntervalParam | FixedParam | Param; - -export interface EditorConfig { - [paramName: string]: EditorParamConfig; -} diff --git a/src/plugins/data/public/index_patterns/index.ts b/src/plugins/data/public/index_patterns/index.ts index 7444126ee6cae..3d902ebbb7c23 100644 --- a/src/plugins/data/public/index_patterns/index.ts +++ b/src/plugins/data/public/index_patterns/index.ts @@ -47,4 +47,10 @@ export const indexPatterns = { export { Field, FieldList, IFieldList } from './fields'; // TODO: figure out how to replace IndexPatterns in get_inner_angular. -export { IndexPattern, IndexPatterns, IndexPatternsContract } from './index_patterns'; +export { + IndexPattern, + IndexPatterns, + IndexPatternsContract, + TypeMeta, + AggregationRestrictions, +} from './index_patterns'; diff --git a/src/plugins/data/public/index_patterns/index_patterns/index.ts b/src/plugins/data/public/index_patterns/index_patterns/index.ts index 4ca7e053a4492..fca82025cdc66 100644 --- a/src/plugins/data/public/index_patterns/index_patterns/index.ts +++ b/src/plugins/data/public/index_patterns/index_patterns/index.ts @@ -22,3 +22,4 @@ export * from './format_hit'; export * from './index_pattern'; export * from './index_patterns'; export * from './index_patterns_api_client'; +export * from './types'; diff --git a/src/plugins/data/public/index_patterns/index_patterns/index_pattern.ts b/src/plugins/data/public/index_patterns/index_patterns/index_pattern.ts index 5c09e22b6dbb4..c09c9f4828799 100644 --- a/src/plugins/data/public/index_patterns/index_patterns/index_pattern.ts +++ b/src/plugins/data/public/index_patterns/index_patterns/index_pattern.ts @@ -38,6 +38,7 @@ import { formatHitProvider } from './format_hit'; import { flattenHitWrapper } from './flatten_hit'; import { IIndexPatternsApiClient } from './index_patterns_api_client'; import { getNotifications, getFieldFormats } from '../../services'; +import { TypeMeta } from './types'; const MAX_ATTEMPTS_TO_RESOLVE_CONFLICTS = 3; const type = 'index-pattern'; @@ -49,7 +50,7 @@ export class IndexPattern implements IIndexPattern { public title: string = ''; public type?: string; public fieldFormatMap: any; - public typeMeta: any; + public typeMeta?: TypeMeta; public fields: IFieldList; public timeFieldName: string | undefined; public formatHit: any; @@ -336,6 +337,10 @@ export class IndexPattern implements IIndexPattern { return this.fields.getByName(name); } + getAggregationRestrictions() { + return this.typeMeta?.aggs; + } + isWildcard() { return _.includes(this.title, '*'); } diff --git a/src/plugins/data/public/index_patterns/index_patterns/types.ts b/src/plugins/data/public/index_patterns/index_patterns/types.ts new file mode 100644 index 0000000000000..b2060dd1d48ba --- /dev/null +++ b/src/plugins/data/public/index_patterns/index_patterns/types.ts @@ -0,0 +1,35 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export type AggregationRestrictions = Record< + string, + { + agg?: string; + interval?: number; + fixed_interval?: string; + calendar_interval?: string; + delay?: string; + time_zone?: string; + } +>; + +export interface TypeMeta { + aggs?: Record; + [key: string]: any; +} diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_plugin/loader.ts b/x-pack/legacy/plugins/lens/public/indexpattern_plugin/loader.ts index c9473c1869868..f0692f120f9b5 100644 --- a/x-pack/legacy/plugins/lens/public/indexpattern_plugin/loader.ts +++ b/x-pack/legacy/plugins/lens/public/indexpattern_plugin/loader.ts @@ -15,13 +15,12 @@ import { IndexPatternPersistedState, IndexPatternPrivateState, IndexPatternField, - AggregationRestrictions, } from './types'; import { updateLayerIndexPattern } from './state_helpers'; import { DateRange, ExistingFields } from '../../common/types'; import { BASE_API_URL } from '../../common'; import { documentField } from './document_field'; -import { isNestedField, IFieldType } from '../../../../../../src/plugins/data/public'; +import { isNestedField, IFieldType, TypeMeta } from '../../../../../../src/plugins/data/public'; interface SavedIndexPatternAttributes extends SavedObjectAttributes { title: string; @@ -31,12 +30,7 @@ interface SavedIndexPatternAttributes extends SavedObjectAttributes { typeMeta: string; } -interface SavedRestrictionsObject { - aggs: Record; -} - type SetState = StateSetter; -type SavedRestrictionsInfo = SavedRestrictionsObject | undefined; type SavedObjectsClient = Pick; type ErrorHandler = (err: Error) => void; @@ -275,9 +269,7 @@ function fromSavedObject( fields: (JSON.parse(attributes.fields) as IFieldType[]) .filter(field => !isNestedField(field) && (!!field.aggregatable || !!field.scripted)) .concat(documentField) as IndexPatternField[], - typeMeta: attributes.typeMeta - ? (JSON.parse(attributes.typeMeta) as SavedRestrictionsInfo) - : undefined, + typeMeta: attributes.typeMeta ? (JSON.parse(attributes.typeMeta) as TypeMeta) : undefined, fieldFormatMap: attributes.fieldFormatMap ? JSON.parse(attributes.fieldFormatMap) : undefined, }; @@ -286,21 +278,23 @@ function fromSavedObject( return indexPattern; } - const aggs = Object.keys(typeMeta.aggs); - const newFields = [...(indexPattern.fields as IndexPatternField[])]; - newFields.forEach((field, index) => { - const restrictionsObj: IndexPatternField['aggregationRestrictions'] = {}; - aggs.forEach(agg => { - const restriction = typeMeta.aggs[agg] && typeMeta.aggs[agg][field.name]; - if (restriction) { - restrictionsObj[agg] = restriction; + + if (typeMeta.aggs) { + const aggs = Object.keys(typeMeta.aggs); + newFields.forEach((field, index) => { + const restrictionsObj: IndexPatternField['aggregationRestrictions'] = {}; + aggs.forEach(agg => { + const restriction = typeMeta.aggs && typeMeta.aggs[agg] && typeMeta.aggs[agg][field.name]; + if (restriction) { + restrictionsObj[agg] = restriction; + } + }); + if (Object.keys(restrictionsObj).length) { + newFields[index] = { ...field, aggregationRestrictions: restrictionsObj }; } }); - if (Object.keys(restrictionsObj).length) { - newFields[index] = { ...field, aggregationRestrictions: restrictionsObj }; - } - }); + } return { id: indexPattern.id, diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_plugin/operations/definitions/date_histogram.tsx b/x-pack/legacy/plugins/lens/public/indexpattern_plugin/operations/definitions/date_histogram.tsx index ae12be90ddd05..4cfd7195d1fc0 100644 --- a/x-pack/legacy/plugins/lens/public/indexpattern_plugin/operations/definitions/date_histogram.tsx +++ b/x-pack/legacy/plugins/lens/public/indexpattern_plugin/operations/definitions/date_histogram.tsx @@ -27,7 +27,7 @@ import { updateColumnParam } from '../../state_helpers'; import { OperationDefinition } from '.'; import { FieldBasedIndexPatternColumn } from './column_types'; import { autoIntervalFromDateRange } from '../../auto_date'; -import { AggregationRestrictions } from '../../types'; +import { AggregationRestrictions } from '../../../../../../../../src/plugins/data/public'; const autoInterval = 'auto'; const calendarOnlyIntervals = new Set(['w', 'M', 'q', 'y']); diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_plugin/types.ts b/x-pack/legacy/plugins/lens/public/indexpattern_plugin/types.ts index e556ddda10679..546d148be1e29 100644 --- a/x-pack/legacy/plugins/lens/public/indexpattern_plugin/types.ts +++ b/x-pack/legacy/plugins/lens/public/indexpattern_plugin/types.ts @@ -5,6 +5,7 @@ */ import { IndexPatternColumn } from './operations'; +import { AggregationRestrictions } from '../../../../../../src/plugins/data/public'; export interface IndexPattern { id: string; @@ -20,18 +21,6 @@ export interface IndexPattern { >; } -export type AggregationRestrictions = Record< - string, - { - agg?: string; - interval?: number; - fixed_interval?: string; - calendar_interval?: string; - delay?: string; - time_zone?: string; - } ->; - export interface IndexPatternField { name: string; type: string; diff --git a/x-pack/legacy/plugins/rollup/public/legacy.ts b/x-pack/legacy/plugins/rollup/public/legacy.ts index a70f181dc86fb..17597672a898e 100644 --- a/x-pack/legacy/plugins/rollup/public/legacy.ts +++ b/x-pack/legacy/plugins/rollup/public/legacy.ts @@ -5,7 +5,6 @@ */ import { npSetup, npStart } from 'ui/new_platform'; -import { editorConfigProviders } from 'ui/vis/config'; import { aggTypeFilters } from 'ui/agg_types'; import { aggTypeFieldFilters } from 'ui/agg_types'; import { addSearchStrategy } from '../../../../../src/plugins/data/public'; @@ -20,7 +19,6 @@ export const setup = plugin.setup(npSetup.core, { __LEGACY: { aggTypeFilters, aggTypeFieldFilters, - editorConfigProviders, addSearchStrategy, addBadgeExtension, addToggleExtension, diff --git a/x-pack/legacy/plugins/rollup/public/legacy_imports.ts b/x-pack/legacy/plugins/rollup/public/legacy_imports.ts index 4fece0fddfa3e..07155a4b0a60e 100644 --- a/x-pack/legacy/plugins/rollup/public/legacy_imports.ts +++ b/x-pack/legacy/plugins/rollup/public/legacy_imports.ts @@ -9,4 +9,3 @@ export { findIllegalCharactersInIndexName, INDEX_ILLEGAL_CHARACTERS_VISIBLE } fr export { AggTypeFilters } from 'ui/agg_types'; export { AggTypeFieldFilters } from 'ui/agg_types'; -export { EditorConfigProviderRegistry } from 'ui/vis/config'; diff --git a/x-pack/legacy/plugins/rollup/public/plugin.ts b/x-pack/legacy/plugins/rollup/public/plugin.ts index 97c03fd1fdfc2..4dae078c90f57 100644 --- a/x-pack/legacy/plugins/rollup/public/plugin.ts +++ b/x-pack/legacy/plugins/rollup/public/plugin.ts @@ -6,11 +6,7 @@ import { i18n } from '@kbn/i18n'; import { CoreSetup, CoreStart, Plugin } from 'kibana/public'; -import { - EditorConfigProviderRegistry, - AggTypeFilters, - AggTypeFieldFilters, -} from './legacy_imports'; +import { AggTypeFilters, AggTypeFieldFilters } from './legacy_imports'; import { SearchStrategyProvider } from '../../../../../src/plugins/data/public'; import { ManagementSetup as ManagementSetupLegacy } from '../../../../../src/legacy/core_plugins/management/public/np_ready'; import { rollupBadgeExtension, rollupToggleExtension } from './extend_index_management'; @@ -23,8 +19,6 @@ import { getRollupSearchStrategy } from './search/rollup_search_strategy'; import { initAggTypeFilter } from './visualize/agg_type_filter'; // @ts-ignore import { initAggTypeFieldFilter } from './visualize/agg_type_field_filter'; -// @ts-ignore -import { initEditorConfig } from './visualize/editor_config'; import { CONFIG_ROLLUPS } from '../common'; import { FeatureCatalogueCategory, @@ -42,7 +36,6 @@ export interface RollupPluginSetupDependencies { __LEGACY: { aggTypeFilters: AggTypeFilters; aggTypeFieldFilters: AggTypeFieldFilters; - editorConfigProviders: EditorConfigProviderRegistry; addSearchStrategy: (searchStrategy: SearchStrategyProvider) => void; managementLegacy: ManagementSetupLegacy; addBadgeExtension: (badgeExtension: any) => void; @@ -59,7 +52,6 @@ export class RollupPlugin implements Plugin { __LEGACY: { aggTypeFilters, aggTypeFieldFilters, - editorConfigProviders, addSearchStrategy, managementLegacy, addBadgeExtension, @@ -81,7 +73,6 @@ export class RollupPlugin implements Plugin { addSearchStrategy(getRollupSearchStrategy(core.http.fetch)); initAggTypeFilter(aggTypeFilters); initAggTypeFieldFilter(aggTypeFieldFilters); - initEditorConfig(editorConfigProviders); } if (home) { diff --git a/x-pack/legacy/plugins/rollup/public/visualize/editor_config.js b/x-pack/legacy/plugins/rollup/public/visualize/editor_config.js deleted file mode 100644 index 5c1eb7c8ee3b7..0000000000000 --- a/x-pack/legacy/plugins/rollup/public/visualize/editor_config.js +++ /dev/null @@ -1,84 +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; - * you may not use this file except in compliance with the Elastic License. - */ - -import { i18n } from '@kbn/i18n'; - -export function initEditorConfig(editorConfigProviders) { - // Limit agg params based on rollup capabilities - editorConfigProviders.register((indexPattern, aggConfig) => { - if (indexPattern.type !== 'rollup') { - return {}; - } - - const aggTypeName = aggConfig.type && aggConfig.type.name; - - // Exclude certain param options for terms: - // otherBucket, missingBucket, orderBy, orderAgg - if (aggTypeName === 'terms') { - return { - otherBucket: { - hidden: true, - }, - missingBucket: { - hidden: true, - }, - }; - } - - const rollupAggs = indexPattern.typeMeta && indexPattern.typeMeta.aggs; - const field = aggConfig.params && aggConfig.params.field && aggConfig.params.field.name; - const fieldAgg = - rollupAggs && field && rollupAggs[aggTypeName] && rollupAggs[aggTypeName][field]; - - if (!rollupAggs || !field || !fieldAgg) { - return {}; - } - - // Set interval and base interval for histograms based on rollup capabilities - if (aggTypeName === 'histogram') { - const interval = fieldAgg.interval; - return interval - ? { - intervalBase: { - fixedValue: interval, - }, - interval: { - base: interval, - help: i18n.translate('xpack.rollupJobs.editorConfig.histogram.interval.helpText', { - defaultMessage: 'Must be a multiple of rollup configuration interval: {interval}', - values: { interval }, - }), - }, - } - : {}; - } - - // Set date histogram time zone based on rollup capabilities - if (aggTypeName === 'date_histogram') { - // Interval is deprecated on date_histogram rollups, but may still be present - // See https://github.com/elastic/kibana/pull/36310 - const interval = fieldAgg.calendar_interval || fieldAgg.fixed_interval || fieldAgg.interval; - return { - useNormalizedEsInterval: { - fixedValue: false, - }, - interval: { - default: interval, - timeBase: interval, - help: i18n.translate( - 'xpack.rollupJobs.editorConfig.dateHistogram.customInterval.helpText', - { - defaultMessage: 'Must be a multiple of rollup configuration interval: {interval}', - values: { interval }, - } - ), - }, - }; - } - - return {}; - }); -} diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 351bc9def3082..b98eabad466ed 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -10394,8 +10394,6 @@ "xpack.rollupJobs.detailPanel.jobActionMenu.buttonLabel": "管理", "xpack.rollupJobs.detailPanel.loadingLabel": "ロールアップジョブを読み込み中…", "xpack.rollupJobs.detailPanel.notFoundLabel": "ロールアップジョブが見つかりません", - "xpack.rollupJobs.editorConfig.dateHistogram.customInterval.helpText": "ロールアップ構成の間隔の倍数でなければなりません: {interval}", - "xpack.rollupJobs.editorConfig.histogram.interval.helpText": "ロールアップ構成の間隔の倍数でなければなりません: {interval}", "xpack.rollupJobs.editRollupIndexPattern.createIndex.defaultButtonDescription": "要約データに制限された集約を実行します。", "xpack.rollupJobs.editRollupIndexPattern.createIndex.defaultButtonText": "ロールアップインデックスパターン", "xpack.rollupJobs.editRollupIndexPattern.createIndex.defaultTypeName": "ロールアップインデックスパターン", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 066bafd990fe3..1c87541ae107a 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -10393,8 +10393,6 @@ "xpack.rollupJobs.detailPanel.jobActionMenu.buttonLabel": "管理", "xpack.rollupJobs.detailPanel.loadingLabel": "正在加载汇总/打包作业……", "xpack.rollupJobs.detailPanel.notFoundLabel": "未找到汇总/打包作业", - "xpack.rollupJobs.editorConfig.dateHistogram.customInterval.helpText": "必须是汇总/打包配置时间间隔的倍数:{interval}", - "xpack.rollupJobs.editorConfig.histogram.interval.helpText": "必须是汇总/打包配置时间间隔的倍数:{interval}", "xpack.rollupJobs.editRollupIndexPattern.createIndex.defaultButtonDescription": "针对汇总数据执行有限聚合", "xpack.rollupJobs.editRollupIndexPattern.createIndex.defaultButtonText": "汇总/打包索引模式", "xpack.rollupJobs.editRollupIndexPattern.createIndex.defaultTypeName": "汇总/打包索引模式", From 625b93a22fa2f667b99abe837d5db49e55f55505 Mon Sep 17 00:00:00 2001 From: Dima Arnautov Date: Wed, 5 Feb 2020 16:14:05 +0100 Subject: [PATCH 30/86] [ML] New Platform server shim: update data visualizer routes to use new platform router (#56739) * [ML] data_visualizer TS refactor, NP router * [ML] fix schema, add apiDoc * [ML] update apiDoc order * [ML] validate_cardinality with NP router * [ML] use mlClient * [ML] remove redundant code * [ML] support legacy callWithRequest for job validation * [ML] fix schema validation --- .../plugins/ml/common/util/job_utils.d.ts | 2 + .../lib/{query_utils.js => query_utils.ts} | 11 +- ...{data_visualizer.js => data_visualizer.ts} | 441 +++++++++++------- .../data_visualizer/{index.js => index.ts} | 0 .../new_platform/data_visualizer_schema.ts | 38 ++ .../plugins/ml/server/routes/apidoc.json | 5 +- .../ml/server/routes/data_visualizer.js | 110 ----- .../ml/server/routes/data_visualizer.ts | 173 +++++++ 8 files changed, 509 insertions(+), 271 deletions(-) rename x-pack/legacy/plugins/ml/server/lib/{query_utils.js => query_utils.ts} (86%) rename x-pack/legacy/plugins/ml/server/models/data_visualizer/{data_visualizer.js => data_visualizer.ts} (75%) rename x-pack/legacy/plugins/ml/server/models/data_visualizer/{index.js => index.ts} (100%) create mode 100644 x-pack/legacy/plugins/ml/server/new_platform/data_visualizer_schema.ts delete mode 100644 x-pack/legacy/plugins/ml/server/routes/data_visualizer.js create mode 100644 x-pack/legacy/plugins/ml/server/routes/data_visualizer.ts diff --git a/x-pack/legacy/plugins/ml/common/util/job_utils.d.ts b/x-pack/legacy/plugins/ml/common/util/job_utils.d.ts index df62d19b6d27b..cfff15bb97be2 100644 --- a/x-pack/legacy/plugins/ml/common/util/job_utils.d.ts +++ b/x-pack/legacy/plugins/ml/common/util/job_utils.d.ts @@ -43,3 +43,5 @@ export function processCreatedBy(customSettings: { created_by?: string }): void; export function mlFunctionToESAggregation(functionName: string): string | null; export function isModelPlotEnabled(job: Job, detectorIndex: number, entityFields: any[]): boolean; + +export function getSafeAggregationName(fieldName: string, index: number): string; diff --git a/x-pack/legacy/plugins/ml/server/lib/query_utils.js b/x-pack/legacy/plugins/ml/server/lib/query_utils.ts similarity index 86% rename from x-pack/legacy/plugins/ml/server/lib/query_utils.js rename to x-pack/legacy/plugins/ml/server/lib/query_utils.ts index 806ce324d26d1..5eff726d6c5c8 100644 --- a/x-pack/legacy/plugins/ml/server/lib/query_utils.js +++ b/x-pack/legacy/plugins/ml/server/lib/query_utils.ts @@ -10,7 +10,12 @@ // Builds the base filter criteria used in queries, // adding criteria for the time range and an optional query. -export function buildBaseFilterCriteria(timeFieldName, earliestMs, latestMs, query) { +export function buildBaseFilterCriteria( + timeFieldName?: string, + earliestMs?: number, + latestMs?: number, + query?: object +) { const filterCriteria = []; if (timeFieldName && earliestMs && latestMs) { filterCriteria.push({ @@ -34,7 +39,7 @@ export function buildBaseFilterCriteria(timeFieldName, earliestMs, latestMs, que // Wraps the supplied aggregations in a sampler aggregation. // A supplied samplerShardSize (the shard_size parameter of the sampler aggregation) // of less than 1 indicates no sampling, and the aggs are returned as-is. -export function buildSamplerAggregation(aggs, samplerShardSize) { +export function buildSamplerAggregation(aggs: object, samplerShardSize: number) { if (samplerShardSize < 1) { return aggs; } @@ -53,6 +58,6 @@ export function buildSamplerAggregation(aggs, samplerShardSize) { // depending on whether sampling is being used. // A supplied samplerShardSize (the shard_size parameter of the sampler aggregation) // of less than 1 indicates no sampling, and an empty array is returned. -export function getSamplerAggregationsResponsePath(samplerShardSize) { +export function getSamplerAggregationsResponsePath(samplerShardSize: number): string[] { return samplerShardSize > 0 ? ['sample'] : []; } diff --git a/x-pack/legacy/plugins/ml/server/models/data_visualizer/data_visualizer.js b/x-pack/legacy/plugins/ml/server/models/data_visualizer/data_visualizer.ts similarity index 75% rename from x-pack/legacy/plugins/ml/server/models/data_visualizer/data_visualizer.js rename to x-pack/legacy/plugins/ml/server/models/data_visualizer/data_visualizer.ts index f4ee032ee2dbb..6186a61c5075f 100644 --- a/x-pack/legacy/plugins/ml/server/models/data_visualizer/data_visualizer.js +++ b/x-pack/legacy/plugins/ml/server/models/data_visualizer/data_visualizer.ts @@ -4,23 +4,118 @@ * you may not use this file except in compliance with the Elastic License. */ +import { CallAPIOptions, RequestHandlerContext } from 'kibana/server'; import _ from 'lodash'; +import { ML_JOB_FIELD_TYPES } from '../../../common/constants/field_types'; +import { getSafeAggregationName } from '../../../common/util/job_utils'; import { buildBaseFilterCriteria, buildSamplerAggregation, getSamplerAggregationsResponsePath, } from '../../lib/query_utils'; -import { ML_JOB_FIELD_TYPES } from '../../../common/constants/field_types'; -import { getSafeAggregationName } from '../../../common/util/job_utils'; const SAMPLER_TOP_TERMS_THRESHOLD = 100000; const SAMPLER_TOP_TERMS_SHARD_SIZE = 5000; const AGGREGATABLE_EXISTS_REQUEST_BATCH_SIZE = 200; const FIELDS_REQUEST_BATCH_SIZE = 10; +interface FieldData { + fieldName: string; + existsInDocs: boolean; + stats?: { + sampleCount?: number; + count?: number; + cardinality?: number; + }; +} + +export interface Field { + fieldName: string; + type: string; + cardinality: number; +} + +interface Distribution { + percentiles: any[]; + minPercentile: number; + maxPercentile: number; +} + +interface Aggs { + [key: string]: any; +} + +interface Bucket { + doc_count: number; +} + +interface NumericFieldStats { + fieldName: string; + count: number; + min: number; + max: number; + avg: number; + isTopValuesSampled: boolean; + topValues: Bucket[]; + topValuesSampleSize: number; + topValuesSamplerShardSize: number; + median?: number; + distribution?: Distribution; +} + +interface StringFieldStats { + fieldName: string; + isTopValuesSampled: boolean; + topValues: Bucket[]; + topValuesSampleSize: number; + topValuesSamplerShardSize: number; +} + +interface DateFieldStats { + fieldName: string; + count: number; + earliest: number; + latest: number; +} + +interface BooleanFieldStats { + fieldName: string; + count: number; + trueCount: number; + falseCount: number; + [key: string]: number | string; +} + +interface DocumentCountStats { + documentCounts: { + interval: number; + buckets: { [key: string]: number }; + }; +} + +interface FieldExamples { + fieldName: string; + examples: any[]; +} + +type BatchStats = + | NumericFieldStats + | StringFieldStats + | BooleanFieldStats + | DateFieldStats + | DocumentCountStats + | FieldExamples; + export class DataVisualizer { - constructor(callWithRequest) { - this.callWithRequest = callWithRequest; + callAsCurrentUser: ( + endpoint: string, + clientParams: Record, + options?: CallAPIOptions + ) => Promise; + + constructor(client: RequestHandlerContext | (() => any)) { + this.callAsCurrentUser = + typeof client === 'object' ? client.ml!.mlClient.callAsCurrentUser : client; } // Obtains overall stats on the fields in the supplied index pattern, returning an object @@ -28,28 +123,28 @@ export class DataVisualizer { // aggregatable and non-aggregatable fields do or do not exist in documents. // Sampling will be used if supplied samplerShardSize > 0. async getOverallStats( - indexPatternTitle, - query, - aggregatableFields, - nonAggregatableFields, - samplerShardSize, - timeFieldName, - earliestMs, - latestMs + indexPatternTitle: string, + query: object, + aggregatableFields: string[], + nonAggregatableFields: string[], + samplerShardSize: number, + timeFieldName: string, + earliestMs: number, + latestMs: number ) { const stats = { totalCount: 0, - aggregatableExistsFields: [], - aggregatableNotExistsFields: [], - nonAggregatableExistsFields: [], - nonAggregatableNotExistsFields: [], + aggregatableExistsFields: [] as FieldData[], + aggregatableNotExistsFields: [] as FieldData[], + nonAggregatableExistsFields: [] as FieldData[], + nonAggregatableNotExistsFields: [] as FieldData[], }; // To avoid checking for the existence of too many aggregatable fields in one request, // split the check into multiple batches (max 200 fields per request). - const batches = [[]]; + const batches: string[][] = [[]]; _.each(aggregatableFields, field => { - let lastArray = _.last(batches); + let lastArray: string[] = _.last(batches); if (lastArray.length === AGGREGATABLE_EXISTS_REQUEST_BATCH_SIZE) { lastArray = []; batches.push(lastArray); @@ -89,7 +184,7 @@ export class DataVisualizer { latestMs ); - const fieldData = { + const fieldData: FieldData = { fieldName: field, existsInDocs, stats: {}, @@ -110,19 +205,19 @@ export class DataVisualizer { // returned array depend on the type of the field (keyword, number, date etc). // Sampling will be used if supplied samplerShardSize > 0. async getStatsForFields( - indexPatternTitle, - query, - fields, - samplerShardSize, - timeFieldName, - earliestMs, - latestMs, - interval, - maxExamples - ) { + indexPatternTitle: string, + query: any, + fields: Field[], + samplerShardSize: number, + timeFieldName: string, + earliestMs: number, + latestMs: number, + interval: number, + maxExamples: number + ): Promise { // Batch up fields by type, getting stats for multiple fields at a time. - const batches = []; - const batchedFields = {}; + const batches: Field[][] = []; + const batchedFields: { [key: string]: Field[][] } = {}; _.each(fields, field => { if (field.fieldName === undefined) { // undefined fieldName is used for a document count request. @@ -135,7 +230,7 @@ export class DataVisualizer { if (batchedFields[fieldType] === undefined) { batchedFields[fieldType] = [[]]; } - let lastArray = _.last(batchedFields[fieldType]); + let lastArray: Field[] = _.last(batchedFields[fieldType]); if (lastArray.length === FIELDS_REQUEST_BATCH_SIZE) { lastArray = []; batchedFields[fieldType].push(lastArray); @@ -148,10 +243,10 @@ export class DataVisualizer { batches.push(...lists); }); - let results = []; + let results: BatchStats[] = []; await Promise.all( batches.map(async batch => { - let batchStats = []; + let batchStats: BatchStats[] = []; const first = batch[0]; switch (first.type) { case ML_JOB_FIELD_TYPES.NUMBER: @@ -243,13 +338,13 @@ export class DataVisualizer { } async checkAggregatableFieldsExist( - indexPatternTitle, - query, - aggregatableFields, - samplerShardSize, - timeFieldName, - earliestMs, - latestMs + indexPatternTitle: string, + query: any, + aggregatableFields: string[], + samplerShardSize: number, + timeFieldName: string, + earliestMs: number, + latestMs: number ) { const index = indexPatternTitle; const size = 0; @@ -257,7 +352,7 @@ export class DataVisualizer { // Value count aggregation faster way of checking if field exists than using // filter aggregation with exists query. - const aggs = {}; + const aggs: Aggs = {}; aggregatableFields.forEach((field, i) => { const safeFieldName = getSafeAggregationName(field, i); aggs[`${safeFieldName}_count`] = { @@ -277,7 +372,7 @@ export class DataVisualizer { aggs: buildSamplerAggregation(aggs, samplerShardSize), }; - const resp = await this.callWithRequest('search', { + const resp = await this.callAsCurrentUser('search', { index, rest_total_hits_as_int: true, size, @@ -287,8 +382,8 @@ export class DataVisualizer { const totalCount = _.get(resp, ['hits', 'total'], 0); const stats = { totalCount, - aggregatableExistsFields: [], - aggregatableNotExistsFields: [], + aggregatableExistsFields: [] as FieldData[], + aggregatableNotExistsFields: [] as FieldData[], }; const aggsPath = getSamplerAggregationsResponsePath(samplerShardSize); @@ -324,12 +419,12 @@ export class DataVisualizer { } async checkNonAggregatableFieldExists( - indexPatternTitle, - query, - field, - timeFieldName, - earliestMs, - latestMs + indexPatternTitle: string, + query: any, + field: string, + timeFieldName: string, + earliestMs: number, + latestMs: number ) { const index = indexPatternTitle; const size = 0; @@ -344,7 +439,7 @@ export class DataVisualizer { }; filterCriteria.push({ exists: { field } }); - const resp = await this.callWithRequest('search', { + const resp = await this.callAsCurrentUser('search', { index, rest_total_hits_as_int: true, size, @@ -354,13 +449,13 @@ export class DataVisualizer { } async getDocumentCountStats( - indexPatternTitle, - query, - timeFieldName, - earliestMs, - latestMs, - interval - ) { + indexPatternTitle: string, + query: any, + timeFieldName: string, + earliestMs: number, + latestMs: number, + interval: number + ): Promise { const index = indexPatternTitle; const size = 0; const filterCriteria = buildBaseFilterCriteria(timeFieldName, earliestMs, latestMs, query); @@ -371,7 +466,7 @@ export class DataVisualizer { eventRate: { date_histogram: { field: timeFieldName, - interval: interval, + interval, min_doc_count: 1, }, }, @@ -383,36 +478,42 @@ export class DataVisualizer { filter: filterCriteria, }, }, - aggs: aggs, + aggs, }; - const resp = await this.callWithRequest('search', { index, size, body }); + const resp = await this.callAsCurrentUser('search', { + index, + size, + body, + }); - const buckets = {}; - const dataByTimeBucket = _.get(resp, ['aggregations', 'eventRate', 'buckets'], []); + const buckets: { [key: string]: number } = {}; + const dataByTimeBucket: Array<{ key: string; doc_count: number }> = _.get( + resp, + ['aggregations', 'eventRate', 'buckets'], + [] + ); _.each(dataByTimeBucket, dataForTime => { const time = dataForTime.key; buckets[time] = dataForTime.doc_count; }); - const stats = { + return { documentCounts: { interval, buckets, }, }; - - return stats; } async getNumericFieldsStats( - indexPatternTitle, - query, - fields, - samplerShardSize, - timeFieldName, - earliestMs, - latestMs + indexPatternTitle: string, + query: object, + fields: Field[], + samplerShardSize: number, + timeFieldName: string, + earliestMs: number, + latestMs: number ) { const index = indexPatternTitle; const size = 0; @@ -429,7 +530,7 @@ export class DataVisualizer { () => (count += PERCENTILE_SPACING) ); - const aggs = {}; + const aggs: { [key: string]: any } = {}; fields.forEach((field, i) => { const safeFieldName = getSafeAggregationName(field.fieldName, i); aggs[`${safeFieldName}_field_stats`] = { @@ -443,7 +544,7 @@ export class DataVisualizer { aggs[`${safeFieldName}_percentiles`] = { percentiles: { field: field.fieldName, - percents: percents, + percents, keyed: false, }, }; @@ -483,10 +584,14 @@ export class DataVisualizer { aggs: buildSamplerAggregation(aggs, samplerShardSize), }; - const resp = await this.callWithRequest('search', { index, size, body }); + const resp = await this.callAsCurrentUser('search', { + index, + size, + body, + }); const aggregations = resp.aggregations; const aggsPath = getSamplerAggregationsResponsePath(samplerShardSize); - const batchStats = []; + const batchStats: NumericFieldStats[] = []; fields.forEach((field, i) => { const safeFieldName = getSafeAggregationName(field.fieldName, i); const docCount = _.get( @@ -499,7 +604,15 @@ export class DataVisualizer { [...aggsPath, `${safeFieldName}_field_stats`, 'actual_stats'], {} ); - const stats = { + + const topAggsPath = [...aggsPath, `${safeFieldName}_top`]; + if (samplerShardSize < 1 && field.cardinality >= SAMPLER_TOP_TERMS_THRESHOLD) { + topAggsPath.push('top'); + } + + const topValues: Bucket[] = _.get(aggregations, [...topAggsPath, 'buckets'], []); + + const stats: NumericFieldStats = { fieldName: field.fieldName, count: docCount, min: _.get(fieldStatsResp, 'min', 0), @@ -507,31 +620,27 @@ export class DataVisualizer { avg: _.get(fieldStatsResp, 'avg', 0), isTopValuesSampled: field.cardinality >= SAMPLER_TOP_TERMS_THRESHOLD || samplerShardSize > 0, + topValues, + topValuesSampleSize: topValues.reduce( + (acc, curr) => acc + curr.doc_count, + _.get(aggregations, [...topAggsPath, 'sum_other_doc_count'], 0) + ), + topValuesSamplerShardSize: + field.cardinality >= SAMPLER_TOP_TERMS_THRESHOLD + ? SAMPLER_TOP_TERMS_SHARD_SIZE + : samplerShardSize, }; - const topAggsPath = [...aggsPath, `${safeFieldName}_top`]; - if (samplerShardSize < 1 && field.cardinality >= SAMPLER_TOP_TERMS_THRESHOLD) { - topAggsPath.push('top'); - } - - stats.topValues = _.get(aggregations, [...topAggsPath, 'buckets'], []); - stats.topValuesSampleSize = _.get(aggregations, [...topAggsPath, 'sum_other_doc_count'], 0); - stats.topValuesSamplerShardSize = - field.cardinality >= SAMPLER_TOP_TERMS_THRESHOLD - ? SAMPLER_TOP_TERMS_SHARD_SIZE - : samplerShardSize; - stats.topValues.forEach(bucket => { - stats.topValuesSampleSize += bucket.doc_count; - }); - if (stats.count > 0) { const percentiles = _.get( aggregations, [...aggsPath, `${safeFieldName}_percentiles`, 'values'], [] ); - const medianPercentile = _.find(percentiles, { key: 50 }); - stats.median = medianPercentile !== undefined ? medianPercentile.value : 0; + const medianPercentile: { value: number; key: number } | undefined = _.find(percentiles, { + key: 50, + }); + stats.median = medianPercentile !== undefined ? medianPercentile!.value : 0; stats.distribution = this.processDistributionData( percentiles, PERCENTILE_SPACING, @@ -546,19 +655,19 @@ export class DataVisualizer { } async getStringFieldsStats( - indexPatternTitle, - query, - fields, - samplerShardSize, - timeFieldName, - earliestMs, - latestMs + indexPatternTitle: string, + query: object, + fields: Field[], + samplerShardSize: number, + timeFieldName: string, + earliestMs: number, + latestMs: number ) { const index = indexPatternTitle; const size = 0; const filterCriteria = buildBaseFilterCriteria(timeFieldName, earliestMs, latestMs, query); - const aggs = {}; + const aggs: Aggs = {}; fields.forEach((field, i) => { const safeFieldName = getSafeAggregationName(field.fieldName, i); const top = { @@ -596,32 +705,38 @@ export class DataVisualizer { aggs: buildSamplerAggregation(aggs, samplerShardSize), }; - const resp = await this.callWithRequest('search', { index, size, body }); + const resp = await this.callAsCurrentUser('search', { + index, + size, + body, + }); const aggregations = resp.aggregations; const aggsPath = getSamplerAggregationsResponsePath(samplerShardSize); - const batchStats = []; + const batchStats: StringFieldStats[] = []; fields.forEach((field, i) => { const safeFieldName = getSafeAggregationName(field.fieldName, i); - const stats = { - fieldName: field.fieldName, - isTopValuesSampled: - field.cardinality >= SAMPLER_TOP_TERMS_THRESHOLD || samplerShardSize > 0, - }; const topAggsPath = [...aggsPath, `${safeFieldName}_top`]; if (samplerShardSize < 1 && field.cardinality >= SAMPLER_TOP_TERMS_THRESHOLD) { topAggsPath.push('top'); } - stats.topValues = _.get(aggregations, [...topAggsPath, 'buckets'], []); - stats.topValuesSampleSize = _.get(aggregations, [...topAggsPath, 'sum_other_doc_count'], 0); - stats.topValuesSamplerShardSize = - field.cardinality >= SAMPLER_TOP_TERMS_THRESHOLD - ? SAMPLER_TOP_TERMS_SHARD_SIZE - : samplerShardSize; - stats.topValues.forEach(bucket => { - stats.topValuesSampleSize += bucket.doc_count; - }); + const topValues: Bucket[] = _.get(aggregations, [...topAggsPath, 'buckets'], []); + + const stats = { + fieldName: field.fieldName, + isTopValuesSampled: + field.cardinality >= SAMPLER_TOP_TERMS_THRESHOLD || samplerShardSize > 0, + topValues, + topValuesSampleSize: topValues.reduce( + (acc, curr) => acc + curr.doc_count, + _.get(aggregations, [...topAggsPath, 'sum_other_doc_count'], 0) + ), + topValuesSamplerShardSize: + field.cardinality >= SAMPLER_TOP_TERMS_THRESHOLD + ? SAMPLER_TOP_TERMS_SHARD_SIZE + : samplerShardSize, + }; batchStats.push(stats); }); @@ -630,19 +745,19 @@ export class DataVisualizer { } async getDateFieldsStats( - indexPatternTitle, - query, - fields, - samplerShardSize, - timeFieldName, - earliestMs, - latestMs + indexPatternTitle: string, + query: object, + fields: Field[], + samplerShardSize: number, + timeFieldName: string, + earliestMs: number, + latestMs: number ) { const index = indexPatternTitle; const size = 0; const filterCriteria = buildBaseFilterCriteria(timeFieldName, earliestMs, latestMs, query); - const aggs = {}; + const aggs: Aggs = {}; fields.forEach((field, i) => { const safeFieldName = getSafeAggregationName(field.fieldName, i); aggs[`${safeFieldName}_field_stats`] = { @@ -664,10 +779,14 @@ export class DataVisualizer { aggs: buildSamplerAggregation(aggs, samplerShardSize), }; - const resp = await this.callWithRequest('search', { index, size, body }); + const resp = await this.callAsCurrentUser('search', { + index, + size, + body, + }); const aggregations = resp.aggregations; const aggsPath = getSamplerAggregationsResponsePath(samplerShardSize); - const batchStats = []; + const batchStats: DateFieldStats[] = []; fields.forEach((field, i) => { const safeFieldName = getSafeAggregationName(field.fieldName, i); const docCount = _.get( @@ -692,19 +811,19 @@ export class DataVisualizer { } async getBooleanFieldsStats( - indexPatternTitle, - query, - fields, - samplerShardSize, - timeFieldName, - earliestMs, - latestMs + indexPatternTitle: string, + query: object, + fields: Field[], + samplerShardSize: number, + timeFieldName: string, + earliestMs: number, + latestMs: number ) { const index = indexPatternTitle; const size = 0; const filterCriteria = buildBaseFilterCriteria(timeFieldName, earliestMs, latestMs, query); - const aggs = {}; + const aggs: Aggs = {}; fields.forEach((field, i) => { const safeFieldName = getSafeAggregationName(field.fieldName, i); aggs[`${safeFieldName}_value_count`] = { @@ -727,20 +846,24 @@ export class DataVisualizer { aggs: buildSamplerAggregation(aggs, samplerShardSize), }; - const resp = await this.callWithRequest('search', { index, size, body }); + const resp = await this.callAsCurrentUser('search', { + index, + size, + body, + }); const aggregations = resp.aggregations; const aggsPath = getSamplerAggregationsResponsePath(samplerShardSize); - const batchStats = []; + const batchStats: BooleanFieldStats[] = []; fields.forEach((field, i) => { const safeFieldName = getSafeAggregationName(field.fieldName, i); - const stats = { + const stats: BooleanFieldStats = { fieldName: field.fieldName, count: _.get(aggregations, [...aggsPath, `${safeFieldName}_value_count`, 'doc_count'], 0), trueCount: 0, falseCount: 0, }; - const valueBuckets = _.get( + const valueBuckets: Array<{ [key: string]: number }> = _.get( aggregations, [...aggsPath, `${safeFieldName}_values`, 'buckets'], [] @@ -756,14 +879,14 @@ export class DataVisualizer { } async getFieldExamples( - indexPatternTitle, - query, - field, - timeFieldName, - earliestMs, - latestMs, - maxExamples - ) { + indexPatternTitle: string, + query: any, + field: string, + timeFieldName: string, + earliestMs: number, + latestMs: number, + maxExamples: number + ): Promise { const index = indexPatternTitle; // Request at least 100 docs so that we have a chance of obtaining @@ -785,7 +908,7 @@ export class DataVisualizer { }, }; - const resp = await this.callWithRequest('search', { + const resp = await this.callAsCurrentUser('search', { index, rest_total_hits_as_int: true, size, @@ -793,7 +916,7 @@ export class DataVisualizer { }); const stats = { fieldName: field, - examples: [], + examples: [] as any[], }; if (resp.hits.total !== 0) { const hits = resp.hits.hits; @@ -803,7 +926,7 @@ export class DataVisualizer { // field is populated using copy_to in the index mapping), // there will be no example to add. // Use lodash _.get() to support field names containing dots. - const example = _.get(hits[i]._source, field); + const example: any = _.get(hits[i]._source, field); if (example !== undefined && stats.examples.indexOf(example) === -1) { stats.examples.push(example); if (stats.examples.length === maxExamples) { @@ -816,13 +939,17 @@ export class DataVisualizer { return stats; } - processDistributionData(percentiles, percentileSpacing, minValue) { - const distribution = { percentiles: [], minPercentile: 0, maxPercentile: 100 }; + processDistributionData( + percentiles: Array<{ value: number }>, + percentileSpacing: number, + minValue: number + ): Distribution { + const distribution: Distribution = { percentiles: [], minPercentile: 0, maxPercentile: 100 }; if (percentiles.length === 0) { return distribution; } - let percentileBuckets = []; + let percentileBuckets: Array<{ value: number }> = []; let lowerBound = minValue; if (lowerBound >= 0) { // By default return results for 0 - 90% percentiles. @@ -853,7 +980,7 @@ export class DataVisualizer { // Add in 0-5 and 95-100% if they don't add more // than 25% to the value range at either end. - const lastValue = _.last(percentileBuckets).value; + const lastValue: number = _.last(percentileBuckets).value; const maxDiff = 0.25 * (lastValue - lowerBound); if (lowerBound - dataMin < maxDiff) { percentileBuckets.splice(0, 0, percentiles[0]); diff --git a/x-pack/legacy/plugins/ml/server/models/data_visualizer/index.js b/x-pack/legacy/plugins/ml/server/models/data_visualizer/index.ts similarity index 100% rename from x-pack/legacy/plugins/ml/server/models/data_visualizer/index.js rename to x-pack/legacy/plugins/ml/server/models/data_visualizer/index.ts diff --git a/x-pack/legacy/plugins/ml/server/new_platform/data_visualizer_schema.ts b/x-pack/legacy/plugins/ml/server/new_platform/data_visualizer_schema.ts new file mode 100644 index 0000000000000..0c10b2d5b4f16 --- /dev/null +++ b/x-pack/legacy/plugins/ml/server/new_platform/data_visualizer_schema.ts @@ -0,0 +1,38 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { schema } from '@kbn/config-schema'; + +export const dataVisualizerFieldStatsSchema = { + params: schema.object({ + indexPatternTitle: schema.string(), + }), + body: schema.object({ + query: schema.any(), + fields: schema.arrayOf(schema.any()), + samplerShardSize: schema.number(), + timeFieldName: schema.maybe(schema.string()), + earliest: schema.maybe(schema.number()), + latest: schema.maybe(schema.number()), + interval: schema.maybe(schema.string()), + maxExamples: schema.number(), + }), +}; + +export const dataVisualizerOverallStatsSchema = { + params: schema.object({ + indexPatternTitle: schema.string(), + }), + body: schema.object({ + query: schema.any(), + aggregatableFields: schema.arrayOf(schema.string()), + nonAggregatableFields: schema.arrayOf(schema.string()), + samplerShardSize: schema.number(), + timeFieldName: schema.maybe(schema.string()), + earliest: schema.maybe(schema.number()), + latest: schema.maybe(schema.number()), + }), +}; diff --git a/x-pack/legacy/plugins/ml/server/routes/apidoc.json b/x-pack/legacy/plugins/ml/server/routes/apidoc.json index 8292e946cd344..4a3b93b9b866f 100644 --- a/x-pack/legacy/plugins/ml/server/routes/apidoc.json +++ b/x-pack/legacy/plugins/ml/server/routes/apidoc.json @@ -16,6 +16,9 @@ "DeleteDataFrameAnalytics", "StartDataFrameAnalyticsJob", "StopsDataFrameAnalyticsJob", - "GetDataFrameAnalyticsMessages" + "GetDataFrameAnalyticsMessages", + "DataVisualizer", + "GetOverallStats", + "GetStatsForFields" ] } diff --git a/x-pack/legacy/plugins/ml/server/routes/data_visualizer.js b/x-pack/legacy/plugins/ml/server/routes/data_visualizer.js deleted file mode 100644 index fe11f7f4fd5b2..0000000000000 --- a/x-pack/legacy/plugins/ml/server/routes/data_visualizer.js +++ /dev/null @@ -1,110 +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; - * you may not use this file except in compliance with the Elastic License. - */ - -import { callWithRequestFactory } from '../client/call_with_request_factory'; -import { wrapError } from '../client/errors'; -import { DataVisualizer } from '../models/data_visualizer'; - -function getOverallStats( - callWithRequest, - indexPatternTitle, - query, - aggregatableFields, - nonAggregatableFields, - samplerShardSize, - timeFieldName, - earliestMs, - latestMs -) { - const dv = new DataVisualizer(callWithRequest); - return dv.getOverallStats( - indexPatternTitle, - query, - aggregatableFields, - nonAggregatableFields, - samplerShardSize, - timeFieldName, - earliestMs, - latestMs - ); -} - -function getStatsForFields( - callWithRequest, - indexPatternTitle, - query, - fields, - samplerShardSize, - timeFieldName, - earliestMs, - latestMs, - interval, - maxExamples -) { - const dv = new DataVisualizer(callWithRequest); - return dv.getStatsForFields( - indexPatternTitle, - query, - fields, - samplerShardSize, - timeFieldName, - earliestMs, - latestMs, - interval, - maxExamples - ); -} - -export function dataVisualizerRoutes({ commonRouteConfig, elasticsearchPlugin, route }) { - route({ - method: 'POST', - path: '/api/ml/data_visualizer/get_field_stats/{indexPatternTitle}', - handler(request) { - const callWithRequest = callWithRequestFactory(elasticsearchPlugin, request); - const indexPatternTitle = request.params.indexPatternTitle; - const payload = request.payload; - return getStatsForFields( - callWithRequest, - indexPatternTitle, - payload.query, - payload.fields, - payload.samplerShardSize, - payload.timeFieldName, - payload.earliest, - payload.latest, - payload.interval, - payload.maxExamples - ).catch(resp => wrapError(resp)); - }, - config: { - ...commonRouteConfig, - }, - }); - - route({ - method: 'POST', - path: '/api/ml/data_visualizer/get_overall_stats/{indexPatternTitle}', - handler(request) { - const callWithRequest = callWithRequestFactory(elasticsearchPlugin, request); - const indexPatternTitle = request.params.indexPatternTitle; - const payload = request.payload; - return getOverallStats( - callWithRequest, - indexPatternTitle, - payload.query, - payload.aggregatableFields, - payload.nonAggregatableFields, - payload.samplerShardSize, - payload.timeFieldName, - payload.earliest, - payload.latest - ).catch(resp => wrapError(resp)); - }, - config: { - ...commonRouteConfig, - }, - }); -} diff --git a/x-pack/legacy/plugins/ml/server/routes/data_visualizer.ts b/x-pack/legacy/plugins/ml/server/routes/data_visualizer.ts new file mode 100644 index 0000000000000..235fc26d78441 --- /dev/null +++ b/x-pack/legacy/plugins/ml/server/routes/data_visualizer.ts @@ -0,0 +1,173 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { RequestHandlerContext } from 'kibana/server'; +import { wrapError } from '../client/error_wrapper'; +import { DataVisualizer } from '../models/data_visualizer'; +import { Field } from '../models/data_visualizer/data_visualizer'; +import { + dataVisualizerFieldStatsSchema, + dataVisualizerOverallStatsSchema, +} from '../new_platform/data_visualizer_schema'; +import { licensePreRoutingFactory } from '../new_platform/licence_check_pre_routing_factory'; +import { RouteInitialization } from '../new_platform/plugin'; + +function getOverallStats( + context: RequestHandlerContext, + indexPatternTitle: string, + query: object, + aggregatableFields: string[], + nonAggregatableFields: string[], + samplerShardSize: number, + timeFieldName: string, + earliestMs: number, + latestMs: number +) { + const dv = new DataVisualizer(context); + return dv.getOverallStats( + indexPatternTitle, + query, + aggregatableFields, + nonAggregatableFields, + samplerShardSize, + timeFieldName, + earliestMs, + latestMs + ); +} + +function getStatsForFields( + context: RequestHandlerContext, + indexPatternTitle: string, + query: any, + fields: Field[], + samplerShardSize: number, + timeFieldName: string, + earliestMs: number, + latestMs: number, + interval: number, + maxExamples: number +) { + const dv = new DataVisualizer(context); + return dv.getStatsForFields( + indexPatternTitle, + query, + fields, + samplerShardSize, + timeFieldName, + earliestMs, + latestMs, + interval, + maxExamples + ); +} + +/** + * Routes for the index data visualizer. + */ +export function dataVisualizerRoutes({ xpackMainPlugin, router }: RouteInitialization) { + /** + * @apiGroup DataVisualizer + * + * @api {post} /api/ml/data_visualizer/get_field_stats/:indexPatternTitle Get stats for fields + * @apiName GetStatsForFields + * @apiDescription Returns fields stats of the index pattern. + * + * @apiParam {String} indexPatternTitle Index pattern title. + */ + router.post( + { + path: '/api/ml/data_visualizer/get_field_stats/{indexPatternTitle}', + validate: dataVisualizerFieldStatsSchema, + }, + licensePreRoutingFactory(xpackMainPlugin, async (context, request, response) => { + try { + const { + params: { indexPatternTitle }, + body: { + query, + fields, + samplerShardSize, + timeFieldName, + earliest, + latest, + interval, + maxExamples, + }, + } = request; + + const results = await getStatsForFields( + context, + indexPatternTitle, + query, + fields, + samplerShardSize, + timeFieldName, + earliest, + latest, + interval, + maxExamples + ); + + return response.ok({ + body: results, + }); + } catch (e) { + return response.customError(wrapError(e)); + } + }) + ); + + /** + * @apiGroup DataVisualizer + * + * @api {post} /api/ml/data_visualizer/get_overall_stats/:indexPatternTitle Get overall stats + * @apiName GetOverallStats + * @apiDescription Returns overall stats of the index pattern. + * + * @apiParam {String} indexPatternTitle Index pattern title. + */ + router.post( + { + path: '/api/ml/data_visualizer/get_overall_stats/{indexPatternTitle}', + validate: dataVisualizerOverallStatsSchema, + }, + licensePreRoutingFactory(xpackMainPlugin, async (context, request, response) => { + try { + const { + params: { indexPatternTitle }, + body: { + query, + aggregatableFields, + nonAggregatableFields, + samplerShardSize, + timeFieldName, + earliest, + latest, + }, + } = request; + + const results = await getOverallStats( + context, + indexPatternTitle, + query, + aggregatableFields, + nonAggregatableFields, + samplerShardSize, + timeFieldName, + earliest, + latest + ); + + return response.ok({ + body: results, + }); + } catch (e) { + return response.customError(wrapError(e)); + } + }) + ); +} From 2814bf6e95c2a5e77a3499f430f66ffafa3c47a2 Mon Sep 17 00:00:00 2001 From: Vadim Dalecky Date: Wed, 5 Feb 2020 07:54:43 -0800 Subject: [PATCH 31/86] UiComponent (#56555) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: 🎸 add UiComponent and adapters * feat: 🎸 improve UiComponent * feat: 🎸 add MenuItem to IAction * test: 💍 add uiToReactComponent() tests * test: 💍 add reactToUiComponent() tests * feat: 🎸 allow specifying wrapper tag in uiToReactComponent() * style: 💄 format according to ESLint * docs: ✏️ improve JSDocs Co-authored-by: Elastic Machine Co-authored-by: Matthew Kime --- .../kibana_react/public/adapters/index.ts | 21 +++ .../adapters/react_to_ui_component.test.tsx | 86 ++++++++++ .../public/adapters/react_to_ui_component.ts | 49 ++++++ .../adapters/ui_to_react_component.test.tsx | 149 ++++++++++++++++++ .../public/adapters/ui_to_react_component.ts | 48 ++++++ src/plugins/kibana_react/public/index.ts | 1 + src/plugins/kibana_utils/common/index.ts | 1 + src/plugins/kibana_utils/common/ui/index.ts | 20 +++ .../kibana_utils/common/ui/ui_component.ts | 51 ++++++ src/plugins/kibana_utils/public/index.ts | 11 +- .../ui_actions/public/actions/i_action.ts | 8 + ...s.ts => build_eui_context_menu_panels.tsx} | 9 +- .../tests/test_samples/hello_world_action.tsx | 19 ++- 13 files changed, 469 insertions(+), 4 deletions(-) create mode 100644 src/plugins/kibana_react/public/adapters/index.ts create mode 100644 src/plugins/kibana_react/public/adapters/react_to_ui_component.test.tsx create mode 100644 src/plugins/kibana_react/public/adapters/react_to_ui_component.ts create mode 100644 src/plugins/kibana_react/public/adapters/ui_to_react_component.test.tsx create mode 100644 src/plugins/kibana_react/public/adapters/ui_to_react_component.ts create mode 100644 src/plugins/kibana_utils/common/ui/index.ts create mode 100644 src/plugins/kibana_utils/common/ui/ui_component.ts rename src/plugins/ui_actions/public/context_menu/{build_eui_context_menu_panels.ts => build_eui_context_menu_panels.tsx} (89%) diff --git a/src/plugins/kibana_react/public/adapters/index.ts b/src/plugins/kibana_react/public/adapters/index.ts new file mode 100644 index 0000000000000..9912967022793 --- /dev/null +++ b/src/plugins/kibana_react/public/adapters/index.ts @@ -0,0 +1,21 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export * from './react_to_ui_component'; +export * from './ui_to_react_component'; diff --git a/src/plugins/kibana_react/public/adapters/react_to_ui_component.test.tsx b/src/plugins/kibana_react/public/adapters/react_to_ui_component.test.tsx new file mode 100644 index 0000000000000..14fe02c6bf652 --- /dev/null +++ b/src/plugins/kibana_react/public/adapters/react_to_ui_component.test.tsx @@ -0,0 +1,86 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import * as React from 'react'; +import { reactToUiComponent } from './react_to_ui_component'; + +const ReactComp: React.FC<{ cnt?: number }> = ({ cnt = 0 }) => { + return
cnt: {cnt}
; +}; + +describe('reactToUiComponent', () => { + test('can render UI component', () => { + const UiComp = reactToUiComponent(ReactComp); + const div = document.createElement('div'); + + const instance = UiComp(); + instance.render(div, {}); + + expect(div.innerHTML).toBe('
cnt: 0
'); + }); + + test('can pass in props', async () => { + const UiComp = reactToUiComponent(ReactComp); + const div = document.createElement('div'); + + const instance = UiComp(); + instance.render(div, { cnt: 5 }); + + expect(div.innerHTML).toBe('
cnt: 5
'); + }); + + test('can re-render multiple times', async () => { + const UiComp = reactToUiComponent(ReactComp); + const div = document.createElement('div'); + const instance = UiComp(); + + instance.render(div, { cnt: 1 }); + + expect(div.innerHTML).toBe('
cnt: 1
'); + + instance.render(div, { cnt: 2 }); + + expect(div.innerHTML).toBe('
cnt: 2
'); + }); + + test('renders React component only when .render() method is called', () => { + let renderCnt = 0; + const MyReactComp: React.FC<{ cnt?: number }> = ({ cnt = 0 }) => { + renderCnt++; + return
cnt: {cnt}
; + }; + const UiComp = reactToUiComponent(MyReactComp); + const instance = UiComp(); + const div = document.createElement('div'); + + expect(renderCnt).toBe(0); + + instance.render(div, { cnt: 1 }); + + expect(renderCnt).toBe(1); + + instance.render(div, { cnt: 2 }); + + expect(renderCnt).toBe(2); + + instance.render(div, { cnt: 3 }); + + expect(renderCnt).toBe(3); + }); +}); diff --git a/src/plugins/kibana_react/public/adapters/react_to_ui_component.ts b/src/plugins/kibana_react/public/adapters/react_to_ui_component.ts new file mode 100644 index 0000000000000..b4007b30cf8ca --- /dev/null +++ b/src/plugins/kibana_react/public/adapters/react_to_ui_component.ts @@ -0,0 +1,49 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { ComponentType, createElement as h } from 'react'; +import { render as renderReact, unmountComponentAtNode } from 'react-dom'; +import { UiComponent, UiComponentInstance } from '../../../kibana_utils/common'; + +/** + * Transform a React component into a `UiComponent`. + * + * @param ReactComp A React component. + */ +export const reactToUiComponent = ( + ReactComp: ComponentType +): UiComponent => () => { + let lastEl: HTMLElement | undefined; + + const render: UiComponentInstance['render'] = (el, props) => { + lastEl = el; + renderReact(h(ReactComp, props), el); + }; + + const unmount: UiComponentInstance['unmount'] = () => { + if (lastEl) unmountComponentAtNode(lastEl); + }; + + const comp: UiComponentInstance = { + render, + unmount, + }; + + return comp; +}; diff --git a/src/plugins/kibana_react/public/adapters/ui_to_react_component.test.tsx b/src/plugins/kibana_react/public/adapters/ui_to_react_component.test.tsx new file mode 100644 index 0000000000000..939d372b9997f --- /dev/null +++ b/src/plugins/kibana_react/public/adapters/ui_to_react_component.test.tsx @@ -0,0 +1,149 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import * as React from 'react'; +import * as ReactDOM from 'react-dom'; +import { UiComponent } from '../../../kibana_utils/common'; +import { uiToReactComponent } from './ui_to_react_component'; +import { reactToUiComponent } from './react_to_ui_component'; + +const UiComp: UiComponent<{ cnt?: number }> = () => ({ + render: (el, { cnt = 0 }) => { + el.innerHTML = `cnt: ${cnt}`; + }, +}); + +describe('uiToReactComponent', () => { + test('can render React component', () => { + const ReactComp = uiToReactComponent(UiComp); + const div = document.createElement('div'); + + ReactDOM.render(, div); + + expect(div.innerHTML).toBe('
cnt: 0
'); + }); + + test('can pass in props', async () => { + const ReactComp = uiToReactComponent(UiComp); + const div = document.createElement('div'); + + ReactDOM.render(, div); + + expect(div.innerHTML).toBe('
cnt: 5
'); + }); + + test('re-renders when React component is re-rendered', async () => { + const ReactComp = uiToReactComponent(UiComp); + const div = document.createElement('div'); + + ReactDOM.render(, div); + + expect(div.innerHTML).toBe('
cnt: 1
'); + + ReactDOM.render(, div); + + expect(div.innerHTML).toBe('
cnt: 2
'); + }); + + test('does not crash if .unmount() not provided', () => { + const UiComp2: UiComponent<{ cnt?: number }> = () => ({ + render: (el, { cnt = 0 }) => { + el.innerHTML = `cnt: ${cnt}`; + }, + }); + const ReactComp = uiToReactComponent(UiComp2); + const div = document.createElement('div'); + + ReactDOM.render(, div); + ReactDOM.unmountComponentAtNode(div); + + expect(div.innerHTML).toBe(''); + }); + + test('calls .unmount() method once when component un-mounts', () => { + const unmount = jest.fn(); + const UiComp2: UiComponent<{ cnt?: number }> = () => ({ + render: (el, { cnt = 0 }) => { + el.innerHTML = `cnt: ${cnt}`; + }, + unmount, + }); + const ReactComp = uiToReactComponent(UiComp2); + const div = document.createElement('div'); + + expect(unmount).toHaveBeenCalledTimes(0); + + ReactDOM.render(, div); + + expect(unmount).toHaveBeenCalledTimes(0); + + ReactDOM.unmountComponentAtNode(div); + + expect(unmount).toHaveBeenCalledTimes(1); + }); + + test('calls .render() method only once when components mounts, and once on every re-render', () => { + const render = jest.fn((el, { cnt = 0 }) => { + el.innerHTML = `cnt: ${cnt}`; + }); + const UiComp2: UiComponent<{ cnt?: number }> = () => ({ + render, + }); + const ReactComp = uiToReactComponent(UiComp2); + const div = document.createElement('div'); + + expect(render).toHaveBeenCalledTimes(0); + + ReactDOM.render(, div); + + expect(render).toHaveBeenCalledTimes(1); + + ReactDOM.render(, div); + + expect(render).toHaveBeenCalledTimes(2); + + ReactDOM.render(, div); + + expect(render).toHaveBeenCalledTimes(3); + }); + + test('can specify wrapper element', async () => { + const ReactComp = uiToReactComponent(UiComp, 'span'); + const div = document.createElement('div'); + + ReactDOM.render(, div); + + expect(div.innerHTML).toBe('cnt: 5'); + }); +}); + +test('can adapt component many times', () => { + const ReactComp = uiToReactComponent( + reactToUiComponent(uiToReactComponent(reactToUiComponent(uiToReactComponent(UiComp)))) + ); + const div = document.createElement('div'); + + ReactDOM.render(, div); + + expect(div.textContent).toBe('cnt: 0'); + + ReactDOM.render(, div); + + expect(div.textContent).toBe('cnt: 123'); +}); diff --git a/src/plugins/kibana_react/public/adapters/ui_to_react_component.ts b/src/plugins/kibana_react/public/adapters/ui_to_react_component.ts new file mode 100644 index 0000000000000..9b34880cf4fe3 --- /dev/null +++ b/src/plugins/kibana_react/public/adapters/ui_to_react_component.ts @@ -0,0 +1,48 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { FC, createElement as h, useRef, useLayoutEffect, useMemo } from 'react'; +import { UiComponent, UiComponentInstance } from '../../../kibana_utils/common'; + +/** + * Transforms `UiComponent` into a React component. + */ +export const uiToReactComponent = ( + Comp: UiComponent, + as: string = 'div' +): FC => props => { + const ref = useRef(); + const comp = useMemo>(() => Comp(), [Comp]); + + useLayoutEffect(() => { + if (!ref.current) return; + comp.render(ref.current, props); + }); + + useLayoutEffect(() => { + if (!comp.unmount) return; + return () => { + if (comp.unmount) comp.unmount(); + }; + }, [comp]); + + return h(as, { + ref, + }); +}; diff --git a/src/plugins/kibana_react/public/index.ts b/src/plugins/kibana_react/public/index.ts index 81f2e694e8e5b..e1f90b9c60199 100644 --- a/src/plugins/kibana_react/public/index.ts +++ b/src/plugins/kibana_react/public/index.ts @@ -26,5 +26,6 @@ export * from './ui_settings'; export * from './field_icon'; export * from './table_list_view'; export * from './split_panel'; +export { reactToUiComponent, uiToReactComponent } from './adapters'; export { useUrlTracker } from './use_url_tracker'; export { toMountPoint } from './util'; diff --git a/src/plugins/kibana_utils/common/index.ts b/src/plugins/kibana_utils/common/index.ts index 444c10194a8e3..fb608a0db1ac2 100644 --- a/src/plugins/kibana_utils/common/index.ts +++ b/src/plugins/kibana_utils/common/index.ts @@ -19,6 +19,7 @@ export * from './defer'; export * from './of'; +export * from './ui'; export * from './state_containers'; export { createGetterSetter, Get, Set } from './create_getter_setter'; export { distinctUntilChangedWithInitialValue } from './distinct_until_changed_with_initial_value'; diff --git a/src/plugins/kibana_utils/common/ui/index.ts b/src/plugins/kibana_utils/common/ui/index.ts new file mode 100644 index 0000000000000..0cfb2f13c8a5d --- /dev/null +++ b/src/plugins/kibana_utils/common/ui/index.ts @@ -0,0 +1,20 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export * from './ui_component'; diff --git a/src/plugins/kibana_utils/common/ui/ui_component.ts b/src/plugins/kibana_utils/common/ui/ui_component.ts new file mode 100644 index 0000000000000..6984ab9b78e5f --- /dev/null +++ b/src/plugins/kibana_utils/common/ui/ui_component.ts @@ -0,0 +1,51 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * In many places in Kibana we want to be agnostic to frontend view library, + * i.e. instead of exposing React-specific APIs we want to expose APIs that + * are orthogonal to any rendering library. This interface represents such UI + * components. UI component receives a DOM element and `props` through `render()` + * method, the `render()` method can be called many times. + * + * Although Kibana aims to be library agnostic, Kibana itself is written in React, + * thus here we define `UiComponent` which is an abstract unit of UI that can be + * implemented in any framework, but it maps easily to React components, i.e. + * `UiComponent` is like `React.ComponentType`. + */ +export type UiComponent = () => UiComponentInstance; + +/** + * Instance of an UiComponent, corresponds to React virtual DOM node. + */ +export interface UiComponentInstance { + /** + * Call this method on initial render and on all subsequent updates. + * + * @param el DOM element. + * @param props Component props, same as props in React. + */ + render(el: HTMLElement, props: Props): void; + + /** + * Un-mount UI component. Call it to remove view from DOM. Implementers of this + * interface should clear DOM from this UI component and destroy any internal state. + */ + unmount?(): void; +} diff --git a/src/plugins/kibana_utils/public/index.ts b/src/plugins/kibana_utils/public/index.ts index 5b6d304e14c2e..9ab7c8cf3f2b7 100644 --- a/src/plugins/kibana_utils/public/index.ts +++ b/src/plugins/kibana_utils/public/index.ts @@ -17,7 +17,16 @@ * under the License. */ -export { defer, Defer, of, createGetterSetter, Get, Set } from '../common'; +export { + defer, + Defer, + of, + createGetterSetter, + Get, + Set, + UiComponent, + UiComponentInstance, +} from '../common'; export * from './core'; export * from './errors'; export * from './field_mapping'; diff --git a/src/plugins/ui_actions/public/actions/i_action.ts b/src/plugins/ui_actions/public/actions/i_action.ts index 20fdda9033f6a..544b66b26c974 100644 --- a/src/plugins/ui_actions/public/actions/i_action.ts +++ b/src/plugins/ui_actions/public/actions/i_action.ts @@ -17,6 +17,8 @@ * under the License. */ +import { UiComponent } from 'src/plugins/kibana_utils/common'; + export interface IAction { /** * Determined the order when there is more than one action matched to a trigger. @@ -39,6 +41,12 @@ export interface IAction { */ getDisplayName(context: ActionContext): string; + /** + * `UiComponent` to render when displaying this action as a context menu item. + * If not provided, `getDisplayName` will be used instead. + */ + MenuItem?: UiComponent<{ context: ActionContext }>; + /** * Returns a promise that resolves to true if this action is compatible given the context, * otherwise resolves to false. diff --git a/src/plugins/ui_actions/public/context_menu/build_eui_context_menu_panels.ts b/src/plugins/ui_actions/public/context_menu/build_eui_context_menu_panels.tsx similarity index 89% rename from src/plugins/ui_actions/public/context_menu/build_eui_context_menu_panels.ts rename to src/plugins/ui_actions/public/context_menu/build_eui_context_menu_panels.tsx index 8de447f5acf9c..3b76ff66f3aea 100644 --- a/src/plugins/ui_actions/public/context_menu/build_eui_context_menu_panels.ts +++ b/src/plugins/ui_actions/public/context_menu/build_eui_context_menu_panels.tsx @@ -17,9 +17,11 @@ * under the License. */ +import * as React from 'react'; import { EuiContextMenuPanelDescriptor, EuiContextMenuPanelItemDescriptor } from '@elastic/eui'; import _ from 'lodash'; import { i18n } from '@kbn/i18n'; +import { uiToReactComponent } from '../../../kibana_react/public'; import { IAction } from '../actions'; /** @@ -98,7 +100,12 @@ function convertPanelActionToContextMenuItem({ closeMenu: () => void; }): EuiContextMenuPanelItemDescriptor { const menuPanelItem: EuiContextMenuPanelItemDescriptor = { - name: action.getDisplayName(actionContext), + name: action.MenuItem + ? // Cast to `any` because `name` typed to string. + (React.createElement(uiToReactComponent(action.MenuItem), { + context: actionContext, + }) as any) + : action.getDisplayName(actionContext), icon: action.getIconType(actionContext), panel: _.get(action, 'childContextMenuPanel.id'), 'data-test-subj': `embeddablePanelAction-${action.id}`, diff --git a/src/plugins/ui_actions/public/tests/test_samples/hello_world_action.tsx b/src/plugins/ui_actions/public/tests/test_samples/hello_world_action.tsx index 9e3d206c9a6dc..4e18b8ec27fb9 100644 --- a/src/plugins/ui_actions/public/tests/test_samples/hello_world_action.tsx +++ b/src/plugins/ui_actions/public/tests/test_samples/hello_world_action.tsx @@ -18,16 +18,31 @@ */ import React from 'react'; -import { EuiFlyout } from '@elastic/eui'; +import { EuiFlyout, EuiFlexGroup, EuiFlexItem, EuiBadge } from '@elastic/eui'; import { CoreStart } from 'src/core/public'; import { createAction, IAction } from '../../actions'; -import { toMountPoint } from '../../../../kibana_react/public'; +import { toMountPoint, reactToUiComponent } from '../../../../kibana_react/public'; + +const ReactMenuItem: React.FC = () => { + return ( + + Hello world! + + {'secret'} + + + ); +}; + +const UiMenuItem = reactToUiComponent(ReactMenuItem); export const HELLO_WORLD_ACTION_ID = 'HELLO_WORLD_ACTION_ID'; export function createHelloWorldAction(overlays: CoreStart['overlays']): IAction { return createAction({ type: HELLO_WORLD_ACTION_ID, + getIconType: () => 'lock', + MenuItem: UiMenuItem, execute: async () => { const flyoutSession = overlays.openFlyout( toMountPoint( From 5884c5ccf75e8894207584b5916e2831fa70ab0b Mon Sep 17 00:00:00 2001 From: Alexey Antonov Date: Wed, 5 Feb 2020 18:59:31 +0300 Subject: [PATCH 32/86] Rollup index pattern error: must match one rollup index (#56732) Closes: #32765 Co-authored-by: Elastic Machine --- .../rollup_index_pattern_creation_config.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/x-pack/legacy/plugins/rollup/public/index_pattern_creation/rollup_index_pattern_creation_config.js b/x-pack/legacy/plugins/rollup/public/index_pattern_creation/rollup_index_pattern_creation_config.js index 82a4c5a888594..f0eb21a219442 100644 --- a/x-pack/legacy/plugins/rollup/public/index_pattern_creation/rollup_index_pattern_creation_config.js +++ b/x-pack/legacy/plugins/rollup/public/index_pattern_creation/rollup_index_pattern_creation_config.js @@ -56,7 +56,6 @@ export class RollupIndexPatternCreationConfig extends IndexPatternCreationConfig this.rollupJobs = []; this.rollupIndicesCapabilities = {}; this.rollupIndices = []; - this.settingUp = this.setRollupIndices(); } async setRollupIndices() { @@ -77,7 +76,7 @@ export class RollupIndexPatternCreationConfig extends IndexPatternCreationConfig } async getIndexPatternCreationOption(urlHandler) { - await this.settingUp; + await this.setRollupIndices(); return this.rollupIndices && this.rollupIndices.length ? { text: rollupIndexPatternButtonText, From 152eb9f7a28b4b87468ac5c541d34ba0723c4161 Mon Sep 17 00:00:00 2001 From: Ben Skelker <54019610+benskelker@users.noreply.github.com> Date: Wed, 5 Feb 2020 18:05:30 +0200 Subject: [PATCH 33/86] [Docs][SIEM] 7.6 updates (#56844) * adds detections description * 7.6 updated and screenshots --- docs/siem/images/detections-ui.png | Bin 0 -> 310344 bytes docs/siem/images/hosts-ui.png | Bin 154026 -> 419585 bytes docs/siem/images/network-ui.png | Bin 415975 -> 727366 bytes docs/siem/images/overview-ui.png | Bin 112076 -> 512997 bytes docs/siem/siem-ui.asciidoc | 17 +++++++++++++++++ 5 files changed, 17 insertions(+) create mode 100644 docs/siem/images/detections-ui.png diff --git a/docs/siem/images/detections-ui.png b/docs/siem/images/detections-ui.png new file mode 100644 index 0000000000000000000000000000000000000000..3139ffea0767d85aeb0a41d640cda1f24dc1d3c3 GIT binary patch literal 310344 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%0AZ=y-wqDq1n9i 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

7ua$lDmFaNO@j(r&S>65)iKf(f$ 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¤J5K0>5U#rxknQMPegCy!cv^$);TT7M$(E- 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≶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

lkXYv*l3k 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

5DrAKajcubxSu)7aW4hS)RZ!REZv4zoEo5grP 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

D?J6(&Z5PY(e#r# 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 diff --git a/docs/siem/images/network-ui.png b/docs/siem/images/network-ui.png index 406ac854cd0a2595addffeb725594a2d183aef5e..de8ce89273a022d834a84ea001ffa2722675bfe1 100644 GIT binary patch literal 727366 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]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

bZhBU1KXM##HzC_ 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 YHb3m3uUY)`K>~ght<8 literal 415975 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%0D}-1*ybCM+d|t5t`f%cR!7c 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%0AljY=dc4ua~mKX#{1qK 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

EoYy4R3~SOAnhb6k4byWj5&fp~*hiTnus-rq;Y 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

C+|2POjucZ}hG+<5pow0>WW)*$bqka$ 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 +f#?rR9Nw48aJUoer0~!yhG5+ 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≥O7Xn5U<2T`qv{XX45NHuf7b2zj~Flr(nS8AvuW` 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

P%FDV2FbhU+HliRPe!Eb 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 +rzLHZYR}H^$ zokatCeVB`~SQlRC_Y$!}j-~9IeP;q@lr2LBD|Ir5Bc-3=a6-++LUuXtHn23Qr_FIZuu<*KTDj(Cb3s7?GNA9#M% zT;77a8XJlCln7W^bIg6kU$;o;_W}MTryzvaK1ur#zzs-R)EHtB0kOLz)y*a-id{1| zHOS1+0R#{v4oEg0Y-T<1eLONWUO5z?p`ut^hZbolf-_2<_5MFumr-(N3?V_d>tl**Zr7cgk^cuq42LJGHLUt_dSE9Tu? zDsG+8Pd<5hxWu9<-+iF^;VuQL@fI*g0V71=Uz`63qF#{tUS5z%8j6{HjHFz_miD1w!>y$Ul`Gja8UPB` zwsgx>4Zb0(>+W4@CR8CMFai;6R6e#ZeQENRd7z%`XO@L!)@I@&az%O2F00#&Wh@W! z5lf*lZbUoh=%ccH6_O9WfEQ~6+-(xSXB!2B9?7#^`%?vD2*$0q5+?O4w~ za_C@I_3to>rcd`F zum$d7)2 z$SP{NAtD}X5#iRZ~eYs+Le z^Yc4`Bcka9uos$x$b zF}>as{?T*&kB|Dg#rpXz8I0P^56D*SNUHAep6R>wH};ZNHRP!{bUqk<+RRPa@h{1+ z7&DS^G&iuaaJEy}%Y(`~g_QV)^hL!!^g6Y0oIvCcBiun=(dh-6rKA@kj<2g0X7UVq z_+772&{{B;Xf^8jncp5|^Qyd}Oe9rs>@NEOF>o~twu zR=U%mr50+^%}>8u+gIftRCZZt@BdX+RAQ=zqA7&JESJcaH)XitRc-CL)<1UPUNucQ2Iu`4BORX9)Iv)ya?u-WLWuMgq+BY_u`LZ;*1Ij zNLuAuN6=RnSOZG(lQJVY$0nEJp&Baqdb*O5TQp%{)#=Xon+q{*GrRv6Y2q$*B22UY zv+iQFEFh4gih1|5jgi}kna*pwWT8i|0sYBD!(vhumAc}KnAo)$UTKl{l$zB0DUSO6P|LgnLcK(kxsAFQdtxzVI%X?k zBKy{Q@xS-a?~neu{XS@g2mAlml1fQYNA;4v-oJL_ozokWZ+8BgzvW%-Ouc!RRkRN@ z!d)ivKUv`4zxMF^`G5Z1{8fJN|K5K;PUhDO|9P9g@8{e7|85t%xGcP(*m1Y%hGj== z%ZA&NVxic2W20Zitx&Cap{lCC@GCvOYKfLe0kN^L_-M#l~ zzwiBW`@NZ}Oc_>SWcl{A3U`3{Cz&VRdXk9cTgt1TKCA#WD!Ir~o!lz@TIg&`vP0iUS5B7|7}a zYkM&0n+}{R1B2tB#q}Vt=Dv0SG)@{an^LB{Ts5v-4t6 diff --git a/docs/siem/siem-ui.asciidoc b/docs/siem/siem-ui.asciidoc index 7294cfbc414f4..f01575a21b9f6 100644 --- a/docs/siem/siem-ui.asciidoc +++ b/docs/siem/siem-ui.asciidoc @@ -33,6 +33,23 @@ investigation. [role="screenshot"] image::siem/images/network-ui.png[] +[float] +[[detections-ui]] +=== Detections + +The Detections feature automatically searches for threats and creates +signals when they are detected. Signal detection rules define the conditions +for creating signals. The SIEM app comes with prebuilt rules that search for +suspicious activity on your network and hosts. Additionally, you can +create your own rules. + +See {siem-guide}/detection-engine-overview.html[Detections] in the SIEM +Guide for information on managing detection rules and signals via the UI +or the Detections API. + +[role="screenshot"] +image::siem/images/detections-ui.png[] + [float] [[timelines-ui]] === Timeline From df8fbcc569fda2184b68d4d95b9a655084ae87b4 Mon Sep 17 00:00:00 2001 From: Justin Kambic Date: Wed, 5 Feb 2020 09:08:14 -0700 Subject: [PATCH 34/86] [Uptime] Refactor adapter classes to individual modules (#56254) * Migrate pings adapter to individual files. * Rename database calls folder to "requests". * Port monitor adapter methods to dedicated files. * Refactor states index adapter to request modules. * Fix a regression. * Update snapshot. --- .../plugins/oss_telemetry/test_utils/index.ts | 2 +- .../graphql/monitor_states/resolvers.ts | 6 +- .../server/graphql/monitors/resolvers.ts | 2 +- .../uptime/server/graphql/pings/resolvers.ts | 4 +- .../plugins/uptime/server/graphql/types.ts | 2 +- .../uptime/server/lib/adapters/index.ts | 4 - .../adapters/monitor_states/adapter_types.ts | 64 --- .../elasticsearch_monitor_states_adapter.ts | 154 ------ .../lib/adapters/monitor_states/index.ts | 8 - .../lib/adapters/monitors/adapter_types.ts | 70 --- .../elasticsearch_monitors_adapter.ts | 385 -------------- .../elasticsearch_pings_adapter.test.ts | 495 ------------------ .../server/lib/adapters/pings/es_pings.ts | 183 ------- .../uptime/server/lib/adapters/pings/index.ts | 8 - .../lib/adapters/stub_index_pattern/index.ts | 7 - .../stub_index_pattern/stub_index_pattern.ts | 54 -- .../uptime/server/lib/compose/kibana.ts | 12 +- .../plugins/uptime/server/lib/helper/index.ts | 1 + .../legacy/plugins/uptime/server/lib/lib.ts | 14 +- .../extract_filter_aggs_results.test.ts.snap | 0 .../generate_filter_aggs.test.ts.snap | 0 .../get_monitor_charts.test.ts.snap} | 0 .../get_ping_histogram.test.ts.snap} | 12 +- .../combine_range_with_filters.test.ts | 2 +- .../extract_filter_aggs_results.test.ts | 2 +- .../__tests__/generate_filter_aggs.test.ts | 0 .../requests/__tests__/get_doc_count.test.ts | 42 ++ .../__tests__/get_latest_monitor.test.ts | 93 ++++ .../__tests__/get_monitor_charts.test.ts} | 11 +- .../__tests__/get_ping_histogram.test.ts | 241 +++++++++ .../lib/requests/__tests__/get_pings.test.ts | 163 ++++++ .../__tests__/monitor_charts_mock.json | 0 .../generate_filter_aggs.ts | 0 .../server/lib/requests/get_doc_count.ts | 15 + .../server/lib/requests/get_filter_bar.ts | 98 ++++ .../server/lib/requests/get_index_pattern.ts | 45 ++ .../server/lib/requests/get_latest_monitor.ts | 78 +++ .../uptime/server/lib/requests/get_monitor.ts | 50 ++ .../server/lib/requests/get_monitor_charts.ts | 176 +++++++ .../lib/requests/get_monitor_details.ts | 76 +++ .../lib/requests/get_monitor_locations.ts | 117 +++++ .../server/lib/requests/get_monitor_states.ts | 68 +++ .../get_ping_histogram.ts} | 36 +- .../uptime/server/lib/requests/get_pings.ts | 108 ++++ .../lib/requests/get_snapshot_counts.ts | 102 ++++ .../lib/requests/get_states_index_status.ts | 24 + .../uptime/server/lib/requests/index.ts | 20 + .../search/__tests__/fetch_page.test.ts | 2 +- .../__tests__/find_potential_matches_test.ts | 0 .../__tests__/monitor_group_iterator.test.ts | 0 .../search/__tests__/query_context.test.ts | 4 +- .../search/__tests__/test_helpers.ts | 4 +- .../search/enrich_monitor_groups.ts | 6 +- .../search/fetch_chunk.ts | 0 .../search/fetch_page.ts | 6 +- .../search/find_potential_matches.ts | 4 +- .../search/index.ts | 1 + .../search/monitor_group_iterator.ts | 4 +- .../search/query_context.ts | 8 +- .../search/refine_potential_matches.ts | 4 +- .../index.ts => requests/search/types.ts} | 9 +- .../lib/{adapters/pings => requests}/types.ts | 17 +- .../server/lib/requests/uptime_requests.ts | 52 ++ .../plugins/uptime/server/rest_api/index.ts | 4 +- .../index_pattern/get_index_pattern.ts | 2 +- .../rest_api/monitors/monitor_locations.ts | 2 +- .../rest_api/monitors/monitors_details.ts | 2 +- .../uptime/server/rest_api/monitors/status.ts | 4 +- .../overview_filters/get_overview_filters.ts | 2 +- .../rest_api/pings/get_ping_histogram.ts | 6 +- .../pings/{get_all.ts => get_pings.ts} | 4 +- .../uptime/server/rest_api/pings/index.ts | 2 +- .../rest_api/snapshot/get_snapshot_count.ts | 2 +- .../plugins/uptime/server/rest_api/types.ts | 2 +- x-pack/test/functional/services/uptime.ts | 5 +- 75 files changed, 1678 insertions(+), 1534 deletions(-) delete mode 100644 x-pack/legacy/plugins/uptime/server/lib/adapters/monitor_states/adapter_types.ts delete mode 100644 x-pack/legacy/plugins/uptime/server/lib/adapters/monitor_states/elasticsearch_monitor_states_adapter.ts delete mode 100644 x-pack/legacy/plugins/uptime/server/lib/adapters/monitor_states/index.ts delete mode 100644 x-pack/legacy/plugins/uptime/server/lib/adapters/monitors/adapter_types.ts delete mode 100644 x-pack/legacy/plugins/uptime/server/lib/adapters/monitors/elasticsearch_monitors_adapter.ts delete mode 100644 x-pack/legacy/plugins/uptime/server/lib/adapters/pings/__tests__/elasticsearch_pings_adapter.test.ts delete mode 100644 x-pack/legacy/plugins/uptime/server/lib/adapters/pings/es_pings.ts delete mode 100644 x-pack/legacy/plugins/uptime/server/lib/adapters/pings/index.ts delete mode 100644 x-pack/legacy/plugins/uptime/server/lib/adapters/stub_index_pattern/index.ts delete mode 100644 x-pack/legacy/plugins/uptime/server/lib/adapters/stub_index_pattern/stub_index_pattern.ts rename x-pack/legacy/plugins/uptime/server/lib/{adapters/monitors => requests}/__tests__/__snapshots__/extract_filter_aggs_results.test.ts.snap (100%) rename x-pack/legacy/plugins/uptime/server/lib/{adapters/monitors => requests}/__tests__/__snapshots__/generate_filter_aggs.test.ts.snap (100%) rename x-pack/legacy/plugins/uptime/server/lib/{adapters/monitors/__tests__/__snapshots__/elasticsearch_monitors_adapter.test.ts.snap => requests/__tests__/__snapshots__/get_monitor_charts.test.ts.snap} (100%) rename x-pack/legacy/plugins/uptime/server/lib/{adapters/pings/__tests__/__snapshots__/elasticsearch_pings_adapter.test.ts.snap => requests/__tests__/__snapshots__/get_ping_histogram.test.ts.snap} (70%) rename x-pack/legacy/plugins/uptime/server/lib/{adapters/monitors => requests}/__tests__/combine_range_with_filters.test.ts (96%) rename x-pack/legacy/plugins/uptime/server/lib/{adapters/monitors => requests}/__tests__/extract_filter_aggs_results.test.ts (96%) rename x-pack/legacy/plugins/uptime/server/lib/{adapters/monitors => requests}/__tests__/generate_filter_aggs.test.ts (100%) create mode 100644 x-pack/legacy/plugins/uptime/server/lib/requests/__tests__/get_doc_count.test.ts create mode 100644 x-pack/legacy/plugins/uptime/server/lib/requests/__tests__/get_latest_monitor.test.ts rename x-pack/legacy/plugins/uptime/server/lib/{adapters/monitors/__tests__/elasticsearch_monitors_adapter.test.ts => requests/__tests__/get_monitor_charts.test.ts} (88%) create mode 100644 x-pack/legacy/plugins/uptime/server/lib/requests/__tests__/get_ping_histogram.test.ts create mode 100644 x-pack/legacy/plugins/uptime/server/lib/requests/__tests__/get_pings.test.ts rename x-pack/legacy/plugins/uptime/server/lib/{adapters/monitors => requests}/__tests__/monitor_charts_mock.json (100%) rename x-pack/legacy/plugins/uptime/server/lib/{adapters/monitors => requests}/generate_filter_aggs.ts (100%) create mode 100644 x-pack/legacy/plugins/uptime/server/lib/requests/get_doc_count.ts create mode 100644 x-pack/legacy/plugins/uptime/server/lib/requests/get_filter_bar.ts create mode 100644 x-pack/legacy/plugins/uptime/server/lib/requests/get_index_pattern.ts create mode 100644 x-pack/legacy/plugins/uptime/server/lib/requests/get_latest_monitor.ts create mode 100644 x-pack/legacy/plugins/uptime/server/lib/requests/get_monitor.ts create mode 100644 x-pack/legacy/plugins/uptime/server/lib/requests/get_monitor_charts.ts create mode 100644 x-pack/legacy/plugins/uptime/server/lib/requests/get_monitor_details.ts create mode 100644 x-pack/legacy/plugins/uptime/server/lib/requests/get_monitor_locations.ts create mode 100644 x-pack/legacy/plugins/uptime/server/lib/requests/get_monitor_states.ts rename x-pack/legacy/plugins/uptime/server/lib/{adapters/pings/es_get_ping_historgram.ts => requests/get_ping_histogram.ts} (60%) create mode 100644 x-pack/legacy/plugins/uptime/server/lib/requests/get_pings.ts create mode 100644 x-pack/legacy/plugins/uptime/server/lib/requests/get_snapshot_counts.ts create mode 100644 x-pack/legacy/plugins/uptime/server/lib/requests/get_states_index_status.ts create mode 100644 x-pack/legacy/plugins/uptime/server/lib/requests/index.ts rename x-pack/legacy/plugins/uptime/server/lib/{adapters/monitor_states => requests}/search/__tests__/fetch_page.test.ts (97%) rename x-pack/legacy/plugins/uptime/server/lib/{adapters/monitor_states => requests}/search/__tests__/find_potential_matches_test.ts (100%) rename x-pack/legacy/plugins/uptime/server/lib/{adapters/monitor_states => requests}/search/__tests__/monitor_group_iterator.test.ts (100%) rename x-pack/legacy/plugins/uptime/server/lib/{adapters/monitor_states => requests}/search/__tests__/query_context.test.ts (94%) rename x-pack/legacy/plugins/uptime/server/lib/{adapters/monitor_states => requests}/search/__tests__/test_helpers.ts (85%) rename x-pack/legacy/plugins/uptime/server/lib/{adapters/monitor_states => requests}/search/enrich_monitor_groups.ts (98%) rename x-pack/legacy/plugins/uptime/server/lib/{adapters/monitor_states => requests}/search/fetch_chunk.ts (100%) rename x-pack/legacy/plugins/uptime/server/lib/{adapters/monitor_states => requests}/search/fetch_page.ts (97%) rename x-pack/legacy/plugins/uptime/server/lib/{adapters/monitor_states => requests}/search/find_potential_matches.ts (96%) rename x-pack/legacy/plugins/uptime/server/lib/{adapters/monitor_states => requests}/search/index.ts (89%) rename x-pack/legacy/plugins/uptime/server/lib/{adapters/monitor_states => requests}/search/monitor_group_iterator.ts (98%) rename x-pack/legacy/plugins/uptime/server/lib/{adapters/monitor_states => requests}/search/query_context.ts (94%) rename x-pack/legacy/plugins/uptime/server/lib/{adapters/monitor_states => requests}/search/refine_potential_matches.ts (97%) rename x-pack/legacy/plugins/uptime/server/lib/{adapters/monitors/index.ts => requests/search/types.ts} (55%) rename x-pack/legacy/plugins/uptime/server/lib/{adapters/pings => requests}/types.ts (88%) create mode 100644 x-pack/legacy/plugins/uptime/server/lib/requests/uptime_requests.ts rename x-pack/legacy/plugins/uptime/server/rest_api/pings/{get_all.ts => get_pings.ts} (90%) diff --git a/x-pack/legacy/plugins/oss_telemetry/test_utils/index.ts b/x-pack/legacy/plugins/oss_telemetry/test_utils/index.ts index 0695fda3c2c94..8a8a5d18cd5f7 100644 --- a/x-pack/legacy/plugins/oss_telemetry/test_utils/index.ts +++ b/x-pack/legacy/plugins/oss_telemetry/test_utils/index.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { APICaller, CoreSetup } from 'kibana/server'; +import { APICaller, CoreSetup } from 'src/core/server'; import { ConcreteTaskInstance, diff --git a/x-pack/legacy/plugins/uptime/server/graphql/monitor_states/resolvers.ts b/x-pack/legacy/plugins/uptime/server/graphql/monitor_states/resolvers.ts index 8ddb07b3093d0..45b073086d212 100644 --- a/x-pack/legacy/plugins/uptime/server/graphql/monitor_states/resolvers.ts +++ b/x-pack/legacy/plugins/uptime/server/graphql/monitor_states/resolvers.ts @@ -50,8 +50,8 @@ export const createMonitorStatesResolvers: CreateUMGraphQLResolvers = ( totalSummaryCount, { summaries, nextPagePagination, prevPagePagination }, ] = await Promise.all([ - libs.pings.getDocCount({ callES: APICaller }), - libs.monitorStates.getMonitorStates({ + libs.requests.getDocCount({ callES: APICaller }), + libs.requests.getMonitorStates({ callES: APICaller, dateRangeStart, dateRangeEnd, @@ -71,7 +71,7 @@ export const createMonitorStatesResolvers: CreateUMGraphQLResolvers = ( }; }, async getStatesIndexStatus(_resolver, {}, { APICaller }): Promise { - return await libs.monitorStates.statesIndexExists({ callES: APICaller }); + return await libs.requests.getStatesIndexStatus({ callES: APICaller }); }, }, }; diff --git a/x-pack/legacy/plugins/uptime/server/graphql/monitors/resolvers.ts b/x-pack/legacy/plugins/uptime/server/graphql/monitors/resolvers.ts index cc5744eac6ea1..19f23fa1bb934 100644 --- a/x-pack/legacy/plugins/uptime/server/graphql/monitors/resolvers.ts +++ b/x-pack/legacy/plugins/uptime/server/graphql/monitors/resolvers.ts @@ -29,7 +29,7 @@ export const createMonitorsResolvers: CreateUMGraphQLResolvers = ( { monitorId, dateRangeStart, dateRangeEnd, location }, { APICaller } ): Promise { - return libs.monitors.getMonitorChartsData({ + return await libs.requests.getMonitorCharts({ callES: APICaller, monitorId, dateRangeStart, diff --git a/x-pack/legacy/plugins/uptime/server/graphql/pings/resolvers.ts b/x-pack/legacy/plugins/uptime/server/graphql/pings/resolvers.ts index 373e1467433a2..dea7469ab6217 100644 --- a/x-pack/legacy/plugins/uptime/server/graphql/pings/resolvers.ts +++ b/x-pack/legacy/plugins/uptime/server/graphql/pings/resolvers.ts @@ -38,7 +38,7 @@ export const createPingsResolvers: CreateUMGraphQLResolvers = ( { monitorId, sort, size, status, dateRangeStart, dateRangeEnd, location }, { APICaller } ): Promise { - return await libs.pings.getAll({ + return await libs.requests.getPings({ callES: APICaller, dateRangeStart, dateRangeEnd, @@ -50,7 +50,7 @@ export const createPingsResolvers: CreateUMGraphQLResolvers = ( }); }, async getDocCount(_resolver, _args, { APICaller }): Promise { - return libs.pings.getDocCount({ callES: APICaller }); + return libs.requests.getDocCount({ callES: APICaller }); }, }, }); diff --git a/x-pack/legacy/plugins/uptime/server/graphql/types.ts b/x-pack/legacy/plugins/uptime/server/graphql/types.ts index 529ab41a62b3b..8508066a71f98 100644 --- a/x-pack/legacy/plugins/uptime/server/graphql/types.ts +++ b/x-pack/legacy/plugins/uptime/server/graphql/types.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { RequestHandlerContext, CallAPIOptions } from 'kibana/server'; +import { RequestHandlerContext, CallAPIOptions } from 'src/core/server'; import { UMServerLibs } from '../lib/lib'; export type UMContext = RequestHandlerContext & { diff --git a/x-pack/legacy/plugins/uptime/server/lib/adapters/index.ts b/x-pack/legacy/plugins/uptime/server/lib/adapters/index.ts index fbef70f106dd8..9b3b11712b99b 100644 --- a/x-pack/legacy/plugins/uptime/server/lib/adapters/index.ts +++ b/x-pack/legacy/plugins/uptime/server/lib/adapters/index.ts @@ -5,8 +5,4 @@ */ export * from './framework'; -export * from './monitor_states'; -export * from './monitors'; -export * from './pings'; -export * from './stub_index_pattern'; export * from './telemetry'; diff --git a/x-pack/legacy/plugins/uptime/server/lib/adapters/monitor_states/adapter_types.ts b/x-pack/legacy/plugins/uptime/server/lib/adapters/monitor_states/adapter_types.ts deleted file mode 100644 index 4104a9287a28d..0000000000000 --- a/x-pack/legacy/plugins/uptime/server/lib/adapters/monitor_states/adapter_types.ts +++ /dev/null @@ -1,64 +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; - * you may not use this file except in compliance with the Elastic License. - */ - -import { - MonitorSummary, - CursorDirection, - SortOrder, - StatesIndexStatus, -} from '../../../../common/graphql/types'; -import { UMElasticsearchQueryFn } from '../framework'; -import { Snapshot } from '../../../../common/runtime_types'; - -export interface MonitorStatesParams { - dateRangeStart: string; - dateRangeEnd: string; - pagination?: CursorPagination; - filters?: string | null; - statusFilter?: string; -} - -export interface GetSnapshotCountParams { - dateRangeStart: string; - dateRangeEnd: string; - filters?: string | null; - statusFilter?: string; -} - -export interface UMMonitorStatesAdapter { - getMonitorStates: UMElasticsearchQueryFn; - getSnapshotCount: UMElasticsearchQueryFn; - statesIndexExists: UMElasticsearchQueryFn<{}, StatesIndexStatus>; -} - -export interface CursorPagination { - cursorKey?: any; - cursorDirection: CursorDirection; - sortOrder: SortOrder; -} - -export interface GetMonitorStatesResult { - summaries: MonitorSummary[]; - nextPagePagination: string | null; - prevPagePagination: string | null; -} - -export interface LegacyMonitorStatesQueryResult { - result: any; - statusFilter?: any; - searchAfter: any; -} - -export interface MonitorStatesCheckGroupsResult { - checkGroups: string[]; - searchAfter: any; -} - -export interface EnrichMonitorStatesResult { - monitors: any[]; - nextPagePagination: any | null; - prevPagePagination: any | null; -} diff --git a/x-pack/legacy/plugins/uptime/server/lib/adapters/monitor_states/elasticsearch_monitor_states_adapter.ts b/x-pack/legacy/plugins/uptime/server/lib/adapters/monitor_states/elasticsearch_monitor_states_adapter.ts deleted file mode 100644 index 7ed973e6f057d..0000000000000 --- a/x-pack/legacy/plugins/uptime/server/lib/adapters/monitor_states/elasticsearch_monitor_states_adapter.ts +++ /dev/null @@ -1,154 +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; - * you may not use this file except in compliance with the Elastic License. - */ - -import { UMMonitorStatesAdapter } from './adapter_types'; -import { INDEX_NAMES, CONTEXT_DEFAULTS } from '../../../../common/constants'; -import { fetchPage } from './search'; -import { MonitorGroupIterator } from './search/monitor_group_iterator'; -import { Snapshot } from '../../../../common/runtime_types'; -import { QueryContext } from './search/query_context'; - -export const elasticsearchMonitorStatesAdapter: UMMonitorStatesAdapter = { - // Gets a page of monitor states. - getMonitorStates: async ({ - callES, - dateRangeStart, - dateRangeEnd, - pagination, - filters, - statusFilter, - }) => { - pagination = pagination || CONTEXT_DEFAULTS.CURSOR_PAGINATION; - statusFilter = statusFilter === null ? undefined : statusFilter; - const size = 10; - - const queryContext = new QueryContext( - callES, - dateRangeStart, - dateRangeEnd, - pagination, - filters && filters !== '' ? JSON.parse(filters) : null, - size, - statusFilter - ); - - const page = await fetchPage(queryContext); - - return { - summaries: page.items, - nextPagePagination: jsonifyPagination(page.nextPagePagination), - prevPagePagination: jsonifyPagination(page.prevPagePagination), - }; - }, - - getSnapshotCount: async ({ - callES, - dateRangeStart, - dateRangeEnd, - filters, - statusFilter, - }): Promise => { - if (!(statusFilter === 'up' || statusFilter === 'down' || statusFilter === undefined)) { - throw new Error(`Invalid status filter value '${statusFilter}'`); - } - - const context = new QueryContext( - callES, - dateRangeStart, - dateRangeEnd, - CONTEXT_DEFAULTS.CURSOR_PAGINATION, - filters && filters !== '' ? JSON.parse(filters) : null, - Infinity, - statusFilter - ); - - // Calculate the total, up, and down counts. - const counts = await fastStatusCount(context); - - // Check if the last count was accurate, if not, we need to perform a slower count with the - // MonitorGroupsIterator. - if (!(await context.hasTimespan())) { - // Figure out whether 'up' or 'down' is more common. It's faster to count the lower cardinality - // one then use subtraction to figure out its opposite. - const [leastCommonStatus, mostCommonStatus]: Array<'up' | 'down'> = - counts.up > counts.down ? ['down', 'up'] : ['up', 'down']; - counts[leastCommonStatus] = await slowStatusCount(context, leastCommonStatus); - counts[mostCommonStatus] = counts.total - counts[leastCommonStatus]; - } - - return { - total: statusFilter ? counts[statusFilter] : counts.total, - up: statusFilter === 'down' ? 0 : counts.up, - down: statusFilter === 'up' ? 0 : counts.down, - }; - }, - - statesIndexExists: async ({ callES }) => { - // TODO: adapt this to the states index in future release - const { - _shards: { total }, - count, - } = await callES('count', { index: INDEX_NAMES.HEARTBEAT }); - return { - indexExists: total > 0, - docCount: { - count, - }, - }; - }, -}; - -// To simplify the handling of the group of pagination vars they're passed back to the client as a string -const jsonifyPagination = (p: any): string | null => { - if (!p) { - return null; - } - - return JSON.stringify(p); -}; - -const fastStatusCount = async (context: QueryContext): Promise => { - const params = { - index: INDEX_NAMES.HEARTBEAT, - body: { - size: 0, - query: { bool: { filter: await context.dateAndCustomFilters() } }, - aggs: { - unique: { - // We set the precision threshold to 40k which is the max precision supported by cardinality - cardinality: { field: 'monitor.id', precision_threshold: 40000 }, - }, - down: { - filter: { range: { 'summary.down': { gt: 0 } } }, - aggs: { - unique: { cardinality: { field: 'monitor.id', precision_threshold: 40000 } }, - }, - }, - }, - }, - }; - - const statistics = await context.search(params); - const total = statistics.aggregations.unique.value; - const down = statistics.aggregations.down.unique.value; - - return { - total, - down, - up: total - down, - }; -}; - -const slowStatusCount = async (context: QueryContext, status: string): Promise => { - const downContext = context.clone(); - downContext.statusFilter = status; - const iterator = new MonitorGroupIterator(downContext); - let count = 0; - while (await iterator.next()) { - count++; - } - return count; -}; diff --git a/x-pack/legacy/plugins/uptime/server/lib/adapters/monitor_states/index.ts b/x-pack/legacy/plugins/uptime/server/lib/adapters/monitor_states/index.ts deleted file mode 100644 index a3fc71ad48cb3..0000000000000 --- a/x-pack/legacy/plugins/uptime/server/lib/adapters/monitor_states/index.ts +++ /dev/null @@ -1,8 +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; - * you may not use this file except in compliance with the Elastic License. - */ - -export * from './adapter_types'; -export { elasticsearchMonitorStatesAdapter } from './elasticsearch_monitor_states_adapter'; diff --git a/x-pack/legacy/plugins/uptime/server/lib/adapters/monitors/adapter_types.ts b/x-pack/legacy/plugins/uptime/server/lib/adapters/monitors/adapter_types.ts deleted file mode 100644 index 8523d9c75f51f..0000000000000 --- a/x-pack/legacy/plugins/uptime/server/lib/adapters/monitors/adapter_types.ts +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { MonitorChart } from '../../../../common/graphql/types'; -import { UMElasticsearchQueryFn } from '../framework'; -import { - MonitorDetails, - MonitorLocations, - OverviewFilters, -} from '../../../../common/runtime_types'; - -export interface GetMonitorChartsDataParams { - /** @member monitorId ID value for the selected monitor */ - monitorId: string; - /** @member dateRangeStart timestamp bounds */ - dateRangeStart: string; - /** @member dateRangeEnd timestamp bounds */ - dateRangeEnd: string; - /** @member location optional location value for use in filtering*/ - location?: string | null; -} - -export interface GetFilterBarParams { - /** @param dateRangeStart timestamp bounds */ - dateRangeStart: string; - /** @member dateRangeEnd timestamp bounds */ - dateRangeEnd: string; - /** @member search this value should correspond to Elasticsearch DSL - * generated from KQL text the user provided. - */ - search?: Record; - filterOptions: Record; -} - -export interface GetMonitorDetailsParams { - monitorId: string; - dateStart: string; - dateEnd: string; -} - -/** - * Fetch data for the monitor page title. - */ -export interface GetMonitorLocationsParams { - /** - * @member monitorId the ID to query - */ - monitorId: string; - dateStart: string; - dateEnd: string; -} - -export interface UMMonitorsAdapter { - /** - * Fetches data used to populate monitor charts - */ - getMonitorChartsData: UMElasticsearchQueryFn; - - /** - * Fetch options for the filter bar. - */ - getFilterBar: UMElasticsearchQueryFn; - - getMonitorDetails: UMElasticsearchQueryFn; - - getMonitorLocations: UMElasticsearchQueryFn; -} diff --git a/x-pack/legacy/plugins/uptime/server/lib/adapters/monitors/elasticsearch_monitors_adapter.ts b/x-pack/legacy/plugins/uptime/server/lib/adapters/monitors/elasticsearch_monitors_adapter.ts deleted file mode 100644 index e433931f03c8e..0000000000000 --- a/x-pack/legacy/plugins/uptime/server/lib/adapters/monitors/elasticsearch_monitors_adapter.ts +++ /dev/null @@ -1,385 +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; - * you may not use this file except in compliance with the Elastic License. - */ - -import { get } from 'lodash'; -import { INDEX_NAMES, UNNAMED_LOCATION } from '../../../../common/constants'; -import { MonitorChart, LocationDurationLine } from '../../../../common/graphql/types'; -import { getHistogramIntervalFormatted } from '../../helper'; -import { MonitorError, MonitorLocation } from '../../../../common/runtime_types'; -import { UMMonitorsAdapter } from './adapter_types'; -import { generateFilterAggs } from './generate_filter_aggs'; -import { OverviewFilters } from '../../../../common/runtime_types'; - -export const combineRangeWithFilters = ( - dateRangeStart: string, - dateRangeEnd: string, - filters?: Record -) => { - const range = { - range: { - '@timestamp': { - gte: dateRangeStart, - lte: dateRangeEnd, - }, - }, - }; - if (!filters) return range; - const clientFiltersList = Array.isArray(filters?.bool?.filter ?? {}) - ? // i.e. {"bool":{"filter":{ ...some nested filter objects }}} - filters.bool.filter - : // i.e. {"bool":{"filter":[ ...some listed filter objects ]}} - Object.keys(filters?.bool?.filter ?? {}).map(key => ({ - ...filters?.bool?.filter?.[key], - })); - filters.bool.filter = [...clientFiltersList, range]; - return filters; -}; - -type SupportedFields = 'locations' | 'ports' | 'schemes' | 'tags'; - -export const extractFilterAggsResults = ( - responseAggregations: Record, - keys: SupportedFields[] -): OverviewFilters => { - const values: OverviewFilters = { - locations: [], - ports: [], - schemes: [], - tags: [], - }; - keys.forEach(key => { - const buckets = responseAggregations[key]?.term?.buckets ?? []; - values[key] = buckets.map((item: { key: string | number }) => item.key); - }); - return values; -}; - -const formatStatusBuckets = (time: any, buckets: any, docCount: any) => { - let up = null; - let down = null; - - buckets.forEach((bucket: any) => { - if (bucket.key === 'up') { - up = bucket.doc_count; - } else if (bucket.key === 'down') { - down = bucket.doc_count; - } - }); - - return { - x: time, - up, - down, - total: docCount, - }; -}; - -export const elasticsearchMonitorsAdapter: UMMonitorsAdapter = { - getMonitorChartsData: async ({ callES, dateRangeStart, dateRangeEnd, monitorId, location }) => { - const params = { - index: INDEX_NAMES.HEARTBEAT, - body: { - query: { - bool: { - filter: [ - { range: { '@timestamp': { gte: dateRangeStart, lte: dateRangeEnd } } }, - { term: { 'monitor.id': monitorId } }, - { term: { 'monitor.status': 'up' } }, - // if location is truthy, add it as a filter. otherwise add nothing - ...(!!location ? [{ term: { 'observer.geo.name': location } }] : []), - ], - }, - }, - size: 0, - aggs: { - timeseries: { - date_histogram: { - field: '@timestamp', - fixed_interval: getHistogramIntervalFormatted(dateRangeStart, dateRangeEnd), - min_doc_count: 0, - }, - aggs: { - location: { - terms: { - field: 'observer.geo.name', - missing: 'N/A', - }, - aggs: { - status: { terms: { field: 'monitor.status', size: 2, shard_size: 2 } }, - duration: { stats: { field: 'monitor.duration.us' } }, - }, - }, - }, - }, - }, - }, - }; - - const result = await callES('search', params); - - const dateHistogramBuckets = get(result, 'aggregations.timeseries.buckets', []); - /** - * The code below is responsible for formatting the aggregation data we fetched above in a way - * that the chart components used by the client understands. - * There are five required values. Two are lists of points that conform to a simple (x,y) structure. - * - * The third list is for an area chart expressing a range, and it requires an (x,y,y0) structure, - * where y0 is the min value for the point and y is the max. - * - * Additionally, we supply the maximum value for duration and status, so the corresponding charts know - * what the domain size should be. - */ - const monitorChartsData: MonitorChart = { - locationDurationLines: [], - status: [], - durationMaxValue: 0, - statusMaxCount: 0, - }; - - /** - * The following section of code enables us to provide buckets per location - * that have a `null` value if there is no data at the given timestamp. - * - * We maintain two `Set`s. One is per bucket, the other is persisted for the - * entire collection. At the end of a bucket's evaluation, if there was no object - * parsed for a given location line that was already started, we insert an element - * to the given line with a null value. Without this, our charts on the client will - * display a continuous line for each of the points they are provided. - */ - - // a set of all the locations found for this result - const resultLocations = new Set(); - const linesByLocation: { [key: string]: LocationDurationLine } = {}; - dateHistogramBuckets.forEach(dateHistogramBucket => { - const x = get(dateHistogramBucket, 'key'); - const docCount = get(dateHistogramBucket, 'doc_count', 0); - // a set of all the locations for the current bucket - const bucketLocations = new Set(); - - dateHistogramBucket.location.buckets.forEach( - (locationBucket: { key: string; duration: { avg: number } }) => { - const locationName = locationBucket.key; - // store the location name in each set - bucketLocations.add(locationName); - resultLocations.add(locationName); - - // create a new line for this location if it doesn't exist - let currentLine: LocationDurationLine = get(linesByLocation, locationName); - if (!currentLine) { - currentLine = { name: locationName, line: [] }; - linesByLocation[locationName] = currentLine; - monitorChartsData.locationDurationLines.push(currentLine); - } - // add the entry for the current location's duration average - currentLine.line.push({ x, y: get(locationBucket, 'duration.avg', null) }); - } - ); - - // if there are more lines in the result than are represented in the current bucket, - // we must add null entries - if (dateHistogramBucket.location.buckets.length < resultLocations.size) { - resultLocations.forEach(resultLocation => { - // the current bucket has a value for this location, do nothing - if (location && location !== resultLocation) return; - // the current bucket had no value for this location, insert a null value - if (!bucketLocations.has(resultLocation)) { - const locationLine = monitorChartsData.locationDurationLines.find( - ({ name }) => name === resultLocation - ); - // in practice, there should always be a line present, but `find` can return `undefined` - if (locationLine) { - // this will create a gap in the line like we desire - locationLine.line.push({ x, y: null }); - } - } - }); - } - - monitorChartsData.status.push( - formatStatusBuckets(x, get(dateHistogramBucket, 'status.buckets', []), docCount) - ); - }); - - return monitorChartsData; - }, - - getFilterBar: async ({ callES, dateRangeStart, dateRangeEnd, search, filterOptions }) => { - const aggs = generateFilterAggs( - [ - { aggName: 'locations', filterName: 'locations', field: 'observer.geo.name' }, - { aggName: 'ports', filterName: 'ports', field: 'url.port' }, - { aggName: 'schemes', filterName: 'schemes', field: 'monitor.type' }, - { aggName: 'tags', filterName: 'tags', field: 'tags' }, - ], - filterOptions - ); - const filters = combineRangeWithFilters(dateRangeStart, dateRangeEnd, search); - const params = { - index: INDEX_NAMES.HEARTBEAT, - body: { - size: 0, - query: { - ...filters, - }, - aggs, - }, - }; - - const { aggregations } = await callES('search', params); - return extractFilterAggsResults(aggregations, ['tags', 'locations', 'ports', 'schemes']); - }, - - getMonitorDetails: async ({ callES, monitorId, dateStart, dateEnd }) => { - const queryFilters: any = [ - { - range: { - '@timestamp': { - gte: dateStart, - lte: dateEnd, - }, - }, - }, - { - term: { - 'monitor.id': monitorId, - }, - }, - ]; - - const params = { - index: INDEX_NAMES.HEARTBEAT, - body: { - size: 1, - _source: ['error', '@timestamp'], - query: { - bool: { - must: [ - { - exists: { - field: 'error', - }, - }, - ], - filter: queryFilters, - }, - }, - sort: [ - { - '@timestamp': { - order: 'desc', - }, - }, - ], - }, - }; - - const result = await callES('search', params); - - const data = result.hits.hits[0]?._source; - - const monitorError: MonitorError | undefined = data?.error; - const errorTimeStamp: string | undefined = data?.['@timestamp']; - - return { - monitorId, - error: monitorError, - timestamp: errorTimeStamp, - }; - }, - - getMonitorLocations: async ({ callES, monitorId, dateStart, dateEnd }) => { - const params = { - index: INDEX_NAMES.HEARTBEAT, - body: { - size: 0, - query: { - bool: { - filter: [ - { - match: { - 'monitor.id': monitorId, - }, - }, - { - exists: { - field: 'summary', - }, - }, - { - range: { - '@timestamp': { - gte: dateStart, - lte: dateEnd, - }, - }, - }, - ], - }, - }, - aggs: { - location: { - terms: { - field: 'observer.geo.name', - missing: '__location_missing__', - }, - aggs: { - most_recent: { - top_hits: { - size: 1, - sort: { - '@timestamp': { - order: 'desc', - }, - }, - _source: ['monitor', 'summary', 'observer', '@timestamp'], - }, - }, - }, - }, - }, - }, - }; - - const result = await callES('search', params); - const locations = result?.aggregations?.location?.buckets ?? []; - - const getGeo = (locGeo: { name: string; location?: string }) => { - if (locGeo) { - const { name, location } = locGeo; - const latLon = location?.trim().split(','); - return { - name, - location: latLon - ? { - lat: latLon[0], - lon: latLon[1], - } - : undefined, - }; - } else { - return { - name: UNNAMED_LOCATION, - }; - } - }; - - const monLocs: MonitorLocation[] = []; - locations.forEach((loc: any) => { - const mostRecentLocation = loc.most_recent.hits.hits[0]._source; - const location: MonitorLocation = { - summary: mostRecentLocation?.summary, - geo: getGeo(mostRecentLocation?.observer?.geo), - timestamp: mostRecentLocation['@timestamp'], - }; - monLocs.push(location); - }); - - return { - monitorId, - locations: monLocs, - }; - }, -}; diff --git a/x-pack/legacy/plugins/uptime/server/lib/adapters/pings/__tests__/elasticsearch_pings_adapter.test.ts b/x-pack/legacy/plugins/uptime/server/lib/adapters/pings/__tests__/elasticsearch_pings_adapter.test.ts deleted file mode 100644 index 866ab110928b4..0000000000000 --- a/x-pack/legacy/plugins/uptime/server/lib/adapters/pings/__tests__/elasticsearch_pings_adapter.test.ts +++ /dev/null @@ -1,495 +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; - * you may not use this file except in compliance with the Elastic License. - */ - -import { set } from 'lodash'; -import { elasticsearchPingsAdapter as adapter } from '../es_pings'; - -describe('ElasticsearchPingsAdapter class', () => { - let mockHits: any[]; - let mockEsSearchResult: any; - let mockEsCountResult: any; - const standardMockResponse: any = { - aggregations: { - timeseries: { - buckets: [ - { - key: 1, - up: { - doc_count: 2, - }, - down: { - doc_count: 1, - }, - }, - { - key: 2, - up: { - doc_count: 2, - }, - down: { - bucket_count: 1, - }, - }, - ], - interval: '1s', - }, - }, - }; - - beforeEach(() => { - mockHits = [ - { - _source: { - '@timestamp': '2018-10-30T18:51:59.792Z', - }, - }, - { - _source: { - '@timestamp': '2018-10-30T18:53:59.792Z', - }, - }, - { - _source: { - '@timestamp': '2018-10-30T18:55:59.792Z', - }, - }, - ]; - mockEsSearchResult = { - hits: { - total: { - value: mockHits.length, - }, - hits: mockHits, - }, - aggregations: { - locations: { - buckets: [{ key: 'foo' }], - }, - }, - }; - mockEsCountResult = { - count: mockHits.length, - }; - }); - - describe('getPingHistogram', () => { - it('returns a single bucket if array has 1', async () => { - expect.assertions(2); - const mockEsClient = jest.fn(); - mockEsClient.mockReturnValue({ - aggregations: { - timeseries: { - buckets: [ - { - key: 1, - up: { - doc_count: 2, - }, - down: { - doc_count: 1, - }, - }, - ], - }, - }, - }); - const result = await adapter.getPingHistogram({ - callES: mockEsClient, - dateStart: 'now-15m', - dateEnd: 'now', - filters: '', - }); - result.interval = '10s'; - expect(mockEsClient).toHaveBeenCalledTimes(1); - expect(result).toMatchSnapshot(); - }); - - it('returns expected result for no status filter', async () => { - expect.assertions(2); - const mockEsClient = jest.fn(); - - mockEsClient.mockReturnValue(standardMockResponse); - - const result = await adapter.getPingHistogram({ - callES: mockEsClient, - dateStart: 'now-15m', - dateEnd: 'now', - filters: '', - }); - result.interval = '1m'; - - expect(mockEsClient).toHaveBeenCalledTimes(1); - expect(result).toMatchSnapshot(); - }); - - it('handles status + additional user queries', async () => { - expect.assertions(2); - const mockEsClient = jest.fn(); - mockEsClient.mockReturnValue({ - aggregations: { - timeseries: { - buckets: [ - { - key: 1, - up: { - doc_count: 2, - }, - down: { - doc_count: 1, - }, - }, - { - key: 2, - up: { - doc_count: 2, - }, - down: { - doc_count: 2, - }, - }, - { - key: 3, - up: { - doc_count: 3, - }, - down: { - doc_count: 1, - }, - }, - ], - }, - }, - }); - const searchFilter = { - bool: { - must: [ - { match: { 'monitor.id': { query: 'auto-http-0X89BB0F9A6C81D178', operator: 'and' } } }, - { match: { 'monitor.name': { query: 'my-new-test-site-name', operator: 'and' } } }, - ], - }, - }; - const result = await adapter.getPingHistogram({ - callES: mockEsClient, - dateStart: '1234', - dateEnd: '5678', - filters: JSON.stringify(searchFilter), - monitorId: undefined, - statusFilter: 'down', - }); - result.interval = '1h'; - - expect(mockEsClient).toHaveBeenCalledTimes(1); - expect(result).toMatchSnapshot(); - }); - - it('handles simple_text_query without issues', async () => { - expect.assertions(2); - const mockEsClient = jest.fn(); - mockEsClient.mockReturnValue({ - aggregations: { - timeseries: { - buckets: [ - { - key: 1, - up: { - doc_count: 2, - }, - down: { - doc_count: 1, - }, - }, - { - key: 2, - up: { - doc_count: 1, - }, - down: { - doc_count: 2, - }, - }, - { - key: 3, - up: { - doc_count: 3, - }, - down: { - doc_count: 1, - }, - }, - ], - }, - }, - }); - const filters = `{"bool":{"must":[{"simple_query_string":{"query":"http"}}]}}`; - const result = await adapter.getPingHistogram({ - callES: mockEsClient, - dateStart: 'now-15m', - dateEnd: 'now', - filters, - }); - - result.interval = '1m'; - expect(mockEsClient).toHaveBeenCalledTimes(1); - expect(result).toMatchSnapshot(); - }); - - it('returns a down-filtered array for when filtered by down status', async () => { - expect.assertions(2); - const mockEsClient = jest.fn(); - mockEsClient.mockReturnValue(standardMockResponse); - const result = await adapter.getPingHistogram({ - callES: mockEsClient, - dateStart: '1234', - dateEnd: '5678', - filters: '', - monitorId: undefined, - statusFilter: 'down', - }); - - result.interval = '1d'; - - expect(mockEsClient).toHaveBeenCalledTimes(1); - expect(result).toMatchSnapshot(); - }); - - it('returns a down-filtered array for when filtered by up status', async () => { - expect.assertions(2); - const mockEsClient = jest.fn(); - - mockEsClient.mockReturnValue(standardMockResponse); - - const result = await adapter.getPingHistogram({ - callES: mockEsClient, - dateStart: '1234', - dateEnd: '5678', - filters: '', - monitorId: undefined, - statusFilter: 'up', - }); - - expect(mockEsClient).toHaveBeenCalledTimes(1); - expect(result).toMatchSnapshot(); - }); - }); - - describe('getDocCount', () => { - it('returns data in appropriate shape', async () => { - const mockEsClient = jest.fn(); - mockEsClient.mockReturnValue(mockEsCountResult); - const { count } = await adapter.getDocCount({ callES: mockEsClient }); - expect(count).toEqual(3); - }); - }); - - describe('getAll', () => { - let expectedGetAllParams: any; - beforeEach(() => { - expectedGetAllParams = { - index: 'heartbeat-8*', - body: { - query: { - bool: { - filter: [{ range: { '@timestamp': { gte: 'now-1h', lte: 'now' } } }], - }, - }, - aggregations: { - locations: { - terms: { - field: 'observer.geo.name', - missing: 'N/A', - size: 1000, - }, - }, - }, - sort: [{ '@timestamp': { order: 'desc' } }], - size: 12, - }, - }; - }); - - it('returns data in the appropriate shape', async () => { - const mockEsClient = jest.fn(); - mockEsClient.mockReturnValue(mockEsSearchResult); - const result = await adapter.getAll({ - callES: mockEsClient, - dateRangeStart: 'now-1h', - dateRangeEnd: 'now', - sort: 'asc', - size: 12, - }); - const count = 3; - - expect(result.total).toBe(count); - - const pings = result.pings!; - expect(pings).toHaveLength(count); - expect(pings[0].timestamp).toBe('2018-10-30T18:51:59.792Z'); - expect(pings[1].timestamp).toBe('2018-10-30T18:53:59.792Z'); - expect(pings[2].timestamp).toBe('2018-10-30T18:55:59.792Z'); - expect(mockEsClient).toHaveBeenCalledTimes(1); - }); - - it('creates appropriate sort and size parameters', async () => { - const mockEsClient = jest.fn(); - mockEsClient.mockReturnValue(mockEsSearchResult); - await adapter.getAll({ - callES: mockEsClient, - dateRangeStart: 'now-1h', - dateRangeEnd: 'now', - sort: 'asc', - size: 12, - }); - set(expectedGetAllParams, 'body.sort[0]', { '@timestamp': { order: 'asc' } }); - - expect(mockEsClient).toHaveBeenCalledTimes(1); - expect(mockEsClient).toHaveBeenCalledWith('search', expectedGetAllParams); - }); - - it('omits the sort param when no sort passed', async () => { - const mockEsClient = jest.fn(); - mockEsClient.mockReturnValue(mockEsSearchResult); - await adapter.getAll({ - callES: mockEsClient, - dateRangeStart: 'now-1h', - dateRangeEnd: 'now', - size: 12, - }); - - expect(mockEsClient).toHaveBeenCalledWith('search', expectedGetAllParams); - }); - - it('omits the size param when no size passed', async () => { - const mockEsClient = jest.fn(); - mockEsClient.mockReturnValue(mockEsSearchResult); - await adapter.getAll({ - callES: mockEsClient, - dateRangeStart: 'now-1h', - dateRangeEnd: 'now', - sort: 'desc', - }); - delete expectedGetAllParams.body.size; - set(expectedGetAllParams, 'body.sort[0].@timestamp.order', 'desc'); - - expect(mockEsClient).toHaveBeenCalledWith('search', expectedGetAllParams); - }); - - it('adds a filter for monitor ID', async () => { - const mockEsClient = jest.fn(); - mockEsClient.mockReturnValue(mockEsSearchResult); - await adapter.getAll({ - callES: mockEsClient, - dateRangeStart: 'now-1h', - dateRangeEnd: 'now', - monitorId: 'testmonitorid', - }); - delete expectedGetAllParams.body.size; - expectedGetAllParams.body.query.bool.filter.push({ term: { 'monitor.id': 'testmonitorid' } }); - - expect(mockEsClient).toHaveBeenCalledWith('search', expectedGetAllParams); - }); - - it('adds a filter for monitor status', async () => { - const mockEsClient = jest.fn(); - mockEsClient.mockReturnValue(mockEsSearchResult); - await adapter.getAll({ - callES: mockEsClient, - dateRangeStart: 'now-1h', - dateRangeEnd: 'now', - status: 'down', - }); - delete expectedGetAllParams.body.size; - expectedGetAllParams.body.query.bool.filter.push({ term: { 'monitor.status': 'down' } }); - - expect(mockEsClient).toHaveBeenCalledWith('search', expectedGetAllParams); - }); - }); - - describe('getLatestMonitorStatus', () => { - let expectedGetLatestSearchParams: any; - beforeEach(() => { - expectedGetLatestSearchParams = { - index: 'heartbeat-8*', - body: { - query: { - bool: { - filter: [ - { - range: { - '@timestamp': { - gte: 'now-1h', - lte: 'now', - }, - }, - }, - { - term: { 'monitor.id': 'testMonitor' }, - }, - ], - }, - }, - aggs: { - by_id: { - terms: { - field: 'monitor.id', - size: 1000, - }, - aggs: { - latest: { - top_hits: { - size: 1, - sort: { - '@timestamp': { order: 'desc' }, - }, - }, - }, - }, - }, - }, - size: 0, - }, - }; - mockEsSearchResult = { - aggregations: { - by_id: { - buckets: [ - { - latest: { - hits: { - hits: [ - { - _source: { - '@timestamp': 123456, - monitor: { - id: 'testMonitor', - }, - }, - }, - ], - }, - }, - }, - ], - }, - }, - }; - }); - - it('returns data in expected shape', async () => { - const mockEsClient = jest.fn(async (_request: any, _params: any) => mockEsSearchResult); - const result = await adapter.getLatestMonitorStatus({ - callES: mockEsClient, - dateStart: 'now-1h', - dateEnd: 'now', - monitorId: 'testMonitor', - }); - expect(result.timestamp).toBe(123456); - expect(result.monitor).not.toBeFalsy(); - // @ts-ignore monitor will be defined - expect(result.monitor.id).toBe('testMonitor'); - expect(mockEsClient).toHaveBeenCalledWith('search', expectedGetLatestSearchParams); - }); - }); -}); diff --git a/x-pack/legacy/plugins/uptime/server/lib/adapters/pings/es_pings.ts b/x-pack/legacy/plugins/uptime/server/lib/adapters/pings/es_pings.ts deleted file mode 100644 index 93e3a1bd9397b..0000000000000 --- a/x-pack/legacy/plugins/uptime/server/lib/adapters/pings/es_pings.ts +++ /dev/null @@ -1,183 +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; - * you may not use this file except in compliance with the Elastic License. - */ - -import { get } from 'lodash'; -import { INDEX_NAMES } from '../../../../common/constants'; -import { HttpBody, Ping, PingResults } from '../../../../common/graphql/types'; -import { UMPingsAdapter } from './types'; -import { esGetPingHistogram } from './es_get_ping_historgram'; - -export const elasticsearchPingsAdapter: UMPingsAdapter = { - getAll: async ({ - callES, - dateRangeStart, - dateRangeEnd, - monitorId, - status, - sort, - size, - location, - }) => { - const sortParam = { sort: [{ '@timestamp': { order: sort ?? 'desc' } }] }; - const sizeParam = size ? { size } : undefined; - const filter: any[] = [{ range: { '@timestamp': { gte: dateRangeStart, lte: dateRangeEnd } } }]; - if (monitorId) { - filter.push({ term: { 'monitor.id': monitorId } }); - } - if (status) { - filter.push({ term: { 'monitor.status': status } }); - } - - let postFilterClause = {}; - if (location) { - postFilterClause = { post_filter: { term: { 'observer.geo.name': location } } }; - } - const queryContext = { bool: { filter } }; - const params = { - index: INDEX_NAMES.HEARTBEAT, - body: { - query: { - ...queryContext, - }, - ...sortParam, - ...sizeParam, - aggregations: { - locations: { - terms: { - field: 'observer.geo.name', - missing: 'N/A', - size: 1000, - }, - }, - }, - ...postFilterClause, - }, - }; - - const { - hits: { hits, total }, - aggregations: aggs, - } = await callES('search', params); - - const locations = get(aggs, 'locations', { buckets: [{ key: 'N/A', doc_count: 0 }] }); - - const pings: Ping[] = hits.map(({ _id, _source }: any) => { - const timestamp = _source['@timestamp']; - - // Calculate here the length of the content string in bytes, this is easier than in client JS, where - // we don't have access to Buffer.byteLength. There are some hacky ways to do this in the - // client but this is cleaner. - const httpBody = get(_source, 'http.response.body'); - if (httpBody && httpBody.content) { - httpBody.content_bytes = Buffer.byteLength(httpBody.content); - } - - return { id: _id, timestamp, ..._source }; - }); - - const results: PingResults = { - total: total.value, - locations: locations.buckets.map((bucket: { key: string }) => bucket.key), - pings, - }; - - return results; - }, - - // Get The monitor latest state sorted by timestamp with date range - getLatestMonitorStatus: async ({ callES, dateStart, dateEnd, monitorId }) => { - // TODO: Write tests for this function - - const params = { - index: INDEX_NAMES.HEARTBEAT, - body: { - query: { - bool: { - filter: [ - { - range: { - '@timestamp': { - gte: dateStart, - lte: dateEnd, - }, - }, - }, - ...(monitorId ? [{ term: { 'monitor.id': monitorId } }] : []), - ], - }, - }, - size: 0, - aggs: { - by_id: { - terms: { - field: 'monitor.id', - size: 1000, - }, - aggs: { - latest: { - top_hits: { - size: 1, - sort: { - '@timestamp': { order: 'desc' }, - }, - }, - }, - }, - }, - }, - }, - }; - - const result = await callES('search', params); - const ping: any = result.aggregations.by_id.buckets?.[0]?.latest.hits?.hits?.[0] ?? {}; - - return { - ...ping?._source, - timestamp: ping?._source?.['@timestamp'], - }; - }, - - // Get the monitor meta info regardless of timestamp - getMonitor: async ({ callES, monitorId }) => { - const params = { - index: INDEX_NAMES.HEARTBEAT, - body: { - size: 1, - _source: ['url', 'monitor', 'observer'], - query: { - bool: { - filter: [ - { - term: { - 'monitor.id': monitorId, - }, - }, - ], - }, - }, - sort: [ - { - '@timestamp': { - order: 'desc', - }, - }, - ], - }, - }; - - const result = await callES('search', params); - - return result.hits.hits[0]?._source; - }, - - getPingHistogram: esGetPingHistogram, - - getDocCount: async ({ callES }) => { - const { count } = await callES('count', { index: INDEX_NAMES.HEARTBEAT }); - - return { count }; - }, -}; diff --git a/x-pack/legacy/plugins/uptime/server/lib/adapters/pings/index.ts b/x-pack/legacy/plugins/uptime/server/lib/adapters/pings/index.ts deleted file mode 100644 index 37324a8f521f6..0000000000000 --- a/x-pack/legacy/plugins/uptime/server/lib/adapters/pings/index.ts +++ /dev/null @@ -1,8 +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; - * you may not use this file except in compliance with the Elastic License. - */ - -export * from './types'; -export { elasticsearchPingsAdapter } from './es_pings'; diff --git a/x-pack/legacy/plugins/uptime/server/lib/adapters/stub_index_pattern/index.ts b/x-pack/legacy/plugins/uptime/server/lib/adapters/stub_index_pattern/index.ts deleted file mode 100644 index 4ef6e3fa8a6bd..0000000000000 --- a/x-pack/legacy/plugins/uptime/server/lib/adapters/stub_index_pattern/index.ts +++ /dev/null @@ -1,7 +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; - * you may not use this file except in compliance with the Elastic License. - */ - -export { StubIndexPatternAdapter, stubIndexPatternAdapter } from './stub_index_pattern'; diff --git a/x-pack/legacy/plugins/uptime/server/lib/adapters/stub_index_pattern/stub_index_pattern.ts b/x-pack/legacy/plugins/uptime/server/lib/adapters/stub_index_pattern/stub_index_pattern.ts deleted file mode 100644 index 49ec86af25040..0000000000000 --- a/x-pack/legacy/plugins/uptime/server/lib/adapters/stub_index_pattern/stub_index_pattern.ts +++ /dev/null @@ -1,54 +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; - * you may not use this file except in compliance with the Elastic License. - */ - -import { APICaller } from 'kibana/server'; -import { - IndexPatternsFetcher, - IIndexPattern, -} from '../../../../../../../../src/plugins/data/server'; -import { INDEX_NAMES } from '../../../../common/constants'; -import { UMElasticsearchQueryFn } from '../framework'; - -export interface StubIndexPatternAdapter { - getUptimeIndexPattern: UMElasticsearchQueryFn; -} - -export const stubIndexPatternAdapter: StubIndexPatternAdapter = { - getUptimeIndexPattern: async callES => { - const indexPatternsFetcher = new IndexPatternsFetcher((...rest: Parameters) => - callES(...rest) - ); - - // Since `getDynamicIndexPattern` is called in setup_request (and thus by every endpoint) - // and since `getFieldsForWildcard` will throw if the specified indices don't exist, - // we have to catch errors here to avoid all endpoints returning 500 for users without APM data - // (would be a bad first time experience) - try { - const fields = await indexPatternsFetcher.getFieldsForWildcard({ - pattern: INDEX_NAMES.HEARTBEAT, - }); - - const indexPattern: IIndexPattern = { - fields, - title: INDEX_NAMES.HEARTBEAT, - }; - - return indexPattern; - } catch (e) { - const notExists = e.output?.statusCode === 404; - if (notExists) { - // eslint-disable-next-line no-console - console.error( - `Could not get dynamic index pattern because indices "${INDEX_NAMES.HEARTBEAT}" don't exist` - ); - return; - } - - // re-throw - throw e; - } - }, -}; diff --git a/x-pack/legacy/plugins/uptime/server/lib/compose/kibana.ts b/x-pack/legacy/plugins/uptime/server/lib/compose/kibana.ts index b44a890de3819..875a5d9dc8c5c 100644 --- a/x-pack/legacy/plugins/uptime/server/lib/compose/kibana.ts +++ b/x-pack/legacy/plugins/uptime/server/lib/compose/kibana.ts @@ -5,23 +5,19 @@ */ import { UMKibanaBackendFrameworkAdapter } from '../adapters/framework'; -import { elasticsearchMonitorsAdapter } from '../adapters/monitors'; -import { elasticsearchPingsAdapter } from '../adapters/pings'; +import * as requests from '../requests'; import { licenseCheck } from '../domains'; import { UMDomainLibs, UMServerLibs } from '../lib'; -import { elasticsearchMonitorStatesAdapter } from '../adapters/monitor_states'; -import { stubIndexPatternAdapter } from '../adapters/stub_index_pattern'; import { UptimeCorePlugins, UptimeCoreSetup } from '../adapters/framework'; export function compose(server: UptimeCoreSetup, plugins: UptimeCorePlugins): UMServerLibs { const framework = new UMKibanaBackendFrameworkAdapter(server); const domainLibs: UMDomainLibs = { + requests: { + ...requests, + }, license: licenseCheck, - monitors: elasticsearchMonitorsAdapter, - monitorStates: elasticsearchMonitorStatesAdapter, - pings: elasticsearchPingsAdapter, - stubIndexPattern: stubIndexPatternAdapter, }; return { diff --git a/x-pack/legacy/plugins/uptime/server/lib/helper/index.ts b/x-pack/legacy/plugins/uptime/server/lib/helper/index.ts index eae8023b66ff4..0dcbc0a424b5e 100644 --- a/x-pack/legacy/plugins/uptime/server/lib/helper/index.ts +++ b/x-pack/legacy/plugins/uptime/server/lib/helper/index.ts @@ -5,6 +5,7 @@ */ export { getFilterClause } from './get_filter_clause'; +export { parseRelativeDate } from './get_histogram_interval'; export { getHistogramIntervalFormatted } from './get_histogram_interval_formatted'; export { parseFilterQuery } from './parse_filter_query'; export { assertCloseTo } from './assert_close_to'; diff --git a/x-pack/legacy/plugins/uptime/server/lib/lib.ts b/x-pack/legacy/plugins/uptime/server/lib/lib.ts index e5ab9940d482d..a7121eaec6679 100644 --- a/x-pack/legacy/plugins/uptime/server/lib/lib.ts +++ b/x-pack/legacy/plugins/uptime/server/lib/lib.ts @@ -4,21 +4,13 @@ * you may not use this file except in compliance with the Elastic License. */ -import { - UMBackendFrameworkAdapter, - UMMonitorsAdapter, - UMMonitorStatesAdapter, - UMPingsAdapter, - StubIndexPatternAdapter, -} from './adapters'; +import { UMBackendFrameworkAdapter } from './adapters'; import { UMLicenseCheck } from './domains'; +import { UptimeRequests } from './requests'; export interface UMDomainLibs { + requests: UptimeRequests; license: UMLicenseCheck; - monitors: UMMonitorsAdapter; - monitorStates: UMMonitorStatesAdapter; - pings: UMPingsAdapter; - stubIndexPattern: StubIndexPatternAdapter; } export interface UMServerLibs extends UMDomainLibs { diff --git a/x-pack/legacy/plugins/uptime/server/lib/adapters/monitors/__tests__/__snapshots__/extract_filter_aggs_results.test.ts.snap b/x-pack/legacy/plugins/uptime/server/lib/requests/__tests__/__snapshots__/extract_filter_aggs_results.test.ts.snap similarity index 100% rename from x-pack/legacy/plugins/uptime/server/lib/adapters/monitors/__tests__/__snapshots__/extract_filter_aggs_results.test.ts.snap rename to x-pack/legacy/plugins/uptime/server/lib/requests/__tests__/__snapshots__/extract_filter_aggs_results.test.ts.snap diff --git a/x-pack/legacy/plugins/uptime/server/lib/adapters/monitors/__tests__/__snapshots__/generate_filter_aggs.test.ts.snap b/x-pack/legacy/plugins/uptime/server/lib/requests/__tests__/__snapshots__/generate_filter_aggs.test.ts.snap similarity index 100% rename from x-pack/legacy/plugins/uptime/server/lib/adapters/monitors/__tests__/__snapshots__/generate_filter_aggs.test.ts.snap rename to x-pack/legacy/plugins/uptime/server/lib/requests/__tests__/__snapshots__/generate_filter_aggs.test.ts.snap diff --git a/x-pack/legacy/plugins/uptime/server/lib/adapters/monitors/__tests__/__snapshots__/elasticsearch_monitors_adapter.test.ts.snap b/x-pack/legacy/plugins/uptime/server/lib/requests/__tests__/__snapshots__/get_monitor_charts.test.ts.snap similarity index 100% rename from x-pack/legacy/plugins/uptime/server/lib/adapters/monitors/__tests__/__snapshots__/elasticsearch_monitors_adapter.test.ts.snap rename to x-pack/legacy/plugins/uptime/server/lib/requests/__tests__/__snapshots__/get_monitor_charts.test.ts.snap diff --git a/x-pack/legacy/plugins/uptime/server/lib/adapters/pings/__tests__/__snapshots__/elasticsearch_pings_adapter.test.ts.snap b/x-pack/legacy/plugins/uptime/server/lib/requests/__tests__/__snapshots__/get_ping_histogram.test.ts.snap similarity index 70% rename from x-pack/legacy/plugins/uptime/server/lib/adapters/pings/__tests__/__snapshots__/elasticsearch_pings_adapter.test.ts.snap rename to x-pack/legacy/plugins/uptime/server/lib/requests/__tests__/__snapshots__/get_ping_histogram.test.ts.snap index 1b31f44557df0..0dafa5144c25a 100644 --- a/x-pack/legacy/plugins/uptime/server/lib/adapters/pings/__tests__/__snapshots__/elasticsearch_pings_adapter.test.ts.snap +++ b/x-pack/legacy/plugins/uptime/server/lib/requests/__tests__/__snapshots__/get_ping_histogram.test.ts.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`ElasticsearchPingsAdapter class getPingHistogram handles simple_text_query without issues 1`] = ` +exports[`getPingHistogram handles simple_text_query without issues 1`] = ` Object { "histogram": Array [ Object { @@ -26,7 +26,7 @@ Object { } `; -exports[`ElasticsearchPingsAdapter class getPingHistogram handles status + additional user queries 1`] = ` +exports[`getPingHistogram handles status + additional user queries 1`] = ` Object { "histogram": Array [ Object { @@ -52,7 +52,7 @@ Object { } `; -exports[`ElasticsearchPingsAdapter class getPingHistogram returns a down-filtered array for when filtered by down status 1`] = ` +exports[`getPingHistogram returns a down-filtered array for when filtered by down status 1`] = ` Object { "histogram": Array [ Object { @@ -72,7 +72,7 @@ Object { } `; -exports[`ElasticsearchPingsAdapter class getPingHistogram returns a down-filtered array for when filtered by up status 1`] = ` +exports[`getPingHistogram returns a down-filtered array for when filtered by up status 1`] = ` Object { "histogram": Array [ Object { @@ -92,7 +92,7 @@ Object { } `; -exports[`ElasticsearchPingsAdapter class getPingHistogram returns a single bucket if array has 1 1`] = ` +exports[`getPingHistogram returns a single bucket if array has 1 1`] = ` Object { "histogram": Array [ Object { @@ -106,7 +106,7 @@ Object { } `; -exports[`ElasticsearchPingsAdapter class getPingHistogram returns expected result for no status filter 1`] = ` +exports[`getPingHistogram returns expected result for no status filter 1`] = ` Object { "histogram": Array [ Object { diff --git a/x-pack/legacy/plugins/uptime/server/lib/adapters/monitors/__tests__/combine_range_with_filters.test.ts b/x-pack/legacy/plugins/uptime/server/lib/requests/__tests__/combine_range_with_filters.test.ts similarity index 96% rename from x-pack/legacy/plugins/uptime/server/lib/adapters/monitors/__tests__/combine_range_with_filters.test.ts rename to x-pack/legacy/plugins/uptime/server/lib/requests/__tests__/combine_range_with_filters.test.ts index 2075b3a8fbe0f..31d19dab290da 100644 --- a/x-pack/legacy/plugins/uptime/server/lib/adapters/monitors/__tests__/combine_range_with_filters.test.ts +++ b/x-pack/legacy/plugins/uptime/server/lib/requests/__tests__/combine_range_with_filters.test.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { combineRangeWithFilters } from '../elasticsearch_monitors_adapter'; +import { combineRangeWithFilters } from '../get_filter_bar'; describe('combineRangeWithFilters', () => { it('combines filters that have no filter clause', () => { diff --git a/x-pack/legacy/plugins/uptime/server/lib/adapters/monitors/__tests__/extract_filter_aggs_results.test.ts b/x-pack/legacy/plugins/uptime/server/lib/requests/__tests__/extract_filter_aggs_results.test.ts similarity index 96% rename from x-pack/legacy/plugins/uptime/server/lib/adapters/monitors/__tests__/extract_filter_aggs_results.test.ts rename to x-pack/legacy/plugins/uptime/server/lib/requests/__tests__/extract_filter_aggs_results.test.ts index 954cffd4c9522..19fd0fda8d83e 100644 --- a/x-pack/legacy/plugins/uptime/server/lib/adapters/monitors/__tests__/extract_filter_aggs_results.test.ts +++ b/x-pack/legacy/plugins/uptime/server/lib/requests/__tests__/extract_filter_aggs_results.test.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { extractFilterAggsResults } from '../elasticsearch_monitors_adapter'; +import { extractFilterAggsResults } from '../get_filter_bar'; describe('extractFilterAggsResults', () => { it('extracts the bucket values of the expected filter fields', () => { diff --git a/x-pack/legacy/plugins/uptime/server/lib/adapters/monitors/__tests__/generate_filter_aggs.test.ts b/x-pack/legacy/plugins/uptime/server/lib/requests/__tests__/generate_filter_aggs.test.ts similarity index 100% rename from x-pack/legacy/plugins/uptime/server/lib/adapters/monitors/__tests__/generate_filter_aggs.test.ts rename to x-pack/legacy/plugins/uptime/server/lib/requests/__tests__/generate_filter_aggs.test.ts diff --git a/x-pack/legacy/plugins/uptime/server/lib/requests/__tests__/get_doc_count.test.ts b/x-pack/legacy/plugins/uptime/server/lib/requests/__tests__/get_doc_count.test.ts new file mode 100644 index 0000000000000..7dfb0314fe8dd --- /dev/null +++ b/x-pack/legacy/plugins/uptime/server/lib/requests/__tests__/get_doc_count.test.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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { getDocCount } from '../get_doc_count'; + +describe('getDocCount', () => { + let mockHits: any[]; + let mockEsCountResult: any; + + beforeEach(() => { + mockHits = [ + { + _source: { + '@timestamp': '2018-10-30T18:51:59.792Z', + }, + }, + { + _source: { + '@timestamp': '2018-10-30T18:53:59.792Z', + }, + }, + { + _source: { + '@timestamp': '2018-10-30T18:55:59.792Z', + }, + }, + ]; + mockEsCountResult = { + count: mockHits.length, + }; + }); + + it('returns data in appropriate shape', async () => { + const mockEsClient = jest.fn(); + mockEsClient.mockReturnValue(mockEsCountResult); + const { count } = await getDocCount({ callES: mockEsClient }); + expect(count).toEqual(3); + }); +}); diff --git a/x-pack/legacy/plugins/uptime/server/lib/requests/__tests__/get_latest_monitor.test.ts b/x-pack/legacy/plugins/uptime/server/lib/requests/__tests__/get_latest_monitor.test.ts new file mode 100644 index 0000000000000..ad0987a7f6faf --- /dev/null +++ b/x-pack/legacy/plugins/uptime/server/lib/requests/__tests__/get_latest_monitor.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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { getLatestMonitor } from '../get_latest_monitor'; + +describe('getLatestMonitor', () => { + let expectedGetLatestSearchParams: any; + let mockEsSearchResult: any; + beforeEach(() => { + expectedGetLatestSearchParams = { + index: 'heartbeat-8*', + body: { + query: { + bool: { + filter: [ + { + range: { + '@timestamp': { + gte: 'now-1h', + lte: 'now', + }, + }, + }, + { + term: { 'monitor.id': 'testMonitor' }, + }, + ], + }, + }, + aggs: { + by_id: { + terms: { + field: 'monitor.id', + size: 1000, + }, + aggs: { + latest: { + top_hits: { + size: 1, + sort: { + '@timestamp': { order: 'desc' }, + }, + }, + }, + }, + }, + }, + size: 0, + }, + }; + mockEsSearchResult = { + aggregations: { + by_id: { + buckets: [ + { + latest: { + hits: { + hits: [ + { + _source: { + '@timestamp': 123456, + monitor: { + id: 'testMonitor', + }, + }, + }, + ], + }, + }, + }, + ], + }, + }, + }; + }); + + it('returns data in expected shape', async () => { + const mockEsClient = jest.fn(async (_request: any, _params: any) => mockEsSearchResult); + const result = await getLatestMonitor({ + callES: mockEsClient, + dateStart: 'now-1h', + dateEnd: 'now', + monitorId: 'testMonitor', + }); + expect(result.timestamp).toBe(123456); + expect(result.monitor).not.toBeFalsy(); + expect(result?.monitor?.id).toBe('testMonitor'); + expect(mockEsClient).toHaveBeenCalledWith('search', expectedGetLatestSearchParams); + }); +}); diff --git a/x-pack/legacy/plugins/uptime/server/lib/adapters/monitors/__tests__/elasticsearch_monitors_adapter.test.ts b/x-pack/legacy/plugins/uptime/server/lib/requests/__tests__/get_monitor_charts.test.ts similarity index 88% rename from x-pack/legacy/plugins/uptime/server/lib/adapters/monitors/__tests__/elasticsearch_monitors_adapter.test.ts rename to x-pack/legacy/plugins/uptime/server/lib/requests/__tests__/get_monitor_charts.test.ts index e3e81fe360718..205f9cf745db1 100644 --- a/x-pack/legacy/plugins/uptime/server/lib/adapters/monitors/__tests__/elasticsearch_monitors_adapter.test.ts +++ b/x-pack/legacy/plugins/uptime/server/lib/requests/__tests__/get_monitor_charts.test.ts @@ -5,17 +5,16 @@ */ import { get, set } from 'lodash'; -import { elasticsearchMonitorsAdapter as adapter } from '../elasticsearch_monitors_adapter'; import mockChartsData from './monitor_charts_mock.json'; -import { assertCloseTo } from '../../../helper'; +import { assertCloseTo } from '../../helper'; +import { getMonitorCharts } from '../get_monitor_charts'; -// FIXME: there are many untested functions in this adapter. They should be tested. describe('ElasticsearchMonitorsAdapter', () => { it('getMonitorChartsData will run expected parameters when no location is specified', async () => { expect.assertions(3); const searchMock = jest.fn(); const search = searchMock.bind({}); - await adapter.getMonitorChartsData({ + await getMonitorCharts({ callES: search, monitorId: 'fooID', dateRangeStart: 'now-15m', @@ -50,7 +49,7 @@ describe('ElasticsearchMonitorsAdapter', () => { expect.assertions(3); const searchMock = jest.fn(); const search = searchMock.bind({}); - await adapter.getMonitorChartsData({ + await getMonitorCharts({ callES: search, monitorId: 'fooID', dateRangeStart: 'now-15m', @@ -87,7 +86,7 @@ describe('ElasticsearchMonitorsAdapter', () => { searchMock.mockReturnValue(mockChartsData); const search = searchMock.bind({}); expect( - await adapter.getMonitorChartsData({ + await getMonitorCharts({ callES: search, monitorId: 'id', dateRangeStart: 'now-15m', diff --git a/x-pack/legacy/plugins/uptime/server/lib/requests/__tests__/get_ping_histogram.test.ts b/x-pack/legacy/plugins/uptime/server/lib/requests/__tests__/get_ping_histogram.test.ts new file mode 100644 index 0000000000000..7d98b77069264 --- /dev/null +++ b/x-pack/legacy/plugins/uptime/server/lib/requests/__tests__/get_ping_histogram.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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { getPingHistogram } from '../get_ping_histogram'; + +describe('getPingHistogram', () => { + const standardMockResponse: any = { + aggregations: { + timeseries: { + buckets: [ + { + key: 1, + up: { + doc_count: 2, + }, + down: { + doc_count: 1, + }, + }, + { + key: 2, + up: { + doc_count: 2, + }, + down: { + bucket_count: 1, + }, + }, + ], + }, + }, + }; + + it('returns a single bucket if array has 1', async () => { + expect.assertions(2); + const mockEsClient = jest.fn(); + mockEsClient.mockReturnValue({ + aggregations: { + timeseries: { + buckets: [ + { + key: 1, + up: { + doc_count: 2, + }, + down: { + doc_count: 1, + }, + }, + ], + interval: '10s', + }, + }, + }); + + const result = await getPingHistogram({ + callES: mockEsClient, + from: 'now-15m', + to: 'now', + filters: null, + }); + + expect(mockEsClient).toHaveBeenCalledTimes(1); + expect(result).toMatchSnapshot(); + }); + + it('returns expected result for no status filter', async () => { + expect.assertions(2); + const mockEsClient = jest.fn(); + + standardMockResponse.aggregations.timeseries.interval = '1m'; + mockEsClient.mockReturnValue(standardMockResponse); + + const result = await getPingHistogram({ + callES: mockEsClient, + from: 'now-15m', + to: 'now', + filters: null, + }); + + expect(mockEsClient).toHaveBeenCalledTimes(1); + expect(result).toMatchSnapshot(); + }); + + it('handles status + additional user queries', async () => { + expect.assertions(2); + const mockEsClient = jest.fn(); + + mockEsClient.mockReturnValue({ + aggregations: { + timeseries: { + buckets: [ + { + key: 1, + up: { + doc_count: 2, + }, + down: { + doc_count: 1, + }, + }, + { + key: 2, + up: { + doc_count: 2, + }, + down: { + doc_count: 2, + }, + }, + { + key: 3, + up: { + doc_count: 3, + }, + down: { + doc_count: 1, + }, + }, + ], + interval: '1h', + }, + }, + }); + + const searchFilter = { + bool: { + must: [ + { match: { 'monitor.id': { query: 'auto-http-0X89BB0F9A6C81D178', operator: 'and' } } }, + { match: { 'monitor.name': { query: 'my-new-test-site-name', operator: 'and' } } }, + ], + }, + }; + + const result = await getPingHistogram({ + callES: mockEsClient, + from: '1234', + to: '5678', + filters: JSON.stringify(searchFilter), + monitorId: undefined, + statusFilter: 'down', + }); + + expect(mockEsClient).toHaveBeenCalledTimes(1); + expect(result).toMatchSnapshot(); + }); + + it('handles simple_text_query without issues', async () => { + expect.assertions(2); + const mockEsClient = jest.fn(); + + mockEsClient.mockReturnValue({ + aggregations: { + timeseries: { + buckets: [ + { + key: 1, + up: { + doc_count: 2, + }, + down: { + doc_count: 1, + }, + }, + { + key: 2, + up: { + doc_count: 1, + }, + down: { + doc_count: 2, + }, + }, + { + key: 3, + up: { + doc_count: 3, + }, + down: { + doc_count: 1, + }, + }, + ], + interval: '1m', + }, + }, + }); + + const filters = `{"bool":{"must":[{"simple_query_string":{"query":"http"}}]}}`; + const result = await getPingHistogram({ + callES: mockEsClient, + from: 'now-15m', + to: 'now', + filters, + }); + + expect(mockEsClient).toHaveBeenCalledTimes(1); + expect(result).toMatchSnapshot(); + }); + + it('returns a down-filtered array for when filtered by down status', async () => { + expect.assertions(2); + const mockEsClient = jest.fn(); + standardMockResponse.aggregations.timeseries.interval = '1d'; + mockEsClient.mockReturnValue(standardMockResponse); + const result = await getPingHistogram({ + callES: mockEsClient, + from: '1234', + to: '5678', + filters: '', + monitorId: undefined, + statusFilter: 'down', + }); + + expect(mockEsClient).toHaveBeenCalledTimes(1); + expect(result).toMatchSnapshot(); + }); + + it('returns a down-filtered array for when filtered by up status', async () => { + expect.assertions(2); + const mockEsClient = jest.fn(); + + standardMockResponse.aggregations.timeseries.interval = '1s'; + mockEsClient.mockReturnValue(standardMockResponse); + + const result = await getPingHistogram({ + callES: mockEsClient, + from: '1234', + to: '5678', + filters: '', + monitorId: undefined, + statusFilter: 'up', + }); + + expect(mockEsClient).toHaveBeenCalledTimes(1); + expect(result).toMatchSnapshot(); + }); +}); diff --git a/x-pack/legacy/plugins/uptime/server/lib/requests/__tests__/get_pings.test.ts b/x-pack/legacy/plugins/uptime/server/lib/requests/__tests__/get_pings.test.ts new file mode 100644 index 0000000000000..ab20a958f3d97 --- /dev/null +++ b/x-pack/legacy/plugins/uptime/server/lib/requests/__tests__/get_pings.test.ts @@ -0,0 +1,163 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { getPings } from '../get_pings'; +import { set } from 'lodash'; + +describe('getAll', () => { + let mockEsSearchResult: any; + let mockHits: any; + let expectedGetAllParams: any; + beforeEach(() => { + mockHits = [ + { + _source: { + '@timestamp': '2018-10-30T18:51:59.792Z', + }, + }, + { + _source: { + '@timestamp': '2018-10-30T18:53:59.792Z', + }, + }, + { + _source: { + '@timestamp': '2018-10-30T18:55:59.792Z', + }, + }, + ]; + mockEsSearchResult = { + hits: { + total: { + value: mockHits.length, + }, + hits: mockHits, + }, + aggregations: { + locations: { + buckets: [{ key: 'foo' }], + }, + }, + }; + expectedGetAllParams = { + index: 'heartbeat-8*', + body: { + query: { + bool: { + filter: [{ range: { '@timestamp': { gte: 'now-1h', lte: 'now' } } }], + }, + }, + aggregations: { + locations: { + terms: { + field: 'observer.geo.name', + missing: 'N/A', + size: 1000, + }, + }, + }, + sort: [{ '@timestamp': { order: 'desc' } }], + size: 12, + }, + }; + }); + + it('returns data in the appropriate shape', async () => { + const mockEsClient = jest.fn(); + mockEsClient.mockReturnValue(mockEsSearchResult); + const result = await getPings({ + callES: mockEsClient, + dateRangeStart: 'now-1h', + dateRangeEnd: 'now', + sort: 'asc', + size: 12, + }); + const count = 3; + + expect(result.total).toBe(count); + + const pings = result.pings!; + expect(pings).toHaveLength(count); + expect(pings[0].timestamp).toBe('2018-10-30T18:51:59.792Z'); + expect(pings[1].timestamp).toBe('2018-10-30T18:53:59.792Z'); + expect(pings[2].timestamp).toBe('2018-10-30T18:55:59.792Z'); + expect(mockEsClient).toHaveBeenCalledTimes(1); + }); + + it('creates appropriate sort and size parameters', async () => { + const mockEsClient = jest.fn(); + mockEsClient.mockReturnValue(mockEsSearchResult); + await getPings({ + callES: mockEsClient, + dateRangeStart: 'now-1h', + dateRangeEnd: 'now', + sort: 'asc', + size: 12, + }); + set(expectedGetAllParams, 'body.sort[0]', { '@timestamp': { order: 'asc' } }); + + expect(mockEsClient).toHaveBeenCalledTimes(1); + expect(mockEsClient).toHaveBeenCalledWith('search', expectedGetAllParams); + }); + + it('omits the sort param when no sort passed', async () => { + const mockEsClient = jest.fn(); + mockEsClient.mockReturnValue(mockEsSearchResult); + await getPings({ + callES: mockEsClient, + dateRangeStart: 'now-1h', + dateRangeEnd: 'now', + size: 12, + }); + + expect(mockEsClient).toHaveBeenCalledWith('search', expectedGetAllParams); + }); + + it('omits the size param when no size passed', async () => { + const mockEsClient = jest.fn(); + mockEsClient.mockReturnValue(mockEsSearchResult); + await getPings({ + callES: mockEsClient, + dateRangeStart: 'now-1h', + dateRangeEnd: 'now', + sort: 'desc', + }); + delete expectedGetAllParams.body.size; + set(expectedGetAllParams, 'body.sort[0].@timestamp.order', 'desc'); + + expect(mockEsClient).toHaveBeenCalledWith('search', expectedGetAllParams); + }); + + it('adds a filter for monitor ID', async () => { + const mockEsClient = jest.fn(); + mockEsClient.mockReturnValue(mockEsSearchResult); + await getPings({ + callES: mockEsClient, + dateRangeStart: 'now-1h', + dateRangeEnd: 'now', + monitorId: 'testmonitorid', + }); + delete expectedGetAllParams.body.size; + expectedGetAllParams.body.query.bool.filter.push({ term: { 'monitor.id': 'testmonitorid' } }); + + expect(mockEsClient).toHaveBeenCalledWith('search', expectedGetAllParams); + }); + + it('adds a filter for monitor status', async () => { + const mockEsClient = jest.fn(); + mockEsClient.mockReturnValue(mockEsSearchResult); + await getPings({ + callES: mockEsClient, + dateRangeStart: 'now-1h', + dateRangeEnd: 'now', + status: 'down', + }); + delete expectedGetAllParams.body.size; + expectedGetAllParams.body.query.bool.filter.push({ term: { 'monitor.status': 'down' } }); + + expect(mockEsClient).toHaveBeenCalledWith('search', expectedGetAllParams); + }); +}); diff --git a/x-pack/legacy/plugins/uptime/server/lib/adapters/monitors/__tests__/monitor_charts_mock.json b/x-pack/legacy/plugins/uptime/server/lib/requests/__tests__/monitor_charts_mock.json similarity index 100% rename from x-pack/legacy/plugins/uptime/server/lib/adapters/monitors/__tests__/monitor_charts_mock.json rename to x-pack/legacy/plugins/uptime/server/lib/requests/__tests__/monitor_charts_mock.json diff --git a/x-pack/legacy/plugins/uptime/server/lib/adapters/monitors/generate_filter_aggs.ts b/x-pack/legacy/plugins/uptime/server/lib/requests/generate_filter_aggs.ts similarity index 100% rename from x-pack/legacy/plugins/uptime/server/lib/adapters/monitors/generate_filter_aggs.ts rename to x-pack/legacy/plugins/uptime/server/lib/requests/generate_filter_aggs.ts diff --git a/x-pack/legacy/plugins/uptime/server/lib/requests/get_doc_count.ts b/x-pack/legacy/plugins/uptime/server/lib/requests/get_doc_count.ts new file mode 100644 index 0000000000000..68c122aaaa9fb --- /dev/null +++ b/x-pack/legacy/plugins/uptime/server/lib/requests/get_doc_count.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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { DocCount } from '../../../common/graphql/types'; +import { INDEX_NAMES } from '../../../common/constants'; +import { UMElasticsearchQueryFn } from '../adapters'; + +export const getDocCount: UMElasticsearchQueryFn<{}, DocCount> = async ({ callES }) => { + const { count } = await callES('count', { index: INDEX_NAMES.HEARTBEAT }); + + return { count }; +}; diff --git a/x-pack/legacy/plugins/uptime/server/lib/requests/get_filter_bar.ts b/x-pack/legacy/plugins/uptime/server/lib/requests/get_filter_bar.ts new file mode 100644 index 0000000000000..79259afe2b9eb --- /dev/null +++ b/x-pack/legacy/plugins/uptime/server/lib/requests/get_filter_bar.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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { UMElasticsearchQueryFn } from '../adapters'; +import { OverviewFilters } from '../../../common/runtime_types'; +import { generateFilterAggs } from './generate_filter_aggs'; +import { INDEX_NAMES } from '../../../common/constants'; + +export interface GetFilterBarParams { + /** @param dateRangeStart timestamp bounds */ + dateRangeStart: string; + /** @member dateRangeEnd timestamp bounds */ + dateRangeEnd: string; + /** @member search this value should correspond to Elasticsearch DSL + * generated from KQL text the user provided. + */ + search?: Record; + filterOptions: Record; +} + +export const combineRangeWithFilters = ( + dateRangeStart: string, + dateRangeEnd: string, + filters?: Record +) => { + const range = { + range: { + '@timestamp': { + gte: dateRangeStart, + lte: dateRangeEnd, + }, + }, + }; + if (!filters) return range; + const clientFiltersList = Array.isArray(filters?.bool?.filter ?? {}) + ? // i.e. {"bool":{"filter":{ ...some nested filter objects }}} + filters.bool.filter + : // i.e. {"bool":{"filter":[ ...some listed filter objects ]}} + Object.keys(filters?.bool?.filter ?? {}).map(key => ({ + ...filters?.bool?.filter?.[key], + })); + filters.bool.filter = [...clientFiltersList, range]; + return filters; +}; + +type SupportedFields = 'locations' | 'ports' | 'schemes' | 'tags'; + +export const extractFilterAggsResults = ( + responseAggregations: Record, + keys: SupportedFields[] +): OverviewFilters => { + const values: OverviewFilters = { + locations: [], + ports: [], + schemes: [], + tags: [], + }; + keys.forEach(key => { + const buckets = responseAggregations[key]?.term?.buckets ?? []; + values[key] = buckets.map((item: { key: string | number }) => item.key); + }); + return values; +}; + +export const getFilterBar: UMElasticsearchQueryFn = async ({ + callES, + dateRangeStart, + dateRangeEnd, + search, + filterOptions, +}) => { + const aggs = generateFilterAggs( + [ + { aggName: 'locations', filterName: 'locations', field: 'observer.geo.name' }, + { aggName: 'ports', filterName: 'ports', field: 'url.port' }, + { aggName: 'schemes', filterName: 'schemes', field: 'monitor.type' }, + { aggName: 'tags', filterName: 'tags', field: 'tags' }, + ], + filterOptions + ); + const filters = combineRangeWithFilters(dateRangeStart, dateRangeEnd, search); + const params = { + index: INDEX_NAMES.HEARTBEAT, + body: { + size: 0, + query: { + ...filters, + }, + aggs, + }, + }; + + const { aggregations } = await callES('search', params); + return extractFilterAggsResults(aggregations, ['tags', 'locations', 'ports', 'schemes']); +}; diff --git a/x-pack/legacy/plugins/uptime/server/lib/requests/get_index_pattern.ts b/x-pack/legacy/plugins/uptime/server/lib/requests/get_index_pattern.ts new file mode 100644 index 0000000000000..4b40f800b6779 --- /dev/null +++ b/x-pack/legacy/plugins/uptime/server/lib/requests/get_index_pattern.ts @@ -0,0 +1,45 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { APICaller } from 'src/core/server'; +import { UMElasticsearchQueryFn } from '../adapters'; +import { IndexPatternsFetcher, IIndexPattern } from '../../../../../../../src/plugins/data/server'; +import { INDEX_NAMES } from '../../../common/constants'; + +export const getUptimeIndexPattern: UMElasticsearchQueryFn = async callES => { + const indexPatternsFetcher = new IndexPatternsFetcher((...rest: Parameters) => + callES(...rest) + ); + + // Since `getDynamicIndexPattern` is called in setup_request (and thus by every endpoint) + // and since `getFieldsForWildcard` will throw if the specified indices don't exist, + // we have to catch errors here to avoid all endpoints returning 500 for users without APM data + // (would be a bad first time experience) + try { + const fields = await indexPatternsFetcher.getFieldsForWildcard({ + pattern: INDEX_NAMES.HEARTBEAT, + }); + + const indexPattern: IIndexPattern = { + fields, + title: INDEX_NAMES.HEARTBEAT, + }; + + return indexPattern; + } catch (e) { + const notExists = e.output?.statusCode === 404; + if (notExists) { + // eslint-disable-next-line no-console + console.error( + `Could not get dynamic index pattern because indices "${INDEX_NAMES.HEARTBEAT}" don't exist` + ); + return; + } + + // re-throw + throw e; + } +}; diff --git a/x-pack/legacy/plugins/uptime/server/lib/requests/get_latest_monitor.ts b/x-pack/legacy/plugins/uptime/server/lib/requests/get_latest_monitor.ts new file mode 100644 index 0000000000000..bfaee3f2bf7ee --- /dev/null +++ b/x-pack/legacy/plugins/uptime/server/lib/requests/get_latest_monitor.ts @@ -0,0 +1,78 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { UMElasticsearchQueryFn } from '../adapters'; +import { Ping } from '../../../common/graphql/types'; +import { INDEX_NAMES } from '../../../common/constants'; + +export interface GetLatestMonitorParams { + /** @member dateRangeStart timestamp bounds */ + dateStart: string; + + /** @member dateRangeEnd timestamp bounds */ + dateEnd: string; + + /** @member monitorId optional limit to monitorId */ + monitorId?: string | null; +} + +// Get The monitor latest state sorted by timestamp with date range +export const getLatestMonitor: UMElasticsearchQueryFn = async ({ + callES, + dateStart, + dateEnd, + monitorId, +}) => { + // TODO: Write tests for this function + + const params = { + index: INDEX_NAMES.HEARTBEAT, + body: { + query: { + bool: { + filter: [ + { + range: { + '@timestamp': { + gte: dateStart, + lte: dateEnd, + }, + }, + }, + ...(monitorId ? [{ term: { 'monitor.id': monitorId } }] : []), + ], + }, + }, + size: 0, + aggs: { + by_id: { + terms: { + field: 'monitor.id', + size: 1000, + }, + aggs: { + latest: { + top_hits: { + size: 1, + sort: { + '@timestamp': { order: 'desc' }, + }, + }, + }, + }, + }, + }, + }, + }; + + const result = await callES('search', params); + const ping: any = result.aggregations.by_id.buckets?.[0]?.latest.hits?.hits?.[0] ?? {}; + + return { + ...ping?._source, + timestamp: ping?._source?.['@timestamp'], + }; +}; diff --git a/x-pack/legacy/plugins/uptime/server/lib/requests/get_monitor.ts b/x-pack/legacy/plugins/uptime/server/lib/requests/get_monitor.ts new file mode 100644 index 0000000000000..94175616f374e --- /dev/null +++ b/x-pack/legacy/plugins/uptime/server/lib/requests/get_monitor.ts @@ -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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { UMElasticsearchQueryFn } from '../adapters'; +import { Ping } from '../../../common/graphql/types'; +import { INDEX_NAMES } from '../../../common/constants'; + +export interface GetMonitorParams { + /** @member monitorId optional limit to monitorId */ + monitorId?: string | null; +} + +// Get the monitor meta info regardless of timestamp +export const getMonitor: UMElasticsearchQueryFn = async ({ + callES, + monitorId, +}) => { + const params = { + index: INDEX_NAMES.HEARTBEAT, + body: { + size: 1, + _source: ['url', 'monitor', 'observer'], + query: { + bool: { + filter: [ + { + term: { + 'monitor.id': monitorId, + }, + }, + ], + }, + }, + sort: [ + { + '@timestamp': { + order: 'desc', + }, + }, + ], + }, + }; + + const result = await callES('search', params); + + return result.hits.hits[0]?._source; +}; diff --git a/x-pack/legacy/plugins/uptime/server/lib/requests/get_monitor_charts.ts b/x-pack/legacy/plugins/uptime/server/lib/requests/get_monitor_charts.ts new file mode 100644 index 0000000000000..b97cc7287e921 --- /dev/null +++ b/x-pack/legacy/plugins/uptime/server/lib/requests/get_monitor_charts.ts @@ -0,0 +1,176 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { UMElasticsearchQueryFn } from '../adapters'; +import { INDEX_NAMES } from '../../../common/constants'; +import { getHistogramIntervalFormatted } from '../helper'; +import { MonitorChart, LocationDurationLine } from '../../../common/graphql/types'; + +export interface GetMonitorChartsParams { + /** @member monitorId ID value for the selected monitor */ + monitorId: string; + /** @member dateRangeStart timestamp bounds */ + dateRangeStart: string; + /** @member dateRangeEnd timestamp bounds */ + dateRangeEnd: string; + /** @member location optional location value for use in filtering*/ + location?: string | null; +} + +const formatStatusBuckets = (time: any, buckets: any, docCount: any) => { + let up = null; + let down = null; + + buckets.forEach((bucket: any) => { + if (bucket.key === 'up') { + up = bucket.doc_count; + } else if (bucket.key === 'down') { + down = bucket.doc_count; + } + }); + + return { + x: time, + up, + down, + total: docCount, + }; +}; + +/** + * Fetches data used to populate monitor charts + */ +export const getMonitorCharts: UMElasticsearchQueryFn< + GetMonitorChartsParams, + MonitorChart +> = async ({ callES, dateRangeStart, dateRangeEnd, monitorId, location }) => { + const params = { + index: INDEX_NAMES.HEARTBEAT, + body: { + query: { + bool: { + filter: [ + { range: { '@timestamp': { gte: dateRangeStart, lte: dateRangeEnd } } }, + { term: { 'monitor.id': monitorId } }, + { term: { 'monitor.status': 'up' } }, + // if location is truthy, add it as a filter. otherwise add nothing + ...(!!location ? [{ term: { 'observer.geo.name': location } }] : []), + ], + }, + }, + size: 0, + aggs: { + timeseries: { + date_histogram: { + field: '@timestamp', + fixed_interval: getHistogramIntervalFormatted(dateRangeStart, dateRangeEnd), + min_doc_count: 0, + }, + aggs: { + location: { + terms: { + field: 'observer.geo.name', + missing: 'N/A', + }, + aggs: { + status: { terms: { field: 'monitor.status', size: 2, shard_size: 2 } }, + duration: { stats: { field: 'monitor.duration.us' } }, + }, + }, + }, + }, + }, + }, + }; + + const result = await callES('search', params); + + const dateHistogramBuckets: any[] = result?.aggregations?.timeseries?.buckets ?? []; + + /** + * The code below is responsible for formatting the aggregation data we fetched above in a way + * that the chart components used by the client understands. + * There are five required values. Two are lists of points that conform to a simple (x,y) structure. + * + * The third list is for an area chart expressing a range, and it requires an (x,y,y0) structure, + * where y0 is the min value for the point and y is the max. + * + * Additionally, we supply the maximum value for duration and status, so the corresponding charts know + * what the domain size should be. + */ + const monitorChartsData: MonitorChart = { + locationDurationLines: [], + status: [], + durationMaxValue: 0, + statusMaxCount: 0, + }; + + /** + * The following section of code enables us to provide buckets per location + * that have a `null` value if there is no data at the given timestamp. + * + * We maintain two `Set`s. One is per bucket, the other is persisted for the + * entire collection. At the end of a bucket's evaluation, if there was no object + * parsed for a given location line that was already started, we insert an element + * to the given line with a null value. Without this, our charts on the client will + * display a continuous line for each of the points they are provided. + */ + + // a set of all the locations found for this result + const resultLocations = new Set(); + const linesByLocation: { [key: string]: LocationDurationLine } = {}; + dateHistogramBuckets.forEach(dateHistogramBucket => { + const x = dateHistogramBucket.key; + const docCount = dateHistogramBucket?.doc_count ?? 0; + // a set of all the locations for the current bucket + const bucketLocations = new Set(); + + dateHistogramBucket.location.buckets.forEach( + (locationBucket: { key: string; duration: { avg: number } }) => { + const locationName = locationBucket.key; + // store the location name in each set + bucketLocations.add(locationName); + resultLocations.add(locationName); + + // create a new line for this location if it doesn't exist + let currentLine: LocationDurationLine = linesByLocation?.[locationName] ?? undefined; + if (!currentLine) { + currentLine = { name: locationName, line: [] }; + linesByLocation[locationName] = currentLine; + monitorChartsData.locationDurationLines.push(currentLine); + } + // add the entry for the current location's duration average + currentLine.line.push({ x, y: locationBucket?.duration?.avg ?? null }); + } + ); + + // if there are more lines in the result than are represented in the current bucket, + // we must add null entries + if (dateHistogramBucket.location.buckets.length < resultLocations.size) { + resultLocations.forEach(resultLocation => { + // the current bucket has a value for this location, do nothing + if (location && location !== resultLocation) return; + // the current bucket had no value for this location, insert a null value + if (!bucketLocations.has(resultLocation)) { + const locationLine = monitorChartsData.locationDurationLines.find( + ({ name }) => name === resultLocation + ); + // in practice, there should always be a line present, but `find` can return `undefined` + if (locationLine) { + // this will create a gap in the line like we desire + locationLine.line.push({ x, y: null }); + } + } + }); + } + + monitorChartsData.status.push( + formatStatusBuckets(x, dateHistogramBucket?.status?.buckets ?? [], docCount) + ); + }); + + return monitorChartsData; +}; diff --git a/x-pack/legacy/plugins/uptime/server/lib/requests/get_monitor_details.ts b/x-pack/legacy/plugins/uptime/server/lib/requests/get_monitor_details.ts new file mode 100644 index 0000000000000..b516fde1ce844 --- /dev/null +++ b/x-pack/legacy/plugins/uptime/server/lib/requests/get_monitor_details.ts @@ -0,0 +1,76 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { UMElasticsearchQueryFn } from '../adapters'; +import { MonitorDetails, MonitorError } from '../../../common/runtime_types'; +import { INDEX_NAMES } from '../../../common/constants'; + +export interface GetMonitorDetailsParams { + monitorId: string; + dateStart: string; + dateEnd: string; +} + +export const getMonitorDetails: UMElasticsearchQueryFn< + GetMonitorDetailsParams, + MonitorDetails +> = async ({ callES, monitorId, dateStart, dateEnd }) => { + const queryFilters: any = [ + { + range: { + '@timestamp': { + gte: dateStart, + lte: dateEnd, + }, + }, + }, + { + term: { + 'monitor.id': monitorId, + }, + }, + ]; + + const params = { + index: INDEX_NAMES.HEARTBEAT, + body: { + size: 1, + _source: ['error', '@timestamp'], + query: { + bool: { + must: [ + { + exists: { + field: 'error', + }, + }, + ], + filter: queryFilters, + }, + }, + sort: [ + { + '@timestamp': { + order: 'desc', + }, + }, + ], + }, + }; + + const result = await callES('search', params); + + const data = result.hits.hits[0]?._source; + + const monitorError: MonitorError | undefined = data?.error; + const errorTimeStamp: string | undefined = data?.['@timestamp']; + + return { + monitorId, + error: monitorError, + timestamp: errorTimeStamp, + }; +}; diff --git a/x-pack/legacy/plugins/uptime/server/lib/requests/get_monitor_locations.ts b/x-pack/legacy/plugins/uptime/server/lib/requests/get_monitor_locations.ts new file mode 100644 index 0000000000000..e1a0e14fe951d --- /dev/null +++ b/x-pack/legacy/plugins/uptime/server/lib/requests/get_monitor_locations.ts @@ -0,0 +1,117 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { UMElasticsearchQueryFn } from '../adapters'; +import { INDEX_NAMES, UNNAMED_LOCATION } from '../../../common/constants'; +import { MonitorLocations, MonitorLocation } from '../../../common/runtime_types'; + +/** + * Fetch data for the monitor page title. + */ +export interface GetMonitorLocationsParams { + /** + * @member monitorId the ID to query + */ + monitorId: string; + dateStart: string; + dateEnd: string; +} + +export const getMonitorLocations: UMElasticsearchQueryFn< + GetMonitorLocationsParams, + MonitorLocations +> = async ({ callES, monitorId, dateStart, dateEnd }) => { + const params = { + index: INDEX_NAMES.HEARTBEAT, + body: { + size: 0, + query: { + bool: { + filter: [ + { + match: { + 'monitor.id': monitorId, + }, + }, + { + exists: { + field: 'summary', + }, + }, + { + range: { + '@timestamp': { + gte: dateStart, + lte: dateEnd, + }, + }, + }, + ], + }, + }, + aggs: { + location: { + terms: { + field: 'observer.geo.name', + missing: '__location_missing__', + }, + aggs: { + most_recent: { + top_hits: { + size: 1, + sort: { + '@timestamp': { + order: 'desc', + }, + }, + _source: ['monitor', 'summary', 'observer', '@timestamp'], + }, + }, + }, + }, + }, + }, + }; + + const result = await callES('search', params); + const locations = result?.aggregations?.location?.buckets ?? []; + + const getGeo = (locGeo: { name: string; location?: string }) => { + if (locGeo) { + const { name, location } = locGeo; + const latLon = location?.trim().split(','); + return { + name, + location: latLon + ? { + lat: latLon[0], + lon: latLon[1], + } + : undefined, + }; + } else { + return { + name: UNNAMED_LOCATION, + }; + } + }; + + const monLocs: MonitorLocation[] = []; + locations.forEach((loc: any) => { + const mostRecentLocation = loc.most_recent.hits.hits[0]._source; + const location: MonitorLocation = { + summary: mostRecentLocation?.summary, + geo: getGeo(mostRecentLocation?.observer?.geo), + timestamp: mostRecentLocation['@timestamp'], + }; + monLocs.push(location); + }); + + return { + monitorId, + locations: monLocs, + }; +}; diff --git a/x-pack/legacy/plugins/uptime/server/lib/requests/get_monitor_states.ts b/x-pack/legacy/plugins/uptime/server/lib/requests/get_monitor_states.ts new file mode 100644 index 0000000000000..32c82b1fa2098 --- /dev/null +++ b/x-pack/legacy/plugins/uptime/server/lib/requests/get_monitor_states.ts @@ -0,0 +1,68 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { CONTEXT_DEFAULTS } from '../../../common/constants'; +import { fetchPage } from './search'; +import { UMElasticsearchQueryFn } from '../adapters'; +import { MonitorSummary, SortOrder, CursorDirection } from '../../../common/graphql/types'; +import { QueryContext } from './search'; + +export interface CursorPagination { + cursorKey?: any; + cursorDirection: CursorDirection; + sortOrder: SortOrder; +} + +export interface GetMonitorStatesParams { + dateRangeStart: string; + dateRangeEnd: string; + pagination?: CursorPagination; + filters?: string | null; + statusFilter?: string; +} + +export interface GetMonitorStatesResult { + summaries: MonitorSummary[]; + nextPagePagination: string | null; + prevPagePagination: string | null; +} + +// To simplify the handling of the group of pagination vars they're passed back to the client as a string +const jsonifyPagination = (p: any): string | null => { + if (!p) { + return null; + } + + return JSON.stringify(p); +}; + +// Gets a page of monitor states. +export const getMonitorStates: UMElasticsearchQueryFn< + GetMonitorStatesParams, + GetMonitorStatesResult +> = async ({ callES, dateRangeStart, dateRangeEnd, pagination, filters, statusFilter }) => { + pagination = pagination || CONTEXT_DEFAULTS.CURSOR_PAGINATION; + statusFilter = statusFilter === null ? undefined : statusFilter; + const size = 10; + + const queryContext = new QueryContext( + callES, + dateRangeStart, + dateRangeEnd, + pagination, + filters && filters !== '' ? JSON.parse(filters) : null, + size, + statusFilter + ); + + const page = await fetchPage(queryContext); + + return { + summaries: page.items, + nextPagePagination: jsonifyPagination(page.nextPagePagination), + prevPagePagination: jsonifyPagination(page.prevPagePagination), + }; +}; diff --git a/x-pack/legacy/plugins/uptime/server/lib/adapters/pings/es_get_ping_historgram.ts b/x-pack/legacy/plugins/uptime/server/lib/requests/get_ping_histogram.ts similarity index 60% rename from x-pack/legacy/plugins/uptime/server/lib/adapters/pings/es_get_ping_historgram.ts rename to x-pack/legacy/plugins/uptime/server/lib/requests/get_ping_histogram.ts index 66cae497eb081..3b448dc31659b 100644 --- a/x-pack/legacy/plugins/uptime/server/lib/adapters/pings/es_get_ping_historgram.ts +++ b/x-pack/legacy/plugins/uptime/server/lib/requests/get_ping_histogram.ts @@ -4,17 +4,29 @@ * you may not use this file except in compliance with the Elastic License. */ -import { get } from 'lodash'; -import { INDEX_NAMES, QUERY } from '../../../../common/constants'; -import { parseFilterQuery, getFilterClause } from '../../helper'; -import { UMElasticsearchQueryFn } from '../framework'; -import { GetPingHistogramParams, HistogramResult } from '../../../../common/types'; +import { UMElasticsearchQueryFn } from '../adapters'; +import { parseFilterQuery, getFilterClause } from '../helper'; +import { INDEX_NAMES, QUERY } from '../../../common/constants'; import { HistogramQueryResult } from './types'; +import { HistogramResult } from '../../../common/types'; -export const esGetPingHistogram: UMElasticsearchQueryFn< +export interface GetPingHistogramParams { + /** @member dateRangeStart timestamp bounds */ + from: string; + /** @member dateRangeEnd timestamp bounds */ + to: string; + /** @member filters user-defined filters */ + filters?: string | null; + /** @member monitorId optional limit to monitorId */ + monitorId?: string | null; + /** @member statusFilter special filter targeting the latest status of each monitor */ + statusFilter?: string | null; +} + +export const getPingHistogram: UMElasticsearchQueryFn< GetPingHistogramParams, HistogramResult -> = async ({ callES, dateStart, dateEnd, filters, monitorId, statusFilter }) => { +> = async ({ callES, from, to, filters, monitorId, statusFilter }) => { const boolFilters = parseFilterQuery(filters); const additionalFilters = []; if (monitorId) { @@ -23,7 +35,7 @@ export const esGetPingHistogram: UMElasticsearchQueryFn< if (boolFilters) { additionalFilters.push(boolFilters); } - const filter = getFilterClause(dateStart, dateEnd, additionalFilters); + const filter = getFilterClause(from, to, additionalFilters); const params = { index: INDEX_NAMES.HEARTBEAT, @@ -63,11 +75,11 @@ export const esGetPingHistogram: UMElasticsearchQueryFn< const result = await callES('search', params); const interval = result.aggregations.timeseries?.interval; - const buckets: HistogramQueryResult[] = get(result, 'aggregations.timeseries.buckets', []); + const buckets: HistogramQueryResult[] = result?.aggregations?.timeseries?.buckets ?? []; const histogram = buckets.map(bucket => { - const x: number = get(bucket, 'key'); - const downCount: number = get(bucket, 'down.doc_count'); - const upCount: number = get(bucket, 'up.doc_count'); + const x: number = bucket.key; + const downCount: number = bucket.down.doc_count; + const upCount: number = bucket.up.doc_count; return { x, downCount: statusFilter && statusFilter !== 'down' ? 0 : downCount, diff --git a/x-pack/legacy/plugins/uptime/server/lib/requests/get_pings.ts b/x-pack/legacy/plugins/uptime/server/lib/requests/get_pings.ts new file mode 100644 index 0000000000000..381aca720dc1d --- /dev/null +++ b/x-pack/legacy/plugins/uptime/server/lib/requests/get_pings.ts @@ -0,0 +1,108 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { UMElasticsearchQueryFn } from '../adapters/framework'; +import { PingResults, Ping, HttpBody } from '../../../common/graphql/types'; +import { INDEX_NAMES } from '../../../common/constants'; + +export interface GetPingsParams { + /** @member dateRangeStart timestamp bounds */ + dateRangeStart: string; + + /** @member dateRangeEnd timestamp bounds */ + dateRangeEnd: string; + + /** @member monitorId optional limit by monitorId */ + monitorId?: string | null; + + /** @member status optional limit by check statuses */ + status?: string | null; + + /** @member sort optional sort by timestamp */ + sort?: string | null; + + /** @member size optional limit query size */ + size?: number | null; + + /** @member location optional location value for use in filtering*/ + location?: string | null; +} + +export const getPings: UMElasticsearchQueryFn = async ({ + callES, + dateRangeStart, + dateRangeEnd, + monitorId, + status, + sort, + size, + location, +}) => { + const sortParam = { sort: [{ '@timestamp': { order: sort ?? 'desc' } }] }; + const sizeParam = size ? { size } : undefined; + const filter: any[] = [{ range: { '@timestamp': { gte: dateRangeStart, lte: dateRangeEnd } } }]; + if (monitorId) { + filter.push({ term: { 'monitor.id': monitorId } }); + } + if (status) { + filter.push({ term: { 'monitor.status': status } }); + } + + let postFilterClause = {}; + if (location) { + postFilterClause = { post_filter: { term: { 'observer.geo.name': location } } }; + } + const queryContext = { bool: { filter } }; + const params = { + index: INDEX_NAMES.HEARTBEAT, + body: { + query: { + ...queryContext, + }, + ...sortParam, + ...sizeParam, + aggregations: { + locations: { + terms: { + field: 'observer.geo.name', + missing: 'N/A', + size: 1000, + }, + }, + }, + ...postFilterClause, + }, + }; + + const { + hits: { hits, total }, + aggregations: aggs, + } = await callES('search', params); + + const locations = aggs?.locations ?? { buckets: [{ key: 'N/A', doc_count: 0 }] }; + + const pings: Ping[] = hits.map(({ _id, _source }: any) => { + const timestamp = _source['@timestamp']; + + // Calculate here the length of the content string in bytes, this is easier than in client JS, where + // we don't have access to Buffer.byteLength. There are some hacky ways to do this in the + // client but this is cleaner. + const httpBody: HttpBody | undefined = _source?.http?.response?.body; + if (httpBody && httpBody.content) { + httpBody.content_bytes = Buffer.byteLength(httpBody.content); + } + + return { id: _id, timestamp, ..._source }; + }); + + const results: PingResults = { + total: total.value, + locations: locations.buckets.map((bucket: { key: string }) => bucket.key), + pings, + }; + + return results; +}; diff --git a/x-pack/legacy/plugins/uptime/server/lib/requests/get_snapshot_counts.ts b/x-pack/legacy/plugins/uptime/server/lib/requests/get_snapshot_counts.ts new file mode 100644 index 0000000000000..6236971146015 --- /dev/null +++ b/x-pack/legacy/plugins/uptime/server/lib/requests/get_snapshot_counts.ts @@ -0,0 +1,102 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { UMElasticsearchQueryFn } from '../adapters'; +import { Snapshot } from '../../../common/runtime_types'; +import { QueryContext, MonitorGroupIterator } from './search'; +import { CONTEXT_DEFAULTS, INDEX_NAMES } from '../../../common/constants'; + +export interface GetSnapshotCountParams { + dateRangeStart: string; + dateRangeEnd: string; + filters?: string | null; + statusFilter?: string; +} + +const fastStatusCount = async (context: QueryContext): Promise => { + const params = { + index: INDEX_NAMES.HEARTBEAT, + body: { + size: 0, + query: { bool: { filter: await context.dateAndCustomFilters() } }, + aggs: { + unique: { + // We set the precision threshold to 40k which is the max precision supported by cardinality + cardinality: { field: 'monitor.id', precision_threshold: 40000 }, + }, + down: { + filter: { range: { 'summary.down': { gt: 0 } } }, + aggs: { + unique: { cardinality: { field: 'monitor.id', precision_threshold: 40000 } }, + }, + }, + }, + }, + }; + + const statistics = await context.search(params); + const total = statistics.aggregations.unique.value; + const down = statistics.aggregations.down.unique.value; + + return { + total, + down, + up: total - down, + }; +}; + +const slowStatusCount = async (context: QueryContext, status: string): Promise => { + const downContext = context.clone(); + downContext.statusFilter = status; + const iterator = new MonitorGroupIterator(downContext); + let count = 0; + while (await iterator.next()) { + count++; + } + return count; +}; + +export const getSnapshotCount: UMElasticsearchQueryFn = async ({ + callES, + dateRangeStart, + dateRangeEnd, + filters, + statusFilter, +}): Promise => { + if (!(statusFilter === 'up' || statusFilter === 'down' || statusFilter === undefined)) { + throw new Error(`Invalid status filter value '${statusFilter}'`); + } + + const context = new QueryContext( + callES, + dateRangeStart, + dateRangeEnd, + CONTEXT_DEFAULTS.CURSOR_PAGINATION, + filters && filters !== '' ? JSON.parse(filters) : null, + Infinity, + statusFilter + ); + + // Calculate the total, up, and down counts. + const counts = await fastStatusCount(context); + + // Check if the last count was accurate, if not, we need to perform a slower count with the + // MonitorGroupsIterator. + if (!(await context.hasTimespan())) { + // Figure out whether 'up' or 'down' is more common. It's faster to count the lower cardinality + // one then use subtraction to figure out its opposite. + const [leastCommonStatus, mostCommonStatus]: Array<'up' | 'down'> = + counts.up > counts.down ? ['down', 'up'] : ['up', 'down']; + counts[leastCommonStatus] = await slowStatusCount(context, leastCommonStatus); + counts[mostCommonStatus] = counts.total - counts[leastCommonStatus]; + } + + return { + total: statusFilter ? counts[statusFilter] : counts.total, + up: statusFilter === 'down' ? 0 : counts.up, + down: statusFilter === 'up' ? 0 : counts.down, + }; +}; diff --git a/x-pack/legacy/plugins/uptime/server/lib/requests/get_states_index_status.ts b/x-pack/legacy/plugins/uptime/server/lib/requests/get_states_index_status.ts new file mode 100644 index 0000000000000..5044b9a6932cf --- /dev/null +++ b/x-pack/legacy/plugins/uptime/server/lib/requests/get_states_index_status.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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { UMElasticsearchQueryFn } from '../adapters'; +import { StatesIndexStatus } from '../../../common/graphql/types'; +import { INDEX_NAMES } from '../../../common/constants'; + +export const getStatesIndexStatus: UMElasticsearchQueryFn<{}, StatesIndexStatus> = async ({ + callES, +}) => { + const { + _shards: { total }, + count, + } = await callES('count', { index: INDEX_NAMES.HEARTBEAT }); + return { + indexExists: total > 0, + docCount: { + count, + }, + }; +}; diff --git a/x-pack/legacy/plugins/uptime/server/lib/requests/index.ts b/x-pack/legacy/plugins/uptime/server/lib/requests/index.ts new file mode 100644 index 0000000000000..f41b7257524fd --- /dev/null +++ b/x-pack/legacy/plugins/uptime/server/lib/requests/index.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; + * you may not use this file except in compliance with the Elastic License. + */ + +export { getDocCount } from './get_doc_count'; +export { getFilterBar, GetFilterBarParams } from './get_filter_bar'; +export { getUptimeIndexPattern as getIndexPattern } from './get_index_pattern'; +export { getLatestMonitor, GetLatestMonitorParams } from './get_latest_monitor'; +export { getMonitor, GetMonitorParams } from './get_monitor'; +export { getMonitorCharts, GetMonitorChartsParams } from './get_monitor_charts'; +export { getMonitorDetails, GetMonitorDetailsParams } from './get_monitor_details'; +export { getMonitorLocations, GetMonitorLocationsParams } from './get_monitor_locations'; +export { getMonitorStates, GetMonitorStatesParams } from './get_monitor_states'; +export { getPings, GetPingsParams } from './get_pings'; +export { getPingHistogram, GetPingHistogramParams } from './get_ping_histogram'; +export { UptimeRequests } from './uptime_requests'; +export { getSnapshotCount, GetSnapshotCountParams } from './get_snapshot_counts'; +export { getStatesIndexStatus } from './get_states_index_status'; diff --git a/x-pack/legacy/plugins/uptime/server/lib/adapters/monitor_states/search/__tests__/fetch_page.test.ts b/x-pack/legacy/plugins/uptime/server/lib/requests/search/__tests__/fetch_page.test.ts similarity index 97% rename from x-pack/legacy/plugins/uptime/server/lib/adapters/monitor_states/search/__tests__/fetch_page.test.ts rename to x-pack/legacy/plugins/uptime/server/lib/requests/search/__tests__/fetch_page.test.ts index 0bbdaa87a5e66..d519a4e75463f 100644 --- a/x-pack/legacy/plugins/uptime/server/lib/adapters/monitor_states/search/__tests__/fetch_page.test.ts +++ b/x-pack/legacy/plugins/uptime/server/lib/requests/search/__tests__/fetch_page.test.ts @@ -12,7 +12,7 @@ import { MonitorGroupsPage, } from '../fetch_page'; import { QueryContext } from '../query_context'; -import { MonitorSummary } from '../../../../../../common/graphql/types'; +import { MonitorSummary } from '../../../../../common/graphql/types'; import { nextPagination, prevPagination, simpleQueryContext } from './test_helpers'; const simpleFixture: MonitorGroups[] = [ diff --git a/x-pack/legacy/plugins/uptime/server/lib/adapters/monitor_states/search/__tests__/find_potential_matches_test.ts b/x-pack/legacy/plugins/uptime/server/lib/requests/search/__tests__/find_potential_matches_test.ts similarity index 100% rename from x-pack/legacy/plugins/uptime/server/lib/adapters/monitor_states/search/__tests__/find_potential_matches_test.ts rename to x-pack/legacy/plugins/uptime/server/lib/requests/search/__tests__/find_potential_matches_test.ts diff --git a/x-pack/legacy/plugins/uptime/server/lib/adapters/monitor_states/search/__tests__/monitor_group_iterator.test.ts b/x-pack/legacy/plugins/uptime/server/lib/requests/search/__tests__/monitor_group_iterator.test.ts similarity index 100% rename from x-pack/legacy/plugins/uptime/server/lib/adapters/monitor_states/search/__tests__/monitor_group_iterator.test.ts rename to x-pack/legacy/plugins/uptime/server/lib/requests/search/__tests__/monitor_group_iterator.test.ts diff --git a/x-pack/legacy/plugins/uptime/server/lib/adapters/monitor_states/search/__tests__/query_context.test.ts b/x-pack/legacy/plugins/uptime/server/lib/requests/search/__tests__/query_context.test.ts similarity index 94% rename from x-pack/legacy/plugins/uptime/server/lib/adapters/monitor_states/search/__tests__/query_context.test.ts rename to x-pack/legacy/plugins/uptime/server/lib/requests/search/__tests__/query_context.test.ts index 8924d07ac0c4d..86506c2c4c044 100644 --- a/x-pack/legacy/plugins/uptime/server/lib/adapters/monitor_states/search/__tests__/query_context.test.ts +++ b/x-pack/legacy/plugins/uptime/server/lib/requests/search/__tests__/query_context.test.ts @@ -5,8 +5,8 @@ */ import { QueryContext } from '../query_context'; -import { CursorPagination } from '../..'; -import { CursorDirection, SortOrder } from '../../../../../../common/graphql/types'; +import { CursorPagination } from '../types'; +import { CursorDirection, SortOrder } from '../../../../../common/graphql/types'; describe(QueryContext, () => { // 10 minute range diff --git a/x-pack/legacy/plugins/uptime/server/lib/adapters/monitor_states/search/__tests__/test_helpers.ts b/x-pack/legacy/plugins/uptime/server/lib/requests/search/__tests__/test_helpers.ts similarity index 85% rename from x-pack/legacy/plugins/uptime/server/lib/adapters/monitor_states/search/__tests__/test_helpers.ts rename to x-pack/legacy/plugins/uptime/server/lib/requests/search/__tests__/test_helpers.ts index bb3f3da3e289d..98b192d14f91a 100644 --- a/x-pack/legacy/plugins/uptime/server/lib/adapters/monitor_states/search/__tests__/test_helpers.ts +++ b/x-pack/legacy/plugins/uptime/server/lib/requests/search/__tests__/test_helpers.ts @@ -4,8 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -import { CursorPagination } from '../../adapter_types'; -import { CursorDirection, SortOrder } from '../../../../../../common/graphql/types'; +import { CursorPagination } from '../types'; +import { CursorDirection, SortOrder } from '../../../../../common/graphql/types'; import { QueryContext } from '../query_context'; export const prevPagination = (key: any): CursorPagination => { diff --git a/x-pack/legacy/plugins/uptime/server/lib/adapters/monitor_states/search/enrich_monitor_groups.ts b/x-pack/legacy/plugins/uptime/server/lib/requests/search/enrich_monitor_groups.ts similarity index 98% rename from x-pack/legacy/plugins/uptime/server/lib/adapters/monitor_states/search/enrich_monitor_groups.ts rename to x-pack/legacy/plugins/uptime/server/lib/requests/search/enrich_monitor_groups.ts index b64015424ff40..e37c749e63566 100644 --- a/x-pack/legacy/plugins/uptime/server/lib/adapters/monitor_states/search/enrich_monitor_groups.ts +++ b/x-pack/legacy/plugins/uptime/server/lib/requests/search/enrich_monitor_groups.ts @@ -6,15 +6,15 @@ import { get, sortBy } from 'lodash'; import { QueryContext } from './query_context'; -import { getHistogramIntervalFormatted } from '../../../helper'; -import { INDEX_NAMES, STATES } from '../../../../../common/constants'; +import { getHistogramIntervalFormatted } from '../../helper'; +import { INDEX_NAMES, STATES } from '../../../../common/constants'; import { MonitorSummary, SummaryHistogram, Check, CursorDirection, SortOrder, -} from '../../../../../common/graphql/types'; +} from '../../../../common/graphql/types'; import { MonitorEnricher } from './fetch_page'; export const enrichMonitorGroups: MonitorEnricher = async ( diff --git a/x-pack/legacy/plugins/uptime/server/lib/adapters/monitor_states/search/fetch_chunk.ts b/x-pack/legacy/plugins/uptime/server/lib/requests/search/fetch_chunk.ts similarity index 100% rename from x-pack/legacy/plugins/uptime/server/lib/adapters/monitor_states/search/fetch_chunk.ts rename to x-pack/legacy/plugins/uptime/server/lib/requests/search/fetch_chunk.ts diff --git a/x-pack/legacy/plugins/uptime/server/lib/adapters/monitor_states/search/fetch_page.ts b/x-pack/legacy/plugins/uptime/server/lib/requests/search/fetch_page.ts similarity index 97% rename from x-pack/legacy/plugins/uptime/server/lib/adapters/monitor_states/search/fetch_page.ts rename to x-pack/legacy/plugins/uptime/server/lib/requests/search/fetch_page.ts index 046bdc8a8d07d..6440850dc0ffc 100644 --- a/x-pack/legacy/plugins/uptime/server/lib/adapters/monitor_states/search/fetch_page.ts +++ b/x-pack/legacy/plugins/uptime/server/lib/requests/search/fetch_page.ts @@ -5,10 +5,10 @@ */ import { flatten } from 'lodash'; -import { CursorPagination } from '../adapter_types'; +import { CursorPagination } from './types'; import { QueryContext } from './query_context'; -import { QUERY } from '../../../../../common/constants'; -import { CursorDirection, MonitorSummary, SortOrder } from '../../../../../common/graphql/types'; +import { QUERY } from '../../../../common/constants'; +import { CursorDirection, MonitorSummary, SortOrder } from '../../../../common/graphql/types'; import { enrichMonitorGroups } from './enrich_monitor_groups'; import { MonitorGroupIterator } from './monitor_group_iterator'; diff --git a/x-pack/legacy/plugins/uptime/server/lib/adapters/monitor_states/search/find_potential_matches.ts b/x-pack/legacy/plugins/uptime/server/lib/requests/search/find_potential_matches.ts similarity index 96% rename from x-pack/legacy/plugins/uptime/server/lib/adapters/monitor_states/search/find_potential_matches.ts rename to x-pack/legacy/plugins/uptime/server/lib/requests/search/find_potential_matches.ts index 634d6369531d8..fc0e35b279e0b 100644 --- a/x-pack/legacy/plugins/uptime/server/lib/adapters/monitor_states/search/find_potential_matches.ts +++ b/x-pack/legacy/plugins/uptime/server/lib/requests/search/find_potential_matches.ts @@ -5,8 +5,8 @@ */ import { get, set } from 'lodash'; -import { CursorDirection } from '../../../../../common/graphql/types'; -import { INDEX_NAMES } from '../../../../../common/constants'; +import { CursorDirection } from '../../../../common/graphql/types'; +import { INDEX_NAMES } from '../../../../common/constants'; import { QueryContext } from './query_context'; // This is the first phase of the query. In it, we find the most recent check groups that matched the given query. diff --git a/x-pack/legacy/plugins/uptime/server/lib/adapters/monitor_states/search/index.ts b/x-pack/legacy/plugins/uptime/server/lib/requests/search/index.ts similarity index 89% rename from x-pack/legacy/plugins/uptime/server/lib/adapters/monitor_states/search/index.ts rename to x-pack/legacy/plugins/uptime/server/lib/requests/search/index.ts index 040c256935692..8de5687808d61 100644 --- a/x-pack/legacy/plugins/uptime/server/lib/adapters/monitor_states/search/index.ts +++ b/x-pack/legacy/plugins/uptime/server/lib/requests/search/index.ts @@ -6,3 +6,4 @@ export { fetchPage, MonitorGroups, MonitorLocCheckGroup, MonitorGroupsPage } from './fetch_page'; export { MonitorGroupIterator } from './monitor_group_iterator'; +export { QueryContext } from './query_context'; diff --git a/x-pack/legacy/plugins/uptime/server/lib/adapters/monitor_states/search/monitor_group_iterator.ts b/x-pack/legacy/plugins/uptime/server/lib/requests/search/monitor_group_iterator.ts similarity index 98% rename from x-pack/legacy/plugins/uptime/server/lib/adapters/monitor_states/search/monitor_group_iterator.ts rename to x-pack/legacy/plugins/uptime/server/lib/requests/search/monitor_group_iterator.ts index 27c16863a37ab..ced557dbf62e0 100644 --- a/x-pack/legacy/plugins/uptime/server/lib/adapters/monitor_states/search/monitor_group_iterator.ts +++ b/x-pack/legacy/plugins/uptime/server/lib/requests/search/monitor_group_iterator.ts @@ -5,10 +5,10 @@ */ import { QueryContext } from './query_context'; -import { CursorPagination } from '../adapter_types'; import { fetchChunk } from './fetch_chunk'; -import { CursorDirection } from '../../../../../common/graphql/types'; +import { CursorDirection } from '../../../../common/graphql/types'; import { MonitorGroups } from './fetch_page'; +import { CursorPagination } from './types'; // Hardcoded chunk size for how many monitors to fetch at a time when querying export const CHUNK_SIZE = 1000; diff --git a/x-pack/legacy/plugins/uptime/server/lib/adapters/monitor_states/search/query_context.ts b/x-pack/legacy/plugins/uptime/server/lib/requests/search/query_context.ts similarity index 94% rename from x-pack/legacy/plugins/uptime/server/lib/adapters/monitor_states/search/query_context.ts rename to x-pack/legacy/plugins/uptime/server/lib/requests/search/query_context.ts index a51931ba11630..f5b13c165d87d 100644 --- a/x-pack/legacy/plugins/uptime/server/lib/adapters/monitor_states/search/query_context.ts +++ b/x-pack/legacy/plugins/uptime/server/lib/requests/search/query_context.ts @@ -5,10 +5,10 @@ */ import moment from 'moment'; -import { APICaller } from 'kibana/server'; -import { CursorPagination } from '../adapter_types'; -import { INDEX_NAMES } from '../../../../../common/constants'; -import { parseRelativeDate } from '../../../helper/get_histogram_interval'; +import { APICaller } from 'src/core/server'; +import { INDEX_NAMES } from '../../../../common/constants'; +import { CursorPagination } from './types'; +import { parseRelativeDate } from '../../helper'; export class QueryContext { callES: APICaller; diff --git a/x-pack/legacy/plugins/uptime/server/lib/adapters/monitor_states/search/refine_potential_matches.ts b/x-pack/legacy/plugins/uptime/server/lib/requests/search/refine_potential_matches.ts similarity index 97% rename from x-pack/legacy/plugins/uptime/server/lib/adapters/monitor_states/search/refine_potential_matches.ts rename to x-pack/legacy/plugins/uptime/server/lib/requests/search/refine_potential_matches.ts index f8347d0737521..a55301555c8bf 100644 --- a/x-pack/legacy/plugins/uptime/server/lib/adapters/monitor_states/search/refine_potential_matches.ts +++ b/x-pack/legacy/plugins/uptime/server/lib/requests/search/refine_potential_matches.ts @@ -4,9 +4,9 @@ * you may not use this file except in compliance with the Elastic License. */ -import { INDEX_NAMES } from '../../../../../common/constants'; +import { INDEX_NAMES } from '../../../../common/constants'; import { QueryContext } from './query_context'; -import { CursorDirection } from '../../../../../common/graphql/types'; +import { CursorDirection } from '../../../../common/graphql/types'; import { MonitorGroups, MonitorLocCheckGroup } from './fetch_page'; /** diff --git a/x-pack/legacy/plugins/uptime/server/lib/adapters/monitors/index.ts b/x-pack/legacy/plugins/uptime/server/lib/requests/search/types.ts similarity index 55% rename from x-pack/legacy/plugins/uptime/server/lib/adapters/monitors/index.ts rename to x-pack/legacy/plugins/uptime/server/lib/requests/search/types.ts index d02068a11e8d8..dc6021a91146a 100644 --- a/x-pack/legacy/plugins/uptime/server/lib/adapters/monitors/index.ts +++ b/x-pack/legacy/plugins/uptime/server/lib/requests/search/types.ts @@ -4,5 +4,10 @@ * you may not use this file except in compliance with the Elastic License. */ -export * from './adapter_types'; -export { elasticsearchMonitorsAdapter } from './elasticsearch_monitors_adapter'; +import { CursorDirection, SortOrder } from '../../../../common/graphql/types'; + +export interface CursorPagination { + cursorKey?: any; + cursorDirection: CursorDirection; + sortOrder: SortOrder; +} diff --git a/x-pack/legacy/plugins/uptime/server/lib/adapters/pings/types.ts b/x-pack/legacy/plugins/uptime/server/lib/requests/types.ts similarity index 88% rename from x-pack/legacy/plugins/uptime/server/lib/adapters/pings/types.ts rename to x-pack/legacy/plugins/uptime/server/lib/requests/types.ts index b1b1589af2ca7..7f65e80113d8f 100644 --- a/x-pack/legacy/plugins/uptime/server/lib/adapters/pings/types.ts +++ b/x-pack/legacy/plugins/uptime/server/lib/requests/types.ts @@ -4,9 +4,9 @@ * you may not use this file except in compliance with the Elastic License. */ -import { DocCount, Ping, PingResults } from '../../../../common/graphql/types'; -import { UMElasticsearchQueryFn } from '../framework'; -import { GetPingHistogramParams, HistogramResult } from '../../../../common/types'; +import { DocCount, Ping, PingResults } from '../../../common/graphql/types'; +import { UMElasticsearchQueryFn } from '../adapters'; +import { GetPingHistogramParams, HistogramResult } from '../../../common/types'; export interface GetAllParams { /** @member dateRangeStart timestamp bounds */ @@ -63,13 +63,12 @@ export interface UMPingsAdapter { export interface HistogramQueryResult { key: number; + key_as_string: string; doc_count: number; - bucket_total: { - value: number; - }; down: { - bucket_count: { - value: number; - }; + doc_count: number; + }; + up: { + doc_count: number; }; } diff --git a/x-pack/legacy/plugins/uptime/server/lib/requests/uptime_requests.ts b/x-pack/legacy/plugins/uptime/server/lib/requests/uptime_requests.ts new file mode 100644 index 0000000000000..182c944e8388a --- /dev/null +++ b/x-pack/legacy/plugins/uptime/server/lib/requests/uptime_requests.ts @@ -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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { UMElasticsearchQueryFn } from '../adapters'; +import { + DocCount, + Ping, + MonitorChart, + PingResults, + StatesIndexStatus, +} from '../../../common/graphql/types'; +import { + GetFilterBarParams, + GetLatestMonitorParams, + GetMonitorParams, + GetMonitorChartsParams, + GetMonitorDetailsParams, + GetMonitorLocationsParams, + GetMonitorStatesParams, + GetPingsParams, + GetPingHistogramParams, +} from '.'; +import { + OverviewFilters, + MonitorDetails, + MonitorLocations, + Snapshot, +} from '../../../common/runtime_types'; +import { GetMonitorStatesResult } from './get_monitor_states'; +import { GetSnapshotCountParams } from './get_snapshot_counts'; +import { HistogramResult } from '../../../common/types'; + +type ESQ = UMElasticsearchQueryFn; + +export interface UptimeRequests { + getDocCount: ESQ<{}, DocCount>; + getFilterBar: ESQ; + getIndexPattern: ESQ; + getLatestMonitor: ESQ; + getMonitor: ESQ; + getMonitorCharts: ESQ; + getMonitorDetails: ESQ; + getMonitorLocations: ESQ; + getMonitorStates: ESQ; + getPings: ESQ; + getPingHistogram: ESQ; + getSnapshotCount: ESQ; + getStatesIndexStatus: ESQ<{}, StatesIndexStatus>; +} diff --git a/x-pack/legacy/plugins/uptime/server/rest_api/index.ts b/x-pack/legacy/plugins/uptime/server/rest_api/index.ts index 91936b499d8e6..aa3b36ec7d919 100644 --- a/x-pack/legacy/plugins/uptime/server/rest_api/index.ts +++ b/x-pack/legacy/plugins/uptime/server/rest_api/index.ts @@ -5,7 +5,7 @@ */ import { createGetOverviewFilters } from './overview_filters'; -import { createGetAllRoute } from './pings'; +import { createGetPingsRoute } from './pings'; import { createGetIndexPatternRoute } from './index_pattern'; import { createLogMonitorPageRoute, createLogOverviewPageRoute } from './telemetry'; import { createGetSnapshotCount } from './snapshot'; @@ -23,7 +23,7 @@ export { createRouteWithAuth } from './create_route_with_auth'; export { uptimeRouteWrapper } from './uptime_route_wrapper'; export const restApiRoutes: UMRestApiRouteFactory[] = [ createGetOverviewFilters, - createGetAllRoute, + createGetPingsRoute, createGetIndexPatternRoute, createGetMonitorRoute, createGetMonitorDetailsRoute, diff --git a/x-pack/legacy/plugins/uptime/server/rest_api/index_pattern/get_index_pattern.ts b/x-pack/legacy/plugins/uptime/server/rest_api/index_pattern/get_index_pattern.ts index cee8eaf3f9cae..cc65749153c1d 100644 --- a/x-pack/legacy/plugins/uptime/server/rest_api/index_pattern/get_index_pattern.ts +++ b/x-pack/legacy/plugins/uptime/server/rest_api/index_pattern/get_index_pattern.ts @@ -18,7 +18,7 @@ export const createGetIndexPatternRoute: UMRestApiRouteFactory = (libs: UMServer try { return response.ok({ body: { - ...(await libs.stubIndexPattern.getUptimeIndexPattern(callES)), + ...(await libs.requests.getIndexPattern(callES)), }, }); } catch (e) { diff --git a/x-pack/legacy/plugins/uptime/server/rest_api/monitors/monitor_locations.ts b/x-pack/legacy/plugins/uptime/server/rest_api/monitors/monitor_locations.ts index b2356ae0a88bf..f8c7666f53f7d 100644 --- a/x-pack/legacy/plugins/uptime/server/rest_api/monitors/monitor_locations.ts +++ b/x-pack/legacy/plugins/uptime/server/rest_api/monitors/monitor_locations.ts @@ -26,7 +26,7 @@ export const createGetMonitorLocationsRoute: UMRestApiRouteFactory = (libs: UMSe return response.ok({ body: { - ...(await libs.monitors.getMonitorLocations({ + ...(await libs.requests.getMonitorLocations({ callES, monitorId, dateStart, diff --git a/x-pack/legacy/plugins/uptime/server/rest_api/monitors/monitors_details.ts b/x-pack/legacy/plugins/uptime/server/rest_api/monitors/monitors_details.ts index 9e1bc6f0d6a96..ca88dd965c1ad 100644 --- a/x-pack/legacy/plugins/uptime/server/rest_api/monitors/monitors_details.ts +++ b/x-pack/legacy/plugins/uptime/server/rest_api/monitors/monitors_details.ts @@ -25,7 +25,7 @@ export const createGetMonitorDetailsRoute: UMRestApiRouteFactory = (libs: UMServ const { monitorId, dateStart, dateEnd } = request.query; return response.ok({ body: { - ...(await libs.monitors.getMonitorDetails({ + ...(await libs.requests.getMonitorDetails({ callES, monitorId, dateStart, diff --git a/x-pack/legacy/plugins/uptime/server/rest_api/monitors/status.ts b/x-pack/legacy/plugins/uptime/server/rest_api/monitors/status.ts index 8b1bc04b45110..8dac50c9f5905 100644 --- a/x-pack/legacy/plugins/uptime/server/rest_api/monitors/status.ts +++ b/x-pack/legacy/plugins/uptime/server/rest_api/monitors/status.ts @@ -24,7 +24,7 @@ export const createGetMonitorRoute: UMRestApiRouteFactory = (libs: UMServerLibs) return response.ok({ body: { - ...(await libs.pings.getMonitor({ callES, monitorId })), + ...(await libs.requests.getMonitor({ callES, monitorId })), }, }); }, @@ -45,7 +45,7 @@ export const createGetStatusBarRoute: UMRestApiRouteFactory = (libs: UMServerLib }, handler: async ({ callES }, _context, request, response): Promise => { const { monitorId, dateStart, dateEnd } = request.query; - const result = await libs.pings.getLatestMonitorStatus({ + const result = await libs.requests.getLatestMonitor({ callES, monitorId, dateStart, diff --git a/x-pack/legacy/plugins/uptime/server/rest_api/overview_filters/get_overview_filters.ts b/x-pack/legacy/plugins/uptime/server/rest_api/overview_filters/get_overview_filters.ts index ef93253bb5b70..02e54cb441838 100644 --- a/x-pack/legacy/plugins/uptime/server/rest_api/overview_filters/get_overview_filters.ts +++ b/x-pack/legacy/plugins/uptime/server/rest_api/overview_filters/get_overview_filters.ts @@ -43,7 +43,7 @@ export const createGetOverviewFilters: UMRestApiRouteFactory = (libs: UMServerLi } } - const filtersResponse = await libs.monitors.getFilterBar({ + const filtersResponse = await libs.requests.getFilterBar({ callES, dateRangeStart, dateRangeEnd, diff --git a/x-pack/legacy/plugins/uptime/server/rest_api/pings/get_ping_histogram.ts b/x-pack/legacy/plugins/uptime/server/rest_api/pings/get_ping_histogram.ts index c8eb2a1e40ad4..93ba4490fa31f 100644 --- a/x-pack/legacy/plugins/uptime/server/rest_api/pings/get_ping_histogram.ts +++ b/x-pack/legacy/plugins/uptime/server/rest_api/pings/get_ping_histogram.ts @@ -26,10 +26,10 @@ export const createGetPingHistogramRoute: UMRestApiRouteFactory = (libs: UMServe handler: async ({ callES }, _context, request, response): Promise => { const { dateStart, dateEnd, statusFilter, monitorId, filters } = request.query; - const result = await libs.pings.getPingHistogram({ + const result = await libs.requests.getPingHistogram({ callES, - dateStart, - dateEnd, + from: dateStart, + to: dateEnd, monitorId, statusFilter, filters, diff --git a/x-pack/legacy/plugins/uptime/server/rest_api/pings/get_all.ts b/x-pack/legacy/plugins/uptime/server/rest_api/pings/get_pings.ts similarity index 90% rename from x-pack/legacy/plugins/uptime/server/rest_api/pings/get_all.ts rename to x-pack/legacy/plugins/uptime/server/rest_api/pings/get_pings.ts index 824035954ea28..e57951c98b6fc 100644 --- a/x-pack/legacy/plugins/uptime/server/rest_api/pings/get_all.ts +++ b/x-pack/legacy/plugins/uptime/server/rest_api/pings/get_pings.ts @@ -8,7 +8,7 @@ import { schema } from '@kbn/config-schema'; import { UMServerLibs } from '../../lib/lib'; import { UMRestApiRouteFactory } from '../types'; -export const createGetAllRoute: UMRestApiRouteFactory = (libs: UMServerLibs) => ({ +export const createGetPingsRoute: UMRestApiRouteFactory = (libs: UMServerLibs) => ({ method: 'GET', path: '/api/uptime/pings', validate: { @@ -28,7 +28,7 @@ export const createGetAllRoute: UMRestApiRouteFactory = (libs: UMServerLibs) => handler: async ({ callES }, _context, request, response): Promise => { const { dateRangeStart, dateRangeEnd, location, monitorId, size, sort, status } = request.query; - const result = await libs.pings.getAll({ + const result = await libs.requests.getPings({ callES, dateRangeStart, dateRangeEnd, diff --git a/x-pack/legacy/plugins/uptime/server/rest_api/pings/index.ts b/x-pack/legacy/plugins/uptime/server/rest_api/pings/index.ts index 43acf5410c8ed..abb7da26f994f 100644 --- a/x-pack/legacy/plugins/uptime/server/rest_api/pings/index.ts +++ b/x-pack/legacy/plugins/uptime/server/rest_api/pings/index.ts @@ -4,4 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -export { createGetAllRoute } from './get_all'; +export { createGetPingsRoute } from './get_pings'; diff --git a/x-pack/legacy/plugins/uptime/server/rest_api/snapshot/get_snapshot_count.ts b/x-pack/legacy/plugins/uptime/server/rest_api/snapshot/get_snapshot_count.ts index 986ac797d63b6..c51806e323307 100644 --- a/x-pack/legacy/plugins/uptime/server/rest_api/snapshot/get_snapshot_count.ts +++ b/x-pack/legacy/plugins/uptime/server/rest_api/snapshot/get_snapshot_count.ts @@ -24,7 +24,7 @@ export const createGetSnapshotCount: UMRestApiRouteFactory = (libs: UMServerLibs }, handler: async ({ callES }, _context, request, response): Promise => { const { dateRangeStart, dateRangeEnd, filters, statusFilter } = request.query; - const result = await libs.monitorStates.getSnapshotCount({ + const result = await libs.requests.getSnapshotCount({ callES, dateRangeStart, dateRangeEnd, diff --git a/x-pack/legacy/plugins/uptime/server/rest_api/types.ts b/x-pack/legacy/plugins/uptime/server/rest_api/types.ts index e0c8ba4a286cf..a0566c225eae7 100644 --- a/x-pack/legacy/plugins/uptime/server/rest_api/types.ts +++ b/x-pack/legacy/plugins/uptime/server/rest_api/types.ts @@ -15,7 +15,7 @@ import { KibanaRequest, KibanaResponseFactory, IKibanaResponse, -} from 'kibana/server'; +} from 'src/core/server'; import { UMServerLibs } from '../lib/lib'; /** diff --git a/x-pack/test/functional/services/uptime.ts b/x-pack/test/functional/services/uptime.ts index 1d8e0c97b99c4..938be2c71ae74 100644 --- a/x-pack/test/functional/services/uptime.ts +++ b/x-pack/test/functional/services/uptime.ts @@ -9,6 +9,7 @@ import { FtrProviderContext } from '../ftr_provider_context'; export function UptimeProvider({ getService }: FtrProviderContext) { const testSubjects = getService('testSubjects'); const browser = getService('browser'); + const retry = getService('retry'); return { async assertExists(key: string) { @@ -17,7 +18,9 @@ export function UptimeProvider({ getService }: FtrProviderContext) { } }, async monitorIdExists(key: string) { - await testSubjects.existOrFail(key); + await retry.tryForTime(10000, async () => { + await testSubjects.existOrFail(key); + }); }, async monitorPageLinkExists(monitorId: string) { await testSubjects.existOrFail(`monitor-page-link-${monitorId}`); From 8cca8b9c8c56f21d50301f231e321e9382dbf702 Mon Sep 17 00:00:00 2001 From: Daniil Suleiman <31325372+sulemanof@users.noreply.github.com> Date: Wed, 5 Feb 2020 19:20:19 +0300 Subject: [PATCH 35/86] [Vis Editor] Fix fields filtering in top hit agg (#56367) * Fix top hit agg * Add unit tests * Fix fields filtering in table vis * Resolve merge conflicts Co-authored-by: Elastic Machine --- .../data/public/search/aggs/agg_config.ts | 7 +- .../search/aggs/metrics/metric_agg_type.ts | 3 +- .../public/search/aggs/metrics/top_hit.ts | 17 ++--- .../search/aggs/param_types/field.test.ts | 65 ++++++++++++++++++- .../public/search/aggs/param_types/field.ts | 28 ++++---- .../components/agg_params_helper.test.ts | 10 +-- .../public/components/agg_params_helper.ts | 4 +- .../public/legacy_imports.ts | 1 - .../data/public/index_patterns/index.ts | 2 +- 9 files changed, 98 insertions(+), 39 deletions(-) diff --git a/src/legacy/core_plugins/data/public/search/aggs/agg_config.ts b/src/legacy/core_plugins/data/public/search/aggs/agg_config.ts index 769347a26c34c..ba7faf8c34b59 100644 --- a/src/legacy/core_plugins/data/public/search/aggs/agg_config.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/agg_config.ts @@ -58,6 +58,11 @@ const unknownSchema: Schema = { defaults: {}, editor: false, group: AggGroupNames.Metrics, + aggSettings: { + top_hits: { + allowStrings: true, + }, + }, }; const getTypeFromRegistry = (type: string): IAggType => { @@ -438,7 +443,7 @@ export class AggConfig { if (fieldParam) { // @ts-ignore - availableFields = fieldParam.getAvailableFields(this.getIndexPattern().fields); + availableFields = fieldParam.getAvailableFields(this); } // clear out the previous params except for a few special ones diff --git a/src/legacy/core_plugins/data/public/search/aggs/metrics/metric_agg_type.ts b/src/legacy/core_plugins/data/public/search/aggs/metrics/metric_agg_type.ts index e7d286c187ef8..3bae7b92618dc 100644 --- a/src/legacy/core_plugins/data/public/search/aggs/metrics/metric_agg_type.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/metrics/metric_agg_type.ts @@ -24,6 +24,7 @@ import { AggParamType } from '../param_types/agg'; import { AggConfig } from '../agg_config'; import { METRIC_TYPES } from './metric_agg_types'; import { KBN_FIELD_TYPES } from '../../../../../../../plugins/data/public'; +import { FilterFieldTypes } from '../param_types/field'; export interface IMetricAggConfig extends AggConfig { type: InstanceType; @@ -31,7 +32,7 @@ export interface IMetricAggConfig extends AggConfig { export interface MetricAggParam extends AggParamType { - filterFieldTypes?: KBN_FIELD_TYPES | KBN_FIELD_TYPES[] | '*'; + filterFieldTypes?: FilterFieldTypes; onlyAggregatable?: boolean; } diff --git a/src/legacy/core_plugins/data/public/search/aggs/metrics/top_hit.ts b/src/legacy/core_plugins/data/public/search/aggs/metrics/top_hit.ts index 81bd14ded75b0..3112d882bb87e 100644 --- a/src/legacy/core_plugins/data/public/search/aggs/metrics/top_hit.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/metrics/top_hit.ts @@ -20,7 +20,6 @@ import _ from 'lodash'; import { i18n } from '@kbn/i18n'; import { IMetricAggConfig, MetricAggType } from './metric_agg_type'; -import { aggTypeFieldFilters } from '../param_types/filter'; import { METRIC_TYPES } from './metric_agg_types'; import { KBN_FIELD_TYPES } from '../../../../../../../plugins/data/public'; @@ -33,17 +32,6 @@ const isNumericFieldSelected = (agg: IMetricAggConfig) => { return field && field.type && field.type === KBN_FIELD_TYPES.NUMBER; }; -aggTypeFieldFilters.addFilter((field, aggConfig) => { - if ( - aggConfig.type.name !== METRIC_TYPES.TOP_HITS || - _.get(aggConfig.schema, 'aggSettings.top_hits.allowStrings', false) - ) { - return true; - } - - return field.type === KBN_FIELD_TYPES.NUMBER; -}); - export const topHitMetricAgg = new MetricAggType({ name: METRIC_TYPES.TOP_HITS, title: i18n.translate('data.search.aggs.metrics.topHitTitle', { @@ -75,7 +63,10 @@ export const topHitMetricAgg = new MetricAggType({ name: 'field', type: 'field', onlyAggregatable: false, - filterFieldTypes: '*', + filterFieldTypes: (aggConfig: IMetricAggConfig) => + _.get(aggConfig.schema, 'aggSettings.top_hits.allowStrings', false) + ? '*' + : KBN_FIELD_TYPES.NUMBER, write(agg, output) { const field = agg.getParam('field'); output.params = {}; diff --git a/src/legacy/core_plugins/data/public/search/aggs/param_types/field.test.ts b/src/legacy/core_plugins/data/public/search/aggs/param_types/field.test.ts index d0fa711d89c70..fa88754ac60b9 100644 --- a/src/legacy/core_plugins/data/public/search/aggs/param_types/field.test.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/param_types/field.test.ts @@ -17,9 +17,13 @@ * under the License. */ +import { get } from 'lodash'; import { BaseParamType } from './base'; import { FieldParamType } from './field'; import { ES_FIELD_TYPES, KBN_FIELD_TYPES } from '../../../../../../../plugins/data/public'; +import { IAggConfig } from '../agg_config'; +import { IMetricAggConfig } from '../metrics/metric_agg_type'; +import { Schema } from '../schemas'; jest.mock('ui/new_platform'); @@ -45,7 +49,11 @@ describe('Field', () => { searchable: true, }, ], - } as any; + }; + + const agg = ({ + getIndexPattern: jest.fn(() => indexPattern), + } as unknown) as IAggConfig; describe('constructor', () => { it('it is an instance of BaseParamType', () => { @@ -65,7 +73,7 @@ describe('Field', () => { type: 'field', }); - const fields = aggParam.getAvailableFields(indexPattern.fields); + const fields = aggParam.getAvailableFields(agg); expect(fields.length).toBe(1); @@ -82,7 +90,58 @@ describe('Field', () => { aggParam.onlyAggregatable = false; - const fields = aggParam.getAvailableFields(indexPattern.fields); + const fields = aggParam.getAvailableFields(agg); + + expect(fields.length).toBe(2); + }); + + it('should return all fields if filterFieldTypes was not specified', () => { + const aggParam = new FieldParamType({ + name: 'field', + type: 'field', + }); + + indexPattern.fields[1].aggregatable = true; + + const fields = aggParam.getAvailableFields(agg); + + expect(fields.length).toBe(2); + }); + + it('should return only numeric fields if filterFieldTypes was specified as a function', () => { + const aggParam = new FieldParamType({ + name: 'field', + type: 'field', + filterFieldTypes: (aggConfig: IMetricAggConfig) => + get(aggConfig.schema, 'aggSettings.top_hits.allowStrings', false) + ? '*' + : KBN_FIELD_TYPES.NUMBER, + }); + const fields = aggParam.getAvailableFields(agg); + + expect(fields.length).toBe(1); + expect(fields[0].type).toBe(KBN_FIELD_TYPES.NUMBER); + }); + + it('should return all fields if filterFieldTypes was specified as a function and aggSettings allow string type fields', () => { + const aggParam = new FieldParamType({ + name: 'field', + type: 'field', + filterFieldTypes: (aggConfig: IMetricAggConfig) => + get(aggConfig.schema, 'aggSettings.top_hits.allowStrings', false) + ? '*' + : KBN_FIELD_TYPES.NUMBER, + }); + + agg.schema = { + aggSettings: { + top_hits: { + allowStrings: true, + }, + }, + } as Schema; + + const fields = aggParam.getAvailableFields(agg); expect(fields.length).toBe(2); }); diff --git a/src/legacy/core_plugins/data/public/search/aggs/param_types/field.ts b/src/legacy/core_plugins/data/public/search/aggs/param_types/field.ts index c41c159ad0f78..9a204bb151e2d 100644 --- a/src/legacy/core_plugins/data/public/search/aggs/param_types/field.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/param_types/field.ts @@ -17,24 +17,27 @@ * under the License. */ -// @ts-ignore import { i18n } from '@kbn/i18n'; +import { isFunction } from 'lodash'; import { npStart } from 'ui/new_platform'; -import { AggConfig } from '../agg_config'; +import { IAggConfig } from '../agg_config'; import { SavedObjectNotFound } from '../../../../../../../plugins/kibana_utils/public'; import { BaseParamType } from './base'; import { propFilter } from '../filter'; -import { Field, IFieldList, isNestedField } from '../../../../../../../plugins/data/public'; +import { IMetricAggConfig } from '../metrics/metric_agg_type'; +import { Field, isNestedField, KBN_FIELD_TYPES } from '../../../../../../../plugins/data/public'; const filterByType = propFilter('type'); +type FieldTypes = KBN_FIELD_TYPES | KBN_FIELD_TYPES[] | '*'; +export type FilterFieldTypes = ((aggConfig: IMetricAggConfig) => FieldTypes) | FieldTypes; // TODO need to make a more explicit interface for this export type IFieldParamType = FieldParamType; export class FieldParamType extends BaseParamType { required = true; scriptable = true; - filterFieldTypes: string; + filterFieldTypes: FilterFieldTypes; onlyAggregatable: boolean; constructor(config: Record) { @@ -44,7 +47,7 @@ export class FieldParamType extends BaseParamType { this.onlyAggregatable = config.onlyAggregatable !== false; if (!config.write) { - this.write = (aggConfig: AggConfig, output: Record) => { + this.write = (aggConfig: IAggConfig, output: Record) => { const field = aggConfig.getField(); if (!field) { @@ -73,7 +76,7 @@ export class FieldParamType extends BaseParamType { return field.name; }; - this.deserialize = (fieldName: string, aggConfig?: AggConfig) => { + this.deserialize = (fieldName: string, aggConfig?: IAggConfig) => { if (!aggConfig) { throw new Error('aggConfig was not provided to FieldParamType deserialize function'); } @@ -84,9 +87,7 @@ export class FieldParamType extends BaseParamType { } // @ts-ignore - const validField = this.getAvailableFields(aggConfig.getIndexPattern().fields).find( - (f: any) => f.name === fieldName - ); + const validField = this.getAvailableFields(aggConfig).find((f: any) => f.name === fieldName); if (!validField) { npStart.core.notifications.toasts.addDanger( i18n.translate( @@ -109,7 +110,8 @@ export class FieldParamType extends BaseParamType { /** * filter the fields to the available ones */ - getAvailableFields = (fields: IFieldList) => { + getAvailableFields = (aggConfig: IAggConfig) => { + const fields = aggConfig.getIndexPattern().fields; const filteredFields = fields.filter((field: Field) => { const { onlyAggregatable, scriptable, filterFieldTypes } = this; @@ -120,8 +122,10 @@ export class FieldParamType extends BaseParamType { return false; } - if (!filterFieldTypes) { - return true; + if (isFunction(filterFieldTypes)) { + const filter = filterFieldTypes(aggConfig as IMetricAggConfig); + + return filterByType([field], filter).length !== 0; } return filterByType([field], filterFieldTypes).length !== 0; diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/agg_params_helper.test.ts b/src/legacy/core_plugins/vis_default_editor/public/components/agg_params_helper.test.ts index b9fb81fccd32c..f3bee80baa1ba 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/agg_params_helper.test.ts +++ b/src/legacy/core_plugins/vis_default_editor/public/components/agg_params_helper.test.ts @@ -17,9 +17,9 @@ * under the License. */ -import { IndexPattern, Field } from 'src/plugins/data/public'; +import { IndexPattern } from 'src/plugins/data/public'; import { VisState } from 'src/legacy/core_plugins/visualizations/public'; -import { IAggConfig, IAggType, AggGroupNames, BUCKET_TYPES, IndexedArray } from '../legacy_imports'; +import { IAggConfig, IAggType, AggGroupNames, BUCKET_TYPES } from '../legacy_imports'; import { getAggParamsToRender, getAggTypeOptions, @@ -105,8 +105,10 @@ describe('DefaultEditorAggParams helpers', () => { name: 'field', type: 'field', filterFieldTypes, - getAvailableFields: jest.fn((fields: IndexedArray) => - fields.filter(({ type }) => filterFieldTypes.includes(type)) + getAvailableFields: jest.fn((aggConfig: IAggConfig) => + aggConfig + .getIndexPattern() + .fields.filter(({ type }) => filterFieldTypes.includes(type)) ), }, { diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/agg_params_helper.ts b/src/legacy/core_plugins/vis_default_editor/public/components/agg_params_helper.ts index 25aa21fc83b31..124c41a50c0df 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/agg_params_helper.ts +++ b/src/legacy/core_plugins/vis_default_editor/public/components/agg_params_helper.ts @@ -73,9 +73,7 @@ function getAggParamsToRender({ agg, editorConfig, metricAggs, state }: ParamIns } // if field param exists, compute allowed fields if (param.type === 'field') { - const availableFields: Field[] = (param as IFieldParamType).getAvailableFields( - agg.getIndexPattern().fields - ); + const availableFields: Field[] = (param as IFieldParamType).getAvailableFields(agg); fields = aggTypeFieldFilters.filter(availableFields, agg); indexedFields = groupAndSortBy(fields, 'type', 'name'); diff --git a/src/legacy/core_plugins/vis_default_editor/public/legacy_imports.ts b/src/legacy/core_plugins/vis_default_editor/public/legacy_imports.ts index a700995ec596b..b7fd6b1e9ebb6 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/legacy_imports.ts +++ b/src/legacy/core_plugins/vis_default_editor/public/legacy_imports.ts @@ -49,7 +49,6 @@ export { AggParamOption } from 'ui/agg_types'; export { CidrMask } from 'ui/agg_types'; export { PersistedState } from 'ui/persisted_state'; -export { IndexedArray } from 'ui/indexed_array'; export { getDocLink } from 'ui/documentation_links'; export { documentationLinks } from 'ui/documentation_links/documentation_links'; export { move } from 'ui/utils/collection'; diff --git a/src/plugins/data/public/index_patterns/index.ts b/src/plugins/data/public/index_patterns/index.ts index 3d902ebbb7c23..ecddd893d1a54 100644 --- a/src/plugins/data/public/index_patterns/index.ts +++ b/src/plugins/data/public/index_patterns/index.ts @@ -44,7 +44,7 @@ export const indexPatterns = { isDefault, }; -export { Field, FieldList, IFieldList } from './fields'; +export { Field, FieldList } from './fields'; // TODO: figure out how to replace IndexPatterns in get_inner_angular. export { From 6a4fd9b7729bcee641d49229d2663a35001233a3 Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Wed, 5 Feb 2020 17:27:33 +0100 Subject: [PATCH 36/86] Disable url tracking for dashboard (#55818) --- src/legacy/core_plugins/kibana/index.js | 7 +- .../core_plugins/kibana/public/.eslintrc.js | 70 ++++--- .../kibana/public/dashboard/legacy.ts | 1 + .../public/dashboard/np_ready/application.ts | 1 - .../test_utils/get_saved_dashboard_mock.ts | 2 +- .../kibana/public/dashboard/plugin.ts | 65 +++++- .../components/tutorial/instruction_set.js | 2 +- .../local_application_service.ts | 11 + src/legacy/ui/public/chrome/api/nav.ts | 2 +- src/plugins/data/public/mocks.ts | 2 + .../data/public/query/state_sync/index.ts | 2 +- .../query/state_sync/sync_query.test.ts | 67 +++++- .../public/query/state_sync/sync_query.ts | 143 +++++++------ src/plugins/data/public/search/mocks.ts | 2 + .../instruction_variant.ts | 0 src/plugins/home/public/index.ts | 1 + src/plugins/home/server/index.ts | 2 +- .../instructions/auditbeat_instructions.ts | 2 +- .../instructions/filebeat_instructions.ts | 2 +- .../instructions/functionbeat_instructions.ts | 2 +- .../instructions/heartbeat_instructions.ts | 2 +- .../instructions/metricbeat_instructions.ts | 2 +- .../instructions/winlogbeat_instructions.ts | 2 +- .../server/tutorials/netflow/elastic_cloud.ts | 2 +- .../home/server/tutorials/netflow/on_prem.ts | 2 +- .../netflow/on_prem_elastic_cloud.ts | 2 +- src/plugins/kibana_legacy/public/plugin.ts | 26 ++- src/plugins/kibana_utils/public/index.ts | 1 + .../public/state_management/url/index.ts | 1 + .../url/kbn_url_tracker.test.ts | 184 +++++++++++++++++ .../state_management/url/kbn_url_tracker.ts | 192 ++++++++++++++++++ 31 files changed, 681 insertions(+), 121 deletions(-) rename src/plugins/home/{server/tutorials/instructions => common}/instruction_variant.ts (100%) create mode 100644 src/plugins/kibana_utils/public/state_management/url/kbn_url_tracker.test.ts create mode 100644 src/plugins/kibana_utils/public/state_management/url/kbn_url_tracker.ts diff --git a/src/legacy/core_plugins/kibana/index.js b/src/legacy/core_plugins/kibana/index.js index 8c35044b52c9e..395e0da218307 100644 --- a/src/legacy/core_plugins/kibana/index.js +++ b/src/legacy/core_plugins/kibana/index.js @@ -97,13 +97,8 @@ export default function(kibana) { }), order: -1001, url: `${kbnBaseUrl}#/dashboards`, - // The subUrlBase is the common substring of all urls for this app. If not given, it defaults to the url - // above. This app has to use a different subUrlBase, in addition to the url above, because "#/dashboard" - // routes to a page that creates a new dashboard. When we introduced a landing page, we needed to change - // the url above in order to preserve the original url for BWC. The subUrlBase helps the Chrome api nav - // to determine what url to use for the app link. - subUrlBase: `${kbnBaseUrl}#/dashboard`, euiIconType: 'dashboardApp', + disableSubUrlTracking: true, category: DEFAULT_APP_CATEGORIES.analyze, }, { diff --git a/src/legacy/core_plugins/kibana/public/.eslintrc.js b/src/legacy/core_plugins/kibana/public/.eslintrc.js index 9b45217287dc8..b3ee0a8fa7b04 100644 --- a/src/legacy/core_plugins/kibana/public/.eslintrc.js +++ b/src/legacy/core_plugins/kibana/public/.eslintrc.js @@ -17,8 +17,15 @@ * under the License. */ +const topLevelConfig = require('../../../../../.eslintrc.js'); const path = require('path'); +const topLevelRestricedZones = topLevelConfig.overrides.find( + override => + override.files[0] === '**/*.{js,ts,tsx}' && + Object.keys(override.rules)[0] === '@kbn/eslint/no-restricted-paths' +).rules['@kbn/eslint/no-restricted-paths'][1].zones; + /** * Builds custom restricted paths configuration for the shimmed plugins within the kibana plugin. * These custom rules extend the default checks in the top level `eslintrc.js` by also checking two other things: @@ -28,34 +35,37 @@ const path = require('path'); * @returns zones configuration for the no-restricted-paths linter */ function buildRestrictedPaths(shimmedPlugins) { - return shimmedPlugins.map(shimmedPlugin => ([{ - target: [ - `src/legacy/core_plugins/kibana/public/${shimmedPlugin}/np_ready/**/*`, - ], - from: [ - 'ui/**/*', - 'src/legacy/ui/**/*', - 'src/legacy/core_plugins/kibana/public/**/*', - 'src/legacy/core_plugins/data/public/**/*', - '!src/legacy/core_plugins/data/public/index.ts', - `!src/legacy/core_plugins/kibana/public/${shimmedPlugin}/**/*`, - ], - allowSameFolder: false, - errorMessage: `${shimmedPlugin} is a shimmed plugin that is not allowed to import modules from the legacy platform. If you need legacy modules for the transition period, import them either in the legacy_imports, kibana_services or index module.`, - }, { - target: [ - 'src/**/*', - `!src/legacy/core_plugins/kibana/public/${shimmedPlugin}/**/*`, - 'x-pack/**/*', - ], - from: [ - `src/legacy/core_plugins/kibana/public/${shimmedPlugin}/**/*`, - `!src/legacy/core_plugins/kibana/public/${shimmedPlugin}/index.ts`, - `!src/legacy/core_plugins/kibana/public/${shimmedPlugin}/legacy.ts`, - ], - allowSameFolder: false, - errorMessage: `kibana/public/${shimmedPlugin} is behaving like a NP plugin and does not allow deep imports. If you need something from within ${shimmedPlugin} in another plugin, consider re-exporting it from the top level index module`, - }])).reduce((acc, part) => [...acc, ...part], []); + return shimmedPlugins + .map(shimmedPlugin => [ + { + target: [`src/legacy/core_plugins/kibana/public/${shimmedPlugin}/np_ready/**/*`], + from: [ + 'ui/**/*', + 'src/legacy/ui/**/*', + 'src/legacy/core_plugins/kibana/public/**/*', + 'src/legacy/core_plugins/data/public/**/*', + '!src/legacy/core_plugins/data/public/index.ts', + `!src/legacy/core_plugins/kibana/public/${shimmedPlugin}/**/*`, + ], + allowSameFolder: false, + errorMessage: `${shimmedPlugin} is a shimmed plugin that is not allowed to import modules from the legacy platform. If you need legacy modules for the transition period, import them either in the legacy_imports, kibana_services or index module.`, + }, + { + target: [ + 'src/**/*', + `!src/legacy/core_plugins/kibana/public/${shimmedPlugin}/**/*`, + 'x-pack/**/*', + ], + from: [ + `src/legacy/core_plugins/kibana/public/${shimmedPlugin}/**/*`, + `!src/legacy/core_plugins/kibana/public/${shimmedPlugin}/index.ts`, + `!src/legacy/core_plugins/kibana/public/${shimmedPlugin}/legacy.ts`, + ], + allowSameFolder: false, + errorMessage: `kibana/public/${shimmedPlugin} is behaving like a NP plugin and does not allow deep imports. If you need something from within ${shimmedPlugin} in another plugin, consider re-exporting it from the top level index module`, + }, + ]) + .reduce((acc, part) => [...acc, ...part], []); } module.exports = { @@ -66,7 +76,9 @@ module.exports = { 'error', { basePath: path.resolve(__dirname, '../../../../../'), - zones: buildRestrictedPaths(['visualize', 'discover', 'dashboard', 'devTools', 'home']), + zones: topLevelRestricedZones.concat( + buildRestrictedPaths(['visualize', 'discover', 'dashboard', 'devTools', 'home']) + ), }, ], }, diff --git a/src/legacy/core_plugins/kibana/public/dashboard/legacy.ts b/src/legacy/core_plugins/kibana/public/dashboard/legacy.ts index acbc4c4b6c47f..ca2dc9d5fb4f5 100644 --- a/src/legacy/core_plugins/kibana/public/dashboard/legacy.ts +++ b/src/legacy/core_plugins/kibana/public/dashboard/legacy.ts @@ -41,6 +41,7 @@ async function getAngularDependencies(): Promise(() => ({})); + private stopUrlTracking: (() => void) | undefined = undefined; + public setup( core: CoreSetup, - { __LEGACY: { getAngularDependencies }, home, kibana_legacy }: DashboardPluginSetupDependencies + { + __LEGACY: { getAngularDependencies }, + home, + kibana_legacy, + npData, + }: DashboardPluginSetupDependencies ) { + const { querySyncStateContainer, stop: stopQuerySyncStateContainer } = getQueryStateContainer( + npData.query + ); + const { appMounted, appUnMounted, stop: stopUrlTracker } = createKbnUrlTracker({ + baseUrl: core.http.basePath.prepend('/app/kibana'), + defaultSubUrl: '#/dashboards', + storageKey: 'lastUrl:dashboard', + navLinkUpdater$: this.appStateUpdater, + toastNotifications: core.notifications.toasts, + stateParams: [ + { + kbnUrlKey: '_g', + stateUpdate$: querySyncStateContainer.state$, + }, + ], + }); + this.stopUrlTracking = () => { + stopQuerySyncStateContainer(); + stopUrlTracker(); + }; const app: App = { id: '', title: 'Dashboards', @@ -81,6 +119,7 @@ export class DashboardPlugin implements Plugin { if (this.startDependencies === null) { throw new Error('not started yet'); } + appMounted(); const { savedObjectsClient, embeddables, @@ -114,10 +153,20 @@ export class DashboardPlugin implements Plugin { localStorage: new Storage(localStorage), }; const { renderApp } = await import('./np_ready/application'); - return renderApp(params.element, params.appBasePath, deps); + const unmount = renderApp(params.element, params.appBasePath, deps); + return () => { + unmount(); + appUnMounted(); + }; }, }; - kibana_legacy.registerLegacyApp({ ...app, id: 'dashboard' }); + kibana_legacy.registerLegacyApp({ + ...app, + id: 'dashboard', + // only register the updater in once app, otherwise all updates would happen twice + updater$: this.appStateUpdater.asObservable(), + navLinkId: 'kibana:dashboard', + }); kibana_legacy.registerLegacyApp({ ...app, id: 'dashboards' }); home.featureCatalogue.register({ @@ -147,4 +196,10 @@ export class DashboardPlugin implements Plugin { share, }; } + + stop() { + if (this.stopUrlTracking) { + this.stopUrlTracking(); + } + } } diff --git a/src/legacy/core_plugins/kibana/public/home/np_ready/components/tutorial/instruction_set.js b/src/legacy/core_plugins/kibana/public/home/np_ready/components/tutorial/instruction_set.js index 15bda33534185..631ef1d6e0e42 100644 --- a/src/legacy/core_plugins/kibana/public/home/np_ready/components/tutorial/instruction_set.js +++ b/src/legacy/core_plugins/kibana/public/home/np_ready/components/tutorial/instruction_set.js @@ -22,7 +22,7 @@ import PropTypes from 'prop-types'; import { Instruction } from './instruction'; import { ParameterForm } from './parameter_form'; import { Content } from './content'; -import { getDisplayText } from '../../../../../../../../plugins/home/server/tutorials/instructions/instruction_variant'; +import { getDisplayText } from '../../../../../../../../plugins/home/public'; import { EuiTabs, EuiTab, diff --git a/src/legacy/core_plugins/kibana/public/local_application_service/local_application_service.ts b/src/legacy/core_plugins/kibana/public/local_application_service/local_application_service.ts index d52bec8304ff9..c84a3e1eacbd2 100644 --- a/src/legacy/core_plugins/kibana/public/local_application_service/local_application_service.ts +++ b/src/legacy/core_plugins/kibana/public/local_application_service/local_application_service.ts @@ -79,6 +79,17 @@ export class LocalApplicationService { })(); }, }); + + if (app.updater$) { + app.updater$.subscribe(updater => { + const updatedFields = updater(app); + if (updatedFields && updatedFields.activeUrl) { + npStart.core.chrome.navLinks.update(app.navLinkId || app.id, { + url: updatedFields.activeUrl, + }); + } + }); + } }); npStart.plugins.kibana_legacy.getForwards().forEach(({ legacyAppId, newAppId, keepPrefix }) => { diff --git a/src/legacy/ui/public/chrome/api/nav.ts b/src/legacy/ui/public/chrome/api/nav.ts index 771314d9e1481..ae32473e451b7 100644 --- a/src/legacy/ui/public/chrome/api/nav.ts +++ b/src/legacy/ui/public/chrome/api/nav.ts @@ -146,7 +146,7 @@ export function initChromeNavApi(chrome: any, internals: NavInternals) { // link.active and link.lastUrl properties coreNavLinks .getAll() - .filter(link => link.subUrlBase) + .filter(link => link.subUrlBase && !link.disableSubUrlTracking) .forEach(link => { coreNavLinks.update(link.id, { subUrlBase: relativeToAbsolute(chrome.addBasePath(link.subUrlBase)), diff --git a/src/plugins/data/public/mocks.ts b/src/plugins/data/public/mocks.ts index 847d79fdc87d1..726cd6cfb18f0 100644 --- a/src/plugins/data/public/mocks.ts +++ b/src/plugins/data/public/mocks.ts @@ -101,6 +101,8 @@ const createStartContract = (): Start => { return startContract; }; +export { searchSourceMock } from './search/mocks'; + export const dataPluginMock = { createSetupContract, createStartContract, diff --git a/src/plugins/data/public/query/state_sync/index.ts b/src/plugins/data/public/query/state_sync/index.ts index 7eefda0d0aec1..27e02940765cf 100644 --- a/src/plugins/data/public/query/state_sync/index.ts +++ b/src/plugins/data/public/query/state_sync/index.ts @@ -17,5 +17,5 @@ * under the License. */ -export { syncQuery } from './sync_query'; +export { syncQuery, getQueryStateContainer } from './sync_query'; export { syncAppFilters } from './sync_app_filters'; diff --git a/src/plugins/data/public/query/state_sync/sync_query.test.ts b/src/plugins/data/public/query/state_sync/sync_query.test.ts index 0973af13cacd5..4796da4f5fd4b 100644 --- a/src/plugins/data/public/query/state_sync/sync_query.test.ts +++ b/src/plugins/data/public/query/state_sync/sync_query.test.ts @@ -31,7 +31,7 @@ import { import { QueryService, QueryStart } from '../query_service'; import { StubBrowserStorage } from 'test_utils/stub_browser_storage'; import { TimefilterContract } from '../timefilter'; -import { QuerySyncState, syncQuery } from './sync_query'; +import { getQueryStateContainer, QuerySyncState, syncQuery } from './sync_query'; const setupMock = coreMock.createSetup(); const startMock = coreMock.createStart(); @@ -163,4 +163,69 @@ describe('sync_query', () => { expect(spy).not.toBeCalled(); stop(); }); + + describe('getQueryStateContainer', () => { + test('state is initialized with state from query service', () => { + const { stop, querySyncStateContainer, initialState } = getQueryStateContainer( + queryServiceStart + ); + expect(querySyncStateContainer.getState()).toMatchInlineSnapshot(` + Object { + "filters": Array [], + "refreshInterval": Object { + "pause": true, + "value": 0, + }, + "time": Object { + "from": "now-15m", + "to": "now", + }, + } + `); + expect(initialState).toEqual(querySyncStateContainer.getState()); + stop(); + }); + + test('state takes initial overrides into account', () => { + const { stop, querySyncStateContainer, initialState } = getQueryStateContainer( + queryServiceStart, + { + time: { from: 'now-99d', to: 'now' }, + } + ); + expect(querySyncStateContainer.getState().time).toEqual({ + from: 'now-99d', + to: 'now', + }); + expect(initialState).toEqual(querySyncStateContainer.getState()); + stop(); + }); + + test('when filters change, state container contains updated global filters', () => { + const { stop, querySyncStateContainer } = getQueryStateContainer(queryServiceStart); + filterManager.setFilters([gF, aF]); + expect(querySyncStateContainer.getState().filters).toHaveLength(1); + stop(); + }); + + test('when time range changes, state container contains updated time range', () => { + const { stop, querySyncStateContainer } = getQueryStateContainer(queryServiceStart); + timefilter.setTime({ from: 'now-30m', to: 'now' }); + expect(querySyncStateContainer.getState().time).toEqual({ + from: 'now-30m', + to: 'now', + }); + stop(); + }); + + test('when refresh interval changes, state container contains updated refresh interval', () => { + const { stop, querySyncStateContainer } = getQueryStateContainer(queryServiceStart); + timefilter.setRefreshInterval({ pause: true, value: 100 }); + expect(querySyncStateContainer.getState().refreshInterval).toEqual({ + pause: true, + value: 100, + }); + stop(); + }); + }); }); diff --git a/src/plugins/data/public/query/state_sync/sync_query.ts b/src/plugins/data/public/query/state_sync/sync_query.ts index be641e89f9b76..9a4e9cbba2990 100644 --- a/src/plugins/data/public/query/state_sync/sync_query.ts +++ b/src/plugins/data/public/query/state_sync/sync_query.ts @@ -27,7 +27,7 @@ import { } from '../../../../kibana_utils/public'; import { COMPARE_ALL_OPTIONS, compareFilters } from '../filter_manager/lib/compare_filters'; import { esFilters, RefreshInterval, TimeRange } from '../../../common'; -import { QueryStart } from '../query_service'; +import { QuerySetup, QueryStart } from '../query_service'; const GLOBAL_STATE_STORAGE_KEY = '_g'; @@ -40,16 +40,11 @@ export interface QuerySyncState { /** * Helper utility to set up syncing between query services and url's '_g' query param */ -export const syncQuery = ( - { timefilter: { timefilter }, filterManager }: QueryStart, - urlStateStorage: IKbnUrlStateStorage -) => { - const defaultState: QuerySyncState = { - time: timefilter.getTime(), - refreshInterval: timefilter.getRefreshInterval(), - filters: filterManager.getGlobalFilters(), - }; - +export const syncQuery = (queryStart: QueryStart, urlStateStorage: IKbnUrlStateStorage) => { + const { + timefilter: { timefilter }, + filterManager, + } = queryStart; // retrieve current state from `_g` url const initialStateFromUrl = urlStateStorage.get(GLOBAL_STATE_STORAGE_KEY); @@ -58,10 +53,82 @@ export const syncQuery = ( initialStateFromUrl && Object.keys(initialStateFromUrl).length ); - // prepare initial state, whatever was in URL takes precedences over current state in services + const { + querySyncStateContainer, + stop: stopPullQueryState, + initialState, + } = getQueryStateContainer(queryStart, initialStateFromUrl || {}); + + const pushQueryStateSubscription = querySyncStateContainer.state$.subscribe( + ({ time, filters: globalFilters, refreshInterval }) => { + // cloneDeep is required because services are mutating passed objects + // and state in state container is frozen + if (time && !_.isEqual(time, timefilter.getTime())) { + timefilter.setTime(_.cloneDeep(time)); + } + + if (refreshInterval && !_.isEqual(refreshInterval, timefilter.getRefreshInterval())) { + timefilter.setRefreshInterval(_.cloneDeep(refreshInterval)); + } + + if ( + globalFilters && + !compareFilters(globalFilters, filterManager.getGlobalFilters(), COMPARE_ALL_OPTIONS) + ) { + filterManager.setGlobalFilters(_.cloneDeep(globalFilters)); + } + } + ); + + // if there weren't any initial state in url, + // then put _g key into url + if (!initialStateFromUrl) { + urlStateStorage.set(GLOBAL_STATE_STORAGE_KEY, initialState, { + replace: true, + }); + } + + // trigger initial syncing from state container to services if needed + querySyncStateContainer.set(initialState); + + const { start, stop: stopSyncState } = syncState({ + stateStorage: urlStateStorage, + stateContainer: { + ...querySyncStateContainer, + set: state => { + if (state) { + // syncState utils requires to handle incoming "null" value + querySyncStateContainer.set(state); + } + }, + }, + storageKey: GLOBAL_STATE_STORAGE_KEY, + }); + + start(); + return { + stop: () => { + stopSyncState(); + pushQueryStateSubscription.unsubscribe(); + stopPullQueryState(); + }, + hasInheritedQueryFromUrl, + }; +}; + +export const getQueryStateContainer = ( + { timefilter: { timefilter }, filterManager }: QuerySetup, + initialStateOverrides: Partial = {} +) => { + const defaultState: QuerySyncState = { + time: timefilter.getTime(), + refreshInterval: timefilter.getRefreshInterval(), + filters: filterManager.getGlobalFilters(), + }; + const initialState: QuerySyncState = { ...defaultState, - ...initialStateFromUrl, + ...initialStateOverrides, }; // create state container, which will be used for syncing with syncState() util @@ -109,59 +176,13 @@ export const syncQuery = ( .subscribe(newGlobalFilters => { querySyncStateContainer.transitions.setFilters(newGlobalFilters); }), - querySyncStateContainer.state$.subscribe( - ({ time, filters: globalFilters, refreshInterval }) => { - // cloneDeep is required because services are mutating passed objects - // and state in state container is frozen - if (time && !_.isEqual(time, timefilter.getTime())) { - timefilter.setTime(_.cloneDeep(time)); - } - - if (refreshInterval && !_.isEqual(refreshInterval, timefilter.getRefreshInterval())) { - timefilter.setRefreshInterval(_.cloneDeep(refreshInterval)); - } - - if ( - globalFilters && - !compareFilters(globalFilters, filterManager.getGlobalFilters(), COMPARE_ALL_OPTIONS) - ) { - filterManager.setGlobalFilters(_.cloneDeep(globalFilters)); - } - } - ), ]; - // if there weren't any initial state in url, - // then put _g key into url - if (!initialStateFromUrl) { - urlStateStorage.set(GLOBAL_STATE_STORAGE_KEY, initialState, { - replace: true, - }); - } - - // trigger initial syncing from state container to services if needed - querySyncStateContainer.set(initialState); - - const { start, stop } = syncState({ - stateStorage: urlStateStorage, - stateContainer: { - ...querySyncStateContainer, - set: state => { - if (state) { - // syncState utils requires to handle incoming "null" value - querySyncStateContainer.set(state); - } - }, - }, - storageKey: GLOBAL_STATE_STORAGE_KEY, - }); - - start(); return { + querySyncStateContainer, stop: () => { subs.forEach(s => s.unsubscribe()); - stop(); }, - hasInheritedQueryFromUrl, + initialState, }; }; diff --git a/src/plugins/data/public/search/mocks.ts b/src/plugins/data/public/search/mocks.ts index 81a028007bc94..821bd45f731e8 100644 --- a/src/plugins/data/public/search/mocks.ts +++ b/src/plugins/data/public/search/mocks.ts @@ -17,6 +17,8 @@ * under the License. */ +export * from './search_source/mocks'; + export const searchSetupMock = { registerSearchStrategyContext: jest.fn(), registerSearchStrategyProvider: jest.fn(), diff --git a/src/plugins/home/server/tutorials/instructions/instruction_variant.ts b/src/plugins/home/common/instruction_variant.ts similarity index 100% rename from src/plugins/home/server/tutorials/instructions/instruction_variant.ts rename to src/plugins/home/common/instruction_variant.ts diff --git a/src/plugins/home/public/index.ts b/src/plugins/home/public/index.ts index 114d442b40943..2a445cf242729 100644 --- a/src/plugins/home/public/index.ts +++ b/src/plugins/home/public/index.ts @@ -26,6 +26,7 @@ export { HomePublicPluginStart, } from './plugin'; export { FeatureCatalogueEntry, FeatureCatalogueCategory, Environment } from './services'; +export * from '../common/instruction_variant'; import { HomePublicPlugin } from './plugin'; export const plugin = (initializerContext: PluginInitializerContext) => diff --git a/src/plugins/home/server/index.ts b/src/plugins/home/server/index.ts index 02f4c91a414cc..75ace84344216 100644 --- a/src/plugins/home/server/index.ts +++ b/src/plugins/home/server/index.ts @@ -36,5 +36,5 @@ export const config: PluginConfigDescriptor = { export const plugin = (initContext: PluginInitializerContext) => new HomeServerPlugin(initContext); -export { INSTRUCTION_VARIANT } from './tutorials/instructions/instruction_variant'; +export { INSTRUCTION_VARIANT } from '../common/instruction_variant'; export { ArtifactsSchema, TutorialsCategory } from './services/tutorials'; diff --git a/src/plugins/home/server/tutorials/instructions/auditbeat_instructions.ts b/src/plugins/home/server/tutorials/instructions/auditbeat_instructions.ts index 6a9dba69b193f..4c85ad3985b3d 100644 --- a/src/plugins/home/server/tutorials/instructions/auditbeat_instructions.ts +++ b/src/plugins/home/server/tutorials/instructions/auditbeat_instructions.ts @@ -18,7 +18,7 @@ */ import { i18n } from '@kbn/i18n'; -import { INSTRUCTION_VARIANT } from './instruction_variant'; +import { INSTRUCTION_VARIANT } from '../../../common/instruction_variant'; import { createTrycloudOption1, createTrycloudOption2 } from './onprem_cloud_instructions'; import { getSpaceIdForBeatsTutorial } from './get_space_id_for_beats_tutorial'; import { Platform, TutorialContext } from '../../services/tutorials/lib/tutorials_registry_types'; diff --git a/src/plugins/home/server/tutorials/instructions/filebeat_instructions.ts b/src/plugins/home/server/tutorials/instructions/filebeat_instructions.ts index 176a3901821f1..66efa36ec9bcd 100644 --- a/src/plugins/home/server/tutorials/instructions/filebeat_instructions.ts +++ b/src/plugins/home/server/tutorials/instructions/filebeat_instructions.ts @@ -18,7 +18,7 @@ */ import { i18n } from '@kbn/i18n'; -import { INSTRUCTION_VARIANT } from './instruction_variant'; +import { INSTRUCTION_VARIANT } from '../../../common/instruction_variant'; import { createTrycloudOption1, createTrycloudOption2 } from './onprem_cloud_instructions'; import { getSpaceIdForBeatsTutorial } from './get_space_id_for_beats_tutorial'; import { Platform, TutorialContext } from '../../services/tutorials/lib/tutorials_registry_types'; diff --git a/src/plugins/home/server/tutorials/instructions/functionbeat_instructions.ts b/src/plugins/home/server/tutorials/instructions/functionbeat_instructions.ts index 385880ba9780f..ee13b9c5eefd8 100644 --- a/src/plugins/home/server/tutorials/instructions/functionbeat_instructions.ts +++ b/src/plugins/home/server/tutorials/instructions/functionbeat_instructions.ts @@ -18,7 +18,7 @@ */ import { i18n } from '@kbn/i18n'; -import { INSTRUCTION_VARIANT } from './instruction_variant'; +import { INSTRUCTION_VARIANT } from '../../../common/instruction_variant'; import { createTrycloudOption1, createTrycloudOption2 } from './onprem_cloud_instructions'; import { getSpaceIdForBeatsTutorial } from './get_space_id_for_beats_tutorial'; import { Platform, TutorialContext } from '../../services/tutorials/lib/tutorials_registry_types'; diff --git a/src/plugins/home/server/tutorials/instructions/heartbeat_instructions.ts b/src/plugins/home/server/tutorials/instructions/heartbeat_instructions.ts index 406bf55da4321..33f5defc0273f 100644 --- a/src/plugins/home/server/tutorials/instructions/heartbeat_instructions.ts +++ b/src/plugins/home/server/tutorials/instructions/heartbeat_instructions.ts @@ -18,7 +18,7 @@ */ import { i18n } from '@kbn/i18n'; -import { INSTRUCTION_VARIANT } from './instruction_variant'; +import { INSTRUCTION_VARIANT } from '../../../common/instruction_variant'; import { createTrycloudOption1, createTrycloudOption2 } from './onprem_cloud_instructions'; import { getSpaceIdForBeatsTutorial } from './get_space_id_for_beats_tutorial'; import { Platform, TutorialContext } from '../../services/tutorials/lib/tutorials_registry_types'; diff --git a/src/plugins/home/server/tutorials/instructions/metricbeat_instructions.ts b/src/plugins/home/server/tutorials/instructions/metricbeat_instructions.ts index 77efe0958a615..9fdc70e0703a4 100644 --- a/src/plugins/home/server/tutorials/instructions/metricbeat_instructions.ts +++ b/src/plugins/home/server/tutorials/instructions/metricbeat_instructions.ts @@ -18,7 +18,7 @@ */ import { i18n } from '@kbn/i18n'; -import { INSTRUCTION_VARIANT } from './instruction_variant'; +import { INSTRUCTION_VARIANT } from '../../../common/instruction_variant'; import { createTrycloudOption1, createTrycloudOption2 } from './onprem_cloud_instructions'; import { getSpaceIdForBeatsTutorial } from './get_space_id_for_beats_tutorial'; import { TutorialContext } from '../../services/tutorials/lib/tutorials_registry_types'; diff --git a/src/plugins/home/server/tutorials/instructions/winlogbeat_instructions.ts b/src/plugins/home/server/tutorials/instructions/winlogbeat_instructions.ts index cc18f2ce9705d..9d7d0660d3d6c 100644 --- a/src/plugins/home/server/tutorials/instructions/winlogbeat_instructions.ts +++ b/src/plugins/home/server/tutorials/instructions/winlogbeat_instructions.ts @@ -18,7 +18,7 @@ */ import { i18n } from '@kbn/i18n'; -import { INSTRUCTION_VARIANT } from './instruction_variant'; +import { INSTRUCTION_VARIANT } from '../../../common/instruction_variant'; import { createTrycloudOption1, createTrycloudOption2 } from './onprem_cloud_instructions'; import { getSpaceIdForBeatsTutorial } from './get_space_id_for_beats_tutorial'; import { TutorialContext } from '../../services/tutorials/lib/tutorials_registry_types'; diff --git a/src/plugins/home/server/tutorials/netflow/elastic_cloud.ts b/src/plugins/home/server/tutorials/netflow/elastic_cloud.ts index ac64aef730004..fbedc6abfbb8a 100644 --- a/src/plugins/home/server/tutorials/netflow/elastic_cloud.ts +++ b/src/plugins/home/server/tutorials/netflow/elastic_cloud.ts @@ -19,7 +19,7 @@ import { i18n } from '@kbn/i18n'; -import { INSTRUCTION_VARIANT } from '../instructions/instruction_variant'; +import { INSTRUCTION_VARIANT } from '../../../common/instruction_variant'; import { createLogstashInstructions } from '../instructions/logstash_instructions'; import { createCommonNetflowInstructions } from './common_instructions'; diff --git a/src/plugins/home/server/tutorials/netflow/on_prem.ts b/src/plugins/home/server/tutorials/netflow/on_prem.ts index c7cd36d073632..ef8c3e172af87 100644 --- a/src/plugins/home/server/tutorials/netflow/on_prem.ts +++ b/src/plugins/home/server/tutorials/netflow/on_prem.ts @@ -19,7 +19,7 @@ import { i18n } from '@kbn/i18n'; -import { INSTRUCTION_VARIANT } from '../instructions/instruction_variant'; +import { INSTRUCTION_VARIANT } from '../../../common/instruction_variant'; import { createLogstashInstructions } from '../instructions/logstash_instructions'; import { createCommonNetflowInstructions } from './common_instructions'; diff --git a/src/plugins/home/server/tutorials/netflow/on_prem_elastic_cloud.ts b/src/plugins/home/server/tutorials/netflow/on_prem_elastic_cloud.ts index c01a9a5382f88..85aa694970491 100644 --- a/src/plugins/home/server/tutorials/netflow/on_prem_elastic_cloud.ts +++ b/src/plugins/home/server/tutorials/netflow/on_prem_elastic_cloud.ts @@ -19,7 +19,7 @@ import { i18n } from '@kbn/i18n'; -import { INSTRUCTION_VARIANT } from '../instructions/instruction_variant'; +import { INSTRUCTION_VARIANT } from '../../../common/instruction_variant'; import { createLogstashInstructions } from '../instructions/logstash_instructions'; import { createTrycloudOption1, diff --git a/src/plugins/kibana_legacy/public/plugin.ts b/src/plugins/kibana_legacy/public/plugin.ts index b9a61a1c9b200..7c4b3428cbb6d 100644 --- a/src/plugins/kibana_legacy/public/plugin.ts +++ b/src/plugins/kibana_legacy/public/plugin.ts @@ -17,8 +17,8 @@ * under the License. */ -import { App, PluginInitializerContext } from 'kibana/public'; - +import { App, AppBase, PluginInitializerContext, AppUpdatableFields } from 'kibana/public'; +import { Observable } from 'rxjs'; import { ConfigSchema } from '../config'; interface ForwardDefinition { @@ -27,8 +27,26 @@ interface ForwardDefinition { keepPrefix: boolean; } +export type AngularRenderedAppUpdater = ( + app: AppBase +) => Partial | undefined; + +export interface AngularRenderedApp extends App { + /** + * Angular rendered apps are able to update the active url in the nav link (which is currently not + * possible for actual NP apps). When regular applications have the same functionality, this type + * override can be removed. + */ + updater$?: Observable; + /** + * If the active url is updated via the updater$ subject, the app id is assumed to be identical with + * the nav link id. If this is not the case, it is possible to provide another nav link id here. + */ + navLinkId?: string; +} + export class KibanaLegacyPlugin { - private apps: App[] = []; + private apps: AngularRenderedApp[] = []; private forwards: ForwardDefinition[] = []; constructor(private readonly initializerContext: PluginInitializerContext) {} @@ -52,7 +70,7 @@ export class KibanaLegacyPlugin { * * @param app The app descriptor */ - registerLegacyApp: (app: App) => { + registerLegacyApp: (app: AngularRenderedApp) => { this.apps.push(app); }, diff --git a/src/plugins/kibana_utils/public/index.ts b/src/plugins/kibana_utils/public/index.ts index 9ab7c8cf3f2b7..883f28da45223 100644 --- a/src/plugins/kibana_utils/public/index.ts +++ b/src/plugins/kibana_utils/public/index.ts @@ -49,6 +49,7 @@ export { unhashUrl, unhashQuery, createUrlTracker, + createKbnUrlTracker, createKbnUrlControls, getStateFromKbnUrl, getStatesFromKbnUrl, diff --git a/src/plugins/kibana_utils/public/state_management/url/index.ts b/src/plugins/kibana_utils/public/state_management/url/index.ts index 40491bf7a274b..e28d183c6560a 100644 --- a/src/plugins/kibana_utils/public/state_management/url/index.ts +++ b/src/plugins/kibana_utils/public/state_management/url/index.ts @@ -25,4 +25,5 @@ export { getStatesFromKbnUrl, IKbnUrlControls, } from './kbn_url_storage'; +export { createKbnUrlTracker } from './kbn_url_tracker'; export { createUrlTracker } from './url_tracker'; diff --git a/src/plugins/kibana_utils/public/state_management/url/kbn_url_tracker.test.ts b/src/plugins/kibana_utils/public/state_management/url/kbn_url_tracker.test.ts new file mode 100644 index 0000000000000..4b17d8517328b --- /dev/null +++ b/src/plugins/kibana_utils/public/state_management/url/kbn_url_tracker.test.ts @@ -0,0 +1,184 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { StubBrowserStorage } from 'test_utils/stub_browser_storage'; +import { createMemoryHistory, History } from 'history'; +import { createKbnUrlTracker, KbnUrlTracker } from './kbn_url_tracker'; +import { BehaviorSubject, Subject } from 'rxjs'; +import { AppBase, ToastsSetup } from 'kibana/public'; +import { coreMock } from '../../../../../core/public/mocks'; +import { unhashUrl } from './hash_unhash_url'; + +jest.mock('./hash_unhash_url', () => ({ + unhashUrl: jest.fn(x => x), +})); + +describe('kbnUrlTracker', () => { + let storage: StubBrowserStorage; + let history: History; + let urlTracker: KbnUrlTracker; + let state1Subject: Subject<{ key1: string }>; + let state2Subject: Subject<{ key2: string }>; + let navLinkUpdaterSubject: BehaviorSubject<(app: AppBase) => { activeUrl?: string } | undefined>; + let toastService: jest.Mocked; + + function createTracker() { + urlTracker = createKbnUrlTracker({ + baseUrl: '/app/test', + defaultSubUrl: '#/start', + storageKey: 'storageKey', + history, + storage, + stateParams: [ + { + kbnUrlKey: 'state1', + stateUpdate$: state1Subject.asObservable(), + }, + { + kbnUrlKey: 'state2', + stateUpdate$: state2Subject.asObservable(), + }, + ], + navLinkUpdater$: navLinkUpdaterSubject, + toastNotifications: toastService, + }); + } + + function getActiveNavLinkUrl() { + return navLinkUpdaterSubject.getValue()({} as AppBase)?.activeUrl; + } + + beforeEach(() => { + jest.clearAllMocks(); + toastService = coreMock.createSetup().notifications.toasts; + storage = new StubBrowserStorage(); + history = createMemoryHistory(); + state1Subject = new Subject<{ key1: string }>(); + state2Subject = new Subject<{ key2: string }>(); + navLinkUpdaterSubject = new BehaviorSubject< + (app: AppBase) => { activeUrl?: string } | undefined + >(() => undefined); + }); + + test('do not touch nav link to default if nothing else is set', () => { + createTracker(); + expect(getActiveNavLinkUrl()).toEqual(undefined); + }); + + test('set nav link to session storage value if defined', () => { + storage.setItem('storageKey', '#/deep/path'); + createTracker(); + expect(getActiveNavLinkUrl()).toEqual('/app/test#/deep/path'); + }); + + test('set nav link to default if app gets mounted', () => { + storage.setItem('storageKey', '#/deep/path'); + createTracker(); + urlTracker.appMounted(); + expect(getActiveNavLinkUrl()).toEqual('/app/test#/start'); + }); + + test('keep nav link to default if path gets changed while app mounted', () => { + storage.setItem('storageKey', '#/deep/path'); + createTracker(); + urlTracker.appMounted(); + history.push('/deep/path/2'); + expect(getActiveNavLinkUrl()).toEqual('/app/test#/start'); + }); + + test('change nav link to last visited url within app after unmount', () => { + createTracker(); + urlTracker.appMounted(); + history.push('/deep/path/2'); + history.push('/deep/path/3'); + urlTracker.appUnMounted(); + expect(getActiveNavLinkUrl()).toEqual('/app/test#/deep/path/3'); + }); + + test('unhash all urls that are recorded while app is mounted', () => { + (unhashUrl as jest.Mock).mockImplementation(x => x + '?unhashed'); + createTracker(); + urlTracker.appMounted(); + history.push('/deep/path/2'); + history.push('/deep/path/3'); + urlTracker.appUnMounted(); + expect(unhashUrl).toHaveBeenCalledTimes(2); + expect(getActiveNavLinkUrl()).toEqual('/app/test#/deep/path/3?unhashed'); + }); + + test('show warning and use hashed url if unhashing does not work', () => { + (unhashUrl as jest.Mock).mockImplementation(() => { + throw new Error('unhash broke'); + }); + createTracker(); + urlTracker.appMounted(); + history.push('/deep/path/2'); + urlTracker.appUnMounted(); + expect(getActiveNavLinkUrl()).toEqual('/app/test#/deep/path/2'); + expect(toastService.addDanger).toHaveBeenCalledWith('unhash broke'); + }); + + test('change nav link back to default if app gets mounted again', () => { + createTracker(); + urlTracker.appMounted(); + history.push('/deep/path/2'); + history.push('/deep/path/3'); + urlTracker.appUnMounted(); + urlTracker.appMounted(); + expect(getActiveNavLinkUrl()).toEqual('/app/test#/start'); + }); + + test('update state param when app is not mounted', () => { + createTracker(); + state1Subject.next({ key1: 'abc' }); + expect(getActiveNavLinkUrl()).toMatchInlineSnapshot(`"/app/test#/start?state1=(key1:abc)"`); + }); + + test('update state param without overwriting rest of the url when app is not mounted', () => { + storage.setItem('storageKey', '#/deep/path?extrastate=1'); + createTracker(); + state1Subject.next({ key1: 'abc' }); + expect(getActiveNavLinkUrl()).toMatchInlineSnapshot( + `"/app/test#/deep/path?extrastate=1&state1=(key1:abc)"` + ); + }); + + test('not update state param when app is mounted', () => { + createTracker(); + urlTracker.appMounted(); + state1Subject.next({ key1: 'abc' }); + expect(getActiveNavLinkUrl()).toEqual('/app/test#/start'); + }); + + test('update state param multiple times when app is not mounted', () => { + createTracker(); + state1Subject.next({ key1: 'abc' }); + state1Subject.next({ key1: 'def' }); + expect(getActiveNavLinkUrl()).toMatchInlineSnapshot(`"/app/test#/start?state1=(key1:def)"`); + }); + + test('update multiple state params when app is not mounted', () => { + createTracker(); + state1Subject.next({ key1: 'abc' }); + state2Subject.next({ key2: 'def' }); + expect(getActiveNavLinkUrl()).toMatchInlineSnapshot( + `"/app/test#/start?state1=(key1:abc)&state2=(key2:def)"` + ); + }); +}); diff --git a/src/plugins/kibana_utils/public/state_management/url/kbn_url_tracker.ts b/src/plugins/kibana_utils/public/state_management/url/kbn_url_tracker.ts new file mode 100644 index 0000000000000..6f3f64ea7b941 --- /dev/null +++ b/src/plugins/kibana_utils/public/state_management/url/kbn_url_tracker.ts @@ -0,0 +1,192 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { createHashHistory, History, UnregisterCallback } from 'history'; +import { BehaviorSubject, Observable, Subscription } from 'rxjs'; +import { AppBase, ToastsSetup } from 'kibana/public'; +import { setStateToKbnUrl } from './kbn_url_storage'; +import { unhashUrl } from './hash_unhash_url'; + +export interface KbnUrlTracker { + /** + * Callback to invoke when the app is mounted + */ + appMounted: () => void; + /** + * Callback to invoke when the app is unmounted + */ + appUnMounted: () => void; + /** + * Unregistering the url tracker. This won't reset the current state of the nav link + */ + stop: () => void; +} + +/** + * Listens to history changes and optionally to global state changes and updates the nav link url of + * a given app to point to the last visited page within the app. + * + * This includes the following parts: + * * When the app is currently active, the nav link points to the configurable default url of the app. + * * When the app is not active the last visited url is set to the nav link. + * * When a provided observable emits a new value, the state parameter in the url of the nav link is updated + * as long as the app is not active. + */ +export function createKbnUrlTracker({ + baseUrl, + defaultSubUrl, + storageKey, + stateParams, + navLinkUpdater$, + toastNotifications, + history, + storage, +}: { + /** + * Base url of the current app. This will be used as a prefix for the + * nav link in the side bar + */ + baseUrl: string; + /** + * Default sub url for this app. If the app is currently active or no sub url is already stored in session storage and the app hasn't been visited yet, the nav link will be set to this url. + */ + defaultSubUrl: string; + /** + * List of URL mapped states that should get updated even when the app is not currently active + */ + stateParams: Array<{ + /** + * Key of the query parameter containing the state + */ + kbnUrlKey: string; + /** + * Observable providing updates to the state + */ + stateUpdate$: Observable; + }>; + /** + * Key used to store the current sub url in session storage. This key should only be used for one active url tracker at any given ntime. + */ + storageKey: string; + /** + * App updater subject passed into the application definition to change nav link url. + */ + navLinkUpdater$: BehaviorSubject<(app: AppBase) => { activeUrl?: string } | undefined>; + /** + * Toast notifications service to show toasts in error cases. + */ + toastNotifications: ToastsSetup; + /** + * History object to use to track url changes. If this isn't provided, a local history instance will be created. + */ + history?: History; + /** + * Storage object to use to persist currently active url. If this isn't provided, the browser wide session storage instance will be used. + */ + storage?: Storage; +}): KbnUrlTracker { + const historyInstance = history || createHashHistory(); + const storageInstance = storage || sessionStorage; + + // local state storing current listeners and active url + let activeUrl: string = ''; + let unsubscribeURLHistory: UnregisterCallback | undefined; + let unsubscribeGlobalState: Subscription[] | undefined; + + function setNavLink(hash: string) { + navLinkUpdater$.next(() => ({ activeUrl: baseUrl + hash })); + } + + function getActiveSubUrl(url: string) { + // remove baseUrl prefix (just storing the sub url part) + return url.substr(baseUrl.length); + } + + function unsubscribe() { + if (unsubscribeURLHistory) { + unsubscribeURLHistory(); + unsubscribeURLHistory = undefined; + } + + if (unsubscribeGlobalState) { + unsubscribeGlobalState.forEach(sub => sub.unsubscribe()); + unsubscribeGlobalState = undefined; + } + } + + function onMountApp() { + unsubscribe(); + // track current hash when within app + unsubscribeURLHistory = historyInstance.listen(location => { + const urlWithHashes = baseUrl + '#' + location.pathname + location.search; + let urlWithStates = ''; + try { + urlWithStates = unhashUrl(urlWithHashes); + } catch (e) { + toastNotifications.addDanger(e.message); + } + + activeUrl = getActiveSubUrl(urlWithStates || urlWithHashes); + storageInstance.setItem(storageKey, activeUrl); + }); + } + + function onUnmountApp() { + unsubscribe(); + // propagate state updates when in other apps + unsubscribeGlobalState = stateParams.map(({ stateUpdate$, kbnUrlKey }) => + stateUpdate$.subscribe(state => { + const updatedUrl = setStateToKbnUrl( + kbnUrlKey, + state, + { useHash: false }, + baseUrl + (activeUrl || defaultSubUrl) + ); + // remove baseUrl prefix (just storing the sub url part) + activeUrl = getActiveSubUrl(updatedUrl); + storageInstance.setItem(storageKey, activeUrl); + setNavLink(activeUrl); + }) + ); + } + + // register listeners for unmounted app initially + onUnmountApp(); + + // initialize nav link and internal state + const storedUrl = storageInstance.getItem(storageKey); + if (storedUrl) { + activeUrl = storedUrl; + setNavLink(storedUrl); + } + + return { + appMounted() { + onMountApp(); + setNavLink(defaultSubUrl); + }, + appUnMounted() { + onUnmountApp(); + setNavLink(activeUrl); + }, + stop() { + unsubscribe(); + }, + }; +} From b79e1b84555ac7ea871a56fc4b07bd692920329c Mon Sep 17 00:00:00 2001 From: Dima Arnautov Date: Wed, 5 Feb 2020 17:38:21 +0100 Subject: [PATCH 37/86] [ML] replace angular copy (#56855) --- .../application/services/job_service.js | 29 ++++++++----------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/x-pack/legacy/plugins/ml/public/application/services/job_service.js b/x-pack/legacy/plugins/ml/public/application/services/job_service.js index 54e0dd1f535f2..9827d1a5f38a1 100644 --- a/x-pack/legacy/plugins/ml/public/application/services/job_service.js +++ b/x-pack/legacy/plugins/ml/public/application/services/job_service.js @@ -5,7 +5,6 @@ */ import _ from 'lodash'; -import angular from 'angular'; import moment from 'moment'; import { i18n } from '@kbn/i18n'; @@ -116,8 +115,7 @@ class JobService { ml.getJobs() .then(resp => { - // make deep copy of jobs - angular.copy(resp.jobs, jobs); + jobs = resp.jobs; // load jobs stats ml.getJobStats() @@ -131,14 +129,13 @@ class JobService { job.datafeed_config = {}; for (let j = 0; j < statsResp.jobs.length; j++) { - if (job.job_id === statsResp.jobs[j].job_id) { - const jobStats = angular.copy(statsResp.jobs[j]); - + const jobStats = statsResp.jobs[j]; + if (job.job_id === jobStats.job_id) { job.state = jobStats.state; - job.data_counts = jobStats.data_counts; - job.model_size_stats = jobStats.model_size_stats; + job.data_counts = _.cloneDeep(jobStats.data_counts); + job.model_size_stats = _.cloneDeep(jobStats.model_size_stats); if (jobStats.node) { - job.node = jobStats.node; + job.node = _.cloneDeep(jobStats.node); } if (jobStats.open_time) { job.open_time = jobStats.open_time; @@ -199,9 +196,8 @@ class JobService { return new Promise((resolve, reject) => { ml.getJobs({ jobId }) .then(resp => { - const newJob = {}; if (resp.jobs && resp.jobs.length) { - angular.copy(resp.jobs[0], newJob); + const newJob = resp.jobs[0]; // load jobs stats ml.getJobStats({ jobId }) @@ -213,10 +209,10 @@ class JobService { newJob.state = statsJob.state; newJob.data_counts = {}; newJob.model_size_stats = {}; - angular.copy(statsJob.data_counts, newJob.data_counts); - angular.copy(statsJob.model_size_stats, newJob.model_size_stats); + newJob.data_counts = _.cloneDeep(statsJob.data_counts); + newJob.model_size_stats = _.cloneDeep(statsJob.model_size_stats); if (newJob.node) { - angular.copy(statsJob.node, newJob.node); + newJob.node = _.cloneDeep(statsJob.node); } if (statsJob.open_time) { @@ -273,7 +269,6 @@ class JobService { loadDatafeeds(datafeedId) { return new Promise((resolve, reject) => { - const datafeeds = []; const sId = datafeedId !== undefined ? { datafeed_id: datafeedId } : undefined; ml.getDatafeeds(sId) @@ -281,7 +276,7 @@ class JobService { // console.log('loadDatafeeds query response:', resp); // make deep copy of datafeeds - angular.copy(resp.datafeeds, datafeeds); + const datafeeds = resp.datafeeds; // load datafeeds stats ml.getDatafeedStats() @@ -357,7 +352,7 @@ class JobService { // create a deep copy of a job object // also remove items from the job which are set by the server and not needed // in the future this formatting could be optional - const tempJob = angular.copy(job); + const tempJob = _.cloneDeep(job); // remove all of the items which should not be copied // such as counts, state and times From eb5178fc8a11c005c56d3f7a97cf758dc5e31df3 Mon Sep 17 00:00:00 2001 From: Matthew Kime Date: Wed, 5 Feb 2020 10:54:42 -0600 Subject: [PATCH 38/86] Create index pattern / create_index_pattern/lib => typescript (#56811) * Create index pattern / create_index_pattern/lib => typescript --- .../step_index_pattern/step_index_pattern.js | 3 +- .../constants/{index.js => index.ts} | 0 .../lib/__jest__/api/get_indices.error.json | 4 - .../__jest__/api/get_indices.exception.json | 27 --- .../lib/__jest__/api/get_indices.success.json | 20 --- .../lib/__jest__/get_indices.test.js | 117 ------------ ...rd.test.js => can_append_wildcard.test.ts} | 6 +- ...end_wildcard.js => can_append_wildcard.ts} | 2 +- ...ters.js => contains_illegal_characters.ts} | 2 +- ...js => contains_invalid_characters.test.ts} | 2 +- ...me.test.js => ensure_minimum_time.test.ts} | 2 +- ...minimum_time.js => ensure_minimum_time.ts} | 2 +- ...ds.test.js => extract_time_fields.test.ts} | 7 +- ..._time_fields.js => extract_time_fields.ts} | 3 +- .../lib/get_indices.test.ts | 167 ++++++++++++++++++ .../lib/{get_indices.js => get_indices.ts} | 14 +- ...es.test.js => get_matched_indices.test.ts} | 89 ++++++---- ...ched_indices.js => get_matched_indices.ts} | 20 ++- .../lib/{index.js => index.ts} | 0 .../create_index_pattern_wizard/types.ts | 23 +++ .../creation/config.ts | 2 +- 21 files changed, 283 insertions(+), 229 deletions(-) rename src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/constants/{index.js => index.ts} (100%) delete mode 100644 src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/__jest__/api/get_indices.error.json delete mode 100644 src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/__jest__/api/get_indices.exception.json delete mode 100644 src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/__jest__/api/get_indices.success.json delete mode 100644 src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/__jest__/get_indices.test.js rename src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/{__jest__/can_append_wildcard.test.js => can_append_wildcard.test.ts} (89%) rename src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/{can_append_wildcard.js => can_append_wildcard.ts} (94%) rename src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/{contains_illegal_characters.js => contains_illegal_characters.ts} (90%) rename src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/{__jest__/contains_invalid_characters.test.js => contains_invalid_characters.test.ts} (93%) rename src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/{__jest__/ensure_minimum_time.test.js => ensure_minimum_time.test.ts} (96%) rename src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/{ensure_minimum_time.js => ensure_minimum_time.ts} (97%) rename src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/{__jest__/extract_time_fields.test.js => extract_time_fields.test.ts} (89%) rename src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/{extract_time_fields.js => extract_time_fields.ts} (92%) create mode 100644 src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/get_indices.test.ts rename src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/{get_indices.js => get_indices.ts} (83%) rename src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/{__jest__/get_matched_indices.test.js => get_matched_indices.test.ts} (53%) rename src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/{get_matched_indices.js => get_matched_indices.ts} (86%) rename src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/{index.js => index.ts} (100%) create mode 100644 src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/types.ts diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/components/step_index_pattern/step_index_pattern.js b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/components/step_index_pattern/step_index_pattern.js index c990efaf43547..e10f033ed8165 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/components/step_index_pattern/step_index_pattern.js +++ b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/components/step_index_pattern/step_index_pattern.js @@ -279,13 +279,12 @@ export class StepIndexPattern extends Component { render() { const { isIncludingSystemIndices, allIndices } = this.props; - const { query, partialMatchedIndices, exactMatchedIndices } = this.state; + const { partialMatchedIndices, exactMatchedIndices } = this.state; const matchedIndices = getMatchedIndices( allIndices, partialMatchedIndices, exactMatchedIndices, - query, isIncludingSystemIndices ); diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/constants/index.js b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/constants/index.ts similarity index 100% rename from src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/constants/index.js rename to src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/constants/index.ts diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/__jest__/api/get_indices.error.json b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/__jest__/api/get_indices.error.json deleted file mode 100644 index acb9a9ecd0206..0000000000000 --- a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/__jest__/api/get_indices.error.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "statusCode": 400, - "error": "Bad Request" -} diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/__jest__/api/get_indices.exception.json b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/__jest__/api/get_indices.exception.json deleted file mode 100644 index 1406b06813637..0000000000000 --- a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/__jest__/api/get_indices.exception.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "body": { - "error": { - "root_cause": [ - { - "type": "index_not_found_exception", - "reason": "no such index", - "index_uuid": "_na_", - "resource.type": "index_or_alias", - "resource.id": "t", - "index": "t" - } - ], - "type": "transport_exception", - "reason": "unable to communicate with remote cluster [cluster_one]", - "caused_by": { - "type": "index_not_found_exception", - "reason": "no such index", - "index_uuid": "_na_", - "resource.type": "index_or_alias", - "resource.id": "t", - "index": "t" - } - } - }, - "status": 500 -} diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/__jest__/api/get_indices.success.json b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/__jest__/api/get_indices.success.json deleted file mode 100644 index 1b261243ca728..0000000000000 --- a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/__jest__/api/get_indices.success.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "hits": { - "total": 1, - "max_score": 0.0, - "hits": [] - }, - "aggregations": { - "indices": { - "doc_count_error_upper_bound": 0, - "sum_other_doc_count": 0, - "buckets": [{ - "key": "1", - "doc_count": 1 - },{ - "key": "2", - "doc_count": 1 - }] - } - } -} diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/__jest__/get_indices.test.js b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/__jest__/get_indices.test.js deleted file mode 100644 index 924b0dc46d74d..0000000000000 --- a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/__jest__/get_indices.test.js +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { getIndices } from '../get_indices'; -import successfulResponse from './api/get_indices.success.json'; -import errorResponse from './api/get_indices.error.json'; -import exceptionResponse from './api/get_indices.exception.json'; -const mockIndexPatternCreationType = { - getIndexPatternType: () => 'default', - getIndexPatternName: () => 'name', - checkIndicesForErrors: () => false, - getShowSystemIndices: () => false, - renderPrompt: () => {}, - getIndexPatternMappings: () => { - return {}; - }, - getIndexTags: () => { - return []; - }, -}; - -describe('getIndices', () => { - it('should work in a basic case', async () => { - const es = { - search: () => new Promise(resolve => resolve(successfulResponse)), - }; - - const result = await getIndices(es, mockIndexPatternCreationType, 'kibana', 1); - expect(result.length).toBe(2); - expect(result[0].name).toBe('1'); - expect(result[1].name).toBe('2'); - }); - - it('should ignore ccs query-all', async () => { - expect((await getIndices(null, mockIndexPatternCreationType, '*:')).length).toBe(0); - }); - - it('should ignore a single comma', async () => { - expect((await getIndices(null, mockIndexPatternCreationType, ',')).length).toBe(0); - expect((await getIndices(null, mockIndexPatternCreationType, ',*')).length).toBe(0); - expect((await getIndices(null, mockIndexPatternCreationType, ',foobar')).length).toBe(0); - }); - - it('should trim the input', async () => { - let index; - const es = { - search: jest.fn().mockImplementation(params => { - index = params.index; - }), - }; - - await getIndices(es, mockIndexPatternCreationType, 'kibana ', 1); - expect(index).toBe('kibana'); - }); - - it('should use the limit', async () => { - let limit; - const es = { - search: jest.fn().mockImplementation(params => { - limit = params.body.aggs.indices.terms.size; - }), - }; - - await getIndices(es, mockIndexPatternCreationType, 'kibana', 10); - expect(limit).toBe(10); - }); - - describe('errors', () => { - it('should handle errors gracefully', async () => { - const es = { - search: () => new Promise(resolve => resolve(errorResponse)), - }; - - const result = await getIndices(es, mockIndexPatternCreationType, 'kibana', 1); - expect(result.length).toBe(0); - }); - - it('should throw exceptions', async () => { - const es = { - search: () => { - throw new Error('Fail'); - }, - }; - - await expect(getIndices(es, mockIndexPatternCreationType, 'kibana', 1)).rejects.toThrow(); - }); - - it('should handle index_not_found_exception errors gracefully', async () => { - const es = { - search: () => new Promise((resolve, reject) => reject(exceptionResponse)), - }; - - const result = await getIndices(es, mockIndexPatternCreationType, 'kibana', 1); - expect(result.length).toBe(0); - }); - - it('should throw an exception if no limit is provided', async () => { - await expect(getIndices({}, mockIndexPatternCreationType, 'kibana')).rejects.toThrow(); - }); - }); -}); diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/__jest__/can_append_wildcard.test.js b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/can_append_wildcard.test.ts similarity index 89% rename from src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/__jest__/can_append_wildcard.test.js rename to src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/can_append_wildcard.test.ts index 055632bdd19e0..14139c2e08dc0 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/__jest__/can_append_wildcard.test.js +++ b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/can_append_wildcard.test.ts @@ -17,13 +17,9 @@ * under the License. */ -import { canAppendWildcard } from '../can_append_wildcard'; +import { canAppendWildcard } from './can_append_wildcard'; describe('canAppendWildcard', () => { - test('ignores no data', () => { - expect(canAppendWildcard({})).toBeFalsy(); - }); - test('ignores symbols', () => { expect(canAppendWildcard('%')).toBeFalsy(); }); diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/can_append_wildcard.js b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/can_append_wildcard.ts similarity index 94% rename from src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/can_append_wildcard.js rename to src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/can_append_wildcard.ts index b47e645730aef..e9c4f75e4313b 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/can_append_wildcard.js +++ b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/can_append_wildcard.ts @@ -17,7 +17,7 @@ * under the License. */ -export const canAppendWildcard = keyPressed => { +export const canAppendWildcard = (keyPressed: string) => { // If it's not a letter, number or is something longer, reject it if (!keyPressed || !/[a-z0-9]/i.test(keyPressed) || keyPressed.length !== 1) { return false; diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/contains_illegal_characters.js b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/contains_illegal_characters.ts similarity index 90% rename from src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/contains_illegal_characters.js rename to src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/contains_illegal_characters.ts index 31485bb3daaa2..ca4fc8122903c 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/contains_illegal_characters.js +++ b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/contains_illegal_characters.ts @@ -17,6 +17,6 @@ * under the License. */ -export function containsIllegalCharacters(pattern, illegalCharacters) { +export function containsIllegalCharacters(pattern: string, illegalCharacters: string[]) { return illegalCharacters.some(char => pattern.includes(char)); } diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/__jest__/contains_invalid_characters.test.js b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/contains_invalid_characters.test.ts similarity index 93% rename from src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/__jest__/contains_invalid_characters.test.js rename to src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/contains_invalid_characters.test.ts index 05c4aba2571bd..640908d3db6d1 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/__jest__/contains_invalid_characters.test.js +++ b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/contains_invalid_characters.test.ts @@ -17,7 +17,7 @@ * under the License. */ -import { containsIllegalCharacters } from '../contains_illegal_characters'; +import { containsIllegalCharacters } from './contains_illegal_characters'; describe('containsIllegalCharacters', () => { it('returns true with illegal characters', () => { diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/__jest__/ensure_minimum_time.test.js b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/ensure_minimum_time.test.ts similarity index 96% rename from src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/__jest__/ensure_minimum_time.test.js rename to src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/ensure_minimum_time.test.ts index 99724cbf3a2a7..e5fcfe056923a 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/__jest__/ensure_minimum_time.test.js +++ b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/ensure_minimum_time.test.ts @@ -17,7 +17,7 @@ * under the License. */ -import { ensureMinimumTime } from '../ensure_minimum_time'; +import { ensureMinimumTime } from './ensure_minimum_time'; describe('ensureMinimumTime', () => { it('resolves single promise', async done => { diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/ensure_minimum_time.js b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/ensure_minimum_time.ts similarity index 97% rename from src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/ensure_minimum_time.js rename to src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/ensure_minimum_time.ts index 0a6d3fcfbbdf0..84852ece485eb 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/ensure_minimum_time.js +++ b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/ensure_minimum_time.ts @@ -27,7 +27,7 @@ export const DEFAULT_MINIMUM_TIME_MS = 300; export async function ensureMinimumTime( - promiseOrPromises, + promiseOrPromises: Promise | Array>, minimumTimeMs = DEFAULT_MINIMUM_TIME_MS ) { let returnValue; diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/__jest__/extract_time_fields.test.js b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/extract_time_fields.test.ts similarity index 89% rename from src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/__jest__/extract_time_fields.test.js rename to src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/extract_time_fields.test.ts index ec420e19817c7..4cd28090420a7 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/__jest__/extract_time_fields.test.js +++ b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/extract_time_fields.test.ts @@ -17,11 +17,14 @@ * under the License. */ -import { extractTimeFields } from '../extract_time_fields'; +import { extractTimeFields } from './extract_time_fields'; describe('extractTimeFields', () => { it('should handle no date fields', () => { - const fields = [{ type: 'text' }, { type: 'text' }]; + const fields = [ + { type: 'text', name: 'name' }, + { type: 'text', name: 'name' }, + ]; expect(extractTimeFields(fields)).toEqual([ { display: `The indices which match this index pattern don't contain any time fields.` }, diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/extract_time_fields.js b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/extract_time_fields.ts similarity index 92% rename from src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/extract_time_fields.js rename to src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/extract_time_fields.ts index 1a9deefb217f2..0b95ec0a120da 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/extract_time_fields.js +++ b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/extract_time_fields.ts @@ -18,8 +18,9 @@ */ import { i18n } from '@kbn/i18n'; +import { IFieldType } from '../../../../../../../../../plugins/data/public'; -export function extractTimeFields(fields) { +export function extractTimeFields(fields: IFieldType[]) { const dateFields = fields.filter(field => field.type === 'date'); const label = i18n.translate('kbn.management.createIndexPattern.stepTime.noTimeFieldsLabel', { defaultMessage: "The indices which match this index pattern don't contain any time fields.", diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/get_indices.test.ts b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/get_indices.test.ts new file mode 100644 index 0000000000000..cd7c8278adcc7 --- /dev/null +++ b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/get_indices.test.ts @@ -0,0 +1,167 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { getIndices } from './get_indices'; +import { IndexPatternCreationConfig } from './../../../../../../../management/public'; +import { LegacyApiCaller } from '../../../../../../../../../plugins/data/public'; + +export const successfulResponse = { + hits: { + total: 1, + max_score: 0.0, + hits: [], + }, + aggregations: { + indices: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: '1', + doc_count: 1, + }, + { + key: '2', + doc_count: 1, + }, + ], + }, + }, +}; + +export const exceptionResponse = { + body: { + error: { + root_cause: [ + { + type: 'index_not_found_exception', + reason: 'no such index', + index_uuid: '_na_', + 'resource.type': 'index_or_alias', + 'resource.id': 't', + index: 't', + }, + ], + type: 'transport_exception', + reason: 'unable to communicate with remote cluster [cluster_one]', + caused_by: { + type: 'index_not_found_exception', + reason: 'no such index', + index_uuid: '_na_', + 'resource.type': 'index_or_alias', + 'resource.id': 't', + index: 't', + }, + }, + }, + status: 500, +}; + +export const errorResponse = { + statusCode: 400, + error: 'Bad Request', +}; + +const mockIndexPatternCreationType = new IndexPatternCreationConfig({ + type: 'default', + name: 'name', + showSystemIndices: false, + httpClient: {}, + isBeta: false, +}); + +function esClientFactory(search: (params: any) => any): LegacyApiCaller { + return { + search, + msearch: () => ({ + abort: () => {}, + ...new Promise(resolve => resolve({})), + }), + }; +} + +const es = esClientFactory(() => successfulResponse); + +describe('getIndices', () => { + it('should work in a basic case', async () => { + const result = await getIndices(es, mockIndexPatternCreationType, 'kibana', 1); + expect(result.length).toBe(2); + expect(result[0].name).toBe('1'); + expect(result[1].name).toBe('2'); + }); + + it('should ignore ccs query-all', async () => { + expect((await getIndices(es, mockIndexPatternCreationType, '*:', 10)).length).toBe(0); + }); + + it('should ignore a single comma', async () => { + expect((await getIndices(es, mockIndexPatternCreationType, ',', 10)).length).toBe(0); + expect((await getIndices(es, mockIndexPatternCreationType, ',*', 10)).length).toBe(0); + expect((await getIndices(es, mockIndexPatternCreationType, ',foobar', 10)).length).toBe(0); + }); + + it('should trim the input', async () => { + let index; + const esClient = esClientFactory( + jest.fn().mockImplementation(params => { + index = params.index; + }) + ); + + await getIndices(esClient, mockIndexPatternCreationType, 'kibana ', 1); + expect(index).toBe('kibana'); + }); + + it('should use the limit', async () => { + let limit; + const esClient = esClientFactory( + jest.fn().mockImplementation(params => { + limit = params.body.aggs.indices.terms.size; + }) + ); + await getIndices(esClient, mockIndexPatternCreationType, 'kibana', 10); + expect(limit).toBe(10); + }); + + describe('errors', () => { + it('should handle errors gracefully', async () => { + const esClient = esClientFactory(() => errorResponse); + const result = await getIndices(esClient, mockIndexPatternCreationType, 'kibana', 1); + expect(result.length).toBe(0); + }); + + it('should throw exceptions', async () => { + const esClient = esClientFactory(() => { + throw new Error('Fail'); + }); + + await expect( + getIndices(esClient, mockIndexPatternCreationType, 'kibana', 1) + ).rejects.toThrow(); + }); + + it('should handle index_not_found_exception errors gracefully', async () => { + const esClient = esClientFactory( + () => new Promise((resolve, reject) => reject(exceptionResponse)) + ); + const result = await getIndices(esClient, mockIndexPatternCreationType, 'kibana', 1); + expect(result.length).toBe(0); + }); + }); +}); diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/get_indices.js b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/get_indices.ts similarity index 83% rename from src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/get_indices.js rename to src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/get_indices.ts index 8159fff8220bd..3848c425e2d49 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/get_indices.js +++ b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/get_indices.ts @@ -18,8 +18,16 @@ */ import { get, sortBy } from 'lodash'; +import { IndexPatternCreationConfig } from '../../../../../../../management/public'; +import { DataPublicPluginStart } from '../../../../../../../../../plugins/data/public'; +import { MatchedIndex } from '../types'; -export async function getIndices(es, indexPatternCreationType, rawPattern, limit) { +export async function getIndices( + es: DataPublicPluginStart['search']['__LEGACY']['esClient'], + indexPatternCreationType: IndexPatternCreationConfig, + rawPattern: string, + limit: number +): Promise { const pattern = rawPattern.trim(); // Searching for `*:` fails for CCS environments. The search request @@ -70,10 +78,10 @@ export async function getIndices(es, indexPatternCreationType, rawPattern, limit return sortBy( response.aggregations.indices.buckets - .map(bucket => { + .map((bucket: { key: string; doc_count: number }) => { return bucket.key; }) - .map(indexName => { + .map((indexName: string) => { return { name: indexName, tags: indexPatternCreationType.getIndexTags(indexName), diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/__jest__/get_matched_indices.test.js b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/get_matched_indices.test.ts similarity index 53% rename from src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/__jest__/get_matched_indices.test.js rename to src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/get_matched_indices.test.ts index 625c128181ffe..7aba50a7ca12b 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/__jest__/get_matched_indices.test.js +++ b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/get_matched_indices.test.ts @@ -17,24 +17,32 @@ * under the License. */ -import { getMatchedIndices } from '../get_matched_indices'; +import { getMatchedIndices } from './get_matched_indices'; -jest.mock('../../constants', () => ({ +jest.mock('./../constants', () => ({ MAX_NUMBER_OF_MATCHING_INDICES: 6, })); +const tags: string[] = []; const indices = [ - { name: 'kibana' }, - { name: 'es' }, - { name: 'logstash' }, - { name: 'packetbeat' }, - { name: 'metricbeat' }, - { name: '.kibana' }, + { name: 'kibana', tags }, + { name: 'es', tags }, + { name: 'logstash', tags }, + { name: 'packetbeat', tags }, + { name: 'metricbeat', tags }, + { name: '.kibana', tags }, ]; -const partialIndices = [{ name: 'kibana' }, { name: 'es' }, { name: '.kibana' }]; +const partialIndices = [ + { name: 'kibana', tags }, + { name: 'es', tags }, + { name: '.kibana', tags }, +]; -const exactIndices = [{ name: 'kibana' }, { name: '.kibana' }]; +const exactIndices = [ + { name: 'kibana', tags }, + { name: '.kibana', tags }, +]; describe('getMatchedIndices', () => { it('should return all indices', () => { @@ -43,26 +51,32 @@ describe('getMatchedIndices', () => { exactMatchedIndices, partialMatchedIndices, visibleIndices, - } = getMatchedIndices(indices, partialIndices, exactIndices, '*', true); + } = getMatchedIndices(indices, partialIndices, exactIndices, true); expect(allIndices).toEqual([ - { name: 'kibana' }, - { name: 'es' }, - { name: 'logstash' }, - { name: 'packetbeat' }, - { name: 'metricbeat' }, - { name: '.kibana' }, + { name: 'kibana', tags }, + { name: 'es', tags }, + { name: 'logstash', tags }, + { name: 'packetbeat', tags }, + { name: 'metricbeat', tags }, + { name: '.kibana', tags }, ]); - expect(exactMatchedIndices).toEqual([{ name: 'kibana' }, { name: '.kibana' }]); + expect(exactMatchedIndices).toEqual([ + { name: 'kibana', tags }, + { name: '.kibana', tags }, + ]); expect(partialMatchedIndices).toEqual([ - { name: 'kibana' }, - { name: 'es' }, - { name: '.kibana' }, + { name: 'kibana', tags }, + { name: 'es', tags }, + { name: '.kibana', tags }, ]); - expect(visibleIndices).toEqual([{ name: 'kibana' }, { name: '.kibana' }]); + expect(visibleIndices).toEqual([ + { name: 'kibana', tags }, + { name: '.kibana', tags }, + ]); }); it('should return all indices except for system indices', () => { @@ -71,31 +85,38 @@ describe('getMatchedIndices', () => { exactMatchedIndices, partialMatchedIndices, visibleIndices, - } = getMatchedIndices(indices, partialIndices, exactIndices, '*', false); + } = getMatchedIndices(indices, partialIndices, exactIndices, false); expect(allIndices).toEqual([ - { name: 'kibana' }, - { name: 'es' }, - { name: 'logstash' }, - { name: 'packetbeat' }, - { name: 'metricbeat' }, + { name: 'kibana', tags }, + { name: 'es', tags }, + { name: 'logstash', tags }, + { name: 'packetbeat', tags }, + { name: 'metricbeat', tags }, ]); - expect(exactMatchedIndices).toEqual([{ name: 'kibana' }]); + expect(exactMatchedIndices).toEqual([{ name: 'kibana', tags }]); - expect(partialMatchedIndices).toEqual([{ name: 'kibana' }, { name: 'es' }]); + expect(partialMatchedIndices).toEqual([ + { name: 'kibana', tags }, + { name: 'es', tags }, + ]); - expect(visibleIndices).toEqual([{ name: 'kibana' }]); + expect(visibleIndices).toEqual([{ name: 'kibana', tags }]); }); it('should return partial matches as visible if there are no exact', () => { - const { visibleIndices } = getMatchedIndices(indices, partialIndices, [], '*', true); + const { visibleIndices } = getMatchedIndices(indices, partialIndices, [], true); - expect(visibleIndices).toEqual([{ name: 'kibana' }, { name: 'es' }, { name: '.kibana' }]); + expect(visibleIndices).toEqual([ + { name: 'kibana', tags }, + { name: 'es', tags }, + { name: '.kibana', tags }, + ]); }); it('should return all indices as visible if there are no exact or partial', () => { - const { visibleIndices } = getMatchedIndices(indices, [], [], '*', true); + const { visibleIndices } = getMatchedIndices(indices, [], [], true); expect(visibleIndices).toEqual(indices); }); diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/get_matched_indices.js b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/get_matched_indices.ts similarity index 86% rename from src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/get_matched_indices.js rename to src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/get_matched_indices.ts index 19a829a83a2b2..cc3fd4075aa0e 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/get_matched_indices.js +++ b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/get_matched_indices.ts @@ -19,19 +19,21 @@ import { MAX_NUMBER_OF_MATCHING_INDICES } from '../constants'; -function isSystemIndex(index) { +function isSystemIndex(index: string): boolean { if (index.startsWith('.')) { return true; } if (index.includes(':')) { - return index.split(':').reduce((isSystem, index) => isSystem || isSystemIndex(index), false); + return index + .split(':') + .reduce((isSystem: boolean, idx) => isSystem || isSystemIndex(idx), false); } return false; } -function filterSystemIndices(indices, isIncludingSystemIndices) { +function filterSystemIndices(indices: MatchedIndex[], isIncludingSystemIndices: boolean) { if (!indices) { return indices; } @@ -62,12 +64,14 @@ function filterSystemIndices(indices, isIncludingSystemIndices) { This is the result of searching against a query that already ends in `*`. We call this `exact` matches because ES is telling us exactly what it matches */ + +import { MatchedIndex } from '../types'; + export function getMatchedIndices( - unfilteredAllIndices, - unfilteredPartialMatchedIndices, - unfilteredExactMatchedIndices, - query, - isIncludingSystemIndices + unfilteredAllIndices: MatchedIndex[], + unfilteredPartialMatchedIndices: MatchedIndex[], + unfilteredExactMatchedIndices: MatchedIndex[], + isIncludingSystemIndices: boolean = false ) { const allIndices = filterSystemIndices(unfilteredAllIndices, isIncludingSystemIndices); const partialMatchedIndices = filterSystemIndices( diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/index.js b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/index.ts similarity index 100% rename from src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/index.js rename to src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/index.ts diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/types.ts b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/types.ts new file mode 100644 index 0000000000000..93bb6920c6981 --- /dev/null +++ b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/types.ts @@ -0,0 +1,23 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export interface MatchedIndex { + name: string; + tags: string[]; +} diff --git a/src/legacy/core_plugins/management/public/np_ready/services/index_pattern_management/creation/config.ts b/src/legacy/core_plugins/management/public/np_ready/services/index_pattern_management/creation/config.ts index 0598c88c80ba7..b68b2e40aad9e 100644 --- a/src/legacy/core_plugins/management/public/np_ready/services/index_pattern_management/creation/config.ts +++ b/src/legacy/core_plugins/management/public/np_ready/services/index_pattern_management/creation/config.ts @@ -102,7 +102,7 @@ export class IndexPatternCreationConfig { return this.showSystemIndices; } - public getIndexTags() { + public getIndexTags(indexName: string) { return []; } From f870120b30512aa9ffbb032d618f541ed8fb9c52 Mon Sep 17 00:00:00 2001 From: Melissa Alvarez Date: Wed, 5 Feb 2020 12:16:55 -0500 Subject: [PATCH 39/86] [ML] New Platform server shim: update anomaly detectors routes to use new platform router (#56717) * update job routes to NP * call notify.error properly on mlMessageBarService * add route documentation annotation to job routes * update schema and route doc * update apidoc file with routes --- .../application/services/job_service.js | 14 +- .../new_platform/anomaly_detectors_schema.ts | 93 ++++ .../ml/server/routes/anomaly_detectors.js | 202 -------- .../ml/server/routes/anomaly_detectors.ts | 459 ++++++++++++++++++ .../plugins/ml/server/routes/apidoc.json | 16 +- 5 files changed, 574 insertions(+), 210 deletions(-) create mode 100644 x-pack/legacy/plugins/ml/server/new_platform/anomaly_detectors_schema.ts delete mode 100644 x-pack/legacy/plugins/ml/server/routes/anomaly_detectors.js create mode 100644 x-pack/legacy/plugins/ml/server/routes/anomaly_detectors.ts diff --git a/x-pack/legacy/plugins/ml/public/application/services/job_service.js b/x-pack/legacy/plugins/ml/public/application/services/job_service.js index 9827d1a5f38a1..fe3663d6a3ddb 100644 --- a/x-pack/legacy/plugins/ml/public/application/services/job_service.js +++ b/x-pack/legacy/plugins/ml/public/application/services/job_service.js @@ -416,7 +416,7 @@ class JobService { return { success: true }; }) .catch(err => { - msgs.error( + msgs.notify.error( i18n.translate('xpack.ml.jobService.couldNotUpdateJobErrorMessage', { defaultMessage: 'Could not update job: {jobId}', values: { jobId }, @@ -435,7 +435,7 @@ class JobService { return { success: true, messages }; }) .catch(err => { - msgs.error( + msgs.notify.error( i18n.translate('xpack.ml.jobService.jobValidationErrorMessage', { defaultMessage: 'Job Validation Error: {errorMessage}', values: { errorMessage: err.message }, @@ -628,7 +628,7 @@ class JobService { return { success: true }; }) .catch(err => { - msgs.error( + msgs.notify.error( i18n.translate('xpack.ml.jobService.couldNotUpdateDatafeedErrorMessage', { defaultMessage: 'Could not update datafeed: {datafeedId}', values: { datafeedId }, @@ -659,7 +659,7 @@ class JobService { }) .catch(err => { console.log('jobService error starting datafeed:', err); - msgs.error( + msgs.notify.error( i18n.translate('xpack.ml.jobService.couldNotStartDatafeedErrorMessage', { defaultMessage: 'Could not start datafeed for {jobId}', values: { jobId }, @@ -692,15 +692,15 @@ class JobService { ); if (err.statusCode === 500) { - msgs.error(couldNotStopDatafeedErrorMessage); - msgs.error( + msgs.notify.error(couldNotStopDatafeedErrorMessage); + msgs.notify.error( i18n.translate('xpack.ml.jobService.requestMayHaveTimedOutErrorMessage', { defaultMessage: 'Request may have timed out and may still be running in the background.', }) ); } else { - msgs.error(couldNotStopDatafeedErrorMessage, err); + msgs.notify.error(couldNotStopDatafeedErrorMessage, err); } reject(err); }); diff --git a/x-pack/legacy/plugins/ml/server/new_platform/anomaly_detectors_schema.ts b/x-pack/legacy/plugins/ml/server/new_platform/anomaly_detectors_schema.ts new file mode 100644 index 0000000000000..392d3bfd84768 --- /dev/null +++ b/x-pack/legacy/plugins/ml/server/new_platform/anomaly_detectors_schema.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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { schema } from '@kbn/config-schema'; + +const detectorSchema = schema.object({ + identifier: schema.maybe(schema.string()), + function: schema.string(), + field_name: schema.maybe(schema.string()), + by_field_name: schema.maybe(schema.string()), + over_field_name: schema.maybe(schema.string()), + partition_field_name: schema.maybe(schema.string()), + detector_description: schema.maybe(schema.string()), +}); + +const customUrlSchema = { + url_name: schema.string(), + url_value: schema.string(), + time_range: schema.maybe(schema.any()), +}; + +const customSettingsSchema = schema.object({ + created_by: schema.maybe(schema.string()), + custom_urls: schema.maybe(schema.arrayOf(schema.maybe(schema.object({ ...customUrlSchema })))), +}); + +export const anomalyDetectionUpdateJobSchema = { + description: schema.maybe(schema.string()), + detectors: schema.maybe( + schema.arrayOf( + schema.maybe( + schema.object({ + detector_index: schema.number(), + custom_rules: schema.arrayOf( + schema.maybe( + schema.object({ + actions: schema.arrayOf(schema.string()), + conditions: schema.arrayOf(schema.any()), + scope: schema.maybe(schema.any()), + }) + ) + ), + }) + ) + ) + ), + custom_settings: schema.maybe(customSettingsSchema), + analysis_limits: schema.object({ + categorization_examples_limit: schema.maybe(schema.number()), + model_memory_limit: schema.maybe(schema.string()), + }), + groups: schema.maybe(schema.arrayOf(schema.maybe(schema.string()))), +}; + +export const anomalyDetectionJobSchema = { + analysis_config: schema.object({ + bucket_span: schema.maybe(schema.string()), + summary_count_field_name: schema.maybe(schema.string()), + detectors: schema.arrayOf(detectorSchema), + influencers: schema.arrayOf(schema.maybe(schema.string())), + categorization_field_name: schema.maybe(schema.string()), + }), + analysis_limits: schema.object({ + categorization_examples_limit: schema.maybe(schema.number()), + model_memory_limit: schema.maybe(schema.string()), + }), + create_time: schema.maybe(schema.number()), + custom_settings: schema.maybe(customSettingsSchema), + allow_lazy_open: schema.maybe(schema.any()), + data_counts: schema.maybe(schema.any()), + data_description: schema.object({ + time_field: schema.string(), + time_format: schema.maybe(schema.string()), + }), + datafeed_config: schema.maybe(schema.any()), + description: schema.maybe(schema.string()), + established_model_memory: schema.maybe(schema.number()), + finished_time: schema.maybe(schema.number()), + job_id: schema.string(), + job_type: schema.maybe(schema.string()), + job_version: schema.maybe(schema.string()), + groups: schema.arrayOf(schema.maybe(schema.string())), + model_plot_config: schema.maybe(schema.any()), + model_size_stats: schema.maybe(schema.any()), + model_snapshot_id: schema.maybe(schema.string()), + model_snapshot_min_version: schema.maybe(schema.string()), + model_snapshot_retention_days: schema.maybe(schema.number()), + results_index_name: schema.maybe(schema.string()), + state: schema.maybe(schema.string()), +}; diff --git a/x-pack/legacy/plugins/ml/server/routes/anomaly_detectors.js b/x-pack/legacy/plugins/ml/server/routes/anomaly_detectors.js deleted file mode 100644 index 54d447c288151..0000000000000 --- a/x-pack/legacy/plugins/ml/server/routes/anomaly_detectors.js +++ /dev/null @@ -1,202 +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; - * you may not use this file except in compliance with the Elastic License. - */ - -import { callWithRequestFactory } from '../client/call_with_request_factory'; -import { wrapError } from '../client/errors'; - -export function jobRoutes({ commonRouteConfig, elasticsearchPlugin, route }) { - route({ - method: 'GET', - path: '/api/ml/anomaly_detectors', - handler(request) { - const callWithRequest = callWithRequestFactory(elasticsearchPlugin, request); - return callWithRequest('ml.jobs').catch(resp => wrapError(resp)); - }, - config: { - ...commonRouteConfig, - }, - }); - - route({ - method: 'GET', - path: '/api/ml/anomaly_detectors/{jobId}', - handler(request) { - const callWithRequest = callWithRequestFactory(elasticsearchPlugin, request); - const jobId = request.params.jobId; - return callWithRequest('ml.jobs', { jobId }).catch(resp => wrapError(resp)); - }, - config: { - ...commonRouteConfig, - }, - }); - - route({ - method: 'GET', - path: '/api/ml/anomaly_detectors/_stats', - handler(request) { - const callWithRequest = callWithRequestFactory(elasticsearchPlugin, request); - return callWithRequest('ml.jobStats').catch(resp => wrapError(resp)); - }, - config: { - ...commonRouteConfig, - }, - }); - - route({ - method: 'GET', - path: '/api/ml/anomaly_detectors/{jobId}/_stats', - handler(request) { - const callWithRequest = callWithRequestFactory(elasticsearchPlugin, request); - const jobId = request.params.jobId; - return callWithRequest('ml.jobStats', { jobId }).catch(resp => wrapError(resp)); - }, - config: { - ...commonRouteConfig, - }, - }); - - route({ - method: 'PUT', - path: '/api/ml/anomaly_detectors/{jobId}', - handler(request) { - const callWithRequest = callWithRequestFactory(elasticsearchPlugin, request); - const jobId = request.params.jobId; - const body = request.payload; - return callWithRequest('ml.addJob', { jobId, body }).catch(resp => wrapError(resp)); - }, - config: { - ...commonRouteConfig, - }, - }); - - route({ - method: 'POST', - path: '/api/ml/anomaly_detectors/{jobId}/_update', - handler(request) { - const callWithRequest = callWithRequestFactory(elasticsearchPlugin, request); - const jobId = request.params.jobId; - const body = request.payload; - return callWithRequest('ml.updateJob', { jobId, body }).catch(resp => wrapError(resp)); - }, - config: { - ...commonRouteConfig, - }, - }); - - route({ - method: 'POST', - path: '/api/ml/anomaly_detectors/{jobId}/_open', - handler(request) { - const callWithRequest = callWithRequestFactory(elasticsearchPlugin, request); - const jobId = request.params.jobId; - return callWithRequest('ml.openJob', { jobId }).catch(resp => wrapError(resp)); - }, - config: { - ...commonRouteConfig, - }, - }); - - route({ - method: 'POST', - path: '/api/ml/anomaly_detectors/{jobId}/_close', - handler(request) { - const callWithRequest = callWithRequestFactory(elasticsearchPlugin, request); - const options = { - jobId: request.params.jobId, - }; - const force = request.query.force; - if (force !== undefined) { - options.force = force; - } - return callWithRequest('ml.closeJob', options).catch(resp => wrapError(resp)); - }, - config: { - ...commonRouteConfig, - }, - }); - - route({ - method: 'DELETE', - path: '/api/ml/anomaly_detectors/{jobId}', - handler(request) { - const callWithRequest = callWithRequestFactory(elasticsearchPlugin, request); - const options = { - jobId: request.params.jobId, - }; - const force = request.query.force; - if (force !== undefined) { - options.force = force; - } - return callWithRequest('ml.deleteJob', options).catch(resp => wrapError(resp)); - }, - config: { - ...commonRouteConfig, - }, - }); - - route({ - method: 'POST', - path: '/api/ml/anomaly_detectors/_validate/detector', - handler(request) { - const callWithRequest = callWithRequestFactory(elasticsearchPlugin, request); - const body = request.payload; - return callWithRequest('ml.validateDetector', { body }).catch(resp => wrapError(resp)); - }, - config: { - ...commonRouteConfig, - }, - }); - - route({ - method: 'POST', - path: '/api/ml/anomaly_detectors/{jobId}/_forecast', - handler(request) { - const callWithRequest = callWithRequestFactory(elasticsearchPlugin, request); - const jobId = request.params.jobId; - const duration = request.payload.duration; - return callWithRequest('ml.forecast', { jobId, duration }).catch(resp => wrapError(resp)); - }, - config: { - ...commonRouteConfig, - }, - }); - - route({ - method: 'POST', - path: '/api/ml/anomaly_detectors/{jobId}/results/overall_buckets', - handler(request) { - const callWithRequest = callWithRequestFactory(elasticsearchPlugin, request); - return callWithRequest('ml.overallBuckets', { - jobId: request.params.jobId, - top_n: request.payload.topN, - bucket_span: request.payload.bucketSpan, - start: request.payload.start, - end: request.payload.end, - }).catch(resp => wrapError(resp)); - }, - config: { - ...commonRouteConfig, - }, - }); - - route({ - method: 'GET', - path: '/api/ml/anomaly_detectors/{jobId}/results/categories/{categoryId}', - handler(request, reply) { - const callWithRequest = callWithRequestFactory(elasticsearchPlugin, request); - const options = { - jobId: request.params.jobId, - categoryId: request.params.categoryId, - }; - return callWithRequest('ml.categories', options) - .then(resp => reply(resp)) - .catch(resp => reply(wrapError(resp))); - }, - config: { - ...commonRouteConfig, - }, - }); -} diff --git a/x-pack/legacy/plugins/ml/server/routes/anomaly_detectors.ts b/x-pack/legacy/plugins/ml/server/routes/anomaly_detectors.ts new file mode 100644 index 0000000000000..64af1f67bce29 --- /dev/null +++ b/x-pack/legacy/plugins/ml/server/routes/anomaly_detectors.ts @@ -0,0 +1,459 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { schema } from '@kbn/config-schema'; +import { wrapError } from '../client/error_wrapper'; +import { licensePreRoutingFactory } from '../new_platform/licence_check_pre_routing_factory'; +import { RouteInitialization } from '../new_platform/plugin'; +import { + anomalyDetectionJobSchema, + anomalyDetectionUpdateJobSchema, +} from '../new_platform/anomaly_detectors_schema'; + +/** + * Routes for the anomaly detectors + */ +export function jobRoutes({ xpackMainPlugin, router }: RouteInitialization) { + /** + * @apiGroup AnomalyDetectors + * + * @api {get} /api/ml/anomaly_detectors Get anomaly detectors data + * @apiName GetAnomalyDetectors + * @apiDescription Returns the list of anomaly detection jobs. + * + * @apiSuccess {Number} count + * @apiSuccess {Object[]} jobs + */ + router.get( + { + path: '/api/ml/anomaly_detectors', + validate: false, + }, + licensePreRoutingFactory(xpackMainPlugin, async (context, request, response) => { + try { + const results = await context.ml!.mlClient.callAsCurrentUser('ml.jobs'); + return response.ok({ + body: { ...results }, + }); + } catch (e) { + return response.customError(wrapError(e)); + } + }) + ); + + /** + * @apiGroup AnomalyDetectors + * + * @api {get} /api/ml/anomaly_detectors/:jobId Get anomaly detection data by id + * @apiName GetAnomalyDetectorsById + * @apiDescription Returns the anomaly detection job. + * + * @apiParam {String} jobId Job ID. + */ + router.get( + { + path: '/api/ml/anomaly_detectors/{jobId}', + validate: { + params: schema.object({ + jobId: schema.string(), + }), + }, + }, + licensePreRoutingFactory(xpackMainPlugin, async (context, request, response) => { + try { + const { jobId } = request.params; + const results = await context.ml!.mlClient.callAsCurrentUser('ml.jobs', { jobId }); + return response.ok({ + body: { ...results }, + }); + } catch (e) { + return response.customError(wrapError(e)); + } + }) + ); + + /** + * @apiGroup AnomalyDetectors + * + * @api {get} /api/ml/anomaly_detectors/_stats Get anomaly detection stats + * @apiName GetAnomalyDetectorsStats + * @apiDescription Returns anomaly detection jobs statistics. + * + * @apiSuccess {Number} count + * @apiSuccess {Object[]} jobs + */ + router.get( + { + path: '/api/ml/anomaly_detectors/_stats', + validate: false, + }, + licensePreRoutingFactory(xpackMainPlugin, async (context, request, response) => { + try { + const results = await context.ml!.mlClient.callAsCurrentUser('ml.jobStats'); + return response.ok({ + body: { ...results }, + }); + } catch (e) { + return response.customError(wrapError(e)); + } + }) + ); + + /** + * @apiGroup AnomalyDetectors + * + * @api {get} /api/ml/anomaly_detectors/:jobId/_stats Get stats for requested anomaly detection job + * @apiName GetAnomalyDetectorsStatsById + * @apiDescription Returns anomaly detection job statistics. + * + * @apiParam {String} jobId Job ID. + */ + router.get( + { + path: '/api/ml/anomaly_detectors/{jobId}/_stats', + validate: { + params: schema.object({ + jobId: schema.string(), + }), + }, + }, + licensePreRoutingFactory(xpackMainPlugin, async (context, request, response) => { + try { + const { jobId } = request.params; + const results = await context.ml!.mlClient.callAsCurrentUser('ml.jobStats', { jobId }); + return response.ok({ + body: { ...results }, + }); + } catch (e) { + return response.customError(wrapError(e)); + } + }) + ); + + /** + * @apiGroup AnomalyDetectors + * + * @api {put} /api/ml/anomaly_detectors/:jobId Instantiate an anomaly detection job + * @apiName CreateAnomalyDetectors + * @apiDescription Creates an anomaly detection job. + * + * @apiParam {String} jobId Job ID. + */ + router.put( + { + path: '/api/ml/anomaly_detectors/{jobId}', + validate: { + params: schema.object({ + jobId: schema.string(), + }), + body: schema.object({ ...anomalyDetectionJobSchema }), + }, + }, + licensePreRoutingFactory(xpackMainPlugin, async (context, request, response) => { + try { + const { jobId } = request.params; + const results = await context.ml!.mlClient.callAsCurrentUser('ml.addJob', { + jobId, + body: request.body, + }); + return response.ok({ + body: { ...results }, + }); + } catch (e) { + return response.customError(wrapError(e)); + } + }) + ); + + /** + * @apiGroup AnomalyDetectors + * + * @api {post} /api/ml/anomaly_detectors/:jobId/_update Update an anomaly detection job + * @apiName UpdateAnomalyDetectors + * @apiDescription Updates certain properties of an anomaly detection job. + * + * @apiParam {String} jobId Job ID. + */ + router.post( + { + path: '/api/ml/anomaly_detectors/{jobId}/_update', + validate: { + params: schema.object({ + jobId: schema.string(), + }), + body: schema.object({ ...anomalyDetectionUpdateJobSchema }), + }, + }, + licensePreRoutingFactory(xpackMainPlugin, async (context, request, response) => { + try { + const { jobId } = request.params; + const results = await context.ml!.mlClient.callAsCurrentUser('ml.updateJob', { + jobId, + body: request.body, + }); + return response.ok({ + body: { ...results }, + }); + } catch (e) { + return response.customError(wrapError(e)); + } + }) + ); + + /** + * @apiGroup AnomalyDetectors + * + * @api {post} /api/ml/anomaly_detectors/:jobId/_open Open specified job + * @apiName OpenAnomalyDetectorsJob + * @apiDescription Opens an anomaly detection job. + * + * @apiParam {String} jobId Job ID. + */ + router.post( + { + path: '/api/ml/anomaly_detectors/{jobId}/_open', + validate: { + params: schema.object({ + jobId: schema.string(), + }), + }, + }, + licensePreRoutingFactory(xpackMainPlugin, async (context, request, response) => { + try { + const { jobId } = request.params; + const results = await context.ml!.mlClient.callAsCurrentUser('ml.openJob', { + jobId, + }); + return response.ok({ + body: { ...results }, + }); + } catch (e) { + return response.customError(wrapError(e)); + } + }) + ); + + /** + * @apiGroup AnomalyDetectors + * + * @api {post} /api/ml/anomaly_detectors/:jobId/_close Close specified job + * @apiName CloseAnomalyDetectorsJob + * @apiDescription Closes an anomaly detection job. + * + * @apiParam {String} jobId Job ID. + */ + router.post( + { + path: '/api/ml/anomaly_detectors/{jobId}/_close', + validate: { + params: schema.object({ + jobId: schema.string(), + }), + }, + }, + licensePreRoutingFactory(xpackMainPlugin, async (context, request, response) => { + try { + const options: { jobId: string; force?: boolean } = { + jobId: request.params.jobId, + }; + const force = request.query.force; + if (force !== undefined) { + options.force = force; + } + const results = await context.ml!.mlClient.callAsCurrentUser('ml.closeJob', options); + return response.ok({ + body: { ...results }, + }); + } catch (e) { + return response.customError(wrapError(e)); + } + }) + ); + + /** + * @apiGroup AnomalyDetectors + * + * @api {delete} /api/ml/anomaly_detectors/:jobId Delete specified job + * @apiName DeleteAnomalyDetectorsJob + * @apiDescription Deletes specified anomaly detection job. + * + * @apiParam {String} jobId Job ID. + */ + router.delete( + { + path: '/api/ml/anomaly_detectors/{jobId}', + validate: { + params: schema.object({ + jobId: schema.string(), + }), + }, + }, + licensePreRoutingFactory(xpackMainPlugin, async (context, request, response) => { + try { + const options: { jobId: string; force?: boolean } = { + jobId: request.params.jobId, + }; + const force = request.query.force; + if (force !== undefined) { + options.force = force; + } + const results = await context.ml!.mlClient.callAsCurrentUser('ml.deleteJob', options); + return response.ok({ + body: { ...results }, + }); + } catch (e) { + return response.customError(wrapError(e)); + } + }) + ); + + /** + * @apiGroup AnomalyDetectors + * + * @api {post} /api/ml/anomaly_detectors/_validate/detector Validate detector + * @apiName ValidateAnomalyDetector + * @apiDescription Validates specified detector. + * + * @apiParam {String} jobId Job ID. + */ + router.post( + { + path: '/api/ml/anomaly_detectors/_validate/detector', + validate: { + body: schema.any(), + }, + }, + licensePreRoutingFactory(xpackMainPlugin, async (context, request, response) => { + try { + const results = await context.ml!.mlClient.callAsCurrentUser('ml.validateDetector', { + body: request.body, + }); + return response.ok({ + body: { ...results }, + }); + } catch (e) { + return response.customError(wrapError(e)); + } + }) + ); + + /** + * @apiGroup AnomalyDetectors + * + * @api {post} /api/ml/anomaly_detectors/:jobId/_forecast Create forecast for specified job + * @apiName ForecastAnomalyDetector + * @apiDescription Creates a forecast for the specified anomaly detection job, predicting the future behavior of a time series by using its historical behavior. + * + * @apiParam {String} jobId Job ID. + */ + router.post( + { + path: '/api/ml/anomaly_detectors/{jobId}/_forecast', + validate: { + params: schema.object({ + jobId: schema.string(), + }), + body: schema.object({ duration: schema.any() }), + }, + }, + licensePreRoutingFactory(xpackMainPlugin, async (context, request, response) => { + try { + const jobId = request.params.jobId; + const duration = request.body.duration; + const results = await context.ml!.mlClient.callAsCurrentUser('ml.forecast', { + jobId, + duration, + }); + return response.ok({ + body: { ...results }, + }); + } catch (e) { + return response.customError(wrapError(e)); + } + }) + ); + + /** + * @apiGroup AnomalyDetectors + * + * @api {post} /api/ml/anomaly_detectors/:jobId/results/overall_buckets Obtain overall bucket scores for the specified job ID + * @apiName GetOverallBuckets + * @apiDescription Retrieves overall bucket results that summarize the bucket results of multiple anomaly detection jobs. + * + * @apiParam {String} jobId Job ID. + * + * @apiSuccess {Number} count + * @apiSuccess {Object[]} overall_buckets + */ + router.post( + { + path: '/api/ml/anomaly_detectors/{jobId}/results/overall_buckets', + validate: { + params: schema.object({ + jobId: schema.string(), + }), + body: schema.object({ + topN: schema.number(), + bucketSpan: schema.string(), + start: schema.number(), + end: schema.number(), + }), + }, + }, + licensePreRoutingFactory(xpackMainPlugin, async (context, request, response) => { + try { + const results = await context.ml!.mlClient.callAsCurrentUser('ml.overallBuckets', { + jobId: request.params.jobId, + top_n: request.body.topN, + bucket_span: request.body.bucketSpan, + start: request.body.start, + end: request.body.end, + }); + return response.ok({ + body: { ...results }, + }); + } catch (e) { + return response.customError(wrapError(e)); + } + }) + ); + + /** + * @apiGroup AnomalyDetectors + * + * @api {get} /api/ml/anomaly_detectors/:jobId/results/categories/:categoryId Get results category data by job id and category id + * @apiName GetCategories + * @apiDescription Returns the categories results for the specified job ID and category ID. + * + * @apiParam {String} jobId Job ID. + * @apiParam {String} categoryId Category ID. + */ + router.get( + { + path: '/api/ml/anomaly_detectors/{jobId}/results/categories/{categoryId}', + validate: { + params: schema.object({ + categoryId: schema.string(), + jobId: schema.string(), + }), + }, + }, + licensePreRoutingFactory(xpackMainPlugin, async (context, request, response) => { + try { + const options = { + jobId: request.params.jobId, + categoryId: request.params.categoryId, + }; + const results = await context.ml!.mlClient.callAsCurrentUser('ml.categories', options); + return response.ok({ + body: { ...results }, + }); + } catch (e) { + return response.customError(wrapError(e)); + } + }) + ); +} diff --git a/x-pack/legacy/plugins/ml/server/routes/apidoc.json b/x-pack/legacy/plugins/ml/server/routes/apidoc.json index 4a3b93b9b866f..f2ed202ae4777 100644 --- a/x-pack/legacy/plugins/ml/server/routes/apidoc.json +++ b/x-pack/legacy/plugins/ml/server/routes/apidoc.json @@ -19,6 +19,20 @@ "GetDataFrameAnalyticsMessages", "DataVisualizer", "GetOverallStats", - "GetStatsForFields" + "GetStatsForFields", + "AnomalyDetectors", + "GetAnomalyDetectors", + "GetAnomalyDetectorsById", + "GetAnomalyDetectorsStats", + "GetAnomalyDetectorsStatsById", + "CreateAnomalyDetectors", + "UpdateAnomalyDetectors", + "OpenAnomalyDetectorsJob", + "CloseAnomalyDetectorsJob", + "DeleteAnomalyDetectorsJob", + "ValidateAnomalyDetector", + "ForecastAnomalyDetector", + "GetOverallBuckets", + "GetCategories" ] } From 950ddf8917c1df04d0ae26036520b55557a14ab1 Mon Sep 17 00:00:00 2001 From: Nathan L Smith Date: Wed, 5 Feb 2020 11:20:15 -0600 Subject: [PATCH 40/86] Don't render map icons in IE 11 (#55848) As reported in #55184, the service map is completely broken in IE. This is because IE has some bugs around SVG that cause a runtime error. This change detects IE 11 and does not render those problematic icons. The result is a map that has the shapes but no SVG icons in them: https://www.dropbox.com/s/o7hp73yv5klpfqd/Screenshot%202020-01-24%2009.27.54.png?dl=0 We'll follow up in a future release with a fix to show the icons, but this makes it so the map is functional in IE. Fixes #55184. Co-authored-by: Elastic Machine --- .../apm/public/components/app/ServiceMap/icons.ts | 13 +++++++++++++ .../components/app/ServiceMap/icons/documents.svg | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/x-pack/legacy/plugins/apm/public/components/app/ServiceMap/icons.ts b/x-pack/legacy/plugins/apm/public/components/app/ServiceMap/icons.ts index 722f64c6a7e58..7d362f92154fb 100644 --- a/x-pack/legacy/plugins/apm/public/components/app/ServiceMap/icons.ts +++ b/x-pack/legacy/plugins/apm/public/components/app/ServiceMap/icons.ts @@ -46,10 +46,23 @@ const serviceIcons: { [key: string]: string } = { export const defaultIcon = getAvatarIcon(); +// IE 11 does not properly load some SVGs, which causes a runtime error and the +// map to not work at all. We would prefer to do some kind of feature detection +// rather than browser detection, but IE 11 does support SVG, just not well +// enough for our use in loading icons. +// +// This method of detecting IE is from a Stack Overflow answer: +// https://stackoverflow.com/a/21825207 +// +// @ts-ignore `documentMode` is not recognized as a valid property of `document`. +const isIE11 = !!window.MSInputMethodContext && !!document.documentMode; + export function iconForNode(node: cytoscape.NodeSingular) { const type = node.data('type'); if (type === 'service') { return serviceIcons[node.data('agentName') as string]; + } else if (isIE11) { + return defaultIcon; } else { return icons[type]; } diff --git a/x-pack/legacy/plugins/apm/public/components/app/ServiceMap/icons/documents.svg b/x-pack/legacy/plugins/apm/public/components/app/ServiceMap/icons/documents.svg index b0648d14f20ba..debe180e45661 100644 --- a/x-pack/legacy/plugins/apm/public/components/app/ServiceMap/icons/documents.svg +++ b/x-pack/legacy/plugins/apm/public/components/app/ServiceMap/icons/documents.svg @@ -1 +1 @@ - + From 27dd6dda38d7d30a3a69fa2e0450e48c7f85d547 Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Wed, 5 Feb 2020 18:35:40 +0100 Subject: [PATCH 41/86] Move lens server to new platform (#56474) --- .../plugins/apm/common/projections/typings.ts | 7 +- .../util/merge_projection/index.ts | 4 +- .../shared/KueryBar/get_bool_filter.ts | 2 +- .../plugins/apm/public/services/rest/ml.ts | 2 +- .../plugins/apm/public/utils/testHelpers.tsx | 2 +- .../lib/errors/distribution/get_buckets.ts | 2 +- .../apm/server/lib/errors/get_error_groups.ts | 2 +- .../get_environment_ui_filter_es.test.ts | 2 +- .../get_environment_ui_filter_es.ts | 2 +- .../convert_ui_filters/get_ui_filters_es.ts | 2 +- .../apm/server/lib/helpers/es_client.ts | 2 +- .../apm/server/lib/helpers/setup_request.ts | 2 +- .../metrics/fetch_and_transform_metrics.ts | 2 +- .../lib/metrics/transform_metrics_chart.ts | 4 +- .../get_service_map_service_node_info.ts | 2 +- .../lib/service_map/get_trace_sample_ids.ts | 2 +- .../server/lib/services/annotations/index.ts | 2 +- .../settings/agent_configuration/search.ts | 2 +- .../server/lib/transaction_groups/fetcher.ts | 2 +- .../__fixtures__/responses.ts | 2 +- .../avg_duration_by_browser/fetcher.ts | 2 +- .../charts/get_timeseries_data/fetcher.ts | 2 +- .../server/lib/ui_filters/get_environments.ts | 2 +- x-pack/legacy/plugins/lens/index.ts | 35 +----- .../plugins/lens/public/app_plugin/plugin.tsx | 2 +- .../embeddable/embeddable_factory.ts | 2 +- .../public/indexpattern_plugin/auto_date.ts | 2 +- .../dimension_panel/dimension_panel.tsx | 2 +- .../public/indexpattern_plugin/field_item.tsx | 2 +- .../lens/public/indexpattern_plugin/loader.ts | 4 +- .../operations/definitions/index.ts | 2 +- .../lens/public/lens_ui_telemetry/factory.ts | 2 +- .../lens/public/register_vis_type_alias.ts | 2 +- x-pack/legacy/plugins/lens/public/types.ts | 2 +- x-pack/legacy/plugins/lens/server/plugin.tsx | 57 --------- .../lib/tasks/visualizations/task_runner.ts | 2 +- .../apm/typings/elasticsearch/aggregations.ts | 30 +---- .../apm/typings/elasticsearch/index.ts | 13 +-- .../{legacy => }/plugins/lens/common/api.ts | 0 .../plugins/lens/common/constants.ts | 0 .../{legacy => }/plugins/lens/common/index.ts | 0 .../{legacy => }/plugins/lens/common/types.ts | 0 x-pack/plugins/lens/kibana.json | 8 ++ .../{legacy => }/plugins/lens/server/index.ts | 6 +- x-pack/plugins/lens/server/plugin.tsx | 62 ++++++++++ .../server/routes/existing_fields.test.ts | 0 .../lens/server/routes/existing_fields.ts | 3 +- .../plugins/lens/server/routes/field_stats.ts | 0 .../plugins/lens/server/routes/index.ts | 13 +-- .../plugins/lens/server/routes/telemetry.ts | 24 +--- .../plugins/lens/server/usage/collectors.ts | 2 +- .../plugins/lens/server/usage/index.ts | 0 .../plugins/lens/server/usage/task.ts | 108 +++++++----------- .../plugins/lens/server/usage/types.ts | 0 .../lens/server/usage/visualization_counts.ts | 18 +-- .../api_integration/apis/lens/telemetry.ts | 19 +-- 56 files changed, 187 insertions(+), 290 deletions(-) delete mode 100644 x-pack/legacy/plugins/lens/server/plugin.tsx rename x-pack/{legacy => }/plugins/apm/typings/elasticsearch/aggregations.ts (91%) rename x-pack/{legacy => }/plugins/apm/typings/elasticsearch/index.ts (84%) rename x-pack/{legacy => }/plugins/lens/common/api.ts (100%) rename x-pack/{legacy => }/plugins/lens/common/constants.ts (100%) rename x-pack/{legacy => }/plugins/lens/common/index.ts (100%) rename x-pack/{legacy => }/plugins/lens/common/types.ts (100%) create mode 100644 x-pack/plugins/lens/kibana.json rename x-pack/{legacy => }/plugins/lens/server/index.ts (55%) create mode 100644 x-pack/plugins/lens/server/plugin.tsx rename x-pack/{legacy => }/plugins/lens/server/routes/existing_fields.test.ts (100%) rename x-pack/{legacy => }/plugins/lens/server/routes/existing_fields.ts (98%) rename x-pack/{legacy => }/plugins/lens/server/routes/field_stats.ts (100%) rename x-pack/{legacy => }/plugins/lens/server/routes/index.ts (59%) rename x-pack/{legacy => }/plugins/lens/server/routes/telemetry.ts (75%) rename x-pack/{legacy => }/plugins/lens/server/usage/collectors.ts (97%) rename x-pack/{legacy => }/plugins/lens/server/usage/index.ts (100%) rename x-pack/{legacy => }/plugins/lens/server/usage/task.ts (62%) rename x-pack/{legacy => }/plugins/lens/server/usage/types.ts (100%) rename x-pack/{legacy => }/plugins/lens/server/usage/visualization_counts.ts (85%) diff --git a/x-pack/legacy/plugins/apm/common/projections/typings.ts b/x-pack/legacy/plugins/apm/common/projections/typings.ts index 2b55395b70c6b..08a7bee5412a5 100644 --- a/x-pack/legacy/plugins/apm/common/projections/typings.ts +++ b/x-pack/legacy/plugins/apm/common/projections/typings.ts @@ -4,11 +4,14 @@ * you may not use this file except in compliance with the Elastic License. */ -import { ESSearchRequest, ESSearchBody } from '../../typings/elasticsearch'; +import { + ESSearchRequest, + ESSearchBody +} from '../../../../../plugins/apm/typings/elasticsearch'; import { AggregationOptionsByType, AggregationInputMap -} from '../../typings/elasticsearch/aggregations'; +} from '../../../../../plugins/apm/typings/elasticsearch/aggregations'; export type Projection = Omit & { body: Omit & { diff --git a/x-pack/legacy/plugins/apm/common/projections/util/merge_projection/index.ts b/x-pack/legacy/plugins/apm/common/projections/util/merge_projection/index.ts index 6a5089733bb33..ef6089872b786 100644 --- a/x-pack/legacy/plugins/apm/common/projections/util/merge_projection/index.ts +++ b/x-pack/legacy/plugins/apm/common/projections/util/merge_projection/index.ts @@ -5,11 +5,11 @@ */ import { merge, isPlainObject, cloneDeep } from 'lodash'; import { DeepPartial } from 'utility-types'; -import { AggregationInputMap } from '../../../../typings/elasticsearch/aggregations'; +import { AggregationInputMap } from '../../../../../../../plugins/apm/typings/elasticsearch/aggregations'; import { ESSearchRequest, ESSearchBody -} from '../../../../typings/elasticsearch'; +} from '../../../../../../../plugins/apm/typings/elasticsearch'; import { Projection } from '../../typings'; type PlainObject = Record; diff --git a/x-pack/legacy/plugins/apm/public/components/shared/KueryBar/get_bool_filter.ts b/x-pack/legacy/plugins/apm/public/components/shared/KueryBar/get_bool_filter.ts index f4628524cced5..23feeed4b0418 100644 --- a/x-pack/legacy/plugins/apm/public/components/shared/KueryBar/get_bool_filter.ts +++ b/x-pack/legacy/plugins/apm/public/components/shared/KueryBar/get_bool_filter.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { ESFilter } from '../../../../typings/elasticsearch'; +import { ESFilter } from '../../../../../../../plugins/apm/typings/elasticsearch'; import { TRANSACTION_TYPE, ERROR_GROUP_ID, diff --git a/x-pack/legacy/plugins/apm/public/services/rest/ml.ts b/x-pack/legacy/plugins/apm/public/services/rest/ml.ts index e42b9536362e0..187a051b1b044 100644 --- a/x-pack/legacy/plugins/apm/public/services/rest/ml.ts +++ b/x-pack/legacy/plugins/apm/public/services/rest/ml.ts @@ -12,7 +12,7 @@ import { } from '../../../common/elasticsearch_fieldnames'; import { getMlJobId, getMlPrefix } from '../../../common/ml_job_constants'; import { callApi } from './callApi'; -import { ESFilter } from '../../../typings/elasticsearch'; +import { ESFilter } from '../../../../../../plugins/apm/typings/elasticsearch'; import { createCallApmApi, APMClient } from './createCallApmApi'; interface MlResponseItem { diff --git a/x-pack/legacy/plugins/apm/public/utils/testHelpers.tsx b/x-pack/legacy/plugins/apm/public/utils/testHelpers.tsx index 862c982d6b5ac..3d34f016c6591 100644 --- a/x-pack/legacy/plugins/apm/public/utils/testHelpers.tsx +++ b/x-pack/legacy/plugins/apm/public/utils/testHelpers.tsx @@ -23,7 +23,7 @@ import { ESFilter, ESSearchResponse, ESSearchRequest -} from '../../typings/elasticsearch'; +} from '../../../../../plugins/apm/typings/elasticsearch'; import { ApmPluginContext, ApmPluginContextValue diff --git a/x-pack/legacy/plugins/apm/server/lib/errors/distribution/get_buckets.ts b/x-pack/legacy/plugins/apm/server/lib/errors/distribution/get_buckets.ts index 9274f96d58d83..0f6ace39aeca3 100644 --- a/x-pack/legacy/plugins/apm/server/lib/errors/distribution/get_buckets.ts +++ b/x-pack/legacy/plugins/apm/server/lib/errors/distribution/get_buckets.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { ESFilter } from '../../../../typings/elasticsearch'; +import { ESFilter } from '../../../../../../../plugins/apm/typings/elasticsearch'; import { ERROR_GROUP_ID, PROCESSOR_EVENT, diff --git a/x-pack/legacy/plugins/apm/server/lib/errors/get_error_groups.ts b/x-pack/legacy/plugins/apm/server/lib/errors/get_error_groups.ts index aaa4ca9fb8223..92ee6a0a71f00 100644 --- a/x-pack/legacy/plugins/apm/server/lib/errors/get_error_groups.ts +++ b/x-pack/legacy/plugins/apm/server/lib/errors/get_error_groups.ts @@ -20,7 +20,7 @@ import { } from '../helpers/setup_request'; import { getErrorGroupsProjection } from '../../../common/projections/errors'; import { mergeProjection } from '../../../common/projections/util/merge_projection'; -import { SortOptions } from '../../../typings/elasticsearch/aggregations'; +import { SortOptions } from '../../../../../../plugins/apm/typings/elasticsearch/aggregations'; export type ErrorGroupListAPIResponse = PromiseReturnType< typeof getErrorGroups diff --git a/x-pack/legacy/plugins/apm/server/lib/helpers/convert_ui_filters/__test__/get_environment_ui_filter_es.test.ts b/x-pack/legacy/plugins/apm/server/lib/helpers/convert_ui_filters/__test__/get_environment_ui_filter_es.test.ts index 0f0a11a868d6d..b5061e303a40d 100644 --- a/x-pack/legacy/plugins/apm/server/lib/helpers/convert_ui_filters/__test__/get_environment_ui_filter_es.test.ts +++ b/x-pack/legacy/plugins/apm/server/lib/helpers/convert_ui_filters/__test__/get_environment_ui_filter_es.test.ts @@ -7,7 +7,7 @@ import { getEnvironmentUiFilterES } from '../get_environment_ui_filter_es'; import { ENVIRONMENT_NOT_DEFINED } from '../../../../../common/environment_filter_values'; import { SERVICE_ENVIRONMENT } from '../../../../../common/elasticsearch_fieldnames'; -import { ESFilter } from '../../../../../typings/elasticsearch'; +import { ESFilter } from '../../../../../../../../plugins/apm/typings/elasticsearch'; describe('getEnvironmentUiFilterES', () => { it('should return undefined, when environment is undefined', () => { diff --git a/x-pack/legacy/plugins/apm/server/lib/helpers/convert_ui_filters/get_environment_ui_filter_es.ts b/x-pack/legacy/plugins/apm/server/lib/helpers/convert_ui_filters/get_environment_ui_filter_es.ts index 57feaf6a6fd0e..dcf2334ab4de2 100644 --- a/x-pack/legacy/plugins/apm/server/lib/helpers/convert_ui_filters/get_environment_ui_filter_es.ts +++ b/x-pack/legacy/plugins/apm/server/lib/helpers/convert_ui_filters/get_environment_ui_filter_es.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { ESFilter } from '../../../../typings/elasticsearch'; +import { ESFilter } from '../../../../../../../plugins/apm/typings/elasticsearch'; import { ENVIRONMENT_NOT_DEFINED } from '../../../../common/environment_filter_values'; import { SERVICE_ENVIRONMENT } from '../../../../common/elasticsearch_fieldnames'; diff --git a/x-pack/legacy/plugins/apm/server/lib/helpers/convert_ui_filters/get_ui_filters_es.ts b/x-pack/legacy/plugins/apm/server/lib/helpers/convert_ui_filters/get_ui_filters_es.ts index a6f6d36ecfc81..126ee49fd4218 100644 --- a/x-pack/legacy/plugins/apm/server/lib/helpers/convert_ui_filters/get_ui_filters_es.ts +++ b/x-pack/legacy/plugins/apm/server/lib/helpers/convert_ui_filters/get_ui_filters_es.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { ESFilter } from '../../../../typings/elasticsearch'; +import { ESFilter } from '../../../../../../../plugins/apm/typings/elasticsearch'; import { UIFilters } from '../../../../typings/ui-filters'; import { getEnvironmentUiFilterES } from './get_environment_ui_filter_es'; import { diff --git a/x-pack/legacy/plugins/apm/server/lib/helpers/es_client.ts b/x-pack/legacy/plugins/apm/server/lib/helpers/es_client.ts index 737eeac95516e..2795c95a50034 100644 --- a/x-pack/legacy/plugins/apm/server/lib/helpers/es_client.ts +++ b/x-pack/legacy/plugins/apm/server/lib/helpers/es_client.ts @@ -18,7 +18,7 @@ import { OBSERVER_VERSION_MAJOR } from '../../../common/elasticsearch_fieldnames import { ESSearchResponse, ESSearchRequest -} from '../../../typings/elasticsearch'; +} from '../../../../../../plugins/apm/typings/elasticsearch'; import { APMRequestHandlerContext } from '../../routes/typings'; import { pickKeys } from '../../../public/utils/pickKeys'; import { getApmIndices } from '../settings/apm_indices/get_apm_indices'; diff --git a/x-pack/legacy/plugins/apm/server/lib/helpers/setup_request.ts b/x-pack/legacy/plugins/apm/server/lib/helpers/setup_request.ts index 56c9255844009..f8946997e6e18 100644 --- a/x-pack/legacy/plugins/apm/server/lib/helpers/setup_request.ts +++ b/x-pack/legacy/plugins/apm/server/lib/helpers/setup_request.ts @@ -12,7 +12,7 @@ import { getApmIndices, ApmIndicesConfig } from '../settings/apm_indices/get_apm_indices'; -import { ESFilter } from '../../../typings/elasticsearch'; +import { ESFilter } from '../../../../../../plugins/apm/typings/elasticsearch'; import { ESClient } from './es_client'; import { getUiFiltersES } from './convert_ui_filters/get_ui_filters_es'; import { APMRequestHandlerContext } from '../../routes/typings'; diff --git a/x-pack/legacy/plugins/apm/server/lib/metrics/fetch_and_transform_metrics.ts b/x-pack/legacy/plugins/apm/server/lib/metrics/fetch_and_transform_metrics.ts index 76460bb40bedb..410d659a924fd 100644 --- a/x-pack/legacy/plugins/apm/server/lib/metrics/fetch_and_transform_metrics.ts +++ b/x-pack/legacy/plugins/apm/server/lib/metrics/fetch_and_transform_metrics.ts @@ -15,7 +15,7 @@ import { ChartBase } from './types'; import { transformDataToMetricsChart } from './transform_metrics_chart'; import { getMetricsProjection } from '../../../common/projections/metrics'; import { mergeProjection } from '../../../common/projections/util/merge_projection'; -import { AggregationOptionsByType } from '../../../typings/elasticsearch/aggregations'; +import { AggregationOptionsByType } from '../../../../../../plugins/apm/typings/elasticsearch/aggregations'; interface Aggs { [key: string]: Unionize<{ diff --git a/x-pack/legacy/plugins/apm/server/lib/metrics/transform_metrics_chart.ts b/x-pack/legacy/plugins/apm/server/lib/metrics/transform_metrics_chart.ts index 03f21e4f26e7b..8e7c969eec96a 100644 --- a/x-pack/legacy/plugins/apm/server/lib/metrics/transform_metrics_chart.ts +++ b/x-pack/legacy/plugins/apm/server/lib/metrics/transform_metrics_chart.ts @@ -9,8 +9,8 @@ import { ChartBase } from './types'; import { ESSearchResponse, ESSearchRequest -} from '../../../typings/elasticsearch'; -import { AggregationOptionsByType } from '../../../typings/elasticsearch/aggregations'; +} from '../../../../../../plugins/apm/typings/elasticsearch'; +import { AggregationOptionsByType } from '../../../../../../plugins/apm/typings/elasticsearch/aggregations'; import { getVizColorForIndex } from '../../../common/viz_colors'; export type GenericMetricsChart = ReturnType< diff --git a/x-pack/legacy/plugins/apm/server/lib/service_map/get_service_map_service_node_info.ts b/x-pack/legacy/plugins/apm/server/lib/service_map/get_service_map_service_node_info.ts index 6c4d540103cec..cff2d8570349e 100644 --- a/x-pack/legacy/plugins/apm/server/lib/service_map/get_service_map_service_node_info.ts +++ b/x-pack/legacy/plugins/apm/server/lib/service_map/get_service_map_service_node_info.ts @@ -5,7 +5,7 @@ */ import { Setup, SetupTimeRange } from '../helpers/setup_request'; -import { ESFilter } from '../../../typings/elasticsearch'; +import { ESFilter } from '../../../../../../plugins/apm/typings/elasticsearch'; import { rangeFilter } from '../helpers/range_filter'; import { PROCESSOR_EVENT, diff --git a/x-pack/legacy/plugins/apm/server/lib/service_map/get_trace_sample_ids.ts b/x-pack/legacy/plugins/apm/server/lib/service_map/get_trace_sample_ids.ts index acf113b426608..bb5fcabb6c9d7 100644 --- a/x-pack/legacy/plugins/apm/server/lib/service_map/get_trace_sample_ids.ts +++ b/x-pack/legacy/plugins/apm/server/lib/service_map/get_trace_sample_ids.ts @@ -10,7 +10,7 @@ import { SetupTimeRange } from '../helpers/setup_request'; import { rangeFilter } from '../helpers/range_filter'; -import { ESFilter } from '../../../typings/elasticsearch'; +import { ESFilter } from '../../../../../../plugins/apm/typings/elasticsearch'; import { PROCESSOR_EVENT, SERVICE_NAME, diff --git a/x-pack/legacy/plugins/apm/server/lib/services/annotations/index.ts b/x-pack/legacy/plugins/apm/server/lib/services/annotations/index.ts index c03746ca220ee..9c8e4f2281b5e 100644 --- a/x-pack/legacy/plugins/apm/server/lib/services/annotations/index.ts +++ b/x-pack/legacy/plugins/apm/server/lib/services/annotations/index.ts @@ -5,7 +5,7 @@ */ import { isNumber } from 'lodash'; import { Annotation, AnnotationType } from '../../../../common/annotations'; -import { ESFilter } from '../../../../typings/elasticsearch'; +import { ESFilter } from '../../../../../../../plugins/apm/typings/elasticsearch'; import { SERVICE_NAME, SERVICE_ENVIRONMENT, diff --git a/x-pack/legacy/plugins/apm/server/lib/settings/agent_configuration/search.ts b/x-pack/legacy/plugins/apm/server/lib/settings/agent_configuration/search.ts index 766baead006b6..3f4225eaf22d6 100644 --- a/x-pack/legacy/plugins/apm/server/lib/settings/agent_configuration/search.ts +++ b/x-pack/legacy/plugins/apm/server/lib/settings/agent_configuration/search.ts @@ -3,7 +3,7 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import { ESSearchHit } from '../../../../typings/elasticsearch'; +import { ESSearchHit } from '../../../../../../../plugins/apm/typings/elasticsearch'; import { SERVICE_NAME, SERVICE_ENVIRONMENT diff --git a/x-pack/legacy/plugins/apm/server/lib/transaction_groups/fetcher.ts b/x-pack/legacy/plugins/apm/server/lib/transaction_groups/fetcher.ts index a4885f2884976..18c61df0cfa7e 100644 --- a/x-pack/legacy/plugins/apm/server/lib/transaction_groups/fetcher.ts +++ b/x-pack/legacy/plugins/apm/server/lib/transaction_groups/fetcher.ts @@ -13,7 +13,7 @@ import { import { getTransactionGroupsProjection } from '../../../common/projections/transaction_groups'; import { mergeProjection } from '../../../common/projections/util/merge_projection'; import { PromiseReturnType } from '../../../typings/common'; -import { SortOptions } from '../../../typings/elasticsearch/aggregations'; +import { SortOptions } from '../../../../../../plugins/apm/typings/elasticsearch/aggregations'; import { Transaction } from '../../../typings/es_schemas/ui/Transaction'; import { Setup, diff --git a/x-pack/legacy/plugins/apm/server/lib/transactions/avg_duration_by_browser/__fixtures__/responses.ts b/x-pack/legacy/plugins/apm/server/lib/transactions/avg_duration_by_browser/__fixtures__/responses.ts index 3f0f8a84dc62f..9a9bfc31c21d4 100644 --- a/x-pack/legacy/plugins/apm/server/lib/transactions/avg_duration_by_browser/__fixtures__/responses.ts +++ b/x-pack/legacy/plugins/apm/server/lib/transactions/avg_duration_by_browser/__fixtures__/responses.ts @@ -7,7 +7,7 @@ import { ESSearchResponse, ESSearchRequest -} from '../../../../../typings/elasticsearch'; +} from '../../../../../../../../plugins/apm/typings/elasticsearch'; export const response = ({ hits: { diff --git a/x-pack/legacy/plugins/apm/server/lib/transactions/avg_duration_by_browser/fetcher.ts b/x-pack/legacy/plugins/apm/server/lib/transactions/avg_duration_by_browser/fetcher.ts index 8a96a25aef50e..9b0d704dbb43e 100644 --- a/x-pack/legacy/plugins/apm/server/lib/transactions/avg_duration_by_browser/fetcher.ts +++ b/x-pack/legacy/plugins/apm/server/lib/transactions/avg_duration_by_browser/fetcher.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { ESFilter } from '../../../../typings/elasticsearch'; +import { ESFilter } from '../../../../../../../plugins/apm/typings/elasticsearch'; import { PromiseReturnType } from '../../../../typings/common'; import { PROCESSOR_EVENT, diff --git a/x-pack/legacy/plugins/apm/server/lib/transactions/charts/get_timeseries_data/fetcher.ts b/x-pack/legacy/plugins/apm/server/lib/transactions/charts/get_timeseries_data/fetcher.ts index 8a2e01c9a7891..67b807da59b9b 100644 --- a/x-pack/legacy/plugins/apm/server/lib/transactions/charts/get_timeseries_data/fetcher.ts +++ b/x-pack/legacy/plugins/apm/server/lib/transactions/charts/get_timeseries_data/fetcher.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { ESFilter } from '../../../../../typings/elasticsearch'; +import { ESFilter } from '../../../../../../../../plugins/apm/typings/elasticsearch'; import { PROCESSOR_EVENT, SERVICE_NAME, diff --git a/x-pack/legacy/plugins/apm/server/lib/ui_filters/get_environments.ts b/x-pack/legacy/plugins/apm/server/lib/ui_filters/get_environments.ts index 50c1926d1e4a0..05985ee95a207 100644 --- a/x-pack/legacy/plugins/apm/server/lib/ui_filters/get_environments.ts +++ b/x-pack/legacy/plugins/apm/server/lib/ui_filters/get_environments.ts @@ -12,7 +12,7 @@ import { import { rangeFilter } from '../helpers/range_filter'; import { Setup, SetupTimeRange } from '../helpers/setup_request'; import { ENVIRONMENT_NOT_DEFINED } from '../../../common/environment_filter_values'; -import { ESFilter } from '../../../typings/elasticsearch'; +import { ESFilter } from '../../../../../../plugins/apm/typings/elasticsearch'; export async function getEnvironments( setup: Setup & SetupTimeRange, diff --git a/x-pack/legacy/plugins/lens/index.ts b/x-pack/legacy/plugins/lens/index.ts index a4eb24d4a4de4..bb0bf9b67ee2c 100644 --- a/x-pack/legacy/plugins/lens/index.ts +++ b/x-pack/legacy/plugins/lens/index.ts @@ -7,11 +7,12 @@ import * as Joi from 'joi'; import { resolve } from 'path'; import { LegacyPluginInitializer } from 'src/legacy/types'; -import KbnServer, { Server } from 'src/legacy/server/kbn_server'; import mappings from './mappings.json'; -import { PLUGIN_ID, getEditPath, NOT_INTERNATIONALIZED_PRODUCT_NAME } from './common'; -import { lensServerPlugin } from './server'; -import { getTaskManagerSetup, getTaskManagerStart } from '../task_manager/server'; +import { + PLUGIN_ID, + getEditPath, + NOT_INTERNATIONALIZED_PRODUCT_NAME, +} from '../../../plugins/lens/common'; export const lens: LegacyPluginInitializer = kibana => { return new kibana.Plugin({ @@ -51,31 +52,5 @@ export const lens: LegacyPluginInitializer = kibana => { enabled: Joi.boolean().default(true), }).default(); }, - - init(server: Server) { - const kbnServer = (server as unknown) as KbnServer; - - // Set up with the new platform plugin lifecycle API. - const plugin = lensServerPlugin(); - const { usageCollection } = server.newPlatform.setup.plugins; - - plugin.setup(kbnServer.newPlatform.setup.core, { - usageCollection, - // Legacy APIs - savedObjects: server.savedObjects, - config: server.config(), - server, - taskManager: getTaskManagerSetup(server)!, - }); - - plugin.start(kbnServer.newPlatform.start.core, { - server, - taskManager: getTaskManagerStart(server)!, - }); - - server.events.on('stop', () => { - plugin.stop(); - }); - }, }); }; diff --git a/x-pack/legacy/plugins/lens/public/app_plugin/plugin.tsx b/x-pack/legacy/plugins/lens/public/app_plugin/plugin.tsx index f7d9ae5741afb..5efbd4b613a3e 100644 --- a/x-pack/legacy/plugins/lens/public/app_plugin/plugin.tsx +++ b/x-pack/legacy/plugins/lens/public/app_plugin/plugin.tsx @@ -40,7 +40,7 @@ import { stopReportManager, trackUiEvent, } from '../lens_ui_telemetry'; -import { NOT_INTERNATIONALIZED_PRODUCT_NAME } from '../../common'; +import { NOT_INTERNATIONALIZED_PRODUCT_NAME } from '../../../../../plugins/lens/common'; import { KibanaLegacySetup } from '../../../../../../src/plugins/kibana_legacy/public'; import { EditorFrameStart } from '../types'; import { diff --git a/x-pack/legacy/plugins/lens/public/editor_frame_plugin/embeddable/embeddable_factory.ts b/x-pack/legacy/plugins/lens/public/editor_frame_plugin/embeddable/embeddable_factory.ts index 03a21a9b364c1..629efdbdb460b 100644 --- a/x-pack/legacy/plugins/lens/public/editor_frame_plugin/embeddable/embeddable_factory.ts +++ b/x-pack/legacy/plugins/lens/public/editor_frame_plugin/embeddable/embeddable_factory.ts @@ -19,7 +19,7 @@ import { } from '../../../../../../../src/legacy/core_plugins/embeddable_api/public/np_ready/public'; import { Embeddable } from './embeddable'; import { SavedObjectIndexStore, DOC_TYPE } from '../../persistence'; -import { getEditPath } from '../../../common'; +import { getEditPath } from '../../../../../../plugins/lens/common'; export class EmbeddableFactory extends AbstractEmbeddableFactory { type = DOC_TYPE; diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_plugin/auto_date.ts b/x-pack/legacy/plugins/lens/public/indexpattern_plugin/auto_date.ts index b62585f5da09a..7720af8ee9001 100644 --- a/x-pack/legacy/plugins/lens/public/indexpattern_plugin/auto_date.ts +++ b/x-pack/legacy/plugins/lens/public/indexpattern_plugin/auto_date.ts @@ -10,7 +10,7 @@ import { ExpressionFunction, KibanaContext, } from '../../../../../../src/plugins/expressions/public'; -import { DateRange } from '../../common'; +import { DateRange } from '../../../../../plugins/lens/common'; interface LensAutoDateProps { aggConfigs: string; diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_plugin/dimension_panel/dimension_panel.tsx b/x-pack/legacy/plugins/lens/public/indexpattern_plugin/dimension_panel/dimension_panel.tsx index dfeb8632d096e..972c396f93b43 100644 --- a/x-pack/legacy/plugins/lens/public/indexpattern_plugin/dimension_panel/dimension_panel.tsx +++ b/x-pack/legacy/plugins/lens/public/indexpattern_plugin/dimension_panel/dimension_panel.tsx @@ -19,7 +19,7 @@ import { changeColumn, deleteColumn } from '../state_helpers'; import { isDraggedField, hasField } from '../utils'; import { IndexPatternPrivateState, IndexPatternField } from '../types'; import { trackUiEvent } from '../../lens_ui_telemetry'; -import { DateRange } from '../../../common'; +import { DateRange } from '../../../../../../plugins/lens/common'; export type IndexPatternDimensionPanelProps = DatasourceDimensionPanelProps & { state: IndexPatternPrivateState; diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_plugin/field_item.tsx b/x-pack/legacy/plugins/lens/public/indexpattern_plugin/field_item.tsx index 4a58f0354882a..2aec28181f02b 100644 --- a/x-pack/legacy/plugins/lens/public/indexpattern_plugin/field_item.tsx +++ b/x-pack/legacy/plugins/lens/public/indexpattern_plugin/field_item.tsx @@ -44,7 +44,7 @@ import { import { DraggedField } from './indexpattern'; import { DragDrop } from '../drag_drop'; import { DatasourceDataPanelProps, DataType } from '../types'; -import { BucketedAggregation, FieldStatsResponse } from '../../common'; +import { BucketedAggregation, FieldStatsResponse } from '../../../../../plugins/lens/common'; import { IndexPattern, IndexPatternField } from './types'; import { getColorForDataType, LensFieldIcon } from './lens_field_icon'; import { trackUiEvent } from '../lens_ui_telemetry'; diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_plugin/loader.ts b/x-pack/legacy/plugins/lens/public/indexpattern_plugin/loader.ts index f0692f120f9b5..e37c5db09ca74 100644 --- a/x-pack/legacy/plugins/lens/public/indexpattern_plugin/loader.ts +++ b/x-pack/legacy/plugins/lens/public/indexpattern_plugin/loader.ts @@ -17,8 +17,8 @@ import { IndexPatternField, } from './types'; import { updateLayerIndexPattern } from './state_helpers'; -import { DateRange, ExistingFields } from '../../common/types'; -import { BASE_API_URL } from '../../common'; +import { DateRange, ExistingFields } from '../../../../../plugins/lens/common/types'; +import { BASE_API_URL } from '../../../../../plugins/lens/common'; import { documentField } from './document_field'; import { isNestedField, IFieldType, TypeMeta } from '../../../../../../src/plugins/data/public'; diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_plugin/operations/definitions/index.ts b/x-pack/legacy/plugins/lens/public/indexpattern_plugin/operations/definitions/index.ts index 63e4564878e31..f357038be41a4 100644 --- a/x-pack/legacy/plugins/lens/public/indexpattern_plugin/operations/definitions/index.ts +++ b/x-pack/legacy/plugins/lens/public/indexpattern_plugin/operations/definitions/index.ts @@ -14,7 +14,7 @@ import { countOperation } from './count'; import { DimensionPriority, StateSetter, OperationMetadata } from '../../../types'; import { BaseIndexPatternColumn } from './column_types'; import { IndexPatternPrivateState, IndexPattern, IndexPatternField } from '../../types'; -import { DateRange } from '../../../../common'; +import { DateRange } from '../../../../../../../plugins/lens/common'; // List of all operation definitions registered to this data source. // If you want to implement a new operation, add it to this array and diff --git a/x-pack/legacy/plugins/lens/public/lens_ui_telemetry/factory.ts b/x-pack/legacy/plugins/lens/public/lens_ui_telemetry/factory.ts index babc65969afb5..73750a65c50b8 100644 --- a/x-pack/legacy/plugins/lens/public/lens_ui_telemetry/factory.ts +++ b/x-pack/legacy/plugins/lens/public/lens_ui_telemetry/factory.ts @@ -8,7 +8,7 @@ import moment from 'moment'; import { HttpSetup } from 'src/core/public'; import { IStorageWrapper } from 'src/plugins/kibana_utils/public'; -import { BASE_API_URL } from '../../common'; +import { BASE_API_URL } from '../../../../../plugins/lens/common'; const STORAGE_KEY = 'lens-ui-telemetry'; diff --git a/x-pack/legacy/plugins/lens/public/register_vis_type_alias.ts b/x-pack/legacy/plugins/lens/public/register_vis_type_alias.ts index 0c4e6d9f7cb10..f71796268065b 100644 --- a/x-pack/legacy/plugins/lens/public/register_vis_type_alias.ts +++ b/x-pack/legacy/plugins/lens/public/register_vis_type_alias.ts @@ -6,7 +6,7 @@ import { i18n } from '@kbn/i18n'; import { setup as visualizations } from '../../../../../src/legacy/core_plugins/visualizations/public/np_ready/public/legacy'; -import { getBasePath, getEditPath } from '../common'; +import { getBasePath, getEditPath } from '../../../../plugins/lens/common'; visualizations.types.registerAlias({ aliasUrl: getBasePath(), diff --git a/x-pack/legacy/plugins/lens/public/types.ts b/x-pack/legacy/plugins/lens/public/types.ts index 923e0aff5ae0e..e2157deb43e49 100644 --- a/x-pack/legacy/plugins/lens/public/types.ts +++ b/x-pack/legacy/plugins/lens/public/types.ts @@ -11,7 +11,7 @@ import { SavedQuery } from 'src/legacy/core_plugins/data/public'; import { KibanaDatatable } from '../../../../../src/plugins/expressions/public'; import { DragContextState } from './drag_drop'; import { Document } from './persistence'; -import { DateRange } from '../common'; +import { DateRange } from '../../../../plugins/lens/common'; import { Query, esFilters } from '../../../../../src/plugins/data/public'; // eslint-disable-next-line diff --git a/x-pack/legacy/plugins/lens/server/plugin.tsx b/x-pack/legacy/plugins/lens/server/plugin.tsx deleted file mode 100644 index f80d52248b484..0000000000000 --- a/x-pack/legacy/plugins/lens/server/plugin.tsx +++ /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; - * you may not use this file except in compliance with the Elastic License. - */ - -import { Server, KibanaConfig } from 'src/legacy/server/kbn_server'; -import { Plugin, CoreSetup, CoreStart, SavedObjectsLegacyService } from 'src/core/server'; -import { UsageCollectionSetup } from 'src/plugins/usage_collection/server'; -import { Subject } from 'rxjs'; -import { first } from 'rxjs/operators'; -import { - TaskManagerSetupContract, - TaskManagerStartContract, -} from '../../../../plugins/task_manager/server'; -import { setupRoutes } from './routes'; -import { - registerLensUsageCollector, - initializeLensTelemetry, - scheduleLensTelemetry, -} from './usage'; - -export interface PluginSetupContract { - savedObjects: SavedObjectsLegacyService; - usageCollection: UsageCollectionSetup; - config: KibanaConfig; - server: Server; - taskManager: TaskManagerSetupContract; -} - -export interface PluginStartContract { - server: Server; - taskManager: TaskManagerStartContract; -} - -const taskManagerStartContract$ = new Subject(); - -export class LensServer implements Plugin<{}, {}, {}, {}> { - setup(core: CoreSetup, plugins: PluginSetupContract) { - setupRoutes(core, plugins); - registerLensUsageCollector( - plugins.usageCollection, - taskManagerStartContract$.pipe(first()).toPromise() - ); - initializeLensTelemetry(plugins.server, plugins.taskManager); - return {}; - } - - start(core: CoreStart, plugins: PluginStartContract) { - scheduleLensTelemetry(plugins.server, plugins.taskManager); - taskManagerStartContract$.next(plugins.taskManager); - taskManagerStartContract$.complete(); - return {}; - } - - stop() {} -} diff --git a/x-pack/legacy/plugins/oss_telemetry/server/lib/tasks/visualizations/task_runner.ts b/x-pack/legacy/plugins/oss_telemetry/server/lib/tasks/visualizations/task_runner.ts index 0b7b301df12bf..4c7525645a2c2 100644 --- a/x-pack/legacy/plugins/oss_telemetry/server/lib/tasks/visualizations/task_runner.ts +++ b/x-pack/legacy/plugins/oss_telemetry/server/lib/tasks/visualizations/task_runner.ts @@ -9,7 +9,7 @@ import { APICaller, CoreSetup } from 'kibana/server'; import { getNextMidnight } from '../../get_next_midnight'; import { VisState } from '../../../../../../../../src/legacy/core_plugins/visualizations/public'; import { TaskInstance } from '../../../../../../../plugins/task_manager/server'; -import { ESSearchHit } from '../../../../../apm/typings/elasticsearch'; +import { ESSearchHit } from '../../../../../../../plugins/apm/typings/elasticsearch'; import { LegacyConfig } from '../../../plugin'; interface VisSummary { diff --git a/x-pack/legacy/plugins/apm/typings/elasticsearch/aggregations.ts b/x-pack/plugins/apm/typings/elasticsearch/aggregations.ts similarity index 91% rename from x-pack/legacy/plugins/apm/typings/elasticsearch/aggregations.ts rename to x-pack/plugins/apm/typings/elasticsearch/aggregations.ts index 6d3620f11a87b..2ee8df7b5d1e1 100644 --- a/x-pack/legacy/plugins/apm/typings/elasticsearch/aggregations.ts +++ b/x-pack/plugins/apm/typings/elasticsearch/aggregations.ts @@ -147,19 +147,13 @@ type BucketSubAggregationResponse< ? AggregationResponseMap : {}; -interface AggregationResponsePart< - TAggregationOptionsMap extends AggregationOptionsMap, - TDocument -> { +interface AggregationResponsePart { terms: { buckets: Array< { doc_count: number; key: string | number; - } & BucketSubAggregationResponse< - TAggregationOptionsMap['aggs'], - TDocument - > + } & BucketSubAggregationResponse >; }; histogram: { @@ -167,10 +161,7 @@ interface AggregationResponsePart< { doc_count: number; key: number; - } & BucketSubAggregationResponse< - TAggregationOptionsMap['aggs'], - TDocument - > + } & BucketSubAggregationResponse >; }; date_histogram: { @@ -179,10 +170,7 @@ interface AggregationResponsePart< doc_count: number; key: number; key_as_string: string; - } & BucketSubAggregationResponse< - TAggregationOptionsMap['aggs'], - TDocument - > + } & BucketSubAggregationResponse >; }; avg: MetricsAggregationResponsePart; @@ -227,10 +215,7 @@ interface AggregationResponsePart< } & AggregationResponseMap; filters: TAggregationOptionsMap extends { filters: { filters: any[] } } ? Array< - { doc_count: number } & AggregationResponseMap< - TAggregationOptionsMap['aggs'], - TDocument - > + { doc_count: number } & AggregationResponseMap > : TAggregationOptionsMap extends { filters: { @@ -264,10 +249,7 @@ interface AggregationResponsePart< { key: Record, number>; doc_count: number; - } & BucketSubAggregationResponse< - TAggregationOptionsMap['aggs'], - TDocument - > + } & BucketSubAggregationResponse >; }; diversified_sampler: { diff --git a/x-pack/legacy/plugins/apm/typings/elasticsearch/index.ts b/x-pack/plugins/apm/typings/elasticsearch/index.ts similarity index 84% rename from x-pack/legacy/plugins/apm/typings/elasticsearch/index.ts rename to x-pack/plugins/apm/typings/elasticsearch/index.ts index 064b684cf9aa6..e1d4aaeb597e2 100644 --- a/x-pack/legacy/plugins/apm/typings/elasticsearch/index.ts +++ b/x-pack/plugins/apm/typings/elasticsearch/index.ts @@ -31,10 +31,7 @@ export type ESSearchResponse< > = Omit, 'aggregations' | 'hits'> & (TSearchRequest extends { body: { aggs: AggregationInputMap } } ? { - aggregations?: AggregationResponseMap< - TSearchRequest['body']['aggs'], - TDocument - >; + aggregations?: AggregationResponseMap; } : {}) & { hits: Omit['hits'], 'total'> & @@ -52,12 +49,6 @@ export type ESSearchResponse< export interface ESFilter { [key: string]: { - [key: string]: - | string - | string[] - | number - | boolean - | Record - | ESFilter[]; + [key: string]: string | string[] | number | boolean | Record | ESFilter[]; }; } diff --git a/x-pack/legacy/plugins/lens/common/api.ts b/x-pack/plugins/lens/common/api.ts similarity index 100% rename from x-pack/legacy/plugins/lens/common/api.ts rename to x-pack/plugins/lens/common/api.ts diff --git a/x-pack/legacy/plugins/lens/common/constants.ts b/x-pack/plugins/lens/common/constants.ts similarity index 100% rename from x-pack/legacy/plugins/lens/common/constants.ts rename to x-pack/plugins/lens/common/constants.ts diff --git a/x-pack/legacy/plugins/lens/common/index.ts b/x-pack/plugins/lens/common/index.ts similarity index 100% rename from x-pack/legacy/plugins/lens/common/index.ts rename to x-pack/plugins/lens/common/index.ts diff --git a/x-pack/legacy/plugins/lens/common/types.ts b/x-pack/plugins/lens/common/types.ts similarity index 100% rename from x-pack/legacy/plugins/lens/common/types.ts rename to x-pack/plugins/lens/common/types.ts diff --git a/x-pack/plugins/lens/kibana.json b/x-pack/plugins/lens/kibana.json new file mode 100644 index 0000000000000..867a7454f0448 --- /dev/null +++ b/x-pack/plugins/lens/kibana.json @@ -0,0 +1,8 @@ +{ + "id": "lens", + "version": "8.0.0", + "kibanaVersion": "kibana", + "server": true, + "ui": false, + "optionalPlugins": ["usageCollection", "taskManager"] +} diff --git a/x-pack/legacy/plugins/lens/server/index.ts b/x-pack/plugins/lens/server/index.ts similarity index 55% rename from x-pack/legacy/plugins/lens/server/index.ts rename to x-pack/plugins/lens/server/index.ts index ae14d1c5a0052..3b9e94986d247 100644 --- a/x-pack/legacy/plugins/lens/server/index.ts +++ b/x-pack/plugins/lens/server/index.ts @@ -4,8 +4,10 @@ * you may not use this file except in compliance with the Elastic License. */ -import { LensServer } from './plugin'; +import { PluginInitializerContext } from 'kibana/server'; +import { LensServerPlugin } from './plugin'; export * from './plugin'; -export const lensServerPlugin = () => new LensServer(); +export const plugin = (initializerContext: PluginInitializerContext) => + new LensServerPlugin(initializerContext); diff --git a/x-pack/plugins/lens/server/plugin.tsx b/x-pack/plugins/lens/server/plugin.tsx new file mode 100644 index 0000000000000..e805f9f7e0a92 --- /dev/null +++ b/x-pack/plugins/lens/server/plugin.tsx @@ -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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { Plugin, CoreSetup, CoreStart, PluginInitializerContext, Logger } from 'src/core/server'; +import { UsageCollectionSetup } from 'src/plugins/usage_collection/server'; +import { Observable } from 'rxjs'; +import { TaskManagerSetupContract, TaskManagerStartContract } from '../../task_manager/server'; +import { setupRoutes } from './routes'; +import { + registerLensUsageCollector, + initializeLensTelemetry, + scheduleLensTelemetry, +} from './usage'; + +export interface PluginSetupContract { + usageCollection?: UsageCollectionSetup; + taskManager?: TaskManagerSetupContract; +} + +export interface PluginStartContract { + taskManager?: TaskManagerStartContract; +} + +export class LensServerPlugin implements Plugin<{}, {}, {}, {}> { + private readonly kibanaIndexConfig: Observable<{ kibana: { index: string } }>; + private readonly telemetryLogger: Logger; + + constructor(initializerContext: PluginInitializerContext) { + this.kibanaIndexConfig = initializerContext.config.legacy.globalConfig$; + this.telemetryLogger = initializerContext.logger.get('telemetry'); + } + setup(core: CoreSetup, plugins: PluginSetupContract) { + setupRoutes(core); + if (plugins.usageCollection && plugins.taskManager) { + registerLensUsageCollector( + plugins.usageCollection, + core + .getStartServices() + .then(([_, { taskManager }]) => taskManager as TaskManagerStartContract) + ); + initializeLensTelemetry( + this.telemetryLogger, + core, + this.kibanaIndexConfig, + plugins.taskManager + ); + } + return {}; + } + + start(core: CoreStart, plugins: PluginStartContract) { + if (plugins.taskManager) { + scheduleLensTelemetry(this.telemetryLogger, plugins.taskManager); + } + return {}; + } + + stop() {} +} diff --git a/x-pack/legacy/plugins/lens/server/routes/existing_fields.test.ts b/x-pack/plugins/lens/server/routes/existing_fields.test.ts similarity index 100% rename from x-pack/legacy/plugins/lens/server/routes/existing_fields.test.ts rename to x-pack/plugins/lens/server/routes/existing_fields.test.ts diff --git a/x-pack/legacy/plugins/lens/server/routes/existing_fields.ts b/x-pack/plugins/lens/server/routes/existing_fields.ts similarity index 98% rename from x-pack/legacy/plugins/lens/server/routes/existing_fields.ts rename to x-pack/plugins/lens/server/routes/existing_fields.ts index 30ded3572cae7..a059e32585909 100644 --- a/x-pack/legacy/plugins/lens/server/routes/existing_fields.ts +++ b/x-pack/plugins/lens/server/routes/existing_fields.ts @@ -6,11 +6,10 @@ import Boom from 'boom'; import { schema } from '@kbn/config-schema'; -import _ from 'lodash'; import { IScopedClusterClient, SavedObject, RequestHandlerContext } from 'src/core/server'; import { CoreSetup } from 'src/core/server'; import { BASE_API_URL } from '../../common'; -import { IndexPatternsFetcher } from '../../../../../../src/plugins/data/server'; +import { IndexPatternsFetcher } from '../../../../../src/plugins/data/server'; /** * The number of docs to sample to determine field empty status. diff --git a/x-pack/legacy/plugins/lens/server/routes/field_stats.ts b/x-pack/plugins/lens/server/routes/field_stats.ts similarity index 100% rename from x-pack/legacy/plugins/lens/server/routes/field_stats.ts rename to x-pack/plugins/lens/server/routes/field_stats.ts diff --git a/x-pack/legacy/plugins/lens/server/routes/index.ts b/x-pack/plugins/lens/server/routes/index.ts similarity index 59% rename from x-pack/legacy/plugins/lens/server/routes/index.ts rename to x-pack/plugins/lens/server/routes/index.ts index 79690b40395d6..8bc04a56e16d5 100644 --- a/x-pack/legacy/plugins/lens/server/routes/index.ts +++ b/x-pack/plugins/lens/server/routes/index.ts @@ -4,20 +4,13 @@ * you may not use this file except in compliance with the Elastic License. */ -import { KibanaConfig } from 'src/legacy/server/kbn_server'; -import { CoreSetup, SavedObjectsLegacyService } from 'src/core/server'; +import { CoreSetup } from 'src/core/server'; import { existingFieldsRoute } from './existing_fields'; import { initFieldsRoute } from './field_stats'; import { initLensUsageRoute } from './telemetry'; -export function setupRoutes( - setup: CoreSetup, - plugins: { - savedObjects: SavedObjectsLegacyService; - config: KibanaConfig; - } -) { +export function setupRoutes(setup: CoreSetup) { existingFieldsRoute(setup); initFieldsRoute(setup); - initLensUsageRoute(setup, plugins); + initLensUsageRoute(setup); } diff --git a/x-pack/legacy/plugins/lens/server/routes/telemetry.ts b/x-pack/plugins/lens/server/routes/telemetry.ts similarity index 75% rename from x-pack/legacy/plugins/lens/server/routes/telemetry.ts rename to x-pack/plugins/lens/server/routes/telemetry.ts index 895b77cfa8978..7925416ff5df2 100644 --- a/x-pack/legacy/plugins/lens/server/routes/telemetry.ts +++ b/x-pack/plugins/lens/server/routes/telemetry.ts @@ -5,29 +5,13 @@ */ import Boom from 'boom'; -import { KibanaConfig } from 'src/legacy/server/kbn_server'; -import { CoreSetup, SavedObjectsLegacyService } from 'src/core/server'; +import { CoreSetup } from 'src/core/server'; import { schema } from '@kbn/config-schema'; import { BASE_API_URL } from '../../common'; -export function getSavedObjectsClient( - savedObjects: SavedObjectsLegacyService, - callAsInternalUser: unknown -) { - const { SavedObjectsClient, getSavedObjectsRepository } = savedObjects; - const internalRepository = getSavedObjectsRepository(callAsInternalUser); - return new SavedObjectsClient(internalRepository); -} - // This route is responsible for taking a batch of click events from the browser // and writing them to saved objects -export async function initLensUsageRoute( - setup: CoreSetup, - plugins: { - savedObjects: SavedObjectsLegacyService; - config: KibanaConfig; - } -) { +export async function initLensUsageRoute(setup: CoreSetup) { const router = setup.http.createRouter(); router.post( { @@ -43,12 +27,10 @@ export async function initLensUsageRoute( }, }, async (context, req, res) => { - const { dataClient } = context.core.elasticsearch; - const { events, suggestionEvents } = req.body; try { - const client = getSavedObjectsClient(plugins.savedObjects, dataClient.callAsCurrentUser); + const client = context.core.savedObjects.client; const allEvents: Array<{ type: 'lens-ui-telemetry'; diff --git a/x-pack/legacy/plugins/lens/server/usage/collectors.ts b/x-pack/plugins/lens/server/usage/collectors.ts similarity index 97% rename from x-pack/legacy/plugins/lens/server/usage/collectors.ts rename to x-pack/plugins/lens/server/usage/collectors.ts index 666b3718d5125..52de0df6fed13 100644 --- a/x-pack/legacy/plugins/lens/server/usage/collectors.ts +++ b/x-pack/plugins/lens/server/usage/collectors.ts @@ -7,7 +7,7 @@ import moment from 'moment'; import { get } from 'lodash'; import { UsageCollectionSetup } from 'src/plugins/usage_collection/server'; -import { TaskManagerStartContract } from '../../../../../plugins/task_manager/server'; +import { TaskManagerStartContract } from '../../../task_manager/server'; import { LensUsage, LensTelemetryState } from './types'; diff --git a/x-pack/legacy/plugins/lens/server/usage/index.ts b/x-pack/plugins/lens/server/usage/index.ts similarity index 100% rename from x-pack/legacy/plugins/lens/server/usage/index.ts rename to x-pack/plugins/lens/server/usage/index.ts diff --git a/x-pack/legacy/plugins/lens/server/usage/task.ts b/x-pack/plugins/lens/server/usage/task.ts similarity index 62% rename from x-pack/legacy/plugins/lens/server/usage/task.ts rename to x-pack/plugins/lens/server/usage/task.ts index 26b44832feaa6..e2462be149745 100644 --- a/x-pack/legacy/plugins/lens/server/usage/task.ts +++ b/x-pack/plugins/lens/server/usage/task.ts @@ -4,24 +4,17 @@ * you may not use this file except in compliance with the Elastic License. */ +import { APICaller, CoreSetup, Logger } from 'kibana/server'; +import { Observable } from 'rxjs'; import moment from 'moment'; -import KbnServer, { Server } from 'src/legacy/server/kbn_server'; -import { CallClusterOptions } from 'src/legacy/core_plugins/elasticsearch'; -import { - SearchParams, - DeleteDocumentByQueryParams, - SearchResponse, - DeleteDocumentByQueryResponse, -} from 'elasticsearch'; -import { ESSearchResponse } from '../../../apm/typings/elasticsearch'; -import { XPackMainPlugin } from '../../../xpack_main/server/xpack_main'; import { RunContext, TaskManagerSetupContract, TaskManagerStartContract, -} from '../../../../../plugins/task_manager/server'; +} from '../../../task_manager/server'; import { getVisualizationCounts } from './visualization_counts'; +import { ESSearchResponse } from '../../../apm/typings/elasticsearch'; // This task is responsible for running daily and aggregating all the Lens click event objects // into daily rolled-up documents, which will be used in reporting click stats @@ -30,74 +23,53 @@ const TELEMETRY_TASK_TYPE = 'lens_telemetry'; export const TASK_ID = `Lens-${TELEMETRY_TASK_TYPE}`; -type ClusterSearchType = ( - endpoint: 'search', - params: SearchParams & { - rest_total_hits_as_int: boolean; - }, - options?: CallClusterOptions -) => Promise>; -type ClusterDeleteType = ( - endpoint: 'deleteByQuery', - params: DeleteDocumentByQueryParams, - options?: CallClusterOptions -) => Promise; - -export function initializeLensTelemetry(server: Server, taskManager?: TaskManagerSetupContract) { - if (!taskManager) { - server.log(['debug', 'telemetry'], `Task manager is not available`); - } else { - registerLensTelemetryTask(server, taskManager); - } +export function initializeLensTelemetry( + logger: Logger, + core: CoreSetup, + config: Observable<{ kibana: { index: string } }>, + taskManager: TaskManagerSetupContract +) { + registerLensTelemetryTask(logger, core, config, taskManager); } -export function scheduleLensTelemetry(server: Server, taskManager?: TaskManagerStartContract) { +export function scheduleLensTelemetry(logger: Logger, taskManager?: TaskManagerStartContract) { if (taskManager) { - scheduleTasks(server, taskManager); + scheduleTasks(logger, taskManager); } } -function registerLensTelemetryTask(server: Server, taskManager: TaskManagerSetupContract) { +function registerLensTelemetryTask( + logger: Logger, + core: CoreSetup, + config: Observable<{ kibana: { index: string } }>, + taskManager: TaskManagerSetupContract +) { taskManager.registerTaskDefinitions({ [TELEMETRY_TASK_TYPE]: { title: 'Lens telemetry fetch task', type: TELEMETRY_TASK_TYPE, timeout: '1m', - createTaskRunner: telemetryTaskRunner(server), + createTaskRunner: telemetryTaskRunner(logger, core, config), }, }); } -function scheduleTasks(server: Server, taskManager: TaskManagerStartContract) { - const { kbnServer } = (server.plugins.xpack_main as XPackMainPlugin & { - status: { plugin: { kbnServer: KbnServer } }; - }).status.plugin; - - kbnServer.afterPluginsInit(() => { - // The code block below can't await directly within "afterPluginsInit" - // callback due to circular dependency The server isn't "ready" until - // this code block finishes. Migrations wait for server to be ready before - // executing. Saved objects repository waits for migrations to finish before - // finishing the request. To avoid this, we'll await within a separate - // function block. - (async () => { - try { - await taskManager.ensureScheduled({ - id: TASK_ID, - taskType: TELEMETRY_TASK_TYPE, - state: { byDate: {}, suggestionsByDate: {}, saved: {}, runs: 0 }, - params: {}, - }); - } catch (e) { - server.log(['debug', 'telemetry'], `Error scheduling task, received ${e.message}`); - } - })(); - }); +async function scheduleTasks(logger: Logger, taskManager: TaskManagerStartContract) { + try { + await taskManager.ensureScheduled({ + id: TASK_ID, + taskType: TELEMETRY_TASK_TYPE, + state: { byDate: {}, suggestionsByDate: {}, saved: {}, runs: 0 }, + params: {}, + }); + } catch (e) { + logger.debug(`Error scheduling task, received ${e.message}`); + } } export async function getDailyEvents( kibanaIndex: string, - callCluster: ClusterSearchType & ClusterDeleteType + callCluster: APICaller ): Promise<{ byDate: Record>; suggestionsByDate: Record>; @@ -205,18 +177,22 @@ export async function getDailyEvents( }; } -export function telemetryTaskRunner(server: Server) { +export function telemetryTaskRunner( + logger: Logger, + core: CoreSetup, + config: Observable<{ kibana: { index: string } }> +) { return ({ taskInstance }: RunContext) => { const { state } = taskInstance; - const callCluster = server.plugins.elasticsearch.getCluster('admin').callWithInternalUser; + const callCluster = core.elasticsearch.adminClient.callAsInternalUser; return { async run() { - const kibanaIndex = server.config().get('kibana.index'); + const kibanaIndex = (await config.toPromise()).kibana.index; return Promise.all([ getDailyEvents(kibanaIndex, callCluster), - getVisualizationCounts(callCluster, server.config()), + getVisualizationCounts(callCluster, kibanaIndex), ]) .then(([lensTelemetry, lensVisualizations]) => { return { @@ -229,9 +205,7 @@ export function telemetryTaskRunner(server: Server) { runAt: getNextMidnight(), }; }) - .catch(errMsg => - server.log(['warning'], `Error executing lens telemetry task: ${errMsg}`) - ); + .catch(errMsg => logger.warn(`Error executing lens telemetry task: ${errMsg}`)); }, }; }; diff --git a/x-pack/legacy/plugins/lens/server/usage/types.ts b/x-pack/plugins/lens/server/usage/types.ts similarity index 100% rename from x-pack/legacy/plugins/lens/server/usage/types.ts rename to x-pack/plugins/lens/server/usage/types.ts diff --git a/x-pack/legacy/plugins/lens/server/usage/visualization_counts.ts b/x-pack/plugins/lens/server/usage/visualization_counts.ts similarity index 85% rename from x-pack/legacy/plugins/lens/server/usage/visualization_counts.ts rename to x-pack/plugins/lens/server/usage/visualization_counts.ts index 7c1dc5fca6d85..00b84fe100224 100644 --- a/x-pack/legacy/plugins/lens/server/usage/visualization_counts.ts +++ b/x-pack/plugins/lens/server/usage/visualization_counts.ts @@ -4,22 +4,12 @@ * you may not use this file except in compliance with the Elastic License. */ -import { KibanaConfig } from 'src/legacy/server/kbn_server'; -import { CallClusterOptions } from 'src/legacy/core_plugins/elasticsearch'; -import { SearchParams, SearchResponse } from 'elasticsearch'; +import { APICaller } from 'kibana/server'; import { LensVisualizationUsage } from './types'; -type ClusterSearchType = ( - endpoint: 'search', - params: SearchParams & { - rest_total_hits_as_int: boolean; - }, - options?: CallClusterOptions -) => Promise>; - export async function getVisualizationCounts( - callCluster: ClusterSearchType, - config: KibanaConfig + callCluster: APICaller, + kibanaIndex: string ): Promise { const scriptedMetric = { scripted_metric: { @@ -53,7 +43,7 @@ export async function getVisualizationCounts( }; const results = await callCluster('search', { - index: config.get('kibana.index'), + index: kibanaIndex, rest_total_hits_as_int: true, body: { query: { diff --git a/x-pack/test/api_integration/apis/lens/telemetry.ts b/x-pack/test/api_integration/apis/lens/telemetry.ts index 5e6830c8f4689..653df453c2560 100644 --- a/x-pack/test/api_integration/apis/lens/telemetry.ts +++ b/x-pack/test/api_integration/apis/lens/telemetry.ts @@ -6,14 +6,13 @@ import moment from 'moment'; import expect from '@kbn/expect'; -import { KibanaConfig } from 'src/legacy/server/kbn_server'; import { Client, SearchParams } from 'elasticsearch'; +import { APICaller } from 'kibana/server'; -import { CallCluster } from 'src/legacy/core_plugins/elasticsearch'; import { FtrProviderContext } from '../../ftr_provider_context'; -import { getDailyEvents } from '../../../../legacy/plugins/lens/server/usage/task'; -import { getVisualizationCounts } from '../../../../legacy/plugins/lens/server/usage/visualization_counts'; +import { getDailyEvents } from '../../../../plugins/lens/server/usage/task'; +import { getVisualizationCounts } from '../../../../plugins/lens/server/usage/visualization_counts'; const COMMON_HEADERS = { 'kbn-xsrf': 'some-xsrf-token', @@ -23,9 +22,9 @@ const COMMON_HEADERS = { export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertest'); const es: Client = getService('legacyEs'); - const callCluster: CallCluster = (((path: 'search', searchParams: SearchParams) => { + const callCluster: APICaller = (((path: 'search', searchParams: SearchParams) => { return es[path].call(es, searchParams); - }) as unknown) as CallCluster; + }) as unknown) as APICaller; async function assertExpectedSavedObjects(num: number) { // Make sure that new/deleted docs are available to search @@ -189,13 +188,7 @@ export default ({ getService }: FtrProviderContext) => { await esArchiver.loadIfNeeded('lens/basic'); - const results = await getVisualizationCounts(callCluster, { - // Fake KibanaConfig service - get() { - return '.kibana'; - }, - has: () => false, - } as KibanaConfig); + const results = await getVisualizationCounts(callCluster, '.kibana'); expect(results).to.have.keys([ 'saved_overall', From 900af8262be9bec5f778fd326745f5e128a0ca61 Mon Sep 17 00:00:00 2001 From: Nathan L Smith Date: Wed, 5 Feb 2020 12:40:01 -0600 Subject: [PATCH 42/86] [APM] Remove service map fullscreen control (#56351) --- .../components/app/ServiceMap/Controls.tsx | 3 - .../app/ServiceMap/FullscreenPanel.tsx | 57 ------------------- .../translations/translations/ja-JP.json | 3 +- .../translations/translations/zh-CN.json | 3 +- 4 files changed, 2 insertions(+), 64 deletions(-) delete mode 100644 x-pack/legacy/plugins/apm/public/components/app/ServiceMap/FullscreenPanel.tsx diff --git a/x-pack/legacy/plugins/apm/public/components/app/ServiceMap/Controls.tsx b/x-pack/legacy/plugins/apm/public/components/app/ServiceMap/Controls.tsx index 07ea97f442b7f..38e86e4a0d1c9 100644 --- a/x-pack/legacy/plugins/apm/public/components/app/ServiceMap/Controls.tsx +++ b/x-pack/legacy/plugins/apm/public/components/app/ServiceMap/Controls.tsx @@ -11,7 +11,6 @@ import React, { useContext, useEffect, useState } from 'react'; import styled from 'styled-components'; import { CytoscapeContext } from './Cytoscape'; import { animationOptions, nodeHeight } from './cytoscapeOptions'; -import { FullscreenPanel } from './FullscreenPanel'; const ControlsContainer = styled('div')` left: ${theme.gutterTypes.gutterMedium}; @@ -87,7 +86,6 @@ export function Controls() { const minZoom = cy.minZoom(); const isMinZoom = zoom === minZoom; const increment = (maxZoom - minZoom) / steps; - const mapDomElement = cy.container(); const zoomInLabel = i18n.translate('xpack.apm.serviceMap.zoomIn', { defaultMessage: 'Zoom in' }); @@ -127,7 +125,6 @@ export function Controls() { title={centerLabel} /> - ); } diff --git a/x-pack/legacy/plugins/apm/public/components/app/ServiceMap/FullscreenPanel.tsx b/x-pack/legacy/plugins/apm/public/components/app/ServiceMap/FullscreenPanel.tsx deleted file mode 100644 index 851bf0ebf56fd..0000000000000 --- a/x-pack/legacy/plugins/apm/public/components/app/ServiceMap/FullscreenPanel.tsx +++ /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; - * you may not use this file except in compliance with the Elastic License. - */ - -import React from 'react'; -import { EuiButtonIcon, EuiPanel } from '@elastic/eui'; -import styled from 'styled-components'; -import theme from '@elastic/eui/dist/eui_theme_light.json'; -import { i18n } from '@kbn/i18n'; - -const Button = styled(EuiButtonIcon)` - display: block; - margin: ${theme.paddingSizes.xs}; -`; - -interface FullscreenPanelProps { - element: Element | null; -} - -export function FullscreenPanel({ element }: FullscreenPanelProps) { - const canDoFullscreen = - element && element.ownerDocument && element.ownerDocument.fullscreenEnabled; - - if (!canDoFullscreen) { - return null; - } - - function doFullscreen() { - if (element && element.ownerDocument && canDoFullscreen) { - const isFullscreen = element.ownerDocument.fullscreenElement !== null; - - if (isFullscreen) { - element.ownerDocument.exitFullscreen(); - } else { - element.requestFullscreen(); - } - } - } - - const label = i18n.translate('xpack.apm.serviceMap.fullscreen', { - defaultMessage: 'Full screen' - }); - - return ( - -

diff --git a/x-pack/legacy/plugins/ml/public/application/datavisualizer/file_based/_file_datavisualizer.scss b/x-pack/legacy/plugins/ml/public/application/datavisualizer/file_based/_file_datavisualizer.scss deleted file mode 100644 index 9a0bc2d5c04e8..0000000000000 --- a/x-pack/legacy/plugins/ml/public/application/datavisualizer/file_based/_file_datavisualizer.scss +++ /dev/null @@ -1,3 +0,0 @@ -.file-datavisualizer__content { - padding: $euiSize; -} diff --git a/x-pack/legacy/plugins/ml/public/application/datavisualizer/file_based/_index.scss b/x-pack/legacy/plugins/ml/public/application/datavisualizer/file_based/_index.scss index b08d81b0dfe4b..841415620d691 100644 --- a/x-pack/legacy/plugins/ml/public/application/datavisualizer/file_based/_index.scss +++ b/x-pack/legacy/plugins/ml/public/application/datavisualizer/file_based/_index.scss @@ -1,2 +1 @@ -@import 'file_datavisualizer'; @import 'components/index'; diff --git a/x-pack/legacy/plugins/ml/public/application/datavisualizer/file_based/components/about_panel/about_panel.js b/x-pack/legacy/plugins/ml/public/application/datavisualizer/file_based/components/about_panel/about_panel.js index 33aaea6970a17..4fe4933261985 100644 --- a/x-pack/legacy/plugins/ml/public/application/datavisualizer/file_based/components/about_panel/about_panel.js +++ b/x-pack/legacy/plugins/ml/public/application/datavisualizer/file_based/components/about_panel/about_panel.js @@ -60,12 +60,12 @@ export function LoadingPanel() {
-

+

-

+

diff --git a/x-pack/legacy/plugins/ml/public/application/datavisualizer/file_based/components/about_panel/welcome_content.js b/x-pack/legacy/plugins/ml/public/application/datavisualizer/file_based/components/about_panel/welcome_content.js index 0b438ea584b28..73d12122879f8 100644 --- a/x-pack/legacy/plugins/ml/public/application/datavisualizer/file_based/components/about_panel/welcome_content.js +++ b/x-pack/legacy/plugins/ml/public/application/datavisualizer/file_based/components/about_panel/welcome_content.js @@ -27,7 +27,7 @@ export function WelcomeContent() { -

+

-

+
diff --git a/x-pack/legacy/plugins/ml/public/application/datavisualizer/file_based/components/analysis_summary/analysis_summary.js b/x-pack/legacy/plugins/ml/public/application/datavisualizer/file_based/components/analysis_summary/analysis_summary.js index 02d50b34f68a2..b3bf4ea4daf83 100644 --- a/x-pack/legacy/plugins/ml/public/application/datavisualizer/file_based/components/analysis_summary/analysis_summary.js +++ b/x-pack/legacy/plugins/ml/public/application/datavisualizer/file_based/components/analysis_summary/analysis_summary.js @@ -15,12 +15,12 @@ export function AnalysisSummary({ results }) { return ( -

+

-

+
diff --git a/x-pack/legacy/plugins/ml/public/application/datavisualizer/file_based/components/file_contents/file_contents.js b/x-pack/legacy/plugins/ml/public/application/datavisualizer/file_based/components/file_contents/file_contents.js index 97ee1e9c5e98a..99bac9cc27d6f 100644 --- a/x-pack/legacy/plugins/ml/public/application/datavisualizer/file_based/components/file_contents/file_contents.js +++ b/x-pack/legacy/plugins/ml/public/application/datavisualizer/file_based/components/file_contents/file_contents.js @@ -22,12 +22,12 @@ export function FileContents({ data, format, numberOfLines }) { return ( -

+

-

+
diff --git a/x-pack/legacy/plugins/ml/public/application/datavisualizer/file_based/components/file_datavisualizer_view/file_datavisualizer_view.js b/x-pack/legacy/plugins/ml/public/application/datavisualizer/file_based/components/file_datavisualizer_view/file_datavisualizer_view.js index 134a1f85e8346..a4300de5abbbb 100644 --- a/x-pack/legacy/plugins/ml/public/application/datavisualizer/file_based/components/file_datavisualizer_view/file_datavisualizer_view.js +++ b/x-pack/legacy/plugins/ml/public/application/datavisualizer/file_based/components/file_datavisualizer_view/file_datavisualizer_view.js @@ -36,6 +36,7 @@ export class FileDataVisualizerView extends Component { this.state = { files: {}, + fileName: '', fileContents: '', fileSize: 0, fileTooLarge: false, @@ -71,6 +72,7 @@ export class FileDataVisualizerView extends Component { loading: files.length > 0, bottomBarVisible: files.length > 0, loaded: false, + fileName: '', fileContents: '', fileSize: 0, fileTooLarge: false, @@ -93,6 +95,7 @@ export class FileDataVisualizerView extends Component { const data = fileContents.data; this.setState({ fileContents: data, + fileName: file.name, fileSize: file.size, }); @@ -110,6 +113,7 @@ export class FileDataVisualizerView extends Component { loaded: false, loading: false, fileTooLarge: true, + fileName: file.name, fileSize: file.size, }); } @@ -240,6 +244,7 @@ export class FileDataVisualizerView extends Component { loaded, results, fileContents, + fileName, fileSize, fileTooLarge, fileCouldNotBeRead, @@ -256,7 +261,7 @@ export class FileDataVisualizerView extends Component { : []; return ( -
+
{mode === MODE.READ && ( {!loading && !loaded && } @@ -275,6 +280,7 @@ export class FileDataVisualizerView extends Component { {loaded && ( this.showEditFlyout()} /> @@ -304,8 +310,8 @@ export class FileDataVisualizerView extends Component { - - -

- -   - - } - /> -

-
- - - + + + + +

{this.props.fileName}

+
+
+ + +

+ +   + + } + /> +

+
+ + - {(initialized === false || importing === true) && ( - - - - )} - - {initialized === true && importing === false && ( - - - - )} -
- - {initialized === true && ( - - - - - {imported === true && ( - - - - - - - - - - )} - - - )} - {errors.length > 0 && ( - - + {(initialized === false || importing === true) && ( + + + + )} + + {initialized === true && importing === false && ( + + + + )} +
+ + {initialized === true && ( + + + + + + + {imported === true && ( + + + + + + + + + + )} + + + )} + {errors.length > 0 && ( + + - - - )} -
+ +
+ )} + + ); } } diff --git a/x-pack/legacy/plugins/ml/public/application/datavisualizer/file_based/components/results_view/results_view.js b/x-pack/legacy/plugins/ml/public/application/datavisualizer/file_based/components/results_view/results_view.js index bd0e1cb1eb79f..6ff0eb86f2c55 100644 --- a/x-pack/legacy/plugins/ml/public/application/datavisualizer/file_based/components/results_view/results_view.js +++ b/x-pack/legacy/plugins/ml/public/application/datavisualizer/file_based/components/results_view/results_view.js @@ -7,13 +7,22 @@ import { injectI18n, FormattedMessage } from '@kbn/i18n/react'; import React from 'react'; -import { EuiTabbedContent, EuiButton, EuiSpacer, EuiPanel } from '@elastic/eui'; +import { + EuiButton, + EuiPage, + EuiPageBody, + EuiPageContentHeader, + EuiPanel, + EuiTabbedContent, + EuiSpacer, + EuiTitle, +} from '@elastic/eui'; import { FileContents } from '../file_contents'; import { AnalysisSummary } from '../analysis_summary'; import { FieldsStats } from '../fields_stats'; -export const ResultsView = injectI18n(function({ data, results, showEditFlyout, intl }) { +export const ResultsView = injectI18n(function({ data, fileName, results, showEditFlyout, intl }) { console.log(results); const tabs = [ @@ -28,35 +37,45 @@ export const ResultsView = injectI18n(function({ data, results, showEditFlyout, ]; return ( -
- - - + + + + +

{fileName}

+
+
+ +
+ + + - + - - + + - + - showEditFlyout()}> - - - + showEditFlyout()}> + + + - + - - {}} /> - -
+ + {}} /> + +
+ + ); }); diff --git a/x-pack/legacy/plugins/ml/public/application/datavisualizer/index_based/components/field_data_card/_field_data_card.scss b/x-pack/legacy/plugins/ml/public/application/datavisualizer/index_based/components/field_data_card/_field_data_card.scss index 6790b947f6f59..09c85b1d26953 100644 --- a/x-pack/legacy/plugins/ml/public/application/datavisualizer/index_based/components/field_data_card/_field_data_card.scss +++ b/x-pack/legacy/plugins/ml/public/application/datavisualizer/index_based/components/field_data_card/_field_data_card.scss @@ -100,4 +100,8 @@ padding: $euiSizeS $euiSizeS 0px $euiSizeS; text-align: center; } + + .mlFieldDataCard__valuesTitle { + text-transform: uppercase; + } } diff --git a/x-pack/legacy/plugins/ml/public/application/datavisualizer/index_based/components/field_data_card/content_types/boolean_content.tsx b/x-pack/legacy/plugins/ml/public/application/datavisualizer/index_based/components/field_data_card/content_types/boolean_content.tsx index a85419015fa9b..c7277295b4c4f 100644 --- a/x-pack/legacy/plugins/ml/public/application/datavisualizer/index_based/components/field_data_card/content_types/boolean_content.tsx +++ b/x-pack/legacy/plugins/ml/public/application/datavisualizer/index_based/components/field_data_card/content_types/boolean_content.tsx @@ -5,7 +5,7 @@ */ import React, { FC } from 'react'; -import { EuiIcon, EuiSpacer, EuiText } from '@elastic/eui'; +import { EuiIcon, EuiSpacer, EuiText, EuiTitle } from '@elastic/eui'; import { Axis, BarSeries, Chart, Settings } from '@elastic/charts'; import { FormattedMessage } from '@kbn/i18n/react'; @@ -50,15 +50,15 @@ export const BooleanContent: FC = ({ config }) => {
- -
+ + -
-
- + + + = ({ config }) => {
- -
+ + -
-
- - + + +
diff --git a/x-pack/legacy/plugins/ml/public/application/datavisualizer/index_based/components/field_data_card/examples_list/examples_list.tsx b/x-pack/legacy/plugins/ml/public/application/datavisualizer/index_based/components/field_data_card/examples_list/examples_list.tsx index c8eb810115401..e8d6bb985bec8 100644 --- a/x-pack/legacy/plugins/ml/public/application/datavisualizer/index_based/components/field_data_card/examples_list/examples_list.tsx +++ b/x-pack/legacy/plugins/ml/public/application/datavisualizer/index_based/components/field_data_card/examples_list/examples_list.tsx @@ -6,7 +6,7 @@ import React, { FC } from 'react'; -import { EuiListGroup, EuiListGroupItem, EuiSpacer, EuiText } from '@elastic/eui'; +import { EuiListGroup, EuiListGroupItem, EuiSpacer, EuiTitle } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; @@ -32,8 +32,8 @@ export const ExamplesList: FC = ({ examples }) => { return (
- -
+ + = ({ examples }) => { numExamples: examples.length, }} /> -
-
+ + {examplesContent} diff --git a/x-pack/legacy/plugins/ml/public/application/explorer/_explorer.scss b/x-pack/legacy/plugins/ml/public/application/explorer/_explorer.scss index f6e3dd2b79b00..9fb2f0c3bed94 100644 --- a/x-pack/legacy/plugins/ml/public/application/explorer/_explorer.scss +++ b/x-pack/legacy/plugins/ml/public/application/explorer/_explorer.scss @@ -22,7 +22,7 @@ border-radius: $euiBorderRadius; display: inline-block; - // SASSTODO: Make a proper selector + // SASSTODO: Make a proper selector i { color: $euiColorPrimary; margin-right: $euiSizeXS; @@ -46,7 +46,7 @@ .results-container { padding: 0px 0px $euiSize 0px; - // SASSTODO: Overwrite of bootstrap + // SASSTODO: Overwrite of bootstrap .col-xs-12 { width: calc(100% - #{$euiSizeXL}); padding-left: $euiSize; @@ -61,6 +61,8 @@ } .panel-title { + font-size: $euiFontSizeM; + font-weight: 400; color: $euiColorDarkShade; display: inline-block; padding-bottom: $euiSizeXS; @@ -75,7 +77,7 @@ .ml-controls { padding-bottom: $euiSizeS; - // SASSTODO: Make a proper selector + // SASSTODO: Make a proper selector label { font-size: $euiFontSizeXS; padding: $euiSizeXS; @@ -111,6 +113,7 @@ margin-left: 176px; height: 22px; white-space: nowrap; + // background-color: #CCC; .sl-cell { height: 10px; @@ -125,15 +128,19 @@ color: $euiColorDarkShade; } } + .sl-cell-hover { visibility: visible; + i { display: block; margin-top: -6px; } } + .sl-cell-active-hover { visibility: visible; + .floating-time-label { display: inline-block; } @@ -160,6 +167,7 @@ overflow: hidden; text-overflow: ellipsis; } + div.lane-label.lane-label-masked { opacity: 0.3; } @@ -180,15 +188,19 @@ border-right: $euiBorderThin; vertical-align: top; position: relative; - .sl-cell-inner, .sl-cell-inner-dragselect { + + .sl-cell-inner, + .sl-cell-inner-dragselect { height: 26px; margin: 1px; border-radius: 2px; text-align: center; } + .sl-cell-inner.sl-cell-inner-masked { opacity: 0.2; } + .sl-cell-inner.sl-cell-inner-selected, .sl-cell-inner-dragselect.sl-cell-inner-selected { border: 2px solid $euiColorDarkShade; @@ -200,13 +212,16 @@ opacity: 0.4; } } + .sl-cell:hover { .sl-cell-inner { opacity: 0.8; cursor: pointer; } } + .sl-cell.ds-selected { + .sl-cell-inner, .sl-cell-inner-dragselect { border: 2px solid $euiColorDarkShade; @@ -230,14 +245,17 @@ height: 25px; margin-top: $euiSizeXS / 2; margin-left: 175px; + /* hide d3's domain line */ path.domain { display: none; } + /* hide d3's tick line */ g.tick line { display: none; } + /* override d3's default tick styles */ g.tick text { font-size: 11px; @@ -249,12 +267,12 @@ line.gridLine { stroke: $euiBorderColor; fill: none; - shape-rendering : crispEdges; - stroke-width : 1px; + shape-rendering: crispEdges; + stroke-width: 1px; } rect.gridCell { - shape-rendering : crispEdges; + shape-rendering: crispEdges; } rect.hovered { @@ -278,6 +296,7 @@ /* using !important in the following rule because other related legacy rules have more specifity. */ .mlDragselectDragging { + .sl-cell-inner, .sl-cell-inner-dragselect { opacity: 0.6 !important; @@ -290,14 +309,17 @@ div.lane { div.cells-container { .sl-cell.ds-selected { + .sl-cell-inner, .sl-cell-inner-dragselect { border-width: 0px !important; opacity: 1 !important; } + .sl-cell-inner.sl-cell-inner-selected { border-width: $euiSizeXS / 2 !important; } + .sl-cell-inner.sl-cell-inner-masked { opacity: 0.6 !important; } diff --git a/x-pack/legacy/plugins/ml/public/application/explorer/explorer.js b/x-pack/legacy/plugins/ml/public/application/explorer/explorer.js index 8d26fafe8057c..3b3a431c07e62 100644 --- a/x-pack/legacy/plugins/ml/public/application/explorer/explorer.js +++ b/x-pack/legacy/plugins/ml/public/application/explorer/explorer.js @@ -21,8 +21,12 @@ import { EuiFlexItem, EuiFormRow, EuiIconTip, + EuiPage, + EuiPageBody, + EuiScreenReaderOnly, EuiSelect, EuiSpacer, + EuiTitle, } from '@elastic/eui'; import { AnnotationFlyout } from '../components/annotations/annotation_flyout'; @@ -87,8 +91,17 @@ function mapSwimlaneOptionsToEuiOptions(options) { const ExplorerPage = ({ children, jobSelectorProps, resizeRef }) => (
- - {children} + + + +

+ +

+
+ + {children} +
+
); @@ -343,7 +356,7 @@ export class Explorer extends React.Component { return (
- {/* Make sure ChartTooltip is inside this plain wrapping div so positioning can be infered correctly. */} + {/* Make sure ChartTooltip is inside wrapping div with 0px left/right padding so positioning can be inferred correctly. */} {noInfluencersConfigured === false && influencers !== undefined && ( @@ -372,27 +385,28 @@ export class Explorer extends React.Component { )} {noInfluencersConfigured === false && ( -
- - - +
+ +

+ +

+
)}
- - - + +

+ +

+
0 && ( <> - - - + +

+ +

+
)} - - - + +

+ +

+
-
- -
- -
- ); - } - - renderJobsListComponents() { - const { loading, jobsSummaryList } = this.state; - const jobIds = jobsSummaryList.map(j => j.id); - return ( -
-
- this.refreshJobSummaryList(true)} - /> - -
- this.refreshJobSummaryList(true)} - selectedJobsCount={this.state.selectedJobs.length} - loading={loading} - /> - this.refreshJobSummaryList(true)} - allJobIds={jobIds} - /> - this.refreshJobSummaryList(true)} - /> - this.refreshJobSummaryList(true)} - /> - -
- ); - } - - render() { - const { isRefreshing, jobsSummaryList } = this.state; - const { isManagementTable } = this.props; - return (
- {!isManagementTable && ( - <> - -

- -

-
- - - )} - - - @@ -463,19 +381,133 @@ export class JobsListView extends Component { isRefreshing={isRefreshing} /> - {!isManagementTable && ( - - - - )} - +
+
+ +
+ +
+
+ ); + } + + renderJobsListComponents() { + const { isRefreshing, loading, jobsSummaryList } = this.state; + const jobIds = jobsSummaryList.map(j => j.id); + return ( + + + + + +

+ +

+
+
+
- {!isManagementTable && this.renderJobsListComponents()} - {isManagementTable && this.renderManagementJobsListComponents()} + + + + + + + + + + + + + + + + + + + + + + +
+
+ this.refreshJobSummaryList(true)} + /> + +
+ this.refreshJobSummaryList(true)} + selectedJobsCount={this.state.selectedJobs.length} + loading={loading} + /> + this.refreshJobSummaryList(true)} + allJobIds={jobIds} + /> + this.refreshJobSummaryList(true)} + /> + this.refreshJobSummaryList(true)} + /> + +
+
+
+ ); + } + + render() { + const { isManagementTable } = this.props; + + return ( +
+ {!isManagementTable + ? this.renderJobsListComponents() + : this.renderManagementJobsListComponents()}
); } diff --git a/x-pack/legacy/plugins/ml/public/application/jobs/new_job/pages/job_type/page.tsx b/x-pack/legacy/plugins/ml/public/application/jobs/new_job/pages/job_type/page.tsx index 1b57dd341a046..b1382aef86d30 100644 --- a/x-pack/legacy/plugins/ml/public/application/jobs/new_job/pages/job_type/page.tsx +++ b/x-pack/legacy/plugins/ml/public/application/jobs/new_job/pages/job_type/page.tsx @@ -174,13 +174,13 @@ export const Page: FC = () => { -

+

-

+
@@ -204,16 +204,16 @@ export const Page: FC = () => { )} + +

+ +

+
+ - -

- -

-
-

= ({ existingJobsAndGroups, jobType }) => { -

+

: {jobCreatorTitle} -

+ diff --git a/x-pack/legacy/plugins/ml/public/application/jobs/new_job/pages/new_job/wizard_steps.tsx b/x-pack/legacy/plugins/ml/public/application/jobs/new_job/pages/new_job/wizard_steps.tsx index df21e70a68ed9..cd3d887c906af 100644 --- a/x-pack/legacy/plugins/ml/public/application/jobs/new_job/pages/new_job/wizard_steps.tsx +++ b/x-pack/legacy/plugins/ml/public/application/jobs/new_job/pages/new_job/wizard_steps.tsx @@ -144,7 +144,7 @@ const Title: FC<{ 'data-test-subj': string }> = ({ 'data-test-subj': dataTestSub return ( -

{children}

+

{children}

diff --git a/x-pack/legacy/plugins/ml/public/application/overview/components/sidebar.tsx b/x-pack/legacy/plugins/ml/public/application/overview/components/sidebar.tsx index 82caadd4d58ea..8648bd211715e 100644 --- a/x-pack/legacy/plugins/ml/public/application/overview/components/sidebar.tsx +++ b/x-pack/legacy/plugins/ml/public/application/overview/components/sidebar.tsx @@ -5,7 +5,7 @@ */ import React, { FC } from 'react'; -import { EuiFlexItem, EuiLink, EuiText } from '@elastic/eui'; +import { EuiFlexItem, EuiLink, EuiSpacer, EuiText, EuiTitle } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import chrome from 'ui/chrome'; import { metadata } from 'ui/metadata'; @@ -39,13 +39,16 @@ function getCreateJobLink(createAnomalyDetectionJobDisabled: boolean) { export const OverviewSideBar: FC = ({ createAnomalyDetectionJobDisabled }) => ( - -

+ +

-

+

+ + +

- - - + + + + + `; diff --git a/x-pack/legacy/plugins/ml/public/application/settings/calendars/edit/new_calendar.js b/x-pack/legacy/plugins/ml/public/application/settings/calendars/edit/new_calendar.js index 5ed98d7dc846b..bc60e9e5df24e 100644 --- a/x-pack/legacy/plugins/ml/public/application/settings/calendars/edit/new_calendar.js +++ b/x-pack/legacy/plugins/ml/public/application/settings/calendars/edit/new_calendar.js @@ -10,7 +10,7 @@ import { timefilter } from 'ui/timefilter'; import { injectI18n } from '@kbn/i18n/react'; -import { EuiPage, EuiPageContent, EuiOverlayMask } from '@elastic/eui'; +import { EuiPage, EuiPageBody, EuiPageContent, EuiOverlayMask } from '@elastic/eui'; import { toastNotifications } from 'ui/notify'; @@ -334,39 +334,41 @@ export const NewCalendar = injectI18n( - - - - {modal} + + + + + {modal} + ); diff --git a/x-pack/legacy/plugins/ml/public/application/settings/calendars/list/__snapshots__/calendars_list.test.js.snap b/x-pack/legacy/plugins/ml/public/application/settings/calendars/list/__snapshots__/calendars_list.test.js.snap index fc011a77bb082..867fd16932627 100644 --- a/x-pack/legacy/plugins/ml/public/application/settings/calendars/list/__snapshots__/calendars_list.test.js.snap +++ b/x-pack/legacy/plugins/ml/public/application/settings/calendars/list/__snapshots__/calendars_list.test.js.snap @@ -8,65 +8,67 @@ exports[`CalendarsList Renders calendar list with calendars 1`] = ` - - - - + + + + + + `; diff --git a/x-pack/legacy/plugins/ml/public/application/settings/calendars/list/calendars_list.js b/x-pack/legacy/plugins/ml/public/application/settings/calendars/list/calendars_list.js index aec7336f3da14..3f5802583f542 100644 --- a/x-pack/legacy/plugins/ml/public/application/settings/calendars/list/calendars_list.js +++ b/x-pack/legacy/plugins/ml/public/application/settings/calendars/list/calendars_list.js @@ -11,6 +11,7 @@ import { EuiConfirmModal, EuiOverlayMask, EuiPage, + EuiPageBody, EuiPageContent, EUI_MODAL_CONFIRM_BUTTON, } from '@elastic/eui'; @@ -149,27 +150,29 @@ export const CalendarsList = injectI18n( - - - 0} - /> - - {destroyModal} + + + + 0} + /> + + {destroyModal} + ); diff --git a/x-pack/legacy/plugins/ml/public/application/settings/filter_lists/edit/__snapshots__/edit_filter_list.test.js.snap b/x-pack/legacy/plugins/ml/public/application/settings/filter_lists/edit/__snapshots__/edit_filter_list.test.js.snap index 17986d838ec5e..447d79ffff32a 100644 --- a/x-pack/legacy/plugins/ml/public/application/settings/filter_lists/edit/__snapshots__/edit_filter_list.test.js.snap +++ b/x-pack/legacy/plugins/ml/public/application/settings/filter_lists/edit/__snapshots__/edit_filter_list.test.js.snap @@ -8,102 +8,104 @@ exports[`EditFilterList adds new items to filter list 1`] = ` - - - - - - + - + + + + - - - - - - + + + + - - - - - + + + + + + + `; @@ -116,104 +118,106 @@ exports[`EditFilterList renders after selecting an item and deleting it 1`] = ` - - - - - - + - + + + + - - - - - - + + + + - - - - - + + + + + + + `; @@ -226,99 +230,101 @@ exports[`EditFilterList renders after selecting an item and deleting it 2`] = ` - - - - - - + - + + + + - - - - - - + + + + - - - - - + + + + + + + `; @@ -331,83 +337,85 @@ exports[`EditFilterList renders the edit page for a new filter list and updates - - - - - - + - + + + + - - - - - - + + + + - - - - - + + + + + + + `; @@ -420,83 +428,85 @@ exports[`EditFilterList renders the edit page for a new filter list and updates - - - - - - + - + + + + - - - - - - + + + + - - - - - + + + + + + + `; @@ -509,100 +519,102 @@ exports[`EditFilterList renders the edit page for an existing filter list and up - - - - - - + - + + + + - - - - - - + + + + - - - - - + + + + + + + `; @@ -615,100 +627,102 @@ exports[`EditFilterList renders the edit page for an existing filter list and up - - - - - - + - + + + + - - - - - - + + + + - - - - - + + + + + + + `; @@ -721,100 +735,102 @@ exports[`EditFilterList updates the items per page 1`] = ` - - - - - - + - + + + + - - - - - - + + + + - - - - - + + + + + + + `; diff --git a/x-pack/legacy/plugins/ml/public/application/settings/filter_lists/edit/edit_filter_list.js b/x-pack/legacy/plugins/ml/public/application/settings/filter_lists/edit/edit_filter_list.js index c5e439b20db2f..819fbe7ba788f 100644 --- a/x-pack/legacy/plugins/ml/public/application/settings/filter_lists/edit/edit_filter_list.js +++ b/x-pack/legacy/plugins/ml/public/application/settings/filter_lists/edit/edit_filter_list.js @@ -18,6 +18,7 @@ import { EuiFlexGroup, EuiFlexItem, EuiPage, + EuiPageBody, EuiPageContent, EuiSearchBar, EuiSpacer, @@ -324,68 +325,70 @@ export const EditFilterList = injectI18n( - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + ); diff --git a/x-pack/legacy/plugins/ml/public/application/settings/filter_lists/list/__snapshots__/filter_lists.test.js.snap b/x-pack/legacy/plugins/ml/public/application/settings/filter_lists/list/__snapshots__/filter_lists.test.js.snap index b58dcfe7d8f1f..52971bfe49cd9 100644 --- a/x-pack/legacy/plugins/ml/public/application/settings/filter_lists/list/__snapshots__/filter_lists.test.js.snap +++ b/x-pack/legacy/plugins/ml/public/application/settings/filter_lists/list/__snapshots__/filter_lists.test.js.snap @@ -8,37 +8,39 @@ exports[`Filter Lists renders a list of filters 1`] = ` - - - + + + - + ] + } + refreshFilterLists={[Function]} + selectedFilterLists={Array []} + setSelectedFilterLists={[Function]} + /> + + `; diff --git a/x-pack/legacy/plugins/ml/public/application/settings/filter_lists/list/filter_lists.js b/x-pack/legacy/plugins/ml/public/application/settings/filter_lists/list/filter_lists.js index 9a467bcfd25a9..949dfe82d9f54 100644 --- a/x-pack/legacy/plugins/ml/public/application/settings/filter_lists/list/filter_lists.js +++ b/x-pack/legacy/plugins/ml/public/application/settings/filter_lists/list/filter_lists.js @@ -11,7 +11,7 @@ import React, { Component, Fragment } from 'react'; import { PropTypes } from 'prop-types'; -import { EuiPage, EuiPageContent } from '@elastic/eui'; +import { EuiPage, EuiPageBody, EuiPageContent } from '@elastic/eui'; import { injectI18n } from '@kbn/i18n/react'; @@ -90,24 +90,26 @@ export const FilterLists = injectI18n( - - - - + + + + + + ); diff --git a/x-pack/legacy/plugins/ml/public/application/settings/settings.tsx b/x-pack/legacy/plugins/ml/public/application/settings/settings.tsx index 225f39fc6f419..e2e7a4030f04f 100644 --- a/x-pack/legacy/plugins/ml/public/application/settings/settings.tsx +++ b/x-pack/legacy/plugins/ml/public/application/settings/settings.tsx @@ -35,12 +35,12 @@ export const Settings: FC = ({ canGetFilters, canGetCalendars }) => { -

+

-

+ diff --git a/x-pack/legacy/plugins/ml/public/application/timeseriesexplorer/_timeseriesexplorer.scss b/x-pack/legacy/plugins/ml/public/application/timeseriesexplorer/_timeseriesexplorer.scss index 0dd32ceabdb05..06f93ff7b158e 100644 --- a/x-pack/legacy/plugins/ml/public/application/timeseriesexplorer/_timeseriesexplorer.scss +++ b/x-pack/legacy/plugins/ml/public/application/timeseriesexplorer/_timeseriesexplorer.scss @@ -34,7 +34,9 @@ padding: $euiSize; .panel-title { - color: $euiTitleColor; + font-size: $euiFontSizeM; + font-weight: 400; + color: $euiColorDarkShade; } .entity-count-text { @@ -78,7 +80,8 @@ font-family: $euiFontFamily; } - .axis path, .axis line { + .axis path, + .axis line { fill: none; stroke: $euiBorderColor; shape-rendering: crispEdges; @@ -104,6 +107,7 @@ stroke: $euiColorDarkShade; stroke-width: 2; } + .chart-border-highlight:hover { opacity: 1; } @@ -191,6 +195,7 @@ } .forecast { + .metric-value, .metric-value:hover { stroke: #cca300; @@ -220,7 +225,9 @@ } } - a:hover, a:active, a:focus { + a:hover, + a:active, + a:focus { text-decoration: underline; } @@ -321,6 +328,7 @@ div.brush-handle-inner-left { border-radius: $euiBorderRadius 0px 0px $euiBorderRadius; } + div.brush-handle-inner-right { border-radius: 0px $euiBorderRadius $euiBorderRadius 0px; } @@ -342,7 +350,9 @@ of the horizontal bar below the tab menu elements in its inactive state. */ .mlTimeSeriesExplorerProgress { background-color: $euiColorEmptyShade; - &::-moz-progress-bar, &::-webkit-progress-bar { + + &::-moz-progress-bar, + &::-webkit-progress-bar { background-color: $euiColorEmptyShade; } } diff --git a/x-pack/legacy/plugins/ml/public/application/timeseriesexplorer/components/timeseries_chart/timeseries_chart.js b/x-pack/legacy/plugins/ml/public/application/timeseriesexplorer/components/timeseries_chart/timeseries_chart.js index 474b4f2470bde..2eaa4a907af66 100644 --- a/x-pack/legacy/plugins/ml/public/application/timeseriesexplorer/components/timeseries_chart/timeseries_chart.js +++ b/x-pack/legacy/plugins/ml/public/application/timeseriesexplorer/components/timeseries_chart/timeseries_chart.js @@ -61,7 +61,7 @@ const contextChartHeight = 60; const contextChartLineTopMargin = 3; const chartSpacing = 25; const swimlaneHeight = 30; -const margin = { top: 20, right: 10, bottom: 15, left: 40 }; +const margin = { top: 10, right: 10, bottom: 15, left: 40 }; const mlAnnotationsEnabled = chrome.getInjected('mlAnnotationsEnabled', false); const ZOOM_INTERVAL_OPTIONS = [ diff --git a/x-pack/legacy/plugins/ml/public/application/timeseriesexplorer/timeseriesexplorer.js b/x-pack/legacy/plugins/ml/public/application/timeseriesexplorer/timeseriesexplorer.js index a864808276166..6d9dbef64b009 100644 --- a/x-pack/legacy/plugins/ml/public/application/timeseriesexplorer/timeseriesexplorer.js +++ b/x-pack/legacy/plugins/ml/public/application/timeseriesexplorer/timeseriesexplorer.js @@ -20,14 +20,14 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import { + EuiCallOut, EuiCheckbox, EuiFlexGroup, EuiFlexItem, EuiFormRow, EuiSelect, EuiSpacer, - EuiText, - EuiCallOut, + EuiTitle, } from '@elastic/eui'; import chrome from 'ui/chrome'; @@ -1209,54 +1209,60 @@ export class TimeSeriesExplorer extends React.Component {
{/* Make sure ChartTooltip is inside this plain wrapping element without padding so positioning can be inferred correctly. */} - - - {i18n.translate('xpack.ml.timeSeriesExplorer.singleTimeSeriesAnalysisTitle', { - defaultMessage: 'Single time series analysis of {functionLabel}', - values: { functionLabel: chartDetails.functionLabel }, - })} - -   - {chartDetails.entityData.count === 1 && ( - - {chartDetails.entityData.entities.length > 0 && '('} - {chartDetails.entityData.entities - .map(entity => { - return `${entity.fieldName}: ${entity.fieldValue}`; - }) - .join(', ')} - {chartDetails.entityData.entities.length > 0 && ')'} - - )} - {chartDetails.entityData.count !== 1 && ( - - {chartDetails.entityData.entities.map((countData, i) => { - return ( - - {i18n.translate( - 'xpack.ml.timeSeriesExplorer.countDataInChartDetailsDescription', - { - defaultMessage: - '{openBrace}{cardinalityValue} distinct {fieldName} {cardinality, plural, one {} other { values}}{closeBrace}', - values: { - openBrace: i === 0 ? '(' : '', - closeBrace: - i === chartDetails.entityData.entities.length - 1 ? ')' : '', - cardinalityValue: - countData.cardinality === 0 - ? allValuesLabel - : countData.cardinality, - cardinality: countData.cardinality, - fieldName: countData.fieldName, - }, - } - )} - {i !== chartDetails.entityData.entities.length - 1 ? ', ' : ''} - - ); - })} - - )} + +
+ +

+ + {i18n.translate('xpack.ml.timeSeriesExplorer.singleTimeSeriesAnalysisTitle', { + defaultMessage: 'Single time series analysis of {functionLabel}', + values: { functionLabel: chartDetails.functionLabel }, + })} + +   + {chartDetails.entityData.count === 1 && ( + + {chartDetails.entityData.entities.length > 0 && '('} + {chartDetails.entityData.entities + .map(entity => { + return `${entity.fieldName}: ${entity.fieldValue}`; + }) + .join(', ')} + {chartDetails.entityData.entities.length > 0 && ')'} + + )} + {chartDetails.entityData.count !== 1 && ( + + {chartDetails.entityData.entities.map((countData, i) => { + return ( + + {i18n.translate( + 'xpack.ml.timeSeriesExplorer.countDataInChartDetailsDescription', + { + defaultMessage: + '{openBrace}{cardinalityValue} distinct {fieldName} {cardinality, plural, one {} other { values}}{closeBrace}', + values: { + openBrace: i === 0 ? '(' : '', + closeBrace: + i === chartDetails.entityData.entities.length - 1 ? ')' : '', + cardinalityValue: + countData.cardinality === 0 + ? allValuesLabel + : countData.cardinality, + cardinality: countData.cardinality, + fieldName: countData.fieldName, + }, + } + )} + {i !== chartDetails.entityData.entities.length - 1 ? ', ' : ''} + + ); + })} + + )} +

+
+ {showModelBoundsCheckbox && ( @@ -1311,11 +1317,14 @@ export class TimeSeriesExplorer extends React.Component {
{showAnnotations && focusAnnotationData.length > 0 && (
- - {i18n.translate('xpack.ml.timeSeriesExplorer.annotationsTitle', { - defaultMessage: 'Annotations', - })} - + +

+ +

+
)} - - {i18n.translate('xpack.ml.timeSeriesExplorer.anomaliesTitle', { - defaultMessage: 'Anomalies', - })} - + +

+ +

+
- +
)} {arePartitioningFieldsProvided && jobs.length > 0 && hasResults === true && ( diff --git a/x-pack/legacy/plugins/ml/public/application/timeseriesexplorer/timeseriesexplorer_page.tsx b/x-pack/legacy/plugins/ml/public/application/timeseriesexplorer/timeseriesexplorer_page.tsx index 9da1a79232fce..a44171167cb67 100644 --- a/x-pack/legacy/plugins/ml/public/application/timeseriesexplorer/timeseriesexplorer_page.tsx +++ b/x-pack/legacy/plugins/ml/public/application/timeseriesexplorer/timeseriesexplorer_page.tsx @@ -6,7 +6,9 @@ import React, { FC } from 'react'; -import { EuiProgress } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n/react'; + +import { EuiPage, EuiPageBody, EuiProgress, EuiScreenReaderOnly } from '@elastic/eui'; import { JobSelector } from '../components/job_selector'; import { NavigationMenu } from '../components/navigation_menu'; @@ -47,7 +49,19 @@ export const TimeSeriesExplorerPage: FC = ({ ref={resizeRef} data-test-subj="mlPageSingleMetricViewer" > - {children} + + + +

+ +

+
+ {children} +
+
); From ea7c78d10eaf2f80265eea0a564eda0607c58147 Mon Sep 17 00:00:00 2001 From: Pierre Gayvallet Date: Thu, 6 Feb 2020 10:30:55 +0100 Subject: [PATCH 61/86] Restructure SavedObject types internal representation (#56378) * adapt types and tests to prepare for new NP api * rename and export public types * update generated doc * first implementation of registerMappings * adapt es archiver to convert legacy mappings * update generated doc * fix more tests * add unit tests * add legacy-compat unit test * add documentation and examples * Introduce SavedObjectTypeRegistry and SavedObjectType types * add and fix tests * expose createSerializer API and fix usages * remove registerMappings API, add internal registerType * revert changes to migration guide * adapt ES-archiver migrator creation * export serializer-related types * update generated doc * add and use convertTypesToLegacySchema * remove / move to internal some mapping types * fix forEach closure context * add missing docs * fix core path * some nits * fix so_mixin tests * fix integration tests * fix integration tests for real * add documentation on serializer + restructure files and types * nit * add and use the ISavedObjectTypeRegistry interface * Add documentation, deprecates migrationLogger#warning * better typing for SavedObjectsRawDoc._source * nits * update generated doc * remove exposition of SavedObjectsTypeMappingDefinitions, update doc * creates so internal contracts mocks * improve documentation --- .../core/server/kibana-plugin-server.md | 10 + ...na-plugin-server.savedobjectmigrationfn.md | 13 + ...a-plugin-server.savedobjectmigrationmap.md | 27 ++ ...a-plugin-server.savedobjectsanitizeddoc.md | 12 + ...savedobjectscomplexfieldmapping.dynamic.md | 11 + ...-server.savedobjectscomplexfieldmapping.md | 22 ++ ...edobjectscomplexfieldmapping.properties.md | 11 + ...er.savedobjectscomplexfieldmapping.type.md | 11 + ...er.savedobjectscorefieldmapping.enabled.md | 11 + ...ver.savedobjectscorefieldmapping.fields.md | 15 + ...rver.savedobjectscorefieldmapping.index.md | 11 + ...gin-server.savedobjectscorefieldmapping.md | 23 ++ ...erver.savedobjectscorefieldmapping.type.md | 11 + ...-plugin-server.savedobjectsfieldmapping.md | 15 + ...in-server.savedobjectsmappingproperties.md | 13 + ...ugin-server.savedobjectsmigrationlogger.md | 1 + ...server.savedobjectsmigrationlogger.warn.md | 11 + ...ver.savedobjectsmigrationlogger.warning.md | 5 + ...lugin-server.savedobjectsrawdoc._source.md | 2 +- ...kibana-plugin-server.savedobjectsrawdoc.md | 4 +- ...er.savedobjectsserializer.generaterawid.md | 26 ++ ...savedobjectsserializer.israwsavedobject.md | 24 ++ ...na-plugin-server.savedobjectsserializer.md | 29 ++ ...savedobjectsserializer.rawtosavedobject.md | 24 ++ ...savedobjectsserializer.savedobjecttoraw.md | 24 ++ ...-plugin-server.savedobjectsservicesetup.md | 12 +- ...vedobjectsservicestart.createserializer.md | 13 + ...-plugin-server.savedobjectsservicestart.md | 1 + ...r.savedobjectstype.converttoaliasscript.md | 13 + ...a-plugin-server.savedobjectstype.hidden.md | 15 + ...in-server.savedobjectstype.indexpattern.md | 13 + ...plugin-server.savedobjectstype.mappings.md | 13 + .../kibana-plugin-server.savedobjectstype.md | 28 ++ ...ugin-server.savedobjectstype.migrations.md | 13 + ...ana-plugin-server.savedobjectstype.name.md | 13 + ...rver.savedobjectstype.namespaceagnostic.md | 13 + ...erver.savedobjectstypemappingdefinition.md | 45 +++ ...objectstypemappingdefinition.properties.md | 11 + src/core/server/index.ts | 10 + src/core/server/legacy/legacy_service.mock.ts | 17 +- src/core/server/legacy/legacy_service.test.ts | 4 +- src/core/server/legacy/legacy_service.ts | 2 + src/core/server/mocks.ts | 14 +- src/core/server/plugins/plugin_context.ts | 1 + .../__snapshots__/utils.test.ts.snap | 144 ++++++++ src/core/server/saved_objects/index.ts | 21 +- .../server/saved_objects/mappings/index.ts | 11 +- .../mappings/lib/get_property.test.ts | 4 +- .../mappings/lib/get_property.ts | 13 +- .../lib/get_root_properties_objects.ts | 10 +- .../server/saved_objects/mappings/types.ts | 142 ++++++-- .../core/build_active_mappings.test.ts | 10 +- .../migrations/core/build_active_mappings.ts | 36 +- .../migrations/core/build_index_map.test.ts | 70 ++-- .../migrations/core/build_index_map.ts | 27 +- .../migrations/core/document_migrator.test.ts | 311 +++++++++++------- .../migrations/core/document_migrator.ts | 140 ++++---- .../migrations/core/index_migrator.test.ts | 8 +- .../migrations/core/migrate_raw_docs.test.ts | 26 +- .../migrations/core/migrate_raw_docs.ts | 10 +- .../migrations/core/migration_context.ts | 9 +- .../core/migration_coordinator.test.ts | 1 + .../migrations/core/migration_logger.ts | 5 + .../server/saved_objects/migrations/index.ts | 1 + .../kibana_migrator.test.ts.snap | 16 +- .../migrations/kibana/kibana_migrator.mock.ts | 29 +- .../migrations/kibana/kibana_migrator.test.ts | 103 +++--- .../migrations/kibana/kibana_migrator.ts | 60 ++-- .../server/saved_objects/migrations/types.ts | 51 +++ .../saved_objects_service.mock.ts | 44 ++- .../saved_objects_service.test.mocks.ts | 6 + .../saved_objects_service.test.ts | 20 ++ .../saved_objects/saved_objects_service.ts | 59 ++-- ...ts => saved_objects_type_registry.mock.ts} | 28 +- .../saved_objects_type_registry.test.ts | 215 ++++++++++++ .../saved_objects_type_registry.ts | 86 +++++ .../server/saved_objects/schema/schema.ts | 17 +- .../saved_objects/serialization/index.ts | 166 +--------- ...rialization.test.ts => serializer.test.ts} | 205 ++++++------ .../saved_objects/serialization/serializer.ts | 151 +++++++++ .../saved_objects/serialization/types.ts | 79 +++++ .../service/lib/repository.test.js | 115 ++++++- .../saved_objects/service/lib/repository.ts | 55 ++-- .../lib/repository_create_repository.test.ts | 72 ++-- .../lib/search_dsl/query_params.test.ts | 61 ++-- .../service/lib/search_dsl/query_params.ts | 16 +- .../service/lib/search_dsl/search_dsl.test.ts | 22 +- .../service/lib/search_dsl/search_dsl.ts | 6 +- src/core/server/saved_objects/types.ts | 87 ++++- src/core/server/saved_objects/utils.test.ts | 285 ++++++++++++++++ src/core/server/saved_objects/utils.ts | 76 +++++ src/core/server/server.api.md | 108 +++++- src/es_archiver/lib/indices/kibana_index.ts | 16 +- .../migrations/migrations_730.test.ts | 1 + src/legacy/server/kbn_server.d.ts | 1 + .../saved_objects/saved_objects_mixin.js | 10 +- .../saved_objects/saved_objects_mixin.test.js | 54 ++- .../apis/saved_objects/migrations.js | 25 +- .../plugins/task_manager/server/index.ts | 4 +- .../server/create_task_manager.test.ts | 9 +- .../server/create_task_manager.ts | 10 +- x-pack/plugins/task_manager/server/plugin.ts | 7 +- .../task_manager/server/task_manager.test.ts | 4 +- .../task_manager/server/task_store.test.ts | 4 +- 104 files changed, 3055 insertions(+), 944 deletions(-) create mode 100644 docs/development/core/server/kibana-plugin-server.savedobjectmigrationfn.md create mode 100644 docs/development/core/server/kibana-plugin-server.savedobjectmigrationmap.md create mode 100644 docs/development/core/server/kibana-plugin-server.savedobjectsanitizeddoc.md create mode 100644 docs/development/core/server/kibana-plugin-server.savedobjectscomplexfieldmapping.dynamic.md create mode 100644 docs/development/core/server/kibana-plugin-server.savedobjectscomplexfieldmapping.md create mode 100644 docs/development/core/server/kibana-plugin-server.savedobjectscomplexfieldmapping.properties.md create mode 100644 docs/development/core/server/kibana-plugin-server.savedobjectscomplexfieldmapping.type.md create mode 100644 docs/development/core/server/kibana-plugin-server.savedobjectscorefieldmapping.enabled.md create mode 100644 docs/development/core/server/kibana-plugin-server.savedobjectscorefieldmapping.fields.md create mode 100644 docs/development/core/server/kibana-plugin-server.savedobjectscorefieldmapping.index.md create mode 100644 docs/development/core/server/kibana-plugin-server.savedobjectscorefieldmapping.md create mode 100644 docs/development/core/server/kibana-plugin-server.savedobjectscorefieldmapping.type.md create mode 100644 docs/development/core/server/kibana-plugin-server.savedobjectsfieldmapping.md create mode 100644 docs/development/core/server/kibana-plugin-server.savedobjectsmappingproperties.md create mode 100644 docs/development/core/server/kibana-plugin-server.savedobjectsmigrationlogger.warn.md create mode 100644 docs/development/core/server/kibana-plugin-server.savedobjectsserializer.generaterawid.md create mode 100644 docs/development/core/server/kibana-plugin-server.savedobjectsserializer.israwsavedobject.md create mode 100644 docs/development/core/server/kibana-plugin-server.savedobjectsserializer.md create mode 100644 docs/development/core/server/kibana-plugin-server.savedobjectsserializer.rawtosavedobject.md create mode 100644 docs/development/core/server/kibana-plugin-server.savedobjectsserializer.savedobjecttoraw.md create mode 100644 docs/development/core/server/kibana-plugin-server.savedobjectsservicestart.createserializer.md create mode 100644 docs/development/core/server/kibana-plugin-server.savedobjectstype.converttoaliasscript.md create mode 100644 docs/development/core/server/kibana-plugin-server.savedobjectstype.hidden.md create mode 100644 docs/development/core/server/kibana-plugin-server.savedobjectstype.indexpattern.md create mode 100644 docs/development/core/server/kibana-plugin-server.savedobjectstype.mappings.md create mode 100644 docs/development/core/server/kibana-plugin-server.savedobjectstype.md create mode 100644 docs/development/core/server/kibana-plugin-server.savedobjectstype.migrations.md create mode 100644 docs/development/core/server/kibana-plugin-server.savedobjectstype.name.md create mode 100644 docs/development/core/server/kibana-plugin-server.savedobjectstype.namespaceagnostic.md create mode 100644 docs/development/core/server/kibana-plugin-server.savedobjectstypemappingdefinition.md create mode 100644 docs/development/core/server/kibana-plugin-server.savedobjectstypemappingdefinition.properties.md create mode 100644 src/core/server/saved_objects/__snapshots__/utils.test.ts.snap create mode 100644 src/core/server/saved_objects/migrations/types.ts rename src/core/server/saved_objects/{schema/schema.mock.ts => saved_objects_type_registry.mock.ts} (58%) create mode 100644 src/core/server/saved_objects/saved_objects_type_registry.test.ts create mode 100644 src/core/server/saved_objects/saved_objects_type_registry.ts rename src/core/server/saved_objects/serialization/{serialization.test.ts => serializer.test.ts} (79%) create mode 100644 src/core/server/saved_objects/serialization/serializer.ts create mode 100644 src/core/server/saved_objects/serialization/types.ts create mode 100644 src/core/server/saved_objects/utils.test.ts create mode 100644 src/core/server/saved_objects/utils.ts diff --git a/docs/development/core/server/kibana-plugin-server.md b/docs/development/core/server/kibana-plugin-server.md index a3abeff44c25c..482f014b226b9 100644 --- a/docs/development/core/server/kibana-plugin-server.md +++ b/docs/development/core/server/kibana-plugin-server.md @@ -25,6 +25,7 @@ The plugin integrates with the core system via lifecycle events: `setup` | [SavedObjectsClient](./kibana-plugin-server.savedobjectsclient.md) | | | [SavedObjectsErrorHelpers](./kibana-plugin-server.savedobjectserrorhelpers.md) | | | [SavedObjectsRepository](./kibana-plugin-server.savedobjectsrepository.md) | | +| [SavedObjectsSerializer](./kibana-plugin-server.savedobjectsserializer.md) | A serializer that can be used to manually convert [raw](./kibana-plugin-server.savedobjectsrawdoc.md) or [sanitized](./kibana-plugin-server.savedobjectsanitizeddoc.md) documents to the other kind. | | [ScopedClusterClient](./kibana-plugin-server.scopedclusterclient.md) | Serves the same purpose as "normal" ClusterClient but exposes additional callAsCurrentUser method that doesn't use credentials of the Kibana internal user (as callAsInternalUser does) to request Elasticsearch API, but rather passes HTTP headers extracted from the current user request to the API.See [ScopedClusterClient](./kibana-plugin-server.scopedclusterclient.md). | ## Enumerations @@ -106,6 +107,7 @@ The plugin integrates with the core system via lifecycle events: `setup` | [RouteValidatorOptions](./kibana-plugin-server.routevalidatoroptions.md) | Additional options for the RouteValidator class to modify its default behaviour. | | [SavedObject](./kibana-plugin-server.savedobject.md) | | | [SavedObjectAttributes](./kibana-plugin-server.savedobjectattributes.md) | The data for a Saved Object is stored as an object in the attributes property. | +| [SavedObjectMigrationMap](./kibana-plugin-server.savedobjectmigrationmap.md) | A map of [migration functions](./kibana-plugin-server.savedobjectmigrationfn.md) to be used for a given type. The map's keys must be valid semver versions.For a given document, only migrations with a higher version number than that of the document will be applied. Migrations are executed in order, starting from the lowest version and ending with the highest one. | | [SavedObjectReference](./kibana-plugin-server.savedobjectreference.md) | A reference to another saved object. | | [SavedObjectsBaseOptions](./kibana-plugin-server.savedobjectsbaseoptions.md) | | | [SavedObjectsBulkCreateObject](./kibana-plugin-server.savedobjectsbulkcreateobject.md) | | @@ -116,6 +118,8 @@ The plugin integrates with the core system via lifecycle events: `setup` | [SavedObjectsBulkUpdateResponse](./kibana-plugin-server.savedobjectsbulkupdateresponse.md) | | | [SavedObjectsClientProviderOptions](./kibana-plugin-server.savedobjectsclientprovideroptions.md) | Options to control the creation of the Saved Objects Client. | | [SavedObjectsClientWrapperOptions](./kibana-plugin-server.savedobjectsclientwrapperoptions.md) | Options passed to each SavedObjectsClientWrapperFactory to aid in creating the wrapper instance. | +| [SavedObjectsComplexFieldMapping](./kibana-plugin-server.savedobjectscomplexfieldmapping.md) | See [SavedObjectsFieldMapping](./kibana-plugin-server.savedobjectsfieldmapping.md) for documentation. | +| [SavedObjectsCoreFieldMapping](./kibana-plugin-server.savedobjectscorefieldmapping.md) | See [SavedObjectsFieldMapping](./kibana-plugin-server.savedobjectsfieldmapping.md) for documentation. | | [SavedObjectsCreateOptions](./kibana-plugin-server.savedobjectscreateoptions.md) | | | [SavedObjectsDeleteByNamespaceOptions](./kibana-plugin-server.savedobjectsdeletebynamespaceoptions.md) | | | [SavedObjectsDeleteOptions](./kibana-plugin-server.savedobjectsdeleteoptions.md) | | @@ -132,6 +136,7 @@ The plugin integrates with the core system via lifecycle events: `setup` | [SavedObjectsImportUnknownError](./kibana-plugin-server.savedobjectsimportunknownerror.md) | Represents a failure to import due to an unknown reason. | | [SavedObjectsImportUnsupportedTypeError](./kibana-plugin-server.savedobjectsimportunsupportedtypeerror.md) | Represents a failure to import due to having an unsupported saved object type. | | [SavedObjectsIncrementCounterOptions](./kibana-plugin-server.savedobjectsincrementcounteroptions.md) | | +| [SavedObjectsMappingProperties](./kibana-plugin-server.savedobjectsmappingproperties.md) | Describe the fields of a [saved object type](./kibana-plugin-server.savedobjectstypemappingdefinition.md). | | [SavedObjectsMigrationLogger](./kibana-plugin-server.savedobjectsmigrationlogger.md) | | | [SavedObjectsMigrationVersion](./kibana-plugin-server.savedobjectsmigrationversion.md) | Information about the migrations that have been applied to this SavedObject. When Kibana starts up, KibanaMigrator detects outdated documents and migrates them based on this value. For each migration that has been applied, the plugin's name is used as a key and the latest migration version as the value. | | [SavedObjectsRawDoc](./kibana-plugin-server.savedobjectsrawdoc.md) | A raw document as represented directly in the saved object index. | @@ -139,6 +144,8 @@ The plugin integrates with the core system via lifecycle events: `setup` | [SavedObjectsResolveImportErrorsOptions](./kibana-plugin-server.savedobjectsresolveimporterrorsoptions.md) | Options to control the "resolve import" operation. | | [SavedObjectsServiceSetup](./kibana-plugin-server.savedobjectsservicesetup.md) | Saved Objects is Kibana's data persistence mechanism allowing plugins to use Elasticsearch for storing and querying state. The SavedObjectsServiceSetup API exposes methods for creating and registering Saved Object client wrappers. | | [SavedObjectsServiceStart](./kibana-plugin-server.savedobjectsservicestart.md) | Saved Objects is Kibana's data persisentence mechanism allowing plugins to use Elasticsearch for storing and querying state. The SavedObjectsServiceStart API provides a scoped Saved Objects client for interacting with Saved Objects. | +| [SavedObjectsType](./kibana-plugin-server.savedobjectstype.md) | | +| [SavedObjectsTypeMappingDefinition](./kibana-plugin-server.savedobjectstypemappingdefinition.md) | Describe a saved object type mapping. | | [SavedObjectsUpdateOptions](./kibana-plugin-server.savedobjectsupdateoptions.md) | | | [SavedObjectsUpdateResponse](./kibana-plugin-server.savedobjectsupdateresponse.md) | | | [SessionCookieValidationResult](./kibana-plugin-server.sessioncookievalidationresult.md) | Return type from a function to validate cookie contents. | @@ -218,10 +225,13 @@ The plugin integrates with the core system via lifecycle events: `setup` | [RouteValidatorFullConfig](./kibana-plugin-server.routevalidatorfullconfig.md) | Route validations config and options merged into one object | | [SavedObjectAttribute](./kibana-plugin-server.savedobjectattribute.md) | Type definition for a Saved Object attribute value | | [SavedObjectAttributeSingle](./kibana-plugin-server.savedobjectattributesingle.md) | Don't use this type, it's simply a helper type for [SavedObjectAttribute](./kibana-plugin-server.savedobjectattribute.md) | +| [SavedObjectMigrationFn](./kibana-plugin-server.savedobjectmigrationfn.md) | A migration function defined for a [saved objects type](./kibana-plugin-server.savedobjectstype.md) used to migrate it's | +| [SavedObjectSanitizedDoc](./kibana-plugin-server.savedobjectsanitizeddoc.md) | | | [SavedObjectsClientContract](./kibana-plugin-server.savedobjectsclientcontract.md) | Saved Objects is Kibana's data persisentence mechanism allowing plugins to use Elasticsearch for storing plugin state.\#\# SavedObjectsClient errorsSince the SavedObjectsClient has its hands in everything we are a little paranoid about the way we present errors back to to application code. Ideally, all errors will be either:1. Caused by bad implementation (ie. undefined is not a function) and as such unpredictable 2. An error that has been classified and decorated appropriately by the decorators in [SavedObjectsErrorHelpers](./kibana-plugin-server.savedobjectserrorhelpers.md)Type 1 errors are inevitable, but since all expected/handle-able errors should be Type 2 the isXYZError() helpers exposed at SavedObjectsErrorHelpers should be used to understand and manage error responses from the SavedObjectsClient.Type 2 errors are decorated versions of the source error, so if the elasticsearch client threw an error it will be decorated based on its type. That means that rather than looking for error.body.error.type or doing substring checks on error.body.error.reason, just use the helpers to understand the meaning of the error:\`\`\`js if (SavedObjectsErrorHelpers.isNotFoundError(error)) { // handle 404 }if (SavedObjectsErrorHelpers.isNotAuthorizedError(error)) { // 401 handling should be automatic, but in case you wanted to know }// always rethrow the error unless you handle it throw error; \`\`\`\#\#\# 404s from missing indexFrom the perspective of application code and APIs the SavedObjectsClient is a black box that persists objects. One of the internal details that users have no control over is that we use an elasticsearch index for persistance and that index might be missing.At the time of writing we are in the process of transitioning away from the operating assumption that the SavedObjects index is always available. Part of this transition is handling errors resulting from an index missing. These used to trigger a 500 error in most cases, and in others cause 404s with different error messages.From my (Spencer) perspective, a 404 from the SavedObjectsApi is a 404; The object the request/call was targeting could not be found. This is why \#14141 takes special care to ensure that 404 errors are generic and don't distinguish between index missing or document missing.\#\#\# 503s from missing indexUnlike all other methods, create requests are supposed to succeed even when the Kibana index does not exist because it will be automatically created by elasticsearch. When that is not the case it is because Elasticsearch's action.auto_create_index setting prevents it from being created automatically so we throw a special 503 with the intention of informing the user that their Elasticsearch settings need to be updated.See [SavedObjectsClient](./kibana-plugin-server.savedobjectsclient.md) See [SavedObjectsErrorHelpers](./kibana-plugin-server.savedobjectserrorhelpers.md) | | [SavedObjectsClientFactory](./kibana-plugin-server.savedobjectsclientfactory.md) | Describes the factory used to create instances of the Saved Objects Client. | | [SavedObjectsClientFactoryProvider](./kibana-plugin-server.savedobjectsclientfactoryprovider.md) | Provider to invoke to retrieve a [SavedObjectsClientFactory](./kibana-plugin-server.savedobjectsclientfactory.md). | | [SavedObjectsClientWrapperFactory](./kibana-plugin-server.savedobjectsclientwrapperfactory.md) | Describes the factory used to create instances of Saved Objects Client Wrappers. | +| [SavedObjectsFieldMapping](./kibana-plugin-server.savedobjectsfieldmapping.md) | Describe a [saved object type mapping](./kibana-plugin-server.savedobjectstypemappingdefinition.md) field.Please refer to [elasticsearch documentation](https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-types.html) For the mapping documentation | | [ScopeableRequest](./kibana-plugin-server.scopeablerequest.md) | A user credentials container. It accommodates the necessary auth credentials to impersonate the current user.See [KibanaRequest](./kibana-plugin-server.kibanarequest.md). | | [SharedGlobalConfig](./kibana-plugin-server.sharedglobalconfig.md) | | | [StringValidation](./kibana-plugin-server.stringvalidation.md) | Allows regex objects or a regex string | diff --git a/docs/development/core/server/kibana-plugin-server.savedobjectmigrationfn.md b/docs/development/core/server/kibana-plugin-server.savedobjectmigrationfn.md new file mode 100644 index 0000000000000..629d748083737 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-server.savedobjectmigrationfn.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [kibana-plugin-server](./kibana-plugin-server.md) > [SavedObjectMigrationFn](./kibana-plugin-server.savedobjectmigrationfn.md) + +## SavedObjectMigrationFn type + +A migration function defined for a [saved objects type](./kibana-plugin-server.savedobjectstype.md) used to migrate it's + +Signature: + +```typescript +export declare type SavedObjectMigrationFn = (doc: SavedObjectUnsanitizedDoc, log: SavedObjectsMigrationLogger) => SavedObjectUnsanitizedDoc; +``` diff --git a/docs/development/core/server/kibana-plugin-server.savedobjectmigrationmap.md b/docs/development/core/server/kibana-plugin-server.savedobjectmigrationmap.md new file mode 100644 index 0000000000000..1f49b44f73a72 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-server.savedobjectmigrationmap.md @@ -0,0 +1,27 @@ + + +[Home](./index.md) > [kibana-plugin-server](./kibana-plugin-server.md) > [SavedObjectMigrationMap](./kibana-plugin-server.savedobjectmigrationmap.md) + +## SavedObjectMigrationMap interface + +A map of [migration functions](./kibana-plugin-server.savedobjectmigrationfn.md) to be used for a given type. The map's keys must be valid semver versions. + +For a given document, only migrations with a higher version number than that of the document will be applied. Migrations are executed in order, starting from the lowest version and ending with the highest one. + +Signature: + +```typescript +export interface SavedObjectMigrationMap +``` + +## Example + + +```typescript +const migrations: SavedObjectMigrationMap = { + '1.0.0': migrateToV1, + '2.1.0': migrateToV21 +} + +``` + diff --git a/docs/development/core/server/kibana-plugin-server.savedobjectsanitizeddoc.md b/docs/development/core/server/kibana-plugin-server.savedobjectsanitizeddoc.md new file mode 100644 index 0000000000000..3c7cd591cd41b --- /dev/null +++ b/docs/development/core/server/kibana-plugin-server.savedobjectsanitizeddoc.md @@ -0,0 +1,12 @@ + + +[Home](./index.md) > [kibana-plugin-server](./kibana-plugin-server.md) > [SavedObjectSanitizedDoc](./kibana-plugin-server.savedobjectsanitizeddoc.md) + +## SavedObjectSanitizedDoc type + + +Signature: + +```typescript +export declare type SavedObjectSanitizedDoc = SavedObjectDoc & Referencable; +``` diff --git a/docs/development/core/server/kibana-plugin-server.savedobjectscomplexfieldmapping.dynamic.md b/docs/development/core/server/kibana-plugin-server.savedobjectscomplexfieldmapping.dynamic.md new file mode 100644 index 0000000000000..44e548c611b02 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-server.savedobjectscomplexfieldmapping.dynamic.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-server](./kibana-plugin-server.md) > [SavedObjectsComplexFieldMapping](./kibana-plugin-server.savedobjectscomplexfieldmapping.md) > [dynamic](./kibana-plugin-server.savedobjectscomplexfieldmapping.dynamic.md) + +## SavedObjectsComplexFieldMapping.dynamic property + +Signature: + +```typescript +dynamic?: string; +``` diff --git a/docs/development/core/server/kibana-plugin-server.savedobjectscomplexfieldmapping.md b/docs/development/core/server/kibana-plugin-server.savedobjectscomplexfieldmapping.md new file mode 100644 index 0000000000000..ecb5ec0e88911 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-server.savedobjectscomplexfieldmapping.md @@ -0,0 +1,22 @@ + + +[Home](./index.md) > [kibana-plugin-server](./kibana-plugin-server.md) > [SavedObjectsComplexFieldMapping](./kibana-plugin-server.savedobjectscomplexfieldmapping.md) + +## SavedObjectsComplexFieldMapping interface + +See [SavedObjectsFieldMapping](./kibana-plugin-server.savedobjectsfieldmapping.md) for documentation. + +Signature: + +```typescript +export interface SavedObjectsComplexFieldMapping +``` + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [dynamic](./kibana-plugin-server.savedobjectscomplexfieldmapping.dynamic.md) | string | | +| [properties](./kibana-plugin-server.savedobjectscomplexfieldmapping.properties.md) | SavedObjectsMappingProperties | | +| [type](./kibana-plugin-server.savedobjectscomplexfieldmapping.type.md) | string | | + diff --git a/docs/development/core/server/kibana-plugin-server.savedobjectscomplexfieldmapping.properties.md b/docs/development/core/server/kibana-plugin-server.savedobjectscomplexfieldmapping.properties.md new file mode 100644 index 0000000000000..7ceb0f8ee43c5 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-server.savedobjectscomplexfieldmapping.properties.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-server](./kibana-plugin-server.md) > [SavedObjectsComplexFieldMapping](./kibana-plugin-server.savedobjectscomplexfieldmapping.md) > [properties](./kibana-plugin-server.savedobjectscomplexfieldmapping.properties.md) + +## SavedObjectsComplexFieldMapping.properties property + +Signature: + +```typescript +properties: SavedObjectsMappingProperties; +``` diff --git a/docs/development/core/server/kibana-plugin-server.savedobjectscomplexfieldmapping.type.md b/docs/development/core/server/kibana-plugin-server.savedobjectscomplexfieldmapping.type.md new file mode 100644 index 0000000000000..ef0db5123c927 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-server.savedobjectscomplexfieldmapping.type.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-server](./kibana-plugin-server.md) > [SavedObjectsComplexFieldMapping](./kibana-plugin-server.savedobjectscomplexfieldmapping.md) > [type](./kibana-plugin-server.savedobjectscomplexfieldmapping.type.md) + +## SavedObjectsComplexFieldMapping.type property + +Signature: + +```typescript +type?: string; +``` diff --git a/docs/development/core/server/kibana-plugin-server.savedobjectscorefieldmapping.enabled.md b/docs/development/core/server/kibana-plugin-server.savedobjectscorefieldmapping.enabled.md new file mode 100644 index 0000000000000..b7e4203977763 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-server.savedobjectscorefieldmapping.enabled.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-server](./kibana-plugin-server.md) > [SavedObjectsCoreFieldMapping](./kibana-plugin-server.savedobjectscorefieldmapping.md) > [enabled](./kibana-plugin-server.savedobjectscorefieldmapping.enabled.md) + +## SavedObjectsCoreFieldMapping.enabled property + +Signature: + +```typescript +enabled?: boolean; +``` diff --git a/docs/development/core/server/kibana-plugin-server.savedobjectscorefieldmapping.fields.md b/docs/development/core/server/kibana-plugin-server.savedobjectscorefieldmapping.fields.md new file mode 100644 index 0000000000000..880ef36cd73fc --- /dev/null +++ b/docs/development/core/server/kibana-plugin-server.savedobjectscorefieldmapping.fields.md @@ -0,0 +1,15 @@ + + +[Home](./index.md) > [kibana-plugin-server](./kibana-plugin-server.md) > [SavedObjectsCoreFieldMapping](./kibana-plugin-server.savedobjectscorefieldmapping.md) > [fields](./kibana-plugin-server.savedobjectscorefieldmapping.fields.md) + +## SavedObjectsCoreFieldMapping.fields property + +Signature: + +```typescript +fields?: { + [subfield: string]: { + type: string; + }; + }; +``` diff --git a/docs/development/core/server/kibana-plugin-server.savedobjectscorefieldmapping.index.md b/docs/development/core/server/kibana-plugin-server.savedobjectscorefieldmapping.index.md new file mode 100644 index 0000000000000..31ff5a1d51948 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-server.savedobjectscorefieldmapping.index.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-server](./kibana-plugin-server.md) > [SavedObjectsCoreFieldMapping](./kibana-plugin-server.savedobjectscorefieldmapping.md) > [index](./kibana-plugin-server.savedobjectscorefieldmapping.index.md) + +## SavedObjectsCoreFieldMapping.index property + +Signature: + +```typescript +index?: boolean; +``` diff --git a/docs/development/core/server/kibana-plugin-server.savedobjectscorefieldmapping.md b/docs/development/core/server/kibana-plugin-server.savedobjectscorefieldmapping.md new file mode 100644 index 0000000000000..4287921997098 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-server.savedobjectscorefieldmapping.md @@ -0,0 +1,23 @@ + + +[Home](./index.md) > [kibana-plugin-server](./kibana-plugin-server.md) > [SavedObjectsCoreFieldMapping](./kibana-plugin-server.savedobjectscorefieldmapping.md) + +## SavedObjectsCoreFieldMapping interface + +See [SavedObjectsFieldMapping](./kibana-plugin-server.savedobjectsfieldmapping.md) for documentation. + +Signature: + +```typescript +export interface SavedObjectsCoreFieldMapping +``` + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [enabled](./kibana-plugin-server.savedobjectscorefieldmapping.enabled.md) | boolean | | +| [fields](./kibana-plugin-server.savedobjectscorefieldmapping.fields.md) | {
[subfield: string]: {
type: string;
};
} | | +| [index](./kibana-plugin-server.savedobjectscorefieldmapping.index.md) | boolean | | +| [type](./kibana-plugin-server.savedobjectscorefieldmapping.type.md) | string | | + diff --git a/docs/development/core/server/kibana-plugin-server.savedobjectscorefieldmapping.type.md b/docs/development/core/server/kibana-plugin-server.savedobjectscorefieldmapping.type.md new file mode 100644 index 0000000000000..8071217af861f --- /dev/null +++ b/docs/development/core/server/kibana-plugin-server.savedobjectscorefieldmapping.type.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-server](./kibana-plugin-server.md) > [SavedObjectsCoreFieldMapping](./kibana-plugin-server.savedobjectscorefieldmapping.md) > [type](./kibana-plugin-server.savedobjectscorefieldmapping.type.md) + +## SavedObjectsCoreFieldMapping.type property + +Signature: + +```typescript +type: string; +``` diff --git a/docs/development/core/server/kibana-plugin-server.savedobjectsfieldmapping.md b/docs/development/core/server/kibana-plugin-server.savedobjectsfieldmapping.md new file mode 100644 index 0000000000000..f31e18e8df670 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-server.savedobjectsfieldmapping.md @@ -0,0 +1,15 @@ + + +[Home](./index.md) > [kibana-plugin-server](./kibana-plugin-server.md) > [SavedObjectsFieldMapping](./kibana-plugin-server.savedobjectsfieldmapping.md) + +## SavedObjectsFieldMapping type + +Describe a [saved object type mapping](./kibana-plugin-server.savedobjectstypemappingdefinition.md) field. + +Please refer to [elasticsearch documentation](https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-types.html) For the mapping documentation + +Signature: + +```typescript +export declare type SavedObjectsFieldMapping = SavedObjectsCoreFieldMapping | SavedObjectsComplexFieldMapping; +``` diff --git a/docs/development/core/server/kibana-plugin-server.savedobjectsmappingproperties.md b/docs/development/core/server/kibana-plugin-server.savedobjectsmappingproperties.md new file mode 100644 index 0000000000000..23c5a83afc1f8 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-server.savedobjectsmappingproperties.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [kibana-plugin-server](./kibana-plugin-server.md) > [SavedObjectsMappingProperties](./kibana-plugin-server.savedobjectsmappingproperties.md) + +## SavedObjectsMappingProperties interface + +Describe the fields of a [saved object type](./kibana-plugin-server.savedobjectstypemappingdefinition.md). + +Signature: + +```typescript +export interface SavedObjectsMappingProperties +``` diff --git a/docs/development/core/server/kibana-plugin-server.savedobjectsmigrationlogger.md b/docs/development/core/server/kibana-plugin-server.savedobjectsmigrationlogger.md index a98d88700cd55..1b8db4a6c9f8d 100644 --- a/docs/development/core/server/kibana-plugin-server.savedobjectsmigrationlogger.md +++ b/docs/development/core/server/kibana-plugin-server.savedobjectsmigrationlogger.md @@ -17,5 +17,6 @@ export interface SavedObjectsMigrationLogger | --- | --- | --- | | [debug](./kibana-plugin-server.savedobjectsmigrationlogger.debug.md) | (msg: string) => void | | | [info](./kibana-plugin-server.savedobjectsmigrationlogger.info.md) | (msg: string) => void | | +| [warn](./kibana-plugin-server.savedobjectsmigrationlogger.warn.md) | (msg: string) => void | | | [warning](./kibana-plugin-server.savedobjectsmigrationlogger.warning.md) | (msg: string) => void | | diff --git a/docs/development/core/server/kibana-plugin-server.savedobjectsmigrationlogger.warn.md b/docs/development/core/server/kibana-plugin-server.savedobjectsmigrationlogger.warn.md new file mode 100644 index 0000000000000..7ebb1dd5ee4d2 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-server.savedobjectsmigrationlogger.warn.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-server](./kibana-plugin-server.md) > [SavedObjectsMigrationLogger](./kibana-plugin-server.savedobjectsmigrationlogger.md) > [warn](./kibana-plugin-server.savedobjectsmigrationlogger.warn.md) + +## SavedObjectsMigrationLogger.warn property + +Signature: + +```typescript +warn: (msg: string) => void; +``` diff --git a/docs/development/core/server/kibana-plugin-server.savedobjectsmigrationlogger.warning.md b/docs/development/core/server/kibana-plugin-server.savedobjectsmigrationlogger.warning.md index a87955d603b70..689a799515094 100644 --- a/docs/development/core/server/kibana-plugin-server.savedobjectsmigrationlogger.warning.md +++ b/docs/development/core/server/kibana-plugin-server.savedobjectsmigrationlogger.warning.md @@ -4,6 +4,11 @@ ## SavedObjectsMigrationLogger.warning property +> Warning: This API is now obsolete. +> +> Use `warn` instead. +> + Signature: ```typescript diff --git a/docs/development/core/server/kibana-plugin-server.savedobjectsrawdoc._source.md b/docs/development/core/server/kibana-plugin-server.savedobjectsrawdoc._source.md index dcf207f8120ea..332df982b23eb 100644 --- a/docs/development/core/server/kibana-plugin-server.savedobjectsrawdoc._source.md +++ b/docs/development/core/server/kibana-plugin-server.savedobjectsrawdoc._source.md @@ -7,5 +7,5 @@ Signature: ```typescript -_source: any; +_source: SavedObjectsRawDocSource; ``` diff --git a/docs/development/core/server/kibana-plugin-server.savedobjectsrawdoc.md b/docs/development/core/server/kibana-plugin-server.savedobjectsrawdoc.md index b0130df01817f..3e3ad7da5aecd 100644 --- a/docs/development/core/server/kibana-plugin-server.savedobjectsrawdoc.md +++ b/docs/development/core/server/kibana-plugin-server.savedobjectsrawdoc.md @@ -9,7 +9,7 @@ A raw document as represented directly in the saved object index. Signature: ```typescript -export interface RawDoc +export interface SavedObjectsRawDoc ``` ## Properties @@ -19,6 +19,6 @@ export interface RawDoc | [\_id](./kibana-plugin-server.savedobjectsrawdoc._id.md) | string | | | [\_primary\_term](./kibana-plugin-server.savedobjectsrawdoc._primary_term.md) | number | | | [\_seq\_no](./kibana-plugin-server.savedobjectsrawdoc._seq_no.md) | number | | -| [\_source](./kibana-plugin-server.savedobjectsrawdoc._source.md) | any | | +| [\_source](./kibana-plugin-server.savedobjectsrawdoc._source.md) | SavedObjectsRawDocSource | | | [\_type](./kibana-plugin-server.savedobjectsrawdoc._type.md) | string | | diff --git a/docs/development/core/server/kibana-plugin-server.savedobjectsserializer.generaterawid.md b/docs/development/core/server/kibana-plugin-server.savedobjectsserializer.generaterawid.md new file mode 100644 index 0000000000000..50fb4433b33c8 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-server.savedobjectsserializer.generaterawid.md @@ -0,0 +1,26 @@ + + +[Home](./index.md) > [kibana-plugin-server](./kibana-plugin-server.md) > [SavedObjectsSerializer](./kibana-plugin-server.savedobjectsserializer.md) > [generateRawId](./kibana-plugin-server.savedobjectsserializer.generaterawid.md) + +## SavedObjectsSerializer.generateRawId() method + +Given a saved object type and id, generates the compound id that is stored in the raw document. + +Signature: + +```typescript +generateRawId(namespace: string | undefined, type: string, id?: string): string; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| namespace | string | undefined | | +| type | string | | +| id | string | | + +Returns: + +`string` + diff --git a/docs/development/core/server/kibana-plugin-server.savedobjectsserializer.israwsavedobject.md b/docs/development/core/server/kibana-plugin-server.savedobjectsserializer.israwsavedobject.md new file mode 100644 index 0000000000000..32d00ee1a9f7f --- /dev/null +++ b/docs/development/core/server/kibana-plugin-server.savedobjectsserializer.israwsavedobject.md @@ -0,0 +1,24 @@ + + +[Home](./index.md) > [kibana-plugin-server](./kibana-plugin-server.md) > [SavedObjectsSerializer](./kibana-plugin-server.savedobjectsserializer.md) > [isRawSavedObject](./kibana-plugin-server.savedobjectsserializer.israwsavedobject.md) + +## SavedObjectsSerializer.isRawSavedObject() method + +Determines whether or not the raw document can be converted to a saved object. + +Signature: + +```typescript +isRawSavedObject(rawDoc: SavedObjectsRawDoc): boolean; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| rawDoc | SavedObjectsRawDoc | | + +Returns: + +`boolean` + diff --git a/docs/development/core/server/kibana-plugin-server.savedobjectsserializer.md b/docs/development/core/server/kibana-plugin-server.savedobjectsserializer.md new file mode 100644 index 0000000000000..5fa84af147b40 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-server.savedobjectsserializer.md @@ -0,0 +1,29 @@ + + +[Home](./index.md) > [kibana-plugin-server](./kibana-plugin-server.md) > [SavedObjectsSerializer](./kibana-plugin-server.savedobjectsserializer.md) + +## SavedObjectsSerializer class + +A serializer that can be used to manually convert [raw](./kibana-plugin-server.savedobjectsrawdoc.md) or [sanitized](./kibana-plugin-server.savedobjectsanitizeddoc.md) documents to the other kind. + +Signature: + +```typescript +export declare class SavedObjectsSerializer +``` + +## Remarks + +Serializer instances should only be created and accessed by calling [SavedObjectsServiceStart.createSerializer](./kibana-plugin-server.savedobjectsservicestart.createserializer.md) + +The constructor for this class is marked as internal. Third-party code should not call the constructor directly or create subclasses that extend the `SavedObjectsSerializer` class. + +## Methods + +| Method | Modifiers | Description | +| --- | --- | --- | +| [generateRawId(namespace, type, id)](./kibana-plugin-server.savedobjectsserializer.generaterawid.md) | | Given a saved object type and id, generates the compound id that is stored in the raw document. | +| [isRawSavedObject(rawDoc)](./kibana-plugin-server.savedobjectsserializer.israwsavedobject.md) | | Determines whether or not the raw document can be converted to a saved object. | +| [rawToSavedObject(doc)](./kibana-plugin-server.savedobjectsserializer.rawtosavedobject.md) | | Converts a document from the format that is stored in elasticsearch to the saved object client format. | +| [savedObjectToRaw(savedObj)](./kibana-plugin-server.savedobjectsserializer.savedobjecttoraw.md) | | Converts a document from the saved object client format to the format that is stored in elasticsearch. | + diff --git a/docs/development/core/server/kibana-plugin-server.savedobjectsserializer.rawtosavedobject.md b/docs/development/core/server/kibana-plugin-server.savedobjectsserializer.rawtosavedobject.md new file mode 100644 index 0000000000000..6a8a006241297 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-server.savedobjectsserializer.rawtosavedobject.md @@ -0,0 +1,24 @@ + + +[Home](./index.md) > [kibana-plugin-server](./kibana-plugin-server.md) > [SavedObjectsSerializer](./kibana-plugin-server.savedobjectsserializer.md) > [rawToSavedObject](./kibana-plugin-server.savedobjectsserializer.rawtosavedobject.md) + +## SavedObjectsSerializer.rawToSavedObject() method + +Converts a document from the format that is stored in elasticsearch to the saved object client format. + +Signature: + +```typescript +rawToSavedObject(doc: SavedObjectsRawDoc): SavedObjectSanitizedDoc; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| doc | SavedObjectsRawDoc | | + +Returns: + +`SavedObjectSanitizedDoc` + diff --git a/docs/development/core/server/kibana-plugin-server.savedobjectsserializer.savedobjecttoraw.md b/docs/development/core/server/kibana-plugin-server.savedobjectsserializer.savedobjecttoraw.md new file mode 100644 index 0000000000000..b0d2043665b54 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-server.savedobjectsserializer.savedobjecttoraw.md @@ -0,0 +1,24 @@ + + +[Home](./index.md) > [kibana-plugin-server](./kibana-plugin-server.md) > [SavedObjectsSerializer](./kibana-plugin-server.savedobjectsserializer.md) > [savedObjectToRaw](./kibana-plugin-server.savedobjectsserializer.savedobjecttoraw.md) + +## SavedObjectsSerializer.savedObjectToRaw() method + +Converts a document from the saved object client format to the format that is stored in elasticsearch. + +Signature: + +```typescript +savedObjectToRaw(savedObj: SavedObjectSanitizedDoc): SavedObjectsRawDoc; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| savedObj | SavedObjectSanitizedDoc | | + +Returns: + +`SavedObjectsRawDoc` + diff --git a/docs/development/core/server/kibana-plugin-server.savedobjectsservicesetup.md b/docs/development/core/server/kibana-plugin-server.savedobjectsservicesetup.md index 64fb1f4a5f638..9981bfee0cb7d 100644 --- a/docs/development/core/server/kibana-plugin-server.savedobjectsservicesetup.md +++ b/docs/development/core/server/kibana-plugin-server.savedobjectsservicesetup.md @@ -20,9 +20,19 @@ When plugins access the Saved Objects client, a new client is created using the ## Example + +```ts import { SavedObjectsClient, CoreSetup } from 'src/core/server'; -export class Plugin() { setup: (core: CoreSetup) => { core.savedObjects.setClientFactory(({ request: KibanaRequest }) => { return new SavedObjectsClient(core.savedObjects.scopedRepository(request)); }) } } +export class Plugin() { + setup: (core: CoreSetup) => { + core.savedObjects.setClientFactory(({ request: KibanaRequest }) => { + return new SavedObjectsClient(core.savedObjects.scopedRepository(request)); + }) + } +} + +``` ## Properties diff --git a/docs/development/core/server/kibana-plugin-server.savedobjectsservicestart.createserializer.md b/docs/development/core/server/kibana-plugin-server.savedobjectsservicestart.createserializer.md new file mode 100644 index 0000000000000..b0e7ae1db89c1 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-server.savedobjectsservicestart.createserializer.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [kibana-plugin-server](./kibana-plugin-server.md) > [SavedObjectsServiceStart](./kibana-plugin-server.savedobjectsservicestart.md) > [createSerializer](./kibana-plugin-server.savedobjectsservicestart.createserializer.md) + +## SavedObjectsServiceStart.createSerializer property + +Creates a [serializer](./kibana-plugin-server.savedobjectsserializer.md) that is aware of all registered types. + +Signature: + +```typescript +createSerializer: () => SavedObjectsSerializer; +``` diff --git a/docs/development/core/server/kibana-plugin-server.savedobjectsservicestart.md b/docs/development/core/server/kibana-plugin-server.savedobjectsservicestart.md index cf2b4f57a7461..ad34d76bb33f4 100644 --- a/docs/development/core/server/kibana-plugin-server.savedobjectsservicestart.md +++ b/docs/development/core/server/kibana-plugin-server.savedobjectsservicestart.md @@ -18,5 +18,6 @@ export interface SavedObjectsServiceStart | --- | --- | --- | | [createInternalRepository](./kibana-plugin-server.savedobjectsservicestart.createinternalrepository.md) | (extraTypes?: string[]) => ISavedObjectsRepository | Creates a [Saved Objects repository](./kibana-plugin-server.isavedobjectsrepository.md) that uses the internal Kibana user for authenticating with Elasticsearch. | | [createScopedRepository](./kibana-plugin-server.savedobjectsservicestart.createscopedrepository.md) | (req: KibanaRequest, extraTypes?: string[]) => ISavedObjectsRepository | Creates a [Saved Objects repository](./kibana-plugin-server.isavedobjectsrepository.md) that uses the credentials from the passed in request to authenticate with Elasticsearch. | +| [createSerializer](./kibana-plugin-server.savedobjectsservicestart.createserializer.md) | () => SavedObjectsSerializer | Creates a [serializer](./kibana-plugin-server.savedobjectsserializer.md) that is aware of all registered types. | | [getScopedClient](./kibana-plugin-server.savedobjectsservicestart.getscopedclient.md) | (req: KibanaRequest, options?: SavedObjectsClientProviderOptions) => SavedObjectsClientContract | Creates a [Saved Objects client](./kibana-plugin-server.savedobjectsclientcontract.md) that uses the credentials from the passed in request to authenticate with Elasticsearch. If other plugins have registered Saved Objects client wrappers, these will be applied to extend the functionality of the client.A client that is already scoped to the incoming request is also exposed from the route handler context see [RequestHandlerContext](./kibana-plugin-server.requesthandlercontext.md). | diff --git a/docs/development/core/server/kibana-plugin-server.savedobjectstype.converttoaliasscript.md b/docs/development/core/server/kibana-plugin-server.savedobjectstype.converttoaliasscript.md new file mode 100644 index 0000000000000..f2519b2600e2f --- /dev/null +++ b/docs/development/core/server/kibana-plugin-server.savedobjectstype.converttoaliasscript.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [kibana-plugin-server](./kibana-plugin-server.md) > [SavedObjectsType](./kibana-plugin-server.savedobjectstype.md) > [convertToAliasScript](./kibana-plugin-server.savedobjectstype.converttoaliasscript.md) + +## SavedObjectsType.convertToAliasScript property + +If defined, will be used to convert the type to an alias. + +Signature: + +```typescript +convertToAliasScript?: string; +``` diff --git a/docs/development/core/server/kibana-plugin-server.savedobjectstype.hidden.md b/docs/development/core/server/kibana-plugin-server.savedobjectstype.hidden.md new file mode 100644 index 0000000000000..9e611bc8faf27 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-server.savedobjectstype.hidden.md @@ -0,0 +1,15 @@ + + +[Home](./index.md) > [kibana-plugin-server](./kibana-plugin-server.md) > [SavedObjectsType](./kibana-plugin-server.savedobjectstype.md) > [hidden](./kibana-plugin-server.savedobjectstype.hidden.md) + +## SavedObjectsType.hidden property + +Is the type hidden by default. If true, repositories will not have access to this type unless explicitly declared as an `extraType` when creating the repository. + +See [createInternalRepository](./kibana-plugin-server.savedobjectsservicestart.createinternalrepository.md). + +Signature: + +```typescript +hidden: boolean; +``` diff --git a/docs/development/core/server/kibana-plugin-server.savedobjectstype.indexpattern.md b/docs/development/core/server/kibana-plugin-server.savedobjectstype.indexpattern.md new file mode 100644 index 0000000000000..18cb6fe936060 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-server.savedobjectstype.indexpattern.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [kibana-plugin-server](./kibana-plugin-server.md) > [SavedObjectsType](./kibana-plugin-server.savedobjectstype.md) > [indexPattern](./kibana-plugin-server.savedobjectstype.indexpattern.md) + +## SavedObjectsType.indexPattern property + +If defined, the type instances will be stored in the given index instead of the default one. + +Signature: + +```typescript +indexPattern?: string; +``` diff --git a/docs/development/core/server/kibana-plugin-server.savedobjectstype.mappings.md b/docs/development/core/server/kibana-plugin-server.savedobjectstype.mappings.md new file mode 100644 index 0000000000000..3166a2604d728 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-server.savedobjectstype.mappings.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [kibana-plugin-server](./kibana-plugin-server.md) > [SavedObjectsType](./kibana-plugin-server.savedobjectstype.md) > [mappings](./kibana-plugin-server.savedobjectstype.mappings.md) + +## SavedObjectsType.mappings property + +The [mapping definition](./kibana-plugin-server.savedobjectstypemappingdefinition.md) for the type. + +Signature: + +```typescript +mappings: SavedObjectsTypeMappingDefinition; +``` diff --git a/docs/development/core/server/kibana-plugin-server.savedobjectstype.md b/docs/development/core/server/kibana-plugin-server.savedobjectstype.md new file mode 100644 index 0000000000000..1e989652e52bf --- /dev/null +++ b/docs/development/core/server/kibana-plugin-server.savedobjectstype.md @@ -0,0 +1,28 @@ + + +[Home](./index.md) > [kibana-plugin-server](./kibana-plugin-server.md) > [SavedObjectsType](./kibana-plugin-server.savedobjectstype.md) + +## SavedObjectsType interface + +Signature: + +```typescript +export interface SavedObjectsType +``` + +## Remarks + +This is only internal for now, and will only be public when we expose the registerType API + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [convertToAliasScript](./kibana-plugin-server.savedobjectstype.converttoaliasscript.md) | string | If defined, will be used to convert the type to an alias. | +| [hidden](./kibana-plugin-server.savedobjectstype.hidden.md) | boolean | Is the type hidden by default. If true, repositories will not have access to this type unless explicitly declared as an extraType when creating the repository.See [createInternalRepository](./kibana-plugin-server.savedobjectsservicestart.createinternalrepository.md). | +| [indexPattern](./kibana-plugin-server.savedobjectstype.indexpattern.md) | string | If defined, the type instances will be stored in the given index instead of the default one. | +| [mappings](./kibana-plugin-server.savedobjectstype.mappings.md) | SavedObjectsTypeMappingDefinition | The [mapping definition](./kibana-plugin-server.savedobjectstypemappingdefinition.md) for the type. | +| [migrations](./kibana-plugin-server.savedobjectstype.migrations.md) | SavedObjectMigrationMap | An optional map of [migrations](./kibana-plugin-server.savedobjectmigrationfn.md) to be used to migrate the type. | +| [name](./kibana-plugin-server.savedobjectstype.name.md) | string | The name of the type, which is also used as the internal id. | +| [namespaceAgnostic](./kibana-plugin-server.savedobjectstype.namespaceagnostic.md) | boolean | Is the type global (true), or namespaced (false). | + diff --git a/docs/development/core/server/kibana-plugin-server.savedobjectstype.migrations.md b/docs/development/core/server/kibana-plugin-server.savedobjectstype.migrations.md new file mode 100644 index 0000000000000..a7f933ef6e3f7 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-server.savedobjectstype.migrations.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [kibana-plugin-server](./kibana-plugin-server.md) > [SavedObjectsType](./kibana-plugin-server.savedobjectstype.md) > [migrations](./kibana-plugin-server.savedobjectstype.migrations.md) + +## SavedObjectsType.migrations property + +An optional map of [migrations](./kibana-plugin-server.savedobjectmigrationfn.md) to be used to migrate the type. + +Signature: + +```typescript +migrations?: SavedObjectMigrationMap; +``` diff --git a/docs/development/core/server/kibana-plugin-server.savedobjectstype.name.md b/docs/development/core/server/kibana-plugin-server.savedobjectstype.name.md new file mode 100644 index 0000000000000..444152d239cdf --- /dev/null +++ b/docs/development/core/server/kibana-plugin-server.savedobjectstype.name.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [kibana-plugin-server](./kibana-plugin-server.md) > [SavedObjectsType](./kibana-plugin-server.savedobjectstype.md) > [name](./kibana-plugin-server.savedobjectstype.name.md) + +## SavedObjectsType.name property + +The name of the type, which is also used as the internal id. + +Signature: + +```typescript +name: string; +``` diff --git a/docs/development/core/server/kibana-plugin-server.savedobjectstype.namespaceagnostic.md b/docs/development/core/server/kibana-plugin-server.savedobjectstype.namespaceagnostic.md new file mode 100644 index 0000000000000..5c68942276ec7 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-server.savedobjectstype.namespaceagnostic.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [kibana-plugin-server](./kibana-plugin-server.md) > [SavedObjectsType](./kibana-plugin-server.savedobjectstype.md) > [namespaceAgnostic](./kibana-plugin-server.savedobjectstype.namespaceagnostic.md) + +## SavedObjectsType.namespaceAgnostic property + +Is the type global (true), or namespaced (false). + +Signature: + +```typescript +namespaceAgnostic: boolean; +``` diff --git a/docs/development/core/server/kibana-plugin-server.savedobjectstypemappingdefinition.md b/docs/development/core/server/kibana-plugin-server.savedobjectstypemappingdefinition.md new file mode 100644 index 0000000000000..99983d3a9f02b --- /dev/null +++ b/docs/development/core/server/kibana-plugin-server.savedobjectstypemappingdefinition.md @@ -0,0 +1,45 @@ + + +[Home](./index.md) > [kibana-plugin-server](./kibana-plugin-server.md) > [SavedObjectsTypeMappingDefinition](./kibana-plugin-server.savedobjectstypemappingdefinition.md) + +## SavedObjectsTypeMappingDefinition interface + +Describe a saved object type mapping. + +Signature: + +```typescript +export interface SavedObjectsTypeMappingDefinition +``` + +## Example + + +```ts +const typeDefinition: SavedObjectsTypeMappingDefinition = { + properties: { + enabled: { + type: "boolean" + }, + sendUsageFrom: { + ignore_above: 256, + type: "keyword" + }, + lastReported: { + type: "date" + }, + lastVersionChecked: { + ignore_above: 256, + type: "keyword" + }, + } +} + +``` + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [properties](./kibana-plugin-server.savedobjectstypemappingdefinition.properties.md) | SavedObjectsMappingProperties | | + diff --git a/docs/development/core/server/kibana-plugin-server.savedobjectstypemappingdefinition.properties.md b/docs/development/core/server/kibana-plugin-server.savedobjectstypemappingdefinition.properties.md new file mode 100644 index 0000000000000..555870c3fdd7d --- /dev/null +++ b/docs/development/core/server/kibana-plugin-server.savedobjectstypemappingdefinition.properties.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-server](./kibana-plugin-server.md) > [SavedObjectsTypeMappingDefinition](./kibana-plugin-server.savedobjectstypemappingdefinition.md) > [properties](./kibana-plugin-server.savedobjectstypemappingdefinition.properties.md) + +## SavedObjectsTypeMappingDefinition.properties property + +Signature: + +```typescript +properties: SavedObjectsMappingProperties; +``` diff --git a/src/core/server/index.ts b/src/core/server/index.ts index c45acd7f0129a..cc838ddd1351d 100644 --- a/src/core/server/index.ts +++ b/src/core/server/index.ts @@ -197,6 +197,7 @@ export { SavedObjectsImportUnsupportedTypeError, SavedObjectsMigrationLogger, SavedObjectsRawDoc, + SavedObjectSanitizedDoc, SavedObjectsRepositoryFactory, SavedObjectsResolveImportErrorsOptions, SavedObjectsSchema, @@ -211,6 +212,15 @@ export { SavedObjectsRepository, SavedObjectsDeleteByNamespaceOptions, SavedObjectsIncrementCounterOptions, + SavedObjectsComplexFieldMapping, + SavedObjectsCoreFieldMapping, + SavedObjectsFieldMapping, + SavedObjectsTypeMappingDefinition, + SavedObjectsMappingProperties, + SavedObjectTypeRegistry, + SavedObjectsType, + SavedObjectMigrationMap, + SavedObjectMigrationFn, } from './saved_objects'; export { diff --git a/src/core/server/legacy/legacy_service.mock.ts b/src/core/server/legacy/legacy_service.mock.ts index 495141cdcb58d..44405dc391d8e 100644 --- a/src/core/server/legacy/legacy_service.mock.ts +++ b/src/core/server/legacy/legacy_service.mock.ts @@ -18,13 +18,18 @@ */ import { LegacyService } from './legacy_service'; -import { LegacyServiceDiscoverPlugins, LegacyServiceSetupDeps } from './types'; +import { LegacyConfig, LegacyServiceDiscoverPlugins, LegacyServiceSetupDeps } from './types'; type LegacyServiceMock = jest.Mocked & { legacyId: symbol }>; const createDiscoverPluginsMock = (): LegacyServiceDiscoverPlugins => ({ pluginSpecs: [], - uiExports: {} as any, + uiExports: { + savedObjectSchemas: {}, + savedObjectMappings: [], + savedObjectMigrations: {}, + savedObjectValidations: {}, + }, navLinks: [], pluginExtendedConfig: { get: jest.fn(), @@ -34,6 +39,7 @@ const createDiscoverPluginsMock = (): LegacyServiceDiscoverPlugins => ({ disabledPluginSpecs: [], settings: {}, }); + const createLegacyServiceMock = (): LegacyServiceMock => ({ legacyId: Symbol(), discoverPlugins: jest.fn().mockResolvedValue(createDiscoverPluginsMock()), @@ -42,8 +48,15 @@ const createLegacyServiceMock = (): LegacyServiceMock => ({ stop: jest.fn(), }); +const createLegacyConfigMock = (): jest.Mocked => ({ + get: jest.fn(), + has: jest.fn(), + set: jest.fn(), +}); + export const legacyServiceMock = { create: createLegacyServiceMock, createSetupContract: (deps: LegacyServiceSetupDeps) => createLegacyServiceMock().setup(deps), createDiscoverPlugins: createDiscoverPluginsMock, + createLegacyConfig: createLegacyConfigMock, }; diff --git a/src/core/server/legacy/legacy_service.test.ts b/src/core/server/legacy/legacy_service.test.ts index af4db68ee95e1..e8e20580a36db 100644 --- a/src/core/server/legacy/legacy_service.test.ts +++ b/src/core/server/legacy/legacy_service.test.ts @@ -83,7 +83,7 @@ beforeEach(() => { getAuthHeaders: () => undefined, } as any, }, - savedObjects: savedObjectsServiceMock.createSetupContract(), + savedObjects: savedObjectsServiceMock.createInternalSetupContract(), plugins: { contracts: new Map([['plugin-id', 'plugin-value']]), uiPlugins: { @@ -101,7 +101,7 @@ beforeEach(() => { startDeps = { core: { capabilities: capabilitiesServiceMock.createStartContract(), - savedObjects: savedObjectsServiceMock.createStartContract(), + savedObjects: savedObjectsServiceMock.createInternalStartContract(), uiSettings: uiSettingsServiceMock.createStartContract(), plugins: { contracts: new Map() }, }, diff --git a/src/core/server/legacy/legacy_service.ts b/src/core/server/legacy/legacy_service.ts index f9b18afadc938..b2501496d87ef 100644 --- a/src/core/server/legacy/legacy_service.ts +++ b/src/core/server/legacy/legacy_service.ts @@ -262,6 +262,7 @@ export class LegacyService implements CoreService { getScopedClient: startDeps.core.savedObjects.getScopedClient, createScopedRepository: startDeps.core.savedObjects.createScopedRepository, createInternalRepository: startDeps.core.savedObjects.createInternalRepository, + createSerializer: startDeps.core.savedObjects.createSerializer, }, uiSettings: { asScopedToClient: startDeps.core.uiSettings.asScopedToClient }, }; @@ -328,6 +329,7 @@ export class LegacyService implements CoreService { __internals: { hapiServer: setupDeps.core.http.server, kibanaMigrator: startDeps.core.savedObjects.migrator, + typeRegistry: startDeps.core.savedObjects.typeRegistry, uiPlugins: setupDeps.core.plugins.uiPlugins, elasticsearch: setupDeps.core.elasticsearch, rendering: setupDeps.core.rendering, diff --git a/src/core/server/mocks.ts b/src/core/server/mocks.ts index 97f836f8ef37d..9a7868d568ea0 100644 --- a/src/core/server/mocks.ts +++ b/src/core/server/mocks.ts @@ -38,6 +38,7 @@ export { httpServiceMock } from './http/http_service.mock'; export { loggingServiceMock } from './logging/logging_service.mock'; export { savedObjectsClientMock } from './saved_objects/service/saved_objects_client.mock'; export { savedObjectsRepositoryMock } from './saved_objects/service/lib/repository.mock'; +export { typeRegistryMock as savedObjectsTypeRegistryMock } from './saved_objects/saved_objects_type_registry.mock'; export { uiSettingsServiceMock } from './ui_settings/ui_settings_service.mock'; import { uuidServiceMock } from './uuid/uuid_service.mock'; @@ -112,12 +113,19 @@ function createCoreSetupMock() { const uiSettingsMock = { register: uiSettingsServiceMock.createSetupContract().register, }; + + const savedObjectsService = savedObjectsServiceMock.createSetupContract(); + const savedObjectMock: jest.Mocked = { + addClientWrapper: savedObjectsService.addClientWrapper, + setClientFactoryProvider: savedObjectsService.setClientFactoryProvider, + }; + const mock: CoreSetupMockType = { capabilities: capabilitiesServiceMock.createSetupContract(), context: contextServiceMock.createSetupContract(), elasticsearch: elasticsearchServiceMock.createSetup(), http: httpMock, - savedObjects: savedObjectsServiceMock.createSetupContract(), + savedObjects: savedObjectMock, uiSettings: uiSettingsMock, uuid: uuidServiceMock.createSetupContract(), getStartServices: jest @@ -145,7 +153,7 @@ function createInternalCoreSetupMock() { elasticsearch: elasticsearchServiceMock.createInternalSetup(), http: httpServiceMock.createSetupContract(), uiSettings: uiSettingsServiceMock.createSetupContract(), - savedObjects: savedObjectsServiceMock.createSetupContract(), + savedObjects: savedObjectsServiceMock.createInternalSetupContract(), uuid: uuidServiceMock.createSetupContract(), }; return setupDeps; @@ -154,7 +162,7 @@ function createInternalCoreSetupMock() { function createInternalCoreStartMock() { const startDeps: InternalCoreStart = { capabilities: capabilitiesServiceMock.createStartContract(), - savedObjects: savedObjectsServiceMock.createStartContract(), + savedObjects: savedObjectsServiceMock.createInternalStartContract(), uiSettings: uiSettingsServiceMock.createStartContract(), }; return startDeps; diff --git a/src/core/server/plugins/plugin_context.ts b/src/core/server/plugins/plugin_context.ts index 77300900e84f3..a7b555a9eba01 100644 --- a/src/core/server/plugins/plugin_context.ts +++ b/src/core/server/plugins/plugin_context.ts @@ -205,6 +205,7 @@ export function createPluginStartContext( getScopedClient: deps.savedObjects.getScopedClient, createInternalRepository: deps.savedObjects.createInternalRepository, createScopedRepository: deps.savedObjects.createScopedRepository, + createSerializer: deps.savedObjects.createSerializer, }, uiSettings: { asScopedToClient: deps.uiSettings.asScopedToClient, diff --git a/src/core/server/saved_objects/__snapshots__/utils.test.ts.snap b/src/core/server/saved_objects/__snapshots__/utils.test.ts.snap new file mode 100644 index 0000000000000..7846e7f1a802a --- /dev/null +++ b/src/core/server/saved_objects/__snapshots__/utils.test.ts.snap @@ -0,0 +1,144 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`convertLegacyTypes converts the legacy mappings using default values if no schemas are specified 1`] = ` +Array [ + Object { + "convertToAliasScript": undefined, + "hidden": false, + "indexPattern": undefined, + "mappings": Object { + "properties": Object { + "fieldA": Object { + "type": "text", + }, + }, + }, + "migrations": Object {}, + "name": "typeA", + "namespaceAgnostic": false, + }, + Object { + "convertToAliasScript": undefined, + "hidden": false, + "indexPattern": undefined, + "mappings": Object { + "properties": Object { + "fieldB": Object { + "type": "text", + }, + }, + }, + "migrations": Object {}, + "name": "typeB", + "namespaceAgnostic": false, + }, + Object { + "convertToAliasScript": undefined, + "hidden": false, + "indexPattern": undefined, + "mappings": Object { + "properties": Object { + "fieldC": Object { + "type": "text", + }, + }, + }, + "migrations": Object {}, + "name": "typeC", + "namespaceAgnostic": false, + }, +] +`; + +exports[`convertLegacyTypes merges everything when all are present 1`] = ` +Array [ + Object { + "convertToAliasScript": undefined, + "hidden": true, + "indexPattern": "myIndex", + "mappings": Object { + "properties": Object { + "fieldA": Object { + "type": "text", + }, + }, + }, + "migrations": Object { + "1.0.0": [MockFunction], + "2.0.4": [MockFunction], + }, + "name": "typeA", + "namespaceAgnostic": true, + }, + Object { + "convertToAliasScript": "some alias script", + "hidden": false, + "indexPattern": undefined, + "mappings": Object { + "properties": Object { + "anotherFieldB": Object { + "type": "boolean", + }, + "fieldB": Object { + "type": "text", + }, + }, + }, + "migrations": Object {}, + "name": "typeB", + "namespaceAgnostic": false, + }, + Object { + "convertToAliasScript": undefined, + "hidden": false, + "indexPattern": undefined, + "mappings": Object { + "properties": Object { + "fieldC": Object { + "type": "text", + }, + }, + }, + "migrations": Object { + "1.5.3": [MockFunction], + }, + "name": "typeC", + "namespaceAgnostic": false, + }, +] +`; + +exports[`convertLegacyTypes merges the mappings and the schema to create the type when schema exists for the type 1`] = ` +Array [ + Object { + "convertToAliasScript": undefined, + "hidden": true, + "indexPattern": "fooBar", + "mappings": Object { + "properties": Object { + "fieldA": Object { + "type": "text", + }, + }, + }, + "migrations": Object {}, + "name": "typeA", + "namespaceAgnostic": true, + }, + Object { + "convertToAliasScript": undefined, + "hidden": false, + "indexPattern": undefined, + "mappings": Object { + "properties": Object { + "fieldC": Object { + "type": "text", + }, + }, + }, + "migrations": Object {}, + "name": "typeC", + "namespaceAgnostic": false, + }, +] +`; diff --git a/src/core/server/saved_objects/index.ts b/src/core/server/saved_objects/index.ts index 181025d73817d..529ee9599f178 100644 --- a/src/core/server/saved_objects/index.ts +++ b/src/core/server/saved_objects/index.ts @@ -31,7 +31,12 @@ export { SavedObjectsExportResultDetails, } from './export'; -export { SavedObjectsSerializer, RawDoc as SavedObjectsRawDoc } from './serialization'; +export { + SavedObjectsSerializer, + SavedObjectsRawDoc, + SavedObjectSanitizedDoc, + SavedObjectUnsanitizedDoc, +} from './serialization'; export { SavedObjectsMigrationLogger } from './migrations/core/migration_logger'; @@ -50,4 +55,18 @@ export { SavedObjectsDeleteByNamespaceOptions, } from './service/lib/repository'; +export { + SavedObjectsCoreFieldMapping, + SavedObjectsComplexFieldMapping, + SavedObjectsFieldMapping, + SavedObjectsMappingProperties, + SavedObjectsTypeMappingDefinition, + SavedObjectsTypeMappingDefinitions, +} from './mappings'; + +export { SavedObjectMigrationMap, SavedObjectMigrationFn } from './migrations'; + +export { SavedObjectsType } from './types'; + export { config } from './saved_objects_config'; +export { SavedObjectTypeRegistry, ISavedObjectTypeRegistry } from './saved_objects_type_registry'; diff --git a/src/core/server/saved_objects/mappings/index.ts b/src/core/server/saved_objects/mappings/index.ts index 15b0736ca5f1f..e1d718ee454ce 100644 --- a/src/core/server/saved_objects/mappings/index.ts +++ b/src/core/server/saved_objects/mappings/index.ts @@ -18,9 +18,12 @@ */ export { getTypes, getProperty, getRootProperties, getRootPropertiesObjects } from './lib'; export { - FieldMapping, - MappingMeta, - MappingProperties, + SavedObjectsComplexFieldMapping, + SavedObjectsCoreFieldMapping, + SavedObjectsTypeMappingDefinition, + SavedObjectsTypeMappingDefinitions, + SavedObjectsMappingProperties, + SavedObjectsFieldMapping, + IndexMappingMeta, IndexMapping, - SavedObjectsMapping, } from './types'; diff --git a/src/core/server/saved_objects/mappings/lib/get_property.test.ts b/src/core/server/saved_objects/mappings/lib/get_property.test.ts index a85697ddd08b8..a271cf3826e5d 100644 --- a/src/core/server/saved_objects/mappings/lib/get_property.test.ts +++ b/src/core/server/saved_objects/mappings/lib/get_property.test.ts @@ -17,7 +17,7 @@ * under the License. */ -import { FieldMapping, IndexMapping } from '../types'; +import { SavedObjectsFieldMapping, IndexMapping } from '../types'; import { getProperty } from './get_property'; const MAPPINGS = { @@ -47,7 +47,7 @@ const MAPPINGS = { }, }; -function runTest(key: string | string[], mapping: IndexMapping | FieldMapping) { +function runTest(key: string | string[], mapping: IndexMapping | SavedObjectsFieldMapping) { expect(typeof key === 'string' || Array.isArray(key)).toBeTruthy(); expect(typeof mapping).toBe('object'); diff --git a/src/core/server/saved_objects/mappings/lib/get_property.ts b/src/core/server/saved_objects/mappings/lib/get_property.ts index 4e9ff10fc5d47..a31c9fe0c3ba1 100644 --- a/src/core/server/saved_objects/mappings/lib/get_property.ts +++ b/src/core/server/saved_objects/mappings/lib/get_property.ts @@ -18,15 +18,15 @@ */ import toPath from 'lodash/internal/toPath'; -import { CoreFieldMapping, FieldMapping, IndexMapping } from '../types'; +import { SavedObjectsCoreFieldMapping, SavedObjectsFieldMapping, IndexMapping } from '../types'; function getPropertyMappingFromObjectMapping( - mapping: IndexMapping | FieldMapping, + mapping: IndexMapping | SavedObjectsFieldMapping, path: string[] -): FieldMapping | undefined { +): SavedObjectsFieldMapping | undefined { const props = (mapping && (mapping as IndexMapping).properties) || - (mapping && (mapping as CoreFieldMapping).fields); + (mapping && (mapping as SavedObjectsCoreFieldMapping).fields); if (!props) { return undefined; @@ -39,6 +39,9 @@ function getPropertyMappingFromObjectMapping( } } -export function getProperty(mappings: IndexMapping | FieldMapping, path: string | string[]) { +export function getProperty( + mappings: IndexMapping | SavedObjectsFieldMapping, + path: string | string[] +) { return getPropertyMappingFromObjectMapping(mappings, toPath(path)); } diff --git a/src/core/server/saved_objects/mappings/lib/get_root_properties_objects.ts b/src/core/server/saved_objects/mappings/lib/get_root_properties_objects.ts index 61e4d752445c4..81ba1d8235561 100644 --- a/src/core/server/saved_objects/mappings/lib/get_root_properties_objects.ts +++ b/src/core/server/saved_objects/mappings/lib/get_root_properties_objects.ts @@ -17,7 +17,11 @@ * under the License. */ -import { ComplexFieldMapping, IndexMapping, MappingProperties } from '../types'; +import { + SavedObjectsComplexFieldMapping, + IndexMapping, + SavedObjectsMappingProperties, +} from '../types'; import { getRootProperties } from './get_root_properties'; /** @@ -43,10 +47,10 @@ export function getRootPropertiesObjects(mappings: IndexMapping) { // we consider the existence of the properties or type of object to designate that this is an object datatype if ( !blacklist.includes(key) && - ((value as ComplexFieldMapping).properties || value.type === 'object') + ((value as SavedObjectsComplexFieldMapping).properties || value.type === 'object') ) { acc[key] = value; } return acc; - }, {} as MappingProperties); + }, {} as SavedObjectsMappingProperties); } diff --git a/src/core/server/saved_objects/mappings/types.ts b/src/core/server/saved_objects/mappings/types.ts index 8bb1a69d2eb13..578fdcea3718e 100644 --- a/src/core/server/saved_objects/mappings/types.ts +++ b/src/core/server/saved_objects/mappings/types.ts @@ -17,47 +17,133 @@ * under the License. */ -// FieldMapping isn't 1:1 with the options available, -// modify as needed. -export interface CoreFieldMapping { - type: string; - fields?: { - [subfield: string]: { - type: string; - }; - }; +/** + * Describe a saved object type mapping. + * + * @example + * ```ts + * const typeDefinition: SavedObjectsTypeMappingDefinition = { + * properties: { + * enabled: { + * type: "boolean" + * }, + * sendUsageFrom: { + * ignore_above: 256, + * type: "keyword" + * }, + * lastReported: { + * type: "date" + * }, + * lastVersionChecked: { + * ignore_above: 256, + * type: "keyword" + * }, + * } + * } + * ``` + * + * @public + */ +export interface SavedObjectsTypeMappingDefinition { + properties: SavedObjectsMappingProperties; } -// FieldMapping isn't 1:1 with the options available, -// modify as needed. -export interface ComplexFieldMapping { - dynamic?: string; - type?: string; - properties: MappingProperties; -} +/** + * A map of {@link SavedObjectsTypeMappingDefinition | saved object type mappings} + * + * @example + * ```ts + * const mappings: SavedObjectsTypeMappingDefinitions = { + * someType: { + * properties: { + * enabled: { + * type: "boolean" + * }, + * field: { + * type: "keyword" + * }, + * }, + * }, + * anotherType: { + * properties: { + * enabled: { + * type: "boolean" + * }, + * lastReported: { + * type: "date" + * }, + * }, + * }, -export type FieldMapping = CoreFieldMapping | ComplexFieldMapping; + * } + * ``` + * @remark This is the format for the legacy `mappings.json` savedObject mapping file. + * + * @internal + */ +export interface SavedObjectsTypeMappingDefinitions { + [type: string]: SavedObjectsTypeMappingDefinition; +} -export interface MappingProperties { - [field: string]: FieldMapping; +/** + * Describe the fields of a {@link SavedObjectsTypeMappingDefinition | saved object type}. + * + * @public + */ +export interface SavedObjectsMappingProperties { + [field: string]: SavedObjectsFieldMapping; } -export interface SavedObjectsMapping { - pluginId: string; - properties: MappingProperties; +/** + * Describe a {@link SavedObjectsTypeMappingDefinition | saved object type mapping} field. + * + * Please refer to {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-types.html | elasticsearch documentation} + * For the mapping documentation + * + * @public + */ +export type SavedObjectsFieldMapping = + | SavedObjectsCoreFieldMapping + | SavedObjectsComplexFieldMapping; + +/** @internal */ +export interface IndexMapping { + dynamic?: string; + properties: SavedObjectsMappingProperties; + _meta?: IndexMappingMeta; } -export interface MappingMeta { +/** @internal */ +export interface IndexMappingMeta { // A dictionary of key -> md5 hash (e.g. 'dashboard': '24234qdfa3aefa3wa') // with each key being a root-level mapping property, and each value being // the md5 hash of that mapping's value when the index was created. migrationMappingPropertyHashes?: { [k: string]: string }; } -// IndexMapping isn't 1:1 with the options available, -// modify as needed. -export interface IndexMapping { +/** + * See {@link SavedObjectsFieldMapping} for documentation. + * + * @public + */ +export interface SavedObjectsCoreFieldMapping { + type: string; + index?: boolean; + enabled?: boolean; + fields?: { + [subfield: string]: { + type: string; + }; + }; +} + +/** + * See {@link SavedObjectsFieldMapping} for documentation. + * + * @public + */ +export interface SavedObjectsComplexFieldMapping { dynamic?: string; - properties: MappingProperties; - _meta?: MappingMeta; + type?: string; + properties: SavedObjectsMappingProperties; } diff --git a/src/core/server/saved_objects/migrations/core/build_active_mappings.test.ts b/src/core/server/saved_objects/migrations/core/build_active_mappings.test.ts index 71f589f24369a..821a10353f8ec 100644 --- a/src/core/server/saved_objects/migrations/core/build_active_mappings.test.ts +++ b/src/core/server/saved_objects/migrations/core/build_active_mappings.test.ts @@ -27,21 +27,19 @@ describe('buildActiveMappings', () => { bbb: { type: 'long' }, }; - expect(buildActiveMappings({ properties })).toMatchSnapshot(); + expect(buildActiveMappings(properties)).toMatchSnapshot(); }); test('disallows duplicate mappings', () => { const properties = { type: { type: 'long' } }; - expect(() => buildActiveMappings({ properties })).toThrow( - /Cannot redefine core mapping \"type\"/ - ); + expect(() => buildActiveMappings(properties)).toThrow(/Cannot redefine core mapping \"type\"/); }); test('disallows mappings with leading underscore', () => { const properties = { _hm: { type: 'keyword' } }; - expect(() => buildActiveMappings({ properties })).toThrow( + expect(() => buildActiveMappings(properties)).toThrow( /Invalid mapping \"_hm\"\. Mappings cannot start with _/ ); }); @@ -53,7 +51,7 @@ describe('buildActiveMappings', () => { ccc: { fields: { b: { type: 'text' }, a: { type: 'text' } }, type: 'keyword' }, }; - const mappings = buildActiveMappings({ properties }); + const mappings = buildActiveMappings(properties); const hashes = mappings._meta!.migrationMappingPropertyHashes!; expect(hashes.aaa).toBeDefined(); diff --git a/src/core/server/saved_objects/migrations/core/build_active_mappings.ts b/src/core/server/saved_objects/migrations/core/build_active_mappings.ts index 2cf640cceea83..3afe8aae119d9 100644 --- a/src/core/server/saved_objects/migrations/core/build_active_mappings.ts +++ b/src/core/server/saved_objects/migrations/core/build_active_mappings.ts @@ -22,31 +22,31 @@ */ import crypto from 'crypto'; -import _ from 'lodash'; -import { IndexMapping, MappingProperties } from './../../mappings'; +import { cloneDeep, mapValues } from 'lodash'; +import { + IndexMapping, + SavedObjectsMappingProperties, + SavedObjectsTypeMappingDefinitions, +} from './../../mappings'; /** * Creates an index mapping with the core properties required by saved object * indices, as well as the specified additional properties. * - * @param {Opts} opts - * @prop {MappingDefinition} properties - The mapping's properties - * @returns {IndexMapping} + * @param typeDefinitions - the type definitions to build mapping from. */ -export function buildActiveMappings({ - properties, -}: { - properties: MappingProperties; -}): IndexMapping { +export function buildActiveMappings( + typeDefinitions: SavedObjectsTypeMappingDefinitions | SavedObjectsMappingProperties +): IndexMapping { const mapping = defaultMapping(); - properties = validateAndMerge(mapping.properties, properties); + const mergedProperties = validateAndMerge(mapping.properties, typeDefinitions); - return _.cloneDeep({ + return cloneDeep({ ...mapping, - properties, + properties: mergedProperties, _meta: { - migrationMappingPropertyHashes: md5Values(properties), + migrationMappingPropertyHashes: md5Values(mergedProperties), }, }); } @@ -113,7 +113,7 @@ function canonicalStringify(obj: any): string { // Convert an object's values to md5 hash strings function md5Values(obj: any) { - return _.mapValues(obj, md5Object); + return mapValues(obj, md5Object); } // If something exists in actual, but is missing in expected, we don't @@ -171,12 +171,14 @@ function defaultMapping(): IndexMapping { }; } -function validateAndMerge(dest: MappingProperties, source: MappingProperties) { +function validateAndMerge( + dest: SavedObjectsMappingProperties, + source: SavedObjectsTypeMappingDefinitions | SavedObjectsMappingProperties +) { Object.keys(source).forEach(k => { if (k.startsWith('_')) { throw new Error(`Invalid mapping "${k}". Mappings cannot start with _.`); } - if (dest.hasOwnProperty(k)) { throw new Error(`Cannot redefine core mapping "${k}".`); } diff --git a/src/core/server/saved_objects/migrations/core/build_index_map.test.ts b/src/core/server/saved_objects/migrations/core/build_index_map.test.ts index bdc96323238c0..44add4e977006 100644 --- a/src/core/server/saved_objects/migrations/core/build_index_map.test.ts +++ b/src/core/server/saved_objects/migrations/core/build_index_map.test.ts @@ -18,20 +18,30 @@ */ import { createIndexMap } from './build_index_map'; -import { ObjectToConfigAdapter } from '../../../config'; -import { SavedObjectsSchema } from '../../schema'; -import { LegacyConfig } from '../../../legacy'; +import { SavedObjectTypeRegistry } from '../../saved_objects_type_registry'; +import { SavedObjectsType } from '../../types'; -const config = (new ObjectToConfigAdapter({}) as unknown) as LegacyConfig; +const createRegistry = (...types: Array>) => { + const registry = new SavedObjectTypeRegistry(); + types.forEach(type => + registry.registerType({ + name: 'unknown', + namespaceAgnostic: false, + hidden: false, + mappings: { properties: {} }, + migrations: {}, + ...type, + }) + ); + return registry; +}; test('mappings without index pattern goes to default index', () => { const result = createIndexMap({ - config, kibanaIndexName: '.kibana', - schema: new SavedObjectsSchema({ - type1: { - isNamespaceAgnostic: false, - }, + registry: createRegistry({ + name: 'type1', + namespaceAgnostic: false, }), indexMap: { type1: { @@ -60,13 +70,11 @@ test('mappings without index pattern goes to default index', () => { test(`mappings with custom index pattern doesn't go to default index`, () => { const result = createIndexMap({ - config, kibanaIndexName: '.kibana', - schema: new SavedObjectsSchema({ - type1: { - isNamespaceAgnostic: false, - indexPattern: '.other_kibana', - }, + registry: createRegistry({ + name: 'type1', + namespaceAgnostic: false, + indexPattern: '.other_kibana', }), indexMap: { type1: { @@ -95,14 +103,12 @@ test(`mappings with custom index pattern doesn't go to default index`, () => { test('creating a script gets added to the index pattern', () => { const result = createIndexMap({ - config, kibanaIndexName: '.kibana', - schema: new SavedObjectsSchema({ - type1: { - isNamespaceAgnostic: false, - indexPattern: '.other_kibana', - convertToAliasScript: `ctx._id = ctx._source.type + ':' + ctx._id`, - }, + registry: createRegistry({ + name: 'type1', + namespaceAgnostic: false, + indexPattern: '.other_kibana', + convertToAliasScript: `ctx._id = ctx._source.type + ':' + ctx._id`, }), indexMap: { type1: { @@ -132,16 +138,19 @@ test('creating a script gets added to the index pattern', () => { test('throws when two scripts are defined for an index pattern', () => { const defaultIndex = '.kibana'; - const schema = new SavedObjectsSchema({ - type1: { - isNamespaceAgnostic: false, + const registry = createRegistry( + { + name: 'type1', + namespaceAgnostic: false, convertToAliasScript: `ctx._id = ctx._source.type + ':' + ctx._id`, }, - type2: { - isNamespaceAgnostic: false, + { + name: 'type2', + namespaceAgnostic: false, convertToAliasScript: `ctx._id = ctx._source.type + ':' + ctx._id`, - }, - }); + } + ); + const indexMap = { type1: { properties: { @@ -160,9 +169,8 @@ test('throws when two scripts are defined for an index pattern', () => { }; expect(() => createIndexMap({ - config, kibanaIndexName: defaultIndex, - schema, + registry, indexMap, }) ).toThrowErrorMatchingInlineSnapshot( diff --git a/src/core/server/saved_objects/migrations/core/build_index_map.ts b/src/core/server/saved_objects/migrations/core/build_index_map.ts index 914447563cc77..8f7fe2f8eac5b 100644 --- a/src/core/server/saved_objects/migrations/core/build_index_map.ts +++ b/src/core/server/saved_objects/migrations/core/build_index_map.ts @@ -17,39 +17,32 @@ * under the License. */ -import { MappingProperties } from '../../mappings'; -import { SavedObjectsSchema } from '../../schema'; -import { LegacyConfig } from '../../../legacy'; +import { SavedObjectsTypeMappingDefinitions } from '../../mappings'; +import { ISavedObjectTypeRegistry } from '../../saved_objects_type_registry'; export interface CreateIndexMapOptions { - config: LegacyConfig; kibanaIndexName: string; - schema: SavedObjectsSchema; - indexMap: MappingProperties; + registry: ISavedObjectTypeRegistry; + indexMap: SavedObjectsTypeMappingDefinitions; } export interface IndexMap { [index: string]: { - typeMappings: MappingProperties; + typeMappings: SavedObjectsTypeMappingDefinitions; script?: string; }; } /* - * This file contains logic to convert savedObjectSchemas into a dictonary of indexes and documents + * This file contains logic to convert savedObjectSchemas into a dictionary of indexes and documents */ -export function createIndexMap({ - /** @deprecated Remove once savedObjectsSchemas are exposed from Core */ - config, - kibanaIndexName, - schema, - indexMap, -}: CreateIndexMapOptions) { +export function createIndexMap({ kibanaIndexName, registry, indexMap }: CreateIndexMapOptions) { const map: IndexMap = {}; Object.keys(indexMap).forEach(type => { - const script = schema.getConvertToAliasScript(type); + const typeDef = registry.getType(type); + const script = typeDef?.convertToAliasScript; // Defaults to kibanaIndexName if indexPattern isn't defined - const indexPattern = schema.getIndexForType(config, type) || kibanaIndexName; + const indexPattern = typeDef?.indexPattern || kibanaIndexName; if (!map.hasOwnProperty(indexPattern as string)) { map[indexPattern] = { typeMappings: {} }; } diff --git a/src/core/server/saved_objects/migrations/core/document_migrator.test.ts b/src/core/server/saved_objects/migrations/core/document_migrator.test.ts index 38496a3503833..0e3a4780e12b6 100644 --- a/src/core/server/saved_objects/migrations/core/document_migrator.test.ts +++ b/src/core/server/saved_objects/migrations/core/document_migrator.test.ts @@ -18,41 +18,49 @@ */ import _ from 'lodash'; -import { RawSavedObjectDoc } from '../../serialization'; +import { SavedObjectUnsanitizedDoc } from '../../serialization'; import { DocumentMigrator } from './document_migrator'; import { loggingServiceMock } from '../../../logging/logging_service.mock'; +import { SavedObjectsType } from '../../types'; +import { SavedObjectTypeRegistry } from '../../saved_objects_type_registry'; const mockLoggerFactory = loggingServiceMock.create(); const mockLogger = mockLoggerFactory.get('mock logger'); +const createRegistry = (...types: Array>) => { + const registry = new SavedObjectTypeRegistry(); + types.forEach(type => + registry.registerType({ + name: 'unknown', + namespaceAgnostic: false, + hidden: false, + mappings: { properties: {} }, + migrations: {}, + ...type, + }) + ); + return registry; +}; + describe('DocumentMigrator', () => { function testOpts() { return { kibanaVersion: '25.2.3', - migrations: {}, + typeRegistry: createRegistry(), validateDoc: _.noop, log: mockLogger, }; } - it('validates the migration definition', () => { - const invalidDefinition: any = { - kibanaVersion: '3.2.3', - migrations: 'hello', - validateDoc: _.noop, - }; - expect(() => new DocumentMigrator(invalidDefinition)).toThrow( - /Migration definition should be an object/i - ); - }); - it('validates individual migration definitions', () => { - const invalidDefinition: any = { + const invalidDefinition = { kibanaVersion: '3.2.3', - migrations: { - foo: _.noop, - }, + typeRegistry: createRegistry({ + name: 'foo', + migrations: _.noop as any, + }), validateDoc: _.noop, + log: mockLogger, }; expect(() => new DocumentMigrator(invalidDefinition)).toThrow( /Migration for type foo should be an object/i @@ -60,14 +68,16 @@ describe('DocumentMigrator', () => { }); it('validates individual migration semvers', () => { - const invalidDefinition: any = { + const invalidDefinition = { kibanaVersion: '3.2.3', - migrations: { - foo: { - bar: _.noop, + typeRegistry: createRegistry({ + name: 'foo', + migrations: { + bar: doc => doc, }, - }, + }), validateDoc: _.noop, + log: mockLogger, }; expect(() => new DocumentMigrator(invalidDefinition)).toThrow( /Expected all properties to be semvers/i @@ -75,14 +85,16 @@ describe('DocumentMigrator', () => { }); it('validates the migration function', () => { - const invalidDefinition: any = { + const invalidDefinition = { kibanaVersion: '3.2.3', - migrations: { - foo: { - '1.2.3': 23, + typeRegistry: createRegistry({ + name: 'foo', + migrations: { + '1.2.3': 23 as any, }, - }, + }), validateDoc: _.noop, + log: mockLogger, }; expect(() => new DocumentMigrator(invalidDefinition)).toThrow( /expected a function, but got 23/i @@ -92,11 +104,12 @@ describe('DocumentMigrator', () => { it('migrates type and attributes', () => { const migrator = new DocumentMigrator({ ...testOpts(), - migrations: { - user: { + typeRegistry: createRegistry({ + name: 'user', + migrations: { '1.2.3': setAttr('attributes.name', 'Chris'), }, - }, + }), }); const actual = migrator.migrate({ id: 'me', @@ -115,14 +128,15 @@ describe('DocumentMigrator', () => { it(`doesn't mutate the original document`, () => { const migrator = new DocumentMigrator({ ...testOpts(), - migrations: { - user: { - '1.2.3': (doc: RawSavedObjectDoc) => { + typeRegistry: createRegistry({ + name: 'user', + migrations: { + '1.2.3': doc => { _.set(doc, 'attributes.name', 'Mike'); return doc; }, }, - }, + }), }); const originalDoc = { id: 'me', @@ -138,11 +152,12 @@ describe('DocumentMigrator', () => { it('migrates meta properties', () => { const migrator = new DocumentMigrator({ ...testOpts(), - migrations: { - acl: { + typeRegistry: createRegistry({ + name: 'acl', + migrations: { '2.3.5': setAttr('acl', 'admins-only,sucka!'), }, - }, + }), }); const actual = migrator.migrate({ id: 'me', @@ -163,11 +178,26 @@ describe('DocumentMigrator', () => { it('does not apply migrations to unrelated docs', () => { const migrator = new DocumentMigrator({ ...testOpts(), - migrations: { - aaa: { '1.0.0': setAttr('aaa', 'A') }, - bbb: { '1.0.0': setAttr('bbb', 'B') }, - ccc: { '1.0.0': setAttr('ccc', 'C') }, - }, + typeRegistry: createRegistry( + { + name: 'aaa', + migrations: { + '1.0.0': setAttr('aaa', 'A'), + }, + }, + { + name: 'bbb', + migrations: { + '1.0.0': setAttr('bbb', 'B'), + }, + }, + { + name: 'ccc', + migrations: { + '1.0.0': setAttr('ccc', 'C'), + }, + } + ), }); const actual = migrator.migrate({ id: 'me', @@ -185,11 +215,26 @@ describe('DocumentMigrator', () => { it('assumes documents w/ undefined migrationVersion are up to date', () => { const migrator = new DocumentMigrator({ ...testOpts(), - migrations: { - user: { '1.0.0': setAttr('aaa', 'A') }, - bbb: { '2.3.4': setAttr('bbb', 'B') }, - ccc: { '1.0.0': setAttr('ccc', 'C') }, - }, + typeRegistry: createRegistry( + { + name: 'user', + migrations: { + '1.0.0': setAttr('aaa', 'A'), + }, + }, + { + name: 'bbb', + migrations: { + '2.3.4': setAttr('bbb', 'B'), + }, + }, + { + name: 'ccc', + migrations: { + '1.0.0': setAttr('ccc', 'C'), + }, + } + ), }); const actual = migrator.migrate({ id: 'me', @@ -212,13 +257,14 @@ describe('DocumentMigrator', () => { it('only applies migrations that are more recent than the doc', () => { const migrator = new DocumentMigrator({ ...testOpts(), - migrations: { - dog: { + typeRegistry: createRegistry({ + name: 'dog', + migrations: { '1.2.3': setAttr('attributes.a', 'A'), '1.2.4': setAttr('attributes.b', 'B'), '2.0.1': setAttr('attributes.c', 'C'), }, - }, + }), }); const actual = migrator.migrate({ id: 'smelly', @@ -254,11 +300,12 @@ describe('DocumentMigrator', () => { it('rejects docs that belong to a newer plugin', () => { const migrator = new DocumentMigrator({ ...testOpts(), - migrations: { - dawg: { + typeRegistry: createRegistry({ + name: 'dawg', + migrations: { '1.2.3': setAttr('attributes.a', 'A'), }, - }, + }), }); expect(() => migrator.migrate({ @@ -276,13 +323,14 @@ describe('DocumentMigrator', () => { let count = 0; const migrator = new DocumentMigrator({ ...testOpts(), - migrations: { - dog: { + typeRegistry: createRegistry({ + name: 'dog', + migrations: { '2.2.4': setAttr('attributes.b', () => ++count), '10.0.1': setAttr('attributes.c', () => ++count), '1.2.3': setAttr('attributes.a', () => ++count), }, - }, + }), }); const actual = migrator.migrate({ id: 'smelly', @@ -301,14 +349,20 @@ describe('DocumentMigrator', () => { it('allows props to be added', () => { const migrator = new DocumentMigrator({ ...testOpts(), - migrations: { - animal: { - '1.0.0': setAttr('animal', (name: string) => `Animal: ${name}`), - }, - dog: { - '2.2.4': setAttr('animal', 'Doggie'), + typeRegistry: createRegistry( + { + name: 'animal', + migrations: { + '1.0.0': setAttr('animal', (name: string) => `Animal: ${name}`), + }, }, - }, + { + name: 'dog', + migrations: { + '2.2.4': setAttr('animal', 'Doggie'), + }, + } + ), }); const actual = migrator.migrate({ id: 'smelly', @@ -328,16 +382,22 @@ describe('DocumentMigrator', () => { it('allows props to be renamed', () => { const migrator = new DocumentMigrator({ ...testOpts(), - migrations: { - animal: { - '1.0.0': setAttr('animal', (name: string) => `Animal: ${name}`), - '3.2.1': renameAttr('animal', 'dawg'), - }, - dawg: { - '2.2.4': renameAttr('dawg', 'animal'), - '3.2.0': setAttr('dawg', (name: string) => `Dawg3.x: ${name}`), + typeRegistry: createRegistry( + { + name: 'animal', + migrations: { + '1.0.0': setAttr('animal', (name: string) => `Animal: ${name}`), + '3.2.1': renameAttr('animal', 'dawg'), + }, }, - }, + { + name: 'dawg', + migrations: { + '2.2.4': renameAttr('dawg', 'animal'), + '3.2.0': setAttr('dawg', (name: string) => `Dawg3.x: ${name}`), + }, + } + ), }); const actual = migrator.migrate({ id: 'smelly', @@ -358,14 +418,20 @@ describe('DocumentMigrator', () => { it('allows changing type', () => { const migrator = new DocumentMigrator({ ...testOpts(), - migrations: { - cat: { - '1.0.0': setAttr('attributes.name', (name: string) => `Kitty ${name}`), - }, - dog: { - '2.2.4': setAttr('type', 'cat'), + typeRegistry: createRegistry( + { + name: 'cat', + migrations: { + '1.0.0': setAttr('attributes.name', (name: string) => `Kitty ${name}`), + }, }, - }, + { + name: 'dog', + migrations: { + '2.2.4': setAttr('type', 'cat'), + }, + } + ), }); const actual = migrator.migrate({ id: 'smelly', @@ -384,11 +450,12 @@ describe('DocumentMigrator', () => { it('disallows updating a migrationVersion prop to a lower version', () => { const migrator = new DocumentMigrator({ ...testOpts(), - migrations: { - cat: { + typeRegistry: createRegistry({ + name: 'cat', + migrations: { '1.0.0': setAttr('migrationVersion.foo', '3.2.1'), }, - }, + }), }); expect(() => @@ -406,11 +473,12 @@ describe('DocumentMigrator', () => { it('disallows removing a migrationVersion prop', () => { const migrator = new DocumentMigrator({ ...testOpts(), - migrations: { - cat: { + typeRegistry: createRegistry({ + name: 'cat', + migrations: { '1.0.0': setAttr('migrationVersion', {}), }, - }, + }), }); expect(() => migrator.migrate({ @@ -427,8 +495,9 @@ describe('DocumentMigrator', () => { it('allows updating a migrationVersion prop to a later version', () => { const migrator = new DocumentMigrator({ ...testOpts(), - migrations: { - cat: { + typeRegistry: createRegistry({ + name: 'cat', + migrations: { '1.0.0': setAttr('migrationVersion.cat', '2.9.1'), '2.0.0': () => { throw new Error('POW!'); @@ -438,7 +507,7 @@ describe('DocumentMigrator', () => { }, '3.0.0': setAttr('attributes.name', 'Shiny'), }, - }, + }), }); const actual = migrator.migrate({ id: 'smelly', @@ -457,11 +526,12 @@ describe('DocumentMigrator', () => { it('allows adding props to migrationVersion', () => { const migrator = new DocumentMigrator({ ...testOpts(), - migrations: { - cat: { + typeRegistry: createRegistry({ + name: 'cat', + migrations: { '1.0.0': setAttr('migrationVersion.foo', '5.6.7'), }, - }, + }), }); const actual = migrator.migrate({ id: 'smelly', @@ -481,13 +551,14 @@ describe('DocumentMigrator', () => { const log = mockLogger; const migrator = new DocumentMigrator({ ...testOpts(), - migrations: { - dog: { + typeRegistry: createRegistry({ + name: 'dog', + migrations: { '1.2.3': () => { throw new Error('Dang diggity!'); }, }, - }, + }), log, }); const failedDoc = { @@ -511,15 +582,16 @@ describe('DocumentMigrator', () => { const logTestMsg = '...said the joker to the thief'; const migrator = new DocumentMigrator({ ...testOpts(), - migrations: { - dog: { + typeRegistry: createRegistry({ + name: 'dog', + migrations: { '1.2.3': (doc, log) => { log.info(logTestMsg); log.warning(logTestMsg); return doc; }, }, - }, + }), log: mockLogger, }); const doc = { @@ -536,17 +608,23 @@ describe('DocumentMigrator', () => { test('extracts the latest migration version info', () => { const { migrationVersion } = new DocumentMigrator({ ...testOpts(), - migrations: { - aaa: { - '1.2.3': (doc: RawSavedObjectDoc) => doc, - '10.4.0': (doc: RawSavedObjectDoc) => doc, - '2.2.1': (doc: RawSavedObjectDoc) => doc, - }, - bbb: { - '3.2.3': (doc: RawSavedObjectDoc) => doc, - '2.0.0': (doc: RawSavedObjectDoc) => doc, + typeRegistry: createRegistry( + { + name: 'aaa', + migrations: { + '1.2.3': (doc: SavedObjectUnsanitizedDoc) => doc, + '10.4.0': (doc: SavedObjectUnsanitizedDoc) => doc, + '2.2.1': (doc: SavedObjectUnsanitizedDoc) => doc, + }, }, - }, + { + name: 'bbb', + migrations: { + '3.2.3': (doc: SavedObjectUnsanitizedDoc) => doc, + '2.0.0': (doc: SavedObjectUnsanitizedDoc) => doc, + }, + } + ), }); expect(migrationVersion).toEqual({ @@ -558,11 +636,12 @@ describe('DocumentMigrator', () => { test('fails if the validate doc throws', () => { const migrator = new DocumentMigrator({ ...testOpts(), - migrations: { - aaa: { + typeRegistry: createRegistry({ + name: 'aaa', + migrations: { '2.3.4': d => _.set(d, 'attributes.counter', 42), }, - }, + }), validateDoc: d => { if ((d.attributes as any).counter === 42) { throw new Error('Meaningful!'); @@ -577,11 +656,15 @@ describe('DocumentMigrator', () => { }); function renameAttr(path: string, newPath: string) { - return (doc: RawSavedObjectDoc) => - _.omit(_.set(doc, newPath, _.get(doc, path)) as {}, path) as RawSavedObjectDoc; + return (doc: SavedObjectUnsanitizedDoc) => + _.omit(_.set(doc, newPath, _.get(doc, path)) as {}, path) as SavedObjectUnsanitizedDoc; } function setAttr(path: string, value: any) { - return (doc: RawSavedObjectDoc) => - _.set(doc, path, _.isFunction(value) ? value(_.get(doc, path)) : value) as RawSavedObjectDoc; + return (doc: SavedObjectUnsanitizedDoc) => + _.set( + doc, + path, + _.isFunction(value) ? value(_.get(doc, path)) : value + ) as SavedObjectUnsanitizedDoc; } diff --git a/src/core/server/saved_objects/migrations/core/document_migrator.ts b/src/core/server/saved_objects/migrations/core/document_migrator.ts index 563d978dcc1f1..b5019b2874bec 100644 --- a/src/core/server/saved_objects/migrations/core/document_migrator.ts +++ b/src/core/server/saved_objects/migrations/core/document_migrator.ts @@ -65,23 +65,19 @@ import _ from 'lodash'; import cloneDeep from 'lodash.clonedeep'; import Semver from 'semver'; import { Logger } from '../../../logging'; -import { RawSavedObjectDoc } from '../../serialization'; +import { SavedObjectUnsanitizedDoc } from '../../serialization'; import { SavedObjectsMigrationVersion } from '../../types'; -import { MigrationLogger, SavedObjectsMigrationLogger } from './migration_logger'; +import { MigrationLogger } from './migration_logger'; +import { ISavedObjectTypeRegistry } from '../../saved_objects_type_registry'; +import { SavedObjectMigrationFn } from '../types'; -export type TransformFn = (doc: RawSavedObjectDoc) => RawSavedObjectDoc; +export type TransformFn = (doc: SavedObjectUnsanitizedDoc) => SavedObjectUnsanitizedDoc; -type MigrationFn = (doc: RawSavedObjectDoc, log: SavedObjectsMigrationLogger) => RawSavedObjectDoc; +type ValidateDoc = (doc: SavedObjectUnsanitizedDoc) => void; -type ValidateDoc = (doc: RawSavedObjectDoc) => void; - -export interface MigrationDefinition { - [type: string]: { [version: string]: MigrationFn }; -} - -interface Opts { +interface DocumentMigratorOptions { kibanaVersion: string; - migrations: MigrationDefinition; + typeRegistry: ISavedObjectTypeRegistry; validateDoc: ValidateDoc; log: Logger; } @@ -114,22 +110,22 @@ export class DocumentMigrator implements VersionedTransformer { /** * Creates an instance of DocumentMigrator. * - * @param {Opts} opts + * @param {DocumentMigratorOptions} opts * @prop {string} kibanaVersion - The current version of Kibana - * @prop {MigrationDefinition} migrations - The migrations that will be used to migrate documents + * @prop {SavedObjectTypeRegistry} typeRegistry - The type registry to get type migrations from * @prop {ValidateDoc} validateDoc - A function which, given a document throws an error if it is * not up to date. This is used to ensure we don't let unmigrated documents slip through. * @prop {Logger} log - The migration logger * @memberof DocumentMigrator */ - constructor(opts: Opts) { - validateMigrationDefinition(opts.migrations); + constructor({ typeRegistry, kibanaVersion, log, validateDoc }: DocumentMigratorOptions) { + validateMigrationDefinition(typeRegistry); - this.migrations = buildActiveMigrations(opts.migrations, opts.log); + this.migrations = buildActiveMigrations(typeRegistry, log); this.transformDoc = buildDocumentTransform({ - kibanaVersion: opts.kibanaVersion, + kibanaVersion, migrations: this.migrations, - validateDoc: opts.validateDoc, + validateDoc, }); } @@ -147,11 +143,11 @@ export class DocumentMigrator implements VersionedTransformer { /** * Migrates a document to the latest version. * - * @param {RawSavedObjectDoc} doc - * @returns {RawSavedObjectDoc} + * @param {SavedObjectUnsanitizedDoc} doc + * @returns {SavedObjectUnsanitizedDoc} * @memberof DocumentMigrator */ - public migrate = (doc: RawSavedObjectDoc): RawSavedObjectDoc => { + public migrate = (doc: SavedObjectUnsanitizedDoc): SavedObjectUnsanitizedDoc => { // Clone the document to prevent accidental mutations on the original data // Ex: Importing sample data that is cached at import level, migrations would // execute on mutated data the second time. @@ -166,7 +162,7 @@ export class DocumentMigrator implements VersionedTransformer { * language. So, this is just to provide a little developer-friendly error messaging. Joi was * giving weird errors, so we're just doing manual validation. */ -function validateMigrationDefinition(migrations: MigrationDefinition) { +function validateMigrationDefinition(registry: ISavedObjectTypeRegistry) { function assertObject(obj: any, prefix: string) { if (!obj || typeof obj !== 'object') { throw new Error(`${prefix} Got ${obj}.`); @@ -187,17 +183,17 @@ function validateMigrationDefinition(migrations: MigrationDefinition) { } } - assertObject(migrations, 'Migration definition should be an object.'); - - Object.entries(migrations).forEach(([type, versions]: any) => { - assertObject( - versions, - `Migration for type ${type} should be an object like { '2.0.0': (doc) => doc }.` - ); - Object.entries(versions).forEach(([version, fn]) => { - assertValidSemver(version, type); - assertValidTransform(fn, version, type); - }); + registry.getAllTypes().forEach(type => { + if (type.migrations) { + assertObject( + type.migrations, + `Migration for type ${type.name} should be an object like { '2.0.0': (doc) => doc }.` + ); + Object.entries(type.migrations).forEach(([version, fn]) => { + assertValidSemver(version, type.name); + assertValidTransform(fn, version, type.name); + }); + } }); } @@ -207,19 +203,28 @@ function validateMigrationDefinition(migrations: MigrationDefinition) { * From: { type: { version: fn } } * To: { type: { latestVersion: string, transforms: [{ version: string, transform: fn }] } } */ -function buildActiveMigrations(migrations: MigrationDefinition, log: Logger): ActiveMigrations { - return _.mapValues(migrations, (versions, prop) => { - const transforms = Object.entries(versions) - .map(([version, transform]) => ({ - version, - transform: wrapWithTry(version, prop!, transform, log), - })) - .sort((a, b) => Semver.compare(a.version, b.version)); - return { - latestVersion: _.last(transforms).version, - transforms, - }; - }); +function buildActiveMigrations( + typeRegistry: ISavedObjectTypeRegistry, + log: Logger +): ActiveMigrations { + return typeRegistry + .getAllTypes() + .filter(type => type.migrations && Object.keys(type.migrations).length > 0) + .reduce((migrations, type) => { + const transforms = Object.entries(type.migrations!) + .map(([version, transform]) => ({ + version, + transform: wrapWithTry(version, type.name, transform, log), + })) + .sort((a, b) => Semver.compare(a.version, b.version)); + return { + ...migrations, + [type.name]: { + latestVersion: _.last(transforms).version, + transforms, + }, + }; + }, {} as ActiveMigrations); } /** @@ -234,7 +239,7 @@ function buildDocumentTransform({ migrations: ActiveMigrations; validateDoc: ValidateDoc; }): TransformFn { - return function transformAndValidate(doc: RawSavedObjectDoc) { + return function transformAndValidate(doc: SavedObjectUnsanitizedDoc) { const result = doc.migrationVersion ? applyMigrations(doc, migrations) : markAsUpToDate(doc, migrations); @@ -252,7 +257,7 @@ function buildDocumentTransform({ }; } -function applyMigrations(doc: RawSavedObjectDoc, migrations: ActiveMigrations) { +function applyMigrations(doc: SavedObjectUnsanitizedDoc, migrations: ActiveMigrations) { while (true) { const prop = nextUnmigratedProp(doc, migrations); if (!prop) { @@ -265,14 +270,14 @@ function applyMigrations(doc: RawSavedObjectDoc, migrations: ActiveMigrations) { /** * Gets the doc's props, handling the special case of "type". */ -function props(doc: RawSavedObjectDoc) { +function props(doc: SavedObjectUnsanitizedDoc) { return Object.keys(doc).concat(doc.type); } /** * Looks up the prop version in a saved object document or in our latest migrations. */ -function propVersion(doc: RawSavedObjectDoc | ActiveMigrations, prop: string) { +function propVersion(doc: SavedObjectUnsanitizedDoc | ActiveMigrations, prop: string) { return ( (doc[prop] && doc[prop].latestVersion) || (doc.migrationVersion && (doc as any).migrationVersion[prop]) @@ -282,7 +287,7 @@ function propVersion(doc: RawSavedObjectDoc | ActiveMigrations, prop: string) { /** * Sets the doc's migrationVersion to be the most recent version */ -function markAsUpToDate(doc: RawSavedObjectDoc, migrations: ActiveMigrations) { +function markAsUpToDate(doc: SavedObjectUnsanitizedDoc, migrations: ActiveMigrations) { return { ...doc, migrationVersion: props(doc).reduce((acc, prop) => { @@ -296,20 +301,25 @@ function markAsUpToDate(doc: RawSavedObjectDoc, migrations: ActiveMigrations) { * If a specific transform function fails, this tacks on a bit of information * about the document and transform that caused the failure. */ -function wrapWithTry(version: string, prop: string, transform: MigrationFn, log: Logger) { - return function tryTransformDoc(doc: RawSavedObjectDoc) { +function wrapWithTry( + version: string, + type: string, + migrationFn: SavedObjectMigrationFn, + log: Logger +) { + return function tryTransformDoc(doc: SavedObjectUnsanitizedDoc) { try { - const result = transform(doc, new MigrationLogger(log)); + const result = migrationFn(doc, new MigrationLogger(log)); // A basic sanity check to help migration authors detect basic errors // (e.g. forgetting to return the transformed doc) if (!result || !result.type) { - throw new Error(`Invalid saved object returned from migration ${prop}:${version}.`); + throw new Error(`Invalid saved object returned from migration ${type}:${version}.`); } return result; } catch (error) { - const failedTransform = `${prop}:${version}`; + const failedTransform = `${type}:${version}`; const failedDoc = JSON.stringify(doc); log.warn( `Failed to transform document ${doc}. Transform: ${failedTransform}\nDoc: ${failedDoc}` @@ -322,7 +332,7 @@ function wrapWithTry(version: string, prop: string, transform: MigrationFn, log: /** * Finds the first unmigrated property in the specified document. */ -function nextUnmigratedProp(doc: RawSavedObjectDoc, migrations: ActiveMigrations) { +function nextUnmigratedProp(doc: SavedObjectUnsanitizedDoc, migrations: ActiveMigrations) { return props(doc).find(p => { const latestVersion = propVersion(migrations, p); const docVersion = propVersion(doc, p); @@ -352,10 +362,10 @@ function nextUnmigratedProp(doc: RawSavedObjectDoc, migrations: ActiveMigrations * Applies any relevent migrations to the document for the specified property. */ function migrateProp( - doc: RawSavedObjectDoc, + doc: SavedObjectUnsanitizedDoc, prop: string, migrations: ActiveMigrations -): RawSavedObjectDoc { +): SavedObjectUnsanitizedDoc { const originalType = doc.type; let migrationVersion = _.clone(doc.migrationVersion) || {}; const typeChanged = () => !doc.hasOwnProperty(prop) || doc.type !== originalType; @@ -376,7 +386,11 @@ function migrateProp( /** * Retrieves any prop transforms that have not been applied to doc. */ -function applicableTransforms(migrations: ActiveMigrations, doc: RawSavedObjectDoc, prop: string) { +function applicableTransforms( + migrations: ActiveMigrations, + doc: SavedObjectUnsanitizedDoc, + prop: string +) { const minVersion = propVersion(doc, prop); const { transforms } = migrations[prop]; return minVersion @@ -389,7 +403,7 @@ function applicableTransforms(migrations: ActiveMigrations, doc: RawSavedObjectD * has not mutated migrationVersion in an unsupported way. */ function updateMigrationVersion( - doc: RawSavedObjectDoc, + doc: SavedObjectUnsanitizedDoc, migrationVersion: SavedObjectsMigrationVersion, prop: string, version: string @@ -405,7 +419,7 @@ function updateMigrationVersion( * as this could get us into an infinite loop. So, we explicitly check for that here. */ function assertNoDowngrades( - doc: RawSavedObjectDoc, + doc: SavedObjectUnsanitizedDoc, migrationVersion: SavedObjectsMigrationVersion, prop: string, version: string diff --git a/src/core/server/saved_objects/migrations/core/index_migrator.test.ts b/src/core/server/saved_objects/migrations/core/index_migrator.test.ts index 2fc65f6e475d8..a9d0a339c229f 100644 --- a/src/core/server/saved_objects/migrations/core/index_migrator.test.ts +++ b/src/core/server/saved_objects/migrations/core/index_migrator.test.ts @@ -18,8 +18,8 @@ */ import _ from 'lodash'; -import { SavedObjectsSchema } from '../../schema'; -import { RawSavedObjectDoc, SavedObjectsSerializer } from '../../serialization'; +import { SavedObjectUnsanitizedDoc, SavedObjectsSerializer } from '../../serialization'; +import { SavedObjectTypeRegistry } from '../../saved_objects_type_registry'; import { IndexMigrator } from './index_migrator'; import { loggingServiceMock } from '../../../logging/logging_service.mock'; @@ -39,7 +39,7 @@ describe('IndexMigrator', () => { migrationVersion: {}, migrate: _.identity, }, - serializer: new SavedObjectsSerializer(new SavedObjectsSchema()), + serializer: new SavedObjectsSerializer(new SavedObjectTypeRegistry()), }; }); @@ -254,7 +254,7 @@ describe('IndexMigrator', () => { test('transforms all docs from the original index', async () => { let count = 0; const { callCluster } = testOpts; - const migrateDoc = jest.fn((doc: RawSavedObjectDoc) => { + const migrateDoc = jest.fn((doc: SavedObjectUnsanitizedDoc) => { return { ...doc, attributes: { name: ++count }, diff --git a/src/core/server/saved_objects/migrations/core/migrate_raw_docs.test.ts b/src/core/server/saved_objects/migrations/core/migrate_raw_docs.test.ts index aa208a23954f0..89f3fde384848 100644 --- a/src/core/server/saved_objects/migrations/core/migrate_raw_docs.test.ts +++ b/src/core/server/saved_objects/migrations/core/migrate_raw_docs.test.ts @@ -18,17 +18,21 @@ */ import _ from 'lodash'; -import { SavedObjectsSchema } from '../../schema'; +import { SavedObjectTypeRegistry } from '../../saved_objects_type_registry'; import { SavedObjectsSerializer } from '../../serialization'; import { migrateRawDocs } from './migrate_raw_docs'; describe('migrateRawDocs', () => { test('converts raw docs to saved objects', async () => { const transform = jest.fn((doc: any) => _.set(doc, 'attributes.name', 'HOI!')); - const result = migrateRawDocs(new SavedObjectsSerializer(new SavedObjectsSchema()), transform, [ - { _id: 'a:b', _source: { type: 'a', a: { name: 'AAA' } } }, - { _id: 'c:d', _source: { type: 'c', c: { name: 'DDD' } } }, - ]); + const result = migrateRawDocs( + new SavedObjectsSerializer(new SavedObjectTypeRegistry()), + transform, + [ + { _id: 'a:b', _source: { type: 'a', a: { name: 'AAA' } } }, + { _id: 'c:d', _source: { type: 'c', c: { name: 'DDD' } } }, + ] + ); expect(result).toEqual([ { @@ -48,10 +52,14 @@ describe('migrateRawDocs', () => { const transform = jest.fn((doc: any) => _.set(_.cloneDeep(doc), 'attributes.name', 'TADA') ); - const result = migrateRawDocs(new SavedObjectsSerializer(new SavedObjectsSchema()), transform, [ - { _id: 'foo:b', _source: { type: 'a', a: { name: 'AAA' } } }, - { _id: 'c:d', _source: { type: 'c', c: { name: 'DDD' } } }, - ]); + const result = migrateRawDocs( + new SavedObjectsSerializer(new SavedObjectTypeRegistry()), + transform, + [ + { _id: 'foo:b', _source: { type: 'a', a: { name: 'AAA' } } }, + { _id: 'c:d', _source: { type: 'c', c: { name: 'DDD' } } }, + ] + ); expect(result).toEqual([ { _id: 'foo:b', _source: { type: 'a', a: { name: 'AAA' } } }, diff --git a/src/core/server/saved_objects/migrations/core/migrate_raw_docs.ts b/src/core/server/saved_objects/migrations/core/migrate_raw_docs.ts index c008b18619629..5fe15f40db8ec 100644 --- a/src/core/server/saved_objects/migrations/core/migrate_raw_docs.ts +++ b/src/core/server/saved_objects/migrations/core/migrate_raw_docs.ts @@ -21,7 +21,7 @@ * This file provides logic for migrating raw documents. */ -import { RawDoc, SavedObjectsSerializer } from '../../serialization'; +import { SavedObjectsRawDoc, SavedObjectsSerializer } from '../../serialization'; import { TransformFn } from './document_migrator'; /** @@ -29,14 +29,14 @@ import { TransformFn } from './document_migrator'; * of raw docs. Any raw docs that are not valid saved objects will simply be passed through. * * @param {TransformFn} migrateDoc - * @param {RawDoc[]} rawDocs - * @returns {RawDoc[]} + * @param {SavedObjectsRawDoc[]} rawDocs + * @returns {SavedObjectsRawDoc[]} */ export function migrateRawDocs( serializer: SavedObjectsSerializer, migrateDoc: TransformFn, - rawDocs: RawDoc[] -): RawDoc[] { + rawDocs: SavedObjectsRawDoc[] +): SavedObjectsRawDoc[] { return rawDocs.map(raw => { if (serializer.isRawSavedObject(raw)) { const savedObject = serializer.rawToSavedObject(raw); diff --git a/src/core/server/saved_objects/migrations/core/migration_context.ts b/src/core/server/saved_objects/migrations/core/migration_context.ts index d4e97ee6c5747..3a6145f5d9623 100644 --- a/src/core/server/saved_objects/migrations/core/migration_context.ts +++ b/src/core/server/saved_objects/migrations/core/migration_context.ts @@ -26,7 +26,7 @@ import { Logger } from 'src/core/server/logging'; import { SavedObjectsSerializer } from '../../serialization'; -import { MappingProperties } from '../../mappings'; +import { SavedObjectsTypeMappingDefinitions } from '../../mappings'; import { buildActiveMappings } from './build_active_mappings'; import { CallCluster } from './call_cluster'; import { VersionedTransformer } from './document_migrator'; @@ -40,7 +40,7 @@ export interface MigrationOpts { callCluster: CallCluster; index: string; log: Logger; - mappingProperties: MappingProperties; + mappingProperties: SavedObjectsTypeMappingDefinitions; documentMigrator: VersionedTransformer; serializer: SavedObjectsSerializer; convertToAliasScript?: string; @@ -107,9 +107,9 @@ function createSourceContext(source: FullIndexInfo, alias: string) { function createDestContext( source: FullIndexInfo, alias: string, - mappingProperties: MappingProperties + mappingProperties: SavedObjectsTypeMappingDefinitions ): FullIndexInfo { - const activeMappings = buildActiveMappings({ properties: mappingProperties }); + const activeMappings = buildActiveMappings(mappingProperties); return { aliases: {}, @@ -133,6 +133,5 @@ function createDestContext( function nextIndexName(indexName: string, alias: string) { const indexSuffix = (indexName.match(/[\d]+$/) || [])[0]; const indexNum = parseInt(indexSuffix, 10) || 0; - return `${alias}_${indexNum + 1}`; } diff --git a/src/core/server/saved_objects/migrations/core/migration_coordinator.test.ts b/src/core/server/saved_objects/migrations/core/migration_coordinator.test.ts index 818ca73b37189..800edaeaa5885 100644 --- a/src/core/server/saved_objects/migrations/core/migration_coordinator.test.ts +++ b/src/core/server/saved_objects/migrations/core/migration_coordinator.test.ts @@ -24,6 +24,7 @@ describe('coordinateMigration', () => { const log = { debug: jest.fn(), warning: jest.fn(), + warn: jest.fn(), info: jest.fn(), }; diff --git a/src/core/server/saved_objects/migrations/core/migration_logger.ts b/src/core/server/saved_objects/migrations/core/migration_logger.ts index 7c61d0c48d9bd..9dfb3abc8e72d 100644 --- a/src/core/server/saved_objects/migrations/core/migration_logger.ts +++ b/src/core/server/saved_objects/migrations/core/migration_logger.ts @@ -30,7 +30,11 @@ export type LogFn = (path: string[], message: string) => void; export interface SavedObjectsMigrationLogger { debug: (msg: string) => void; info: (msg: string) => void; + /** + * @deprecated Use `warn` instead. + */ warning: (msg: string) => void; + warn: (msg: string) => void; } export class MigrationLogger implements SavedObjectsMigrationLogger { @@ -43,4 +47,5 @@ export class MigrationLogger implements SavedObjectsMigrationLogger { public info = (msg: string) => this.logger.info(msg); public debug = (msg: string) => this.logger.debug(msg); public warning = (msg: string) => this.logger.warn(msg); + public warn = (msg: string) => this.logger.warn(msg); } diff --git a/src/core/server/saved_objects/migrations/index.ts b/src/core/server/saved_objects/migrations/index.ts index 6cb7ecac92ab9..e96986bd702e6 100644 --- a/src/core/server/saved_objects/migrations/index.ts +++ b/src/core/server/saved_objects/migrations/index.ts @@ -18,3 +18,4 @@ */ export { KibanaMigrator, IKibanaMigrator } from './kibana'; +export { SavedObjectMigrationFn, SavedObjectMigrationMap } from './types'; diff --git a/src/core/server/saved_objects/migrations/kibana/__snapshots__/kibana_migrator.test.ts.snap b/src/core/server/saved_objects/migrations/kibana/__snapshots__/kibana_migrator.test.ts.snap index 792b2063fc86d..37a73b11bbc48 100644 --- a/src/core/server/saved_objects/migrations/kibana/__snapshots__/kibana_migrator.test.ts.snap +++ b/src/core/server/saved_objects/migrations/kibana/__snapshots__/kibana_migrator.test.ts.snap @@ -4,8 +4,8 @@ exports[`KibanaMigrator getActiveMappings returns full index mappings w/ core pr Object { "_meta": Object { "migrationMappingPropertyHashes": Object { - "amap": "625b32086eb1d1203564cf85062dd22e", - "bmap": "625b32086eb1d1203564cf85062dd22e", + "amap": "510f1f0adb69830cf8a1c5ce2923ed82", + "bmap": "510f1f0adb69830cf8a1c5ce2923ed82", "config": "87aca8fdb053154f11383fce3dbf3edf", "migrationVersion": "4a1746014a75ade3a714e1db5763276f", "namespace": "2f4316de49999235636386fe51dc06c1", @@ -17,10 +17,18 @@ Object { "dynamic": "strict", "properties": Object { "amap": Object { - "type": "text", + "properties": Object { + "field": Object { + "type": "text", + }, + }, }, "bmap": Object { - "type": "text", + "properties": Object { + "field": Object { + "type": "text", + }, + }, }, "config": Object { "dynamic": "true", diff --git a/src/core/server/saved_objects/migrations/kibana/kibana_migrator.mock.ts b/src/core/server/saved_objects/migrations/kibana/kibana_migrator.mock.ts index c1021018538d5..2ee656721abd0 100644 --- a/src/core/server/saved_objects/migrations/kibana/kibana_migrator.mock.ts +++ b/src/core/server/saved_objects/migrations/kibana/kibana_migrator.mock.ts @@ -19,28 +19,29 @@ import { KibanaMigrator } from './kibana_migrator'; import { buildActiveMappings } from '../core'; -import { SavedObjectsMapping } from '../../mappings'; -const { mergeProperties } = jest.requireActual('./kibana_migrator'); +const { mergeTypes } = jest.requireActual('./kibana_migrator'); +import { SavedObjectsType } from '../../types'; -const defaultSavedObjectMappings = [ +const defaultSavedObjectTypes: SavedObjectsType[] = [ { - pluginId: 'testplugin', - properties: { - testtype: { - properties: { - name: { type: 'keyword' }, - }, + name: 'testtype', + hidden: false, + namespaceAgnostic: false, + mappings: { + properties: { + name: { type: 'keyword' }, }, }, + migrations: {}, }, ]; const createMigrator = ( { - savedObjectMappings, + types, }: { - savedObjectMappings: SavedObjectsMapping[]; - } = { savedObjectMappings: defaultSavedObjectMappings } + types: SavedObjectsType[]; + } = { types: defaultSavedObjectTypes } ) => { const mockMigrator: jest.Mocked> = { runMigrations: jest.fn(), @@ -48,9 +49,7 @@ const createMigrator = ( migrateDocument: jest.fn(), }; - mockMigrator.getActiveMappings.mockReturnValue( - buildActiveMappings({ properties: mergeProperties(savedObjectMappings) }) - ); + mockMigrator.getActiveMappings.mockReturnValue(buildActiveMappings(mergeTypes(types))); mockMigrator.migrateDocument.mockImplementation(doc => doc); return mockMigrator; }; diff --git a/src/core/server/saved_objects/migrations/kibana/kibana_migrator.test.ts b/src/core/server/saved_objects/migrations/kibana/kibana_migrator.test.ts index c6a72eb53d6c4..fd82bf282266e 100644 --- a/src/core/server/saved_objects/migrations/kibana/kibana_migrator.test.ts +++ b/src/core/server/saved_objects/migrations/kibana/kibana_migrator.test.ts @@ -17,45 +17,49 @@ * under the License. */ -import _ from 'lodash'; import { KibanaMigratorOptions, KibanaMigrator } from './kibana_migrator'; import { loggingServiceMock } from '../../../logging/logging_service.mock'; -import { SavedObjectsSchema } from '../../schema'; +import { SavedObjectTypeRegistry } from '../../saved_objects_type_registry'; +import { SavedObjectsType } from '../../types'; + +const createRegistry = (types: Array>) => { + const registry = new SavedObjectTypeRegistry(); + types.forEach(type => + registry.registerType({ + name: 'unknown', + namespaceAgnostic: false, + hidden: false, + mappings: { properties: {} }, + migrations: {}, + ...type, + }) + ); + return registry; +}; describe('KibanaMigrator', () => { describe('getActiveMappings', () => { it('returns full index mappings w/ core properties', () => { const options = mockOptions(); - options.savedObjectMappings = [ + options.typeRegistry = createRegistry([ { - pluginId: 'aaa', - properties: { amap: { type: 'text' } }, + name: 'amap', + mappings: { + properties: { field: { type: 'text' } }, + }, }, { - pluginId: 'bbb', - properties: { bmap: { type: 'text' } }, + name: 'bmap', + indexPattern: 'other-index', + mappings: { + properties: { field: { type: 'text' } }, + }, }, - ]; + ]); + const mappings = new KibanaMigrator(options).getActiveMappings(); expect(mappings).toMatchSnapshot(); }); - - it('Fails if duplicate mappings are defined', () => { - const options = mockOptions(); - options.savedObjectMappings = [ - { - pluginId: 'aaa', - properties: { amap: { type: 'text' } }, - }, - { - pluginId: 'bbb', - properties: { amap: { type: 'long' } }, - }, - ]; - expect(() => new KibanaMigrator(options).getActiveMappings()).toThrow( - /Plugin bbb is attempting to redefine mapping "amap"/ - ); - }); }); describe('runMigrations', () => { @@ -78,41 +82,37 @@ describe('KibanaMigrator', () => { }); }); -function mockOptions({ configValues }: { configValues?: any } = {}): KibanaMigratorOptions { +function mockOptions(): KibanaMigratorOptions { const callCluster = jest.fn(); return { logger: loggingServiceMock.create().get(), kibanaVersion: '8.2.3', savedObjectValidations: {}, - savedObjectMigrations: {}, - savedObjectMappings: [ + typeRegistry: createRegistry([ { - pluginId: 'testtype', - properties: { - testtype: { - properties: { - name: { type: 'keyword' }, - }, + name: 'testtype', + hidden: false, + namespaceAgnostic: false, + mappings: { + properties: { + name: { type: 'keyword' }, }, }, + migrations: {}, }, { - pluginId: 'testtype2', - properties: { - testtype2: { - properties: { - name: { type: 'keyword' }, - }, + name: 'testtype2', + hidden: false, + namespaceAgnostic: false, + indexPattern: 'other-index', + mappings: { + properties: { + name: { type: 'keyword' }, }, }, + migrations: {}, }, - ], - savedObjectSchemas: new SavedObjectsSchema({ - testtype2: { - isNamespaceAgnostic: false, - indexPattern: 'other-index', - }, - }), + ]), kibanaConfig: { enabled: true, index: '.my-index', @@ -123,15 +123,6 @@ function mockOptions({ configValues }: { configValues?: any } = {}): KibanaMigra scrollDuration: '10m', skip: false, }, - config: { - get: (name: string) => { - if (configValues && configValues[name]) { - return configValues[name]; - } else { - throw new Error(`Unexpected config ${name}`); - } - }, - } as KibanaMigratorOptions['config'], callCluster, }; } diff --git a/src/core/server/saved_objects/migrations/kibana/kibana_migrator.ts b/src/core/server/saved_objects/migrations/kibana/kibana_migrator.ts index 747b48a540109..9b4fe10a35100 100644 --- a/src/core/server/saved_objects/migrations/kibana/kibana_migrator.ts +++ b/src/core/server/saved_objects/migrations/kibana/kibana_migrator.ts @@ -24,30 +24,23 @@ import { Logger } from 'src/core/server/logging'; import { KibanaConfigType } from 'src/core/server/kibana_config'; -import { MappingProperties, SavedObjectsMapping, IndexMapping } from '../../mappings'; -import { SavedObjectsSchema } from '../../schema'; -import { RawSavedObjectDoc, SavedObjectsSerializer } from '../../serialization'; +import { IndexMapping, SavedObjectsTypeMappingDefinitions } from '../../mappings'; +import { SavedObjectUnsanitizedDoc, SavedObjectsSerializer } from '../../serialization'; import { docValidator, PropertyValidators } from '../../validation'; import { buildActiveMappings, CallCluster, IndexMigrator } from '../core'; -import { - DocumentMigrator, - VersionedTransformer, - MigrationDefinition, -} from '../core/document_migrator'; +import { DocumentMigrator, VersionedTransformer } from '../core/document_migrator'; import { createIndexMap } from '../core/build_index_map'; import { SavedObjectsConfigType } from '../../saved_objects_config'; -import { LegacyConfig } from '../../../legacy'; +import { ISavedObjectTypeRegistry } from '../../saved_objects_type_registry'; +import { SavedObjectsType } from '../../types'; export interface KibanaMigratorOptions { callCluster: CallCluster; - config: LegacyConfig; + typeRegistry: ISavedObjectTypeRegistry; savedObjectsConfig: SavedObjectsConfigType; kibanaConfig: KibanaConfigType; kibanaVersion: string; logger: Logger; - savedObjectMappings: SavedObjectsMapping[]; - savedObjectMigrations: MigrationDefinition; - savedObjectSchemas: SavedObjectsSchema; savedObjectValidations: PropertyValidators; } @@ -58,13 +51,12 @@ export type IKibanaMigrator = Pick; */ export class KibanaMigrator { private readonly callCluster: CallCluster; - private readonly config: LegacyConfig; private readonly savedObjectsConfig: SavedObjectsConfigType; private readonly documentMigrator: VersionedTransformer; private readonly kibanaConfig: KibanaConfigType; private readonly log: Logger; - private readonly mappingProperties: MappingProperties; - private readonly schema: SavedObjectsSchema; + private readonly mappingProperties: SavedObjectsTypeMappingDefinitions; + private readonly typeRegistry: ISavedObjectTypeRegistry; private readonly serializer: SavedObjectsSerializer; private migrationResult?: Promise>; @@ -73,27 +65,23 @@ export class KibanaMigrator { */ constructor({ callCluster, - config, + typeRegistry, kibanaConfig, savedObjectsConfig, + savedObjectValidations, kibanaVersion, logger, - savedObjectMappings, - savedObjectMigrations, - savedObjectSchemas, - savedObjectValidations, }: KibanaMigratorOptions) { - this.config = config; this.callCluster = callCluster; this.kibanaConfig = kibanaConfig; this.savedObjectsConfig = savedObjectsConfig; - this.schema = savedObjectSchemas; - this.serializer = new SavedObjectsSerializer(this.schema); - this.mappingProperties = mergeProperties(savedObjectMappings || []); + this.typeRegistry = typeRegistry; + this.serializer = new SavedObjectsSerializer(this.typeRegistry); + this.mappingProperties = mergeTypes(this.typeRegistry.getAllTypes()); this.log = logger; this.documentMigrator = new DocumentMigrator({ kibanaVersion, - migrations: savedObjectMigrations || {}, + typeRegistry, validateDoc: docValidator(savedObjectValidations || {}), log: this.log, }); @@ -118,10 +106,9 @@ export class KibanaMigrator { private runMigrationsInternal() { const kibanaIndexName = this.kibanaConfig.index; const indexMap = createIndexMap({ - config: this.config, kibanaIndexName, indexMap: this.mappingProperties, - schema: this.schema, + registry: this.typeRegistry, }); const migrators = Object.keys(indexMap).map(index => { @@ -150,7 +137,7 @@ export class KibanaMigrator { * */ public getActiveMappings(): IndexMapping { - return buildActiveMappings({ properties: this.mappingProperties }); + return buildActiveMappings(this.mappingProperties); } /** @@ -159,7 +146,7 @@ export class KibanaMigrator { * @param doc - The saved object to migrate * @returns `doc` with all registered migrations applied. */ - public migrateDocument(doc: RawSavedObjectDoc): RawSavedObjectDoc { + public migrateDocument(doc: SavedObjectUnsanitizedDoc): SavedObjectUnsanitizedDoc { return this.documentMigrator.migrate(doc); } } @@ -168,12 +155,15 @@ export class KibanaMigrator { * Merges savedObjectMappings properties into a single object, verifying that * no mappings are redefined. */ -export function mergeProperties(mappings: SavedObjectsMapping[]): MappingProperties { - return mappings.reduce((acc, { pluginId, properties }) => { - const duplicate = Object.keys(properties).find(k => acc.hasOwnProperty(k)); +export function mergeTypes(types: SavedObjectsType[]): SavedObjectsTypeMappingDefinitions { + return types.reduce((acc, { name: type, mappings }) => { + const duplicate = acc.hasOwnProperty(type); if (duplicate) { - throw new Error(`Plugin ${pluginId} is attempting to redefine mapping "${duplicate}".`); + throw new Error(`Type ${type} is already defined.`); } - return Object.assign(acc, properties); + return { + ...acc, + [type]: mappings, + }; }, {}); } diff --git a/src/core/server/saved_objects/migrations/types.ts b/src/core/server/saved_objects/migrations/types.ts new file mode 100644 index 0000000000000..01741dd2ded1a --- /dev/null +++ b/src/core/server/saved_objects/migrations/types.ts @@ -0,0 +1,51 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { SavedObjectUnsanitizedDoc } from '../serialization'; +import { SavedObjectsMigrationLogger } from './core/migration_logger'; + +/** + * A migration function defined for a {@link SavedObjectsType | saved objects type} + * used to migrate it's {@link SavedObjectUnsanitizedDoc | documents} + */ +export type SavedObjectMigrationFn = ( + doc: SavedObjectUnsanitizedDoc, + log: SavedObjectsMigrationLogger +) => SavedObjectUnsanitizedDoc; + +/** + * A map of {@link SavedObjectMigrationFn | migration functions} to be used for a given type. + * The map's keys must be valid semver versions. + * + * For a given document, only migrations with a higher version number than that of the document will be applied. + * Migrations are executed in order, starting from the lowest version and ending with the highest one. + * + * @example + * ```typescript + * const migrations: SavedObjectMigrationMap = { + * '1.0.0': migrateToV1, + * '2.1.0': migrateToV21 + * } + * ``` + * + * @public + */ +export interface SavedObjectMigrationMap { + [version: string]: SavedObjectMigrationFn; +} diff --git a/src/core/server/saved_objects/saved_objects_service.mock.ts b/src/core/server/saved_objects/saved_objects_service.mock.ts index a15d1f5b864b7..70f3d5a5b18e4 100644 --- a/src/core/server/saved_objects/saved_objects_service.mock.ts +++ b/src/core/server/saved_objects/saved_objects_service.mock.ts @@ -21,38 +21,60 @@ import { SavedObjectsService, InternalSavedObjectsServiceSetup, InternalSavedObjectsServiceStart, + SavedObjectsServiceSetup, + SavedObjectsServiceStart, } from './saved_objects_service'; import { mockKibanaMigrator } from './migrations/kibana/kibana_migrator.mock'; import { savedObjectsClientProviderMock } from './service/lib/scoped_client_provider.mock'; import { savedObjectsRepositoryMock } from './service/lib/repository.mock'; import { savedObjectsClientMock } from './service/saved_objects_client.mock'; +import { typeRegistryMock } from './saved_objects_type_registry.mock'; type SavedObjectsServiceContract = PublicMethodsOf; const createStartContractMock = () => { - const startContract: jest.Mocked = { - clientProvider: savedObjectsClientProviderMock.create(), + const startContrat: jest.Mocked = { getScopedClient: jest.fn(), createInternalRepository: jest.fn(), createScopedRepository: jest.fn(), - migrator: mockKibanaMigrator.create(), + createSerializer: jest.fn(), }; - startContract.getScopedClient.mockReturnValue(savedObjectsClientMock.create()); - startContract.createInternalRepository.mockReturnValue(savedObjectsRepositoryMock.create()); - startContract.createScopedRepository.mockReturnValue(savedObjectsRepositoryMock.create()); + startContrat.getScopedClient.mockReturnValue(savedObjectsClientMock.create()); + startContrat.createInternalRepository.mockReturnValue(savedObjectsRepositoryMock.create()); + startContrat.createScopedRepository.mockReturnValue(savedObjectsRepositoryMock.create()); + + return startContrat; +}; + +const createInternalStartContractMock = () => { + const internalStartContract: jest.Mocked = { + ...createStartContractMock(), + clientProvider: savedObjectsClientProviderMock.create(), + migrator: mockKibanaMigrator.create(), + typeRegistry: typeRegistryMock.create(), + }; - return startContract; + return internalStartContract; }; const createSetupContractMock = () => { - const setupContract: jest.Mocked = { + const setupContract: jest.Mocked = { setClientFactoryProvider: jest.fn(), addClientWrapper: jest.fn(), }; + return setupContract; }; +const createInternalSetupContractMock = () => { + const internalSetupContract: jest.Mocked = { + ...createSetupContractMock(), + registerType: jest.fn(), + }; + return internalSetupContract; +}; + const createSavedObjectsServiceMock = () => { const mocked: jest.Mocked = { setup: jest.fn(), @@ -60,14 +82,16 @@ const createSavedObjectsServiceMock = () => { stop: jest.fn(), }; - mocked.setup.mockResolvedValue(createSetupContractMock()); - mocked.start.mockResolvedValue(createStartContractMock()); + mocked.setup.mockResolvedValue(createInternalSetupContractMock()); + mocked.start.mockResolvedValue(createInternalStartContractMock()); mocked.stop.mockResolvedValue(); return mocked; }; export const savedObjectsServiceMock = { create: createSavedObjectsServiceMock, + createInternalSetupContract: createInternalSetupContractMock, createSetupContract: createSetupContractMock, + createInternalStartContract: createInternalStartContractMock, createStartContract: createStartContractMock, }; diff --git a/src/core/server/saved_objects/saved_objects_service.test.mocks.ts b/src/core/server/saved_objects/saved_objects_service.test.mocks.ts index a9ad0778d4757..8c1cd3411203a 100644 --- a/src/core/server/saved_objects/saved_objects_service.test.mocks.ts +++ b/src/core/server/saved_objects/saved_objects_service.test.mocks.ts @@ -19,6 +19,7 @@ import { mockKibanaMigrator } from './migrations/kibana/kibana_migrator.mock'; import { savedObjectsClientProviderMock } from './service/lib/scoped_client_provider.mock'; +import { typeRegistryMock } from './saved_objects_type_registry.mock'; export const migratorInstanceMock = mockKibanaMigrator.create(); export const KibanaMigratorMock = jest.fn().mockImplementation(() => migratorInstanceMock); @@ -30,3 +31,8 @@ export const clientProviderInstanceMock = savedObjectsClientProviderMock.create( jest.doMock('./service/lib/scoped_client_provider', () => ({ SavedObjectsClientProvider: jest.fn().mockImplementation(() => clientProviderInstanceMock), })); + +export const typeRegistryInstanceMock = typeRegistryMock.create(); +jest.doMock('./saved_objects_type_registry', () => ({ + SavedObjectTypeRegistry: jest.fn().mockImplementation(() => typeRegistryInstanceMock), +})); diff --git a/src/core/server/saved_objects/saved_objects_service.test.ts b/src/core/server/saved_objects/saved_objects_service.test.ts index 19798aa68928d..07e7d8db8b25c 100644 --- a/src/core/server/saved_objects/saved_objects_service.test.ts +++ b/src/core/server/saved_objects/saved_objects_service.test.ts @@ -21,6 +21,7 @@ import { KibanaMigratorMock, migratorInstanceMock, clientProviderInstanceMock, + typeRegistryInstanceMock, } from './saved_objects_service.test.mocks'; import { SavedObjectsService } from './saved_objects_service'; @@ -108,6 +109,25 @@ describe('SavedObjectsService', () => { ); }); }); + + describe('registerType', () => { + it('registers the type to the internal typeRegistry', async () => { + const coreContext = mockCoreContext.create(); + const soService = new SavedObjectsService(coreContext); + const setup = await soService.setup(createSetupDeps()); + + const type = { + name: 'someType', + hidden: false, + namespaceAgnostic: false, + mappings: { properties: {} }, + }; + setup.registerType(type); + + expect(typeRegistryInstanceMock.registerType).toHaveBeenCalledTimes(1); + expect(typeRegistryInstanceMock.registerType).toHaveBeenCalledWith(type); + }); + }); }); describe('#start()', () => { diff --git a/src/core/server/saved_objects/saved_objects_service.ts b/src/core/server/saved_objects/saved_objects_service.ts index 0c985c71c7e2f..2f07dbe51a09e 100644 --- a/src/core/server/saved_objects/saved_objects_service.ts +++ b/src/core/server/saved_objects/saved_objects_service.ts @@ -21,7 +21,6 @@ import { CoreService } from 'src/core/types'; import { first, filter, take } from 'rxjs/operators'; import { SavedObjectsClient, - SavedObjectsSchema, SavedObjectsClientProvider, ISavedObjectsClientProvider, SavedObjectsClientProviderOptions, @@ -34,17 +33,17 @@ import { KibanaConfigType } from '../kibana_config'; import { migrationsRetryCallCluster } from '../elasticsearch/retry_call_cluster'; import { SavedObjectsConfigType } from './saved_objects_config'; import { KibanaRequest } from '../http'; -import { SavedObjectsClientContract } from './types'; +import { SavedObjectsClientContract, SavedObjectsType } from './types'; import { ISavedObjectsRepository, SavedObjectsRepository } from './service/lib/repository'; import { SavedObjectsClientFactoryProvider, SavedObjectsClientWrapperFactory, } from './service/lib/scoped_client_provider'; import { Logger } from '../logging'; -import { SavedObjectsMapping } from './mappings'; -import { MigrationDefinition } from './migrations/core/document_migrator'; -import { SavedObjectsSchemaDefinition } from './schema'; +import { convertLegacyTypes } from './utils'; +import { SavedObjectTypeRegistry, ISavedObjectTypeRegistry } from './saved_objects_type_registry'; import { PropertyValidators } from './validation'; +import { SavedObjectsSerializer } from './serialization'; /** * Saved Objects is Kibana's data persistence mechanism allowing plugins to @@ -70,6 +69,7 @@ import { PropertyValidators } from './validation'; * constructor. * * @example + * ```ts * import { SavedObjectsClient, CoreSetup } from 'src/core/server'; * * export class Plugin() { @@ -79,6 +79,7 @@ import { PropertyValidators } from './validation'; * }) * } * } + * ``` * * @public */ @@ -102,7 +103,9 @@ export interface SavedObjectsServiceSetup { /** * @internal */ -export type InternalSavedObjectsServiceSetup = SavedObjectsServiceSetup; +export interface InternalSavedObjectsServiceSetup extends SavedObjectsServiceSetup { + registerType: (type: SavedObjectsType) => void; +} /** * Saved Objects is Kibana's data persisentence mechanism allowing plugins to @@ -146,6 +149,10 @@ export interface SavedObjectsServiceStart { * @param extraTypes - A list of additional hidden types the repository should have access to. */ createInternalRepository: (extraTypes?: string[]) => ISavedObjectsRepository; + /** + * Creates a {@link SavedObjectsSerializer | serializer} that is aware of all registered types. + */ + createSerializer: () => SavedObjectsSerializer; } export interface InternalSavedObjectsServiceStart extends SavedObjectsServiceStart { @@ -157,6 +164,10 @@ export interface InternalSavedObjectsServiceStart extends SavedObjectsServiceSta * @deprecated Exposed only for injecting into Legacy */ clientProvider: ISavedObjectsClientProvider; + /** + * @deprecated Exposed only for injecting into Legacy + */ + typeRegistry: ISavedObjectTypeRegistry; } /** @@ -207,9 +218,7 @@ export class SavedObjectsService private clientFactoryProvider?: SavedObjectsClientFactoryProvider; private clientFactoryWrappers: WrappedClientFactoryWrapper[] = []; - private mappings: SavedObjectsMapping[] = []; - private migrations: MigrationDefinition = {}; - private schemas: SavedObjectsSchemaDefinition = {}; + private typeRegistry = new SavedObjectTypeRegistry(); private validations: PropertyValidators = {}; constructor(private readonly coreContext: CoreContext) { @@ -221,16 +230,12 @@ export class SavedObjectsService this.setupDeps = setupDeps; - const { - savedObjectSchemas: savedObjectsSchemasDefinition, - savedObjectMappings, - savedObjectMigrations, - savedObjectValidations, - } = setupDeps.legacyPlugins.uiExports; - this.mappings = savedObjectMappings; - this.migrations = savedObjectMigrations; - this.schemas = savedObjectsSchemasDefinition; - this.validations = savedObjectValidations; + const legacyTypes = convertLegacyTypes( + setupDeps.legacyPlugins.uiExports, + setupDeps.legacyPlugins.pluginExtendedConfig + ); + legacyTypes.forEach(type => this.typeRegistry.registerType(type)); + this.validations = setupDeps.legacyPlugins.uiExports.savedObjectValidations || {}; return { setClientFactoryProvider: provider => { @@ -246,6 +251,9 @@ export class SavedObjectsService factory, }); }, + registerType: type => { + this.typeRegistry.registerType(type); + }, }; } @@ -303,8 +311,7 @@ export class SavedObjectsService const createRepository = (callCluster: APICaller, extraTypes: string[] = []) => { return SavedObjectsRepository.createRepository( migrator, - new SavedObjectsSchema(this.schemas), - this.setupDeps!.legacyPlugins.pluginExtendedConfig, + this.typeRegistry, kibanaConfig.index, callCluster, extraTypes @@ -335,9 +342,11 @@ export class SavedObjectsService return { migrator, clientProvider, + typeRegistry: this.typeRegistry, getScopedClient: clientProvider.getClient.bind(clientProvider), createScopedRepository: repositoryFactory.createScopedRepository, createInternalRepository: repositoryFactory.createInternalRepository, + createSerializer: () => new SavedObjectsSerializer(this.typeRegistry), }; } @@ -348,18 +357,14 @@ export class SavedObjectsService savedObjectsConfig: SavedObjectsConfigType, migrationsRetryDelay?: number ): KibanaMigrator { - const savedObjectSchemas = new SavedObjectsSchema(this.schemas); const adminClient = this.setupDeps!.elasticsearch.adminClient; return new KibanaMigrator({ - savedObjectSchemas, - savedObjectMappings: this.mappings, - savedObjectMigrations: this.migrations, - savedObjectValidations: this.validations, + typeRegistry: this.typeRegistry, logger: this.logger, kibanaVersion: this.coreContext.env.packageInfo.version, - config: this.setupDeps!.legacyPlugins.pluginExtendedConfig, savedObjectsConfig, + savedObjectValidations: this.validations, kibanaConfig, callCluster: migrationsRetryCallCluster( adminClient.callAsInternalUser, diff --git a/src/core/server/saved_objects/schema/schema.mock.ts b/src/core/server/saved_objects/saved_objects_type_registry.mock.ts similarity index 58% rename from src/core/server/saved_objects/schema/schema.mock.ts rename to src/core/server/saved_objects/saved_objects_type_registry.mock.ts index 89c318f087ab0..6e11920db6b7d 100644 --- a/src/core/server/saved_objects/schema/schema.mock.ts +++ b/src/core/server/saved_objects/saved_objects_type_registry.mock.ts @@ -17,19 +17,25 @@ * under the License. */ -import { SavedObjectsSchema } from './schema'; +import { ISavedObjectTypeRegistry } from './saved_objects_type_registry'; -type Schema = PublicMethodsOf; -const createSchemaMock = () => { - const mocked: jest.Mocked = { - getIndexForType: jest.fn().mockReturnValue('.kibana-test'), - isHiddenType: jest.fn().mockReturnValue(false), - isNamespaceAgnostic: jest.fn((type: string) => type === 'global'), - getConvertToAliasScript: jest.fn().mockReturnValue(undefined), +const createRegistryMock = (): jest.Mocked => { + const mock = { + registerType: jest.fn(), + getType: jest.fn(), + getAllTypes: jest.fn(), + isNamespaceAgnostic: jest.fn(), + isHidden: jest.fn(), + getIndex: jest.fn(), }; - return mocked; + + mock.getIndex.mockReturnValue('.kibana-test'); + mock.isHidden.mockReturnValue(false); + mock.isNamespaceAgnostic.mockImplementation((type: string) => type === 'global'); + + return mock; }; -export const schemaMock = { - create: createSchemaMock, +export const typeRegistryMock = { + create: createRegistryMock, }; diff --git a/src/core/server/saved_objects/saved_objects_type_registry.test.ts b/src/core/server/saved_objects/saved_objects_type_registry.test.ts new file mode 100644 index 0000000000000..4268ab7718f8d --- /dev/null +++ b/src/core/server/saved_objects/saved_objects_type_registry.test.ts @@ -0,0 +1,215 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { SavedObjectTypeRegistry } from './saved_objects_type_registry'; +import { SavedObjectsType } from './types'; + +const createType = (type: Partial): SavedObjectsType => ({ + name: 'unknown', + hidden: false, + namespaceAgnostic: false, + mappings: { properties: {} }, + migrations: {}, + ...type, +}); + +describe('SavedObjectTypeRegistry', () => { + let registry: SavedObjectTypeRegistry; + + beforeEach(() => { + registry = new SavedObjectTypeRegistry(); + }); + + it('allows to register types', () => { + registry.registerType(createType({ name: 'typeA' })); + registry.registerType(createType({ name: 'typeB' })); + registry.registerType(createType({ name: 'typeC' })); + + expect( + registry + .getAllTypes() + .map(type => type.name) + .sort() + ).toEqual(['typeA', 'typeB', 'typeC']); + }); + + it('throws when trying to register the same type twice', () => { + registry.registerType(createType({ name: 'typeA' })); + registry.registerType(createType({ name: 'typeB' })); + expect(() => { + registry.registerType(createType({ name: 'typeA' })); + }).toThrowErrorMatchingInlineSnapshot(`"Type 'typeA' is already registered"`); + }); + + describe('#getType', () => { + it(`retrieve a type by it's name`, () => { + const typeA = createType({ name: 'typeA' }); + const typeB = createType({ name: 'typeB' }); + registry.registerType(typeA); + registry.registerType(typeB); + registry.registerType(createType({ name: 'typeC' })); + + expect(registry.getType('typeA')).toEqual(typeA); + expect(registry.getType('typeB')).toEqual(typeB); + expect(registry.getType('unknownType')).toBeUndefined(); + }); + + it('forbids to mutate the registered types', () => { + registry.registerType( + createType({ + name: 'typeA', + mappings: { + properties: { + someField: { type: 'text' }, + }, + }, + }) + ); + + const typeA = registry.getType('typeA')!; + + expect(() => { + typeA.migrations = {}; + }).toThrow(); + expect(() => { + typeA.name = 'foo'; + }).toThrow(); + expect(() => { + typeA.mappings.properties = {}; + }).toThrow(); + expect(() => { + typeA.indexPattern = '.overrided'; + }).toThrow(); + }); + }); + + describe('#getAllTypes', () => { + it('returns all registered types', () => { + const typeA = createType({ name: 'typeA' }); + const typeB = createType({ name: 'typeB' }); + const typeC = createType({ name: 'typeC' }); + registry.registerType(typeA); + registry.registerType(typeB); + + const registered = registry.getAllTypes(); + expect(registered.length).toEqual(2); + expect(registered).toContainEqual(typeA); + expect(registered).toContainEqual(typeB); + expect(registered).not.toContainEqual(typeC); + }); + + it('forbids to mutate the registered types', () => { + registry.registerType( + createType({ + name: 'typeA', + mappings: { + properties: { + someField: { type: 'text' }, + }, + }, + }) + ); + registry.registerType( + createType({ + name: 'typeB', + migrations: { + '1.0.0': jest.fn(), + }, + }) + ); + + const typeA = registry.getType('typeA')!; + const typeB = registry.getType('typeB')!; + + expect(() => { + typeA.migrations = {}; + }).toThrow(); + expect(() => { + typeA.name = 'foo'; + }).toThrow(); + expect(() => { + typeB.mappings.properties = {}; + }).toThrow(); + expect(() => { + typeB.indexPattern = '.overrided'; + }).toThrow(); + }); + + it('does not mutate the registered types when altering the list', () => { + registry.registerType(createType({ name: 'typeA' })); + registry.registerType(createType({ name: 'typeB' })); + registry.registerType(createType({ name: 'typeC' })); + + const types = registry.getAllTypes(); + types.splice(0, 3); + + expect(registry.getAllTypes().length).toEqual(3); + }); + }); + + describe('#isNamespaceAgnostic', () => { + it('returns correct value for the type', () => { + registry.registerType(createType({ name: 'typeA', namespaceAgnostic: true })); + registry.registerType(createType({ name: 'typeB', namespaceAgnostic: false })); + + expect(registry.isNamespaceAgnostic('typeA')).toEqual(true); + expect(registry.isNamespaceAgnostic('typeB')).toEqual(false); + }); + it('returns false when the type is not registered', () => { + registry.registerType(createType({ name: 'typeA', namespaceAgnostic: true })); + registry.registerType(createType({ name: 'typeB', namespaceAgnostic: false })); + + expect(registry.isNamespaceAgnostic('unknownType')).toEqual(false); + }); + }); + + describe('#isHidden', () => { + it('returns correct value for the type', () => { + registry.registerType(createType({ name: 'typeA', hidden: true })); + registry.registerType(createType({ name: 'typeB', hidden: false })); + + expect(registry.isHidden('typeA')).toEqual(true); + expect(registry.isHidden('typeB')).toEqual(false); + }); + it('returns false when the type is not registered', () => { + registry.registerType(createType({ name: 'typeA', hidden: true })); + registry.registerType(createType({ name: 'typeB', hidden: false })); + + expect(registry.isHidden('unknownType')).toEqual(false); + }); + }); + + describe('#getIndex', () => { + it('returns correct value for the type', () => { + registry.registerType(createType({ name: 'typeA', indexPattern: '.custom-index' })); + registry.registerType(createType({ name: 'typeB', indexPattern: '.another-index' })); + registry.registerType(createType({ name: 'typeWithNoIndex' })); + + expect(registry.getIndex('typeA')).toEqual('.custom-index'); + expect(registry.getIndex('typeB')).toEqual('.another-index'); + expect(registry.getIndex('typeWithNoIndex')).toBeUndefined(); + }); + it('returns undefined when the type is not registered', () => { + registry.registerType(createType({ name: 'typeA', namespaceAgnostic: true })); + registry.registerType(createType({ name: 'typeB', namespaceAgnostic: false })); + + expect(registry.getIndex('unknownType')).toBeUndefined(); + }); + }); +}); diff --git a/src/core/server/saved_objects/saved_objects_type_registry.ts b/src/core/server/saved_objects/saved_objects_type_registry.ts new file mode 100644 index 0000000000000..3f26d696831fd --- /dev/null +++ b/src/core/server/saved_objects/saved_objects_type_registry.ts @@ -0,0 +1,86 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { deepFreeze } from '../../utils'; +import { SavedObjectsType } from './types'; + +/** + * See {@link SavedObjectTypeRegistry} for documentation. + * + * @internal + * */ +export type ISavedObjectTypeRegistry = PublicMethodsOf; + +/** + * Registry holding information about all the registered {@link SavedObjectsType | savedObject types}. + * + * @internal + */ +export class SavedObjectTypeRegistry { + private readonly types = new Map(); + + /** + * Register a {@link SavedObjectsType | type} inside the registry. + * A type can only be registered once. subsequent calls with the same type name will throw an error. + */ + public registerType(type: SavedObjectsType) { + if (this.types.has(type.name)) { + throw new Error(`Type '${type.name}' is already registered`); + } + this.types.set(type.name, deepFreeze(type)); + } + + /** + * Return the {@link SavedObjectsType | type} definition for given type name. + */ + public getType(type: string) { + return this.types.get(type); + } + + /** + * Return all {@link SavedObjectsType | types} currently registered. + */ + public getAllTypes() { + return [...this.types.values()]; + } + + /** + * Returns the `namespaceAgnostic` property for given type, or `false` if + * the type is not registered. + */ + public isNamespaceAgnostic(type: string) { + return this.types.get(type)?.namespaceAgnostic ?? false; + } + + /** + * Returns the `hidden` property for given type, or `false` if + * the type is not registered. + */ + public isHidden(type: string) { + return this.types.get(type)?.hidden ?? false; + } + + /** + * Returns the `indexPattern` property for given type, or `undefined` if + * the type is not registered. + */ + public getIndex(type: string) { + return this.types.get(type)?.indexPattern; + } +} diff --git a/src/core/server/saved_objects/schema/schema.ts b/src/core/server/saved_objects/schema/schema.ts index 00c4939233318..17ca406ea109a 100644 --- a/src/core/server/saved_objects/schema/schema.ts +++ b/src/core/server/saved_objects/schema/schema.ts @@ -19,6 +19,10 @@ import { LegacyConfig } from '../../legacy'; +/** + * @deprecated + * @internal + **/ interface SavedObjectsSchemaTypeDefinition { isNamespaceAgnostic: boolean; hidden?: boolean; @@ -26,12 +30,18 @@ interface SavedObjectsSchemaTypeDefinition { convertToAliasScript?: string; } -/** @internal */ +/** + * @deprecated + * @internal + **/ export interface SavedObjectsSchemaDefinition { - [key: string]: SavedObjectsSchemaTypeDefinition; + [type: string]: SavedObjectsSchemaTypeDefinition; } -/** @internal */ +/** + * @deprecated This is only used by the {@link SavedObjectsLegacyService | legacy savedObjects service} + * @internal + **/ export class SavedObjectsSchema { private readonly definition?: SavedObjectsSchemaDefinition; constructor(schemaDefinition?: SavedObjectsSchemaDefinition) { @@ -46,7 +56,6 @@ export class SavedObjectsSchema { return false; } - // TODO: Remove dependency on config when we move SavedObjectsSchema to NP public getIndexForType(config: LegacyConfig, type: string): string | undefined { if (this.definition != null && this.definition.hasOwnProperty(type)) { const { indexPattern } = this.definition[type]; diff --git a/src/core/server/saved_objects/serialization/index.ts b/src/core/server/saved_objects/serialization/index.ts index 217ffe7129e94..f7f4e75704341 100644 --- a/src/core/server/saved_objects/serialization/index.ts +++ b/src/core/server/saved_objects/serialization/index.ts @@ -22,167 +22,5 @@ * the raw document format as stored in ElasticSearch. */ -/* eslint-disable @typescript-eslint/camelcase */ - -import uuid from 'uuid'; -import { SavedObjectsSchema } from '../schema'; -import { decodeVersion, encodeVersion } from '../version'; -import { SavedObjectsMigrationVersion, SavedObjectReference } from '../types'; - -/** - * A raw document as represented directly in the saved object index. - */ -export interface RawDoc { - _id: string; - _source: any; - _type?: string; - _seq_no?: number; - _primary_term?: number; -} - -/** - * A saved object type definition that allows for miscellaneous, unknown - * properties, as current discussions around security, ACLs, etc indicate - * that future props are likely to be added. Migrations support this - * scenario out of the box. - */ -interface SavedObjectDoc { - attributes: object; - id?: string; // NOTE: SavedObjectDoc is used for uncreated objects where `id` is optional - type: string; - namespace?: string; - migrationVersion?: SavedObjectsMigrationVersion; - version?: string; - updated_at?: string; - - [rootProp: string]: any; -} - -interface Referencable { - references: SavedObjectReference[]; -} - -/** - * We want to have two types, one that guarantees a "references" attribute - * will exist and one that allows it to be null. Since we're not migrating - * all the saved objects to have a "references" array, we need to support - * the scenarios where it may be missing (ex migrations). - */ -export type RawSavedObjectDoc = SavedObjectDoc & Partial; -export type SanitizedSavedObjectDoc = SavedObjectDoc & Referencable; - -function assertNonEmptyString(value: string, name: string) { - if (!value || typeof value !== 'string') { - throw new TypeError(`Expected "${value}" to be a ${name}`); - } -} - -/** @internal */ -export class SavedObjectsSerializer { - private readonly schema: SavedObjectsSchema; - - constructor(schema: SavedObjectsSchema) { - this.schema = schema; - } - /** - * Determines whether or not the raw document can be converted to a saved object. - * - * @param {RawDoc} rawDoc - The raw ES document to be tested - */ - public isRawSavedObject(rawDoc: RawDoc) { - const { type, namespace } = rawDoc._source; - const namespacePrefix = - namespace && !this.schema.isNamespaceAgnostic(type) ? `${namespace}:` : ''; - return ( - type && - rawDoc._id.startsWith(`${namespacePrefix}${type}:`) && - rawDoc._source.hasOwnProperty(type) - ); - } - - /** - * Converts a document from the format that is stored in elasticsearch to the saved object client format. - * - * @param {RawDoc} rawDoc - The raw ES document to be converted to saved object format. - */ - public rawToSavedObject(doc: RawDoc): SanitizedSavedObjectDoc { - const { _id, _source, _seq_no, _primary_term } = doc; - const { type, namespace } = _source; - - const version = - _seq_no != null || _primary_term != null - ? encodeVersion(_seq_no!, _primary_term!) - : undefined; - - return { - type, - id: this.trimIdPrefix(namespace, type, _id), - ...(namespace && !this.schema.isNamespaceAgnostic(type) && { namespace }), - attributes: _source[type], - references: _source.references || [], - ...(_source.migrationVersion && { migrationVersion: _source.migrationVersion }), - ...(_source.updated_at && { updated_at: _source.updated_at }), - ...(version && { version }), - }; - } - - /** - * Converts a document from the saved object client format to the format that is stored in elasticsearch. - * - * @param {SanitizedSavedObjectDoc} savedObj - The saved object to be converted to raw ES format. - */ - public savedObjectToRaw(savedObj: SanitizedSavedObjectDoc): RawDoc { - const { - id, - type, - namespace, - attributes, - migrationVersion, - updated_at, - version, - references, - } = savedObj; - const source = { - [type]: attributes, - type, - references, - ...(namespace && !this.schema.isNamespaceAgnostic(type) && { namespace }), - ...(migrationVersion && { migrationVersion }), - ...(updated_at && { updated_at }), - }; - - return { - _id: this.generateRawId(namespace, type, id), - _source: source, - ...(version != null && decodeVersion(version)), - }; - } - - /** - * Given a saved object type and id, generates the compound id that is stored in the raw document. - * - * @param {string} namespace - The namespace of the saved object - * @param {string} type - The saved object type - * @param {string} id - The id of the saved object - */ - public generateRawId(namespace: string | undefined, type: string, id?: string) { - const namespacePrefix = - namespace && !this.schema.isNamespaceAgnostic(type) ? `${namespace}:` : ''; - return `${namespacePrefix}${type}:${id || uuid.v1()}`; - } - - private trimIdPrefix(namespace: string | undefined, type: string, id: string) { - assertNonEmptyString(id, 'document id'); - assertNonEmptyString(type, 'saved object type'); - - const namespacePrefix = - namespace && !this.schema.isNamespaceAgnostic(type) ? `${namespace}:` : ''; - const prefix = `${namespacePrefix}${type}:`; - - if (!id.startsWith(prefix)) { - return id; - } - - return id.slice(prefix.length); - } -} +export { SavedObjectUnsanitizedDoc, SavedObjectSanitizedDoc, SavedObjectsRawDoc } from './types'; +export { SavedObjectsSerializer } from './serializer'; diff --git a/src/core/server/saved_objects/serialization/serialization.test.ts b/src/core/server/saved_objects/serialization/serializer.test.ts similarity index 79% rename from src/core/server/saved_objects/serialization/serialization.test.ts rename to src/core/server/saved_objects/serialization/serializer.test.ts index e8bcdde73fcf4..8f09b25bb3908 100644 --- a/src/core/server/saved_objects/serialization/serialization.test.ts +++ b/src/core/server/saved_objects/serialization/serializer.test.ts @@ -18,14 +18,21 @@ */ import _ from 'lodash'; -import { SavedObjectsSerializer } from '.'; -import { SavedObjectsSchema } from '../schema'; +import { SavedObjectsSerializer } from './serializer'; +import { typeRegistryMock } from '../saved_objects_type_registry.mock'; import { encodeVersion } from '../version'; describe('saved object conversion', () => { + let typeRegistry: ReturnType; + + beforeEach(() => { + typeRegistry = typeRegistryMock.create(); + typeRegistry.isNamespaceAgnostic.mockReturnValue(false); + }); + describe('#rawToSavedObject', () => { test('it copies the _source.type property to type', () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); const actual = serializer.rawToSavedObject({ _id: 'foo:bar', _source: { @@ -36,7 +43,7 @@ describe('saved object conversion', () => { }); test('it copies the _source.references property to references', () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); const actual = serializer.rawToSavedObject({ _id: 'foo:bar', _source: { @@ -54,7 +61,7 @@ describe('saved object conversion', () => { }); test('if specified it copies the _source.migrationVersion property to migrationVersion', () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); const actual = serializer.rawToSavedObject({ _id: 'foo:bar', _source: { @@ -72,7 +79,7 @@ describe('saved object conversion', () => { }); test(`if _source.migrationVersion is unspecified it doesn't set migrationVersion`, () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); const actual = serializer.rawToSavedObject({ _id: 'foo:bar', _source: { @@ -83,8 +90,8 @@ describe('saved object conversion', () => { }); test('it converts the id and type properties, and retains migrationVersion', () => { - const now = new Date(); - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const now = String(new Date()); + const serializer = new SavedObjectsSerializer(typeRegistry); const actual = serializer.rawToSavedObject({ _id: 'hello:world', _seq_no: 3, @@ -121,7 +128,7 @@ describe('saved object conversion', () => { }); test(`if version is unspecified it doesn't set version`, () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); const actual = serializer.rawToSavedObject({ _id: 'foo:bar', _source: { @@ -133,7 +140,7 @@ describe('saved object conversion', () => { }); test(`if specified it encodes _seq_no and _primary_term to version`, () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); const actual = serializer.rawToSavedObject({ _id: 'foo:bar', _seq_no: 4, @@ -147,7 +154,7 @@ describe('saved object conversion', () => { }); test(`if only _seq_no is specified it throws`, () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); expect(() => serializer.rawToSavedObject({ _id: 'foo:bar', @@ -161,7 +168,7 @@ describe('saved object conversion', () => { }); test(`if only _primary_term is throws`, () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); expect(() => serializer.rawToSavedObject({ _id: 'foo:bar', @@ -175,7 +182,7 @@ describe('saved object conversion', () => { }); test('if specified it copies the _source.updated_at property to updated_at', () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); const now = Date(); const actual = serializer.rawToSavedObject({ _id: 'foo:bar', @@ -188,7 +195,7 @@ describe('saved object conversion', () => { }); test(`if _source.updated_at is unspecified it doesn't set updated_at`, () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); const actual = serializer.rawToSavedObject({ _id: 'foo:bar', _source: { @@ -199,7 +206,7 @@ describe('saved object conversion', () => { }); test('it does not pass unknown properties through', () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); const actual = serializer.rawToSavedObject({ _id: 'universe', _source: { @@ -221,7 +228,7 @@ describe('saved object conversion', () => { }); test('it does not create attributes if [type] is missing', () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); const actual = serializer.rawToSavedObject({ _id: 'universe', _source: { @@ -236,7 +243,7 @@ describe('saved object conversion', () => { }); test('it fails for documents which do not specify a type', () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); expect(() => serializer.rawToSavedObject({ _id: 'universe', @@ -244,13 +251,13 @@ describe('saved object conversion', () => { hello: { world: 'earth', }, - }, + } as any, }) ).toThrow(/Expected "undefined" to be a saved object type/); }); test('it is complimentary with savedObjectToRaw', () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); const raw = { _id: 'foo-namespace:foo:bar', _primary_term: 24, @@ -266,7 +273,7 @@ describe('saved object conversion', () => { bar: '9.8.7', }, namespace: 'foo-namespace', - updated_at: new Date(), + updated_at: String(new Date()), references: [], }, }; @@ -277,7 +284,7 @@ describe('saved object conversion', () => { }); test('it handles unprefixed ids', () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); const actual = serializer.rawToSavedObject({ _id: 'universe', _source: { @@ -290,7 +297,7 @@ describe('saved object conversion', () => { describe('namespaced type without a namespace', () => { test(`removes type prefix from _id`, () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); const actual = serializer.rawToSavedObject({ _id: 'foo:bar', _source: { @@ -302,7 +309,7 @@ describe('saved object conversion', () => { }); test(`if prefixed by random prefix and type it copies _id to id`, () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); const actual = serializer.rawToSavedObject({ _id: 'random:foo:bar', _source: { @@ -314,7 +321,7 @@ describe('saved object conversion', () => { }); test(`doesn't specify namespace`, () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); const actual = serializer.rawToSavedObject({ _id: 'foo:bar', _source: { @@ -328,7 +335,7 @@ describe('saved object conversion', () => { describe('namespaced type with a namespace', () => { test(`removes type and namespace prefix from _id`, () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); const actual = serializer.rawToSavedObject({ _id: 'baz:foo:bar', _source: { @@ -341,7 +348,7 @@ describe('saved object conversion', () => { }); test(`if prefixed by only type it copies _id to id`, () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); const actual = serializer.rawToSavedObject({ _id: 'foo:bar', _source: { @@ -354,7 +361,7 @@ describe('saved object conversion', () => { }); test(`if prefixed by random prefix and type it copies _id to id`, () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); const actual = serializer.rawToSavedObject({ _id: 'random:foo:bar', _source: { @@ -367,7 +374,7 @@ describe('saved object conversion', () => { }); test(`copies _source.namespace to namespace`, () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); const actual = serializer.rawToSavedObject({ _id: 'baz:foo:bar', _source: { @@ -381,10 +388,12 @@ describe('saved object conversion', () => { }); describe('namespace agnostic type with a namespace', () => { + beforeEach(() => { + typeRegistry.isNamespaceAgnostic.mockReturnValue(true); + }); + test(`removes type prefix from _id`, () => { - const serializer = new SavedObjectsSerializer( - new SavedObjectsSchema({ foo: { isNamespaceAgnostic: true } }) - ); + const serializer = new SavedObjectsSerializer(typeRegistry); const actual = serializer.rawToSavedObject({ _id: 'foo:bar', _source: { @@ -397,9 +406,7 @@ describe('saved object conversion', () => { }); test(`if prefixed by namespace and type it copies _id to id`, () => { - const serializer = new SavedObjectsSerializer( - new SavedObjectsSchema({ foo: { isNamespaceAgnostic: true } }) - ); + const serializer = new SavedObjectsSerializer(typeRegistry); const actual = serializer.rawToSavedObject({ _id: 'baz:foo:bar', _source: { @@ -412,9 +419,7 @@ describe('saved object conversion', () => { }); test(`doesn't copy _source.namespace to namespace`, () => { - const serializer = new SavedObjectsSerializer( - new SavedObjectsSchema({ foo: { isNamespaceAgnostic: true } }) - ); + const serializer = new SavedObjectsSerializer(typeRegistry); const actual = serializer.rawToSavedObject({ _id: 'baz:foo:bar', _source: { @@ -430,7 +435,7 @@ describe('saved object conversion', () => { describe('#savedObjectToRaw', () => { test('it copies the type property to _source.type and uses the ROOT_TYPE as _type', () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); const actual = serializer.savedObjectToRaw({ type: 'foo', attributes: {}, @@ -440,7 +445,7 @@ describe('saved object conversion', () => { }); test('it copies the references property to _source.references', () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); const actual = serializer.savedObjectToRaw({ id: '1', type: 'foo', @@ -457,7 +462,7 @@ describe('saved object conversion', () => { }); test('if specified it copies the updated_at property to _source.updated_at', () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); const now = new Date(); const actual = serializer.savedObjectToRaw({ type: '', @@ -469,7 +474,7 @@ describe('saved object conversion', () => { }); test(`if unspecified it doesn't add updated_at property to _source`, () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); const actual = serializer.savedObjectToRaw({ type: '', attributes: {}, @@ -479,7 +484,7 @@ describe('saved object conversion', () => { }); test('it copies the migrationVersion property to _source.migrationVersion', () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); const actual = serializer.savedObjectToRaw({ type: '', attributes: {}, @@ -496,7 +501,7 @@ describe('saved object conversion', () => { }); test(`if unspecified it doesn't add migrationVersion property to _source`, () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); const actual = serializer.savedObjectToRaw({ type: '', attributes: {}, @@ -506,7 +511,7 @@ describe('saved object conversion', () => { }); test('it decodes the version property to _seq_no and _primary_term', () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); const actual = serializer.savedObjectToRaw({ type: '', attributes: {}, @@ -518,7 +523,7 @@ describe('saved object conversion', () => { }); test(`if unspecified it doesn't add _seq_no or _primary_term properties`, () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); const actual = serializer.savedObjectToRaw({ type: '', attributes: {}, @@ -529,7 +534,7 @@ describe('saved object conversion', () => { }); test(`if version invalid it throws`, () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); expect(() => serializer.savedObjectToRaw({ type: '', @@ -540,7 +545,7 @@ describe('saved object conversion', () => { }); test('it copies attributes to _source[type]', () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); const actual = serializer.savedObjectToRaw({ type: 'foo', attributes: { @@ -557,7 +562,7 @@ describe('saved object conversion', () => { describe('namespaced type without a namespace', () => { test('generates an id prefixed with type, if no id is specified', () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); const v1 = serializer.savedObjectToRaw({ type: 'foo', attributes: { @@ -577,7 +582,7 @@ describe('saved object conversion', () => { }); test(`doesn't specify _source.namespace`, () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); const actual = serializer.savedObjectToRaw({ type: '', attributes: {}, @@ -589,7 +594,7 @@ describe('saved object conversion', () => { describe('namespaced type with a namespace', () => { test('generates an id prefixed with namespace and type, if no id is specified', () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); const v1 = serializer.savedObjectToRaw({ type: 'foo', namespace: 'bar', @@ -611,7 +616,7 @@ describe('saved object conversion', () => { }); test(`it copies namespace to _source.namespace`, () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); const actual = serializer.savedObjectToRaw({ type: 'foo', attributes: {}, @@ -623,10 +628,12 @@ describe('saved object conversion', () => { }); describe('namespace agnostic type with a namespace', () => { + beforeEach(() => { + typeRegistry.isNamespaceAgnostic.mockReturnValue(true); + }); + test('generates an id prefixed with type, if no id is specified', () => { - const serializer = new SavedObjectsSerializer( - new SavedObjectsSchema({ foo: { isNamespaceAgnostic: true } }) - ); + const serializer = new SavedObjectsSerializer(typeRegistry); const v1 = serializer.savedObjectToRaw({ type: 'foo', namespace: 'bar', @@ -648,9 +655,7 @@ describe('saved object conversion', () => { }); test(`doesn't specify _source.namespace`, () => { - const serializer = new SavedObjectsSerializer( - new SavedObjectsSchema({ foo: { isNamespaceAgnostic: true } }) - ); + const serializer = new SavedObjectsSerializer(typeRegistry); const actual = serializer.savedObjectToRaw({ type: 'foo', namespace: 'bar', @@ -665,7 +670,7 @@ describe('saved object conversion', () => { describe('#isRawSavedObject', () => { describe('namespaced type without a namespace', () => { test('is true if the id is prefixed and the type matches', () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); expect( serializer.isRawSavedObject({ _id: 'hello:world', @@ -678,7 +683,7 @@ describe('saved object conversion', () => { }); test('is false if the id is not prefixed', () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); expect( serializer.isRawSavedObject({ _id: 'world', @@ -691,19 +696,19 @@ describe('saved object conversion', () => { }); test('is false if the type attribute is missing', () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); expect( serializer.isRawSavedObject({ _id: 'hello:world', _source: { hello: {}, - }, + } as any, }) ).toBeFalsy(); }); test(`is false if the type prefix omits the :`, () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); expect( serializer.isRawSavedObject({ _id: 'helloworld', @@ -716,7 +721,7 @@ describe('saved object conversion', () => { }); test('is false if the type attribute does not match the id', () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); expect( serializer.isRawSavedObject({ _id: 'hello:world', @@ -730,7 +735,7 @@ describe('saved object conversion', () => { }); test('is false if there is no [type] attribute', () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); expect( serializer.isRawSavedObject({ _id: 'hello:world', @@ -745,7 +750,7 @@ describe('saved object conversion', () => { describe('namespaced type with a namespace', () => { test('is true if the id is prefixed with type and namespace and the type matches', () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); expect( serializer.isRawSavedObject({ _id: 'foo:hello:world', @@ -759,7 +764,7 @@ describe('saved object conversion', () => { }); test('is false if the id is not prefixed by anything', () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); expect( serializer.isRawSavedObject({ _id: 'world', @@ -773,7 +778,7 @@ describe('saved object conversion', () => { }); test('is false if the id is prefixed only with type and the type matches', () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); expect( serializer.isRawSavedObject({ _id: 'hello:world', @@ -787,7 +792,7 @@ describe('saved object conversion', () => { }); test('is false if the id is prefixed only with namespace and the namespace matches', () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); expect( serializer.isRawSavedObject({ _id: 'foo:world', @@ -801,7 +806,7 @@ describe('saved object conversion', () => { }); test(`is false if the id prefix omits the trailing :`, () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); expect( serializer.isRawSavedObject({ _id: 'foo:helloworld', @@ -815,20 +820,20 @@ describe('saved object conversion', () => { }); test('is false if the type attribute is missing', () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); expect( serializer.isRawSavedObject({ _id: 'foo:hello:world', _source: { hello: {}, namespace: 'foo', - }, + } as any, }) ).toBeFalsy(); }); test('is false if the type attribute does not match the id', () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); expect( serializer.isRawSavedObject({ _id: 'foo:hello:world', @@ -843,7 +848,7 @@ describe('saved object conversion', () => { }); test('is false if the namespace attribute does not match the id', () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); expect( serializer.isRawSavedObject({ _id: 'bar:jam:world', @@ -858,7 +863,7 @@ describe('saved object conversion', () => { }); test('is false if there is no [type] attribute', () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); expect( serializer.isRawSavedObject({ _id: 'hello:world', @@ -872,11 +877,13 @@ describe('saved object conversion', () => { }); }); - describe('namespace agonstic type with a namespace', () => { + describe('namespace agnostic type with a namespace', () => { + beforeEach(() => { + typeRegistry.isNamespaceAgnostic.mockReturnValue(true); + }); + test('is true if the id is prefixed with type and the type matches', () => { - const serializer = new SavedObjectsSerializer( - new SavedObjectsSchema({ hello: { isNamespaceAgnostic: true } }) - ); + const serializer = new SavedObjectsSerializer(typeRegistry); expect( serializer.isRawSavedObject({ _id: 'hello:world', @@ -890,9 +897,7 @@ describe('saved object conversion', () => { }); test('is false if the id is not prefixed', () => { - const serializer = new SavedObjectsSerializer( - new SavedObjectsSchema({ hello: { isNamespaceAgnostic: true } }) - ); + const serializer = new SavedObjectsSerializer(typeRegistry); expect( serializer.isRawSavedObject({ _id: 'world', @@ -906,9 +911,7 @@ describe('saved object conversion', () => { }); test('is false if the id is prefixed with type and namespace', () => { - const serializer = new SavedObjectsSerializer( - new SavedObjectsSchema({ hello: { isNamespaceAgnostic: true } }) - ); + const serializer = new SavedObjectsSerializer(typeRegistry); expect( serializer.isRawSavedObject({ _id: 'foo:hello:world', @@ -922,9 +925,7 @@ describe('saved object conversion', () => { }); test(`is false if the type prefix omits the :`, () => { - const serializer = new SavedObjectsSerializer( - new SavedObjectsSchema({ hello: { isNamespaceAgnostic: true } }) - ); + const serializer = new SavedObjectsSerializer(typeRegistry); expect( serializer.isRawSavedObject({ _id: 'helloworld', @@ -938,24 +939,20 @@ describe('saved object conversion', () => { }); test('is false if the type attribute is missing', () => { - const serializer = new SavedObjectsSerializer( - new SavedObjectsSchema({ hello: { isNamespaceAgnostic: true } }) - ); + const serializer = new SavedObjectsSerializer(typeRegistry); expect( serializer.isRawSavedObject({ _id: 'hello:world', _source: { hello: {}, namespace: 'foo', - }, + } as any, }) ).toBeFalsy(); }); test('is false if the type attribute does not match the id', () => { - const serializer = new SavedObjectsSerializer( - new SavedObjectsSchema({ hello: { isNamespaceAgnostic: true } }) - ); + const serializer = new SavedObjectsSerializer(typeRegistry); expect( serializer.isRawSavedObject({ _id: 'hello:world', @@ -970,9 +967,7 @@ describe('saved object conversion', () => { }); test('is false if there is no [type] attribute', () => { - const serializer = new SavedObjectsSerializer( - new SavedObjectsSchema({ hello: { isNamespaceAgnostic: true } }) - ); + const serializer = new SavedObjectsSerializer(typeRegistry); expect( serializer.isRawSavedObject({ _id: 'hello:world', @@ -990,13 +985,13 @@ describe('saved object conversion', () => { describe('#generateRawId', () => { describe('namespaced type without a namespace', () => { test('generates an id if none is specified', () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); const id = serializer.generateRawId('', 'goodbye'); expect(id).toMatch(/goodbye\:[\w-]+$/); }); test('uses the id that is specified', () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); const id = serializer.generateRawId('', 'hello', 'world'); expect(id).toMatch('hello:world'); }); @@ -1004,13 +999,13 @@ describe('saved object conversion', () => { describe('namespaced type with a namespace', () => { test('generates an id if none is specified and prefixes namespace', () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); const id = serializer.generateRawId('foo', 'goodbye'); expect(id).toMatch(/foo:goodbye\:[\w-]+$/); }); test('uses the id that is specified and prefixes the namespace', () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); const id = serializer.generateRawId('foo', 'hello', 'world'); expect(id).toMatch('foo:hello:world'); }); @@ -1018,15 +1013,15 @@ describe('saved object conversion', () => { describe('namespace agnostic type with a namespace', () => { test(`generates an id if none is specified and doesn't prefix namespace`, () => { - const serializer = new SavedObjectsSerializer( - new SavedObjectsSchema({ foo: { isNamespaceAgnostic: true } }) - ); + typeRegistry.isNamespaceAgnostic.mockReturnValue(true); + + const serializer = new SavedObjectsSerializer(typeRegistry); const id = serializer.generateRawId('foo', 'goodbye'); expect(id).toMatch(/goodbye\:[\w-]+$/); }); test(`uses the id that is specified and doesn't prefix the namespace`, () => { - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); + const serializer = new SavedObjectsSerializer(typeRegistry); const id = serializer.generateRawId('foo', 'hello', 'world'); expect(id).toMatch('hello:world'); }); diff --git a/src/core/server/saved_objects/serialization/serializer.ts b/src/core/server/saved_objects/serialization/serializer.ts new file mode 100644 index 0000000000000..99d6b0c6b59f9 --- /dev/null +++ b/src/core/server/saved_objects/serialization/serializer.ts @@ -0,0 +1,151 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* eslint-disable @typescript-eslint/camelcase */ + +import uuid from 'uuid'; +import { decodeVersion, encodeVersion } from '../version'; +import { ISavedObjectTypeRegistry } from '../saved_objects_type_registry'; +import { SavedObjectsRawDoc, SavedObjectSanitizedDoc } from './types'; + +/** + * A serializer that can be used to manually convert {@link SavedObjectsRawDoc | raw} or + * {@link SavedObjectSanitizedDoc | sanitized} documents to the other kind. + * + * @remarks Serializer instances should only be created and accessed by calling {@link SavedObjectsServiceStart.createSerializer} + * + * @public + */ +export class SavedObjectsSerializer { + private readonly registry: ISavedObjectTypeRegistry; + + /** + * @internal + */ + constructor(registry: ISavedObjectTypeRegistry) { + this.registry = registry; + } + /** + * Determines whether or not the raw document can be converted to a saved object. + * + * @param {SavedObjectsRawDoc} rawDoc - The raw ES document to be tested + */ + public isRawSavedObject(rawDoc: SavedObjectsRawDoc) { + const { type, namespace } = rawDoc._source; + const namespacePrefix = + namespace && !this.registry.isNamespaceAgnostic(type) ? `${namespace}:` : ''; + return Boolean( + type && + rawDoc._id.startsWith(`${namespacePrefix}${type}:`) && + rawDoc._source.hasOwnProperty(type) + ); + } + + /** + * Converts a document from the format that is stored in elasticsearch to the saved object client format. + * + * @param {SavedObjectsRawDoc} doc - The raw ES document to be converted to saved object format. + */ + public rawToSavedObject(doc: SavedObjectsRawDoc): SavedObjectSanitizedDoc { + const { _id, _source, _seq_no, _primary_term } = doc; + const { type, namespace } = _source; + + const version = + _seq_no != null || _primary_term != null + ? encodeVersion(_seq_no!, _primary_term!) + : undefined; + + return { + type, + id: this.trimIdPrefix(namespace, type, _id), + ...(namespace && !this.registry.isNamespaceAgnostic(type) && { namespace }), + attributes: _source[type], + references: _source.references || [], + ...(_source.migrationVersion && { migrationVersion: _source.migrationVersion }), + ...(_source.updated_at && { updated_at: _source.updated_at }), + ...(version && { version }), + }; + } + + /** + * Converts a document from the saved object client format to the format that is stored in elasticsearch. + * + * @param {SavedObjectSanitizedDoc} savedObj - The saved object to be converted to raw ES format. + */ + public savedObjectToRaw(savedObj: SavedObjectSanitizedDoc): SavedObjectsRawDoc { + const { + id, + type, + namespace, + attributes, + migrationVersion, + updated_at, + version, + references, + } = savedObj; + const source = { + [type]: attributes, + type, + references, + ...(namespace && !this.registry.isNamespaceAgnostic(type) && { namespace }), + ...(migrationVersion && { migrationVersion }), + ...(updated_at && { updated_at }), + }; + + return { + _id: this.generateRawId(namespace, type, id), + _source: source, + ...(version != null && decodeVersion(version)), + }; + } + + /** + * Given a saved object type and id, generates the compound id that is stored in the raw document. + * + * @param {string} namespace - The namespace of the saved object + * @param {string} type - The saved object type + * @param {string} id - The id of the saved object + */ + public generateRawId(namespace: string | undefined, type: string, id?: string) { + const namespacePrefix = + namespace && !this.registry.isNamespaceAgnostic(type) ? `${namespace}:` : ''; + return `${namespacePrefix}${type}:${id || uuid.v1()}`; + } + + private trimIdPrefix(namespace: string | undefined, type: string, id: string) { + assertNonEmptyString(id, 'document id'); + assertNonEmptyString(type, 'saved object type'); + + const namespacePrefix = + namespace && !this.registry.isNamespaceAgnostic(type) ? `${namespace}:` : ''; + const prefix = `${namespacePrefix}${type}:`; + + if (!id.startsWith(prefix)) { + return id; + } + + return id.slice(prefix.length); + } +} + +function assertNonEmptyString(value: string, name: string) { + if (!value || typeof value !== 'string') { + throw new TypeError(`Expected "${value}" to be a ${name}`); + } +} diff --git a/src/core/server/saved_objects/serialization/types.ts b/src/core/server/saved_objects/serialization/types.ts new file mode 100644 index 0000000000000..aaf6f45c244ec --- /dev/null +++ b/src/core/server/saved_objects/serialization/types.ts @@ -0,0 +1,79 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { SavedObjectsMigrationVersion, SavedObjectReference } from '../types'; + +/** + * A raw document as represented directly in the saved object index. + * + * @public + */ +export interface SavedObjectsRawDoc { + _id: string; + _source: SavedObjectsRawDocSource; + _type?: string; + _seq_no?: number; + _primary_term?: number; +} + +/** @public */ +export interface SavedObjectsRawDocSource { + type: string; + namespace?: string; + migrationVersion?: SavedObjectsMigrationVersion; + updated_at?: string; + references?: SavedObjectReference[]; + + [typeMapping: string]: any; +} + +/** + * A saved object type definition that allows for miscellaneous, unknown + * properties, as current discussions around security, ACLs, etc indicate + * that future props are likely to be added. Migrations support this + * scenario out of the box. + */ +interface SavedObjectDoc { + attributes: object; + id?: string; // NOTE: SavedObjectDoc is used for uncreated objects where `id` is optional + type: string; + namespace?: string; + migrationVersion?: SavedObjectsMigrationVersion; + version?: string; + updated_at?: string; + + [rootProp: string]: any; +} + +interface Referencable { + references: SavedObjectReference[]; +} + +/** + * We want to have two types, one that guarantees a "references" attribute + * will exist and one that allows it to be null. Since we're not migrating + * all the saved objects to have a "references" array, we need to support + * the scenarios where it may be missing (ex migrations). + * + * @public + */ +export type SavedObjectUnsanitizedDoc = SavedObjectDoc & Partial; + +/** @public */ +export type SavedObjectSanitizedDoc = SavedObjectDoc & Referencable; diff --git a/src/core/server/saved_objects/service/lib/repository.test.js b/src/core/server/saved_objects/service/lib/repository.test.js index 6171faa7a617c..2e5eeec04e0a8 100644 --- a/src/core/server/saved_objects/service/lib/repository.test.js +++ b/src/core/server/saved_objects/service/lib/repository.test.js @@ -21,10 +21,9 @@ import _ from 'lodash'; import { SavedObjectsRepository } from './repository'; import * as getSearchDslNS from './search_dsl/search_dsl'; import { SavedObjectsErrorHelpers } from './errors'; -import { SavedObjectsSchema } from '../../schema'; import { SavedObjectsSerializer } from '../../serialization'; -import { getRootPropertiesObjects } from '../../mappings/lib/get_root_properties_objects'; import { encodeHitVersion } from '../../version'; +import { SavedObjectTypeRegistry } from '../../saved_objects_type_registry'; jest.mock('./search_dsl/search_dsl', () => ({ getSearchDsl: jest.fn() })); @@ -35,6 +34,7 @@ describe('SavedObjectsRepository', () => { let callAdminCluster; let savedObjectsRepository; let migrator; + const mockTimestamp = '2017-08-14T15:49:14.886Z'; const mockTimestampFields = { updated_at: mockTimestamp }; const mockVersionProps = { _seq_no: 1, _primary_term: 1 }; @@ -240,12 +240,95 @@ describe('SavedObjectsRepository', () => { }, }; - const schema = new SavedObjectsSchema({ - globaltype: { isNamespaceAgnostic: true }, - foo: { isNamespaceAgnostic: true }, - bar: { isNamespaceAgnostic: true }, - baz: { indexPattern: 'beats' }, - hiddenType: { isNamespaceAgnostic: true, hidden: true }, + const typeRegistry = new SavedObjectTypeRegistry(); + typeRegistry.registerType({ + name: 'config', + hidden: false, + namespaceAgnostic: false, + mappings: { + properties: { + type: 'keyword', + }, + }, + }); + typeRegistry.registerType({ + name: 'index-pattern', + hidden: false, + namespaceAgnostic: false, + mappings: { + properties: { + someField: { + type: 'keyword', + }, + }, + }, + }); + typeRegistry.registerType({ + name: 'dashboard', + hidden: false, + namespaceAgnostic: false, + mappings: { + properties: { + otherField: { + type: 'keyword', + }, + }, + }, + }); + typeRegistry.registerType({ + name: 'globaltype', + hidden: false, + namespaceAgnostic: true, + mappings: { + properties: { + yetAnotherField: { + type: 'keyword', + }, + }, + }, + }); + typeRegistry.registerType({ + name: 'foo', + hidden: false, + namespaceAgnostic: true, + mappings: { + properties: { + type: 'keyword', + }, + }, + }); + typeRegistry.registerType({ + name: 'bar', + hidden: false, + namespaceAgnostic: true, + mappings: { + properties: { + type: 'keyword', + }, + }, + }); + typeRegistry.registerType({ + name: 'baz', + hidden: false, + namespaceAgnostic: false, + indexPattern: 'beats', + mappings: { + properties: { + type: 'keyword', + }, + }, + }); + typeRegistry.registerType({ + name: 'hiddenType', + hidden: true, + namespaceAgnostic: true, + mappings: { + properties: { + someField: { + type: 'keyword', + }, + }, + }, }); beforeEach(() => { @@ -255,16 +338,16 @@ describe('SavedObjectsRepository', () => { runMigrations: async () => ({ status: 'skipped' }), }; - const serializer = new SavedObjectsSerializer(schema); - const allTypes = Object.keys(getRootPropertiesObjects(mappings)); - const allowedTypes = [...new Set(allTypes.filter(type => !schema.isHiddenType(type)))]; + const serializer = new SavedObjectsSerializer(typeRegistry); + const allTypes = typeRegistry.getAllTypes().map(type => type.name); + const allowedTypes = [...new Set(allTypes.filter(type => !typeRegistry.isHidden(type)))]; savedObjectsRepository = new SavedObjectsRepository({ index: '.kibana-test', mappings, callCluster: callAdminCluster, migrator, - schema, + typeRegistry, serializer, allowedTypes, }); @@ -1171,7 +1254,7 @@ describe('SavedObjectsRepository', () => { expect(result).toEqual(deleteByQueryResults); expect(callAdminCluster).toHaveBeenCalledTimes(1); - expect(getSearchDslNS.getSearchDsl).toHaveBeenCalledWith(mappings, schema, { + expect(getSearchDslNS.getSearchDsl).toHaveBeenCalledWith(mappings, typeRegistry, { namespace: 'my-namespace', type: ['config', 'baz', 'index-pattern', 'dashboard'], }); @@ -1261,7 +1344,11 @@ describe('SavedObjectsRepository', () => { await savedObjectsRepository.find(relevantOpts); expect(getSearchDslNS.getSearchDsl).toHaveBeenCalledTimes(1); - expect(getSearchDslNS.getSearchDsl).toHaveBeenCalledWith(mappings, schema, relevantOpts); + expect(getSearchDslNS.getSearchDsl).toHaveBeenCalledWith( + mappings, + typeRegistry, + relevantOpts + ); }); it('accepts KQL filter and passes keuryNode to getSearchDsl', async () => { diff --git a/src/core/server/saved_objects/service/lib/repository.ts b/src/core/server/saved_objects/service/lib/repository.ts index 70b8b2878c15b..b485b8dfe398c 100644 --- a/src/core/server/saved_objects/service/lib/repository.ts +++ b/src/core/server/saved_objects/service/lib/repository.ts @@ -27,9 +27,12 @@ import { includedFields } from './included_fields'; import { decorateEsError } from './decorate_es_error'; import { SavedObjectsErrorHelpers } from './errors'; import { decodeRequestVersion, encodeVersion, encodeHitVersion } from '../../version'; -import { SavedObjectsSchema } from '../../schema'; import { KibanaMigrator } from '../../migrations'; -import { SavedObjectsSerializer, SanitizedSavedObjectDoc, RawDoc } from '../../serialization'; +import { + SavedObjectsSerializer, + SavedObjectSanitizedDoc, + SavedObjectsRawDoc, +} from '../../serialization'; import { SavedObjectsBulkCreateObject, SavedObjectsBulkGetObject, @@ -51,8 +54,8 @@ import { SavedObjectsMigrationVersion, MutatingOperationRefreshSetting, } from '../../types'; +import { SavedObjectTypeRegistry } from '../../saved_objects_type_registry'; import { validateConvertFilterToKueryNode } from './filter_utils'; -import { LegacyConfig } from '../../../legacy'; // BEWARE: The SavedObjectClient depends on the implementation details of the SavedObjectsRepository // so any breaking changes to this repository are considered breaking changes to the SavedObjectsClient. @@ -75,11 +78,9 @@ const isLeft = (either: Either): either is Left => { export interface SavedObjectsRepositoryOptions { index: string; - /** @deprecated Will be removed once SavedObjectsSchema is exposed from Core */ - config: LegacyConfig; mappings: IndexMapping; callCluster: APICaller; - schema: SavedObjectsSchema; + typeRegistry: SavedObjectTypeRegistry; serializer: SavedObjectsSerializer; migrator: KibanaMigrator; allowedTypes: string[]; @@ -118,9 +119,8 @@ export type ISavedObjectsRepository = Pick !schema.isHiddenType(type)); + const serializer = new SavedObjectsSerializer(typeRegistry); + const visibleTypes = allTypes.filter(type => !typeRegistry.isHidden(type)); const missingTypeMappings = extraTypes.filter(type => !allTypes.includes(type)); if (missingTypeMappings.length > 0) { @@ -158,10 +157,9 @@ export class SavedObjectsRepository { return new injectedConstructor({ index: indexName, - config, migrator, mappings, - schema, + typeRegistry, serializer, allowedTypes, callCluster: retryCallCluster(callCluster), @@ -171,10 +169,9 @@ export class SavedObjectsRepository { private constructor(options: SavedObjectsRepositoryOptions) { const { index, - config, mappings, callCluster, - schema, + typeRegistry, serializer, migrator, allowedTypes = [], @@ -189,9 +186,8 @@ export class SavedObjectsRepository { // to returning them. this._migrator = migrator; this._index = index; - this._config = config; this._mappings = mappings; - this._schema = schema; + this._registry = typeRegistry; if (allowedTypes.length === 0) { throw new Error('Empty or missing types for saved object repository!'); } @@ -201,7 +197,6 @@ export class SavedObjectsRepository { await migrator.runMigrations(); return callCluster(...args); }; - this._schema = schema; this._serializer = serializer; } @@ -250,7 +245,7 @@ export class SavedObjectsRepository { references, }); - const raw = this._serializer.savedObjectToRaw(migrated as SanitizedSavedObjectDoc); + const raw = this._serializer.savedObjectToRaw(migrated as SavedObjectSanitizedDoc); const response = await this._writeToCluster(method, { id: raw._id, @@ -316,7 +311,7 @@ export class SavedObjectsRepository { namespace, updated_at: time, references: object.references || [], - }) as SanitizedSavedObjectDoc + }) as SavedObjectSanitizedDoc ), }; @@ -435,7 +430,7 @@ export class SavedObjectsRepository { const allTypes = Object.keys(getRootPropertiesObjects(this._mappings)); - const typesToDelete = allTypes.filter(type => !this._schema.isNamespaceAgnostic(type)); + const typesToDelete = allTypes.filter(type => !this._registry.isNamespaceAgnostic(type)); const esOptions = { index: this.getIndicesForTypes(typesToDelete), @@ -443,7 +438,7 @@ export class SavedObjectsRepository { refresh, body: { conflicts: 'proceed', - ...getSearchDsl(this._mappings, this._schema, { + ...getSearchDsl(this._mappings, this._registry, { namespace, type: typesToDelete, }), @@ -531,7 +526,7 @@ export class SavedObjectsRepository { rest_total_hits_as_int: true, body: { seq_no_primary_term: true, - ...getSearchDsl(this._mappings, this._schema, { + ...getSearchDsl(this._mappings, this._registry, { search, defaultSearchOperator, searchFields, @@ -562,7 +557,9 @@ export class SavedObjectsRepository { page, per_page: perPage, total: response.hits.total, - saved_objects: response.hits.hits.map((hit: RawDoc) => this._rawToSavedObject(hit)), + saved_objects: response.hits.hits.map((hit: SavedObjectsRawDoc) => + this._rawToSavedObject(hit) + ), }; } @@ -890,7 +887,7 @@ export class SavedObjectsRepository { updated_at: time, }); - const raw = this._serializer.savedObjectToRaw(migrated as SanitizedSavedObjectDoc); + const raw = this._serializer.savedObjectToRaw(migrated as SavedObjectSanitizedDoc); const response = await this._writeToCluster('update', { id: this._serializer.generateRawId(namespace, type, id), @@ -952,7 +949,7 @@ export class SavedObjectsRepository { * @param type - the type */ private getIndexForType(type: string) { - return this._schema.getIndexForType(this._config, type) || this._index; + return this._registry.getIndex(type) || this._index; } /** @@ -964,7 +961,7 @@ export class SavedObjectsRepository { */ private getIndicesForTypes(types: string[]) { const unique = (array: string[]) => [...new Set(array)]; - return unique(types.map(t => this._schema.getIndexForType(this._config, t) || this._index)); + return unique(types.map(t => this.getIndexForType(t))); } private _getCurrentTime() { @@ -975,7 +972,7 @@ export class SavedObjectsRepository { // includes the namespace, and we use this for migrating documents. However, we don't // want the namespace to be returned from the repository, as the repository scopes each // method transparently to the specified namespace. - private _rawToSavedObject(raw: RawDoc): SavedObject { + private _rawToSavedObject(raw: SavedObjectsRawDoc): SavedObject { const savedObject = this._serializer.rawToSavedObject(raw); return omit(savedObject, 'namespace'); } diff --git a/src/core/server/saved_objects/service/lib/repository_create_repository.test.ts b/src/core/server/saved_objects/service/lib/repository_create_repository.test.ts index b3ea056484760..4a87bb1043ca2 100644 --- a/src/core/server/saved_objects/service/lib/repository_create_repository.test.ts +++ b/src/core/server/saved_objects/service/lib/repository_create_repository.test.ts @@ -18,43 +18,54 @@ */ import { SavedObjectsRepository } from './repository'; import { mockKibanaMigrator } from '../../migrations/kibana/kibana_migrator.mock'; -import { SavedObjectsSchema } from '../../schema'; import { KibanaMigrator } from '../../migrations'; -import { LegacyConfig } from '../../../legacy'; +import { SavedObjectTypeRegistry } from '../../saved_objects_type_registry'; + jest.mock('./repository'); const { SavedObjectsRepository: originalRepository } = jest.requireActual('./repository'); describe('SavedObjectsRepository#createRepository', () => { const callAdminCluster = jest.fn(); - const schema = new SavedObjectsSchema({ - nsAgnosticType: { isNamespaceAgnostic: true }, - nsType: { indexPattern: 'beats', isNamespaceAgnostic: false }, - hiddenType: { isNamespaceAgnostic: true, hidden: true }, + + const typeRegistry = new SavedObjectTypeRegistry(); + typeRegistry.registerType({ + name: 'nsAgnosticType', + hidden: false, + namespaceAgnostic: true, + mappings: { + properties: { + name: { type: 'keyword' }, + }, + }, + migrations: {}, + }); + + typeRegistry.registerType({ + name: 'nsType', + hidden: false, + namespaceAgnostic: false, + indexPattern: 'beats', + mappings: { + properties: { + name: { type: 'keyword' }, + }, + }, + migrations: {}, }); - const mappings = [ - { - pluginId: 'testplugin', + typeRegistry.registerType({ + name: 'hiddenType', + hidden: true, + namespaceAgnostic: true, + mappings: { properties: { - nsAgnosticType: { - properties: { - name: { type: 'keyword' }, - }, - }, - nsType: { - properties: { - name: { type: 'keyword' }, - }, - }, - hiddenType: { - properties: { - name: { type: 'keyword' }, - }, - }, + name: { type: 'keyword' }, }, }, - ]; - const migrator = mockKibanaMigrator.create({ savedObjectMappings: mappings }); + migrations: {}, + }); + + const migrator = mockKibanaMigrator.create({ types: typeRegistry.getAllTypes() }); const RepositoryConstructor = (SavedObjectsRepository as unknown) as jest.Mock< SavedObjectsRepository >; @@ -67,8 +78,7 @@ describe('SavedObjectsRepository#createRepository', () => { try { originalRepository.createRepository( (migrator as unknown) as KibanaMigrator, - schema, - {} as LegacyConfig, + typeRegistry, '.kibana-test', callAdminCluster, ['unMappedType1', 'unmappedType2'] @@ -83,8 +93,7 @@ describe('SavedObjectsRepository#createRepository', () => { it('should create a repository without hidden types', () => { const repository = originalRepository.createRepository( (migrator as unknown) as KibanaMigrator, - schema, - {} as LegacyConfig, + typeRegistry, '.kibana-test', callAdminCluster, [], @@ -103,8 +112,7 @@ describe('SavedObjectsRepository#createRepository', () => { it('should create a repository with a unique list of hidden types', () => { const repository = originalRepository.createRepository( (migrator as unknown) as KibanaMigrator, - schema, - {} as LegacyConfig, + typeRegistry, '.kibana-test', callAdminCluster, ['hiddenType', 'hiddenType', 'hiddenType'], diff --git a/src/core/server/saved_objects/service/lib/search_dsl/query_params.test.ts b/src/core/server/saved_objects/service/lib/search_dsl/query_params.test.ts index e585953109d2c..b2129765ee426 100644 --- a/src/core/server/saved_objects/service/lib/search_dsl/query_params.test.ts +++ b/src/core/server/saved_objects/service/lib/search_dsl/query_params.test.ts @@ -17,10 +17,11 @@ * under the License. */ -import { schemaMock } from '../../../schema/schema.mock'; +import { typeRegistryMock } from '../../../saved_objects_type_registry.mock'; import { getQueryParams } from './query_params'; -const SCHEMA = schemaMock.create(); +const registry = typeRegistryMock.create(); + const MAPPINGS = { properties: { type: { @@ -85,7 +86,7 @@ const createTypeClause = (type: string, namespace?: string) => { describe('searchDsl/queryParams', () => { describe('no parameters', () => { it('searches for all known types without a namespace specified', () => { - expect(getQueryParams({ mappings: MAPPINGS, schema: SCHEMA })).toEqual({ + expect(getQueryParams({ mappings: MAPPINGS, registry })).toEqual({ query: { bool: { filter: [ @@ -108,9 +109,7 @@ describe('searchDsl/queryParams', () => { describe('namespace', () => { it('filters namespaced types for namespace, and ensures namespace agnostic types have no namespace', () => { - expect( - getQueryParams({ mappings: MAPPINGS, schema: SCHEMA, namespace: 'foo-namespace' }) - ).toEqual({ + expect(getQueryParams({ mappings: MAPPINGS, registry, namespace: 'foo-namespace' })).toEqual({ query: { bool: { filter: [ @@ -134,7 +133,7 @@ describe('searchDsl/queryParams', () => { describe('type (singular, namespaced)', () => { it('includes a terms filter for type and namespace not being specified', () => { expect( - getQueryParams({ mappings: MAPPINGS, schema: SCHEMA, namespace: undefined, type: 'saved' }) + getQueryParams({ mappings: MAPPINGS, registry, namespace: undefined, type: 'saved' }) ).toEqual({ query: { bool: { @@ -155,7 +154,7 @@ describe('searchDsl/queryParams', () => { describe('type (singular, global)', () => { it('includes a terms filter for type and namespace not being specified', () => { expect( - getQueryParams({ mappings: MAPPINGS, schema: SCHEMA, namespace: undefined, type: 'global' }) + getQueryParams({ mappings: MAPPINGS, registry, namespace: undefined, type: 'global' }) ).toEqual({ query: { bool: { @@ -178,7 +177,7 @@ describe('searchDsl/queryParams', () => { expect( getQueryParams({ mappings: MAPPINGS, - schema: SCHEMA, + registry, namespace: undefined, type: ['saved', 'global'], }) @@ -204,7 +203,7 @@ describe('searchDsl/queryParams', () => { expect( getQueryParams({ mappings: MAPPINGS, - schema: SCHEMA, + registry, namespace: 'foo-namespace', type: ['saved', 'global'], }) @@ -230,7 +229,7 @@ describe('searchDsl/queryParams', () => { expect( getQueryParams({ mappings: MAPPINGS, - schema: SCHEMA, + registry, namespace: undefined, type: undefined, search: 'us*', @@ -270,7 +269,7 @@ describe('searchDsl/queryParams', () => { expect( getQueryParams({ mappings: MAPPINGS, - schema: SCHEMA, + registry, namespace: 'foo-namespace', type: undefined, search: 'us*', @@ -310,7 +309,7 @@ describe('searchDsl/queryParams', () => { expect( getQueryParams({ mappings: MAPPINGS, - schema: SCHEMA, + registry, namespace: undefined, type: ['saved', 'global'], search: 'us*', @@ -346,7 +345,7 @@ describe('searchDsl/queryParams', () => { expect( getQueryParams({ mappings: MAPPINGS, - schema: SCHEMA, + registry, namespace: 'foo-namespace', type: ['saved', 'global'], search: 'us*', @@ -382,7 +381,7 @@ describe('searchDsl/queryParams', () => { expect( getQueryParams({ mappings: MAPPINGS, - schema: SCHEMA, + registry, namespace: undefined, type: undefined, search: 'y*', @@ -419,7 +418,7 @@ describe('searchDsl/queryParams', () => { expect( getQueryParams({ mappings: MAPPINGS, - schema: SCHEMA, + registry, namespace: undefined, type: undefined, search: 'y*', @@ -456,7 +455,7 @@ describe('searchDsl/queryParams', () => { expect( getQueryParams({ mappings: MAPPINGS, - schema: SCHEMA, + registry, namespace: undefined, type: undefined, search: 'y*', @@ -503,7 +502,7 @@ describe('searchDsl/queryParams', () => { expect( getQueryParams({ mappings: MAPPINGS, - schema: SCHEMA, + registry, namespace: 'foo-namespace', type: undefined, search: 'y*', @@ -540,7 +539,7 @@ describe('searchDsl/queryParams', () => { expect( getQueryParams({ mappings: MAPPINGS, - schema: SCHEMA, + registry, namespace: 'foo-namespace', type: undefined, search: 'y*', @@ -577,7 +576,7 @@ describe('searchDsl/queryParams', () => { expect( getQueryParams({ mappings: MAPPINGS, - schema: SCHEMA, + registry, namespace: 'foo-namespace', type: undefined, search: 'y*', @@ -624,7 +623,7 @@ describe('searchDsl/queryParams', () => { expect( getQueryParams({ mappings: MAPPINGS, - schema: SCHEMA, + registry, namespace: undefined, type: ['saved', 'global'], search: 'y*', @@ -657,7 +656,7 @@ describe('searchDsl/queryParams', () => { expect( getQueryParams({ mappings: MAPPINGS, - schema: SCHEMA, + registry, namespace: undefined, type: ['saved', 'global'], search: 'y*', @@ -690,7 +689,7 @@ describe('searchDsl/queryParams', () => { expect( getQueryParams({ mappings: MAPPINGS, - schema: SCHEMA, + registry, namespace: undefined, type: ['saved', 'global'], search: 'y*', @@ -726,7 +725,7 @@ describe('searchDsl/queryParams', () => { expect( getQueryParams({ mappings: MAPPINGS, - schema: SCHEMA, + registry, namespace: 'foo-namespace', type: ['saved', 'global'], search: 'y*', @@ -759,7 +758,7 @@ describe('searchDsl/queryParams', () => { expect( getQueryParams({ mappings: MAPPINGS, - schema: SCHEMA, + registry, namespace: 'foo-namespace', type: ['saved', 'global'], search: 'y*', @@ -792,7 +791,7 @@ describe('searchDsl/queryParams', () => { expect( getQueryParams({ mappings: MAPPINGS, - schema: SCHEMA, + registry, namespace: 'foo-namespace', type: ['saved', 'global'], search: 'y*', @@ -828,7 +827,7 @@ describe('searchDsl/queryParams', () => { expect( getQueryParams({ mappings: MAPPINGS, - schema: SCHEMA, + registry, namespace: 'foo-namespace', type: ['saved', 'global'], search: 'foo', @@ -902,7 +901,7 @@ describe('searchDsl/queryParams', () => { expect( getQueryParams({ mappings: MAPPINGS, - schema: SCHEMA, + registry, namespace: 'foo-namespace', type: ['saved', 'global'], search: undefined, @@ -958,7 +957,7 @@ describe('searchDsl/queryParams', () => { expect( getQueryParams({ mappings: MAPPINGS, - schema: SCHEMA, + registry, namespace: 'foo-namespace', kueryNode: { type: 'function', @@ -1052,7 +1051,7 @@ describe('searchDsl/queryParams', () => { expect( getQueryParams({ mappings: MAPPINGS, - schema: SCHEMA, + registry, namespace: 'foo-namespace', kueryNode: { type: 'function', @@ -1189,7 +1188,7 @@ describe('searchDsl/queryParams', () => { expect( getQueryParams({ mappings: MAPPINGS, - schema: SCHEMA, + registry, namespace: 'foo-namespace', search: 'y*', searchFields: ['title'], diff --git a/src/core/server/saved_objects/service/lib/search_dsl/query_params.ts b/src/core/server/saved_objects/service/lib/search_dsl/query_params.ts index a1e3ae9620299..3fabad6af08ff 100644 --- a/src/core/server/saved_objects/service/lib/search_dsl/query_params.ts +++ b/src/core/server/saved_objects/service/lib/search_dsl/query_params.ts @@ -20,7 +20,7 @@ import { esKuery } from '../../../../../../plugins/data/server'; import { getRootPropertiesObjects, IndexMapping } from '../../../mappings'; -import { SavedObjectsSchema } from '../../../schema'; +import { ISavedObjectTypeRegistry } from '../../../saved_objects_type_registry'; /** * Gets the types based on the type. Uses mappings to support @@ -61,8 +61,12 @@ function getFieldsForTypes(types: string[], searchFields?: string[]) { * Gets the clause that will filter for the type in the namespace. * Some types are namespace agnostic, so they must be treated differently. */ -function getClauseForType(schema: SavedObjectsSchema, namespace: string | undefined, type: string) { - if (namespace && !schema.isNamespaceAgnostic(type)) { +function getClauseForType( + registry: ISavedObjectTypeRegistry, + namespace: string | undefined, + type: string +) { + if (namespace && !registry.isNamespaceAgnostic(type)) { return { bool: { must: [{ term: { type } }, { term: { namespace } }], @@ -85,7 +89,7 @@ interface HasReferenceQueryParams { interface QueryParams { mappings: IndexMapping; - schema: SavedObjectsSchema; + registry: ISavedObjectTypeRegistry; namespace?: string; type?: string | string[]; search?: string; @@ -100,7 +104,7 @@ interface QueryParams { */ export function getQueryParams({ mappings, - schema, + registry, namespace, type, search, @@ -140,7 +144,7 @@ export function getQueryParams({ }, ] : undefined, - should: types.map(shouldType => getClauseForType(schema, namespace, shouldType)), + should: types.map(shouldType => getClauseForType(registry, namespace, shouldType)), minimum_should_match: 1, }, }, diff --git a/src/core/server/saved_objects/service/lib/search_dsl/search_dsl.test.ts b/src/core/server/saved_objects/service/lib/search_dsl/search_dsl.test.ts index 97cab3e566d5e..95b7ffd117ee9 100644 --- a/src/core/server/saved_objects/service/lib/search_dsl/search_dsl.test.ts +++ b/src/core/server/saved_objects/service/lib/search_dsl/search_dsl.test.ts @@ -20,7 +20,7 @@ jest.mock('./query_params'); jest.mock('./sorting_params'); -import { schemaMock } from '../../../schema/schema.mock'; +import { typeRegistryMock } from '../../../saved_objects_type_registry.mock'; import * as queryParamsNS from './query_params'; import { getSearchDsl } from './search_dsl'; import * as sortParamsNS from './sorting_params'; @@ -28,8 +28,8 @@ import * as sortParamsNS from './sorting_params'; const getQueryParams = queryParamsNS.getQueryParams as jest.Mock; const getSortingParams = sortParamsNS.getSortingParams as jest.Mock; -const SCHEMA = schemaMock.create(); -const MAPPINGS = { properties: {} }; +const registry = typeRegistryMock.create(); +const mappings = { properties: {} }; describe('getSearchDsl', () => { afterEach(() => { @@ -40,7 +40,7 @@ describe('getSearchDsl', () => { describe('validation', () => { it('throws when type is not specified', () => { expect(() => { - getSearchDsl(MAPPINGS, SCHEMA, { + getSearchDsl(mappings, registry, { type: undefined as any, sortField: 'title', }); @@ -48,7 +48,7 @@ describe('getSearchDsl', () => { }); it('throws when sortOrder without sortField', () => { expect(() => { - getSearchDsl(MAPPINGS, SCHEMA, { + getSearchDsl(mappings, registry, { type: 'foo', sortOrder: 'desc', }); @@ -70,11 +70,11 @@ describe('getSearchDsl', () => { }, }; - getSearchDsl(MAPPINGS, SCHEMA, opts); + getSearchDsl(mappings, registry, opts); expect(getQueryParams).toHaveBeenCalledTimes(1); expect(getQueryParams).toHaveBeenCalledWith({ - mappings: MAPPINGS, - schema: SCHEMA, + mappings, + registry, namespace: opts.namespace, type: opts.type, search: opts.search, @@ -92,10 +92,10 @@ describe('getSearchDsl', () => { sortOrder: 'baz', }; - getSearchDsl(MAPPINGS, SCHEMA, opts); + getSearchDsl(mappings, registry, opts); expect(getSortingParams).toHaveBeenCalledTimes(1); expect(getSortingParams).toHaveBeenCalledWith( - MAPPINGS, + mappings, opts.type, opts.sortField, opts.sortOrder @@ -105,7 +105,7 @@ describe('getSearchDsl', () => { it('returns combination of getQueryParams and getSortingParams', () => { getQueryParams.mockReturnValue({ a: 'a' }); getSortingParams.mockReturnValue({ b: 'b' }); - expect(getSearchDsl(MAPPINGS, SCHEMA, { type: 'foo' })).toEqual({ a: 'a', b: 'b' }); + expect(getSearchDsl(mappings, registry, { type: 'foo' })).toEqual({ a: 'a', b: 'b' }); }); }); }); diff --git a/src/core/server/saved_objects/service/lib/search_dsl/search_dsl.ts b/src/core/server/saved_objects/service/lib/search_dsl/search_dsl.ts index 1b6e1361bb92a..75ab058a38be9 100644 --- a/src/core/server/saved_objects/service/lib/search_dsl/search_dsl.ts +++ b/src/core/server/saved_objects/service/lib/search_dsl/search_dsl.ts @@ -20,11 +20,11 @@ import Boom from 'boom'; import { IndexMapping } from '../../../mappings'; -import { SavedObjectsSchema } from '../../../schema'; import { getQueryParams } from './query_params'; import { getSortingParams } from './sorting_params'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { esKuery } from '../../../../../../plugins/data/server'; +import { ISavedObjectTypeRegistry } from '../../../saved_objects_type_registry'; interface GetSearchDslOptions { type: string | string[]; @@ -43,7 +43,7 @@ interface GetSearchDslOptions { export function getSearchDsl( mappings: IndexMapping, - schema: SavedObjectsSchema, + registry: ISavedObjectTypeRegistry, options: GetSearchDslOptions ) { const { @@ -69,7 +69,7 @@ export function getSearchDsl( return { ...getQueryParams({ mappings, - schema, + registry, namespace, type, search, diff --git a/src/core/server/saved_objects/types.ts b/src/core/server/saved_objects/types.ts index a3fe2b937635b..980ba005e0eeb 100644 --- a/src/core/server/saved_objects/types.ts +++ b/src/core/server/saved_objects/types.ts @@ -18,9 +18,8 @@ */ import { SavedObjectsClient } from './service/saved_objects_client'; -import { SavedObjectsMapping } from './mappings'; -import { MigrationDefinition } from './migrations/core/document_migrator'; -import { SavedObjectsSchemaDefinition } from './schema'; +import { SavedObjectsTypeMappingDefinition, SavedObjectsTypeMappingDefinitions } from './mappings'; +import { SavedObjectMigrationMap } from './migrations'; import { PropertyValidators } from './validation'; export { @@ -34,6 +33,7 @@ export { } from './import/types'; import { SavedObjectAttributes } from '../../types'; +import { LegacyConfig } from '../legacy'; export { SavedObjectAttributes, SavedObjectAttribute, @@ -208,13 +208,88 @@ export type MutatingOperationRefreshSetting = boolean | 'wait_for'; */ export type SavedObjectsClientContract = Pick; +/** + * @remarks This is only internal for now, and will only be public when we expose the registerType API + * + * @public + */ +export interface SavedObjectsType { + /** + * The name of the type, which is also used as the internal id. + */ + name: string; + /** + * Is the type hidden by default. If true, repositories will not have access to this type unless explicitly + * declared as an `extraType` when creating the repository. + * + * See {@link SavedObjectsServiceStart.createInternalRepository | createInternalRepository}. + */ + hidden: boolean; + /** + * Is the type global (true), or namespaced (false). + */ + namespaceAgnostic: boolean; + /** + * If defined, the type instances will be stored in the given index instead of the default one. + */ + indexPattern?: string; + /** + * If defined, will be used to convert the type to an alias. + */ + convertToAliasScript?: string; + /** + * The {@link SavedObjectsTypeMappingDefinition | mapping definition} for the type. + */ + mappings: SavedObjectsTypeMappingDefinition; + /** + * An optional map of {@link SavedObjectMigrationFn | migrations} to be used to migrate the type. + */ + migrations?: SavedObjectMigrationMap; +} + /** * @internal * @deprecated */ export interface SavedObjectsLegacyUiExports { - savedObjectMappings: SavedObjectsMapping[]; - savedObjectMigrations: MigrationDefinition; - savedObjectSchemas: SavedObjectsSchemaDefinition; + savedObjectMappings: SavedObjectsLegacyMapping[]; + savedObjectMigrations: SavedObjectsLegacyMigrationDefinitions; + savedObjectSchemas: SavedObjectsLegacySchemaDefinitions; savedObjectValidations: PropertyValidators; } + +/** + * @internal + * @deprecated + */ +export interface SavedObjectsLegacyMapping { + pluginId: string; + properties: SavedObjectsTypeMappingDefinitions; +} + +/** + * @internal + * @deprecated + */ +export interface SavedObjectsLegacyMigrationDefinitions { + [type: string]: SavedObjectMigrationMap; +} + +/** + * @internal + * @deprecated + */ +interface SavedObjectsLegacyTypeSchema { + isNamespaceAgnostic?: boolean; + hidden?: boolean; + indexPattern?: ((config: LegacyConfig) => string) | string; + convertToAliasScript?: string; +} + +/** + * @internal + * @deprecated + */ +export interface SavedObjectsLegacySchemaDefinitions { + [type: string]: SavedObjectsLegacyTypeSchema; +} diff --git a/src/core/server/saved_objects/utils.test.ts b/src/core/server/saved_objects/utils.test.ts new file mode 100644 index 0000000000000..d1c15517e94a6 --- /dev/null +++ b/src/core/server/saved_objects/utils.test.ts @@ -0,0 +1,285 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { legacyServiceMock } from '../legacy/legacy_service.mock'; +import { convertLegacyTypes, convertTypesToLegacySchema } from './utils'; +import { SavedObjectsLegacyUiExports, SavedObjectsType } from './types'; +import { LegacyConfig } from 'kibana/server'; + +describe('convertLegacyTypes', () => { + let legacyConfig: ReturnType; + + beforeEach(() => { + legacyConfig = legacyServiceMock.createLegacyConfig(); + }); + + it('converts the legacy mappings using default values if no schemas are specified', () => { + const uiExports: SavedObjectsLegacyUiExports = { + savedObjectMappings: [ + { + pluginId: 'pluginA', + properties: { + typeA: { + properties: { + fieldA: { type: 'text' }, + }, + }, + typeB: { + properties: { + fieldB: { type: 'text' }, + }, + }, + }, + }, + { + pluginId: 'pluginB', + properties: { + typeC: { + properties: { + fieldC: { type: 'text' }, + }, + }, + }, + }, + ], + savedObjectMigrations: {}, + savedObjectSchemas: {}, + savedObjectValidations: {}, + }; + + const converted = convertLegacyTypes(uiExports, legacyConfig); + expect(converted).toMatchSnapshot(); + }); + + it('merges the mappings and the schema to create the type when schema exists for the type', () => { + const uiExports: SavedObjectsLegacyUiExports = { + savedObjectMappings: [ + { + pluginId: 'pluginA', + properties: { + typeA: { + properties: { + fieldA: { type: 'text' }, + }, + }, + }, + }, + { + pluginId: 'pluginB', + properties: { + typeC: { + properties: { + fieldC: { type: 'text' }, + }, + }, + }, + }, + ], + savedObjectMigrations: {}, + savedObjectSchemas: { + typeA: { + indexPattern: 'fooBar', + hidden: true, + isNamespaceAgnostic: true, + }, + }, + savedObjectValidations: {}, + }; + + const converted = convertLegacyTypes(uiExports, legacyConfig); + expect(converted).toMatchSnapshot(); + }); + + it('invokes indexPattern to retrieve the index when it is a function', () => { + const indexPatternAccessor: (config: LegacyConfig) => string = jest.fn(config => { + config.get('foo.bar'); + return 'myIndex'; + }); + + const uiExports: SavedObjectsLegacyUiExports = { + savedObjectMappings: [ + { + pluginId: 'pluginA', + properties: { + typeA: { + properties: { + fieldA: { type: 'text' }, + }, + }, + }, + }, + ], + savedObjectMigrations: {}, + savedObjectSchemas: { + typeA: { + indexPattern: indexPatternAccessor, + hidden: true, + isNamespaceAgnostic: true, + }, + }, + savedObjectValidations: {}, + }; + + const converted = convertLegacyTypes(uiExports, legacyConfig); + + expect(indexPatternAccessor).toHaveBeenCalledWith(legacyConfig); + expect(legacyConfig.get).toHaveBeenCalledWith('foo.bar'); + expect(converted.length).toEqual(1); + expect(converted[0].indexPattern).toEqual('myIndex'); + }); + + it('import migrations from the uiExports', () => { + const migrationsA = { + '1.0.0': jest.fn(), + '2.0.4': jest.fn(), + }; + const migrationsB = { + '1.5.3': jest.fn(), + }; + + const uiExports: SavedObjectsLegacyUiExports = { + savedObjectMappings: [ + { + pluginId: 'pluginA', + properties: { + typeA: { + properties: { + fieldA: { type: 'text' }, + }, + }, + }, + }, + { + pluginId: 'pluginB', + properties: { + typeB: { + properties: { + fieldC: { type: 'text' }, + }, + }, + }, + }, + ], + savedObjectMigrations: { + typeA: migrationsA, + typeB: migrationsB, + }, + savedObjectSchemas: {}, + savedObjectValidations: {}, + }; + + const converted = convertLegacyTypes(uiExports, legacyConfig); + expect(converted.length).toEqual(2); + expect(converted[0].migrations).toEqual(migrationsA); + expect(converted[1].migrations).toEqual(migrationsB); + }); + + it('merges everything when all are present', () => { + const uiExports: SavedObjectsLegacyUiExports = { + savedObjectMappings: [ + { + pluginId: 'pluginA', + properties: { + typeA: { + properties: { + fieldA: { type: 'text' }, + }, + }, + typeB: { + properties: { + fieldB: { type: 'text' }, + anotherFieldB: { type: 'boolean' }, + }, + }, + }, + }, + { + pluginId: 'pluginB', + properties: { + typeC: { + properties: { + fieldC: { type: 'text' }, + }, + }, + }, + }, + ], + savedObjectMigrations: { + typeA: { + '1.0.0': jest.fn(), + '2.0.4': jest.fn(), + }, + typeC: { + '1.5.3': jest.fn(), + }, + }, + savedObjectSchemas: { + typeA: { + indexPattern: jest.fn(config => { + config.get('foo.bar'); + return 'myIndex'; + }), + hidden: true, + isNamespaceAgnostic: true, + }, + typeB: { + convertToAliasScript: 'some alias script', + hidden: false, + }, + }, + savedObjectValidations: {}, + }; + + const converted = convertLegacyTypes(uiExports, legacyConfig); + expect(converted).toMatchSnapshot(); + }); +}); + +describe('convertTypesToLegacySchema', () => { + it('converts types to the legacy schema format', () => { + const types: SavedObjectsType[] = [ + { + name: 'typeA', + hidden: false, + namespaceAgnostic: true, + mappings: { properties: {} }, + convertToAliasScript: 'some script', + }, + { + name: 'typeB', + hidden: true, + namespaceAgnostic: false, + indexPattern: 'myIndex', + mappings: { properties: {} }, + }, + ]; + expect(convertTypesToLegacySchema(types)).toEqual({ + typeA: { + hidden: false, + isNamespaceAgnostic: true, + convertToAliasScript: 'some script', + }, + typeB: { + hidden: true, + isNamespaceAgnostic: false, + indexPattern: 'myIndex', + }, + }); + }); +}); diff --git a/src/core/server/saved_objects/utils.ts b/src/core/server/saved_objects/utils.ts new file mode 100644 index 0000000000000..5c4d0ccb84b25 --- /dev/null +++ b/src/core/server/saved_objects/utils.ts @@ -0,0 +1,76 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { LegacyConfig } from '../legacy'; +import { SavedObjectsType, SavedObjectsLegacyUiExports } from './types'; +import { SavedObjectsSchemaDefinition } from './schema'; + +/** + * Converts the legacy savedObjects mappings, schema, and migrations + * to actual {@link SavedObjectsType | saved object types} + */ +export const convertLegacyTypes = ( + { + savedObjectMappings = [], + savedObjectMigrations = {}, + savedObjectSchemas = {}, + }: SavedObjectsLegacyUiExports, + legacyConfig: LegacyConfig +): SavedObjectsType[] => { + return savedObjectMappings.reduce((types, { pluginId, properties }) => { + return [ + ...types, + ...Object.entries(properties).map(([type, mappings]) => { + const schema = savedObjectSchemas[type]; + const migrations = savedObjectMigrations[type]; + return { + name: type, + hidden: schema?.hidden ?? false, + namespaceAgnostic: schema?.isNamespaceAgnostic ?? false, + mappings, + indexPattern: + typeof schema?.indexPattern === 'function' + ? schema.indexPattern(legacyConfig) + : schema?.indexPattern, + convertToAliasScript: schema?.convertToAliasScript, + migrations: migrations ?? {}, + }; + }), + ]; + }, [] as SavedObjectsType[]); +}; + +/** + * Convert {@link SavedObjectsType | saved object types} to the legacy {@link SavedObjectsSchemaDefinition | schema} format + */ +export const convertTypesToLegacySchema = ( + types: SavedObjectsType[] +): SavedObjectsSchemaDefinition => { + return types.reduce((schema, type) => { + return { + ...schema, + [type.name]: { + isNamespaceAgnostic: type.namespaceAgnostic, + hidden: type.hidden, + indexPattern: type.indexPattern, + convertToAliasScript: type.convertToAliasScript, + }, + }; + }, {} as SavedObjectsSchemaDefinition); +}; diff --git a/src/core/server/server.api.md b/src/core/server/server.api.md index fb27fcccc2abe..0a98c44cf58f5 100644 --- a/src/core/server/server.api.md +++ b/src/core/server/server.api.md @@ -1421,6 +1421,19 @@ export interface SavedObjectAttributes { // @public export type SavedObjectAttributeSingle = string | number | boolean | null | undefined | SavedObjectAttributes; +// Warning: (ae-forgotten-export) The symbol "SavedObjectUnsanitizedDoc" needs to be exported by the entry point index.d.ts +// Warning: (ae-missing-release-tag) "SavedObjectMigrationFn" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-unresolved-link) The @link reference could not be resolved: The package "kibana" does not have an export "SavedObjectUnsanitizedDoc" +// +// @public +export type SavedObjectMigrationFn = (doc: SavedObjectUnsanitizedDoc, log: SavedObjectsMigrationLogger) => SavedObjectUnsanitizedDoc; + +// @public +export interface SavedObjectMigrationMap { + // (undocumented) + [version: string]: SavedObjectMigrationFn; +} + // @public export interface SavedObjectReference { // (undocumented) @@ -1431,6 +1444,12 @@ export interface SavedObjectReference { type: string; } +// Warning: (ae-forgotten-export) The symbol "SavedObjectDoc" needs to be exported by the entry point index.d.ts +// Warning: (ae-forgotten-export) The symbol "Referencable" needs to be exported by the entry point index.d.ts +// +// @public (undocumented) +export type SavedObjectSanitizedDoc = SavedObjectDoc & Referencable; + // @public (undocumented) export interface SavedObjectsBaseOptions { namespace?: string; @@ -1534,6 +1553,32 @@ export interface SavedObjectsClientWrapperOptions { request: KibanaRequest; } +// @public +export interface SavedObjectsComplexFieldMapping { + // (undocumented) + dynamic?: string; + // (undocumented) + properties: SavedObjectsMappingProperties; + // (undocumented) + type?: string; +} + +// @public +export interface SavedObjectsCoreFieldMapping { + // (undocumented) + enabled?: boolean; + // (undocumented) + fields?: { + [subfield: string]: { + type: string; + }; + }; + // (undocumented) + index?: boolean; + // (undocumented) + type: string; +} + // @public (undocumented) export interface SavedObjectsCreateOptions extends SavedObjectsBaseOptions { id?: string; @@ -1629,6 +1674,9 @@ export interface SavedObjectsExportResultDetails { }>; } +// @public +export type SavedObjectsFieldMapping = SavedObjectsCoreFieldMapping | SavedObjectsComplexFieldMapping; + // @public (undocumented) export interface SavedObjectsFindOptions extends SavedObjectsBaseOptions { // (undocumented) @@ -1793,6 +1841,12 @@ export interface SavedObjectsLegacyService { types: string[]; } +// @public +export interface SavedObjectsMappingProperties { + // (undocumented) + [field: string]: SavedObjectsFieldMapping; +} + // @public (undocumented) export interface SavedObjectsMigrationLogger { // (undocumented) @@ -1800,6 +1854,8 @@ export interface SavedObjectsMigrationLogger { // (undocumented) info: (msg: string) => void; // (undocumented) + warn: (msg: string) => void; + // @deprecated (undocumented) warning: (msg: string) => void; } @@ -1809,8 +1865,6 @@ export interface SavedObjectsMigrationVersion { [pluginName: string]: string; } -// Warning: (ae-missing-release-tag) "RawDoc" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// // @public export interface SavedObjectsRawDoc { // (undocumented) @@ -1819,8 +1873,10 @@ export interface SavedObjectsRawDoc { _primary_term?: number; // (undocumented) _seq_no?: number; + // Warning: (ae-forgotten-export) The symbol "SavedObjectsRawDocSource" needs to be exported by the entry point index.d.ts + // // (undocumented) - _source: any; + _source: SavedObjectsRawDocSource; // (undocumented) _type?: string; } @@ -1834,7 +1890,7 @@ export class SavedObjectsRepository { // Warning: (ae-forgotten-export) The symbol "KibanaMigrator" needs to be exported by the entry point index.d.ts // // @internal - static createRepository(migrator: KibanaMigrator, schema: SavedObjectsSchema, config: LegacyConfig, indexName: string, callCluster: APICaller, extraTypes?: string[], injectedConstructor?: any): ISavedObjectsRepository; + static createRepository(migrator: KibanaMigrator, typeRegistry: SavedObjectTypeRegistry, indexName: string, callCluster: APICaller, extraTypes?: string[], injectedConstructor?: any): ISavedObjectsRepository; delete(type: string, id: string, options?: SavedObjectsDeleteOptions): Promise<{}>; deleteByNamespace(namespace: string, options?: SavedObjectsDeleteByNamespaceOptions): Promise; // (undocumented) @@ -1873,7 +1929,7 @@ export interface SavedObjectsResolveImportErrorsOptions { supportedTypes: string[]; } -// @internal (undocumented) +// @internal @deprecated (undocumented) export class SavedObjectsSchema { // Warning: (ae-forgotten-export) The symbol "SavedObjectsSchemaDefinition" needs to be exported by the entry point index.d.ts constructor(schemaDefinition?: SavedObjectsSchemaDefinition); @@ -1887,14 +1943,16 @@ export class SavedObjectsSchema { isNamespaceAgnostic(type: string): boolean; } -// @internal (undocumented) +// @public export class SavedObjectsSerializer { - constructor(schema: SavedObjectsSchema); + // Warning: (ae-forgotten-export) The symbol "ISavedObjectTypeRegistry" needs to be exported by the entry point index.d.ts + // + // @internal + constructor(registry: ISavedObjectTypeRegistry); generateRawId(namespace: string | undefined, type: string, id?: string): string; - isRawSavedObject(rawDoc: SavedObjectsRawDoc): any; - // Warning: (ae-forgotten-export) The symbol "SanitizedSavedObjectDoc" needs to be exported by the entry point index.d.ts - rawToSavedObject(doc: SavedObjectsRawDoc): SanitizedSavedObjectDoc; - savedObjectToRaw(savedObj: SanitizedSavedObjectDoc): SavedObjectsRawDoc; + isRawSavedObject(rawDoc: SavedObjectsRawDoc): boolean; + rawToSavedObject(doc: SavedObjectsRawDoc): SavedObjectSanitizedDoc; + savedObjectToRaw(savedObj: SavedObjectSanitizedDoc): SavedObjectsRawDoc; } // @public @@ -1907,9 +1965,27 @@ export interface SavedObjectsServiceSetup { export interface SavedObjectsServiceStart { createInternalRepository: (extraTypes?: string[]) => ISavedObjectsRepository; createScopedRepository: (req: KibanaRequest, extraTypes?: string[]) => ISavedObjectsRepository; + createSerializer: () => SavedObjectsSerializer; getScopedClient: (req: KibanaRequest, options?: SavedObjectsClientProviderOptions) => SavedObjectsClientContract; } +// @public (undocumented) +export interface SavedObjectsType { + convertToAliasScript?: string; + hidden: boolean; + indexPattern?: string; + mappings: SavedObjectsTypeMappingDefinition; + migrations?: SavedObjectMigrationMap; + name: string; + namespaceAgnostic: boolean; +} + +// @public +export interface SavedObjectsTypeMappingDefinition { + // (undocumented) + properties: SavedObjectsMappingProperties; +} + // @public (undocumented) export interface SavedObjectsUpdateOptions extends SavedObjectsBaseOptions { references?: SavedObjectReference[]; @@ -1925,6 +2001,16 @@ export interface SavedObjectsUpdateResponse = { + const configKeys: Record = { 'xpack.task_manager.index': '.kibana_task_manager', }; + const config = { get: (path: string) => configKeys[path] }; + + const savedObjectTypes = convertLegacyTypes(uiExports, config as LegacyConfig); + const typeRegistry = new SavedObjectTypeRegistry(); + savedObjectTypes.forEach(type => typeRegistry.registerType(type)); const logger = { trace: log.verbose.bind(log), @@ -117,7 +124,6 @@ export async function migrateKibanaIndex({ }; const migratorOptions = { - config: { get: (path: string) => config[path] } as any, savedObjectsConfig: { scrollDuration: '5m', batchSize: 100, @@ -129,9 +135,7 @@ export async function migrateKibanaIndex({ } as any, logger, kibanaVersion, - savedObjectSchemas: new SavedObjectsSchema(uiExports.savedObjectSchemas), - savedObjectMappings: uiExports.savedObjectMappings, - savedObjectMigrations: uiExports.savedObjectMigrations, + typeRegistry, savedObjectValidations: uiExports.savedObjectValidations, callCluster: (path: string, ...args: any[]) => (get(client, path) as Function).call(client, ...args), diff --git a/src/legacy/core_plugins/kibana/public/dashboard/migrations/migrations_730.test.ts b/src/legacy/core_plugins/kibana/public/dashboard/migrations/migrations_730.test.ts index 6404b5bdbd63b..86d399d219a26 100644 --- a/src/legacy/core_plugins/kibana/public/dashboard/migrations/migrations_730.test.ts +++ b/src/legacy/core_plugins/kibana/public/dashboard/migrations/migrations_730.test.ts @@ -28,6 +28,7 @@ import { const mockLogger = { warning: () => {}, + warn: () => {}, debug: () => {}, info: () => {}, }; diff --git a/src/legacy/server/kbn_server.d.ts b/src/legacy/server/kbn_server.d.ts index 8da1b3b05fa76..a21a05e1e012a 100644 --- a/src/legacy/server/kbn_server.d.ts +++ b/src/legacy/server/kbn_server.d.ts @@ -114,6 +114,7 @@ export interface KibanaCore { elasticsearch: LegacyServiceSetupDeps['core']['elasticsearch']; hapiServer: LegacyServiceSetupDeps['core']['http']['server']; kibanaMigrator: LegacyServiceStartDeps['core']['savedObjects']['migrator']; + typeRegistry: LegacyServiceStartDeps['core']['savedObjects']['typeRegistry']; legacy: ILegacyInternals; rendering: LegacyServiceSetupDeps['core']['rendering']; uiPlugins: LegacyServiceSetupDeps['core']['plugins']['uiPlugins']; diff --git a/src/legacy/server/saved_objects/saved_objects_mixin.js b/src/legacy/server/saved_objects/saved_objects_mixin.js index e0d8b895af838..1d2f2d0f23e17 100644 --- a/src/legacy/server/saved_objects/saved_objects_mixin.js +++ b/src/legacy/server/saved_objects/saved_objects_mixin.js @@ -20,7 +20,6 @@ // Disable lint errors for imports from src/core/server/saved_objects until SavedObjects migration is complete /* eslint-disable @kbn/eslint/no-restricted-paths */ import { SavedObjectsSchema } from '../../../core/server/saved_objects/schema'; -import { SavedObjectsSerializer } from '../../../core/server/saved_objects/serialization'; import { SavedObjectsClient, SavedObjectsRepository, @@ -29,6 +28,7 @@ import { resolveImportErrors, } from '../../../core/server/saved_objects'; import { getRootPropertiesObjects } from '../../../core/server/saved_objects/mappings'; +import { convertTypesToLegacySchema } from '../../../core/server/saved_objects/utils'; import { SavedObjectsManagement } from '../../../core/server/saved_objects/management'; import { @@ -57,9 +57,10 @@ function getImportableAndExportableTypes({ kbnServer, visibleTypes }) { export function savedObjectsMixin(kbnServer, server) { const migrator = kbnServer.newPlatform.__internals.kibanaMigrator; + const typeRegistry = kbnServer.newPlatform.__internals.typeRegistry; const mappings = migrator.getActiveMappings(); const allTypes = Object.keys(getRootPropertiesObjects(mappings)); - const schema = new SavedObjectsSchema(kbnServer.uiExports.savedObjectSchemas); + const schema = new SavedObjectsSchema(convertTypesToLegacySchema(typeRegistry.getAllTypes())); const visibleTypes = allTypes.filter(type => !schema.isHiddenType(type)); const importableAndExportableTypes = getImportableAndExportableTypes({ kbnServer, visibleTypes }); @@ -99,7 +100,7 @@ export function savedObjectsMixin(kbnServer, server) { server.route(createResolveImportErrorsRoute(prereqs, server, importableAndExportableTypes)); server.route(createLogLegacyImportRoute()); - const serializer = new SavedObjectsSerializer(schema); + const serializer = kbnServer.newPlatform.start.core.savedObjects.createSerializer(); const createRepository = (callCluster, extraTypes = []) => { if (typeof callCluster !== 'function') { @@ -118,10 +119,9 @@ export function savedObjectsMixin(kbnServer, server) { return new SavedObjectsRepository({ index: config.get('kibana.index'), - config, migrator, mappings, - schema, + typeRegistry, serializer, allowedTypes, callCluster, diff --git a/src/legacy/server/saved_objects/saved_objects_mixin.test.js b/src/legacy/server/saved_objects/saved_objects_mixin.test.js index 691878cf66d27..9ca0374b959f6 100644 --- a/src/legacy/server/saved_objects/saved_objects_mixin.test.js +++ b/src/legacy/server/saved_objects/saved_objects_mixin.test.js @@ -22,6 +22,14 @@ import { savedObjectsMixin } from './saved_objects_mixin'; import { mockKibanaMigrator } from '../../../core/server/saved_objects/migrations/kibana/kibana_migrator.mock'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { savedObjectsClientProviderMock } from '../../../core/server/saved_objects/service/lib/scoped_client_provider.mock'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { convertLegacyTypes } from '../../../core/server/saved_objects/utils'; +import { SavedObjectTypeRegistry } from '../../../core/server'; +import { coreMock } from '../../../core/server/mocks'; + +const mockConfig = { + get: jest.fn().mockReturnValue('anything'), +}; const savedObjectMappings = [ { @@ -61,7 +69,30 @@ const savedObjectMappings = [ }, ]; -const migrator = mockKibanaMigrator.create({ savedObjectMappings }); +const savedObjectSchemas = { + hiddentype: { + hidden: true, + }, + doc1: { + indexPattern: 'other-index', + }, +}; + +const savedObjectTypes = convertLegacyTypes( + { + savedObjectMappings, + savedObjectSchemas, + savedObjectMigrations: {}, + }, + mockConfig +); + +const typeRegistry = new SavedObjectTypeRegistry(); +savedObjectTypes.forEach(type => typeRegistry.registerType(type)); + +const migrator = mockKibanaMigrator.create({ + types: savedObjectTypes, +}); describe('Saved Objects Mixin', () => { let mockKbnServer; @@ -113,7 +144,17 @@ describe('Saved Objects Mixin', () => { }; mockKbnServer = { newPlatform: { - __internals: { kibanaMigrator: migrator, savedObjectsClientProvider: clientProvider }, + __internals: { + kibanaMigrator: migrator, + savedObjectsClientProvider: clientProvider, + typeRegistry, + }, + setup: { + core: coreMock.createSetup(), + }, + start: { + core: coreMock.createStart(), + }, }, server: mockServer, ready: () => {}, @@ -124,14 +165,7 @@ describe('Saved Objects Mixin', () => { }, uiExports: { savedObjectMappings, - savedObjectSchemas: { - hiddentype: { - hidden: true, - }, - doc1: { - indexPattern: 'other-index', - }, - }, + savedObjectSchemas, }, }; }); diff --git a/test/api_integration/apis/saved_objects/migrations.js b/test/api_integration/apis/saved_objects/migrations.js index 58a07fd87c0f9..bd207ccb41b20 100644 --- a/test/api_integration/apis/saved_objects/migrations.js +++ b/test/api_integration/apis/saved_objects/migrations.js @@ -27,8 +27,10 @@ import { DocumentMigrator, IndexMigrator, } from '../../../../src/core/server/saved_objects/migrations/core'; -import { SavedObjectsSerializer } from '../../../../src/core/server/saved_objects/serialization'; -import { SavedObjectsSchema } from '../../../../src/core/server/saved_objects/schema'; +import { + SavedObjectsSerializer, + SavedObjectTypeRegistry, +} from '../../../../src/core/server/saved_objects'; export default ({ getService }) => { const es = getService('legacyEs'); @@ -350,10 +352,15 @@ async function migrateIndex({ validateDoc, obsoleteIndexTemplatePattern, }) { + const typeRegistry = new SavedObjectTypeRegistry(); + const types = migrationsToTypes(migrations); + types.forEach(type => typeRegistry.registerType(type)); + const documentMigrator = new DocumentMigrator({ kibanaVersion: '99.9.9', - migrations, + typeRegistry, validateDoc: validateDoc || _.noop, + log: { info: _.noop, debug: _.noop, warn: _.noop }, }); const migrator = new IndexMigrator({ @@ -366,12 +373,22 @@ async function migrateIndex({ log: { info: _.noop, debug: _.noop, warn: _.noop }, pollInterval: 50, scrollDuration: '5m', - serializer: new SavedObjectsSerializer(new SavedObjectsSchema()), + serializer: new SavedObjectsSerializer(typeRegistry), }); return await migrator.migrate(); } +function migrationsToTypes(migrations) { + return Object.entries(migrations).map(([type, migrations]) => ({ + name: type, + hidden: false, + namespaceAgnostic: false, + mappings: { properties: {} }, + migrations: { ...migrations }, + })); +} + async function fetchDocs({ callCluster, index }) { const { hits: { hits }, diff --git a/x-pack/legacy/plugins/task_manager/server/index.ts b/x-pack/legacy/plugins/task_manager/server/index.ts index 98d67a38c20d0..ff25d8a1e0e5d 100644 --- a/x-pack/legacy/plugins/task_manager/server/index.ts +++ b/x-pack/legacy/plugins/task_manager/server/index.ts @@ -51,9 +51,7 @@ export function taskManager(kibana: any) { server.expose( createLegacyApi( getTaskManagerSetup(server)! - .registerLegacyAPI({ - savedObjectSchemas, - }) + .registerLegacyAPI({}) .then((taskManagerPlugin: TaskManager) => { // we can't tell the Kibana Platform Task Manager plugin to // to wait to `start` as that happens before legacy plugins diff --git a/x-pack/plugins/task_manager/server/create_task_manager.test.ts b/x-pack/plugins/task_manager/server/create_task_manager.test.ts index f4deeb1ea02ed..34258e15f45d1 100644 --- a/x-pack/plugins/task_manager/server/create_task_manager.test.ts +++ b/x-pack/plugins/task_manager/server/create_task_manager.test.ts @@ -6,8 +6,11 @@ import { createTaskManager, LegacyDeps } from './create_task_manager'; import { mockLogger } from './test_utils'; -import { CoreSetup, UuidServiceSetup } from 'kibana/server'; -import { savedObjectsRepositoryMock } from '../../../../src/core/server/mocks'; +import { CoreSetup, SavedObjectsSerializer, UuidServiceSetup } from '../../../../src/core/server'; +import { + savedObjectsRepositoryMock, + savedObjectsTypeRegistryMock, +} from '../../../../src/core/server/mocks'; jest.mock('./task_manager'); @@ -23,7 +26,7 @@ describe('createTaskManager', () => { const getMockLegacyDeps = (): LegacyDeps => ({ config: {}, - savedObjectSchemas: {}, + savedObjectsSerializer: new SavedObjectsSerializer(savedObjectsTypeRegistryMock.create()), elasticsearch: { callAsInternalUser: jest.fn(), }, diff --git a/x-pack/plugins/task_manager/server/create_task_manager.ts b/x-pack/plugins/task_manager/server/create_task_manager.ts index 5c66b8ba5bd58..9ff97bbcc17e6 100644 --- a/x-pack/plugins/task_manager/server/create_task_manager.ts +++ b/x-pack/plugins/task_manager/server/create_task_manager.ts @@ -7,7 +7,6 @@ import { IClusterClient, SavedObjectsSerializer, - SavedObjectsSchema, CoreSetup, ISavedObjectsRepository, } from '../../../../src/core/server'; @@ -16,9 +15,9 @@ import { Logger } from './types'; export interface LegacyDeps { config: any; - savedObjectSchemas: any; elasticsearch: Pick; savedObjectsRepository: ISavedObjectsRepository; + savedObjectsSerializer: SavedObjectsSerializer; logger: Logger; } @@ -27,19 +26,16 @@ export function createTaskManager( { logger, config, - savedObjectSchemas, elasticsearch: { callAsInternalUser }, savedObjectsRepository, + savedObjectsSerializer, }: LegacyDeps ) { - // as we use this Schema solely to interact with Tasks, we - // can initialise it with solely the Tasks schema - const serializer = new SavedObjectsSerializer(new SavedObjectsSchema(savedObjectSchemas)); return new TaskManager({ taskManagerId: core.uuid.getInstanceUuid(), config, savedObjectsRepository, - serializer, + serializer: savedObjectsSerializer, callAsInternalUser, logger, }); diff --git a/x-pack/plugins/task_manager/server/plugin.ts b/x-pack/plugins/task_manager/server/plugin.ts index 8b09f8f2b445a..f3dff2a88f53a 100644 --- a/x-pack/plugins/task_manager/server/plugin.ts +++ b/x-pack/plugins/task_manager/server/plugin.ts @@ -9,11 +9,12 @@ import { first } from 'rxjs/operators'; import { once } from 'lodash'; import { TaskDictionary, TaskDefinition } from './task'; import { TaskManager } from './task_manager'; -import { createTaskManager, LegacyDeps } from './create_task_manager'; +import { createTaskManager } from './create_task_manager'; import { TaskManagerConfig } from './config'; import { Middleware } from './lib/middleware'; -export type PluginLegacyDependencies = Pick; +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface PluginLegacyDependencies {} export type TaskManagerSetupContract = { config$: Observable; registerLegacyAPI: (legacyDependencies: PluginLegacyDependencies) => Promise; @@ -51,7 +52,7 @@ export class TaskManagerPlugin config, elasticsearch, savedObjectsRepository, - ...__LEGACY, + savedObjectsSerializer: savedObjects.createSerializer(), }) ); this.legacyTaskManager$.complete(); diff --git a/x-pack/plugins/task_manager/server/task_manager.test.ts b/x-pack/plugins/task_manager/server/task_manager.test.ts index a65723b2e8de7..3d48ce18c9d6a 100644 --- a/x-pack/plugins/task_manager/server/task_manager.test.ts +++ b/x-pack/plugins/task_manager/server/task_manager.test.ts @@ -21,13 +21,13 @@ import { TaskLifecycleEvent, } from './task_manager'; import { savedObjectsRepositoryMock } from '../../../../src/core/server/mocks'; -import { SavedObjectsSerializer, SavedObjectsSchema } from '../../../../src/core/server'; +import { SavedObjectsSerializer, SavedObjectTypeRegistry } from '../../../../src/core/server'; import { mockLogger } from './test_utils'; import { asErr, asOk } from './lib/result_type'; import { ConcreteTaskInstance, TaskLifecycleResult, TaskStatus } from './task'; const savedObjectsClient = savedObjectsRepositoryMock.create(); -const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); +const serializer = new SavedObjectsSerializer(new SavedObjectTypeRegistry()); describe('TaskManager', () => { let clock: sinon.SinonFakeTimers; diff --git a/x-pack/plugins/task_manager/server/task_store.test.ts b/x-pack/plugins/task_manager/server/task_store.test.ts index e6cce7a664d91..6ed6ae16fa0f9 100644 --- a/x-pack/plugins/task_manager/server/task_store.test.ts +++ b/x-pack/plugins/task_manager/server/task_store.test.ts @@ -20,7 +20,7 @@ import { StoreOpts, OwnershipClaimingOpts, TaskStore, SearchOpts } from './task_ import { savedObjectsRepositoryMock } from '../../../../src/core/server/mocks'; import { SavedObjectsSerializer, - SavedObjectsSchema, + SavedObjectTypeRegistry, SavedObjectAttributes, } from '../../../../src/core/server'; import { SavedObjectsErrorHelpers } from '../../../../src/core/server/saved_objects/service/lib/errors'; @@ -46,7 +46,7 @@ const taskDefinitions: TaskDictionary = { }; const savedObjectsClient = savedObjectsRepositoryMock.create(); -const serializer = new SavedObjectsSerializer(new SavedObjectsSchema()); +const serializer = new SavedObjectsSerializer(new SavedObjectTypeRegistry()); beforeEach(() => jest.resetAllMocks()); From ed2bac360e8189625951fc04c1227e0cf1ee9b66 Mon Sep 17 00:00:00 2001 From: Tim Roes Date: Thu, 6 Feb 2020 12:21:40 +0100 Subject: [PATCH 62/86] [Lens] Make field stats work for index patterns without time fields (#56759) * Fix field stats not loaded without time field * Add integration test for API * Add unit test for API call * Correct typo in comment --- .../indexpattern_plugin/field_item.test.tsx | 18 ++++++++++++++++++ .../plugins/lens/server/routes/field_stats.ts | 14 +++++++++----- .../api_integration/apis/lens/field_stats.ts | 18 ++++++++++++++++++ 3 files changed, 45 insertions(+), 5 deletions(-) diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_plugin/field_item.test.tsx b/x-pack/legacy/plugins/lens/public/indexpattern_plugin/field_item.test.tsx index 1b49eb6bca7fa..62e2e628c254f 100644 --- a/x-pack/legacy/plugins/lens/public/indexpattern_plugin/field_item.test.tsx +++ b/x-pack/legacy/plugins/lens/public/indexpattern_plugin/field_item.test.tsx @@ -90,6 +90,24 @@ describe('IndexPattern Field Item', () => { } as unknown) as FieldFormatsStart; }); + it('should request field stats without a time field, if the index pattern has none', async () => { + indexPattern.timeFieldName = undefined; + core.http.post.mockImplementationOnce(() => { + return Promise.resolve({}); + }); + const wrapper = mountWithIntl(); + wrapper.find('[data-test-subj="lnsFieldListPanelField-bytes"]').simulate('click'); + + expect(core.http.post).toHaveBeenCalledWith( + '/api/lens/index_stats/my-fake-index-pattern/field', + expect.anything() + ); + // Function argument types not detected correctly (https://github.com/microsoft/TypeScript/issues/26591) + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const { body } = (core.http.post.mock.calls[0] as any)[1]; + expect(JSON.parse(body)).not.toHaveProperty('timeFieldName'); + }); + it('should request field stats every time the button is clicked', async () => { let resolveFunction: (arg: unknown) => void; diff --git a/x-pack/plugins/lens/server/routes/field_stats.ts b/x-pack/plugins/lens/server/routes/field_stats.ts index ceefb492cdabe..786aba5efe3fb 100644 --- a/x-pack/plugins/lens/server/routes/field_stats.ts +++ b/x-pack/plugins/lens/server/routes/field_stats.ts @@ -27,7 +27,7 @@ export async function initFieldsRoute(setup: CoreSetup) { dslQuery: schema.object({}, { allowUnknowns: true }), fromDate: schema.string(), toDate: schema.string(), - timeFieldName: schema.string(), + timeFieldName: schema.maybe(schema.string()), field: schema.object( { name: schema.string(), @@ -46,9 +46,8 @@ export async function initFieldsRoute(setup: CoreSetup) { const { fromDate, toDate, timeFieldName, field, dslQuery } = req.body; try { - const query = { - bool: { - filter: [ + const filter = timeFieldName + ? [ { range: { [timeFieldName]: { @@ -58,7 +57,12 @@ export async function initFieldsRoute(setup: CoreSetup) { }, }, dslQuery, - ], + ] + : [dslQuery]; + + const query = { + bool: { + filter, }, }; diff --git a/x-pack/test/api_integration/apis/lens/field_stats.ts b/x-pack/test/api_integration/apis/lens/field_stats.ts index b2bb791e2da7f..51d81668d275d 100644 --- a/x-pack/test/api_integration/apis/lens/field_stats.ts +++ b/x-pack/test/api_integration/apis/lens/field_stats.ts @@ -47,6 +47,24 @@ export default ({ getService }: FtrProviderContext) => { .expect(404); }); + it('should also work without specifying a time field', async () => { + const { body } = await supertest + .post('/api/lens/index_stats/logstash-2015.09.22/field') + .set(COMMON_HEADERS) + .send({ + dslQuery: { match_all: {} }, + fromDate: TEST_START_TIME, + toDate: TEST_END_TIME, + field: { + name: 'bytes', + type: 'number', + }, + }) + .expect(200); + + expect(body).to.have.property('totalDocuments', 4633); + }); + it('should return an auto histogram for numbers and top values', async () => { const { body } = await supertest .post('/api/lens/index_stats/logstash-2015.09.22/field') From 1fa01a746e3df6e9d55cc3d365e2b106c5abb3c2 Mon Sep 17 00:00:00 2001 From: Liza Katz Date: Thu, 6 Feb 2020 14:00:32 +0200 Subject: [PATCH 63/86] Stateful search bar default behaviors (#56160) * Clean up discover * Clean up visualize * Clean up dashboard * use-default-behaviors * ts * Discover interval changing * timerange for interval definition in editor * ts * Revert most of changes to dashboard app because of changes in #55443 * Fix spaces * Revert editor to scope PR! * typo * keep savedQuery state in create search bar * update saved query to save it with the state * revert all dashboard changes * saved queries * @kertal code review * fix applying filters from histogram * @dosant code review * Merge changes from #56643 to handle saved query errors Fix bug where saved query clean does not reset query * change string path * if * Extract useFilterManager and useTimefilter * Split useSavedQuery and restore capability of changing saved query in URL * Added some tests * context view * Remove useMemo * spaces * Support filter intial values Improve useSavedQuery hook in terface Co-authored-by: Elastic Machine --- .../np_ready/angular/context_app.html | 5 +- .../discover/np_ready/angular/context_app.js | 8 +- .../discover/np_ready/angular/discover.html | 25 ++- .../discover/np_ready/angular/discover.js | 163 +++-------------- .../components/doc/use_es_doc_search.ts | 50 +++--- .../visualize/np_ready/editor/editor.js | 21 ++- .../ui/public/kbn_top_nav/kbn_top_nav.js | 5 + .../query/saved_query/saved_query_service.ts | 7 +- .../ui/search_bar/create_search_bar.tsx | 167 +++++++++++++----- .../search_bar/lib/clear_saved_query.test.ts | 50 ++++++ .../ui/search_bar/lib/clear_saved_query.ts | 31 ++++ .../populate_state_from_saved_query.test.ts | 115 ++++++++++++ .../lib/populate_state_from_saved_query.ts | 49 +++++ .../ui/search_bar/lib/use_filter_manager.ts | 50 ++++++ .../ui/search_bar/lib/use_saved_query.ts | 94 ++++++++++ .../ui/search_bar/lib/use_timefilter.ts | 61 +++++++ .../data/public/ui/search_bar/search_bar.tsx | 4 +- 17 files changed, 657 insertions(+), 248 deletions(-) create mode 100644 src/plugins/data/public/ui/search_bar/lib/clear_saved_query.test.ts create mode 100644 src/plugins/data/public/ui/search_bar/lib/clear_saved_query.ts create mode 100644 src/plugins/data/public/ui/search_bar/lib/populate_state_from_saved_query.test.ts create mode 100644 src/plugins/data/public/ui/search_bar/lib/populate_state_from_saved_query.ts create mode 100644 src/plugins/data/public/ui/search_bar/lib/use_filter_manager.ts create mode 100644 src/plugins/data/public/ui/search_bar/lib/use_saved_query.ts create mode 100644 src/plugins/data/public/ui/search_bar/lib/use_timefilter.ts diff --git a/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/context_app.html b/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/context_app.html index 3e0f8a8329154..8bbb746fa45f8 100644 --- a/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/context_app.html +++ b/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/context_app.html @@ -2,12 +2,11 @@ app-name="'context'" show-search-bar="true" show-filter-bar="true" + show-query-bar="false" show-save-query="false" show-date-picker="false" - - filters="contextApp.state.queryParameters.filters" - on-filters-updated="contextApp.actions.updateFilters" index-patterns="[contextApp.indexPattern]" + use-default-behaviors="true" > diff --git a/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/context_app.js b/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/context_app.js index 5fa0958249d79..6549f13556373 100644 --- a/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/context_app.js +++ b/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/context_app.js @@ -18,7 +18,7 @@ */ import _ from 'lodash'; -import { getServices, callAfterBindingsWorkaround, getAngularModule } from '../../kibana_services'; +import { callAfterBindingsWorkaround, getAngularModule } from '../../kibana_services'; import contextAppTemplate from './context_app.html'; import './context/components/action_bar'; import { getFirstSortableField } from './context/api/utils/sorting'; @@ -34,8 +34,6 @@ import { QueryActionsProvider, } from './context/query'; -const { timefilter } = getServices(); - const module = getAngularModule(); module.directive('contextApp', function ContextApp() { @@ -61,10 +59,6 @@ module.directive('contextApp', function ContextApp() { function ContextAppController($scope, config, Private) { const queryParameterActions = getQueryParameterActions(); const queryActions = Private(QueryActionsProvider); - - timefilter.disableAutoRefreshSelector(); - timefilter.disableTimeRangeSelector(); - this.state = createInitialState( parseInt(config.get('context:step'), 10), getFirstSortableField(this.indexPattern, config.get('context:tieBreakerFields')), diff --git a/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/discover.html b/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/discover.html index 45490ac7adc0f..efde83a0e35f0 100644 --- a/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/discover.html +++ b/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/discover.html @@ -5,24 +5,19 @@

{{screenTitle}}

diff --git a/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/discover.js b/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/discover.js index 2f73af2ab77e4..978a58ef5b2c4 100644 --- a/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/discover.js +++ b/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/discover.js @@ -19,7 +19,8 @@ import _ from 'lodash'; import React from 'react'; -import { Subscription } from 'rxjs'; +import { Subscription, Subject, merge } from 'rxjs'; +import { debounceTime } from 'rxjs/operators'; import moment from 'moment'; import dateMath from '@elastic/datemath'; import { i18n } from '@kbn/i18n'; @@ -62,7 +63,6 @@ import { Vis } from '../../../../../visualizations/public'; const { core, chrome, - data, docTitle, filterManager, share, @@ -79,8 +79,6 @@ import { import { getIndexPatternId } from '../helpers/get_index_pattern_id'; import { FilterStateManager } from '../../../../../data/public'; -const { getSavedQuery } = data.query.savedQueries; - const fetchStatuses = { UNINITIALIZED: 'uninitialized', LOADING: 'loading', @@ -205,8 +203,6 @@ function discoverController( const subscriptions = new Subscription(); - timefilter.disableTimeRangeSelector(); - timefilter.disableAutoRefreshSelector(); $scope.timefilterUpdateHandler = ranges => { timefilter.setTime({ from: moment(ranges.from).toISOString(), @@ -218,7 +214,6 @@ function discoverController( $scope.showInterval = false; $scope.minimumVisibleRows = 50; $scope.fetchStatus = fetchStatuses.UNINITIALIZED; - $scope.refreshInterval = timefilter.getRefreshInterval(); $scope.showSaveQuery = uiCapabilities.discover.saveQuery; $scope.$watch( @@ -436,15 +431,10 @@ function discoverController( let stateMonitor; const $state = ($scope.state = new AppState(getStateDefaults())); + const $fetchObservable = new Subject(); - $scope.filters = filterManager.getFilters(); $scope.screenTitle = savedSearch.title; - $scope.onFiltersUpdated = filters => { - // The filters will automatically be set when the filterManager emits an update event (see below) - filterManager.setFilters(filters); - }; - const getFieldCounts = async () => { // the field counts aren't set until we have the data back, // so we wait for the fetch to be done before proceeding @@ -571,17 +561,12 @@ function discoverController( }; const shouldSearchOnPageLoad = () => { - // If a saved query is referenced in the app state, omit the initial load because the saved query will - // be fetched separately and trigger a reload - if ($scope.state.savedQuery) { - return false; - } // A saved search is created on every page load, so we check the ID to see if we're loading a // previously saved search or if it is just transient return ( config.get('discover:searchOnPageLoad') || savedSearch.id !== undefined || - _.get($scope, 'refreshInterval.pause') === false + timefilter.getRefreshInterval().pause === false ); }; @@ -593,25 +578,23 @@ function discoverController( $scope.$on('$destroy', () => stateMonitor.destroy()); $scope.updateDataSource().then(function() { - subscriptions.add( - subscribeWithScope($scope, timefilter.getAutoRefreshFetch$(), { - next: $scope.fetch, - }) - ); + const searchBarChanges = merge( + timefilter.getAutoRefreshFetch$(), + timefilter.getFetch$(), + filterManager.getFetches$(), + $fetchObservable + ).pipe(debounceTime(100)); subscriptions.add( - subscribeWithScope($scope, timefilter.getRefreshIntervalUpdate$(), { - next: $scope.updateRefreshInterval, + subscribeWithScope($scope, searchBarChanges, { + next: $scope.fetch, }) ); subscriptions.add( subscribeWithScope($scope, timefilter.getTimeUpdate$(), { - next: $scope.updateTime, - }) - ); - subscriptions.add( - subscribeWithScope($scope, timefilter.getFetch$(), { - next: $scope.fetch, + next: () => { + $scope.updateTime(); + }, }) ); @@ -622,14 +605,14 @@ function discoverController( const currentSort = getSortArray($scope.searchSource.getField('sort'), $scope.indexPattern); // if the searchSource doesn't know, tell it so - if (!angular.equals(sort, currentSort)) $scope.fetch(); + if (!angular.equals(sort, currentSort)) $fetchObservable.next(); }); // update data source when filters update + subscriptions.add( subscribeWithScope($scope, filterManager.getUpdates$(), { next: () => { - $scope.filters = filterManager.getFilters(); $scope.updateDataSource().then(function() { $state.save(); }); @@ -637,16 +620,9 @@ function discoverController( }) ); - // fetch data when filters fire fetch event - subscriptions.add( - subscribeWithScope($scope, filterManager.getFetches$(), { - next: $scope.fetch, - }) - ); - // update data source when hitting forward/back and the query changes $scope.$listen($state, 'fetch_with_changes', function(diff) { - if (diff.indexOf('query') >= 0) $scope.fetch(); + if (diff.indexOf('query') >= 0) $fetchObservable.next(); }); $scope.$watch('opts.timefield', function(timefield) { @@ -655,7 +631,7 @@ function discoverController( $scope.$watch('state.interval', function(newInterval, oldInterval) { if (newInterval !== oldInterval) { - $scope.fetch(); + $fetchObservable.next(); } }); @@ -674,7 +650,7 @@ function discoverController( if (!_.isEqual(newQuery, oldQuery)) { const query = migrateLegacyQuery(newQuery); if (!_.isEqual(query, newQuery)) { - $scope.updateQueryAndFetch({ query }); + $scope.updateQuery({ query }); } } }); @@ -734,7 +710,7 @@ function discoverController( $state.replace(); if (shouldSearchOnPageLoad()) { - $scope.fetch(); + $fetchObservable.next(); } }); }); @@ -827,15 +803,9 @@ function discoverController( }); }; - $scope.updateQueryAndFetch = function({ query, dateRange }) { - const oldDateRange = timefilter.getTime(); - timefilter.setTime(dateRange); + $scope.updateQuery = function({ query }) { $state.query = query; - // storing the updated timerange in the state will trigger a fetch - // call automatically, so only trigger fetch in case this is a refresh call (no changes in parameters). - if (_.isEqual(oldDateRange, dateRange)) { - $scope.fetch(); - } + $fetchObservable.next(); }; function onResults(resp) { @@ -896,32 +866,12 @@ function discoverController( from: dateMath.parse(timefilter.getTime().from), to: dateMath.parse(timefilter.getTime().to, { roundUp: true }), }; - $scope.time = timefilter.getTime(); }; $scope.toMoment = function(datetime) { return moment(datetime).format(config.get('dateFormat')); }; - $scope.updateRefreshInterval = function() { - const newInterval = timefilter.getRefreshInterval(); - const shouldFetch = - _.get($scope, 'refreshInterval.pause') === true && newInterval.pause === false; - - $scope.refreshInterval = newInterval; - - if (shouldFetch) { - $scope.fetch(); - } - }; - - $scope.onRefreshChange = function({ isPaused, refreshInterval }) { - timefilter.setRefreshInterval({ - pause: isPaused, - value: refreshInterval ? refreshInterval : $scope.refreshInterval.value, - }); - }; - $scope.resetQuery = function() { kbnUrl.change('/discover/{{id}}', { id: $route.current.params.id }); }; @@ -988,69 +938,14 @@ function discoverController( $scope.minimumVisibleRows = $scope.hits; }; - $scope.onQuerySaved = savedQuery => { - $scope.savedQuery = savedQuery; - }; - - $scope.onSavedQueryUpdated = savedQuery => { - $scope.savedQuery = { ...savedQuery }; - }; - - $scope.onClearSavedQuery = () => { - delete $scope.savedQuery; - delete $state.savedQuery; - $state.query = { - query: '', - language: localStorage.get('kibana.userQueryLanguage') || config.get('search:queryLanguage'), - }; - filterManager.setFilters(filterManager.getGlobalFilters()); - $state.save(); - $scope.fetch(); - }; - - const updateStateFromSavedQuery = savedQuery => { - $state.query = savedQuery.attributes.query; - $state.save(); - const savedQueryFilters = savedQuery.attributes.filters || []; - const globalFilters = filterManager.getGlobalFilters(); - filterManager.setFilters([...globalFilters, ...savedQueryFilters]); - - if (savedQuery.attributes.timefilter) { - timefilter.setTime({ - from: savedQuery.attributes.timefilter.from, - to: savedQuery.attributes.timefilter.to, - }); - if (savedQuery.attributes.timefilter.refreshInterval) { - timefilter.setRefreshInterval(savedQuery.attributes.timefilter.refreshInterval); - } + $scope.updateSavedQueryId = newSavedQueryId => { + if (newSavedQueryId) { + $state.savedQuery = newSavedQueryId; + } else { + delete $state.savedQuery; } - - $scope.fetch(); - }; - - $scope.$watch('savedQuery', newSavedQuery => { - if (!newSavedQuery) return; - - $state.savedQuery = newSavedQuery.id; $state.save(); - - updateStateFromSavedQuery(newSavedQuery); - }); - - $scope.$watch('state.savedQuery', newSavedQueryId => { - if (!newSavedQueryId) { - $scope.savedQuery = undefined; - return; - } - if (!$scope.savedQuery || newSavedQueryId !== $scope.savedQuery.id) { - getSavedQuery(newSavedQueryId).then(savedQuery => { - $scope.$evalAsync(() => { - $scope.savedQuery = savedQuery; - updateStateFromSavedQuery(savedQuery); - }); - }); - } - }); + }; async function setupVisualization() { // If no timefield has been specified we don't create a histogram of messages diff --git a/src/legacy/core_plugins/kibana/public/discover/np_ready/components/doc/use_es_doc_search.ts b/src/legacy/core_plugins/kibana/public/discover/np_ready/components/doc/use_es_doc_search.ts index d3bf3696c08a5..6cffc2cc533b0 100644 --- a/src/legacy/core_plugins/kibana/public/discover/np_ready/components/doc/use_es_doc_search.ts +++ b/src/legacy/core_plugins/kibana/public/discover/np_ready/components/doc/use_es_doc_search.ts @@ -62,36 +62,34 @@ export function useEsDocSearch({ const [status, setStatus] = useState(ElasticRequestState.Loading); const [hit, setHit] = useState(null); - async function requestData() { - try { - const indexPatternEntity = await indexPatternService.get(indexPatternId); - setIndexPattern(indexPatternEntity); + useEffect(() => { + async function requestData() { + try { + const indexPatternEntity = await indexPatternService.get(indexPatternId); + setIndexPattern(indexPatternEntity); - const { hits } = await esClient.search({ - index, - body: buildSearchBody(id, indexPatternEntity), - }); + const { hits } = await esClient.search({ + index, + body: buildSearchBody(id, indexPatternEntity), + }); - if (hits && hits.hits && hits.hits[0]) { - setStatus(ElasticRequestState.Found); - setHit(hits.hits[0]); - } else { - setStatus(ElasticRequestState.NotFound); - } - } catch (err) { - if (err.savedObjectId) { - setStatus(ElasticRequestState.NotFoundIndexPattern); - } else if (err.status === 404) { - setStatus(ElasticRequestState.NotFound); - } else { - setStatus(ElasticRequestState.Error); + if (hits && hits.hits && hits.hits[0]) { + setStatus(ElasticRequestState.Found); + setHit(hits.hits[0]); + } else { + setStatus(ElasticRequestState.NotFound); + } + } catch (err) { + if (err.savedObjectId) { + setStatus(ElasticRequestState.NotFoundIndexPattern); + } else if (err.status === 404) { + setStatus(ElasticRequestState.NotFound); + } else { + setStatus(ElasticRequestState.Error); + } } } - } - - useEffect(() => { requestData(); - }); - + }, [esClient, id, index, indexPatternId, indexPatternService]); return [status, hit, indexPattern]; } diff --git a/src/legacy/core_plugins/kibana/public/visualize/np_ready/editor/editor.js b/src/legacy/core_plugins/kibana/public/visualize/np_ready/editor/editor.js index 96a583bec7dc9..886187cbb942e 100644 --- a/src/legacy/core_plugins/kibana/public/visualize/np_ready/editor/editor.js +++ b/src/legacy/core_plugins/kibana/public/visualize/np_ready/editor/editor.js @@ -97,7 +97,6 @@ function VisualizeAppController( } = getServices(); const filterStateManager = new FilterStateManager(globalState, getAppState, filterManager); - const queryFilter = filterManager; // Retrieve the resolved SavedVis instance. const savedVis = $route.current.locals.savedVis; const _applyVis = () => { @@ -311,11 +310,11 @@ function VisualizeAppController( return appState; })(); - $scope.filters = queryFilter.getFilters(); + $scope.filters = filterManager.getFilters(); $scope.onFiltersUpdated = filters => { - // The filters will automatically be set when the queryFilter emits an update event (see below) - queryFilter.setFilters(filters); + // The filters will automatically be set when the filterManager emits an update event (see below) + filterManager.setFilters(filters); }; $scope.showSaveQuery = visualizeCapabilities.saveQuery; @@ -426,15 +425,15 @@ function VisualizeAppController( // update the searchSource when filters update subscriptions.add( - subscribeWithScope($scope, queryFilter.getUpdates$(), { + subscribeWithScope($scope, filterManager.getUpdates$(), { next: () => { - $scope.filters = queryFilter.getFilters(); - $scope.globalFilters = queryFilter.getGlobalFilters(); + $scope.filters = filterManager.getFilters(); + $scope.globalFilters = filterManager.getGlobalFilters(); }, }) ); subscriptions.add( - subscribeWithScope($scope, queryFilter.getFetches$(), { + subscribeWithScope($scope, filterManager.getFetches$(), { next: $scope.fetch, }) ); @@ -500,7 +499,7 @@ function VisualizeAppController( language: localStorage.get('kibana.userQueryLanguage') || uiSettings.get('search:queryLanguage'), }; - queryFilter.setFilters(queryFilter.getGlobalFilters()); + filterManager.setFilters(filterManager.getGlobalFilters()); $state.save(); $scope.fetch(); }; @@ -510,8 +509,8 @@ function VisualizeAppController( $state.save(); const savedQueryFilters = savedQuery.attributes.filters || []; - const globalFilters = queryFilter.getGlobalFilters(); - queryFilter.setFilters([...globalFilters, ...savedQueryFilters]); + const globalFilters = filterManager.getGlobalFilters(); + filterManager.setFilters([...globalFilters, ...savedQueryFilters]); if (savedQuery.attributes.timefilter) { timefilter.setTime({ diff --git a/src/legacy/ui/public/kbn_top_nav/kbn_top_nav.js b/src/legacy/ui/public/kbn_top_nav/kbn_top_nav.js index 0788afd5f74eb..12c3ca2acc3cd 100644 --- a/src/legacy/ui/public/kbn_top_nav/kbn_top_nav.js +++ b/src/legacy/ui/public/kbn_top_nav/kbn_top_nav.js @@ -92,6 +92,7 @@ export const createTopNavHelper = ({ TopNavMenu }) => reactDirective => { ['onClearSavedQuery', { watchDepth: 'reference' }], ['onSaved', { watchDepth: 'reference' }], ['onSavedQueryUpdated', { watchDepth: 'reference' }], + ['onSavedQueryIdChange', { watchDepth: 'reference' }], ['indexPatterns', { watchDepth: 'collection' }], ['filters', { watchDepth: 'collection' }], @@ -109,10 +110,14 @@ export const createTopNavHelper = ({ TopNavMenu }) => reactDirective => { 'screenTitle', 'dateRangeFrom', 'dateRangeTo', + 'savedQueryId', 'isRefreshPaused', 'refreshInterval', 'disableAutoFocus', 'showAutoRefreshOnly', + + // temporary flag to use the stateful components + 'useDefaultBehaviors', ]); }; diff --git a/src/plugins/data/public/query/saved_query/saved_query_service.ts b/src/plugins/data/public/query/saved_query/saved_query_service.ts index 434efe80ecd8c..80dec1c9373ea 100644 --- a/src/plugins/data/public/query/saved_query/saved_query_service.ts +++ b/src/plugins/data/public/query/saved_query/saved_query_service.ts @@ -112,8 +112,11 @@ export const createSavedQueryService = ( }; const getSavedQuery = async (id: string): Promise => { - const response = await savedObjectsClient.get('query', id); - return parseSavedQueryObject(response); + const savedObject = await savedObjectsClient.get('query', id); + if (savedObject.error) { + throw new Error(savedObject.error.message); + } + return parseSavedQueryObject(savedObject); }; const deleteSavedQuery = async (id: string) => { diff --git a/src/plugins/data/public/ui/search_bar/create_search_bar.tsx b/src/plugins/data/public/ui/search_bar/create_search_bar.tsx index 6f1be2825dd01..71d76f4db49e2 100644 --- a/src/plugins/data/public/ui/search_bar/create_search_bar.tsx +++ b/src/plugins/data/public/ui/search_bar/create_search_bar.tsx @@ -18,13 +18,15 @@ */ import React, { useState, useEffect } from 'react'; -import { Subscription } from 'rxjs'; import { CoreStart } from 'src/core/public'; import { IStorageWrapper } from 'src/plugins/kibana_utils/public'; import { KibanaContextProvider } from '../../../../kibana_react/public'; -import { DataPublicPluginStart, esFilters } from '../..'; +import { DataPublicPluginStart, esFilters, Query, TimeRange, SavedQuery } from '../..'; import { QueryStart } from '../../query'; import { SearchBarOwnProps, SearchBar } from './search_bar'; +import { useFilterManager } from './lib/use_filter_manager'; +import { useTimefilter } from './lib/use_timefilter'; +import { useSavedQuery } from './lib/use_saved_query'; interface StatefulSearchBarDeps { core: CoreStart; @@ -34,16 +36,21 @@ interface StatefulSearchBarDeps { export type StatefulSearchBarProps = SearchBarOwnProps & { appName: string; + useDefaultBehaviors?: boolean; + savedQueryId?: string; + onSavedQueryIdChange?: (savedQueryId?: string) => void; }; -const defaultFiltersUpdated = (query: QueryStart) => { +// Respond to user changing the filters +const defaultFiltersUpdated = (queryService: QueryStart) => { return (filters: esFilters.Filter[]) => { - query.filterManager.setFilters(filters); + queryService.filterManager.setFilters(filters); }; }; -const defaultOnRefreshChange = (query: QueryStart) => { - const { timefilter } = query.timefilter; +// Respond to user changing the refresh settings +const defaultOnRefreshChange = (queryService: QueryStart) => { + const { timefilter } = queryService.timefilter; return (options: { isPaused: boolean; refreshInterval: number }) => { timefilter.setRefreshInterval({ value: options.refreshInterval, @@ -52,53 +59,103 @@ const defaultOnRefreshChange = (query: QueryStart) => { }; }; +// Respond to user changing the query string or time settings +const defaultOnQuerySubmit = ( + props: StatefulSearchBarProps, + queryService: QueryStart, + currentQuery: Query, + setQueryStringState: Function +) => { + if (!props.useDefaultBehaviors) return props.onQuerySubmit; + + const { timefilter } = queryService.timefilter; + + return (payload: { dateRange: TimeRange; query?: Query }) => { + const isUpdate = + !_.isEqual(timefilter.getTime(), payload.dateRange) || + !_.isEqual(payload.query, currentQuery); + if (isUpdate) { + timefilter.setTime(payload.dateRange); + setQueryStringState(payload.query); + } else { + // Refresh button triggered for an update + if (props.onQuerySubmit) + props.onQuerySubmit( + { + dateRange: timefilter.getTime(), + query: currentQuery, + }, + false + ); + } + }; +}; + +// Respond to user clearing a saved query +const defaultOnClearSavedQuery = (props: StatefulSearchBarProps, clearSavedQuery: Function) => { + if (!props.useDefaultBehaviors) return props.onClearSavedQuery; + return () => { + clearSavedQuery(); + if (props.onSavedQueryIdChange) props.onSavedQueryIdChange(); + }; +}; + +// Respond to user saving or updating a saved query +const defaultOnSavedQueryUpdated = (props: StatefulSearchBarProps, setSavedQuery: Function) => { + if (!props.useDefaultBehaviors) return props.onSavedQueryUpdated; + return (savedQuery: SavedQuery) => { + setSavedQuery(savedQuery); + if (props.onSavedQueryIdChange) props.onSavedQueryIdChange(savedQuery.id); + }; +}; + +const overrideDefaultBehaviors = (props: StatefulSearchBarProps) => { + return props.useDefaultBehaviors ? {} : props; +}; + export function createSearchBar({ core, storage, data }: StatefulSearchBarDeps) { // App name should come from the core application service. // Until it's available, we'll ask the user to provide it for the pre-wired component. return (props: StatefulSearchBarProps) => { - const { filterManager, timefilter } = data.query; - const tfRefreshInterval = timefilter.timefilter.getRefreshInterval(); - const fmFilters = filterManager.getFilters(); - const [refreshInterval, setRefreshInterval] = useState(tfRefreshInterval.value); - const [refreshPaused, setRefreshPaused] = useState(tfRefreshInterval.pause); + // Handle queries + const [query, setQuery] = useState( + props.query || { + query: '', + language: core.uiSettings.get('search:queryLanguage'), + } + ); - const [filters, setFilters] = useState(fmFilters); + // handle service state updates. + // i.e. filters being added from a visualization directly to filterManager. + const { filters } = useFilterManager({ + filters: props.filters, + filterManager: data.query.filterManager, + }); + const { timeRange, refreshInterval } = useTimefilter({ + timefilter: data.query.timefilter.timefilter, + }); - // We do not really need to keep track of the time - // since this is just for initialization - const timeRange = timefilter.timefilter.getTime(); + // Fetch and update UI from saved query + const { savedQuery, setSavedQuery, clearSavedQuery } = useSavedQuery({ + queryService: data.query, + setQuery, + savedQueryId: props.savedQueryId, + notifications: core.notifications, + uiSettings: core.uiSettings, + }); + // Fire onQuerySubmit on query or timerange change useEffect(() => { - let isSubscribed = true; - const subscriptions = new Subscription(); - subscriptions.add( - timefilter.timefilter.getRefreshIntervalUpdate$().subscribe({ - next: () => { - if (isSubscribed) { - const newRefreshInterval = timefilter.timefilter.getRefreshInterval(); - setRefreshInterval(newRefreshInterval.value); - setRefreshPaused(newRefreshInterval.pause); - } + if (!props.useDefaultBehaviors) return; + if (props.onQuerySubmit) + props.onQuerySubmit( + { + dateRange: timeRange, + query, }, - }) - ); - - subscriptions.add( - filterManager.getUpdates$().subscribe({ - next: () => { - if (isSubscribed) { - const newFilters = filterManager.getFilters(); - setFilters(newFilters); - } - }, - }) - ); - - return () => { - isSubscribed = false; - subscriptions.unsubscribe(); - }; - }, [filterManager, timefilter.timefilter]); + true + ); + }, [props, props.onQuerySubmit, props.useDefaultBehaviors, query, timeRange]); return ( ); diff --git a/src/plugins/data/public/ui/search_bar/lib/clear_saved_query.test.ts b/src/plugins/data/public/ui/search_bar/lib/clear_saved_query.test.ts new file mode 100644 index 0000000000000..ccfe5464b9598 --- /dev/null +++ b/src/plugins/data/public/ui/search_bar/lib/clear_saved_query.test.ts @@ -0,0 +1,50 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { clearStateFromSavedQuery } from './clear_saved_query'; + +import { dataPluginMock } from '../../../mocks'; +import { DataPublicPluginStart } from '../../../types'; +import { Query } from '../../..'; + +describe('clearStateFromSavedQuery', () => { + const DEFAULT_LANGUAGE = 'banana'; + let dataMock: jest.Mocked; + + beforeEach(() => { + dataMock = dataPluginMock.createStartContract(); + }); + + it('should clear filters and query', async () => { + const setQueryState = jest.fn(); + dataMock.query.filterManager.removeAll = jest.fn(); + clearStateFromSavedQuery(dataMock.query, setQueryState, DEFAULT_LANGUAGE); + expect(setQueryState).toHaveBeenCalled(); + expect(dataMock.query.filterManager.removeAll).toHaveBeenCalled(); + }); + + it('should use search:queryLanguage', async () => { + const setQueryState = jest.fn(); + dataMock.query.filterManager.removeAll = jest.fn(); + clearStateFromSavedQuery(dataMock.query, setQueryState, DEFAULT_LANGUAGE); + expect(setQueryState).toHaveBeenCalled(); + expect((setQueryState.mock.calls[0][0] as Query).language).toBe(DEFAULT_LANGUAGE); + expect(dataMock.query.filterManager.removeAll).toHaveBeenCalled(); + }); +}); diff --git a/src/plugins/data/public/ui/search_bar/lib/clear_saved_query.ts b/src/plugins/data/public/ui/search_bar/lib/clear_saved_query.ts new file mode 100644 index 0000000000000..b2c777261c257 --- /dev/null +++ b/src/plugins/data/public/ui/search_bar/lib/clear_saved_query.ts @@ -0,0 +1,31 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { QueryStart } from '../../../query'; + +export const clearStateFromSavedQuery = ( + queryService: QueryStart, + setQueryStringState: Function, + defaultLanguage: string +) => { + queryService.filterManager.removeAll(); + setQueryStringState({ + query: '', + language: defaultLanguage, + }); +}; diff --git a/src/plugins/data/public/ui/search_bar/lib/populate_state_from_saved_query.test.ts b/src/plugins/data/public/ui/search_bar/lib/populate_state_from_saved_query.test.ts new file mode 100644 index 0000000000000..3242b37becd95 --- /dev/null +++ b/src/plugins/data/public/ui/search_bar/lib/populate_state_from_saved_query.test.ts @@ -0,0 +1,115 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { populateStateFromSavedQuery } from './populate_state_from_saved_query'; + +import { dataPluginMock } from '../../../mocks'; +import { DataPublicPluginStart } from '../../../types'; +import { SavedQuery, esFilters } from '../../..'; +import { getFilter } from '../../../query/filter_manager/test_helpers/get_stub_filter'; + +describe('populateStateFromSavedQuery', () => { + let dataMock: jest.Mocked; + + const baseSavedQuery: SavedQuery = { + id: 'test', + attributes: { + title: 'test', + description: 'test', + query: { + query: 'test', + language: 'kuery', + }, + }, + }; + + beforeEach(() => { + dataMock = dataPluginMock.createStartContract(); + dataMock.query.filterManager.setFilters = jest.fn(); + dataMock.query.filterManager.getGlobalFilters = jest.fn().mockReturnValue([]); + }); + + it('should set query', async () => { + const setQueryState = jest.fn(); + const savedQuery: SavedQuery = { + ...baseSavedQuery, + }; + populateStateFromSavedQuery(dataMock.query, setQueryState, savedQuery); + expect(setQueryState).toHaveBeenCalled(); + }); + + it('should set filters', async () => { + const setQueryState = jest.fn(); + const savedQuery: SavedQuery = { + ...baseSavedQuery, + }; + const f1 = getFilter(esFilters.FilterStateStore.APP_STATE, false, false, 'age', 34); + savedQuery.attributes.filters = [f1]; + populateStateFromSavedQuery(dataMock.query, setQueryState, savedQuery); + expect(setQueryState).toHaveBeenCalled(); + expect(dataMock.query.filterManager.setFilters).toHaveBeenCalledWith([f1]); + }); + + it('should preserve global filters', async () => { + const globalFilter = getFilter( + esFilters.FilterStateStore.GLOBAL_STATE, + false, + false, + 'age', + 34 + ); + dataMock.query.filterManager.getGlobalFilters = jest.fn().mockReturnValue([globalFilter]); + const setQueryState = jest.fn(); + const savedQuery: SavedQuery = { + ...baseSavedQuery, + }; + const f1 = getFilter(esFilters.FilterStateStore.APP_STATE, false, false, 'age', 34); + savedQuery.attributes.filters = [f1]; + populateStateFromSavedQuery(dataMock.query, setQueryState, savedQuery); + expect(setQueryState).toHaveBeenCalled(); + expect(dataMock.query.filterManager.setFilters).toHaveBeenCalledWith([globalFilter, f1]); + }); + + it('should update timefilter', async () => { + const savedQuery: SavedQuery = { + ...baseSavedQuery, + }; + savedQuery.attributes.timefilter = { + from: '2018', + to: '2019', + refreshInterval: { + pause: true, + value: 10, + }, + }; + + dataMock.query.timefilter.timefilter.setTime = jest.fn(); + dataMock.query.timefilter.timefilter.setRefreshInterval = jest.fn(); + + populateStateFromSavedQuery(dataMock.query, jest.fn(), savedQuery); + + expect(dataMock.query.timefilter.timefilter.setTime).toHaveBeenCalledWith({ + from: savedQuery.attributes.timefilter.from, + to: savedQuery.attributes.timefilter.to, + }); + expect(dataMock.query.timefilter.timefilter.setRefreshInterval).toHaveBeenCalledWith( + savedQuery.attributes.timefilter.refreshInterval + ); + }); +}); diff --git a/src/plugins/data/public/ui/search_bar/lib/populate_state_from_saved_query.ts b/src/plugins/data/public/ui/search_bar/lib/populate_state_from_saved_query.ts new file mode 100644 index 0000000000000..fd1517097753e --- /dev/null +++ b/src/plugins/data/public/ui/search_bar/lib/populate_state_from_saved_query.ts @@ -0,0 +1,49 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { QueryStart, SavedQuery } from '../../..'; + +export const populateStateFromSavedQuery = ( + queryService: QueryStart, + setQueryStringState: Function, + savedQuery: SavedQuery +) => { + const { + timefilter: { timefilter }, + filterManager, + } = queryService; + // timefilter + if (savedQuery.attributes.timefilter) { + timefilter.setTime({ + from: savedQuery.attributes.timefilter.from, + to: savedQuery.attributes.timefilter.to, + }); + if (savedQuery.attributes.timefilter.refreshInterval) { + timefilter.setRefreshInterval(savedQuery.attributes.timefilter.refreshInterval); + } + } + + // query string + setQueryStringState(savedQuery.attributes.query); + + // filters + const savedQueryFilters = savedQuery.attributes.filters || []; + const globalFilters = filterManager.getGlobalFilters(); + filterManager.setFilters([...globalFilters, ...savedQueryFilters]); +}; diff --git a/src/plugins/data/public/ui/search_bar/lib/use_filter_manager.ts b/src/plugins/data/public/ui/search_bar/lib/use_filter_manager.ts new file mode 100644 index 0000000000000..e889583aef609 --- /dev/null +++ b/src/plugins/data/public/ui/search_bar/lib/use_filter_manager.ts @@ -0,0 +1,50 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { useState, useEffect } from 'react'; +import { Subscription } from 'rxjs'; +import { DataPublicPluginStart, esFilters } from '../../..'; + +interface UseFilterManagerProps { + filters?: esFilters.Filter[]; + filterManager: DataPublicPluginStart['query']['filterManager']; +} + +export const useFilterManager = (props: UseFilterManagerProps) => { + // Filters should be either what's passed in the initial state or the current state of the filter manager + const [filters, setFilters] = useState(props.filters || props.filterManager.getFilters()); + useEffect(() => { + const subscriptions = new Subscription(); + + subscriptions.add( + props.filterManager.getUpdates$().subscribe({ + next: () => { + const newFilters = props.filterManager.getFilters(); + setFilters(newFilters); + }, + }) + ); + + return () => { + subscriptions.unsubscribe(); + }; + }, [props.filterManager]); + + return { filters }; +}; diff --git a/src/plugins/data/public/ui/search_bar/lib/use_saved_query.ts b/src/plugins/data/public/ui/search_bar/lib/use_saved_query.ts new file mode 100644 index 0000000000000..fdeeaab1dff06 --- /dev/null +++ b/src/plugins/data/public/ui/search_bar/lib/use_saved_query.ts @@ -0,0 +1,94 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { useState, useEffect } from 'react'; +import { i18n } from '@kbn/i18n'; +import { CoreStart } from 'kibana/public'; +import { SavedQuery } from '../../../query'; +import { DataPublicPluginStart } from '../../..'; +import { populateStateFromSavedQuery } from './populate_state_from_saved_query'; +import { clearStateFromSavedQuery } from './clear_saved_query'; + +interface UseSavedQueriesProps { + queryService: DataPublicPluginStart['query']; + setQuery: Function; + notifications: CoreStart['notifications']; + uiSettings: CoreStart['uiSettings']; + savedQueryId?: string; +} + +interface UseSavedQueriesReturn { + savedQuery?: SavedQuery; + setSavedQuery: (savedQuery: SavedQuery) => void; + clearSavedQuery: () => void; +} + +export const useSavedQuery = (props: UseSavedQueriesProps): UseSavedQueriesReturn => { + // Handle saved queries + const defaultLanguage = props.uiSettings.get('search:queryLanguage'); + const [savedQuery, setSavedQuery] = useState(); + + // Effect is used to convert a saved query id into an object + useEffect(() => { + const fetchSavedQuery = async (savedQueryId: string) => { + try { + // fetch saved query + const newSavedQuery = await props.queryService.savedQueries.getSavedQuery(savedQueryId); + // Make sure we set the saved query to the most recent one + if (newSavedQuery && newSavedQuery.id === savedQueryId) { + setSavedQuery(newSavedQuery); + populateStateFromSavedQuery(props.queryService, props.setQuery, newSavedQuery); + } + } catch (error) { + // Clear saved query + setSavedQuery(undefined); + clearStateFromSavedQuery(props.queryService, props.setQuery, defaultLanguage); + // notify of saving error + props.notifications.toasts.addWarning({ + title: i18n.translate('data.search.unableToGetSavedQueryToastTitle', { + defaultMessage: 'Unable to load saved query {savedQueryId}', + values: { savedQueryId }, + }), + text: `${error.message}`, + }); + } + }; + + if (props.savedQueryId) fetchSavedQuery(props.savedQueryId); + }, [ + defaultLanguage, + props.notifications.toasts, + props.queryService, + props.queryService.savedQueries, + props.savedQueryId, + props.setQuery, + ]); + + return { + savedQuery, + setSavedQuery: (q: SavedQuery) => { + setSavedQuery(q); + populateStateFromSavedQuery(props.queryService, props.setQuery, q); + }, + clearSavedQuery: () => { + setSavedQuery(undefined); + clearStateFromSavedQuery(props.queryService, props.setQuery, defaultLanguage); + }, + }; +}; diff --git a/src/plugins/data/public/ui/search_bar/lib/use_timefilter.ts b/src/plugins/data/public/ui/search_bar/lib/use_timefilter.ts new file mode 100644 index 0000000000000..942902ebd7286 --- /dev/null +++ b/src/plugins/data/public/ui/search_bar/lib/use_timefilter.ts @@ -0,0 +1,61 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { useState, useEffect } from 'react'; +import { Subscription } from 'rxjs'; +import { DataPublicPluginStart } from 'src/plugins/data/public'; + +interface UseTimefilterProps { + timefilter: DataPublicPluginStart['query']['timefilter']['timefilter']; +} + +export const useTimefilter = (props: UseTimefilterProps) => { + const [timeRange, setTimerange] = useState(props.timefilter.getTime()); + const [refreshInterval, setRefreshInterval] = useState(props.timefilter.getRefreshInterval()); + + useEffect(() => { + const subscriptions = new Subscription(); + + subscriptions.add( + props.timefilter.getRefreshIntervalUpdate$().subscribe({ + next: () => { + const newRefreshInterval = props.timefilter.getRefreshInterval(); + setRefreshInterval(newRefreshInterval); + }, + }) + ); + + subscriptions.add( + props.timefilter.getTimeUpdate$().subscribe({ + next: () => { + setTimerange(props.timefilter.getTime()); + }, + }) + ); + + return () => { + subscriptions.unsubscribe(); + }; + }, [props.timefilter]); + + return { + refreshInterval, + timeRange, + }; +}; diff --git a/src/plugins/data/public/ui/search_bar/search_bar.tsx b/src/plugins/data/public/ui/search_bar/search_bar.tsx index ceaeb24e7fe7c..2f0cdb322912b 100644 --- a/src/plugins/data/public/ui/search_bar/search_bar.tsx +++ b/src/plugins/data/public/ui/search_bar/search_bar.tsx @@ -47,7 +47,6 @@ interface SearchBarInjectedDeps { timeHistory: TimeHistoryContract; // Filter bar onFiltersUpdated?: (filters: esFilters.Filter[]) => void; - filters?: esFilters.Filter[]; // Date picker dateRangeFrom?: string; dateRangeTo?: string; @@ -69,13 +68,14 @@ export interface SearchBarOwnProps { showFilterBar?: boolean; showDatePicker?: boolean; showAutoRefreshOnly?: boolean; + filters?: esFilters.Filter[]; // Query bar - should be in SearchBarInjectedDeps query?: Query; // Show when user has privileges to save showSaveQuery?: boolean; savedQuery?: SavedQuery; onQueryChange?: (payload: { dateRange: TimeRange; query?: Query }) => void; - onQuerySubmit?: (payload: { dateRange: TimeRange; query?: Query }) => void; + onQuerySubmit?: (payload: { dateRange: TimeRange; query?: Query }, isUpdate?: boolean) => void; // User has saved the current state as a saved query onSaved?: (savedQuery: SavedQuery) => void; // User has modified the saved query, your app should persist the update From 10f48dbe06d355d7d92b1fa9e23881ae2da0bd2e Mon Sep 17 00:00:00 2001 From: Nathan L Smith Date: Thu, 6 Feb 2020 06:53:11 -0600 Subject: [PATCH 64/86] APM Service Map popover fixes round 2 (#56911) * Position the popover offscreen when no node is selected * Unselect all the nodes when setting the selected node to undefined --- .../components/app/ServiceMap/Popover/index.tsx | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/x-pack/legacy/plugins/apm/public/components/app/ServiceMap/Popover/index.tsx b/x-pack/legacy/plugins/apm/public/components/app/ServiceMap/Popover/index.tsx index 8e49a02909aab..329dd45029608 100644 --- a/x-pack/legacy/plugins/apm/public/components/app/ServiceMap/Popover/index.tsx +++ b/x-pack/legacy/plugins/apm/public/components/app/ServiceMap/Popover/index.tsx @@ -26,12 +26,15 @@ export function Popover({ focusedServiceName }: PopoverProps) { const [selectedNode, setSelectedNode] = useState< cytoscape.NodeSingular | undefined >(undefined); - const deselect = useCallback(() => setSelectedNode(undefined), [ - setSelectedNode - ]); + const deselect = useCallback(() => { + if (cy) { + cy.elements().unselect(); + } + setSelectedNode(undefined); + }, [cy, setSelectedNode]); const renderedHeight = selectedNode?.renderedHeight() ?? 0; const renderedWidth = selectedNode?.renderedWidth() ?? 0; - const { x, y } = selectedNode?.renderedPosition() ?? { x: 0, y: 0 }; + const { x, y } = selectedNode?.renderedPosition() ?? { x: -10000, y: -10000 }; const isOpen = !!selectedNode; const isService = selectedNode?.data('type') === 'service'; const triggerStyle: CSSProperties = { From 5abca85feba7383a345b741b0c119ea8764dde66 Mon Sep 17 00:00:00 2001 From: Mikhail Shustov Date: Thu, 6 Feb 2020 15:51:28 +0100 Subject: [PATCH 65/86] [NP] add pid to LogRecord (#56851) * add pid to LogRecord * fix wording * update docs * fix legacy_logging_server tests --- .../legacy_appender.test.ts.snap | 261 +++++++++--------- .../logging/appenders/legacy_appender.test.ts | 17 +- .../logging/legacy_logging_server.test.ts | 3 + .../logging_service.test.ts.snap | 151 +++++----- .../appenders/buffer/buffer_appender.test.ts | 3 + .../console/console_appender.test.ts | 3 + .../appenders/file/file_appender.test.ts | 6 + .../__snapshots__/json_layout.test.ts.snap | 12 +- .../__snapshots__/pattern_layout.test.ts.snap | 12 + .../logging/layouts/json_layout.test.ts | 6 + .../server/logging/layouts/json_layout.ts | 1 + .../logging/layouts/pattern_layout.test.ts | 14 + .../server/logging/layouts/pattern_layout.ts | 4 +- src/core/server/logging/log_record.ts | 1 + src/core/server/logging/logger.test.ts | 25 ++ src/core/server/logging/logger.ts | 2 + .../server/logging/logging_service.test.ts | 27 +- src/core/server/server.api.md | 2 + 18 files changed, 344 insertions(+), 206 deletions(-) diff --git a/src/core/server/legacy/logging/appenders/__snapshots__/legacy_appender.test.ts.snap b/src/core/server/legacy/logging/appenders/__snapshots__/legacy_appender.test.ts.snap index 6ffc1ea140beb..3c40362e8211e 100644 --- a/src/core/server/legacy/logging/appenders/__snapshots__/legacy_appender.test.ts.snap +++ b/src/core/server/legacy/logging/appenders/__snapshots__/legacy_appender.test.ts.snap @@ -1,127 +1,142 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`\`append()\` correctly pushes records to legacy platform. 1`] = ` -Array [ - Array [ - Object { - "context": "context-1", - "level": LogLevel { - "id": "trace", - "value": 7, - }, - "message": "message-1", - "timestamp": 2012-02-01T11:22:33.044Z, - }, - ], - Array [ - Object { - "context": "context-2", - "level": LogLevel { - "id": "debug", - "value": 6, - }, - "message": "message-2", - "timestamp": 2012-02-01T11:22:33.044Z, - }, - ], - Array [ - Object { - "context": "context-3.sub-context-3", - "level": LogLevel { - "id": "info", - "value": 5, - }, - "message": "message-3", - "timestamp": 2012-02-01T11:22:33.044Z, - }, - ], - Array [ - Object { - "context": "context-4.sub-context-4", - "level": LogLevel { - "id": "warn", - "value": 4, - }, - "message": "message-4", - "timestamp": 2012-02-01T11:22:33.044Z, - }, - ], - Array [ - Object { - "context": "context-5", - "error": [Error: Some Error], - "level": LogLevel { - "id": "error", - "value": 3, - }, - "message": "message-5-with-error", - "timestamp": 2012-02-01T11:22:33.044Z, - }, - ], - Array [ - Object { - "context": "context-6", - "level": LogLevel { - "id": "error", - "value": 3, - }, - "message": "message-6-with-message", - "timestamp": 2012-02-01T11:22:33.044Z, - }, - ], - Array [ - Object { - "context": "context-7.sub-context-7.sub-sub-context-7", - "error": [Error: Some Fatal Error], - "level": LogLevel { - "id": "fatal", - "value": 2, - }, - "message": "message-7-with-error", - "timestamp": 2012-02-01T11:22:33.044Z, - }, - ], - Array [ - Object { - "context": "context-8.sub-context-8.sub-sub-context-8", - "level": LogLevel { - "id": "fatal", - "value": 2, - }, - "message": "message-8-with-message", - "timestamp": 2012-02-01T11:22:33.044Z, - }, - ], - Array [ - Object { - "context": "context-9.sub-context-9", - "level": LogLevel { - "id": "info", - "value": 5, - }, - "message": "message-9-with-message", - "meta": Object { - "someValue": 3, - }, - "timestamp": 2012-02-01T11:22:33.044Z, - }, - ], - Array [ - Object { - "context": "context-10.sub-context-10", - "level": LogLevel { - "id": "info", - "value": 5, - }, - "message": "message-10-with-message", - "meta": Object { - "tags": Array [ - "tag1", - "tag2", - ], - }, - "timestamp": 2012-02-01T11:22:33.044Z, - }, - ], -] +Object { + "context": "context-1", + "level": LogLevel { + "id": "trace", + "value": 7, + }, + "message": "message-1", + "pid": Any, + "timestamp": 2012-02-01T11:22:33.044Z, +} +`; + +exports[`\`append()\` correctly pushes records to legacy platform. 2`] = ` +Object { + "context": "context-2", + "level": LogLevel { + "id": "debug", + "value": 6, + }, + "message": "message-2", + "pid": Any, + "timestamp": 2012-02-01T11:22:33.044Z, +} +`; + +exports[`\`append()\` correctly pushes records to legacy platform. 3`] = ` +Object { + "context": "context-3.sub-context-3", + "level": LogLevel { + "id": "info", + "value": 5, + }, + "message": "message-3", + "pid": Any, + "timestamp": 2012-02-01T11:22:33.044Z, +} +`; + +exports[`\`append()\` correctly pushes records to legacy platform. 4`] = ` +Object { + "context": "context-4.sub-context-4", + "level": LogLevel { + "id": "warn", + "value": 4, + }, + "message": "message-4", + "pid": Any, + "timestamp": 2012-02-01T11:22:33.044Z, +} +`; + +exports[`\`append()\` correctly pushes records to legacy platform. 5`] = ` +Object { + "context": "context-5", + "error": [Error: Some Error], + "level": LogLevel { + "id": "error", + "value": 3, + }, + "message": "message-5-with-error", + "pid": Any, + "timestamp": 2012-02-01T11:22:33.044Z, +} +`; + +exports[`\`append()\` correctly pushes records to legacy platform. 6`] = ` +Object { + "context": "context-6", + "level": LogLevel { + "id": "error", + "value": 3, + }, + "message": "message-6-with-message", + "pid": Any, + "timestamp": 2012-02-01T11:22:33.044Z, +} +`; + +exports[`\`append()\` correctly pushes records to legacy platform. 7`] = ` +Object { + "context": "context-7.sub-context-7.sub-sub-context-7", + "error": [Error: Some Fatal Error], + "level": LogLevel { + "id": "fatal", + "value": 2, + }, + "message": "message-7-with-error", + "pid": Any, + "timestamp": 2012-02-01T11:22:33.044Z, +} +`; + +exports[`\`append()\` correctly pushes records to legacy platform. 8`] = ` +Object { + "context": "context-8.sub-context-8.sub-sub-context-8", + "level": LogLevel { + "id": "fatal", + "value": 2, + }, + "message": "message-8-with-message", + "pid": Any, + "timestamp": 2012-02-01T11:22:33.044Z, +} +`; + +exports[`\`append()\` correctly pushes records to legacy platform. 9`] = ` +Object { + "context": "context-9.sub-context-9", + "level": LogLevel { + "id": "info", + "value": 5, + }, + "message": "message-9-with-message", + "meta": Object { + "someValue": 3, + }, + "pid": Any, + "timestamp": 2012-02-01T11:22:33.044Z, +} +`; + +exports[`\`append()\` correctly pushes records to legacy platform. 10`] = ` +Object { + "context": "context-10.sub-context-10", + "level": LogLevel { + "id": "info", + "value": 5, + }, + "message": "message-10-with-message", + "meta": Object { + "tags": Array [ + "tag1", + "tag2", + ], + }, + "pid": Any, + "timestamp": 2012-02-01T11:22:33.044Z, +} `; diff --git a/src/core/server/legacy/logging/appenders/legacy_appender.test.ts b/src/core/server/legacy/logging/appenders/legacy_appender.test.ts index adc5dcae3ec9d..538d987e781d0 100644 --- a/src/core/server/legacy/logging/appenders/legacy_appender.test.ts +++ b/src/core/server/legacy/logging/appenders/legacy_appender.test.ts @@ -46,24 +46,28 @@ test('`append()` correctly pushes records to legacy platform.', () => { level: LogLevel.Trace, message: 'message-1', timestamp, + pid: 5355, }, { context: 'context-2', level: LogLevel.Debug, message: 'message-2', timestamp, + pid: 5355, }, { context: 'context-3.sub-context-3', level: LogLevel.Info, message: 'message-3', timestamp, + pid: 5355, }, { context: 'context-4.sub-context-4', level: LogLevel.Warn, message: 'message-4', timestamp, + pid: 5355, }, { context: 'context-5', @@ -71,12 +75,14 @@ test('`append()` correctly pushes records to legacy platform.', () => { level: LogLevel.Error, message: 'message-5-with-error', timestamp, + pid: 5355, }, { context: 'context-6', level: LogLevel.Error, message: 'message-6-with-message', timestamp, + pid: 5355, }, { context: 'context-7.sub-context-7.sub-sub-context-7', @@ -84,18 +90,21 @@ test('`append()` correctly pushes records to legacy platform.', () => { level: LogLevel.Fatal, message: 'message-7-with-error', timestamp, + pid: 5355, }, { context: 'context-8.sub-context-8.sub-sub-context-8', level: LogLevel.Fatal, message: 'message-8-with-message', timestamp, + pid: 5355, }, { context: 'context-9.sub-context-9', level: LogLevel.Info, message: 'message-9-with-message', timestamp, + pid: 5355, meta: { someValue: 3 }, }, { @@ -103,6 +112,7 @@ test('`append()` correctly pushes records to legacy platform.', () => { level: LogLevel.Info, message: 'message-10-with-message', timestamp, + pid: 5355, meta: { tags: ['tag1', 'tag2'] }, }, ]; @@ -113,7 +123,12 @@ test('`append()` correctly pushes records to legacy platform.', () => { } const [mockLegacyLoggingServerInstance] = (LegacyLoggingServer as any).mock.instances; - expect(mockLegacyLoggingServerInstance.log.mock.calls).toMatchSnapshot(); + expect(mockLegacyLoggingServerInstance.log.mock.calls).toHaveLength(records.length); + records.forEach((r, idx) => { + expect(mockLegacyLoggingServerInstance.log.mock.calls[idx][0]).toMatchSnapshot({ + pid: expect.any(Number), + }); + }); }); test('legacy logging server is correctly created and disposed.', async () => { diff --git a/src/core/server/legacy/logging/legacy_logging_server.test.ts b/src/core/server/legacy/logging/legacy_logging_server.test.ts index beb2098600ce6..6dca3a199728e 100644 --- a/src/core/server/legacy/logging/legacy_logging_server.test.ts +++ b/src/core/server/legacy/logging/legacy_logging_server.test.ts @@ -31,6 +31,7 @@ test('correctly forwards log records.', () => { const timestamp = 1554433221100; const firstLogRecord = { timestamp: new Date(timestamp), + pid: 5355, level: LogLevel.Info, context: 'some-context', message: 'some-message', @@ -38,6 +39,7 @@ test('correctly forwards log records.', () => { const secondLogRecord = { timestamp: new Date(timestamp), + pid: 5355, level: LogLevel.Error, context: 'some-context.sub-context', message: 'some-message', @@ -47,6 +49,7 @@ test('correctly forwards log records.', () => { const thirdLogRecord = { timestamp: new Date(timestamp), + pid: 5355, level: LogLevel.Trace, context: 'some-context.sub-context', message: 'some-message', diff --git a/src/core/server/logging/__snapshots__/logging_service.test.ts.snap b/src/core/server/logging/__snapshots__/logging_service.test.ts.snap index ffde6cbcdebd1..54c170f523299 100644 --- a/src/core/server/logging/__snapshots__/logging_service.test.ts.snap +++ b/src/core/server/logging/__snapshots__/logging_service.test.ts.snap @@ -1,57 +1,71 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`appends records via multiple appenders.: console logs 1`] = ` -Array [ - Array [ - "[2012-02-01T00:00:00.000Z][INFO ][some-context] You know, just for your info.", - ], -] -`; +exports[`appends records via multiple appenders.: console logs 1`] = `"[2012-02-01T00:00:00.000Z][INFO ][some-context] You know, just for your info."`; exports[`appends records via multiple appenders.: file logs 1`] = ` -Array [ - Array [ - "[2012-02-01T00:00:00.000Z][WARN ][tests] Config is not ready! -", - ], - Array [ - "[2012-02-01T00:00:00.000Z][ERROR][tests.child] Too bad that config is not ready :/ -", - ], -] +"[2012-02-01T00:00:00.000Z][WARN ][tests] Config is not ready! +" +`; + +exports[`appends records via multiple appenders.: file logs 2`] = ` +"[2012-02-01T00:00:00.000Z][ERROR][tests.child] Too bad that config is not ready :/ +" `; exports[`asLoggerFactory() only allows to create new loggers. 1`] = ` -Array [ - Array [ - "{\\"@timestamp\\":\\"2012-02-01T00:00:00.000Z\\",\\"context\\":\\"test.context\\",\\"level\\":\\"TRACE\\",\\"message\\":\\"buffered trace message\\"}", - ], - Array [ - "{\\"@timestamp\\":\\"2012-02-01T00:00:00.000Z\\",\\"context\\":\\"test.context\\",\\"level\\":\\"INFO\\",\\"message\\":\\"buffered info message\\",\\"meta\\":{\\"some\\":\\"value\\"}}", - ], - Array [ - "{\\"@timestamp\\":\\"2012-02-01T00:00:00.000Z\\",\\"context\\":\\"test.context\\",\\"level\\":\\"FATAL\\",\\"message\\":\\"buffered fatal message\\"}", - ], -] +Object { + "@timestamp": "2012-02-01T00:00:00.000Z", + "context": "test.context", + "level": "TRACE", + "message": "buffered trace message", + "pid": Any, +} +`; + +exports[`asLoggerFactory() only allows to create new loggers. 2`] = ` +Object { + "@timestamp": "2012-02-01T00:00:00.000Z", + "context": "test.context", + "level": "INFO", + "message": "buffered info message", + "meta": Object { + "some": "value", + }, + "pid": Any, +} +`; + +exports[`asLoggerFactory() only allows to create new loggers. 3`] = ` +Object { + "@timestamp": "2012-02-01T00:00:00.000Z", + "context": "test.context", + "level": "FATAL", + "message": "buffered fatal message", + "pid": Any, +} `; exports[`flushes memory buffer logger and switches to real logger once config is provided: buffered messages 1`] = ` -Array [ - Array [ - "{\\"@timestamp\\":\\"2012-02-01T00:00:00.000Z\\",\\"context\\":\\"test.context\\",\\"level\\":\\"INFO\\",\\"message\\":\\"buffered info message\\",\\"meta\\":{\\"some\\":\\"value\\"}}", - ], - Array [ - "{\\"@timestamp\\":\\"2012-02-01T00:00:00.000Z\\",\\"context\\":\\"test.context\\",\\"level\\":\\"FATAL\\",\\"message\\":\\"buffered fatal message\\"}", - ], -] +Object { + "@timestamp": "2012-02-01T00:00:00.000Z", + "context": "test.context", + "level": "INFO", + "message": "buffered info message", + "meta": Object { + "some": "value", + }, + "pid": Any, +} `; exports[`flushes memory buffer logger and switches to real logger once config is provided: new messages 1`] = ` -Array [ - Array [ - "{\\"@timestamp\\":\\"2012-02-01T00:00:00.000Z\\",\\"context\\":\\"test.context\\",\\"level\\":\\"INFO\\",\\"message\\":\\"some new info message\\"}", - ], -] +Object { + "@timestamp": "2012-02-01T00:00:00.000Z", + "context": "test.context", + "level": "INFO", + "message": "some new info message", + "pid": Any, +} `; exports[`uses \`root\` logger if context is not specified. 1`] = ` @@ -63,32 +77,31 @@ Array [ `; exports[`uses default memory buffer logger until config is provided 1`] = ` -Array [ - Array [ - Object { - "context": "test.context", - "level": LogLevel { - "id": "trace", - "value": 7, - }, - "message": "trace message", - "meta": undefined, - "timestamp": 2012-02-01T00:00:00.000Z, - }, - ], - Array [ - Object { - "context": "test.context2", - "level": LogLevel { - "id": "fatal", - "value": 2, - }, - "message": "fatal message", - "meta": Object { - "some": "value", - }, - "timestamp": 2012-02-01T00:00:00.000Z, - }, - ], -] +Object { + "context": "test.context", + "level": LogLevel { + "id": "trace", + "value": 7, + }, + "message": "trace message", + "meta": undefined, + "pid": Any, + "timestamp": 2012-02-01T00:00:00.000Z, +} +`; + +exports[`uses default memory buffer logger until config is provided 2`] = ` +Object { + "context": "test.context2", + "level": LogLevel { + "id": "fatal", + "value": 2, + }, + "message": "fatal message", + "meta": Object { + "some": "value", + }, + "pid": Any, + "timestamp": 2012-02-01T00:00:00.000Z, +} `; diff --git a/src/core/server/logging/appenders/buffer/buffer_appender.test.ts b/src/core/server/logging/appenders/buffer/buffer_appender.test.ts index 453a29271c582..49d70db8d5d43 100644 --- a/src/core/server/logging/appenders/buffer/buffer_appender.test.ts +++ b/src/core/server/logging/appenders/buffer/buffer_appender.test.ts @@ -34,12 +34,14 @@ test('`flush()` returns all appended records and cleans internal buffer.', () => level: LogLevel.All, message: 'message-1', timestamp: new Date(), + pid: 5355, }, { context: 'context-2', level: LogLevel.Trace, message: 'message-2', timestamp: new Date(), + pid: 5355, }, ]; @@ -64,6 +66,7 @@ test('`dispose()` flushes internal buffer.', async () => { level: LogLevel.All, message: 'message-1', timestamp: new Date(), + pid: 5355, }); await appender.dispose(); diff --git a/src/core/server/logging/appenders/console/console_appender.test.ts b/src/core/server/logging/appenders/console/console_appender.test.ts index 364f0be7fadc3..6e30df1cfb65c 100644 --- a/src/core/server/logging/appenders/console/console_appender.test.ts +++ b/src/core/server/logging/appenders/console/console_appender.test.ts @@ -59,12 +59,14 @@ test('`append()` correctly formats records and pushes them to console.', () => { level: LogLevel.All, message: 'message-1', timestamp: new Date(), + pid: 5355, }, { context: 'context-2', level: LogLevel.Trace, message: 'message-2', timestamp: new Date(), + pid: 5355, }, { context: 'context-3', @@ -72,6 +74,7 @@ test('`append()` correctly formats records and pushes them to console.', () => { level: LogLevel.Fatal, message: 'message-3', timestamp: new Date(), + pid: 5355, }, ]; diff --git a/src/core/server/logging/appenders/file/file_appender.test.ts b/src/core/server/logging/appenders/file/file_appender.test.ts index fccca629f7d60..0483a06b199b6 100644 --- a/src/core/server/logging/appenders/file/file_appender.test.ts +++ b/src/core/server/logging/appenders/file/file_appender.test.ts @@ -70,6 +70,7 @@ test('file stream is created only once and only after first `append()` is called level: LogLevel.All, message: 'message-1', timestamp: new Date(), + pid: 5355, }); expect(mockCreateWriteStream).toHaveBeenCalledTimes(1); @@ -84,6 +85,7 @@ test('file stream is created only once and only after first `append()` is called level: LogLevel.All, message: 'message-2', timestamp: new Date(), + pid: 5355, }); expect(mockCreateWriteStream).not.toHaveBeenCalled(); @@ -99,12 +101,14 @@ test('`append()` correctly formats records and pushes them to the file.', () => level: LogLevel.All, message: 'message-1', timestamp: new Date(), + pid: 5355, }, { context: 'context-2', level: LogLevel.Trace, message: 'message-2', timestamp: new Date(), + pid: 5355, }, { context: 'context-3', @@ -112,6 +116,7 @@ test('`append()` correctly formats records and pushes them to the file.', () => level: LogLevel.Fatal, message: 'message-3', timestamp: new Date(), + pid: 5355, }, ]; @@ -160,6 +165,7 @@ test('`dispose()` closes stream.', async () => { level: LogLevel.All, message: 'message-1', timestamp: new Date(), + pid: 5355, }); await appender.dispose(); diff --git a/src/core/server/logging/layouts/__snapshots__/json_layout.test.ts.snap b/src/core/server/logging/layouts/__snapshots__/json_layout.test.ts.snap index d95c3893aa3d8..21cf4302c49dc 100644 --- a/src/core/server/logging/layouts/__snapshots__/json_layout.test.ts.snap +++ b/src/core/server/logging/layouts/__snapshots__/json_layout.test.ts.snap @@ -1,13 +1,13 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`\`format()\` correctly formats record. 1`] = `"{\\"@timestamp\\":\\"2012-02-01T00:00:00.000Z\\",\\"context\\":\\"context-1\\",\\"error\\":{\\"message\\":\\"Some error message\\",\\"name\\":\\"Some error name\\",\\"stack\\":\\"Some error stack\\"},\\"level\\":\\"FATAL\\",\\"message\\":\\"message-1\\"}"`; +exports[`\`format()\` correctly formats record. 1`] = `"{\\"@timestamp\\":\\"2012-02-01T00:00:00.000Z\\",\\"context\\":\\"context-1\\",\\"error\\":{\\"message\\":\\"Some error message\\",\\"name\\":\\"Some error name\\",\\"stack\\":\\"Some error stack\\"},\\"level\\":\\"FATAL\\",\\"message\\":\\"message-1\\",\\"pid\\":5355}"`; -exports[`\`format()\` correctly formats record. 2`] = `"{\\"@timestamp\\":\\"2012-02-01T00:00:00.000Z\\",\\"context\\":\\"context-2\\",\\"level\\":\\"ERROR\\",\\"message\\":\\"message-2\\"}"`; +exports[`\`format()\` correctly formats record. 2`] = `"{\\"@timestamp\\":\\"2012-02-01T00:00:00.000Z\\",\\"context\\":\\"context-2\\",\\"level\\":\\"ERROR\\",\\"message\\":\\"message-2\\",\\"pid\\":5355}"`; -exports[`\`format()\` correctly formats record. 3`] = `"{\\"@timestamp\\":\\"2012-02-01T00:00:00.000Z\\",\\"context\\":\\"context-3\\",\\"level\\":\\"WARN\\",\\"message\\":\\"message-3\\"}"`; +exports[`\`format()\` correctly formats record. 3`] = `"{\\"@timestamp\\":\\"2012-02-01T00:00:00.000Z\\",\\"context\\":\\"context-3\\",\\"level\\":\\"WARN\\",\\"message\\":\\"message-3\\",\\"pid\\":5355}"`; -exports[`\`format()\` correctly formats record. 4`] = `"{\\"@timestamp\\":\\"2012-02-01T00:00:00.000Z\\",\\"context\\":\\"context-4\\",\\"level\\":\\"DEBUG\\",\\"message\\":\\"message-4\\"}"`; +exports[`\`format()\` correctly formats record. 4`] = `"{\\"@timestamp\\":\\"2012-02-01T00:00:00.000Z\\",\\"context\\":\\"context-4\\",\\"level\\":\\"DEBUG\\",\\"message\\":\\"message-4\\",\\"pid\\":5355}"`; -exports[`\`format()\` correctly formats record. 5`] = `"{\\"@timestamp\\":\\"2012-02-01T00:00:00.000Z\\",\\"context\\":\\"context-5\\",\\"level\\":\\"INFO\\",\\"message\\":\\"message-5\\"}"`; +exports[`\`format()\` correctly formats record. 5`] = `"{\\"@timestamp\\":\\"2012-02-01T00:00:00.000Z\\",\\"context\\":\\"context-5\\",\\"level\\":\\"INFO\\",\\"message\\":\\"message-5\\",\\"pid\\":5355}"`; -exports[`\`format()\` correctly formats record. 6`] = `"{\\"@timestamp\\":\\"2012-02-01T00:00:00.000Z\\",\\"context\\":\\"context-6\\",\\"level\\":\\"TRACE\\",\\"message\\":\\"message-6\\"}"`; +exports[`\`format()\` correctly formats record. 6`] = `"{\\"@timestamp\\":\\"2012-02-01T00:00:00.000Z\\",\\"context\\":\\"context-6\\",\\"level\\":\\"TRACE\\",\\"message\\":\\"message-6\\",\\"pid\\":5355}"`; diff --git a/src/core/server/logging/layouts/__snapshots__/pattern_layout.test.ts.snap b/src/core/server/logging/layouts/__snapshots__/pattern_layout.test.ts.snap index b727fc3c478ff..9ff4f7445d043 100644 --- a/src/core/server/logging/layouts/__snapshots__/pattern_layout.test.ts.snap +++ b/src/core/server/logging/layouts/__snapshots__/pattern_layout.test.ts.snap @@ -35,3 +35,15 @@ exports[`\`format()\` correctly formats record with highlighting. 4`] = `"[2012- exports[`\`format()\` correctly formats record with highlighting. 5`] = `"[2012-02-01T00:00:00.000Z][INFO ][context-5] message-5"`; exports[`\`format()\` correctly formats record with highlighting. 6`] = `"[2012-02-01T00:00:00.000Z][TRACE][context-6] message-6"`; + +exports[`allows specifying the PID in custom pattern 1`] = `"5355-context-1-Some error stack"`; + +exports[`allows specifying the PID in custom pattern 2`] = `"5355-context-2-message-2"`; + +exports[`allows specifying the PID in custom pattern 3`] = `"5355-context-3-message-3"`; + +exports[`allows specifying the PID in custom pattern 4`] = `"5355-context-4-message-4"`; + +exports[`allows specifying the PID in custom pattern 5`] = `"5355-context-5-message-5"`; + +exports[`allows specifying the PID in custom pattern 6`] = `"5355-context-6-message-6"`; diff --git a/src/core/server/logging/layouts/json_layout.test.ts b/src/core/server/logging/layouts/json_layout.test.ts index 49b8ddef07a63..2e4c5af80dd2e 100644 --- a/src/core/server/logging/layouts/json_layout.test.ts +++ b/src/core/server/logging/layouts/json_layout.test.ts @@ -32,36 +32,42 @@ const records: LogRecord[] = [ level: LogLevel.Fatal, message: 'message-1', timestamp: new Date(Date.UTC(2012, 1, 1)), + pid: 5355, }, { context: 'context-2', level: LogLevel.Error, message: 'message-2', timestamp: new Date(Date.UTC(2012, 1, 1)), + pid: 5355, }, { context: 'context-3', level: LogLevel.Warn, message: 'message-3', timestamp: new Date(Date.UTC(2012, 1, 1)), + pid: 5355, }, { context: 'context-4', level: LogLevel.Debug, message: 'message-4', timestamp: new Date(Date.UTC(2012, 1, 1)), + pid: 5355, }, { context: 'context-5', level: LogLevel.Info, message: 'message-5', timestamp: new Date(Date.UTC(2012, 1, 1)), + pid: 5355, }, { context: 'context-6', level: LogLevel.Trace, message: 'message-6', timestamp: new Date(Date.UTC(2012, 1, 1)), + pid: 5355, }, ]; diff --git a/src/core/server/logging/layouts/json_layout.ts b/src/core/server/logging/layouts/json_layout.ts index 1dcc3fc3ebcf6..8e90b2f7eb782 100644 --- a/src/core/server/logging/layouts/json_layout.ts +++ b/src/core/server/logging/layouts/json_layout.ts @@ -58,6 +58,7 @@ export class JsonLayout implements Layout { level: record.level.id.toUpperCase(), message: record.message, meta: record.meta, + pid: record.pid, }); } } diff --git a/src/core/server/logging/layouts/pattern_layout.test.ts b/src/core/server/logging/layouts/pattern_layout.test.ts index ae8b39b9cc99a..23656c5d20510 100644 --- a/src/core/server/logging/layouts/pattern_layout.test.ts +++ b/src/core/server/logging/layouts/pattern_layout.test.ts @@ -33,36 +33,42 @@ const records: LogRecord[] = [ level: LogLevel.Fatal, message: 'message-1', timestamp: new Date(Date.UTC(2012, 1, 1)), + pid: 5355, }, { context: 'context-2', level: LogLevel.Error, message: 'message-2', timestamp: new Date(Date.UTC(2012, 1, 1)), + pid: 5355, }, { context: 'context-3', level: LogLevel.Warn, message: 'message-3', timestamp: new Date(Date.UTC(2012, 1, 1)), + pid: 5355, }, { context: 'context-4', level: LogLevel.Debug, message: 'message-4', timestamp: new Date(Date.UTC(2012, 1, 1)), + pid: 5355, }, { context: 'context-5', level: LogLevel.Info, message: 'message-5', timestamp: new Date(Date.UTC(2012, 1, 1)), + pid: 5355, }, { context: 'context-6', level: LogLevel.Trace, message: 'message-6', timestamp: new Date(Date.UTC(2012, 1, 1)), + pid: 5355, }, ]; @@ -119,3 +125,11 @@ test('`format()` correctly formats record with highlighting.', () => { expect(layout.format(record)).toMatchSnapshot(); } }); + +test('allows specifying the PID in custom pattern', () => { + const layout = new PatternLayout('{pid}-{context}-{message}'); + + for (const record of records) { + expect(layout.format(record)).toMatchSnapshot(); + } +}); diff --git a/src/core/server/logging/layouts/pattern_layout.ts b/src/core/server/logging/layouts/pattern_layout.ts index 8be47dbcdd095..64424c02268ff 100644 --- a/src/core/server/logging/layouts/pattern_layout.ts +++ b/src/core/server/logging/layouts/pattern_layout.ts @@ -32,6 +32,7 @@ const Parameters = Object.freeze({ Level: '{level}', Message: '{message}', Timestamp: '{timestamp}', + Pid: '{pid}', }); /** @@ -39,7 +40,7 @@ const Parameters = Object.freeze({ * with the actual data. */ const PATTERN_REGEX = new RegExp( - `${Parameters.Timestamp}|${Parameters.Level}|${Parameters.Context}|${Parameters.Message}`, + `${Parameters.Timestamp}|${Parameters.Level}|${Parameters.Context}|${Parameters.Message}|${Parameters.Pid}`, 'gi' ); @@ -103,6 +104,7 @@ export class PatternLayout implements Layout { [Parameters.Level, record.level.id.toUpperCase().padEnd(5)], [Parameters.Context, record.context], [Parameters.Message, message], + [Parameters.Pid, String(record.pid)], ]); if (this.highlight) { diff --git a/src/core/server/logging/log_record.ts b/src/core/server/logging/log_record.ts index e7f93f7fc3e14..6286d751bf41f 100644 --- a/src/core/server/logging/log_record.ts +++ b/src/core/server/logging/log_record.ts @@ -30,4 +30,5 @@ export interface LogRecord { message: string; error?: Error; meta?: { [name: string]: any }; + pid: number; } diff --git a/src/core/server/logging/logger.test.ts b/src/core/server/logging/logger.test.ts index 026e24fc5df54..1cc00a254300b 100644 --- a/src/core/server/logging/logger.test.ts +++ b/src/core/server/logging/logger.test.ts @@ -53,6 +53,7 @@ test('`trace()` correctly forms `LogRecord` and passes it to all appenders.', () message: 'message-1', meta: undefined, timestamp, + pid: expect.any(Number), }); } @@ -66,6 +67,7 @@ test('`trace()` correctly forms `LogRecord` and passes it to all appenders.', () message: 'message-2', meta: { trace: true }, timestamp, + pid: expect.any(Number), }); } }); @@ -81,6 +83,7 @@ test('`debug()` correctly forms `LogRecord` and passes it to all appenders.', () message: 'message-1', meta: undefined, timestamp, + pid: expect.any(Number), }); } @@ -94,6 +97,7 @@ test('`debug()` correctly forms `LogRecord` and passes it to all appenders.', () message: 'message-2', meta: { debug: true }, timestamp, + pid: expect.any(Number), }); } }); @@ -109,6 +113,7 @@ test('`info()` correctly forms `LogRecord` and passes it to all appenders.', () message: 'message-1', meta: undefined, timestamp, + pid: expect.any(Number), }); } @@ -122,6 +127,7 @@ test('`info()` correctly forms `LogRecord` and passes it to all appenders.', () message: 'message-2', meta: { info: true }, timestamp, + pid: expect.any(Number), }); } }); @@ -137,6 +143,7 @@ test('`warn()` correctly forms `LogRecord` and passes it to all appenders.', () message: 'message-1', meta: undefined, timestamp, + pid: expect.any(Number), }); } @@ -151,6 +158,7 @@ test('`warn()` correctly forms `LogRecord` and passes it to all appenders.', () message: 'message-2', meta: undefined, timestamp, + pid: expect.any(Number), }); } @@ -164,6 +172,7 @@ test('`warn()` correctly forms `LogRecord` and passes it to all appenders.', () message: 'message-3', meta: { warn: true }, timestamp, + pid: expect.any(Number), }); } }); @@ -179,6 +188,7 @@ test('`error()` correctly forms `LogRecord` and passes it to all appenders.', () message: 'message-1', meta: undefined, timestamp, + pid: expect.any(Number), }); } @@ -193,6 +203,7 @@ test('`error()` correctly forms `LogRecord` and passes it to all appenders.', () message: 'message-2', meta: undefined, timestamp, + pid: expect.any(Number), }); } @@ -206,6 +217,7 @@ test('`error()` correctly forms `LogRecord` and passes it to all appenders.', () message: 'message-3', meta: { error: true }, timestamp, + pid: expect.any(Number), }); } }); @@ -221,6 +233,7 @@ test('`fatal()` correctly forms `LogRecord` and passes it to all appenders.', () message: 'message-1', meta: undefined, timestamp, + pid: expect.any(Number), }); } @@ -235,6 +248,7 @@ test('`fatal()` correctly forms `LogRecord` and passes it to all appenders.', () message: 'message-2', meta: undefined, timestamp, + pid: expect.any(Number), }); } @@ -248,6 +262,7 @@ test('`fatal()` correctly forms `LogRecord` and passes it to all appenders.', () message: 'message-3', meta: { fatal: true }, timestamp, + pid: expect.any(Number), }); } }); @@ -258,6 +273,7 @@ test('`log()` just passes the record to all appenders.', () => { level: LogLevel.Info, message: 'message-1', timestamp, + pid: 5355, }; logger.log(record); @@ -307,6 +323,7 @@ test('logger with `All` level passes all records to appenders.', () => { level: LogLevel.Trace, message: 'trace-message', timestamp, + pid: expect.any(Number), }); } @@ -318,6 +335,7 @@ test('logger with `All` level passes all records to appenders.', () => { level: LogLevel.Debug, message: 'debug-message', timestamp, + pid: expect.any(Number), }); } @@ -329,6 +347,7 @@ test('logger with `All` level passes all records to appenders.', () => { level: LogLevel.Info, message: 'info-message', timestamp, + pid: expect.any(Number), }); } @@ -340,6 +359,7 @@ test('logger with `All` level passes all records to appenders.', () => { level: LogLevel.Warn, message: 'warn-message', timestamp, + pid: expect.any(Number), }); } @@ -351,6 +371,7 @@ test('logger with `All` level passes all records to appenders.', () => { level: LogLevel.Error, message: 'error-message', timestamp, + pid: expect.any(Number), }); } @@ -362,6 +383,7 @@ test('logger with `All` level passes all records to appenders.', () => { level: LogLevel.Fatal, message: 'fatal-message', timestamp, + pid: expect.any(Number), }); } }); @@ -385,6 +407,7 @@ test('passes log record to appenders only if log level is supported.', () => { level: LogLevel.Warn, message: 'warn-message', timestamp, + pid: expect.any(Number), }); } @@ -396,6 +419,7 @@ test('passes log record to appenders only if log level is supported.', () => { level: LogLevel.Error, message: 'error-message', timestamp, + pid: expect.any(Number), }); } @@ -407,6 +431,7 @@ test('passes log record to appenders only if log level is supported.', () => { level: LogLevel.Fatal, message: 'fatal-message', timestamp, + pid: expect.any(Number), }); } }); diff --git a/src/core/server/logging/logger.ts b/src/core/server/logging/logger.ts index ac79c1916c07b..285998c23832c 100644 --- a/src/core/server/logging/logger.ts +++ b/src/core/server/logging/logger.ts @@ -162,6 +162,7 @@ export class BaseLogger implements Logger { message: errorOrMessage.message, meta, timestamp: new Date(), + pid: process.pid, }; } @@ -171,6 +172,7 @@ export class BaseLogger implements Logger { message: errorOrMessage, meta, timestamp: new Date(), + pid: process.pid, }; } } diff --git a/src/core/server/logging/logging_service.test.ts b/src/core/server/logging/logging_service.test.ts index c58103cca5f8d..51697fd15bebe 100644 --- a/src/core/server/logging/logging_service.test.ts +++ b/src/core/server/logging/logging_service.test.ts @@ -23,6 +23,8 @@ jest.mock('fs', () => ({ createWriteStream: jest.fn(() => ({ write: mockStreamWrite })), })); +const dynamicProps = { pid: expect.any(Number) }; + jest.mock('../../../legacy/server/logging/rotate', () => ({ setupLoggingRotate: jest.fn().mockImplementation(() => Promise.resolve({})), })); @@ -58,7 +60,9 @@ test('uses default memory buffer logger until config is provided', () => { const anotherLogger = service.get('test', 'context2'); anotherLogger.fatal('fatal message', { some: 'value' }); - expect(bufferAppendSpy.mock.calls).toMatchSnapshot(); + expect(bufferAppendSpy).toHaveBeenCalledTimes(2); + expect(bufferAppendSpy.mock.calls[0][0]).toMatchSnapshot(dynamicProps); + expect(bufferAppendSpy.mock.calls[1][0]).toMatchSnapshot(dynamicProps); }); test('flushes memory buffer logger and switches to real logger once config is provided', () => { @@ -78,12 +82,15 @@ test('flushes memory buffer logger and switches to real logger once config is pr }) ); - expect(mockConsoleLog.mock.calls).toMatchSnapshot('buffered messages'); + expect(JSON.parse(mockConsoleLog.mock.calls[0][0])).toMatchSnapshot( + dynamicProps, + 'buffered messages' + ); mockConsoleLog.mockClear(); // Now message should go straight to thew newly configured appender, not buffered one. logger.info('some new info message'); - expect(mockConsoleLog.mock.calls).toMatchSnapshot('new messages'); + expect(JSON.parse(mockConsoleLog.mock.calls[0][0])).toMatchSnapshot(dynamicProps, 'new messages'); expect(bufferAppendSpy).not.toHaveBeenCalled(); }); @@ -114,8 +121,12 @@ test('appends records via multiple appenders.', () => { ); // Now all logs should added to configured appenders. - expect(mockConsoleLog.mock.calls).toMatchSnapshot('console logs'); - expect(mockStreamWrite.mock.calls).toMatchSnapshot('file logs'); + expect(mockConsoleLog).toHaveBeenCalledTimes(1); + expect(mockConsoleLog.mock.calls[0][0]).toMatchSnapshot('console logs'); + + expect(mockStreamWrite).toHaveBeenCalledTimes(2); + expect(mockStreamWrite.mock.calls[0][0]).toMatchSnapshot('file logs'); + expect(mockStreamWrite.mock.calls[1][0]).toMatchSnapshot('file logs'); }); test('uses `root` logger if context is not specified.', () => { @@ -163,5 +174,9 @@ test('asLoggerFactory() only allows to create new loggers.', () => { logger.fatal('buffered fatal message'); expect(Object.keys(service.asLoggerFactory())).toEqual(['get']); - expect(mockConsoleLog.mock.calls).toMatchSnapshot(); + + expect(mockConsoleLog).toHaveBeenCalledTimes(3); + expect(JSON.parse(mockConsoleLog.mock.calls[0][0])).toMatchSnapshot(dynamicProps); + expect(JSON.parse(mockConsoleLog.mock.calls[1][0])).toMatchSnapshot(dynamicProps); + expect(JSON.parse(mockConsoleLog.mock.calls[2][0])).toMatchSnapshot(dynamicProps); }); diff --git a/src/core/server/server.api.md b/src/core/server/server.api.md index 0a98c44cf58f5..cf8fafd7ea7c4 100644 --- a/src/core/server/server.api.md +++ b/src/core/server/server.api.md @@ -1102,6 +1102,8 @@ export interface LogRecord { [name: string]: any; }; // (undocumented) + pid: number; + // (undocumented) timestamp: Date; } From 91c9652e6389e609f391b149999d372cc675b35c Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Thu, 6 Feb 2020 16:17:42 +0100 Subject: [PATCH 66/86] Move oss telemetry service into NP (#56481) --- x-pack/index.js | 2 - x-pack/legacy/plugins/oss_telemetry/index.ts | 53 ----------------- .../server/lib/collectors/index.ts | 12 ---- .../plugins/oss_telemetry/server/plugin.ts | 59 ------------------- .../plugins/oss_telemetry/constants.ts | 0 x-pack/plugins/oss_telemetry/kibana.json | 8 +++ x-pack/plugins/oss_telemetry/server/index.ts | 12 ++++ .../server/lib/collectors/index.ts | 16 +++++ .../get_usage_collector.test.ts | 42 +++++++------ .../visualizations/get_usage_collector.ts | 34 ++--------- .../register_usage_collector.ts | 4 +- .../server/lib/get_next_midnight.test.ts | 0 .../server/lib/get_next_midnight.ts | 0 .../oss_telemetry/server/lib/tasks/index.ts | 43 +++++--------- .../tasks/visualizations/task_runner.test.ts | 4 +- .../lib/tasks/visualizations/task_runner.ts | 13 ++-- x-pack/plugins/oss_telemetry/server/plugin.ts | 53 +++++++++++++++++ .../oss_telemetry/server}/test_utils/index.ts | 9 ++- 18 files changed, 146 insertions(+), 218 deletions(-) delete mode 100644 x-pack/legacy/plugins/oss_telemetry/index.ts delete mode 100644 x-pack/legacy/plugins/oss_telemetry/server/lib/collectors/index.ts delete mode 100644 x-pack/legacy/plugins/oss_telemetry/server/plugin.ts rename x-pack/{legacy => }/plugins/oss_telemetry/constants.ts (100%) create mode 100644 x-pack/plugins/oss_telemetry/kibana.json create mode 100644 x-pack/plugins/oss_telemetry/server/index.ts create mode 100644 x-pack/plugins/oss_telemetry/server/lib/collectors/index.ts rename x-pack/{legacy => }/plugins/oss_telemetry/server/lib/collectors/visualizations/get_usage_collector.test.ts (63%) rename x-pack/{legacy => }/plugins/oss_telemetry/server/lib/collectors/visualizations/get_usage_collector.ts (58%) rename x-pack/{legacy => }/plugins/oss_telemetry/server/lib/collectors/visualizations/register_usage_collector.ts (81%) rename x-pack/{legacy => }/plugins/oss_telemetry/server/lib/get_next_midnight.test.ts (100%) rename x-pack/{legacy => }/plugins/oss_telemetry/server/lib/get_next_midnight.ts (100%) rename x-pack/{legacy => }/plugins/oss_telemetry/server/lib/tasks/index.ts (54%) rename x-pack/{legacy => }/plugins/oss_telemetry/server/lib/tasks/visualizations/task_runner.test.ts (97%) rename x-pack/{legacy => }/plugins/oss_telemetry/server/lib/tasks/visualizations/task_runner.ts (84%) create mode 100644 x-pack/plugins/oss_telemetry/server/plugin.ts rename x-pack/{legacy/plugins/oss_telemetry => plugins/oss_telemetry/server}/test_utils/index.ts (92%) diff --git a/x-pack/index.js b/x-pack/index.js index e2d25ce87b26b..ecb71f26c1609 100644 --- a/x-pack/index.js +++ b/x-pack/index.js @@ -32,7 +32,6 @@ import { remoteClusters } from './legacy/plugins/remote_clusters'; import { crossClusterReplication } from './legacy/plugins/cross_cluster_replication'; import { upgradeAssistant } from './legacy/plugins/upgrade_assistant'; import { uptime } from './legacy/plugins/uptime'; -import { ossTelemetry } from './legacy/plugins/oss_telemetry'; import { fileUpload } from './legacy/plugins/file_upload'; import { encryptedSavedObjects } from './legacy/plugins/encrypted_saved_objects'; import { snapshotRestore } from './legacy/plugins/snapshot_restore'; @@ -73,7 +72,6 @@ module.exports = function(kibana) { crossClusterReplication(kibana), upgradeAssistant(kibana), uptime(kibana), - ossTelemetry(kibana), fileUpload(kibana), encryptedSavedObjects(kibana), lens(kibana), diff --git a/x-pack/legacy/plugins/oss_telemetry/index.ts b/x-pack/legacy/plugins/oss_telemetry/index.ts deleted file mode 100644 index fce861c7d3f46..0000000000000 --- a/x-pack/legacy/plugins/oss_telemetry/index.ts +++ /dev/null @@ -1,53 +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; - * you may not use this file except in compliance with the Elastic License. - */ - -import { Logger, PluginInitializerContext, CoreStart } from 'kibana/server'; -import { Legacy } from 'kibana'; -import { PLUGIN_ID } from './constants'; -import { OssTelemetryPlugin } from './server/plugin'; -import { LegacyPluginInitializer } from '../../../../src/legacy/plugin_discovery/types'; -import { getTaskManagerSetup, getTaskManagerStart } from '../task_manager/server'; - -export const ossTelemetry: LegacyPluginInitializer = kibana => { - return new kibana.Plugin({ - id: PLUGIN_ID, - require: ['elasticsearch', 'xpack_main'], - configPrefix: 'xpack.oss_telemetry', - - init(server: Legacy.Server) { - const plugin = new OssTelemetryPlugin({ - logger: { - get: () => - ({ - info: (message: string) => server.log(['info', 'task_manager'], message), - debug: (message: string) => server.log(['debug', 'task_manager'], message), - warn: (message: string) => server.log(['warn', 'task_manager'], message), - error: (message: string) => server.log(['error', 'task_manager'], message), - } as Logger), - }, - } as PluginInitializerContext); - - const deps = { - usageCollection: server.newPlatform.setup.plugins.usageCollection, - __LEGACY: { - config: server.config(), - xpackMainStatus: ((server.plugins.xpack_main as unknown) as { status: any }).status - .plugin, - }, - }; - - plugin.setup(server.newPlatform.setup.core, { - ...deps, - taskManager: getTaskManagerSetup(server), - }); - - plugin.start((server.newPlatform.setup.core as unknown) as CoreStart, { - ...deps, - taskManager: getTaskManagerStart(server), - }); - }, - }); -}; diff --git a/x-pack/legacy/plugins/oss_telemetry/server/lib/collectors/index.ts b/x-pack/legacy/plugins/oss_telemetry/server/lib/collectors/index.ts deleted file mode 100644 index 9d547c1b22099..0000000000000 --- a/x-pack/legacy/plugins/oss_telemetry/server/lib/collectors/index.ts +++ /dev/null @@ -1,12 +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; - * you may not use this file except in compliance with the Elastic License. - */ - -import { registerVisualizationsCollector } from './visualizations/register_usage_collector'; -import { OssTelemetryStartDependencies } from '../../plugin'; - -export function registerCollectors(deps: OssTelemetryStartDependencies) { - registerVisualizationsCollector(deps.usageCollection, deps.taskManager); -} diff --git a/x-pack/legacy/plugins/oss_telemetry/server/plugin.ts b/x-pack/legacy/plugins/oss_telemetry/server/plugin.ts deleted file mode 100644 index 0aac319cf5818..0000000000000 --- a/x-pack/legacy/plugins/oss_telemetry/server/plugin.ts +++ /dev/null @@ -1,59 +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; - * you may not use this file except in compliance with the Elastic License. - */ - -import { CoreSetup, CoreStart, Logger, Plugin, PluginInitializerContext } from 'kibana/server'; -import { - TaskManagerSetupContract, - TaskManagerStartContract, -} from '../../../../plugins/task_manager/server'; -import { registerCollectors } from './lib/collectors'; -import { registerTasks, scheduleTasks } from './lib/tasks'; -import KbnServer from '../../../../../src/legacy/server/kbn_server'; -import { UsageCollectionSetup } from '../../../../../src/plugins/usage_collection/server'; - -export interface LegacyConfig { - get: (key: string) => string | number | boolean; -} - -interface OssTelemetryDependencies { - usageCollection: UsageCollectionSetup; - __LEGACY: { - config: LegacyConfig; - xpackMainStatus: { kbnServer: KbnServer }; - }; -} -export interface OssTelemetrySetupDependencies extends OssTelemetryDependencies { - taskManager?: TaskManagerSetupContract; -} -export interface OssTelemetryStartDependencies extends OssTelemetryDependencies { - taskManager?: TaskManagerStartContract; -} - -export class OssTelemetryPlugin implements Plugin { - private logger: Logger; - - constructor(initializerContext: PluginInitializerContext) { - this.logger = initializerContext.logger.get(); - } - - public setup(core: CoreSetup, deps: OssTelemetrySetupDependencies) { - registerTasks({ - taskManager: deps.taskManager, - logger: this.logger, - elasticsearch: core.elasticsearch, - config: deps.__LEGACY.config, - }); - } - - public start(core: CoreStart, deps: OssTelemetryStartDependencies) { - registerCollectors(deps); - scheduleTasks({ - taskManager: deps.taskManager, - xpackMainStatus: deps.__LEGACY.xpackMainStatus, - logger: this.logger, - }); - } -} diff --git a/x-pack/legacy/plugins/oss_telemetry/constants.ts b/x-pack/plugins/oss_telemetry/constants.ts similarity index 100% rename from x-pack/legacy/plugins/oss_telemetry/constants.ts rename to x-pack/plugins/oss_telemetry/constants.ts diff --git a/x-pack/plugins/oss_telemetry/kibana.json b/x-pack/plugins/oss_telemetry/kibana.json new file mode 100644 index 0000000000000..d83894f7c44a3 --- /dev/null +++ b/x-pack/plugins/oss_telemetry/kibana.json @@ -0,0 +1,8 @@ +{ + "id": "ossTelemetry", + "server": true, + "version": "8.0.0", + "kibanaVersion": "kibana", + "requiredPlugins": ["usageCollection", "taskManager"], + "ui": false +} diff --git a/x-pack/plugins/oss_telemetry/server/index.ts b/x-pack/plugins/oss_telemetry/server/index.ts new file mode 100644 index 0000000000000..64527ca6daa7e --- /dev/null +++ b/x-pack/plugins/oss_telemetry/server/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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { PluginInitializerContext } from 'src/core/server'; +import { OssTelemetryPlugin } from './plugin'; + +export const plugin = (context: PluginInitializerContext) => new OssTelemetryPlugin(context); + +export * from './plugin'; diff --git a/x-pack/plugins/oss_telemetry/server/lib/collectors/index.ts b/x-pack/plugins/oss_telemetry/server/lib/collectors/index.ts new file mode 100644 index 0000000000000..845e11b80af0e --- /dev/null +++ b/x-pack/plugins/oss_telemetry/server/lib/collectors/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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { registerVisualizationsCollector } from './visualizations/register_usage_collector'; +import { UsageCollectionSetup } from '../../../../../../src/plugins/usage_collection/server'; +import { TaskManagerStartContract } from '../../../../task_manager/server'; + +export function registerCollectors( + usageCollection: UsageCollectionSetup, + taskManager: Promise +) { + registerVisualizationsCollector(usageCollection, taskManager); +} diff --git a/x-pack/legacy/plugins/oss_telemetry/server/lib/collectors/visualizations/get_usage_collector.test.ts b/x-pack/plugins/oss_telemetry/server/lib/collectors/visualizations/get_usage_collector.test.ts similarity index 63% rename from x-pack/legacy/plugins/oss_telemetry/server/lib/collectors/visualizations/get_usage_collector.test.ts rename to x-pack/plugins/oss_telemetry/server/lib/collectors/visualizations/get_usage_collector.test.ts index ce106d1a64fd6..43114787b40e5 100644 --- a/x-pack/legacy/plugins/oss_telemetry/server/lib/collectors/visualizations/get_usage_collector.test.ts +++ b/x-pack/plugins/oss_telemetry/server/lib/collectors/visualizations/get_usage_collector.test.ts @@ -8,13 +8,15 @@ import { getMockTaskFetch, getMockThrowingTaskFetch, getMockTaskInstance, -} from '../../../../test_utils'; -import { taskManagerMock } from '../../../../../../../plugins/task_manager/server/task_manager.mock'; +} from '../../../test_utils'; +import { taskManagerMock } from '../../../../../task_manager/server/task_manager.mock'; import { getUsageCollector } from './get_usage_collector'; describe('getVisualizationsCollector#fetch', () => { test('can return empty stats', async () => { - const { type, fetch } = getUsageCollector(taskManagerMock.start(getMockTaskFetch())); + const { type, fetch } = getUsageCollector( + Promise.resolve(taskManagerMock.start(getMockTaskFetch())) + ); expect(type).toBe('visualization_types'); const fetchResult = await fetch(); expect(fetchResult).toEqual({}); @@ -22,17 +24,19 @@ describe('getVisualizationsCollector#fetch', () => { test('provides known stats', async () => { const { type, fetch } = getUsageCollector( - taskManagerMock.start( - getMockTaskFetch([ - getMockTaskInstance({ - state: { - runs: 1, - stats: { comic_books: { total: 16, max: 12, min: 2, avg: 6 } }, - }, - taskType: 'test', - params: {}, - }), - ]) + Promise.resolve( + taskManagerMock.start( + getMockTaskFetch([ + getMockTaskInstance({ + state: { + runs: 1, + stats: { comic_books: { total: 16, max: 12, min: 2, avg: 6 } }, + }, + taskType: 'test', + params: {}, + }), + ]) + ) ) ); expect(type).toBe('visualization_types'); @@ -43,9 +47,11 @@ describe('getVisualizationsCollector#fetch', () => { describe('Error handling', () => { test('Silently handles Task Manager NotInitialized', async () => { const { fetch } = getUsageCollector( - taskManagerMock.start( - getMockThrowingTaskFetch( - new Error('NotInitialized taskManager is still waiting for plugins to load') + Promise.resolve( + taskManagerMock.start( + getMockThrowingTaskFetch( + new Error('NotInitialized taskManager is still waiting for plugins to load') + ) ) ) ); @@ -55,7 +61,7 @@ describe('getVisualizationsCollector#fetch', () => { // In real life, the CollectorSet calls fetch and handles errors test('defers the errors', async () => { const { fetch } = getUsageCollector( - taskManagerMock.start(getMockThrowingTaskFetch(new Error('BOOM'))) + Promise.resolve(taskManagerMock.start(getMockThrowingTaskFetch(new Error('BOOM')))) ); await expect(fetch()).rejects.toThrowErrorMatchingInlineSnapshot(`"BOOM"`); }); diff --git a/x-pack/legacy/plugins/oss_telemetry/server/lib/collectors/visualizations/get_usage_collector.ts b/x-pack/plugins/oss_telemetry/server/lib/collectors/visualizations/get_usage_collector.ts similarity index 58% rename from x-pack/legacy/plugins/oss_telemetry/server/lib/collectors/visualizations/get_usage_collector.ts rename to x-pack/plugins/oss_telemetry/server/lib/collectors/visualizations/get_usage_collector.ts index bc0d10860a667..9828dea4c9393 100644 --- a/x-pack/legacy/plugins/oss_telemetry/server/lib/collectors/visualizations/get_usage_collector.ts +++ b/x-pack/plugins/oss_telemetry/server/lib/collectors/visualizations/get_usage_collector.ts @@ -6,18 +6,9 @@ import { get } from 'lodash'; import { PLUGIN_ID, VIS_TELEMETRY_TASK, VIS_USAGE_TYPE } from '../../../../constants'; -import { TaskManagerStartContract } from '../../../../../../../plugins/task_manager/server'; - -async function isTaskManagerReady(taskManager?: TaskManagerStartContract) { - const result = await fetch(taskManager); - return result !== null; -} - -async function fetch(taskManager?: TaskManagerStartContract) { - if (!taskManager) { - return null; - } +import { TaskManagerStartContract } from '../../../../../task_manager/server'; +async function fetch(taskManager: TaskManagerStartContract) { let docs; try { ({ docs } = await taskManager.fetch({ @@ -38,27 +29,12 @@ async function fetch(taskManager?: TaskManagerStartContract) { return docs; } -export function getUsageCollector(taskManager?: TaskManagerStartContract) { - let isCollectorReady = false; - async function determineIfTaskManagerIsReady() { - let isReady = false; - try { - isReady = await isTaskManagerReady(taskManager); - } catch (err) {} // eslint-disable-line - - if (isReady) { - isCollectorReady = true; - } else { - setTimeout(determineIfTaskManagerIsReady, 500); - } - } - determineIfTaskManagerIsReady(); - +export function getUsageCollector(taskManager: Promise) { return { type: VIS_USAGE_TYPE, - isReady: () => isCollectorReady, + isReady: () => true, fetch: async () => { - const docs = await fetch(taskManager); + const docs = await fetch(await taskManager); // get the accumulated state from the recurring task return get(docs, '[0].state.stats'); }, diff --git a/x-pack/legacy/plugins/oss_telemetry/server/lib/collectors/visualizations/register_usage_collector.ts b/x-pack/plugins/oss_telemetry/server/lib/collectors/visualizations/register_usage_collector.ts similarity index 81% rename from x-pack/legacy/plugins/oss_telemetry/server/lib/collectors/visualizations/register_usage_collector.ts rename to x-pack/plugins/oss_telemetry/server/lib/collectors/visualizations/register_usage_collector.ts index 657f1c725f4e0..667e8b9b875fd 100644 --- a/x-pack/legacy/plugins/oss_telemetry/server/lib/collectors/visualizations/register_usage_collector.ts +++ b/x-pack/plugins/oss_telemetry/server/lib/collectors/visualizations/register_usage_collector.ts @@ -5,12 +5,12 @@ */ import { UsageCollectionSetup } from 'src/plugins/usage_collection/server'; -import { TaskManagerStartContract } from '../../../../../../../plugins/task_manager/server'; +import { TaskManagerStartContract } from '../../../../../task_manager/server'; import { getUsageCollector } from './get_usage_collector'; export function registerVisualizationsCollector( collectorSet: UsageCollectionSetup, - taskManager?: TaskManagerStartContract + taskManager: Promise ): void { const collector = collectorSet.makeUsageCollector(getUsageCollector(taskManager)); collectorSet.registerCollector(collector); diff --git a/x-pack/legacy/plugins/oss_telemetry/server/lib/get_next_midnight.test.ts b/x-pack/plugins/oss_telemetry/server/lib/get_next_midnight.test.ts similarity index 100% rename from x-pack/legacy/plugins/oss_telemetry/server/lib/get_next_midnight.test.ts rename to x-pack/plugins/oss_telemetry/server/lib/get_next_midnight.test.ts diff --git a/x-pack/legacy/plugins/oss_telemetry/server/lib/get_next_midnight.ts b/x-pack/plugins/oss_telemetry/server/lib/get_next_midnight.ts similarity index 100% rename from x-pack/legacy/plugins/oss_telemetry/server/lib/get_next_midnight.ts rename to x-pack/plugins/oss_telemetry/server/lib/get_next_midnight.ts diff --git a/x-pack/legacy/plugins/oss_telemetry/server/lib/tasks/index.ts b/x-pack/plugins/oss_telemetry/server/lib/tasks/index.ts similarity index 54% rename from x-pack/legacy/plugins/oss_telemetry/server/lib/tasks/index.ts rename to x-pack/plugins/oss_telemetry/server/lib/tasks/index.ts index cf7295f67a231..be08338807dd0 100644 --- a/x-pack/legacy/plugins/oss_telemetry/server/lib/tasks/index.ts +++ b/x-pack/plugins/oss_telemetry/server/lib/tasks/index.ts @@ -4,16 +4,15 @@ * you may not use this file except in compliance with the Elastic License. */ +import { Observable } from 'rxjs'; import { CoreSetup, Logger } from 'kibana/server'; import { PLUGIN_ID, VIS_TELEMETRY_TASK } from '../../../constants'; import { visualizationsTaskRunner } from './visualizations/task_runner'; -import KbnServer from '../../../../../../../src/legacy/server/kbn_server'; -import { LegacyConfig } from '../../plugin'; import { TaskInstance, TaskManagerStartContract, TaskManagerSetupContract, -} from '../../../../../../plugins/task_manager/server'; +} from '../../../../task_manager/server'; export function registerTasks({ taskManager, @@ -24,7 +23,7 @@ export function registerTasks({ taskManager?: TaskManagerSetupContract; logger: Logger; elasticsearch: CoreSetup['elasticsearch']; - config: LegacyConfig; + config: Observable<{ kibana: { index: string } }>; }) { if (!taskManager) { logger.debug('Task manager is not available'); @@ -44,13 +43,11 @@ export function registerTasks({ }); } -export function scheduleTasks({ +export async function scheduleTasks({ taskManager, - xpackMainStatus, logger, }: { taskManager?: TaskManagerStartContract; - xpackMainStatus: { kbnServer: KbnServer }; logger: Logger; }) { if (!taskManager) { @@ -58,26 +55,14 @@ export function scheduleTasks({ return; } - const { kbnServer } = xpackMainStatus; - - kbnServer.afterPluginsInit(() => { - // The code block below can't await directly within "afterPluginsInit" - // callback due to circular dependency. The server isn't "ready" until - // this code block finishes. Migrations wait for server to be ready before - // executing. Saved objects repository waits for migrations to finish before - // finishing the request. To avoid this, we'll await within a separate - // function block. - (async () => { - try { - await taskManager.ensureScheduled({ - id: `${PLUGIN_ID}-${VIS_TELEMETRY_TASK}`, - taskType: VIS_TELEMETRY_TASK, - state: { stats: {}, runs: 0 }, - params: {}, - }); - } catch (e) { - logger.debug(`Error scheduling task, received ${e.message}`); - } - })(); - }); + try { + await taskManager.ensureScheduled({ + id: `${PLUGIN_ID}-${VIS_TELEMETRY_TASK}`, + taskType: VIS_TELEMETRY_TASK, + state: { stats: {}, runs: 0 }, + params: {}, + }); + } catch (e) { + logger.debug(`Error scheduling task, received ${e.message}`); + } } diff --git a/x-pack/legacy/plugins/oss_telemetry/server/lib/tasks/visualizations/task_runner.test.ts b/x-pack/plugins/oss_telemetry/server/lib/tasks/visualizations/task_runner.test.ts similarity index 97% rename from x-pack/legacy/plugins/oss_telemetry/server/lib/tasks/visualizations/task_runner.test.ts rename to x-pack/plugins/oss_telemetry/server/lib/tasks/visualizations/task_runner.test.ts index ef03e857de8ef..dff5e24db3c6e 100644 --- a/x-pack/legacy/plugins/oss_telemetry/server/lib/tasks/visualizations/task_runner.test.ts +++ b/x-pack/plugins/oss_telemetry/server/lib/tasks/visualizations/task_runner.test.ts @@ -10,9 +10,9 @@ import { getMockConfig, getMockEs, getMockTaskInstance, -} from '../../../../test_utils'; +} from '../../../test_utils'; import { visualizationsTaskRunner } from './task_runner'; -import { TaskInstance } from '../../../../../../../plugins/task_manager/server'; +import { TaskInstance } from '../../../../../task_manager/server'; describe('visualizationsTaskRunner', () => { let mockTaskInstance: TaskInstance; diff --git a/x-pack/legacy/plugins/oss_telemetry/server/lib/tasks/visualizations/task_runner.ts b/x-pack/plugins/oss_telemetry/server/lib/tasks/visualizations/task_runner.ts similarity index 84% rename from x-pack/legacy/plugins/oss_telemetry/server/lib/tasks/visualizations/task_runner.ts rename to x-pack/plugins/oss_telemetry/server/lib/tasks/visualizations/task_runner.ts index 4c7525645a2c2..556dc465e562d 100644 --- a/x-pack/legacy/plugins/oss_telemetry/server/lib/tasks/visualizations/task_runner.ts +++ b/x-pack/plugins/oss_telemetry/server/lib/tasks/visualizations/task_runner.ts @@ -4,13 +4,12 @@ * you may not use this file except in compliance with the Elastic License. */ +import { Observable } from 'rxjs'; import _, { countBy, groupBy, mapValues } from 'lodash'; import { APICaller, CoreSetup } from 'kibana/server'; import { getNextMidnight } from '../../get_next_midnight'; -import { VisState } from '../../../../../../../../src/legacy/core_plugins/visualizations/public'; -import { TaskInstance } from '../../../../../../../plugins/task_manager/server'; -import { ESSearchHit } from '../../../../../../../plugins/apm/typings/elasticsearch'; -import { LegacyConfig } from '../../../plugin'; +import { TaskInstance } from '../../../../../task_manager/server'; +import { ESSearchHit } from '../../../../../apm/typings/elasticsearch'; interface VisSummary { type: string; @@ -44,7 +43,7 @@ async function getStats(callCluster: APICaller, index: string) { const spacePhrases: string[] = hit._id.split(':'); const space = spacePhrases.length === 3 ? spacePhrases[0] : 'default'; // if in a custom space, the format of a saved object ID is space:type:id const visualization = _.get(hit, '_source.visualization', { visState: '{}' }); - const visState: VisState = JSON.parse(visualization.visState); + const visState: { type?: string } = JSON.parse(visualization.visState); return { type: visState.type || '_na_', @@ -73,17 +72,17 @@ async function getStats(callCluster: APICaller, index: string) { export function visualizationsTaskRunner( taskInstance: TaskInstance, - config: LegacyConfig, + config: Observable<{ kibana: { index: string } }>, es: CoreSetup['elasticsearch'] ) { const { callAsInternalUser: callCluster } = es.createClient('data'); - const index = config.get('kibana.index').toString(); // cast to string for TypeScript return async () => { let stats; let error; try { + const index = (await config.toPromise()).kibana.index; stats = await getStats(callCluster, index); } catch (err) { if (err.constructor === Error) { diff --git a/x-pack/plugins/oss_telemetry/server/plugin.ts b/x-pack/plugins/oss_telemetry/server/plugin.ts new file mode 100644 index 0000000000000..430fca2d39837 --- /dev/null +++ b/x-pack/plugins/oss_telemetry/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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { Observable } from 'rxjs'; +import { CoreSetup, CoreStart, Logger, Plugin, PluginInitializerContext } from 'kibana/server'; +import { TaskManagerSetupContract, TaskManagerStartContract } from '../../task_manager/server'; +import { registerCollectors } from './lib/collectors'; +import { registerTasks, scheduleTasks } from './lib/tasks'; +import { UsageCollectionSetup } from '../../../../src/plugins/usage_collection/server'; + +export interface OssTelemetrySetupDependencies { + usageCollection: UsageCollectionSetup; + taskManager: TaskManagerSetupContract; +} +export interface OssTelemetryStartDependencies { + taskManager: TaskManagerStartContract; +} + +export class OssTelemetryPlugin implements Plugin { + private readonly logger: Logger; + private readonly config: Observable<{ kibana: { index: string } }>; + + constructor(initializerContext: PluginInitializerContext) { + this.logger = initializerContext.logger.get('oss_telemetry'); + this.config = initializerContext.config.legacy.globalConfig$; + } + + public setup( + core: CoreSetup, + deps: OssTelemetrySetupDependencies + ) { + registerTasks({ + taskManager: deps.taskManager, + logger: this.logger, + elasticsearch: core.elasticsearch, + config: this.config, + }); + registerCollectors( + deps.usageCollection, + core.getStartServices().then(([_, { taskManager }]) => taskManager) + ); + } + + public start(core: CoreStart, deps: OssTelemetryStartDependencies) { + scheduleTasks({ + taskManager: deps.taskManager, + logger: this.logger, + }); + } +} diff --git a/x-pack/legacy/plugins/oss_telemetry/test_utils/index.ts b/x-pack/plugins/oss_telemetry/server/test_utils/index.ts similarity index 92% rename from x-pack/legacy/plugins/oss_telemetry/test_utils/index.ts rename to x-pack/plugins/oss_telemetry/server/test_utils/index.ts index 8a8a5d18cd5f7..fc8c98c164623 100644 --- a/x-pack/legacy/plugins/oss_telemetry/test_utils/index.ts +++ b/x-pack/plugins/oss_telemetry/server/test_utils/index.ts @@ -4,14 +4,15 @@ * you may not use this file except in compliance with the Elastic License. */ -import { APICaller, CoreSetup } from 'src/core/server'; +import { APICaller, CoreSetup } from 'kibana/server'; +import { of } from 'rxjs'; import { ConcreteTaskInstance, TaskStatus, TaskManagerStartContract, // eslint-disable-next-line @kbn/eslint/no-restricted-paths -} from '../../../../plugins/task_manager/server'; +} from '../../../task_manager/server'; export const getMockTaskInstance = ( overrides: Partial = {} @@ -74,9 +75,7 @@ export const getMockThrowingTaskFetch = ( }; export const getMockConfig = () => { - return { - get: () => '', - }; + return of({ kibana: { index: '' } }); }; export const getCluster = () => ({ From 9c5d5cbfd00bc7237fcaabd0a2618866b1fe1281 Mon Sep 17 00:00:00 2001 From: Tim Sullivan Date: Thu, 6 Feb 2020 08:41:15 -0700 Subject: [PATCH 67/86] [Reporting] Fix screenshot pipeline for multi-page (#56928) Co-authored-by: Elastic Machine --- .../export_types/common/lib/screenshots/index.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/index.ts b/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/index.ts index b83021d5e38dd..9fd3ee391ddbb 100644 --- a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/index.ts +++ b/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/index.ts @@ -5,7 +5,7 @@ */ import * as Rx from 'rxjs'; -import { first, mergeMap, toArray } from 'rxjs/operators'; +import { first, concatMap, take, toArray, mergeMap } from 'rxjs/operators'; import { ServerFacade, CaptureConfig, HeadlessChromiumDriverFactory } from '../../../../types'; import { ScreenshotResults, ScreenshotObservableOpts } from './types'; import { injectCustomCss } from './inject_css'; @@ -37,12 +37,11 @@ export function screenshotsObservableFactory( { viewport: layout.getBrowserViewport(), browserTimezone }, logger ); - return Rx.from(urls).pipe( - mergeMap(url => { + concatMap(url => { return create$.pipe( mergeMap(({ driver, exit$ }) => { - const screenshot$ = Rx.of(driver).pipe( + const screenshot$ = Rx.of(1).pipe( mergeMap(() => openUrl(driver, url, conditionalHeaders, logger)), mergeMap(() => skipTelemetry(driver, logger)), mergeMap(() => scanPage(driver, layout, logger)), @@ -85,10 +84,11 @@ export function screenshotsObservableFactory( ); return Rx.race(screenshot$, exit$); - }) + }), + first() ); }), - first(), + take(urls.length), toArray() ); }; From 90a9dc235c581a2b44151c9331cc075079430017 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20Hejman?= Date: Thu, 6 Feb 2020 16:44:10 +0100 Subject: [PATCH 68/86] Remove suid bit from Docker image files to mitigate Stack Clash (#56826) --- .../docker_generator/templates/dockerfile.template.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/dev/build/tasks/os_packages/docker_generator/templates/dockerfile.template.js b/src/dev/build/tasks/os_packages/docker_generator/templates/dockerfile.template.js index 6ad34c439a233..5832d00162b20 100755 --- a/src/dev/build/tasks/os_packages/docker_generator/templates/dockerfile.template.js +++ b/src/dev/build/tasks/os_packages/docker_generator/templates/dockerfile.template.js @@ -102,6 +102,9 @@ function generator({ RUN chmod g+ws /usr/share/kibana && \\ find /usr/share/kibana -gid 0 -and -not -perm /g+w -exec chmod g+w {} \\; + # Remove the suid bit everywhere to mitigate "Stack Clash" + RUN find / -xdev -perm -4000 -exec chmod u-s {} + + # Provide a non-root user to run the process. RUN groupadd --gid 1000 kibana && \\ useradd --uid 1000 --gid 1000 \\ From ce95f129333b4b8b85bd40bcab71bd28b99935b1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 6 Feb 2020 09:46:17 -0600 Subject: [PATCH 69/86] Update dependency @elastic/charts to v17 (#55376) * Update dependency @elastic/charts to v17 * Update yarn.lock * Fix type errors * Update to latest version Co-authored-by: WhiteSource Renovate Co-authored-by: Nick Partridge --- package.json | 2 +- packages/kbn-ui-shared-deps/package.json | 2 +- .../np_ready/angular/directives/histogram.tsx | 4 ++-- yarn.lock | 19 +++++++++++++------ 4 files changed, 17 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 1502d61e529d9..539d3a067665f 100644 --- a/package.json +++ b/package.json @@ -117,7 +117,7 @@ "@babel/core": "^7.5.5", "@babel/register": "^7.7.0", "@elastic/apm-rum": "^4.6.0", - "@elastic/charts": "^16.1.0", + "@elastic/charts": "^17.0.2", "@elastic/datemath": "5.0.2", "@elastic/ems-client": "7.6.0", "@elastic/eui": "18.3.0", diff --git a/packages/kbn-ui-shared-deps/package.json b/packages/kbn-ui-shared-deps/package.json index 8c8b8b8a21488..fc9d159ea9b95 100644 --- a/packages/kbn-ui-shared-deps/package.json +++ b/packages/kbn-ui-shared-deps/package.json @@ -9,9 +9,9 @@ "kbn:watch": "node scripts/build --watch" }, "devDependencies": { + "@elastic/charts": "^17.0.2", "abort-controller": "^3.0.0", "@elastic/eui": "18.3.0", - "@elastic/charts": "^16.1.0", "@kbn/dev-utils": "1.0.0", "@kbn/i18n": "1.0.0", "@yarnpkg/lockfile": "^1.1.0", diff --git a/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/directives/histogram.tsx b/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/directives/histogram.tsx index 4d387f44c3d57..77bbab97d95c7 100644 --- a/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/directives/histogram.tsx +++ b/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/directives/histogram.tsx @@ -30,7 +30,6 @@ import { Axis, Chart, HistogramBarSeries, - GeometryValue, LineAnnotation, Position, ScaleType, @@ -38,6 +37,7 @@ import { RectAnnotation, TooltipValue, TooltipType, + ElementClickListener, } from '@elastic/charts'; import { i18n } from '@kbn/i18n'; @@ -139,7 +139,7 @@ export class DiscoverHistogram extends Component (elementData: GeometryValue[]) => { + public onElementClick = (xInterval: number): ElementClickListener => ([elementData]) => { const startRange = elementData[0].x; const range = { diff --git a/yarn.lock b/yarn.lock index 7c14f67a5b297..7ebf896964378 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1880,17 +1880,19 @@ dependencies: "@elastic/apm-rum-core" "^4.7.0" -"@elastic/charts@^16.1.0": - version "16.1.0" - resolved "https://registry.yarnpkg.com/@elastic/charts/-/charts-16.1.0.tgz#67cf11625dcd7e1c2cf16ef53349e6a68a73f5b1" - integrity sha512-0jZ7thhGmYC0ZdEVkxfg6M66epCD7k7BfYIi12FnrmIK+mUD2IPhR8b2TJXvaojPryN4YTNreGRncQ9R58fOoQ== +"@elastic/charts@^17.0.2": + version "17.0.2" + resolved "https://registry.yarnpkg.com/@elastic/charts/-/charts-17.0.2.tgz#0bd2cb7b78bd60255eed2a9b0ce5049a62dc5d8a" + integrity sha512-hz31Yma/HSdu9tRS/05xNXY+YuaHOadD9Gd+eh7ankNlJJOFI4IRV6F8BMnloeWYedNXBSTp4susFLwJNQQ+0w== dependencies: "@types/d3-shape" "^1.3.1" classnames "^2.2.6" d3-array "^1.2.4" d3-collection "^1.0.7" + d3-color "^1.4.0" d3-scale "^1.0.7" d3-shape "^1.3.4" + fast-deep-equal "^3.1.1" konva "^4.0.18" newtype-ts "^0.2.4" prop-types "^15.7.2" @@ -1902,7 +1904,7 @@ reselect "^4.0.0" resize-observer-polyfill "^1.5.1" ts-debounce "^1.0.0" - utility-types "^3.9.0" + utility-types "^3.10.0" uuid "^3.3.2" "@elastic/elasticsearch@^7.4.0": @@ -10583,6 +10585,11 @@ d3-color@^1.0.3: resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-1.0.3.tgz#bc7643fca8e53a8347e2fbdaffa236796b58509b" integrity sha1-vHZD/KjlOoNH4vva/6I2eWtYUJs= +d3-color@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-1.4.0.tgz#89c45a995ed773b13314f06460df26d60ba0ecaf" + integrity sha512-TzNPeJy2+iEepfiL92LAAB7fvnp/dV2YwANPVHdDWmYMm23qIJBYww3qT8I8C1wXrmrg4UWs7BKc2tKIgyjzHg== + d3-contour@^1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/d3-contour/-/d3-contour-1.1.2.tgz#21f5456fcf57645922d69a27a58e782c91f842b3" @@ -30297,7 +30304,7 @@ utila@^0.4.0, utila@~0.4: resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= -utility-types@^3.10.0, utility-types@^3.9.0: +utility-types@^3.10.0: version "3.10.0" resolved "https://registry.yarnpkg.com/utility-types/-/utility-types-3.10.0.tgz#ea4148f9a741015f05ed74fd615e1d20e6bed82b" integrity sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg== From e92ead7324cc1be4bc80e80f31f967de60b582ed Mon Sep 17 00:00:00 2001 From: Pete Harverson Date: Thu, 6 Feb 2020 15:48:32 +0000 Subject: [PATCH 70/86] [ML] Transform: Remove duplicate page main landmarks (#56883) * [ML] Transform: Remove duplicate page main landmarks * [ML] Removed unused import Co-authored-by: Elastic Machine --- .../create_transform_section.tsx | 93 +++++++------- .../transform_management_section.tsx | 121 +++++++++--------- 2 files changed, 104 insertions(+), 110 deletions(-) diff --git a/x-pack/legacy/plugins/transform/public/app/sections/create_transform/create_transform_section.tsx b/x-pack/legacy/plugins/transform/public/app/sections/create_transform/create_transform_section.tsx index f63f3b6d6e7be..ae82f03718c02 100644 --- a/x-pack/legacy/plugins/transform/public/app/sections/create_transform/create_transform_section.tsx +++ b/x-pack/legacy/plugins/transform/public/app/sections/create_transform/create_transform_section.tsx @@ -16,7 +16,6 @@ import { EuiFlexGroup, EuiFlexItem, EuiPageContent, - EuiPageBody, EuiPageContentBody, EuiSpacer, EuiTitle, @@ -41,53 +40,51 @@ export const CreateTransformSection: FC = ({ match }) => { return ( - - - - - -

- -   - -

-
- - - - - -
-
- - - - - - -
-
+ + + + +

+ +   + +

+
+ + + + + +
+
+ + + + + + +
); diff --git a/x-pack/legacy/plugins/transform/public/app/sections/transform_management/transform_management_section.tsx b/x-pack/legacy/plugins/transform/public/app/sections/transform_management/transform_management_section.tsx index 2bd03df9957d2..6eb03c6537e0e 100644 --- a/x-pack/legacy/plugins/transform/public/app/sections/transform_management/transform_management_section.tsx +++ b/x-pack/legacy/plugins/transform/public/app/sections/transform_management/transform_management_section.tsx @@ -16,7 +16,6 @@ import { EuiFlexItem, EuiModal, EuiOverlayMask, - EuiPageBody, EuiPageContent, EuiPageContentBody, EuiSpacer, @@ -74,68 +73,66 @@ export const TransformManagement: FC = () => { return ( - - - - - -

- -   - -

-
- - - - - -
-
- - - - - - - - - - - + + + +

+ +   + +

+
+ + + + + +
+
+ + + + -
-
-
+ + + + + + + + + {isSearchSelectionVisible && ( Date: Thu, 6 Feb 2020 10:50:26 -0500 Subject: [PATCH 71/86] Convert triggers and actions UI to Kibana Platform (#56388) * Convert triggers and actions UI to Kibana Platform * Copy ui/time_buckets over * Fix i18n * Fix scss * Fix UI from not loading anymore --- x-pack/.i18nrc.json | 2 +- .../plugins/triggers_actions_ui/index.ts | 1 - .../triggers_actions_ui/public/index.scss | 4 +- .../triggers_actions_ui/public/legacy.ts | 96 ----- .../public/manage_angular_lifecycle.ts | 28 -- .../triggers_actions_ui}/kibana.json | 3 +- .../application/action_type_registry.mock.ts | 0 .../application/alert_type_registry.mock.ts | 0 .../public/application/app.tsx | 9 +- .../public/application/app_context.tsx | 0 .../public/application/boot.tsx | 6 +- .../builtin_action_types/email.test.tsx | 0 .../components/builtin_action_types/email.tsx | 0 .../builtin_action_types/es_index.test.tsx | 0 .../builtin_action_types/es_index.tsx | 0 .../components/builtin_action_types/index.ts | 0 .../builtin_action_types/pagerduty.test.tsx | 0 .../builtin_action_types/pagerduty.tsx | 0 .../builtin_action_types/server_log.test.tsx | 0 .../builtin_action_types/server_log.tsx | 0 .../builtin_action_types/slack.test.tsx | 0 .../components/builtin_action_types/slack.tsx | 0 .../components/builtin_action_types/types.ts | 0 .../builtin_action_types/webhook.test.tsx | 0 .../builtin_action_types/webhook.tsx | 0 .../components/builtin_alert_types/index.ts | 0 .../threshold/constants/aggregation_types.ts | 0 .../threshold/constants/comparators.ts | 0 .../threshold/constants/index.ts | 0 .../threshold/expression.tsx | 0 .../builtin_alert_types/threshold/index.ts | 0 .../builtin_alert_types/threshold/lib/api.ts | 0 .../time_buckets/calc_auto_interval.test.ts | 123 ++++++ .../lib/time_buckets/calc_auto_interval.ts | 132 ++++++ .../lib/time_buckets/calc_es_interval.js | 58 +++ .../threshold/lib/time_buckets/index.d.ts} | 4 +- .../threshold/lib/time_buckets/index.js | 7 + .../lib/time_buckets/time_buckets.js | 397 ++++++++++++++++++ .../builtin_alert_types/threshold/types.ts | 0 .../threshold/visualization.tsx | 21 +- .../components/delete_connectors_modal.tsx | 0 .../components/section_loading.tsx | 0 .../public/application/constants/index.ts | 0 .../public/application/constants/plugin.ts | 0 .../application/constants/time_units.ts | 0 .../context/actions_connectors_context.tsx | 0 .../application/context/alerts_context.tsx | 0 .../public/application/home.tsx | 10 +- .../lib/action_connector_api.test.ts | 2 +- .../application/lib/action_connector_api.ts | 0 .../public/application/lib/alert_api.test.ts | 2 +- .../public/application/lib/alert_api.ts | 0 .../public/application/lib/breadcrumb.test.ts | 0 .../public/application/lib/breadcrumb.ts | 0 .../public/application/lib/capabilities.ts | 0 .../public/application/lib/doc_title.test.ts | 0 .../public/application/lib/doc_title.ts | 0 .../application/lib/get_time_options.test.ts | 0 .../application/lib/get_time_options.ts | 0 .../application/lib/get_time_unit_label.ts | 0 .../application/lib/value_validators.test.ts | 0 .../application/lib/value_validators.ts | 0 .../action_connector_form/_index.scss | 0 .../action_connector_form.test.tsx | 11 +- .../action_connector_form.tsx | 0 .../action_type_menu.test.tsx | 11 +- .../action_type_menu.tsx | 0 .../connector_add_flyout.test.tsx | 11 +- .../connector_add_flyout.tsx | 0 .../connector_add_modal.test.tsx | 10 +- .../connector_add_modal.tsx | 0 .../connector_edit_flyout.test.tsx | 11 +- .../connector_edit_flyout.tsx | 0 .../connector_reducer.test.ts | 0 .../connector_reducer.ts | 0 .../sections/action_connector_form/index.ts | 0 .../components/_index.scss | 0 .../components/actions_connectors_list.scss | 0 .../actions_connectors_list.test.tsx | 29 +- .../components/actions_connectors_list.tsx | 0 .../sections/alert_add/alert_add.test.tsx | 10 +- .../sections/alert_add/alert_add.tsx | 0 .../sections/alert_add/alert_form.test.tsx | 10 +- .../sections/alert_add/alert_form.tsx | 0 .../sections/alert_add/alert_reducer.test.ts | 0 .../sections/alert_add/alert_reducer.ts | 0 .../application/sections/alert_add/index.ts | 0 .../components/alert_details.test.tsx | 0 .../components/alert_details.tsx | 0 .../components/alert_details_route.test.tsx | 0 .../components/alert_details_route.tsx | 0 .../components/action_type_filter.tsx | 0 .../components/alerts_list.test.tsx | 29 +- .../alerts_list/components/alerts_list.tsx | 0 .../components/collapsed_item_actions.tsx | 0 .../alerts_list/components/type_filter.tsx | 0 .../components/alert_quick_edit_buttons.tsx | 0 .../components/bulk_operation_popover.tsx | 0 .../with_actions_api_operations.test.tsx | 0 .../with_actions_api_operations.tsx | 0 .../with_bulk_alert_api_operations.test.tsx | 0 .../with_bulk_alert_api_operations.tsx | 0 .../public/application/type_registry.test.ts | 0 .../public/application/type_registry.ts | 0 .../triggers_actions_ui}/public/index.ts | 0 .../triggers_actions_ui}/public/plugin.ts | 102 ++--- .../triggers_actions_ui}/public/types.ts | 8 +- 107 files changed, 870 insertions(+), 277 deletions(-) delete mode 100644 x-pack/legacy/plugins/triggers_actions_ui/public/legacy.ts delete mode 100644 x-pack/legacy/plugins/triggers_actions_ui/public/manage_angular_lifecycle.ts rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/kibana.json (54%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/action_type_registry.mock.ts (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/alert_type_registry.mock.ts (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/app.tsx (85%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/app_context.tsx (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/boot.tsx (81%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/components/builtin_action_types/email.test.tsx (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/components/builtin_action_types/email.tsx (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/components/builtin_action_types/es_index.test.tsx (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/components/builtin_action_types/es_index.tsx (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/components/builtin_action_types/index.ts (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/components/builtin_action_types/pagerduty.test.tsx (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/components/builtin_action_types/pagerduty.tsx (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/components/builtin_action_types/server_log.test.tsx (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/components/builtin_action_types/server_log.tsx (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/components/builtin_action_types/slack.test.tsx (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/components/builtin_action_types/slack.tsx (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/components/builtin_action_types/types.ts (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/components/builtin_action_types/webhook.test.tsx (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/components/builtin_action_types/webhook.tsx (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/components/builtin_alert_types/index.ts (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/components/builtin_alert_types/threshold/constants/aggregation_types.ts (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/components/builtin_alert_types/threshold/constants/comparators.ts (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/components/builtin_alert_types/threshold/constants/index.ts (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/components/builtin_alert_types/threshold/expression.tsx (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/components/builtin_alert_types/threshold/index.ts (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/components/builtin_alert_types/threshold/lib/api.ts (100%) create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/threshold/lib/time_buckets/calc_auto_interval.test.ts create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/threshold/lib/time_buckets/calc_auto_interval.ts create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/threshold/lib/time_buckets/calc_es_interval.js rename x-pack/{legacy/plugins/monitoring/server/lib/get_date_format.js => plugins/triggers_actions_ui/public/application/components/builtin_alert_types/threshold/lib/time_buckets/index.d.ts} (69%) create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/threshold/lib/time_buckets/index.js create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/threshold/lib/time_buckets/time_buckets.js rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/components/builtin_alert_types/threshold/types.ts (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/components/builtin_alert_types/threshold/visualization.tsx (91%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/components/delete_connectors_modal.tsx (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/components/section_loading.tsx (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/constants/index.ts (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/constants/plugin.ts (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/constants/time_units.ts (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/context/actions_connectors_context.tsx (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/context/alerts_context.tsx (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/home.tsx (93%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/lib/action_connector_api.test.ts (97%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/lib/action_connector_api.ts (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/lib/alert_api.test.ts (99%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/lib/alert_api.ts (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/lib/breadcrumb.test.ts (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/lib/breadcrumb.ts (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/lib/capabilities.ts (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/lib/doc_title.test.ts (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/lib/doc_title.ts (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/lib/get_time_options.test.ts (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/lib/get_time_options.ts (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/lib/get_time_unit_label.ts (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/lib/value_validators.test.ts (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/lib/value_validators.ts (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/sections/action_connector_form/_index.scss (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/sections/action_connector_form/action_connector_form.test.tsx (87%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/sections/action_connector_form/action_connector_form.tsx (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/sections/action_connector_form/action_type_menu.test.tsx (88%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/sections/action_connector_form/action_type_menu.tsx (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/sections/action_connector_form/connector_add_flyout.test.tsx (88%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/sections/action_connector_form/connector_add_flyout.tsx (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/sections/action_connector_form/connector_add_modal.test.tsx (89%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/sections/action_connector_form/connector_add_modal.tsx (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/sections/action_connector_form/connector_edit_flyout.test.tsx (89%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/sections/action_connector_form/connector_edit_flyout.tsx (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/sections/action_connector_form/connector_reducer.test.ts (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/sections/action_connector_form/connector_reducer.ts (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/sections/action_connector_form/index.ts (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/sections/actions_connectors_list/components/_index.scss (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/sections/actions_connectors_list/components/actions_connectors_list.scss (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/sections/actions_connectors_list/components/actions_connectors_list.test.tsx (91%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/sections/actions_connectors_list/components/actions_connectors_list.tsx (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/sections/alert_add/alert_add.test.tsx (90%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/sections/alert_add/alert_add.tsx (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/sections/alert_add/alert_form.test.tsx (93%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/sections/alert_add/alert_form.tsx (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/sections/alert_add/alert_reducer.test.ts (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/sections/alert_add/alert_reducer.ts (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/sections/alert_add/index.ts (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/sections/alert_details/components/alert_details.test.tsx (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/sections/alert_details/components/alert_details.tsx (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/sections/alert_details/components/alert_details_route.test.tsx (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/sections/alert_details/components/alert_details_route.tsx (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/sections/alerts_list/components/action_type_filter.tsx (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/sections/alerts_list/components/alerts_list.test.tsx (93%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/sections/alerts_list/components/alerts_list.tsx (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/sections/alerts_list/components/collapsed_item_actions.tsx (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/sections/alerts_list/components/type_filter.tsx (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/sections/common/components/alert_quick_edit_buttons.tsx (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/sections/common/components/bulk_operation_popover.tsx (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/sections/common/components/with_actions_api_operations.test.tsx (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/sections/common/components/with_actions_api_operations.tsx (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/sections/common/components/with_bulk_alert_api_operations.test.tsx (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/sections/common/components/with_bulk_alert_api_operations.tsx (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/type_registry.test.ts (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/application/type_registry.ts (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/index.ts (100%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/plugin.ts (52%) rename x-pack/{legacy/plugins/triggers_actions_ui/np_ready => plugins/triggers_actions_ui}/public/types.ts (91%) diff --git a/x-pack/.i18nrc.json b/x-pack/.i18nrc.json index 50348a74f0725..68f4498ff2374 100644 --- a/x-pack/.i18nrc.json +++ b/x-pack/.i18nrc.json @@ -4,7 +4,7 @@ "xpack.actions": "plugins/actions", "xpack.advancedUiActions": "plugins/advanced_ui_actions", "xpack.alerting": "legacy/plugins/alerting", - "xpack.triggersActionsUI": "legacy/plugins/triggers_actions_ui", + "xpack.triggersActionsUI": "plugins/triggers_actions_ui", "xpack.apm": ["legacy/plugins/apm", "plugins/apm"], "xpack.beatsManagement": "legacy/plugins/beats_management", "xpack.canvas": "legacy/plugins/canvas", diff --git a/x-pack/legacy/plugins/triggers_actions_ui/index.ts b/x-pack/legacy/plugins/triggers_actions_ui/index.ts index 19930363d30bf..5874fbc59463f 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/index.ts +++ b/x-pack/legacy/plugins/triggers_actions_ui/index.ts @@ -29,7 +29,6 @@ export function triggersActionsUI(kibana: any) { .default(); }, uiExports: { - managementSections: ['plugins/triggers_actions_ui/legacy'], styleSheetPaths: resolve(__dirname, 'public/index.scss'), injectDefaultVars(server: Legacy.Server) { const serverConfig = server.config(); diff --git a/x-pack/legacy/plugins/triggers_actions_ui/public/index.scss b/x-pack/legacy/plugins/triggers_actions_ui/public/index.scss index 810176a57f9e3..3ae0ef35ee354 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/public/index.scss +++ b/x-pack/legacy/plugins/triggers_actions_ui/public/index.scss @@ -2,7 +2,7 @@ @import 'src/legacy/ui/public/styles/_styling_constants'; // Styling within the app -@import '../np_ready/public/application/sections/actions_connectors_list/components/index'; +@import '../../../../plugins/triggers_actions_ui/public/application/sections/actions_connectors_list/components/index'; -@import '../np_ready/public/application/sections/action_connector_form/index'; +@import '../../../../plugins/triggers_actions_ui/public/application/sections/action_connector_form/index'; diff --git a/x-pack/legacy/plugins/triggers_actions_ui/public/legacy.ts b/x-pack/legacy/plugins/triggers_actions_ui/public/legacy.ts deleted file mode 100644 index 95cac99630fb4..0000000000000 --- a/x-pack/legacy/plugins/triggers_actions_ui/public/legacy.ts +++ /dev/null @@ -1,96 +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; - * you may not use this file except in compliance with the Elastic License. - */ - -import { CoreSetup, App, AppUnmount } from 'src/core/public'; -import { capabilities } from 'ui/capabilities'; -import { i18n } from '@kbn/i18n'; - -/* Legacy UI imports */ -import { npSetup, npStart } from 'ui/new_platform'; -import routes from 'ui/routes'; -import { management, MANAGEMENT_BREADCRUMB } from 'ui/management'; -// @ts-ignore -import { xpackInfo } from 'plugins/xpack_main/services/xpack_info'; -/* Legacy UI imports */ - -import { plugin } from '../np_ready/public'; -import { manageAngularLifecycle } from './manage_angular_lifecycle'; -import { BASE_PATH } from '../np_ready/public/application/constants'; -import { - hasShowActionsCapability, - hasShowAlertsCapability, -} from '../np_ready/public/application/lib/capabilities'; - -const REACT_ROOT_ID = 'triggersActionsRoot'; -const canShowActions = hasShowActionsCapability(capabilities.get()); -const canShowAlerts = hasShowAlertsCapability(capabilities.get()); - -const template = ` -
-
`; - -let elem: HTMLElement; -let mountApp: () => AppUnmount | Promise; -let unmountApp: AppUnmount | Promise; -routes.when(`${BASE_PATH}:section?/:subsection?/:view?/:id?`, { - template, - controller: (() => { - return ($route: any, $scope: any) => { - const shimCore: CoreSetup = { - ...npSetup.core, - application: { - ...npSetup.core.application, - register(app: App): void { - mountApp = () => - app.mount(npStart as any, { - element: elem, - appBasePath: BASE_PATH, - onAppLeave: () => undefined, - }); - }, - }, - }; - - // clean up previously rendered React app if one exists - // this happens because of React Router redirects - if (elem) { - ((unmountApp as unknown) as AppUnmount)(); - } - - $scope.$$postDigest(() => { - elem = document.getElementById(REACT_ROOT_ID)!; - const instance = plugin({} as any); - instance.setup(shimCore, { - ...(npSetup.plugins as typeof npSetup.plugins), - __LEGACY: { - MANAGEMENT_BREADCRUMB, - }, - }); - - instance.start(npStart.core, { - ...(npSetup.plugins as typeof npSetup.plugins), - __LEGACY: { - MANAGEMENT_BREADCRUMB, - }, - }); - - (mountApp() as Promise).then(fn => (unmountApp = fn)); - - manageAngularLifecycle($scope, $route, elem); - }); - }; - })(), -}); - -if (canShowActions || canShowAlerts) { - management.getSection('kibana').register('triggersActions', { - display: i18n.translate('xpack.triggersActionsUI.managementSection.displayName', { - defaultMessage: 'Alerts and Actions', - }), - order: 7, - url: `#${BASE_PATH}`, - }); -} diff --git a/x-pack/legacy/plugins/triggers_actions_ui/public/manage_angular_lifecycle.ts b/x-pack/legacy/plugins/triggers_actions_ui/public/manage_angular_lifecycle.ts deleted file mode 100644 index efd40eaf83daa..0000000000000 --- a/x-pack/legacy/plugins/triggers_actions_ui/public/manage_angular_lifecycle.ts +++ /dev/null @@ -1,28 +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; - * you may not use this file except in compliance with the Elastic License. - */ - -import { unmountComponentAtNode } from 'react-dom'; - -export const manageAngularLifecycle = ($scope: any, $route: any, elem: HTMLElement) => { - const lastRoute = $route.current; - - const deregister = $scope.$on('$locationChangeSuccess', () => { - const currentRoute = $route.current; - if (lastRoute.$$route.template === currentRoute.$$route.template) { - $route.current = lastRoute; - } - }); - - $scope.$on('$destroy', () => { - if (deregister) { - deregister(); - } - - if (elem) { - unmountComponentAtNode(elem); - } - }); -}; diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/kibana.json b/x-pack/plugins/triggers_actions_ui/kibana.json similarity index 54% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/kibana.json rename to x-pack/plugins/triggers_actions_ui/kibana.json index 3fd7389aef494..cf66883412edb 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/kibana.json +++ b/x-pack/plugins/triggers_actions_ui/kibana.json @@ -2,5 +2,6 @@ "id": "triggers_actions_ui", "version": "kibana", "server": false, - "ui": true + "ui": true, + "requiredPlugins": ["management", "charts", "data"] } diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/action_type_registry.mock.ts b/x-pack/plugins/triggers_actions_ui/public/application/action_type_registry.mock.ts similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/action_type_registry.mock.ts rename to x-pack/plugins/triggers_actions_ui/public/application/action_type_registry.mock.ts diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/alert_type_registry.mock.ts b/x-pack/plugins/triggers_actions_ui/public/application/alert_type_registry.mock.ts similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/alert_type_registry.mock.ts rename to x-pack/plugins/triggers_actions_ui/public/application/alert_type_registry.mock.ts diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/app.tsx b/x-pack/plugins/triggers_actions_ui/public/application/app.tsx similarity index 85% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/app.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/app.tsx index 8bc292c58468e..51ed3c1ebafad 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/app.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/app.tsx @@ -12,23 +12,28 @@ import { HttpSetup, IUiSettingsClient, ApplicationStart, + ChromeBreadcrumb, } from 'kibana/public'; import { BASE_PATH, Section, routeToAlertDetails } from './constants'; import { TriggersActionsUIHome } from './home'; import { AppContextProvider, useAppDependencies } from './app_context'; import { hasShowAlertsCapability } from './lib/capabilities'; -import { LegacyDependencies, ActionTypeModel, AlertTypeModel } from '../types'; +import { ActionTypeModel, AlertTypeModel } from '../types'; import { TypeRegistry } from './type_registry'; import { AlertDetailsRouteWithApi as AlertDetailsRoute } from './sections/alert_details/components/alert_details_route'; +import { ChartsPluginStart } from '../../../../../src/plugins/charts/public'; +import { DataPublicPluginStart } from '../../../../../src/plugins/data/public'; export interface AppDeps { + dataPlugin: DataPublicPluginStart; + charts: ChartsPluginStart; chrome: ChromeStart; docLinks: DocLinksStart; toastNotifications: ToastsSetup; injectedMetadata: any; http: HttpSetup; uiSettings: IUiSettingsClient; - legacy: LegacyDependencies; + setBreadcrumbs: (crumbs: ChromeBreadcrumb[]) => void; capabilities: ApplicationStart['capabilities']; actionTypeRegistry: TypeRegistry; alertTypeRegistry: TypeRegistry; diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/app_context.tsx b/x-pack/plugins/triggers_actions_ui/public/application/app_context.tsx similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/app_context.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/app_context.tsx diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/boot.tsx b/x-pack/plugins/triggers_actions_ui/public/application/boot.tsx similarity index 81% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/boot.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/boot.tsx index a37bedbfbdda8..a458472c6d753 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/boot.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/boot.tsx @@ -10,23 +10,21 @@ import { SavedObjectsClientContract } from 'src/core/public'; import { App, AppDeps } from './app'; import { setSavedObjectsClient } from '../application/components/builtin_alert_types/threshold/lib/api'; -import { LegacyDependencies } from '../types'; interface BootDeps extends AppDeps { element: HTMLElement; savedObjects: SavedObjectsClientContract; I18nContext: any; - legacy: LegacyDependencies; } export const boot = (bootDeps: BootDeps) => { - const { I18nContext, element, legacy, savedObjects, ...appDeps } = bootDeps; + const { I18nContext, element, savedObjects, ...appDeps } = bootDeps; setSavedObjectsClient(savedObjects); render( - + , element ); diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/email.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/email.test.tsx similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/email.test.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/email.test.tsx diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/email.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/email.tsx similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/email.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/email.tsx diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/es_index.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index.test.tsx similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/es_index.test.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index.test.tsx diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/es_index.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index.tsx similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/es_index.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index.tsx diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/index.ts b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/index.ts similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/index.ts rename to x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/index.ts diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/pagerduty.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty.test.tsx similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/pagerduty.test.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty.test.tsx diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/pagerduty.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty.tsx similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/pagerduty.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty.tsx diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/server_log.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/server_log.test.tsx similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/server_log.test.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/server_log.test.tsx diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/server_log.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/server_log.tsx similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/server_log.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/server_log.tsx diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/slack.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/slack.test.tsx similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/slack.test.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/slack.test.tsx diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/slack.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/slack.tsx similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/slack.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/slack.tsx diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/types.ts b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/types.ts similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/types.ts rename to x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/types.ts diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/webhook.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/webhook.test.tsx similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/webhook.test.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/webhook.test.tsx diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/webhook.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/webhook.tsx similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_action_types/webhook.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/webhook.tsx diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_alert_types/index.ts b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/index.ts similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_alert_types/index.ts rename to x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/index.ts diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_alert_types/threshold/constants/aggregation_types.ts b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/threshold/constants/aggregation_types.ts similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_alert_types/threshold/constants/aggregation_types.ts rename to x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/threshold/constants/aggregation_types.ts diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_alert_types/threshold/constants/comparators.ts b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/threshold/constants/comparators.ts similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_alert_types/threshold/constants/comparators.ts rename to x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/threshold/constants/comparators.ts diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_alert_types/threshold/constants/index.ts b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/threshold/constants/index.ts similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_alert_types/threshold/constants/index.ts rename to x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/threshold/constants/index.ts diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_alert_types/threshold/expression.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/threshold/expression.tsx similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_alert_types/threshold/expression.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/threshold/expression.tsx diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_alert_types/threshold/index.ts b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/threshold/index.ts similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_alert_types/threshold/index.ts rename to x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/threshold/index.ts diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_alert_types/threshold/lib/api.ts b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/threshold/lib/api.ts similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_alert_types/threshold/lib/api.ts rename to x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/threshold/lib/api.ts diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/threshold/lib/time_buckets/calc_auto_interval.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/threshold/lib/time_buckets/calc_auto_interval.test.ts new file mode 100644 index 0000000000000..34e435be152f6 --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/threshold/lib/time_buckets/calc_auto_interval.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; + * you may not use this file except in compliance with the Elastic License. + */ + +import moment from 'moment'; + +import { calcAutoIntervalLessThan, calcAutoIntervalNear } from './calc_auto_interval'; + +describe('calcAutoIntervalNear', () => { + test('1h/0 buckets = 0ms buckets', () => { + const interval = calcAutoIntervalNear(0, Number(moment.duration(1, 'h'))); + expect(interval.asMilliseconds()).toBe(0); + }); + + test('undefined/100 buckets = 0ms buckets', () => { + const interval = calcAutoIntervalNear(0, undefined as any); + expect(interval.asMilliseconds()).toBe(0); + }); + + test('1ms/100 buckets = 1ms buckets', () => { + const interval = calcAutoIntervalNear(100, Number(moment.duration(1, 'ms'))); + expect(interval.asMilliseconds()).toBe(1); + }); + + test('200ms/100 buckets = 2ms buckets', () => { + const interval = calcAutoIntervalNear(100, Number(moment.duration(200, 'ms'))); + expect(interval.asMilliseconds()).toBe(2); + }); + + test('1s/1000 buckets = 1ms buckets', () => { + const interval = calcAutoIntervalNear(1000, Number(moment.duration(1, 's'))); + expect(interval.asMilliseconds()).toBe(1); + }); + + test('1000h/1000 buckets = 1h buckets', () => { + const interval = calcAutoIntervalNear(1000, Number(moment.duration(1000, 'hours'))); + expect(interval.asHours()).toBe(1); + }); + + test('1h/100 buckets = 30s buckets', () => { + const interval = calcAutoIntervalNear(100, Number(moment.duration(1, 'hours'))); + expect(interval.asSeconds()).toBe(30); + }); + + test('1d/25 buckets = 1h buckets', () => { + const interval = calcAutoIntervalNear(25, Number(moment.duration(1, 'day'))); + expect(interval.asHours()).toBe(1); + }); + + test('1y/1000 buckets = 12h buckets', () => { + const interval = calcAutoIntervalNear(1000, Number(moment.duration(1, 'year'))); + expect(interval.asHours()).toBe(12); + }); + + test('1y/10000 buckets = 1h buckets', () => { + const interval = calcAutoIntervalNear(10000, Number(moment.duration(1, 'year'))); + expect(interval.asHours()).toBe(1); + }); + + test('1y/100000 buckets = 5m buckets', () => { + const interval = calcAutoIntervalNear(100000, Number(moment.duration(1, 'year'))); + expect(interval.asMinutes()).toBe(5); + }); +}); + +describe('calcAutoIntervalLessThan', () => { + test('1h/0 buckets = 0ms buckets', () => { + const interval = calcAutoIntervalLessThan(0, Number(moment.duration(1, 'h'))); + expect(interval.asMilliseconds()).toBe(0); + }); + + test('undefined/100 buckets = 0ms buckets', () => { + const interval = calcAutoIntervalLessThan(0, undefined as any); + expect(interval.asMilliseconds()).toBe(0); + }); + + test('1ms/100 buckets = 1ms buckets', () => { + const interval = calcAutoIntervalLessThan(100, Number(moment.duration(1, 'ms'))); + expect(interval.asMilliseconds()).toBe(1); + }); + + test('200ms/100 buckets = 2ms buckets', () => { + const interval = calcAutoIntervalLessThan(100, Number(moment.duration(200, 'ms'))); + expect(interval.asMilliseconds()).toBe(2); + }); + + test('1s/1000 buckets = 1ms buckets', () => { + const interval = calcAutoIntervalLessThan(1000, Number(moment.duration(1, 's'))); + expect(interval.asMilliseconds()).toBe(1); + }); + + test('1000h/1000 buckets = 1h buckets', () => { + const interval = calcAutoIntervalLessThan(1000, Number(moment.duration(1000, 'hours'))); + expect(interval.asHours()).toBe(1); + }); + + test('1h/100 buckets = 30s buckets', () => { + const interval = calcAutoIntervalLessThan(100, Number(moment.duration(1, 'hours'))); + expect(interval.asSeconds()).toBe(30); + }); + + test('1d/25 buckets = 30m buckets', () => { + const interval = calcAutoIntervalLessThan(25, Number(moment.duration(1, 'day'))); + expect(interval.asMinutes()).toBe(30); + }); + + test('1y/1000 buckets = 3h buckets', () => { + const interval = calcAutoIntervalLessThan(1000, Number(moment.duration(1, 'year'))); + expect(interval.asHours()).toBe(3); + }); + + test('1y/10000 buckets = 30m buckets', () => { + const interval = calcAutoIntervalLessThan(10000, Number(moment.duration(1, 'year'))); + expect(interval.asMinutes()).toBe(30); + }); + + test('1y/100000 buckets = 5m buckets', () => { + const interval = calcAutoIntervalLessThan(100000, Number(moment.duration(1, 'year'))); + expect(interval.asMinutes()).toBe(5); + }); +}); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/threshold/lib/time_buckets/calc_auto_interval.ts b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/threshold/lib/time_buckets/calc_auto_interval.ts new file mode 100644 index 0000000000000..c910f1e6752d4 --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/threshold/lib/time_buckets/calc_auto_interval.ts @@ -0,0 +1,132 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import moment from 'moment'; + +const boundsDescending = [ + { + bound: Infinity, + interval: Number(moment.duration(1, 'year')), + }, + { + bound: Number(moment.duration(1, 'year')), + interval: Number(moment.duration(1, 'month')), + }, + { + bound: Number(moment.duration(3, 'week')), + interval: Number(moment.duration(1, 'week')), + }, + { + bound: Number(moment.duration(1, 'week')), + interval: Number(moment.duration(1, 'd')), + }, + { + bound: Number(moment.duration(24, 'hour')), + interval: Number(moment.duration(12, 'hour')), + }, + { + bound: Number(moment.duration(6, 'hour')), + interval: Number(moment.duration(3, 'hour')), + }, + { + bound: Number(moment.duration(2, 'hour')), + interval: Number(moment.duration(1, 'hour')), + }, + { + bound: Number(moment.duration(45, 'minute')), + interval: Number(moment.duration(30, 'minute')), + }, + { + bound: Number(moment.duration(20, 'minute')), + interval: Number(moment.duration(10, 'minute')), + }, + { + bound: Number(moment.duration(9, 'minute')), + interval: Number(moment.duration(5, 'minute')), + }, + { + bound: Number(moment.duration(3, 'minute')), + interval: Number(moment.duration(1, 'minute')), + }, + { + bound: Number(moment.duration(45, 'second')), + interval: Number(moment.duration(30, 'second')), + }, + { + bound: Number(moment.duration(15, 'second')), + interval: Number(moment.duration(10, 'second')), + }, + { + bound: Number(moment.duration(7.5, 'second')), + interval: Number(moment.duration(5, 'second')), + }, + { + bound: Number(moment.duration(5, 'second')), + interval: Number(moment.duration(1, 'second')), + }, + { + bound: Number(moment.duration(500, 'ms')), + interval: Number(moment.duration(100, 'ms')), + }, +]; + +function getPerBucketMs(count: number, duration: number) { + const ms = duration / count; + return isFinite(ms) ? ms : NaN; +} + +function normalizeMinimumInterval(targetMs: number) { + const value = isNaN(targetMs) ? 0 : Math.max(Math.floor(targetMs), 1); + return moment.duration(value); +} + +/** + * Using some simple rules we pick a "pretty" interval that will + * produce around the number of buckets desired given a time range. + * + * @param targetBucketCount desired number of buckets + * @param duration time range the agg covers + */ +export function calcAutoIntervalNear(targetBucketCount: number, duration: number) { + const targetPerBucketMs = getPerBucketMs(targetBucketCount, duration); + + // Find the first bound which is smaller than our target. + const lowerBoundIndex = boundsDescending.findIndex(({ bound }) => { + const boundMs = Number(bound); + return boundMs <= targetPerBucketMs; + }); + + // The bound immediately preceeding that lower bound contains the + // interval most closely matching our target. + if (lowerBoundIndex !== -1) { + const nearestInterval = boundsDescending[lowerBoundIndex - 1].interval; + return moment.duration(nearestInterval); + } + + // If the target is smaller than any of our bounds, then we'll use it for the interval as-is. + return normalizeMinimumInterval(targetPerBucketMs); +} + +/** + * Pick a "pretty" interval that produces no more than the maxBucketCount + * for the given time range. + * + * @param maxBucketCount maximum number of buckets to create + * @param duration amount of time covered by the agg + */ +export function calcAutoIntervalLessThan(maxBucketCount: number, duration: number) { + const maxPerBucketMs = getPerBucketMs(maxBucketCount, duration); + + for (const { interval } of boundsDescending) { + // Find the highest interval which meets our per bucket limitation. + if (interval <= maxPerBucketMs) { + return moment.duration(interval); + } + } + + // If the max is smaller than any of our intervals, then we'll use it for the interval as-is. + return normalizeMinimumInterval(maxPerBucketMs); +} diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/threshold/lib/time_buckets/calc_es_interval.js b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/threshold/lib/time_buckets/calc_es_interval.js new file mode 100644 index 0000000000000..bb5725c567b1f --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/threshold/lib/time_buckets/calc_es_interval.js @@ -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; + * you may not use this file except in compliance with the Elastic License. + */ + +import dateMath from '@elastic/datemath'; + +import { parseEsInterval } from '../../../../../../../../../../src/plugins/data/public'; + +const unitsDesc = dateMath.unitsDesc; +const largeMax = unitsDesc.indexOf('M'); + +/** + * Convert a moment.duration into an es + * compatible expression, and provide + * associated metadata + * + * @param {moment.duration} duration + * @return {object} + */ +export function convertDurationToNormalizedEsInterval(duration) { + for (let i = 0; i < unitsDesc.length; i++) { + const unit = unitsDesc[i]; + const val = duration.as(unit); + // find a unit that rounds neatly + if (val >= 1 && Math.floor(val) === val) { + // if the unit is "large", like years, but + // isn't set to 1 ES will puke. So keep going until + // we get out of the "large" units + if (i <= largeMax && val !== 1) { + continue; + } + + return { + value: val, + unit: unit, + expression: val + unit, + }; + } + } + + const ms = duration.as('ms'); + return { + value: ms, + unit: 'ms', + expression: ms + 'ms', + }; +} + +export function convertIntervalToEsInterval(interval) { + const { value, unit } = parseEsInterval(interval); + return { + value, + unit, + expression: interval, + }; +} diff --git a/x-pack/legacy/plugins/monitoring/server/lib/get_date_format.js b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/threshold/lib/time_buckets/index.d.ts similarity index 69% rename from x-pack/legacy/plugins/monitoring/server/lib/get_date_format.js rename to x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/threshold/lib/time_buckets/index.d.ts index 89cbf20d9b56f..d62655518f44a 100644 --- a/x-pack/legacy/plugins/monitoring/server/lib/get_date_format.js +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/threshold/lib/time_buckets/index.d.ts @@ -4,6 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -export async function getDateFormat(req) { - return await req.getUiSettingsService().get('dateFormat'); -} +export const TimeBuckets: any; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/threshold/lib/time_buckets/index.js b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/threshold/lib/time_buckets/index.js new file mode 100644 index 0000000000000..4f2cce5861424 --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/threshold/lib/time_buckets/index.js @@ -0,0 +1,7 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export { TimeBuckets } from './time_buckets'; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/threshold/lib/time_buckets/time_buckets.js b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/threshold/lib/time_buckets/time_buckets.js new file mode 100644 index 0000000000000..000ad752da76e --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/threshold/lib/time_buckets/time_buckets.js @@ -0,0 +1,397 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import _ from 'lodash'; +import moment from 'moment'; +import { calcAutoIntervalLessThan, calcAutoIntervalNear } from './calc_auto_interval'; +import { + convertDurationToNormalizedEsInterval, + convertIntervalToEsInterval, +} from './calc_es_interval'; +import { fieldFormats, parseInterval } from '../../../../../../../../../../src/plugins/data/public'; + +function isValidMoment(m) { + return m && 'isValid' in m && m.isValid(); +} + +/** + * Helper class for wrapping the concept of an "Interval", + * which describes a timespan that will separate moments. + * + * @param {state} object - one of "" + * @param {[type]} display [description] + */ +function TimeBuckets(uiSettings, dataPlugin) { + this.uiSettings = uiSettings; + this.dataPlugin = dataPlugin; + return TimeBuckets.__cached__(this); +} + +/**** + * PUBLIC API + ****/ + +/** + * Set the bounds that these buckets are expected to cover. + * This is required to support interval "auto" as well + * as interval scaling. + * + * @param {object} input - an object with properties min and max, + * representing the edges for the time span + * we should cover + * + * @returns {undefined} + */ +TimeBuckets.prototype.setBounds = function(input) { + if (!input) return this.clearBounds(); + + let bounds; + if (_.isPlainObject(input)) { + // accept the response from timefilter.getActiveBounds() + bounds = [input.min, input.max]; + } else { + bounds = Array.isArray(input) ? input : []; + } + + const moments = _(bounds) + .map(_.ary(moment, 1)) + .sortBy(Number); + + const valid = moments.size() === 2 && moments.every(isValidMoment); + if (!valid) { + this.clearBounds(); + throw new Error('invalid bounds set: ' + input); + } + + this._lb = moments.shift(); + this._ub = moments.pop(); + if (this.getDuration().asSeconds() < 0) { + throw new TypeError('Intervals must be positive'); + } +}; + +/** + * Clear the stored bounds + * + * @return {undefined} + */ +TimeBuckets.prototype.clearBounds = function() { + this._lb = this._ub = null; +}; + +/** + * Check to see if we have received bounds yet + * + * @return {Boolean} + */ +TimeBuckets.prototype.hasBounds = function() { + return isValidMoment(this._ub) && isValidMoment(this._lb); +}; + +/** + * Return the current bounds, if we have any. + * + * THIS DOES NOT CLONE THE BOUNDS, so editing them + * may have unexpected side-effects. Always + * call bounds.min.clone() before editing + * + * @return {object|undefined} - If bounds are not defined, this + * returns undefined, else it returns the bounds + * for these buckets. This object has two props, + * min and max. Each property will be a moment() + * object + * + */ +TimeBuckets.prototype.getBounds = function() { + if (!this.hasBounds()) return; + return { + min: this._lb, + max: this._ub, + }; +}; + +/** + * Get a moment duration object representing + * the distance between the bounds, if the bounds + * are set. + * + * @return {moment.duration|undefined} + */ +TimeBuckets.prototype.getDuration = function() { + if (!this.hasBounds()) return; + return moment.duration(this._ub - this._lb, 'ms'); +}; + +/** + * Update the interval at which buckets should be + * generated. + * + * Input can be one of the following: + * - Any object from src/legacy/ui/agg_types/buckets/_interval_options.js + * - "auto" + * - Pass a valid moment unit + * - a moment.duration object. + * + * @param {object|string|moment.duration} input - see desc + */ +TimeBuckets.prototype.setInterval = function(input) { + // Preserve the original units because they're lost when the interval is converted to a + // moment duration object. + this.originalInterval = input; + + let interval = input; + + // selection object -> val + if (_.isObject(input)) { + interval = input.val; + } + + if (!interval || interval === 'auto') { + this._i = 'auto'; + return; + } + + if (_.isString(interval)) { + input = interval; + interval = parseInterval(interval); + if (+interval === 0) { + interval = null; + } + } + + // if the value wasn't converted to a duration, and isn't + // already a duration, we have a problem + if (!moment.isDuration(interval)) { + throw new TypeError('"' + input + '" is not a valid interval.'); + } + + this._i = interval; +}; + +/** + * Get the interval for the buckets. If the + * number of buckets created by the interval set + * is larger than config:histogram:maxBars then the + * interval will be scaled up. If the number of buckets + * created is less than one, the interval is scaled back. + * + * The interval object returned is a moment.duration + * object that has been decorated with the following + * properties. + * + * interval.description: a text description of the interval. + * designed to be used list "field per {{ desc }}". + * - "minute" + * - "10 days" + * - "3 years" + * + * interval.expr: the elasticsearch expression that creates this + * interval. If the interval does not properly form an elasticsearch + * expression it will be forced into one. + * + * interval.scaled: the interval was adjusted to + * accommodate the maxBars setting. + * + * interval.scale: the number that y-values should be + * multiplied by + * + * interval.scaleDescription: a description that reflects + * the values which will be produced by using the + * interval.scale. + * + * + * @return {[type]} [description] + */ +TimeBuckets.prototype.getInterval = function(useNormalizedEsInterval = true) { + const self = this; + const duration = self.getDuration(); + const parsedInterval = readInterval(); + + if (useNormalizedEsInterval) { + return decorateInterval(maybeScaleInterval(parsedInterval)); + } else { + return decorateInterval(parsedInterval); + } + + // either pull the interval from state or calculate the auto-interval + function readInterval() { + const interval = self._i; + if (moment.isDuration(interval)) return interval; + return calcAutoIntervalNear(this.uiSettings.get('histogram:barTarget'), Number(duration)); + } + + // check to see if the interval should be scaled, and scale it if so + function maybeScaleInterval(interval) { + if (!self.hasBounds()) return interval; + + const maxLength = this.uiSettings.get('histogram:maxBars'); + const approxLen = duration / interval; + let scaled; + + if (approxLen > maxLength) { + scaled = calcAutoIntervalLessThan(maxLength, Number(duration)); + } else { + return interval; + } + + if (+scaled === +interval) return interval; + + decorateInterval(interval); + return _.assign(scaled, { + preScaled: interval, + scale: interval / scaled, + scaled: true, + }); + } + + // append some TimeBuckets specific props to the interval + function decorateInterval(interval) { + const esInterval = useNormalizedEsInterval + ? convertDurationToNormalizedEsInterval(interval) + : convertIntervalToEsInterval(self.originalInterval); + interval.esValue = esInterval.value; + interval.esUnit = esInterval.unit; + interval.expression = esInterval.expression; + interval.overflow = duration > interval ? moment.duration(interval - duration) : false; + + const prettyUnits = moment.normalizeUnits(esInterval.unit); + if (esInterval.value === 1) { + interval.description = prettyUnits; + } else { + interval.description = esInterval.value + ' ' + prettyUnits + 's'; + } + + return interval; + } +}; + +/** + * Get a date format string that will represent dates that + * progress at our interval. + * + * Since our interval can be as small as 1ms, the default + * date format is usually way too much. with `dateFormat:scaled` + * users can modify how dates are formatted within series + * produced by TimeBuckets + * + * @return {string} + */ +TimeBuckets.prototype.getScaledDateFormat = function() { + const interval = this.getInterval(); + const rules = this.uiSettings.get('dateFormat:scaled'); + + for (let i = rules.length - 1; i >= 0; i--) { + const rule = rules[i]; + if (!rule[0] || interval >= moment.duration(rule[0])) { + return rule[1]; + } + } + + return this.uiSettings.get('dateFormat'); +}; + +TimeBuckets.prototype.getScaledDateFormatter = function() { + const fieldFormatsService = this.dataPlugin.fieldFormats; + const DateFieldFormat = fieldFormatsService.getType(fieldFormats.FIELD_FORMAT_IDS.DATE); + + return new DateFieldFormat( + { + pattern: this.getScaledDateFormat(), + }, + configPath => this.uiSettings.get(configPath) + ); +}; + +TimeBuckets.__cached__ = function(self) { + let cache = {}; + const sameMoment = same(moment.isMoment); + const sameDuration = same(moment.isDuration); + + const desc = { + __cached__: { + value: self, + }, + }; + + const breakers = { + setBounds: 'bounds', + clearBounds: 'bounds', + setInterval: 'interval', + }; + + const resources = { + bounds: { + setup: function() { + return [self._lb, self._ub]; + }, + changes: function(prev) { + return !sameMoment(prev[0], self._lb) || !sameMoment(prev[1], self._ub); + }, + }, + interval: { + setup: function() { + return self._i; + }, + changes: function(prev) { + return !sameDuration(prev, this._i); + }, + }, + }; + + function cachedGetter(prop) { + return { + value: function cachedGetter(...rest) { + if (cache.hasOwnProperty(prop)) { + return cache[prop]; + } + + return (cache[prop] = self[prop](...rest)); + }, + }; + } + + function cacheBreaker(prop) { + const resource = resources[breakers[prop]]; + const setup = resource.setup; + const changes = resource.changes; + const fn = self[prop]; + + return { + value: function cacheBreaker() { + const prev = setup.call(self); + const ret = fn.apply(self, arguments); + + if (changes.call(self, prev)) { + cache = {}; + } + + return ret; + }, + }; + } + + function same(checkType) { + return function(a, b) { + if (a === b) return true; + if (checkType(a) === checkType(b)) return +a === +b; + return false; + }; + } + + _.forOwn(TimeBuckets.prototype, function(fn, prop) { + if (prop[0] === '_') return; + + if (breakers.hasOwnProperty(prop)) { + desc[prop] = cacheBreaker(prop); + } else { + desc[prop] = cachedGetter(prop); + } + }); + + return Object.create(self, desc); +}; + +export { TimeBuckets }; diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_alert_types/threshold/types.ts b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/threshold/types.ts similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_alert_types/threshold/types.ts rename to x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/threshold/types.ts diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_alert_types/threshold/visualization.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/threshold/visualization.tsx similarity index 91% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_alert_types/threshold/visualization.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/threshold/visualization.tsx index f91c3cf9a7708..bc5854bcc2ca8 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/builtin_alert_types/threshold/visualization.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/threshold/visualization.tsx @@ -19,16 +19,17 @@ import { ScaleType, Settings, } from '@elastic/charts'; -import { TimeBuckets } from 'ui/time_buckets'; import dateMath from '@elastic/datemath'; import moment from 'moment-timezone'; import { EuiCallOut, EuiLoadingChart, EuiSpacer, EuiEmptyPrompt, EuiText } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; -import { npStart } from 'ui/new_platform'; +/* TODO: This file was copied from ui/time_buckets for NP migration. We should clean this up and add TS support */ +import { TimeBuckets } from './lib/time_buckets'; import { getThresholdAlertVisualizationData } from './lib/api'; import { comparators, aggregationTypes } from './expression'; import { useAppDependencies } from '../../../app_context'; import { Alert } from '../../../../types'; +import { DataPublicPluginStart } from '../../../../../../../../src/plugins/data/public'; const customTheme = () => { return { @@ -83,9 +84,13 @@ const getThreshold = (alertParams: any) => { ); }; -const getTimeBuckets = (alertParams: any) => { +const getTimeBuckets = ( + uiSettings: IUiSettingsClient, + dataPlugin: DataPublicPluginStart, + alertParams: any +) => { const domain = getDomain(alertParams); - const timeBuckets = new TimeBuckets(); + const timeBuckets = new TimeBuckets(uiSettings, dataPlugin); timeBuckets.setBounds(domain); return timeBuckets; }; @@ -95,12 +100,12 @@ interface Props { } export const ThresholdVisualization: React.FunctionComponent = ({ alert }) => { - const { http, uiSettings, toastNotifications } = useAppDependencies(); + const { http, uiSettings, toastNotifications, charts, dataPlugin } = useAppDependencies(); const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(undefined); const [visualizationData, setVisualizationData] = useState>([]); - const chartsTheme = npStart.plugins.charts.theme.useChartsTheme(); + const chartsTheme = charts.theme.useChartsTheme(); const { index, timeField, @@ -118,7 +123,7 @@ export const ThresholdVisualization: React.FunctionComponent = ({ alert } } = alert.params; const domain = getDomain(alert.params); - const timeBuckets = new TimeBuckets(); + const timeBuckets = new TimeBuckets(uiSettings, dataPlugin); timeBuckets.setBounds(domain); const interval = timeBuckets.getInterval().expression; const visualizeOptions = { @@ -226,7 +231,7 @@ export const ThresholdVisualization: React.FunctionComponent = ({ alert } const dateFormatter = (d: number) => { return moment(d) .tz(timezone) - .format(getTimeBuckets(alert.params).getScaledDateFormat()); + .format(getTimeBuckets(uiSettings, dataPlugin, alert.params).getScaledDateFormat()); }; const aggLabel = aggregationTypes[aggType].text; return ( diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/delete_connectors_modal.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/delete_connectors_modal.tsx similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/delete_connectors_modal.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/components/delete_connectors_modal.tsx diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/section_loading.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/section_loading.tsx similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/components/section_loading.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/components/section_loading.tsx diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/constants/index.ts b/x-pack/plugins/triggers_actions_ui/public/application/constants/index.ts similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/constants/index.ts rename to x-pack/plugins/triggers_actions_ui/public/application/constants/index.ts diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/constants/plugin.ts b/x-pack/plugins/triggers_actions_ui/public/application/constants/plugin.ts similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/constants/plugin.ts rename to x-pack/plugins/triggers_actions_ui/public/application/constants/plugin.ts diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/constants/time_units.ts b/x-pack/plugins/triggers_actions_ui/public/application/constants/time_units.ts similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/constants/time_units.ts rename to x-pack/plugins/triggers_actions_ui/public/application/constants/time_units.ts diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/context/actions_connectors_context.tsx b/x-pack/plugins/triggers_actions_ui/public/application/context/actions_connectors_context.tsx similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/context/actions_connectors_context.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/context/actions_connectors_context.tsx diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/context/alerts_context.tsx b/x-pack/plugins/triggers_actions_ui/public/application/context/alerts_context.tsx similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/context/alerts_context.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/context/alerts_context.tsx diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/home.tsx b/x-pack/plugins/triggers_actions_ui/public/application/home.tsx similarity index 93% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/home.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/home.tsx index 5d518bce569e4..ba30b838a8593 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/home.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/home.tsx @@ -37,11 +37,7 @@ export const TriggersActionsUIHome: React.FunctionComponent { - const { - chrome, - capabilities, - legacy: { MANAGEMENT_BREADCRUMB }, - } = useAppDependencies(); + const { chrome, capabilities, setBreadcrumbs } = useAppDependencies(); const canShowActions = hasShowActionsCapability(capabilities); const canShowAlerts = hasShowAlertsCapability(capabilities); @@ -80,9 +76,9 @@ export const TriggersActionsUIHome: React.FunctionComponent { - chrome.setBreadcrumbs([MANAGEMENT_BREADCRUMB, getCurrentBreadcrumb(section || 'home')]); + setBreadcrumbs([getCurrentBreadcrumb(section || 'home')]); chrome.docTitle.change(getCurrentDocTitle(section || 'home')); - }, [section, chrome, MANAGEMENT_BREADCRUMB]); + }, [section, chrome, setBreadcrumbs]); return ( diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/lib/action_connector_api.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/action_connector_api.test.ts similarity index 97% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/lib/action_connector_api.test.ts rename to x-pack/plugins/triggers_actions_ui/public/application/lib/action_connector_api.test.ts index 00a55bb2588bb..f568e0a71d0cf 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/lib/action_connector_api.test.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/action_connector_api.test.ts @@ -5,7 +5,7 @@ */ import { ActionConnector, ActionConnectorWithoutId, ActionType } from '../../types'; -import { httpServiceMock } from '../../../../../../../../src/core/public/mocks'; +import { httpServiceMock } from '../../../../../../src/core/public/mocks'; import { createActionConnector, deleteActions, diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/lib/action_connector_api.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/action_connector_api.ts similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/lib/action_connector_api.ts rename to x-pack/plugins/triggers_actions_ui/public/application/lib/action_connector_api.ts diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/lib/alert_api.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api.test.ts similarity index 99% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/lib/alert_api.test.ts rename to x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api.test.ts index 9e64fd86f9873..306d959b3523e 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/lib/alert_api.test.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api.test.ts @@ -5,7 +5,7 @@ */ import { Alert, AlertType } from '../../types'; -import { httpServiceMock } from '../../../../../../../../src/core/public/mocks'; +import { httpServiceMock } from '../../../../../../src/core/public/mocks'; import { createAlert, deleteAlert, diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/lib/alert_api.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api.ts similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/lib/alert_api.ts rename to x-pack/plugins/triggers_actions_ui/public/application/lib/alert_api.ts diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/lib/breadcrumb.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/breadcrumb.test.ts similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/lib/breadcrumb.test.ts rename to x-pack/plugins/triggers_actions_ui/public/application/lib/breadcrumb.test.ts diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/lib/breadcrumb.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/breadcrumb.ts similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/lib/breadcrumb.ts rename to x-pack/plugins/triggers_actions_ui/public/application/lib/breadcrumb.ts diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/lib/capabilities.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/capabilities.ts similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/lib/capabilities.ts rename to x-pack/plugins/triggers_actions_ui/public/application/lib/capabilities.ts diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/lib/doc_title.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/doc_title.test.ts similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/lib/doc_title.test.ts rename to x-pack/plugins/triggers_actions_ui/public/application/lib/doc_title.test.ts diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/lib/doc_title.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/doc_title.ts similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/lib/doc_title.ts rename to x-pack/plugins/triggers_actions_ui/public/application/lib/doc_title.ts diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/lib/get_time_options.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/get_time_options.test.ts similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/lib/get_time_options.test.ts rename to x-pack/plugins/triggers_actions_ui/public/application/lib/get_time_options.test.ts diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/lib/get_time_options.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/get_time_options.ts similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/lib/get_time_options.ts rename to x-pack/plugins/triggers_actions_ui/public/application/lib/get_time_options.ts diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/lib/get_time_unit_label.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/get_time_unit_label.ts similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/lib/get_time_unit_label.ts rename to x-pack/plugins/triggers_actions_ui/public/application/lib/get_time_unit_label.ts diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/lib/value_validators.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/value_validators.test.ts similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/lib/value_validators.test.ts rename to x-pack/plugins/triggers_actions_ui/public/application/lib/value_validators.test.ts diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/lib/value_validators.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/value_validators.ts similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/lib/value_validators.ts rename to x-pack/plugins/triggers_actions_ui/public/application/lib/value_validators.ts diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/_index.scss b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/_index.scss similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/_index.scss rename to x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/_index.scss diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/action_connector_form.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_connector_form.test.tsx similarity index 87% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/action_connector_form.test.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_connector_form.test.tsx index 7bccf7a4328b6..b530e803bf285 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/action_connector_form.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_connector_form.test.tsx @@ -5,11 +5,14 @@ */ import * as React from 'react'; import { mountWithIntl } from 'test_utils/enzyme_helpers'; -import { coreMock } from '../../../../../../../../../src/core/public/mocks'; +import { coreMock } from '../../../../../../../src/core/public/mocks'; import { actionTypeRegistryMock } from '../../action_type_registry.mock'; import { ValidationResult, ActionConnector } from '../../../types'; import { ActionConnectorForm } from './action_connector_form'; import { AppContextProvider } from '../../app_context'; +import { chartPluginMock } from '../../../../../../../src/plugins/charts/public/mocks'; +import { dataPluginMock } from '../../../../../../../src/plugins/data/public/mocks'; + const actionTypeRegistry = actionTypeRegistryMock.create(); describe('action_connector_form', () => { @@ -26,6 +29,8 @@ describe('action_connector_form', () => { deps = { chrome, docLinks, + dataPlugin: dataPluginMock.createStartContract(), + charts: chartPluginMock.createStartContract(), toastNotifications: mockes.notifications.toasts, injectedMetadata: mockes.injectedMetadata, http: mockes.http, @@ -38,9 +43,7 @@ describe('action_connector_form', () => { show: true, }, }, - legacy: { - MANAGEMENT_BREADCRUMB: { set: () => {} } as any, - }, + setBreadcrumbs: jest.fn(), actionTypeRegistry: actionTypeRegistry as any, alertTypeRegistry: {} as any, }; diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/action_connector_form.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_connector_form.tsx similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/action_connector_form.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_connector_form.tsx diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/action_type_menu.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_type_menu.test.tsx similarity index 88% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/action_type_menu.test.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_type_menu.test.tsx index 6d98a5e3d120f..7d90198ad641f 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/action_type_menu.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_type_menu.test.tsx @@ -5,12 +5,15 @@ */ import * as React from 'react'; import { mountWithIntl } from 'test_utils/enzyme_helpers'; -import { coreMock } from '../../../../../../../../../src/core/public/mocks'; +import { coreMock } from '../../../../../../../src/core/public/mocks'; import { ActionsConnectorsContextProvider } from '../../context/actions_connectors_context'; import { actionTypeRegistryMock } from '../../action_type_registry.mock'; import { ActionTypeMenu } from './action_type_menu'; import { ValidationResult } from '../../../types'; import { AppContextProvider } from '../../app_context'; +import { chartPluginMock } from '../../../../../../../src/plugins/charts/public/mocks'; +import { dataPluginMock } from '../../../../../../../src/plugins/data/public/mocks'; + const actionTypeRegistry = actionTypeRegistryMock.create(); describe('connector_add_flyout', () => { @@ -28,6 +31,8 @@ describe('connector_add_flyout', () => { deps = { chrome, docLinks, + dataPlugin: dataPluginMock.createStartContract(), + charts: chartPluginMock.createStartContract(), toastNotifications: mockes.notifications.toasts, injectedMetadata: mockes.injectedMetadata, http: mockes.http, @@ -40,9 +45,7 @@ describe('connector_add_flyout', () => { show: true, }, }, - legacy: { - MANAGEMENT_BREADCRUMB: { set: () => {} } as any, - }, + setBreadcrumbs: jest.fn(), actionTypeRegistry: actionTypeRegistry as any, alertTypeRegistry: {} as any, }; diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/action_type_menu.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_type_menu.tsx similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/action_type_menu.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_type_menu.tsx diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/connector_add_flyout.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_add_flyout.test.tsx similarity index 88% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/connector_add_flyout.test.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_add_flyout.test.tsx index 52b9d1c0ed1bb..e2faca5661d1e 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/connector_add_flyout.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_add_flyout.test.tsx @@ -5,13 +5,16 @@ */ import * as React from 'react'; import { mountWithIntl } from 'test_utils/enzyme_helpers'; -import { coreMock } from '../../../../../../../../../src/core/public/mocks'; +import { coreMock } from '../../../../../../../src/core/public/mocks'; import { ConnectorAddFlyout } from './connector_add_flyout'; import { ActionsConnectorsContextProvider } from '../../context/actions_connectors_context'; import { actionTypeRegistryMock } from '../../action_type_registry.mock'; import { ValidationResult } from '../../../types'; import { AppContextProvider } from '../../app_context'; import { AppDeps } from '../../app'; +import { chartPluginMock } from '../../../../../../../src/plugins/charts/public/mocks'; +import { dataPluginMock } from '../../../../../../../src/plugins/data/public/mocks'; + const actionTypeRegistry = actionTypeRegistryMock.create(); describe('connector_add_flyout', () => { @@ -29,6 +32,8 @@ describe('connector_add_flyout', () => { deps = { chrome, docLinks, + dataPlugin: dataPluginMock.createStartContract(), + charts: chartPluginMock.createStartContract(), toastNotifications: mockes.notifications.toasts, injectedMetadata: mockes.injectedMetadata, http: mockes.http, @@ -41,9 +46,7 @@ describe('connector_add_flyout', () => { show: true, }, }, - legacy: { - MANAGEMENT_BREADCRUMB: { set: () => {} } as any, - }, + setBreadcrumbs: jest.fn(), actionTypeRegistry: actionTypeRegistry as any, alertTypeRegistry: {} as any, }; diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/connector_add_flyout.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_add_flyout.tsx similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/connector_add_flyout.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_add_flyout.tsx diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/connector_add_modal.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_add_modal.test.tsx similarity index 89% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/connector_add_modal.test.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_add_modal.test.tsx index cc87b16035ad3..dd10075c33792 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/connector_add_modal.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_add_modal.test.tsx @@ -5,12 +5,14 @@ */ import * as React from 'react'; import { mountWithIntl } from 'test_utils/enzyme_helpers'; -import { coreMock } from '../../../../../../../../../src/core/public/mocks'; +import { coreMock } from '../../../../../../../src/core/public/mocks'; import { ConnectorAddModal } from './connector_add_modal'; import { ActionsConnectorsContextProvider } from '../../context/actions_connectors_context'; import { actionTypeRegistryMock } from '../../action_type_registry.mock'; import { ValidationResult } from '../../../types'; import { AppContextProvider } from '../../app_context'; +import { chartPluginMock } from '../../../../../../../src/plugins/charts/public/mocks'; +import { dataPluginMock } from '../../../../../../../src/plugins/data/public/mocks'; import { AppDeps } from '../../app'; const actionTypeRegistry = actionTypeRegistryMock.create(); @@ -33,6 +35,8 @@ describe('connector_add_modal', () => { injectedMetadata: mocks.injectedMetadata, http: mocks.http, uiSettings: mocks.uiSettings, + dataPlugin: dataPluginMock.createStartContract(), + charts: chartPluginMock.createStartContract(), capabilities: { ...capabilities, actions: { @@ -41,9 +45,7 @@ describe('connector_add_modal', () => { show: true, }, }, - legacy: { - MANAGEMENT_BREADCRUMB: { set: () => {} } as any, - }, + setBreadcrumbs: jest.fn(), actionTypeRegistry: actionTypeRegistry as any, alertTypeRegistry: {} as any, }; diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/connector_add_modal.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_add_modal.tsx similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/connector_add_modal.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_add_modal.tsx diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/connector_edit_flyout.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_edit_flyout.test.tsx similarity index 89% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/connector_edit_flyout.test.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_edit_flyout.test.tsx index 9687707d0876a..a82003759d973 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/connector_edit_flyout.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_edit_flyout.test.tsx @@ -5,12 +5,15 @@ */ import * as React from 'react'; import { mountWithIntl } from 'test_utils/enzyme_helpers'; -import { coreMock } from '../../../../../../../../../src/core/public/mocks'; +import { coreMock } from '../../../../../../../src/core/public/mocks'; import { ActionsConnectorsContextProvider } from '../../context/actions_connectors_context'; import { actionTypeRegistryMock } from '../../action_type_registry.mock'; import { ValidationResult } from '../../../types'; import { ConnectorEditFlyout } from './connector_edit_flyout'; import { AppContextProvider } from '../../app_context'; +import { chartPluginMock } from '../../../../../../../src/plugins/charts/public/mocks'; +import { dataPluginMock } from '../../../../../../../src/plugins/data/public/mocks'; + const actionTypeRegistry = actionTypeRegistryMock.create(); let deps: any; @@ -27,6 +30,8 @@ describe('connector_edit_flyout', () => { deps = { chrome, docLinks, + dataPlugin: dataPluginMock.createStartContract(), + charts: chartPluginMock.createStartContract(), toastNotifications: mockes.notifications.toasts, injectedMetadata: mockes.injectedMetadata, http: mockes.http, @@ -39,9 +44,7 @@ describe('connector_edit_flyout', () => { show: true, }, }, - legacy: { - MANAGEMENT_BREADCRUMB: { set: () => {} } as any, - }, + setBreadcrumbs: jest.fn(), actionTypeRegistry: actionTypeRegistry as any, alertTypeRegistry: {} as any, }; diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/connector_edit_flyout.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_edit_flyout.tsx similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/connector_edit_flyout.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_edit_flyout.tsx diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/connector_reducer.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_reducer.test.ts similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/connector_reducer.test.ts rename to x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_reducer.test.ts diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/connector_reducer.ts b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_reducer.ts similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/connector_reducer.ts rename to x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_reducer.ts diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/index.ts b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/index.ts similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/action_connector_form/index.ts rename to x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/index.ts diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/actions_connectors_list/components/_index.scss b/x-pack/plugins/triggers_actions_ui/public/application/sections/actions_connectors_list/components/_index.scss similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/actions_connectors_list/components/_index.scss rename to x-pack/plugins/triggers_actions_ui/public/application/sections/actions_connectors_list/components/_index.scss diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/actions_connectors_list/components/actions_connectors_list.scss b/x-pack/plugins/triggers_actions_ui/public/application/sections/actions_connectors_list/components/actions_connectors_list.scss similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/actions_connectors_list/components/actions_connectors_list.scss rename to x-pack/plugins/triggers_actions_ui/public/application/sections/actions_connectors_list/components/actions_connectors_list.scss diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/actions_connectors_list/components/actions_connectors_list.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/actions_connectors_list/components/actions_connectors_list.test.tsx similarity index 91% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/actions_connectors_list/components/actions_connectors_list.test.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/actions_connectors_list/components/actions_connectors_list.test.tsx index da502fb86521b..509bd7131394e 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/actions_connectors_list/components/actions_connectors_list.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/actions_connectors_list/components/actions_connectors_list.test.tsx @@ -6,11 +6,14 @@ import * as React from 'react'; import { mountWithIntl } from 'test_utils/enzyme_helpers'; import { ActionsConnectorsList } from './actions_connectors_list'; -import { coreMock } from '../../../../../../../../../../src/core/public/mocks'; +import { coreMock } from '../../../../../../../../src/core/public/mocks'; import { ReactWrapper } from 'enzyme'; import { act } from 'react-dom/test-utils'; import { actionTypeRegistryMock } from '../../../action_type_registry.mock'; import { AppContextProvider } from '../../../app_context'; +import { chartPluginMock } from '../../../../../../../../src/plugins/charts/public/mocks'; +import { dataPluginMock } from '../../../../../../../../src/plugins/data/public/mocks'; + jest.mock('../../../lib/action_connector_api', () => ({ loadAllActions: jest.fn(), loadActionTypes: jest.fn(), @@ -52,6 +55,8 @@ describe('actions_connectors_list component empty', () => { const deps = { chrome, docLinks, + dataPlugin: dataPluginMock.createStartContract(), + charts: chartPluginMock.createStartContract(), toastNotifications: mockes.notifications.toasts, injectedMetadata: mockes.injectedMetadata, http: mockes.http, @@ -64,9 +69,7 @@ describe('actions_connectors_list component empty', () => { 'actions:delete': true, }, }, - legacy: { - MANAGEMENT_BREADCRUMB: { set: () => {} } as any, - }, + setBreadcrumbs: jest.fn(), actionTypeRegistry: actionTypeRegistry as any, alertTypeRegistry: {} as any, }; @@ -149,6 +152,8 @@ describe('actions_connectors_list component with items', () => { const deps = { chrome, docLinks, + dataPlugin: dataPluginMock.createStartContract(), + charts: chartPluginMock.createStartContract(), toastNotifications: mockes.notifications.toasts, injectedMetadata: mockes.injectedMetadata, http: mockes.http, @@ -161,9 +166,7 @@ describe('actions_connectors_list component with items', () => { 'actions:delete': true, }, }, - legacy: { - MANAGEMENT_BREADCRUMB: { set: () => {} } as any, - }, + setBreadcrumbs: jest.fn(), actionTypeRegistry: { get() { return null; @@ -233,6 +236,8 @@ describe('actions_connectors_list component empty with show only capability', () const deps = { chrome, docLinks, + dataPlugin: dataPluginMock.createStartContract(), + charts: chartPluginMock.createStartContract(), toastNotifications: mockes.notifications.toasts, injectedMetadata: mockes.injectedMetadata, http: mockes.http, @@ -245,9 +250,7 @@ describe('actions_connectors_list component empty with show only capability', () 'actions:delete': false, }, }, - legacy: { - MANAGEMENT_BREADCRUMB: { set: () => {} } as any, - }, + setBreadcrumbs: jest.fn(), actionTypeRegistry: { get() { return null; @@ -322,6 +325,8 @@ describe('actions_connectors_list with show only capability', () => { const deps = { chrome, docLinks, + dataPlugin: dataPluginMock.createStartContract(), + charts: chartPluginMock.createStartContract(), toastNotifications: mockes.notifications.toasts, injectedMetadata: mockes.injectedMetadata, http: mockes.http, @@ -334,9 +339,7 @@ describe('actions_connectors_list with show only capability', () => { 'actions:delete': false, }, }, - legacy: { - MANAGEMENT_BREADCRUMB: { set: () => {} } as any, - }, + setBreadcrumbs: jest.fn(), actionTypeRegistry: { get() { return null; diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/actions_connectors_list/components/actions_connectors_list.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/actions_connectors_list/components/actions_connectors_list.tsx similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/actions_connectors_list/components/actions_connectors_list.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/actions_connectors_list/components/actions_connectors_list.tsx diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alert_add/alert_add.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_add/alert_add.test.tsx similarity index 90% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alert_add/alert_add.test.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/alert_add/alert_add.test.tsx index bf94ffc73b85c..efe85010a3a7e 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alert_add/alert_add.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_add/alert_add.test.tsx @@ -6,7 +6,7 @@ import * as React from 'react'; import { mountWithIntl } from 'test_utils/enzyme_helpers'; import { act } from 'react-dom/test-utils'; -import { coreMock } from '../../../../../../../../../src/core/public/mocks'; +import { coreMock } from '../../../../../../../src/core/public/mocks'; import { AlertAdd } from './alert_add'; import { actionTypeRegistryMock } from '../../action_type_registry.mock'; import { ValidationResult } from '../../../types'; @@ -14,6 +14,8 @@ import { AppContextProvider } from '../../app_context'; import { AppDeps } from '../../app'; import { AlertsContextProvider } from '../../context/alerts_context'; import { alertTypeRegistryMock } from '../../alert_type_registry.mock'; +import { chartPluginMock } from '../../../../../../../src/plugins/charts/public/mocks'; +import { dataPluginMock } from '../../../../../../../src/plugins/data/public/mocks'; import { ReactWrapper } from 'enzyme'; const actionTypeRegistry = actionTypeRegistryMock.create(); const alertTypeRegistry = alertTypeRegistryMock.create(); @@ -38,6 +40,8 @@ describe('alert_add', () => { injectedMetadata: mockes.injectedMetadata, http: mockes.http, uiSettings: mockes.uiSettings, + dataPlugin: dataPluginMock.createStartContract(), + charts: chartPluginMock.createStartContract(), capabilities: { ...capabilities, alerting: { @@ -46,9 +50,7 @@ describe('alert_add', () => { show: true, }, }, - legacy: { - MANAGEMENT_BREADCRUMB: { set: () => {} } as any, - }, + setBreadcrumbs: jest.fn(), actionTypeRegistry: actionTypeRegistry as any, alertTypeRegistry: alertTypeRegistry as any, }; diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alert_add/alert_add.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_add/alert_add.tsx similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alert_add/alert_add.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/alert_add/alert_add.tsx diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alert_add/alert_form.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_add/alert_form.test.tsx similarity index 93% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alert_add/alert_form.test.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/alert_add/alert_form.test.tsx index 90a8a47071f2a..b5be1c852726f 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alert_add/alert_form.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_add/alert_form.test.tsx @@ -5,7 +5,7 @@ */ import React, { Fragment } from 'react'; import { mountWithIntl } from 'test_utils/enzyme_helpers'; -import { coreMock } from '../../../../../../../../../src/core/public/mocks'; +import { coreMock } from '../../../../../../../src/core/public/mocks'; import { ReactWrapper } from 'enzyme'; import { act } from 'react-dom/test-utils'; import { actionTypeRegistryMock } from '../../action_type_registry.mock'; @@ -14,6 +14,8 @@ import { ValidationResult, Alert } from '../../../types'; import { AlertForm } from './alert_form'; import { AppContextProvider } from '../../app_context'; import { AppDeps } from '../../app'; +import { chartPluginMock } from '../../../../../../../src/plugins/charts/public/mocks'; +import { dataPluginMock } from '../../../../../../../src/plugins/data/public/mocks'; const actionTypeRegistry = actionTypeRegistryMock.create(); const alertTypeRegistry = alertTypeRegistryMock.create(); describe('alert_form', () => { @@ -58,6 +60,8 @@ describe('alert_form', () => { injectedMetadata: mockes.injectedMetadata, http: mockes.http, uiSettings: mockes.uiSettings, + dataPlugin: dataPluginMock.createStartContract(), + charts: chartPluginMock.createStartContract(), capabilities: { ...capabilities, siem: { @@ -66,9 +70,7 @@ describe('alert_form', () => { 'alerting:delete': false, }, }, - legacy: { - MANAGEMENT_BREADCRUMB: { set: () => {} } as any, - }, + setBreadcrumbs: jest.fn(), actionTypeRegistry: actionTypeRegistry as any, alertTypeRegistry: alertTypeRegistry as any, }; diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alert_add/alert_form.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_add/alert_form.tsx similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alert_add/alert_form.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/alert_add/alert_form.tsx diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alert_add/alert_reducer.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_add/alert_reducer.test.ts similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alert_add/alert_reducer.test.ts rename to x-pack/plugins/triggers_actions_ui/public/application/sections/alert_add/alert_reducer.test.ts diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alert_add/alert_reducer.ts b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_add/alert_reducer.ts similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alert_add/alert_reducer.ts rename to x-pack/plugins/triggers_actions_ui/public/application/sections/alert_add/alert_reducer.ts diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alert_add/index.ts b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_add/index.ts similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alert_add/index.ts rename to x-pack/plugins/triggers_actions_ui/public/application/sections/alert_add/index.ts diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alert_details/components/alert_details.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_details.test.tsx similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alert_details/components/alert_details.test.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_details.test.tsx diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alert_details/components/alert_details.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_details.tsx similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alert_details/components/alert_details.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_details.tsx diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alert_details/components/alert_details_route.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_details_route.test.tsx similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alert_details/components/alert_details_route.test.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_details_route.test.tsx diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alert_details/components/alert_details_route.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_details_route.tsx similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alert_details/components/alert_details_route.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_details_route.tsx diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alerts_list/components/action_type_filter.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/action_type_filter.tsx similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alerts_list/components/action_type_filter.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/action_type_filter.tsx diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alerts_list/components/alerts_list.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/alerts_list.test.tsx similarity index 93% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alerts_list/components/alerts_list.test.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/alerts_list.test.tsx index 60435552a5759..9bdad54f03352 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alerts_list/components/alerts_list.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/alerts_list.test.tsx @@ -5,7 +5,7 @@ */ import * as React from 'react'; import { mountWithIntl } from 'test_utils/enzyme_helpers'; -import { coreMock } from '../../../../../../../../../../src/core/public/mocks'; +import { coreMock } from '../../../../../../../../src/core/public/mocks'; import { ReactWrapper } from 'enzyme'; import { act } from 'react-dom/test-utils'; import { actionTypeRegistryMock } from '../../../action_type_registry.mock'; @@ -13,6 +13,9 @@ import { alertTypeRegistryMock } from '../../../alert_type_registry.mock'; import { AlertsList } from './alerts_list'; import { ValidationResult } from '../../../../types'; import { AppContextProvider } from '../../../app_context'; +import { chartPluginMock } from '../../../../../../../../src/plugins/charts/public/mocks'; +import { dataPluginMock } from '../../../../../../../../src/plugins/data/public/mocks'; + jest.mock('../../../lib/action_connector_api', () => ({ loadActionTypes: jest.fn(), loadAllActions: jest.fn(), @@ -86,6 +89,8 @@ describe('alerts_list component empty', () => { const deps = { chrome, docLinks, + dataPlugin: dataPluginMock.createStartContract(), + charts: chartPluginMock.createStartContract(), toastNotifications: mockes.notifications.toasts, injectedMetadata: { getInjectedVar(name: string) { @@ -104,9 +109,7 @@ describe('alerts_list component empty', () => { 'alerting:delete': true, }, }, - legacy: { - MANAGEMENT_BREADCRUMB: { set: () => {} } as any, - }, + setBreadcrumbs: jest.fn(), actionTypeRegistry: actionTypeRegistry as any, alertTypeRegistry: alertTypeRegistry as any, }; @@ -211,6 +214,8 @@ describe('alerts_list component with items', () => { const deps = { chrome, docLinks, + dataPlugin: dataPluginMock.createStartContract(), + charts: chartPluginMock.createStartContract(), toastNotifications: mockes.notifications.toasts, injectedMetadata: { getInjectedVar(name: string) { @@ -229,9 +234,7 @@ describe('alerts_list component with items', () => { 'alerting:delete': true, }, }, - legacy: { - MANAGEMENT_BREADCRUMB: { set: () => {} } as any, - }, + setBreadcrumbs: jest.fn(), actionTypeRegistry: actionTypeRegistry as any, alertTypeRegistry: alertTypeRegistry as any, }; @@ -298,6 +301,8 @@ describe('alerts_list component empty with show only capability', () => { const deps = { chrome, docLinks, + dataPlugin: dataPluginMock.createStartContract(), + charts: chartPluginMock.createStartContract(), toastNotifications: mockes.notifications.toasts, injectedMetadata: { getInjectedVar(name: string) { @@ -316,9 +321,7 @@ describe('alerts_list component empty with show only capability', () => { 'alerting:delete': false, }, }, - legacy: { - MANAGEMENT_BREADCRUMB: { set: () => {} } as any, - }, + setBreadcrumbs: jest.fn(), actionTypeRegistry: { get() { return null; @@ -420,6 +423,8 @@ describe('alerts_list with show only capability', () => { const deps = { chrome, docLinks, + dataPlugin: dataPluginMock.createStartContract(), + charts: chartPluginMock.createStartContract(), toastNotifications: mockes.notifications.toasts, injectedMetadata: { getInjectedVar(name: string) { @@ -438,9 +443,7 @@ describe('alerts_list with show only capability', () => { 'alerting:delete': false, }, }, - legacy: { - MANAGEMENT_BREADCRUMB: { set: () => {} } as any, - }, + setBreadcrumbs: jest.fn(), actionTypeRegistry: actionTypeRegistry as any, alertTypeRegistry: alertTypeRegistry as any, }; diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alerts_list/components/alerts_list.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/alerts_list.tsx similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alerts_list/components/alerts_list.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/alerts_list.tsx diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alerts_list/components/collapsed_item_actions.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/collapsed_item_actions.tsx similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alerts_list/components/collapsed_item_actions.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/collapsed_item_actions.tsx diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alerts_list/components/type_filter.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/type_filter.tsx similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/alerts_list/components/type_filter.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/type_filter.tsx diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/common/components/alert_quick_edit_buttons.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/alert_quick_edit_buttons.tsx similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/common/components/alert_quick_edit_buttons.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/alert_quick_edit_buttons.tsx diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/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 similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/common/components/bulk_operation_popover.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/bulk_operation_popover.tsx diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/common/components/with_actions_api_operations.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/with_actions_api_operations.test.tsx similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/common/components/with_actions_api_operations.test.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/with_actions_api_operations.test.tsx diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/common/components/with_actions_api_operations.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/with_actions_api_operations.tsx similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/common/components/with_actions_api_operations.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/with_actions_api_operations.tsx diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/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 similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/common/components/with_bulk_alert_api_operations.test.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/with_bulk_alert_api_operations.test.tsx diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/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 similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/sections/common/components/with_bulk_alert_api_operations.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/with_bulk_alert_api_operations.tsx diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/type_registry.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/type_registry.test.ts similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/type_registry.test.ts rename to x-pack/plugins/triggers_actions_ui/public/application/type_registry.test.ts diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/type_registry.ts b/x-pack/plugins/triggers_actions_ui/public/application/type_registry.ts similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/application/type_registry.ts rename to x-pack/plugins/triggers_actions_ui/public/application/type_registry.ts diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/index.ts b/x-pack/plugins/triggers_actions_ui/public/index.ts similarity index 100% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/index.ts rename to x-pack/plugins/triggers_actions_ui/public/index.ts diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/plugin.ts b/x-pack/plugins/triggers_actions_ui/public/plugin.ts similarity index 52% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/plugin.ts rename to x-pack/plugins/triggers_actions_ui/public/plugin.ts index 00dd2f51feaee..493f5462dd2f7 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/plugin.ts +++ b/x-pack/plugins/triggers_actions_ui/public/plugin.ts @@ -4,26 +4,26 @@ * you may not use this file except in compliance with the Elastic License. */ -import { - CoreSetup, - CoreStart, - Plugin as CorePlugin, - PluginInitializerContext, -} from 'src/core/public'; +import { CoreStart, PluginInitializerContext, Plugin as CorePlugin } from 'src/core/public'; import { i18n } from '@kbn/i18n'; import { registerBuiltInActionTypes } from './application/components/builtin_action_types'; import { registerBuiltInAlertTypes } from './application/components/builtin_alert_types'; import { hasShowActionsCapability, hasShowAlertsCapability } from './application/lib/capabilities'; -import { PLUGIN } from './application/constants/plugin'; -import { LegacyDependencies, ActionTypeModel, AlertTypeModel } from './types'; +import { ActionTypeModel, AlertTypeModel } from './types'; import { TypeRegistry } from './application/type_registry'; +import { ManagementStart } from '../../../../src/plugins/management/public'; +import { boot } from './application/boot'; +import { ChartsPluginStart } from '../../../../src/plugins/charts/public'; +import { DataPublicPluginStart } from '../../../../src/plugins/data/public'; export type Setup = void; export type Start = void; -interface LegacyPlugins { - __LEGACY: LegacyDependencies; +interface PluginsStart { + data: DataPublicPluginStart; + charts: ChartsPluginStart; + management: ManagementStart; } export class Plugin implements CorePlugin { @@ -38,10 +38,7 @@ export class Plugin implements CorePlugin { this.alertTypeRegistry = alertTypeRegistry; } - public setup( - { application, notifications, http, uiSettings, injectedMetadata }: CoreSetup, - { __LEGACY }: LegacyPlugins - ): Setup { + public setup(): Setup { registerBuiltInActionTypes({ actionTypeRegistry: this.actionTypeRegistry, }); @@ -49,56 +46,9 @@ export class Plugin implements CorePlugin { registerBuiltInAlertTypes({ alertTypeRegistry: this.alertTypeRegistry, }); - application.register({ - id: PLUGIN.ID, - title: PLUGIN.getI18nName(i18n), - mount: async ( - { - core: { - application: applicationStart, - docLinks, - chrome, - // Waiting for types to be updated. - // @ts-ignore - savedObjects, - i18n: { Context: I18nContext }, - }, - }, - { element } - ) => { - const { capabilities } = applicationStart; - - const canShowActions = hasShowActionsCapability(capabilities); - const canShowAlerts = hasShowAlertsCapability(capabilities); - - if (!canShowActions && !canShowAlerts) { - // Render nothing - return () => {}; - } - - const { boot } = await import('./application/boot'); - return boot({ - element, - toastNotifications: notifications.toasts, - injectedMetadata, - http, - uiSettings, - docLinks, - chrome, - savedObjects: savedObjects.client, - I18nContext, - legacy: { - ...__LEGACY, - }, - capabilities, - actionTypeRegistry: this.actionTypeRegistry, - alertTypeRegistry: this.alertTypeRegistry, - }); - }, - }); } - public start(core: CoreStart, { __LEGACY }: LegacyPlugins) { + public start(core: CoreStart, plugins: PluginsStart) { const { capabilities } = core.application; const canShowActions = hasShowActionsCapability(capabilities); @@ -108,6 +58,34 @@ export class Plugin implements CorePlugin { if (!canShowActions && !canShowAlerts) { return; } + + plugins.management.sections.getSection('kibana')!.registerApp({ + id: 'triggersActions', + title: i18n.translate('xpack.triggersActionsUI.managementSection.displayName', { + defaultMessage: 'Alerts and Actions', + }), + order: 7, + mount: params => { + boot({ + dataPlugin: plugins.data, + charts: plugins.charts, + element: params.element, + toastNotifications: core.notifications.toasts, + injectedMetadata: core.injectedMetadata, + http: core.http, + uiSettings: core.uiSettings, + docLinks: core.docLinks, + chrome: core.chrome, + savedObjects: core.savedObjects.client, + I18nContext: core.i18n.Context, + capabilities: core.application.capabilities, + setBreadcrumbs: params.setBreadcrumbs, + actionTypeRegistry: this.actionTypeRegistry, + alertTypeRegistry: this.alertTypeRegistry, + }); + return () => {}; + }, + }); } public stop() {} diff --git a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/types.ts b/x-pack/plugins/triggers_actions_ui/public/types.ts similarity index 91% rename from x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/types.ts rename to x-pack/plugins/triggers_actions_ui/public/types.ts index 1bed658940a6e..c0a12144b2a18 100644 --- a/x-pack/legacy/plugins/triggers_actions_ui/np_ready/public/types.ts +++ b/x-pack/plugins/triggers_actions_ui/public/types.ts @@ -3,9 +3,9 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import { ActionType } from '../../../../../plugins/actions/common'; +import { ActionType } from '../../actions/common'; import { TypeRegistry } from './application/type_registry'; -import { SanitizedAlert as Alert, AlertAction } from '../../../alerting/common'; +import { SanitizedAlert as Alert, AlertAction } from '../../../legacy/plugins/alerting/common'; export { Alert, AlertAction }; export { ActionType }; @@ -91,7 +91,3 @@ export interface AlertTypeModel { export interface IErrorObject { [key: string]: string[]; } - -export interface LegacyDependencies { - MANAGEMENT_BREADCRUMB: { text: string; href?: string }; -} From f7360721d4ee47aff1ba08d88eb005e19b7406e7 Mon Sep 17 00:00:00 2001 From: Stacey Gammon Date: Thu, 6 Feb 2020 11:35:55 -0500 Subject: [PATCH 72/86] Remove I prefix in UiActions types (#56898) --- .../public/actions/select_range_action.ts | 4 +- .../data/public/actions/value_click_action.ts | 4 +- src/legacy/core_plugins/data/public/plugin.ts | 6 +-- .../np_ready/embeddable/search_embeddable.ts | 4 +- .../embeddable/search_embeddable_factory.ts | 4 +- .../kibana/public/discover/plugin.ts | 6 +-- .../ui/public/new_platform/new_platform.ts | 6 +-- .../public/actions/expand_panel_action.tsx | 4 +- .../public/actions/replace_panel_action.tsx | 4 +- .../public/embeddable/dashboard_container.tsx | 4 +- .../public/plugin.tsx | 6 +-- .../public/actions/apply_filter_action.ts | 4 +- src/plugins/data/public/types.ts | 6 +-- src/plugins/embeddable/public/bootstrap.ts | 4 +- .../public/lib/actions/apply_filter_action.ts | 4 +- .../public/lib/actions/edit_panel_action.ts | 4 +- .../lib/containers/embeddable_child_panel.tsx | 4 +- .../lib/panel/embeddable_panel.test.tsx | 8 ++-- .../public/lib/panel/embeddable_panel.tsx | 16 +++---- .../add_panel/add_panel_action.ts | 4 +- .../customize_title/customize_panel_action.ts | 4 +- .../panel_actions/inspect_panel_action.ts | 4 +- .../panel_actions/remove_panel_action.ts | 4 +- .../lib/panel/panel_header/panel_header.tsx | 6 +-- .../test_samples/actions/say_hello_action.tsx | 4 +- .../embeddables/contact_card/contact_card.tsx | 4 +- .../contact_card/contact_card_embeddable.tsx | 4 +- .../contact_card_embeddable_factory.tsx | 4 +- .../slow_contact_card_embeddable_factory.ts | 4 +- .../embeddables/hello_world_container.tsx | 4 +- .../hello_world_container_component.tsx | 4 +- src/plugins/embeddable/public/plugin.ts | 4 +- .../embeddable/public/tests/test_plugin.ts | 4 +- .../public/actions/{i_action.ts => action.ts} | 2 +- .../public/actions/create_action.ts | 8 ++-- .../ui_actions/public/actions/index.ts | 2 +- .../public/actions/register_action.ts | 4 +- src/plugins/ui_actions/public/api.ts | 18 ++++---- .../build_eui_context_menu_panels.tsx | 8 ++-- src/plugins/ui_actions/public/index.ts | 12 ++--- src/plugins/ui_actions/public/mocks.ts | 6 +-- src/plugins/ui_actions/public/plugin.ts | 26 +++++------ .../ui_actions/public/tests/helpers.ts | 6 +-- .../ui_actions/public/tests/test_plugin.ts | 10 ++-- .../tests/test_samples/hello_world_action.tsx | 4 +- .../tests/test_samples/restricted_action.ts | 4 +- .../tests/test_samples/say_hello_action.tsx | 4 +- .../public/triggers/attach_action.ts | 4 +- .../public/triggers/detach_action.ts | 4 +- .../triggers/execute_trigger_actions.test.ts | 8 ++-- .../triggers/execute_trigger_actions.ts | 13 +++--- .../ui_actions/public/triggers/get_trigger.ts | 4 +- .../triggers/get_trigger_actions.test.ts | 6 +-- .../public/triggers/get_trigger_actions.ts | 8 ++-- .../get_trigger_compatible_actions.test.ts | 8 ++-- .../get_trigger_compatible_actions.ts | 8 ++-- .../public/triggers/register_trigger.ts | 4 +- .../triggers/{i_trigger.ts => trigger.ts} | 2 +- src/plugins/ui_actions/public/types.ts | 46 +++++++++---------- .../public/np_ready/public/app/app.tsx | 4 +- .../app/dashboard_container_example.tsx | 4 +- .../public/np_ready/public/plugin.tsx | 4 +- .../public/sample_panel_link.ts | 4 +- .../panel_actions/get_csv_panel_action.tsx | 4 +- x-pack/legacy/plugins/siem/public/plugin.tsx | 4 +- .../public/custom_time_range_action.tsx | 4 +- .../public/custom_time_range_badge.tsx | 4 +- .../advanced_ui_actions/public/plugin.ts | 6 +-- 68 files changed, 212 insertions(+), 215 deletions(-) rename src/plugins/ui_actions/public/actions/{i_action.ts => action.ts} (97%) rename src/plugins/ui_actions/public/triggers/{i_trigger.ts => trigger.ts} (96%) diff --git a/src/legacy/core_plugins/data/public/actions/select_range_action.ts b/src/legacy/core_plugins/data/public/actions/select_range_action.ts index 4ea5c78a9fd2b..7e1135ca96f9e 100644 --- a/src/legacy/core_plugins/data/public/actions/select_range_action.ts +++ b/src/legacy/core_plugins/data/public/actions/select_range_action.ts @@ -19,7 +19,7 @@ import { i18n } from '@kbn/i18n'; import { - IAction, + Action, createAction, IncompatibleActionError, } from '../../../../../plugins/ui_actions/public'; @@ -55,7 +55,7 @@ async function isCompatible(context: ActionContext) { export function selectRangeAction( filterManager: FilterManager, timeFilter: TimefilterContract -): IAction { +): Action { return createAction({ type: SELECT_RANGE_ACTION, id: SELECT_RANGE_ACTION, diff --git a/src/legacy/core_plugins/data/public/actions/value_click_action.ts b/src/legacy/core_plugins/data/public/actions/value_click_action.ts index 2f622eb1eb669..1e474b8f9355c 100644 --- a/src/legacy/core_plugins/data/public/actions/value_click_action.ts +++ b/src/legacy/core_plugins/data/public/actions/value_click_action.ts @@ -20,7 +20,7 @@ import { i18n } from '@kbn/i18n'; import { toMountPoint } from '../../../../../plugins/kibana_react/public'; import { - IAction, + Action, createAction, IncompatibleActionError, } from '../../../../../plugins/ui_actions/public'; @@ -58,7 +58,7 @@ async function isCompatible(context: ActionContext) { export function valueClickAction( filterManager: FilterManager, timeFilter: TimefilterContract -): IAction { +): Action { return createAction({ type: VALUE_CLICK_ACTION, id: VALUE_CLICK_ACTION, diff --git a/src/legacy/core_plugins/data/public/plugin.ts b/src/legacy/core_plugins/data/public/plugin.ts index ebc470555d87c..e13e8e34eaebe 100644 --- a/src/legacy/core_plugins/data/public/plugin.ts +++ b/src/legacy/core_plugins/data/public/plugin.ts @@ -43,19 +43,19 @@ import { VALUE_CLICK_TRIGGER, // eslint-disable-next-line @kbn/eslint/no-restricted-paths } from '../../../../plugins/embeddable/public/lib/triggers'; -import { IUiActionsSetup, IUiActionsStart } from '../../../../plugins/ui_actions/public'; +import { UiActionsSetup, UiActionsStart } from '../../../../plugins/ui_actions/public'; import { SearchSetup, SearchStart, SearchService } from './search/search_service'; export interface DataPluginSetupDependencies { data: DataPublicPluginSetup; expressions: ExpressionsSetup; - uiActions: IUiActionsSetup; + uiActions: UiActionsSetup; } export interface DataPluginStartDependencies { data: DataPublicPluginStart; - uiActions: IUiActionsStart; + uiActions: UiActionsStart; } /** diff --git a/src/legacy/core_plugins/kibana/public/discover/np_ready/embeddable/search_embeddable.ts b/src/legacy/core_plugins/kibana/public/discover/np_ready/embeddable/search_embeddable.ts index f47cf52c756ac..3f877520b5bf9 100644 --- a/src/legacy/core_plugins/kibana/public/discover/np_ready/embeddable/search_embeddable.ts +++ b/src/legacy/core_plugins/kibana/public/discover/np_ready/embeddable/search_embeddable.ts @@ -20,7 +20,7 @@ import _ from 'lodash'; import * as Rx from 'rxjs'; import { Subscription } from 'rxjs'; import { i18n } from '@kbn/i18n'; -import { TExecuteTriggerActions } from 'src/plugins/ui_actions/public'; +import { ExecuteTriggerActions } from 'src/plugins/ui_actions/public'; import { RequestAdapter, Adapters } from '../../../../../../../plugins/inspector/public'; import { esFilters, @@ -111,7 +111,7 @@ export class SearchEmbeddable extends Embeddable filterManager, }: SearchEmbeddableConfig, initialInput: SearchInput, - private readonly executeTriggerActions: TExecuteTriggerActions, + private readonly executeTriggerActions: ExecuteTriggerActions, parent?: Container ) { super( diff --git a/src/legacy/core_plugins/kibana/public/discover/np_ready/embeddable/search_embeddable_factory.ts b/src/legacy/core_plugins/kibana/public/discover/np_ready/embeddable/search_embeddable_factory.ts index 842ef2bf9c825..15b3f2d4517ac 100644 --- a/src/legacy/core_plugins/kibana/public/discover/np_ready/embeddable/search_embeddable_factory.ts +++ b/src/legacy/core_plugins/kibana/public/discover/np_ready/embeddable/search_embeddable_factory.ts @@ -19,7 +19,7 @@ import { auto } from 'angular'; import { i18n } from '@kbn/i18n'; -import { TExecuteTriggerActions } from 'src/plugins/ui_actions/public'; +import { ExecuteTriggerActions } from 'src/plugins/ui_actions/public'; import { getServices } from '../../kibana_services'; import { EmbeddableFactory, @@ -43,7 +43,7 @@ export class SearchEmbeddableFactory extends EmbeddableFactory< public isEditable: () => boolean; constructor( - private readonly executeTriggerActions: TExecuteTriggerActions, + private readonly executeTriggerActions: ExecuteTriggerActions, getInjector: () => Promise, isEditable: () => boolean ) { diff --git a/src/legacy/core_plugins/kibana/public/discover/plugin.ts b/src/legacy/core_plugins/kibana/public/discover/plugin.ts index 45051b7085cd8..a495b56d5e9ea 100644 --- a/src/legacy/core_plugins/kibana/public/discover/plugin.ts +++ b/src/legacy/core_plugins/kibana/public/discover/plugin.ts @@ -19,7 +19,7 @@ import { i18n } from '@kbn/i18n'; import { AppMountParameters, CoreSetup, CoreStart, Plugin } from 'kibana/public'; import angular, { auto } from 'angular'; -import { IUiActionsSetup, IUiActionsStart } from 'src/plugins/ui_actions/public'; +import { UiActionsSetup, UiActionsStart } from 'src/plugins/ui_actions/public'; import { DataPublicPluginStart } from 'src/plugins/data/public'; import { registerFeature } from './np_ready/register_feature'; import './kibana_services'; @@ -47,13 +47,13 @@ export interface DiscoverSetup { } export type DiscoverStart = void; export interface DiscoverSetupPlugins { - uiActions: IUiActionsSetup; + uiActions: UiActionsSetup; embeddable: IEmbeddableSetup; kibanaLegacy: KibanaLegacySetup; home: HomePublicPluginSetup; } export interface DiscoverStartPlugins { - uiActions: IUiActionsStart; + uiActions: UiActionsStart; embeddable: IEmbeddableStart; navigation: NavigationStart; charts: ChartsPluginStart; diff --git a/src/legacy/ui/public/new_platform/new_platform.ts b/src/legacy/ui/public/new_platform/new_platform.ts index 8b653dac19262..e300ce4a0caf8 100644 --- a/src/legacy/ui/public/new_platform/new_platform.ts +++ b/src/legacy/ui/public/new_platform/new_platform.ts @@ -18,7 +18,7 @@ */ import { IScope } from 'angular'; -import { IUiActionsStart, IUiActionsSetup } from 'src/plugins/ui_actions/public'; +import { UiActionsStart, UiActionsSetup } from 'src/plugins/ui_actions/public'; import { IEmbeddableStart, IEmbeddableSetup } from 'src/plugins/embeddable/public'; import { LegacyCoreSetup, LegacyCoreStart, App, AppMountDeprecated } from '../../../../core/public'; import { Plugin as DataPlugin } from '../../../../plugins/data/public'; @@ -52,7 +52,7 @@ export interface PluginsSetup { expressions: ReturnType; home: HomePublicPluginSetup; inspector: InspectorSetup; - uiActions: IUiActionsSetup; + uiActions: UiActionsSetup; navigation: NavigationPublicPluginSetup; devTools: DevToolsSetup; kibanaLegacy: KibanaLegacySetup; @@ -70,7 +70,7 @@ export interface PluginsStart { expressions: ReturnType; home: HomePublicPluginStart; inspector: InspectorStart; - uiActions: IUiActionsStart; + uiActions: UiActionsStart; navigation: NavigationPublicPluginStart; devTools: DevToolsStart; kibanaLegacy: KibanaLegacyStart; diff --git a/src/plugins/dashboard_embeddable_container/public/actions/expand_panel_action.tsx b/src/plugins/dashboard_embeddable_container/public/actions/expand_panel_action.tsx index 68f68f8a53bcc..edfba153b2b0b 100644 --- a/src/plugins/dashboard_embeddable_container/public/actions/expand_panel_action.tsx +++ b/src/plugins/dashboard_embeddable_container/public/actions/expand_panel_action.tsx @@ -19,7 +19,7 @@ import { i18n } from '@kbn/i18n'; import { IEmbeddable } from '../embeddable_plugin'; -import { IAction, IncompatibleActionError } from '../ui_actions_plugin'; +import { Action, IncompatibleActionError } from '../ui_actions_plugin'; import { DASHBOARD_CONTAINER_TYPE, DashboardContainer } from '../embeddable'; export const EXPAND_PANEL_ACTION = 'togglePanel'; @@ -40,7 +40,7 @@ interface ActionContext { embeddable: IEmbeddable; } -export class ExpandPanelAction implements IAction { +export class ExpandPanelAction implements Action { public readonly type = EXPAND_PANEL_ACTION; public readonly id = EXPAND_PANEL_ACTION; public order = 7; diff --git a/src/plugins/dashboard_embeddable_container/public/actions/replace_panel_action.tsx b/src/plugins/dashboard_embeddable_container/public/actions/replace_panel_action.tsx index 78ce6bdc4c58f..16f611a2f1ff2 100644 --- a/src/plugins/dashboard_embeddable_container/public/actions/replace_panel_action.tsx +++ b/src/plugins/dashboard_embeddable_container/public/actions/replace_panel_action.tsx @@ -21,7 +21,7 @@ import { i18n } from '@kbn/i18n'; import { CoreStart } from '../../../../core/public'; import { IEmbeddable, ViewMode, IEmbeddableStart } from '../embeddable_plugin'; import { DASHBOARD_CONTAINER_TYPE, DashboardContainer } from '../embeddable'; -import { IAction, IncompatibleActionError } from '../ui_actions_plugin'; +import { Action, IncompatibleActionError } from '../ui_actions_plugin'; import { openReplacePanelFlyout } from './open_replace_panel_flyout'; export const REPLACE_PANEL_ACTION = 'replacePanel'; @@ -34,7 +34,7 @@ interface ActionContext { embeddable: IEmbeddable; } -export class ReplacePanelAction implements IAction { +export class ReplacePanelAction implements Action { public readonly type = REPLACE_PANEL_ACTION; public readonly id = REPLACE_PANEL_ACTION; public order = 11; diff --git a/src/plugins/dashboard_embeddable_container/public/embeddable/dashboard_container.tsx b/src/plugins/dashboard_embeddable_container/public/embeddable/dashboard_container.tsx index 021a1a9d1e64a..21bd1eeac6688 100644 --- a/src/plugins/dashboard_embeddable_container/public/embeddable/dashboard_container.tsx +++ b/src/plugins/dashboard_embeddable_container/public/embeddable/dashboard_container.tsx @@ -22,7 +22,7 @@ import ReactDOM from 'react-dom'; import { I18nProvider } from '@kbn/i18n/react'; import { RefreshInterval, TimeRange, Query, esFilters } from '../../../data/public'; import { CoreStart } from '../../../../core/public'; -import { IUiActionsStart } from '../ui_actions_plugin'; +import { UiActionsStart } from '../ui_actions_plugin'; import { Container, ContainerInput, @@ -81,7 +81,7 @@ export interface DashboardContainerOptions { inspector: InspectorStartContract; SavedObjectFinder: React.ComponentType; ExitFullScreenButton: React.ComponentType; - uiActions: IUiActionsStart; + uiActions: UiActionsStart; } export type DashboardReactContextValue = KibanaReactContextValue; diff --git a/src/plugins/dashboard_embeddable_container/public/plugin.tsx b/src/plugins/dashboard_embeddable_container/public/plugin.tsx index d18fbba239ec0..1227c011dc7f8 100644 --- a/src/plugins/dashboard_embeddable_container/public/plugin.tsx +++ b/src/plugins/dashboard_embeddable_container/public/plugin.tsx @@ -21,7 +21,7 @@ import * as React from 'react'; import { PluginInitializerContext, CoreSetup, CoreStart, Plugin } from 'src/core/public'; -import { IUiActionsSetup, IUiActionsStart } from '../../../plugins/ui_actions/public'; +import { UiActionsSetup, UiActionsStart } from '../../../plugins/ui_actions/public'; import { CONTEXT_MENU_TRIGGER, IEmbeddableSetup, IEmbeddableStart } from './embeddable_plugin'; import { ExpandPanelAction, ReplacePanelAction } from '.'; import { DashboardContainerFactory } from './embeddable/dashboard_container_factory'; @@ -35,13 +35,13 @@ import { interface SetupDependencies { embeddable: IEmbeddableSetup; - uiActions: IUiActionsSetup; + uiActions: UiActionsSetup; } interface StartDependencies { embeddable: IEmbeddableStart; inspector: InspectorStartContract; - uiActions: IUiActionsStart; + uiActions: UiActionsStart; } export type Setup = void; diff --git a/src/plugins/data/public/actions/apply_filter_action.ts b/src/plugins/data/public/actions/apply_filter_action.ts index b006889637c50..cc8bcf7679cf1 100644 --- a/src/plugins/data/public/actions/apply_filter_action.ts +++ b/src/plugins/data/public/actions/apply_filter_action.ts @@ -19,7 +19,7 @@ import { i18n } from '@kbn/i18n'; import { toMountPoint } from '../../../kibana_react/public'; -import { IAction, createAction, IncompatibleActionError } from '../../../ui_actions/public'; +import { Action, createAction, IncompatibleActionError } from '../../../ui_actions/public'; import { getOverlays, getIndexPatterns } from '../services'; import { applyFiltersPopover } from '../ui/apply_filters'; import { @@ -44,7 +44,7 @@ async function isCompatible(context: ActionContext) { export function createFilterAction( filterManager: FilterManager, timeFilter: TimefilterContract -): IAction { +): Action { return createAction({ type: GLOBAL_APPLY_FILTER_ACTION, id: GLOBAL_APPLY_FILTER_ACTION, diff --git a/src/plugins/data/public/types.ts b/src/plugins/data/public/types.ts index e62aba5f2713d..80646bb4668d2 100644 --- a/src/plugins/data/public/types.ts +++ b/src/plugins/data/public/types.ts @@ -19,7 +19,7 @@ import { CoreStart } from 'src/core/public'; import { IStorageWrapper } from 'src/plugins/kibana_utils/public'; -import { IUiActionsSetup, IUiActionsStart } from 'src/plugins/ui_actions/public'; +import { UiActionsSetup, UiActionsStart } from 'src/plugins/ui_actions/public'; import { AutocompleteSetup, AutocompleteStart } from './autocomplete'; import { FieldFormatsSetup, FieldFormatsStart } from './field_formats'; import { ISearchSetup, ISearchStart } from './search'; @@ -29,11 +29,11 @@ import { IndexPatternsContract } from './index_patterns'; import { StatefulSearchBarProps } from './ui/search_bar/create_search_bar'; export interface DataSetupDependencies { - uiActions: IUiActionsSetup; + uiActions: UiActionsSetup; } export interface DataStartDependencies { - uiActions: IUiActionsStart; + uiActions: UiActionsStart; } export interface DataPublicPluginSetup { diff --git a/src/plugins/embeddable/public/bootstrap.ts b/src/plugins/embeddable/public/bootstrap.ts index 1e0e7dfdb0933..3ca84549c559d 100644 --- a/src/plugins/embeddable/public/bootstrap.ts +++ b/src/plugins/embeddable/public/bootstrap.ts @@ -17,7 +17,7 @@ * under the License. */ -import { IUiActionsSetup } from 'src/plugins/ui_actions/public'; +import { UiActionsSetup } from 'src/plugins/ui_actions/public'; import { CONTEXT_MENU_TRIGGER, APPLY_FILTER_TRIGGER, @@ -33,7 +33,7 @@ import { * * @param api */ -export const bootstrap = (uiActions: IUiActionsSetup) => { +export const bootstrap = (uiActions: UiActionsSetup) => { const triggerContext = { id: CONTEXT_MENU_TRIGGER, title: 'Context menu', diff --git a/src/plugins/embeddable/public/lib/actions/apply_filter_action.ts b/src/plugins/embeddable/public/lib/actions/apply_filter_action.ts index e2592b70397f3..f471d70e5455a 100644 --- a/src/plugins/embeddable/public/lib/actions/apply_filter_action.ts +++ b/src/plugins/embeddable/public/lib/actions/apply_filter_action.ts @@ -18,7 +18,7 @@ */ import { i18n } from '@kbn/i18n'; -import { IAction, createAction, IncompatibleActionError } from '../ui_actions'; +import { Action, createAction, IncompatibleActionError } from '../ui_actions'; import { IEmbeddable, EmbeddableInput } from '../embeddables'; import { esFilters } from '../../../../../plugins/data/public'; @@ -38,7 +38,7 @@ async function isCompatible(context: ActionContext) { return Boolean(root.getInput().filters !== undefined && context.filters !== undefined); } -export function createFilterAction(): IAction { +export function createFilterAction(): Action { return createAction({ type: APPLY_FILTER_ACTION, id: APPLY_FILTER_ACTION, diff --git a/src/plugins/embeddable/public/lib/actions/edit_panel_action.ts b/src/plugins/embeddable/public/lib/actions/edit_panel_action.ts index 1f3eb6355e247..767def76348c8 100644 --- a/src/plugins/embeddable/public/lib/actions/edit_panel_action.ts +++ b/src/plugins/embeddable/public/lib/actions/edit_panel_action.ts @@ -18,7 +18,7 @@ */ import { i18n } from '@kbn/i18n'; -import { IAction } from 'src/plugins/ui_actions/public'; +import { Action } from 'src/plugins/ui_actions/public'; import { GetEmbeddableFactory, ViewMode } from '../types'; import { EmbeddableFactoryNotFoundError } from '../errors'; import { IEmbeddable } from '../embeddables'; @@ -29,7 +29,7 @@ interface ActionContext { embeddable: IEmbeddable; } -export class EditPanelAction implements IAction { +export class EditPanelAction implements Action { public readonly type = EDIT_PANEL_ACTION_ID; public readonly id = EDIT_PANEL_ACTION_ID; public order = 15; diff --git a/src/plugins/embeddable/public/lib/containers/embeddable_child_panel.tsx b/src/plugins/embeddable/public/lib/containers/embeddable_child_panel.tsx index d3f9b07be4754..f604cb0c274ba 100644 --- a/src/plugins/embeddable/public/lib/containers/embeddable_child_panel.tsx +++ b/src/plugins/embeddable/public/lib/containers/embeddable_child_panel.tsx @@ -23,7 +23,7 @@ import React from 'react'; import { EuiLoadingChart } from '@elastic/eui'; import { Subscription } from 'rxjs'; import { CoreStart } from 'src/core/public'; -import { TGetActionsCompatibleWithTrigger } from 'src/plugins/ui_actions/public'; +import { GetActionsCompatibleWithTrigger } from 'src/plugins/ui_actions/public'; import { Start as InspectorStartContract } from 'src/plugins/inspector/public'; import { ErrorEmbeddable, IEmbeddable } from '../embeddables'; @@ -35,7 +35,7 @@ export interface EmbeddableChildPanelProps { embeddableId: string; className?: string; container: IContainer; - getActions: TGetActionsCompatibleWithTrigger; + getActions: GetActionsCompatibleWithTrigger; getEmbeddableFactory: GetEmbeddableFactory; getAllEmbeddableFactories: GetEmbeddableFactories; overlays: CoreStart['overlays']; diff --git a/src/plugins/embeddable/public/lib/panel/embeddable_panel.test.tsx b/src/plugins/embeddable/public/lib/panel/embeddable_panel.test.tsx index 196d6f934134b..9982c632f36fb 100644 --- a/src/plugins/embeddable/public/lib/panel/embeddable_panel.test.tsx +++ b/src/plugins/embeddable/public/lib/panel/embeddable_panel.test.tsx @@ -25,7 +25,7 @@ import { nextTick } from 'test_utils/enzyme_helpers'; import { findTestSubject } from '@elastic/eui/lib/test'; import { I18nProvider } from '@kbn/i18n/react'; import { CONTEXT_MENU_TRIGGER } from '../triggers'; -import { IAction, ITrigger, IUiActionsApi } from 'src/plugins/ui_actions/public'; +import { Action, UiActionsApi } from 'src/plugins/ui_actions/public'; import { Trigger, GetEmbeddableFactory, ViewMode } from '../types'; import { EmbeddableFactory, isErrorEmbeddable } from '../embeddables'; import { EmbeddablePanel } from './embeddable_panel'; @@ -44,8 +44,8 @@ import { import { inspectorPluginMock } from 'src/plugins/inspector/public/mocks'; import { EuiBadge } from '@elastic/eui'; -const actionRegistry = new Map(); -const triggerRegistry = new Map(); +const actionRegistry = new Map(); +const triggerRegistry = new Map(); const embeddableFactories = new Map(); const getEmbeddableFactory: GetEmbeddableFactory = (id: string) => embeddableFactories.get(id); @@ -177,7 +177,7 @@ test('HelloWorldContainer in view mode hides edit mode actions', async () => { const renderInEditModeAndOpenContextMenu = async ( embeddableInputs: any, - getActions: IUiActionsApi['getTriggerCompatibleActions'] = () => Promise.resolve([]) + getActions: UiActionsApi['getTriggerCompatibleActions'] = () => Promise.resolve([]) ) => { const inspector = inspectorPluginMock.createStartContract(); diff --git a/src/plugins/embeddable/public/lib/panel/embeddable_panel.tsx b/src/plugins/embeddable/public/lib/panel/embeddable_panel.tsx index 234d8508bb97a..c5f4265ac3b0d 100644 --- a/src/plugins/embeddable/public/lib/panel/embeddable_panel.tsx +++ b/src/plugins/embeddable/public/lib/panel/embeddable_panel.tsx @@ -20,11 +20,7 @@ import { EuiContextMenuPanelDescriptor, EuiPanel, htmlIdGenerator } from '@elast import classNames from 'classnames'; import React from 'react'; import { Subscription } from 'rxjs'; -import { - buildContextMenuForActions, - TGetActionsCompatibleWithTrigger, - IAction, -} from '../ui_actions'; +import { buildContextMenuForActions, GetActionsCompatibleWithTrigger, Action } from '../ui_actions'; import { CoreStart, OverlayStart } from '../../../../../core/public'; import { toMountPoint } from '../../../../kibana_react/public'; @@ -43,7 +39,7 @@ import { CustomizePanelModal } from './panel_header/panel_actions/customize_titl interface Props { embeddable: IEmbeddable; - getActions: TGetActionsCompatibleWithTrigger; + getActions: GetActionsCompatibleWithTrigger; getEmbeddableFactory: GetEmbeddableFactory; getAllEmbeddableFactories: GetEmbeddableFactories; overlays: CoreStart['overlays']; @@ -59,7 +55,7 @@ interface State { viewMode: ViewMode; hidePanelTitles: boolean; closeContextMenu: boolean; - badges: IAction[]; + badges: Action[]; } export class EmbeddablePanel extends React.Component { @@ -91,7 +87,7 @@ export class EmbeddablePanel extends React.Component { } private async refreshBadges() { - let badges: IAction[] = await this.props.getActions(PANEL_BADGE_TRIGGER, { + let badges: Action[] = await this.props.getActions(PANEL_BADGE_TRIGGER, { embeddable: this.props.embeddable, }); if (!this.mounted) return; @@ -235,7 +231,7 @@ export class EmbeddablePanel extends React.Component { // These actions are exposed on the context menu for every embeddable, they bypass the trigger // registry. - const extraActions: Array> = [ + const extraActions: Array> = [ new CustomizePanelTitleAction(createGetUserData(this.props.overlays)), new AddPanelAction( this.props.getEmbeddableFactory, @@ -249,7 +245,7 @@ export class EmbeddablePanel extends React.Component { new EditPanelAction(this.props.getEmbeddableFactory), ]; - const sorted = actions.concat(extraActions).sort((a: IAction, b: IAction) => { + const sorted = actions.concat(extraActions).sort((a: Action, b: Action) => { const bOrder = b.order || 0; const aOrder = a.order || 0; return bOrder - aOrder; diff --git a/src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/add_panel_action.ts b/src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/add_panel_action.ts index 9ecc4686c21b6..2759d4575da19 100644 --- a/src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/add_panel_action.ts +++ b/src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/add_panel_action.ts @@ -17,7 +17,7 @@ * under the License. */ import { i18n } from '@kbn/i18n'; -import { IAction } from 'src/plugins/ui_actions/public'; +import { Action } from 'src/plugins/ui_actions/public'; import { NotificationsStart, OverlayStart } from 'src/core/public'; import { ViewMode, GetEmbeddableFactory, GetEmbeddableFactories } from '../../../../types'; import { openAddPanelFlyout } from './open_add_panel_flyout'; @@ -29,7 +29,7 @@ interface ActionContext { embeddable: IContainer; } -export class AddPanelAction implements IAction { +export class AddPanelAction implements Action { public readonly type = ADD_PANEL_ACTION_ID; public readonly id = ADD_PANEL_ACTION_ID; diff --git a/src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/customize_title/customize_panel_action.ts b/src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/customize_title/customize_panel_action.ts index 55aaca64d5db3..e0d34fc1f4b04 100644 --- a/src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/customize_title/customize_panel_action.ts +++ b/src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/customize_title/customize_panel_action.ts @@ -18,7 +18,7 @@ */ import { i18n } from '@kbn/i18n'; -import { IAction } from 'src/plugins/ui_actions/public'; +import { Action } from 'src/plugins/ui_actions/public'; import { ViewMode } from '../../../../types'; import { IEmbeddable } from '../../../../embeddables'; @@ -30,7 +30,7 @@ interface ActionContext { embeddable: IEmbeddable; } -export class CustomizePanelTitleAction implements IAction { +export class CustomizePanelTitleAction implements Action { public readonly type = CUSTOMIZE_PANEL_ACTION_ID; public id = CUSTOMIZE_PANEL_ACTION_ID; public order = 10; diff --git a/src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/inspect_panel_action.ts b/src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/inspect_panel_action.ts index 8e4a43a01fc17..1433bb6f78280 100644 --- a/src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/inspect_panel_action.ts +++ b/src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/inspect_panel_action.ts @@ -18,7 +18,7 @@ */ import { i18n } from '@kbn/i18n'; -import { IAction } from 'src/plugins/ui_actions/public'; +import { Action } from 'src/plugins/ui_actions/public'; import { Start as InspectorStartContract } from 'src/plugins/inspector/public'; import { IEmbeddable } from '../../../embeddables'; @@ -28,7 +28,7 @@ interface ActionContext { embeddable: IEmbeddable; } -export class InspectPanelAction implements IAction { +export class InspectPanelAction implements Action { public readonly type = INSPECT_PANEL_ACTION_ID; public readonly id = INSPECT_PANEL_ACTION_ID; public order = 10; diff --git a/src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/remove_panel_action.ts b/src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/remove_panel_action.ts index 498cd8d7136c6..ee7948f3d6a4a 100644 --- a/src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/remove_panel_action.ts +++ b/src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/remove_panel_action.ts @@ -17,7 +17,7 @@ * under the License. */ import { i18n } from '@kbn/i18n'; -import { IAction, IncompatibleActionError } from '../../../ui_actions'; +import { Action, IncompatibleActionError } from '../../../ui_actions'; import { ContainerInput, IContainer } from '../../../containers'; import { ViewMode } from '../../../types'; import { IEmbeddable } from '../../../embeddables'; @@ -38,7 +38,7 @@ function hasExpandedPanelInput( return (container as IContainer<{}, ExpandedPanelInput>).getInput().expandedPanelId !== undefined; } -export class RemovePanelAction implements IAction { +export class RemovePanelAction implements Action { public readonly type = REMOVE_PANEL_ACTION; public readonly id = REMOVE_PANEL_ACTION; public order = 5; diff --git a/src/plugins/embeddable/public/lib/panel/panel_header/panel_header.tsx b/src/plugins/embeddable/public/lib/panel/panel_header/panel_header.tsx index eedd4ba142d82..cc0733a08dd78 100644 --- a/src/plugins/embeddable/public/lib/panel/panel_header/panel_header.tsx +++ b/src/plugins/embeddable/public/lib/panel/panel_header/panel_header.tsx @@ -26,7 +26,7 @@ import { } from '@elastic/eui'; import classNames from 'classnames'; import React from 'react'; -import { IAction } from 'src/plugins/ui_actions/public'; +import { Action } from 'src/plugins/ui_actions/public'; import { PanelOptionsMenu } from './panel_options_menu'; import { IEmbeddable } from '../../embeddables'; @@ -36,12 +36,12 @@ export interface PanelHeaderProps { hidePanelTitles: boolean; getActionContextMenuPanel: () => Promise; closeContextMenu: boolean; - badges: IAction[]; + badges: Action[]; embeddable: IEmbeddable; headerId?: string; } -function renderBadges(badges: IAction[], embeddable: IEmbeddable) { +function renderBadges(badges: Action[], embeddable: IEmbeddable) { return badges.map(badge => ( { +export class SayHelloAction implements Action { public readonly type = SAY_HELLO_ACTION; public readonly id = SAY_HELLO_ACTION; diff --git a/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/contact_card.tsx b/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/contact_card.tsx index 51640749bc2b4..a8c760f7b9497 100644 --- a/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/contact_card.tsx +++ b/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/contact_card.tsx @@ -22,12 +22,12 @@ import { EuiCard, EuiFlexItem, EuiFlexGroup, EuiFormRow } from '@elastic/eui'; import { Subscription } from 'rxjs'; import { EuiButton } from '@elastic/eui'; import * as Rx from 'rxjs'; -import { TExecuteTriggerActions } from 'src/plugins/ui_actions/public'; +import { ExecuteTriggerActions } from 'src/plugins/ui_actions/public'; import { ContactCardEmbeddable, CONTACT_USER_TRIGGER } from './contact_card_embeddable'; interface Props { embeddable: ContactCardEmbeddable; - execTrigger: TExecuteTriggerActions; + execTrigger: ExecuteTriggerActions; } interface State { diff --git a/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/contact_card_embeddable.tsx b/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/contact_card_embeddable.tsx index de1befd1bdc1b..48f9cd2ce516d 100644 --- a/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/contact_card_embeddable.tsx +++ b/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/contact_card_embeddable.tsx @@ -19,7 +19,7 @@ import React from 'react'; import ReactDom from 'react-dom'; import { Subscription } from 'rxjs'; -import { TExecuteTriggerActions } from 'src/plugins/ui_actions/public'; +import { ExecuteTriggerActions } from 'src/plugins/ui_actions/public'; import { Container } from '../../../containers'; import { EmbeddableOutput, Embeddable, EmbeddableInput } from '../../../embeddables'; import { CONTACT_CARD_EMBEDDABLE } from './contact_card_embeddable_factory'; @@ -37,7 +37,7 @@ export interface ContactCardEmbeddableOutput extends EmbeddableOutput { } export interface ContactCardEmbeddableOptions { - execAction: TExecuteTriggerActions; + execAction: ExecuteTriggerActions; } function getFullName(input: ContactCardEmbeddableInput) { diff --git a/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/contact_card_embeddable_factory.tsx b/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/contact_card_embeddable_factory.tsx index d1eea5d67fb41..838c8d7de8f12 100644 --- a/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/contact_card_embeddable_factory.tsx +++ b/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/contact_card_embeddable_factory.tsx @@ -19,7 +19,7 @@ import React from 'react'; import { i18n } from '@kbn/i18n'; -import { TExecuteTriggerActions } from 'src/plugins/ui_actions/public'; +import { ExecuteTriggerActions } from 'src/plugins/ui_actions/public'; import { CoreStart } from 'src/core/public'; import { toMountPoint } from '../../../../../../kibana_react/public'; @@ -36,7 +36,7 @@ export class ContactCardEmbeddableFactory extends EmbeddableFactory, - private readonly execTrigger: TExecuteTriggerActions, + private readonly execTrigger: ExecuteTriggerActions, private readonly overlays: CoreStart['overlays'] ) { super(options); diff --git a/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/slow_contact_card_embeddable_factory.ts b/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/slow_contact_card_embeddable_factory.ts index 84806ff9cfde5..d16cd6dcd2187 100644 --- a/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/slow_contact_card_embeddable_factory.ts +++ b/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/slow_contact_card_embeddable_factory.ts @@ -17,13 +17,13 @@ * under the License. */ -import { TExecuteTriggerActions } from 'src/plugins/ui_actions/public'; +import { ExecuteTriggerActions } from 'src/plugins/ui_actions/public'; import { Container, EmbeddableFactory } from '../../..'; import { ContactCardEmbeddable, ContactCardEmbeddableInput } from './contact_card_embeddable'; import { CONTACT_CARD_EMBEDDABLE } from './contact_card_embeddable_factory'; interface SlowContactCardEmbeddableFactoryOptions { - execAction: TExecuteTriggerActions; + execAction: ExecuteTriggerActions; loadTickCount?: number; } diff --git a/src/plugins/embeddable/public/lib/test_samples/embeddables/hello_world_container.tsx b/src/plugins/embeddable/public/lib/test_samples/embeddables/hello_world_container.tsx index de486598470d3..7eca9f64bf937 100644 --- a/src/plugins/embeddable/public/lib/test_samples/embeddables/hello_world_container.tsx +++ b/src/plugins/embeddable/public/lib/test_samples/embeddables/hello_world_container.tsx @@ -20,7 +20,7 @@ import React from 'react'; import ReactDOM from 'react-dom'; import { I18nProvider } from '@kbn/i18n/react'; import { CoreStart } from 'src/core/public'; -import { TGetActionsCompatibleWithTrigger } from 'src/plugins/ui_actions/public'; +import { GetActionsCompatibleWithTrigger } from 'src/plugins/ui_actions/public'; import { Start as InspectorStartContract } from 'src/plugins/inspector/public'; import { Container, ViewMode, ContainerInput } from '../..'; import { HelloWorldContainerComponent } from './hello_world_container_component'; @@ -45,7 +45,7 @@ interface HelloWorldContainerInput extends ContainerInput { } interface HelloWorldContainerOptions { - getActions: TGetActionsCompatibleWithTrigger; + getActions: GetActionsCompatibleWithTrigger; getEmbeddableFactory: GetEmbeddableFactory; getAllEmbeddableFactories: GetEmbeddableFactories; overlays: CoreStart['overlays']; diff --git a/src/plugins/embeddable/public/lib/test_samples/embeddables/hello_world_container_component.tsx b/src/plugins/embeddable/public/lib/test_samples/embeddables/hello_world_container_component.tsx index 7c0e09eff1d50..413a0914bff65 100644 --- a/src/plugins/embeddable/public/lib/test_samples/embeddables/hello_world_container_component.tsx +++ b/src/plugins/embeddable/public/lib/test_samples/embeddables/hello_world_container_component.tsx @@ -21,14 +21,14 @@ import { Subscription } from 'rxjs'; import { EuiFlexGroup, EuiFlexItem, EuiSpacer } from '@elastic/eui'; import { CoreStart } from 'src/core/public'; -import { TGetActionsCompatibleWithTrigger } from 'src/plugins/ui_actions/public'; +import { GetActionsCompatibleWithTrigger } from 'src/plugins/ui_actions/public'; import { Start as InspectorStartContract } from 'src/plugins/inspector/public'; import { IContainer, PanelState, EmbeddableChildPanel } from '../..'; import { GetEmbeddableFactory, GetEmbeddableFactories } from '../../types'; interface Props { container: IContainer; - getActions: TGetActionsCompatibleWithTrigger; + getActions: GetActionsCompatibleWithTrigger; getEmbeddableFactory: GetEmbeddableFactory; getAllEmbeddableFactories: GetEmbeddableFactories; overlays: CoreStart['overlays']; diff --git a/src/plugins/embeddable/public/plugin.ts b/src/plugins/embeddable/public/plugin.ts index df1f4e5080031..c84fb888412e1 100644 --- a/src/plugins/embeddable/public/plugin.ts +++ b/src/plugins/embeddable/public/plugin.ts @@ -17,14 +17,14 @@ * under the License. */ -import { IUiActionsSetup } from 'src/plugins/ui_actions/public'; +import { UiActionsSetup } from 'src/plugins/ui_actions/public'; import { PluginInitializerContext, CoreSetup, CoreStart, Plugin } from '../../../core/public'; import { EmbeddableFactoryRegistry } from './types'; import { createApi, EmbeddableApi } from './api'; import { bootstrap } from './bootstrap'; export interface IEmbeddableSetupDependencies { - uiActions: IUiActionsSetup; + uiActions: UiActionsSetup; } export interface IEmbeddableSetup { diff --git a/src/plugins/embeddable/public/tests/test_plugin.ts b/src/plugins/embeddable/public/tests/test_plugin.ts index 49ee795bcb98a..d9e1a75d92bf3 100644 --- a/src/plugins/embeddable/public/tests/test_plugin.ts +++ b/src/plugins/embeddable/public/tests/test_plugin.ts @@ -20,7 +20,7 @@ import { CoreSetup, CoreStart } from 'src/core/public'; // eslint-disable-next-line import { uiActionsTestPlugin } from 'src/plugins/ui_actions/public/tests'; -import { IUiActionsApi } from 'src/plugins/ui_actions/public'; +import { UiActionsApi } from 'src/plugins/ui_actions/public'; import { coreMock } from '../../../../core/public/mocks'; import { EmbeddablePublicPlugin, IEmbeddableSetup, IEmbeddableStart } from '../plugin'; @@ -30,7 +30,7 @@ export interface TestPluginReturn { coreStart: CoreStart; setup: IEmbeddableSetup; doStart: (anotherCoreStart?: CoreStart) => IEmbeddableStart; - uiActions: IUiActionsApi; + uiActions: UiActionsApi; } export const testPlugin = ( diff --git a/src/plugins/ui_actions/public/actions/i_action.ts b/src/plugins/ui_actions/public/actions/action.ts similarity index 97% rename from src/plugins/ui_actions/public/actions/i_action.ts rename to src/plugins/ui_actions/public/actions/action.ts index 544b66b26c974..22530f003f2cd 100644 --- a/src/plugins/ui_actions/public/actions/i_action.ts +++ b/src/plugins/ui_actions/public/actions/action.ts @@ -19,7 +19,7 @@ import { UiComponent } from 'src/plugins/kibana_utils/common'; -export interface IAction { +export interface Action { /** * Determined the order when there is more than one action matched to a trigger. * Higher numbers are displayed first. diff --git a/src/plugins/ui_actions/public/actions/create_action.ts b/src/plugins/ui_actions/public/actions/create_action.ts index 3ac7b8cbbdec1..0cec076745334 100644 --- a/src/plugins/ui_actions/public/actions/create_action.ts +++ b/src/plugins/ui_actions/public/actions/create_action.ts @@ -17,13 +17,13 @@ * under the License. */ -import { IAction } from './i_action'; +import { Action } from './action'; export function createAction( - action: { type: string; execute: IAction['execute'] } & Partial< - IAction + action: { type: string; execute: Action['execute'] } & Partial< + Action > -): IAction { +): Action { return { getIconType: () => undefined, order: 0, diff --git a/src/plugins/ui_actions/public/actions/index.ts b/src/plugins/ui_actions/public/actions/index.ts index 67bdbed9e6785..feb9a8de62eb3 100644 --- a/src/plugins/ui_actions/public/actions/index.ts +++ b/src/plugins/ui_actions/public/actions/index.ts @@ -17,5 +17,5 @@ * under the License. */ -export { IAction } from './i_action'; +export { Action } from './action'; export { createAction } from './create_action'; diff --git a/src/plugins/ui_actions/public/actions/register_action.ts b/src/plugins/ui_actions/public/actions/register_action.ts index c8d5eddac9873..5738be63c9592 100644 --- a/src/plugins/ui_actions/public/actions/register_action.ts +++ b/src/plugins/ui_actions/public/actions/register_action.ts @@ -17,9 +17,9 @@ * under the License. */ -import { IUiActionsApiPure } from '../types'; +import { UiActionsApiPure } from '../types'; -export const registerAction: IUiActionsApiPure['registerAction'] = ({ actions }) => action => { +export const registerAction: UiActionsApiPure['registerAction'] = ({ actions }) => action => { if (actions.has(action.id)) { throw new Error(`Action [action.id = ${action.id}] already registered.`); } diff --git a/src/plugins/ui_actions/public/api.ts b/src/plugins/ui_actions/public/api.ts index 39580efd9e272..9a6fd04b14e10 100644 --- a/src/plugins/ui_actions/public/api.ts +++ b/src/plugins/ui_actions/public/api.ts @@ -18,10 +18,10 @@ */ import { - IUiActionsApi, - IUiActionsDependenciesInternal, - IUiActionsDependencies, - IUiActionsApiPure, + UiActionsApi, + UiActionsDependenciesInternal, + UiActionsDependencies, + UiActionsApiPure, } from './types'; import { attachAction } from './triggers/attach_action'; import { detachAction } from './triggers/detach_action'; @@ -32,7 +32,7 @@ import { getTriggerCompatibleActions } from './triggers/get_trigger_compatible_a import { registerAction } from './actions/register_action'; import { registerTrigger } from './triggers/register_trigger'; -export const pureApi: IUiActionsApiPure = { +export const pureApi: UiActionsApiPure = { attachAction, detachAction, executeTriggerActions, @@ -43,13 +43,13 @@ export const pureApi: IUiActionsApiPure = { registerTrigger, }; -export const createApi = (deps: IUiActionsDependencies) => { - const partialApi: Partial = {}; - const depsInternal: IUiActionsDependenciesInternal = { ...deps, api: partialApi }; +export const createApi = (deps: UiActionsDependencies) => { + const partialApi: Partial = {}; + const depsInternal: UiActionsDependenciesInternal = { ...deps, api: partialApi }; for (const [key, fn] of Object.entries(pureApi)) { (partialApi as any)[key] = fn(depsInternal); } Object.freeze(partialApi); - const api = partialApi as IUiActionsApi; + const api = partialApi as UiActionsApi; return { api, depsInternal }; }; diff --git a/src/plugins/ui_actions/public/context_menu/build_eui_context_menu_panels.tsx b/src/plugins/ui_actions/public/context_menu/build_eui_context_menu_panels.tsx index 3b76ff66f3aea..7b80a8ea830c0 100644 --- a/src/plugins/ui_actions/public/context_menu/build_eui_context_menu_panels.tsx +++ b/src/plugins/ui_actions/public/context_menu/build_eui_context_menu_panels.tsx @@ -22,7 +22,7 @@ import { EuiContextMenuPanelDescriptor, EuiContextMenuPanelItemDescriptor } from import _ from 'lodash'; import { i18n } from '@kbn/i18n'; import { uiToReactComponent } from '../../../kibana_react/public'; -import { IAction } from '../actions'; +import { Action } from '../actions'; /** * Transforms an array of Actions to the shape EuiContextMenuPanel expects. @@ -32,7 +32,7 @@ export async function buildContextMenuForActions
({ actionContext, closeMenu, }: { - actions: Array>; + actions: Array>; actionContext: A; closeMenu: () => void; }): Promise { @@ -59,7 +59,7 @@ async function buildEuiContextMenuPanelItems({ actionContext, closeMenu, }: { - actions: Array>; + actions: Array>; actionContext: A; closeMenu: () => void; }) { @@ -95,7 +95,7 @@ function convertPanelActionToContextMenuItem({ actionContext, closeMenu, }: { - action: IAction; + action: Action; actionContext: A; closeMenu: () => void; }): EuiContextMenuPanelItemDescriptor { diff --git a/src/plugins/ui_actions/public/index.ts b/src/plugins/ui_actions/public/index.ts index f0d21cade422d..427dbecb7aee4 100644 --- a/src/plugins/ui_actions/public/index.ts +++ b/src/plugins/ui_actions/public/index.ts @@ -24,13 +24,13 @@ export function plugin(initializerContext: PluginInitializerContext) { return new UiActionsPlugin(initializerContext); } -export { IUiActionsSetup, IUiActionsStart } from './plugin'; +export { UiActionsSetup, UiActionsStart } from './plugin'; export { - IAction, - ITrigger, - IUiActionsApi, - TGetActionsCompatibleWithTrigger, - TExecuteTriggerActions, + Action, + Trigger, + UiActionsApi, + GetActionsCompatibleWithTrigger, + ExecuteTriggerActions, } from './types'; export { createAction } from './actions'; export { buildContextMenuForActions } from './context_menu'; diff --git a/src/plugins/ui_actions/public/mocks.ts b/src/plugins/ui_actions/public/mocks.ts index 4a46fa54e2ac8..273c5dcf83e81 100644 --- a/src/plugins/ui_actions/public/mocks.ts +++ b/src/plugins/ui_actions/public/mocks.ts @@ -17,13 +17,13 @@ * under the License. */ -import { IUiActionsSetup, IUiActionsStart } from '.'; +import { UiActionsSetup, UiActionsStart } from '.'; import { plugin as pluginInitializer } from '.'; // eslint-disable-next-line import { coreMock } from '../../../core/public/mocks'; -export type Setup = jest.Mocked; -export type Start = jest.Mocked; +export type Setup = jest.Mocked; +export type Start = jest.Mocked; const createSetupContract = (): Setup => { const setupContract: Setup = { diff --git a/src/plugins/ui_actions/public/plugin.ts b/src/plugins/ui_actions/public/plugin.ts index 374acaaab3999..12a9b7cbc6526 100644 --- a/src/plugins/ui_actions/public/plugin.ts +++ b/src/plugins/ui_actions/public/plugin.ts @@ -18,28 +18,28 @@ */ import { CoreStart, PluginInitializerContext, CoreSetup, Plugin } from 'src/core/public'; -import { IUiActionsApi, IActionRegistry, ITriggerRegistry } from './types'; +import { UiActionsApi, ActionRegistry, TriggerRegistry } from './types'; import { createApi } from './api'; -export interface IUiActionsSetup { - attachAction: IUiActionsApi['attachAction']; - detachAction: IUiActionsApi['detachAction']; - registerAction: IUiActionsApi['registerAction']; - registerTrigger: IUiActionsApi['registerTrigger']; +export interface UiActionsSetup { + attachAction: UiActionsApi['attachAction']; + detachAction: UiActionsApi['detachAction']; + registerAction: UiActionsApi['registerAction']; + registerTrigger: UiActionsApi['registerTrigger']; } -export type IUiActionsStart = IUiActionsApi; +export type UiActionsStart = UiActionsApi; -export class UiActionsPlugin implements Plugin { - private readonly triggers: ITriggerRegistry = new Map(); - private readonly actions: IActionRegistry = new Map(); - private api!: IUiActionsApi; +export class UiActionsPlugin implements Plugin { + private readonly triggers: TriggerRegistry = new Map(); + private readonly actions: ActionRegistry = new Map(); + private api!: UiActionsApi; constructor(initializerContext: PluginInitializerContext) { this.api = createApi({ triggers: this.triggers, actions: this.actions }).api; } - public setup(core: CoreSetup): IUiActionsSetup { + public setup(core: CoreSetup): UiActionsSetup { return { registerTrigger: this.api.registerTrigger, registerAction: this.api.registerAction, @@ -48,7 +48,7 @@ export class UiActionsPlugin implements Plugin }; } - public start(core: CoreStart): IUiActionsStart { + public start(core: CoreStart): UiActionsStart { return this.api; } diff --git a/src/plugins/ui_actions/public/tests/helpers.ts b/src/plugins/ui_actions/public/tests/helpers.ts index abbc846736cd0..d1a4a71705a81 100644 --- a/src/plugins/ui_actions/public/tests/helpers.ts +++ b/src/plugins/ui_actions/public/tests/helpers.ts @@ -17,10 +17,10 @@ * under the License. */ -import { IUiActionsDependencies } from '../types'; +import { UiActionsDependencies } from '../types'; -export const createDeps = (): IUiActionsDependencies => { - const deps: IUiActionsDependencies = { +export const createDeps = (): UiActionsDependencies => { + const deps: UiActionsDependencies = { actions: new Map(), triggers: new Map(), }; diff --git a/src/plugins/ui_actions/public/tests/test_plugin.ts b/src/plugins/ui_actions/public/tests/test_plugin.ts index d1995262ce514..dcc42fd9f6fb2 100644 --- a/src/plugins/ui_actions/public/tests/test_plugin.ts +++ b/src/plugins/ui_actions/public/tests/test_plugin.ts @@ -18,20 +18,20 @@ */ import { CoreSetup, CoreStart } from 'src/core/public'; -import { UiActionsPlugin, IUiActionsSetup, IUiActionsStart } from '../plugin'; +import { UiActionsPlugin, UiActionsSetup, UiActionsStart } from '../plugin'; -export interface IUiActionsTestPluginReturn { +export interface UiActionsTestPluginReturn { plugin: UiActionsPlugin; coreSetup: CoreSetup; coreStart: CoreStart; - setup: IUiActionsSetup; - doStart: (anotherCoreStart?: CoreStart) => IUiActionsStart; + setup: UiActionsSetup; + doStart: (anotherCoreStart?: CoreStart) => UiActionsStart; } export const uiActionsTestPlugin = ( coreSetup: CoreSetup = {} as CoreSetup, coreStart: CoreStart = {} as CoreStart -): IUiActionsTestPluginReturn => { +): UiActionsTestPluginReturn => { const initializerContext = {} as any; const plugin = new UiActionsPlugin(initializerContext); const setup = plugin.setup(coreSetup); diff --git a/src/plugins/ui_actions/public/tests/test_samples/hello_world_action.tsx b/src/plugins/ui_actions/public/tests/test_samples/hello_world_action.tsx index 4e18b8ec27fb9..196f3e2d5cdc1 100644 --- a/src/plugins/ui_actions/public/tests/test_samples/hello_world_action.tsx +++ b/src/plugins/ui_actions/public/tests/test_samples/hello_world_action.tsx @@ -20,7 +20,7 @@ import React from 'react'; import { EuiFlyout, EuiFlexGroup, EuiFlexItem, EuiBadge } from '@elastic/eui'; import { CoreStart } from 'src/core/public'; -import { createAction, IAction } from '../../actions'; +import { createAction, Action } from '../../actions'; import { toMountPoint, reactToUiComponent } from '../../../../kibana_react/public'; const ReactMenuItem: React.FC = () => { @@ -38,7 +38,7 @@ const UiMenuItem = reactToUiComponent(ReactMenuItem); export const HELLO_WORLD_ACTION_ID = 'HELLO_WORLD_ACTION_ID'; -export function createHelloWorldAction(overlays: CoreStart['overlays']): IAction { +export function createHelloWorldAction(overlays: CoreStart['overlays']): Action { return createAction({ type: HELLO_WORLD_ACTION_ID, getIconType: () => 'lock', diff --git a/src/plugins/ui_actions/public/tests/test_samples/restricted_action.ts b/src/plugins/ui_actions/public/tests/test_samples/restricted_action.ts index 2e863b43e0917..aa65d3af98163 100644 --- a/src/plugins/ui_actions/public/tests/test_samples/restricted_action.ts +++ b/src/plugins/ui_actions/public/tests/test_samples/restricted_action.ts @@ -17,11 +17,11 @@ * under the License. */ -import { IAction, createAction } from '../../actions'; +import { Action, createAction } from '../../actions'; export const RESTRICTED_ACTION = 'RESTRICTED_ACTION'; -export function createRestrictedAction(isCompatibleIn: (context: C) => boolean): IAction { +export function createRestrictedAction(isCompatibleIn: (context: C) => boolean): Action { return createAction({ type: RESTRICTED_ACTION, isCompatible: async context => isCompatibleIn(context), diff --git a/src/plugins/ui_actions/public/tests/test_samples/say_hello_action.tsx b/src/plugins/ui_actions/public/tests/test_samples/say_hello_action.tsx index e984dd8fb64cc..f1265fed54b38 100644 --- a/src/plugins/ui_actions/public/tests/test_samples/say_hello_action.tsx +++ b/src/plugins/ui_actions/public/tests/test_samples/say_hello_action.tsx @@ -20,12 +20,12 @@ import React from 'react'; import { EuiFlyout } from '@elastic/eui'; import { CoreStart } from 'src/core/public'; -import { IAction, createAction } from '../../actions'; +import { Action, createAction } from '../../actions'; import { toMountPoint } from '../../../../kibana_react/public'; export const SAY_HELLO_ACTION = 'SAY_HELLO_ACTION'; -export function createSayHelloAction(overlays: CoreStart['overlays']): IAction<{ name: string }> { +export function createSayHelloAction(overlays: CoreStart['overlays']): Action<{ name: string }> { return createAction<{ name: string }>({ type: SAY_HELLO_ACTION, getDisplayName: ({ name }) => `Hello, ${name}`, diff --git a/src/plugins/ui_actions/public/triggers/attach_action.ts b/src/plugins/ui_actions/public/triggers/attach_action.ts index 17793d46c5a42..6c0beeae2bcd7 100644 --- a/src/plugins/ui_actions/public/triggers/attach_action.ts +++ b/src/plugins/ui_actions/public/triggers/attach_action.ts @@ -17,9 +17,9 @@ * under the License. */ -import { IUiActionsApiPure } from '../types'; +import { UiActionsApiPure } from '../types'; -export const attachAction: IUiActionsApiPure['attachAction'] = ({ triggers }) => ( +export const attachAction: UiActionsApiPure['attachAction'] = ({ triggers }) => ( triggerId, actionId ) => { diff --git a/src/plugins/ui_actions/public/triggers/detach_action.ts b/src/plugins/ui_actions/public/triggers/detach_action.ts index cb9bf685cdc00..710dcf9f5621b 100644 --- a/src/plugins/ui_actions/public/triggers/detach_action.ts +++ b/src/plugins/ui_actions/public/triggers/detach_action.ts @@ -17,9 +17,9 @@ * under the License. */ -import { IUiActionsApiPure } from '../types'; +import { UiActionsApiPure } from '../types'; -export const detachAction: IUiActionsApiPure['detachAction'] = ({ triggers }) => ( +export const detachAction: UiActionsApiPure['detachAction'] = ({ triggers }) => ( triggerId, actionId ) => { diff --git a/src/plugins/ui_actions/public/triggers/execute_trigger_actions.test.ts b/src/plugins/ui_actions/public/triggers/execute_trigger_actions.test.ts index f96a11d5f8cfe..7f2506daee268 100644 --- a/src/plugins/ui_actions/public/triggers/execute_trigger_actions.test.ts +++ b/src/plugins/ui_actions/public/triggers/execute_trigger_actions.test.ts @@ -17,9 +17,9 @@ * under the License. */ -import { IAction, createAction } from '../actions'; +import { Action, createAction } from '../actions'; import { openContextMenu } from '../context_menu'; -import { IUiActionsTestPluginReturn, uiActionsTestPlugin } from '../tests/test_plugin'; +import { UiActionsTestPluginReturn, uiActionsTestPlugin } from '../tests/test_plugin'; jest.mock('../context_menu'); @@ -28,7 +28,7 @@ const openContextMenuSpy = (openContextMenu as any) as jest.SpyInstance; const CONTACT_USER_TRIGGER = 'CONTACT_USER_TRIGGER'; -function createTestAction(id: string, checkCompatibility: (context: A) => boolean): IAction { +function createTestAction(id: string, checkCompatibility: (context: A) => boolean): Action { return createAction({ type: 'testAction', id, @@ -37,7 +37,7 @@ function createTestAction(id: string, checkCompatibility: (context: A) => boo }); } -let uiActions: IUiActionsTestPluginReturn; +let uiActions: UiActionsTestPluginReturn; const reset = () => { uiActions = uiActionsTestPlugin(); diff --git a/src/plugins/ui_actions/public/triggers/execute_trigger_actions.ts b/src/plugins/ui_actions/public/triggers/execute_trigger_actions.ts index ab938eeb9cffd..71f69eb3bdc29 100644 --- a/src/plugins/ui_actions/public/triggers/execute_trigger_actions.ts +++ b/src/plugins/ui_actions/public/triggers/execute_trigger_actions.ts @@ -17,11 +17,11 @@ * under the License. */ -import { IUiActionsApiPure } from '../types'; +import { UiActionsApiPure } from '../types'; import { buildContextMenuForActions, openContextMenu } from '../context_menu'; -import { IAction } from '../actions'; +import { Action } from '../actions'; -const executeSingleAction = async (action: IAction, actionContext: A) => { +const executeSingleAction = async (action: Action, actionContext: A) => { const href = action.getHref && action.getHref(actionContext); // TODO: Do we need a `getHref()` special case? @@ -33,9 +33,10 @@ const executeSingleAction = async (action: IAction, action await action.execute(actionContext); }; -export const executeTriggerActions: IUiActionsApiPure['executeTriggerActions'] = ({ - api, -}) => async (triggerId, actionContext) => { +export const executeTriggerActions: UiActionsApiPure['executeTriggerActions'] = ({ api }) => async ( + triggerId, + actionContext +) => { const actions = await api.getTriggerCompatibleActions!(triggerId, actionContext); if (!actions.length) { diff --git a/src/plugins/ui_actions/public/triggers/get_trigger.ts b/src/plugins/ui_actions/public/triggers/get_trigger.ts index d5e2b25ce6c19..5c96200261a90 100644 --- a/src/plugins/ui_actions/public/triggers/get_trigger.ts +++ b/src/plugins/ui_actions/public/triggers/get_trigger.ts @@ -17,9 +17,9 @@ * under the License. */ -import { IUiActionsApiPure } from '../types'; +import { UiActionsApiPure } from '../types'; -export const getTrigger: IUiActionsApiPure['getTrigger'] = ({ triggers }) => id => { +export const getTrigger: UiActionsApiPure['getTrigger'] = ({ triggers }) => id => { const trigger = triggers.get(id); if (!trigger) { diff --git a/src/plugins/ui_actions/public/triggers/get_trigger_actions.test.ts b/src/plugins/ui_actions/public/triggers/get_trigger_actions.test.ts index 8288bf9686fad..aef4114ffb4c6 100644 --- a/src/plugins/ui_actions/public/triggers/get_trigger_actions.test.ts +++ b/src/plugins/ui_actions/public/triggers/get_trigger_actions.test.ts @@ -17,15 +17,15 @@ * under the License. */ -import { IAction } from '../actions'; +import { Action } from '../actions'; import { uiActionsTestPlugin } from '../tests/test_plugin'; -const action1: IAction = { +const action1: Action = { id: 'action1', order: 1, type: 'type1', } as any; -const action2: IAction = { +const action2: Action = { id: 'action2', order: 2, type: 'type2', diff --git a/src/plugins/ui_actions/public/triggers/get_trigger_actions.ts b/src/plugins/ui_actions/public/triggers/get_trigger_actions.ts index 31b401a863663..37d7d5534c8c1 100644 --- a/src/plugins/ui_actions/public/triggers/get_trigger_actions.ts +++ b/src/plugins/ui_actions/public/triggers/get_trigger_actions.ts @@ -17,13 +17,13 @@ * under the License. */ -import { IUiActionsApiPure } from '../types'; -import { IAction } from '../actions'; +import { UiActionsApiPure } from '../types'; +import { Action } from '../actions'; -export const getTriggerActions: IUiActionsApiPure['getTriggerActions'] = ({ +export const getTriggerActions: UiActionsApiPure['getTriggerActions'] = ({ api, actions, }) => id => { const trigger = api.getTrigger!(id); - return trigger.actionIds.map(actionId => actions.get(actionId)).filter(Boolean) as IAction[]; + return trigger.actionIds.map(actionId => actions.get(actionId)).filter(Boolean) as Action[]; }; diff --git a/src/plugins/ui_actions/public/triggers/get_trigger_compatible_actions.test.ts b/src/plugins/ui_actions/public/triggers/get_trigger_compatible_actions.test.ts index ea89ba328f406..f4d2ea48ff6b9 100644 --- a/src/plugins/ui_actions/public/triggers/get_trigger_compatible_actions.test.ts +++ b/src/plugins/ui_actions/public/triggers/get_trigger_compatible_actions.test.ts @@ -18,12 +18,12 @@ */ import { createSayHelloAction } from '../tests/test_samples/say_hello_action'; -import { IUiActionsTestPluginReturn, uiActionsTestPlugin } from '../tests/test_plugin'; +import { UiActionsTestPluginReturn, uiActionsTestPlugin } from '../tests/test_plugin'; import { createRestrictedAction, createHelloWorldAction } from '../tests/test_samples'; -import { IAction } from '../actions'; +import { Action } from '../actions'; -let action: IAction<{ name: string }>; -let uiActions: IUiActionsTestPluginReturn; +let action: Action<{ name: string }>; +let uiActions: UiActionsTestPluginReturn; beforeEach(() => { uiActions = uiActionsTestPlugin(); action = createSayHelloAction({} as any); diff --git a/src/plugins/ui_actions/public/triggers/get_trigger_compatible_actions.ts b/src/plugins/ui_actions/public/triggers/get_trigger_compatible_actions.ts index 7843b9284eb02..8be0db7561db9 100644 --- a/src/plugins/ui_actions/public/triggers/get_trigger_compatible_actions.ts +++ b/src/plugins/ui_actions/public/triggers/get_trigger_compatible_actions.ts @@ -17,15 +17,15 @@ * under the License. */ -import { IUiActionsApiPure } from '../types'; -import { IAction } from '../actions/i_action'; +import { UiActionsApiPure } from '../types'; +import { Action } from '../actions/action'; -export const getTriggerCompatibleActions: IUiActionsApiPure['getTriggerCompatibleActions'] = ({ +export const getTriggerCompatibleActions: UiActionsApiPure['getTriggerCompatibleActions'] = ({ api, }) => async (triggerId, context) => { const actions = api.getTriggerActions!(triggerId); const isCompatibles = await Promise.all(actions.map(action => action.isCompatible(context))); - return actions.reduce( + return actions.reduce( (acc, action, i) => (isCompatibles[i] ? [...acc, action] : acc), [] ); diff --git a/src/plugins/ui_actions/public/triggers/register_trigger.ts b/src/plugins/ui_actions/public/triggers/register_trigger.ts index 252513a779d2c..c9a7bb211d05a 100644 --- a/src/plugins/ui_actions/public/triggers/register_trigger.ts +++ b/src/plugins/ui_actions/public/triggers/register_trigger.ts @@ -17,9 +17,9 @@ * under the License. */ -import { IUiActionsApiPure } from '../types'; +import { UiActionsApiPure } from '../types'; -export const registerTrigger: IUiActionsApiPure['registerTrigger'] = ({ triggers }) => trigger => { +export const registerTrigger: UiActionsApiPure['registerTrigger'] = ({ triggers }) => trigger => { if (triggers.has(trigger.id)) { throw new Error(`Trigger [trigger.id = ${trigger.id}] already registered.`); } diff --git a/src/plugins/ui_actions/public/triggers/i_trigger.ts b/src/plugins/ui_actions/public/triggers/trigger.ts similarity index 96% rename from src/plugins/ui_actions/public/triggers/i_trigger.ts rename to src/plugins/ui_actions/public/triggers/trigger.ts index 61284dc39e525..3db11953053d5 100644 --- a/src/plugins/ui_actions/public/triggers/i_trigger.ts +++ b/src/plugins/ui_actions/public/triggers/trigger.ts @@ -17,7 +17,7 @@ * under the License. */ -export interface ITrigger { +export interface Trigger { id: string; title?: string; description?: string; diff --git a/src/plugins/ui_actions/public/types.ts b/src/plugins/ui_actions/public/types.ts index d7395b1b5ccf7..ed4728342b751 100644 --- a/src/plugins/ui_actions/public/types.ts +++ b/src/plugins/ui_actions/public/types.ts @@ -17,42 +17,42 @@ * under the License. */ -import { IAction } from './actions/i_action'; -import { ITrigger } from './triggers/i_trigger'; +import { Action } from './actions/action'; +import { Trigger } from './triggers/trigger'; -export { IAction } from './actions'; -export { ITrigger } from './triggers/i_trigger'; +export { Action } from './actions'; +export { Trigger } from './triggers/trigger'; -export type TExecuteTriggerActions = (triggerId: string, actionContext: A) => Promise; +export type ExecuteTriggerActions = (triggerId: string, actionContext: A) => Promise; -export type TGetActionsCompatibleWithTrigger = ( +export type GetActionsCompatibleWithTrigger = ( triggerId: string, context: C -) => Promise; +) => Promise; -export interface IUiActionsApi { +export interface UiActionsApi { attachAction: (triggerId: string, actionId: string) => void; detachAction: (triggerId: string, actionId: string) => void; - executeTriggerActions: TExecuteTriggerActions; - getTrigger: (id: string) => ITrigger; - getTriggerActions: (id: string) => IAction[]; - getTriggerCompatibleActions: (triggerId: string, context: C) => Promise>>; - registerAction: (action: IAction) => void; - registerTrigger: (trigger: ITrigger) => void; + executeTriggerActions: ExecuteTriggerActions; + getTrigger: (id: string) => Trigger; + getTriggerActions: (id: string) => Action[]; + getTriggerCompatibleActions: (triggerId: string, context: C) => Promise>>; + registerAction: (action: Action) => void; + registerTrigger: (trigger: Trigger) => void; } -export interface IUiActionsDependencies { - actions: IActionRegistry; - triggers: ITriggerRegistry; +export interface UiActionsDependencies { + actions: ActionRegistry; + triggers: TriggerRegistry; } -export interface IUiActionsDependenciesInternal extends IUiActionsDependencies { - api: Readonly>; +export interface UiActionsDependenciesInternal extends UiActionsDependencies { + api: Readonly>; } -export type IUiActionsApiPure = { - [K in keyof IUiActionsApi]: (deps: IUiActionsDependenciesInternal) => IUiActionsApi[K]; +export type UiActionsApiPure = { + [K in keyof UiActionsApi]: (deps: UiActionsDependenciesInternal) => UiActionsApi[K]; }; -export type ITriggerRegistry = Map; -export type IActionRegistry = Map; +export type TriggerRegistry = Map; +export type ActionRegistry = Map; diff --git a/test/plugin_functional/plugins/kbn_tp_embeddable_explorer/public/np_ready/public/app/app.tsx b/test/plugin_functional/plugins/kbn_tp_embeddable_explorer/public/np_ready/public/app/app.tsx index 381590af142f7..dde58eaf44f88 100644 --- a/test/plugin_functional/plugins/kbn_tp_embeddable_explorer/public/np_ready/public/app/app.tsx +++ b/test/plugin_functional/plugins/kbn_tp_embeddable_explorer/public/np_ready/public/app/app.tsx @@ -23,12 +23,12 @@ import { GetEmbeddableFactory, GetEmbeddableFactories, } from 'src/legacy/core_plugins/embeddable_api/public/np_ready/public'; -import { TGetActionsCompatibleWithTrigger } from '../../../../../../../../src/plugins/ui_actions/public'; +import { GetActionsCompatibleWithTrigger } from '../../../../../../../../src/plugins/ui_actions/public'; import { DashboardContainerExample } from './dashboard_container_example'; import { Start as InspectorStartContract } from '../../../../../../../../src/plugins/inspector/public'; export interface AppProps { - getActions: TGetActionsCompatibleWithTrigger; + getActions: GetActionsCompatibleWithTrigger; getEmbeddableFactory: GetEmbeddableFactory; getAllEmbeddableFactories: GetEmbeddableFactories; overlays: CoreStart['overlays']; diff --git a/test/plugin_functional/plugins/kbn_tp_embeddable_explorer/public/np_ready/public/app/dashboard_container_example.tsx b/test/plugin_functional/plugins/kbn_tp_embeddable_explorer/public/np_ready/public/app/dashboard_container_example.tsx index 5cfaa1c22f4e5..0237df63351cf 100644 --- a/test/plugin_functional/plugins/kbn_tp_embeddable_explorer/public/np_ready/public/app/dashboard_container_example.tsx +++ b/test/plugin_functional/plugins/kbn_tp_embeddable_explorer/public/np_ready/public/app/dashboard_container_example.tsx @@ -35,10 +35,10 @@ import { import { CoreStart } from '../../../../../../../../src/core/public'; import { dashboardInput } from './dashboard_input'; import { Start as InspectorStartContract } from '../../../../../../../../src/plugins/inspector/public'; -import { TGetActionsCompatibleWithTrigger } from '../../../../../../../../src/plugins/ui_actions/public'; +import { GetActionsCompatibleWithTrigger } from '../../../../../../../../src/plugins/ui_actions/public'; interface Props { - getActions: TGetActionsCompatibleWithTrigger; + getActions: GetActionsCompatibleWithTrigger; getEmbeddableFactory: GetEmbeddableFactory; getAllEmbeddableFactories: GetEmbeddableFactories; overlays: CoreStart['overlays']; diff --git a/test/plugin_functional/plugins/kbn_tp_embeddable_explorer/public/np_ready/public/plugin.tsx b/test/plugin_functional/plugins/kbn_tp_embeddable_explorer/public/np_ready/public/plugin.tsx index 8f22e54bac3c1..18ece42122da7 100644 --- a/test/plugin_functional/plugins/kbn_tp_embeddable_explorer/public/np_ready/public/plugin.tsx +++ b/test/plugin_functional/plugins/kbn_tp_embeddable_explorer/public/np_ready/public/plugin.tsx @@ -19,7 +19,7 @@ import React from 'react'; import ReactDOM from 'react-dom'; import { CoreSetup, CoreStart, Plugin } from 'src/core/public'; -import { IUiActionsStart } from '../../../../../../../src/plugins/ui_actions/public'; +import { UiActionsStart } from '../../../../../../../src/plugins/ui_actions/public'; import { createHelloWorldAction } from '../../../../../../../src/plugins/ui_actions/public/tests/test_samples'; import { @@ -57,7 +57,7 @@ export interface SetupDependencies { interface StartDependencies { embeddable: IEmbeddableStart; - uiActions: IUiActionsStart; + uiActions: UiActionsStart; inspector: InspectorStartContract; __LEGACY: { ExitFullScreenButton: React.ComponentType; diff --git a/test/plugin_functional/plugins/kbn_tp_sample_panel_action/public/sample_panel_link.ts b/test/plugin_functional/plugins/kbn_tp_sample_panel_action/public/sample_panel_link.ts index f042d466c794a..7a3fb7fa85546 100644 --- a/test/plugin_functional/plugins/kbn_tp_sample_panel_action/public/sample_panel_link.ts +++ b/test/plugin_functional/plugins/kbn_tp_sample_panel_action/public/sample_panel_link.ts @@ -17,10 +17,10 @@ * under the License. */ import { npStart } from 'ui/new_platform'; -import { IAction, createAction } from '../../../../../src/plugins/ui_actions/public'; +import { Action, createAction } from '../../../../../src/plugins/ui_actions/public'; import { CONTEXT_MENU_TRIGGER } from '../../../../../src/plugins/embeddable/public'; -export const createSamplePanelLink = (): IAction => +export const createSamplePanelLink = (): Action => createAction({ type: 'samplePanelLink', getDisplayName: () => 'Sample panel Link', diff --git a/x-pack/legacy/plugins/reporting/public/panel_actions/get_csv_panel_action.tsx b/x-pack/legacy/plugins/reporting/public/panel_actions/get_csv_panel_action.tsx index fde053f8dbdfc..f8d8fdf481dd6 100644 --- a/x-pack/legacy/plugins/reporting/public/panel_actions/get_csv_panel_action.tsx +++ b/x-pack/legacy/plugins/reporting/public/panel_actions/get_csv_panel_action.tsx @@ -8,7 +8,7 @@ import { i18n } from '@kbn/i18n'; import moment from 'moment-timezone'; import { npSetup, npStart } from 'ui/new_platform'; -import { IAction, IncompatibleActionError } from '../../../../../../src/plugins/ui_actions/public'; +import { Action, IncompatibleActionError } from '../../../../../../src/plugins/ui_actions/public'; import { ViewMode, @@ -32,7 +32,7 @@ interface ActionContext { embeddable: ISearchEmbeddable; } -class GetCsvReportPanelAction implements IAction { +class GetCsvReportPanelAction implements Action { private isDownloading: boolean; public readonly type = CSV_REPORTING_ACTION; public readonly id = CSV_REPORTING_ACTION; diff --git a/x-pack/legacy/plugins/siem/public/plugin.tsx b/x-pack/legacy/plugins/siem/public/plugin.tsx index e47147db474c9..8be5510cda83a 100644 --- a/x-pack/legacy/plugins/siem/public/plugin.tsx +++ b/x-pack/legacy/plugins/siem/public/plugin.tsx @@ -16,7 +16,7 @@ import { DataPublicPluginStart } from '../../../../../src/plugins/data/public'; import { IEmbeddableStart } from '../../../../../src/plugins/embeddable/public'; import { Start as NewsfeedStart } from '../../../../../src/plugins/newsfeed/public'; import { Start as InspectorStart } from '../../../../../src/plugins/inspector/public'; -import { IUiActionsStart } from '../../../../../src/plugins/ui_actions/public'; +import { UiActionsStart } from '../../../../../src/plugins/ui_actions/public'; import { UsageCollectionSetup } from '../../../../../src/plugins/usage_collection/public'; import { initTelemetry } from './lib/telemetry'; import { KibanaServices } from './lib/kibana'; @@ -32,7 +32,7 @@ export interface StartPlugins { embeddable: IEmbeddableStart; inspector: InspectorStart; newsfeed?: NewsfeedStart; - uiActions: IUiActionsStart; + uiActions: UiActionsStart; } export type StartServices = CoreStart & StartPlugins; diff --git a/x-pack/plugins/advanced_ui_actions/public/custom_time_range_action.tsx b/x-pack/plugins/advanced_ui_actions/public/custom_time_range_action.tsx index ca11fe91abdbf..aa31b035cda58 100644 --- a/x-pack/plugins/advanced_ui_actions/public/custom_time_range_action.tsx +++ b/x-pack/plugins/advanced_ui_actions/public/custom_time_range_action.tsx @@ -7,7 +7,7 @@ import { i18n } from '@kbn/i18n'; import React from 'react'; import { IEmbeddable, Embeddable, EmbeddableInput } from 'src/plugins/embeddable/public'; -import { IAction, IncompatibleActionError } from '../../../../src/plugins/ui_actions/public'; +import { Action, IncompatibleActionError } from '../../../../src/plugins/ui_actions/public'; import { TimeRange } from '../../../../src/plugins/data/public'; import { CustomizeTimeRangeModal } from './customize_time_range_modal'; import { OpenModal, CommonlyUsedRange } from './types'; @@ -38,7 +38,7 @@ interface ActionContext { embeddable: Embeddable; } -export class CustomTimeRangeAction implements IAction { +export class CustomTimeRangeAction implements Action { public readonly type = CUSTOM_TIME_RANGE; private openModal: OpenModal; private dateFormat?: string; diff --git a/x-pack/plugins/advanced_ui_actions/public/custom_time_range_badge.tsx b/x-pack/plugins/advanced_ui_actions/public/custom_time_range_badge.tsx index 78fe8e01e599e..4ee8c91ff2a32 100644 --- a/x-pack/plugins/advanced_ui_actions/public/custom_time_range_badge.tsx +++ b/x-pack/plugins/advanced_ui_actions/public/custom_time_range_badge.tsx @@ -7,7 +7,7 @@ import React from 'react'; import { prettyDuration, commonDurationRanges } from '@elastic/eui'; import { IEmbeddable, Embeddable, EmbeddableInput } from 'src/plugins/embeddable/public'; -import { IAction, IncompatibleActionError } from '../../../../src/plugins/ui_actions/public'; +import { Action, IncompatibleActionError } from '../../../../src/plugins/ui_actions/public'; import { TimeRange } from '../../../../src/plugins/data/public'; import { CustomizeTimeRangeModal } from './customize_time_range_modal'; import { doesInheritTimeRange } from './does_inherit_time_range'; @@ -29,7 +29,7 @@ interface ActionContext { embeddable: Embeddable; } -export class CustomTimeRangeBadge implements IAction { +export class CustomTimeRangeBadge implements Action { public readonly type = CUSTOM_TIME_RANGE_BADGE; public readonly id = CUSTOM_TIME_RANGE_BADGE; public order = 7; diff --git a/x-pack/plugins/advanced_ui_actions/public/plugin.ts b/x-pack/plugins/advanced_ui_actions/public/plugin.ts index cc4a7c90de513..5c5d2d38da15e 100644 --- a/x-pack/plugins/advanced_ui_actions/public/plugin.ts +++ b/x-pack/plugins/advanced_ui_actions/public/plugin.ts @@ -11,7 +11,7 @@ import { Plugin, } from '../../../../src/core/public'; import { createReactOverlays } from '../../../../src/plugins/kibana_react/public'; -import { IUiActionsStart, IUiActionsSetup } from '../../../../src/plugins/ui_actions/public'; +import { UiActionsStart, UiActionsSetup } from '../../../../src/plugins/ui_actions/public'; import { CONTEXT_MENU_TRIGGER, PANEL_BADGE_TRIGGER, @@ -25,12 +25,12 @@ import { CommonlyUsedRange } from './types'; interface SetupDependencies { embeddable: IEmbeddableSetup; // Embeddable are needed because they register basic triggers/actions. - uiActions: IUiActionsSetup; + uiActions: UiActionsSetup; } interface StartDependencies { embeddable: IEmbeddableStart; - uiActions: IUiActionsStart; + uiActions: UiActionsStart; } export type Setup = void; From f4f5b04e8d0ecde072bab0a1e264bafa182c39b1 Mon Sep 17 00:00:00 2001 From: Maryia Lapata Date: Thu, 6 Feb 2020 19:56:51 +0300 Subject: [PATCH 73/86] [NP] Move saved object modal into new platform (#56383) * Move saved object modal into new platform * Fix TS * Revert "Fix TS" This reverts commit f2f9f5e9356d0b0de8b18e9fceebf721393eacd0. * Revert "Move saved object modal into new platform" This reverts commit d0f0ea6e302e0b6acd7657b770946189143d187f. # Conflicts: # src/legacy/core_plugins/kibana/public/discover/np_ready/angular/discover.js * Move save_object_save_modal * Move show_saved_object_save_modal.tsx * Move save_object_finder.tsx * Remove unused export * Pass I18nContext to showSaveModal * Update i18n ids * Fix map save * Refactoring * Load styles * Revert importing styles * Update snapshot * Update snapshot * Structural refactoring * Fix path Co-authored-by: Elastic Machine --- .i18nrc.json | 1 + .../kibana/public/dashboard/legacy_imports.ts | 2 - .../np_ready/dashboard_app_controller.tsx | 30 +++++----- .../np_ready/top_nav/save_modal.test.js | 2 +- .../dashboard/np_ready/top_nav/save_modal.tsx | 2 +- .../kibana/public/discover/kibana_services.ts | 2 - .../discover/np_ready/angular/discover.js | 8 ++- .../components/top_nav/open_search_panel.js | 2 +- .../public/visualize/kibana_services.ts | 2 + .../kibana/public/visualize/legacy_imports.ts | 3 - .../visualize/np_ready/editor/editor.js | 9 ++- .../kibana/public/visualize/plugin.ts | 1 + .../search_selection/search_selection.tsx | 2 +- .../ui/public/saved_objects/_index.scss | 2 +- .../dashboard_container_factory.tsx | 2 +- .../public/plugin.tsx | 14 +---- .../public/types.ts | 9 --- src/plugins/embeddable/public/index.ts | 1 - .../lib/embeddables/embeddable_factory.ts | 4 +- src/plugins/embeddable/public/lib/types.ts | 11 ---- src/plugins/kibana_react/public/index.ts | 1 - src/plugins/saved_objects/public/_index.scss | 1 + .../public/finder}/index.ts | 7 ++- .../finder}/saved_object_finder.test.tsx | 1 - .../public/finder}/saved_object_finder.tsx | 57 +++++++------------ .../saved_objects/public/index.ts} | 8 +-- .../saved_object_save_modal.test.tsx.snap | 8 +-- .../public/save_modal}/_index.scss | 0 .../saved_objects/public/save_modal/index.ts | 21 +++++++ .../save_modal}/saved_object_save_modal.scss | 0 .../saved_object_save_modal.test.tsx | 0 .../save_modal}/saved_object_save_modal.tsx | 18 +++--- .../show_saved_object_save_modal.tsx | 10 +++- .../public/np_ready/public/plugin.tsx | 14 +---- .../renderers/embeddable/embeddable.tsx | 17 ++---- .../components/embeddable_flyout/flyout.tsx | 2 +- x-pack/legacy/plugins/graph/public/app.js | 3 +- .../graph/public/components/save_modal.tsx | 2 +- .../graph/public/components/source_picker.tsx | 2 +- .../plugins/graph/public/legacy_imports.ts | 2 - .../graph/public/services/save_modal.tsx | 10 +++- .../graph/public/state_management/mocks.ts | 3 + .../public/state_management/persistence.ts | 1 + .../graph/public/state_management/store.ts | 5 +- .../plugins/lens/public/app_plugin/app.tsx | 2 +- .../maps/public/angular/map_controller.js | 8 ++- .../new_job/pages/index_or_search/page.tsx | 2 +- .../components/embeddables/embedded_map.tsx | 15 +---- .../search_selection/search_selection.tsx | 2 +- .../translations/translations/ja-JP.json | 28 ++++----- .../translations/translations/zh-CN.json | 28 ++++----- 51 files changed, 177 insertions(+), 210 deletions(-) create mode 100644 src/plugins/saved_objects/public/_index.scss rename src/plugins/{kibana_react/public/saved_objects => saved_objects/public/finder}/index.ts (87%) rename src/plugins/{kibana_react/public/saved_objects => saved_objects/public/finder}/saved_object_finder.test.tsx (99%) rename src/plugins/{kibana_react/public/saved_objects => saved_objects/public/finder}/saved_object_finder.tsx (89%) rename src/{legacy/ui/public/saved_objects/components/saved_object_save_modal.tsx => plugins/saved_objects/public/index.ts} (80%) rename src/plugins/{kibana_react/public/saved_objects => saved_objects/public/save_modal}/__snapshots__/saved_object_save_modal.test.tsx.snap (90%) rename src/plugins/{kibana_react/public/saved_objects => saved_objects/public/save_modal}/_index.scss (100%) create mode 100644 src/plugins/saved_objects/public/save_modal/index.ts rename src/plugins/{kibana_react/public/saved_objects => saved_objects/public/save_modal}/saved_object_save_modal.scss (100%) rename src/plugins/{kibana_react/public/saved_objects => saved_objects/public/save_modal}/saved_object_save_modal.test.tsx (100%) rename src/plugins/{kibana_react/public/saved_objects => saved_objects/public/save_modal}/saved_object_save_modal.tsx (93%) rename src/{legacy/ui/public/saved_objects => plugins/saved_objects/public/save_modal}/show_saved_object_save_modal.tsx (91%) diff --git a/.i18nrc.json b/.i18nrc.json index e0acda70cc348..08cf5a2823203 100644 --- a/.i18nrc.json +++ b/.i18nrc.json @@ -33,6 +33,7 @@ "navigation": "src/plugins/navigation", "newsfeed": "src/plugins/newsfeed", "regionMap": "src/legacy/core_plugins/region_map", + "savedObjects": "src/plugins/saved_objects", "server": "src/legacy/server", "statusPage": "src/legacy/core_plugins/status_page", "telemetry": "src/legacy/core_plugins/telemetry", diff --git a/src/legacy/core_plugins/kibana/public/dashboard/legacy_imports.ts b/src/legacy/core_plugins/kibana/public/dashboard/legacy_imports.ts index 14bdef99ca894..ff70ed9dc2eb7 100644 --- a/src/legacy/core_plugins/kibana/public/dashboard/legacy_imports.ts +++ b/src/legacy/core_plugins/kibana/public/dashboard/legacy_imports.ts @@ -30,11 +30,9 @@ export const legacyChrome = chrome; export { SavedObjectSaveOpts } from 'ui/saved_objects/types'; export { npSetup, npStart } from 'ui/new_platform'; export { IPrivate } from 'ui/private'; -export { SavedObjectSaveModal } from 'ui/saved_objects/components/saved_object_save_modal'; export { subscribeWithScope } from 'ui/utils/subscribe_with_scope'; // @ts-ignore export { ConfirmationButtonTypes } from 'ui/modals/confirm_modal'; -export { showSaveModal, SaveResult } from 'ui/saved_objects/show_saved_object_save_modal'; export { migrateLegacyQuery } from 'ui/utils/migrate_legacy_query'; export { KbnUrl } from 'ui/url/kbn_url'; // @ts-ignore diff --git a/src/legacy/core_plugins/kibana/public/dashboard/np_ready/dashboard_app_controller.tsx b/src/legacy/core_plugins/kibana/public/dashboard/np_ready/dashboard_app_controller.tsx index 624be02ac3b9d..9f6b01d5beb49 100644 --- a/src/legacy/core_plugins/kibana/public/dashboard/np_ready/dashboard_app_controller.tsx +++ b/src/legacy/core_plugins/kibana/public/dashboard/np_ready/dashboard_app_controller.tsx @@ -31,8 +31,6 @@ import { ConfirmationButtonTypes, migrateLegacyQuery, SavedObjectSaveOpts, - SaveResult, - showSaveModal, subscribeWithScope, } from '../legacy_imports'; import { @@ -45,6 +43,11 @@ import { syncAppFilters, syncQuery, } from '../../../../../../plugins/data/public'; +import { + SaveResult, + showSaveModal, + getSavedObjectFinder, +} from '../../../../../../plugins/saved_objects/public'; import { DASHBOARD_CONTAINER_TYPE, @@ -74,10 +77,6 @@ import { getDashboardTitle } from './dashboard_strings'; import { DashboardAppScope } from './dashboard_app'; import { convertSavedDashboardPanelToPanelState } from './lib/embeddable_saved_object_converters'; import { RenderDeps } from './application'; -import { - SavedObjectFinderProps, - SavedObjectFinderUi, -} from '../../../../../../plugins/kibana_react/public'; import { IKbnUrlStateStorage, removeQueryParam, @@ -114,7 +113,16 @@ export class DashboardAppController { share, dashboardCapabilities, npDataStart: { query: queryService }, - core: { notifications, overlays, chrome, injectedMetadata, uiSettings, savedObjects, http }, + core: { + notifications, + overlays, + chrome, + injectedMetadata, + uiSettings, + savedObjects, + http, + i18n: i18nStart, + }, history, kbnUrlStateStorage, }: DashboardAppControllerDependencies) { @@ -777,7 +785,7 @@ export class DashboardAppController { showCopyOnSave={dash.id ? true : false} /> ); - showSaveModal(dashboardSaveModal); + showSaveModal(dashboardSaveModal, i18nStart.Context); }; navActions[TopNavIds.CLONE] = () => { const currentTitle = dashboardStateManager.getTitle(); @@ -806,17 +814,13 @@ export class DashboardAppController { }; navActions[TopNavIds.ADD] = () => { if (dashboardContainer && !isErrorEmbeddable(dashboardContainer)) { - const SavedObjectFinder = (props: SavedObjectFinderProps) => ( - - ); - openAddPanelFlyout({ embeddable: dashboardContainer, getAllFactories: embeddables.getEmbeddableFactories, getFactory: embeddables.getEmbeddableFactory, notifications, overlays, - SavedObjectFinder, + SavedObjectFinder: getSavedObjectFinder(savedObjects, uiSettings), }); } }; diff --git a/src/legacy/core_plugins/kibana/public/dashboard/np_ready/top_nav/save_modal.test.js b/src/legacy/core_plugins/kibana/public/dashboard/np_ready/top_nav/save_modal.test.js index 5f708a22fd530..e3933ce9d0143 100644 --- a/src/legacy/core_plugins/kibana/public/dashboard/np_ready/top_nav/save_modal.test.js +++ b/src/legacy/core_plugins/kibana/public/dashboard/np_ready/top_nav/save_modal.test.js @@ -20,7 +20,7 @@ import React from 'react'; import { shallowWithI18nProvider } from 'test_utils/enzyme_helpers'; -jest.mock('../../legacy_imports', () => ({ +jest.mock('../../../../../../../plugins/saved_objects/public', () => ({ SavedObjectSaveModal: () => null, })); diff --git a/src/legacy/core_plugins/kibana/public/dashboard/np_ready/top_nav/save_modal.tsx b/src/legacy/core_plugins/kibana/public/dashboard/np_ready/top_nav/save_modal.tsx index bd53fd5a13083..026784fcae06f 100644 --- a/src/legacy/core_plugins/kibana/public/dashboard/np_ready/top_nav/save_modal.tsx +++ b/src/legacy/core_plugins/kibana/public/dashboard/np_ready/top_nav/save_modal.tsx @@ -21,7 +21,7 @@ import React, { Fragment } from 'react'; import { FormattedMessage } from '@kbn/i18n/react'; import { EuiFormRow, EuiTextArea, EuiSwitch } from '@elastic/eui'; -import { SavedObjectSaveModal } from '../../legacy_imports'; +import { SavedObjectSaveModal } from '../../../../../../../plugins/saved_objects/public'; interface SaveOptions { newTitle: string; diff --git a/src/legacy/core_plugins/kibana/public/discover/kibana_services.ts b/src/legacy/core_plugins/kibana/public/discover/kibana_services.ts index f698a2ee361e0..820c9949342a4 100644 --- a/src/legacy/core_plugins/kibana/public/discover/kibana_services.ts +++ b/src/legacy/core_plugins/kibana/public/discover/kibana_services.ts @@ -58,8 +58,6 @@ export { getRequestInspectorStats, getResponseInspectorStats } from '../../../da export { intervalOptions } from 'ui/agg_types'; // @ts-ignore export { migrateLegacyQuery } from 'ui/utils/migrate_legacy_query'; -export { SavedObjectSaveModal } from 'ui/saved_objects/components/saved_object_save_modal'; -export { showSaveModal } from 'ui/saved_objects/show_saved_object_save_modal'; export { stateMonitorFactory } from 'ui/state_management/state_monitor_factory'; export { subscribeWithScope } from 'ui/utils/subscribe_with_scope'; // @ts-ignore diff --git a/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/discover.js b/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/discover.js index 978a58ef5b2c4..69f69d449354c 100644 --- a/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/discover.js +++ b/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/discover.js @@ -27,6 +27,10 @@ import { i18n } from '@kbn/i18n'; import '../components/field_chooser/field_chooser'; import { RequestAdapter } from '../../../../../../../plugins/inspector/public'; +import { + SavedObjectSaveModal, + showSaveModal, +} from '../../../../../../../plugins/saved_objects/public'; // doc table import './doc_table'; import { getSortArray } from './doc_table/lib/get_sort'; @@ -48,12 +52,10 @@ import { hasSearchStategyForIndexPattern, intervalOptions, migrateLegacyQuery, - showSaveModal, unhashUrl, stateMonitorFactory, subscribeWithScope, tabifyAggResponse, - SavedObjectSaveModal, getAngularModule, ensureDefaultIndexPattern, registerTimefilterWithGlobalStateFactory, @@ -305,7 +307,7 @@ function discoverController( })} /> ); - showSaveModal(saveModal); + showSaveModal(saveModal, core.i18n.Context); }, }; diff --git a/src/legacy/core_plugins/kibana/public/discover/np_ready/components/top_nav/open_search_panel.js b/src/legacy/core_plugins/kibana/public/discover/np_ready/components/top_nav/open_search_panel.js index ebe4cbb1ddb69..747dd9abe2f2a 100644 --- a/src/legacy/core_plugins/kibana/public/discover/np_ready/components/top_nav/open_search_panel.js +++ b/src/legacy/core_plugins/kibana/public/discover/np_ready/components/top_nav/open_search_panel.js @@ -32,7 +32,7 @@ import { EuiFlyoutBody, EuiTitle, } from '@elastic/eui'; -import { SavedObjectFinderUi } from '../../../../../../../../plugins/kibana_react/public'; +import { SavedObjectFinderUi } from '../../../../../../../../plugins/saved_objects/public'; import { getServices } from '../../../kibana_services'; const SEARCH_OBJECT_TYPE = 'search'; diff --git a/src/legacy/core_plugins/kibana/public/visualize/kibana_services.ts b/src/legacy/core_plugins/kibana/public/visualize/kibana_services.ts index 15e9c73a39eff..428e6cb225710 100644 --- a/src/legacy/core_plugins/kibana/public/visualize/kibana_services.ts +++ b/src/legacy/core_plugins/kibana/public/visualize/kibana_services.ts @@ -23,6 +23,7 @@ import { SavedObjectsClientContract, ToastsStart, IUiSettingsClient, + I18nStart, } from 'kibana/public'; import { NavigationPublicPluginStart as NavigationStart } from '../../../../../plugins/navigation/public'; @@ -57,6 +58,7 @@ export interface VisualizeKibanaServices { visualizeCapabilities: any; visualizations: VisualizationsStart; usageCollection?: UsageCollectionSetup; + I18nContext: I18nStart['Context']; } let services: VisualizeKibanaServices | null = null; diff --git a/src/legacy/core_plugins/kibana/public/visualize/legacy_imports.ts b/src/legacy/core_plugins/kibana/public/visualize/legacy_imports.ts index b185dc577a3aa..bb24870c5a5f3 100644 --- a/src/legacy/core_plugins/kibana/public/visualize/legacy_imports.ts +++ b/src/legacy/core_plugins/kibana/public/visualize/legacy_imports.ts @@ -44,9 +44,6 @@ export { IPrivate } from 'ui/private'; // @ts-ignore export { PrivateProvider } from 'ui/private/private'; -export { SavedObjectSaveModal } from 'ui/saved_objects/components/saved_object_save_modal'; -export { showSaveModal } from 'ui/saved_objects/show_saved_object_save_modal'; - export { subscribeWithScope } from 'ui/utils/subscribe_with_scope'; export { migrateLegacyQuery } from 'ui/utils/migrate_legacy_query'; // @ts-ignore diff --git a/src/legacy/core_plugins/kibana/public/visualize/np_ready/editor/editor.js b/src/legacy/core_plugins/kibana/public/visualize/np_ready/editor/editor.js index 886187cbb942e..46ae45c3a5fa2 100644 --- a/src/legacy/core_plugins/kibana/public/visualize/np_ready/editor/editor.js +++ b/src/legacy/core_plugins/kibana/public/visualize/np_ready/editor/editor.js @@ -31,6 +31,10 @@ import { getEditBreadcrumbs } from '../breadcrumbs'; import { addHelpMenuToAppChrome } from '../help_menu/help_menu_util'; import { FilterStateManager } from '../../../../../data/public'; import { unhashUrl } from '../../../../../../../plugins/kibana_utils/public'; +import { + SavedObjectSaveModal, + showSaveModal, +} from '../../../../../../../plugins/saved_objects/public'; import { initVisEditorDirective } from './visualization_editor'; import { initVisualizationDirective } from './visualization'; @@ -40,8 +44,6 @@ import { absoluteToParsedUrl, KibanaParsedUrl, migrateLegacyQuery, - SavedObjectSaveModal, - showSaveModal, stateMonitorFactory, DashboardConstants, } from '../../legacy_imports'; @@ -94,6 +96,7 @@ function VisualizeAppController( core: { docLinks }, savedQueryService, uiSettings, + I18nContext, } = getServices(); const filterStateManager = new FilterStateManager(globalState, getAppState, filterManager); @@ -191,7 +194,7 @@ function VisualizeAppController( description={savedVis.description} /> ); - showSaveModal(saveModal); + showSaveModal(saveModal, I18nContext); }, }, ] diff --git a/src/legacy/core_plugins/kibana/public/visualize/plugin.ts b/src/legacy/core_plugins/kibana/public/visualize/plugin.ts index a888fc8e19f14..ce93fe7c2d578 100644 --- a/src/legacy/core_plugins/kibana/public/visualize/plugin.ts +++ b/src/legacy/core_plugins/kibana/public/visualize/plugin.ts @@ -112,6 +112,7 @@ export class VisualizePlugin implements Plugin { visualizeCapabilities: contextCore.application.capabilities.visualize, visualizations, usageCollection, + I18nContext: contextCore.i18n.Context, }; setServices(deps); diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/wizard/search_selection/search_selection.tsx b/src/legacy/core_plugins/visualizations/public/np_ready/public/wizard/search_selection/search_selection.tsx index 5a665a193ab39..9b3b8a6425e52 100644 --- a/src/legacy/core_plugins/visualizations/public/np_ready/public/wizard/search_selection/search_selection.tsx +++ b/src/legacy/core_plugins/visualizations/public/np_ready/public/wizard/search_selection/search_selection.tsx @@ -23,7 +23,7 @@ import { FormattedMessage } from '@kbn/i18n/react'; import React from 'react'; import { IUiSettingsClient, SavedObjectsStart } from 'kibana/public'; -import { SavedObjectFinderUi } from '../../../../../../../../plugins/kibana_react/public'; +import { SavedObjectFinderUi } from '../../../../../../../../plugins/saved_objects/public'; import { VisType } from '../../types'; interface SearchSelectionProps { diff --git a/src/legacy/ui/public/saved_objects/_index.scss b/src/legacy/ui/public/saved_objects/_index.scss index 50a192b6a7b17..89cda29f67744 100644 --- a/src/legacy/ui/public/saved_objects/_index.scss +++ b/src/legacy/ui/public/saved_objects/_index.scss @@ -1 +1 @@ -@import '../../../../plugins/kibana_react/public/saved_objects/index'; +@import '../../../../plugins/saved_objects/public/index'; diff --git a/src/plugins/dashboard_embeddable_container/public/embeddable/dashboard_container_factory.tsx b/src/plugins/dashboard_embeddable_container/public/embeddable/dashboard_container_factory.tsx index c8a2837fd77d0..d08fcfef3529e 100644 --- a/src/plugins/dashboard_embeddable_container/public/embeddable/dashboard_container_factory.tsx +++ b/src/plugins/dashboard_embeddable_container/public/embeddable/dashboard_container_factory.tsx @@ -18,8 +18,8 @@ */ import { i18n } from '@kbn/i18n'; +import { SavedObjectMetaData } from '../../../saved_objects/public'; import { SavedObjectAttributes } from '../../../../core/public'; -import { SavedObjectMetaData } from '../types'; import { ContainerOutput, EmbeddableFactory, diff --git a/src/plugins/dashboard_embeddable_container/public/plugin.tsx b/src/plugins/dashboard_embeddable_container/public/plugin.tsx index 1227c011dc7f8..44c9dbf2dcc4b 100644 --- a/src/plugins/dashboard_embeddable_container/public/plugin.tsx +++ b/src/plugins/dashboard_embeddable_container/public/plugin.tsx @@ -26,9 +26,8 @@ import { CONTEXT_MENU_TRIGGER, IEmbeddableSetup, IEmbeddableStart } from './embe import { ExpandPanelAction, ReplacePanelAction } from '.'; import { DashboardContainerFactory } from './embeddable/dashboard_container_factory'; import { Start as InspectorStartContract } from '../../../plugins/inspector/public'; +import { getSavedObjectFinder } from '../../../plugins/saved_objects/public'; import { - SavedObjectFinderUi, - SavedObjectFinderProps, ExitFullScreenButton as ExitFullScreenButtonUi, ExitFullScreenButtonProps, } from '../../../plugins/kibana_react/public'; @@ -61,16 +60,7 @@ export class DashboardEmbeddableContainerPublicPlugin const { application, notifications, overlays } = core; const { embeddable, inspector, uiActions } = plugins; - const SavedObjectFinder: React.FC> = props => ( - - ); + const SavedObjectFinder = getSavedObjectFinder(core.savedObjects, core.uiSettings); const useHideChrome = () => { React.useEffect(() => { diff --git a/src/plugins/dashboard_embeddable_container/public/types.ts b/src/plugins/dashboard_embeddable_container/public/types.ts index 9c2d6c0ab388d..f58be10e11ba6 100644 --- a/src/plugins/dashboard_embeddable_container/public/types.ts +++ b/src/plugins/dashboard_embeddable_container/public/types.ts @@ -17,7 +17,6 @@ * under the License. */ -import { IconType } from '@elastic/eui'; import { SavedObject as SavedObjectType, SavedObjectAttributes } from '../../../core/public'; export interface DashboardCapabilities { @@ -50,14 +49,6 @@ export interface SimpleSavedObject { delete(): void; } -export interface SavedObjectMetaData { - type: string; - name: string; - getIconForSavedObject(savedObject: SimpleSavedObject): IconType; - getTooltipForSavedObject?(savedObject: SimpleSavedObject): string; - showSavedObject?(savedObject: SimpleSavedObject): boolean; -} - interface FieldSubType { multi?: { parent: string }; nested?: { path: string }; diff --git a/src/plugins/embeddable/public/index.ts b/src/plugins/embeddable/public/index.ts index ec71a1e724c7d..af6c2acd3a9b1 100644 --- a/src/plugins/embeddable/public/index.ts +++ b/src/plugins/embeddable/public/index.ts @@ -53,7 +53,6 @@ export { PanelNotFoundError, PanelState, PropertySpec, - SavedObjectMetaData, ViewMode, isErrorEmbeddable, openAddPanelFlyout, diff --git a/src/plugins/embeddable/public/lib/embeddables/embeddable_factory.ts b/src/plugins/embeddable/public/lib/embeddables/embeddable_factory.ts index acc2da1514483..162da75c228aa 100644 --- a/src/plugins/embeddable/public/lib/embeddables/embeddable_factory.ts +++ b/src/plugins/embeddable/public/lib/embeddables/embeddable_factory.ts @@ -18,7 +18,7 @@ */ import { SavedObjectAttributes } from 'src/core/public'; -import { SavedObjectMetaData } from '../types'; +import { SavedObjectMetaData } from '../../../../saved_objects/public'; import { EmbeddableInput, EmbeddableOutput, IEmbeddable } from './i_embeddable'; import { ErrorEmbeddable } from './error_embeddable'; import { IContainer } from '../containers/i_container'; @@ -40,7 +40,7 @@ export interface OutputSpec { [key: string]: PropertySpec; } -export interface EmbeddableFactoryOptions { +export interface EmbeddableFactoryOptions { savedObjectMetaData?: SavedObjectMetaData; } diff --git a/src/plugins/embeddable/public/lib/types.ts b/src/plugins/embeddable/public/lib/types.ts index 5fc01a62351c0..1bd71163db44c 100644 --- a/src/plugins/embeddable/public/lib/types.ts +++ b/src/plugins/embeddable/public/lib/types.ts @@ -42,16 +42,5 @@ export enum ViewMode { export { Adapters }; -// import { SavedObjectMetaData } from 'ui/saved_objects/components/saved_object_finder'; -// TODO: Figure out how to do this import in New Platform. -export interface SavedObjectMetaData { - type: string; - name: string; - getIconForSavedObject(savedObject: any): any; - getTooltipForSavedObject?(savedObject: any): any; - showSavedObject?(savedObject: any): boolean; - includeFields?: string[]; -} - export type GetEmbeddableFactory = (id: string) => EmbeddableFactory | undefined; export type GetEmbeddableFactories = () => IterableIterator; diff --git a/src/plugins/kibana_react/public/index.ts b/src/plugins/kibana_react/public/index.ts index e1f90b9c60199..a9087a772a970 100644 --- a/src/plugins/kibana_react/public/index.ts +++ b/src/plugins/kibana_react/public/index.ts @@ -18,7 +18,6 @@ */ export * from './code_editor'; -export * from './saved_objects'; export * from './exit_full_screen_button'; export * from './context'; export * from './overlays'; diff --git a/src/plugins/saved_objects/public/_index.scss b/src/plugins/saved_objects/public/_index.scss new file mode 100644 index 0000000000000..fc7bb35f38b10 --- /dev/null +++ b/src/plugins/saved_objects/public/_index.scss @@ -0,0 +1 @@ +@import './save_modal/index'; diff --git a/src/plugins/kibana_react/public/saved_objects/index.ts b/src/plugins/saved_objects/public/finder/index.ts similarity index 87% rename from src/plugins/kibana_react/public/saved_objects/index.ts rename to src/plugins/saved_objects/public/finder/index.ts index ade80d2cd2a92..54a05cdfbadc3 100644 --- a/src/plugins/kibana_react/public/saved_objects/index.ts +++ b/src/plugins/saved_objects/public/finder/index.ts @@ -17,5 +17,8 @@ * under the License. */ -export * from './saved_object_finder'; -export * from './saved_object_save_modal'; +export { + SavedObjectMetaData, + SavedObjectFinderUi, + getSavedObjectFinder, +} from './saved_object_finder'; diff --git a/src/plugins/kibana_react/public/saved_objects/saved_object_finder.test.tsx b/src/plugins/saved_objects/public/finder/saved_object_finder.test.tsx similarity index 99% rename from src/plugins/kibana_react/public/saved_objects/saved_object_finder.test.tsx rename to src/plugins/saved_objects/public/finder/saved_object_finder.test.tsx index 58b396d57639b..97ac25dca8cf1 100644 --- a/src/plugins/kibana_react/public/saved_objects/saved_object_finder.test.tsx +++ b/src/plugins/saved_objects/public/finder/saved_object_finder.test.tsx @@ -36,7 +36,6 @@ import { shallow } from 'enzyme'; import React from 'react'; import * as sinon from 'sinon'; import { SavedObjectFinderUi as SavedObjectFinder } from './saved_object_finder'; -// eslint-disable-next-line import { coreMock } from '../../../../core/public/mocks'; describe('SavedObjectsFinder', () => { diff --git a/src/plugins/kibana_react/public/saved_objects/saved_object_finder.tsx b/src/plugins/saved_objects/public/finder/saved_object_finder.tsx similarity index 89% rename from src/plugins/kibana_react/public/saved_objects/saved_object_finder.tsx rename to src/plugins/saved_objects/public/finder/saved_object_finder.tsx index 2a43f29024ba7..0658ed64df84c 100644 --- a/src/plugins/kibana_react/public/saved_objects/saved_object_finder.tsx +++ b/src/plugins/saved_objects/public/finder/saved_object_finder.tsx @@ -22,10 +22,8 @@ import PropTypes from 'prop-types'; import React from 'react'; import { - CommonProps, EuiContextMenuItem, EuiContextMenuPanel, - EuiContextMenuPanelProps, EuiEmptyPrompt, EuiFieldSearch, EuiFilterButton, @@ -44,19 +42,13 @@ import { import { Direction } from '@elastic/eui/src/services/sort/sort_direction'; import { i18n } from '@kbn/i18n'; -import { SavedObjectAttributes } from '../../../../core/public'; -import { SimpleSavedObject, CoreStart } from '../../../../core/public'; -import { useKibana } from '../context'; - -// TODO the typings for EuiListGroup are incorrect - maxWidth is missing. This can be removed when the types are adjusted -const FixedEuiListGroup = (EuiListGroup as any) as React.FunctionComponent< - CommonProps & { maxWidth: boolean } ->; - -// TODO the typings for EuiContextMenuPanel are incorrect - watchedItemProps is missing. This can be removed when the types are adjusted -const FixedEuiContextMenuPanel = (EuiContextMenuPanel as any) as React.FunctionComponent< - EuiContextMenuPanelProps & { watchedItemProps: string[] } ->; +import { + SavedObjectAttributes, + SimpleSavedObject, + CoreStart, + IUiSettingsClient, + SavedObjectsStart, +} from '../../../../core/public'; export interface SavedObjectMetaData { type: string; @@ -299,7 +291,7 @@ class SavedObjectFinderUi extends React.Component< }); }} > - {i18n.translate('kibana-react.savedObjects.finder.sortAsc', { + {i18n.translate('savedObjects.finder.sortAsc', { defaultMessage: 'Ascending', })} , @@ -312,7 +304,7 @@ class SavedObjectFinderUi extends React.Component< }); }} > - {i18n.translate('kibana-react.savedObjects.finder.sortDesc', { + {i18n.translate('savedObjects.finder.sortDesc', { defaultMessage: 'Descending', })} , @@ -328,7 +320,7 @@ class SavedObjectFinderUi extends React.Component< }); }} > - {i18n.translate('kibana-react.savedObjects.finder.sortAuto', { + {i18n.translate('savedObjects.finder.sortAuto', { defaultMessage: 'Best match', })} @@ -344,10 +336,10 @@ class SavedObjectFinderUi extends React.Component< - {i18n.translate('kibana-react.savedObjects.finder.sortButtonLabel', { + {i18n.translate('savedObjects.finder.sortButtonLabel', { defaultMessage: 'Sort', })} } > - @@ -415,13 +407,13 @@ class SavedObjectFinderUi extends React.Component< hasActiveFilters={this.state.filteredTypes.length > 0} numActiveFilters={this.state.filteredTypes.length} > - {i18n.translate('kibana-react.savedObjects.finder.filterButtonLabel', { + {i18n.translate('savedObjects.finder.filterButtonLabel', { defaultMessage: 'Types', })} } > - ( )} {items.length > 0 ? ( - + {items.map(item => { const currentSavedObjectMetaData = savedObjectMetaData.find( metaData => metaData.type === item.type @@ -496,7 +488,7 @@ class SavedObjectFinderUi extends React.Component< /> ); })} - + ) : ( !this.state.isFetchingItems && )} @@ -534,15 +526,10 @@ class SavedObjectFinderUi extends React.Component< } } -const SavedObjectFinder = (props: SavedObjectFinderProps) => { - const { services } = useKibana(); - return ( - +const getSavedObjectFinder = (savedObject: SavedObjectsStart, uiSettings: IUiSettingsClient) => { + return (props: SavedObjectFinderProps) => ( + ); }; -export { SavedObjectFinder, SavedObjectFinderUi }; +export { getSavedObjectFinder, SavedObjectFinderUi }; diff --git a/src/legacy/ui/public/saved_objects/components/saved_object_save_modal.tsx b/src/plugins/saved_objects/public/index.ts similarity index 80% rename from src/legacy/ui/public/saved_objects/components/saved_object_save_modal.tsx rename to src/plugins/saved_objects/public/index.ts index 131f28059cebd..5dae8b055d2db 100644 --- a/src/legacy/ui/public/saved_objects/components/saved_object_save_modal.tsx +++ b/src/plugins/saved_objects/public/index.ts @@ -17,9 +17,5 @@ * under the License. */ -/** - * @deprecated - * - * Do not import this component from here. Import from `src/plugins/kibana_react` instead. - */ -export { SavedObjectSaveModal } from '../../../../../plugins/kibana_react/public'; +export { OnSaveProps, SavedObjectSaveModal, SaveResult, showSaveModal } from './save_modal'; +export { getSavedObjectFinder, SavedObjectFinderUi, SavedObjectMetaData } from './finder'; diff --git a/src/plugins/kibana_react/public/saved_objects/__snapshots__/saved_object_save_modal.test.tsx.snap b/src/plugins/saved_objects/public/save_modal/__snapshots__/saved_object_save_modal.test.tsx.snap similarity index 90% rename from src/plugins/kibana_react/public/saved_objects/__snapshots__/saved_object_save_modal.test.tsx.snap rename to src/plugins/saved_objects/public/save_modal/__snapshots__/saved_object_save_modal.test.tsx.snap index 307c0760de7ba..eff5ab4f1e2c7 100644 --- a/src/plugins/kibana_react/public/saved_objects/__snapshots__/saved_object_save_modal.test.tsx.snap +++ b/src/plugins/saved_objects/public/save_modal/__snapshots__/saved_object_save_modal.test.tsx.snap @@ -14,7 +14,7 @@ exports[`SavedObjectSaveModal should render matching snapshot 1`] = ` } @@ -58,7 +58,7 @@ exports[`SavedObjectSaveModal should render matching snapshot 1`] = ` label={ } @@ -79,7 +79,7 @@ exports[`SavedObjectSaveModal should render matching snapshot 1`] = ` > diff --git a/src/plugins/kibana_react/public/saved_objects/_index.scss b/src/plugins/saved_objects/public/save_modal/_index.scss similarity index 100% rename from src/plugins/kibana_react/public/saved_objects/_index.scss rename to src/plugins/saved_objects/public/save_modal/_index.scss diff --git a/src/plugins/saved_objects/public/save_modal/index.ts b/src/plugins/saved_objects/public/save_modal/index.ts new file mode 100644 index 0000000000000..f26aa732f30a1 --- /dev/null +++ b/src/plugins/saved_objects/public/save_modal/index.ts @@ -0,0 +1,21 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export { SavedObjectSaveModal, OnSaveProps } from './saved_object_save_modal'; +export { showSaveModal, SaveResult } from './show_saved_object_save_modal'; diff --git a/src/plugins/kibana_react/public/saved_objects/saved_object_save_modal.scss b/src/plugins/saved_objects/public/save_modal/saved_object_save_modal.scss similarity index 100% rename from src/plugins/kibana_react/public/saved_objects/saved_object_save_modal.scss rename to src/plugins/saved_objects/public/save_modal/saved_object_save_modal.scss diff --git a/src/plugins/kibana_react/public/saved_objects/saved_object_save_modal.test.tsx b/src/plugins/saved_objects/public/save_modal/saved_object_save_modal.test.tsx similarity index 100% rename from src/plugins/kibana_react/public/saved_objects/saved_object_save_modal.test.tsx rename to src/plugins/saved_objects/public/save_modal/saved_object_save_modal.test.tsx diff --git a/src/plugins/kibana_react/public/saved_objects/saved_object_save_modal.tsx b/src/plugins/saved_objects/public/save_modal/saved_object_save_modal.tsx similarity index 93% rename from src/plugins/kibana_react/public/saved_objects/saved_object_save_modal.tsx rename to src/plugins/saved_objects/public/save_modal/saved_object_save_modal.tsx index cdbc2bb9b5473..da70d9fe89525 100644 --- a/src/plugins/kibana_react/public/saved_objects/saved_object_save_modal.tsx +++ b/src/plugins/saved_objects/public/save_modal/saved_object_save_modal.tsx @@ -97,7 +97,7 @@ export class SavedObjectSaveModal extends React.Component { @@ -119,7 +119,7 @@ export class SavedObjectSaveModal extends React.Component { fullWidth label={ } @@ -146,7 +146,7 @@ export class SavedObjectSaveModal extends React.Component { @@ -169,7 +169,7 @@ export class SavedObjectSaveModal extends React.Component { fullWidth label={ } @@ -243,7 +243,7 @@ export class SavedObjectSaveModal extends React.Component { const { isLoading, title } = this.state; let confirmLabel: string | React.ReactNode = i18n.translate( - 'kibana-react.savedObjects.saveModal.saveButtonLabel', + 'savedObjects.saveModal.saveButtonLabel', { defaultMessage: 'Save', } @@ -277,7 +277,7 @@ export class SavedObjectSaveModal extends React.Component { @@ -288,7 +288,7 @@ export class SavedObjectSaveModal extends React.Component { >

{ {this.props.confirmButtonLabel ? this.props.confirmButtonLabel - : i18n.translate('kibana-react.savedObjects.saveModal.saveButtonLabel', { + : i18n.translate('savedObjects.saveModal.saveButtonLabel', { defaultMessage: 'Save', })} @@ -324,7 +324,7 @@ export class SavedObjectSaveModal extends React.Component { onChange={this.onCopyOnSaveChange} label={ diff --git a/src/legacy/ui/public/saved_objects/show_saved_object_save_modal.tsx b/src/plugins/saved_objects/public/save_modal/show_saved_object_save_modal.tsx similarity index 91% rename from src/legacy/ui/public/saved_objects/show_saved_object_save_modal.tsx rename to src/plugins/saved_objects/public/save_modal/show_saved_object_save_modal.tsx index 3c691c692948a..66705985c7b99 100644 --- a/src/legacy/ui/public/saved_objects/show_saved_object_save_modal.tsx +++ b/src/plugins/saved_objects/public/save_modal/show_saved_object_save_modal.tsx @@ -19,7 +19,8 @@ import React from 'react'; import ReactDOM from 'react-dom'; -import { I18nContext } from 'ui/i18n'; + +import { I18nStart } from '../../../../core/public'; /** * Represents the result of trying to persist the saved object. @@ -34,12 +35,15 @@ function isSuccess(result: SaveResult): result is { id?: string } { return 'id' in result; } -export interface MinimalSaveModalProps { +interface MinimalSaveModalProps { onSave: (...args: any[]) => Promise; onClose: () => void; } -export function showSaveModal(saveModal: React.ReactElement) { +export function showSaveModal( + saveModal: React.ReactElement, + I18nContext: I18nStart['Context'] +) { const container = document.createElement('div'); const closeModal = () => { ReactDOM.unmountComponentAtNode(container); diff --git a/test/plugin_functional/plugins/kbn_tp_embeddable_explorer/public/np_ready/public/plugin.tsx b/test/plugin_functional/plugins/kbn_tp_embeddable_explorer/public/np_ready/public/plugin.tsx index 18ece42122da7..2c58abba60558 100644 --- a/test/plugin_functional/plugins/kbn_tp_embeddable_explorer/public/np_ready/public/plugin.tsx +++ b/test/plugin_functional/plugins/kbn_tp_embeddable_explorer/public/np_ready/public/plugin.tsx @@ -37,10 +37,7 @@ import { ContactCardEmbeddableFactory, } from './embeddable_api'; import { App } from './app'; -import { - SavedObjectFinderProps, - SavedObjectFinderUi, -} from '../../../../../../../src/plugins/kibana_react/public/saved_objects'; +import { getSavedObjectFinder } from '../../../../../../../src/plugins/saved_objects/public'; import { HelloWorldEmbeddableFactory } from '../../../../../../../examples/embeddable_examples/public'; import { IEmbeddableStart, @@ -101,13 +98,6 @@ export class EmbeddableExplorerPublicPlugin plugins.__LEGACY.onRenderComplete(() => { const root = document.getElementById(REACT_ROOT_ID); - const SavedObjectFinder = (props: SavedObjectFinderProps) => ( - - ); ReactDOM.render( , root diff --git a/x-pack/legacy/plugins/canvas/canvas_plugin_src/renderers/embeddable/embeddable.tsx b/x-pack/legacy/plugins/canvas/canvas_plugin_src/renderers/embeddable/embeddable.tsx index c8cc1fe389619..549e69e57e921 100644 --- a/x-pack/legacy/plugins/canvas/canvas_plugin_src/renderers/embeddable/embeddable.tsx +++ b/x-pack/legacy/plugins/canvas/canvas_plugin_src/renderers/embeddable/embeddable.tsx @@ -17,10 +17,7 @@ import { import { start } from '../../../../../../../src/legacy/core_plugins/embeddable_api/public/np_ready/public/legacy'; import { EmbeddableExpression } from '../../expression_types/embeddable'; import { RendererStrings } from '../../../i18n'; -import { - SavedObjectFinderProps, - SavedObjectFinderUi, -} from '../../../../../../../src/plugins/kibana_react/public'; +import { getSavedObjectFinder } from '../../../../../../../src/plugins/saved_objects/public'; const { embeddable: strings } = RendererStrings; import { embeddableInputToExpression } from './embeddable_input_to_expression'; @@ -32,13 +29,6 @@ const embeddablesRegistry: { } = {}; const renderEmbeddable = (embeddableObject: IEmbeddable, domNode: HTMLElement) => { - const SavedObjectFinder = (props: SavedObjectFinderProps) => ( - - ); return (

diff --git a/x-pack/legacy/plugins/canvas/public/components/embeddable_flyout/flyout.tsx b/x-pack/legacy/plugins/canvas/public/components/embeddable_flyout/flyout.tsx index 786403f2748fa..576c7c4794b08 100644 --- a/x-pack/legacy/plugins/canvas/public/components/embeddable_flyout/flyout.tsx +++ b/x-pack/legacy/plugins/canvas/public/components/embeddable_flyout/flyout.tsx @@ -10,7 +10,7 @@ import { EuiFlyout, EuiFlyoutHeader, EuiFlyoutBody, EuiTitle } from '@elastic/eu import { SavedObjectFinderUi, SavedObjectMetaData, -} from '../../../../../../../src/plugins/kibana_react/public/saved_objects'; // eslint-disable-line +} from '../../../../../../../src/plugins/saved_objects/public/'; import { start } from '../../../../../../../src/legacy/core_plugins/embeddable_api/public/np_ready/public/legacy'; import { ComponentStrings } from '../../../i18n'; import { CoreStart } from '../../../../../../../src/core/public'; diff --git a/x-pack/legacy/plugins/graph/public/app.js b/x-pack/legacy/plugins/graph/public/app.js index d0dbf34abc055..38a601daa178e 100644 --- a/x-pack/legacy/plugins/graph/public/app.js +++ b/x-pack/legacy/plugins/graph/public/app.js @@ -12,7 +12,7 @@ import { Provider } from 'react-redux'; import { isColorDark, hexToRgb } from '@elastic/eui'; import { toMountPoint } from '../../../../../src/plugins/kibana_react/public'; -import { showSaveModal } from './legacy_imports'; +import { showSaveModal } from '../../../../../src/plugins/saved_objects/public'; import appTemplate from './angular/templates/index.html'; import listingTemplate from './angular/templates/listing_ng_wrapper.html'; @@ -290,6 +290,7 @@ export function initGraphApp(angularModule, deps) { $scope.$digest(); }, chrome, + I18nContext: coreStart.i18n.Context, }); // register things on scope passed down to react components diff --git a/x-pack/legacy/plugins/graph/public/components/save_modal.tsx b/x-pack/legacy/plugins/graph/public/components/save_modal.tsx index b60a444453f7d..3dede69d0ca93 100644 --- a/x-pack/legacy/plugins/graph/public/components/save_modal.tsx +++ b/x-pack/legacy/plugins/graph/public/components/save_modal.tsx @@ -10,7 +10,7 @@ import { i18n } from '@kbn/i18n'; import { SavedObjectSaveModal, OnSaveProps, -} from '../../../../../../src/plugins/kibana_react/public'; +} from '../../../../../../src/plugins/saved_objects/public'; import { GraphSavePolicy } from '../types/config'; diff --git a/x-pack/legacy/plugins/graph/public/components/source_picker.tsx b/x-pack/legacy/plugins/graph/public/components/source_picker.tsx index de920af8a48a5..65a431202fc98 100644 --- a/x-pack/legacy/plugins/graph/public/components/source_picker.tsx +++ b/x-pack/legacy/plugins/graph/public/components/source_picker.tsx @@ -8,7 +8,7 @@ import { i18n } from '@kbn/i18n'; import React from 'react'; import { CoreStart } from 'src/core/public'; -import { SavedObjectFinderUi } from '../../../../../../src/plugins/kibana_react/public'; +import { SavedObjectFinderUi } from '../../../../../../src/plugins/saved_objects/public'; import { IndexPatternSavedObject } from '../types'; export interface SourcePickerProps { diff --git a/x-pack/legacy/plugins/graph/public/legacy_imports.ts b/x-pack/legacy/plugins/graph/public/legacy_imports.ts index 7ea2cf6dd901b..702c6cb2d4542 100644 --- a/x-pack/legacy/plugins/graph/public/legacy_imports.ts +++ b/x-pack/legacy/plugins/graph/public/legacy_imports.ts @@ -15,6 +15,4 @@ export { createTopNavDirective, createTopNavHelper } from 'ui/kbn_top_nav/kbn_to export { confirmModalFactory } from 'ui/modals/confirm_modal'; // @ts-ignore export { addAppRedirectMessageToUrl } from 'ui/notify'; -export { SaveResult } from 'ui/saved_objects/show_saved_object_save_modal'; export { createSavedObjectClass } from 'ui/saved_objects/saved_object'; -export { showSaveModal } from 'ui/saved_objects/show_saved_object_save_modal'; diff --git a/x-pack/legacy/plugins/graph/public/services/save_modal.tsx b/x-pack/legacy/plugins/graph/public/services/save_modal.tsx index d949ac1d4a600..127ff6a2b4c37 100644 --- a/x-pack/legacy/plugins/graph/public/services/save_modal.tsx +++ b/x-pack/legacy/plugins/graph/public/services/save_modal.tsx @@ -5,9 +5,10 @@ */ import React from 'react'; +import { I18nStart } from 'src/core/public'; +import { SaveResult } from 'src/plugins/saved_objects/public'; import { GraphWorkspaceSavedObject, GraphSavePolicy } from '../types'; import { SaveModal, OnSaveGraphProps } from '../components/save_modal'; -import { SaveResult } from '../legacy_imports'; export type SaveWorkspaceHandler = ( saveOptions: { @@ -24,12 +25,14 @@ export function openSaveModal({ workspace, saveWorkspace, showSaveModal, + I18nContext, }: { savePolicy: GraphSavePolicy; hasData: boolean; workspace: GraphWorkspaceSavedObject; saveWorkspace: SaveWorkspaceHandler; - showSaveModal: (el: React.ReactNode) => void; + showSaveModal: (el: React.ReactNode, I18nContext: I18nStart['Context']) => void; + I18nContext: I18nStart['Context']; }) { const currentTitle = workspace.title; const currentDescription = workspace.description; @@ -67,6 +70,7 @@ export function openSaveModal({ title={workspace.title} description={workspace.description} showCopyOnSave={Boolean(workspace.id)} - /> + />, + I18nContext ); } diff --git a/x-pack/legacy/plugins/graph/public/state_management/mocks.ts b/x-pack/legacy/plugins/graph/public/state_management/mocks.ts index 5a4f0d033aa42..01d6927b9b886 100644 --- a/x-pack/legacy/plugins/graph/public/state_management/mocks.ts +++ b/x-pack/legacy/plugins/graph/public/state_management/mocks.ts @@ -63,6 +63,9 @@ export function createMockGraphStore({ indexPatterns: [ ({ id: '123', attributes: { title: 'test-pattern' } } as unknown) as IndexPatternSavedObject, ], + I18nContext: jest + .fn() + .mockImplementation(({ children }: { children: React.ReactNode }) => children), notifications: ({ toasts: { addDanger: jest.fn(), diff --git a/x-pack/legacy/plugins/graph/public/state_management/persistence.ts b/x-pack/legacy/plugins/graph/public/state_management/persistence.ts index 0bc7827358b81..0f72186af031f 100644 --- a/x-pack/legacy/plugins/graph/public/state_management/persistence.ts +++ b/x-pack/legacy/plugins/graph/public/state_management/persistence.ts @@ -199,5 +199,6 @@ function showModal( workspace: savedWorkspace, showSaveModal: deps.showSaveModal, saveWorkspace: saveWorkspaceHandler, + I18nContext: deps.I18nContext, }); } diff --git a/x-pack/legacy/plugins/graph/public/state_management/store.ts b/x-pack/legacy/plugins/graph/public/state_management/store.ts index bb01f20196f87..ecb7335fee5aa 100644 --- a/x-pack/legacy/plugins/graph/public/state_management/store.ts +++ b/x-pack/legacy/plugins/graph/public/state_management/store.ts @@ -6,7 +6,7 @@ import createSagaMiddleware, { SagaMiddleware } from 'redux-saga'; import { combineReducers, createStore, Store, AnyAction, Dispatch, applyMiddleware } from 'redux'; -import { ChromeStart } from 'kibana/public'; +import { ChromeStart, I18nStart } from 'kibana/public'; import { CoreStart } from 'src/core/public'; import { fieldsReducer, @@ -54,7 +54,7 @@ export interface GraphStoreDependencies { getSavedWorkspace: () => GraphWorkspaceSavedObject; notifications: CoreStart['notifications']; http: CoreStart['http']; - showSaveModal: (el: React.ReactNode) => void; + showSaveModal: (el: React.ReactNode, I18nContext: I18nStart['Context']) => void; savePolicy: GraphSavePolicy; changeUrl: (newUrl: string) => void; notifyAngular: () => void; @@ -62,6 +62,7 @@ export interface GraphStoreDependencies { setUrlTemplates: (templates: UrlTemplate[]) => void; setWorkspaceInitialized: () => void; chrome: ChromeStart; + I18nContext: I18nStart['Context']; } export function createRootReducer(basePath: string) { diff --git a/x-pack/legacy/plugins/lens/public/app_plugin/app.tsx b/x-pack/legacy/plugins/lens/public/app_plugin/app.tsx index 6d2ebee1d88db..23c595bf770d2 100644 --- a/x-pack/legacy/plugins/lens/public/app_plugin/app.tsx +++ b/x-pack/legacy/plugins/lens/public/app_plugin/app.tsx @@ -9,12 +9,12 @@ import React, { useState, useEffect, useCallback } from 'react'; import { I18nProvider } from '@kbn/i18n/react'; import { i18n } from '@kbn/i18n'; import { Query, DataPublicPluginStart } from 'src/plugins/data/public'; -import { SavedObjectSaveModal } from 'ui/saved_objects/components/saved_object_save_modal'; import { AppMountContext, NotificationsStart } from 'src/core/public'; import { IStorageWrapper } from 'src/plugins/kibana_utils/public'; import { npStart } from 'ui/new_platform'; import { FormattedMessage } from '@kbn/i18n/react'; import { KibanaContextProvider } from '../../../../../../src/plugins/kibana_react/public'; +import { SavedObjectSaveModal } from '../../../../../../src/plugins/saved_objects/public'; import { Document, SavedObjectStore } from '../persistence'; import { EditorFrameInstance } from '../types'; import { NativeRenderer } from '../native_renderer'; diff --git a/x-pack/legacy/plugins/maps/public/angular/map_controller.js b/x-pack/legacy/plugins/maps/public/angular/map_controller.js index 5f058e2ba7806..c90560a4fcfdf 100644 --- a/x-pack/legacy/plugins/maps/public/angular/map_controller.js +++ b/x-pack/legacy/plugins/maps/public/angular/map_controller.js @@ -45,8 +45,6 @@ import { import { getInspectorAdapters } from '../reducers/non_serializable_instances'; import { docTitle } from 'ui/doc_title'; import { indexPatternService, getInspector } from '../kibana_services'; -import { SavedObjectSaveModal } from 'ui/saved_objects/components/saved_object_save_modal'; -import { showSaveModal } from 'ui/saved_objects/show_saved_object_save_modal'; import { toastNotifications } from 'ui/notify'; import { getInitialLayers } from './get_initial_layers'; import { getInitialQuery } from './get_initial_query'; @@ -55,6 +53,10 @@ import { getInitialRefreshConfig } from './get_initial_refresh_config'; import { MAP_SAVED_OBJECT_TYPE, MAP_APP_PATH } from '../../common/constants'; import { npStart } from 'ui/new_platform'; import { esFilters } from '../../../../../../src/plugins/data/public'; +import { + SavedObjectSaveModal, + showSaveModal, +} from '../../../../../../src/plugins/saved_objects/public'; const savedQueryService = npStart.plugins.data.query.savedQueries; @@ -566,7 +568,7 @@ app.controller( objectType={MAP_SAVED_OBJECT_TYPE} /> ); - showSaveModal(saveModal); + showSaveModal(saveModal, npStart.core.i18n.Context); }, }, ] diff --git a/x-pack/legacy/plugins/ml/public/application/jobs/new_job/pages/index_or_search/page.tsx b/x-pack/legacy/plugins/ml/public/application/jobs/new_job/pages/index_or_search/page.tsx index cb311f04dd1d7..2fbedc1cd39bb 100644 --- a/x-pack/legacy/plugins/ml/public/application/jobs/new_job/pages/index_or_search/page.tsx +++ b/x-pack/legacy/plugins/ml/public/application/jobs/new_job/pages/index_or_search/page.tsx @@ -16,7 +16,7 @@ import { import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import { npStart } from 'ui/new_platform'; -import { SavedObjectFinderUi } from '../../../../../../../../../../src/plugins/kibana_react/public'; +import { SavedObjectFinderUi } from '../../../../../../../../../../src/plugins/saved_objects/public'; export interface PageProps { nextStepPath: string; diff --git a/x-pack/legacy/plugins/siem/public/components/embeddables/embedded_map.tsx b/x-pack/legacy/plugins/siem/public/components/embeddables/embedded_map.tsx index cbbb4f8c6249e..b1b47f7c6b775 100644 --- a/x-pack/legacy/plugins/siem/public/components/embeddables/embedded_map.tsx +++ b/x-pack/legacy/plugins/siem/public/components/embeddables/embedded_map.tsx @@ -25,10 +25,7 @@ import * as i18n from './translations'; import { MapEmbeddable, SetQuery } from './types'; import { Query, esFilters } from '../../../../../../../src/plugins/data/public'; import { useKibana, useUiSetting$ } from '../../lib/kibana'; -import { - SavedObjectFinderProps, - SavedObjectFinderUi, -} from '../../../../../../../src/plugins/kibana_react/public'; +import { getSavedObjectFinder } from '../../../../../../../src/plugins/saved_objects/public'; interface EmbeddableMapProps { maintainRatio?: boolean; @@ -177,14 +174,6 @@ export const EmbeddedMapComponent = ({ } }, [startDate, endDate]); - const SavedObjectFinder = (props: SavedObjectFinderProps) => ( - - ); - return isError ? null : ( @@ -213,7 +202,7 @@ export const EmbeddedMapComponent = ({ notifications={services.notifications} overlays={services.overlays} inspector={services.inspector} - SavedObjectFinder={SavedObjectFinder} + SavedObjectFinder={getSavedObjectFinder(services.savedObjects, services.uiSettings)} /> ) : !isLoading && isIndexError ? ( diff --git a/x-pack/legacy/plugins/transform/public/app/sections/transform_management/components/search_selection/search_selection.tsx b/x-pack/legacy/plugins/transform/public/app/sections/transform_management/components/search_selection/search_selection.tsx index 368c5aa806fe8..ff8bb7e2f432d 100644 --- a/x-pack/legacy/plugins/transform/public/app/sections/transform_management/components/search_selection/search_selection.tsx +++ b/x-pack/legacy/plugins/transform/public/app/sections/transform_management/components/search_selection/search_selection.tsx @@ -8,7 +8,7 @@ import { EuiModalBody, EuiModalHeader, EuiModalHeaderTitle } from '@elastic/eui' import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import React, { FC } from 'react'; -import { SavedObjectFinderUi } from '../../../../../../../../../../src/plugins/kibana_react/public'; +import { SavedObjectFinderUi } from '../../../../../../../../../../src/plugins/saved_objects/public'; import { useAppDependencies } from '../../../../app_dependencies'; interface SearchSelectionProps { diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 3944b3e240abf..16b96ffe283f0 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -2416,20 +2416,6 @@ "visTypeVislib.vislib.legend.toggleOptionsButtonAriaLabel": "{legendDataLabel}、トグルオプション", "kibana-react.exitFullScreenButton.exitFullScreenModeButtonLabel": "全画面を終了", "kibana-react.exitFullScreenButton.fullScreenModeDescription": "ESC キーで全画面モードを終了します。", - "kibana-react.savedObjects.finder.filterButtonLabel": "タイプ", - "kibana-react.savedObjects.finder.searchPlaceholder": "検索...", - "kibana-react.savedObjects.finder.sortAsc": "昇順", - "kibana-react.savedObjects.finder.sortAuto": "ベストマッチ", - "kibana-react.savedObjects.finder.sortButtonLabel": "並べ替え", - "kibana-react.savedObjects.finder.sortDesc": "降順", - "kibana-react.savedObjects.saveModal.cancelButtonLabel": "キャンセル", - "kibana-react.savedObjects.saveModal.descriptionLabel": "説明", - "kibana-react.savedObjects.saveModal.duplicateTitleDescription": "{confirmSaveLabel} をクリックすると、既存の {objectType} が上書きされます。", - "kibana-react.savedObjects.saveModal.duplicateTitleLabel": "「{title}」というタイトルの {objectType} が既に存在します", - "kibana-react.savedObjects.saveModal.saveAsNewLabel": "新規 {objectType} として保存", - "kibana-react.savedObjects.saveModal.saveButtonLabel": "保存", - "kibana-react.savedObjects.saveModal.saveTitle": "{objectType} を保存", - "kibana-react.savedObjects.saveModal.titleLabel": "タイトル", "newsfeed.emptyPrompt.noNewsText": "Kibanaインスタンスがインターネットにアクセスできない場合、管理者にこの機能を無効にするように依頼してください。そうでない場合は、ニュースを取り込み続けます。", "newsfeed.emptyPrompt.noNewsTitle": "ニュースがない場合", "newsfeed.flyoutList.closeButtonLabel": "閉じる", @@ -2459,6 +2445,20 @@ "regionMap.visParams.vectorMapLabel": "ベクトルマップ", "regionMap.visualization.unableToShowMismatchesWarningText": "次の各用語がシェイプの結合フィールドのシェイプと一致することを確認してください: {mismatches}", "regionMap.visualization.unableToShowMismatchesWarningTitle": "{mismatchesLength} {oneMismatch, plural, one { 件の結果} other { 件の結果}}をマップに表示できません", + "savedObjects.finder.filterButtonLabel": "タイプ", + "savedObjects.finder.searchPlaceholder": "検索...", + "savedObjects.finder.sortAsc": "昇順", + "savedObjects.finder.sortAuto": "ベストマッチ", + "savedObjects.finder.sortButtonLabel": "並べ替え", + "savedObjects.finder.sortDesc": "降順", + "savedObjects.saveModal.cancelButtonLabel": "キャンセル", + "savedObjects.saveModal.descriptionLabel": "説明", + "savedObjects.saveModal.duplicateTitleDescription": "{confirmSaveLabel} をクリックすると、既存の {objectType} が上書きされます。", + "savedObjects.saveModal.duplicateTitleLabel": "「{title}」というタイトルの {objectType} が既に存在します", + "savedObjects.saveModal.saveAsNewLabel": "新規 {objectType} として保存", + "savedObjects.saveModal.saveButtonLabel": "保存", + "savedObjects.saveModal.saveTitle": "{objectType} を保存", + "savedObjects.saveModal.titleLabel": "タイトル", "server.stats.notReadyMessage": "まだ統計が準備できていません。後程再試行してください", "server.status.disabledTitle": "無効", "server.status.greenTitle": "緑", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 4315722a888eb..6a352b41235a2 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -2416,20 +2416,6 @@ "visTypeVislib.vislib.legend.toggleOptionsButtonAriaLabel": "{legendDataLabel}切换选项", "kibana-react.exitFullScreenButton.exitFullScreenModeButtonLabel": "退出全屏", "kibana-react.exitFullScreenButton.fullScreenModeDescription": "在全屏模式下,按 ESC 键可退出。", - "kibana-react.savedObjects.finder.filterButtonLabel": "类型", - "kibana-react.savedObjects.finder.searchPlaceholder": "搜索……", - "kibana-react.savedObjects.finder.sortAsc": "升序", - "kibana-react.savedObjects.finder.sortAuto": "最佳匹配", - "kibana-react.savedObjects.finder.sortButtonLabel": "排序", - "kibana-react.savedObjects.finder.sortDesc": "降序", - "kibana-react.savedObjects.saveModal.cancelButtonLabel": "取消", - "kibana-react.savedObjects.saveModal.descriptionLabel": "描述", - "kibana-react.savedObjects.saveModal.duplicateTitleDescription": "单击“{confirmSaveLabel}”可覆盖现有 {objectType}。", - "kibana-react.savedObjects.saveModal.duplicateTitleLabel": "具有标题“{title}”的 {objectType} 已存在", - "kibana-react.savedObjects.saveModal.saveAsNewLabel": "另存为新的 {objectType}", - "kibana-react.savedObjects.saveModal.saveButtonLabel": "保存", - "kibana-react.savedObjects.saveModal.saveTitle": "保存 {objectType}", - "kibana-react.savedObjects.saveModal.titleLabel": "标题", "newsfeed.emptyPrompt.noNewsText": "如果您的 Kibana 实例没有 Internet 连接,请让您的管理员禁用此功能。否则,我们将不断尝试获取新闻。", "newsfeed.emptyPrompt.noNewsTitle": "无新闻?", "newsfeed.flyoutList.closeButtonLabel": "鍏抽棴", @@ -2459,6 +2445,20 @@ "regionMap.visParams.vectorMapLabel": "矢量地图", "regionMap.visualization.unableToShowMismatchesWarningText": "确保每个字词与该形状的联接字段匹配:{mismatches}", "regionMap.visualization.unableToShowMismatchesWarningTitle": "无法在地图上显示 {mismatchesLength} {oneMismatch, plural, one { 个结果} other { 个结果}}", + "savedObjects.finder.filterButtonLabel": "类型", + "savedObjects.finder.searchPlaceholder": "搜索……", + "savedObjects.finder.sortAsc": "升序", + "savedObjects.finder.sortAuto": "最佳匹配", + "savedObjects.finder.sortButtonLabel": "排序", + "savedObjects.finder.sortDesc": "降序", + "savedObjects.saveModal.cancelButtonLabel": "取消", + "savedObjects.saveModal.descriptionLabel": "描述", + "savedObjects.saveModal.duplicateTitleDescription": "单击“{confirmSaveLabel}”可覆盖现有 {objectType}。", + "savedObjects.saveModal.duplicateTitleLabel": "具有标题“{title}”的 {objectType} 已存在", + "savedObjects.saveModal.saveAsNewLabel": "另存为新的 {objectType}", + "savedObjects.saveModal.saveButtonLabel": "保存", + "savedObjects.saveModal.saveTitle": "保存 {objectType}", + "savedObjects.saveModal.titleLabel": "标题", "server.stats.notReadyMessage": "统计尚未就绪。请稍后重试", "server.status.disabledTitle": "已禁用", "server.status.greenTitle": "绿", From 3c80ea22ebe7e0868067225e318766871127e183 Mon Sep 17 00:00:00 2001 From: gchaps <33642766+gchaps@users.noreply.github.com> Date: Thu, 6 Feb 2020 09:16:32 -0800 Subject: [PATCH 74/86] [DOCS] Improves Management section in docs (#56669) * [DOCS] Improves Management section in docs * [DOCS] Fixes build error * [DOCS] Incorporates review comments in management docs --- docs/images/management-index-patterns.png | Bin 0 -> 53215 bytes docs/management/advanced-options.asciidoc | 4 +- .../intro-to-lifecycle-policies.asciidoc | 38 ++--- docs/management/index-patterns.asciidoc | 38 +---- .../index-patterns/images/edit_icon.png | Bin 0 -> 495 bytes docs/management/managing-beats.asciidoc | 10 +- docs/management/managing-fields.asciidoc | 56 +++++++- docs/management/managing-indices.asciidoc | 4 +- docs/management/managing-licenses.asciidoc | 24 ++-- .../managing-remote-clusters.asciidoc | 48 +++---- .../managing-saved-objects.asciidoc | 40 +++--- .../create_and_manage_rollups.asciidoc | 77 +++++------ docs/user/index.asciidoc | 8 -- docs/user/management.asciidoc | 130 ++++++++++++++++-- 14 files changed, 294 insertions(+), 183 deletions(-) create mode 100644 docs/images/management-index-patterns.png create mode 100644 docs/management/index-patterns/images/edit_icon.png diff --git a/docs/images/management-index-patterns.png b/docs/images/management-index-patterns.png new file mode 100644 index 0000000000000000000000000000000000000000..232d32893b96d3e6a0ae7775fc0cdde40a1a4bc3 GIT binary patch literal 53215 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 for more information. - -* [[set-default-pattern]]*Set the default index pattern.* {kib} uses a badge to make users -aware of which index pattern is the default. The first pattern -you create is automatically designated as the default pattern. The default -index pattern is loaded when you open *Discover*. - -* [[reload-fields]]*Refresh the index fields list.* You can refresh the index fields list to -pick up any newly-added fields. Doing so also resets Kibana’s popularity counters -for the fields. The popularity counters are used in *Discover* to sort fields in lists. - -* [[delete-pattern]]*Delete the index pattern.* This action removes the pattern from the list of -Saved Objects in {kib}. You will not be able to recover field formatters, -scripted fields, source filters, and field popularity data associated with the index pattern. -Deleting an index pattern does -not remove any indices or data documents from {es}. -+ -WARNING: Deleting an index pattern breaks all visualizations, saved searches, and -other saved objects that reference the pattern. +To drill down into the fields and associated data types in an index pattern, +click its name in the *Index patterns* overview page. +For more information, refer to <>. diff --git a/docs/management/index-patterns/images/edit_icon.png b/docs/management/index-patterns/images/edit_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d5af1751809cccb447ae6753061c438e55cab20e GIT binary patch literal 495 zcmVPx$sYygZR5%f>(>sg8KoAG;f5IX53O0fuh?Sxi7Gfc2<5#p1{S4xx(?+oH34-_r z@!e@DxVJOh=8`jaCU6URESdT3>?F~I9Qenf|D(l}Yw&u#qS0tzyWQH>;tIT6E@-t{ z@OV7vcDq=w*Dt7Jkg#U6iFiDYd_Ip*D1>^wj@4>qK^=j#O~Mk11cUSW9CV~oDfD_h zY&IJMeG96dC6h@5>vTHEX0ym-G6)0$n9XL+K!wpZW3d=lMOZGELnIQxcs$1Octkp# zHbBsKXg6ffM5R&@!{Lx0%PK^vR1$KlJRgll{G8&F3|^TA*ss@1BH?JzsWy#=HdDflP0+wC}^-|zp4QIG|! z)oP;MZgaBQrW=eBUp|}Va*4y?0A1HnC=?J31|fTf>2!)>u?WB4|NTa7?kpf7_xqjy zRj=1;V6p{{F!Ddli+r^Jx7&?>t8h5X)jFw6ITkP)jq+ACO~do~#N+Yc%6vYbihq06 lsF81@Tm)Ep=pyge&`> for the types of index patterns +that you can create. + +[float] +=== Manage your index pattern + +To view the fields and associated data types in an index pattern, click its name in +the *Index patterns* overview. + +[role="screenshot"] +image::management/index-patterns/images/new-index-pattern.png["Index files and data types"] + +Use the icons in the upper right to perform the following actions: + +* [[set-default-pattern]]*Set the default index pattern.* {kib} uses a badge to make users +aware of which index pattern is the default. The first pattern +you create is automatically designated as the default pattern. The default +index pattern is loaded when you open *Discover*. + +* *Refresh the index fields list.* You can refresh the index fields list to +pick up any newly-added fields. Doing so also resets Kibana’s popularity counters +for the fields. The popularity counters are used in *Discover* to sort fields in lists. + +* [[delete-pattern]]*Delete the index pattern.* This action removes the pattern from the list of +Saved Objects in {kib}. You will not be able to recover field formatters, +scripted fields, source filters, and field popularity data associated with the index pattern. +Deleting an index pattern does +not remove any indices or data documents from {es}. ++ +WARNING: Deleting an index pattern breaks all visualizations, saved searches, and +other saved objects that reference the pattern. + +[float] +=== Edit a field + +To edit a field's properties, click the edit icon +image:management/index-patterns/images/edit_icon.png[] in the detail view. +You can set the field's format and popularity value. Kibana has field formatters for the following field types: diff --git a/docs/management/managing-indices.asciidoc b/docs/management/managing-indices.asciidoc index 7a3480c860b16..933a2ffbf6ee2 100644 --- a/docs/management/managing-indices.asciidoc +++ b/docs/management/managing-indices.asciidoc @@ -1,6 +1,6 @@ [role="xpack"] [[managing-indices]] -== Index management +== Index Management *Index Management* enables you to view index settings, mappings, and statistics and perform index-level operations. @@ -127,7 +127,7 @@ under the *Mapped fields* tab as follows: image::images/management-index-templates-mappings.png[Mapped fields page] You can create additional mapping configurations in the *Dynamic templates* and -*Advanced options* tabs. No additional mappings are required for this example. +*Advanced options* tabs. No additional mappings are required for this example. In the fourth step, define an alias named `logstash`. diff --git a/docs/management/managing-licenses.asciidoc b/docs/management/managing-licenses.asciidoc index ecb550d3ab267..72accdb5fe2aa 100644 --- a/docs/management/managing-licenses.asciidoc +++ b/docs/management/managing-licenses.asciidoc @@ -1,32 +1,32 @@ [[managing-licenses]] -== License management +== License Management When you install the default distribution of {kib}, you receive a basic license with no expiration date. For the full list of free features that are included in -the basic license, see https://www.elastic.co/subscriptions[the subscription page]. +the basic license, refer to https://www.elastic.co/subscriptions[the subscription page]. If you want to try out the full set of platinum features, you can activate a -30-day trial license. Go to *Management > License Management* to view the +30-day trial license. Go to *Management > License Management* to view the status of your license, start a trial, or install a new license. NOTE: You can start a trial only if your cluster has not already activated a trial license for the current major product version. For example, if you have -already activated a trial for v6.0, you cannot start a new trial until -v7.0. You can, however, contact `info@elastic.co` to request an extended trial +already activated a trial for 6.0, you cannot start a new trial until +7.0. You can, however, contact `info@elastic.co` to request an extended trial license. -When you activate a new license level, new features appear in the left sidebar +When you activate a new license level, new features appear in the left sidebar of the *Management* page. [role="screenshot"] image::images/management-license.png[] At the end of the trial period, the platinum features operate in a -<>. You can revert to a basic license, -extend the trial, or purchase a subscription. +<>. You can revert to a basic license, +extend the trial, or purchase a subscription. -TIP: If {security-features} are enabled, unless you have a trial license, -you must configure Transport Layer Security (TLS) in {es}. +TIP: If {security-features} are enabled, unless you have a trial license, +you must configure Transport Layer Security (TLS) in {es}. See {ref}/encrypting-communications.html[Encrypting communications]. {kib} and the {ref}/start-basic.html[start basic API] provide a list of all of the features that will no longer be supported if you revert to a basic license. @@ -42,7 +42,7 @@ file that you install in {kib} or by using the TIP: If you are using a basic or trial license, {security-features} are disabled by default. In all other licenses, {security-features} are enabled by default; -you must secure the {stack} or disable the {security-features}. +you must secure the {stack} or disable the {security-features}. [discrete] [[license-expiration]] @@ -97,7 +97,7 @@ cluster. and start {dfeeds} are disabled. * All started {dfeeds} are stopped. * All open {anomaly-jobs} are closed. -* APIs to create and start {dfanalytics-jobs} are disabled. +* APIs to create and start {dfanalytics-jobs} are disabled. * Existing {anomaly-job} and {dfanalytics-job} results continue to be available by using {kib} or APIs. diff --git a/docs/management/managing-remote-clusters.asciidoc b/docs/management/managing-remote-clusters.asciidoc index a776cdf0334cb..6b69cfef5b768 100644 --- a/docs/management/managing-remote-clusters.asciidoc +++ b/docs/management/managing-remote-clusters.asciidoc @@ -1,8 +1,8 @@ [[working-remote-clusters]] -== Working with remote clusters +== Remote Clusters -{kib} *Management* provides user interfaces for working with data from remote -clusters and managing the {ccr} process. You can replicate indices from a +{kib} *Management* provides user interfaces for working with data from remote +clusters and managing the {ccr} process. You can replicate indices from a leader remote cluster to a follower index in a local cluster. The local follower indices can be used to provide remote backups for disaster recovery or for geo-proximite copies of data. @@ -14,51 +14,51 @@ Before using these features, you should be familiar with the following concepts: [float] [[managing-remote-clusters]] -== Managing remote clusters +== Managing remote clusters -*Remote clusters* helps you manage remote clusters for use with -{ccs} and {ccr}. You can add and remove remote clusters and check their connectivity. +*Remote clusters* helps you manage remote clusters for use with +{ccs} and {ccr}. You can add and remove remote clusters and check their connectivity. + +Before you use this feature, you should be familiar with the concept of +{ref}/modules-remote-clusters.html[remote clusters]. -Before you use this feature, you should be familiar with the concept of -{ref}/modules-remote-clusters.html[remote clusters]. - Go to *Management > Elasticsearch > Remote clusters* to create or manage your remotes. -To set up a new remote, click *Add a remote cluster*. Give the cluster a unique name -and define the seed nodes for cluster discovery. You can edit or remove your remote clusters +To set up a new remote, click *Add a remote cluster*. Give the cluster a unique name +and define the seed nodes for cluster discovery. You can edit or remove your remote clusters from the *Remote clusters* list view. [role="screenshot"] image::images/add_remote_cluster.png[][UI for adding a remote cluster] -Once a remote cluster is registered, you can use the tools under *{ccr-cap}* -to add and manage follower indices on the local cluster, and replicate data from +Once a remote cluster is registered, you can use the tools under *{ccr-cap}* +to add and manage follower indices on the local cluster, and replicate data from indices on the remote cluster based on an auto-follow index pattern. [float] [[managing-cross-cluster-replication]] == [xpack]#Managing {ccr}# -*{ccr-cap}* helps you create and manage the {ccr} process. -If you want to replicate data from existing indices, or set up -local followers on a case-by-case basis, go to *Follower indices*. -If you want to automatically detect and follow new indices when they are created -on a remote cluster, you can do so from *Auto-follow patterns*. +*{ccr-cap}* helps you create and manage the {ccr} process. +If you want to replicate data from existing indices, or set up +local followers on a case-by-case basis, go to *Follower indices*. +If you want to automatically detect and follow new indices when they are created +on a remote cluster, you can do so from *Auto-follow patterns*. -Creating an auto-follow pattern is useful when you have time-series data, like a logs index, on the -remote cluster that is created or rolled over on a daily basis. Once you have configured an -auto-follow pattern, any time a new index with a name that matches the pattern is +Creating an auto-follow pattern is useful when you have time-series data, like a logs index, on the +remote cluster that is created or rolled over on a daily basis. Once you have configured an +auto-follow pattern, any time a new index with a name that matches the pattern is created in the remote cluster, a follower index is automatically configured in the local cluster. -From the same view, you can also see a list of your saved auto-follow patterns for +From the same view, you can also see a list of your saved auto-follow patterns for a given remote cluster, and monitor whether the replication is active. Before you use these features, you should be familiar with the following concepts: -* {ref}/ccr-requirements.html[Requirements for leader indices] +* {ref}/ccr-requirements.html[Requirements for leader indices] * {ref}/ccr-auto-follow.html[Automatically following indices] -To get started, go to *Management > Elasticsearch > {ccr-cap}*. +To get started, go to *Management > Elasticsearch > {ccr-cap}*. [role="screenshot"] image::images/auto_follow_pattern.png[][UI for adding an auto-follow pattern] diff --git a/docs/management/managing-saved-objects.asciidoc b/docs/management/managing-saved-objects.asciidoc index 2daa4cf789f2a..a92a6ae4bdc09 100644 --- a/docs/management/managing-saved-objects.asciidoc +++ b/docs/management/managing-saved-objects.asciidoc @@ -1,9 +1,9 @@ [[managing-saved-objects]] -== Saved objects +== Saved Objects -*Saved Objects* helps you keep track of and manage your saved objects. These objects +The *Saved Objects* UI helps you keep track of and manage your saved objects. These objects store data for later use, including dashboards, visualizations, maps, index patterns, -Canvas workpads, and more. +Canvas workpads, and more. To get started, go to *Management > {kib} > Saved Objects*. With this UI, you can: @@ -23,8 +23,8 @@ image::images/management-saved-objects.png[Saved Objects] * To view and edit an object in its associated application, click the object title. -* To show objects that use this object, so you know the -impact of deleting it, click the actions icon image:images/actions_icon.png[Actions icon] +* To show objects that use this object, so you know the +impact of deleting it, click the actions icon image:images/actions_icon.png[Actions icon] and select *Relationships*. * To delete one or more objects, select their checkboxes, and then click *Delete*. @@ -33,19 +33,19 @@ and select *Relationships*. [[managing-saved-objects-export-objects]] === Import and export -Using the import and export commands, you can move objects between different -{kib} instances. This action is useful when you -have multiple environments for development and production. -Import and export also work well when you have a large number -of objects to update and want to batch the process. +Using the import and export commands, you can move objects between different +{kib} instances. This action is useful when you +have multiple environments for development and production. +Import and export also work well when you have a large number +of objects to update and want to batch the process. [float] ==== Import -You can import multiple objects in a single operation. Click *Import* and -navigate to the NDJSON file that -represents the objects to import. By default, +You can import multiple objects in a single operation. Click *Import* and +navigate to the NDJSON file that +represents the objects to import. By default, saved objects already in {kib} are overwritten. [float] @@ -56,7 +56,7 @@ You have two options for exporting saved objects. * Select the checkboxes of objects that you want to export, and then click *Export*. * Click *Export x objects*, and export objects by type. -This action creates an NDJSON with all your saved objects. By default, +This action creates an NDJSON with all your saved objects. By default, the NDJSON includes related objects. Exported dashboards include their associated index patterns. [float] @@ -78,9 +78,9 @@ use the <> inste === Advanced editing Some objects offer an advanced *Edit* page for modifying the object definition. -To open the page, click the actions icon image:images/actions_icon.png[Actions icon] -and select *Inspect*. -You can change the object title, add a description, and modify +To open the page, click the actions icon image:images/actions_icon.png[Actions icon] +and select *Inspect*. +You can change the object title, add a description, and modify the JSON that defines the object properties. If you access an object whose index has been deleted, you can: @@ -90,7 +90,7 @@ If you access an object whose index has been deleted, you can: * Change the index name in the object's `reference` array to point to an existing index pattern. This is useful if the index you were working with has been renamed. -WARNING: Validation is not performed for object properties. Submitting an invalid -change will render the object unusable. A more failsafe approach is to use -*Discover*, *Visualize*, or *Dashboard* to create new objects instead of +WARNING: Validation is not performed for object properties. Submitting an invalid +change will render the object unusable. A more failsafe approach is to use +*Discover*, *Visualize*, or *Dashboard* to create new objects instead of directly editing an existing one. diff --git a/docs/management/rollups/create_and_manage_rollups.asciidoc b/docs/management/rollups/create_and_manage_rollups.asciidoc index 06983c01f926d..b07f075f88032 100644 --- a/docs/management/rollups/create_and_manage_rollups.asciidoc +++ b/docs/management/rollups/create_and_manage_rollups.asciidoc @@ -1,14 +1,14 @@ [role="xpack"] [[data-rollups]] -== Rollup jobs +== Rollup Jobs -A rollup job is a periodic task that aggregates data from indices specified -by an index pattern and rolls it into a new index. Rollup indices are a good way to -compactly store months or years of historical +A rollup job is a periodic task that aggregates data from indices specified +by an index pattern, and then rolls it into a new index. Rollup indices are a good way to +compactly store months or years of historical data for use in visualizations and reports. -You’ll find *Rollup Jobs* under *Management > Elasticsearch*. With this UI, +You’ll find *Rollup Jobs* under *Management > Elasticsearch*. With this UI, you can: * <> @@ -17,22 +17,22 @@ you can: [role="screenshot"] image::images/management_rollup_list.png[][List of currently active rollup jobs] -Before using this feature, you should be familiar with how rollups work. -{ref}/xpack-rollup.html[Rolling up historical data] is a good source for more detailed information. +Before using this feature, you should be familiar with how rollups work. +{ref}/xpack-rollup.html[Rolling up historical data] is a good source for more detailed information. [float] [[create-and-manage-rollup-job]] === Create a rollup job -{kib} makes it easy for you to create a rollup job by walking you through -the process. You fill in the name, data flow, and how often you want to roll -up the data. Then you define a date histogram aggregation for the rollup job -and optionally terms, histogram, and metrics aggregations. +{kib} makes it easy for you to create a rollup job by walking you through +the process. You fill in the name, data flow, and how often you want to roll +up the data. Then you define a date histogram aggregation for the rollup job +and optionally define terms, histogram, and metrics aggregations. -When defining the index pattern, you must enter a name that is different than -the output rollup index. Otherwise, the job -will attempt to capture the data in the rollup index. For example, if your index pattern is `metricbeat-*`, -you can name your rollup index `rollup-metricbeat`, but not `metricbeat-rollup`. +When defining the index pattern, you must enter a name that is different than +the output rollup index. Otherwise, the job +will attempt to capture the data in the rollup index. For example, if your index pattern is `metricbeat-*`, +you can name your rollup index `rollup-metricbeat`, but not `metricbeat-rollup`. [role="screenshot"] image::images/management_create_rollup_job.png[][Wizard that walks you through creation of a rollup job] @@ -41,38 +41,38 @@ image::images/management_create_rollup_job.png[][Wizard that walks you through c [[manage-rollup-job]] === Start, stop, and delete rollup jobs -Once you’ve saved a rollup job, you’ll see it the *Rollup Jobs* overview page, -where you can drill down for further investigation. The *Manage* menu in +Once you’ve saved a rollup job, you’ll see it the *Rollup Jobs* overview page, +where you can drill down for further investigation. The *Manage* menu in the lower right enables you to start, stop, and delete the rollup job. You must first stop a rollup job before deleting it. [role="screenshot"] image::images/management_rollup_job_details.png[][Rollup job details] -You can’t change a rollup job after you’ve created it. To select additional fields -or redefine terms, you must delete the existing job, and then create a new one -with the updated specifications. Be sure to use a different name for the new rollup -job—reusing the same name can lead to problems with mismatched job configurations. -You can read more at {ref}/rollup-job-config.html[rollup job configuration]. +You can’t change a rollup job after you’ve created it. To select additional fields +or redefine terms, you must delete the existing job, and then create a new one +with the updated specifications. Be sure to use a different name for the new rollup +job—reusing the same name can lead to problems with mismatched job configurations. +You can read more at {ref}/rollup-job-config.html[rollup job configuration]. [float] === Try it: Create and visualize rolled up data -This example creates a rollup job to capture log data from sample web logs. +This example creates a rollup job to capture log data from sample web logs. To follow along, add the <>. In this example, you want data that is older than 7 days in the target index pattern `kibana_sample_data_logs` -to roll up once a day into the index `rollup_logstash`. You’ll bucket the -rolled up data on an hourly basis, using 60m for the time bucket configuration. +to roll up once a day into the index `rollup_logstash`. You’ll bucket the +rolled up data on an hourly basis, using 60m for the time bucket configuration. This allows for more granular queries, such as 2h and 12h. [float] ==== Create the rollup job -As you walk through the *Create rollup job* UI, enter the data shown in -the table below. The terms, histogram, and metrics fields reflect -the key information to retain in the rolled up data: where visitors are from (geo.src), -what operating system they are using (machine.os.keyword), +As you walk through the *Create rollup job* UI, enter the data shown in +the table below. The terms, histogram, and metrics fields reflect +the key information to retain in the rolled up data: where visitors are from (geo.src), +what operating system they are using (machine.os.keyword), and how much data is being sent (bytes). |=== @@ -118,31 +118,28 @@ and how much data is being sent (bytes). |=== -You can now use the rolled up data for analysis at a fraction of the storage cost -of the original index. The original data can live side by side with the new +You can now use the rolled up data for analysis at a fraction of the storage cost +of the original index. The original data can live side by side with the new rollup index, or you can remove or archive it using <>. [float] ==== Visualize the rolled up data -Your next step is to visualize your rolled up data in a vertical bar chart. +Your next step is to visualize your rolled up data in a vertical bar chart. Most visualizations support rolled up data, with the exception of Timelion, TSVB, and Vega visualizations. -Using the information from the example rollup configuration described above, -you can use `rollup_logstash` to match the rolled up index pattern, -and `kibana_sample_data_logs` to match the index pattern for raw data. -The notation for a combination index pattern with both raw and rolled up data +Using the information from the example rollup configuration described above, +you can use `rollup_logstash` to match the rolled up index pattern, +and `kibana_sample_data_logs` to match the index pattern for raw data. +The notation for a combination index pattern with both raw and rolled up data is `rollup_logstash,kibana_sample_data_logs`. [role="screenshot"] image::images/management_rollup_job_vis.png[][Visualization of rolled up data] -You can then create a dashboard that contains visualizations of the rolled up +You can then create a dashboard that contains visualizations of the rolled up data, raw data, or both. See <> for more information. [role="screenshot"] image::images/management_rollup_job_dashboard.png[][Dashboard with rolled up data] - - - diff --git a/docs/user/index.asciidoc b/docs/user/index.asciidoc index ebe6c10c49872..3911d57e05c9a 100644 --- a/docs/user/index.asciidoc +++ b/docs/user/index.asciidoc @@ -38,14 +38,6 @@ include::monitoring/index.asciidoc[] include::management.asciidoc[] -include::{kib-repo-dir}/spaces/index.asciidoc[] - -include::security/index.asciidoc[] - -include::{kib-repo-dir}/management/watcher-ui/index.asciidoc[] - -include::{kib-repo-dir}/management/upgrade-assistant/index.asciidoc[] - include::reporting/index.asciidoc[] include::api.asciidoc[] diff --git a/docs/user/management.asciidoc b/docs/user/management.asciidoc index 2c41d0072fe5b..1c55ffc73ca72 100644 --- a/docs/user/management.asciidoc +++ b/docs/user/management.asciidoc @@ -3,17 +3,115 @@ [partintro] -- -The Management application is where you perform your runtime configuration of -Kibana, including both the initial setup and ongoing configuration of index -patterns, advanced settings that tweak the behaviors of Kibana itself, and -the various "objects" that you can save throughout Kibana such as searches, -visualizations, and dashboards. +*Management* is home to UIs for managing all things Elastic Stack— +indices, clusters, licenses, UI settings, index patterns, spaces, and more. + +[float] +[[manage-Elasticsearch]] +== Manage {es} + +[cols="50, 50"] +|=== + +a| <> + +Replicate indices on a remote cluster and copy them to a follower index on a local cluster. +This is important for +disaster recovery. It also keeps data local for faster queries. + +| <> + +Create a policy for defining the lifecycle of an index as it ages +through the hot, warm, cold, and delete phases. +Such policies help you control operation costs +because you can put data in different resource tiers. + +a| <> + +View index settings, mappings, and statistics and perform operations, such as refreshing, +flushing, and clearing the cache. Practicing good index management ensures +that your data is stored cost effectively. + +| <> + +View the status of your license, start a trial, or install a new license. For +the full list of features that are included in your license, +see the https://www.elastic.co/subscriptions[subscription page]. + +| <> + +Manage your remote clusters for use with cross-cluster search and cross-cluster replication. +You can add and remove remote clusters, and check their connectivity. + +| <> + +Create a job that periodically aggregates data from one or more indices, and then +rolls it into a new, compact index. Rollup indices are a good way to store months or +years of historical data in combination with your raw data. + +| <> + +Define a policy that creates, schedules, and automatically deletes snapshots to ensure that you +have backups of your cluster in case something goes wrong. + +| {ref}/transforms.html[*Transforms*] + +Use transforms to pivot existing {es} indices into summarized or entity-centric indices. + +| <> + +Identify the issues that you need to address before upgrading to the +next major version of {es}, and then reindex, if needed. + +| <> + +Detect changes in your data by creating, managing, and monitoring alerts. +For example, create an alert when the maximum total CPU usage on a machine goes +above a certain percentage. + +|=== + +[float] +[[manage-kibana]] +== Manage {kib} + +[cols="50, 50"] +|=== + +a| <> + +Customize {kib} to suit your needs. Change the format for displaying dates, turn on dark mode, +set the timespan for notification messages, and much more. + +| <> + +Create and manage the index patterns that help you retrieve your data from {es}. + +| <> + +Monitor the generation of reports—PDF, PNG, and CSV—and download reports that you previously generated. +A report can contain a dashboard, visualization, saved search, or Canvas workpad. + +| <> + +Copy, edit, delete, import, and export your saved objects. +These include dashboards, visualizations, maps, index patterns, Canvas workpads, and more. + +| <> + +Create spaces to organize your dashboards and other saved objects into categories. +A space is isolated from all other spaces, +so you can tailor it to your needs without impacting others. + +|   + +|=== -- -include::{kib-repo-dir}/management/managing-licenses.asciidoc[] +include::{kib-repo-dir}/management/advanced-options.asciidoc[] -include::{kib-repo-dir}/management/rollups/create_and_manage_rollups.asciidoc[] +include::{kib-repo-dir}/management/managing-beats.asciidoc[] include::{kib-repo-dir}/management/index-lifecycle-policies/intro-to-lifecycle-policies.asciidoc[] @@ -25,16 +123,24 @@ include::{kib-repo-dir}/management/index-lifecycle-policies/add-policy-to-index. include::{kib-repo-dir}/management/index-lifecycle-policies/example-index-lifecycle-policy.asciidoc[] +include::{kib-repo-dir}/management/managing-indices.asciidoc[] + include::{kib-repo-dir}/management/managing-fields.asciidoc[] -include::{kib-repo-dir}/management/managing-indices.asciidoc[] +include::{kib-repo-dir}/management/managing-licenses.asciidoc[] -include::{kib-repo-dir}/management/advanced-options.asciidoc[] +include::{kib-repo-dir}/management/managing-remote-clusters.asciidoc[] -include::{kib-repo-dir}/management/managing-saved-objects.asciidoc[] +include::{kib-repo-dir}/management/rollups/create_and_manage_rollups.asciidoc[] -include::{kib-repo-dir}/management/managing-beats.asciidoc[] +include::{kib-repo-dir}/management/managing-saved-objects.asciidoc[] -include::{kib-repo-dir}/management/managing-remote-clusters.asciidoc[] +include::security/index.asciidoc[] include::{kib-repo-dir}/management/snapshot-restore/index.asciidoc[] + +include::{kib-repo-dir}/spaces/index.asciidoc[] + +include::{kib-repo-dir}/management/upgrade-assistant/index.asciidoc[] + +include::{kib-repo-dir}/management/watcher-ui/index.asciidoc[] From 335d784c0e513197bb37d7ab571f9dc8354dcbac Mon Sep 17 00:00:00 2001 From: Alex Holmansky Date: Thu, 6 Feb 2020 12:18:09 -0500 Subject: [PATCH 75/86] Update project assigner workflows to latest version of the action (#56988) Update workflow to use v1.0.2 of the action --- .github/workflows/pr-project-assigner.yml | 2 +- .github/workflows/project-assigner.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pr-project-assigner.yml b/.github/workflows/pr-project-assigner.yml index ccaa5b11aa80c..c85b4b3b8fe79 100644 --- a/.github/workflows/pr-project-assigner.yml +++ b/.github/workflows/pr-project-assigner.yml @@ -8,7 +8,7 @@ jobs: name: Assign a PR to project based on label steps: - name: Assign to project - uses: elastic/github-actions/project-assigner@v1.0.1 + uses: elastic/github-actions/project-assigner@v1.0.2 id: project_assigner with: issue-mappings: | diff --git a/.github/workflows/project-assigner.yml b/.github/workflows/project-assigner.yml index 737da4f7fe371..efcf53c722527 100644 --- a/.github/workflows/project-assigner.yml +++ b/.github/workflows/project-assigner.yml @@ -8,7 +8,7 @@ jobs: name: Assign issue or PR to project based on label steps: - name: Assign to project - uses: elastic/github-actions/project-assigner@v1.0.1 + uses: elastic/github-actions/project-assigner@v1.0.2 id: project_assigner with: issue-mappings: '[{"label": "Team:AppArch", "projectName": "kibana-app-arch", "columnId": 6173895}, {"label": "Feature:Lens", "projectName": "Lens", "columnId": 6219363}, {"label": "Team:Canvas", "projectName": "canvas", "columnId": 6187593}]' From bb6dac427299cbbc28ff1726486a2ad26d6539a4 Mon Sep 17 00:00:00 2001 From: Shahzad Date: Thu, 6 Feb 2020 18:22:59 +0100 Subject: [PATCH 76/86] Fix issue with Kibana Icon in Uptime App (#56837) --- .../public/components/functional/charts/donut_chart.tsx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/charts/donut_chart.tsx b/x-pack/legacy/plugins/uptime/public/components/functional/charts/donut_chart.tsx index 35ee35e2926a8..09e28efb4e50b 100644 --- a/x-pack/legacy/plugins/uptime/public/components/functional/charts/donut_chart.tsx +++ b/x-pack/legacy/plugins/uptime/public/components/functional/charts/donut_chart.tsx @@ -32,15 +32,20 @@ export const DonutChart = ({ height, down, up, width }: DonutChartProps) => { useEffect(() => { if (chartElement.current !== null) { // we must remove any existing paths before painting - d3.selectAll('g').remove(); + d3.select(chartElement.current) + .selectAll('g') + .remove(); + const svgElement = d3 .select(chartElement.current) .append('g') .attr('transform', `translate(${width / 2}, ${height / 2})`); + const color = d3.scale .ordinal() .domain(['up', 'down']) .range([gray, danger]); + const pieGenerator = d3.layout .pie() .value(({ value }: any) => value) @@ -69,6 +74,7 @@ export const DonutChart = ({ height, down, up, width }: DonutChartProps) => { .attr('fill', (d: any) => color(d.data.key)); } }, [danger, down, gray, height, upCount, width]); + return ( From a81918c6db01b352211c15b64b0fccb09fbfd498 Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Thu, 6 Feb 2020 19:02:33 +0100 Subject: [PATCH 77/86] IE11 does not know about 'unset' CSS properties (#56961) --- .../models/legacy_core_editor/legacy_core_editor.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/console/public/application/models/legacy_core_editor/legacy_core_editor.ts b/src/plugins/console/public/application/models/legacy_core_editor/legacy_core_editor.ts index a0384a742cb21..19a86648d6dd3 100644 --- a/src/plugins/console/public/application/models/legacy_core_editor/legacy_core_editor.ts +++ b/src/plugins/console/public/application/models/legacy_core_editor/legacy_core_editor.ts @@ -258,13 +258,13 @@ export class LegacyCoreEditor implements CoreEditor { } else { if (topOrBottom === 'top') { this.$actions.css({ - bottom: 'unset', + bottom: 'auto', top: value, visibility: 'visible', }); } else { this.$actions.css({ - top: 'unset', + top: 'auto', bottom: value, visibility: 'visible', }); From fadb1f1aafd4b956793482acb3412eccbba6e237 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20C=C3=B4t=C3=A9?= Date: Thu, 6 Feb 2020 14:46:20 -0500 Subject: [PATCH 78/86] Create mocks.ts file for task manager (#57001) --- x-pack/plugins/task_manager/server/mocks.ts | 32 +++++++++++++++++++ x-pack/plugins/task_manager/server/plugin.ts | 4 +-- .../task_manager/server/task_manager.mock.ts | 2 -- 3 files changed, 33 insertions(+), 5 deletions(-) create mode 100644 x-pack/plugins/task_manager/server/mocks.ts diff --git a/x-pack/plugins/task_manager/server/mocks.ts b/x-pack/plugins/task_manager/server/mocks.ts new file mode 100644 index 0000000000000..00b27bd55e7dd --- /dev/null +++ b/x-pack/plugins/task_manager/server/mocks.ts @@ -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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { TaskManagerSetupContract, TaskManagerStartContract } from './plugin'; + +const createSetupMock = () => { + const mock: jest.Mocked = { + registerLegacyAPI: jest.fn(), + addMiddleware: jest.fn(), + registerTaskDefinitions: jest.fn(), + }; + return mock; +}; + +const createStartMock = () => { + const mock: jest.Mocked = { + fetch: jest.fn(), + remove: jest.fn(), + schedule: jest.fn(), + runNow: jest.fn(), + ensureScheduled: jest.fn(), + }; + return mock; +}; + +export const taskManagerMock = { + createSetup: createSetupMock, + createStart: createStartMock, +}; diff --git a/x-pack/plugins/task_manager/server/plugin.ts b/x-pack/plugins/task_manager/server/plugin.ts index f3dff2a88f53a..5e59be65c729d 100644 --- a/x-pack/plugins/task_manager/server/plugin.ts +++ b/x-pack/plugins/task_manager/server/plugin.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ import { PluginInitializerContext, Plugin, CoreSetup } from 'src/core/server'; -import { Observable, Subject } from 'rxjs'; +import { Subject } from 'rxjs'; import { first } from 'rxjs/operators'; import { once } from 'lodash'; import { TaskDictionary, TaskDefinition } from './task'; @@ -16,7 +16,6 @@ import { Middleware } from './lib/middleware'; // eslint-disable-next-line @typescript-eslint/no-empty-interface export interface PluginLegacyDependencies {} export type TaskManagerSetupContract = { - config$: Observable; registerLegacyAPI: (legacyDependencies: PluginLegacyDependencies) => Promise; } & Pick; @@ -41,7 +40,6 @@ export class TaskManagerPlugin const config$ = this.initContext.config.create(); const elasticsearch = core.elasticsearch.adminClient; return { - config$, registerLegacyAPI: once((__LEGACY: PluginLegacyDependencies) => { config$.subscribe(async config => { const [{ savedObjects }] = await core.getStartServices(); diff --git a/x-pack/plugins/task_manager/server/task_manager.mock.ts b/x-pack/plugins/task_manager/server/task_manager.mock.ts index 9750dd14100d9..89d1210b00671 100644 --- a/x-pack/plugins/task_manager/server/task_manager.mock.ts +++ b/x-pack/plugins/task_manager/server/task_manager.mock.ts @@ -5,14 +5,12 @@ */ import { TaskManagerSetupContract, TaskManagerStartContract } from './plugin'; -import { Subject } from 'rxjs'; export const taskManagerMock = { setup(overrides: Partial> = {}) { const mocked: jest.Mocked = { registerTaskDefinitions: jest.fn(), addMiddleware: jest.fn(), - config$: new Subject(), registerLegacyAPI: jest.fn(), ...overrides, }; From 0748c5c32f990b1d32036dcea305e46939ab657a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20C=C3=B4t=C3=A9?= Date: Thu, 6 Feb 2020 14:47:41 -0500 Subject: [PATCH 79/86] Create plugin mock for actions plugin (#57002) * Create plugin mock for actions plugin * Expose actionsClientMock and set as default resolve value for getActionsClientWithRequest --- x-pack/plugins/actions/server/mocks.ts | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/actions/server/mocks.ts b/x-pack/plugins/actions/server/mocks.ts index 4e000160aa477..1f68d8d4a3a69 100644 --- a/x-pack/plugins/actions/server/mocks.ts +++ b/x-pack/plugins/actions/server/mocks.ts @@ -4,4 +4,27 @@ * you may not use this file except in compliance with the Elastic License. */ -export { actionsClientMock } from './actions_client.mock'; +import { actionsClientMock } from './actions_client.mock'; +import { PluginSetupContract, PluginStartContract } from './plugin'; + +export { actionsClientMock }; + +const createSetupMock = () => { + const mock: jest.Mocked = { + registerType: jest.fn(), + }; + return mock; +}; + +const createStartMock = () => { + const mock: jest.Mocked = { + execute: jest.fn(), + getActionsClientWithRequest: jest.fn().mockResolvedValue(actionsClientMock.create()), + }; + return mock; +}; + +export const actionsMock = { + createSetup: createSetupMock, + createStart: createStartMock, +}; From 8e9e4e18ce1b5809c59c4710dcaf5e011932347b Mon Sep 17 00:00:00 2001 From: Matthias Wilhelm Date: Thu, 6 Feb 2020 20:52:24 +0100 Subject: [PATCH 80/86] Unskip functional testing of TSVB index pattern switching (#56848) * Unskip test * Remove comment --- test/functional/apps/visualize/_tsvb_chart.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/test/functional/apps/visualize/_tsvb_chart.ts b/test/functional/apps/visualize/_tsvb_chart.ts index 8dbe356889568..6a4bed3ba5892 100644 --- a/test/functional/apps/visualize/_tsvb_chart.ts +++ b/test/functional/apps/visualize/_tsvb_chart.ts @@ -116,8 +116,7 @@ export default function({ getService, getPageObjects }: FtrProviderContext) { await esArchiver.unload('kibana_sample_data_flights'); }); - // FLAKY: https://github.com/elastic/kibana/issues/43150 - it.skip('should be able to switch between index patterns', async () => { + it('should be able to switch between index patterns', async () => { const value = await PageObjects.visualBuilder.getMetricValue(); expect(value).to.eql('156'); await PageObjects.visualBuilder.clickPanelOptions('metric'); From 3a3519057cf1af4350d4adeecca56b9256535f69 Mon Sep 17 00:00:00 2001 From: Shahzad Date: Thu, 6 Feb 2020 20:55:07 +0100 Subject: [PATCH 81/86] [Uptime] Add Green Icon for all up Monitors (#56770) * add greenicon for all up moniros * added comment --- .../__snapshots__/donut_chart.test.tsx.snap | 164 ++++++++++++++++++ .../charts/__tests__/donut_chart.test.tsx | 16 ++ .../functional/charts/donut_chart.tsx | 16 +- 3 files changed, 194 insertions(+), 2 deletions(-) diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/charts/__tests__/__snapshots__/donut_chart.test.tsx.snap b/x-pack/legacy/plugins/uptime/public/components/functional/charts/__tests__/__snapshots__/donut_chart.test.tsx.snap index 9699a1842ccf1..280e05184837f 100644 --- a/x-pack/legacy/plugins/uptime/public/components/functional/charts/__tests__/__snapshots__/donut_chart.test.tsx.snap +++ b/x-pack/legacy/plugins/uptime/public/components/functional/charts/__tests__/__snapshots__/donut_chart.test.tsx.snap @@ -7,6 +7,11 @@ exports[`DonutChart component passes correct props without errors for valid prop >
`; + +exports[`DonutChart component renders a green check when all monitors are up 1`] = ` +.c2.c2 { + margin-left: 0px; + margin-right: 0px; +} + +.c3 { + text-align: right; +} + +.c1 { + max-width: 260px; + min-width: 100px; +} + +.c0 { + height: 42px; + width: 42px; + color: #017d73; + top: 51px; + left: 51px; + position: absolute; +} + +@media (max-width:767px) { + .c1 { + min-width: 0px; + max-width: 100px; + } +} + +
+
+ + +
+
+
+
+ +
+
+
+ +
+
+
+
+ + + Down + + + 0 + +
+
+
+ +
+
+
+ +
+
+
+
+ + + Up + + + 95 + +
+
+
+
+`; diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/charts/__tests__/donut_chart.test.tsx b/x-pack/legacy/plugins/uptime/public/components/functional/charts/__tests__/donut_chart.test.tsx index e98efc893b53b..31939c3dfdb56 100644 --- a/x-pack/legacy/plugins/uptime/public/components/functional/charts/__tests__/donut_chart.test.tsx +++ b/x-pack/legacy/plugins/uptime/public/components/functional/charts/__tests__/donut_chart.test.tsx @@ -32,4 +32,20 @@ describe('DonutChart component', () => { const wrapper = renderWithIntl(); expect(wrapper).toMatchSnapshot(); }); + + it('renders a green check when all monitors are up', () => { + const props = { + down: 0, + up: 95, + height: 125, + width: 125, + }; + + const wrapper = renderWithIntl(); + expect(wrapper).toMatchSnapshot(); + + const greenCheck = wrapper.find('.greenCheckIcon'); + + expect(greenCheck).toHaveLength(1); + }); }); diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/charts/donut_chart.tsx b/x-pack/legacy/plugins/uptime/public/components/functional/charts/donut_chart.tsx index 09e28efb4e50b..a4bbe486a9317 100644 --- a/x-pack/legacy/plugins/uptime/public/components/functional/charts/donut_chart.tsx +++ b/x-pack/legacy/plugins/uptime/public/components/functional/charts/donut_chart.tsx @@ -4,10 +4,11 @@ * you may not use this file except in compliance with the Elastic License. */ -import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import { EuiFlexGroup, EuiFlexItem, EuiIcon } from '@elastic/eui'; import React, { useContext, useEffect, useRef } from 'react'; import * as d3 from 'd3'; import { i18n } from '@kbn/i18n'; +import styled from 'styled-components'; import { DonutChartLegend } from './donut_chart_legend'; import { UptimeThemeContext } from '../../../contexts'; @@ -18,6 +19,15 @@ interface DonutChartProps { width: number; } +export const GreenCheckIcon = styled(EuiIcon)` + height: 42px; + width: 42px; + color: #017d73; + top: 51px; + left: 51px; + position: absolute; +`; + export const DonutChart = ({ height, down, up, width }: DonutChartProps) => { const chartElement = useRef(null); @@ -77,7 +87,7 @@ export const DonutChart = ({ height, down, up, width }: DonutChartProps) => { return ( - + { width={width} height={height} /> + {/* When all monitors are up we show green check icon in middle of donut to indicate, all is well */} + {down === 0 && } From 8aa2b61425ac3a806a0ab64bee9c351645ecf751 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20C=C3=B4t=C3=A9?= Date: Thu, 6 Feb 2020 14:57:04 -0500 Subject: [PATCH 82/86] Load alert on delete with fallback instead of doubling the calls (#57004) --- .../alerting/server/alerts_client.test.ts | 40 ++++++++++++++----- .../plugins/alerting/server/alerts_client.ts | 37 +++++++++-------- 2 files changed, 50 insertions(+), 27 deletions(-) diff --git a/x-pack/legacy/plugins/alerting/server/alerts_client.test.ts b/x-pack/legacy/plugins/alerting/server/alerts_client.test.ts index a5d9f6fb6e6a6..56ccf08d6a44f 100644 --- a/x-pack/legacy/plugins/alerting/server/alerts_client.test.ts +++ b/x-pack/legacy/plugins/alerting/server/alerts_client.test.ts @@ -1465,6 +1465,13 @@ describe('delete()', () => { }, ], }; + const existingDecryptedAlert = { + ...existingAlert, + attributes: { + ...existingAlert.attributes, + apiKey: Buffer.from('123:abc').toString('base64'), + }, + }; beforeEach(() => { alertsClient = new AlertsClient(alertsClientParams); @@ -1472,13 +1479,7 @@ describe('delete()', () => { savedObjectsClient.delete.mockResolvedValue({ success: true, }); - encryptedSavedObjects.getDecryptedAsInternalUser.mockResolvedValue({ - ...existingAlert, - attributes: { - ...existingAlert.attributes, - apiKey: Buffer.from('123:abc').toString('base64'), - }, - }); + encryptedSavedObjects.getDecryptedAsInternalUser.mockResolvedValue(existingDecryptedAlert); }); test('successfully removes an alert', async () => { @@ -1487,13 +1488,31 @@ describe('delete()', () => { expect(savedObjectsClient.delete).toHaveBeenCalledWith('alert', '1'); expect(taskManager.remove).toHaveBeenCalledWith('task-123'); expect(alertsClientParams.invalidateAPIKey).toHaveBeenCalledWith({ id: '123' }); + expect(encryptedSavedObjects.getDecryptedAsInternalUser).toHaveBeenCalledWith('alert', '1', { + namespace: 'default', + }); + expect(savedObjectsClient.get).not.toHaveBeenCalled(); + }); + + test('falls back to SOC.get when getDecryptedAsInternalUser throws an error', async () => { + encryptedSavedObjects.getDecryptedAsInternalUser.mockRejectedValue(new Error('Fail')); + + const result = await alertsClient.delete({ id: '1' }); + expect(result).toEqual({ success: true }); + expect(savedObjectsClient.delete).toHaveBeenCalledWith('alert', '1'); + expect(taskManager.remove).toHaveBeenCalledWith('task-123'); + expect(alertsClientParams.invalidateAPIKey).not.toHaveBeenCalled(); + expect(savedObjectsClient.get).toHaveBeenCalledWith('alert', '1'); + expect(alertsClientParams.logger.error).toHaveBeenCalledWith( + 'delete(): Failed to load API key to invalidate on alert 1: Fail' + ); }); test(`doesn't remove a task when scheduledTaskId is null`, async () => { - savedObjectsClient.get.mockResolvedValue({ - ...existingAlert, + encryptedSavedObjects.getDecryptedAsInternalUser.mockResolvedValue({ + ...existingDecryptedAlert, attributes: { - ...existingAlert.attributes, + ...existingDecryptedAlert.attributes, scheduledTaskId: null, }, }); @@ -1536,6 +1555,7 @@ describe('delete()', () => { }); test('throws error when savedObjectsClient.get throws an error', async () => { + encryptedSavedObjects.getDecryptedAsInternalUser.mockRejectedValue(new Error('Fail')); savedObjectsClient.get.mockRejectedValue(new Error('SOC Fail')); await expect(alertsClient.delete({ id: '1' })).rejects.toThrowErrorMatchingInlineSnapshot( diff --git a/x-pack/legacy/plugins/alerting/server/alerts_client.ts b/x-pack/legacy/plugins/alerting/server/alerts_client.ts index 12d60b162d58e..40125f3067ee3 100644 --- a/x-pack/legacy/plugins/alerting/server/alerts_client.ts +++ b/x-pack/legacy/plugins/alerting/server/alerts_client.ts @@ -226,27 +226,30 @@ export class AlertsClient { } public async delete({ id }: { id: string }) { - const [taskIdToRemove, apiKeyToInvalidate] = await Promise.all([ - this.savedObjectsClient - .get('alert', id) - .then(result => result.attributes.scheduledTaskId), - // We'll try and load the decrypted saved object but if this fails we'll only log - // and skip invalidating the API key. - this.encryptedSavedObjectsPlugin - .getDecryptedAsInternalUser('alert', id, { namespace: this.namespace }) - .then(result => result.attributes.apiKey) - .catch(e => - this.logger.error( - `delete(): Failed to load API key to invalidate on alert ${id}: ${e.message}` - ) - ), - ]); + let taskIdToRemove: string | undefined; + let apiKeyToInvalidate: string | null = null; + + try { + const decryptedAlert = await this.encryptedSavedObjectsPlugin.getDecryptedAsInternalUser< + RawAlert + >('alert', id, { namespace: this.namespace }); + apiKeyToInvalidate = decryptedAlert.attributes.apiKey; + taskIdToRemove = decryptedAlert.attributes.scheduledTaskId; + } catch (e) { + // We'll skip invalidating the API key since we failed to load the decrypted saved object + this.logger.error( + `delete(): Failed to load API key to invalidate on alert ${id}: ${e.message}` + ); + // Still attempt to load the scheduledTaskId using SOC + const alert = await this.savedObjectsClient.get('alert', id); + taskIdToRemove = alert.attributes.scheduledTaskId; + } const removeResult = await this.savedObjectsClient.delete('alert', id); await Promise.all([ - taskIdToRemove && this.taskManager.remove(taskIdToRemove), - apiKeyToInvalidate && this.invalidateApiKey({ apiKey: apiKeyToInvalidate }), + taskIdToRemove ? this.taskManager.remove(taskIdToRemove) : null, + apiKeyToInvalidate ? this.invalidateApiKey({ apiKey: apiKeyToInvalidate }) : null, ]); return removeResult; From 7e82cfbb8d939c0536f19677e6aab89f0f878d84 Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Thu, 6 Feb 2020 14:54:53 -0600 Subject: [PATCH 83/86] Fix typo on detection engine rule (#56993) Co-authored-by: Elastic Machine --- .../prepackaged_rules/linux_shell_activity_by_web_server.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_shell_activity_by_web_server.json b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_shell_activity_by_web_server.json index eff3dd0ab1400..d9455ab7d5b3e 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_shell_activity_by_web_server.json +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/prepackaged_rules/linux_shell_activity_by_web_server.json @@ -9,7 +9,7 @@ "language": "kuery", "max_signals": 100, "name": "Potential Shell via Web Server", - "query": "process.name: bash and user.name: (apache or www or \"wwww-data\") and event.action:executed", + "query": "process.name: bash and user.name: (apache or www or \"www-data\") and event.action:executed", "references": [ "https://pentestlab.blog/tag/web-shell/" ], From 3d9b4611e9fe4cf7f6ac6fc570736308ab439f03 Mon Sep 17 00:00:00 2001 From: Melissa Alvarez Date: Thu, 6 Feb 2020 15:57:55 -0500 Subject: [PATCH 84/86] [ML] New Platform server shim: update results service routes to use new platform router (#56886) * migrate resultsService routes to NP. begin conversion of model file to TS * add schema validation to routes * add types to results service model file * add docs for routes * update route description and add routes to doc json file --- .../build_anomaly_table_items.d.ts | 30 +++ .../get_partition_fields_values.ts | 6 +- .../results_service/{index.js => index.ts} | 0 ...{results_service.js => results_service.ts} | 98 +++++--- .../new_platform/results_service_schema.ts | 35 +++ .../plugins/ml/server/routes/apidoc.json | 8 +- .../ml/server/routes/results_service.js | 126 ---------- .../ml/server/routes/results_service.ts | 220 ++++++++++++++++++ 8 files changed, 356 insertions(+), 167 deletions(-) create mode 100644 x-pack/legacy/plugins/ml/server/models/results_service/build_anomaly_table_items.d.ts rename x-pack/legacy/plugins/ml/server/models/results_service/{index.js => index.ts} (100%) rename x-pack/legacy/plugins/ml/server/models/results_service/{results_service.js => results_service.ts} (81%) create mode 100644 x-pack/legacy/plugins/ml/server/new_platform/results_service_schema.ts delete mode 100644 x-pack/legacy/plugins/ml/server/routes/results_service.js create mode 100644 x-pack/legacy/plugins/ml/server/routes/results_service.ts diff --git a/x-pack/legacy/plugins/ml/server/models/results_service/build_anomaly_table_items.d.ts b/x-pack/legacy/plugins/ml/server/models/results_service/build_anomaly_table_items.d.ts new file mode 100644 index 0000000000000..2bd19985c8518 --- /dev/null +++ b/x-pack/legacy/plugins/ml/server/models/results_service/build_anomaly_table_items.d.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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { AnomalyRecordDoc } from '../../../common/types/anomalies'; + +export interface AnomaliesTableRecord { + time: number; + source: AnomalyRecordDoc; + rowId: string; + jobId: string; + detectorIndex: number; + severity: number; + entityName?: string; + entityValue?: any; + influencers?: Array<{ [key: string]: any }>; + actual?: number[]; + actualSort?: any; + typical?: number[]; + typicalSort?: any; + metricDescriptionSort?: number; +} + +export function buildAnomalyTableItems( + anomalyRecords: any, + aggregationInterval: any, + dateFormatTz: string +): AnomaliesTableRecord[]; diff --git a/x-pack/legacy/plugins/ml/server/models/results_service/get_partition_fields_values.ts b/x-pack/legacy/plugins/ml/server/models/results_service/get_partition_fields_values.ts index 00e3002a7fc71..99eeaacc8de9c 100644 --- a/x-pack/legacy/plugins/ml/server/models/results_service/get_partition_fields_values.ts +++ b/x-pack/legacy/plugins/ml/server/models/results_service/get_partition_fields_values.ts @@ -7,11 +7,7 @@ import Boom from 'boom'; import { ML_RESULTS_INDEX_PATTERN } from '../../../common/constants/index_patterns'; import { callWithRequestType } from '../../../common/types/kibana'; - -interface CriteriaField { - fieldName: string; - fieldValue: any; -} +import { CriteriaField } from './results_service'; const PARTITION_FIELDS = ['partition_field', 'over_field', 'by_field'] as const; diff --git a/x-pack/legacy/plugins/ml/server/models/results_service/index.js b/x-pack/legacy/plugins/ml/server/models/results_service/index.ts similarity index 100% rename from x-pack/legacy/plugins/ml/server/models/results_service/index.js rename to x-pack/legacy/plugins/ml/server/models/results_service/index.ts diff --git a/x-pack/legacy/plugins/ml/server/models/results_service/results_service.js b/x-pack/legacy/plugins/ml/server/models/results_service/results_service.ts similarity index 81% rename from x-pack/legacy/plugins/ml/server/models/results_service/results_service.js rename to x-pack/legacy/plugins/ml/server/models/results_service/results_service.ts index 3ee5d04186ff1..5b154991f7cf0 100644 --- a/x-pack/legacy/plugins/ml/server/models/results_service/results_service.js +++ b/x-pack/legacy/plugins/ml/server/models/results_service/results_service.ts @@ -6,18 +6,33 @@ import _ from 'lodash'; import moment from 'moment'; - -import { buildAnomalyTableItems } from './build_anomaly_table_items'; +import { SearchResponse } from 'elasticsearch'; +import { RequestHandlerContext } from 'kibana/server'; +import { buildAnomalyTableItems, AnomaliesTableRecord } from './build_anomaly_table_items'; import { ML_RESULTS_INDEX_PATTERN } from '../../../common/constants/index_patterns'; import { ANOMALIES_TABLE_DEFAULT_QUERY_SIZE } from '../../../common/constants/search'; import { getPartitionFieldsValuesFactory } from './get_partition_fields_values'; +import { AnomalyRecordDoc } from '../../../common/types/anomalies'; // Service for carrying out Elasticsearch queries to obtain data for the // ML Results dashboards. const DEFAULT_MAX_EXAMPLES = 500; -export function resultsServiceProvider(callWithRequest) { +export interface CriteriaField { + fieldType?: string; + fieldName: string; + fieldValue: any; +} + +interface Influencer { + fieldName: string; + fieldValue: any; +} + +export function resultsServiceProvider(client: RequestHandlerContext | (() => any)) { + const callAsCurrentUser = + typeof client === 'object' ? client.ml!.mlClient.callAsCurrentUser : client; // Obtains data for the anomalies table, aggregating anomalies by day or hour as requested. // Return an Object with properties 'anomalies' and 'interval' (interval used to aggregate anomalies, // one of day, hour or second. Note 'auto' can be provided as the aggregationInterval in the request, @@ -25,21 +40,21 @@ export function resultsServiceProvider(callWithRequest) { // last anomalies), plus an examplesByJobId property if any of the // anomalies are categorization anomalies in mlcategory. async function getAnomaliesTableData( - jobIds, - criteriaFields, - influencers, - aggregationInterval, - threshold, - earliestMs, - latestMs, - dateFormatTz, - maxRecords = ANOMALIES_TABLE_DEFAULT_QUERY_SIZE, - maxExamples = DEFAULT_MAX_EXAMPLES, - influencersFilterQuery + jobIds: string[], + criteriaFields: CriteriaField[], + influencers: Influencer[], + aggregationInterval: string, + threshold: number, + earliestMs: number, + latestMs: number, + dateFormatTz: string, + maxRecords: number = ANOMALIES_TABLE_DEFAULT_QUERY_SIZE, + maxExamples: number = DEFAULT_MAX_EXAMPLES, + influencersFilterQuery: any ) { // Build the query to return the matching anomaly record results. // Add criteria for the time range, record score, plus any specified job IDs. - const boolCriteria = [ + const boolCriteria: object[] = [ { range: { timestamp: { @@ -120,7 +135,7 @@ export function resultsServiceProvider(callWithRequest) { }); } - const resp = await callWithRequest('search', { + const resp: SearchResponse = await callAsCurrentUser('search', { index: ML_RESULTS_INDEX_PATTERN, rest_total_hits_as_int: true, size: maxRecords, @@ -146,9 +161,16 @@ export function resultsServiceProvider(callWithRequest) { }, }); - const tableData = { anomalies: [], interval: 'second' }; + const tableData: { + anomalies: AnomaliesTableRecord[]; + interval: string; + examplesByJobId?: { [key: string]: any }; + } = { + anomalies: [], + interval: 'second', + }; if (resp.hits.total !== 0) { - let records = []; + let records: AnomalyRecordDoc[] = []; resp.hits.hits.forEach(hit => { records.push(hit._source); }); @@ -169,12 +191,12 @@ export function resultsServiceProvider(callWithRequest) { // Load examples for any categorization anomalies. const categoryAnomalies = tableData.anomalies.filter( - item => item.entityName === 'mlcategory' + (item: any) => item.entityName === 'mlcategory' ); if (categoryAnomalies.length > 0) { tableData.examplesByJobId = {}; - const categoryIdsByJobId = {}; + const categoryIdsByJobId: { [key: string]: any } = {}; categoryAnomalies.forEach(anomaly => { if (!_.has(categoryIdsByJobId, anomaly.jobId)) { categoryIdsByJobId[anomaly.jobId] = []; @@ -192,7 +214,9 @@ export function resultsServiceProvider(callWithRequest) { categoryIdsByJobId[jobId], maxExamples ); - tableData.examplesByJobId[jobId] = examplesByCategoryId; + if (tableData.examplesByJobId !== undefined) { + tableData.examplesByJobId[jobId] = examplesByCategoryId; + } }) ); } @@ -202,10 +226,10 @@ export function resultsServiceProvider(callWithRequest) { } // Returns the maximum anomaly_score for result_type:bucket over jobIds for the interval passed in - async function getMaxAnomalyScore(jobIds = [], earliestMs, latestMs) { + async function getMaxAnomalyScore(jobIds: string[] = [], earliestMs: number, latestMs: number) { // Build the criteria to use in the bool filter part of the request. // Adds criteria for the time range plus any specified job IDs. - const boolCriteria = [ + const boolCriteria: object[] = [ { range: { timestamp: { @@ -265,7 +289,7 @@ export function resultsServiceProvider(callWithRequest) { }, }; - const resp = await callWithRequest('search', query); + const resp = await callAsCurrentUser('search', query); const maxScore = _.get(resp, ['aggregations', 'max_score', 'value'], null); return { maxScore }; @@ -275,7 +299,7 @@ export function resultsServiceProvider(callWithRequest) { // Returns data over all jobs unless an optional list of job IDs of interest is supplied. // Returned response consists of latest bucket timestamps (ms since Jan 1 1970) against job ID async function getLatestBucketTimestampByJob(jobIds = []) { - const filter = [ + const filter: object[] = [ { term: { result_type: 'bucket', @@ -303,7 +327,7 @@ export function resultsServiceProvider(callWithRequest) { // Size of job terms agg, consistent with maximum number of jobs supported by Java endpoints. const maxJobs = 10000; - const resp = await callWithRequest('search', { + const resp = await callAsCurrentUser('search', { index: ML_RESULTS_INDEX_PATTERN, size: 0, body: { @@ -330,8 +354,12 @@ export function resultsServiceProvider(callWithRequest) { }, }); - const bucketsByJobId = _.get(resp, ['aggregations', 'byJobId', 'buckets'], []); - const timestampByJobId = {}; + const bucketsByJobId: Array<{ key: string; maxTimestamp: { value?: number } }> = _.get( + resp, + ['aggregations', 'byJobId', 'buckets'], + [] + ); + const timestampByJobId: { [key: string]: number | undefined } = {}; bucketsByJobId.forEach(bucket => { timestampByJobId[bucket.key] = bucket.maxTimestamp.value; }); @@ -342,8 +370,8 @@ export function resultsServiceProvider(callWithRequest) { // Obtains the categorization examples for the categories with the specified IDs // from the given index and job ID. // Returned response consists of a list of examples against category ID. - async function getCategoryExamples(jobId, categoryIds, maxExamples) { - const resp = await callWithRequest('search', { + async function getCategoryExamples(jobId: string, categoryIds: any, maxExamples: number) { + const resp = await callAsCurrentUser('search', { index: ML_RESULTS_INDEX_PATTERN, rest_total_hits_as_int: true, size: ANOMALIES_TABLE_DEFAULT_QUERY_SIZE, // Matches size of records in anomaly summary table. @@ -356,9 +384,9 @@ export function resultsServiceProvider(callWithRequest) { }, }); - const examplesByCategoryId = {}; + const examplesByCategoryId: { [key: string]: any } = {}; if (resp.hits.total !== 0) { - resp.hits.hits.forEach(hit => { + resp.hits.hits.forEach((hit: any) => { if (maxExamples) { examplesByCategoryId[hit._source.category_id] = _.slice( hit._source.examples, @@ -377,8 +405,8 @@ export function resultsServiceProvider(callWithRequest) { // Obtains the definition of the category with the specified ID and job ID. // Returned response contains four properties - categoryId, regex, examples // and terms (space delimited String of the common tokens matched in values of the category). - async function getCategoryDefinition(jobId, categoryId) { - const resp = await callWithRequest('search', { + async function getCategoryDefinition(jobId: string, categoryId: string) { + const resp = await callAsCurrentUser('search', { index: ML_RESULTS_INDEX_PATTERN, rest_total_hits_as_int: true, size: 1, @@ -409,6 +437,6 @@ export function resultsServiceProvider(callWithRequest) { getCategoryExamples, getLatestBucketTimestampByJob, getMaxAnomalyScore, - getPartitionFieldsValues: getPartitionFieldsValuesFactory(callWithRequest), + getPartitionFieldsValues: getPartitionFieldsValuesFactory(callAsCurrentUser), }; } diff --git a/x-pack/legacy/plugins/ml/server/new_platform/results_service_schema.ts b/x-pack/legacy/plugins/ml/server/new_platform/results_service_schema.ts new file mode 100644 index 0000000000000..b9a70b8e14197 --- /dev/null +++ b/x-pack/legacy/plugins/ml/server/new_platform/results_service_schema.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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { schema } from '@kbn/config-schema'; + +const criteriaFieldSchema = schema.object({ + fieldType: schema.maybe(schema.string()), + fieldName: schema.string(), + fieldValue: schema.any(), +}); + +export const anomaliesTableDataSchema = { + jobIds: schema.arrayOf(schema.string()), + criteriaFields: schema.arrayOf(criteriaFieldSchema), + influencers: schema.arrayOf(schema.maybe(schema.string())), + aggregationInterval: schema.string(), + threshold: schema.number(), + earliestMs: schema.number(), + latestMs: schema.number(), + dateFormatTz: schema.string(), + maxRecords: schema.number(), + maxExamples: schema.maybe(schema.number()), + influencersFilterQuery: schema.maybe(schema.any()), +}; + +export const partitionFieldValuesSchema = { + jobId: schema.string(), + searchTerm: schema.maybe(schema.any()), + criteriaFields: schema.arrayOf(criteriaFieldSchema), + earliestMs: schema.number(), + latestMs: schema.number(), +}; diff --git a/x-pack/legacy/plugins/ml/server/routes/apidoc.json b/x-pack/legacy/plugins/ml/server/routes/apidoc.json index f2ed202ae4777..574065446827d 100644 --- a/x-pack/legacy/plugins/ml/server/routes/apidoc.json +++ b/x-pack/legacy/plugins/ml/server/routes/apidoc.json @@ -33,6 +33,12 @@ "ValidateAnomalyDetector", "ForecastAnomalyDetector", "GetOverallBuckets", - "GetCategories" + "GetCategories", + "ResultsService", + "GetAnomaliesTableData", + "GetCategoryDefinition", + "GetMaxAnomalyScore", + "GetCategoryExamples", + "GetPartitionFieldsValues" ] } diff --git a/x-pack/legacy/plugins/ml/server/routes/results_service.js b/x-pack/legacy/plugins/ml/server/routes/results_service.js deleted file mode 100644 index a658729e85083..0000000000000 --- a/x-pack/legacy/plugins/ml/server/routes/results_service.js +++ /dev/null @@ -1,126 +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; - * you may not use this file except in compliance with the Elastic License. - */ - -import { callWithRequestFactory } from '../client/call_with_request_factory'; -import { wrapError } from '../client/errors'; -import { resultsServiceProvider } from '../models/results_service'; - -function getAnomaliesTableData(callWithRequest, payload) { - const rs = resultsServiceProvider(callWithRequest); - const { - jobIds, - criteriaFields, - influencers, - aggregationInterval, - threshold, - earliestMs, - latestMs, - dateFormatTz, - maxRecords, - maxExamples, - influencersFilterQuery, - } = payload; - return rs.getAnomaliesTableData( - jobIds, - criteriaFields, - influencers, - aggregationInterval, - threshold, - earliestMs, - latestMs, - dateFormatTz, - maxRecords, - maxExamples, - influencersFilterQuery - ); -} - -function getCategoryDefinition(callWithRequest, payload) { - const rs = resultsServiceProvider(callWithRequest); - return rs.getCategoryDefinition(payload.jobId, payload.categoryId); -} - -function getCategoryExamples(callWithRequest, payload) { - const rs = resultsServiceProvider(callWithRequest); - const { jobId, categoryIds, maxExamples } = payload; - return rs.getCategoryExamples(jobId, categoryIds, maxExamples); -} - -function getMaxAnomalyScore(callWithRequest, payload) { - const rs = resultsServiceProvider(callWithRequest); - const { jobIds, earliestMs, latestMs } = payload; - return rs.getMaxAnomalyScore(jobIds, earliestMs, latestMs); -} - -function getPartitionFieldsValues(callWithRequest, payload) { - const rs = resultsServiceProvider(callWithRequest); - const { jobId, searchTerm, criteriaFields, earliestMs, latestMs } = payload; - return rs.getPartitionFieldsValues(jobId, searchTerm, criteriaFields, earliestMs, latestMs); -} - -export function resultsServiceRoutes({ commonRouteConfig, elasticsearchPlugin, route }) { - route({ - method: 'POST', - path: '/api/ml/results/anomalies_table_data', - handler(request) { - const callWithRequest = callWithRequestFactory(elasticsearchPlugin, request); - return getAnomaliesTableData(callWithRequest, request.payload).catch(resp => wrapError(resp)); - }, - config: { - ...commonRouteConfig, - }, - }); - - route({ - method: 'POST', - path: '/api/ml/results/category_definition', - handler(request) { - const callWithRequest = callWithRequestFactory(elasticsearchPlugin, request); - return getCategoryDefinition(callWithRequest, request.payload).catch(resp => wrapError(resp)); - }, - config: { - ...commonRouteConfig, - }, - }); - - route({ - method: 'POST', - path: '/api/ml/results/max_anomaly_score', - handler(request) { - const callWithRequest = callWithRequestFactory(elasticsearchPlugin, request); - return getMaxAnomalyScore(callWithRequest, request.payload).catch(resp => wrapError(resp)); - }, - config: { - ...commonRouteConfig, - }, - }); - - route({ - method: 'POST', - path: '/api/ml/results/category_examples', - handler(request) { - const callWithRequest = callWithRequestFactory(elasticsearchPlugin, request); - return getCategoryExamples(callWithRequest, request.payload).catch(resp => wrapError(resp)); - }, - config: { - ...commonRouteConfig, - }, - }); - - route({ - method: 'POST', - path: '/api/ml/results/partition_fields_values', - handler(request) { - const callWithRequest = callWithRequestFactory(elasticsearchPlugin, request); - return getPartitionFieldsValues(callWithRequest, request.payload).catch(resp => - wrapError(resp) - ); - }, - config: { - ...commonRouteConfig, - }, - }); -} diff --git a/x-pack/legacy/plugins/ml/server/routes/results_service.ts b/x-pack/legacy/plugins/ml/server/routes/results_service.ts new file mode 100644 index 0000000000000..b44b82ec486d7 --- /dev/null +++ b/x-pack/legacy/plugins/ml/server/routes/results_service.ts @@ -0,0 +1,220 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { RequestHandlerContext } from 'src/core/server'; +import { schema } from '@kbn/config-schema'; +import { licensePreRoutingFactory } from '../new_platform/licence_check_pre_routing_factory'; +import { wrapError } from '../client/error_wrapper'; +import { RouteInitialization } from '../new_platform/plugin'; +import { + anomaliesTableDataSchema, + partitionFieldValuesSchema, +} from '../new_platform/results_service_schema'; +import { resultsServiceProvider } from '../models/results_service'; + +function getAnomaliesTableData(context: RequestHandlerContext, payload: any) { + const rs = resultsServiceProvider(context); + const { + jobIds, + criteriaFields, + influencers, + aggregationInterval, + threshold, + earliestMs, + latestMs, + dateFormatTz, + maxRecords, + maxExamples, + influencersFilterQuery, + } = payload; + return rs.getAnomaliesTableData( + jobIds, + criteriaFields, + influencers, + aggregationInterval, + threshold, + earliestMs, + latestMs, + dateFormatTz, + maxRecords, + maxExamples, + influencersFilterQuery + ); +} + +function getCategoryDefinition(context: RequestHandlerContext, payload: any) { + const rs = resultsServiceProvider(context); + return rs.getCategoryDefinition(payload.jobId, payload.categoryId); +} + +function getCategoryExamples(context: RequestHandlerContext, payload: any) { + const rs = resultsServiceProvider(context); + const { jobId, categoryIds, maxExamples } = payload; + return rs.getCategoryExamples(jobId, categoryIds, maxExamples); +} + +function getMaxAnomalyScore(context: RequestHandlerContext, payload: any) { + const rs = resultsServiceProvider(context); + const { jobIds, earliestMs, latestMs } = payload; + return rs.getMaxAnomalyScore(jobIds, earliestMs, latestMs); +} + +function getPartitionFieldsValues(context: RequestHandlerContext, payload: any) { + const rs = resultsServiceProvider(context); + const { jobId, searchTerm, criteriaFields, earliestMs, latestMs } = payload; + return rs.getPartitionFieldsValues(jobId, searchTerm, criteriaFields, earliestMs, latestMs); +} + +/** + * Routes for results service + */ +export function resultsServiceRoutes({ xpackMainPlugin, router }: RouteInitialization) { + /** + * @apiGroup ResultsService + * + * @api {post} /api/ml/results/anomalies_table_data Prepare anomalies records for table display + * @apiName GetAnomaliesTableData + * @apiDescription Retrieves anomaly records for an anomaly detection job and formats them for anomalies table display + */ + router.post( + { + path: '/api/ml/results/anomalies_table_data', + validate: { + body: schema.object({ ...anomaliesTableDataSchema }), + }, + }, + licensePreRoutingFactory(xpackMainPlugin, async (context, request, response) => { + try { + const resp = await getAnomaliesTableData(context, request.body); + + return response.ok({ + body: resp, + }); + } catch (e) { + return response.customError(wrapError(e)); + } + }) + ); + + /** + * @apiGroup ResultsService + * + * @api {post} /api/ml/results/category_definition Returns category definition + * @apiName GetCategoryDefinition + * @apiDescription Returns the definition of the category with the specified ID and job ID + */ + router.post( + { + path: '/api/ml/results/category_definition', + validate: { + body: schema.object({ + jobId: schema.maybe(schema.string()), + categoryId: schema.string(), + }), + }, + }, + licensePreRoutingFactory(xpackMainPlugin, async (context, request, response) => { + try { + const resp = await getCategoryDefinition(context, request.body); + + return response.ok({ + body: resp, + }); + } catch (e) { + return response.customError(wrapError(e)); + } + }) + ); + + /** + * @apiGroup ResultsService + * + * @api {post} /api/ml/results/max_anomaly_score Returns the maximum anomaly_score + * @apiName GetMaxAnomalyScore + * @apiDescription Returns the maximum anomaly score of the bucket results for the request job ID(s) and time range + */ + router.post( + { + path: '/api/ml/results/max_anomaly_score', + validate: { + body: schema.object({ + jobIds: schema.arrayOf(schema.string()), + earliestMs: schema.number(), + latestMs: schema.number(), + }), + }, + }, + licensePreRoutingFactory(xpackMainPlugin, async (context, request, response) => { + try { + const resp = await getMaxAnomalyScore(context, request.body); + + return response.ok({ + body: resp, + }); + } catch (e) { + return response.customError(wrapError(e)); + } + }) + ); + + /** + * @apiGroup ResultsService + * + * @api {post} /api/ml/results/category_examples Returns category examples + * @apiName GetCategoryExamples + * @apiDescription Returns examples for the categories with the specified IDs from the job with the supplied ID + */ + router.post( + { + path: '/api/ml/results/category_examples', + validate: { + body: schema.object({ + jobId: schema.string(), + categoryIds: schema.arrayOf(schema.string()), + maxExamples: schema.number(), + }), + }, + }, + licensePreRoutingFactory(xpackMainPlugin, async (context, request, response) => { + try { + const resp = await getCategoryExamples(context, request.body); + + return response.ok({ + body: resp, + }); + } catch (e) { + return response.customError(wrapError(e)); + } + }) + ); + + /** + * @apiGroup ResultsService + * + * @api {post} /api/ml/results/partition_fields_values Returns partition fields values + * @apiName GetPartitionFieldsValues + * @apiDescription Returns the partition fields with values that match the provided criteria for the specified job ID. + */ + router.post( + { + path: '/api/ml/results/partition_fields_values', + validate: { + body: schema.object({ ...partitionFieldValuesSchema }), + }, + }, + licensePreRoutingFactory(xpackMainPlugin, async (context, request, response) => { + try { + const resp = await getPartitionFieldsValues(context, request.body); + + return response.ok({ + body: resp, + }); + } catch (e) { + return response.customError(wrapError(e)); + } + }) + ); +} From f4464a4309dee0c56b7dde88ee043cb57eb8e25a Mon Sep 17 00:00:00 2001 From: gchaps <33642766+gchaps@users.noreply.github.com> Date: Thu, 6 Feb 2020 13:24:19 -0800 Subject: [PATCH 85/86] [DOCS] Adds Apple notarization info to install doc (#57042) --- docs/setup/install/targz.asciidoc | 37 ++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/docs/setup/install/targz.asciidoc b/docs/setup/install/targz.asciidoc index d2143f39fba50..31970888a976b 100644 --- a/docs/setup/install/targz.asciidoc +++ b/docs/setup/install/targz.asciidoc @@ -1,14 +1,14 @@ [[targz]] -=== Install Kibana with `.tar.gz` +=== Install {kib} from archive on Linux or MacOS Kibana is provided for Linux and Darwin as a `.tar.gz` package. These packages are the easiest formats to use when trying out Kibana. -These packages are free to use under the Elastic license. They contain open -source and free commercial features and access to paid commercial features. -{stack-ov}/license-management.html[Start a 30-day trial] to try out all of the -paid commercial features. See the -https://www.elastic.co/subscriptions[Subscriptions] page for information about +These packages are free to use under the Elastic license. They contain open +source and free commercial features and access to paid commercial features. +{stack-ov}/license-management.html[Start a 30-day trial] to try out all of the +paid commercial features. See the +https://www.elastic.co/subscriptions[Subscriptions] page for information about Elastic license levels. The latest stable version of Kibana can be found on the @@ -47,6 +47,27 @@ endif::[] [[install-darwin64]] ==== Download and install the Darwin package +[IMPORTANT] +.macOS Gatekeeper warnings +==== +Apple's rollout of stricter notarization requirements affected the notarization +of the {version} {kib} artifacts. If macOS Catalina displays a dialog when you +first run {kib} that interrupts it, you will need to take an action to allow it +to run. + +To prevent Gatekeeper checks on the {kib} files, run the following command on the +downloaded `.tar.gz` archive or the directory to which was extracted: +[source,sh] +---- +xattr -d -r com.apple.quarantine +---- + +Alternatively, you can add a security override if a Gatekeeper popup appears by +following the instructions in the _How to open an app that hasn’t been notarized +or is from an unidentified developer_ section of +https://support.apple.com/en-us/HT202491[Safely open apps on your Mac]. +==== + ifeval::["{release-state}"=="unreleased"] Version {version} of Kibana has not yet been released. @@ -68,9 +89,9 @@ cd kibana-{version}-darwin-x86_64/ <2> `kibana-{version}-darwin-x86_64.tar.gz: OK`. <2> This directory is known as `$KIBANA_HOME`. -Alternatively, you can download the following package, which contains only +Alternatively, you can download the following package, which contains only features that are available under the Apache 2.0 license: -https://artifacts.elastic.co/downloads/kibana/kibana-oss-{version}-darwin-x86_64.tar.gz +https://artifacts.elastic.co/downloads/kibana/kibana-oss-{version}-darwin-x86_64.tar.gz endif::[] From d5940df871aace3bae45a338ae15843d93a3d44d Mon Sep 17 00:00:00 2001 From: Madison Caldwell Date: Thu, 6 Feb 2020 16:27:58 -0500 Subject: [PATCH 86/86] [Endpoint] ERT-82 ERT-83 ERT-84: Alert list API with pagination (#56538) * ERT-82 ERT-83 ERT-84 (partial): Add Alert List API with pagination * Better type safety for alert list API --- x-pack/plugins/endpoint/common/types.ts | 89 +- .../endpoint/store/alerts/action.ts | 8 +- .../endpoint/store/alerts/index.ts | 1 + .../endpoint/store/alerts/middleware.ts | 9 +- .../endpoint/store/alerts/reducer.ts | 6 +- .../public/applications/endpoint/types.ts | 9 +- .../endpoint/view/alerts/index.tsx | 20 +- x-pack/plugins/endpoint/server/config.ts | 2 + x-pack/plugins/endpoint/server/plugin.ts | 2 +- .../endpoint/server/routes/alerts.test.ts | 191 + .../plugins/endpoint/server/routes/alerts.ts | 106 +- .../endpoint/server/routes/sampledata.json | 11350 ---------------- .../endpoint/alert_query_builders.test.ts | 74 + .../services/endpoint/alert_query_builders.ts | 61 + .../server/test_data/all_alerts_data.json | 5471 ++++++++ .../test_data/all_alerts_data_legacy.json | 15 + x-pack/plugins/endpoint/server/types.ts | 18 + .../api_integration/apis/endpoint/alerts.ts | 66 + .../api_integration/apis/endpoint/index.ts | 2 + .../endpoint/alerts/api_feature/data.json.gz | Bin 0 -> 1997274 bytes .../endpoint/alerts/api_feature/mappings.json | 5265 +++++++ 21 files changed, 11345 insertions(+), 11420 deletions(-) create mode 100644 x-pack/plugins/endpoint/server/routes/alerts.test.ts delete mode 100644 x-pack/plugins/endpoint/server/routes/sampledata.json create mode 100644 x-pack/plugins/endpoint/server/services/endpoint/alert_query_builders.test.ts create mode 100644 x-pack/plugins/endpoint/server/services/endpoint/alert_query_builders.ts create mode 100644 x-pack/plugins/endpoint/server/test_data/all_alerts_data.json create mode 100644 x-pack/plugins/endpoint/server/test_data/all_alerts_data_legacy.json create mode 100644 x-pack/test/api_integration/apis/endpoint/alerts.ts create mode 100644 x-pack/test/functional/es_archives/endpoint/alerts/api_feature/data.json.gz create mode 100644 x-pack/test/functional/es_archives/endpoint/alerts/api_feature/mappings.json diff --git a/x-pack/plugins/endpoint/common/types.ts b/x-pack/plugins/endpoint/common/types.ts index 5e69aa0d18b68..0128cd3dd6df7 100644 --- a/x-pack/plugins/endpoint/common/types.ts +++ b/x-pack/plugins/endpoint/common/types.ts @@ -23,20 +23,72 @@ export type ImmutableSet = ReadonlySet>; export type ImmutableObject = { readonly [K in keyof T]: Immutable }; export class EndpointAppConstants { + static ALERT_INDEX_NAME = 'my-index'; static ENDPOINT_INDEX_NAME = 'endpoint-agent*'; } +export interface AlertResultList { + /** + * The alerts restricted by page size. + */ + alerts: AlertData[]; + + /** + * The total number of alerts on the page. + */ + total: number; + + /** + * The size of the requested page. + */ + request_page_size: number; + + /** + * The index of the requested page, starting at 0. + */ + request_page_index: number; + + /** + * The offset of the requested page, starting at 0. + */ + result_from_index: number; +} + export interface EndpointResultList { - // the endpoint restricted by the page size + /* the endpoints restricted by the page size */ endpoints: EndpointMetadata[]; - // the total number of unique endpoints in the index + /* the total number of unique endpoints in the index */ total: number; - // the page size requested + /* the page size requested */ request_page_size: number; - // the index requested + /* the page index requested */ request_page_index: number; } +export interface AlertData { + '@timestamp': Date; + agent: { + id: string; + version: string; + }; + event: { + action: string; + }; + file_classification: { + malware_classification: { + score: number; + }; + }; + host: { + hostname: string; + ip: string; + os: { + name: string; + }; + }; + thread: {}; +} + export interface EndpointMetadata { event: { created: Date; @@ -63,35 +115,6 @@ export interface EndpointMetadata { }; } -export interface AlertData { - value: { - source: { - endgame: { - data: { - file_operation: string; - malware_classification: { - score: number; - }; - }; - metadata: { - key: string; - }; - timestamp_utc: Date; - }; - labels: { - endpoint_id: string; - }; - host: { - hostname: string; - ip: string; - os: { - name: string; - }; - }; - }; - }; -} - /** * The PageId type is used for the payload when firing userNavigatedToPage actions */ diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/store/alerts/action.ts b/x-pack/plugins/endpoint/public/applications/endpoint/store/alerts/action.ts index 431b0d8d6fcf8..464a04eff5ebd 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/store/alerts/action.ts +++ b/x-pack/plugins/endpoint/public/applications/endpoint/store/alerts/action.ts @@ -4,11 +4,11 @@ * you may not use this file except in compliance with the Elastic License. */ -import { AlertData, Immutable } from '../../../../../common/types'; +import { AlertListData } from '../../types'; -type ServerReturnedAlertsData = Immutable<{ +interface ServerReturnedAlertsData { type: 'serverReturnedAlertsData'; - payload: AlertData[]; -}>; + payload: AlertListData; +} export type AlertAction = ServerReturnedAlertsData; diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/store/alerts/index.ts b/x-pack/plugins/endpoint/public/applications/endpoint/store/alerts/index.ts index 5545218d9abd6..f63910a1c305e 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/store/alerts/index.ts +++ b/x-pack/plugins/endpoint/public/applications/endpoint/store/alerts/index.ts @@ -6,3 +6,4 @@ export { alertListReducer } from './reducer'; export { AlertAction } from './action'; +export * from '../../types'; diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/store/alerts/middleware.ts b/x-pack/plugins/endpoint/public/applications/endpoint/store/alerts/middleware.ts index 00ba8eddf9e67..aede95ceb3759 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/store/alerts/middleware.ts +++ b/x-pack/plugins/endpoint/public/applications/endpoint/store/alerts/middleware.ts @@ -4,15 +4,20 @@ * you may not use this file except in compliance with the Elastic License. */ -import { AlertData, ImmutableArray } from '../../../../../common/types'; +import qs from 'querystring'; +import { HttpFetchQuery } from 'src/core/public'; import { AppAction } from '../action'; import { MiddlewareFactory } from '../../types'; export const alertMiddlewareFactory: MiddlewareFactory = coreStart => { + const qp = qs.parse(window.location.search.slice(1)); + return api => next => async (action: AppAction) => { next(action); if (action.type === 'userNavigatedToPage' && action.payload === 'alertsPage') { - const response: ImmutableArray = await coreStart.http.get('/api/endpoint/alerts'); + const response = await coreStart.http.get('/api/endpoint/alerts', { + query: qp as HttpFetchQuery, + }); api.dispatch({ type: 'serverReturnedAlertsData', payload: response }); } }; diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/store/alerts/reducer.ts b/x-pack/plugins/endpoint/public/applications/endpoint/store/alerts/reducer.ts index 4ad815ee10b23..fd74abe9e3432 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/store/alerts/reducer.ts +++ b/x-pack/plugins/endpoint/public/applications/endpoint/store/alerts/reducer.ts @@ -11,6 +11,10 @@ import { AppAction } from '../action'; const initialState = (): AlertListState => { return { alerts: [], + request_page_size: 10, + request_page_index: 0, + result_from_index: 0, + total: 0, }; }; @@ -21,7 +25,7 @@ export const alertListReducer: Reducer = ( if (action.type === 'serverReturnedAlertsData') { return { ...state, - alerts: action.payload, + alerts: action.payload.alerts, }; } diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/types.ts b/x-pack/plugins/endpoint/public/applications/endpoint/types.ts index 525983c9f8523..5f02d36308053 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/types.ts +++ b/x-pack/plugins/endpoint/public/applications/endpoint/types.ts @@ -6,9 +6,9 @@ import { Dispatch, MiddlewareAPI } from 'redux'; import { CoreStart } from 'kibana/public'; -import { Immutable, AlertData } from '../../../common/types'; import { EndpointListState } from './store/endpoint_list'; import { AppAction } from './store/action'; +import { AlertResultList } from '../../../common/types'; export type MiddlewareFactory = ( coreStart: CoreStart @@ -16,11 +16,10 @@ export type MiddlewareFactory = ( api: MiddlewareAPI, GlobalState> ) => (next: Dispatch) => (action: AppAction) => unknown; -export type AlertListState = Immutable<{ - alerts: AlertData[]; -}>; - export interface GlobalState { readonly endpointList: EndpointListState; readonly alertList: AlertListState; } + +export type AlertListData = AlertResultList; +export type AlertListState = AlertResultList; diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/view/alerts/index.tsx b/x-pack/plugins/endpoint/public/applications/endpoint/view/alerts/index.tsx index dcb324e3597c2..8c32426dcc868 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/view/alerts/index.tsx +++ b/x-pack/plugins/endpoint/public/applications/endpoint/view/alerts/index.tsx @@ -8,6 +8,7 @@ import { memo, useState, useMemo } from 'react'; import React from 'react'; import { EuiDataGrid } from '@elastic/eui'; import { useSelector } from 'react-redux'; +import { i18n } from '@kbn/i18n'; import * as selectors from '../../store/selectors'; import { usePageId } from '../use_page_id'; @@ -40,21 +41,26 @@ export const AlertIndex = memo(() => { const row = json[rowIndex]; if (columnId === 'alert_type') { - return row.value.source.endgame.metadata.key; + return i18n.translate( + 'xpack.endpoint.application.endpoint.alerts.alertType.maliciousFileDescription', + { + defaultMessage: 'Malicious File', + } + ); } else if (columnId === 'event_type') { - return row.value.source.endgame.data.file_operation; + return row.event.action; } else if (columnId === 'os') { - return row.value.source.host.os.name; + return row.host.os.name; } else if (columnId === 'ip_address') { - return row.value.source.host.ip; + return row.host.ip; } else if (columnId === 'host_name') { - return row.value.source.host.hostname; + return row.host.hostname; } else if (columnId === 'timestamp') { - return row.value.source.endgame.timestamp_utc; + return row['@timestamp']; } else if (columnId === 'archived') { return null; } else if (columnId === 'malware_score') { - return row.value.source.endgame.data.malware_classification.score; + return row.file_classification.malware_classification.score; } return null; }; diff --git a/x-pack/plugins/endpoint/server/config.ts b/x-pack/plugins/endpoint/server/config.ts index 3f9a8a5508dd8..7ce5ebcf4eba9 100644 --- a/x-pack/plugins/endpoint/server/config.ts +++ b/x-pack/plugins/endpoint/server/config.ts @@ -15,6 +15,8 @@ export const EndpointConfigSchema = schema.object({ enabled: schema.boolean({ defaultValue: false }), endpointResultListDefaultFirstPageIndex: schema.number({ defaultValue: 0 }), endpointResultListDefaultPageSize: schema.number({ defaultValue: 10 }), + alertResultListDefaultFirstPageIndex: schema.number({ defaultValue: 0 }), + alertResultListDefaultPageSize: schema.number({ defaultValue: 10 }), }); export function createConfig$(context: PluginInitializerContext) { diff --git a/x-pack/plugins/endpoint/server/plugin.ts b/x-pack/plugins/endpoint/server/plugin.ts index 1f34ba1d36d97..3fed4ca480b85 100644 --- a/x-pack/plugins/endpoint/server/plugin.ts +++ b/x-pack/plugins/endpoint/server/plugin.ts @@ -69,7 +69,7 @@ export class EndpointPlugin const router = core.http.createRouter(); addRoutes(router); registerEndpointRoutes(router, endpointContext); - registerAlertRoutes(router); + registerAlertRoutes(router, endpointContext); } public start() { diff --git a/x-pack/plugins/endpoint/server/routes/alerts.test.ts b/x-pack/plugins/endpoint/server/routes/alerts.test.ts new file mode 100644 index 0000000000000..e6bd9b8888ef7 --- /dev/null +++ b/x-pack/plugins/endpoint/server/routes/alerts.test.ts @@ -0,0 +1,191 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { + IClusterClient, + IRouter, + IScopedClusterClient, + KibanaResponseFactory, + RequestHandler, + RequestHandlerContext, + RouteConfig, +} from 'kibana/server'; +import { + elasticsearchServiceMock, + httpServerMock, + httpServiceMock, + loggingServiceMock, +} from '../../../../../src/core/server/mocks'; +import { AlertData, AlertResultList } from '../../common/types'; +import { SearchResponse } from 'elasticsearch'; +import { reqSchema, registerAlertRoutes } from './alerts'; +import { EndpointConfigSchema } from '../config'; +import * as data from '../test_data/all_alerts_data.json'; +import * as dataLegacy from '../test_data/all_alerts_data_legacy.json'; + +describe('test alerts route', () => { + let routerMock: jest.Mocked; + let mockResponse: jest.Mocked; + let mockClusterClient: jest.Mocked; + let mockScopedClient: jest.Mocked; + let routeHandler: RequestHandler; + let routeConfig: RouteConfig; + + beforeEach(() => { + mockClusterClient = elasticsearchServiceMock.createClusterClient(); + mockScopedClient = elasticsearchServiceMock.createScopedClusterClient(); + mockClusterClient.asScoped.mockReturnValue(mockScopedClient); + routerMock = httpServiceMock.createRouter(); + mockResponse = httpServerMock.createResponseFactory(); + registerAlertRoutes(routerMock, { + logFactory: loggingServiceMock.create(), + config: () => Promise.resolve(EndpointConfigSchema.validate({})), + }); + }); + + it('should correctly calculate legacy alert total', async () => { + const mockRequest = httpServerMock.createKibanaRequest({}); + + const response: SearchResponse = (dataLegacy as unknown) as SearchResponse< + AlertData + >; + mockScopedClient.callAsCurrentUser.mockImplementationOnce(() => Promise.resolve(response)); + [routeConfig, routeHandler] = routerMock.post.mock.calls.find(([{ path }]) => + path.startsWith('/api/endpoint/alerts') + )!; + + await routeHandler( + ({ + core: { + elasticsearch: { + dataClient: mockScopedClient, + }, + }, + } as unknown) as RequestHandlerContext, + mockRequest, + mockResponse + ); + + expect(mockScopedClient.callAsCurrentUser).toBeCalled(); + expect(routeConfig.options).toEqual({ authRequired: true }); + expect(mockResponse.ok).toBeCalled(); + const alertResultList = mockResponse.ok.mock.calls[0][0]?.body as AlertResultList; + expect(alertResultList.total).toEqual(21); + expect(alertResultList.request_page_index).toEqual(0); + expect(alertResultList.result_from_index).toEqual(0); + expect(alertResultList.request_page_size).toEqual(10); + }); + + it('should return the latest of all alerts', async () => { + const mockRequest = httpServerMock.createKibanaRequest({}); + + const response: SearchResponse = (data as unknown) as SearchResponse; + mockScopedClient.callAsCurrentUser.mockImplementationOnce(() => Promise.resolve(response)); + [routeConfig, routeHandler] = routerMock.post.mock.calls.find(([{ path }]) => + path.startsWith('/api/endpoint/alerts') + )!; + + await routeHandler( + ({ + core: { + elasticsearch: { + dataClient: mockScopedClient, + }, + }, + } as unknown) as RequestHandlerContext, + mockRequest, + mockResponse + ); + + expect(mockScopedClient.callAsCurrentUser).toBeCalled(); + expect(routeConfig.options).toEqual({ authRequired: true }); + expect(mockResponse.ok).toBeCalled(); + const alertResultList = mockResponse.ok.mock.calls[0][0]?.body as AlertResultList; + expect(alertResultList.total).toEqual(21); + expect(alertResultList.request_page_index).toEqual(0); + expect(alertResultList.result_from_index).toEqual(0); + expect(alertResultList.request_page_size).toEqual(10); + }); + + it('should return alert results according to pagination params -- POST', async () => { + const mockRequest = httpServerMock.createKibanaRequest({ + method: 'post', + body: { + page_size: 6, + page_index: 3, + }, + }); + mockScopedClient.callAsCurrentUser.mockImplementationOnce(() => Promise.resolve(data)); + [routeConfig, routeHandler] = routerMock.post.mock.calls.find(([{ path }]) => + path.startsWith('/api/endpoint/alerts') + )!; + + await routeHandler( + ({ + core: { + elasticsearch: { + dataClient: mockScopedClient, + }, + }, + } as unknown) as RequestHandlerContext, + mockRequest, + mockResponse + ); + + expect(mockScopedClient.callAsCurrentUser).toBeCalled(); + expect(routeConfig.options).toEqual({ authRequired: true }); + expect(mockResponse.ok).toBeCalled(); + const alertResultList = mockResponse.ok.mock.calls[0][0]?.body as AlertResultList; + expect(alertResultList.total).toEqual(21); + expect(alertResultList.request_page_index).toEqual(3); + expect(alertResultList.result_from_index).toEqual(18); + expect(alertResultList.request_page_size).toEqual(6); + }); + + it('should return alert results according to pagination params -- GET', async () => { + const mockRequest = httpServerMock.createKibanaRequest({ + path: '/api/endpoint/alerts', + query: { + page_size: 3, + page_index: 2, + }, + }); + mockScopedClient.callAsCurrentUser.mockImplementationOnce(() => Promise.resolve(data)); + [routeConfig, routeHandler] = routerMock.get.mock.calls.find(([{ path }]) => + path.startsWith('/api/endpoint/alerts') + )!; + + await routeHandler( + ({ + core: { + elasticsearch: { + dataClient: mockScopedClient, + }, + }, + } as unknown) as RequestHandlerContext, + mockRequest, + mockResponse + ); + + expect(mockScopedClient.callAsCurrentUser).toBeCalled(); + expect(routeConfig.options).toEqual({ authRequired: true }); + expect(mockResponse.ok).toBeCalled(); + const alertResultList = mockResponse.ok.mock.calls[0][0]?.body as AlertResultList; + expect(alertResultList.total).toEqual(21); + expect(alertResultList.request_page_index).toEqual(2); + expect(alertResultList.result_from_index).toEqual(6); + expect(alertResultList.request_page_size).toEqual(3); + }); + + it('should correctly validate params', async () => { + const validate = () => { + reqSchema.validate({ + page_size: 'abc', + page_index: 0, + }); + }; + expect(validate).toThrow(); + }); +}); diff --git a/x-pack/plugins/endpoint/server/routes/alerts.ts b/x-pack/plugins/endpoint/server/routes/alerts.ts index 68992b5890928..541cf4af52769 100644 --- a/x-pack/plugins/endpoint/server/routes/alerts.ts +++ b/x-pack/plugins/endpoint/server/routes/alerts.ts @@ -4,28 +4,100 @@ * you may not use this file except in compliance with the Elastic License. */ -import { IRouter } from 'kibana/server'; +import { IRouter, KibanaRequest, RequestHandler } from 'kibana/server'; +import { SearchResponse } from 'elasticsearch'; +import { schema } from '@kbn/config-schema'; -import json from './sampledata.json'; +import { + getPagingProperties, + buildAlertListESQuery, +} from '../services/endpoint/alert_query_builders'; + +import { AlertData, AlertResultList } from '../../common/types'; +import { AlertRequestParams, EndpointAppContext } from '../types'; + +const ALERTS_ROUTE = '/api/endpoint/alerts'; + +export const reqSchema = schema.object({ + page_size: schema.number({ defaultValue: 10, min: 1, max: 10000 }), + page_index: schema.number({ defaultValue: 0, min: 0 }), +}); + +export function registerAlertRoutes(router: IRouter, endpointAppContext: EndpointAppContext) { + const alertsHandler: RequestHandler = async (ctx, req, res) => { + try { + const queryParams = await getPagingProperties( + req as KibanaRequest, + endpointAppContext + ); + const reqBody = await buildAlertListESQuery(queryParams); + const response = (await ctx.core.elasticsearch.dataClient.callAsCurrentUser( + 'search', + reqBody + )) as SearchResponse; + return res.ok({ body: mapToAlertResultList(endpointAppContext, queryParams, response) }); + } catch (err) { + return res.internalError({ body: err }); + } + }; -export function registerAlertRoutes(router: IRouter) { router.get( { - path: '/api/endpoint/alerts', - validate: false, + path: ALERTS_ROUTE, + validate: { + query: reqSchema, + }, options: { authRequired: true }, }, - async (context, req, res) => { - try { - return res.ok({ - body: json, - headers: { - 'Content-Type': 'application/json', - }, - }); - } catch (err) { - return res.internalError({ body: err }); - } - } + alertsHandler ); + + router.post( + { + path: ALERTS_ROUTE, + validate: { + body: reqSchema, + }, + options: { authRequired: true }, + }, + alertsHandler + ); +} + +function mapToAlertResultList( + endpointAppContext: EndpointAppContext, + queryParams: Record, + searchResponse: SearchResponse +): AlertResultList { + interface Total { + value: number; + relation: string; + } + + let totalNumberOfAlerts: number = 0; + let totalIsLowerBound: boolean = false; + + // We handle 2 separate schemas for the response below, due to: https://github.com/elastic/kibana/issues/56694 + if (typeof searchResponse?.hits?.total === 'object') { + const total: Total = searchResponse?.hits?.total as Total; + totalNumberOfAlerts = total?.value || 0; + totalIsLowerBound = total?.relation === 'gte' || false; + } else { + totalNumberOfAlerts = searchResponse?.hits?.total || 0; + } + + if (totalIsLowerBound) { + // This shouldn't happen, as we always try to fetch enough hits to satisfy the current request and the next page. + endpointAppContext.logFactory + .get('endpoint') + .warn('Total hits not counted accurately. Pagination numbers may be inaccurate.'); + } + + return { + request_page_size: queryParams.pageSize, + request_page_index: queryParams.pageIndex, + result_from_index: queryParams.fromIndex, + alerts: searchResponse?.hits?.hits?.map(entry => entry._source), + total: totalNumberOfAlerts, + }; } diff --git a/x-pack/plugins/endpoint/server/routes/sampledata.json b/x-pack/plugins/endpoint/server/routes/sampledata.json deleted file mode 100644 index b0d6ae02f9f92..0000000000000 --- a/x-pack/plugins/endpoint/server/routes/sampledata.json +++ /dev/null @@ -1,11350 +0,0 @@ -[ - { - "type": "doc", - "value": { - "id": "huVEc20BW148Je-rzxwQ", - "index": "test_alert_data", - "source": { - "@timestamp": 1542789433000, - "agent": { - "id": "5085268f-7443-4f15-85d2-bf14b2a69c60", - "type": "endgame", - "version": "3.0.0" - }, - "ecs": { - "version": "1.1.0" - }, - "endgame": { - "data": { - "alert_details": { - "acting_process": { - "authenticode": { - "cert_signer": { - "issuer_name": "VeriSign Class 3 Code Signing 2010 CA", - "serial_number": "12 fb c3 65 d3 1e 18 e4 43 7e ed f7 77 5e 0c fb ", - "subject_name": "Cybereason Inc" - }, - "cert_timestamp": { - "issuer_name": "", - "serial_number": "", - "subject_name": "", - "timestamp_string": "" - }, - "more_info_link": "", - "program_name": "", - "publisher_link": "" - }, - "cmdline": "\"C:\\Program Files\\Cybereason ActiveProbe\\AmSvc.exe\"", - "create_time": 1542788400, - "domain": "NT AUTHORITY", - "exe": "C:\\Program Files\\Cybereason ActiveProbe\\AmSvc.exe", - "hashes": { - "md5": "1f2d082566b0fc5f2c238a5180db7451", - "sha1": "ca85243c0af6a6471bdaa560685c51eefd6dbc0d", - "sha256": "8ad40c90a611d36eb8f9eb24fa04f7dbca713db383ff55a03aa0f382e92061a2" - }, - "imphash": "c30d230b81c734e82e86e2e2fe01cd01", - "is_sensor": false, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "md5": "1f2d082566b0fc5f2c238a5180db7451", - "modules": [ - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "VeriSign Class 3 Code Signing 2010 CA", - "serial_number": "12 fb c3 65 d3 1e 18 e4 43 7e ed f7 77 5e 0c fb ", - "subject_name": "Cybereason Inc" - }, - "cert_timestamp": { - "issuer_name": "", - "serial_number": "", - "subject_name": "", - "timestamp_string": "" - }, - "more_info_link": "", - "program_name": "", - "publisher_link": "" - }, - "compile_time": 1534424710, - "hashes": { - "imphash": "c30d230b81c734e82e86e2e2fe01cd01", - "md5": "1f2d082566b0fc5f2c238a5180db7451", - "sha1": "ca85243c0af6a6471bdaa560685c51eefd6dbc0d", - "sha256": "8ad40c90a611d36eb8f9eb24fa04f7dbca713db383ff55a03aa0f382e92061a2" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 5362483200, - "mapped_size": 0, - "path": "C:\\Program Files\\Cybereason ActiveProbe\\AmSvc.exe", - "signature_signer": "Cybereason Inc", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 04 b3 f5 00 00 00 00 00 0d ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 05:28" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258681, - "hashes": { - "imphash": "d41d8cd98f00b204e9800998ecf8427e", - "md5": "3556d5a8bf2cc508bdab51dec38d7c61", - "sha1": "92015f7bbdb9dad35e41c533d2c5b85f1cd63d85", - "sha256": "91e3d98ad3119e8addf8d2aa1dd6795162842fff7101e4c70c5137e847b4ff50" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 2006056960, - "mapped_size": 0, - "path": "C:\\Windows\\SYSTEM32\\ntdll.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258315, - "hashes": { - "imphash": "9165b02c931d76a9b666d8d42128111b", - "md5": "7a6326d96d53048fdec542df23d875a0", - "sha1": "5c02af0206c299f5bcab8da4237cfc92e3e93495", - "sha256": "182351570856cd6eedd9df7e2fb8ab76bd4d8fc70be11ad5de6484cfd70c21c6" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 2004877312, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\kernel32.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258316, - "hashes": { - "imphash": "3f7fb1504bb73a54888bf1c3650fe4cf", - "md5": "da68c291b4ef2dec9c5963266bcae454", - "sha1": "5696e8c68fcf64104499e20e7cd5452b58b4f4ba", - "sha256": "21aa4779fc21e762178517268c95467238c92851ad9160bffc36b2379c58337f" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791760109568, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\KERNELBASE.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258929, - "hashes": { - "imphash": "2cb501375ed127591bf5cfee7f1e52fe", - "md5": "fe70103391a64039a921dbfff9c7ab1b", - "sha1": "e0019d9442aeebd3bb42a24c38aa2fae4c6bd4f5", - "sha256": "f7d219d75037bc98f6c69143b00ab6000a31f8b5e211e0af514f4f4b681522a0" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 2003828736, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\USER32.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258001, - "hashes": { - "imphash": "51945fdf9aaf56aeb9d6fa1f21b638ce", - "md5": "1084aa52ccc324ea54c7121fa24c2221", - "sha1": "b13ef924708fa88577931ed0337000e90adcdf5b", - "sha256": "6e972cf624f7c0de8190434b3b30279a01c551713109f97b9ebb77fac9364754" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791780163584, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\GDI32.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247534943, - "hashes": { - "imphash": "919110853c18aa198ad129945337b1dd", - "md5": "d202223587518b13d72d68937b7e3f70", - "sha1": "916a3ce858f074f57dd9dac01be5cd4649f19887", - "sha256": "9db971b866d058adbb518dd99b87c5db8dd1e7c9073755b989ae7e9fb62901e8" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791780622336, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\LPK.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258933, - "hashes": { - "imphash": "17bf46cf6bf6c8cae48be5b75615a353", - "md5": "2f8b1e3ee3545d3b5a8d56fa1ae07b65", - "sha1": "66310680ee38904b2852717af13028e53b4e8b8e", - "sha256": "2a3ec01f3bafe7d7d656886437f7ffecce440c0d3f3467804769ab4bf1ff7a99" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791788552192, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\USP10.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247535038, - "hashes": { - "imphash": "8c99b1c0f6cf68b07336751f460f1dba", - "md5": "7319bb10fa1f86e49e3dcf4136f6c957", - "sha1": "3eea5ee8bafb2b9975b236c5c5655df6f4b42aa1", - "sha256": "60de43ab267fd41c9804369b569139add30ed4e295c425f44fc04d3fcc95fca2" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791775444992, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\msvcrt.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247534699, - "hashes": { - "imphash": "e1ee2d71958d21e0e1bf887dfe76af7f", - "md5": "6df46d2bd74e3da1b45f08f10d172732", - "sha1": "3491f8f9a73c00b158e43a530210d67a4f0598ae", - "sha256": "2dc945f6f2c4a82189bc7da2fcbb7d9a0e2588a909539249e55ba82468e0c677" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791781736448, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\ADVAPI32.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247535198, - "hashes": { - "imphash": "b8ba136689cdc8d8b25fc04902f39a22", - "md5": "83404dcbce4925b6a5a77c5170f46d86", - "sha1": "22bda6b9da4fcf492b4dd16554b0c0e27e1b8667", - "sha256": "d669614d0b4461db244ad99fbe1ba92ceb9b4ed5ec8e987e23764e77d9ac7074" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791777214464, - "mapped_size": 0, - "path": "C:\\Windows\\SYSTEM32\\sechost.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258798, - "hashes": { - "imphash": "46876e4adb924a616ddbbb1992d61257", - "md5": "0611473c1ad9e2d991cd9482068417f7", - "sha1": "c4a3fa902dedad5d448e1d8b2d113cae1dcf2f7a", - "sha256": "90afcc2a60350ece27e75e76459132ef0fa28ef283ce88fced4b82735a93ecda" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791787307008, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\RPCRT4.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "VeriSign Class 3 Code Signing 2010 CA", - "serial_number": "12 fb c3 65 d3 1e 18 e4 43 7e ed f7 77 5e 0c fb ", - "subject_name": "Cybereason Inc" - }, - "cert_timestamp": { - "issuer_name": "", - "serial_number": "", - "subject_name": "", - "timestamp_string": "" - }, - "more_info_link": "", - "program_name": "", - "publisher_link": "" - }, - "compile_time": 1534424472, - "hashes": { - "imphash": "a24cfb84e3006f3634d5b09aed45c264", - "md5": "56e6aa240cf6503265fbe5cf4d5889e8", - "sha1": "2678a3c08b2f82598527bd0c064eb1be5877e277", - "sha256": "4e7e127e2818eeb2de34a9369dcaca233443f085e53706c969592a9907df2ae8" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791710957568, - "mapped_size": 0, - "path": "C:\\Program Files\\Cybereason ActiveProbe\\AP.dll", - "signature_signer": "Cybereason Inc", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "VeriSign Class 3 Code Signing 2010 CA", - "serial_number": "12 fb c3 65 d3 1e 18 e4 43 7e ed f7 77 5e 0c fb ", - "subject_name": "Cybereason Inc" - }, - "cert_timestamp": { - "issuer_name": "", - "serial_number": "", - "subject_name": "", - "timestamp_string": "" - }, - "more_info_link": "", - "program_name": "", - "publisher_link": "" - }, - "compile_time": 1534424450, - "hashes": { - "imphash": "f12460104bb4725d7964cf569f727f61", - "md5": "58017789505c114426b63c775debc12b", - "sha1": "0a348ca38bbcf851083578b77a8263765bd9b5e7", - "sha256": "1bd7d7b7b69e15adb6fcf0b520a7107eb5270163935e1f50fcee85ed65440b46" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791706894336, - "mapped_size": 0, - "path": "C:\\Program Files\\Cybereason ActiveProbe\\Protobuf.dll", - "signature_signer": "Cybereason Inc", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "VeriSign Class 3 Code Signing 2010 CA", - "serial_number": "12 fb c3 65 d3 1e 18 e4 43 7e ed f7 77 5e 0c fb ", - "subject_name": "Cybereason Inc" - }, - "cert_timestamp": { - "issuer_name": "", - "serial_number": "", - "subject_name": "", - "timestamp_string": "" - }, - "more_info_link": "", - "program_name": "", - "publisher_link": "" - }, - "compile_time": 1438071093, - "hashes": { - "imphash": "341d1190606326748a708433d5d0cc36", - "md5": "0a2be3ed5a71082e5f9296f79323a639", - "sha1": "6acb15e8191b5530297c807d3066b1a71f4326d4", - "sha256": "8847013e01db09adab6a1dc338803df3696730577a0dda847847540529048aae" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791705714688, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\libprotobuf.dll", - "signature_signer": "Cybereason Inc", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Code Signing PCA", - "serial_number": "33 00 00 00 b0 11 af 0a 8b d0 3b 9f dd 00 01 00 00 00 b0 ", - "subject_name": "Microsoft Corporation" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "33 00 00 00 2b 39 32 48 c1 b2 c9 48 f3 00 00 00 00 00 2b ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "10/04/2013 22:49" - }, - "more_info_link": "http://microsoft.com", - "program_name": "msvcp120.dll", - "publisher_link": "" - }, - "compile_time": 1380942867, - "hashes": { - "imphash": "d0a59246eab41d54812cd63c2326e1f1", - "md5": "46060c35f697281bc5e7337aee3722b1", - "sha1": "d0164c041707f297a73abb9ea854111953e99cf1", - "sha256": "2abf0aab5a3c5ae9424b64e9d19d9d6d4aebc67814d7e92e4927b9798fef2848" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791704993792, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\MSVCP120.dll", - "signature_signer": "Microsoft Corporation", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Code Signing PCA", - "serial_number": "33 00 00 00 b0 11 af 0a 8b d0 3b 9f dd 00 01 00 00 00 b0 ", - "subject_name": "Microsoft Corporation" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "33 00 00 00 2b 39 32 48 c1 b2 c9 48 f3 00 00 00 00 00 2b ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "10/04/2013 22:49" - }, - "more_info_link": "http://microsoft.com", - "program_name": "msvcr120.dll", - "publisher_link": "" - }, - "compile_time": 1380942847, - "hashes": { - "imphash": "8f18e22935ef8b336e246ee763fbec97", - "md5": "9c861c079dd81762b6c54e37597b7712", - "sha1": "62cb65a1d79e2c5ada0c7bfc04c18693567c90d0", - "sha256": "ad32240bb1de55c3f5fcac8789f583a17057f9d14914c538c2a7a5ad346b341c" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791704010752, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\MSVCR120.dll", - "signature_signer": "Microsoft Corporation", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258732, - "hashes": { - "imphash": "faad2d5bf5c0ca9639e07a49e8c5d8ae", - "md5": "6c60b5aca7442efb794082cdacfc001c", - "sha1": "aae17944782b25f41f7b3a756532b4923f4ae817", - "sha256": "fc1d9124856a70ff232ef3057d66bee803295847624ce23b4d0217f23af52c75" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791791894528, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\ole32.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258736, - "hashes": { - "imphash": "774fed8966de60d3af2dd9070df5be6f", - "md5": "42f05f980f164e084db65b2e8cd8430f", - "sha1": "86498b3c5bbc240b9de0a10f2cb4185e754de6d7", - "sha256": "0813749847b08f6577791d18ad9eca6dff5b41c2f727ab5ee9e5bf9602ed50cb" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791783899136, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\OLEAUT32.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258981, - "hashes": { - "imphash": "1ec347d133df2fe4da3e5f8944caeae8", - "md5": "4bbfa57f594f7e8a8edc8f377184c3f0", - "sha1": "d48aafa576b40a5e386e609bba1010472551154a", - "sha256": "9f3ac5dea5a6250c3dbb97af79c81c0a48429486521f807355a1d7d3d861b75f" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791779835904, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\WS2_32.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247535145, - "hashes": { - "imphash": "579f52f57e43aa6ff0d07e88af5d0ff5", - "md5": "044fe45ffd6ad40e3bbbe60b7f41babe", - "sha1": "94233c0d4169c02c85514adb1f05cd3298c87f43", - "sha256": "a1688a5e6e0f7037c850699462c2655006a7d873c97f9ab406c59d81749b6f09" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791791828992, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\NSI.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258859, - "hashes": { - "imphash": "4b37cbf60127ea0550ec30e0b1c52984", - "md5": "eaf32cb8c1f810e4715b4dfbe785c7ff", - "sha1": "3b099b193abb9064e6937101d0c309f04d713882", - "sha256": "db6ad07fded42433e669508ab73faff6daff04575d6f1d016fe3eb6ecec4dd5d" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791784816640, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\SHLWAPI.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290257495, - "hashes": { - "imphash": "fd8a6a2046d9572b7f8f4288ae251c61", - "md5": "497bfeddaf3950dd909c3b0c5558a25d", - "sha1": "5d55bdc156372f51eb126f7bc2a8af161a1ef254", - "sha256": "980ea189929d95eb36e35980fff0c81f7b78de9422771fde8f4ac7a779f5bd89" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791730683904, - "mapped_size": 0, - "path": "C:\\Windows\\WinSxS\\amd64_microsoft.windows.gdiplus_6595b64144ccf1df_1.1.7601.17514_none_2b24536c71ed437a\\gdiplus.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258138, - "hashes": { - "imphash": "0bc508389b6b5577cf3cca214ca523a7", - "md5": "2b81776da02017a37fe26c662827470e", - "sha1": "8c85389640bea73a009d83079f8b4c963697035f", - "sha256": "a656353c50ee08422145d00db9cfd9f6d3e664753b3c454b171e2a56a8aa94dc" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791725375488, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\IPHLPAPI.DLL", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247535281, - "hashes": { - "imphash": "e710d6d30f2346e7cd91c89ec3b602d9", - "md5": "4c9210e8f4e052f6a4eb87716da0c24c", - "sha1": "d4fa50aded12eb162478d7606f1270b78dd1a44b", - "sha256": "460f7990bdadb7d58d6dc95b094d30a2efdc4ceed444b18a2f36e8d9076fb8b9" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791725113344, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\WINNSI.DLL", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247527581, - "hashes": { - "imphash": "be693a67b5b884d7609eaf574ba00955", - "md5": "d87e1e59c73c1f98d5ded5b3850c40f5", - "sha1": "141c0ebecdd2733b90431f18b188ee0b64456268", - "sha256": "536419bff9f877d4314b5d0c045d9a6e729489c389863fadf07e382050bc84fd" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 2007957504, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\PSAPI.DLL", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "VeriSign Class 3 Code Signing 2010 CA", - "serial_number": "12 fb c3 65 d3 1e 18 e4 43 7e ed f7 77 5e 0c fb ", - "subject_name": "Cybereason Inc" - }, - "cert_timestamp": { - "issuer_name": "", - "serial_number": "", - "subject_name": "", - "timestamp_string": "" - }, - "more_info_link": "", - "program_name": "", - "publisher_link": "" - }, - "compile_time": 1472978395, - "hashes": { - "imphash": "3a8c832bddbba9333df28c1da212318e", - "md5": "e1c637922e34d868ebcd6ef199cf1394", - "sha1": "01c19a0137082a03ecace613506af5fe9a66a12b", - "sha256": "0c0c7b4c9926413c285fa2345f08b895888887156277e535851a1f1d774e6c6c" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791703158784, - "mapped_size": 0, - "path": "C:\\Program Files\\Cybereason ActiveProbe\\SQLite2015.dll", - "signature_signer": "Cybereason Inc", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247534912, - "hashes": { - "imphash": "d76d7be0b8ac9aafe17d2cc7deb32b29", - "md5": "aa2c08ce85653b1a0d2e4ab407fa176c", - "sha1": "0119c23d88292a0e4fec04d5cf8629005a44e37c", - "sha256": "83dfd0c119b20aedb07114c9d1cf9ce2dfa938d0f1070256b0591a9e2c3997fa" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791790977024, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\IMM32.DLL", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247535018, - "hashes": { - "imphash": "b523fff180cb22465ccf191b827e9923", - "md5": "c431eaf5caa1c82cac2534a2eab348a3", - "sha1": "e425577ccfc9b92efbbcb760d21fcaa478d3e51a", - "sha256": "addf850128dc675e67faba9a3d0d27e684f01f733962ca22927bb94503549e44" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791776100352, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\MSCTF.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 04 ca 69 00 00 00 00 00 08 ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247534874, - "hashes": { - "imphash": "621a31b25a9ef1d128ea281b3eab572b", - "md5": "0040c486584a8e582c861cfb57ab5387", - "sha1": "bcf326e3f79b3db028c2ef1cc1a47d9697e867e7", - "sha256": "5ee17b55cb702d14ae75b19226de21cd2498bda6c6ef5872fdb8a718f401fed1" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791724654592, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\fwpuclnt.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258848, - "hashes": { - "imphash": "cc4d63ca30fdbb90048e549782d2116a", - "md5": "858df0795cb5b4bace0f33708925a414", - "sha1": "e629ed78e6e1829263890974760dad8a431edf69", - "sha256": "a9063af8d5c73a722bd269d144d8a65c98db4cfdd9f626e3a8283754e22c8c9c" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791753031680, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\Secur32.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258854, - "hashes": { - "imphash": "9c631776d86c9b15258c3cc2a6a7891d", - "md5": "26e716ed95dc48cf6e5ac046089366af", - "sha1": "2bd96b8ae5ae3ad14c16d2a98a91a9a9f26d179d", - "sha256": "f686d557b7ac1688efc7cb48311290d713d3db2e9e61e947098a7c80e3a1b9e9" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791761092608, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\shell32.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "VeriSign Class 3 Code Signing 2010 CA", - "serial_number": "3d b2 9a 36 51 f3 f5 e4 9c e0 79 d2 83 95 76 30 ", - "subject_name": "Bitdefender SRL" - }, - "cert_timestamp": { - "issuer_name": "Symantec Time Stamping Services CA - G2", - "serial_number": "0e cf f4 38 c8 fe bf 35 6e 04 d8 6a 98 1b 1a 50 ", - "subject_name": "Symantec Time Stamping Services Signer - G4", - "timestamp_string": "11/29/2016 03:22" - }, - "more_info_link": "", - "program_name": "", - "publisher_link": "" - }, - "compile_time": 1480418473, - "hashes": { - "imphash": "f89e0a919d52e2b37d82d27f521530cf", - "md5": "f1a6e89598aa63a2efcfd1e31b44fe7c", - "sha1": "cd3a39758e72f42ef077c0ad9dd700509a032da6", - "sha256": "1ee6540520a7a84bc22036be42052303b5aed9911c9e8a04184a0688c63576f8" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791699816448, - "mapped_size": 0, - "path": "C:\\Program Files\\Cybereason ActiveProbe\\BDUpdateServiceCom.dll", - "signature_signer": "Bitdefender SRL", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258594, - "hashes": { - "imphash": "2bd8f9f72a13c2803ac3d34b805130b9", - "md5": "764908fe1fa96f93c95b1b67a0fced29", - "sha1": "88d0027e5d10158e3678d9eb2326779fef8a64d1", - "sha256": "26ef25ab307903c5e806a8cc3b750a491049e5d1225ceddfce64dd51aa6f592b" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791720656896, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\NETAPI32.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258588, - "hashes": { - "imphash": "96f28fef38c977afbf3f6e8f39c0d6b9", - "md5": "6ceca4c6a489c9b2e6073afdaae3f607", - "sha1": "b228f6208642cb99e5bcdf2d3ebda2b8bc4fb020", - "sha256": "127506d1db38275614cbeb047c133718ef9d03266ba9c98be55ec7847cfc9c3d" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791720198144, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\netutils.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258920, - "hashes": { - "imphash": "2d37f2d4b3c246f361ca150fc7ebf8d4", - "md5": "3a9c9baf610b0dd4967086040b3b62a9", - "sha1": "3207ac7f895eab34623d994548d7810e54be3e79", - "sha256": "e8e9a0f42b1ee7806edceed08aa024d037215d06ca317e3678bd5364ad513d23" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791751524352, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\srvcli.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290259010, - "hashes": { - "imphash": "6ad99a405bde55d6a18debafd3f5e5c5", - "md5": "3c91392d448f6e5d525a85b7550d8ba9", - "sha1": "b62eaf7d80617e136a8f3c9161c23464e6f2a171", - "sha256": "6fd0dc73dbe7519e2c643554c2a7f8fbe4f9a678c4241bb54b3c6e65d2abcf3a" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791720067072, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\wkscli.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247535234, - "hashes": { - "imphash": "13ecfa3a285149680a7a4b174c8b8f5b", - "md5": "94e026870a55aaeaff7853c1754091e9", - "sha1": "a4f845318e095d841b05e1400747ee4c28e1f28e", - "sha256": "b2f5d5629d12bdfa98dbed3898368f37d9009c7531b6909c7285a2c11c9a0f93" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791741169664, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\VERSION.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "VeriSign Class 3 Code Signing 2010 CA", - "serial_number": "3d b2 9a 36 51 f3 f5 e4 9c e0 79 d2 83 95 76 30 ", - "subject_name": "Bitdefender SRL" - }, - "cert_timestamp": { - "issuer_name": "Symantec Time Stamping Services CA - G2", - "serial_number": "0e cf f4 38 c8 fe bf 35 6e 04 d8 6a 98 1b 1a 50 ", - "subject_name": "Symantec Time Stamping Services Signer - G4", - "timestamp_string": "01/18/2017 09:26" - }, - "more_info_link": "", - "program_name": "", - "publisher_link": "" - }, - "compile_time": 1484760175, - "hashes": { - "imphash": "b33f679b12d9d05d922e720c0e21818c", - "md5": "1e5ea729f6dc5a8aff675a45706d389d", - "sha1": "f5a70ab4772325946a93c9eaf48ebe1dd1e7d3a3", - "sha256": "35da922b25ec8389a733f46a6c0d37c2c6b05463a123cde9fee48402c473e1ef" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791699161088, - "mapped_size": 0, - "path": "C:\\Program Files\\Cybereason ActiveProbe\\scan.dll", - "signature_signer": "Bitdefender SRL", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "VeriSign Class 3 Code Signing 2010 CA", - "serial_number": "3d b2 9a 36 51 f3 f5 e4 9c e0 79 d2 83 95 76 30 ", - "subject_name": "Bitdefender SRL" - }, - "cert_timestamp": { - "issuer_name": "Symantec Time Stamping Services CA - G2", - "serial_number": "0e cf f4 38 c8 fe bf 35 6e 04 d8 6a 98 1b 1a 50 ", - "subject_name": "Symantec Time Stamping Services Signer - G4", - "timestamp_string": "11/22/2016 08:08" - }, - "more_info_link": "", - "program_name": "", - "publisher_link": "" - }, - "compile_time": 1479830743, - "hashes": { - "imphash": "513a166377e008d25aa2e22983dd13ff", - "md5": "3450d998edec5cdbd03b0df09c17e02d", - "sha1": "558979fb1a9368acdf2dc1e3d1afd94e7343f914", - "sha256": "c1f24493e4fc2a9c5d17e077455c3a610ad1e5fa46590f0f9598e680e5a07556" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791698702336, - "mapped_size": 0, - "path": "C:\\Program Files\\Cybereason ActiveProbe\\gzfltum.dll", - "signature_signer": "Bitdefender SRL", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "VeriSign Class 3 Code Signing 2010 CA", - "serial_number": "3d b2 9a 36 51 f3 f5 e4 9c e0 79 d2 83 95 76 30 ", - "subject_name": "Bitdefender SRL" - }, - "cert_timestamp": { - "issuer_name": "Symantec Time Stamping Services CA - G2", - "serial_number": "0e cf f4 38 c8 fe bf 35 6e 04 d8 6a 98 1b 1a 50 ", - "subject_name": "Symantec Time Stamping Services Signer - G4", - "timestamp_string": "01/16/2017 05:34" - }, - "more_info_link": "", - "program_name": "", - "publisher_link": "" - }, - "compile_time": 1484573247, - "hashes": { - "imphash": "d6d5dc292fe4d710905e9f280360309d", - "md5": "9f1bcf84eaa34afbdfcf19f22fc1d6f5", - "sha1": "e15e023d46738f4848f64ce853ada6a3083f8b7f", - "sha256": "d1c30b1a7fc63c4f52b00628c3e73f571db52ff2b87718bcb5a6322923f58987" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791696343040, - "mapped_size": 0, - "path": "C:\\Program Files\\Cybereason ActiveProbe\\bdquar.dll", - "signature_signer": "Bitdefender SRL", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "VeriSign Class 3 Code Signing 2010 CA", - "serial_number": "3d b2 9a 36 51 f3 f5 e4 9c e0 79 d2 83 95 76 30 ", - "subject_name": "Bitdefender SRL" - }, - "cert_timestamp": { - "issuer_name": "Symantec Time Stamping Services CA - G2", - "serial_number": "0e cf f4 38 c8 fe bf 35 6e 04 d8 6a 98 1b 1a 50 ", - "subject_name": "Symantec Time Stamping Services Signer - G4", - "timestamp_string": "01/16/2017 05:34" - }, - "more_info_link": "", - "program_name": "", - "publisher_link": "" - }, - "compile_time": 1484573248, - "hashes": { - "imphash": "4e1a791e94ac955105ddfaac387de22f", - "md5": "874d6017f89a2ef255a16280ed4b1bf7", - "sha1": "8951c3ab1c9ea0c312206b98d22a9779c8a89c8c", - "sha256": "00512202b78037c17a77b095fcb3458381002dbd20de8dee0c99ff7701343cda" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791693721600, - "mapped_size": 0, - "path": "C:\\Program Files\\Cybereason ActiveProbe\\BDSmartDB.dll", - "signature_signer": "Bitdefender SRL", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290257756, - "hashes": { - "imphash": "5cd9d6761799e2ff681533ef1ffbb31d", - "md5": "2477a28081bdaee622cf045acf8ee124", - "sha1": "304c5f29fa847fbd994ad7a0471214198b928c14", - "sha256": "00a09caf9129e84feea98fa03ce9012c9f961b64fee15c4f268822c0f82acc3c" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791757291520, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\CFGMGR32.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "DigiCert Assured ID Code Signing CA-1", - "serial_number": "0f b5 4c 96 fd 63 93 fd 7b b9 9c d1 d0 d5 16 ed ", - "subject_name": "Bitdefender SRL" - }, - "cert_timestamp": { - "issuer_name": "Symantec Time Stamping Services CA - G2", - "serial_number": "0e cf f4 38 c8 fe bf 35 6e 04 d8 6a 98 1b 1a 50 ", - "subject_name": "Symantec Time Stamping Services Signer - G4", - "timestamp_string": "09/12/2018 01:20" - }, - "more_info_link": "", - "program_name": "", - "publisher_link": "" - }, - "compile_time": 1512623776, - "hashes": { - "imphash": "e2dab13fa4a67b25d3fbae65a189c521", - "md5": "627d7f1de23e6b01d6251b4c6962e765", - "sha1": "5e1d1854861016198ce4a1dbdea883f257de9463", - "sha256": "82bdf513b5f5b55ff740482ee839b14455b2296e2a911cb9a1ae622969412ed5" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791688937472, - "mapped_size": 0, - "path": "C:\\ProgramData\\apv2\\bd_db\\1\\bdcore.dll", - "signature_signer": "Bitdefender SRL", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "VeriSign Class 3 Code Signing 2010 CA", - "serial_number": "3d b2 9a 36 51 f3 f5 e4 9c e0 79 d2 83 95 76 30 ", - "subject_name": "Bitdefender SRL" - }, - "cert_timestamp": { - "issuer_name": "Symantec Time Stamping Services CA - G2", - "serial_number": "0e cf f4 38 c8 fe bf 35 6e 04 d8 6a 98 1b 1a 50 ", - "subject_name": "Symantec Time Stamping Services Signer - G4", - "timestamp_string": "09/13/2017 23:13" - }, - "more_info_link": "", - "program_name": "", - "publisher_link": "" - }, - "compile_time": 1505278115, - "hashes": { - "imphash": "c2979e6e570392ed85b4e15810f2e90f", - "md5": "3b4c71b64bc20b0c6578a091a031c0fb", - "sha1": "00cb578e723555e929e4ad8e820772b56ce29475", - "sha256": "52db08c10a5f1482dda8527d592f71b33c1cfecfa5a5a2d0be5a78325c41dd7b" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791679827968, - "mapped_size": 0, - "path": "C:\\Program Files\\Cybereason ActiveProbe\\bdnc.dll", - "signature_signer": "Bitdefender SRL", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290257999, - "hashes": { - "imphash": "04534d8dae5ab230b9bee9b1b0b2829d", - "md5": "3f9f2afa135f0663946a006dd5ffd897", - "sha1": "ea6456859b04b68af8dcd453381dd168af53fc5e", - "sha256": "276d1c9c78c529625c2ef3d77079324628686ea184767971901a1de93681c133" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791758209024, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\CRYPT32.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258373, - "hashes": { - "imphash": "2e50bc5d9fe777770c8a6b2cfaf6b2e9", - "md5": "884415bd4269c02eaf8e2613bf85500d", - "sha1": "c3a64f05c210b38c69d8f1fc1d74a71b56ada30c", - "sha256": "efe771709ec942694fd206ac8d0a48ed7dcd35036f074268e4aecd68ac982cea" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791757225984, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\MSASN1.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247535280, - "hashes": { - "imphash": "af1203c1d6d810c97729856780869b12", - "md5": "ef2ae43bcd46abb13fc3e5b2b1935c73", - "sha1": "c53e005cd04d99331ce3114ac119256133202313", - "sha256": "81fc06f306f620845d7dd8d06e706309e70bc89b589c81f3478302a3f5f73431" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791679172608, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\WINMM.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258927, - "hashes": { - "imphash": "b32250da0d30f7782b5b900d4d9c519a", - "md5": "2a86e54b441ad41557f75dc5609b9793", - "sha1": "83ddcf8a1a0ca423bf8417f5e59b5c431bf50c43", - "sha256": "8fede6909413c0fa5b63d58d39affd0f6c3beeaf19b7b2f8674913abfd79a912" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791754866688, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\SSPICLI.DLL", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258493, - "hashes": { - "imphash": "466f15f36f10655b30e9347e7dfc2b52", - "md5": "1d5185a4c7e6695431ae4b55c3d7d333", - "sha1": "5e9f739d46e20541ffc0a6421dc6be416ca8f261", - "sha256": "16f3906c54f1d71559836fdfcf4e83e7c9f454463d78fd577ad2d7022e0bcb51" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791748378624, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\mswsock.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247535287, - "hashes": { - "imphash": "f967c6b35a5d1b7765016056a842e331", - "md5": "31559f3244c6bc00a52030caa83b6b91", - "sha1": "7943540153c7b7878101a4901d7935e05e7cfd32", - "sha256": "b2025742b5f0025ace9821d5722de3f997eeeab21d2f381c9e307882df422579" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791742021632, - "mapped_size": 0, - "path": "C:\\Windows\\System32\\wshtcpip.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247534998, - "hashes": { - "imphash": "77870f98ca4d25a823c74d7404a64bfd", - "md5": "d0c2fbb6d97416b0166478fc7ae2b212", - "sha1": "e290bdf2312ac30a4e9f2a96d7c84714eee84899", - "sha256": "7eab6c37f0a845e645ca44cc060ac6c56e386c7ef7a64716c6786c9602ad8c9d" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791748771840, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\CRYPTSP.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 04 ca 69 00 00 00 00 00 08 ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 17:43" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1247535161, - "hashes": { - "imphash": "b8c20a01e4d94df61ee21f5350389f9c", - "md5": "5d8874a8c11dddde29e12de0e2013493", - "sha1": "a1c8e3e6ee44dcb68752d44b3b6f4ecce89c388d", - "sha256": "3e9a57137bf622af83e3e4d58971e2c0200559cca7545d16cf263aa03ee9c7d2" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791745626112, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\rsaenh.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247534993, - "hashes": { - "imphash": "f0c6fd6831905d958b05645b680db89f", - "md5": "784fa3df338e2e8f5f0389d6fac428af", - "sha1": "6d32c67c91c6d374854e907c6719db2538540867", - "sha256": "9c8aa0cfdeb9e38aaf8eb08626070e0f0364f4f8a793cfe3532ec6c007980c34" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791755456512, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\CRYPTBASE.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290257906, - "hashes": { - "imphash": "ff74e3ff0a015c2023b747f613061e42", - "md5": "a52b6cc24063cc83c78c0e6f24deec01", - "sha1": "a5384efac7d1f9213aaf0423ed0b021bc986b9df", - "sha256": "77e0d2b2356e71f9be52fa479c9dde17c453c198bb49cd4a97f2309628d82e3b" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791746805760, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\DNSAPI.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247534791, - "hashes": { - "imphash": "59b31e42f8fae7b5809ba7fcae732e0c", - "md5": "4cbcc37856ea2039c27a2fb661dda0e5", - "sha1": "cc666108d34168420a1d1942dda1e090154c7296", - "sha256": "74cbfab3092a9564bddfcb84db3e3f8bcfd1492938adf187423d3355d73d21c6" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791722557440, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\dhcpcsvc6.DLL", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247534790, - "hashes": { - "imphash": "f17020f0f66b64fbdf51c75b43f3729d", - "md5": "f568f7c08458d69e4fcd8675bbb107e4", - "sha1": "c1e05f0255a6f386711044b11e2d04dfd328b26a", - "sha256": "a5fa25ecf248999a68ccecfbb508bfa1add18a23e20a9a9081a87c41caaa36c0" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791722426368, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\dhcpcsvc.DLL", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247534847, - "hashes": { - "imphash": "dda6776607f283829d85b996f5e46d03", - "md5": "f3d202f53a222d5f6944d459b73cf967", - "sha1": "c9db224ce8ec34aa2f341b6766ea67aa12f8b4a7", - "sha256": "e9f1d48eb333d32331bcfd0348fe07bee7d5352292e6020571da395f596affe7" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791675961344, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\FLTLIB.DLL", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247535135, - "hashes": { - "imphash": "ff720e05e534d67b814b8562265058f5", - "md5": "2c942733a5983dd4502219ff37c7ebc7", - "sha1": "263e8fbf77c0ceead0c9bca56394bffa4a664361", - "sha256": "34b20b6b0d7274e4b5b783f1d2345bc3dd9888964d5c2c65712f041a00cf5b45" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791756308480, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\profapi.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290259008, - "hashes": { - "imphash": "b2ecd39ae0055d9e1b8aa5bc78942cba", - "md5": "eb3f9c2de1236b5d46b2291d82970e43", - "sha1": "0ce9ddc1063256ab571b916389321fd7f572ddc0", - "sha256": "8a43d335f3d573bed98af54bb51e82546c2acc025da8a48d801213eb14e9d5d4" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791759847424, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\WINTRUST.DLL", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247534778, - "hashes": { - "imphash": "37afbae3e0f359c3718e379261f7ccfc", - "md5": "25983de69b57142039ac8d95e71cd9c9", - "sha1": "01691e3b0bfa569e64bdb7dc3d637a867ed2dc08", - "sha256": "a677da7ebcbcb6073d27e8a38809f51e971e83ed379bc599aaad6ef4216348da" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791791173632, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\CLBCatQ.DLL", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258799, - "hashes": { - "imphash": "a198edd0f73abd7cdbb54eef82ab1fc6", - "md5": "c2a8cb1275ecb85d246a9ecc02a728e3", - "sha1": "4417207821fc8f5c72ff531683f183caef297882", - "sha256": "3603fadca0060bd201148f9d59e4e2627f024609a6463ab525b5d1ad17bdcd10" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791756177408, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\RpcRtRemote.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258979, - "hashes": { - "imphash": "207b35260128e01bb777acc1377dc241", - "md5": "58f4493bf748a3a89689997b7bd00e95", - "sha1": "9974ba41e8215f6669deb765988cfe34e9c1b56e", - "sha256": "ec5deec73e357c7c87b001275c4e635011a9cf39419f2b86e2c2b8d7e388c551" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791697915904, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\winhttp.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258934, - "hashes": { - "imphash": "01ecfbe4437ca8d85dd9400611c1b90e", - "md5": "bc9489df517c426d4044d99f14449134", - "sha1": "814f9c8c59ee59f2ff3fc1b5e21d5e270babb506", - "sha256": "cabd014ba29a548252bb8d5bd46d047dbfc445489492d9df75b29cede0ac9f8b" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791697457152, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\webio.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290257996, - "hashes": { - "imphash": "eb1c8dd21e1f92a8be35a76b165ce8da", - "md5": "52d3d5e3586988d4d9e34acaac33105c", - "sha1": "2c20246d2c45fb6e8976b37ad62465f5f4255f2b", - "sha256": "c61b60ba962b25b8334f0941c3535ea4aca1cc060b8a196e396ca3e11ceef8a1" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791744577536, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\credssp.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247535281, - "hashes": { - "imphash": "9e65c315ab3a48dda5ab558165a5002b", - "md5": "ec7cbff96b05ecf3d366355b3c64adcf", - "sha1": "fa74a61ea56a7bc3149860b5344c51fa9b6555bb", - "sha256": "f69ed45ebedca9cf000ac03281f0ec2c351f98513fba90e63394e4e561d6c7a2" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791748313088, - "mapped_size": 0, - "path": "C:\\Windows\\System32\\wship6.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247535149, - "hashes": { - "imphash": "c2a02641f5327bf07de486ae7ec62117", - "md5": "88351b29b622b30962d2feb6ca8d860b", - "sha1": "3338d73b6c86fce85b07236ac230e5e2f4601818", - "sha256": "a16cad7d94c1c9807083bb36e9b4c3c14e6482c4ca2bdfacbcc86e737ddce42e" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791678255104, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\rasadhlp.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258810, - "hashes": { - "imphash": "34991d52051c8576ed061e7a2c5a4ae0", - "md5": "a199de544bf5c61c134b22c7592226fc", - "sha1": "03d97c806e4a28bb37d8c8384deddd6ac28acc9d", - "sha256": "af0cc2da847036f5fe6dd9fbeda7c3d05af291873d4eae121676dc6e8841a78f" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791746215936, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\schannel.DLL", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247535060, - "hashes": { - "imphash": "6a351d0e14283da2cd897563f0062c5b", - "md5": "2e8c52a0ec788d90fa35d9507d828771", - "sha1": "0725085c62d3a5a9a0d50256c2a56161aaca0a07", - "sha256": "dd5aaa10e075f209d9827c7a192ad5645d1156c149db9b5ac1ef7b5e0b5f11de" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791750344704, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\ncrypt.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247534713, - "hashes": { - "imphash": "9f3aab7eb2ffeeba57cb67496b05f365", - "md5": "b9a95365e52f421a20e1501935fadda5", - "sha1": "958a7ba90043f8e3b94da849a2da8bb139fc39c9", - "sha256": "ddb4cb575139233efaf2c59b7e9b04af36bbccc63190181f3b2a7e6bfc86e77e" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791750148096, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\bcrypt.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 34 64 00 00 00 00 00 0c ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 05:28" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290257648, - "hashes": { - "imphash": "738644d200eea1ceb5661b1ac09aa146", - "md5": "d6c7780a364c6bbacfa796bab9f1b374", - "sha1": "15236c349be131790d21a63550d725cc62b1bf13", - "sha256": "3b5ed1a030bfd0bb73d4ffcd67a6a0b8501ef70293f223efaa12f430adf270f9" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791744839680, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\bcryptprimitives.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258932, - "hashes": { - "imphash": "0e8a67fa12ce3d22a9e1d18bda5c3260", - "md5": "7a17485dc7d8a7ac81321a42cd034519", - "sha1": "83d1722a35eb16b010d8c9f72c627e97d4642101", - "sha256": "88d8705fa901793fc8c1cfd0175e49a6502bf0fc94a066ba573d2fd13aa5f04a" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791743201280, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\USERENV.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 04 ca 69 00 00 00 00 00 08 ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247534853, - "hashes": { - "imphash": "1bcae470249f30c5f912c1293a2d3470", - "md5": "9c9307c95671ac962f3d6eb3a4a89bae", - "sha1": "6190ce7b101c5946b1d773245d286a1e592f5181", - "sha256": "d1433791c9b8bceead8937ec18d33e89e4e2012b5975228a8500fd141bc30078" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791743070208, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\GPAPI.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - } - ], - "name": "AmSvc.exe", - "parent_exe": "C:\\Windows\\System32\\services.exe", - "parent_name": "services.exe", - "pid": 1076, - "ppid": 432, - "primary_token": { - "domain": "NT AUTHORITY", - "integrity_level": 16384, - "integrity_level_name": "system", - "privileges": [ - { - "description": "Replace a process level token", - "enabled": false, - "name": "SeAssignPrimaryTokenPrivilege" - }, - { - "description": "Lock pages in memory", - "enabled": true, - "name": "SeLockMemoryPrivilege" - }, - { - "description": "Adjust memory quotas for a process", - "enabled": false, - "name": "SeIncreaseQuotaPrivilege" - }, - { - "description": "Act as part of the operating system", - "enabled": true, - "name": "SeTcbPrivilege" - }, - { - "description": "Manage auditing and security log", - "enabled": false, - "name": "SeSecurityPrivilege" - }, - { - "description": "Take ownership of files or other objects", - "enabled": false, - "name": "SeTakeOwnershipPrivilege" - }, - { - "description": "Load and unload device drivers", - "enabled": true, - "name": "SeLoadDriverPrivilege" - }, - { - "description": "Profile system performance", - "enabled": true, - "name": "SeSystemProfilePrivilege" - }, - { - "description": "Change the system time", - "enabled": false, - "name": "SeSystemtimePrivilege" - }, - { - "description": "Profile single process", - "enabled": true, - "name": "SeProfileSingleProcessPrivilege" - }, - { - "description": "Increase scheduling priority", - "enabled": true, - "name": "SeIncreaseBasePriorityPrivilege" - }, - { - "description": "Create a pagefile", - "enabled": true, - "name": "SeCreatePagefilePrivilege" - }, - { - "description": "Create permanent shared objects", - "enabled": true, - "name": "SeCreatePermanentPrivilege" - }, - { - "description": "Back up files and directories", - "enabled": true, - "name": "SeBackupPrivilege" - }, - { - "description": "Restore files and directories", - "enabled": true, - "name": "SeRestorePrivilege" - }, - { - "description": "Shut down the system", - "enabled": false, - "name": "SeShutdownPrivilege" - }, - { - "description": "Debug programs", - "enabled": true, - "name": "SeDebugPrivilege" - }, - { - "description": "Generate security audits", - "enabled": true, - "name": "SeAuditPrivilege" - }, - { - "description": "Modify firmware environment values", - "enabled": false, - "name": "SeSystemEnvironmentPrivilege" - }, - { - "description": "Bypass traverse checking", - "enabled": true, - "name": "SeChangeNotifyPrivilege" - }, - { - "description": "Remove computer from docking station", - "enabled": false, - "name": "SeUndockPrivilege" - }, - { - "description": "Perform volume maintenance tasks", - "enabled": false, - "name": "SeManageVolumePrivilege" - }, - { - "description": "Impersonate a client after authentication", - "enabled": true, - "name": "SeImpersonatePrivilege" - }, - { - "description": "Create global objects", - "enabled": true, - "name": "SeCreateGlobalPrivilege" - }, - { - "description": "Increase a process working set", - "enabled": true, - "name": "SeIncreaseWorkingSetPrivilege" - }, - { - "description": "Change the time zone", - "enabled": true, - "name": "SeTimeZonePrivilege" - }, - { - "description": "Create symbolic links", - "enabled": true, - "name": "SeCreateSymbolicLinkPrivilege" - } - ], - "sid": "S-1-5-18", - "type": "tokenPrimary", - "user": "SYSTEM" - }, - "services": [ - { - "name": "CybereasonAntiMalware" - } - ], - "sha1": "ca85243c0af6a6471bdaa560685c51eefd6dbc0d", - "sha256": "8ad40c90a611d36eb8f9eb24fa04f7dbca713db383ff55a03aa0f382e92061a2", - "sid": "S-1-5-18", - "signature_signer": "Cybereason Inc", - "signature_status": "trusted", - "threads": [ - { - "create_time": 1542788400, - "entrypoint": 5362733988, - "thread_id": 1080, - "up_time": 1084 - }, - { - "create_time": 1542788400, - "entrypoint": 2006167232, - "thread_id": 1108, - "up_time": 1083 - }, - { - "create_time": 1542788400, - "entrypoint": 8791693804752, - "thread_id": 1232, - "up_time": 1080 - }, - { - "create_time": 1542788400, - "entrypoint": 8791693762672, - "thread_id": 1244, - "up_time": 1080 - }, - { - "create_time": 1542788400, - "entrypoint": 8791679862464, - "thread_id": 1392, - "up_time": 1070 - }, - { - "create_time": 1542788400, - "entrypoint": 8791679862464, - "thread_id": 1396, - "up_time": 1070 - }, - { - "create_time": 1542788400, - "entrypoint": 8791679865776, - "thread_id": 1400, - "up_time": 1070 - }, - { - "create_time": 1542788400, - "entrypoint": 8791679929872, - "thread_id": 1404, - "up_time": 1070 - }, - { - "create_time": 1542788400, - "entrypoint": 2006186944, - "thread_id": 1480, - "up_time": 1067 - }, - { - "create_time": 1542788400, - "entrypoint": 8791704162340, - "thread_id": 1632, - "up_time": 1033 - }, - { - "create_time": 1542788400, - "entrypoint": 8791698721056, - "thread_id": 1640, - "up_time": 1033 - }, - { - "create_time": 1542788400, - "entrypoint": 8791698721056, - "thread_id": 1644, - "up_time": 1033 - }, - { - "create_time": 1542788400, - "entrypoint": 8791698721056, - "thread_id": 1648, - "up_time": 1033 - }, - { - "create_time": 1542788400, - "entrypoint": 8791698721056, - "thread_id": 1652, - "up_time": 1033 - }, - { - "create_time": 1542788400, - "entrypoint": 8791698721392, - "thread_id": 1656, - "up_time": 1033 - }, - { - "create_time": 1542788400, - "entrypoint": 8791698720112, - "thread_id": 1660, - "up_time": 1033 - }, - { - "create_time": 1542788400, - "entrypoint": 8791698720736, - "thread_id": 1664, - "up_time": 1033 - }, - { - "create_time": 1542788400, - "entrypoint": 8791698722160, - "thread_id": 1668, - "up_time": 1033 - }, - { - "create_time": 1542788400, - "entrypoint": 5362651040, - "thread_id": 1672, - "up_time": 1033 - }, - { - "create_time": 1542788400, - "entrypoint": 5362651040, - "thread_id": 1680, - "up_time": 1033 - }, - { - "create_time": 1542788900, - "entrypoint": 8791680004352, - "thread_id": 1808, - "up_time": 587 - }, - { - "create_time": 1542789000, - "entrypoint": 2006186944, - "thread_id": 2284, - "up_time": 432 - }, - { - "create_time": 1542789100, - "entrypoint": 2006186944, - "thread_id": 1780, - "up_time": 364 - }, - { - "create_time": 1542789100, - "entrypoint": 2006186944, - "thread_id": 12, - "up_time": 343 - }, - { - "create_time": 1542789200, - "entrypoint": 8791748438592, - "thread_id": 2476, - "up_time": 168 - } - ], - "unique_pid": 22, - "unique_ppid": 8, - "up_time": 1084, - "user": "SYSTEM" - }, - "acting_thread": { - "create_time": 1542788400, - "service_name": "CybereasonAntiMalware", - "thread_id": 1648, - "thread_start_address": 8791698721056, - "thread_start_address_module": "C:\\Program Files\\Cybereason ActiveProbe\\gzfltum.dll" - } - }, - "captured_file": false, - "file_name": "C:\\Windows\\TEMP\\tmp0000008f\\tmp00001c75", - "file_operation": "creation", - "file_owner": "Administrators", - "file_size": 188416, - "hashes": { - "imphash": "835d619dfdf3cc727cebd91300ab3462", - "md5": "4ace3baaa509d08510405e1b169e325b", - "sha1": "27fb21cf5db95ffca43b234affa99becc4023b9d", - "sha256": "6ed1c836dbf099be7845bdab7671def2c157643761b52251e04e9b6ee109ec75" - }, - "is_signature_trusted": false, - "malware_classification": { - "compressed_malware_features": { - "data_buffer": "eAHtnU1oHHUUwHsQ7MGDiIIUD4sH8WBBxJtopiLoUY0pYo2ZTbJJ0yQ17m4+ms/NRzeVWpuUWCL4sWlEYvFQ8KJQ6NCTEA8eRD30sIo3PdSriLi7837Pko3LbHZ2M5m+XObHm/d/X////83O7jCZvzacHBpPplNdfalkdjSdyty674Ft59dN71Dpb9v5eKh8LMEHjsCF2wIfVlRKsHROYPGkQO5+gY2vBSYYdWZFYGwEO/cITHMqkxPYnBBY+07gtCuQ9gSGigJ5lPPYGXcE+jA4z3Ad1ZtAUiDUyrEEPYzqRnIKgxd/Rgc7gygPo5wn95PouN7OeEYJ1UXiJgRmvscgp/LOziIkkSyT+xRVnXhZ4DKh5goCkzidRHkGO4uvCyw9LDDtCay8ILCAzrJOJaGuZwUuvSewivJVIPsklq8JbL4qMJsTSCcExrGs83WKU295ZFo5lr2TaZbcUw5FeJy8tgTeLpCy2iGeS67ABXzlgbEi1UC5FxcZnA4y/CLK82Qxi847FGGZRTLsCUxR1aWEwOp1AmOjDRYYzgwusL9WfqBiGJxnVAanixTq7Dp22LBdlWMJzlOx8wmBK2Rx5WmBLJIRwtAijOQE+ooCb2B5xBOYRtlfNeXpLpA7oyZRTqHzGenkmIJPnhBIMrzTwSA6H93CO5l+c1NA99f6IwLH8fUKdjTmDpTbgS50+gGVnECnE4PpooC2guPoaPADSHrcncNHmEHtAFkq3+EI+A37zsrrTvH3WTkvJLoOTyBp10wx2JcgVCRahA4NrICE4a+hrMXsA3qAHItW188E8ejO7XV3eh/KCYwxlamEwCgL8lN2wTntfrhY/U0g/5KAdvUpT+AszWqBdqH7VLeeZrExK9Cv1UgIDKA8g/cx7QAEP+AhAfRaMKB2HOJh+BSFSqKjSytNGBlc6PrpxvK7lCVDxbSG3Z7AhCMwx6gelwgLAltXBXJUTH29j+U1LHdipx/QprfKfGnF0sBpdBYxmEQyTzW0h6/0khcuhhJYRufym+i4VKMocJMs/KvfoW3/UJb4PeZOSZVONThZz4djP/75TAXa/CVfOvX3RgVLIDreLPN1pP1osW7lGmHsEhjBOzf+EPBE4vndvWz5xb/cChxGcv1LAb+tluALKnZ47isf1MXvz1ZMlsCXbXtPceqhrcp1ps6YHwQeBXLEPCf7q23tl9uJui0bGBgYRAccv7uXr/g5Af+2oNTrpgTa/vnpjBvpLAwM4gRBPvIZGBgYGBgYGBgYGBgYGBgYGBgYGBgYNAOc9oMXs4GBgYFBcNBnww5QzDXgRtPSaZ5lg/itsRaslgZ3bnWEEVnhMetIBwiiVnlbCbWrEftrt11zdwWnseFW1QO63w1is3ptD1pV9xG0t+zvfUrzrvh380qwXWAVCw6h78GIfG7ZlzltXu6hd+y92fECRFhjuH3bXG8N43oXEHperdzvUbteaDxhVTUeq25fqhG1X6Ai8mtF6BDXz2wR+dzSgg4Qsxls5T11XMG+82y8GkG+b7kL69xg7mF1SFvhBgYGsYH/Xi7HE+PVkiB2jt1bNZxT+k4558jR53ydz5//1m1KOgYGBgYGBgYGEQfnsYaG2z1sdPJS79XQSu91ndobOAHCaN5vNzUk1bceQVzUpbw3iOuT+UFmR18bHrp3gyhDC56lCd1y85w2+HSNUwVhhdGC7blLf+bV/fqtvhMg1NDjCcugB1QXswbs8ekj/v1BgzFHBIIsyP+HfwFdMpzu", - "decompressed_size": 27831, - "encoding": "zlib" - }, - "identifier": "endpointpe", - "prevention_threshold": 0.66, - "score": 1, - "threshold": 0.66, - "version": "3.0.33" - }, - "pid": 1076, - "ppid": 432, - "signature_signer": "", - "temp_file_path": "C:\\Windows\\TEMP\\27fef9a8-bd80-4784-934c-76b383147d3f", - "timestamp": { - "accessed": 1542789400, - "created": 1542789400, - "modified": 1542789400 - }, - "user_blacklisted": false - }, - "event_subtype_full": "file_classification_event", - "event_type_full": "alert_event", - "metadata": { - "beta_alert": false, - "chunk_id": 0, - "collection_time": 1542789400, - "correlation_id": "3aab8e43-2cdb-4d32-b46b-b8382ff11939", - "destination_plugin": "send", - "final": true, - "is_alert": true, - "key": "fileClassificationEventResponse", - "message_id": "31b54c77-fdbb-4550-9259-0dce12b98ec2", - "origination_task_id": "7aa040c3-7751-4b8f-9629-9ed4d84c1507", - "os_type": "windows", - "priority": 80, - "result": { - "local_code": 0, - "local_msg": "Success" - }, - "semantic_version": "3.50.0", - "sensor_version": "3.50.0", - "task_id": "7aa040c3-7751-4b8f-9629-9ed4d84c1507", - "type": "detection" - }, - "opcode": 8, - "serial_event_id": 167011, - "timestamp": 132140242101035230, - "timestamp_utc": "2019-09-27 02:16:50Z" - }, - "event": { - "action": "file_classification_event", - "dataset": "esensor", - "kind": "alert", - "module": "endgame" - }, - "host": { - "hostname": "HD-ssm-0b0d26ad", - "ip": "10.81.164.74", - "name": "HD-ssm-0b0d26ad", - "os": { - "name": "Windows", - "platform": "windows", - "version": "6.1" - } - }, - "labels": { - "account_id": "8c48070b-4b61-4ded-86d5-1b9a7a78229c", - "endpoint_id": "5085268f-7443-4f15-85d2-bf14b2a69c60" - }, - "user": { - "group": { - } - } - }, - "type": "_doc" - } - }, - { - "type": "doc", - "value": { - "id": "kuNEc20BW148Je-rmp1N", - "index": "test_alert_data", - "source": { - "@timestamp": 1542341895000, - "agent": { - "id": "ced9c68e-b94a-4d66-bb4c-6106514f0a2f", - "type": "endgame", - "version": "3.0.0" - }, - "ecs": { - "version": "1.1.0" - }, - "endgame": { - "data": { - "alert_details": { - "acting_process": { - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "cmdline": "C:\\Windows\\Explorer.EXE", - "create_time": 1542341500, - "domain": "WIN-Q3DOP1UKA81", - "exe": "C:\\Windows\\explorer.exe", - "hashes": { - "md5": "ac4c51eb24aa95b77f705ab159189e24", - "sha1": "4583daf9442880204730fb2c8a060430640494b1", - "sha256": "6a671b92a69755de6fd063fcbe4ba926d83b49f78c42dbaeed8cdb6bbc57576a" - }, - "imphash": "6422e341c67ba0880e012f8c7c634c21", - "is_sensor": false, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "md5": "ac4c51eb24aa95b77f705ab159189e24", - "modules": [ - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290248516, - "hashes": { - "imphash": "6422e341c67ba0880e012f8c7c634c21", - "md5": "ac4c51eb24aa95b77f705ab159189e24", - "sha1": "4583daf9442880204730fb2c8a060430640494b1", - "sha256": "6a671b92a69755de6fd063fcbe4ba926d83b49f78c42dbaeed8cdb6bbc57576a" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 4278845440, - "mapped_size": 0, - "path": "C:\\Windows\\Explorer.EXE", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 04 b3 f5 00 00 00 00 00 0d ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 05:28" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258681, - "hashes": { - "imphash": "d41d8cd98f00b204e9800998ecf8427e", - "md5": "3556d5a8bf2cc508bdab51dec38d7c61", - "sha1": "92015f7bbdb9dad35e41c533d2c5b85f1cd63d85", - "sha256": "91e3d98ad3119e8addf8d2aa1dd6795162842fff7101e4c70c5137e847b4ff50" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 2007891968, - "mapped_size": 0, - "path": "C:\\Windows\\SYSTEM32\\ntdll.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258315, - "hashes": { - "imphash": "9165b02c931d76a9b666d8d42128111b", - "md5": "7a6326d96d53048fdec542df23d875a0", - "sha1": "5c02af0206c299f5bcab8da4237cfc92e3e93495", - "sha256": "182351570856cd6eedd9df7e2fb8ab76bd4d8fc70be11ad5de6484cfd70c21c6" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 2006712320, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\kernel32.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258316, - "hashes": { - "imphash": "3f7fb1504bb73a54888bf1c3650fe4cf", - "md5": "da68c291b4ef2dec9c5963266bcae454", - "sha1": "5696e8c68fcf64104499e20e7cd5452b58b4f4ba", - "sha256": "21aa4779fc21e762178517268c95467238c92851ad9160bffc36b2379c58337f" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791760175104, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\KERNELBASE.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247534699, - "hashes": { - "imphash": "e1ee2d71958d21e0e1bf887dfe76af7f", - "md5": "6df46d2bd74e3da1b45f08f10d172732", - "sha1": "3491f8f9a73c00b158e43a530210d67a4f0598ae", - "sha256": "2dc945f6f2c4a82189bc7da2fcbb7d9a0e2588a909539249e55ba82468e0c677" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791763779584, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\ADVAPI32.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247535038, - "hashes": { - "imphash": "8c99b1c0f6cf68b07336751f460f1dba", - "md5": "7319bb10fa1f86e49e3dcf4136f6c957", - "sha1": "3eea5ee8bafb2b9975b236c5c5655df6f4b42aa1", - "sha256": "60de43ab267fd41c9804369b569139add30ed4e295c425f44fc04d3fcc95fca2" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791790780416, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\msvcrt.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247535198, - "hashes": { - "imphash": "b8ba136689cdc8d8b25fc04902f39a22", - "md5": "83404dcbce4925b6a5a77c5170f46d86", - "sha1": "22bda6b9da4fcf492b4dd16554b0c0e27e1b8667", - "sha256": "d669614d0b4461db244ad99fbe1ba92ceb9b4ed5ec8e987e23764e77d9ac7074" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791793074176, - "mapped_size": 0, - "path": "C:\\Windows\\SYSTEM32\\sechost.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258798, - "hashes": { - "imphash": "46876e4adb924a616ddbbb1992d61257", - "md5": "0611473c1ad9e2d991cd9482068417f7", - "sha1": "c4a3fa902dedad5d448e1d8b2d113cae1dcf2f7a", - "sha256": "90afcc2a60350ece27e75e76459132ef0fa28ef283ce88fced4b82735a93ecda" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791762403328, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\RPCRT4.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258001, - "hashes": { - "imphash": "51945fdf9aaf56aeb9d6fa1f21b638ce", - "md5": "1084aa52ccc324ea54c7121fa24c2221", - "sha1": "b13ef924708fa88577931ed0337000e90adcdf5b", - "sha256": "6e972cf624f7c0de8190434b3b30279a01c551713109f97b9ebb77fac9364754" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791792615424, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\GDI32.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258929, - "hashes": { - "imphash": "2cb501375ed127591bf5cfee7f1e52fe", - "md5": "fe70103391a64039a921dbfff9c7ab1b", - "sha1": "e0019d9442aeebd3bb42a24c38aa2fae4c6bd4f5", - "sha256": "f7d219d75037bc98f6c69143b00ab6000a31f8b5e211e0af514f4f4b681522a0" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 2005663744, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\USER32.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247534943, - "hashes": { - "imphash": "919110853c18aa198ad129945337b1dd", - "md5": "d202223587518b13d72d68937b7e3f70", - "sha1": "916a3ce858f074f57dd9dac01be5cd4649f19887", - "sha256": "9db971b866d058adbb518dd99b87c5db8dd1e7c9073755b989ae7e9fb62901e8" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791763714048, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\LPK.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258933, - "hashes": { - "imphash": "17bf46cf6bf6c8cae48be5b75615a353", - "md5": "2f8b1e3ee3545d3b5a8d56fa1ae07b65", - "sha1": "66310680ee38904b2852717af13028e53b4e8b8e", - "sha256": "2a3ec01f3bafe7d7d656886437f7ffecce440c0d3f3467804769ab4bf1ff7a99" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791782522880, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\USP10.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258859, - "hashes": { - "imphash": "4b37cbf60127ea0550ec30e0b1c52984", - "md5": "eaf32cb8c1f810e4715b4dfbe785c7ff", - "sha1": "3b099b193abb9064e6937101d0c309f04d713882", - "sha256": "db6ad07fded42433e669508ab73faff6daff04575d6f1d016fe3eb6ecec4dd5d" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791792091136, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\SHLWAPI.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258854, - "hashes": { - "imphash": "9c631776d86c9b15258c3cc2a6a7891d", - "md5": "26e716ed95dc48cf6e5ac046089366af", - "sha1": "2bd96b8ae5ae3ad14c16d2a98a91a9a9f26d179d", - "sha256": "f686d557b7ac1688efc7cb48311290d713d3db2e9e61e947098a7c80e3a1b9e9" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791765811200, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\SHELL32.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258732, - "hashes": { - "imphash": "faad2d5bf5c0ca9639e07a49e8c5d8ae", - "md5": "6c60b5aca7442efb794082cdacfc001c", - "sha1": "aae17944782b25f41f7b3a756532b4923f4ae817", - "sha256": "fc1d9124856a70ff232ef3057d66bee803295847624ce23b4d0217f23af52c75" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791783374848, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\ole32.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258736, - "hashes": { - "imphash": "774fed8966de60d3af2dd9070df5be6f", - "md5": "42f05f980f164e084db65b2e8cd8430f", - "sha1": "86498b3c5bbc240b9de0a10f2cb4185e754de6d7", - "sha256": "0813749847b08f6577791d18ad9eca6dff5b41c2f727ab5ee9e5bf9602ed50cb" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791785537536, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\OLEAUT32.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258088, - "hashes": { - "imphash": "ec96d3f694248151f968633563d10a36", - "md5": "eed05d42d91835064703e2318552ed25", - "sha1": "aa7e817ccad26070bce1161894f97e10aaa56fb9", - "sha256": "e9ee1e2253445b207b76f5d3073c612ed979a982522c1515e0fe8fa9641ae568" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791634935808, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\EXPLORERFRAME.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247534886, - "hashes": { - "imphash": "c0e1a4a34891e5dd2a6cbaa0895a8d38", - "md5": "8ccde014a4cdf84564e03ace064ca753", - "sha1": "957e29e029fe60b8ff43ff732463c39230b78226", - "sha256": "dd663029b2eb7b12fdb00fce403d8326141e540e3b9ce84cd5871473d3e2e2cf" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791735599104, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\DUser.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247534885, - "hashes": { - "imphash": "9353143c2b77b94cc82ab55c5fecf99c", - "md5": "3cb6a7286422c72c34dab54a5dff1a34", - "sha1": "5b93896a6abb36c2b8957973e3ce1860c1059367", - "sha256": "98d21efff511e407336a226420701e82554da01fa05661303836b6860d63749d" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791721181184, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\DUI70.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247534912, - "hashes": { - "imphash": "d76d7be0b8ac9aafe17d2cc7deb32b29", - "md5": "aa2c08ce85653b1a0d2e4ab407fa176c", - "sha1": "0119c23d88292a0e4fec04d5cf8629005a44e37c", - "sha256": "83dfd0c119b20aedb07114c9d1cf9ce2dfa938d0f1070256b0591a9e2c3997fa" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791793205248, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\IMM32.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247535018, - "hashes": { - "imphash": "b523fff180cb22465ccf191b827e9923", - "md5": "c431eaf5caa1c82cac2534a2eab348a3", - "sha1": "e425577ccfc9b92efbbcb760d21fcaa478d3e51a", - "sha256": "addf850128dc675e67faba9a3d0d27e684f01f733962ca22927bb94503549e44" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791764697088, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\MSCTF.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247535251, - "hashes": { - "imphash": "56e651a119cdb899aadd2df3832bbcd1", - "md5": "d29e998e8277666982b4f0303bf4e7af", - "sha1": "e803b0af61ea2ddcd58b5a63b1cfbb73266318ea", - "sha256": "4f19ab5dc173e278ebe45832f6ceaa40e2df6a2eddc81b2828122442fe5d376c" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791742480384, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\UxTheme.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247535202, - "hashes": { - "imphash": "1c419f7cfacebfcd8e903e6be290407e", - "md5": "716175021bda290504ce434273f666bc", - "sha1": "4f00fbf4e9a88fae9e6682989032831b3d2eba86", - "sha256": "fa18ca2d8a5f4335e051e2933147d3c1e7308f7d446e2aeb6596cdef6e2afc88" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791718690816, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\POWRPROF.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258850, - "hashes": { - "imphash": "a7a25e8b145e75fdeb21026d3895033a", - "md5": "5d8e6c95156ed1f79a63d1eade6f9ed5", - "sha1": "cadd211d74385550c5e055d3312303f4d64fdebc", - "sha256": "12130837d7f89a2c7e9d25747a8e5b9001e0a38d545178b49b450c23ae62664a" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791788814336, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\SETUPAPI.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290257756, - "hashes": { - "imphash": "5cd9d6761799e2ff681533ef1ffbb31d", - "md5": "2477a28081bdaee622cf045acf8ee124", - "sha1": "304c5f29fa847fbd994ad7a0471214198b928c14", - "sha256": "00a09caf9129e84feea98fa03ce9012c9f961b64fee15c4f268822c0f82acc3c" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791760633856, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\CFGMGR32.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247534817, - "hashes": { - "imphash": "2dbdaadf7e151289a49662379e253dfd", - "md5": "06fec9e8117103bb1141a560e98077da", - "sha1": "a8922793a930d602409b62be5ff01d5baec60000", - "sha256": "c5e61b11ddbbbbba3d9488970524f0975ea5fbdf16e2fa31f579f8bfa48353b1" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791760044032, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\DEVOBJ.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247534887, - "hashes": { - "imphash": "e7f2585307f1db90e7e5e48c40dc7134", - "md5": "da1b7075260f3872585bfcdd668c648b", - "sha1": "f2bd334006d728422721b7c639145a6ec59a459b", - "sha256": "3e10ef6e1a5c341b478322cb78a0ab7bfc70ad8023779b8b4542a7cb4ca756ab" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791742873600, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\dwmapi.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247535203, - "hashes": { - "imphash": "6a5a31c99a1562b9e5e10f4b4445be95", - "md5": "be097f5bb10f9079fceb2dc4e7e20f02", - "sha1": "dd572bac50bc4718126389c628d56a83d5c4d88a", - "sha256": "90a88986c8c5f30fb153ec803feda6572b2c2630a6c9578fcc017800692694d5" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791732256768, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\slc.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290257495, - "hashes": { - "imphash": "fd8a6a2046d9572b7f8f4288ae251c61", - "md5": "497bfeddaf3950dd909c3b0c5558a25d", - "sha1": "5d55bdc156372f51eb126f7bc2a8af161a1ef254", - "sha256": "980ea189929d95eb36e35980fff0c81f7b78de9422771fde8f4ac7a779f5bd89" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791732453376, - "mapped_size": 0, - "path": "C:\\Windows\\WinSxS\\amd64_microsoft.windows.gdiplus_6595b64144ccf1df_1.1.7601.17514_none_2b24536c71ed437a\\gdiplus.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258848, - "hashes": { - "imphash": "cc4d63ca30fdbb90048e549782d2116a", - "md5": "858df0795cb5b4bace0f33708925a414", - "sha1": "e629ed78e6e1829263890974760dad8a431edf69", - "sha256": "a9063af8d5c73a722bd269d144d8a65c98db4cfdd9f626e3a8283754e22c8c9c" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791754801152, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\Secur32.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258927, - "hashes": { - "imphash": "b32250da0d30f7782b5b900d4d9c519a", - "md5": "2a86e54b441ad41557f75dc5609b9793", - "sha1": "83ddcf8a1a0ca423bf8417f5e59b5c431bf50c43", - "sha256": "8fede6909413c0fa5b63d58d39affd0f6c3beeaf19b7b2f8674913abfd79a912" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791756701696, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\SSPICLI.DLL", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258762, - "hashes": { - "imphash": "26c2856b9813d8990c01c5a711b5063a", - "md5": "f06bb4e336ea57511fdbafafcc47de62", - "sha1": "bfee1b9d2269d26d99c8e462825ee8399c8bd4ec", - "sha256": "be43ec62548e9ff89a9495a1722e22dbb76eec3764f86e64057b636f27d15765" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791728259072, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\PROPSYS.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247534993, - "hashes": { - "imphash": "f0c6fd6831905d958b05645b680db89f", - "md5": "784fa3df338e2e8f5f0389d6fac428af", - "sha1": "6d32c67c91c6d374854e907c6719db2538540867", - "sha256": "9c8aa0cfdeb9e38aaf8eb08626070e0f0364f4f8a793cfe3532ec6c007980c34" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791757291520, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\CRYPTBASE.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290257499, - "hashes": { - "imphash": "cd11f800bc54ae45ead9d98c96048145", - "md5": "7fa8fdc2c2a27817fd0f624e78d3b50c", - "sha1": "b4aa8e16396b1882eb75c28dfbec9949608afdde", - "sha256": "7b63f6aa2cd6d4d07ea3c595b868b1a0749bb11620027a2bd9b935e3055481e4" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791736123392, - "mapped_size": 0, - "path": "C:\\Windows\\WinSxS\\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.7601.17514_none_fa396087175ac9ac\\comctl32.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258974, - "hashes": { - "imphash": "b03f7d8315f3384d06c11e961e6fee07", - "md5": "26b73a85855681500bcc25c7cd9ff5b1", - "sha1": "393ed9ebbe380c77935df6d0eda2047cdd2224fe", - "sha256": "94d134a6af53ad629a4505b8b0ea37f61bb43af4db71874e7e87853163a9282a" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791724851200, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\WindowsCodecs.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247535135, - "hashes": { - "imphash": "ff720e05e534d67b814b8562265058f5", - "md5": "2c942733a5983dd4502219ff37c7ebc7", - "sha1": "263e8fbf77c0ceead0c9bca56394bffa4a664361", - "sha256": "34b20b6b0d7274e4b5b783f1d2345bc3dd9888964d5c2c65712f041a00cf5b45" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791758143488, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\profapi.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290257558, - "hashes": { - "imphash": "6af6d846a78a6532fcb989d0d8aeb17d", - "md5": "90499f3163a9f815cf196a205ea3cd5d", - "sha1": "f97ff54dc4b132756fcf7041e55d645163f19851", - "sha256": "29b4ed3795cec1177eb367132914ce21c194cdec5db9dc923fd928c85e94d821" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791756898304, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\apphelp.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247534778, - "hashes": { - "imphash": "37afbae3e0f359c3718e379261f7ccfc", - "md5": "25983de69b57142039ac8d95e71cd9c9", - "sha1": "01691e3b0bfa569e64bdb7dc3d637a867ed2dc08", - "sha256": "a677da7ebcbcb6073d27e8a38809f51e971e83ed379bc599aaad6ef4216348da" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791787700224, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\CLBCatQ.DLL", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 04 ca 69 00 00 00 00 00 08 ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247534842, - "hashes": { - "imphash": "cbda3eb1c9c46a2121362e9775f60b47", - "md5": "024352feec9042260bb4cfb4d79a206b", - "sha1": "79c23ce566219f87ade8e55a292aaaabe4a639ec", - "sha256": "60cb39086e10c5b66ebc15e4df219620b344b4358d2918ab6bb3448a0ac8be36" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791731994624, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\EhStorShell.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258701, - "hashes": { - "imphash": "37dad3873d5388f07576532bc042f677", - "md5": "7bbf670114373ce6a203fa155a9e0d0a", - "sha1": "104d89dde030b661d05c4c63a03fae1f46ab52d2", - "sha256": "36ef0a36c679e53b1b169289bd3c05d7c2839dc20c8c87bf520b633911fde198" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791647518720, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\ntshrui.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258920, - "hashes": { - "imphash": "2d37f2d4b3c246f361ca150fc7ebf8d4", - "md5": "3a9c9baf610b0dd4967086040b3b62a9", - "sha1": "3207ac7f895eab34623d994548d7810e54be3e79", - "sha256": "e8e9a0f42b1ee7806edceed08aa024d037215d06ca317e3678bd5364ad513d23" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791753228288, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\srvcli.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258010, - "hashes": { - "imphash": "2ba777561101c3b07566cc50db3a564c", - "md5": "1bf0cb861a48feb1638228760750f3cb", - "sha1": "fbc77224c1b444a6ec25e99f995f2f355e4d1d26", - "sha256": "37c781a8c546ead8b4d28bd7d730b9ac78eb799599ad69dad9054b6f9f1dd6bd" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791649091584, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\cscapi.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:35" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1247534897, - "hashes": { - "imphash": "5bf52e420b6d5991bdcce16ada0828dc", - "md5": "1d63f4366288b8a7595397e27010fd44", - "sha1": "e459e1227083e4eabd19ee20e13754560fc7e02d", - "sha256": "99ea4ddd88d9c4a4cc9b238f533cb4d2c062d46239173997e8594d8a75811a01" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791735533568, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\IconCodecService.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247534998, - "hashes": { - "imphash": "77870f98ca4d25a823c74d7404a64bfd", - "md5": "d0c2fbb6d97416b0166478fc7ae2b212", - "sha1": "e290bdf2312ac30a4e9f2a96d7c84714eee84899", - "sha256": "7eab6c37f0a845e645ca44cc060ac6c56e386c7ef7a64716c6786c9602ad8c9d" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791750606848, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\CRYPTSP.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 04 ca 69 00 00 00 00 00 08 ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 17:43" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1247535161, - "hashes": { - "imphash": "b8c20a01e4d94df61ee21f5350389f9c", - "md5": "5d8874a8c11dddde29e12de0e2013493", - "sha1": "a1c8e3e6ee44dcb68752d44b3b6f4ecce89c388d", - "sha256": "3e9a57137bf622af83e3e4d58971e2c0200559cca7545d16cf263aa03ee9c7d2" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791747461120, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\rsaenh.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258799, - "hashes": { - "imphash": "a198edd0f73abd7cdbb54eef82ab1fc6", - "md5": "c2a8cb1275ecb85d246a9ecc02a728e3", - "sha1": "4417207821fc8f5c72ff531683f183caef297882", - "sha256": "3603fadca0060bd201148f9d59e4e2627f024609a6463ab525b5d1ad17bdcd10" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791758012416, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\RpcRtRemote.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258895, - "hashes": { - "imphash": "4fe9beaa9bd4aa01f5063a7352325c89", - "md5": "d7f1ef374a90709b31591823b002f918", - "sha1": "336ac44b8ee88a6af3f3eaf461b8bdf94fa657ff", - "sha256": "05fd2837c9b03d14bb2a969c1ad77caef047d93dc5d0f6c2acbf0888e8f7b359" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791730683904, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\SndVolSSO.DLL", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 04 ca 69 00 00 00 00 00 08 ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247534873, - "hashes": { - "imphash": "0a90384377303e2a2625725018566a89", - "md5": "896f15a6434d93edb42519d5e18e6b50", - "sha1": "b91a3512a80c4201c3fcfaf62abace894fbba328", - "sha256": "9263f0cec58d45ebe3fb9c3061fb9392c55a7933b84b4592e6ee13cfc86d5a50" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791731929088, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\HID.DLL", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247534952, - "hashes": { - "imphash": "98a24f570dbcd3a092d95b3bd4e51a53", - "md5": "227e2c382a1e02f8d4965e664d3bbe43", - "sha1": "c4971ba9c1e4fdf0106c7cfab626a3d8737bbd07", - "sha256": "1cff20a8bf87ace4fa4935ebeed72bfb1a1fe902a754899e2f50798d67df5642" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791729504256, - "mapped_size": 0, - "path": "C:\\Windows\\System32\\MMDevApi.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258898, - "hashes": { - "imphash": "e99757a4c1beee1b5bf8b7b33b444dcc", - "md5": "1fcb1a72bf5c784f7358e6bef38e4571", - "sha1": "ef944a320de79bf05f0e30f54f3f8b2ba2e82c4a", - "sha256": "12da4240f8c964eda6223257bd9723fd9372e63ae86f00509163b1de12a5f6c5" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791637426176, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\timedate.cpl", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247534704, - "hashes": { - "imphash": "d6de6fde05f96ac848accdb1aef473e4", - "md5": "58775492ffd419248b08325e583c527f", - "sha1": "b0e9ca05d46cb53049c4ca33fe04bd08989a78f9", - "sha256": "dbb013971f5894f25c222c2d4d50a29db6df3c413792ee9ccc1a9e6d85469093" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791732322304, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\ATL.DLL", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 04 ca 69 00 00 00 00 00 08 ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247535266, - "hashes": { - "imphash": "fa1e670045065ff088a4ac664f9ac3d7", - "md5": "9f2bacd5e1776a4bb7cc0ec3c3a4f96d", - "sha1": "ad8c7ec85d532e5725b8535830f27c1abcf139b4", - "sha256": "19959d18601712901f03b83150d15e34ebcab355bb4692c9a28511a72f57fc66" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791730618368, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\WINBRAND.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290257498, - "hashes": { - "imphash": "53f2c3eaeaa6e619e0ccd6e671e96145", - "md5": "e6f0f82788e8bd0f7a616350efa0761c", - "sha1": "9aa4aafda89325853ffa66169e697529164a23a2", - "sha256": "13091dcb3e3f4f52c3ff210e93aaf1dce142cfc09f671aeac5b922393b23e67b" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791633952768, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\actxprxy.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247535165, - "hashes": { - "imphash": "ae5e5f76641aadaf99f0ca29d2e1cadd", - "md5": "1f4492fe41767cdb8b89d17655847cdd", - "sha1": "c836a5e65d56900b6658fdaa3df8579bdd07ec69", - "sha256": "184547fac0c3d7148faa3f601929a7089de393bd19929a137dad743331dd3f77" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791719739392, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\ntmarta.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290259030, - "hashes": { - "imphash": "f792b6ec2e11bc79d8eb1bb1bcb79a91", - "md5": "4e4ffb09d895aa000dd56d1404f69a7e", - "sha1": "40f5c1890f6de5284f6c897255e6907b0272349a", - "sha256": "d999e04bb35780088480eab322176570591a21e311d204bdcab010a63b34d24c" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791794974720, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\WLDAP32.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258853, - "hashes": { - "imphash": "2507624727988c72eb2a628a990000fd", - "md5": "c4f40f6cacd796a8e16671d0e9a2f319", - "sha1": "0881ae2a2fd3c5f03654410c474e5a25317942b2", - "sha256": "44853c645915d910ed0cc6d38f68b6c222528ec5fcbe990e238010f41204e682" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791729897472, - "mapped_size": 0, - "path": "C:\\Windows\\System32\\shdocvw.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 04 ca 69 00 00 00 00 00 08 ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247534923, - "hashes": { - "imphash": "e52a872655c57d1b906101b6d5449bbf", - "md5": "a0a65d306a5490d2eb8e7de66898ecfd", - "sha1": "880ac520eb1d38ebb591707a26e6dd300df40643", - "sha256": "ce5da408f4edd5e81ce0925867f03c9a35172cf1571fe4c4c052e45ab69822bb" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791729831936, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\LINKINFO.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258932, - "hashes": { - "imphash": "0e8a67fa12ce3d22a9e1d18bda5c3260", - "md5": "7a17485dc7d8a7ac81321a42cd034519", - "sha1": "83d1722a35eb16b010d8c9f72c627e97d4642101", - "sha256": "88d8705fa901793fc8c1cfd0175e49a6502bf0fc94a066ba573d2fd13aa5f04a" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791745036288, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\USERENV.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258852, - "hashes": { - "imphash": "8b5c65294bec1cf89e97325a24b8cfc5", - "md5": "4e9c2db10f7e6ae91bf761139d4b745b", - "sha1": "6e8e6a53269ca8acc8c2456c80cd3a56d8deb98d", - "sha256": "8f63f78294f5585d599a114af449dcc447ccb239d0f0b490bfe6b34a2146e730" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791704207360, - "mapped_size": 0, - "path": "C:\\Windows\\System32\\shacct.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247535152, - "hashes": { - "imphash": "44b39e98ae2946f304f4dbadcfffa307", - "md5": "5b3ebfc3da142324b388ddcc4465e1ff", - "sha1": "86e20ebf70fd35723eb635c4f3684891a2547a7b", - "sha256": "5d58642305311f9bc9b779c9598bfc4e7433b3ea58404bf1ff9466838a2328c7" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791716069376, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\SAMLIB.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258793, - "hashes": { - "imphash": "7fec5787890bfedd3b3aa4082f53a08e", - "md5": "fc51229c7d4afa0d6f186133728b95ab", - "sha1": "f7a2f224356e68b612ecce4512c99f5b9c264d7d", - "sha256": "37e58c8e1c8437d1981725a5dcdaca7316cefbb570370cefc8d122f523b96ac0" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791714168832, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\samcli.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258588, - "hashes": { - "imphash": "96f28fef38c977afbf3f6e8f39c0d6b9", - "md5": "6ceca4c6a489c9b2e6073afdaae3f607", - "sha1": "b228f6208642cb99e5bcdf2d3ebda2b8bc4fb020", - "sha256": "127506d1db38275614cbeb047c133718ef9d03266ba9c98be55ec7847cfc9c3d" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791722426368, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\netutils.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 04 ca 69 00 00 00 00 00 08 ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247535084, - "hashes": { - "imphash": "14bd8d9a93b98b2479e1f6cd57b7c790", - "md5": "7cb3acb163de051169095dc6507b8977", - "sha1": "b891ebebb25655157f7c612d5763e995c86009a2", - "sha256": "45d4deb0695440d8b5e959945b3f7a773e02e2ab305e316123a1064fc1905402" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791703945216, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\msls31.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290257535, - "hashes": { - "imphash": "bf738a2fc0ab0601eea36f35e4cbcd27", - "md5": "0bee002c68e28ce6da161dcf1376d7d7", - "sha1": "d5cc3bec12c801e11217acc6927e1e6e401fe208", - "sha256": "1d4ee0b9ce22d139478008d5591b8c9f027c235cba601f95a96547cf98159d4b" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791631134720, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\authui.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258007, - "hashes": { - "imphash": "76801e47683b36a4115dbe046717edbe", - "md5": "b3bfbd758506ecb50c5804aaa76318f9", - "sha1": "bf6c922467347a6690eb19c5e82be09b3295778b", - "sha256": "34e079a6ab2d41d1e0b3887b6ae31c43941061b7176fff2801c3f465c2c89578" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791630020608, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\CRYPTUI.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290257999, - "hashes": { - "imphash": "04534d8dae5ab230b9bee9b1b0b2829d", - "md5": "3f9f2afa135f0663946a006dd5ffd897", - "sha1": "ea6456859b04b68af8dcd453381dd168af53fc5e", - "sha256": "276d1c9c78c529625c2ef3d77079324628686ea184767971901a1de93681c133" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791760896000, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\CRYPT32.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258373, - "hashes": { - "imphash": "2e50bc5d9fe777770c8a6b2cfaf6b2e9", - "md5": "884415bd4269c02eaf8e2613bf85500d", - "sha1": "c3a64f05c210b38c69d8f1fc1d74a71b56ada30c", - "sha256": "efe771709ec942694fd206ac8d0a48ed7dcd35036f074268e4aecd68ac982cea" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791759060992, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\MSASN1.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258922, - "hashes": { - "imphash": "75124ca243f494ff6127697f3ebc418a", - "md5": "5fada8b707318e1bd63a7e2b81e6c8cb", - "sha1": "c5ad1c9bbc2f565237a144b9cf44711dfcf65ea5", - "sha256": "2590e88cab52fcc1b24cb262d293131c6280a5f234e0c130e77aa8697efa3b5f" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791793401856, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\urlmon.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258980, - "hashes": { - "imphash": "248b27a31ddf696c2e3bfe6aed9c3eba", - "md5": "f6c5302e1f4813d552f41a0ac82455e5", - "sha1": "f0ec3ad7e90f559d1bc9b8849cf5668cafba2031", - "sha256": "e3ebf44621efc6381baae0f0efc13c356dcb6ee31bb258137edb3cc3e18549b5" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791786455040, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\WININET.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258097, - "hashes": { - "imphash": "f6db6123d8a383f58cf318d00d2e7d1d", - "md5": "5180380d353277d395d3b36d790aa93e", - "sha1": "d5622ec5d922233867422d1e143969e226bb9a1c", - "sha256": "89b894eccf65704d00d30ea3bd45b184bfab8345b779f9ae2be66b9fc7226f72" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791780032512, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\iertutil.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247535234, - "hashes": { - "imphash": "13ecfa3a285149680a7a4b174c8b8f5b", - "md5": "94e026870a55aaeaff7853c1754091e9", - "sha1": "a4f845318e095d841b05e1400747ee4c28e1f28e", - "sha256": "b2f5d5629d12bdfa98dbed3898368f37d9009c7531b6909c7285a2c11c9a0f93" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791743004672, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\VERSION.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290259004, - "hashes": { - "imphash": "da0bcac0c5f9dc653d00eecd5fb1c801", - "md5": "0d9764d58c5efd672b7184854b152e5e", - "sha1": "99d78db040987c69b6a70a42af86641ba0413956", - "sha256": "9827b43dabbec39ab2e2294408d9c5304ef27a684903c5234c6070387723d49e" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791758209024, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\WINSTA.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247535280, - "hashes": { - "imphash": "af1203c1d6d810c97729856780869b12", - "md5": "ef2ae43bcd46abb13fc3e5b2b1935c73", - "sha1": "c53e005cd04d99331ce3114ac119256133202313", - "sha256": "81fc06f306f620845d7dd8d06e706309e70bc89b589c81f3478302a3f5f73431" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791683301376, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\WINMM.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258936, - "hashes": { - "imphash": "7e9874f9ecf2191b91f9a4dfa37f2ba1", - "md5": "1473768973453de50dc738c2955fc4dd", - "sha1": "7b046f6070844e3bc7deae115a1dfe5825030513", - "sha256": "14bc5da2442cb726acc1f277ddbeccf5d61e3a0a3e083a55a0bb610191e35220" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791648239616, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\wdmaud.drv", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247535081, - "hashes": { - "imphash": "086996ef0b01a463f114deb5244861b9", - "md5": "8560fffc8eb3a806dcd4f82252cfc8c6", - "sha1": "7562bbb63b0db6e4986ebdb86495c4fe284a1eaa", - "sha256": "cc27bc092369a89d6147b16568fedeb68b584d5738cd686c31f7fae22ed17b3b" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 1968373760, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\ksuser.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247534742, - "hashes": { - "imphash": "690cce63d22e22d9aa225c4a9290b2c4", - "md5": "78a1e65207484b7f8d3217507745f47c", - "sha1": "3542a591e9c97b48739f69e2a193dff461ea097c", - "sha256": "35f413adb9d157f3666dd15dd58104d629cd9143198a1ab914b73a4a3c9903dd" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791718625280, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\AVRT.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290257517, - "hashes": { - "imphash": "64661addcde8896487dcc7cd32a4eda9", - "md5": "dc220ae6f64819099f7ebd6f137e32e7", - "sha1": "5707f15b666c7d3b07dfce9dac665a2e45c39113", - "sha256": "b8fe13b859fa83500dd95637fa6d4a5b8392c2a363e41d014d3b5374f636e1de" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791659118592, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\AUDIOSES.DLL", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 04 ca 69 00 00 00 00 00 08 ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247534992, - "hashes": { - "imphash": "3bf8d3fd03f9d07b7821df4b1da2be9d", - "md5": "1b7c3a37362c7b2890168c5fc61c8d9b", - "sha1": "78ba8d596c0ac4c38acb498416957891570a2a1d", - "sha256": "03727930e5bb5f9d91bab901fc9a2e3b795d68e2aee6a2cc3477f356c45a9c54" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791728062464, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\msacm32.drv", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247534991, - "hashes": { - "imphash": "9611d7fd4fe3c571fbf1db3d718ba82c", - "md5": "10ac5ce9f78dc281a1bbd9b8cc587b8a", - "sha1": "207582f9d9bec00a932fba886d575ee5b6502d42", - "sha256": "72288c0a88916d3c3828dbd948dbdb0928f26106319f8e60102d6c9004514d60" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791716659200, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\MSACM32.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 04 ca 69 00 00 00 00 00 08 ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247535038, - "hashes": { - "imphash": "5a8ee2f48e79ef6ac4b33366d6642b50", - "md5": "ca2a0750ed830678997695ff61b04c30", - "sha1": "a27df990dde73e72bb02105f8af689a1ac324e59", - "sha256": "e84860cd97aa3c4565abb2d5d406a5c42b1ad2d8ba1b8cf81fe564d91f15f976" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791727996928, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\midimap.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 04 b3 f5 00 00 00 00 00 0d ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 07:10" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1247535256, - "hashes": { - "imphash": "04a5e982c134477b1914ebcd7b6436d0", - "md5": "d6f630c1fd7f436316093ae500363b19", - "sha1": "197897b74f411040ba7df41a5bd3c1030661b904", - "sha256": "73a94b4938430396ea4240b1a6676b4e6c19cfaf8c52efb9a69b4b2175a86307" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791727734784, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\XmlLite.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258889, - "hashes": { - "imphash": "8181b1ef70ff3d29984db497f92a2662", - "md5": "c3761661c17c2248a9379a8fb89e3de1", - "sha1": "d2ea41e02bbaa77f8b93b09277596a34cdae8853", - "sha256": "ce3477fa2b4058eb80739e0161fe957545f13cf86d313f6422732901d35f75f2" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791617568768, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\stobject.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290257641, - "hashes": { - "imphash": "fbe995ff97475c5aa2777a4bc493d4b1", - "md5": "f832eeea97cdda1af577e721f652a0d1", - "sha1": "48f227a1e10d49edf56e3559e05c871bc285c199", - "sha256": "ebbb7ca199ba4df231123922bd310d43de0104c6185b70fe0281b938d5336f2e" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791616782336, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\BatMeter.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247535260, - "hashes": { - "imphash": "5d8fff13bf206e589cae241fc7f4d464", - "md5": "bd3674be7fc9d8d3732c83e8499576ed", - "sha1": "cb96190d6366e11dd6e6b48f4cdc4332015cfa67", - "sha256": "e6716a5895d629263a4d21959f48840429ab6f4b55a5fa2663ee5e86c9ca2bf1" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791727538176, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\WTSAPI32.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290259008, - "hashes": { - "imphash": "b2ecd39ae0055d9e1b8aa5bc78942cba", - "md5": "eb3f9c2de1236b5d46b2291d82970e43", - "sha1": "0ce9ddc1063256ab571b916389321fd7f572ddc0", - "sha256": "8a43d335f3d573bed98af54bb51e82546c2acc025da8a48d801213eb14e9d5d4" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791759781888, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\WINTRUST.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 04 ca 69 00 00 00 00 00 08 ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247534970, - "hashes": { - "imphash": "8accd78cb7feca81ac448f0485be30dc", - "md5": "4166f82be4d24938977dd1746be9b8a0", - "sha1": "5174036d781677f5444d9a23079baf18f4bbda44", - "sha256": "24121751b7306225ad1c808442d7b030def377e9316aa0a3c5c7460e87317881" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791730159616, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\es.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290257970, - "hashes": { - "imphash": "8c20d7b93902b8c193a7fc1b4b58e9aa", - "md5": "42a9cb6906d9a8bedc83b57163e62924", - "sha1": "50e5592460d91205e912d55f60a2dd3cc4da4329", - "sha256": "e18522d3137653140757829efbfce624a5baa5842e2bba10b9e5ab6c84be49e1" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791614619648, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\dxp.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258826, - "hashes": { - "imphash": "1df61af51096e9bbbdc1834405984e4c", - "md5": "2d2a6ec8ead30ec3ace2fd6fb1b3e122", - "sha1": "1e77948378474e155307d290b998994f720206bf", - "sha256": "e7ea375a3bde8fc764cb09524344370b9ee25f98ad6c83e6f37a569eb8d277d6" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791614160896, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\prnfldr.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290259000, - "hashes": { - "imphash": "2f59265cb3df847423b60921203365be", - "md5": "0015acfbbdd164a8a730009908868ca7", - "sha1": "671c084513461900550bd49d3dccb58bdbe05adf", - "sha256": "e1ff243ad2cf959fab81efe701592414991c03416ff296adc93906e76b707c4d" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791654924288, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\WINSPOOL.DRV", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 04 ca 69 00 00 00 00 00 08 ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247535225, - "hashes": { - "imphash": "3d49b728c9125f451e7f2f215e9d3bbb", - "md5": "2bc7c9fd0a9f2c9afc373f3ad1ee3891", - "sha1": "1b7c6960a72509d1f408022d791c6a65acb2a75d", - "sha256": "0a82a475301202791a7c10f978f952eab7db146a702d4ea67e24e2c98bc19638" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791648108544, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\Syncreg.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258789, - "hashes": { - "imphash": "c5c69e7d20ca382ddbc49947d651a8e7", - "md5": "10f815be90a66aafc6c713d1bd626064", - "sha1": "3e21f173a6bcdf629c442d89abadc48137c61bb2", - "sha256": "01139fc04bc53594296f6a0e16b8d20b940f64bc8119fe7705c03c4947958f39" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791612325888, - "mapped_size": 0, - "path": "C:\\Windows\\System32\\pnidui.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258791, - "hashes": { - "imphash": "6437e4761b1278fdecf142a679216f7b", - "md5": "b9f0a4020aa98b7a20287bf7fe99a1fd", - "sha1": "1f28ac7493ce972b45de191780a190504d1d0c44", - "sha256": "21138f161eeea46198890c7a2d073f2c82829e15676131bdad9f237edc7477cd" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791612194816, - "mapped_size": 0, - "path": "C:\\Windows\\System32\\QUtil.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247535239, - "hashes": { - "imphash": "deeb658dae29d8df1c8dbb08f06801b0", - "md5": "3c073b0c596a0af84933e7406766b040", - "sha1": "06185554c38353211430f5f075c490558e46fb3d", - "sha256": "4698bba678f553e15ad4b07ad7fb236281f872defee97bfd637114476c8f97b3" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791752769536, - "mapped_size": 0, - "path": "C:\\Windows\\System32\\wevtapi.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258586, - "hashes": { - "imphash": "97bb6eee9e1ea3e5751077b655b54de5", - "md5": "a42f2c1eb3b66c54fb3c7b79d30c1a6d", - "sha1": "cee705de8d3dfcc9e2a14e0249d6be61fcd54a18", - "sha256": "a63836db3b01835dc1311526a95198d6ebccb1dc9ddafbc38ec36c128cdb98b9" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791609507840, - "mapped_size": 0, - "path": "C:\\Windows\\System32\\netshell.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258138, - "hashes": { - "imphash": "0bc508389b6b5577cf3cca214ca523a7", - "md5": "2b81776da02017a37fe26c662827470e", - "sha1": "8c85389640bea73a009d83079f8b4c963697035f", - "sha256": "a656353c50ee08422145d00db9cfd9f6d3e664753b3c454b171e2a56a8aa94dc" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791727210496, - "mapped_size": 0, - "path": "C:\\Windows\\System32\\IPHLPAPI.DLL", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247535145, - "hashes": { - "imphash": "579f52f57e43aa6ff0d07e88af5d0ff5", - "md5": "044fe45ffd6ad40e3bbbe60b7f41babe", - "sha1": "94233c0d4169c02c85514adb1f05cd3298c87f43", - "sha256": "a1688a5e6e0f7037c850699462c2655006a7d873c97f9ab406c59d81749b6f09" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791763648512, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\NSI.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247535281, - "hashes": { - "imphash": "e710d6d30f2346e7cd91c89ec3b602d9", - "md5": "4c9210e8f4e052f6a4eb87716da0c24c", - "sha1": "d4fa50aded12eb162478d7606f1270b78dd1a44b", - "sha256": "460f7990bdadb7d58d6dc95b094d30a2efdc4ceed444b18a2f36e8d9076fb8b9" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791726948352, - "mapped_size": 0, - "path": "C:\\Windows\\System32\\WINNSI.DLL", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258583, - "hashes": { - "imphash": "7e01da4b2a8806d2944a3ff2e271958f", - "md5": "2df36f15b2bc1571a6a542a3c2107920", - "sha1": "660a44b660d8e57ef7d7efbbc006ac390a7901fa", - "sha256": "a918f1ee95269df973421af2f5713deeaf15ef0f77baa7e8c515ffb69896fb7a" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791735992320, - "mapped_size": 0, - "path": "C:\\Windows\\System32\\nlaapi.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247534791, - "hashes": { - "imphash": "59b31e42f8fae7b5809ba7fcae732e0c", - "md5": "4cbcc37856ea2039c27a2fb661dda0e5", - "sha1": "cc666108d34168420a1d1942dda1e090154c7296", - "sha256": "74cbfab3092a9564bddfcb84db3e3f8bcfd1492938adf187423d3355d73d21c6" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791723999232, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\dhcpcsvc6.DLL", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258981, - "hashes": { - "imphash": "1ec347d133df2fe4da3e5f8944caeae8", - "md5": "4bbfa57f594f7e8a8edc8f377184c3f0", - "sha1": "d48aafa576b40a5e386e609bba1010472551154a", - "sha256": "9f3ac5dea5a6250c3dbb97af79c81c0a48429486521f807355a1d7d3d861b75f" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791788486656, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\WS2_32.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:35" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290257492, - "hashes": { - "imphash": "f5d0254c5435291634c8b7357aa536bd", - "md5": "92dbf0a4c9239169010fc6e07859c82e", - "sha1": "634d8c12de82c422dfeba8f9a5fa84d03b7bcd35", - "sha256": "00fb2cf4420f0ffef519afe732a708cf249640121e2a891caa164313abd7f804" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791608655872, - "mapped_size": 0, - "path": "C:\\Windows\\System32\\Actioncenter.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247534790, - "hashes": { - "imphash": "f17020f0f66b64fbdf51c75b43f3729d", - "md5": "f568f7c08458d69e4fcd8675bbb107e4", - "sha1": "c1e05f0255a6f386711044b11e2d04dfd328b26a", - "sha256": "a5fa25ecf248999a68ccecfbb508bfa1add18a23e20a9a9081a87c41caaa36c0" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791723868160, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\dhcpcsvc.DLL", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290257996, - "hashes": { - "imphash": "eb1c8dd21e1f92a8be35a76b165ce8da", - "md5": "52d3d5e3586988d4d9e34acaac33105c", - "sha1": "2c20246d2c45fb6e8976b37ad62465f5f4255f2b", - "sha256": "c61b60ba962b25b8334f0941c3535ea4aca1cc060b8a196e396ca3e11ceef8a1" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791746412544, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\credssp.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258110, - "hashes": { - "imphash": "9ba63732839305b29ebe539451171b45", - "md5": "8130391f82d52d36c0441f714136957f", - "sha1": "e2bb102565986a42d0a43bd3f337f94dbe54eead", - "sha256": "1fd4fee7caf63e450f27729e07ea2a2f09288629fd872dbb6e8710b16d8dbd5d" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791608131584, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\imapi2.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258038, - "hashes": { - "imphash": "e070eff3751fea77ccd424469a9a07e6", - "md5": "6a5c1a8ac0b572679361026d0e900420", - "sha1": "fd9241fdda4b9d08ff1e205f9d5f78923ab884d8", - "sha256": "b5e693b48b462e97738a3d4e58b60846159649eb15f4d11074b4bc107cc88562" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791607345152, - "mapped_size": 0, - "path": "C:\\Windows\\System32\\hgcpl.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 04 ca 69 00 00 00 00 00 08 ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247535139, - "hashes": { - "imphash": "1e00eab90042e5099339cb82841b434a", - "md5": "f7073c962c4fb7c415565dde109de49f", - "sha1": "671c2e910ff954700b3a1f80608423697895c0a9", - "sha256": "781e7088dcefbc34a808c3e7da41a56112b3f23abe9f54b5ef4d5cd9cd016b1d" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791680090112, - "mapped_size": 0, - "path": "C:\\Windows\\System32\\npmproxy.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258777, - "hashes": { - "imphash": "d402ebf00a5cffa66b6682780c262457", - "md5": "6b851e682a36453e1b1ee297ffb6e2ab", - "sha1": "3dc85ba13d1f720e8039865817bcc65dc0f1d35b", - "sha256": "a641d3fd9463c4788b45b8b5584ea4489c1f63a71b4b595ae85ff3482cd5eda6" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791606099968, - "mapped_size": 0, - "path": "C:\\Windows\\System32\\QAgent.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247534818, - "hashes": { - "imphash": "09bf801b36364c598a2a8fdff079932c", - "md5": "cd1b5ad07e5f7fef30e055dcc9e96180", - "sha1": "4e835fdadd0c67fde44e385f69a1014d6ad11f4f", - "sha256": "63c58551f32b0b09377f64a6ae1fa81af93b8a707a57a8c18722086906ad3046" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791745167360, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\DEVRTL.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258413, - "hashes": { - "imphash": "08a9b8e4e42e5520be662b4663289747", - "md5": "1eac1a8ca6874bf5b15e2efb9a9a7b86", - "sha1": "30cff16f17833aa042d8b6cc32d86c4a39c77c67", - "sha256": "e15ed4fefc3010c213694331ddfdc03767682325c898d773ab243e2dc8b08461" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791633100800, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\MsftEdit.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258939, - "hashes": { - "imphash": "6ac24d44010fe2db4d5e9e0651b7a3cf", - "md5": "f9959237f106f2b2609e61a290c0652e", - "sha1": "7f7c92c4fe8244a7deac7fed4d5576042bfba29e", - "sha256": "fccc12e5aae1773bf87b1c4bce71d017db1a5a7ac189559058ea1ecc72075a82" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791628709888, - "mapped_size": 0, - "path": "C:\\Windows\\System32\\werconcpl.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247535233, - "hashes": { - "imphash": "cce75846cdf9d74f85e44fc728ee8440", - "md5": "9689a9c7f7c2a1a423cda2c3b43fff65", - "sha1": "ebe6b3066634239a4f62780a8a6e27f33b0afc87", - "sha256": "914ad22d98975578bc14d821f72e8dfce24f2092f9c299d24ebbaf5408fe8b8b" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791646994432, - "mapped_size": 0, - "path": "C:\\Windows\\System32\\wer.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290257998, - "hashes": { - "imphash": "6e52c6bdbfd3d257064382284bd4f59c", - "md5": "1484b9ebf567346582de571b0e164ae0", - "sha1": "6b87eb7005fe659f976732307fe12b96747dfc8d", - "sha256": "9862bf22b2e32dabe7a82acee5b4ea1f0a93bdc3c71b20a6a4e568cccd76a7a6" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791628382208, - "mapped_size": 0, - "path": "C:\\Windows\\System32\\framedynos.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 04 ca 69 00 00 00 00 00 08 ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247535235, - "hashes": { - "imphash": "64b92457c7762d63f903189058d583ca", - "md5": "7e591867422dc788b9e5bd337a669a08", - "sha1": "3bd1b2a2271d6756351d9b4876193efd8a845da0", - "sha256": "484e6bccdf7adce9a1aacad1bc7c7d7694b9e40fa90d94b14d80c607784f6c75" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791628251136, - "mapped_size": 0, - "path": "C:\\Windows\\System32\\wercplsupport.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258497, - "hashes": { - "imphash": "2814c7c81c59e8a913c288a8c72a9c1c", - "md5": "5c29199c9f0ede64f17f268084ec4392", - "sha1": "a767e893427f9b24fe06cbb3a155dd54162a402a", - "sha256": "ea9fd588a8c89399dd287399a912b356a4234cfe418239b227d255749f5ddde2" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791652564992, - "mapped_size": 0, - "path": "C:\\Windows\\System32\\msxml6.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:35" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1247534858, - "hashes": { - "imphash": "2ab209fb6a68c8e15483324a442c1c4c", - "md5": "809ae7d4ace06bbcf621e5c504bf6fc8", - "sha1": "c0e2202d99db67a9efa6c67226410ad3c7b657a6", - "sha256": "0baab89fb57468f27446947d75cbd6ddfc92d9b8f040144a12656803b2f7bf65" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791722491904, - "mapped_size": 0, - "path": "C:\\Windows\\System32\\hcproviders.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 04 b3 f5 00 00 00 00 00 0d ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:36" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258095, - "hashes": { - "imphash": "328b1cd6b239c7c01904019379bede4b", - "md5": "77a8a1791145710c7efe76ea82bf0763", - "sha1": "e421318d7b6d66c9214722c736f5b3d4207acf74", - "sha256": "9488b96e065299d273f9dcc82aa1203b48f0038d4f27324da19e9bfd925ca737" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791627726848, - "mapped_size": 0, - "path": "C:\\Program Files\\Internet Explorer\\ieproxy.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258892, - "hashes": { - "imphash": "ec50511b4e46da8b1a467667a84f8047", - "md5": "9cead32e79a62150fe9f8557e58e008b", - "sha1": "4cbd17b96209b5e2da683382e05cef55f48d6107", - "sha256": "afe4c1725ee94d7de0749ae1495a4e5cc33c369f29b2a589da66ffe27ff9777e" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791757357056, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\SXS.DLL", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258896, - "hashes": { - "imphash": "d75a096a9c47b1fd385a268e9c6f2f68", - "md5": "24f4b480f335a6c724af352253c5d98b", - "sha1": "a388cc90338cec7b5eec66e921599de0cc275a2b", - "sha256": "011413b236cad7b78ce0a0eec3e3085d48c7576a3205d025ba6ebfdf590538e4" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791660232704, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\thumbcache.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247527581, - "hashes": { - "imphash": "be693a67b5b884d7609eaf574ba00955", - "md5": "d87e1e59c73c1f98d5ded5b3850c40f5", - "sha1": "141c0ebecdd2733b90431f18b188ee0b64456268", - "sha256": "536419bff9f877d4314b5d0c045d9a6e729489c389863fadf07e382050bc84fd" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 2009726976, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\PSAPI.DLL", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 04 b3 f5 00 00 00 00 00 0d ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:36" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258093, - "hashes": { - "imphash": "39d5c5468a8e87803234025334b9dc09", - "md5": "f1115299b9f4c983bc4523b33e3a506c", - "sha1": "639946c23b630798284a92117882990ea31d702e", - "sha256": "01a1d8b3e5cf727f92f4a43d5c5f81022127d58a850d29d3f084ad411efbc9dd" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791578836992, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\ieframe.DLL", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247535131, - "hashes": { - "imphash": "84786d42c8a896b9a971b3c9eb8feb4c", - "md5": "9869a4a10b90546dbd56947839fb4b87", - "sha1": "5d9642f314d62dc5834cbd7950230bad3f85d982", - "sha256": "66c84dcf39d9f6896d55b1623184a028891a0a98abe6044de1d4bad60c3c8d72" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791591157760, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\OLEACC.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258887, - "hashes": { - "imphash": "e6c083bfcedd032db2c66cd04f74c620", - "md5": "4e81439902079c348b61d7ff027fe147", - "sha1": "4386a5580b459aa4a0701addb753c3f9bf3da6f7", - "sha256": "e652c9ec77745504689532b3c394959f9b5bc29e9c008cb9ee09cda818514fa9" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791658594304, - "mapped_size": 0, - "path": "C:\\Windows\\System32\\StructuredQuery.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258589, - "hashes": { - "imphash": "45badcf3f18f69f9f72af5245898d1cb", - "md5": "405f4d32d2185f1f1bd753d8eeaffb3a", - "sha1": "68bc45bac1e1584c789a6b3134bee5a2540f3e56", - "sha256": "cac42c3e09c43be96592b670d70821386014db22d8239a9cfb9e33e54fb5c3d5" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791656890368, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\NetworkExplorer.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258495, - "hashes": { - "imphash": "cdb39fb77293fb1bb86c2d5980ea8e88", - "md5": "022b05cee68d7826a93aedb4f1eb369e", - "sha1": "e7055d6cacb8c3fae06dc10ad480c8e6b8b7b592", - "sha256": "3b864d1471ed0949b02f1fa251b987185abeaddcbecd44efdbb6a7b7f03ca8bc" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791625760768, - "mapped_size": 0, - "path": "C:\\Windows\\System32\\msxml3.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258914, - "hashes": { - "imphash": "6b6c83729fa36b04c301494d1eb07752", - "md5": "bb074f35b49eb2ea416962b596281e1e", - "sha1": "355fdb9e66ffad42144b1b6ec4d8eb357ed05d52", - "sha256": "e07208204b9616027e5144e2f3ef1ba81168365b7d2a761210b0fbc65b97871e" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791623598080, - "mapped_size": 0, - "path": "C:\\Windows\\System32\\systemcpl.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258594, - "hashes": { - "imphash": "2bd8f9f72a13c2803ac3d34b805130b9", - "md5": "764908fe1fa96f93c95b1b67a0fced29", - "sha1": "88d0027e5d10158e3678d9eb2326779fef8a64d1", - "sha256": "26ef25ab307903c5e806a8cc3b750a491049e5d1225ceddfce64dd51aa6f592b" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791722557440, - "mapped_size": 0, - "path": "C:\\Windows\\System32\\NETAPI32.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290259010, - "hashes": { - "imphash": "6ad99a405bde55d6a18debafd3f5e5c5", - "md5": "3c91392d448f6e5d525a85b7550d8ba9", - "sha1": "b62eaf7d80617e136a8f3c9161c23464e6f2a171", - "sha256": "6fd0dc73dbe7519e2c643554c2a7f8fbe4f9a678c4241bb54b3c6e65d2abcf3a" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791722295296, - "mapped_size": 0, - "path": "C:\\Windows\\System32\\wkscli.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247534877, - "hashes": { - "imphash": "3e340766bf7f54e3e9746a945d4dcb71", - "md5": "a77be7cb3222b4fb0ac6c71d1c2698d4", - "sha1": "e68b4e0058fb130c765e5aa98af36e26563809db", - "sha256": "73566223914bf670df6b5931fa213e546713531b10391ed65b5256bbd7abde7f" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791735926784, - "mapped_size": 0, - "path": "C:\\Windows\\System32\\DSROLE.DLL", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258758, - "hashes": { - "imphash": "c888173aa662e52d4b6194ed15819a13", - "md5": "db76db15efc6e4d1153a6c5bc895948d", - "sha1": "00dc6172c4507def32e4a269c08e76ab09abc3fe", - "sha256": "71ddf02c7ee2df66a08f1a2a08da39802c354624880a2be93a706ea7476422a3" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791690641408, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\SPPC.DLL", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 04 b3 f5 00 00 00 00 00 0d ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 07:10" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1247535243, - "hashes": { - "imphash": "9484a9d0a0e3ef20592c9f66412400a6", - "md5": "666a60f6f5e719856ff6254e0966eff7", - "sha1": "10258e708443bd21997e7a977b5ee36bd758e368", - "sha256": "58c072e7e215991e19c1ca062c476081982f7b9f039714539ae7feb4981c200f" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791716200448, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\wbem\\wbemprox.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 04 b3 f5 00 00 00 00 00 0d ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 07:10" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258938, - "hashes": { - "imphash": "03a62984ba62616e18740e69949df533", - "md5": "7db5aa22a8a8e5c2d335f44853c1f6de", - "sha1": "add6f6e2b6df5f571d06db724de5c7badad4e775", - "sha256": "a734a20357026c42950394682a52cbc3af956d09f1949e1b4e95467e999bc428" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791690051584, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\wbemcomn.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 04 ca 69 00 00 00 00 00 08 ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247535244, - "hashes": { - "imphash": "6178a249d43f815225b0a9205f1f4f70", - "md5": "718b6f51ab7f6fe2988a36868f9ad3ab", - "sha1": "7cc84a20d6597f58eebabea5489d72239c6e746b", - "sha256": "76141b4e94c2766e2c34cef523092948771a7893212efadbe88d2171b85ff012" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791683170304, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\wbem\\wbemsvc.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 04 b3 f5 00 00 00 00 00 0d ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 07:10" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1247534846, - "hashes": { - "imphash": "c93ca8ec08e734d1b95c2a2d28884c47", - "md5": "a3f5e8ec1316c3e2562b82694a251c9e", - "sha1": "f0cdc2b44e609950ee97d9967c7459055a2af1a8", - "sha256": "f3dc6aa6a9d3b5bbc730668fc52c1d4bb5d515d404578bddd3d4869a7ed58822" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791688675328, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\wbem\\fastprox.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247535150, - "hashes": { - "imphash": "29f9ce11d25836037034b49be93790c6", - "md5": "ee26d130808d16c0e417bbbed0451b34", - "sha1": "962d52fb4d8f9965c5fc11a98f2f9048a2a5d918", - "sha256": "4886dce4faef146a40babd492a8000a2022fea542a6135a9bafd4cd09297b4e5" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791688478720, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\NTDSAPI.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258103, - "hashes": { - "imphash": "ba45ab39c8fb40e4076d27cf8e0f4180", - "md5": "b8509dcfcfd577f568be4026bfd982c0", - "sha1": "1923c5995faf94d9b1767aca04e3134a5cedc07a", - "sha256": "e3608e6de15c400fa437349e7295fef10a1a0213ca3b532a58964b8c89749110" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791788355584, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\imagehlp.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - } - ], - "name": "explorer.exe", - "parent_exe": "", - "parent_name": "", - "pid": 784, - "ppid": 704, - "primary_token": { - "domain": "WIN-Q3DOP1UKA81", - "integrity_level": 12288, - "integrity_level_name": "high", - "privileges": [ - { - "description": "Adjust memory quotas for a process", - "enabled": false, - "name": "SeIncreaseQuotaPrivilege" - }, - { - "description": "Manage auditing and security log", - "enabled": false, - "name": "SeSecurityPrivilege" - }, - { - "description": "Take ownership of files or other objects", - "enabled": false, - "name": "SeTakeOwnershipPrivilege" - }, - { - "description": "Load and unload device drivers", - "enabled": false, - "name": "SeLoadDriverPrivilege" - }, - { - "description": "Profile system performance", - "enabled": false, - "name": "SeSystemProfilePrivilege" - }, - { - "description": "Change the system time", - "enabled": false, - "name": "SeSystemtimePrivilege" - }, - { - "description": "Profile single process", - "enabled": false, - "name": "SeProfileSingleProcessPrivilege" - }, - { - "description": "Increase scheduling priority", - "enabled": false, - "name": "SeIncreaseBasePriorityPrivilege" - }, - { - "description": "Create a pagefile", - "enabled": false, - "name": "SeCreatePagefilePrivilege" - }, - { - "description": "Back up files and directories", - "enabled": false, - "name": "SeBackupPrivilege" - }, - { - "description": "Restore files and directories", - "enabled": false, - "name": "SeRestorePrivilege" - }, - { - "description": "Shut down the system", - "enabled": false, - "name": "SeShutdownPrivilege" - }, - { - "description": "Debug programs", - "enabled": false, - "name": "SeDebugPrivilege" - }, - { - "description": "Modify firmware environment values", - "enabled": false, - "name": "SeSystemEnvironmentPrivilege" - }, - { - "description": "Bypass traverse checking", - "enabled": true, - "name": "SeChangeNotifyPrivilege" - }, - { - "description": "Force shutdown from a remote system", - "enabled": false, - "name": "SeRemoteShutdownPrivilege" - }, - { - "description": "Remove computer from docking station", - "enabled": false, - "name": "SeUndockPrivilege" - }, - { - "description": "Perform volume maintenance tasks", - "enabled": false, - "name": "SeManageVolumePrivilege" - }, - { - "description": "Impersonate a client after authentication", - "enabled": true, - "name": "SeImpersonatePrivilege" - }, - { - "description": "Create global objects", - "enabled": true, - "name": "SeCreateGlobalPrivilege" - }, - { - "description": "Increase a process working set", - "enabled": false, - "name": "SeIncreaseWorkingSetPrivilege" - }, - { - "description": "Change the time zone", - "enabled": false, - "name": "SeTimeZonePrivilege" - }, - { - "description": "Create symbolic links", - "enabled": false, - "name": "SeCreateSymbolicLinkPrivilege" - } - ], - "sid": "S-1-5-21-2016385190-3414718578-1263322444-500", - "type": "tokenPrimary", - "user": "Administrator" - }, - "sha1": "4583daf9442880204730fb2c8a060430640494b1", - "sha256": "6a671b92a69755de6fd063fcbe4ba926d83b49f78c42dbaeed8cdb6bbc57576a", - "sid": "S-1-5-21-2016385190-3414718578-1263322444-500", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted", - "threads": [ - { - "create_time": 1542341500, - "entrypoint": 4279023504, - "thread_id": 1920, - "up_time": 437 - }, - { - "create_time": 1542341500, - "entrypoint": 2008002240, - "thread_id": 1812, - "up_time": 437 - }, - { - "create_time": 1542341500, - "entrypoint": 8791783440744, - "thread_id": 2472, - "up_time": 436 - }, - { - "create_time": 1542341500, - "entrypoint": 8791792141832, - "thread_id": 2468, - "up_time": 436 - }, - { - "create_time": 1542341500, - "entrypoint": 8791790810108, - "thread_id": 2464, - "up_time": 436 - }, - { - "create_time": 1542341500, - "entrypoint": 8791792141832, - "thread_id": 2476, - "up_time": 435 - }, - { - "create_time": 1542341500, - "entrypoint": 2008021952, - "thread_id": 1800, - "up_time": 434 - }, - { - "create_time": 1542341500, - "entrypoint": 2008021952, - "thread_id": 2516, - "up_time": 433 - }, - { - "create_time": 1542341500, - "entrypoint": 8791792141832, - "thread_id": 2500, - "up_time": 433 - }, - { - "create_time": 1542341500, - "entrypoint": 8791792141832, - "thread_id": 1068, - "up_time": 432 - }, - { - "create_time": 1542341500, - "entrypoint": 8791792141832, - "thread_id": 2676, - "up_time": 428 - }, - { - "create_time": 1542341500, - "entrypoint": 8791792141832, - "thread_id": 2660, - "up_time": 428 - }, - { - "create_time": 1542341500, - "entrypoint": 8791792141832, - "thread_id": 2748, - "up_time": 428 - }, - { - "create_time": 1542341500, - "entrypoint": 8791729529348, - "thread_id": 2636, - "up_time": 428 - }, - { - "create_time": 1542341500, - "entrypoint": 8791792141832, - "thread_id": 2732, - "up_time": 424 - }, - { - "create_time": 1542341500, - "entrypoint": 8791783440744, - "thread_id": 1472, - "up_time": 419 - }, - { - "create_time": 1542341500, - "entrypoint": 2008021952, - "thread_id": 2220, - "up_time": 415 - }, - { - "create_time": 1542341800, - "entrypoint": 2008021952, - "thread_id": 2332, - "up_time": 104 - }, - { - "create_time": 1542341800, - "entrypoint": 2008021952, - "thread_id": 3712, - "up_time": 99 - }, - { - "create_time": 1542341800, - "entrypoint": 8791792141832, - "thread_id": 2080, - "up_time": 85 - }, - { - "create_time": 1542341800, - "entrypoint": 2008021952, - "thread_id": 4012, - "up_time": 81 - }, - { - "create_time": 1542341800, - "entrypoint": 2008021952, - "thread_id": 4060, - "up_time": 81 - }, - { - "create_time": 1542341800, - "entrypoint": 2008021952, - "thread_id": 520, - "up_time": 77 - }, - { - "create_time": 1542341800, - "entrypoint": 2008021952, - "thread_id": 3236, - "up_time": 74 - }, - { - "create_time": 1542341800, - "entrypoint": 2008021952, - "thread_id": 3260, - "up_time": 72 - }, - { - "create_time": 1542341900, - "entrypoint": 8791792141832, - "thread_id": 3680, - "up_time": 56 - }, - { - "create_time": 1542341900, - "entrypoint": 2008021952, - "thread_id": 3708, - "up_time": 55 - }, - { - "create_time": 1542341900, - "entrypoint": 2008021952, - "thread_id": 2512, - "up_time": 55 - }, - { - "create_time": 1542341900, - "entrypoint": 8791792141832, - "thread_id": 3748, - "up_time": 54 - }, - { - "create_time": 1542341900, - "entrypoint": 8791690668104, - "thread_id": 3872, - "up_time": 51 - }, - { - "create_time": 1542341900, - "entrypoint": 8791683305488, - "thread_id": 1016, - "up_time": 26 - }, - { - "create_time": 1542341900, - "entrypoint": 2008021952, - "thread_id": 3520, - "up_time": 26 - }, - { - "create_time": 1542341900, - "entrypoint": 8791792141832, - "thread_id": 3992, - "up_time": 13 - }, - { - "create_time": 1542341900, - "entrypoint": 8791760904360, - "thread_id": 3604, - "up_time": 12 - } - ], - "unique_pid": 35, - "unique_ppid": 0, - "up_time": 437, - "user": "Administrator" - } - }, - "captured_file": false, - "file_name": "C:\\Users\\Administrator\\Downloads\\endpointpe-blacklist-test.exe", - "file_operation": "open", - "file_owner": "Administrators", - "file_size": 188416, - "hashes": { - "imphash": "835d619dfdf3cc727cebd91300ab3462", - "md5": "4ace3baaa509d08510405e1b169e325b", - "sha1": "27fb21cf5db95ffca43b234affa99becc4023b9d", - "sha256": "6ed1c836dbf099be7845bdab7671def2c157643761b52251e04e9b6ee109ec75" - }, - "is_signature_trusted": false, - "malware_classification": { - "compressed_malware_features": { - "data_buffer": "eAHtnU1oHHUUwHsQ7MGDiIIUD4sH8WBBxJtopiLoUY0pYo2ZTbJJ0yQ17m4+ms/NRzeVWpuUWCL4sWlEYvFQ8KJQ6NCTEA8eRD30sIo3PdSriLi7837Pko3LbHZ2M5m+XObHm/d/X////83O7jCZvzacHBpPplNdfalkdjSdyty674Ft59dN71Dpb9v5eKh8LMEHjsCF2wIfVlRKsHROYPGkQO5+gY2vBSYYdWZFYGwEO/cITHMqkxPYnBBY+07gtCuQ9gSGigJ5lPPYGXcE+jA4z3Ad1ZtAUiDUyrEEPYzqRnIKgxd/Rgc7gygPo5wn95PouN7OeEYJ1UXiJgRmvscgp/LOziIkkSyT+xRVnXhZ4DKh5goCkzidRHkGO4uvCyw9LDDtCay8ILCAzrJOJaGuZwUuvSewivJVIPsklq8JbL4qMJsTSCcExrGs83WKU295ZFo5lr2TaZbcUw5FeJy8tgTeLpCy2iGeS67ABXzlgbEi1UC5FxcZnA4y/CLK82Qxi847FGGZRTLsCUxR1aWEwOp1AmOjDRYYzgwusL9WfqBiGJxnVAanixTq7Dp22LBdlWMJzlOx8wmBK2Rx5WmBLJIRwtAijOQE+ooCb2B5xBOYRtlfNeXpLpA7oyZRTqHzGenkmIJPnhBIMrzTwSA6H93CO5l+c1NA99f6IwLH8fUKdjTmDpTbgS50+gGVnECnE4PpooC2guPoaPADSHrcncNHmEHtAFkq3+EI+A37zsrrTvH3WTkvJLoOTyBp10wx2JcgVCRahA4NrICE4a+hrMXsA3qAHItW188E8ejO7XV3eh/KCYwxlamEwCgL8lN2wTntfrhY/U0g/5KAdvUpT+AszWqBdqH7VLeeZrExK9Cv1UgIDKA8g/cx7QAEP+AhAfRaMKB2HOJh+BSFSqKjSytNGBlc6PrpxvK7lCVDxbSG3Z7AhCMwx6gelwgLAltXBXJUTH29j+U1LHdipx/QprfKfGnF0sBpdBYxmEQyTzW0h6/0khcuhhJYRufym+i4VKMocJMs/KvfoW3/UJb4PeZOSZVONThZz4djP/75TAXa/CVfOvX3RgVLIDreLPN1pP1osW7lGmHsEhjBOzf+EPBE4vndvWz5xb/cChxGcv1LAb+tluALKnZ47isf1MXvz1ZMlsCXbXtPceqhrcp1ps6YHwQeBXLEPCf7q23tl9uJui0bGBgYRAccv7uXr/g5Af+2oNTrpgTa/vnpjBvpLAwM4gRBPvIZGBgYGBgYGBgYGBgYGBgYGBgYGBgYNAOc9oMXs4GBgYFBcNBnww5QzDXgRtPSaZ5lg/itsRaslgZ3bnWEEVnhMetIBwiiVnlbCbWrEftrt11zdwWnseFW1QO63w1is3ptD1pV9xG0t+zvfUrzrvh380qwXWAVCw6h78GIfG7ZlzltXu6hd+y92fECRFhjuH3bXG8N43oXEHperdzvUbteaDxhVTUeq25fqhG1X6Ai8mtF6BDXz2wR+dzSgg4Qsxls5T11XMG+82y8GkG+b7kL69xg7mF1SFvhBgYGsYH/Xi7HE+PVkiB2jt1bNZxT+k4558jR53ydz5//1m1KOgYGBgYGBgYGEQfnsYaG2z1sdPJS79XQSu91ndobOAHCaN5vNzUk1bceQVzUpbw3iOuT+UFmR18bHrp3gyhDC56lCd1y85w2+HSNUwVhhdGC7blLf+bV/fqtvhMg1NDjCcugB1QXswbs8ekj/v1BgzFHBIIsyP+HfwFdMpzu", - "decompressed_size": 27831, - "encoding": "zlib" - }, - "identifier": "endpointpe", - "prevention_threshold": 0.66, - "score": 1, - "threshold": 0.66, - "version": "3.0.33" - }, - "pid": 784, - "ppid": 704, - "signature_signer": "", - "temp_file_path": "C:\\Windows\\TEMP\\581ac9e2-e9ea-499e-8ec6-d7eed985b6c3", - "timestamp": { - "accessed": 1542341100, - "created": 1542341100, - "modified": 1542341100 - }, - "user_blacklisted": false - }, - "event_subtype_full": "file_classification_event", - "event_type_full": "alert_event", - "metadata": { - "beta_alert": false, - "chunk_id": 0, - "collection_time": 1542341900, - "correlation_id": "9a754fa1-f526-4390-9adf-640cae174f66", - "destination_plugin": "send", - "final": true, - "is_alert": true, - "key": "fileClassificationEventResponse", - "message_id": "7b97295f-3aae-4dc8-944f-039f1064c55b", - "origination_task_id": "010d9a4e-dd34-4dfa-b283-a492a5785e90", - "os_type": "windows", - "priority": 80, - "result": { - "local_code": 0, - "local_msg": "Success" - }, - "semantic_version": "3.50.0", - "sensor_version": "3.50.0", - "task_id": "010d9a4e-dd34-4dfa-b283-a492a5785e90", - "type": "prevention" - }, - "opcode": 8, - "serial_event_id": 141336, - "timestamp": 132140205750594450, - "timestamp_utc": "2019-09-27 01:16:15Z" - }, - "event": { - "action": "file_classification_event", - "dataset": "esensor", - "kind": "alert", - "module": "endgame" - }, - "host": { - "hostname": "HD-c15-bc09190a", - "ip": "10.179.244.14", - "name": "HD-c15-bc09190a", - "os": { - "name": "Windows", - "platform": "windows", - "version": "6.1" - } - }, - "labels": { - "account_id": "8c48070b-4b61-4ded-86d5-1b9a7a78229c", - "endpoint_id": "ced9c68e-b94a-4d66-bb4c-6106514f0a2f" - }, - "user": { - "group": { - } - } - }, - "type": "_doc" - } - }, - { - "type": "doc", - "value": { - "id": "9ONEc20BW148Je-ro712", - "index": "test_alert_data", - "source": { - "@timestamp": 1542346435000, - "agent": { - "id": "c89dc040-2350-4d59-baea-9ff2e369136f", - "type": "endgame", - "version": "3.0.0" - }, - "ecs": { - "version": "1.1.0" - }, - "endgame": { - "data": { - "alert_details": { - "acting_process": { - "authenticode": { - "cert_signer": { - "issuer_name": "VeriSign Class 3 Code Signing 2010 CA", - "serial_number": "12 fb c3 65 d3 1e 18 e4 43 7e ed f7 77 5e 0c fb ", - "subject_name": "Cybereason Inc" - }, - "cert_timestamp": { - "issuer_name": "", - "serial_number": "", - "subject_name": "", - "timestamp_string": "" - }, - "more_info_link": "", - "program_name": "", - "publisher_link": "" - }, - "cmdline": "\"C:\\Program Files\\Cybereason ActiveProbe\\AmSvc.exe\"", - "create_time": 1542345900, - "domain": "NT AUTHORITY", - "exe": "C:\\Program Files\\Cybereason ActiveProbe\\AmSvc.exe", - "hashes": { - "md5": "1f2d082566b0fc5f2c238a5180db7451", - "sha1": "ca85243c0af6a6471bdaa560685c51eefd6dbc0d", - "sha256": "8ad40c90a611d36eb8f9eb24fa04f7dbca713db383ff55a03aa0f382e92061a2" - }, - "imphash": "c30d230b81c734e82e86e2e2fe01cd01", - "is_sensor": false, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "md5": "1f2d082566b0fc5f2c238a5180db7451", - "modules": [ - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "VeriSign Class 3 Code Signing 2010 CA", - "serial_number": "12 fb c3 65 d3 1e 18 e4 43 7e ed f7 77 5e 0c fb ", - "subject_name": "Cybereason Inc" - }, - "cert_timestamp": { - "issuer_name": "", - "serial_number": "", - "subject_name": "", - "timestamp_string": "" - }, - "more_info_link": "", - "program_name": "", - "publisher_link": "" - }, - "compile_time": 1534424710, - "hashes": { - "imphash": "c30d230b81c734e82e86e2e2fe01cd01", - "md5": "1f2d082566b0fc5f2c238a5180db7451", - "sha1": "ca85243c0af6a6471bdaa560685c51eefd6dbc0d", - "sha256": "8ad40c90a611d36eb8f9eb24fa04f7dbca713db383ff55a03aa0f382e92061a2" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 5354225664, - "mapped_size": 0, - "path": "C:\\Program Files\\Cybereason ActiveProbe\\AmSvc.exe", - "signature_signer": "Cybereason Inc", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 04 b3 f5 00 00 00 00 00 0d ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 05:28" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258681, - "hashes": { - "imphash": "d41d8cd98f00b204e9800998ecf8427e", - "md5": "3556d5a8bf2cc508bdab51dec38d7c61", - "sha1": "92015f7bbdb9dad35e41c533d2c5b85f1cd63d85", - "sha256": "91e3d98ad3119e8addf8d2aa1dd6795162842fff7101e4c70c5137e847b4ff50" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 2001141760, - "mapped_size": 0, - "path": "C:\\Windows\\SYSTEM32\\ntdll.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258315, - "hashes": { - "imphash": "9165b02c931d76a9b666d8d42128111b", - "md5": "7a6326d96d53048fdec542df23d875a0", - "sha1": "5c02af0206c299f5bcab8da4237cfc92e3e93495", - "sha256": "182351570856cd6eedd9df7e2fb8ab76bd4d8fc70be11ad5de6484cfd70c21c6" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 1999962112, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\kernel32.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258316, - "hashes": { - "imphash": "3f7fb1504bb73a54888bf1c3650fe4cf", - "md5": "da68c291b4ef2dec9c5963266bcae454", - "sha1": "5696e8c68fcf64104499e20e7cd5452b58b4f4ba", - "sha256": "21aa4779fc21e762178517268c95467238c92851ad9160bffc36b2379c58337f" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791752769536, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\KERNELBASE.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258929, - "hashes": { - "imphash": "2cb501375ed127591bf5cfee7f1e52fe", - "md5": "fe70103391a64039a921dbfff9c7ab1b", - "sha1": "e0019d9442aeebd3bb42a24c38aa2fae4c6bd4f5", - "sha256": "f7d219d75037bc98f6c69143b00ab6000a31f8b5e211e0af514f4f4b681522a0" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 1998913536, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\USER32.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258001, - "hashes": { - "imphash": "51945fdf9aaf56aeb9d6fa1f21b638ce", - "md5": "1084aa52ccc324ea54c7121fa24c2221", - "sha1": "b13ef924708fa88577931ed0337000e90adcdf5b", - "sha256": "6e972cf624f7c0de8190434b3b30279a01c551713109f97b9ebb77fac9364754" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791766269952, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\GDI32.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247534943, - "hashes": { - "imphash": "919110853c18aa198ad129945337b1dd", - "md5": "d202223587518b13d72d68937b7e3f70", - "sha1": "916a3ce858f074f57dd9dac01be5cd4649f19887", - "sha256": "9db971b866d058adbb518dd99b87c5db8dd1e7c9073755b989ae7e9fb62901e8" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791758929920, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\LPK.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258933, - "hashes": { - "imphash": "17bf46cf6bf6c8cae48be5b75615a353", - "md5": "2f8b1e3ee3545d3b5a8d56fa1ae07b65", - "sha1": "66310680ee38904b2852717af13028e53b4e8b8e", - "sha256": "2a3ec01f3bafe7d7d656886437f7ffecce440c0d3f3467804769ab4bf1ff7a99" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791760175104, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\USP10.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247535038, - "hashes": { - "imphash": "8c99b1c0f6cf68b07336751f460f1dba", - "md5": "7319bb10fa1f86e49e3dcf4136f6c957", - "sha1": "3eea5ee8bafb2b9975b236c5c5655df6f4b42aa1", - "sha256": "60de43ab267fd41c9804369b569139add30ed4e295c425f44fc04d3fcc95fca2" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791765286912, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\msvcrt.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247534699, - "hashes": { - "imphash": "e1ee2d71958d21e0e1bf887dfe76af7f", - "md5": "6df46d2bd74e3da1b45f08f10d172732", - "sha1": "3491f8f9a73c00b158e43a530210d67a4f0598ae", - "sha256": "2dc945f6f2c4a82189bc7da2fcbb7d9a0e2588a909539249e55ba82468e0c677" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791761027072, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\ADVAPI32.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247535198, - "hashes": { - "imphash": "b8ba136689cdc8d8b25fc04902f39a22", - "md5": "83404dcbce4925b6a5a77c5170f46d86", - "sha1": "22bda6b9da4fcf492b4dd16554b0c0e27e1b8667", - "sha256": "d669614d0b4461db244ad99fbe1ba92ceb9b4ed5ec8e987e23764e77d9ac7074" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791789010944, - "mapped_size": 0, - "path": "C:\\Windows\\SYSTEM32\\sechost.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258798, - "hashes": { - "imphash": "46876e4adb924a616ddbbb1992d61257", - "md5": "0611473c1ad9e2d991cd9482068417f7", - "sha1": "c4a3fa902dedad5d448e1d8b2d113cae1dcf2f7a", - "sha256": "90afcc2a60350ece27e75e76459132ef0fa28ef283ce88fced4b82735a93ecda" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791770726400, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\RPCRT4.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "VeriSign Class 3 Code Signing 2010 CA", - "serial_number": "12 fb c3 65 d3 1e 18 e4 43 7e ed f7 77 5e 0c fb ", - "subject_name": "Cybereason Inc" - }, - "cert_timestamp": { - "issuer_name": "", - "serial_number": "", - "subject_name": "", - "timestamp_string": "" - }, - "more_info_link": "", - "program_name": "", - "publisher_link": "" - }, - "compile_time": 1534424472, - "hashes": { - "imphash": "a24cfb84e3006f3634d5b09aed45c264", - "md5": "56e6aa240cf6503265fbe5cf4d5889e8", - "sha1": "2678a3c08b2f82598527bd0c064eb1be5877e277", - "sha256": "4e7e127e2818eeb2de34a9369dcaca233443f085e53706c969592a9907df2ae8" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791706042368, - "mapped_size": 0, - "path": "C:\\Program Files\\Cybereason ActiveProbe\\AP.dll", - "signature_signer": "Cybereason Inc", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "VeriSign Class 3 Code Signing 2010 CA", - "serial_number": "12 fb c3 65 d3 1e 18 e4 43 7e ed f7 77 5e 0c fb ", - "subject_name": "Cybereason Inc" - }, - "cert_timestamp": { - "issuer_name": "", - "serial_number": "", - "subject_name": "", - "timestamp_string": "" - }, - "more_info_link": "", - "program_name": "", - "publisher_link": "" - }, - "compile_time": 1534424450, - "hashes": { - "imphash": "f12460104bb4725d7964cf569f727f61", - "md5": "58017789505c114426b63c775debc12b", - "sha1": "0a348ca38bbcf851083578b77a8263765bd9b5e7", - "sha256": "1bd7d7b7b69e15adb6fcf0b520a7107eb5270163935e1f50fcee85ed65440b46" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791701979136, - "mapped_size": 0, - "path": "C:\\Program Files\\Cybereason ActiveProbe\\Protobuf.dll", - "signature_signer": "Cybereason Inc", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "VeriSign Class 3 Code Signing 2010 CA", - "serial_number": "12 fb c3 65 d3 1e 18 e4 43 7e ed f7 77 5e 0c fb ", - "subject_name": "Cybereason Inc" - }, - "cert_timestamp": { - "issuer_name": "", - "serial_number": "", - "subject_name": "", - "timestamp_string": "" - }, - "more_info_link": "", - "program_name": "", - "publisher_link": "" - }, - "compile_time": 1438071093, - "hashes": { - "imphash": "341d1190606326748a708433d5d0cc36", - "md5": "0a2be3ed5a71082e5f9296f79323a639", - "sha1": "6acb15e8191b5530297c807d3066b1a71f4326d4", - "sha256": "8847013e01db09adab6a1dc338803df3696730577a0dda847847540529048aae" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791700799488, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\libprotobuf.dll", - "signature_signer": "Cybereason Inc", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Code Signing PCA", - "serial_number": "33 00 00 00 b0 11 af 0a 8b d0 3b 9f dd 00 01 00 00 00 b0 ", - "subject_name": "Microsoft Corporation" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "33 00 00 00 2b 39 32 48 c1 b2 c9 48 f3 00 00 00 00 00 2b ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "10/04/2013 22:49" - }, - "more_info_link": "http://microsoft.com", - "program_name": "msvcp120.dll", - "publisher_link": "" - }, - "compile_time": 1380942867, - "hashes": { - "imphash": "d0a59246eab41d54812cd63c2326e1f1", - "md5": "46060c35f697281bc5e7337aee3722b1", - "sha1": "d0164c041707f297a73abb9ea854111953e99cf1", - "sha256": "2abf0aab5a3c5ae9424b64e9d19d9d6d4aebc67814d7e92e4927b9798fef2848" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791700078592, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\MSVCP120.dll", - "signature_signer": "Microsoft Corporation", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Code Signing PCA", - "serial_number": "33 00 00 00 b0 11 af 0a 8b d0 3b 9f dd 00 01 00 00 00 b0 ", - "subject_name": "Microsoft Corporation" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "33 00 00 00 2b 39 32 48 c1 b2 c9 48 f3 00 00 00 00 00 2b ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "10/04/2013 22:49" - }, - "more_info_link": "http://microsoft.com", - "program_name": "msvcr120.dll", - "publisher_link": "" - }, - "compile_time": 1380942847, - "hashes": { - "imphash": "8f18e22935ef8b336e246ee763fbec97", - "md5": "9c861c079dd81762b6c54e37597b7712", - "sha1": "62cb65a1d79e2c5ada0c7bfc04c18693567c90d0", - "sha256": "ad32240bb1de55c3f5fcac8789f583a17057f9d14914c538c2a7a5ad346b341c" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791699095552, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\MSVCR120.dll", - "signature_signer": "Microsoft Corporation", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258732, - "hashes": { - "imphash": "faad2d5bf5c0ca9639e07a49e8c5d8ae", - "md5": "6c60b5aca7442efb794082cdacfc001c", - "sha1": "aae17944782b25f41f7b3a756532b4923f4ae817", - "sha256": "fc1d9124856a70ff232ef3057d66bee803295847624ce23b4d0217f23af52c75" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791767121920, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\ole32.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258736, - "hashes": { - "imphash": "774fed8966de60d3af2dd9070df5be6f", - "md5": "42f05f980f164e084db65b2e8cd8430f", - "sha1": "86498b3c5bbc240b9de0a10f2cb4185e754de6d7", - "sha256": "0813749847b08f6577791d18ad9eca6dff5b41c2f727ab5ee9e5bf9602ed50cb" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791769808896, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\OLEAUT32.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258981, - "hashes": { - "imphash": "1ec347d133df2fe4da3e5f8944caeae8", - "md5": "4bbfa57f594f7e8a8edc8f377184c3f0", - "sha1": "d48aafa576b40a5e386e609bba1010472551154a", - "sha256": "9f3ac5dea5a6250c3dbb97af79c81c0a48429486521f807355a1d7d3d861b75f" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791771971584, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\WS2_32.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247535145, - "hashes": { - "imphash": "579f52f57e43aa6ff0d07e88af5d0ff5", - "md5": "044fe45ffd6ad40e3bbbe60b7f41babe", - "sha1": "94233c0d4169c02c85514adb1f05cd3298c87f43", - "sha256": "a1688a5e6e0f7037c850699462c2655006a7d873c97f9ab406c59d81749b6f09" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791756898304, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\NSI.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258859, - "hashes": { - "imphash": "4b37cbf60127ea0550ec30e0b1c52984", - "md5": "eaf32cb8c1f810e4715b4dfbe785c7ff", - "sha1": "3b099b193abb9064e6937101d0c309f04d713882", - "sha256": "db6ad07fded42433e669508ab73faff6daff04575d6f1d016fe3eb6ecec4dd5d" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791759650816, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\SHLWAPI.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290257495, - "hashes": { - "imphash": "fd8a6a2046d9572b7f8f4288ae251c61", - "md5": "497bfeddaf3950dd909c3b0c5558a25d", - "sha1": "5d55bdc156372f51eb126f7bc2a8af161a1ef254", - "sha256": "980ea189929d95eb36e35980fff0c81f7b78de9422771fde8f4ac7a779f5bd89" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791725768704, - "mapped_size": 0, - "path": "C:\\Windows\\WinSxS\\amd64_microsoft.windows.gdiplus_6595b64144ccf1df_1.1.7601.17514_none_2b24536c71ed437a\\gdiplus.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258138, - "hashes": { - "imphash": "0bc508389b6b5577cf3cca214ca523a7", - "md5": "2b81776da02017a37fe26c662827470e", - "sha1": "8c85389640bea73a009d83079f8b4c963697035f", - "sha256": "a656353c50ee08422145d00db9cfd9f6d3e664753b3c454b171e2a56a8aa94dc" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791720460288, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\IPHLPAPI.DLL", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247535281, - "hashes": { - "imphash": "e710d6d30f2346e7cd91c89ec3b602d9", - "md5": "4c9210e8f4e052f6a4eb87716da0c24c", - "sha1": "d4fa50aded12eb162478d7606f1270b78dd1a44b", - "sha256": "460f7990bdadb7d58d6dc95b094d30a2efdc4ceed444b18a2f36e8d9076fb8b9" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791720198144, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\WINNSI.DLL", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247527581, - "hashes": { - "imphash": "be693a67b5b884d7609eaf574ba00955", - "md5": "d87e1e59c73c1f98d5ded5b3850c40f5", - "sha1": "141c0ebecdd2733b90431f18b188ee0b64456268", - "sha256": "536419bff9f877d4314b5d0c045d9a6e729489c389863fadf07e382050bc84fd" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 2003042304, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\PSAPI.DLL", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "VeriSign Class 3 Code Signing 2010 CA", - "serial_number": "12 fb c3 65 d3 1e 18 e4 43 7e ed f7 77 5e 0c fb ", - "subject_name": "Cybereason Inc" - }, - "cert_timestamp": { - "issuer_name": "", - "serial_number": "", - "subject_name": "", - "timestamp_string": "" - }, - "more_info_link": "", - "program_name": "", - "publisher_link": "" - }, - "compile_time": 1472978395, - "hashes": { - "imphash": "3a8c832bddbba9333df28c1da212318e", - "md5": "e1c637922e34d868ebcd6ef199cf1394", - "sha1": "01c19a0137082a03ecace613506af5fe9a66a12b", - "sha256": "0c0c7b4c9926413c285fa2345f08b895888887156277e535851a1f1d774e6c6c" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791698243584, - "mapped_size": 0, - "path": "C:\\Program Files\\Cybereason ActiveProbe\\SQLite2015.dll", - "signature_signer": "Cybereason Inc", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247534912, - "hashes": { - "imphash": "d76d7be0b8ac9aafe17d2cc7deb32b29", - "md5": "aa2c08ce85653b1a0d2e4ab407fa176c", - "sha1": "0119c23d88292a0e4fec04d5cf8629005a44e37c", - "sha256": "83dfd0c119b20aedb07114c9d1cf9ce2dfa938d0f1070256b0591a9e2c3997fa" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791766073344, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\IMM32.DLL", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247535018, - "hashes": { - "imphash": "b523fff180cb22465ccf191b827e9923", - "md5": "c431eaf5caa1c82cac2534a2eab348a3", - "sha1": "e425577ccfc9b92efbbcb760d21fcaa478d3e51a", - "sha256": "addf850128dc675e67faba9a3d0d27e684f01f733962ca22927bb94503549e44" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791761944576, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\MSCTF.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 04 ca 69 00 00 00 00 00 08 ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247534874, - "hashes": { - "imphash": "621a31b25a9ef1d128ea281b3eab572b", - "md5": "0040c486584a8e582c861cfb57ab5387", - "sha1": "bcf326e3f79b3db028c2ef1cc1a47d9697e867e7", - "sha256": "5ee17b55cb702d14ae75b19226de21cd2498bda6c6ef5872fdb8a718f401fed1" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791719346176, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\fwpuclnt.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258848, - "hashes": { - "imphash": "cc4d63ca30fdbb90048e549782d2116a", - "md5": "858df0795cb5b4bace0f33708925a414", - "sha1": "e629ed78e6e1829263890974760dad8a431edf69", - "sha256": "a9063af8d5c73a722bd269d144d8a65c98db4cfdd9f626e3a8283754e22c8c9c" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791748050944, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\Secur32.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258854, - "hashes": { - "imphash": "9c631776d86c9b15258c3cc2a6a7891d", - "md5": "26e716ed95dc48cf6e5ac046089366af", - "sha1": "2bd96b8ae5ae3ad14c16d2a98a91a9a9f26d179d", - "sha256": "f686d557b7ac1688efc7cb48311290d713d3db2e9e61e947098a7c80e3a1b9e9" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791772299264, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\shell32.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "VeriSign Class 3 Code Signing 2010 CA", - "serial_number": "3d b2 9a 36 51 f3 f5 e4 9c e0 79 d2 83 95 76 30 ", - "subject_name": "Bitdefender SRL" - }, - "cert_timestamp": { - "issuer_name": "Symantec Time Stamping Services CA - G2", - "serial_number": "0e cf f4 38 c8 fe bf 35 6e 04 d8 6a 98 1b 1a 50 ", - "subject_name": "Symantec Time Stamping Services Signer - G4", - "timestamp_string": "11/29/2016 03:22" - }, - "more_info_link": "", - "program_name": "", - "publisher_link": "" - }, - "compile_time": 1480418473, - "hashes": { - "imphash": "f89e0a919d52e2b37d82d27f521530cf", - "md5": "f1a6e89598aa63a2efcfd1e31b44fe7c", - "sha1": "cd3a39758e72f42ef077c0ad9dd700509a032da6", - "sha256": "1ee6540520a7a84bc22036be42052303b5aed9911c9e8a04184a0688c63576f8" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791694901248, - "mapped_size": 0, - "path": "C:\\Program Files\\Cybereason ActiveProbe\\BDUpdateServiceCom.dll", - "signature_signer": "Bitdefender SRL", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258594, - "hashes": { - "imphash": "2bd8f9f72a13c2803ac3d34b805130b9", - "md5": "764908fe1fa96f93c95b1b67a0fced29", - "sha1": "88d0027e5d10158e3678d9eb2326779fef8a64d1", - "sha256": "26ef25ab307903c5e806a8cc3b750a491049e5d1225ceddfce64dd51aa6f592b" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791715807232, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\NETAPI32.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258588, - "hashes": { - "imphash": "96f28fef38c977afbf3f6e8f39c0d6b9", - "md5": "6ceca4c6a489c9b2e6073afdaae3f607", - "sha1": "b228f6208642cb99e5bcdf2d3ebda2b8bc4fb020", - "sha256": "127506d1db38275614cbeb047c133718ef9d03266ba9c98be55ec7847cfc9c3d" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791715676160, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\netutils.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258920, - "hashes": { - "imphash": "2d37f2d4b3c246f361ca150fc7ebf8d4", - "md5": "3a9c9baf610b0dd4967086040b3b62a9", - "sha1": "3207ac7f895eab34623d994548d7810e54be3e79", - "sha256": "e8e9a0f42b1ee7806edceed08aa024d037215d06ca317e3678bd5364ad513d23" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791746609152, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\srvcli.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290259010, - "hashes": { - "imphash": "6ad99a405bde55d6a18debafd3f5e5c5", - "md5": "3c91392d448f6e5d525a85b7550d8ba9", - "sha1": "b62eaf7d80617e136a8f3c9161c23464e6f2a171", - "sha256": "6fd0dc73dbe7519e2c643554c2a7f8fbe4f9a678c4241bb54b3c6e65d2abcf3a" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791715545088, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\wkscli.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247535234, - "hashes": { - "imphash": "13ecfa3a285149680a7a4b174c8b8f5b", - "md5": "94e026870a55aaeaff7853c1754091e9", - "sha1": "a4f845318e095d841b05e1400747ee4c28e1f28e", - "sha256": "b2f5d5629d12bdfa98dbed3898368f37d9009c7531b6909c7285a2c11c9a0f93" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791736254464, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\VERSION.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "VeriSign Class 3 Code Signing 2010 CA", - "serial_number": "3d b2 9a 36 51 f3 f5 e4 9c e0 79 d2 83 95 76 30 ", - "subject_name": "Bitdefender SRL" - }, - "cert_timestamp": { - "issuer_name": "Symantec Time Stamping Services CA - G2", - "serial_number": "0e cf f4 38 c8 fe bf 35 6e 04 d8 6a 98 1b 1a 50 ", - "subject_name": "Symantec Time Stamping Services Signer - G4", - "timestamp_string": "01/18/2017 09:26" - }, - "more_info_link": "", - "program_name": "", - "publisher_link": "" - }, - "compile_time": 1484760175, - "hashes": { - "imphash": "b33f679b12d9d05d922e720c0e21818c", - "md5": "1e5ea729f6dc5a8aff675a45706d389d", - "sha1": "f5a70ab4772325946a93c9eaf48ebe1dd1e7d3a3", - "sha256": "35da922b25ec8389a733f46a6c0d37c2c6b05463a123cde9fee48402c473e1ef" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791694245888, - "mapped_size": 0, - "path": "C:\\Program Files\\Cybereason ActiveProbe\\scan.dll", - "signature_signer": "Bitdefender SRL", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "VeriSign Class 3 Code Signing 2010 CA", - "serial_number": "3d b2 9a 36 51 f3 f5 e4 9c e0 79 d2 83 95 76 30 ", - "subject_name": "Bitdefender SRL" - }, - "cert_timestamp": { - "issuer_name": "Symantec Time Stamping Services CA - G2", - "serial_number": "0e cf f4 38 c8 fe bf 35 6e 04 d8 6a 98 1b 1a 50 ", - "subject_name": "Symantec Time Stamping Services Signer - G4", - "timestamp_string": "11/22/2016 08:08" - }, - "more_info_link": "", - "program_name": "", - "publisher_link": "" - }, - "compile_time": 1479830743, - "hashes": { - "imphash": "513a166377e008d25aa2e22983dd13ff", - "md5": "3450d998edec5cdbd03b0df09c17e02d", - "sha1": "558979fb1a9368acdf2dc1e3d1afd94e7343f914", - "sha256": "c1f24493e4fc2a9c5d17e077455c3a610ad1e5fa46590f0f9598e680e5a07556" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791694114816, - "mapped_size": 0, - "path": "C:\\Program Files\\Cybereason ActiveProbe\\gzfltum.dll", - "signature_signer": "Bitdefender SRL", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "VeriSign Class 3 Code Signing 2010 CA", - "serial_number": "3d b2 9a 36 51 f3 f5 e4 9c e0 79 d2 83 95 76 30 ", - "subject_name": "Bitdefender SRL" - }, - "cert_timestamp": { - "issuer_name": "Symantec Time Stamping Services CA - G2", - "serial_number": "0e cf f4 38 c8 fe bf 35 6e 04 d8 6a 98 1b 1a 50 ", - "subject_name": "Symantec Time Stamping Services Signer - G4", - "timestamp_string": "01/16/2017 05:34" - }, - "more_info_link": "", - "program_name": "", - "publisher_link": "" - }, - "compile_time": 1484573247, - "hashes": { - "imphash": "d6d5dc292fe4d710905e9f280360309d", - "md5": "9f1bcf84eaa34afbdfcf19f22fc1d6f5", - "sha1": "e15e023d46738f4848f64ce853ada6a3083f8b7f", - "sha256": "d1c30b1a7fc63c4f52b00628c3e73f571db52ff2b87718bcb5a6322923f58987" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791693000704, - "mapped_size": 0, - "path": "C:\\Program Files\\Cybereason ActiveProbe\\bdquar.dll", - "signature_signer": "Bitdefender SRL", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "VeriSign Class 3 Code Signing 2010 CA", - "serial_number": "3d b2 9a 36 51 f3 f5 e4 9c e0 79 d2 83 95 76 30 ", - "subject_name": "Bitdefender SRL" - }, - "cert_timestamp": { - "issuer_name": "Symantec Time Stamping Services CA - G2", - "serial_number": "0e cf f4 38 c8 fe bf 35 6e 04 d8 6a 98 1b 1a 50 ", - "subject_name": "Symantec Time Stamping Services Signer - G4", - "timestamp_string": "01/16/2017 05:34" - }, - "more_info_link": "", - "program_name": "", - "publisher_link": "" - }, - "compile_time": 1484573248, - "hashes": { - "imphash": "4e1a791e94ac955105ddfaac387de22f", - "md5": "874d6017f89a2ef255a16280ed4b1bf7", - "sha1": "8951c3ab1c9ea0c312206b98d22a9779c8a89c8c", - "sha256": "00512202b78037c17a77b095fcb3458381002dbd20de8dee0c99ff7701343cda" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791691427840, - "mapped_size": 0, - "path": "C:\\Program Files\\Cybereason ActiveProbe\\BDSmartDB.dll", - "signature_signer": "Bitdefender SRL", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290257756, - "hashes": { - "imphash": "5cd9d6761799e2ff681533ef1ffbb31d", - "md5": "2477a28081bdaee622cf045acf8ee124", - "sha1": "304c5f29fa847fbd994ad7a0471214198b928c14", - "sha256": "00a09caf9129e84feea98fa03ce9012c9f961b64fee15c4f268822c0f82acc3c" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791752376320, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\CFGMGR32.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "DigiCert Assured ID Code Signing CA-1", - "serial_number": "0f b5 4c 96 fd 63 93 fd 7b b9 9c d1 d0 d5 16 ed ", - "subject_name": "Bitdefender SRL" - }, - "cert_timestamp": { - "issuer_name": "Symantec Time Stamping Services CA - G2", - "serial_number": "0e cf f4 38 c8 fe bf 35 6e 04 d8 6a 98 1b 1a 50 ", - "subject_name": "Symantec Time Stamping Services Signer - G4", - "timestamp_string": "09/12/2018 01:20" - }, - "more_info_link": "", - "program_name": "", - "publisher_link": "" - }, - "compile_time": 1512623776, - "hashes": { - "imphash": "e2dab13fa4a67b25d3fbae65a189c521", - "md5": "627d7f1de23e6b01d6251b4c6962e765", - "sha1": "5e1d1854861016198ce4a1dbdea883f257de9463", - "sha256": "82bdf513b5f5b55ff740482ee839b14455b2296e2a911cb9a1ae622969412ed5" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791684612096, - "mapped_size": 0, - "path": "C:\\ProgramData\\apv2\\bd_db\\1\\bdcore.dll", - "signature_signer": "Bitdefender SRL", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "VeriSign Class 3 Code Signing 2010 CA", - "serial_number": "3d b2 9a 36 51 f3 f5 e4 9c e0 79 d2 83 95 76 30 ", - "subject_name": "Bitdefender SRL" - }, - "cert_timestamp": { - "issuer_name": "Symantec Time Stamping Services CA - G2", - "serial_number": "0e cf f4 38 c8 fe bf 35 6e 04 d8 6a 98 1b 1a 50 ", - "subject_name": "Symantec Time Stamping Services Signer - G4", - "timestamp_string": "09/13/2017 23:13" - }, - "more_info_link": "", - "program_name": "", - "publisher_link": "" - }, - "compile_time": 1505278115, - "hashes": { - "imphash": "c2979e6e570392ed85b4e15810f2e90f", - "md5": "3b4c71b64bc20b0c6578a091a031c0fb", - "sha1": "00cb578e723555e929e4ad8e820772b56ce29475", - "sha256": "52db08c10a5f1482dda8527d592f71b33c1cfecfa5a5a2d0be5a78325c41dd7b" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791673536512, - "mapped_size": 0, - "path": "C:\\Program Files\\Cybereason ActiveProbe\\bdnc.dll", - "signature_signer": "Bitdefender SRL", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290257999, - "hashes": { - "imphash": "04534d8dae5ab230b9bee9b1b0b2829d", - "md5": "3f9f2afa135f0663946a006dd5ffd897", - "sha1": "ea6456859b04b68af8dcd453381dd168af53fc5e", - "sha256": "276d1c9c78c529625c2ef3d77079324628686ea184767971901a1de93681c133" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791753490432, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\CRYPT32.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258373, - "hashes": { - "imphash": "2e50bc5d9fe777770c8a6b2cfaf6b2e9", - "md5": "884415bd4269c02eaf8e2613bf85500d", - "sha1": "c3a64f05c210b38c69d8f1fc1d74a71b56ada30c", - "sha256": "efe771709ec942694fd206ac8d0a48ed7dcd35036f074268e4aecd68ac982cea" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791752310784, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\MSASN1.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247535280, - "hashes": { - "imphash": "af1203c1d6d810c97729856780869b12", - "md5": "ef2ae43bcd46abb13fc3e5b2b1935c73", - "sha1": "c53e005cd04d99331ce3114ac119256133202313", - "sha256": "81fc06f306f620845d7dd8d06e706309e70bc89b589c81f3478302a3f5f73431" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791680024576, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\WINMM.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258927, - "hashes": { - "imphash": "b32250da0d30f7782b5b900d4d9c519a", - "md5": "2a86e54b441ad41557f75dc5609b9793", - "sha1": "83ddcf8a1a0ca423bf8417f5e59b5c431bf50c43", - "sha256": "8fede6909413c0fa5b63d58d39affd0f6c3beeaf19b7b2f8674913abfd79a912" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791749951488, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\SSPICLI.DLL", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290258493, - "hashes": { - "imphash": "466f15f36f10655b30e9347e7dfc2b52", - "md5": "1d5185a4c7e6695431ae4b55c3d7d333", - "sha1": "5e9f739d46e20541ffc0a6421dc6be416ca8f261", - "sha256": "16f3906c54f1d71559836fdfcf4e83e7c9f454463d78fd577ad2d7022e0bcb51" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791743463424, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\mswsock.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247535287, - "hashes": { - "imphash": "f967c6b35a5d1b7765016056a842e331", - "md5": "31559f3244c6bc00a52030caa83b6b91", - "sha1": "7943540153c7b7878101a4901d7935e05e7cfd32", - "sha256": "b2025742b5f0025ace9821d5722de3f997eeeab21d2f381c9e307882df422579" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791737106432, - "mapped_size": 0, - "path": "C:\\Windows\\System32\\wshtcpip.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247534998, - "hashes": { - "imphash": "77870f98ca4d25a823c74d7404a64bfd", - "md5": "d0c2fbb6d97416b0166478fc7ae2b212", - "sha1": "e290bdf2312ac30a4e9f2a96d7c84714eee84899", - "sha256": "7eab6c37f0a845e645ca44cc060ac6c56e386c7ef7a64716c6786c9602ad8c9d" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791743856640, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\CRYPTSP.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 04 ca 69 00 00 00 00 00 08 ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 17:43" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1247535161, - "hashes": { - "imphash": "b8c20a01e4d94df61ee21f5350389f9c", - "md5": "5d8874a8c11dddde29e12de0e2013493", - "sha1": "a1c8e3e6ee44dcb68752d44b3b6f4ecce89c388d", - "sha256": "3e9a57137bf622af83e3e4d58971e2c0200559cca7545d16cf263aa03ee9c7d2" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791740710912, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\rsaenh.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247534993, - "hashes": { - "imphash": "f0c6fd6831905d958b05645b680db89f", - "md5": "784fa3df338e2e8f5f0389d6fac428af", - "sha1": "6d32c67c91c6d374854e907c6719db2538540867", - "sha256": "9c8aa0cfdeb9e38aaf8eb08626070e0f0364f4f8a793cfe3532ec6c007980c34" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791750541312, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\CRYPTBASE.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290257906, - "hashes": { - "imphash": "ff74e3ff0a015c2023b747f613061e42", - "md5": "a52b6cc24063cc83c78c0e6f24deec01", - "sha1": "a5384efac7d1f9213aaf0423ed0b021bc986b9df", - "sha256": "77e0d2b2356e71f9be52fa479c9dde17c453c198bb49cd4a97f2309628d82e3b" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791741890560, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\DNSAPI.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247534791, - "hashes": { - "imphash": "59b31e42f8fae7b5809ba7fcae732e0c", - "md5": "4cbcc37856ea2039c27a2fb661dda0e5", - "sha1": "cc666108d34168420a1d1942dda1e090154c7296", - "sha256": "74cbfab3092a9564bddfcb84db3e3f8bcfd1492938adf187423d3355d73d21c6" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791717642240, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\dhcpcsvc6.DLL", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247534790, - "hashes": { - "imphash": "f17020f0f66b64fbdf51c75b43f3729d", - "md5": "f568f7c08458d69e4fcd8675bbb107e4", - "sha1": "c1e05f0255a6f386711044b11e2d04dfd328b26a", - "sha256": "a5fa25ecf248999a68ccecfbb508bfa1add18a23e20a9a9081a87c41caaa36c0" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791717117952, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\dhcpcsvc.DLL", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247534847, - "hashes": { - "imphash": "dda6776607f283829d85b996f5e46d03", - "md5": "f3d202f53a222d5f6944d459b73cf967", - "sha1": "c9db224ce8ec34aa2f341b6766ea67aa12f8b4a7", - "sha256": "e9f1d48eb333d32331bcfd0348fe07bee7d5352292e6020571da395f596affe7" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791668686848, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\FLTLIB.DLL", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "07/13/2009 19:17" - }, - "more_info_link": "http://www.microsoft.com/windows", - "program_name": "Windows System Catalog", - "publisher_link": "" - }, - "compile_time": 1247535135, - "hashes": { - "imphash": "ff720e05e534d67b814b8562265058f5", - "md5": "2c942733a5983dd4502219ff37c7ebc7", - "sha1": "263e8fbf77c0ceead0c9bca56394bffa4a664361", - "sha256": "34b20b6b0d7274e4b5b783f1d2345bc3dd9888964d5c2c65712f041a00cf5b45" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791751393280, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\profapi.dll", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - }, - { - "architecture": "x64", - "authenticode": { - "cert_signer": { - "issuer_name": "Microsoft Windows Verification PCA", - "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", - "subject_name": "Microsoft Windows" - }, - "cert_timestamp": { - "issuer_name": "Microsoft Time-Stamp PCA", - "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", - "subject_name": "Microsoft Time-Stamp Service", - "timestamp_string": "11/20/2010 11:37" - }, - "more_info_link": "http://www.microsoft.com", - "program_name": "Microsoft Windows", - "publisher_link": "" - }, - "compile_time": 1290259008, - "hashes": { - "imphash": "b2ecd39ae0055d9e1b8aa5bc78942cba", - "md5": "eb3f9c2de1236b5d46b2291d82970e43", - "sha1": "0ce9ddc1063256ab571b916389321fd7f572ddc0", - "sha256": "8a43d335f3d573bed98af54bb51e82546c2acc025da8a48d801213eb14e9d5d4" - }, - "malware_classification": { - "identifier": "Whitelisted", - "score": 0, - "threshold": 0, - "version": "3.0.0" - }, - "mapped_address": 8791753228288, - "mapped_size": 0, - "path": "C:\\Windows\\system32\\WINTRUST.DLL", - "signature_signer": "Microsoft Windows", - "signature_status": "trusted" - } - ], - "name": "AmSvc.exe", - "parent_exe": "C:\\Windows\\System32\\services.exe", - "parent_name": "services.exe", - "pid": 1084, - "ppid": 436, - "primary_token": { - "domain": "NT AUTHORITY", - "integrity_level": 16384, - "integrity_level_name": "system", - "privileges": [ - { - "description": "Replace a process level token", - "enabled": false, - "name": "SeAssignPrimaryTokenPrivilege" - }, - { - "description": "Lock pages in memory", - "enabled": true, - "name": "SeLockMemoryPrivilege" - }, - { - "description": "Adjust memory quotas for a process", - "enabled": false, - "name": "SeIncreaseQuotaPrivilege" - }, - { - "description": "Act as part of the operating system", - "enabled": true, - "name": "SeTcbPrivilege" - }, - { - "description": "Manage auditing and security log", - "enabled": false, - "name": "SeSecurityPrivilege" - }, - { - "description": "Take ownership of files or other objects", - "enabled": false, - "name": "SeTakeOwnershipPrivilege" - }, - { - "description": "Load and unload device drivers", - "enabled": true, - "name": "SeLoadDriverPrivilege" - }, - { - "description": "Profile system performance", - "enabled": true, - "name": "SeSystemProfilePrivilege" - }, - { - "description": "Change the system time", - "enabled": false, - "name": "SeSystemtimePrivilege" - }, - { - "description": "Profile single process", - "enabled": true, - "name": "SeProfileSingleProcessPrivilege" - }, - { - "description": "Increase scheduling priority", - "enabled": true, - "name": "SeIncreaseBasePriorityPrivilege" - }, - { - "description": "Create a pagefile", - "enabled": true, - "name": "SeCreatePagefilePrivilege" - }, - { - "description": "Create permanent shared objects", - "enabled": true, - "name": "SeCreatePermanentPrivilege" - }, - { - "description": "Back up files and directories", - "enabled": true, - "name": "SeBackupPrivilege" - }, - { - "description": "Restore files and directories", - "enabled": true, - "name": "SeRestorePrivilege" - }, - { - "description": "Shut down the system", - "enabled": false, - "name": "SeShutdownPrivilege" - }, - { - "description": "Debug programs", - "enabled": true, - "name": "SeDebugPrivilege" - }, - { - "description": "Generate security audits", - "enabled": true, - "name": "SeAuditPrivilege" - }, - { - "description": "Modify firmware environment values", - "enabled": false, - "name": "SeSystemEnvironmentPrivilege" - }, - { - "description": "Bypass traverse checking", - "enabled": true, - "name": "SeChangeNotifyPrivilege" - }, - { - "description": "Remove computer from docking station", - "enabled": false, - "name": "SeUndockPrivilege" - }, - { - "description": "Perform volume maintenance tasks", - "enabled": false, - "name": "SeManageVolumePrivilege" - }, - { - "description": "Impersonate a client after authentication", - "enabled": true, - "name": "SeImpersonatePrivilege" - }, - { - "description": "Create global objects", - "enabled": true, - "name": "SeCreateGlobalPrivilege" - }, - { - "description": "Increase a process working set", - "enabled": true, - "name": "SeIncreaseWorkingSetPrivilege" - }, - { - "description": "Change the time zone", - "enabled": true, - "name": "SeTimeZonePrivilege" - }, - { - "description": "Create symbolic links", - "enabled": true, - "name": "SeCreateSymbolicLinkPrivilege" - } - ], - "sid": "S-1-5-18", - "type": "tokenPrimary", - "user": "SYSTEM" - }, - "services": [ - { - "name": "CybereasonAntiMalware" - } - ], - "sha1": "ca85243c0af6a6471bdaa560685c51eefd6dbc0d", - "sha256": "8ad40c90a611d36eb8f9eb24fa04f7dbca713db383ff55a03aa0f382e92061a2", - "sid": "S-1-5-18", - "signature_signer": "Cybereason Inc", - "signature_status": "trusted", - "threads": [ - { - "create_time": 1542345900, - "entrypoint": 5354476452, - "thread_id": 1088, - "up_time": 601 - }, - { - "create_time": 1542345900, - "entrypoint": 2001252032, - "thread_id": 1116, - "up_time": 600 - }, - { - "create_time": 1542345900, - "entrypoint": 8791691510992, - "thread_id": 1204, - "up_time": 598 - }, - { - "create_time": 1542345900, - "entrypoint": 8791691468912, - "thread_id": 1220, - "up_time": 598 - }, - { - "create_time": 1542345900, - "entrypoint": 8791673571008, - "thread_id": 1392, - "up_time": 586 - }, - { - "create_time": 1542345900, - "entrypoint": 8791673571008, - "thread_id": 1396, - "up_time": 586 - }, - { - "create_time": 1542345900, - "entrypoint": 8791673574320, - "thread_id": 1400, - "up_time": 586 - }, - { - "create_time": 1542345900, - "entrypoint": 8791673638416, - "thread_id": 1404, - "up_time": 586 - }, - { - "create_time": 1542345900, - "entrypoint": 2001271744, - "thread_id": 1520, - "up_time": 584 - }, - { - "create_time": 1542345900, - "entrypoint": 8791699247140, - "thread_id": 1888, - "up_time": 547 - }, - { - "create_time": 1542345900, - "entrypoint": 8791694133536, - "thread_id": 1904, - "up_time": 547 - }, - { - "create_time": 1542345900, - "entrypoint": 8791694133536, - "thread_id": 1908, - "up_time": 547 - }, - { - "create_time": 1542345900, - "entrypoint": 8791694133536, - "thread_id": 1912, - "up_time": 547 - }, - { - "create_time": 1542345900, - "entrypoint": 8791694133536, - "thread_id": 1916, - "up_time": 547 - }, - { - "create_time": 1542345900, - "entrypoint": 8791694133872, - "thread_id": 1920, - "up_time": 547 - }, - { - "create_time": 1542345900, - "entrypoint": 8791694132592, - "thread_id": 1924, - "up_time": 547 - }, - { - "create_time": 1542345900, - "entrypoint": 8791694133216, - "thread_id": 1928, - "up_time": 547 - }, - { - "create_time": 1542345900, - "entrypoint": 8791694134640, - "thread_id": 1932, - "up_time": 547 - }, - { - "create_time": 1542345900, - "entrypoint": 5354393504, - "thread_id": 1936, - "up_time": 547 - }, - { - "create_time": 1542345900, - "entrypoint": 5354393504, - "thread_id": 1944, - "up_time": 547 - }, - { - "create_time": 1542346000, - "entrypoint": 2001271744, - "thread_id": 2372, - "up_time": 509 - }, - { - "create_time": 1542346400, - "entrypoint": 8791743523392, - "thread_id": 4036, - "up_time": 43 - }, - { - "create_time": 1542346400, - "entrypoint": 8791673712896, - "thread_id": 4040, - "up_time": 43 - }, - { - "create_time": 1542346400, - "entrypoint": 2002168128, - "thread_id": 3372, - "up_time": 28 - } - ], - "unique_pid": 21, - "unique_ppid": 8, - "up_time": 601, - "user": "SYSTEM" - }, - "acting_thread": { - "create_time": 1542345900, - "service_name": "CybereasonAntiMalware", - "thread_id": 1912, - "thread_start_address": 8791694133536, - "thread_start_address_module": "C:\\Program Files\\Cybereason ActiveProbe\\gzfltum.dll" - } - }, - "captured_file": false, - "file_name": "C:\\Windows\\TEMP\\tmp0000045c\\tmp00001b4a", - "file_operation": "creation", - "file_owner": "Administrators", - "file_size": 188416, - "hashes": { - "imphash": "835d619dfdf3cc727cebd91300ab3462", - "md5": "4ace3baaa509d08510405e1b169e325b", - "sha1": "27fb21cf5db95ffca43b234affa99becc4023b9d", - "sha256": "6ed1c836dbf099be7845bdab7671def2c157643761b52251e04e9b6ee109ec75" - }, - "is_signature_trusted": false, - "malware_classification": { - "compressed_malware_features": { - "data_buffer": "eAHtnU1oHHUUwHsQ7MGDiIIUD4sH8WBBxJtopiLoUY0pYo2ZTbJJ0yQ17m4+ms/NRzeVWpuUWCL4sWlEYvFQ8KJQ6NCTEA8eRD30sIo3PdSriLi7837Pko3LbHZ2M5m+XObHm/d/X////83O7jCZvzacHBpPplNdfalkdjSdyty674Ft59dN71Dpb9v5eKh8LMEHjsCF2wIfVlRKsHROYPGkQO5+gY2vBSYYdWZFYGwEO/cITHMqkxPYnBBY+07gtCuQ9gSGigJ5lPPYGXcE+jA4z3Ad1ZtAUiDUyrEEPYzqRnIKgxd/Rgc7gygPo5wn95PouN7OeEYJ1UXiJgRmvscgp/LOziIkkSyT+xRVnXhZ4DKh5goCkzidRHkGO4uvCyw9LDDtCay8ILCAzrJOJaGuZwUuvSewivJVIPsklq8JbL4qMJsTSCcExrGs83WKU295ZFo5lr2TaZbcUw5FeJy8tgTeLpCy2iGeS67ABXzlgbEi1UC5FxcZnA4y/CLK82Qxi847FGGZRTLsCUxR1aWEwOp1AmOjDRYYzgwusL9WfqBiGJxnVAanixTq7Dp22LBdlWMJzlOx8wmBK2Rx5WmBLJIRwtAijOQE+ooCb2B5xBOYRtlfNeXpLpA7oyZRTqHzGenkmIJPnhBIMrzTwSA6H93CO5l+c1NA99f6IwLH8fUKdjTmDpTbgS50+gGVnECnE4PpooC2guPoaPADSHrcncNHmEHtAFkq3+EI+A37zsrrTvH3WTkvJLoOTyBp10wx2JcgVCRahA4NrICE4a+hrMXsA3qAHItW188E8ejO7XV3eh/KCYwxlamEwCgL8lN2wTntfrhY/U0g/5KAdvUpT+AszWqBdqH7VLeeZrExK9Cv1UgIDKA8g/cx7QAEP+AhAfRaMKB2HOJh+BSFSqKjSytNGBlc6PrpxvK7lCVDxbSG3Z7AhCMwx6gelwgLAltXBXJUTH29j+U1LHdipx/QprfKfGnF0sBpdBYxmEQyTzW0h6/0khcuhhJYRufym+i4VKMocJMs/KvfoW3/UJb4PeZOSZVONThZz4djP/75TAXa/CVfOvX3RgVLIDreLPN1pP1osW7lGmHsEhjBOzf+EPBE4vndvWz5xb/cChxGcv1LAb+tluALKnZ47isf1MXvz1ZMlsCXbXtPceqhrcp1ps6YHwQeBXLEPCf7q23tl9uJui0bGBgYRAccv7uXr/g5Af+2oNTrpgTa/vnpjBvpLAwM4gRBPvIZGBgYGBgYGBgYGBgYGBgYGBgYGBgYNAOc9oMXs4GBgYFBcNBnww5QzDXgRtPSaZ5lg/itsRaslgZ3bnWEEVnhMetIBwiiVnlbCbWrEftrt11zdwWnseFW1QO63w1is3ptD1pV9xG0t+zvfUrzrvh380qwXWAVCw6h78GIfG7ZlzltXu6hd+y92fECRFhjuH3bXG8N43oXEHperdzvUbteaDxhVTUeq25fqhG1X6Ai8mtF6BDXz2wR+dzSgg4Qsxls5T11XMG+82y8GkG+b7kL69xg7mF1SFvhBgYGsYH/Xi7HE+PVkiB2jt1bNZxT+k4558jR53ydz5//1m1KOgYGBgYGBgYGEQfnsYaG2z1sdPJS79XQSu91ndobOAHCaN5vNzUk1bceQVzUpbw3iOuT+UFmR18bHrp3gyhDC56lCd1y85w2+HSNUwVhhdGC7blLf+bV/fqtvhMg1NDjCcugB1QXswbs8ekj/v1BgzFHBIIsyP+HfwFdMpzu", - "decompressed_size": 27831, - "encoding": "zlib" - }, - "identifier": "endpointpe", - "prevention_threshold": 0.66, - "score": 1, - "threshold": 0.66, - "version": "3.0.33" - }, - "pid": 1084, - "ppid": 436, - "signature_signer": "", - "temp_file_path": "C:\\Windows\\TEMP\\37c97b4b-6ee8-476c-bfdd-c0cd6783b86d", - "timestamp": { - "accessed": 1542346400, - "created": 1542346400, - "modified": 1542346500 - }, - "user_blacklisted": false - }, - "event_subtype_full": "file_classification_event", - "event_type_full": "alert_event", - "metadata": { - "beta_alert": false, - "chunk_id": 0, - "collection_time": 1542346500, - "correlation_id": "2c827da1-f977-42a7-994b-ab7e5cc50329", - "destination_plugin": "send", - "final": true, - "is_alert": true, - "key": "fileClassificationEventResponse", - "message_id": "2280efbc-8bdf-49bf-a712-bc44acdf3eaa", - "origination_task_id": "4d9d9e7e-4ea1-4373-954c-e8cdbb85c61d", - "os_type": "windows", - "priority": 80, - "result": { - "local_code": 0, - "local_msg": "Success" - }, - "semantic_version": "3.50.0", - "sensor_version": "3.50.0", - "task_id": "4d9d9e7e-4ea1-4373-954c-e8cdbb85c61d", - "type": "detection" - }, - "opcode": 8, - "serial_event_id": 144711, - "timestamp": 132140207402716480, - "timestamp_utc": "2019-09-27 01:19:00Z" - }, - "event": { - "action": "file_classification_event", - "dataset": "esensor", - "kind": "alert", - "module": "endgame" - }, - "host": { - "hostname": "HD-m3z-4c803698", - "ip": "10.176.220.187", - "name": "HD-m3z-4c803698", - "os": { - "name": "Windows", - "platform": "windows", - "version": "10.0" - } - }, - "labels": { - "account_id": "8c48070b-4b61-4ded-86d5-1b9a7a78229c", - "endpoint_id": "c89dc040-2350-4d59-baea-9ff2e369136f" - }, - "user": { - "group": { - } - } - }, - "type": "_doc" - } - } - ] \ No newline at end of file diff --git a/x-pack/plugins/endpoint/server/services/endpoint/alert_query_builders.test.ts b/x-pack/plugins/endpoint/server/services/endpoint/alert_query_builders.test.ts new file mode 100644 index 0000000000000..a4d7de8fdcfdb --- /dev/null +++ b/x-pack/plugins/endpoint/server/services/endpoint/alert_query_builders.test.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; + * you may not use this file except in compliance with the Elastic License. + */ +import { httpServerMock, loggingServiceMock } from 'src/core/server/mocks'; +import { EndpointConfigSchema } from '../../config'; +import { getPagingProperties, buildAlertListESQuery } from './alert_query_builders'; + +describe('test query builder', () => { + describe('test query builder request processing', () => { + it('should execute the correct Elasticsearch query for a default request', async () => { + const mockRequest = httpServerMock.createKibanaRequest({}); + const mockCtx = { + logFactory: loggingServiceMock.create(), + config: () => Promise.resolve(EndpointConfigSchema.validate({})), + }; + const queryParams = await getPagingProperties(mockRequest, mockCtx); + const query = await buildAlertListESQuery(queryParams); + + expect(query).toEqual({ + body: { + query: { + match_all: {}, + }, + sort: [ + { + '@timestamp': { + order: 'desc', + }, + }, + ], + track_total_hits: 10000, + }, + from: 0, + size: 10, + index: 'my-index', + } as Record); + }); + it('should adjust track_total_hits for deep pagination', async () => { + const mockRequest = httpServerMock.createKibanaRequest({ + query: { + page_index: 10, + page_size: 1000, + }, + }); + const mockCtx = { + logFactory: loggingServiceMock.create(), + config: () => Promise.resolve(EndpointConfigSchema.validate({})), + }; + const queryParams = await getPagingProperties(mockRequest, mockCtx); + const query = await buildAlertListESQuery(queryParams); + + expect(query).toEqual({ + body: { + query: { + match_all: {}, + }, + sort: [ + { + '@timestamp': { + order: 'desc', + }, + }, + ], + track_total_hits: 12000, + }, + from: 10000, + size: 1000, + index: 'my-index', + } as Record); + }); + }); +}); diff --git a/x-pack/plugins/endpoint/server/services/endpoint/alert_query_builders.ts b/x-pack/plugins/endpoint/server/services/endpoint/alert_query_builders.ts new file mode 100644 index 0000000000000..a20f2ae1cdecd --- /dev/null +++ b/x-pack/plugins/endpoint/server/services/endpoint/alert_query_builders.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; + * you may not use this file except in compliance with the Elastic License. + */ +import { KibanaRequest } from 'kibana/server'; +import { EndpointAppConstants } from '../../../common/types'; +import { EndpointAppContext, AlertRequestParams, JSONish } from '../../types'; + +export const buildAlertListESQuery = async ( + pagingProperties: Record +): Promise => { + const DEFAULT_TOTAL_HITS = 10000; + + // Calculate minimum total hits set to indicate there's a next page + const totalHitsMin = Math.max( + pagingProperties.fromIndex + pagingProperties.pageSize * 2, + DEFAULT_TOTAL_HITS + ); + + return { + body: { + track_total_hits: totalHitsMin, + query: { + match_all: {}, + }, + sort: [ + { + '@timestamp': { + order: 'desc', + }, + }, + ], + }, + from: pagingProperties.fromIndex, + size: pagingProperties.pageSize, + index: EndpointAppConstants.ALERT_INDEX_NAME, + }; +}; + +export const getPagingProperties = async ( + request: KibanaRequest, + endpointAppContext: EndpointAppContext +): Promise> => { + const config = await endpointAppContext.config(); + const pagingProperties: { page_size?: number; page_index?: number } = {}; + + if (request?.route?.method === 'get') { + pagingProperties.page_index = request.query?.page_index; + pagingProperties.page_size = request.query?.page_size; + } else { + pagingProperties.page_index = request.body?.page_index; + pagingProperties.page_size = request.body?.page_size; + } + + const pageSize = pagingProperties.page_size || config.alertResultListDefaultPageSize; + const pageIndex = pagingProperties.page_index || config.alertResultListDefaultFirstPageIndex; + const fromIndex = pageIndex * pageSize; + + return { pageSize, pageIndex, fromIndex }; +}; diff --git a/x-pack/plugins/endpoint/server/test_data/all_alerts_data.json b/x-pack/plugins/endpoint/server/test_data/all_alerts_data.json new file mode 100644 index 0000000000000..128592f0f01df --- /dev/null +++ b/x-pack/plugins/endpoint/server/test_data/all_alerts_data.json @@ -0,0 +1,5471 @@ +{ + "_shards": { + "failed": 0, + "skipped": 0, + "successful": 1, + "total": 1 + }, + "hits": { + "hits": [ + { + "_id": "mguP_G8BsHRXKE0Yiz15", + "_index": "my-index", + "_score": 1.0, + "_source": { + "@timestamp": 1542341895000, + "agent": { + "id": "ced9c68e-b94a-4d66-bb4c-6106514f0a2f", + "type": "endpoint", + "version": "3.0.0" + }, + "ecs": { + "version": "1.1.0" + }, + "event": { + "action": "open", + "category": "malware", + "dataset": "endpoint", + "kind": "alert", + "module": "endpoint", + "type": "access" + }, + "file": { + "accessed": 1542341100, + "created": 1542341100, + "hash": { + "imphash": "835d619dfdf3cc727cebd91300ab3462", + "md5": "4ace3baaa509d08510405e1b169e325b", + "sha1": "27fb21cf5db95ffca43b234affa99becc4023b9d", + "sha256": "6ed1c836dbf099be7845bdab7671def2c157643761b52251e04e9b6ee109ec75" + }, + "mtime": 1542341100, + "owner": "Administrators", + "path": "C:\\Users\\Administrator\\Downloads\\endpointpe-blacklist-test.exe", + "size": 188416 + }, + "file_classification": { + "captured_file": false, + "is_signature_trusted": false, + "malware_classification": { + "compressed_malware_features": { + "data_buffer": "eAHtnU1oHHUUwHsQ7MGDiIIUD4sH8WBBxJtopiLoUY0pYo2ZTbJJ0yQ17m4+ms/NRzeVWpuUWCL4sWlEYvFQ8KJQ6NCTEA8eRD30sIo3PdSriLi7837Pko3LbHZ2M5m+XObHm/d/X////83O7jCZvzacHBpPplNdfalkdjSdyty674Ft59dN71Dpb9v5eKh8LMEHjsCF2wIfVlRKsHROYPGkQO5+gY2vBSYYdWZFYGwEO/cITHMqkxPYnBBY+07gtCuQ9gSGigJ5lPPYGXcE+jA4z3Ad1ZtAUiDUyrEEPYzqRnIKgxd/Rgc7gygPo5wn95PouN7OeEYJ1UXiJgRmvscgp/LOziIkkSyT+xRVnXhZ4DKh5goCkzidRHkGO4uvCyw9LDDtCay8ILCAzrJOJaGuZwUuvSewivJVIPsklq8JbL4qMJsTSCcExrGs83WKU295ZFo5lr2TaZbcUw5FeJy8tgTeLpCy2iGeS67ABXzlgbEi1UC5FxcZnA4y/CLK82Qxi847FGGZRTLsCUxR1aWEwOp1AmOjDRYYzgwusL9WfqBiGJxnVAanixTq7Dp22LBdlWMJzlOx8wmBK2Rx5WmBLJIRwtAijOQE+ooCb2B5xBOYRtlfNeXpLpA7oyZRTqHzGenkmIJPnhBIMrzTwSA6H93CO5l+c1NA99f6IwLH8fUKdjTmDpTbgS50+gGVnECnE4PpooC2guPoaPADSHrcncNHmEHtAFkq3+EI+A37zsrrTvH3WTkvJLoOTyBp10wx2JcgVCRahA4NrICE4a+hrMXsA3qAHItW188E8ejO7XV3eh/KCYwxlamEwCgL8lN2wTntfrhY/U0g/5KAdvUpT+AszWqBdqH7VLeeZrExK9Cv1UgIDKA8g/cx7QAEP+AhAfRaMKB2HOJh+BSFSqKjSytNGBlc6PrpxvK7lCVDxbSG3Z7AhCMwx6gelwgLAltXBXJUTH29j+U1LHdipx/QprfKfGnF0sBpdBYxmEQyTzW0h6/0khcuhhJYRufym+i4VKMocJMs/KvfoW3/UJb4PeZOSZVONThZz4djP/75TAXa/CVfOvX3RgVLIDreLPN1pP1osW7lGmHsEhjBOzf+EPBE4vndvWz5xb/cChxGcv1LAb+tluALKnZ47isf1MXvz1ZMlsCXbXtPceqhrcp1ps6YHwQeBXLEPCf7q23tl9uJui0bGBgYRAccv7uXr/g5Af+2oNTrpgTa/vnpjBvpLAwM4gRBPvIZGBgYGBgYGBgYGBgYGBgYGBgYGBgYNAOc9oMXs4GBgYFBcNBnww5QzDXgRtPSaZ5lg/itsRaslgZ3bnWEEVnhMetIBwiiVnlbCbWrEftrt11zdwWnseFW1QO63w1is3ptD1pV9xG0t+zvfUrzrvh380qwXWAVCw6h78GIfG7ZlzltXu6hd+y92fECRFhjuH3bXG8N43oXEHperdzvUbteaDxhVTUeq25fqhG1X6Ai8mtF6BDXz2wR+dzSgg4Qsxls5T11XMG+82y8GkG+b7kL69xg7mF1SFvhBgYGsYH/Xi7HE+PVkiB2jt1bNZxT+k4558jR53ydz5//1m1KOgYGBgYGBgYGEQfnsYaG2z1sdPJS79XQSu91ndobOAHCaN5vNzUk1bceQVzUpbw3iOuT+UFmR18bHrp3gyhDC56lCd1y85w2+HSNUwVhhdGC7blLf+bV/fqtvhMg1NDjCcugB1QXswbs8ekj/v1BgzFHBIIsyP+HfwFdMpzu", + "decompressed_size": 27831, + "encoding": "zlib" + }, + "identifier": "endpointpe", + "prevention_threshold": 0.66, + "score": 1, + "threshold": 0.66, + "version": "3.0.33" + }, + "signature_signer": "", + "temp_file_path": "C:\\Windows\\TEMP\\581ac9e2-e9ea-499e-8ec6-d7eed985b6c3", + "user_blacklisted": false + }, + "host": { + "hostname": "HD-c15-bc09190a", + "ip": "10.179.244.14", + "name": "HD-c15-bc09190a", + "os": { + "name": "Windows", + "platform": "windows", + "version": "6.1" + } + }, + "process": { + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "command_line": "C:\\Windows\\Explorer.EXE", + "domain": "WIN-Q3DOP1UKA81", + "executable": "C:\\Windows\\explorer.exe", + "file_hash": { + "md5": "ac4c51eb24aa95b77f705ab159189e24", + "sha1": "4583daf9442880204730fb2c8a060430640494b1", + "sha256": "6a671b92a69755de6fd063fcbe4ba926d83b49f78c42dbaeed8cdb6bbc57576a" + }, + "hash": { + "imphash": "6422e341c67ba0880e012f8c7c634c21", + "md5": "ac4c51eb24aa95b77f705ab159189e24", + "sha1": "4583daf9442880204730fb2c8a060430640494b1", + "sha256": "6a671b92a69755de6fd063fcbe4ba926d83b49f78c42dbaeed8cdb6bbc57576a" + }, + "is_endpoint": false, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "modules": [ + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290248516, + "hash": { + "imphash": "6422e341c67ba0880e012f8c7c634c21", + "md5": "ac4c51eb24aa95b77f705ab159189e24", + "sha1": "4583daf9442880204730fb2c8a060430640494b1", + "sha256": "6a671b92a69755de6fd063fcbe4ba926d83b49f78c42dbaeed8cdb6bbc57576a" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 4278845440, + "mapped_size": 0, + "path": "C:\\Windows\\Explorer.EXE", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 04 b3 f5 00 00 00 00 00 0d ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 05:28" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258681, + "hash": { + "imphash": "d41d8cd98f00b204e9800998ecf8427e", + "md5": "3556d5a8bf2cc508bdab51dec38d7c61", + "sha1": "92015f7bbdb9dad35e41c533d2c5b85f1cd63d85", + "sha256": "91e3d98ad3119e8addf8d2aa1dd6795162842fff7101e4c70c5137e847b4ff50" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 2007891968, + "mapped_size": 0, + "path": "C:\\Windows\\SYSTEM32\\ntdll.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258315, + "hash": { + "imphash": "9165b02c931d76a9b666d8d42128111b", + "md5": "7a6326d96d53048fdec542df23d875a0", + "sha1": "5c02af0206c299f5bcab8da4237cfc92e3e93495", + "sha256": "182351570856cd6eedd9df7e2fb8ab76bd4d8fc70be11ad5de6484cfd70c21c6" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 2006712320, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\kernel32.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258316, + "hash": { + "imphash": "3f7fb1504bb73a54888bf1c3650fe4cf", + "md5": "da68c291b4ef2dec9c5963266bcae454", + "sha1": "5696e8c68fcf64104499e20e7cd5452b58b4f4ba", + "sha256": "21aa4779fc21e762178517268c95467238c92851ad9160bffc36b2379c58337f" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791760175104, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\KERNELBASE.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "07/13/2009 19:17" + }, + "more_info_link": "http://www.microsoft.com/windows", + "program_name": "Windows System Catalog", + "publisher_link": "" + }, + "compile_time": 1247534699, + "hash": { + "imphash": "e1ee2d71958d21e0e1bf887dfe76af7f", + "md5": "6df46d2bd74e3da1b45f08f10d172732", + "sha1": "3491f8f9a73c00b158e43a530210d67a4f0598ae", + "sha256": "2dc945f6f2c4a82189bc7da2fcbb7d9a0e2588a909539249e55ba82468e0c677" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791763779584, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\ADVAPI32.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "07/13/2009 19:17" + }, + "more_info_link": "http://www.microsoft.com/windows", + "program_name": "Windows System Catalog", + "publisher_link": "" + }, + "compile_time": 1247535038, + "hash": { + "imphash": "8c99b1c0f6cf68b07336751f460f1dba", + "md5": "7319bb10fa1f86e49e3dcf4136f6c957", + "sha1": "3eea5ee8bafb2b9975b236c5c5655df6f4b42aa1", + "sha256": "60de43ab267fd41c9804369b569139add30ed4e295c425f44fc04d3fcc95fca2" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791790780416, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\msvcrt.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "07/13/2009 19:17" + }, + "more_info_link": "http://www.microsoft.com/windows", + "program_name": "Windows System Catalog", + "publisher_link": "" + }, + "compile_time": 1247535198, + "hash": { + "imphash": "b8ba136689cdc8d8b25fc04902f39a22", + "md5": "83404dcbce4925b6a5a77c5170f46d86", + "sha1": "22bda6b9da4fcf492b4dd16554b0c0e27e1b8667", + "sha256": "d669614d0b4461db244ad99fbe1ba92ceb9b4ed5ec8e987e23764e77d9ac7074" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791793074176, + "mapped_size": 0, + "path": "C:\\Windows\\SYSTEM32\\sechost.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258798, + "hash": { + "imphash": "46876e4adb924a616ddbbb1992d61257", + "md5": "0611473c1ad9e2d991cd9482068417f7", + "sha1": "c4a3fa902dedad5d448e1d8b2d113cae1dcf2f7a", + "sha256": "90afcc2a60350ece27e75e76459132ef0fa28ef283ce88fced4b82735a93ecda" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791762403328, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\RPCRT4.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258001, + "hash": { + "imphash": "51945fdf9aaf56aeb9d6fa1f21b638ce", + "md5": "1084aa52ccc324ea54c7121fa24c2221", + "sha1": "b13ef924708fa88577931ed0337000e90adcdf5b", + "sha256": "6e972cf624f7c0de8190434b3b30279a01c551713109f97b9ebb77fac9364754" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791792615424, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\GDI32.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258929, + "hash": { + "imphash": "2cb501375ed127591bf5cfee7f1e52fe", + "md5": "fe70103391a64039a921dbfff9c7ab1b", + "sha1": "e0019d9442aeebd3bb42a24c38aa2fae4c6bd4f5", + "sha256": "f7d219d75037bc98f6c69143b00ab6000a31f8b5e211e0af514f4f4b681522a0" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 2005663744, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\USER32.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "07/13/2009 19:17" + }, + "more_info_link": "http://www.microsoft.com/windows", + "program_name": "Windows System Catalog", + "publisher_link": "" + }, + "compile_time": 1247534943, + "hash": { + "imphash": "919110853c18aa198ad129945337b1dd", + "md5": "d202223587518b13d72d68937b7e3f70", + "sha1": "916a3ce858f074f57dd9dac01be5cd4649f19887", + "sha256": "9db971b866d058adbb518dd99b87c5db8dd1e7c9073755b989ae7e9fb62901e8" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791763714048, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\LPK.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258933, + "hash": { + "imphash": "17bf46cf6bf6c8cae48be5b75615a353", + "md5": "2f8b1e3ee3545d3b5a8d56fa1ae07b65", + "sha1": "66310680ee38904b2852717af13028e53b4e8b8e", + "sha256": "2a3ec01f3bafe7d7d656886437f7ffecce440c0d3f3467804769ab4bf1ff7a99" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791782522880, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\USP10.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258859, + "hash": { + "imphash": "4b37cbf60127ea0550ec30e0b1c52984", + "md5": "eaf32cb8c1f810e4715b4dfbe785c7ff", + "sha1": "3b099b193abb9064e6937101d0c309f04d713882", + "sha256": "db6ad07fded42433e669508ab73faff6daff04575d6f1d016fe3eb6ecec4dd5d" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791792091136, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\SHLWAPI.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258854, + "hash": { + "imphash": "9c631776d86c9b15258c3cc2a6a7891d", + "md5": "26e716ed95dc48cf6e5ac046089366af", + "sha1": "2bd96b8ae5ae3ad14c16d2a98a91a9a9f26d179d", + "sha256": "f686d557b7ac1688efc7cb48311290d713d3db2e9e61e947098a7c80e3a1b9e9" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791765811200, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\SHELL32.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258732, + "hash": { + "imphash": "faad2d5bf5c0ca9639e07a49e8c5d8ae", + "md5": "6c60b5aca7442efb794082cdacfc001c", + "sha1": "aae17944782b25f41f7b3a756532b4923f4ae817", + "sha256": "fc1d9124856a70ff232ef3057d66bee803295847624ce23b4d0217f23af52c75" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791783374848, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\ole32.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258736, + "hash": { + "imphash": "774fed8966de60d3af2dd9070df5be6f", + "md5": "42f05f980f164e084db65b2e8cd8430f", + "sha1": "86498b3c5bbc240b9de0a10f2cb4185e754de6d7", + "sha256": "0813749847b08f6577791d18ad9eca6dff5b41c2f727ab5ee9e5bf9602ed50cb" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791785537536, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\OLEAUT32.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258088, + "hash": { + "imphash": "ec96d3f694248151f968633563d10a36", + "md5": "eed05d42d91835064703e2318552ed25", + "sha1": "aa7e817ccad26070bce1161894f97e10aaa56fb9", + "sha256": "e9ee1e2253445b207b76f5d3073c612ed979a982522c1515e0fe8fa9641ae568" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791634935808, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\EXPLORERFRAME.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "07/13/2009 19:17" + }, + "more_info_link": "http://www.microsoft.com/windows", + "program_name": "Windows System Catalog", + "publisher_link": "" + }, + "compile_time": 1247534886, + "hash": { + "imphash": "c0e1a4a34891e5dd2a6cbaa0895a8d38", + "md5": "8ccde014a4cdf84564e03ace064ca753", + "sha1": "957e29e029fe60b8ff43ff732463c39230b78226", + "sha256": "dd663029b2eb7b12fdb00fce403d8326141e540e3b9ce84cd5871473d3e2e2cf" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791735599104, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\DUser.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "07/13/2009 19:17" + }, + "more_info_link": "http://www.microsoft.com/windows", + "program_name": "Windows System Catalog", + "publisher_link": "" + }, + "compile_time": 1247534885, + "hash": { + "imphash": "9353143c2b77b94cc82ab55c5fecf99c", + "md5": "3cb6a7286422c72c34dab54a5dff1a34", + "sha1": "5b93896a6abb36c2b8957973e3ce1860c1059367", + "sha256": "98d21efff511e407336a226420701e82554da01fa05661303836b6860d63749d" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791721181184, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\DUI70.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "07/13/2009 19:17" + }, + "more_info_link": "http://www.microsoft.com/windows", + "program_name": "Windows System Catalog", + "publisher_link": "" + }, + "compile_time": 1247534912, + "hash": { + "imphash": "d76d7be0b8ac9aafe17d2cc7deb32b29", + "md5": "aa2c08ce85653b1a0d2e4ab407fa176c", + "sha1": "0119c23d88292a0e4fec04d5cf8629005a44e37c", + "sha256": "83dfd0c119b20aedb07114c9d1cf9ce2dfa938d0f1070256b0591a9e2c3997fa" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791793205248, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\IMM32.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "07/13/2009 19:17" + }, + "more_info_link": "http://www.microsoft.com/windows", + "program_name": "Windows System Catalog", + "publisher_link": "" + }, + "compile_time": 1247535018, + "hash": { + "imphash": "b523fff180cb22465ccf191b827e9923", + "md5": "c431eaf5caa1c82cac2534a2eab348a3", + "sha1": "e425577ccfc9b92efbbcb760d21fcaa478d3e51a", + "sha256": "addf850128dc675e67faba9a3d0d27e684f01f733962ca22927bb94503549e44" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791764697088, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\MSCTF.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "07/13/2009 19:17" + }, + "more_info_link": "http://www.microsoft.com/windows", + "program_name": "Windows System Catalog", + "publisher_link": "" + }, + "compile_time": 1247535251, + "hash": { + "imphash": "56e651a119cdb899aadd2df3832bbcd1", + "md5": "d29e998e8277666982b4f0303bf4e7af", + "sha1": "e803b0af61ea2ddcd58b5a63b1cfbb73266318ea", + "sha256": "4f19ab5dc173e278ebe45832f6ceaa40e2df6a2eddc81b2828122442fe5d376c" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791742480384, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\UxTheme.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "07/13/2009 19:17" + }, + "more_info_link": "http://www.microsoft.com/windows", + "program_name": "Windows System Catalog", + "publisher_link": "" + }, + "compile_time": 1247535202, + "hash": { + "imphash": "1c419f7cfacebfcd8e903e6be290407e", + "md5": "716175021bda290504ce434273f666bc", + "sha1": "4f00fbf4e9a88fae9e6682989032831b3d2eba86", + "sha256": "fa18ca2d8a5f4335e051e2933147d3c1e7308f7d446e2aeb6596cdef6e2afc88" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791718690816, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\POWRPROF.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258850, + "hash": { + "imphash": "a7a25e8b145e75fdeb21026d3895033a", + "md5": "5d8e6c95156ed1f79a63d1eade6f9ed5", + "sha1": "cadd211d74385550c5e055d3312303f4d64fdebc", + "sha256": "12130837d7f89a2c7e9d25747a8e5b9001e0a38d545178b49b450c23ae62664a" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791788814336, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\SETUPAPI.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290257756, + "hash": { + "imphash": "5cd9d6761799e2ff681533ef1ffbb31d", + "md5": "2477a28081bdaee622cf045acf8ee124", + "sha1": "304c5f29fa847fbd994ad7a0471214198b928c14", + "sha256": "00a09caf9129e84feea98fa03ce9012c9f961b64fee15c4f268822c0f82acc3c" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791760633856, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\CFGMGR32.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "07/13/2009 19:17" + }, + "more_info_link": "http://www.microsoft.com/windows", + "program_name": "Windows System Catalog", + "publisher_link": "" + }, + "compile_time": 1247534817, + "hash": { + "imphash": "2dbdaadf7e151289a49662379e253dfd", + "md5": "06fec9e8117103bb1141a560e98077da", + "sha1": "a8922793a930d602409b62be5ff01d5baec60000", + "sha256": "c5e61b11ddbbbbba3d9488970524f0975ea5fbdf16e2fa31f579f8bfa48353b1" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791760044032, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\DEVOBJ.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "07/13/2009 19:17" + }, + "more_info_link": "http://www.microsoft.com/windows", + "program_name": "Windows System Catalog", + "publisher_link": "" + }, + "compile_time": 1247534887, + "hash": { + "imphash": "e7f2585307f1db90e7e5e48c40dc7134", + "md5": "da1b7075260f3872585bfcdd668c648b", + "sha1": "f2bd334006d728422721b7c639145a6ec59a459b", + "sha256": "3e10ef6e1a5c341b478322cb78a0ab7bfc70ad8023779b8b4542a7cb4ca756ab" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791742873600, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\dwmapi.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "07/13/2009 19:17" + }, + "more_info_link": "http://www.microsoft.com/windows", + "program_name": "Windows System Catalog", + "publisher_link": "" + }, + "compile_time": 1247535203, + "hash": { + "imphash": "6a5a31c99a1562b9e5e10f4b4445be95", + "md5": "be097f5bb10f9079fceb2dc4e7e20f02", + "sha1": "dd572bac50bc4718126389c628d56a83d5c4d88a", + "sha256": "90a88986c8c5f30fb153ec803feda6572b2c2630a6c9578fcc017800692694d5" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791732256768, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\slc.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290257495, + "hash": { + "imphash": "fd8a6a2046d9572b7f8f4288ae251c61", + "md5": "497bfeddaf3950dd909c3b0c5558a25d", + "sha1": "5d55bdc156372f51eb126f7bc2a8af161a1ef254", + "sha256": "980ea189929d95eb36e35980fff0c81f7b78de9422771fde8f4ac7a779f5bd89" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791732453376, + "mapped_size": 0, + "path": "C:\\Windows\\WinSxS\\amd64_microsoft.windows.gdiplus_6595b64144ccf1df_1.1.7601.17514_none_2b24536c71ed437a\\gdiplus.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258848, + "hash": { + "imphash": "cc4d63ca30fdbb90048e549782d2116a", + "md5": "858df0795cb5b4bace0f33708925a414", + "sha1": "e629ed78e6e1829263890974760dad8a431edf69", + "sha256": "a9063af8d5c73a722bd269d144d8a65c98db4cfdd9f626e3a8283754e22c8c9c" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791754801152, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\Secur32.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258927, + "hash": { + "imphash": "b32250da0d30f7782b5b900d4d9c519a", + "md5": "2a86e54b441ad41557f75dc5609b9793", + "sha1": "83ddcf8a1a0ca423bf8417f5e59b5c431bf50c43", + "sha256": "8fede6909413c0fa5b63d58d39affd0f6c3beeaf19b7b2f8674913abfd79a912" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791756701696, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\SSPICLI.DLL", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258762, + "hash": { + "imphash": "26c2856b9813d8990c01c5a711b5063a", + "md5": "f06bb4e336ea57511fdbafafcc47de62", + "sha1": "bfee1b9d2269d26d99c8e462825ee8399c8bd4ec", + "sha256": "be43ec62548e9ff89a9495a1722e22dbb76eec3764f86e64057b636f27d15765" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791728259072, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\PROPSYS.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "07/13/2009 19:17" + }, + "more_info_link": "http://www.microsoft.com/windows", + "program_name": "Windows System Catalog", + "publisher_link": "" + }, + "compile_time": 1247534993, + "hash": { + "imphash": "f0c6fd6831905d958b05645b680db89f", + "md5": "784fa3df338e2e8f5f0389d6fac428af", + "sha1": "6d32c67c91c6d374854e907c6719db2538540867", + "sha256": "9c8aa0cfdeb9e38aaf8eb08626070e0f0364f4f8a793cfe3532ec6c007980c34" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791757291520, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\CRYPTBASE.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290257499, + "hash": { + "imphash": "cd11f800bc54ae45ead9d98c96048145", + "md5": "7fa8fdc2c2a27817fd0f624e78d3b50c", + "sha1": "b4aa8e16396b1882eb75c28dfbec9949608afdde", + "sha256": "7b63f6aa2cd6d4d07ea3c595b868b1a0749bb11620027a2bd9b935e3055481e4" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791736123392, + "mapped_size": 0, + "path": "C:\\Windows\\WinSxS\\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.7601.17514_none_fa396087175ac9ac\\comctl32.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258974, + "hash": { + "imphash": "b03f7d8315f3384d06c11e961e6fee07", + "md5": "26b73a85855681500bcc25c7cd9ff5b1", + "sha1": "393ed9ebbe380c77935df6d0eda2047cdd2224fe", + "sha256": "94d134a6af53ad629a4505b8b0ea37f61bb43af4db71874e7e87853163a9282a" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791724851200, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\WindowsCodecs.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "07/13/2009 19:17" + }, + "more_info_link": "http://www.microsoft.com/windows", + "program_name": "Windows System Catalog", + "publisher_link": "" + }, + "compile_time": 1247535135, + "hash": { + "imphash": "ff720e05e534d67b814b8562265058f5", + "md5": "2c942733a5983dd4502219ff37c7ebc7", + "sha1": "263e8fbf77c0ceead0c9bca56394bffa4a664361", + "sha256": "34b20b6b0d7274e4b5b783f1d2345bc3dd9888964d5c2c65712f041a00cf5b45" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791758143488, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\profapi.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290257558, + "hash": { + "imphash": "6af6d846a78a6532fcb989d0d8aeb17d", + "md5": "90499f3163a9f815cf196a205ea3cd5d", + "sha1": "f97ff54dc4b132756fcf7041e55d645163f19851", + "sha256": "29b4ed3795cec1177eb367132914ce21c194cdec5db9dc923fd928c85e94d821" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791756898304, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\apphelp.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "07/13/2009 19:17" + }, + "more_info_link": "http://www.microsoft.com/windows", + "program_name": "Windows System Catalog", + "publisher_link": "" + }, + "compile_time": 1247534778, + "hash": { + "imphash": "37afbae3e0f359c3718e379261f7ccfc", + "md5": "25983de69b57142039ac8d95e71cd9c9", + "sha1": "01691e3b0bfa569e64bdb7dc3d637a867ed2dc08", + "sha256": "a677da7ebcbcb6073d27e8a38809f51e971e83ed379bc599aaad6ef4216348da" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791787700224, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\CLBCatQ.DLL", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 04 ca 69 00 00 00 00 00 08 ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "07/13/2009 19:17" + }, + "more_info_link": "http://www.microsoft.com/windows", + "program_name": "Windows System Catalog", + "publisher_link": "" + }, + "compile_time": 1247534842, + "hash": { + "imphash": "cbda3eb1c9c46a2121362e9775f60b47", + "md5": "024352feec9042260bb4cfb4d79a206b", + "sha1": "79c23ce566219f87ade8e55a292aaaabe4a639ec", + "sha256": "60cb39086e10c5b66ebc15e4df219620b344b4358d2918ab6bb3448a0ac8be36" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791731994624, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\EhStorShell.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258701, + "hash": { + "imphash": "37dad3873d5388f07576532bc042f677", + "md5": "7bbf670114373ce6a203fa155a9e0d0a", + "sha1": "104d89dde030b661d05c4c63a03fae1f46ab52d2", + "sha256": "36ef0a36c679e53b1b169289bd3c05d7c2839dc20c8c87bf520b633911fde198" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791647518720, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\ntshrui.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258920, + "hash": { + "imphash": "2d37f2d4b3c246f361ca150fc7ebf8d4", + "md5": "3a9c9baf610b0dd4967086040b3b62a9", + "sha1": "3207ac7f895eab34623d994548d7810e54be3e79", + "sha256": "e8e9a0f42b1ee7806edceed08aa024d037215d06ca317e3678bd5364ad513d23" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791753228288, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\srvcli.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258010, + "hash": { + "imphash": "2ba777561101c3b07566cc50db3a564c", + "md5": "1bf0cb861a48feb1638228760750f3cb", + "sha1": "fbc77224c1b444a6ec25e99f995f2f355e4d1d26", + "sha256": "37c781a8c546ead8b4d28bd7d730b9ac78eb799599ad69dad9054b6f9f1dd6bd" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791649091584, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\cscapi.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:35" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1247534897, + "hash": { + "imphash": "5bf52e420b6d5991bdcce16ada0828dc", + "md5": "1d63f4366288b8a7595397e27010fd44", + "sha1": "e459e1227083e4eabd19ee20e13754560fc7e02d", + "sha256": "99ea4ddd88d9c4a4cc9b238f533cb4d2c062d46239173997e8594d8a75811a01" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791735533568, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\IconCodecService.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "07/13/2009 19:17" + }, + "more_info_link": "http://www.microsoft.com/windows", + "program_name": "Windows System Catalog", + "publisher_link": "" + }, + "compile_time": 1247534998, + "hash": { + "imphash": "77870f98ca4d25a823c74d7404a64bfd", + "md5": "d0c2fbb6d97416b0166478fc7ae2b212", + "sha1": "e290bdf2312ac30a4e9f2a96d7c84714eee84899", + "sha256": "7eab6c37f0a845e645ca44cc060ac6c56e386c7ef7a64716c6786c9602ad8c9d" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791750606848, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\CRYPTSP.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 04 ca 69 00 00 00 00 00 08 ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "07/13/2009 17:43" + }, + "more_info_link": "http://www.microsoft.com/windows", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1247535161, + "hash": { + "imphash": "b8c20a01e4d94df61ee21f5350389f9c", + "md5": "5d8874a8c11dddde29e12de0e2013493", + "sha1": "a1c8e3e6ee44dcb68752d44b3b6f4ecce89c388d", + "sha256": "3e9a57137bf622af83e3e4d58971e2c0200559cca7545d16cf263aa03ee9c7d2" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791747461120, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\rsaenh.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258799, + "hash": { + "imphash": "a198edd0f73abd7cdbb54eef82ab1fc6", + "md5": "c2a8cb1275ecb85d246a9ecc02a728e3", + "sha1": "4417207821fc8f5c72ff531683f183caef297882", + "sha256": "3603fadca0060bd201148f9d59e4e2627f024609a6463ab525b5d1ad17bdcd10" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791758012416, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\RpcRtRemote.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258895, + "hash": { + "imphash": "4fe9beaa9bd4aa01f5063a7352325c89", + "md5": "d7f1ef374a90709b31591823b002f918", + "sha1": "336ac44b8ee88a6af3f3eaf461b8bdf94fa657ff", + "sha256": "05fd2837c9b03d14bb2a969c1ad77caef047d93dc5d0f6c2acbf0888e8f7b359" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791730683904, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\SndVolSSO.DLL", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 04 ca 69 00 00 00 00 00 08 ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "07/13/2009 19:17" + }, + "more_info_link": "http://www.microsoft.com/windows", + "program_name": "Windows System Catalog", + "publisher_link": "" + }, + "compile_time": 1247534873, + "hash": { + "imphash": "0a90384377303e2a2625725018566a89", + "md5": "896f15a6434d93edb42519d5e18e6b50", + "sha1": "b91a3512a80c4201c3fcfaf62abace894fbba328", + "sha256": "9263f0cec58d45ebe3fb9c3061fb9392c55a7933b84b4592e6ee13cfc86d5a50" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791731929088, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\HID.DLL", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "07/13/2009 19:17" + }, + "more_info_link": "http://www.microsoft.com/windows", + "program_name": "Windows System Catalog", + "publisher_link": "" + }, + "compile_time": 1247534952, + "hash": { + "imphash": "98a24f570dbcd3a092d95b3bd4e51a53", + "md5": "227e2c382a1e02f8d4965e664d3bbe43", + "sha1": "c4971ba9c1e4fdf0106c7cfab626a3d8737bbd07", + "sha256": "1cff20a8bf87ace4fa4935ebeed72bfb1a1fe902a754899e2f50798d67df5642" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791729504256, + "mapped_size": 0, + "path": "C:\\Windows\\System32\\MMDevApi.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258898, + "hash": { + "imphash": "e99757a4c1beee1b5bf8b7b33b444dcc", + "md5": "1fcb1a72bf5c784f7358e6bef38e4571", + "sha1": "ef944a320de79bf05f0e30f54f3f8b2ba2e82c4a", + "sha256": "12da4240f8c964eda6223257bd9723fd9372e63ae86f00509163b1de12a5f6c5" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791637426176, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\timedate.cpl", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "07/13/2009 19:17" + }, + "more_info_link": "http://www.microsoft.com/windows", + "program_name": "Windows System Catalog", + "publisher_link": "" + }, + "compile_time": 1247534704, + "hash": { + "imphash": "d6de6fde05f96ac848accdb1aef473e4", + "md5": "58775492ffd419248b08325e583c527f", + "sha1": "b0e9ca05d46cb53049c4ca33fe04bd08989a78f9", + "sha256": "dbb013971f5894f25c222c2d4d50a29db6df3c413792ee9ccc1a9e6d85469093" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791732322304, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\ATL.DLL", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 04 ca 69 00 00 00 00 00 08 ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "07/13/2009 19:17" + }, + "more_info_link": "http://www.microsoft.com/windows", + "program_name": "Windows System Catalog", + "publisher_link": "" + }, + "compile_time": 1247535266, + "hash": { + "imphash": "fa1e670045065ff088a4ac664f9ac3d7", + "md5": "9f2bacd5e1776a4bb7cc0ec3c3a4f96d", + "sha1": "ad8c7ec85d532e5725b8535830f27c1abcf139b4", + "sha256": "19959d18601712901f03b83150d15e34ebcab355bb4692c9a28511a72f57fc66" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791730618368, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\WINBRAND.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290257498, + "hash": { + "imphash": "53f2c3eaeaa6e619e0ccd6e671e96145", + "md5": "e6f0f82788e8bd0f7a616350efa0761c", + "sha1": "9aa4aafda89325853ffa66169e697529164a23a2", + "sha256": "13091dcb3e3f4f52c3ff210e93aaf1dce142cfc09f671aeac5b922393b23e67b" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791633952768, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\actxprxy.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "07/13/2009 19:17" + }, + "more_info_link": "http://www.microsoft.com/windows", + "program_name": "Windows System Catalog", + "publisher_link": "" + }, + "compile_time": 1247535165, + "hash": { + "imphash": "ae5e5f76641aadaf99f0ca29d2e1cadd", + "md5": "1f4492fe41767cdb8b89d17655847cdd", + "sha1": "c836a5e65d56900b6658fdaa3df8579bdd07ec69", + "sha256": "184547fac0c3d7148faa3f601929a7089de393bd19929a137dad743331dd3f77" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791719739392, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\ntmarta.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290259030, + "hash": { + "imphash": "f792b6ec2e11bc79d8eb1bb1bcb79a91", + "md5": "4e4ffb09d895aa000dd56d1404f69a7e", + "sha1": "40f5c1890f6de5284f6c897255e6907b0272349a", + "sha256": "d999e04bb35780088480eab322176570591a21e311d204bdcab010a63b34d24c" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791794974720, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\WLDAP32.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258853, + "hash": { + "imphash": "2507624727988c72eb2a628a990000fd", + "md5": "c4f40f6cacd796a8e16671d0e9a2f319", + "sha1": "0881ae2a2fd3c5f03654410c474e5a25317942b2", + "sha256": "44853c645915d910ed0cc6d38f68b6c222528ec5fcbe990e238010f41204e682" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791729897472, + "mapped_size": 0, + "path": "C:\\Windows\\System32\\shdocvw.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 04 ca 69 00 00 00 00 00 08 ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "07/13/2009 19:17" + }, + "more_info_link": "http://www.microsoft.com/windows", + "program_name": "Windows System Catalog", + "publisher_link": "" + }, + "compile_time": 1247534923, + "hash": { + "imphash": "e52a872655c57d1b906101b6d5449bbf", + "md5": "a0a65d306a5490d2eb8e7de66898ecfd", + "sha1": "880ac520eb1d38ebb591707a26e6dd300df40643", + "sha256": "ce5da408f4edd5e81ce0925867f03c9a35172cf1571fe4c4c052e45ab69822bb" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791729831936, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\LINKINFO.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258932, + "hash": { + "imphash": "0e8a67fa12ce3d22a9e1d18bda5c3260", + "md5": "7a17485dc7d8a7ac81321a42cd034519", + "sha1": "83d1722a35eb16b010d8c9f72c627e97d4642101", + "sha256": "88d8705fa901793fc8c1cfd0175e49a6502bf0fc94a066ba573d2fd13aa5f04a" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791745036288, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\USERENV.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258852, + "hash": { + "imphash": "8b5c65294bec1cf89e97325a24b8cfc5", + "md5": "4e9c2db10f7e6ae91bf761139d4b745b", + "sha1": "6e8e6a53269ca8acc8c2456c80cd3a56d8deb98d", + "sha256": "8f63f78294f5585d599a114af449dcc447ccb239d0f0b490bfe6b34a2146e730" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791704207360, + "mapped_size": 0, + "path": "C:\\Windows\\System32\\shacct.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "07/13/2009 19:17" + }, + "more_info_link": "http://www.microsoft.com/windows", + "program_name": "Windows System Catalog", + "publisher_link": "" + }, + "compile_time": 1247535152, + "hash": { + "imphash": "44b39e98ae2946f304f4dbadcfffa307", + "md5": "5b3ebfc3da142324b388ddcc4465e1ff", + "sha1": "86e20ebf70fd35723eb635c4f3684891a2547a7b", + "sha256": "5d58642305311f9bc9b779c9598bfc4e7433b3ea58404bf1ff9466838a2328c7" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791716069376, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\SAMLIB.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258793, + "hash": { + "imphash": "7fec5787890bfedd3b3aa4082f53a08e", + "md5": "fc51229c7d4afa0d6f186133728b95ab", + "sha1": "f7a2f224356e68b612ecce4512c99f5b9c264d7d", + "sha256": "37e58c8e1c8437d1981725a5dcdaca7316cefbb570370cefc8d122f523b96ac0" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791714168832, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\samcli.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258588, + "hash": { + "imphash": "96f28fef38c977afbf3f6e8f39c0d6b9", + "md5": "6ceca4c6a489c9b2e6073afdaae3f607", + "sha1": "b228f6208642cb99e5bcdf2d3ebda2b8bc4fb020", + "sha256": "127506d1db38275614cbeb047c133718ef9d03266ba9c98be55ec7847cfc9c3d" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791722426368, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\netutils.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 04 ca 69 00 00 00 00 00 08 ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "07/13/2009 19:17" + }, + "more_info_link": "http://www.microsoft.com/windows", + "program_name": "Windows System Catalog", + "publisher_link": "" + }, + "compile_time": 1247535084, + "hash": { + "imphash": "14bd8d9a93b98b2479e1f6cd57b7c790", + "md5": "7cb3acb163de051169095dc6507b8977", + "sha1": "b891ebebb25655157f7c612d5763e995c86009a2", + "sha256": "45d4deb0695440d8b5e959945b3f7a773e02e2ab305e316123a1064fc1905402" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791703945216, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\msls31.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290257535, + "hash": { + "imphash": "bf738a2fc0ab0601eea36f35e4cbcd27", + "md5": "0bee002c68e28ce6da161dcf1376d7d7", + "sha1": "d5cc3bec12c801e11217acc6927e1e6e401fe208", + "sha256": "1d4ee0b9ce22d139478008d5591b8c9f027c235cba601f95a96547cf98159d4b" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791631134720, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\authui.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258007, + "hash": { + "imphash": "76801e47683b36a4115dbe046717edbe", + "md5": "b3bfbd758506ecb50c5804aaa76318f9", + "sha1": "bf6c922467347a6690eb19c5e82be09b3295778b", + "sha256": "34e079a6ab2d41d1e0b3887b6ae31c43941061b7176fff2801c3f465c2c89578" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791630020608, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\CRYPTUI.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290257999, + "hash": { + "imphash": "04534d8dae5ab230b9bee9b1b0b2829d", + "md5": "3f9f2afa135f0663946a006dd5ffd897", + "sha1": "ea6456859b04b68af8dcd453381dd168af53fc5e", + "sha256": "276d1c9c78c529625c2ef3d77079324628686ea184767971901a1de93681c133" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791760896000, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\CRYPT32.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258373, + "hash": { + "imphash": "2e50bc5d9fe777770c8a6b2cfaf6b2e9", + "md5": "884415bd4269c02eaf8e2613bf85500d", + "sha1": "c3a64f05c210b38c69d8f1fc1d74a71b56ada30c", + "sha256": "efe771709ec942694fd206ac8d0a48ed7dcd35036f074268e4aecd68ac982cea" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791759060992, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\MSASN1.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258922, + "hash": { + "imphash": "75124ca243f494ff6127697f3ebc418a", + "md5": "5fada8b707318e1bd63a7e2b81e6c8cb", + "sha1": "c5ad1c9bbc2f565237a144b9cf44711dfcf65ea5", + "sha256": "2590e88cab52fcc1b24cb262d293131c6280a5f234e0c130e77aa8697efa3b5f" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791793401856, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\urlmon.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258980, + "hash": { + "imphash": "248b27a31ddf696c2e3bfe6aed9c3eba", + "md5": "f6c5302e1f4813d552f41a0ac82455e5", + "sha1": "f0ec3ad7e90f559d1bc9b8849cf5668cafba2031", + "sha256": "e3ebf44621efc6381baae0f0efc13c356dcb6ee31bb258137edb3cc3e18549b5" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791786455040, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\WININET.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258097, + "hash": { + "imphash": "f6db6123d8a383f58cf318d00d2e7d1d", + "md5": "5180380d353277d395d3b36d790aa93e", + "sha1": "d5622ec5d922233867422d1e143969e226bb9a1c", + "sha256": "89b894eccf65704d00d30ea3bd45b184bfab8345b779f9ae2be66b9fc7226f72" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791780032512, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\iertutil.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "07/13/2009 19:17" + }, + "more_info_link": "http://www.microsoft.com/windows", + "program_name": "Windows System Catalog", + "publisher_link": "" + }, + "compile_time": 1247535234, + "hash": { + "imphash": "13ecfa3a285149680a7a4b174c8b8f5b", + "md5": "94e026870a55aaeaff7853c1754091e9", + "sha1": "a4f845318e095d841b05e1400747ee4c28e1f28e", + "sha256": "b2f5d5629d12bdfa98dbed3898368f37d9009c7531b6909c7285a2c11c9a0f93" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791743004672, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\VERSION.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290259004, + "hash": { + "imphash": "da0bcac0c5f9dc653d00eecd5fb1c801", + "md5": "0d9764d58c5efd672b7184854b152e5e", + "sha1": "99d78db040987c69b6a70a42af86641ba0413956", + "sha256": "9827b43dabbec39ab2e2294408d9c5304ef27a684903c5234c6070387723d49e" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791758209024, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\WINSTA.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "07/13/2009 19:17" + }, + "more_info_link": "http://www.microsoft.com/windows", + "program_name": "Windows System Catalog", + "publisher_link": "" + }, + "compile_time": 1247535280, + "hash": { + "imphash": "af1203c1d6d810c97729856780869b12", + "md5": "ef2ae43bcd46abb13fc3e5b2b1935c73", + "sha1": "c53e005cd04d99331ce3114ac119256133202313", + "sha256": "81fc06f306f620845d7dd8d06e706309e70bc89b589c81f3478302a3f5f73431" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791683301376, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\WINMM.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258936, + "hash": { + "imphash": "7e9874f9ecf2191b91f9a4dfa37f2ba1", + "md5": "1473768973453de50dc738c2955fc4dd", + "sha1": "7b046f6070844e3bc7deae115a1dfe5825030513", + "sha256": "14bc5da2442cb726acc1f277ddbeccf5d61e3a0a3e083a55a0bb610191e35220" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791648239616, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\wdmaud.drv", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "07/13/2009 19:17" + }, + "more_info_link": "http://www.microsoft.com/windows", + "program_name": "Windows System Catalog", + "publisher_link": "" + }, + "compile_time": 1247535081, + "hash": { + "imphash": "086996ef0b01a463f114deb5244861b9", + "md5": "8560fffc8eb3a806dcd4f82252cfc8c6", + "sha1": "7562bbb63b0db6e4986ebdb86495c4fe284a1eaa", + "sha256": "cc27bc092369a89d6147b16568fedeb68b584d5738cd686c31f7fae22ed17b3b" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 1968373760, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\ksuser.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "07/13/2009 19:17" + }, + "more_info_link": "http://www.microsoft.com/windows", + "program_name": "Windows System Catalog", + "publisher_link": "" + }, + "compile_time": 1247534742, + "hash": { + "imphash": "690cce63d22e22d9aa225c4a9290b2c4", + "md5": "78a1e65207484b7f8d3217507745f47c", + "sha1": "3542a591e9c97b48739f69e2a193dff461ea097c", + "sha256": "35f413adb9d157f3666dd15dd58104d629cd9143198a1ab914b73a4a3c9903dd" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791718625280, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\AVRT.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290257517, + "hash": { + "imphash": "64661addcde8896487dcc7cd32a4eda9", + "md5": "dc220ae6f64819099f7ebd6f137e32e7", + "sha1": "5707f15b666c7d3b07dfce9dac665a2e45c39113", + "sha256": "b8fe13b859fa83500dd95637fa6d4a5b8392c2a363e41d014d3b5374f636e1de" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791659118592, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\AUDIOSES.DLL", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 04 ca 69 00 00 00 00 00 08 ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "07/13/2009 19:17" + }, + "more_info_link": "http://www.microsoft.com/windows", + "program_name": "Windows System Catalog", + "publisher_link": "" + }, + "compile_time": 1247534992, + "hash": { + "imphash": "3bf8d3fd03f9d07b7821df4b1da2be9d", + "md5": "1b7c3a37362c7b2890168c5fc61c8d9b", + "sha1": "78ba8d596c0ac4c38acb498416957891570a2a1d", + "sha256": "03727930e5bb5f9d91bab901fc9a2e3b795d68e2aee6a2cc3477f356c45a9c54" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791728062464, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\msacm32.drv", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "07/13/2009 19:17" + }, + "more_info_link": "http://www.microsoft.com/windows", + "program_name": "Windows System Catalog", + "publisher_link": "" + }, + "compile_time": 1247534991, + "hash": { + "imphash": "9611d7fd4fe3c571fbf1db3d718ba82c", + "md5": "10ac5ce9f78dc281a1bbd9b8cc587b8a", + "sha1": "207582f9d9bec00a932fba886d575ee5b6502d42", + "sha256": "72288c0a88916d3c3828dbd948dbdb0928f26106319f8e60102d6c9004514d60" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791716659200, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\MSACM32.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 04 ca 69 00 00 00 00 00 08 ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "07/13/2009 19:17" + }, + "more_info_link": "http://www.microsoft.com/windows", + "program_name": "Windows System Catalog", + "publisher_link": "" + }, + "compile_time": 1247535038, + "hash": { + "imphash": "5a8ee2f48e79ef6ac4b33366d6642b50", + "md5": "ca2a0750ed830678997695ff61b04c30", + "sha1": "a27df990dde73e72bb02105f8af689a1ac324e59", + "sha256": "e84860cd97aa3c4565abb2d5d406a5c42b1ad2d8ba1b8cf81fe564d91f15f976" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791727996928, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\midimap.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 04 b3 f5 00 00 00 00 00 0d ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 07:10" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1247535256, + "hash": { + "imphash": "04a5e982c134477b1914ebcd7b6436d0", + "md5": "d6f630c1fd7f436316093ae500363b19", + "sha1": "197897b74f411040ba7df41a5bd3c1030661b904", + "sha256": "73a94b4938430396ea4240b1a6676b4e6c19cfaf8c52efb9a69b4b2175a86307" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791727734784, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\XmlLite.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258889, + "hash": { + "imphash": "8181b1ef70ff3d29984db497f92a2662", + "md5": "c3761661c17c2248a9379a8fb89e3de1", + "sha1": "d2ea41e02bbaa77f8b93b09277596a34cdae8853", + "sha256": "ce3477fa2b4058eb80739e0161fe957545f13cf86d313f6422732901d35f75f2" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791617568768, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\stobject.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290257641, + "hash": { + "imphash": "fbe995ff97475c5aa2777a4bc493d4b1", + "md5": "f832eeea97cdda1af577e721f652a0d1", + "sha1": "48f227a1e10d49edf56e3559e05c871bc285c199", + "sha256": "ebbb7ca199ba4df231123922bd310d43de0104c6185b70fe0281b938d5336f2e" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791616782336, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\BatMeter.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "07/13/2009 19:17" + }, + "more_info_link": "http://www.microsoft.com/windows", + "program_name": "Windows System Catalog", + "publisher_link": "" + }, + "compile_time": 1247535260, + "hash": { + "imphash": "5d8fff13bf206e589cae241fc7f4d464", + "md5": "bd3674be7fc9d8d3732c83e8499576ed", + "sha1": "cb96190d6366e11dd6e6b48f4cdc4332015cfa67", + "sha256": "e6716a5895d629263a4d21959f48840429ab6f4b55a5fa2663ee5e86c9ca2bf1" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791727538176, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\WTSAPI32.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290259008, + "hash": { + "imphash": "b2ecd39ae0055d9e1b8aa5bc78942cba", + "md5": "eb3f9c2de1236b5d46b2291d82970e43", + "sha1": "0ce9ddc1063256ab571b916389321fd7f572ddc0", + "sha256": "8a43d335f3d573bed98af54bb51e82546c2acc025da8a48d801213eb14e9d5d4" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791759781888, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\WINTRUST.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 04 ca 69 00 00 00 00 00 08 ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "07/13/2009 19:17" + }, + "more_info_link": "http://www.microsoft.com/windows", + "program_name": "Windows System Catalog", + "publisher_link": "" + }, + "compile_time": 1247534970, + "hash": { + "imphash": "8accd78cb7feca81ac448f0485be30dc", + "md5": "4166f82be4d24938977dd1746be9b8a0", + "sha1": "5174036d781677f5444d9a23079baf18f4bbda44", + "sha256": "24121751b7306225ad1c808442d7b030def377e9316aa0a3c5c7460e87317881" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791730159616, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\es.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290257970, + "hash": { + "imphash": "8c20d7b93902b8c193a7fc1b4b58e9aa", + "md5": "42a9cb6906d9a8bedc83b57163e62924", + "sha1": "50e5592460d91205e912d55f60a2dd3cc4da4329", + "sha256": "e18522d3137653140757829efbfce624a5baa5842e2bba10b9e5ab6c84be49e1" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791614619648, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\dxp.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258826, + "hash": { + "imphash": "1df61af51096e9bbbdc1834405984e4c", + "md5": "2d2a6ec8ead30ec3ace2fd6fb1b3e122", + "sha1": "1e77948378474e155307d290b998994f720206bf", + "sha256": "e7ea375a3bde8fc764cb09524344370b9ee25f98ad6c83e6f37a569eb8d277d6" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791614160896, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\prnfldr.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290259000, + "hash": { + "imphash": "2f59265cb3df847423b60921203365be", + "md5": "0015acfbbdd164a8a730009908868ca7", + "sha1": "671c084513461900550bd49d3dccb58bdbe05adf", + "sha256": "e1ff243ad2cf959fab81efe701592414991c03416ff296adc93906e76b707c4d" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791654924288, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\WINSPOOL.DRV", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 04 ca 69 00 00 00 00 00 08 ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "07/13/2009 19:17" + }, + "more_info_link": "http://www.microsoft.com/windows", + "program_name": "Windows System Catalog", + "publisher_link": "" + }, + "compile_time": 1247535225, + "hash": { + "imphash": "3d49b728c9125f451e7f2f215e9d3bbb", + "md5": "2bc7c9fd0a9f2c9afc373f3ad1ee3891", + "sha1": "1b7c6960a72509d1f408022d791c6a65acb2a75d", + "sha256": "0a82a475301202791a7c10f978f952eab7db146a702d4ea67e24e2c98bc19638" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791648108544, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\Syncreg.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258789, + "hash": { + "imphash": "c5c69e7d20ca382ddbc49947d651a8e7", + "md5": "10f815be90a66aafc6c713d1bd626064", + "sha1": "3e21f173a6bcdf629c442d89abadc48137c61bb2", + "sha256": "01139fc04bc53594296f6a0e16b8d20b940f64bc8119fe7705c03c4947958f39" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791612325888, + "mapped_size": 0, + "path": "C:\\Windows\\System32\\pnidui.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258791, + "hash": { + "imphash": "6437e4761b1278fdecf142a679216f7b", + "md5": "b9f0a4020aa98b7a20287bf7fe99a1fd", + "sha1": "1f28ac7493ce972b45de191780a190504d1d0c44", + "sha256": "21138f161eeea46198890c7a2d073f2c82829e15676131bdad9f237edc7477cd" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791612194816, + "mapped_size": 0, + "path": "C:\\Windows\\System32\\QUtil.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "07/13/2009 19:17" + }, + "more_info_link": "http://www.microsoft.com/windows", + "program_name": "Windows System Catalog", + "publisher_link": "" + }, + "compile_time": 1247535239, + "hash": { + "imphash": "deeb658dae29d8df1c8dbb08f06801b0", + "md5": "3c073b0c596a0af84933e7406766b040", + "sha1": "06185554c38353211430f5f075c490558e46fb3d", + "sha256": "4698bba678f553e15ad4b07ad7fb236281f872defee97bfd637114476c8f97b3" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791752769536, + "mapped_size": 0, + "path": "C:\\Windows\\System32\\wevtapi.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258586, + "hash": { + "imphash": "97bb6eee9e1ea3e5751077b655b54de5", + "md5": "a42f2c1eb3b66c54fb3c7b79d30c1a6d", + "sha1": "cee705de8d3dfcc9e2a14e0249d6be61fcd54a18", + "sha256": "a63836db3b01835dc1311526a95198d6ebccb1dc9ddafbc38ec36c128cdb98b9" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791609507840, + "mapped_size": 0, + "path": "C:\\Windows\\System32\\netshell.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258138, + "hash": { + "imphash": "0bc508389b6b5577cf3cca214ca523a7", + "md5": "2b81776da02017a37fe26c662827470e", + "sha1": "8c85389640bea73a009d83079f8b4c963697035f", + "sha256": "a656353c50ee08422145d00db9cfd9f6d3e664753b3c454b171e2a56a8aa94dc" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791727210496, + "mapped_size": 0, + "path": "C:\\Windows\\System32\\IPHLPAPI.DLL", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "07/13/2009 19:17" + }, + "more_info_link": "http://www.microsoft.com/windows", + "program_name": "Windows System Catalog", + "publisher_link": "" + }, + "compile_time": 1247535145, + "hash": { + "imphash": "579f52f57e43aa6ff0d07e88af5d0ff5", + "md5": "044fe45ffd6ad40e3bbbe60b7f41babe", + "sha1": "94233c0d4169c02c85514adb1f05cd3298c87f43", + "sha256": "a1688a5e6e0f7037c850699462c2655006a7d873c97f9ab406c59d81749b6f09" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791763648512, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\NSI.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "07/13/2009 19:17" + }, + "more_info_link": "http://www.microsoft.com/windows", + "program_name": "Windows System Catalog", + "publisher_link": "" + }, + "compile_time": 1247535281, + "hash": { + "imphash": "e710d6d30f2346e7cd91c89ec3b602d9", + "md5": "4c9210e8f4e052f6a4eb87716da0c24c", + "sha1": "d4fa50aded12eb162478d7606f1270b78dd1a44b", + "sha256": "460f7990bdadb7d58d6dc95b094d30a2efdc4ceed444b18a2f36e8d9076fb8b9" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791726948352, + "mapped_size": 0, + "path": "C:\\Windows\\System32\\WINNSI.DLL", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258583, + "hash": { + "imphash": "7e01da4b2a8806d2944a3ff2e271958f", + "md5": "2df36f15b2bc1571a6a542a3c2107920", + "sha1": "660a44b660d8e57ef7d7efbbc006ac390a7901fa", + "sha256": "a918f1ee95269df973421af2f5713deeaf15ef0f77baa7e8c515ffb69896fb7a" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791735992320, + "mapped_size": 0, + "path": "C:\\Windows\\System32\\nlaapi.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "07/13/2009 19:17" + }, + "more_info_link": "http://www.microsoft.com/windows", + "program_name": "Windows System Catalog", + "publisher_link": "" + }, + "compile_time": 1247534791, + "hash": { + "imphash": "59b31e42f8fae7b5809ba7fcae732e0c", + "md5": "4cbcc37856ea2039c27a2fb661dda0e5", + "sha1": "cc666108d34168420a1d1942dda1e090154c7296", + "sha256": "74cbfab3092a9564bddfcb84db3e3f8bcfd1492938adf187423d3355d73d21c6" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791723999232, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\dhcpcsvc6.DLL", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258981, + "hash": { + "imphash": "1ec347d133df2fe4da3e5f8944caeae8", + "md5": "4bbfa57f594f7e8a8edc8f377184c3f0", + "sha1": "d48aafa576b40a5e386e609bba1010472551154a", + "sha256": "9f3ac5dea5a6250c3dbb97af79c81c0a48429486521f807355a1d7d3d861b75f" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791788486656, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\WS2_32.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:35" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290257492, + "hash": { + "imphash": "f5d0254c5435291634c8b7357aa536bd", + "md5": "92dbf0a4c9239169010fc6e07859c82e", + "sha1": "634d8c12de82c422dfeba8f9a5fa84d03b7bcd35", + "sha256": "00fb2cf4420f0ffef519afe732a708cf249640121e2a891caa164313abd7f804" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791608655872, + "mapped_size": 0, + "path": "C:\\Windows\\System32\\Actioncenter.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "07/13/2009 19:17" + }, + "more_info_link": "http://www.microsoft.com/windows", + "program_name": "Windows System Catalog", + "publisher_link": "" + }, + "compile_time": 1247534790, + "hash": { + "imphash": "f17020f0f66b64fbdf51c75b43f3729d", + "md5": "f568f7c08458d69e4fcd8675bbb107e4", + "sha1": "c1e05f0255a6f386711044b11e2d04dfd328b26a", + "sha256": "a5fa25ecf248999a68ccecfbb508bfa1add18a23e20a9a9081a87c41caaa36c0" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791723868160, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\dhcpcsvc.DLL", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290257996, + "hash": { + "imphash": "eb1c8dd21e1f92a8be35a76b165ce8da", + "md5": "52d3d5e3586988d4d9e34acaac33105c", + "sha1": "2c20246d2c45fb6e8976b37ad62465f5f4255f2b", + "sha256": "c61b60ba962b25b8334f0941c3535ea4aca1cc060b8a196e396ca3e11ceef8a1" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791746412544, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\credssp.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258110, + "hash": { + "imphash": "9ba63732839305b29ebe539451171b45", + "md5": "8130391f82d52d36c0441f714136957f", + "sha1": "e2bb102565986a42d0a43bd3f337f94dbe54eead", + "sha256": "1fd4fee7caf63e450f27729e07ea2a2f09288629fd872dbb6e8710b16d8dbd5d" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791608131584, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\imapi2.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258038, + "hash": { + "imphash": "e070eff3751fea77ccd424469a9a07e6", + "md5": "6a5c1a8ac0b572679361026d0e900420", + "sha1": "fd9241fdda4b9d08ff1e205f9d5f78923ab884d8", + "sha256": "b5e693b48b462e97738a3d4e58b60846159649eb15f4d11074b4bc107cc88562" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791607345152, + "mapped_size": 0, + "path": "C:\\Windows\\System32\\hgcpl.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 04 ca 69 00 00 00 00 00 08 ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "07/13/2009 19:17" + }, + "more_info_link": "http://www.microsoft.com/windows", + "program_name": "Windows System Catalog", + "publisher_link": "" + }, + "compile_time": 1247535139, + "hash": { + "imphash": "1e00eab90042e5099339cb82841b434a", + "md5": "f7073c962c4fb7c415565dde109de49f", + "sha1": "671c2e910ff954700b3a1f80608423697895c0a9", + "sha256": "781e7088dcefbc34a808c3e7da41a56112b3f23abe9f54b5ef4d5cd9cd016b1d" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791680090112, + "mapped_size": 0, + "path": "C:\\Windows\\System32\\npmproxy.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258777, + "hash": { + "imphash": "d402ebf00a5cffa66b6682780c262457", + "md5": "6b851e682a36453e1b1ee297ffb6e2ab", + "sha1": "3dc85ba13d1f720e8039865817bcc65dc0f1d35b", + "sha256": "a641d3fd9463c4788b45b8b5584ea4489c1f63a71b4b595ae85ff3482cd5eda6" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791606099968, + "mapped_size": 0, + "path": "C:\\Windows\\System32\\QAgent.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "07/13/2009 19:17" + }, + "more_info_link": "http://www.microsoft.com/windows", + "program_name": "Windows System Catalog", + "publisher_link": "" + }, + "compile_time": 1247534818, + "hash": { + "imphash": "09bf801b36364c598a2a8fdff079932c", + "md5": "cd1b5ad07e5f7fef30e055dcc9e96180", + "sha1": "4e835fdadd0c67fde44e385f69a1014d6ad11f4f", + "sha256": "63c58551f32b0b09377f64a6ae1fa81af93b8a707a57a8c18722086906ad3046" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791745167360, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\DEVRTL.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258413, + "hash": { + "imphash": "08a9b8e4e42e5520be662b4663289747", + "md5": "1eac1a8ca6874bf5b15e2efb9a9a7b86", + "sha1": "30cff16f17833aa042d8b6cc32d86c4a39c77c67", + "sha256": "e15ed4fefc3010c213694331ddfdc03767682325c898d773ab243e2dc8b08461" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791633100800, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\MsftEdit.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258939, + "hash": { + "imphash": "6ac24d44010fe2db4d5e9e0651b7a3cf", + "md5": "f9959237f106f2b2609e61a290c0652e", + "sha1": "7f7c92c4fe8244a7deac7fed4d5576042bfba29e", + "sha256": "fccc12e5aae1773bf87b1c4bce71d017db1a5a7ac189559058ea1ecc72075a82" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791628709888, + "mapped_size": 0, + "path": "C:\\Windows\\System32\\werconcpl.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "07/13/2009 19:17" + }, + "more_info_link": "http://www.microsoft.com/windows", + "program_name": "Windows System Catalog", + "publisher_link": "" + }, + "compile_time": 1247535233, + "hash": { + "imphash": "cce75846cdf9d74f85e44fc728ee8440", + "md5": "9689a9c7f7c2a1a423cda2c3b43fff65", + "sha1": "ebe6b3066634239a4f62780a8a6e27f33b0afc87", + "sha256": "914ad22d98975578bc14d821f72e8dfce24f2092f9c299d24ebbaf5408fe8b8b" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791646994432, + "mapped_size": 0, + "path": "C:\\Windows\\System32\\wer.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290257998, + "hash": { + "imphash": "6e52c6bdbfd3d257064382284bd4f59c", + "md5": "1484b9ebf567346582de571b0e164ae0", + "sha1": "6b87eb7005fe659f976732307fe12b96747dfc8d", + "sha256": "9862bf22b2e32dabe7a82acee5b4ea1f0a93bdc3c71b20a6a4e568cccd76a7a6" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791628382208, + "mapped_size": 0, + "path": "C:\\Windows\\System32\\framedynos.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 04 ca 69 00 00 00 00 00 08 ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "07/13/2009 19:17" + }, + "more_info_link": "http://www.microsoft.com/windows", + "program_name": "Windows System Catalog", + "publisher_link": "" + }, + "compile_time": 1247535235, + "hash": { + "imphash": "64b92457c7762d63f903189058d583ca", + "md5": "7e591867422dc788b9e5bd337a669a08", + "sha1": "3bd1b2a2271d6756351d9b4876193efd8a845da0", + "sha256": "484e6bccdf7adce9a1aacad1bc7c7d7694b9e40fa90d94b14d80c607784f6c75" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791628251136, + "mapped_size": 0, + "path": "C:\\Windows\\System32\\wercplsupport.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258497, + "hash": { + "imphash": "2814c7c81c59e8a913c288a8c72a9c1c", + "md5": "5c29199c9f0ede64f17f268084ec4392", + "sha1": "a767e893427f9b24fe06cbb3a155dd54162a402a", + "sha256": "ea9fd588a8c89399dd287399a912b356a4234cfe418239b227d255749f5ddde2" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791652564992, + "mapped_size": 0, + "path": "C:\\Windows\\System32\\msxml6.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:35" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1247534858, + "hash": { + "imphash": "2ab209fb6a68c8e15483324a442c1c4c", + "md5": "809ae7d4ace06bbcf621e5c504bf6fc8", + "sha1": "c0e2202d99db67a9efa6c67226410ad3c7b657a6", + "sha256": "0baab89fb57468f27446947d75cbd6ddfc92d9b8f040144a12656803b2f7bf65" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791722491904, + "mapped_size": 0, + "path": "C:\\Windows\\System32\\hcproviders.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 04 b3 f5 00 00 00 00 00 0d ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:36" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258095, + "hash": { + "imphash": "328b1cd6b239c7c01904019379bede4b", + "md5": "77a8a1791145710c7efe76ea82bf0763", + "sha1": "e421318d7b6d66c9214722c736f5b3d4207acf74", + "sha256": "9488b96e065299d273f9dcc82aa1203b48f0038d4f27324da19e9bfd925ca737" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791627726848, + "mapped_size": 0, + "path": "C:\\Program Files\\Internet Explorer\\ieproxy.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258892, + "hash": { + "imphash": "ec50511b4e46da8b1a467667a84f8047", + "md5": "9cead32e79a62150fe9f8557e58e008b", + "sha1": "4cbd17b96209b5e2da683382e05cef55f48d6107", + "sha256": "afe4c1725ee94d7de0749ae1495a4e5cc33c369f29b2a589da66ffe27ff9777e" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791757357056, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\SXS.DLL", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258896, + "hash": { + "imphash": "d75a096a9c47b1fd385a268e9c6f2f68", + "md5": "24f4b480f335a6c724af352253c5d98b", + "sha1": "a388cc90338cec7b5eec66e921599de0cc275a2b", + "sha256": "011413b236cad7b78ce0a0eec3e3085d48c7576a3205d025ba6ebfdf590538e4" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791660232704, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\thumbcache.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "07/13/2009 19:17" + }, + "more_info_link": "http://www.microsoft.com/windows", + "program_name": "Windows System Catalog", + "publisher_link": "" + }, + "compile_time": 1247527581, + "hash": { + "imphash": "be693a67b5b884d7609eaf574ba00955", + "md5": "d87e1e59c73c1f98d5ded5b3850c40f5", + "sha1": "141c0ebecdd2733b90431f18b188ee0b64456268", + "sha256": "536419bff9f877d4314b5d0c045d9a6e729489c389863fadf07e382050bc84fd" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 2009726976, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\PSAPI.DLL", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 04 b3 f5 00 00 00 00 00 0d ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:36" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258093, + "hash": { + "imphash": "39d5c5468a8e87803234025334b9dc09", + "md5": "f1115299b9f4c983bc4523b33e3a506c", + "sha1": "639946c23b630798284a92117882990ea31d702e", + "sha256": "01a1d8b3e5cf727f92f4a43d5c5f81022127d58a850d29d3f084ad411efbc9dd" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791578836992, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\ieframe.DLL", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "07/13/2009 19:17" + }, + "more_info_link": "http://www.microsoft.com/windows", + "program_name": "Windows System Catalog", + "publisher_link": "" + }, + "compile_time": 1247535131, + "hash": { + "imphash": "84786d42c8a896b9a971b3c9eb8feb4c", + "md5": "9869a4a10b90546dbd56947839fb4b87", + "sha1": "5d9642f314d62dc5834cbd7950230bad3f85d982", + "sha256": "66c84dcf39d9f6896d55b1623184a028891a0a98abe6044de1d4bad60c3c8d72" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791591157760, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\OLEACC.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258887, + "hash": { + "imphash": "e6c083bfcedd032db2c66cd04f74c620", + "md5": "4e81439902079c348b61d7ff027fe147", + "sha1": "4386a5580b459aa4a0701addb753c3f9bf3da6f7", + "sha256": "e652c9ec77745504689532b3c394959f9b5bc29e9c008cb9ee09cda818514fa9" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791658594304, + "mapped_size": 0, + "path": "C:\\Windows\\System32\\StructuredQuery.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258589, + "hash": { + "imphash": "45badcf3f18f69f9f72af5245898d1cb", + "md5": "405f4d32d2185f1f1bd753d8eeaffb3a", + "sha1": "68bc45bac1e1584c789a6b3134bee5a2540f3e56", + "sha256": "cac42c3e09c43be96592b670d70821386014db22d8239a9cfb9e33e54fb5c3d5" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791656890368, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\NetworkExplorer.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258495, + "hash": { + "imphash": "cdb39fb77293fb1bb86c2d5980ea8e88", + "md5": "022b05cee68d7826a93aedb4f1eb369e", + "sha1": "e7055d6cacb8c3fae06dc10ad480c8e6b8b7b592", + "sha256": "3b864d1471ed0949b02f1fa251b987185abeaddcbecd44efdbb6a7b7f03ca8bc" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791625760768, + "mapped_size": 0, + "path": "C:\\Windows\\System32\\msxml3.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258914, + "hash": { + "imphash": "6b6c83729fa36b04c301494d1eb07752", + "md5": "bb074f35b49eb2ea416962b596281e1e", + "sha1": "355fdb9e66ffad42144b1b6ec4d8eb357ed05d52", + "sha256": "e07208204b9616027e5144e2f3ef1ba81168365b7d2a761210b0fbc65b97871e" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791623598080, + "mapped_size": 0, + "path": "C:\\Windows\\System32\\systemcpl.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258594, + "hash": { + "imphash": "2bd8f9f72a13c2803ac3d34b805130b9", + "md5": "764908fe1fa96f93c95b1b67a0fced29", + "sha1": "88d0027e5d10158e3678d9eb2326779fef8a64d1", + "sha256": "26ef25ab307903c5e806a8cc3b750a491049e5d1225ceddfce64dd51aa6f592b" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791722557440, + "mapped_size": 0, + "path": "C:\\Windows\\System32\\NETAPI32.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290259010, + "hash": { + "imphash": "6ad99a405bde55d6a18debafd3f5e5c5", + "md5": "3c91392d448f6e5d525a85b7550d8ba9", + "sha1": "b62eaf7d80617e136a8f3c9161c23464e6f2a171", + "sha256": "6fd0dc73dbe7519e2c643554c2a7f8fbe4f9a678c4241bb54b3c6e65d2abcf3a" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791722295296, + "mapped_size": 0, + "path": "C:\\Windows\\System32\\wkscli.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "07/13/2009 19:17" + }, + "more_info_link": "http://www.microsoft.com/windows", + "program_name": "Windows System Catalog", + "publisher_link": "" + }, + "compile_time": 1247534877, + "hash": { + "imphash": "3e340766bf7f54e3e9746a945d4dcb71", + "md5": "a77be7cb3222b4fb0ac6c71d1c2698d4", + "sha1": "e68b4e0058fb130c765e5aa98af36e26563809db", + "sha256": "73566223914bf670df6b5931fa213e546713531b10391ed65b5256bbd7abde7f" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791735926784, + "mapped_size": 0, + "path": "C:\\Windows\\System32\\DSROLE.DLL", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258758, + "hash": { + "imphash": "c888173aa662e52d4b6194ed15819a13", + "md5": "db76db15efc6e4d1153a6c5bc895948d", + "sha1": "00dc6172c4507def32e4a269c08e76ab09abc3fe", + "sha256": "71ddf02c7ee2df66a08f1a2a08da39802c354624880a2be93a706ea7476422a3" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791690641408, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\SPPC.DLL", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 04 b3 f5 00 00 00 00 00 0d ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 07:10" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1247535243, + "hash": { + "imphash": "9484a9d0a0e3ef20592c9f66412400a6", + "md5": "666a60f6f5e719856ff6254e0966eff7", + "sha1": "10258e708443bd21997e7a977b5ee36bd758e368", + "sha256": "58c072e7e215991e19c1ca062c476081982f7b9f039714539ae7feb4981c200f" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791716200448, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\wbem\\wbemprox.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 04 b3 f5 00 00 00 00 00 0d ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 07:10" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258938, + "hash": { + "imphash": "03a62984ba62616e18740e69949df533", + "md5": "7db5aa22a8a8e5c2d335f44853c1f6de", + "sha1": "add6f6e2b6df5f571d06db724de5c7badad4e775", + "sha256": "a734a20357026c42950394682a52cbc3af956d09f1949e1b4e95467e999bc428" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791690051584, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\wbemcomn.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 04 ca 69 00 00 00 00 00 08 ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "07/13/2009 19:17" + }, + "more_info_link": "http://www.microsoft.com/windows", + "program_name": "Windows System Catalog", + "publisher_link": "" + }, + "compile_time": 1247535244, + "hash": { + "imphash": "6178a249d43f815225b0a9205f1f4f70", + "md5": "718b6f51ab7f6fe2988a36868f9ad3ab", + "sha1": "7cc84a20d6597f58eebabea5489d72239c6e746b", + "sha256": "76141b4e94c2766e2c34cef523092948771a7893212efadbe88d2171b85ff012" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791683170304, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\wbem\\wbemsvc.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 04 b3 f5 00 00 00 00 00 0d ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 07:10" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1247534846, + "hash": { + "imphash": "c93ca8ec08e734d1b95c2a2d28884c47", + "md5": "a3f5e8ec1316c3e2562b82694a251c9e", + "sha1": "f0cdc2b44e609950ee97d9967c7459055a2af1a8", + "sha256": "f3dc6aa6a9d3b5bbc730668fc52c1d4bb5d515d404578bddd3d4869a7ed58822" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791688675328, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\wbem\\fastprox.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 01 c6 c1 00 00 00 00 00 07 ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "07/13/2009 19:17" + }, + "more_info_link": "http://www.microsoft.com/windows", + "program_name": "Windows System Catalog", + "publisher_link": "" + }, + "compile_time": 1247535150, + "hash": { + "imphash": "29f9ce11d25836037034b49be93790c6", + "md5": "ee26d130808d16c0e417bbbed0451b34", + "sha1": "962d52fb4d8f9965c5fc11a98f2f9048a2a5d918", + "sha256": "4886dce4faef146a40babd492a8000a2022fea542a6135a9bafd4cd09297b4e5" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791688478720, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\NTDSAPI.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + }, + { + "architecture": "x64", + "authenticode": { + "cert_signer": { + "issuer_name": "Microsoft Windows Verification PCA", + "serial_number": "61 15 23 0f 00 00 00 00 00 0a ", + "subject_name": "Microsoft Windows" + }, + "cert_timestamp": { + "issuer_name": "Microsoft Time-Stamp PCA", + "serial_number": "61 03 dc f6 00 00 00 00 00 0c ", + "subject_name": "Microsoft Time-Stamp Service", + "timestamp_string": "11/20/2010 11:37" + }, + "more_info_link": "http://www.microsoft.com", + "program_name": "Microsoft Windows", + "publisher_link": "" + }, + "compile_time": 1290258103, + "hash": { + "imphash": "ba45ab39c8fb40e4076d27cf8e0f4180", + "md5": "b8509dcfcfd577f568be4026bfd982c0", + "sha1": "1923c5995faf94d9b1767aca04e3134a5cedc07a", + "sha256": "e3608e6de15c400fa437349e7295fef10a1a0213ca3b532a58964b8c89749110" + }, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 8791788355584, + "mapped_size": 0, + "path": "C:\\Windows\\system32\\imagehlp.dll", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted" + } + ], + "name": "explorer.exe", + "parent": { + "executable": "", + "name": "" + }, + "pid": 784, + "ppid": 704, + "sid": "S-1-5-21-2016385190-3414718578-1263322444-500", + "signature_signer": "Microsoft Windows", + "signature_status": "trusted", + "start": 1542341500, + "threads": [ + { + "entrypoint": 4279023504, + "id": 1920, + "start": 1542341500, + "uptime": 437 + }, + { + "entrypoint": 2008002240, + "id": 1812, + "start": 1542341500, + "uptime": 437 + }, + { + "entrypoint": 8791783440744, + "id": 2472, + "start": 1542341500, + "uptime": 436 + }, + { + "entrypoint": 8791792141832, + "id": 2468, + "start": 1542341500, + "uptime": 436 + }, + { + "entrypoint": 8791790810108, + "id": 2464, + "start": 1542341500, + "uptime": 436 + }, + { + "entrypoint": 8791792141832, + "id": 2476, + "start": 1542341500, + "uptime": 435 + }, + { + "entrypoint": 2008021952, + "id": 1800, + "start": 1542341500, + "uptime": 434 + }, + { + "entrypoint": 2008021952, + "id": 2516, + "start": 1542341500, + "uptime": 433 + }, + { + "entrypoint": 8791792141832, + "id": 2500, + "start": 1542341500, + "uptime": 433 + }, + { + "entrypoint": 8791792141832, + "id": 1068, + "start": 1542341500, + "uptime": 432 + }, + { + "entrypoint": 8791792141832, + "id": 2676, + "start": 1542341500, + "uptime": 428 + }, + { + "entrypoint": 8791792141832, + "id": 2660, + "start": 1542341500, + "uptime": 428 + }, + { + "entrypoint": 8791792141832, + "id": 2748, + "start": 1542341500, + "uptime": 428 + }, + { + "entrypoint": 8791729529348, + "id": 2636, + "start": 1542341500, + "uptime": 428 + }, + { + "entrypoint": 8791792141832, + "id": 2732, + "start": 1542341500, + "uptime": 424 + }, + { + "entrypoint": 8791783440744, + "id": 1472, + "start": 1542341500, + "uptime": 419 + }, + { + "entrypoint": 2008021952, + "id": 2220, + "start": 1542341500, + "uptime": 415 + }, + { + "entrypoint": 2008021952, + "id": 2332, + "start": 1542341800, + "uptime": 104 + }, + { + "entrypoint": 2008021952, + "id": 3712, + "start": 1542341800, + "uptime": 99 + }, + { + "entrypoint": 8791792141832, + "id": 2080, + "start": 1542341800, + "uptime": 85 + }, + { + "entrypoint": 2008021952, + "id": 4012, + "start": 1542341800, + "uptime": 81 + }, + { + "entrypoint": 2008021952, + "id": 4060, + "start": 1542341800, + "uptime": 81 + }, + { + "entrypoint": 2008021952, + "id": 520, + "start": 1542341800, + "uptime": 77 + }, + { + "entrypoint": 2008021952, + "id": 3236, + "start": 1542341800, + "uptime": 74 + }, + { + "entrypoint": 2008021952, + "id": 3260, + "start": 1542341800, + "uptime": 72 + }, + { + "entrypoint": 8791792141832, + "id": 3680, + "start": 1542341900, + "uptime": 56 + }, + { + "entrypoint": 2008021952, + "id": 3708, + "start": 1542341900, + "uptime": 55 + }, + { + "entrypoint": 2008021952, + "id": 2512, + "start": 1542341900, + "uptime": 55 + }, + { + "entrypoint": 8791792141832, + "id": 3748, + "start": 1542341900, + "uptime": 54 + }, + { + "entrypoint": 8791690668104, + "id": 3872, + "start": 1542341900, + "uptime": 51 + }, + { + "entrypoint": 8791683305488, + "id": 1016, + "start": 1542341900, + "uptime": 26 + }, + { + "entrypoint": 2008021952, + "id": 3520, + "start": 1542341900, + "uptime": 26 + }, + { + "entrypoint": 8791792141832, + "id": 3992, + "start": 1542341900, + "uptime": 13 + }, + { + "entrypoint": 8791760904360, + "id": 3604, + "start": 1542341900, + "uptime": 12 + } + ], + "token": { + "domain": "WIN-Q3DOP1UKA81", + "integrity_level": 12288, + "integrity_level_name": "high", + "privileges": [ + { + "description": "Adjust memory quotas for a process", + "enabled": false, + "name": "SeIncreaseQuotaPrivilege" + }, + { + "description": "Manage auditing and security log", + "enabled": false, + "name": "SeSecurityPrivilege" + }, + { + "description": "Take ownership of files or other objects", + "enabled": false, + "name": "SeTakeOwnershipPrivilege" + }, + { + "description": "Load and unload device drivers", + "enabled": false, + "name": "SeLoadDriverPrivilege" + }, + { + "description": "Profile system performance", + "enabled": false, + "name": "SeSystemProfilePrivilege" + }, + { + "description": "Change the system time", + "enabled": false, + "name": "SeSystemtimePrivilege" + }, + { + "description": "Profile single process", + "enabled": false, + "name": "SeProfileSingleProcessPrivilege" + }, + { + "description": "Increase scheduling priority", + "enabled": false, + "name": "SeIncreaseBasePriorityPrivilege" + }, + { + "description": "Create a pagefile", + "enabled": false, + "name": "SeCreatePagefilePrivilege" + }, + { + "description": "Back up files and directories", + "enabled": false, + "name": "SeBackupPrivilege" + }, + { + "description": "Restore files and directories", + "enabled": false, + "name": "SeRestorePrivilege" + }, + { + "description": "Shut down the system", + "enabled": false, + "name": "SeShutdownPrivilege" + }, + { + "description": "Debug programs", + "enabled": false, + "name": "SeDebugPrivilege" + }, + { + "description": "Modify firmware environment values", + "enabled": false, + "name": "SeSystemEnvironmentPrivilege" + }, + { + "description": "Bypass traverse checking", + "enabled": true, + "name": "SeChangeNotifyPrivilege" + }, + { + "description": "Force shutdown from a remote system", + "enabled": false, + "name": "SeRemoteShutdownPrivilege" + }, + { + "description": "Remove computer from docking station", + "enabled": false, + "name": "SeUndockPrivilege" + }, + { + "description": "Perform volume maintenance tasks", + "enabled": false, + "name": "SeManageVolumePrivilege" + }, + { + "description": "Impersonate a client after authentication", + "enabled": true, + "name": "SeImpersonatePrivilege" + }, + { + "description": "Create global objects", + "enabled": true, + "name": "SeCreateGlobalPrivilege" + }, + { + "description": "Increase a process working set", + "enabled": false, + "name": "SeIncreaseWorkingSetPrivilege" + }, + { + "description": "Change the time zone", + "enabled": false, + "name": "SeTimeZonePrivilege" + }, + { + "description": "Create symbolic links", + "enabled": false, + "name": "SeCreateSymbolicLinkPrivilege" + } + ], + "sid": "S-1-5-21-2016385190-3414718578-1263322444-500", + "type": "tokenPrimary", + "user": "Administrator" + }, + "unique_pid": 35, + "unique_ppid": 0, + "uptime": 437, + "user": "Administrator" + }, + "user": { + "group": {} + } + } + } + ], + "max_score": 1.0, + "total": { + "relation": "eq", + "value": 21 + } + }, + "timed_out": false, + "took": 2 +} diff --git a/x-pack/plugins/endpoint/server/test_data/all_alerts_data_legacy.json b/x-pack/plugins/endpoint/server/test_data/all_alerts_data_legacy.json new file mode 100644 index 0000000000000..3863baed387aa --- /dev/null +++ b/x-pack/plugins/endpoint/server/test_data/all_alerts_data_legacy.json @@ -0,0 +1,15 @@ +{ + "_shards": { + "failed": 0, + "skipped": 0, + "successful": 1, + "total": 1 + }, + "hits": { + "hits": [], + "max_score": 1.0, + "total": 21 + }, + "timed_out": false, + "took": 2 +} diff --git a/x-pack/plugins/endpoint/server/types.ts b/x-pack/plugins/endpoint/server/types.ts index f06cc10f16709..a0c9cd4b90266 100644 --- a/x-pack/plugins/endpoint/server/types.ts +++ b/x-pack/plugins/endpoint/server/types.ts @@ -6,7 +6,25 @@ import { LoggerFactory } from 'kibana/server'; import { EndpointConfigType } from './config'; +/** + * A JSON-like structure. + */ +export interface JSONish { + [key: string]: number | string | null | undefined | JSONish | JSONish[]; +} + +/** + * The context for Endpoint apps. + */ export interface EndpointAppContext { logFactory: LoggerFactory; config(): Promise; } + +/** + * Request params for alert queries. + */ +export interface AlertRequestParams { + page_index?: number; + page_size?: number; +} diff --git a/x-pack/test/api_integration/apis/endpoint/alerts.ts b/x-pack/test/api_integration/apis/endpoint/alerts.ts new file mode 100644 index 0000000000000..c08d17e96b180 --- /dev/null +++ b/x-pack/test/api_integration/apis/endpoint/alerts.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; + * you may not use this file except in compliance with the Elastic License. + */ +import expect from '@kbn/expect/expect.js'; +import { FtrProviderContext } from '../../ftr_provider_context'; + +export default function({ getService }: FtrProviderContext) { + const esArchiver = getService('esArchiver'); + const supertest = getService('supertest'); + describe('test alerts api', () => { + describe('Tests for alerts API', () => { + before(() => esArchiver.load('endpoint/alerts/api_feature')); + after(() => esArchiver.unload('endpoint/alerts/api_feature')); + it('alerts api should return one entry for each alert with default paging', async () => { + const { body } = await supertest + .post('/api/endpoint/alerts') + .set('kbn-xsrf', 'xxx') + .send({}) + .expect(200); + expect(body.total).to.eql(132); + expect(body.alerts.length).to.eql(10); + expect(body.request_page_size).to.eql(10); + expect(body.request_page_index).to.eql(0); + expect(body.result_from_index).to.eql(0); + }); + + it('alerts api should return page based on paging properties passed.', async () => { + const { body } = await supertest + .post('/api/endpoint/alerts') + .set('kbn-xsrf', 'xxx') + .send({ + page_size: 1, + page_index: 1, + }) + .expect(200); + expect(body.total).to.eql(132); + expect(body.alerts.length).to.eql(1); + expect(body.request_page_size).to.eql(1); + expect(body.request_page_index).to.eql(1); + expect(body.result_from_index).to.eql(1); + }); + + it('alerts api should return accurate total alerts if page index produces no result', async () => { + const { body } = await supertest + .get('/api/endpoint/alerts?page_size=100&page_index=3') + .set('kbn-xsrf', 'xxx') + .expect(200); + expect(body.total).to.eql(132); + expect(body.alerts.length).to.eql(0); + expect(body.request_page_size).to.eql(100); + expect(body.request_page_index).to.eql(3); + expect(body.result_from_index).to.eql(300); + }); + + it('alerts api should return 400 when paging properties are below boundaries.', async () => { + const { body } = await supertest + .get('/api/endpoint/alerts?page_size=0') + .set('kbn-xsrf', 'xxx') + .expect(400); + expect(body.message).to.contain('Value is [0] but it must be equal to or greater than [1]'); + }); + }); + }); +} diff --git a/x-pack/test/api_integration/apis/endpoint/index.ts b/x-pack/test/api_integration/apis/endpoint/index.ts index a3f0e828d7240..238c63640386a 100644 --- a/x-pack/test/api_integration/apis/endpoint/index.ts +++ b/x-pack/test/api_integration/apis/endpoint/index.ts @@ -8,7 +8,9 @@ import { FtrProviderContext } from '../../ftr_provider_context'; export default function endpointAPIIntegrationTests({ loadTestFile }: FtrProviderContext) { describe('Endpoint plugin', function() { + this.tags(['endpoint']); loadTestFile(require.resolve('./resolver')); loadTestFile(require.resolve('./endpoints')); + loadTestFile(require.resolve('./alerts')); }); } diff --git a/x-pack/test/functional/es_archives/endpoint/alerts/api_feature/data.json.gz b/x-pack/test/functional/es_archives/endpoint/alerts/api_feature/data.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..8d3c9fe5fd2338882d54e51800d9b58202ad6cb9 GIT binary patch literal 1997274 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%0AK`T>k3x{PXR~gDH4PuRpK0 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 C9|Ukj0tF=CjEy; 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

id2WA8{?#T6G6~r;R4~>!O9k>lHY$YCQeBzNZ!& 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

8DP)EA{SaGJYuj%=V1Gm%_DFE^Z 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

nOExMqK|A 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

)rr7poZAPadND^h9YTx*@**E>+KMU#LD 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Ξ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

l0g9X{QNg7c%IrJkHD@+yO0p?|u*q8#O5&?&o}E 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�+alZ|k~i7g9Eo`=1H?DjYB+?}WqL9d!?OI^iI9hD>nlMs;q@Rr+;t zH_q3Yj-;F63w3(OOlF6>-F~N6I;D0$=(N{Wu_zP+Mri=v~%XJ>GWy9H|~BoxNT_N-?$0JtDUbs z9YGg%!vWv3e9cRA#XqL-=%25+Ff9?)g zH}M|Oz3zg#@Zppc(>e`VAez3A=L=6q%8lK_Q75z7zx24@>q+PJ>T=VO?it0y`m~Ir zH}~4K@k&#I^j_|k6TYs4{Th+z(7{o6&^y>?Yp-(@_73lNbaZ?KUurC_LDbRUu<^+r!^G>}h<9T;LO$;e7`lh&w@{}Hdi$(}25jt&rg3ks zj~ANm9a`5s;_dA1_YX&GB#mXxz46|5s;j>qcMqAj4(ei4Ld`RaqjS{TJKU#Ewfsjc z2^%0CHlx4X>$W|!bKi|uo)T{EvxPM59h^Z?+UwTmE0ns)-_r+vy1hTSg)e=_RH1Wc zuNTAKuUO1Kd&b7=Esd9(vN`gdF?Ei6gR|R}M$<4z-k&YEL8Gagqt$}!oc0dxWs%gR zg^#?(RIm8(WIy)yx~WsM1%~%Gm^RMWTjk{@33};Y|96F8-!r;dodqZTu{dL=0e}B~ z7+f`09~}a+W1W|ydY6CQ^sV2& z^Wv}{*Y45Ipm%sRx#nW~&VJUv|NXCj|Lb4%fbXZzx_5lmkH)zE{o`l;nn(KW;o7Gq zH$Pln|L}5AY=7B=mGez{)IG@btsb<0^5pFG`5VLDA%ol{Ngn;b%gI00)nhzJ4VPS* zk65){3zVOWkX-Fdro|HlD4yty{z(iJp7>G}f$CVu zrJAr3?>f3|uy#9qLu|)O*77@CzBvqxOUXv>&ZUDEn=z2~xh8BzoKuG}FmnX(3`*nf zOu;}d!x!`7Z;>xK8L%Ks!BR7Re*)KTmRLaIFbZYo+UCOuC_pnmzDzF~UrItiNI6%C zs_$K#$}ErY&2xVqBdeTh;-Gh-THq06$t;pn*rIY$SvlS`3fux9TqLiE7lQ~FhniiT z7_O~~{l5Jtqs4M-MaD@80k(!bWh0)dq3y-|vZhD$-HYi9Wbd7iG_EbZhH1JdZraSu zx(g?rIqrr2Y8epoar)8SR{TKV6q4f&2-G_8+u*rKiO(J`GYPoudO6(#2^y9{usINm zBFL4ytxarzD{MQQ?MuF(W3aKpV?fwm`z!UYorXs9--GRHS5D6NlflBd%U=)8_57Yq zB?6B92#mdhs>b)X+pn9`^G7B3=Wd_YM{j)u09kh92BK-!GmXr>?hC^NsawA7|$&HWup;_xI~DL7P}~xZRK3I8vKg7_BYM&0P;f zbi7|YC35=o6EOvCRaXsF34MEeYfq=kj{!+3+}n5ak68d0S?48pSI-^0DwmhF?!2K( z4EuAT=b`DhuUW>+hn(te&dX}g*Lu79*O&FTjsS!Xg2#rGj@F;xlKtA$`Gjur*2zFY zP=aC4+r_FWQD$q>Vo=+BUjzq3|J?4#e$_w$9M=_omupKs`$zrrVpnLz+j#}Xz*JOF zk~DJgjMe;Pb|gj?zw9vuT7{ZS*QNAME2`muj) zqao^0fJ?k4M|7q45(D%h_H*xb}6<>DF4|{c6T|!id3eR^8mP zaO(W=90hD%mS`FrQ*~!fh-rRKjr^o}o^_A!myO=7lTP;aZr7!HY)M<3RkOP?9k}J@ zIo_SE?JjROuC&wOW zzjL*-@>U?gJ1BTAd7O2yv)jK;SiB$3uTT8<;KocrmwWy&>|( ztRj1B=N9)`B}l(K+;3t1)_1bA%3G;{7WMeL8PfkdSoE58`Ph~ieX$$TH;)TDF+ZN z%TDhF$Hrf)Axci2U%zv#FD_1625dZpHWKd!DvCyAvs#N7q+$v_>&-t}@H)P=ta

k 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�yU8@qlKSKF1)kU`P6ht zPT5V$d<4O;9#@V;?pwqU8>jPUceDWb;8W`zYPiX`M%>)daZSWEm z{fM(pMPJ4up63|;S9WWcu%rgW;Z_6&7zYTSU2O8S6<7jnKJ%>dry(4=R0JHQ{-0Qe zBJzIU^c>}tv*RzuA1duOvP}mUsxy%-s7IZ!{ygs8iMj+tK|{NCBl`@|eN{3G%x% zZoTbCC#)j|%a}>Ec2K5tEE@WKa)?5@ev&Q2O-($Zg8Rhj7Klq~Me>5?%SixL*xDfV zmE*4zh0EbcjOAG|$w(1jyIYjh0+`DyI`1pd7dNQ*pUkK!y4s5&l`fgrWe$MezAjxr zHg*QQ6QhEVb8hLrEV_!2;3B1qBpb*PWLy_06+}ZDn{K(Qq^KX3s&+_}nJRil%7I){ zXBUAmG>g7iRQ>FRadZAl(rT!3rd*g zvIc1tm~cx%;hx8qqS?g4rZ;7OHlx=-AKC*)616 zXmA0@&~|4WlLkCR4`pJbeiyp%ud|jw+JrVP5SBoXm213EbqCx%<#&QFut%BRv3X4O zwc7!AUZb*jcS%PKOk=$aH~KcCqrVLqK8_D49#y`Cp3tcYka4CZ^rk5xrEZ}}BTv~? zL8A&P9>78Y?}$XVNrhcKF#%O8^vk^g~`!M@n%CeAH130jG&!V(T==v_GF*M^R8 zg{Zb&9Zslx@WgZ$!z~suQ@bm~`k~4!4-I{)pw6!zB@yAZWhH7}Ab!x3&B-bBCwD)2 zGl&P~C_|{PFCPl_E$T{0$|<41-6izhN3X&R->%xPqYOT5f&bdN&Ti)S7_@7l@c3jW z9$CkViZxJ3wW-CNn!nc116swVZ%=Ecdi;b1bs7J~m_CsVFMg6Llh>{Mr$q4v83UWe z@+hV0%4>`ae=L*?>3Y_WY3~~vs;C&?dXnHNrsQ!fkJjqSzrmF0YqL1Dt-Qg3Aa0mF zoQQp)Nbb4>*z>9)$M~OZ8IWi=w53BCv$D#kEZQz!&ZRyhS*SqY&wXb%<^IYc3MqRT z!Wz_)1|rpZhiFPNEn9BrMLt?WF%i)0xuGh4E1u|^IcKCwPQ`d6=@^s^PbJpfNngc< z^iY_Sf zfA{wjlc;eFuR@Y6!PJ)ip7(aUq-=I(P*6*T zGA}2c<%U2+305pbEq0p6CCy4OMfAQ}?9{MD>J|@ahk@h_$HGB>q6$>=)&d!LT4lAe zSmtz2$(cYVnsz{KXOvwT8#*RH)N1KI`{dc6bm&L(WIKh zQ8v+dk1Ivzt{e22b~G9q`UOY)+8KH(mZegVi}+eRxYTy=NfQJs8oM-t)KyBo$@fSw zT9G80*ut0ZctA-^3R;uk{YqiSZPg+;X60hB652l8WBXb{(XYo5NzFmkQQre|M1HTd z(>pmCRp<5jO2c2P%eCc8WxtVAIE?H+uRGrEEO-RWUsJq+@E;`K7GS35cYb9Fb@ayP zQAPKBeIJ<#C7~nSLEuqYg@I3{i|i}-c}By-F(i;-u_%_0exYHL;LuTSC(oKG-L>{w z&>~RrmRA;o#L9Epr%sQqj9i7JruBSQiw20~*2K@5S%BGTAurw=5VI-ZSC)D3Mn-^M zchii(bvf7WFZozCQ7NS+thGU+7C)*Xft9_{_zLb3G6ST;me23F;pHeSPo83kJUhGm zkB!c)11Q(QY^6Gj1d5c}j^%?*fKUt5=)eUeHjtQ>X&VN|MKr2vKRQPv83-fEInvMZ zEH~N#(oZq(vWM6%vkXf|YxgUU*)6S?8c>OdIY@j^>gV~2H%QO)+M{BW`WsS(UZubz zf;VjZFIQfg+c4beWL+Jf<_;EiTf7w`qmc8JT*&&lqeTr?8ddmOnGe&(_?#NN)mR_C z%Q0b_YXT+ODVNc*bStQfaJnfH0^^)#*v;ES}oyP=lm}6EiKry=?7_R!#fTP zD-J?qc<{x!LBeJIOcfdDryH%Zxi#{p6T;^Qc$_dyd0#q8| zzk;*{RWpJb@F>De^xz@TT*SX%gE6e3{hRk{0dVuCDC6W|_-7wLk^-{Buj+hZ)t})U zNXp&!B+81vgToZ~@$do4=g_#!o(kj%+Ne=p&L6kMlAi|yT4N>nWk7hoUg?R>rKD;R zja61eYve0&dl7RkeE$KO3#a$hB}k2Ku*f^81U^;HP6PqH%t@H(@5H2J1f`^9XPpx< zP&UQHGv6o|5BH5H6;X$wxpmViaP^N=Bp`ta$HaDseJZ1h78_1F$v$rgx;H~7@f+mI zFID&{wx)aFMjMqU+HL@RQ<>qA29Md7RQ8vgtRyGHc9#}G01Ac+750iHbl>P-( z#5hw2co@ozX98I|_2aIKrl|y3WXCC_gRLT@fECi=H5>0=8(ov>9)v^pc4Tm!l9rO- zm&pQTnDW^j_70FjF&$hemKH{0A}OX6sT|D8H_2-|@tmBBs2}n8I>!%(s~J*D1v>Au zrh6DhtQ=BKQd3`y)5yEIp2JRpm19t)786K)=&Z^;Z_jt#$`2M}1f$wv>Nn;#k4jAt zg{#hfm-I9u`_h*Gmyw{xvJbDVO@lL_6!$NZXpNobg80>z` zvqJH{)jvC~ZorSER)m$hhompf2dddQUTShJ3>1vQ3v-I&)E5h4)9BUeaxJRp@oI-9 zbM(Qnxbkj5S4kv2av!Q4j78wR@fk6k^3HM0Tuc&ra*O(bx}D< zm6+D6l|3gXR=#K^-|7rFlAG;*u=sH?2oJ{Q|8tW2kgO2)cYmH%8t56wWY<9Ibqbvc zo?a4zTuj}OF|Ak>DbDNK7e!14x2xP5=sn;ToDhY+BG}Ys+xSpLSr>-Ft!mcjRl8D9 zfkgZo#E9q?^d{S16K27z&H1*-iBL)^rnaW{6?7eQy6?ixt0&=g!Ia0;2Wkk;4rweB zA)_y{g2f^)wWRm7?%zAn0 zapdF?8J}g+w6K%v+HU1@J(aehi<)?QRyHT$YLE{~!eilDV@XtB#5;nBbed9tG5-X+ z#ff}c(OB&Qh8o^r9!~aycv@_RjT_TNmaU*n?*=XUS`}|U4*b?ZJ)h~@6KrlOQKrQN zk}0sEt)ZJgVc?qwVgJ-}gVUs5A-semkuspU4vYFpZiZYzjio?&afk9V$b5B>N7oX^ z6|`bIDn|r9lBr#li)0WJ_ti}0D*1_swGiw$tX(riZc1{v!xPHdjAnbyZD7|Zr6;Z_ zooW}YAc9h*^Rw}MJ}OvoEL2YqX^uXtcM02(uI!g8g3L8Jzv{>A<;eMeCk0lVl>P#Y zx^@*MxHb_YU_t}i&wB<9=>vHw;BE7}Xsj*UYWRW6IPMS~yQD3%8QpBlAX2HAYWW|@ z@yvF`3YwEZU=yWC(2n;sLIowYXgfXUjhe+wt0N1|$~unPT8WB|!dB|F~GbguPLk=1e7mlO8;gaY1#fuAVLc?5MzBTGMHE}NV) zd=%%LB|GR-2sl%$-x%=#j!8bqnM?$)aCv*$hMDL%m8w}a7NuWo%DAqM!d~&d?CX84 zXi0B*v?I@_AF)38Ryia{ub>`#RaF$cqc3fzmA9NnQjt9lPI1M%YF{<6uL_h*^yXuX5r4nU--(^f+k^W zUpU;?zNZ!rca#Uo7mDvq+y}B2Ux?*m!f&ygBuO%;vfD7#_4xd&iJ!S85 z^Ety1Ih+A(KHj)q8{$eo2_)3*1!6!AmszVyZZ> zFdt=snL1RMMz3c}$|dy_0WG+`G=maHHBoP2#iJQCn+~sY6lqsb);0}aqcl0D3WzhU z*yN2jNmZt73UVc0iqOm3`r9y^%qy^^4jiGbx9p$yF#dbFZcNM5adIeKpv`RYLk(aQzhAs zq3?P3g~I}+l+t(+zgsh>9nXcRiP?QiVRE6G42mwvY|J2uB{#3JI;I2)P1FI0;I~Ec zu}#xEwTim1SyrpVubNgEC1$qAAC)p!hEYMtFq}9mJ9v!{9dvSrA$fz^xuRpU*c=bC zPBw0k)a0^U$k=%unYxlqgipsY9OcG9y#VJlJb+?0veoCLnzVs`}fwqgVV9nu)l@g4o(l0n# z!wFo{ZdYn%-N@>MH{vR9VU`J`@uBuGi*c2VEcym-@5@zGjHHS0jRSc9r z9Z-`%s_T$J3T+bO3n0V#GD#0}m2+MU^y~eRCWU@ABZ?kBJI@`{-^(g^rDG56ZF;1x1AW2_IE5f}Us^q9~0i!Is?5S1uamZd7 zc@7Jb4;VCk=A(W1EQG2ebtLUExO(Qt>Zu1-s@8y~!y7&5(iFYi+Ix-0BlYk;y8-y{ zTk5phTwx9*!IHjkH{^YI!n&Ewq9=_|k)>~Div7(G7G5?omQjovZ0$6Jzm;ft((%m0 zkbrJ~Eeefl4>^az%^IM_ww&B&y`i0H1brUr7F1-)p^02kRM#y>EL>VBys2Q?m8{RnjpH2oH;Zaq9XKIHLrh&-P&Je?P(V<>k`c=Z$(BUR0GP zQU0rxOhVZ{tmrdKH9fV>`kpZ0K1vA}h4)LTM ztqpFQnFK1&Rw)vgIY@6*TT2ohb8Oac2|5?bQ8YZ22gPpnJLl}BoAEFnu#1y?V ztO`}$;AGsSiOAm%R?%A7Rlhf~85a{`qC4(WT&6atBm%?3#w03p)>hKV??;e!y5QN= zk*$rwa61!bVprbStx*2n02#?edvrbwv%&_iXkB?`n_R`Mo0j0(DNVwlSh5Q&+OqW; zmrPss-S^&?=ID#H2G4x!k(x_gkQpwNEIx4H(1i%@F0PU+nCscemmIxgw&=e|@Rzw-_ zmr!YTb9I9+1zqmcb{FuVFojlGc3WUMPesiIkb$$=mvycw8j!mTJodXSqLoMuLr1JS z%`fDVRCjHwS~Fth4`8TDrSh{yo3+!i0cN zggo@_H~vhP(Y3`BA8O^UEitmQXX+>=Db@8^A)Z}Rsfdn3#2);luVVVT9u{gl?Hnsu zqE#+;^xMcKwd5q9hFd{NY=)P1$@RBPALm!0R6GQ3F=!w`lHxu}^>~a5+jFqiTiar2 zuyGNwS#3Nmi5yX1ae4G`L_VL*|J-P{-iH1g6%63*<@w{SxtA%w#}Tpfy!^%RaWkDO zKX16uU&7GOtLH@c<$${^mzM(K>4fZrz_0lL``YU&;-mdQ^ySc~GoZ%kchA4Wk?jtq z*mj}iIjZ;T^y}sagTm(FPd5tv=|=s!xB}WA{^v%`-zYaqvX2{|8Q;|2b$+=8Fe!4s z_K(~i8jsvI80rvP4*6Jiw}lV4y3-rxPiflK5yc`*zg^x^iH!ocUD^^P-cIoh8tlt} zAJ2iwA&NM-I6d>-+^uBm=fAWspsT_AaXbB*XObRf^^L{x;*}?{Chv#Y9c`;bD;S~q zD=7_&w(c)wj1LzdPj)iF*N;wDbMnT|k#vXeE%LWQEi~x6vRv-B0w4O>2%OLGPbq9y z+rUZ|!e>F!gS#JZNFqGlXXfbtsnLw`&-nF!Y+hf4AXHx4g9;}csXdN(9me%X#t zXkKBjE2A6UeyRS8w;%r^w}SEE%GH6Eb8~wu)0xUVOE zSYA;&dN+!#P^`?0hAO|d?TOIMCvy!9aW z5BGZ~@blX>-{YSvU-qi0Z4*PH`*PHq;(>#I-mu~8v4Ydz6-Vn^9%B4woG>r#w z&v#2We%iwQ*@{b|clV%xqoS?tiOn9Be2}~4pIu-6IR?U$CzC(h5+l0qe*%NQz~1ceVr6mxXHCvU42U%P0+yc zao?qB^~`by|Homij)Dg-6!rP#Q~jl)-Sd58^y|l2`Ju(b>3PS9sgC-}8TKKS$BT3A zq9Wp?Tfpn(Y<*modU0{Bm)68n;QZ4i=)S*c^~ywTNr>kes`N+MIH=G;O$hMHmVJ4i z_ZLoh`7H6Oe9AXIe<^p8a=BF@PE!2z6w&CFMsDu$_48$HUS=u0V*3z)-ZO1E4XikQ zI&_~pc+@^vxrQZ1r!O1|nV88st$OTQpS-7kT!EOkDz0)Jh_0?LLG=&T8$6YgLetz6 z0k!{$QE*6w%%>RjSTBmhn7_}?v%dXa!Dg{O0v_?^uy}Oe+7wy@US1RC5LB-&p*(p$ zX0vUbR7kRborRq3^DiHVECvsVVhd(Z->1eLez-$>*YGK4Ta~=-PbzLg5;0sK@26Ud z9d*j^NrHWd;90Njp0YVw{1ZR^{&_t*e8Xz`cqC+__&b^VhT&-;k?c7#F}Wh~Dm#&X zN#x(9e}0QpQ-V#Tsarq7)|$|%{7FQ5p4co@rmwtfW&b|h3wrltgFX#Kg{8{dzhmIL zbvvfM{hVOW^YRDZ@lj?@>};;`HR|xS+rP2JxlP97cy6B8j8ee6ji2eu?BOZ}mCw4P z;@LH9{zhIp|NSk^$03{Hftc^hx$O4UG#5B!%6ZDqL!18E6>lORrD0-Tvzsf@?B79X z-Uhaa>Tx{S&(n}&BtKK2n&>ilHrL_g4YZD}&4k#F&3AHN`3_n?3jbd|rGj;b6DYrK z3j4VGS6hIKVE)~G?#->`2RPv4_`k<1M1cRsILW^2hq)Xmp!?r`>OXVid$Y%GL&gQYaCwmCD9im*l<~a(o{eCY_F7#61^BlOo>;>d$ZPF3_02=ah(YRmMPw3pw zzR3IDqCaEny(Y~g^2NWfA^6Ij^D2t>Q1dKKUU~d`oL=Z=%4byOX(d$Tg%6#%4UOb` zyxI63uxXYKytsFN@$xj}js^_=J0s_Xjw!4RFgsw#1ydfd5X<|%Ch1Kx-SZ2m7{isO zhVewF>Z!s94iEm0n^wdC=j@-F)Mc2&n2F4Si^5AQMCKfg#KG#zkv({-va(n%#YtbA z(~1YoW`~wc;3|(UVul{nRSTJ1_}Z~X3EN97UJ(cRWGE<&gH*C7XR7y=aL~17m0~|b z?rV)iCPmW84zG^QR^zd+`Nv~61Bf>JI@f*HC2dZte)I9>OFV0G9(i3vc+Ft~-E=+g2UH9cMP^N&ksi|5DgQKyToJ=??)cyiH?cOCIhN5Gv{-ol|K>dxxKC2Y2B zXSw9B`<Q?ZvEzExbC0!o`<6W5ADvUqpRxt61uP}JGA#|5%b(S zT>h;7d8;i=4c`*NUH? z=&FoEb!KHy1eErCKBDPb+#ovKYF4 z{)BRG;P30``LcD}pUdTVJAC(sk4Q}vhl0wbaJ?HH%T>hlzDNDW61ejWM#>xJNasWx1;eroG-aPzRKbP}`Y zekITT;z#R1t!8Up=A`a}Q(=xE-%1<6>0x(hedrF9$8T8q__%x58E$-vk!Qcv^XAm& zxHW!#aN2)&78_a{+JZ$Sp!eq~kAI~D(B^OXb~zxlv`r+`-PxA>>+xo1^Hg+I+uI+k zuhSDFu=!GTf=PL`~AI ztOP!rB7#dh}vHQ8np{e0M^|^LL99|E150G8{ ze_a1OumbrFCLb@Cj0FQj$o$=}FRb-_+Z($&77l8M_H&)?cFfjGI-|4em#|y}QSOrC$+n~UqEm%BiBS?;9n`iP|Mt(E0HM;Q=%Vq*HKg>Z2n9BsM2KK8Jy=ee7yj=HWa=j^?2`i5& z_crah^J!iG7w}$K=s7z3!3wBz#MA2*G=U1TyOelo=x#sFBLuGV6d?zu$6syTfPg*VqpMhQ zM-A?-^^{G%2LI##!BWj92jE7U&jgo7e$T4Gp8x_;?|-kG!?9d(qaOf?=WgEu-Bu%P zLcy0kbVeb2AIbVXeK17a_*sZMJX3yMKGX^w_;jovSo)lyKosBwf>Ehc%n$JLNSJa0 zkBtq-T6%gc_m=yF!?wNnpM%hEr&NNT@}@3gea_?aa|O27Xg$-(FKhnbpT5+BK%ca9 zmXg2wZA3+IRquB>Q~cCiV!h*gn>#{uHqq6FZdbs^$=g}1&*g=}FSncBgL9EEl^&yU zMX35ln4T*F!>2p{7q!|4V@p1H`T%g%@B!2Q-g!ml$G(fFdwNd zd@G0QvN8mDHZ+FIcIWpK}73LX4v1<|IgEpyuYcLC5deZ4H9M9 zHmX_K3XMQq)wJwp7IuJONkTY#Qob}<=G>BxjqG(jSoi5@^W6Kys&YN{vr+c+zed?B z0B-!Zwwa4plVaP3;Q@P?`vI-mI_$quJ0_h)%tTwFZxXPER-yTL05&aiIuhkYc z-+R=ytxnz^$Nca4yPNCl^LuJGK?j=#cGYi>=^wrm7xj6$b2#9M|BJVKe9|QP8#}yX z+uFg7ZCg9GZEMH2ZQHhO?wI%3_6~NOdwGh49`OLny7s<@F1d>Iq}K%FG}0`dzj*4l_(R#*ec z(+0Le3r6w9xeZ)TExG12KfN7=XB>>EIZ`CeIaS?hr*mpmMze&9bBacWjj_t4yUv#%$LFf(pT6K zk;)l|mlzHyl%IsjkRe=7g_fE=jWWp{gom9GlvSdpO4f+443Y^SF_X&8WJWcRUpF4c_lA;WMC!r;GnIYZ!4LNWGZPRlqdNrH>6xguq*<<=e#Zxp)SlAwN8u= zV))(6ZrU#|;aOH8NwCQs^aMx*^9d;ezsXFj;Uh;nz(-_6G1RVVg9v6a2PDlq!c0P1 zWZO#tYhp_^CY>e9JQ?uhn3(DEnp|7xn5A6#UQu&J$Eg9eY7pIYDezr7)Oc+9>TX4A zssdI;%Ovkv1Bnrgo#byy5aA(GrYE{~VpIdd#~mb~j*x4=o!^hMJloaX<`8ul9R~U# zRukacT7Tn9S@B2H?OmX;4OX)0sq^F{|EXAXhRWOF7JpYAFvS zKP0%|_(Zo-WgXgWv{mfqOEz?d$CKzz4sgui_Zyx|u3156h0l2xT7gtX!~n<5HADI0 zTYmL+iz2G_X>v%j|64p|mk0`gfh2E_mC671b|52&jNh^#tkQm{p-j0+!U`9$+?)Fw z+@L!u!Da@hrmB*PxEm5pnm%TMm3$X> zxU#XnR+7EM6B^c?-cadx5;B5`Qq4DL@@66`l@$I3BgAnzmG<9htha~oJh@ajn>{|j zJ)?|Y0Rf7~ilK0fRA5-Y6XBvaK~?A(4Z-)+)2XmFxwD{e^?wbXbR8LIh0iPT#-_O@ zyjmKaA|U8GxTpLT`ZnS|2yay&5;sjfOQ}gILqTcUI6ICz;z!B=uGi2TPInp9D@Dzo zfhqvqkK*)rn1zx8y5RH0geQ^WsQ4FF_Ic0Lim0QQD4y4esn|fFl@)f)C z&_Hw}>|LKxjYKRgd1SAGI#vU&q)bwVzb1m)leqr*a=rXY5=Q)* z;Ix-MOi~s93pbl5as#y+t4xC`l~VfJo8I$waZ9F?%S^dze`xFo9tFOUV}+14sz`d< zX#h3ZRFi3-`2|p(rN<^6Btofe6D11z9E%t*XR9L4TA3K2_}`|(-!#);Ns}UkCPE0*mj9DG=g zv(t}`3>@BJ41$v)rxP8pkpaCYIP`*6(f^IA%YyEmO^+jWJ&$b1-gQd%H@-31LR(H! zD!jBZ^qwhQ5H?auTU0X6>9T5qmf2nr;-njickz8OWMdXfEv$dA9|4R*$8Y)D9&9CX z#a(SG|69ED(+EXN!*W03D0@q9P0l#N_nh@TE>jHnRMel5BpHG-C-AdL9Rt(_qSwoo zR#O~4E{-Ms)R1X1Y6@xGvDh*QwCKnAW)4gfTxu@HIZnJA7PO%;O6$EASyqnh{-auMxXnT3fw zGM!3|&nsA7Z0aZ{#kXGfojMqd*qQA(BiXt5y%BnTvE`tgu9 zm7eTi7q9o1=EcWN8LQyn$Re?s`#$d?Y5#79TGcXNi*;3{D~c!+@e8F+eQp-Y7ZXlj zyrO+?@orC2s>nlVN@Q{2=++uD9;y;*Ro+v8uKdkIYY03Q5pg>Zu4VlP*9IBckF2b@ zTqh_o)^q?17IZfi(wlSNt&rpv0=cK}tW%9Fvm z4XwewVur*(wzS)wF-B6g)(BF6jjzQ$5L)9t1=O)rhS@SyD z{>Q&=la#1pcl3$Bl;)GWEy%j)J=6cJEc84smxO8mz>jud92_V~e(I2DW2AxbF2~Gg zUmacr4~$uMVvt<$fXO1cEbOrSij zPR}Q&;S{x=M>5~xkeJjZH6$r}BCwiaD#kQ2)RwuwTn3f<*c&DPCg)a0twNp!)*2E7 zwt$gi|MYPn`|J%K)F90eJwO>Ksc+ zS_%Os1jU42M4^sPj4MK=QX)qdy0W|tj}gtcyJuW#wm)e3<{*!gUUj;$HQj=ODIUw{ z7(6wGg3XYBbkGE3YsVkfD^2QGy8=;?Y=v4TnyLm!*&N866e%`w?*@#XT1;W0$(jS` zevFsWOpRC~Dlvc*LHGQzS5@B`HuFZnOyA1a6H$9-Dp0LBe+7kB6kYU^5SFe{To#BP z^H0gVI+K?bWR^_Ww;t)V@I=rZ2|vM8-0tr9bhk7X4MIT>XKnZX$JRms+1hMMu7e73 zc)2Z4yX}fuIz(F>O1?i#hvcf$^yLKCLSY(9GgzV~EdZDN6ce%EEgGcIlM>Y?7v;d& zNhNNh338h0Jp)-0lOGd~(e&rtWMD7`ab}dz=+}E^{ViqHoygTjp?WIR#E-{Go_2by zdij(W6Tgc_x_j5Wn_f2TE$b5fK2Oy5z|=oYyRPxCbH58vM5j+^-$*O++Ra`uJf-E! zjWMuOB6#=u)iccMx_%Fks)s#CUa;@;;q(qpM==r)@9+*D(i2r%KP-&pcKDr)B0`BE zB{}n&I46{uGkDItfxOhj(OFL{WU*h4%;h=&#Zvz`9HJ;Mv2Aiz0%U6^4VGS=p2$!Y zE?x9&9WEl!^O2pe7Y+{OD596sGmS0TsP|6Mi|xlvDZl%)T8-!kD!2pTVn?-9~Dyx+Fjm zjwWAKaVj78L?CljB&%CZ%x>25MtQVyA*%8&rxM!BO&6ncij4|G*v-kamV7*D>EdH% zA{h#Y|G}(dX5s+C5D4D^1%nzAodIwIBOn8g5xLoaH;1aGfoceBaAumv>?q9i{M~O6 z$zhu>o$=U;J)vaf0z&kRIo$eKn)Z7VgxMqRFgz?CB%nK{gRKOYScRbfgdWK#nRmDt z8kip&DLM{<(=D3?e&Y$6Ok8X0RG_;8IL(@6QqbDi#CjW|3*e5#&9sf_P0Jg!OXPn; z#ez)h%5{oloMt>SvUXevI0C4e8^HzmPUZO5$qSxFtG}R`b861lp6DkED76NxC>sj=ZHpYv^J!rxW zXx5gel+~ARcg7~?NGdhKtWbNZXlv2#TPa^2SY@&eoH79nnkz0$1f#i!#AuYv4urGq z4cFImcy>p9a!|0v4caedL$AcvLkfacGEJ2mopS3>!bCT^D#E$Xn!0AOkXmnmX0453 znNB|yCm97*&}^POW%>yA4+I zULBV+&{7Xl_)*uoHP$b;o>c(Q3@s62T#UvA1&I1mn*)@1Pl3M6X-E$O}~M*s?Al?~SGIUr(NXKIOw zU{Z_4t0z&UehjEYQ-pvKNr8#|BWo-Ei>#$pO(QAmJ;*asM%oG0fMS!6s2~Z&SNccR zN>Kuy#X&m%rN`7a4yYm3qJ+`0+j#G%Ft)L%ShW+p9*%!f>gG;d+}!r&4ScDD6ug@J z)5!(VntSvGhjLNTr$m2~4okYAg-Q-f=EHbve+3`qBmv3VDtuXX!s;(%|26Nfv?rJO zGDuHmwz-c5fwfcPp7)8_B)sdamHzSKX30NjyOMj7Ns@MG{V z`)m5h)|BZmXQWGHJ=!w;PeLEaq1@|0C9N|H2Wz@+M|=#vDin zc$QC-qsEp)a#n!dEGe~FLD*cs{xl@I)S)H~2hj|))>YpKR*%|J(e)5&HL)a+i&3kayjRxxgF72RXi%`rijN5^1N(5_eG8BXBAc;C~Mnp*w- zeZ`rCus4_n%4-MqhrU*Gf>Ly{Q8Bteq>@4RH=tLWt9?_SU20hXsibJXY0hpja0tMW zIxiLv9Knbw1#;IvGWig$1ehH+p)rFf0lnH- zgV4cQx!JX6p7E|k;~St?>x4nNddPgTugz{(KcDGh^;EH*8SqG^sSosOMH;>hG&XCb z_#qz^HyzN1D|v>U1dvEu8AeFTQQM@dRPax%)l8DD;a5@sv+tgWpC|!w{WcSORzdr3KXvtDAwxz6Ke%s>Mi!n zFP1ga?UPy#ikcd`SON#2A%9@&a5IK``d~@O%36gdain{397s(#Vzk_0;KHT?w9pj_ zL&_QVJAUTUaLYt<5oJz#K*OWckhUl+2Uiue3Ids{*#D5V-9WOI9o`N@v8pun8(WlC zr(Uu6cVr*?*3EX)J38_Z|NWdcE@LPj)WLJ5*=Sj~F$8#Ao}J8)Rff2qjM!0_qgJhc z0low}MBxTPQquAGRWvveUhl2a0k4A@cr)}`;d;?O5Xp&4i%WYU#3|1cJ<)35iA3&W z_*^Ft&>9-G?1GGXmKHl}4rV9m_Y3EPw+Em}W-xHR*YL0Dbh)|xmd5>)hzabD*Q!!^mZ8zm{9GPx zCZx}SF-IYT!Xx|~<*{~^F(w{G`KEEo)olaM~Y z?EnepX{lZ1sTLQX(qkQ()`fWQRt*)4fOD#E zG*iIvcqinYXjv2nUgQ8DGV5AJyPxtYSPeST{=&JWf1TM?a^u2!&I87dzkpsMTVP2R#C{+Mh(;)F|_~)h#6|{vtrF zHp|iBw&f<4Ef!cE6H~h=ZjdgUXKe_6r~RqYl;>DyCtd3AGNbSxtu`1Lj$%asGDJIO zz&CwLh?t&oN|M+Fts$jaCp@4=aXqPuMYTOL9o5*H7`w{5bg9{*e~-Y+{tFDlIm_$p z^l<%NgOkHdBnF_6R%7Zc*x6sIQqiD9gl7cAY9r`CC7NoE;6=3X`GbqY``K4Xg=bRC zc*%iS?Fs@VOTZmORuo+W(xhZzp)$h6UxS=ScE{KroDf3sa1$d*y7LyeH}XW1Hj{h_ z)|Hes5`fGHLX;FAz6;8t5pI_XENvz;8kH`KZ?CWq&8q!o$DP3*+)3?~%}wl4-1UFN) z7epAaCWUDG6hguU!&(m&VpL`NAhV*OWI(x}q}r#C%0fw{h>FIC0NK+~CRz{@jlfda z2yV~IgA$rv^BfN7kSIJHUQaY`tT5IrKCMCP34|y@MNR`2jlnk+~K4;~w zzHivK_MNA(U-QQB$VWk8-TIzP4AfzMvN;&eL9{-Baw(0BAcuel1(b&-GkLj;05Xr4 z#0a5XX;_1=J5Tmy*h3iWUtiUHynsIAcMBX7sTCw?2mf%?6dcM114DCR2b_xVDE{62 zZ|zk8$`?kMEY<9CwuV}vk<-i>*!;Bx&s4^9zuHXNbkHE>SVL zDbQMOsKbXEL`@w3!8B^)O@3XtU2@Lq?{#nU1tLttsbR4Ps;X@SQ~i&seS$<&5Md+^ z{BxL|PU_Mk0?V{!QN4h1R-xWX<4&u^$4+xS(=lgsG_V*`qgZYE@1K;uh#N{r^mrL2 zQ>T8Eyx@yD1kJQe&b5fXjE_fRt0*_U$_+j0jBJHAmiBNod=&n0!ErRw zG+ICa`1nnA(w)#cN~XJ9flCHNUbN%AmkyA7X+MLlr@I zaKi$BDA&lh8H)!O$@fP=zu`2yj8JF|K!P77vsm*K8ZC55Xj&<3Gpy~Dja$9m?qC5O z8b=jRb--bJ9~6tM%@I*fsxZ)kzGQw9|7X<-;hDF^J4ICdmsJ~zS&vDI<^=!i8=R-1 zo@KTTGnvP#N630bEowm@8M!A@J zciJDcQlbw{3{y^=y@FS$^D>I}`=@N>h7`&H6}v zq%yC6TCFNIs%8U3kdtcu2)3w)@CsoEjN8LF6 z?Bt=GArw4u8|;QXN8_NlJJ82Dp_nGi1nGNSzla=M8+|WHf6x1lX*u4?()LuA<+VqV zCK6Z=mw9Q4{U!3QfZ-peTpjFCDkpXBOTM*66ug4*CUo zsZ53UbCMUrfY95jFh5A#PqZvaJczOA@O*? z)+i|U)H?0GX+Ls4t2Vea8GT8$HWGFkrPxG}G*tnMu6cK&@XoAuS|lzu>9P-7$Phdv zfkDT!*CBvWge63a3=*$vhQpD)e7kMkTDi$+=(2U;Qaf<{n?|<7&`LwGlJp3VoGm-E z0z?@Qt8G1<+Qms>O3xQ)Y%mMU7hsezgvRL{S7I(volvY0I*(}3L~=9Yqqc4+_`6+0={UomdaevV9T0KY-iS6H zHHr@E&*WSC_H*^xj^4I9#(f=$@=eY zk$bW<(12xD3UeY%tVHXK@s-SI`0*bp!mm_A81E`zOQhPi54uf*kr9y!z2I1u$T$xV zbf#=i^kOCK9V=?gZ<#`!{cVoW8*PgzqDy96l(#D1hH>+`O(~;RRGTlL_r1{)&!ZeQ zVrOAvU@CubM(;YD4eWus*i1tnc-rF^0;yWnVj7U9Fi1m*n?mAWa3!npze?7$Z&k?o zn9Z#N;lryjL%!LR!nrAf@r`O7__V6&FxXxIB(e!gh#e%>l>y z)lq7kG-{L&B8H5ZUfK3W7sLqwJBrH$41!pC-1DQ36vu6R%t%k55$-*vH~7_f-GmCi z#XGEPFBSco87irPsR6z}Cs{fW&(+v_Eq&k7kc9IAMD5 zJ`sKqm9SA3s zP*Q~sZ^5*NUTQ6?F6I6y-H(!O%f<@iXE}miu_okyKu)SL3SzQ-Rus(Q)YOZ}mv9`; zt5!$~Os2%RV3KOrovcjIXG?w8HW_kS5nlJab#S^6m_h$^|M>dE-z|&VX)WoQZn}@^ zep%u?O~F62eck{3C?=#XqoBH(6ujHMgYx-g2z@_{&hy##o9SQ>Ah>?uvA!z%VDRPk z{!&KDi*FMcUEuh-m7qI=b@f*#f`+5Lq>+ht<7tgOg zO-0N5x$y9RtVwcnXH>qru}vcLPrGID11fwyxbzL$w=;{{!k~B-d4dH&a87CD-V6~w z(&W$PUdjkL`Q8o4177fYB4^EtlLIMpfBgLN6`y&zNl)k+kLGtazodCg33~Qby5&oP zedkM3I+$W1Kl;j$gm?)3t?om+BM&;8Mc z489-M`w-^n5?=ye09Spi8egU#JYM44?_@s&xZJ7quQT3Nke(K1oEZ+TS4__KR;Im> zR$6m?<*Hro8-1Fc?w?+2vnQ^XDgtL^-_r74jGL}Lo`z2j2)jsRMralZJ{{xdDK@%ZcrQ`Hcb(>H@+{Gs5c`=lB;H z`-)FrPw#s}y(INAD2g-p1;p4-o!uMFrIwF{Hs(WLLN_@ydJ43h{Q_SGawuEJdtq{@ zFvny$&zn)F@2!1p-P&Zc=9z8_z1x2zxodb9GfFntz$UddnK@lVgs^A{p2&VFru)eFyO z4si{7gow9D3uipMPTF-1YW`GmRC5&TuJkL%KJC!*55K8ZJNA_DMyc^V7)Z^ z_m;@D+|}XMz~^(jB%jZD1|rkyo6ox|1L5U$vgEAx>*rg~i($J9f$a*fz{~2_n@yIv z>%PcNw5Jy*-{M4AO=|De{R@R$+zy4P4gc1rR*#b}$rv#Bs#5mw{cG6wn(emTH3R;}~ zgCW2Vee-qg_j&X64!q>Q`U%~%iA_AO1Y{dNq2%rAGRwMF z2Y;I1l;wO-+rNfAZGXN4r6`VAB)PcBGLK?`k39K5RBw$WMZ~WrJkJzj;S39L{4yX2 zMcbiIPPgBEpQiU`qnAIjvmOCtks@GTtk}NK1o7vy4K}L%$%$%f1u$;iv}T&0c|CV0EUw#z zglR`{Fg`8>%CRparq1y3uP3r^HeGKY8cjR=6fO6Q%~FunCdRfcLR14GBpu>#z!`~L ze)WeJktSk{fNUjUw5l`n2gngKX~llS&-Z+R#0!zBnbc6WpEfn5NPqzOniA}$aSDW3yL~0KVf)$9#h-R&`p)d*pF5XT%z82BxI&E51muTzl$g{!scE z?e4SBowtwOo}7;yV;7f{Ap*bLMmM?p0 zwpnIK*`b`bKa~5T2AqSp>%9f_Tj%oqH22&bD{ik7c#`!fUbNXRI&1p-egGm{DnjU& z;>i60$~Rk91Kb|a?DS~-n)|-l{c^i^ku~-_l!LeGy0Y?J@6Q;=%iaBbmNo@c7|#V1 zQeNgz8PqjEt=DC$yT^Vgx3AI7`|&!+?f&#`?`&v{=Hm13-Szom)5Y`4Q_Y*Ro2j)+ z#L)m7xvtw$eO#yw~Lo!7B{HpTHcN{`)l1A^*o(refa0W8=Bdf?Gi_) z7l#9fXS-z#4^6+FYJ2%@rQ20`#+9xCJ)Ylp@JCN@dVNivf1VFgF0LQ7yqe#3Ti5r! zoRyZw;rYy@1)r?TYpR>o#)1$yp0AGenqTV4LlRHfOo=Uy`~2=o{YK21!XeYE#@ z7@NOgUfbF5_S_X$>%I6)^aYhz<>k=wZFW4}Ud^AMk1o2^eZQ>R+V)kh<6omUe7kxY z1?k<6Yyaio$+4NVT-J6uM8VV6N_d$=kajgxb@9A?Ro&y=@#1Nrhiw{eXYOM;nLmGp`^Bhzr|_h?)_E}_4o1>!*(SlwOcrsovJhIXTG z`~Aw*X1pw{^pyPemEFlQ!J7j_T_4r#Q`-AR70pE(V9T#*h+hZTZ~=m99uHE&?7y!) zxIaGjh;%i(-8@?(Z*MWpSw?E^Pjh#w<>i+M72ikQI4tSTz*b~t=rMW-s_$cr+ZbI zx67X`1b|;ho2#|)*U0^PPLZ2-9Y@-!S#XM1yI09tmoyW*mRFB&(#Fun<8w`qb(pq? z7us~n6<*wvy84s)$7n(BplzNVesN5Rbrwh5q;H3pll|lI#KL1*-R|W1dI}lzO>7)+ zpUrOYpeD_{Z3XGtwnvx0`S=mft;$9~%OhTo_ND8mHBA-2uE#IulZiXjZmrG^*L#ha ze(I^4=fR|(L=3gtdLFN@({{j*QBPyfOqbi%Ma@T&>%;!pa+uj0^|oH6ITBJ^EiFNx z*Sl3mZzphFK8lw|%g2eQHX9JOVZCa{aQC!)Prj+IwbkDEU{t{;;bzCsl?BXQ+8et) zeEuw7?QrbmZuT^EYg-(g-cAFq>bvew*R#4kz;Z)MuxQ-$`U-3TK0Q6X&0hB=FB3Ik z+8ny?ACn?ozD?Koy&axkx8+-Q98Yyw2S-Dl?+?@4=O1m_H{Y|coR_=373K81+aDhW zEWNtiOveN|eNOT>JDt2ApEP;g;nfMZCw)b7w>G?=PPeyeux7VkUf)KS{k5g#7nW0g zUTp)=-0MFqe6H3Ls_i#h!tkDU|NdI*X>j}F{y1_o^}O9eQ-wEG^=Z?W%jX+rf4|&# zzds%0XttVmpOUn-Sn{~>HtW5{W%o3b)a3RA$k{qbp?H~?5KmBNh@C9p<1H=Y(BDZr zqPVESqoM0|bZEqrx6ipw_cr!;I}0jNni)JxDyrIOU#e{n>eBuhwxNA?4*1-=nKBQ% zkgmJ=dj&OxXKp?FdSd?3+vQw04Auka{knK{?C9$LdS%=8bGw>&3QCHZet>sttGmv| z7myh1+L$G}5zy21Y5v-e&90{F+Xi?v_hqTy9~3RSIyxI&b-ljceKzR$+1%{>aJO}f z-Mc-^ecaM6P6EEY~FVF zs|m%XPEX_A>CsH%+sE*6*X*{9uE!b5%QF#t?!-ZtQ% z^OrTtFvT;6e35GZ^mD3RZE=^o>+{x78ar0U*Xh>K&^xXxFjUv|aQC?hIP(5;irl)> z+uj=3+@*A-J-T{5IX&Hlq%YukSGcVKXP!I8GQ61!uk(*e-auX97($??@BR5(H_e*bnWhjJ#ZNe5tndK5XE z?b^!WZA!h2I**CVJu2|d5MX=+VtjdiY87{I^C$GnVW3EFTz~Mn58?6%cD>EdyN5q! z-}M1J*`3t0P@Ciu^JFKBv)}v$ysTeNz$-rS;T|xX&mBtT;TX$EFFm$pkB-73Q;|NW z)wh?Tf({rcg})|#ihKT9pB)?X63DWtEPBv9>z~<626B8F0H_!J!Lk-F0iU67Q2N{w z0zQgiZzD0AvJ^f)>iu@RBe&)4p+4><)rY@6&NBtX!34_Cn`jWAs^I%*J1!oBvtH*X zq@M987&YfXC_X5B+N`w3o>V`!R$JUwWVLe9(~;$dr>3_~vz4W@fSOuL_Ko5Vc$MvZ!JUGC(mA;pCOv+bU4&)S{#kkMs~E)t znTPP?KsPnBy-WKUeNOn*a!%-*Xt;1&6;=He{2Df(Pw?ed>Bo2naX3=d zmLeUq89h-8<+_%Rttn-E6ZqTCDnHk|rG|iv(536yHYF1fp~QCxms;=}yZp7b<`jm1y&!^HU9*m^4i7tf?%j3DErpe{erH!l#yehZkUUu1zb0ZP9` zRXRM)3AC;MT*f*_^eX~QJ_BBkkZ%vQ9Hq7ROH_FX;2P1=)8%z~I?)Krd9yl6ZpczJ z^Dq+NgirzfjbP2#@IR>R!k2KZ;iPPtpW#Dwe6FsVWihRlN2m`0X=)g#m{qgGD&ay@ zq`y^Zo=Whqrs&&I;KXUM8+MtE1|T};h2ZF(OGmk&By?vax4gCe=U5+0&D|(!dQyU- z*u5;}0*El92?!))yWH_DXadkB+vC^I#e3V5!xgg=6sSF&aWo0s@}M@PII|Lwh}l~% zQO5!O7D0Uk`w^8@0_0K6_fJeV3BP}?1@TGZB(Z=j9{qp z#;Ey01F?;bW460U6KM`Fz3!#Xbjx&=S*f<#?1K*TL(ZM!{UL>K%-72mn!h{B4_?2# zz}Or_?^k0a;jVA@teYFLMbp!*&?gvPAk4O?KMqYVL;YaGPB0J+oC*iGGGLgCT@sJ0 zX-!|!QA)(8X)(!a%2?{ljR9Y&mxs}%g2+x=@(R~7*KRwT=?HKaY9*rMCWLPrjy~TD zN~tVIU9ys7tw>#GL?Q-}gqO<*`O|Zui_tpoev8A5jb+5#n(qh!w=#?=5?i=L(X2ue zkJRp9wYN#O^INB4AjaDI2WGTv$Y`l>TJM(5gG0h!p=PTClt@*it*5o>{pi4u%rl#d zOSR%2K(>=V{#@hwE3OV%tfvaHg&~nIG94M^;P^Cn324F1N12fgChc-kob1U!(ABZg zG}GE|(dGP^j^{W70tz!k2s9jJA0};F2CBRG!>~oBtT2MAv;s`ir*PX=;q7{VbH$JuT^mZe2tO~bJ z((D*;(erjRJig@RhS}J82t1{x^X(=g6NYR}$Ra2h(S{-+Iay(Zl=yV7EibqlNvi!G z#p`bfyb$dC3NnBbGi^AkQ85wFX1-M3laE3KYv3bG1-ub@j~zuYtW(x8u`MfYnTy?i zP2KZa8hZ>{nI@O~MV)VWPOYW(tV|Jcpe?NS0nX*&U_L)FWKbj5KbIP(m>_>6mKz8O zSI1=D7>2N}xh2bBAW`wa)_7_cuKVVvCje(k%uu3L80d}e5VM|Zu)pK7V&%k5uoDbLL#2B?MDIZFOdCjQA@LHbnv8~zNAWAU_mh`CawFhX zF!(B`*xW~gO`68c+BKDJ9Y8j}G5;+$STKTBh@Qag!1GY)&4*H!=*5Z74y6*IiXKjO_@{)S=-D!%adtQphfhfS#waAvXKSrodFD3>GVbmzoC+>p0G%*Y#>{W`e~0 z&py+A6C@tPLY`KR+v7uoaYYD?`D4TKK{D*?7Uzv}OoJ&OyO=uZ z*kwr}dg{0kKKMN0}0(NwExF6|cllxiM(no}@b?8X(~kZaRdiuJICbWCo}Yw>m{dwp1OFCVMRzHZ7o z&3LzY13_42i$Y>A{d5bXMkcbXRY|)jT&y6QwK%`e-kRU z3`+4*vw;P&0`c6S&U5^Cn`+**dpJbMqRzQ;dgoqQ-#YrkKBJQzgCs9l^QlYV!6}g7 zy+-Uz6(~dd?J6;4#72L*Q|WGT(C&)r|6tQOjaRyJkh`wri%OIT;wG8 zYe-1+o`y;PIHqt~ z;{6#02XE_L74vDYf`yClV37}nz^W(sS)+L(Nl1{_gzH{SoTz0}ycP%-V>Z=CjOQ}S zSvXL5-Q<=G6WM95>eyhH?>$9&tApw=Q}TF?1dq)b7Qco9KB!}?hUBiWLASh0OgScgc@MP5Y~v}b;}Z3_@~Ywym5Ii^JbslSD_@SC({tw*!ua^dNSFD?%Qw3 z%KHEb5ctY7ju!F{#^*@tAbQ-MVbUnG(i%|gTOI2vSGW5;ixdGs^UH61zl&>z{=AKz zj+-7irHibMY>H(WB6*{%CGHRZkIN)Kdt>*b-P7CM(lYHjmpoth{&d!y=seUjGtg9r!sJcT*G)Xu0VH-s3xn82<1aL#NN* zvqTktyd^UgLw>N)O`D^YlWpT3ZQAl8gD`!w7in_C! z5mug)08yGzL@jEIG=xSqwshs(iQSX0E%O3 zUuQ?yG8;sKJ6?jwLQ^W6Kt3j90<%T3r4iwf8RH=m4_gFr0MSG*ktRcdN;rIf>3-Ej zYMigEOoKcJ=FxM*DzyHGs>4iHwk^gmXpQ+g79u_#GiggIb|y(g+zJ*rJ$*=V8K}Ib zrJ5$~Wj?m%-TEv6&-dsxrqZ=&D)uyv5lDLE8Cxn<^#`vW8bn!nMZ-IeYE#cu>^9sq<$MW#)WF7Ro0z zo0t_3ajAjkV^2NV9k)tR&0vJ~@W_NiZxkqi`ayLfmIT6xBd2;A zWAe{%h##0baGbX7tX+&#U1s%S?6L&%|K}x(>IJ4( z7uHY=BRHGKvg7OrZG_b#fCkQi?=y!vQdF@!$|PHbm5f2F)6~J{VU@RGcl-5xVW{Tc zpd|L*u9DQ7PO)}+3Mjt{oI;lMzBTB;=y^vP=~;L1beu!HlQcH2_)egMQAG$|umJ$e z0*u7IWi0%yA-PAAvcFgY-APTRzO;;`pyf0SNa>Lt(I+w{D8C`HonR}$HPq9Qdpyy5 zk~_CH!1yn2Rluf99Q#MDU=t~ba+q7@jb&ZGKtmd*Tx*ngy;M1WK&*!uh9l?>&8ecJ zwwP5aip*9RvR(0Je8zQ1>*0istx!MO^?`EHG%#|p+B;1$6MdZ#2r?~eM~<`)MuPV+ z{-*vziJ@~i$PEiWib8vauP7k{2N{THL@6#`%PGtns#GqOBL!bm)q_Kg?bSatCNn)8 zvKSJJ!Z+ixczS)j4h{F?CpOpM(E)Tc*4+J_=Cp;KiKne9^V)^(K=?#!{`w(c*&q?O zJ+Y%4%`WDz0n^)hBlsxldVea4$zsaUJ}Xp3n!jT3_Dfr3mAw&5FC^S=JB2!8n$PsP zN|hU4|9H=V(&zZ#RIQ>)KkPUV8n%tayi9+SM3Rx!NS8foXS!$7Y7dfufBJz>#M&ayVac`XlFK_se2R@GK*an4`kVRp<&x=?xdU_7ag)P1l0e zkkS~{jyyq^F{9D|xUGn>(vo8}8YiTjI5ifL0TPYpSDod5QsGJc`7#TL6xzeez*ch` z&xPwFaXb|(f|s)7&pSNk-2;A%$gsqzCB7Q{nLY;2e)ULwzU1kLAnClMU3EIOdwITR zGa8ZG_b`avwez+0t?37H6ZBC^H+;T)4)pT60X)E|2dK+MB>Fy{_HO^BEI7o+_b7;7 zD4Lc@QQYVKOv>W$1+0{0To=;9P?oN+Ra2WBUDnM1Cou~=WIci%Ujit4;Eb-P_vTq} z1Fo_YZH+h?eoo*6LI?av(X3icy0iqW5!I^}CW2A5>4#sfsgpGx$0`T+L3?X2|KI?2 zDzIirR{hhaw-Mnts_BdyMvz>280n*-=gS2m1Dr7M;p{5Q3cH&(Lr zm}#KK5BU;*d>4iUzh^&QNwx}BaQT+k#T%}8kDNrJBX1HZHUWdytda!-dI?W0ZM1VP z+|nFYtHH6;yb?2=z!1Ivv*_>q%hOub3k*CK47%X{;I8AUlN?GZPN|NK>>F(JM#{x3-P_2jW1zG-Pq{e`D((oa6l8$B(yZY@yf4;w&b7s!|13R-jJNvrt`+8hY5@Rq#YBbiLUeXq+ zV;dvVL9e5ftT)!a z&EgyTZ!Q2ZHZjg);+XT7!(P2(*PHvVVq?ekOYsX9`znUga@OUw$%^E(;q5DUJk%YA z?QSuY!PZF?^4?RY2=pt0CNK=vbVxK!QE=G*vTnuWG;kkGFQJkyzT%iD(kd9p^|*Ye z=1D3xMXy%9EpKhs7+fe_9$8?u3Y;-&957d28uiC<35{B0j)tM1;21YQoBVFS(>n=+ zK+2?ZPx1SnSlYrQhV7DjerQu2UP z;7UIcP;O_kBqiNQz4s3}w32ayoW#k?2hs5ZGCc0Wu;);$Re`^-NE)cnaai;?WQA>7lqK_PrYumLR(omWZ$2u{`>@!vloWcT9)K*a{}TKg zIP}LuKtQ&fev^nxSyqju1-Z+NvLg52PBN~Br1ho<$(Fg{ zWe!d8SOt3gDizXousMv@ zs&ZwKFD3}AuWr^yc;jA z-WabYJeoUjKXj-%rRouuL}g6=tnYja+>%f*cS;r;M<+)g{pY;~cXHF&)pcpk)R#NW->>UQsT7JA)mVxwhmA=4<3fj@Tq+t~oxDN2U{vey&uH93jhTpX6w3qn zf&%3(!!c{Vc~f*)2^H|{`2aV|3hkD!>~3#GOen4lm}rCkbOSB5RW`y@6bl+wOi*&N zP&#s~%Tmh0rSwa(a1lNXli%{`fJamPf@%nr%v#!o_L;TvKO!k3BXP>F3Qeeq?;N`c zfyeGotG|C|%J2S8v)|Ld0HG$CD0ZdDPtNjB;wM}*c0R`Orqjvy)HzoAc|n@vn3um$ z^y$1jBGmD5p;^nRBrPyKm*b{z6&#$kw)t6cPjb?rbh(KFI~TzOz9^Njn}fBPDW)7A5y{f2d7a=WK8x1sQ;D!10h*c zO2!@d4NicEkCf~8E?~6bfs?AG11{0ZF~jMK9*<+$e1eK|2eUmQM2)?K*L{O zQ>%JRAlz|w#Q{r{y63l(La0)|HYcZIrRhFxd?zDi86{6wk@*Y^G%3E$usoa|^`0L* zPdUmw#!K~jzcP3uxuy!TfTXRCSyi!cTN4*sBSn^$PjNmJ&^?JbNe2A%OEzpp@Gxo_ zSIutz@ZpRTXc-Bn4^})AjxSbfIqzVXwOF7Mcm*Kzm%a3`hgjeiotg-F0HX4Hf)%5t z{1{3;w?^}&)0e{xNGC*2{G61H98?5xCY*t-*#M#WlP*C^OC^!)?t%5LZ|c&iRpl{t z(~9+f7YqH-=tV3m+_X#>E`V^6NzyUqyT8sa-J!7`Jx-O)1% zH-Pm-s6oXOKMfOf?S@8ZXwtU{H2`t$OvUEgo0j)ALgR_MO7%q<)J`1hEKG;OSH&Xy zJ=fZB?-sEEm{}F@UeG_^)s4j+rWO2JKJ^{07w73|to!8jTDpl1 z>hx}vs1y|M$A_CqY4b8*^P+nB$KUdQhOczuRt>D~#Rswsg*RDu{2hd)rJ`=HV$E6b zku=-WL;Ua(eK5S>+hUBLj8v1OMGYnzws(=n%;qfHsdx%y=gGn3&BP^@NeL|3wTW)R@O^oo3t`X=A__P4v@35zqS0u0Qvf9ucXSi<8BD;!|xtg%~e@+gw^ZkCl+SM#hwCssrEjT5sQNfqwQS5N+4<` zMpLjdi}HTFja&AcD%u&%_|gmX5XWZ{R9amCb7<9(Xx9Y4TZb2$3hV(lQe}ne7a#Fc zE~q^8W66v2|MM^f??19MiDOgt$o8#CS`t&>ArbVG?{_WbQWV8xBO2ID!N<&`<)WbQ zcYCg^Ki-i#C*GXBJ&io9v+=45hAqph*ned9RR({g=7U6x=Y2nOB=-*g7h>t4MaN-c zdZdwT4Aif?nWEh-CEp~ZjzVFU!AvMvYZaRsO13n(q*R?ukNnrhS7!Zwh&nip_+J=)lB!zoQt5^xinA35 zG%Bm}`dg?0ZUcyVGvf}Srt^o`@GHS_4K6T-=8SQHIW$uxdj zvpkWobC(K%*=slbyf#2%Qv_)kNIvM4LYq$7!LKEEGzPPMt(kPmocXG;U@g~yu#WB& zOsIW9>fTOc|MH`S%9syXp>k@qrm2S?mj(tnk9S0@(u^irPgqP)T}GNl*_Q*n*;|*b zEn(v`uL!(|tC@S%Tu!aR!7X5=fCLjplrG8kwvc-j0-*gA?r{jk$0r zQd}J|7o_g!zg3t&Iuv8%+CP}d$?|HrS0>!J&Q_$3x9}BfC!aNB?HZ5_`SfiA{-g(V zF6(|K_`s1UjHvh*r}MGJ8f1eqhd<(dF(&ZE#L@Ah{1mCl% z1|hPvc=5b$2wo642&^$kwN}(voGIZhNzfSb}XaA6(PWMj+KiS zE~~KZV#IJJxu_CxHWfcygajobA;(;!vDpbQnKZ5#24#Ct;BdK-%&mWk*Kip37eXdv zUrUJ(Q#0eHxNg-ct; z=PE-PC{Q(&Ur=LTj66DXh+@}Uy<3qqKfq;K74YzJ)X4=o*bs=) zu^tcc5PyQ06ib*>C8{r~ALSL;igp{}XVMrV6(JDhFp<~}wW+7z%7khyOqJAz@v)8bI9 zYnmWwdeB&#j7$*BliAu=EDl83UzDm@2xMTFz5Z+PRZ230cZ3vUZAScqQa7Io^t_zl zj8c+g$8wAqIQTyg)3QS1VE`b9UrEIuK}%`*g1uCRITYU%Rnm#kp~*V4rWl0z7vy28 zq3v&SXnl4D_Gh0z&(x(L5kotPF%O|5EWv1c3NtM%^D84Tq61#<#BaWXy~#+jc2_Ar zD0AN!aoCV+CAB9^D=7iYqgbh%e>^y{7XCpaDPPzb(DZdsRE$b}SzI6-;rag4!?6F) z!#LWr6*&jk?V)TH#z>P`2IZHc(vti%saE?oRw#$LcW9JtC#1ANEwQ)T{n#J~`glT5uWsznKZ zVVeu-@)7Yt^mkwY4?nB1>A|HoKAA(|B(tnQj#5rVGmIV$Q@ZuzN`j5V%^yY;R-!4K zMptG9Q&MCABQFW=O%DMN^C$kRe(?_^a{eb`)ba6tm6*QF?`HIHtXHohiv@v}MQ%!F z*Fl;6M`GB28Q0Xzdpp;1?-56rEPav~1+ry+5Q*vhkHp+}!p`&*Lx4z(Ob|6x1fnG& ze`I-dKgqq2NGAY06K9e{#|x}3My(rEM!8R7QYt!BwrVtQ^5NB%FzqES$+FV6a!Zx? z-@{Q_;GZv&Y0~T(b6L=x8o3Af{dM#fvqKwrfuZLzPjrxxvg&hRy;U z;c%epF-zG?^)24r_>ql@MAhePlQ{Q zIxR)jDGPBS9VMmCsG-^J$)^_k6tR1T46FRb@+!DDDG3BsD+k2a1rsWT1*=>9ugY8b zOxPAQeKZkJ>6^!5mXCK#6+cKiEQSSF;FwK+?&RTiWW$naIQHHK@Or9Q&X$GZB4`MX zZr%2{G{JL}kD&kZMn_P%;9XvI@9tpx)LhZB+m#2{k7&#O+0RS_7<2K4LZL)|W<1Sx zq_c9oTa`nJ_+8h|J)b*H(!|k1m5d_5m%s1_>a%xH^M%hUk7QJJKIpok^UAcqAsR6C zZDm*;CyRb~&MA-45gWizfYM&T5fsHr0%-;eBk2lHi%A+NY8AT7Kubm35`sbRwbjMc zyFg#i)7n26;-&U?%?Xb`=0Nu)G&=v683D>uq8>*IC$MG!j|K@rV)N^z%8EmFRu)gN~YVz;w)| zzZP;f03BI6iP4kXbdjU!s51go0-WeE|Ndg5r*aO;s8RwB|6JkRh=2R7{LM&$lq5Rb z9_Km)84^a> zag&aGEwqP!<^#Xl=xK^wFwkM2ES2BXz#bTjalC;V9XJ>wvt=zCR`zd@lv=P@16Lfn zVFkZ?xv-BW>PNV6RB7rGrA|=UlPOv<`2*w7=O1~rxjp2}mksjLIw8h?7zgn(aH`+m zaC5jfzE~y}C1jY#%QzF?|5Ig{d_Imo5kbS{ToS8-uKWq!junNwM54}Tw)RgVs=QXZw*kPiEvkX}j+hzgq!vrr%g}Gu73(JPp z>@dR^2XBJUG5h;!>!#i2dYKsab5GOEWuN=fdN`%PR(mz{!-r%U+61+r*{sUB+2)>k) zyN(8tT}L$ac0>u;a27a)xL9SH|bPkSdHOE%8W{ssm3KI{|~gjkfSNrFiLME#|g z27{#Hl=6Q>?n06P-Kg*=?gZd&{BtuvzU$9>|4bymRqbT$(XC+sn? zz0p$t(SJckuwHcgt2WWz;z7ftVv}?Vnv-X{ZAt(`6)~AFgW62aP-M5BDKngbiLjZ( zgJIJ74DhMc&R|k86}RtxRH8HFn_4WI=3>u)|R@?B%EjxYGSwmGfFWbipdp_{mf96Ul~FaIuKb;&R?K z4b*m$I`z2H6XJI<4ct;+)#wZBhGbxn(85~n3*AeXHYV9Zot0c?2LeuG_R2_AaVmac zmcbn(zPngoO7Xp0LS!RqV4_)u%MxTU>s}eSqKryY74wR~g(((UbSlOa>yR$@^Ae?3 z4*JU~3N~P(m!!**548f##R+(eRT8C46*mgiq^Sc?f6rG(utAN7VAfk#0>HYz9!8Gk zTE=E5fmvir$(BMXn#|M>fPdrAtF%{)-6Y6~6$OpRpnj|MoWj*HY!fTFIJLVFM1y~fDh#AJbxdV*A$%e zZ@|o6xVz{1VXXdx`KXD$kktgXB#J@m?=bm>$7Bh{CZ)Kbf9MJYR^A$G>L7d=LUA7E zNJnERh-YStNFGuEecER56SlQQBtdVx-PepT+BN=nZ*VK83NDKTHq!W-;774xVdu83 z>$uj`iX#)O58-OIvPA@@uu?4Ik843Gns_n2=^;A*{uz~_#N4v;PO)OFb<;nH_Vp%m zfOojj{Lz}sY_IC_79~E)JXs_-nKAh2nC0p-jhT`={7jXsGbc&xS_G*K^vO1%Z9W|Q z?-%D6x#zj#qcHGBrUrlMbcW<1y&~ixVMm>mt2801TBzYvU^IJP0~eFfjfxoWU# zkFU$nzASX|Xm<)z5BS%L^}|(P1e1AiAFkZOj>Xh`4Saso$x)v*fWo{KE)PfE08jh>ijMg#l+x*ZomFIj%}_oM~`2foq}-#GNvU%ETF7~Ksdp&|}n z&h&x$d%yme&XNC;h?hYt>urfblqXHi2MPH%`rp>!Xl7i<>GaN_}3~1stE}tg5}|8rApXP z)}?=pZ6u}t%kPCn4clw5n!^N8Ppa?!TYMH^4nKQX`?!dM^nHBv(O%u;WfU0AQefog zi#B?T?tQ%Uou*7_noE8#&j0eT+cU%UWH_n-ylOIgoq{ABLzd`zGlIOKX85qbeb;@c zV0n1adhY*tyX{c}R$8PuJG$2wFRi{kEbSv>=Y}U8H40e2!wAgA<*8l)9xGlOu6HMe zGOkYR_+u6FTr*=|Dj*$?v%dOdc4q1>f&?k2UVeu!t28gNTUj0oF{-A^NiTwrH)q)P zxQz4RTbTkU&$B*hSLizjH%^|76fp$J8mE!WrK-`P-fCjU-&9~*2^tT=BA}i21<>{N zJr|In3-5PTTm59_I#g_q3c6^osyk4APXT1~S*ZhGow^KRY=>*t1wd2yo6U8-?}Toc z?@MlMZ16LlZda+jz9W6jLX>{eceV%T-P&nook`yJKSTCA;p~o*t!;&l=c8?zryt4JB7Ex#U2`ZSK{cbZJ2h*_9Ou@2AK8v4 z=O!=i54UG^UXBc2J|YAHZQ6SL2M>blFXclAC*Qwc6DOl#{#A6x8F}BptUUSIJOocLUh0 zSFw{-&zKTlibH;ZeY3Zbztvi(Tk_>@Cn~x=%kn0qdaJ+nzVB#ELb{DS(Sk zjWe9|-64-p9L+7cD3sM#npWi{Uo7vvv@8nHu`azGwMq1GAFIg8yUsSu+cC>;wywp& zPnmU%Oa1&fJq)5gGp#%)I1#@?Pr6vK)_bs)$8r{tcNX~Zz~`&s#-Fvm&c&0X5>lps zFz2>H2B>4?$lKV6_g?H0=Q=!(f8Dl~&56HQ*-+Bcm-n49*s!s? z%j5xGbTmicXI~Hy5}ZEN-FmF@Bqd!)WG@ITX3w=fo&8iQb@0sYv?E4uIodN}bbCaq zVi8+|4lDCy-v^cV1bCNvzMm83+-$Xw~x97RJ z7qdU_BVK~%}m>KFO1%O zo114MKZne&nxcNF5k^V*#`yzuM1OQ8?=SND`nE;MV@QQ`6w@=(#!tR(kZh1qrBef7E*^ z?#cPhzONB(ZoXgkk8ZCxJT+k+mB;;2{IhSE|DT^RV*I<7xbE5 zBqPvy{1(U6bzKC#1FOR_>Rb8o_!2NGXP1#=ne6MMeJe3jEDez3_7_rUKqV6MJQMsbCeJ;VlcHCG~qCKRR7SV&eRMGpb8y zMGv3}=Dfhs>OG})} z=lQC~a`mAFJpmmKy~hB7)7;l*iKF$Az>d1SdpXF`xgVQ5M=g&hBiO7N3_jPY^vAdG zw^saCXK%2{C2M8Saod;oXCrZXoBSSw4|W^NJx&K#h;EKNyZ~Kar-$21bGNh0D<`Mh z*XiEnF}I7%wmAQXjh45h6J&PaXi}MkSzKOibw^T}SJl*%9Y5T|IsY}XTB}-Gp!K?- zlj8x((#ihS`6>hS?p<0~d#YVu{e#8FYE#(L{rjEg+ltE@`X%v4>-E1^08Lw3++y54 zfeIff7jy}l=V zMPbf1FCBb(K=1c%ejkUMr<$cI`SZ1@%dSp|c6?t~ECc zJD<0w8Z(o-RXdsU?+mK$4xP8|55qfcBUM!=Q=2`job66_FLFJ-4FGqLAAKh7;SX>2 zb-(u~96P@0x_n$Y-#CkTyGd&FarQae?%LpC)U)l~=)5=G869ZK!9E}E`M%1p2ZI1JoQ%Ay~y44aWs3|-2+zH zbJTUHKV0Nm+tem6aE!Fcf93CaSQhtmxQV}yJyY{c7~ffPRzB}VECcyb*XHZRb6}#} zl+5@P@XY350pQ*(%(0n_4J~tic9+uPHNfxLgonS`?Q$|Sytq0#w!?uJpIh7O>kc9F zg6!ATaP|7sb+%+iX?11c)za;Ca-J1LDRZR%FtJG6>tKAg>bT+M`ElOW6K418Jssb7X**sz zeoSuM1?BAVfY_W(4^Zd2jkK1xxW@{TfNp5{HD}4HO~lK)?!C3eZ^xY0&MvW|)#qe% z;CO7HQd?lQt$xkyB+SC+Xn6l@$5D}B9jMpi)9HM(N88=%d9aFh-IcVnQ**Nh3WDuD zZM6Ij)3!^C>+kk8x=1~vq{Xu^8|CBdZE8H8ZOPernUYVvT$nxMDN|U0sfKzwBNp%q zY;<}9j@>NT-Os)spQN0%)Iaq10=YSDMtG*`1lZS>j(|#he%{S4Hb=V~bL!)F3pT!u z6xaXU?(E)9c|E_?x$m*U6!2! z;kp)(*7xo4aN>y%sO{mnBM0mbVRW}J+j~FZ@YTN8wX35)%i-7db$z&6w88W1y2n|x zUD_z(SR(xXz0K=vaX`+g(Hk@;-nXLXbL)Dtq1?1nmzBn|XKi+HeiPGl@A|P?>*aXy zZqVWNvHRR}KmXgEKHpW#=zh_nE zWhP_wfTYU_8zf}(+IY}j&{EyeOc&l%D~J3N#~l3XT5qqHXJdl=eXE{6zk6rr z^RE6uZ#GcVx2Nl6SD&$Nw``>9?Di333*hs1yCrJNA0mOw*BiQl&dc2cCZX^zOMCxz zwd>~o@p0qo2?^@v_^zo;MnO&YNU1zcIeTRQHVIJ0>; z+?@cz+JNzP`JHIh+x@OdYpXT!?bzSR0wo(^vpA;Qo+~&#d|#fM0KGk)HgBWj8zwJn z)Vt7(AUf)G6#mN&FBn8eJAJ?3Zv%fT$ZsDPx!PazZZuwO71wTV>^`2(>}x_muD{wJ z-Aj849v}nxd|^BO6j6c>SbIzDFPGLQt2+ahp9i2pe%=SX+`J|&)hGxfwh3}tqR3NjHrVpuIj=GEC3%W1D zvDy2fBfUVW)hcS7>#7$JbJkGUub@Ms$%b{ z)4uJO2iehV_e_;+|8gE)R1ODDgABZ*?bM8eCd9L`-QcJ4>(?P!9=04ieKl)(6u#Hg}mQvp3M(*jo-WCb2$8V!QJQN;Z zyZT-<2&*)|4P0@F4!}HA>}|QQ;!}VnxLkYAV~x*MuG&!7OPppqb0JjvL`! zg3)LwOgtx6`a>vX78)5-z#qXfI{^3KQ;(8F1POlK zjKmB?2$g8LPdjQI9W$RdRX|~uAVWI?CoPH%9q=Vk?5iRAAKL%ys8I56yLjg-e3PU-E5^sBTZcX_qv@zgH8tz-p>2RQ$^$)Oaye?@tSo_53)@%TDs}6Bt-=(@hib%IoXC|MowFx;+w`&1{M~M#5 zL~e#8?9;t4TREQ53qoWK!3K*LY0r7a9={mdXjM}sn5lJVcU3-0B8rpYBy7=;1mG_B z#X>;L{H&seml7apjQGa&JhcacdRgT=mvm}*pfd06(NfofDd3JNov z^9ddpUGO1d6F~y1i*z1jyI^<9{|$g&sBRN#7yUivOErR$R6m&76G-)^5HVffZW=P3 zmZ`dC6VJe)7=~1=JyQ9QfyFZ1$w@coY~34{?~-ty$czFxIo_TEZMpPbPZ47D=a4M5 z%JC^l#P%sPg{oIwY!|Y)9`1a@6nnhM*1X`x3sLZj)E^ zix}-Br9rNubuc{csR7P=W|K6$=3#1vRePmP2^UVYeLO}jXcohP|L|%H_1ACRgY(CV z^EIJ{TF_zf3njz+Vd4Y7Sj(~ZTm@2bhzGL=ZUvPu{}t-fPk?y>Xwashpdgb(3tI(R ztev7|JK`Ejg>%cJ=-<3S!}aXyu92{?jYX!y;B#e4EURF~_CE)ThXysGM+FP;Jd}F#8Sk@oSTICz zOA%Ubt;6kF+cD^Z)8UtlwMR3oWW|$3LNMgWqSXwds7`LOkqslwbXkq{;f8N?P88B? zc{Q~N(cwwiqnGXPG{FaD>O-q1yF8!y2bE;XiL2sjkX%_?D;{jlWUXNi=aCsZs0`|p zeF_J4V3wW#!uYbYYd|LNdbwpjU(4y`0BZ812TYXb%bR3bpn@Voj(u*oDn}bJ$lIcbfET5lxjUT2D3NlM^RW2TuXu!nbl zEyyrjnoJA&nB5navQ~-Y@IGoeP5Mj&?(`YqAbkYEcfhirpL?G5I>e(DEu9B&3Gwam z!ig*F;^cDNwM*`iejEe}jugQ8lOLVUTJH=j2AeC<4pG>}M<*i@%SzkgiwV+BG#dx8 z;(7A(G?Ogs`y(N@h_1%enE2Q z`eeg#G5pA#ZPAMNT#?i$3rcLd3!Oa1VvR<k;?>aeoB zt*twrR<7+Z5SYRwLnAwqA^!Xag{+}IH zug&Iqp%Og4eo@ODHI_4EqVtSGbdQ$&8WY_)QMliEU#garqsIhpV`zWaTNHHiX-B#F z{+ija&J|@4Ox&iKt{N~|=KLdvqnr_fRAd}?o`7&AZkVZKRa2U3&CmP3Cdm#jU1EzJ zglRb=zR6iQRDAD{Z~r3&VScTENLj&GoT2k0^7z%49)t})%g83~ zo7gMqdY0FzOQIICZ5VHbX`lz%TJho$`c{+KdrSZ2*!I=T_LZ5_Sgkz7>ztGR4a5$_ z*U$@nWz^w}jS`r}_|=wF@P%upp@DdTKXPmcZZ- zRqoY|VodgwmI+>VqHn&~RDJsut1_cy<`_yN3aMS!%oreIjlopWLS`FD#t=vwT(CSS zwF#FqCEYYuXdp2KfXL->wFcSI)a7V$cJ;PFD8__OJE~prX-5l3s6vyX(BKx}Y5xge z?O@x@XE8?PG|f6P9>YtEDgE5B&Ho!3oLrptg&V0g&5heUo0-`|IBVfzq|{i@z*O23;kI4*jz0<_h&|D;xUDvP=(MsSe-~1j^koI-B*Z_sHb>NWzw+Iq zozjT>e|S`mu00quuwY|*vd)Yssv@wXhP?= zrkhtZP`abWMB(;yI->}y(jiKzt?W@G)3eV@kPHK0{j0}0Cn;DJ{#sts1na(NCf3Qh zfih_KuWn;xpBXeyqmo2wj~U#iWY@dqzaTui4XQKl{69P@4Z@?QS~!wIBbX>wO>#PN zRP%wJ=j2kI<@z_I_`B<94n>E!GLk};u!tGN?SVFeyEXUt4t_OLlVoTJy8ngHzLci1 zpnmDtK7I+6>WCtf23GovWIFB6bEbY7BE!y(VQ_Dp4m2pXaIQ2&B=|A+3lVBM$ zs`>D!^vwmd)?CKzbhhUi(0Puw^E=##bS=CqQuw+i!*YH)Y`#3xH33vYTO}_;`2Evr z;lZLW@KcXwWCdk6BK+~=j?$2I*)n2og%Aq_;y{h@N{iu%z;?nR?W6Xe5J+{W4?}5U zGxLid*fiw+!O3fH?+En#sco?l8eS$8(- zWG@okVKEUlD7@DkA7?E`S0Ug8exJAc6Dbg?opM|)f^k8b!7qZQZ8@R-W`NJEx|yFQ zz$P@R8;PM#yAU#G^@Xp%pjNWp!|Uv5_WA$jKJKOk0YI6{KsAx;QQQM7vex6pu>E;k zvIYo~{JXzmlX8`r02Q9~B&3G&97a)$dDEqUpNT0{OJ8>rQWE@)>w6s-*r~sRA;T7H z;+|TB4@d^06vcGfjUGZ)n6Y3$NFN?qAho1bYndwkoeq)?Q6}WCxcH70gRRfF>Ubjv z-qY}8dXuI%>w9;;B+v^-*nX|B=JH^Eak{InkkIJ1r9&M#a;E+W>uc!3?fX>?_wi(4 zJK)u_$tAd#iK?8mOwae}^7{Ym=rJl%dvta4sMvQG1m+jnK^@%GM7s9GKZcorUzSdX z=yH}nJPo;sIU0K1?Sf23Oo?tWq=|e)E@V@I&-${}U@=-B@qh>dALF2TC=mr+ut>!R z20j5>m)|Ne6n}d5~e`&Q>ajCOT6yEq`dIzHwQl(rDFLGx2CYuj9_vs?6>?bAR z&o5n=|E#7Jfjvq6Q@kocPJ4IR`J%YMa)(HlHHk+kNz+` zCk-#SD@Y@zg8l>Ky0#n-jSraS3I9x?{Z+-b?-&olAxCDW{&go@s*#)x5eG`4X?TvM zCX+)h9h1Z~L(gHJoa&5gEpbTnGDQ-`{FA_5Gb-B;1J|Ya=}(PO^4M|0RTe%6H>a3S z0gpxe_naG@ihxUt_R#WD$gx5fSN4vQsS_kfsir0RNVD{lgs3aRp~-eIKU-*b{|Qq0 zpxLZXL0T31Eedfy(J_WUlp;*B;KM+%Ym#ov@T(B0g_e=?_z$}d^&7&-#Ub~LcuePn zgq0`MJjP6U7;EQ6(Ti`%$i#2*%;W`wy6goDq>91h%rENNaO$IQB(ARdl;qm7hsryA z2BF54m`k)g9pw6Yp<7=K8#F}fe{KuwB=H|6NW=T!bQkP)ei8pRKc=jqYzI&uTO_Mk zVe&7O2$?lR)y^{1D=)3cV13TCrV>8p{)SU@ZoiE?r*nEt;)M9T*%#*;eG=Wz^!2wY z;SYqgZ`k5k+EysCql?@MJ^WZUSUx?c&Y{)&B%3)@`^=`4CHlx=|f3mBE6E#yko;cnoUMQjO+X z%cY~Ual8&joBPhMc7>O#8%$QMl};`-sF?oC|F5ZG5GNHMMp=Gy(Z9q(6K*X&cMhsd zRa3&|6JxvV`QhRkmg!J>d%m@$gra1AIOZm&SIjub#Kc9Hwn(ng;PAJ+w--@t222_Z z6hredhRqENBZ>zJQc;i~RkN2${~>DSg9%@ZfpK?*DRV z5kA`OKY3F55zB6vRd#lVO`E(v~@K8-|(tPi{(a!leBH<Z$)#>o$-D8Pd+cZ_)zVJ`#3vmy@aZFVR6tSv6E06j>q+wI)W;&@}<7O&6db zp^%-YJ-G~fEIiQ<2#W@qk4t{a4Zt5^vJwUN^C3kz_b4c6_T!_%jz#kCe~wm;&Vf`~ ztiJ|epw%4`f2o7**%?4%YRWZ?k0EB;9Tt!g-Cb%r!n?Fe)41|vDc|TfRxF5ZQjX!7 z{V=tg`@$n=#ffQ4JlkBlpk2+(?O5Q5twWv$83H{wg+@k$?7$ubL(3MwYC)Y@36CGax3R&4I zh~+00&*!466i_Nbiga1B9HdD5(ZGs+g~RjR=!`1CC1?DZj}Pk?Y!Fu3`BbEA`3fLK z%J!ck6+M#vN`Qd*q$Won%?6KtOTl&#|L4wNoW7Z^cBmLdG211c#ijn{U&ZP?t7b#kigP)0L;IEew zrLL&3!-tWn3ui?&{_-u+YT#$uI#YtB;<$}u|F_?bx#EYd1B@Mle9U>`V# zk3njQO)k7S(z{Sj=rhywb;ZrVZgEGZ_4c)?F{<61b%4vC>EJ0#L5+j`g4dgAkvzsl zDoQQQc#At&p3U9x-_+uV7pTBS>z{cj)NF`7|a~ zfDw0`&g6QsVhqw$pmzNT1eQ$7GKPO3ODm^1m<7Cg8ianY+3PCDB6&`-bNzIRB&ju> zIak%2;v}vw`}SuI?d25AEy7XlD_aeavd`90TtlSrICVm^Czt1xn|QhB$RgoiBfUz!6q^THbl4^0B~bQ}^e+ZUW{^>fR$ z*AUeNDRLQw5E-?yEs@9BJf;U+Nd@INo`R^1kka8pFVtwPusmC_V~05ESMcmbg<*3f zkU0`wlP@x23xVjHIcI|i5&eYpsE zy2^Y3WGI`;5X#Mi`>gFn>E1lygz4V877B-ksD4xY+^ag}YYR-VOf;wgK1O)~{{a#~ znV>P{8|n{7?!%%mbdn{C-D<`uZW$Rav0hY~Z~2bF8PSZeBmY&R9hkL`({P88jtE5c zqmYZS)fJUkFv~c|Qw+@}^pVZ^G1iHrtvtZ{C3$EO2VBfH8mZE@T8+!eRE7bvY)S{m zr*t3eZ5h1w)}uGhH?X~@%%m>`Q+V5)_nbNF>Tk)tG6^@R(y4%Q1-Xs9SK|b=TibkN zb)O>;6RoL|skUEQbK+%Qoz=(;LVw(o$sxZ2rh0;9%5={e*$km*1~pty>L{0vTD2>d zoiJ-Ug*JZGvvd?sI~~A{b18XoDs@qg0w0g7Yl*{zd{P;yKQ4r(_kcl?pu}42 z3cQ>)SeGjO1AelZYdgOxF|>I(RV-Sq zF23+5DJLE%4sKjQ{|cf++jR~;VFM9mUH?I^YOLhvZeF)QnLXM`&yjz;aEY0BeXTfI zLfNEHxOkiqO2gECV76_Bpok5dFkY*Q7Ud$|uNl_%M}`63}(6&%AV6ZAe_` z6&kF5Y*X01>D1;-D8&>kF$`@viFiBmQq0Y4y`Ic6c(yedw zxp=S}dZ~g#AX!P?NtlklmjwTIs#f4@61Whp3y}-l4!=_pd2c|-V%IIYpTbGp3(lPq zyjPodY% zT;mJDiLfFfgIWp5$*_bWQlGJYaJ-%j>6&7MIHN{T40A2`>Z8xboA}p%*$a-Aghkfq zL}FEC4hjf~fhNeTRX#<*ueB1Uhy{~hgOi`d`T>=U_cYXpIhS9*z!&Deq& zUB)mGphQ3lSdq>I<9Lt2lNoU7o4yNfXz3Ep8U1Um1L6?0{tQoxzv+hLSjZjzY|f4eip2p|)38li zz$tx#qSVytj4hJT3m3_Kj5;YI-&NvJQG4K{D@3;$6;`Dd{AHP+BCrncC7rJ=NV5w+ zj#zLNtQR;QA+BFoeh1{Eh76Vk#AK<4ZO_uNmRi#j+6>*^w~A*n%loCQOmSE=`d&Zp z*LD)M_2ID-1WITMSh;*Em@Tku8kGvCGqX^H>m0p1A zAwV8h-bufWT->k?W@LMz0v>mFn*>2);1bE{8=?utX8cz_`k|kR5%r&#@jBTuhCT4A zoL$JZ_zt`BwFa^NoW-dK}{HRDKVR)S$AxlF#-Eet)&h+wmn& zV>d_M-oY#nR;rSQ8w4F&-;kK(D>H9?svBDI0IG=^rHVk7Jxj`W`FWg505l8mWEd%E zgq1qOoSV#u7m}-|@9IRRq-ilt`p{4Eaw-SKkVo5o*{C9w(YLQseh2|rpY!SSX(?HG zibcBFPgyAg$?6>R8y5nQil~2eecLxIVQvwckgOqg`_s5%T5``|b&6<9Nz|_U+ zMYHsxUv!s^CQy&33ILL{R0UH~E#&{9qy_&`(!msc+i7vg@MxWpgcDthptLoB*3>YOY9ng#M;XnU9%&*7^H)=PE8w?~0}`zx zAa%LL4OPBinVd)LVIy*1W4a`h!7!RiWhFH&_b!)W7i%F>0n=2iw&kwTZD1VDSJFgO zhOzcU_9WfEURD8YqyD#A%^6&+W`z2sOHEJG4@Wmei6%p>{cqEI{&Z9N7f}(WNhUFl zDf}o|@Xady=9&(e5dEUCsHtJA<2{o>Hma}YG+wHzHAx`Da`M}Uj~7PUa#A)$N7hpZ7^#tQkfV>3`#wcI@kCO6p zPtJ`jKC{;e5RSb3SFN@u1gr1-uUaiWmeJvoG!j%Q5Kt;nbICB2K>|%yS%oe%<+5Y9 zmDN3>6R1^%ef*y##rgXSfrzbXJ#>gxHk`KjjJ)Ap9WlME%oxPInwAXiRx8SqYviFz zt<7?F%bEJ^ADDR^;tThGl5~lPa96Lv+xmjQdNT-a&h@TPijs0mYF2aazj8G=f;MD` zW{Q_63Jt-9oVM?QfQ;S|z?AYdh&*>mhc3_%!X{JeltSzTq+9nBxkAv(? zT$Vu^=h33j94L1v0XAx`s=cfg5?(kuYxQCo%AugwaxEpJXBPw$2+>s$%CHXa*Qw<4 zRF6VT@6&`O_%WL=%SofiW{ z(L9(1$_XhO&YAe1ZZ(rKlfEYrZ13EkMwKejMlkRZYS>UJ)c|>7;yq_&RsDrjS5}_d z>JSOY+h5{^26I)u z=63ey2xyog6>yNjjbapdHx@x(!d?t7?Qzl?RB_R@v>`@Z6d)o>G|BvkZhZlUq(}0K zwD938LslxPUdP_ZbJ8GHS~=Q-tjg4oJiH>MIsjtD*mpKs1`S0|XLbAIQn00$Gd4q9 zQY56E{H9O3hE=RFA23l22Rs23N)dZ&155=!qby*@>M_7zGR4#7%}BSq=RngGOiDlx zZaNVb{Dz8&<`%NqZ*R10m~%`iF(V%qhD1J!wrO)BJ~ny=SlY01QbI~A^@>_aaG9yx zAKwikNR35JfkIT;bQ)Y7$&qr5^6`VuRW}8;QVJ8D|Id-4G^q{{fgNcZHW%2bH&bS+Puc`B-Hhf~%*(Gi9w*12MZGPGbqg@L}eEmmlDN=BJfl z!o>LhI#QIm-W{U(B>>owis5pPRK)nmmnpO~Stlfd9jOwxv0T?r4wir#t6DT^E1bGW z4K%ev32?JA!2!iTM(SL>=KBZH9jY&By;25V7h7vAst%DZj?EY*pkTN=_Tvg|!akc#Ec?V>4qrq2&v&fcBhBhHs43K~3vQmJ4gXjXXFdP#F+e*P z)i%)|m=Hj(X{uDPQU-Xm^~@l=9N1)RWYqAr&M(8!j}05IVz%h<2c8Vd8^FwAdWaya zoBg?DGAQEHwwHy2gj8NW7w77ZQ=vdXX-GyKW2sd@I1uZI65DJ9XUJ4dqaRhv1xnE@6-o%96UK2tdYt4X?+=Kll#<80(5yNDXtYZ@zoR&VH z=jCP>f^Qvz7j+Yz@u;J!x)}%EVNJs&#R;dWT(5O3-JRC>W znHw8>;J_gGrMzDX8_1*1;)4qKs|_ZkgJfcwU_vVA-)S@ab0~C0m?CZzOh~y0wGzRE zR31!719(fI1IlHPN5x>V%9vCYR@77gr_mPs)h#^EoGZu`x(hNqmNtXnWPKHR3@CV5 zhS4T^KTR7~adX9{B9Zj!MkOh^d<)xTb0o4hAbRWac%i9)r>}KBC>b{mAV!(-@LO2@0fIgYB^OfD#KIKM6q7uvWD`{W6Z_dF z8X(2lh3|MaY?6t-^_hih*PA~wY?~6Xd{!^dk8#XaFe9adYq;pdvbgs)35srRgW?He zwk427oCrmxf-P2v6boS^8we1ULbd<-YFx-eHn4?4ivMgM_K|Nc_4O!y;!lBO6_}B( z)MH(5;$*H+xDGh}$4Eo0>TkTQoX6Ikln}-!Idt{#Xr!B9rW*#-26+h+$|ETG6*pWX zr5L%fbTeE78EsCkH8Z2X6|1Yt#9}uMgF??5XqAnnfB7pPwL-d79sl+?mII+es~#`}h}RHq7gc&rwe=51xop{)lyDh+6=D@&b0 zeLb5L8J+(Xn=GoHD(Kv(Q2iasJy@k4x*cauo$yvFrbrH+KT|-s4OU4=iC9qWR)%*n z56U2l1J0avoE=LmtNk6&!ClclPyi_8`jKowKs`D9qTqeIuXA4LT}B(O#i{joe9NJ( z_AkKF+w<+}=6@jRdFx?u{8R}~zhtumj@lMDa5kiz686&&L25p)w-*&Vg~Bw9!hYa& zf*yB z08>|mUA2>bEt(`K$iXVC{#y(_kM`*_^i)&=4BGL!zrn&DSMt;&H`N_&3ug zs@+sHA1|yPm&120+1$sE9=^p@PmbyYYU&Ysj~f2xpZ4!A2f=A_sc%1yQo6)jx+``& zu2r9$4+sfI`1U|s-b9AoXMDMLvNoUk6m^e!e%5a-w)uGSZv77wW|B z?%r^`-ot(6eZPgpEzJc`v~GWt1YUtsc!RV~zw{;R)^7!yedIIF@##Jb8>?u(au!0wiak5M4sd!pOjm#LRfw*wz5%^)j_v+<7! zH*AmklN0^?C&Mk!0t2@_pFtaCqu}k;$}eU$7GZhJ=SsouIG_DJ=qz7N&SHV|t8snt zz$GWmE8dHf(2GjnP2hX*gL)P$*Hx&{UwHT8iJ4VU&$V5yxd{0y(&asH!TS!l{_(!C zsjqbQppaEZ>3iNB^pWvhh70>sbk}uEfY3nhmo$HU?Hff1a|EAd5{T)|1eCvu%L(6n z{n-L_ui3f0kIlKdo^PxPldT@9G>Lr=fycQ!ihU29@0nkQR=zu-zq9!{_*_eLM_<0G zDaKs)v0q$+{mpp8#*1Pzmz$yY7x>wYiOrS1rx!!C0~OR#;>bwu+YG^iKw?o^a6yrW zo5L>$8qY0pNINfL&kDAkhQN8n{PNu9gIkt{^-(T`83iq>M8f%jjmMvMTfxcut?+`+ zAloMgvMv6PU#Z{g+5XJ=RW}3{dfof9)HL7yN)4skGK_^GGOG2>3po``6RJE1VK z;X(9;Pp|`T)xz*%&Lw^bU|;<1#>(^2SVP!jn3Z)j7VYMAe+2s;AKC6W$$w3z_|lHF z%96V^%b0V5yEiP|;n>a0rJ!)YkV{N-xzW07@iM}6$&@+-xKS2ZoOzY#E`y)XKG^dx zCG(o=A>{%h$9}w3w%`279y)X3>Y0;$yw{rcAouAhk;lzmpY_}ps{y{dXS6=%zvL0` zjU9OEjlGKj(^AEMv@~}8KU#{^odBk##J&RpZ$s*@joZ^MUDdG@ zj9@d0vK9U5Qnrixj7muPvdGug*JvO&RUhQrBEZ;^r)apupW9!NQSGDbW0Xp~wEEmQ zEAmjf_4VzfOx4x2K6j?*{mb6%gWJomogsib2mOg*mJeI;h8!sH+eVp>$u)WA`KbZJ zXn@^>*aJDz)?TSAZo^piTjUL)`pzGufm=~d>7`Tf=Wur~(z|88XD59pUjnqxn%ui6 z#{9p{q>^qezj3wV3|&;vRz16preiz;E<=b6zh-3<5#QC^nhSKsjm45rKj+#o9k0E< zv(wLW3r=jb#1UH0KgrkhJwpDor6bfw9vnD#t^&Mm3tibn*#=paYm3tgF}MG0X>`uk zST&C6LUb2ACW$1%)CD<4lMcLHIyf6l4G0(E=->)sUF1~f7M<${!ED8EVLSJv}CmyzE)!((!jkBazTYmgG@p8QI zw4}y0Ox5w}#uj)#`*_R!cm}^}-U9>$>|x{ow0*FPzX)!=U&*{Tw!7Eeop!bIw)MPS z@3jANZH=4})UU`zjj8NBW#;wpJ>9#^%}LAB%eqRXtQCCoHB1S(pO9fC$YU`sJn`QL%e- z5ZAs=aE*S;>1kv7n=dCcb*W*nu&;_yLf2QP*Goaf_inFtiy>W}+$LX++w1cxs z>i5nbpvT&gY{D;@*`Du#v^}qfFwgX*Zh!VhU=4kdep*Lc2zZNsI!-;vom0N!1ZiZN zqM~cb$S>k2Mv8vi<<-p;=cZ}vjqxN(t6zSynT=aE@y3MT3R8Y9*ZiUbIT39wy+B~; z0!wtb=p-YaHs?pbWrgCceEp|bCuVx-x16tNm{jp0rdO>xLG8J`vvn(g6r$clN#%-c zkzz+kGjptPW+f>W_p;J!LUDe1YeehsT;Eln*oNMLePT@|(g#C=S4oIa^r$8?c%1*8 z?U%EU)AIy#?q#TIn>uQ8^}WcP?$NV(=hesd$BQj!w=_d;O+Dc?xn)erwPJI=g1`dHdgnf<5_TE`P?{IU43KK{W>jO|hC9 z8W*|5f(_IUmx7-6_wV~Ze!5&v_YDs>eCKW>Hmm}6d*&@&7~Slz&^te$z!+Snz@tsR zlyVa7OcjoukE{{zKSj<*S~4$kI$rNOynzljO0RYTOW&_nFP>$R&c9E~aVo59Y=HZM z`4HxUtGTG{8rFSLVvmmxC#VnJ=gvJ|4s743+o^Y2nwCS{Svw7VI;c$4hu`PFiF^3(MWB>(w-dWk8gq$}GK-V^QE!R8dymD=fZ z(}MlFtx@6a-FBqNd3vf_BkGJi(jG9)#-|xFaAyw z?W`dc9__w4mWjI4-NW-{EHp5h%ieACa?`8j?e+2C-KO)#A@^Qkanp;tZ0%ud-7^3; z)#h@mWa_*7^wRZ9Yh7FO_0CyeBK*_l&}qvI6O;S?dEY_c5ut7(S7^@&y!mHe-&>>l zj)vjW%jpaG0?(_z_!J)A4?(CiMqE8iuV;)K$?%tZPn$qM4zMdU(6fGTVEkkPE!5Ne ztye&|u;cRa?h3KHr>psirGMTX9%Ep`^TELW(oSJ9r)#bGY3O;4y43C9c+B3t*|6)m z_Tk>7KHZ>kOB3ya|EK$_7bP)q=h_?pIuGo!UUew*SN=zb$9;V-&&FqP!{Jr-J|7sA9Vj@?8(5a$fc;+Kjz85fB7J|p18*)Nr=`Q^PtJ~ zHQRgHyQ5+ElDg$S2-UvcyE8%MhR~kta^(KZ_zmpwrvKQjtdTl9UvA#)-8JpGuJeLK z{m5>mH+9+?oIj#spRV2t?_Q4R-M3yZ?11*`dX75-`)7cM>u%4wm&5D6!?DDThsx5$ zPH%X$pO;UoZkvXEBbJ0Vr)l;Vx%?hH+KxRn>s#Eu`4UF_}cgy;=yX73a zmBg_~ho6_n?`GZ~Eg)**)v3E`kZUI&FqK(gw!3(ZtPqw2?#V&`~pb8+s=M%kS z^!uzZHI?}6R5CQNDfQss31{N+#nQ`Kk@_9<)}m;BcX0T;sDsoK_+3yA7mW#3uC1m0 z!P+zUiA}GQucJ$n{+ud{Z^GAO+_?>-j2FyL(?sv|d zw#08<)>4@@a%#Z7jdXL(>Y@L10PWe>;PK7l#yg<7yV=|Qqb2eM*x89oT=@N0n~!1o z&o_sssw~;=8@rFEi*HX~%HFztXS#3c;jfNgfrec-*U+6C-P(d@XXiWfV;uvZ&UId{ z=eja6Hb*?|FE$uexPeQ*4tXmH^9w@=|@F)%yMKwzUy>b^B6iJJal>Dsj2 z>vd;^P**EQ;N$OEW2Y;;B9oiFK!<0et!bOD+sXar<(4+NZ>z@nic=P4tA=V6qM}N)U+O&rnmMgR*$Q2ShBar-$~hf( z6U@uC38bF%`&#zKlRxPf6YPsGY%`b&CJj$=<;%Bge7W6y+ts#s9A2ms?Zaez_rEcB z`yMTtIk`+=srDV!@G_w)l)jF<5+y_bdVQk*5t92p3`M>5Y$oVEUwuE-RY)v}CUuXi z2YR?a__FQ$ZbCBo;pIM^+mK*5pSe<<5ontsxL)uSIQ9IYWplW+wc2Afmeug(2A=T7 zw+Q8i*lzUW*<*4g>;sK+2hB~}=LgR%x8zgny{7jTQSKo06B z2d?A^T>>Mi2-*i8@-)r&qqJzQ<0#3%Pm$SULk$TR2_BQw=;~M11eXN3eF>i*3H19G zM9g5CQpq@+81;Wg2Grkr-35O{Y6VL|I9jcQCPZK8Mg`;W)Vhxv)kLYkQtJ~_p8F0a z9Uh$c))?QNSb$cdE1=~oK5p~@XUx1%l1-_~=Ley^2Pdbu_GR}0@n=L02p^>1d0MJp z9X+2E8`3rPw?2we-hJZxLN3?xkB*OWcV;GwlnVPN!XQ+GQ+MsypD!p*X`tJrVDgTS z@OiZ6-1gE;zLf~g1d5xgMD#O~1%WSLU*c<$On>ysmCy%a*Q>WGMw=7g@AyY$J;BQm}wSH=F*NrZ>}|dt_LiZ(H% z@dD)65h;D=FGjhCY2r*8FxIuND} z?eCrrEG&^kiMDmcL_~yzvskd$X<3lo4QTk8`B;`TpL``k$EDGZ30V#iI7|BTEv%|& zG*vl&6B0SGh3i4diKyMW9v9->lQQ7*QkWXg4OnVk@ENYG;*ItH7o7aD(_j}=-Skqj;*tFF&J(c@pc~3a0nK_U-<;BcW1UY`!uugO!^|+lDO;e5 z>2bkfm=S4w%Ico6u$~r1EcpOy_#`NS#)uSE_G2%)ahWPvYy9l^2&iy8e*zQJKoG}b zHOF+V+443vZb4vh3>r^{-t`K%iNk-9e&5-a+2Pr+IA*Pb`gJ- zz3{%qsiX}vz(7WKmM_QlwpZv?Q4ubuAfg;1>H6}O(nX}N4@QsE?C;{8e_-S!hhmWD z$N&P0X^8P8i(U`1Xc|1q>`0!050Dbl!rr@DeB&c2&jU%b?Im}%_oodj_l2+*WYb`Z zO+P{jl3^%k?`OP*(;LWqne%X?L7L`0rKUy4#jQ4Bq(J--v-;=PxGrTMigi+oxUwPY zgHI&#e~`p}pns8#icV%vLg-UgP-taZOB0S|rH$6HLjK`tW9x}43GVqYf(bl@hZ~+$ z4y*`*DhH)F+3h#9FMuAn(U*7i_g6T|yw!B3VJ6QYC_g(9ClyKH;X}Y#D@D5g#_|XV zXB?3trLZg}I0|5uSeVuXMvoiKN~u8DeXWJ%R4n@>U8 zrA*eaDt4eeA&JskDuyJ_wbk*>;xo7?wQk#EnmCjvVWKxU%JoED6G?dEx8*H~tC0Slu*8imPj3>Q7@;yh`}HUaA~;>*Y@t7Re(z5wKn1oomBhoeymQt65x51S`hUc&UHDm+SN^*4$mAa#)O0rbXo&haS7ck zi@ww^{p`hI#oR~i^tFGpbbxql{ zNHAdtof@Wvu$*8iQ@HiKGqP#i*fs0fk_jrPiA`}y?eaN{al{5n+7D+#tymtDkW#=6 zwmik=NI1pI$pgl9M8*>t|J%F#Y%E;F6CkdoXEX$9N-D*<;9Nf)Mw{|UWiVZfq>X1A zbEVlT+Nf5owi$?}Satt1Z?(}y{8y$P6D5A^ZnCVFY2_SwsYPvw0VH%FhxpKuwMeB3 z#w^d3K>VNcap1wC7w7}8NC?EGzx-TMtKM15vMA#^R!bsRO32J<(CF-YGc>+9{J+lW z%N)c}7)IUmAJW?lC5_MW?Wi3;niMYLgI8F|{$f_8W|Xl>6yu1bqj=0$YI=PYf~Mhk z!ffak)&t_KJR|Z9WdRg;IR1h{)ZkU&1)gQFWJaGa@QUjK2qY|DhK?On^chK{JClR@ zj!*oPqgw&83FfA7kaq*Ok>+sUAC|bdMsEKnGJgVb{<8br7aB!p8k_F!wr-~ihdlff zexg{3hk51SBPR3v5*mnoKZM^hQdVRRQ|rrk6Ag1Dmdd8F)_HmETzR(ntwf`VfdQZN z1{mg0EszP;G5|}?>I-buii~lG$Y7I<5k4$j5Y`7>@29$G(hKLUZ3kl*4b+L@R{ne3 zHz;1vH5VPb<*lBbDCEr71cpHiJwYRe@5h1Yx&P2H(|*)d>s<2 z8cKZLjkgiAgi8~?O*3(nD`v@~Esq#mWLH|+lt>UN^DGb4GAeKtPVG~Y1LTM(C2HE9 zRikBj+qQc)A~On&28+=K?CM{`6(#J{yTFz}nrH=0|H;+*Yv$~IuyXNl6+X(rf$;@p zmuSkee@t`9OXRMBQJW)u?z`lsx=sB}!#tb{iaN~QY$5p`D_*HW>#DO#A`-h8ipaxj zdUDcF*qnZo>K0aGS>f9;-1lDa%c4&J{wcYxV2`f$n6Cb zv)?j2&=JCIdE~&TWHm!Q44e}VWyb7Mp6SEk(S$0hO~eSfI`W|V3JfKQeDka zuQ8Vwd2K#~sfIe&f$S&MVhWfDY4?kDoO>$B8dckZR+`XoSTLVYCde3q8j!$?RFpKr z^WRy0C|%*HpW=8Vh$!33X`9drL%~iHP2SBD%HWs!2A#RQHp$m!(ojy47D@0Y#r7}s ziiN4|u7DY}NB{r^I}ll87svAQU!p|_%PRUHqlwgc@S)Kps&5fZ0OX7+*FtK+#e1H6A<$|-Z0?NK~GrNhb3HLF&L zJnBP>#PbU97Wbr`rm2gD6Z!NC-PHCZ|KD6;CvZU{yohwb$!ut^cZiO3S5Udbr<2J* z+jZ*w!IPk~yx9$xypkN&!Eu4OpWvAE(z6Pt&x4YHaoi*+iW*&L@jRs@^mxZ0X@@_J z(N*s(k><#;Zi{Z0G5@d@0`d|Op5Gxx*Uc^n!JWE0B`t}4q2j$cavT>?^Lw6Ed=Z+J z2F$0;7p(j;R=45g5X_KvY>zuD*0x`;IAu*EA4ujkje)wkw{YNS*Krb-yaG)owG}vO z^a3p5-~3!N1pjWR;YzAy4~<`2Y~js_Zzddyu6N@NcLcCf zf?=(OmKtYmUeBEJ3c|YUMbBmg1|$)I6$j&5nO@$o97;AhtC{P>v^FxRE_quHkWc2} z&oHEVtyg^4Loj0g`FlN6K~p41bi?D?#M9yV` zmXZLaa-=)9Z#@9E@_sXzKt~RrTdG0`QZz<{5`R8eN&jpw+cpeVRhS>WmBAn!fl1en zlt%t97^gecb-w^?lG^ZgjDiAB5#UK@iH6DtIn;?4<`t#$nwUt>vt069Ro3GsVd2CR ztV~Mb3p8+ACy>qUl*OLL{f^@?KUv4=#Ng?a(;5Rw3D4$nk}3xiNa~0BEI1S8ch?hg zI>Z2EJhbyHF~zY2hYJZULl4vptek&YPf+C}BO%2J<^qttEsty8N}7F$)SGVbIyr6Q<; zGT?dFOrQ|P4)*2l;AV?<^AVaX0L2NxFR#$wf>30b7w+k|jzza+#(=Rdk+gVF04mr7 zImGW%9u3a22vo@yHT6P4S5}5{p}l9) zHveLfhLuZ$GOguoB0qypgI6c2%OX}XR84gx65f&NM7pQ4jd+G#W z;sFiA_i=cI^1DGT#Q)`+haoQstnrNq!RAWqTPx7&s*Lc{GHK1%8fm7-iG7RD4{JY+ zPGU$)iSpQIfTb%GK}xeQ;$&Npft0ae3uaxm>gz~b7R?=vE36#UGJUO7o|M5b$%Pc2 zO4nfE*|E|~%7k;W)`g5rS+n*=0~1Z;&&q0^`ta?U^vdN`qkB;7 z^(t6MIyA^UhZbE^8cD6&4(<){08^Pbmo1enTuJ?g8jgXw$l4GsN>?aMKxF}SGLIQ0 zGNJ(oQ>Gs$%sjOk1Bpjb&spc%(?P128vpzAk>*aK`|XVZKR178+Up6e@|6{a=Z&mw z&uZ@ZOdsJJ#^`R%2=&Ny2$b z4RM|+3nHzT*zui&j~k02{+N*)e5;J!V{gnB5-bS%)}%xk4nf z`jVLfYI9Y;8Y^Dc;h3U-!ccxrkfE6^&=mfQ2;1Wl4!#hz50#X)H0J`&J6G}B`qB!&Ixj5g8!%7B z7utn*R|@cEB7?;0@UF{z+}ZW{Oz$Cb(d*1LGo6)%ObRXZ(9{#p zHoa0bV=&&MB|3gt0!F)r$3Uma@oyfLdYGj>Ei~d=>|Y>BB_0a$@@nIf>m5EzqGCxe zr^OW*w*cs5V3sY(8L;+F7L{O|^l}B~B8&>&r@6HLAniDcB{kLk zeH4kv2AdR-i8^(-kSe<}lz9h~JQsOBb9`t-d|2lglP=lrWxSU#Se0%ST?~bjE6+j) zl}h9tVfWX}%Y+(`W)+o`+j?T*+z9Zk0=KZm;O89z$-aPIJB8#fGHqLJJ>cgy0}SrA zFR5yE%i-ME6{7%;fZ%tYPBPQ;JEHC>txD55!Mi*(*Ez%Y16=)(8MG0Kp)d~eMZF0M z@m`(;tl=i5WDg}v4C^L-UHUQIEBQfini8U6z(hQm^5xux)sPTTYl%SHJnF43H8qDc ztqcJ&yg9sDW{re(&Gc_rItU}e!Hggf@1y{iQ=7+e7mh@H2_9_rY$qeEzMYnAE$eN; z1|As?Y-<)tfBl#}%|3x_B#NxJhn4&kU97pBse?7Lg8l;>;^`r6rmZ#qU|ih5iKsG^ z3fV8e%@V>j02@?RJ7?}hl827Y`8PjxfP;S^7HR_|)PMWC{wR_4#Nhp1DsyTroeAp) zeqMWc-P2k>+U_(0p>shTI#S*{w?0zrMU-MZ(`)Y{nA%eC9;jN1N$X6uL33yD<`=Os z=Egrd_V=9ki_tE|MMz6*?BZBQKT1^<`3q+9HA8r<^iY_;TgmF1?x8 z!2;9;?xsp;n4o;Bh?D?K#Hy$vUW9$Z7Nh4{#R~7?V$I4NGL!t2hx^=p}R#`nX`cC0vy~<+xZ{-4dMMsBw>o;T@EmNDu>IS8~<(YqJ-c4x4CN$ zFU^;tBcgt}d1_aHrjlPD9yo>8O)umsQSfm?)hYl34`F>KXH&S%l`3pLwXqeF8vyOc|502&B(rn zR;XHlYsXo;DWWJ#z)R0w<4>0g%mPeC!9mP*MMg65z3*x{gcnI?~TSg6jv!` zj@+jB8RQ#bbkBsc)a@}aMESW(YXCe}jH{*4$^`!D!wS`M39O@w4QqS+P5ft7o+y&L z2k^<(-c+u37Vr1-`}EV;N(@`*Ks-;BV-ahN3rYuRRCXxCf}XybedfZv9o4M?Bz!Pv zlIw2NGL<{IV203U4z}r%KWJa4*?J{0%^I#quey&wwb~?0S=X+TRN|iL0d|m6yhKFF zn58l=r)O-s0ZqD{(?%H%iZ%IUSqTMsu6W#t+X=Z?c}AE!)nh(nxzR<`&r7MsxbDZ% z-p$zi%21j*-ap%8vqEcoh;i?hFFdr1H_PQpp)KG3gI{^wB%5*T#A#RUc~VhTt~w2i zpn$6k`0FYTUPKaAZgf5LVb_-tE4lkyiliOJ6KMTwf(8mD-&ELb* zo3}q}39oGfSX!Ak?egFSpy=i z4R!ca6sKTvSjBiuj%eUzp{-726imf`>e?qj(opgwwpMD7$FeR+%0ntis#F~JNl=cu zV&u@RWOi-q?ez>j#?f;a{QUJaT7u<~3m*D;20Ab{J&-*#1oI9r!U(NUjU&5R&7w|V z2|zZ;3jqh}2$}W_s~aSuiI){_=PUbx9g1}qm!LJPDM4MfpSMZ@B>`CKBo{2EggY_v z6iJ9`TEw$4nH(Kg=^c_#aFp`*kJfB2%qk3>O1z*~VP^krD`C^1-RwbrkOamdMz6k|{P=a>+ozG^W20-GqfvTq6-FiJTi%3!30=zYaMnxH2RkTRa78 z_Ss~Cen>!;)XX2sO-NfhX)9^9S9|nKPC^>R>6*h~&`4RV0BY0dmWHPBr(1qHQT!nJ zpHDO@c=l|bRLo2s!5KKW>;dOI@NeILL60+WgUlnpD(4yDR<`pd&n&MH{PRV=YyE|P zw~pUAX8-mK5sg0cuuW33;kg#WR<E7*B^KLItCg@~L5lMC3`|&vCE^Ak2c$h=0 zN2x$mB5>q&XD~`S?uw(+;}S!cr^fQ*&M76e4h|~N_WhM=O#)4~DP_Qq%JYQP$E|jB zRMXhcqGi)K5<`TlVPg~gOl@!^3m4Vryi$oekcrd%UmkrkZ~ppu`;Ka@g8DGZ4={>4R$6i+z8Y|mLH~0D$VLQ7p2a@*`u?ezC_5__qX+{-Laa5W(Bm*2E>vD6K1;Q{?4p4! zkg5L*kw5fqngx8cNWmjXxpAK?Y9?tp|t6dHY|v`!!_TSeD1vOM5s5 z`myK}upFx?+=g}E{$R2wFYUTfnh49xlB+M)U4J&DP1NRfIR1Q(vo`MKyEl!1M9vTu zet4Q=Rl>8HraI{t9Z()zIYA{XucnuqFUpyiS?vHR?57_D5Z4wti$h&^qj|`0<9~e{6XOP?w-flR7bF3=NbNjkh@(r5B-A)Q3WqHr!tbDK2tgxAE^Dn=PJ$5{Mj710BD7@NC0 zN0CI=vQXgwpIBi3`otI`u0)^>li({>TUvaxxc{m^+!y|aL$K~f;%a(?g{Kw0)CF>Sn2K7;HREeOPm-uI zhKtf>MUvBr8$)oLhnamJ_<@y?vsq7xgAB1Uv`7j*QtfQ-x_+F-6DA;+GKKlWi~5{J z9v}vU{63b@fNP(KNBQYlH%-Ba5bw5py}uD5ANM}VU@@cXE+(oG5YPf0D4?n_I97d_ zmZU+0*_hJRt=;vAg^+NU)_2fXuXZX|pB(vlsWv`G#KtJuhg)Ae7d^5!THe}&%EL*H z60&t4k(l7ebNi(GQFask7T@prJ|fq z%AoP>cl^0D2uYr3vNsgr?6-7ZTNm7E( zIs2;L% zwhy)fv2yJ3k?IWKDM?LrHIR}f^|fLY}ZPE2m<9&@ZU(lGS1Bah1w zT7e{Mvvizcv9g+B842!)8IcTP*=I|iyS=^_^x<(5e4AYAl7u|;gS%UBM&1rj6KSHv zw~szQDGw`8;`~fd-@c)ieU;9VUXh0R{{YiKEWagG@jfQC$!#EP6r;&ZV3d)lEtgW% zz6TRBc=1(NG*v;z&**aa1Pv@yGn&{?l%PnoEG8*D`k+w5skg=j;ASb$ez@`Y?voK4My4<_g=;uj$Ia2QW+Y~{q1gh9s{lEPtu~gL zi5++|d(K+6LEZJrq03Tdj@E(A2waUr8e$63RW(qMdyCmrRn>I4(x&FyLy#0IdIZI! zAvlP!#$c%BWRzF9#*wXJkp4k}NrB2hX{K?)Y`ia-`q<`Ht;<=t2`<}EW;8Z>C4`HF zgJ(PI+v|^?k7zKW!H5ReF>W*m8pJ~E2@)3R_B19n#||h1mdK51Ad8R~YO$sT@mZ2B zEqH5Ps#pTjz-S#WQQtv|HHmX?f`|-Ao}=k4)Z}ZdQqr&{YHZ%M5Ov>;s28%Pl&!_w z6Wx^=F)$a<&6sA2l9$rN7l#=vdI`=f9XTMM!XoO8zKk2`M|VDg!5B6gtBtOEwb4At z&{e7x4Pq9xvc5Tk4Qt7jTWi^w*^LQQoRr3{W{cnyNV>rF)F^ur+Xnj8qVGd>6i7^~ zjsoa9-VtMSzRymuYW*?fP==5}u^=j&aE6?uE$|Buhricbh)BWh# z`RHQSy+&TTY9k9a1-sC&(ay@F&5hL&8Ah5g(uC`%mOV!fAv9qMF~q4WU8|bV+=KJb z$Ym2{CKxD%umF7yfjZ~eRNrj$*0}(&B+5e*I75a8fR4QMWUz%kF9CHqPN`8*`r)yL z;n4{}C~_3bUAnK@6xA1|OqFZq9GvwmtrQBz1*5-mth(Dq;7ae&UN)LwlC#M!b^_-l zAC2RfM=%({;97zK#W{M^l5Y@O*Cyf=LT;tG<|Q_lSPguct%a)AmNT-?>dg1?m*P!u zz4I(fZwLqjN*16;^kBMc&m|?H!nHwFhEOw~ zJhD+*s>VT29_a335hCegOo1CGr8CRM3<3oo7OQe}Eaw;J2Zxgp4n{Z_;o$ng0or+_ zv13jp3JQXnOfW^fhl1Wan3kl>ZcCHQHb>4r1}y5*TM|%zJmr)_iGE;ig5lPza)}UK zA9aRMd$}k({plIAB2ftJ2Q^Sdk5*A(jGcb04A%LC)26dlS^0nuK7N|~5NqgDf|QF0 zRPOpq=*qEsXMt3)DmUEIZT$~|sR#$h~8jp=_GK6O7+7k2wat;@Y z4M&s1iL)azj6`813fE8DNbz8f`O7WzG;3p%)wCKblAUjk1i5g9*+fApg%|_uqd;Ww zHLK07U8OGg8tMQTR8msVOPheB9`l_#x?;nI77!))Wes=0#L0>IPF`m zM9G$3#%driIO3A^oLZusJoTVaik5mc)Us(Cc>|CZn^Ep|^YCgxy8y=x8b6#)%FL- zH3f$uGyvrvmJ^4_1j+Z|2+~{)K{3K9&_MLjOSVyQE~H?SvDsEh&PUs`&Px_2BGd~O zJuVy#Mlqui4MsG$j@-b_Gi(`zOkt|2N$CF=j@cKOPCqUn1H+ahqNP%?_m&wDHR=N1 zDr1O5#taFaI)#H~)PURW(X&rAHrv?NfH~MgKG*CF4`!76c6$}2aOyk2R>Aa9Kht?dKm@giH6-vX9Nqu2Z ztXvnA9@LbFTVG1`Jz?^JGQ?P<_81AE_1ZCMP7A3)5~s{Hm*jh`Q0yj(N8h{z2vCh1 zxSYBl8%jn6oIyvkM#j}L!QkX@XLo;Z0)q(*CNMaMV8CY(y&l~! zJ>}CZO%$wN!;p5!+N2sF%m;(frZ^ZQfF2n_OJ$=-#9;zc?tqGLo4+A9WzlCwG+*$76cAz`ZpRRfHyC7a)ffP`vy z1e~Ij3)Wzn(2IfO(z~VIyu0>rLW2nnCNwyQF=RPI47p<)b-|%=4jg*o+RfE(ZfKQK zgZWW|1ndI47E&JuJ{LJ@keV{giP9|9xAkrkv6gP^GQSc+s=xKG4} z9}=|=7C|nK`I`T4UVn?J0LRjE;b1=#NtbMtMG=eiN;Z6_in&LC{`}qzok$2v9EGe=aI?fl*~)dz0>GX zF!rmRfG)@{%CU1yW3y@0DsY72k^zHr6iGE!&qhByFN`P`-$$=CZ#=`7*0XRc+JdpA zfZPK$v5&smsz4bf5e5mIvabMDvg>luBFaXkMqp>D+eVMq9&FyccXxt@i78A>;T$$g zb7w$p&l-Kw>vUSL!P%r8A?LKvG-i=@3F`9kKQb22DNUef}mAkxT; zw=>jWswf4sVM_G5^XTANvWsBE0~euzu%{A3%cW=yl8ZNnAu&2`GWN5gc25~OiVJn% zWJO2DY>12$MbV4K6oQw)%N4zTa`W!y!<7jPCY~_yg!9f5&Jt0`9lRM&XxJFs5H#|_ z35gw>%?3Xg8O-!%jiJ;Q(d;vXUW2CM3rI+n!lLkUQ0G!@E;f-6ppJHzF`E}JX80il z?|guT-EkOtbwiaEPi2u}YSbDxhe{5E6Z=*wOGzx%jt!AGIG;mLok9#3O}&CrLWbq$ z8W}R&xibO7#1bZ!a2{LZ;2Bbl)Lix0MQisUPz1W<*m@4seaZ7#0z?XgqgQVHijA%S^squu@Z8x8^pW5N82@EEdFtLPl ztz!gd(YQkq)b5Id95HnB*PE7PHkT0=NS+#%aJ~1+T0&-rqsFZBXlqZw#GKA>b41A<5e(0t*pHhpB{2eGArRSg+y zfKEND_u7C;xIoesAZS<^o!~NI;pNeZz4;SIm|$Uog>&9onc^906Hr{OildF@5C@W+ z&9c{+#Yjl;HO`l}W3%0uyrammQ0EprP;x{u^+Y7#HN{z2H6xtjyY5j7utnW!VWa# z!k3B+D~}&cxv10L(X@AT9>wk847sQn5y1>cZOSZYhPl;B)$DqX+VXsc(5m+?D|R~v z#EEn=KOcvX3?=?@G;h0<~UMTCRvGdyT0EfyH}A#h3tu!by7OFlwZm zBn-v^u*IAT2l3VCfI%ZPXRIfb6exBKsL=GnsbD8txUkf{qm@TjZ{FKn+x+S3`uYS1 z6HS;@u+K3~5IF-)82S?}^yb27F++veL+i1?=v|`=)QzA}4LMLiU#WN&2go(`icq=9 zf)ZxplDQ?p>T-=WaIPf^N5G*%C+7CMY@A_X_cRyClLV)!l#w?jP>c*X=vDG4ydz0% zNU~;C%)VA5QAQ>b)|j%?6fa(rWfyJfmaBrD>+VoDngRw!KD~WbAH@<`r5F29jCC%@hQ_ZtC z8}GDnaA@AXka_(>IjK0K0&YPCo2S-ATx&`}$(Q0hxYRj!WXX_g@KKX2)Vkov=xP(n zIT#hdluPj~wdgRXYEy^YM!&W^+9z~|t_h=&iw;II2rn8m1mkqD+-#)X?Y3#FxN-QH5p4p~N7Yz+OGN&w0ALvu?LLp}~X( zQ?&W~RVpx_p13BWDRDnR{W;&=eLZ zA9=Igpw37^&P1Jygt5~@lmv5#wPiKiwJ_RT^)yD1eTgoy7IqXwhXdSI5~Y|r1mgtQ z0)%cf$5XIXf)-Mz)GwIw5k><|^vkVhK04k%eN`tonBZW7gY%bsgz*efgkDBx+*jRL${jvCJ=A>m0nQW}(_zhTId8l827TXV(_MLF8`MIfH^5N)xRo)R2-{ z^HiCjRL{wL`^8&Dr4*{!jw++f&IbS=#CzixW7N_5*?31q;8YCh40{aqj7qc=0(O7V zl8?ZnvB%|VWM9e0cl3CwQJBIAQ-t~a3tZqC1TIqJ-uvi*;~nbIgUIS5^h!Opi1TX{ z%nBpLqSUK2Zoypf%0W3A)DY^TW;#U>#5D|v3eXxV76T092sI9M3rMwRq=ndk1ek5Q zY1AWl42BRMBuS6V(M2!0V2>rGociEAK{Y93wfpm>!^I0Duzg*wz{SJOm5rNIh zZB<&fL%Fd74?zn=yS7dCqAB5#eKg6tCF>nMeDG*G6f*! z3r7`FpkyR!nb@F56Dmw3VIm3VFud%~kZc64;|K=?nLaNVD0t(MdQgu7&~WTzp}|5Oq4i;%eJJR}58dp5Mh)gSPjHZO?FJtWFlNr?pc@Ml$2=NmE|9iB zf;v>KA;b|$a4EUcqO{OzEs0Aj>denyj0VuVnf}~-?IUiGN9X6RWRnu345MDJx?t4B z4in6+N|2$SjiY6BjTcPi2xTCG<7G=^Z*JVXxBk=B2ahK>nBZW7gY%Vabhcfh>RqEU ztfenpK|-cpp+qyxDtUecA^I$Jv@OFXnTs}a!bdOw%@y}%k{9d}IZeZ8qibTYlhnSp zlsdZXTMN~!b&kO=PBsEg-jBpm!W1AnO2l5YmtO7qL+mK$#L?@>aD~AZQZ7amV$mpi z(K;poAi1>MfO2~?)uc^GFd@M?+$N&4R3X$eH!$5W&1Hj7N zei1GhFhovd&xcs@;S$z3VdLOt}`b@@a9egv>sVyEY7P-pgCwuHP%9A8z{0nv#wyfDwP|vxqxB?TxE{1um!H1!sy`U zie?JgAbaR&lXNadJ}{t=3u$5MseuND6m0IQj*W6aG}_}@k=mPdY(WtRT9l!X9g7)6 z;|&Qj=Pa?+3#WP-&_3m*s-E85xUs&mvT<|jsx~o&DXwtNnSzpjgcONg;+OuaYEEjk^vLeUlKadbFafDICT2-UUGMy)z;NMTdY=Gk|b zMypRT@E9uF3$X#v=9m=KbpsNzK^%%i^wncZ&KXH)OrZ`n*Ic5*nhb$}j2B^d7cBdT zP}q%zs>{TNyPG#BmN3D>1PkYV1BuU&hol6qnTPGV4-u6{EBnf#byThSHop<`h%A6p z?oplL3g)PViC~b3>c3U={JS)E>^ZsIw1L+GXtU===&*w)!xe4~a*SnhxY^)9#ElH2 zLM^e~LzPsV@qys7*WPNZsx8_;z}feJ%1s<$FI?opQ3fZBORrWN$S@Ix2^l72IN$O{ zXUb4bQUYl7oqJX)iJg>Dx|T;6SKR`6qgrYW#0fQf7o>VJ`&$s988&EIpoCfxM^$Yb zb;caM%h14B#1Pw7Ck|4qqMn8>k#goy$~-jYfMX5aEn*6s^EekvbUA5YR5TbG1;^kb`INvg zAuqxM=^@wDG^dO{xf)t2LfP0uWvDJk!x@Q;$wMCvc2Y9Xp%xk=6iWTVNug45OYXh= zWYhmL>0(bzVPXpZ229}$5*HoFohEuB7L2{Lo}f}HF_@M2GCxVRo8#H(RJw>8ipE~e z?An>7fFoT{*j$Ydq;6PdR=pc6&}g|C3xN9OV(TqJC?Q;j2AH3zKj!Z8JBfW6$%!bhes5rv5;Ohn-vDjvxh=sZu1q7k~g>8y!^x{%q=$25VM)v8UnbqAf(`{cRphCHKtxr zS?qd&azp!V>ZwOVitZPN6owK8x{?Kb@u_eKu{$wyA5ut~$3&o3XNPbGK@Eb{C=ftZ z?e?pSR>1}dJ@Zm?QtP3%qoYanXhMSt4bI`Vk=f>y=-4r$WUf6GOsS;U zbbj7Zj=p>I^Ghg*H5so6l?q7)IrO!7%yOF4!gvdL+@Ta!O)9a&?}(_?2w8t6%rW&XGLNb5o&ddPj`(?V#f z*=DBQbwjqCNx3FS-I$25U@w#}7&!>e9+9Qw8+`%?J9$#Kn4$<%Df7QUfx=mYk3gN% zT*SHPH93(Gq!#uZp~Mj9ZyR-TBmWsFwqjHTURhJhEWfOz34dzyL@PL@vaSciaa*z`O_!7Dgxu}c|oQ4vyrP`!62WSl9 zf)NFZ1PIGj#M?XAwdeiK+X)*cqA(GKb6Cp^X9y}w$rvbj4icPs{h~!vkeC3-0Ac>V z5kqi6%#8as0t#4NjL-=pm_<*t01ieg1F#8W62=^TGu{wN3q1tt5}QpRnybH1*#dft zU6pF?7&Io=J&{e`k!GKLcjB4ROK(FCZ)}Y*fh&NGTWRT{!GZGz3G9}de!6XEZ%^q) z6BtZja1O!1okiHf%%{`d110F1iE3@p$B2?8n`OnhV1PMQ$egPyi9C`7Gz*W-=_$`x zuxr%YXnWS%*sPM~xOY(RQkRyx@q*#eGsm_th+y76N+^*_MB^Dmfpch46PH0T5Rzat zV1s0&z)+H6iKW{2TA362iv|WTK2lh!4Bm^adN4&0CM=k+;5>FtAUcCUc644#cg{?E z?|I~$B71Wpt4ANxe32t8oIvf^954=z>H?}>XzbIg&t*XyomM%OJbLbo&dO>aW(>iI z4V79kwdy*wkjmnKai~gzS0<~fBK`K=T;>>JF zASv23&euOBGFAX)X}}-@T&2c8Q{g0NkixLmVm?k-V=Iu%}|)y?2yr zr-f~FB%1vfRENonG*7{Jg*p8`=g}wH7=z(k;1;|6$;XyKRLY1pANbD)181Pg z-%*sd@&2KnU9-o|AmQc^#op87+1i_f9lNc=pMT!gDTFYA!vqfJ797ryYZRoVnj(&p zV>W^id@$~iLKr(b)y>y7>M(LWMT+!Tg+r+^`A|a8kdwo@sCmNBrmJ=^4iVH5z0QUZ zVE(?1=QIas)N#0)Wji_2sR+uH3h*9i@#WTUBM`CKO(c}iyyvnXR@J|mTMx{FWfL~~CR%TTaR z^P|g+NkNm5jZmQrx74(m-*3jaM%NdJ8$pEXv}kR^-w(x@N`MZ=Uzk;0!59;ITo_PD z0V5a@=+c>}*#NPm=BkUSNk*k1Wg#`NFovF+Q5g;FU2>&z>=y_c>>Y@X>1Z==DGgoK07eX) zXBNmV3+JKR9b;2yhI0*F4V4@Di$)lTqVRHy6Yj0At*ow2d|^U{2^r40#F3n(dxGy! zGqUsM{7aD#S~2UH8V6qs!ThZxw(BW)?5=Ieic=%hoPs*L(JWglavrnyqrW|vN6KD{r!*f@3N#<4A|ioKZb>^X*;kb!MMqbC}C%SFk2|6Em5iAD&z%Mwbfq1ueR%cJjG8p_$V5gL2A zXmtwSM-GBZMS|1ZqxN=h|7Ze)i6=~IN9Ud=oFSlqX5vS+S|vi?Fm!PNcew0N*8Vu2@Qw6TlOZ>!Oqdi z!NLCFRLnLphKVtp!@xq6GgLNvhG=$_p(atz0-<^~t6a%vsW6{0r0NAks&uDKF?OKt zk)0Xq8iV-xn2?PjC`*W=&Y<|%)nP3|1}~-7QZxrQN9Px6qiU9Jpfx5s0xHs)XR_~h z1HObbl$1iOT_dm$b`eiThZ05Uc8R7JEwGS$3}MNbuzU1ocLyghn84uQ84S{Y9vGZv z9C13s_L0xUJLv^SUouumkwfq?$LI|T7UZI`ldRNYu4c#LDvDXCzp*r>6 z`DP}(AZ5{>u_Aeo5nOJg{Q{=3#j~h*t>j$T=4}QZxqBLtKGCQ_s-@xR#VmG#!hO_f z$C$xmGNcN{cPb;yaj}H5y_e){1(qs#RP9NBWeadP?H^5uFwukasEF#$5Lzxdrd)zl z?j<^nj<9*Eoz->ot>=f93nwS7_G)fA(P+9^>}-!iP=bA35KsW|!N`cDo`(Rc6fnM! zYj#lsgqTy+Rvj&-2LT-`HiNJlo$EOU3Q55Fuo2X%WlZ|RGj|NX{lzyJLI{utngk8hiP5a0Mo-+XEx>}C$_lltN#w4=42 z9OtrgdhTZv`hCPduKhosj<-ENEl%kFFZ@`ueI;m7o&hab%lVc-Pf zehd*J0Vm=g&1W%J%*PmiOzzXS=Wj3O!iD_wu;Y9Zu(A)CgZHd;D;CUYC7{@?lN zYb$#A_F#YebYY`s4w4{!ncenbrSQwAZ_)Kn4>&paVBms_f6*WKY)0O>VADy2-=0zY z*UZTLv#;ueKFsK=&X|8^M&T?oIyDbuYhm-6vrP1_nH0Jt>|oB*^p$SUIan!<{2i0> z|IDP&f6t`gpP7_|vp-W_iu2Pyf)AY;1e8eEjw@f&X8g)1P>C@lPz%!U@4YF(LYn75Y;qcD(;mzvRk4 zwEf+@eac~<+`Rka{c!c(20XgG!tgogvgzyA;r8*{Uv~7B?wo!iU);r)$Nav}@?v}I z#pk0P9B#kb-q9`nlE%!wCh|>>>f!dm2cG}KO8eFL(rj0E_YdFBemmJe&PTJpe>lst zgTwtgsP$JwUH1l&94p-O&XIog_m30Z)SG+N*wvBVALDL(oaI7d|7R1vllP2{&+lChw=;fhI<_EZ%?7v2e9vUZ$X8E?S9^Bo$_l*tHzw;2Bj`m^fHyd{19Htw+wlWL}G ztjhOH^Zj5OA4Xcv1h3@!a&~g?!9b0dzil6yZL&4c?|KTxz$Z&GOb_(PCZx-s+Mw%y;_=X$t1q7gIQ zd$oPIzqf0y-t1N0Ir+X%_r0lH`(w-{y)thP^3l=k_%IJx)S20$`f|kK7EJZ{@MPhe zeF_tI_m6EgmNUs~`-cYIM;{)cSwGz0H7j&z&ff7dp3MiR11+-<=o#rI5{>a z>2%I*|8#9Pve}QM)W@Y^`fi(e$9`E{qfoT zuywe9@_Ay-$K`wfeSH0&|N5W*`mb@o@3(KZ_w=rRIK}nfPk+B(^TU4)vTrfzMkEO)=Bf^lViQQ%YsYK21H>P{-{if6>f18)k@W--h zJ^FkSpPT|e!8cEN_0`OC{rK(-d+~(@|G{j!ZtdIC_TRtfdwlxmmJO=(c-}pj;W=HG zyrYMo{b6_CsMp+E|F|r_Pw1=rIHf^f+{Q4Tr?2$K5ACx^{pncq|NM;{pwHAvLuv@p zdh21x@=(>%1cGz9govMK`G3s)8EK%Q z6-m9<(FfUwn0wD6MQe@Dha&B(vp*`5YJyW+I@vY7y}`c~Cx4xa7%=MT%RTkh?Bpxtb3bgf&BN{WZQ?*1FZaWGx$)fJNxPSx-YYkDFSpB2FWY|{ z?$NKS&tJXE^~RNhjf0)L%~s@P`*pLuJ${Q6uN^08cL}Z@6nT~O_6uIWvv%Xxqt$Ev z_09fx=fQ2W#rK|VTz`50Ub?jP%)h#_`RrMH^8DJf>#x`DU9LAD-njGI%QqX(_O4uc zcFED!@#@Ka+1k9my>%aq z>rK1-V5`#B+pUfL^mel0%8%Hm9e&btZJ^ps**3rYw)w=fP@cI#lC$}GYNzbqCr=3IpFh4K# z(d%?gZ@uN?t%tgPu=>_-U)N2fl`Bu*?QE5`ZFsbruDz+x_g3QD%d6|R+24P&&5^EM zzyAEe!}X)pM{gcLezNxZ-T|!a-uw0HgJ;j)ZM{A@T9+sNw=3J%Z@t-jyps2}-#q+{ zt{!;5ex>a^xpV8?&b>GMdiTn0|KLq}vU_Fy*3Ad6k5{&Ty?1}@(*FKx@mJEDEBBr~ zINs@Z_36R-!3yoawM+hXv^PzI*t3a|LfmSiP5aE>*a@BGU2Z z>-8JlAKh-hKHR-}@UU!cCU6w_Uq9SC?uRd) zU4G=YE~nco?bV}$hnH54-aYy4O8e~wJziIRez^ALwyeH_M_V_q-d^FY%k>T2Us>C@ zwDMx5Kgf4(U-38Y-Fk89%I3Ar-){f9`S$qk^(#9SHx3Wpyt++0tB|Va8Cof*ydiLO?zumpG9UtGmvtMuBIl6rNRo{OSE zy}J)zJbxG4uN#*sJzRO3FRwoC_g*~>54Ik!-@JOL>l=6BU<3A#p3u(q-5W=1FMhpp z?_IyNwsB=GzS?WAp1ezM%H_KH;?4E?3f5Q3rQ@BGmG#?u&m(Ogb-45N)jN28XXj}3 zX?c3QQT4YMhxGssj_}!y*Z1|x)AhBD)lR?paJ(ZYw@$WQxqfBq*@Kl@U(w0a!^>M~ zrC;*eCge*{^;=C;j0&c-EXg-K3RFZ z`WjylU%%O})AOBo_F-VgKpc4P&eA-K$6CSo764 zFCIU9q`&#pe|vEqp5n?j?;c;nD_5Vs^RFLVYVS6;w&MMxH# zUAlZ3cH#EDPnK})e&0KKmaqGFaMU(#ZIV2_zj-2HfLrdZ+*r+b)2qAh9=(K8_5R~` zj}FS~uzm03;iX5{b{_zj8;1vB>+OrHs|j~j8@%Q8+F!b{dH2!l$1h&A>#J0D*88RM z_;Ua4_|=O$TX6U4udDTB>k8a|di1&+vA+EE@+-Kq_3qk@D>rW*z1_HUqrbk^?i{>3 z`7)8U=_g3}0pPtM(wE}#x>xtxhaB~HJKJS$(Zd&M#veV)1N}1IdFllla{uyKO7TyK zpSx5aGLhkPDz@m9FMRe8zU@qXD^>L~|5tYpPF7Pw93e`dy1uH*e_)#*OwnsuRr)VUwKn6_K&`x2;(;&8S#y)Kbi;mW2sJzzOn zWb^l%{us0RoKwuNiCI_=^JQ_!sC?P9LuaeQah!$Ostq_BzZv^Hrxh1pRf>FFB?5ld z%dCbOrdbO!P;-Z88fP)gNN3t+on}O{q@!rWj{IuCFKR|s-`c>MkM{RwH}~rNx9U%- zVZOZCKfRAXo7b0r|5mNa{Mmk8lk(-;|9RcX7k^z)V)E%5Y?f;`@3nE%=_o&ctJUQv z3%p_^`_%|!7XA6>mEFx(b!6WE{MlRoNAkzrhqD!PA?`i6`S97NM|_@#f0iqLI@+m$ z`4;c}sD;(Nu~uW1SX{5kn4=Gz6R>NAVuEke*P3}$Syz`kW{d>JJ##{boT`yc?ai2J zb#v(}=N4TxyMO>K;AsCLI;!Kdi=FJ$Ob}WL9C}YFyO6W%fxU`%L(uozpVyzz`x;yu zJwF&Kg{U?fqk8pSof%RG-=z2dN$X<-`1g&Nv+~}*R^;>T0-yQCJqrqZ{^zR=r9Uae z_!pExp2hV4Bj*2aLcr1rBmdI9{gt`?)iTDjlr8>wdE)Y`5mSiK+xzd%Aawh8%+;Aq z*7uvOf6R3Kr&lAUfc7c5@EzKQ-{Bd|Xe1YP$V*8O%6C>QqWA(sBz) zBh(Z^^EDMt-4F>w9&ITCrTdj3&K4)kRNfMy9+4tTJEkR=?XP6U6IZ}y+ z74AayRu$*a@iH{5o^3u{yEBT^_m11n)EHv|f=RIC90EarGiclnvAg1Yl>kE=TnZvK zZqb8h04Vb{ZZigtZ8S0sE^;>rNYS_M&4yFT3j|A2bv}1zzWV4>(UbY}h1*adq&lRh zG^m6q3xQzB6edXIIHBQ&YHQLu8MP@qQW#2$jk^IrQGh%efMeuXdoxJzQ1Le$N-Ms1fP4n8&KlB16 zYWD^NQj-jHKr`(cQ(S-rD5zY~Y;_+BhB1n$cS^OTn0!fWj(aQ%#j8Bz9EqfxWmiHE z#0kjTlq5wYAM6Kjzsk+P&XwNnj*5Yej85Kx`UMlO!l8?kmMdO$d+ov9we>42n`;vw zOn@)}!a3}s>d(+c)z^|71WMY#Q!)eJQ|+qML6h(EcZs@^EocY=8KVo5#X~d8+oe)2 z-(nTNH_CGkq)CiEtCki@v7dabfphlV&}6i0ihUtD=+wLoLdgXxRk&kCff&lj!bWFb z19UD)J%GC0N5=g?8DvP_=Zm#VG@6z3GQ@5FK!Zn{YY!%BFd@N&1m_V6%)tJABuF4J z_0}buxx}nR8ukp`LqYSe=OY0)jyWe^YYjfCv5GqMkNU9b-ungdf&xLi_(+a>W=`he z2he7yLT18MTyC}XR2Crts*oS*>akOGO&P?+5KAb*nH!uP)MQ)%0=UtMZ*=r4L_Jpt z7|Dps#i9ljBG~dS6%4Lly*XjQ)FW@|rG4IeFb^F@Y}Rnbz{2cE zf!5~l8F^>+KP09EY_`6UZ^&Y2k%mqS;s*klLsd@P9T^p%vG<>=gQBUnh$F>a_)mIi zw;}|E5t~ak=TdAIHjWggnp&}+L8*!(V?U_~kA59GT74LZg7QTJ26Q1ZEEO2mH*Qa` zFj0hwBAmm`qHqQz04hDAIoqXU<+1V4W{?Xdgp@-HbCJMzv;P`YLyD<|k}|h6*hN-1 zx*09#rH$seBRe~l&9N^-#*~0^2XpUPQz%inur7=qLu0aQ;)G%7Y!z=O|94L zFB&k6#fgrW2@JbOuj6b%zHl$g5X4z2-t3JaQPhbRUnT{4C0T!F;H$S30qb}~|qee_Aniz!2^BN~F; z*O=J@OR3bd@3jBY{?;;R-Z zQCrf=DopBwdCp1$HYz!~Xc1>)42k?Q0tsU2w@LPQfZOu>aIxN!c03v?DVFyEO_ z&6E~%s51h#R!RX8-w^z_wt_yOfkS|3zW&JmH?AQ=@Ju3mha7?Wf;}Yj?L#*w-ZyQd zf-FW>7&z2mG{Ux@YxjL|Uu|)@*XlF6ket>5A(V{V#3T^BcGt6K?Vd+Gn|sw33mbt+ zS%TJdXpv_DM#(w={Fk&4(@{ z|A)z3YFg-_o42iChS+QktC~625Y618w3=)7!4@QR$4OHlhgDFL_$=b6b)PR>>JJ2Q z#=`!2fuW7RYNP)X)rBSlJsIeQ20EQV{;h+LXpc@T#SDCEBxn{pp>*=palZUpVh2Pl z$)#%UbM#m+RHD?hRPYPRw_Fa9YYtpW?W24eyOO-i1dh~xqR|;gLQ?3-ncJ*puG=VTbtU2jGtf>rhWH&7Tz}C(+qdKWa?&R= zJ(=mrOn+&nV_;|2NzRZs86q?Q^RnE~OrXe_oW0VaCG%`+!1;R{*%uAk(y)u{HFfcV zoh0~>%|0$joXoXA8s$(>(g=PERhxec=IRx&;d&h6K5?N+Cr2~GK^?T=^|xFwL#rV$ zyU>ge2vTs#OuuU_+rd04s$BBo>=v_LG&9YJ_KYkwKW1mU986aElTDk?%<*5{{SD!d z?cOr>UT3+F&228T=4PSHq|aJAJpevC^6za7ukIfn>>qyCr|kUffPcCMzRZHmf}cem z0pa3jRmRUfe7QO9%m3cyxV!A)*c=Zt@Bcf>cWjRT&5iMqgmwV_TM5cbzzs7A5%Ps7URwIN`o@mvc!u)RfikJ{F8BZRkEU1D$Ln1BoFvQt=~- zOGQYykB#zp(e_^)*$N3Pbx-`x=Hu0kZ$Hw1vMc_n5u31M!j1_${uDb7|7q-qXTT2b z!0P?jLg`#WKpjA$grOI$GC!Uwl@Y2LrPg?8i509V8g3+^LIevkFVWY6$tVJedb9j3 zyGmu`^i*K9nc%3mZEg{Eu{AX>fF9akE?WC04Qq@2A zcXZ0cpRi!Ug7b+5XHbGBid`EEVpDX@Y^85a9JwL5rZ~SaEBfwI7j_*ms^i$q=P%wc zq;U+c&&LABD8@u;Dy0q=Uz)lMt{ZEJz)2}Zn@d}W1&$$*4HKz2?wE+otc2sqZz7l^#I5hEVwVu>y% z4UC3FQi@>$xRK7308(6>ecwYi?xHzm^k&~fD@7=GlFCqBjvT#2#^j;1qmWK_r&?%? zP$*rv#sIdcUSz4eMNc;UFB2F{Rk~A^?)k6Mjb~^dmPmT?J<(86$k@AU&I~>0o|^05 zlIj1LyA+LK#MFDk(d}15DMl<@p&p^+q6_3dqYt6F76GL?U)hjg6o!E@kJ^G4u56=( zg>eKxn`2T`*U1I4K^%%i^wncZ&S9oz)Ts*fq4wsmCK&;bClG#^4McG(%{q;sODAj{Aw`GJ@{I|MkriM+Y>+@slztUf_qPaOF#{2L^BKoDv$6qaT_VCo(K#x?51+1 zJep71wfUm)f-sV{;xf>{e%O4o`SZ_tw_*I{k5}OXSN>_MZ6EBM9Q}exQo#r@)@pd% ze}SLiCo-qwCm^GNzwGVr=`X(cm;zP;1NA`p=bt~EK0(X`F%!g`Kf(cLk(G9(nxh_A z3YL_JY7ez$53%OtL!O_)>I;vKCM`Q#SjvIAdaQ_^Jw!N^l&&lOBS|uCxK$|@`^GvaWCpUOQgB;_+ zc9o+e0*ScNax2sl+dWhnqDs;3C423y#;WGk+CX4@s2f4yk(hkGP+L4@kGXl>0?2xYV&hCZ5JG8+dd7-K@SWs8s@1&ko2ccU6a z%?5~N$b&c|50VYxMk13`BPWcZ=hhwR2-zlMNgR8-NGg+FS)NS5hw-qo`lqNl-$$g*P_jBED9?npt zYz}*)Voo#XDmixrYQ9!#S`0+|{EeNQeRVv##$yTvvTI)B$n2z^fv_%u3y|tVWAxVIMcw%}hEwr?@1L zhfYQiu^C>t!n7zuU1X`7{&(&KKke&Gz%T*Bd2ccdXK5FfeCWLcyIQ=Dm_~kx!04u; z=A_T>K3`*iu>(|dhRWW!fH!c;UULbNbC?ed8vSY9x%MhWhVn(Jh0u@%x{WsW|AU&} zzgW#){e#lkd$a5drsTc%cn0Tqt<#vH7K@3H8?pCv|6U zY9u*jjZRsk=dnyJo`EOS8iz)94z3S12s83#+oKSBbK3#){IVK(cXaIBnRQi3QsH8Uj=T)F!DJN2nb&k~&j2BbhZn<1mvnBbnmKhCcEzqAHUXSL6I zoCTg$o^_p-J_~7vI(D2I&oIw~XHaI4XX&r4!Jo}<^Yp_WbBuonP-Fm#p<4KF@BeMG zl-Nb!NM~r#)>+hGPv+*# zc4=zhzyKp4aT6`05!{fb(9RiSTilfmhd4$qqng=;nv@-8t~C@&E=K_uWn94fWV2~D zB^>%kFhu{7_=_f;ZA%OG;VzX@++BOPvT<|TVVdAzf`fAj2YiNjgPC$aI#&j+LX>;y zp&KLUL8@!G01mKf&9P!0bzM@tqN9*|%UNv%w|=vg0^5%Wu@)^ZQiTu*Si3aiABZK}?6_!3T1SWHkql*kchTVB|FidI z&28Px7U=u=6|B6v@)?ar1C2agNtQ?1RwQ}6xs}4ukQHmPCJ$BTzuyLJCmzHdhh|Qc zkK3upv`B*31AF!AVYQ8Vx@e(wNr!TFezvziiWZG1tPLB*h^*k$Dg z&NuW>5|DcML2~0dTO}2{oz1CvFxk}VqVE&sjWZduw`qVKpfw?t&^Xexrqx@lF*r{XDIh+#?>d_Dr(~^HWDhcwJ5Me zz^E|dxM!X#SxQVf5Shw(2n-Y}B(+f0gsY(j^hv3RuBJHDm6Dt&T}coILq)z-Q%k^_ zB@px`HSdtf^?zi*m?0(ZR(Y=Y3aBDdc(NTu{y6`o{nHJHZ6?Z zZ2toNI-Dbk04Sv;OqL1M)#skS?NXqwaOOs{n--!IV?76xh*DBh-vSesUJ+>`$N(}V z*Vs{)+%S>@53O>ho?7d(IS@%q;Gore#`x}>o#Y1!(M3|t59R3l7G{K@)% zPhC=P1yB<`N7plA^C4!iHC98l%OM48iV+J8TxQ|~2uTXI>rEHx^AU6zN{)i@-Chrj zS!k3LU9t;32TIZT)Kk@pG>#<;)Cv-M>CzBRAl0N>&6cEe1@9E}ICLdnOvO-?P$>8~ zj|nW6DzPa5u`{-~fCAE%t}Y3{e9!o`Z>&o?E$MKnE0IRnSkiJ<`=Okbe=_{<5#5V@ z_JEtCoRvULtM?d!7{k>nRj^{MuBYZ3+w5{ybYyCbEL94XnybNVYExGpbSXPDorgGv z*fJ9@S&ERr)ZiI z3eue_c@jz{5cy?;4bU?V=>Klm*nQXb&(04<@7`bLj8+ zO10Q%oAl|LCK^)ryqCFpgC@>yn2QZ^Y3w8=bgAXqx;|60wiT#;NIqMD6k4!4ACQ%0 z^qhz5LVlQP@(B%N;~WNu?o=pf6njD|9*b*avoYRsK?R;h0cs}Onw`#i;9N2#k6mp^ zpXA74xsb!h7|49B&$w{p$o18EIvIgu1db6n{!PF!M;)vawZ1(A;Zli2V5ruXQb7(? zsmE-}!NJuY9cvtW`Y{)n)n&+SpbnNJso77tcef=|5Ue#mN98+89zuwP6YGyb z;Z|d)zs=^L5Eqo?q!6-+)Jj$^#K>Tj_T*|!6|N$t#MoL;-&^@iscG4OLm8>!hWYzD z=(Z2i$=Qw7v2kv!h8nA(uG+}x@Kq)Jw*;k1jnxMaAx2SW+%piOG-xen9Ma-&AtXfv zhFp_~x3)CnC@I|#0Xv|~gvJ$WHnzkrC?|=EPBkRcRYt)<TX%&%;3+<>bohdB;1w8(xCH9=OJYVPB}!tV^Mgrm?j=zK zn5j`FQkLM1V=KZKGdM?-tr|vAasp6tOprR3MIRkl(IZ$gDxt9M9ej88;zl}4zxb4Lpa8h7*(muii5e(Q)S6h&L8WM$?h3I$X}wCA^gmlo7D|EDyDkoD4NE4-;o14n z$;IEFvN$Yb&}j@hjX|fY7Ica+{&jFLj{5k}+T~cY?fOhvMBVXhvSmAv&&C#;O)UXZ zGu~q_gf+(3s*Zi-IFOc*3=k!Gws`dCQ)?q^@@8LktiNC|!|WdIeptdGU?7Hbyk0dr#_V+QJCd*P~U zMh!Taj9h%I+@Kdl1((#%C!cCUGnk~7zFi0=N{M|3u2pM%DqKx+EHx;=AQ|+{1bv>B zj7X`y3OBMXvUJl$d#?=`x7ZJ8aEhg3&uU=8+C)yiPHl%I`E zKCofm+wW!~gD6W7hgn^GpK?!I6coxfL&QGIX8;)p#V9aT<7$kEPy_*7>QkiE@T(VZ zjYSyFIVh4C-%$VWf`E<`3zY2`FTr?JzzB+W95eMoC}`*cqp=Aawcd~c%N9h!sMi!1 z$`hX4d2s*!2n-`j7+Jzq)bI=QG+kRurY2L-v=G>4>VxE}n(0CiXOEDxiG7#bQ?8Jz z@&yVlP%Y$5%rV3PEa;7SrE!8}N^-XI3J0O9M5*oW6RdM1qkj)#L6a(7cEbS{(-LKm zmAGO|tyR-}!7R#LAm)&5V;@`uOu5w%Qv|zg8h(L+*eq1TZ+m<5&f3PE|J>Nv7|~!v zgAom`78ZBv$ zP&HCi_dF`25NpUmQzt)pXQ7rp+y{I~+^ioI@dITA(fC5HK@EyUU8AY>t~@7<5=v~2 zoKuJh+$x2Ts;$9TE2g){E!%u)0<eVKy{`=#ZQN!V+@eF7OS> zMWZ%8B8efj?5(05R`KiUbf@6ej6O<5A}h8~u(k@e7=tKJ$oebWkb8F>n!s#pbGGN< zmrlhm1`}uj`mWo5=)0c2I4j3{$0Ih3*f3(l)y4)F;~f3aL5;I%kxO!2e~GOcY*%|r zfO_(|%`QBurr4IVuQ8~npA}KOQy0C2Bvx&*9Vk3fmXm9<2sRZo$#vz96nzbaT>z(6 zogK%)K@dR=zb_b?Q4k~Xj`RRrDaM;rludX+_R45l(8CDIM11I@wY{;aa*1{6XhX0@ zkAC5WN86htG>p*j7Y@=*N}Bli)j{$<0uA9OhyM&T{9go;^Z{R;foOzMo<{}!jbEFxXDZW+D2(jyY6K6x}eXG4TH7hpE9xKhRC9DmR z#R@lS9ZRZjsW{82%|-@a(W?JmA{2ett(Gzd6ZBUQYqo^?3&TDPAww5gN~W|bIVv?s zy)ZWGo2)m%h|#@x*IeTiB9~pMxLabeJyxMG$yaZh(3)z-jh$Sj(flyqZ zRunmB7fW?1hGx-3Z@ID+%*)0UqB17tg~pF=JlI~@yfcEq$P`AVaK)K|nt(ZU^kT-2 z0F7IckcmyqUHDr6q0Y6L9Yb;@mx6)SG$(5?78{an*?Xup85xjAD#h!o3|DkriNTr# z6{72!6(A-mLb(!b^n=KtAKy||V{cPbYLjbiC9|s;r3-v3hX5CCR1#4ea8Tf>h(tAD zwaQSIZK^1RKIU(s1xfWqIWDIc#g7H5BRGuUaOJ^ajy|^5r-}91INo_ANvTN%3j}@GngO)BCACqfST#T-M*o|2f#R&0mSy!wqA|I+4?jD z4vAXo!{U^saEvi|E=B*9GZ|LY05y)lNvViJPfXD;Bvvi~C8dPEn56>;obrah0~|(d z7_ni*hAWN@JlAZWn!1LXH=$X^u71RnWAu&0`D$=BHmC<~Y$Ht8+Dgqw=c-d460r0d z*a2+li3HoH`A9*Rlx`@4$X+)gx|ftdSxk0mFvTFTLG8mw5tR{G#6D<9x9hlx30Wl6 zUchUk6|dOWhy5gs)F}GYnk?IFpWv;<1!Kd_jh&4nq!q`8s}*7W9q zE|%v*W^kEF4T&d1eA)1}j~&llkSHJ~n$8w=WUPhQlxvhAxeOqK^(fqO3(7f)NUEm9 zToQGqz1*hS-`?SHj~lvdP4?N;V1w(;bvZC9TBre}Ty#T`nWJ}=`pjuX2HT8-WK3yF ziD=o9&#?!U%tDh5db785yf8cT3orr1_$efbe)4*!% zOP;NNp)Puh#a01}K2vqRPdtFCR3jL114XI|0kPHsrjL*DDXXc@>dPWWw9sm36s$gP z2K6tJn`R7@tx&)$YW!0pmotH|CFe^Y$fIYaCVeSaHedlIgVWE}%`Tlvo+6`JEE+ty z^I&J|(e}>B6h@{nGKH(2UkGzx1BTRx@t~N76blAm!4R#77D{Qelh1a_5X8rB+g(pT zcm2{x5}?#r;s7>)k06*$Zb}cL^we<-MEdB<46XQ?XrQh*mkc(Ll+0AE^C?RA&Qq|8D6`SPx!!Uc zSZP7wMkUzR2)ndr1ICi1DcN8i6u>}lu%%l1KnK%jI|DdwN&=!dvEGJebVDX4@4Oxu zSyD0ssY1xLR4_{yHv;R)E;OUCbzHX2w&dXGOvc#JhzKJhTtV&BFb5*2Y0gO28&ETD zAmW8?ba*OGx-SfnVrdv1#AY*lu|@x?L6kuhS~|5n zW7v~o|}f9F5FGgIuEH z*o#*~an@I7TpyCqz_~73Jy4Cx;94wdl%oi#v2G1pxBt==?!*R@Q?Du=Y*i>qW(+8( z*qF$%C7adQ_whfz8W(DA#W{TO91YEqp>VAhq&F8Q&gyEX;4^qC(nIVsnSrgSrW=X9y7YYtgF5x8q*M^W zP#LH(>V4B{vu$zIvKOT^K4VDL>u;%1bCyW``9Uo3kiCLN^fp_{jObb)u~3kZB=wEJ zR30yLg6IXKF9}5vuE)XBvM~b}l>B*GXy%}tNIg9rnZcM;9+S#fUq^e6j^-$e0SJ^b z_QIT+^brv&G9)tQGW-0o;HZR>TZ=xM-aLjCy~jSIp?H^S8PGmzDY)c868RLeez=RQ zHk{D8LeNsoo^+u>XlOo4btGA8>ER(`)c-fAr=S@rRuMvxjtQ_Sd>HYF(TNlCP<;t$ z=?3nA_0}$8;Lc|{+Iz=-M1~O=Mr63^jR|g!bV9MoSns+-stviBP{pxN5~O$w5C#S| z>nCQbX58956&R|vN%qq)lp6Zk$bg7k1L{lJH)ST2O|a-wv1o+EHs=j643``A5j{23 z=n9m`CK$$?(M!y(U;!uIv9gkqY_2VJT@LmVFw|PaSy{H0H4Y(ST&!MdI!*P({>U1} z7}6L+x`O!xhB?$Ny0$7*vWB2A1uwOW;i)TKD7hqNwkRINScRO+jf#f?y>-l%-V$Z4 zZv!zTgEfZ2#*0gq)rg16g^^vAT5E>|PNl>_`Rvq8DYhnd!Ju!{#Mc^|@`e-&Rzs=T z2pq6FNdmSv@z&yn*+B~2mQEB8df(wfV@RjvMLIl`{jvOXqzWTdxZ+g7_&Kn_C-wNN z5pb5VDkM~nfjl;2yyC;`Ad(d>q&!1PV6M?LU8qJtdVUfK>^FA+7-YnfUcF!C75zzav9- zB~u?w94(?WWeKH=E=kPBCEa<>r4-*MMgT*@Y*P@Q+ccIGmJbvet99flWf+ zhc@R_S_%pwDaQsG!$3(YkVRk6#VmjjqN$1{Jx|?ri%2cF&5#@5V9T1i{1uWxlUp@8 z_gGPDrTUP3GMN>YlouFvj+?a|E4s9vLz8N=eGci;l_4pYH-RO{|+ z=?bL;1G*NB6@q>elH}>2XVWJrw_p_z)W;9ic_kfYPyvs*a!?kdOhbVM)%7pX#ZlEA z7G)c~Nh>$gN_5G1->HutT&sPw4>ctb%LWTx`I}oTEIis?-&%k0ctnFSeDtp!*Ss{c z*)&J^2y#i{)VFrAp()g&f`noXCRGbGuMenuy@9)hYE!+>rpFG)b>r}ryoG;K^FO3q!&lW2AJ5^JH}KHsPhW6; z{J}=5dEsw#Fh1K-hY$ddWG~$kd=--YOIr%_Z0UVlDr2-ZT)r!7&G+oeeb26X3Sri+ z+&{A`b^$DWW&Pgo>T9d`S9az6-?Xc*Xx?Ai6@AyP$T>4(SN|M{+_ zW&yqN?$Rwe_^!)`^PZ?+f|?}fFTZ>te$VAIe*RrSjD0fWrMqI|uH>%xD(>pL?yJ9V zSO4IB#k1gszY7Gvb62|jtX=(+cl#_8%Jv_;+q+Wt<-5ZF`@6lnpswFLJY!4#%5BO0 zGk273ipd$c^p3KDhOeD91G@tL8$j6xKWq@Jo4qB)gTG-*X#NCc2DcP&Zu-#6ZhH0S z)wZzr&xhU)%UEcEq!H9-}mE@-Oy`(4_CgA?R>u8@yXuB z-oEU96_%KM9So~-T2A(kKg7y@*plP@RAiDS$0tWcPERM(kDI(dwy)w`a@eCW{p7Z^ ze=1)+|8bYwvU1wP6PqV{2kGSPPG4>F<1Pn-V}G{cjid5%a-8&7CwqsJ135T4c{{Yv zvy=0oZT98vPZwFt_Ezd|=ci{M_BDBResq>jC++Cuj}!boC-u%@>7gL`xv#sR4VSZt zZt+;Z7n7qlIeQ_KqhmQqXM2aclS^*4zjk_eN?y!1@25k(=96?@_oh2bhjnr)<-C7G zCYQ$Rzx}Lke^_TRJKaey^%TB7l#{Lu(9dbpMNcPs4;<;))t}Q$%6Hud{WBhZ{D?(; zuTq_!)$_ys{;*1qb55!*t{?MV->_6~OjlXVMmJB6`U(ATZ%*`H)vwnh>fVWNRIiwP&u06&=L@o+ zTXL%Vk%jN^!@7&v8PS z?heTx?#9#!`JUaa^aU2=7ai5T_Ezt?lY^ddoXFwD-pSG7LH|l$r2TU_{eHw*|6|Ps zeVgANCuJIEC#m}uGEtjeUiPAp@31;kw0&@Nre|YOU+06P3*Fn%!SVT-x^3;`=s>?Y z(~VAg!nMEdJI?K+!@k&pko>(9G`Tq1KR=L3XP{@g6ZMHE%0FIy*FEsw^L{*Cc|l-) zps;g#bod@1%l=-!SySsL`S+r*KRvyFhU|ZQ#zFyecmF7-{e{8gt?6|a(8Mc?~V??$4%;mXwP+tg(bxB1@9huE zZRl#V_W8-b{=d({JhKZ&dNAtk@${3F53aX&*{YK8v4SmaF<$a`Srx?DA5ZZ!LJ4KKa!& ziLWwepTF+cgCiv!zgHn`zIRY2H@m0z%P*f)=&Y39n4!;S`Q?}0cWwXd{9sys_0`dT zI6I#l`|ion`RBEtA8&>CfA^pN`#=BtKmXHT@cZ>v5SbqP4^y=N{q671jJTTkz;n`iqwwEE#x{jhgfCyQ~`LrhYhyUl(+SHHnW&Sih z@PlH+7X@4&w$SwntmpP)a1MWT4d}-{ZtKU~z-60!ET7f3|9)U{Sl@?vKY4CencW|! zRm$n-oA~4{@E^GJEf-(yJe7}Tpj*B#py&q$C)w>`$De+$Lj3gUniO;8Y}PTT37wvo zv@a*0J@LmqcG=rLo|fM?^wn`pS>_jq(NSP(ojzQ&&t|W`Uu*W$msF;HT9wL3)kCbU zHY_FBP$bs~XiUoJ{O9w}K31ft~{?fZ)s5Vyb;^SUBSbzO+-+bW*{;+rY>mLP%AIl2Ae%Uvb;ZBR8 zPp0?cuOHvgWV-a}R~5U{FVL^~ytVfyP*!fA9X^7i+qWM*dVTx!=WzeljlDZ}9^G)K zxB1EH>YKY~N5^{`M~|MF<7Y?q`A)uj*S!51!hySXaC-g0);oFpY=+t2NNI=J@qVZMEEypX48N^Czj&9*?bYMW_SOe?^NeDB5a7mfju#~NUhu~K_1nLl zuHCe+@3hDJTldr!KYX@%>*dc6>Dulyd$GFx>{)&C{N}S;uh$=5FL!os-+%S;&E~Vi z)zxR$OxQhJJO4TEZr|G5y-WL>o6l}NE$i2QTXFAjrNZ;Gl}CFw9=$zTU*CN8?$y@e zoqM})>h-PN5_aG2ZXVI=!$_M)=MTa|S$}pH9zET=ySsI8aawkduWvkjw|D2|%k8&2 z*WPSBK79J(xw~=i1??WKy?nPf-`PBUx&Mmq<_-7i{@v4^?X|N0=H%8XB;)*hsUsT@bI@AThE@o+kJh0x)GnWSF3xs?!GyEypj(0-t4>z zH;%2{Sgrd{?%#d4|L_gJK3KhHx8Bf`gVl|@ceY-it?d2w@aOewM@MVfuF{*;htIao z_S*w_dc1MG5{};LN4~oK?v@e7L@Lxb8NO^&{-=`Q}mDT)DA*`=lI}2e%K_Z=bE) zeEABmt>3w}g5lli$;r;eZG5ux^5X8s(Zij$tH)qozp;1A?&Gzs^kT(5IJvX7?$Wgv zC-|UpPEA`^h@y@lC(|1o^t=3n!!{ZH+=O^oL?!~nWc(i-x#=RBZy@uw^sLy-#j^fb8#>1uRXr;CU4)u=V9f=+WpsW z{I2Z3-rZQ)KYP0R^zNgb+cy4o?GbF;u6xICuK#>|((biehd0gX>Tz9t_U2&y=eIlW zo|qT@x_SAcoWFQ+_u1BYdwXzg&pp0(|ES!(e|r7iMLT+e*B{-@Zd0B=+QF+vfE^J1bAq^|i-qD+Uy{x@>bE{my#!9|+wtv2|aqsZC3wx&x?mxYF2hZ>CpRPU4PtP`s zyn1m`j^X&!KfC?;DHU4@*4Ki|zWqZmyOGtB0>&)6eg2 zJl)+o+uTmiX@B?n-r4C^I^ExWj`{G(`ugL;7x(4t&g$#Ey~l_9c`ZLVS#M`2X8`Z& z>nDe&a`OrN{LtfT*gM7Jvm0>yIKH`M&aScl!=tC`x0QC+cNdTHnWP(UUOe7;B(E&B zS1)eCQ@^su2WL0^>W!!G?CY&-_1*UFuKW4)&HgFv06e{a>l)j)eCy?{YdO5!@bS%V zIJgPhH!oiFQ*rw2_VuTG;r9Bq&BrhIR_$+RkRLpMvvcjGBjVq-2;bIsbp1LUz`ci` zoWk{=+u`Z6bj!Yj)4F+gJH)3yZ=Xj{z|9X=Zm*>Wbn)QbqnD72{QUUcqvQM<_a2__ zTzho$U<)|kJ~_tSw=Zt2k>6jd@RsSdy>@&1!K2rYU%aTd)+RLq#f$s9 z@ZiR8Yvp`*6@Gqt`Z}Moy!`F@1+4DAyLo%{&Yjb@o7Zl)*Ej3^<9Fv@c34#T1SvlN zyj4W{Qqo=y%TfK%M)hugFVF1D`=a^fqi1<6Use!Iybpn~#k2_KhD;PY-@H*;MP(XU!LT$5ZBE{=>>X zy!+2*Dh)q;!vaTNI!Hf!(YW@-h1^ePJrvkqa9Io7rd^VnMj?qFbQEo(wp4%m0vCRMOWh&y*4wyRDaU1`Q^d>>2dtozP^0^vTn-RyZyRr z^2;y(=N*w>JUh_$_~{o|4c9?Bto>EfRet#^p_1R5!hZSeOaG_ERF|}f{nbzWbhW8{ zxs3LHV6V`ul2#>^KAToZiK9hM1Z-*!j^J|kS`w3WSWId@`EH4-@?UQ}Q&Fxdttv4s zW+r>(RGlf&Bo9#0OXe0OTi23tE$CZQ0IV4qTO&#aQ!)+NO0>qqr&B)u_uJWhLA6C_ zGD8XIL|5xGXT>%#Q0f<&0RN5WNBQsXahQ2&@3(cHUfy*&yW@1A+w_0GiYNU^Yu`W6 zs6UVC|69!eUxa{5k_hv)?tjyOYS96=J z?>Ae2o9Vjj{Qft!$oB>dOGbar-5>uQp219tGP67T%Xf^rTK~1WT5ghY(&(#$tfSoG zqLAUeu9lx?v|n{lxzxzbm~4AuhmDDmr8IUn%$@*_M7~nute8;9bS17#P^I+gOvMi% zgBoX`7ILmR)>M(iK_SH2Rp6PLB9h0-G=vNh1a;H;Zh$EIcWqp4N>Hm0k-%HseQQn8 z62z5Y6mu{LyO5n?g;^eC=uJSzc*6@2)p}p6FqLFKtNZ(-q}B)oqrl?T0|Eq^LxdeX zWn)W3sKNL7s@_+wuIqaMKpqfS^k{vJiUw#LH-!Llwl=FaJg8GX8wjWvo0?Hyz1SEV zsXw2&CTB5}R-zS@h%OES0kA~^3WmumZiv(xYYR$kGWQCGTwUd+0FVVBRjPfmpDV2@ zBv>eZsemA`^$r(0#_y$^9Lhf05er5v7_s0gVu7Dyj9&{acO}-YW1h${tD6r6J(;H7 zbepZgo;<59hwP+T1%g;8c69JliAEaGU?(5FaPexZn|ENGi&3nRP%1gHnOGfnm(vgy zSV*a>EH$<461;`L1i|W-A~_!{>I194N>#zmaZ%vm22zAR^Jjd3)!oGJsSzSd~`}=ODSlbD61%4JhpY4Zmk{27i2(b(Yj!` zC1z3&A3>_3N>CFn(WF{xqdbHJUShDyEUasxm?{j>ICL2^8g+wH*Kt>_00<_w7;+S) zKB1)&(Yv6;Wx1$9KnHqy7YYWqZrmBMV4T7+4spHmQ#hiVXNW6AP#aHJKs|Kmxmm>- z1q-z!8ETy!GqOhQKN1H5R$E_#t-g=K$U(4$f&4)PpRfoMHxrZ!gdY1(#XuG+eL7QY zx(^;4@7C|FB#fL@o16lMd1f=MD# z+n-vtxsQ*?ebzS>@WKTK?)OY&@Kw>H+FXNEOh}L&HNy=|AKe|$4j_Yz3MMV4fW?>$#NEh~@&$df z56Lw{k<&0`sHJB^e6z(Rw!kr$P?K#X=TKuZq8y4-G?6e`g)O42uXCQo6d%H}AwwWG zJ}k8Ubmhk5mCZ4+Fk-`q4OgEvK%9d$WOd%v)At-pEnGRPkF5@NG`6YtZS72KV07w- zmt2%ESjs+83ZW1L(=mhnY;3R!D9QKkH1*}1zB{{GK^cR~rl?U5GR+taCKjsq(Sxfd zJLi?%Sm#oWv1NU4ind6O*-0fSERlm)RL@yLhm8_UShkF_G6o8E5s8IAn$%9EbRD7* z8phQE;SzSf*G#AvGrds!&x0~#0);MCXe)&I&hVuVto zV{7_k%FqU4Nb1{TQzzb5sl9{DITq+RQ~|IgeO#JtVX!qJn$$|M$r~gir9(&{B{z;D zpp|A?vMkMV&u4QhQe9>xFq9%nscG5Jz%p2~*iN;r&9$u^x8z_jstb+kLYLd*_v%9K zD|Y@3Ho2E@w#-h@7~jyNtCUSlYQ(5m?`GO$^5T=e+mz->zwVw|FWqVSeV;Gz4# z35!uH+}Kj=`QBXBIaeP#_xc|W>QaY64_&=&0X4*GYgk0hxu8>X>tijcB#U}Nuo)&H z491t}BSo8HG@&+|mag;%FdAiHf4{)c=C|7D|3-D8(Lj#|deA`A9P)1stn+&7xSZ9% zQw`Cp#U>wHu%Y?c@^8cjLf}Y-in`Cv`s}fUKvi-9JJ7ym5;`skIp@;)APYtcoI^-# zJqAy?#;hLjpteJAFzi*|POxC0TCWt-?20TV2fksB%W>IrpdsC~)&M%pP zHjy2=@95zAMgy&XogL-#Hk#?tOpj*zOEc||jasKTN8uzor~v9^nXZ`-9H(IPD~*-Z zvn}Xn$2OA9f>Np5MYcjM+UQ$|XfdgM94MSjB?I+#D9F^4pD`5Oe?@imGU#&6b#Wgz zsM5(!%`l3A+P(govQJP8BD2A&d?5OOhSc<%T9dw*dqgqI&p}vLXmM2HPbxi&fLDj`3{wUP*yB1*!QMEJH5p zkRyg9g2CE6(34x$?{>vFHD{qIXrzEC=O~HEfnpe;#8?^(7u@G&Qp%LDP!c_Qm%Wo% zyY53(&`C-%d|+@jNVGkR8*&VhTMv}GWsAR^3vOqJt;*9QLI}2noJ3~*Yp(NK04R;e%oq>up?Ep)|s543Q@tp$BwNLJH`^5vBc);me}AN>D-o5wUxTW zn<*)JjABA^QMgdOv?BgvF@Etzz4?-Yb5>gJMSZMPBo#I82Fh$mNJ)ALpbKn!d8dOG zGNwSD&}Q}fu_+l)m>Cp%D^S%vc1%76)0*vdH9hWBz0V?S&_+^>^wt%zm|Zm%l)PYS zWIvl?y%dnpwUdaf~$!Ib0|TF;F?s9-dFLas;#uOMiWdIToXUL zG0WLzs6{pnyc5H&s?VRTVn}6&rp?9z_AV+DDU@^RE`F?H5}2l}!2y#5a=Mo~hy{iL zgD&GjHrzagpeC;Z_u9{rd~LdWWdXM5zf&fWD2jK{8!MGe$;;N5rL?Q3WfqAA4>#6V z9_@^9Fv7tI2Uk+sXP#+cAO&5hfLNPt;%Y*n#_GA3Bv3)%OjPau-RIyjA;-HRl*o3$ZX1 zlN>u69ec9S*aW0$bgE)y4>{1%4F=GYYGYhzwCKsU{dEL`u}gRC(!Kg!x^9l~VH9E` z+bDDuh2&c^)u^H8)To+vnN0u3+9jt9!%=J1_i4X^IV-U+IWz}3Wf_qFbQZCg>cGch zY+*%$-WUeTJW53yxv;K+gLwq-xz%+-JkIQOCbMvP6R;3G%%>rGdX59v#ZBHd{yNO8^CR4C$9&KD>Q| zm=R(|h`D-%1Ll#HHo2&yjvTYkL?M)hr6dckB(j)hm$2H*eWFQCMo(-=7@AmLytizF z3uYkn#Dz&e&^wc*w>}sXE2B~C&)Jpe(Z^tr+FKoW#I&Y|uoEsch*(V}|7)`FJ=1__C7)tD-N=}a@S!uPnBI?!ZLZE!8 zDM8_0nB`mMylnKtdhP(R&{;H3?mXz3i4hq_WEhd*DkFmpG!HW5o+L;M0|WDbBQkDP`cG7|BveDQhyN{g)r8h4tTZmQ- zGZxF#l5&kch9+|)?tcQPT@OK&#V|oqn_ok4;)`FtMr1G{en;2YH)_;v|Gc4RKur;i zdPt-DKDzH$dfYtB(WI;ndktBgW=R-VF|dh5DUwkAot6ab;I3+77qvM3LfkB*|=ABC`F~_ca zkxLFh})|8r8;n#FlIEfyAq^S00qG>M}vp5H<&D zxhQV=#)XAG?Z+=x&}ePv=2#gt0>fW8NH-~I;^S8b$s;iQjf{bV`|H5qEhL0&N!{rN zRV}TgE_#Y;;Cp52><%^KOzGXh>=FwpG<4;=rfMHFKzxFmrxL~DH&3#HnwmQj;0UK(+*ttur7z|ARMNQI?K z1@{=6U1*t5dwqOf_7BHFl4I5AST%YT+tl0~JfRfVHL??$*3}@?$g6F4F|bv)9ekQS zR+zYFRij#D$}XoOreRMZM1>Xy1NjE=HcAaFUZBU2JaRNKxK0&P<@*LzK7LU_j0QMzjAYG^6bYO1^9HGwcA@CBwON~^OBb4TaQZcl@Tes|7FMt4)zpkNBt9)We4m>!9YTXJ3gz4ykk{3uz^k>=>b+jNbKJ zm3LT);z6S8Bf?T2@S`6HIm*(>S1?5r>_X8%@7MkPrALFsl>}k!!vbQOpq~)*c>#@j zNl+{kF_RD{)lL{EktV@U@Z07mtnQsvX>wTQWU{@r@wWiP_S=JWs3(1DpeIuU-4FeP zjXu@GpZqwvWxweh7@3qdX>Ni%DLiR1$!&r(@zNtsl_x$;B2OSsAWi7o&cUDUZ+m*N z`ySn20hHJQMNtiZvi4t7rNqVoyD-Oyw#HG68t7Qbip>~m=L?~c1wvD1>!CJCUbw69 zr=$+NRZHC}2tw}qM`0lCTq-7vfmniVU02(LP)w?^)?f^om<-yQ{NN-_5kDQdW>QG( zaWxRoHJ!gN1~R zPh1M-Kqk2e#>M^t){^d~>Xv-hKY}j$N6{{ubhe&a(2KiJO7UQQXJzxw7-1UWV1$D! z2?sn!zClg7?UO5!OAH~k+^{JlXc&vBegF=9k&;~TsrPloY{i>^snwK3S1?2AXRDv+ ztzqwM$+6EkD7D#&l54V=b8#&jJ2+?!teSmap=M-#=)sjN*|<;uF#t=8Rr!baIqB{= z3z3vQ;kg$>Dc~&|9N4I*ixyg!bSP)%XM6jjXwe7@qa(*P zbiq|}Sx~}Y`dL__@(^b;hyLgP?ardA!w!7I7?d% z*%9O#P3@-Z&&)?t3=Oyk*V}o=XHj~L0X@)=YKZW8glqVPrIHBt4j~TNCfeShRe5Y( z24uO+THipW!6RYGqCIz8;|u!|!Qx6YLVpO<3Ms;=$h6>E2xKQl>{~<#>(C5`{{~(U zjLO?utc~Cm8lZx=rlx{>d2+?Wd^OYxG?}$NThQi5}t**3^cj-JFDrY0i-`oSK65hK^DH z03(hv0G?RbA&S6x7`TR|PSZvhbUbxEAPmtmiNMBQ2Ms$dKQ;P=(U2>oW=6!;#9ThA3cQMIl0n)|(8g*5I_d~zlI@DJy8 zS=QdZzU+#(yBUfbRS?!GM<-q~HX;K^Ekjo2c6`N}BJA29Ka445{bCFBfD6lW`G^El za<{3m*G_JJqy~#gPEoW^I_98f%JHgHN^Ggu2~-m2rqCm7fGf(h&00xHsh!IT#t5rj z_AA4S!UPAzT&4anC`C;NMdmjA21iY7eQ+2L^6M^A_X&tqr{fV*+EC4dqA2K08;M3V z9;kl45l(e3m?E`sj%dKlGkObO#Q*0KCea9Dk9k8Z3Y=%p=Y~? z9D>MV*gc|%CYN}nG@dHg2sBQYZ2^RL%kT9pBS=GwlqM9VLtIYFAoF_cLm$RE~9*49p5T^{tDhj1&R#hH-X0_DvKMdWjhmgpH zD8Krkp&>Tm-a@|}T1uHc$;dXYZ?`WS93WOp)v#IHBF2WdMTe!lZjPQ~QdbE$sDK)$ zP`X^0O}>_l#!rUh^osQVHUAh1CmyY>n^~NI!XdVf?Z34Kj_)|r!=-Sv^ck5xNdi2? z!kPwSTRzF-R}ntG_Q_Q3KyCAc25BKZEQg{_$TH-i9%p>oOQNT%7BfVT=9Z&!SN=9h zkUB^0D>k|fYsll06(X#?poT0gNxDR((T-3gyqLLM)tvIiM+2$IN{E}zq>03|WCV`H zxQ{le-Q9sUPsEuSE9wMzdjl3FwYZ06QIUwcD!sna@?|sX-si{$=*|PYU?ft3a}EO} zbck3&iXwVLtl@5!(x0Q_eoa1yrr;SZ`lYiPF%UUv0wE3q^`{fW+^KswjY#N!jqm^ybsG zMa{>7Ry@ykPs_)w;fU8)k;Cors0l#d;z-Q7wT)A{QCbUgxXZV12{5DcJmW}BH5cz}$UfGleU2Vf9&Capsm$dk+a57$D0ef7@`lg{z!CO1)5%p<4d z;!nNa{fa8;_Z`=m)EH)*qlq+SqK(mZ|OooZI#3zRq8~uE>%q=ip~&BP--=S zJy==Q0%lN&S+{s^h13nbDi0UbqQT5zBv<21BLFSOt=~LS%9aF9`|Dq@f+{EV@`Dk& zgu*H84tmg8A60SZkiUePWi}rJqz^4Z`T9Vn{C;B`6sk>P@FdgigD2+)_d{kjWm%s_ z8px30Mw;1S%yQZhepjP4a>&I^4|*L$m*vxPu1i02SgcQ&ImVZ-8h=#(Vq0rcOUTGh z$!wBC--K1wW-{X!I6TxpID+7zplm1k;&oX{$r31Oaj+DumzTKUx~|zcP~1C9KByQ7 z`s;0CHJ!ED`LkBe*`8X><)IXO&eXnGRu%bZzSU?l&+4+2zL`V>t7t-K+0~kDU=teB zX0-5Usz*MXV$x|+7z3o^+49g?KS-g^1rzo0C^U^~8)7b^$u@0fXN|Q33@%~IBXeNf z0X++`ylh6gHz8J8!ewNvNATA`T{`DP!;ggnR=Y9zk1j>h(0Pu1*QLn6=$D|qlP5r! ziNh51N(Sb!KUksE%oX#AY9e%dT#R$n{N#iZMMcBif73yp%s23_BR~uK0s;ZA*s+yb zizNhr%)*Y8o~*eEfp51GBoFhD(a+`C0AxbloyGiMtP6^x&=y7DPb)rHptE{pDBOCJ5&BK*w(mfRWT?)fKF5=|8$u z_+MSBMO{Sk>%&Kf;8e}>qF_*s#MXsWn)U&IuZCEMa&)Bz8vx657+sx4NyysV+-_!L z6gU6Mf9ulwcU>Af`H5{Zo08as5p^~Ov+OTj+LUMfr7JcFSs|(gHJI-LXGRjrFV~`= zEMzDKRa`9>Gg2Oh7b%#}WahLJDCUS9j0sjM3i(CdniAH` ziV+*tlM19BP9=9~3v%4k+mneh_j68`ufY(BI5!?HwTFQ1C!yRg%Me}Gms2HCF@6T} zbe`qwAu7)vTr0G0tobpDaYGSw65}fVm}KFXK^5H&2raJj{v;-9>8`v;-A*5U;@~$x zuXUPVXIyz#c>gCZC3?rD1p|PFA&Q5p?mk(Brs_@#0p5pY6D&d%CGAnp8HvLKQ_;lr zSy6_>zET+%uwZfE{xNIB3TcQhmpZLv{qm(XR7bOA^?Mu~&;c{&p`bI70oYRKB~a_q zOg#m8R;18&@?z5xNP&sr;D`B*f%bpdQZUYZ@$U29{K_#DTrsnIJg5UI3K^m2L*fTr zf5=C`&u%b;H>{ol8pE2NaiA^T{KBm271h4wgZA@7U;kp6@660M z72B1tBPn#@(qJPvI0@v7u4H`RX!FpUh<2tUkrW?}abA#DEgWVTbO$p-I!aLO8n}yJ z!@hrCR82@piu774Sje1SKnhaCAh*q`6k?);%DoniL{>Hd|1>&>F`#z{tBOZAm27PC z3rr;>BwqVCy8~OvYV)F{QoX^?KS%F=V}W=k|SI*7Ojk+F)|*{C>HaO z+GiC9^dx+Z4aX1#ef2pek(r(13XP=79) z2IP&Dx|9bV&-UPsZ|dkVaf-b3osBKM!9$r&c#1Ns^|sQ!3xns6ibFTd0YH<#!lVr+ zFheqq;65KWI0~f*(~PHs6f#~DGEWb7J$zLBC168R+JBeVA~@T$UjekGZcsp5I=+j_ zxvdTrtlqxq<_!1%NdmN`ZOJ_Ss7a0LAG_peBQok^3Lnu+IT@Kas*b@g>zIN|BE#Kt zFY@t_npD}&BK3eaFOEjrz9@%M50RiVHJ40aD>;a{F1!^^_lSR{m95@TqH9~xPhG~* z0n)%eQG1kRK{FxlgL{EuK-Y*J#99(|hGf&?e!EF91{y}L7YWu+V&?t9=ET{BcJ!ph zZB4D=V@t>b(6tegiWvHj;U#0tH0R17eNyt7%!$V7A0uW4pXnNiOHY%x96S_y)pNK4 zenKOv5#sOe8(Mm&sb@!_3C)vde*BHmdz||L;XsE4ez^qrp;VFFqVOaIc6~OrlzzG&X(<>XCTS={#vOz=aE?E08#oKZ$8)O!@Uc20H0qUbh5&78sv$f= zf2f7tA6u#|EHU01K__xnu0|*%?}2a(!gehZa5U{z;3p@=o+!ATla9P1Ev2gQ<@S#) z1uTZffKrp$fp|~G+RQtm32OvdFswUINy;A|{q#W~LW0=S>shdKH1ymW zKMaF^ACcPiGJ!;1oxZoJ~xX?yYJ_SyF!DcEdik2g}YJCP|ly_Oh)S?aMLCg+z9o zLJ&2H?om7bT#SLE{dtwrP)bQEXf)X?nzzIVGtFu;y|ZwulWB>uC~I)$DoL7G+;G=S zXGm5`Eo%QzL_L4u7fmTIg{quocJ}|8$i&zwX`GPWJWJ|ia z>kB3lW7b&>Z;f^6@g^yR;e#s^`8U!B^8o<>EUJ;hRyOWq#uO~~b?&u4kB6$o?-U1P z!%T?bxg*mfU@nkCE^g`*CPLPVd(F%J@Z9acwls&c<^%POJ`ZuxhXGI{4Zl3NCIuR6 zmrH;QPC(Ftb^F=DUX?Dc!ca11xC6znAeH)Hg<>JX7fe*m~ z%1XuLkGhP!g=YjqI$G9Ca8_c& zY3_5NLJ*UFEhy9NXqK@8X=xpOj+U9&#)ZAR*R48Y^te$ZK~xwcX)gwFmduGPDB}p} z)T7S2HL&|dq!b(R2+wVMp^YG=L6w(?Sc?= ztyEEtSD@$M_Z0QV)ZiX>Zp9i`ab##>jE`Rcsfcp@(s#j?GPNvWs{^~tQ1(DtN;9HOd&+Kx<-J{6$l*$T)zRQ2nQm6kbEw$dz%uHI<&fq97&!jfO ztC2veoiKu|3P`gNKs@|?M+1L2Qyj1Op$2kPAWGpZT{ZnAVlX+7x)273dN!xKKV*zs z)a%B%VQ=3oIu9EJQz_(Ys!{@du1?7D+7 zLwOSL{m-~k=cUOXPV$q7iuEY;B@%CbdK)!vK(Aso(DmcXW8nscVCE^u#1|$L5;BXu z_=0)Brp0Zdlb|19)3F32k$oWcxCrQ(lc%Oz`9W|L;P?%@N8DJjjnE z0o{>Yn$JB}LxK|h{wV14UW~~ncC89TQ%a>`x>n&Iq96UZ|1Hafg(}%5$PZnhk*WhXMr2skG(YL(mQWqNU1J zJ+gn(QZpbeRgp+FV8+0Br=^g1R#Ft-jUZ>~Ecz4USq-4mKi7)6C`)`8Ed(Xl@j8~I zoFqy3Go!~Efsp!5ZKBaMd0jb{>Yk(MW1q=rYOPz_XXS&t%<0QebA##f-d3Y+iX!3QQ zD6=n5*k~MaY8fODU+0c-CM8Rdknb#5LE=(NHtrLnpEG@fke*WRkIyPTZ4)iQTsBTm z5AI23b$%$9f&5}KyS;2ETA74P9c;u*`-z5u@erSVk4x3boEM35cJ~qgcOk8?BK_bu zjAl0^$U&fJ^ECCua^ULiP1V5u45wDB)H60!N}K`83bds;Tq$`A7M$fNz^f1N9YSi_ zJ*H9q-Ig}x%&oNl#*msq+}C7OmVT7AfTnN9>-s?$q~ZNOzl-+O?;(>d{0*{nY1Hbj z#u$VzJ(w8e=$6E-u#ZpQCy}MWg((b(cd(dRAXz1FD%%*p2s(BL{Kp38I9 zU*vilPIzgOy&3)a06KQ_oBD!hG5sq^&}3`ZOBvVZ7U%ONB;n)p0o-^D|Dr_neH7w= zsn#K~fi;Lzip{VO(3WaxUH)ZDg`J}5*ODA}Jzb2uP1SgV87lw&*iu)Q z{&S?0L)x^vW|y5VOSS#Z@3rOU)h7`ib%&Qa?pMBD<)s>adI8-|(yKo6JD;zzsF@2W zheJmhi2Bc3y$E;LlA>zmOgfy@te%sWF?9QNyyv}dCQc4@JF49zZ9ntZP%!%XGY4uZYIfh#d1tCVdxR@RA|iHoUn^aR)$N+l(8pnG^Ec%#kJl~wW}}^kL1{L* zTg2bPODA26yMsE2Vn?qQKk>wOX16&GYGrQ`sh}L}oGx9=vQ4S>gqMy-SF-8rQco&p z*2d)~_>L_vpB|<(xH22^6ZqxM?=oh%LkkCswiR?;1@Y)j(N;EVeHbXktsR zr$uO`YX%uz*3Cp%Uw^r%CFH$6TtF!;jw!EjPemPKB%A@Pbnm(V56KZ`ZU7UlzABISX}} zy3%_4Lp+FzJ6CtkdY*3Q6bn!}xYfEkIJr%B|Hd+Z)0XWfvY&g?b`)IOZ61{TJ^+wB z>>;^yRkWKPssXkTKyF5 z__STa&_qn`dj>8;AALK4Wb_+n|NE(kcV75qjM|zrQpa6KwyfG$AJQJT zK88T#b>nIO<%37tJk_anD?IT&h8u^ZtjJjkK;{O z`TMi^uFQFdi@Uq8uU_vPkQy1Y`zPq7v%D)lJd%OBxSvcktFC{^ezxf7S1aw9(7ikA ziHncsAIW1|HMpNOY^vMq_>IU{yHLq;vTQG>U%+^&2JHPNLu>=F!Xj$ zaUG#V-u3r}*>5+7Hgl#aLZ7lRmfq~&p{cmXJ2YKc%l;2Ey`}Oz(4y~JbpJ>+CeZAq zD=>uwD_b}HGn)TR0rTNtnw4gE1W;ipkH*EzV6H36=earId0f}*%|qvFwO_uKTK9_q zF+cyu4A+bO6yFQ|m-)1pYl_0U?Bro)Jp{HnRlG!@=!k7xI_w1I`|}5ZrWlGkJ`Dd1 zMIp5ERh&7uK!bV&g&*D|ix@s>JSKg;BYp-1Wkq!K9+wr^UAG9L#rt`{iaLVlc)zTDSW+ z{VdzQ`O>i0F3!NC-*MCyK7;(}$>l%L z)CmYpi=Sf7O6h#=4X)Bmfzx@qOn{3zKUS`wButLkr8LDs= zIkmWb(OsKtPEMBlU&h9;nzK@FEW0c3U27CiM(dNPJlV54{y@`<)4Rb?*VB`Z(s`mY z^hNjfdiS7eBr+SqO#YnEy4TGr?@O<<)A6mqZ_{;-Ufx?9?Va4!U#&Y=x^8zbrho3W zGrUB3wzoJo+#arc_4az2tqgsAHaIysYO&uM0BCxQx&psvtC`E*ZtN>uz7LPX5Bdyhik7`c zO}Urq>^pAfPFCV81!&7B)=tj0Z+M@K5Nx|>7?9MSmyRs)?iPTwbTG?iwe9Be;&$L* zF@ZhC+N0_9aidm;)9rpK3K%i$SaSa(O&izL?rc`P9q*ke2u?czubDRZ+|9L`ciAi5 zPd0BGcs|}W9uvGiffIX z9_2(2PbaR;+vl@AneFMJ?d7hg*&RzhosFnA;_9AZPxBGpHK>Mgu3v4JcW<}9zF0r4 z4_vsc0)!l`_vWU5-ZcJn?sl&r+He_XkNLej5>>fGwNt~>;$7qOWVN$fzP7RWm}yBX za3(7!+r(h=v;IU4%auKv(5735w`unV&$aoON5?b6MeR8-f!p$kPiKj@_3haS!bi8& zd++!=uD^5g8sYD&V&eAsv&v4l7ZZMhitevVfb|!s)0^834Q_z9{YyBYHTq8Vus>nz z#FDo7EbFC9)3;kjj$PzyRz-I!);#@jLMAu+Y32F&&1DE-WrgimEr5=B%=C+A`RVP? z_I98&wXu2eIcu(LHbt_jJWZ)_cX;02Bs{6+?F35Gm4K9nI$*8zCcTF2soIrI^>!kw zny>rG=&9*jw~nU)yUl#(7W+IAL3V@Z$=rsFW1EMznr;WDy6?5i)5_<1ysC7ycA)*c zJN-7ecXHCx$oqD^`jYQ(_j+*SiFLA%qwVX!{v_l6V0W}L9g5WCs@rvS(>!(*v_v}r zgr>znXzJ+Japkl%9)$*2@Y0K6KbboCyx8q*_vGY#*E}0~w%B+xHtXzbug;Lw`IG&@ zLu1Js2u&BFlDtl=-n@*rRyU;OJd4LxeSI#*yE?jk+irRI`IkOjKAlQ(HVqbU^qvVJQyjtIE zx*6`=cz0j9IbUs#kG?)?yz#5Mt8d1AwOV^~c5LKP=ku+_uUyjd}ZTRYA2qE39 z?_@Xbk3)EUaMzZZP3Kp28mOqwWa(Y}$Ihy=`L*2JZn=(8*V?9Srbb^}J(wnb+H~Hs zwKa9!-tV5;?lqI}clRUl;PdKsS2nbFwY$YnkgvGaKRG>xKcCjTba{^QA<=qz*|~hK zSao|H@AUDi>{?m`T*Sz(9cOPgHBOwZwGEuot$8>fX%?yBk#qra1JhlOcKdDkF^U;% zbbY(To9C;o`MevO4}G}nA9_aFm*&5^i@csN^)5XkR_iuH-LC$WlihgCcX4|pU2!-& zHecyz7rl7Mue>tDumje}mn;uHeC2Vw+fEu2CFJ$K+veyF=?vXln$KG1akJtCO4E?c z=63cu#^Y+0r{s&qb{Eg1o`iWhSJ$IT){!T?6HOnF&KDn-T2J3WzLtw6P0lrq#+a<^ zuJPhe)jsV$`f9GLD;=F4d*cU7W0uWJN9i}O7wuOJT6|?*0f|H)t2CtErL_#9J0(8* zM;^`HDW+_&K2uRwQ}sN_47AWiUu#J3sZizND7j2b0>ne7-Q+v_v-RNC=4nS0&S z{VM>($N|zto3Hncz09W^+gDU%1$tBGF>v$`y? zKJGQX?)biq)ePC)6`hW^Hr+N`z+1C7_iwvc6NoGZK93NpKb>O{Eq!O5l5}5XOSWU^ z8+G}fe!m$r%~J4M`re`O>sVXp(&u*)EtFf!N|wiu#LCbD^AI1X8mufRV{YG_X}*%7 zks=(8Tb&dy8YCL_HwPJWm2h*W&j8xu!>Gk-^omMka>sA+nYP3CVvlnom==&BbI1w) ziC@56P%~j}r)$aHo=%Rt{1!=at`(v}~qfYaL>dLi`0yiT;A7jlEx2A-UTj zTykD+{yW%Ikd`2KN760|N_7^lYhw=IwnqK*4$-Z@;ZtHqY_z(?jUjv~j_W9aB z(DW_!FKBvmd>4%r`VLKN{(+`C&p>D@r2Ez=r0Wx}|NHzMn!awmL(@sMRMR=Vnu!89NK*A(Bdk)?eSKRuzlB$n0OLo#ue`({-yBPNm;3-Ns6DE%-s_goN#$n& zWOIu=IrrE|L6k`AN}E!AO7;LHYlv z18a~7VWR#cP00$`zI#FlS9LikfeaZ~m#IIM2Szl2m#_E6o;jvgK>Ljbi);I}&3%aXV~OPt zV^nJ3Fa8-(|! ztV7=!)q&AjG#G8ACkA5B{aT@cJ`C=52?Od-|A$SIk}bl8KhpFVn?OTqtju#FAhz=_ zX^Pw*4av!xE5)j(cj|o>rJ11E=b69!0ry_OiYGX=ZepxSjD~(m0su0S(na`mk$I6P zV+qvJG{Cn~#U?5M=J*SDFVCituE^PLy@H+<-1!mX)0g_2y5-YBRI(Z-Q%j&U4ZNq8 zm%hRbpvQ>&BTa?grKwBnME#KWJqIRySYz<6Cs3NoBElC%geL0bsCLo;rD;$qlL(x` z7%6t?SM9z{0=6?Prmy;W`*WHaMf5>;KPKg(+2Jzr-RwLRWXIom18~SeOUMIjAN^dX zj-oa!wtZNEUE9i}q$18k?%ZukDqIplIJ+bDm5Bs!T#I8fcdfArZUchjrOar~go18Z zCweMIn8dK34o0yCFDCmlF*i920cH#%dqE?*RbHklDWi12NQ4u;*o;)j305miLw67C z8;!piAl5%tCMS3^O1fPK?e*2O9}Uj|=&Xn2(~&)T z2Du@~fj6^8XMuHid){SCO%-P{Qy9Zco~6{m6wKjZHyOcPR_M$PRyd}{@Deuf&@}!3 zgr*Q_PzW=wMZ^|T^;|PF3-XrZfPsCBn$tS@NhlV^9?j}5pXyh&DwKRWRu7k=n2`eD z*hO)TFpcY?O6r8bXtjPJT6k8IT9PPb7Z;(4QY1l>h8_aUtiTDHMA>1BNz?B47wPCi z&eI1g8_}|f3UEjza2i%RJY0^Z@lQ=kCl|YmTh`tGQ<}d1D^0)tNS!41t4@8FrZp|= zri(`KsPRB)iYecH`a$boX$rLo-d}=YbIf=P9B?0Ilp|$&z91#E&9Lm}mN(O>BGfM8 zVk$V&ug@-rs7rqw_Rm5#3sFEG3PKg`+gFSXv2Zj$kn;T`lK<&A8w-2!SrzYPt%RNh zcYjI%3D+z`__b1FFL0HM&y@9Cod&XT0o#B~obFe$uP|G37#Z%TLq6ab!cQnj#i7nCE2b{!+Cg}iUM3gA$ZCtCs=MjrtNwxM-6 zo|m5$r(V?L)flvNsvhW1x1dzG0OdH4OieD;-9`BEl@NXa0Tn)EFn>YTm!i1>hTT;K z<4Mu{&{QM9FP6}pyCI=x)|WxO3AM_Pd26@n)>iu08gS zEBA!>q2Z4FPxk~p7u`76XQF0DsyAO&78NevWmUaff`G*$WsnhG*P z)C5aJTLYmfm^|tS2YRIIZPlB0Z>FzfIIIv+BC!t9@z|Xz@WQd!()B+f?pnVmGE-8g zio~q$tpm3>Jjr7?#m7eqSb0-~SDD(=h(|1Yuxgr0G6J{9X@L30!i8I3bZwu>r`pyw3N}V@uI55z zoqqZY6RC&~dDv2Xuvir-s(rqn1{iuu*mY6e&kAUs;H2h3S@8YGG7~)E%~Kk8xKyCAX>8CWN}3Es8{>-GL%^;7_g+!FbP?W@rgnV0)8o^eMuz z6W1NXHT=U&Njwwe{R00m)1I`i<3V$IL{(k3v5D;xz33T>t|gq}Qc(u_T3;@Yb*}Lz z0Rtf*#Z#rQNr7WQ((Kp*a%JD_bEoo5wNB?z;0NeeYNhWET@M~P2SQ2uL#jxeF@n)G z|6-;!|1i^P_@9QBtk>q*EzQhW2)E8!Y@T ziq#}<9yn7Jd@Q|zP$XZ=CTJcLi2{(Bk~UV|nh5nQpb_%zPX4M3??Pd&(Xu-E9azat z_9+rye;ZmYhKzAMcW0|UZE88-pcB{~N=;(HW&&W|d~|nVPc49~GNL~W(jv?HWTLBu zY4B+VQb;UTMlJcKA>3MtH`zv2sd`fVZo&Ac-Xn?rtp&PMj|1|q*P(dS|3=aP6B4v9%nYPmSaF;CrZN-XCYe?vr^xDpm> z3eF>GAt-YfnDWtOspn$Li%lVzo?0@wKgv{rpV94aWg7UdOjEFlMVS4p8L!dN zbC8|ReqU|LvPaIQrWu;Ee%#ncFM!%+MvvjsYBZqNmj^1-d7v_NhW~#k(-xpI719}N z4KPRa+MnLervoZe5yq-N%G6Zm?x;Vu!DFAG4VL~=rkrjug73>^*`dEdeFc=j3jCr>!2 zgm&WQUe#U(=@;5BtqW-x&U)@H^WPUx{qh_^yBzd}3n9&2%J@G_A(_np44(E~iGR}L z#KuQ}!&bkE6I`k1_?FDswWfLr*GGzxU)7n4ElydFAm8lC*nTAxTT$eO8 zsQ1klEey`GuqKGDB_N2Ux5+~Gm2hjf4X_Zkw+#sezTTY$;%#w}F-HEdn+=6uavuoJ z4V+6eR;qL4)2l`bZ<13&asF*8m(4(E6$6r#Xr*7Q{ey;sf{G?^4;;u$JJSDUrbRhJ z2I=q2l=wf)G};m-2z6$G7D-Cp83&a$Xly|YglT^+<4Dtu(}Ts2FG9D=UVo!7qa0fp!By` zc%$}OJkA}J5lPBpj8YB#JU;j!#~WFKA2z_uchap+0OcpGKl3FUz!MQpUFUKZ*GYR4kfd3_lIW$?u3C2Q@NXSDt=j; zR$DG8G0H-jv}_PLSh=(>4(TAW0oP$lJCYI!L%?0uY%=FSW~zH)Yx&MhU)KI+ramsG z{6$jXQO(EZ(J0nY`Pi(JwRvbM{y=6rGpPaohnc1a*r{#ENfNjfC%384>N(Ey=lM4{ zmc|mJ*2P)^nJF?xf<;AAq##L0(9YlHgRYWRlGsA`BFGxSY~v6c=}ZR*2MG`SQVyV(ddZl8e#wqKxp0lBWwp|=hb zH%tg|V_N(^tO@nY@ikiDXZ#LY&RZO)LN+x)2N`-t`Yz)wNT^DUViSI4tK{XV@jQ*r1&%rx)6m}yH%F&x(agP9Vu_VdxQpXUnJP-rM4W&g!YbAilMvxYKV z(;MD9uj7JJ7?B>K2Fxx*F?Rr^n6useuopfQAr$7WvJ0)A4n74$6!^m%q;E1mrfLTF-Gj3^$~x; znXUAE7S>V{*;T#M=}1e7Ph*UUvqhWsB|L1C=UZ#%uo6)n9-t-*Lre zdaQ>CBfkoH3PP>E88BIubOpW zXRyYX?OdjXt_`&Hm|>WJ%rpu+_c}rXtrEygFQa%}fXuWO$V>wbI+?a5MWVRBSx3J! zQ%hK}o_-6RQ{J%(Y=w4elpwy_O0mvs(TRw$TsY4JLS2W#z3e2NKI43tRjpCDtnLS= zmy5ao&W}cR+O#Smq@~{1!@Y4jOLk%i$Xw&=On}hI|C*asN0_4z6&Xh-8?W18Mx(08 zA$QQRZPUw+$r;tVl%RC-1Y%&TeF1JzNT;I{-?-~JQ0;A~^V?i9R9YvT zrFS4cxxNi)r{cMO;|>3hGrb2o)2T9Zgb!hT*j2Kn0cd+pysT@JCMop+;=m{CrHVB( z+6YEU>1~&)DGoqq8cWunT-htS{_ad^<*hALG~oP0F;CW=vhu+Do}f3i>}fD7UX;Rl z4E)h6Bw_g$;*qdrl!W}-lqlo^hLH`_*%oR%2Izu(aoJo}8(-?L0#P`{w$=H1QTUJ% zpK+djkv9ZD_skJrI^}CIv2+snbf!fD53}x==k0y`B7H+8ua{<&x8x4ek@CxU+NwUxz_DC@eTC9cxIfOcP*LxXGbL&Jk2Ce?xQ=pUzje8tyXH;6 zczFq*8P3GZt`BcaB06bqowAO%-y9_mkt|Qh0iNCg8v(8t$}MqG94pxD3*oCWEkJ!E zObVMndGC)J`nv4$2TPS`5#S?_eL&wV?dj_z}+8wP?3qhwb+zQm^rN`}X$?*G*Lo$e`#t~s>8NcK_s ze4rjpKMddzlbZP+AT_WaW&+IAehS&IMEhHs_AH%^e_fU^1@6H4eGz`m1;2guX|;~0pah`)Vi_(C{6vnb7bjX9}@fZaRO!kG)Q$CbCe=4 z&H@8376wD-=m*nu=1oUP52H;J2-^L<*cukJErvna&_J(&(p2a_(zM4=FA{K%-||PA zg8Y%D(3R^zX__x@9Uk0rtrvmoO@;6=E*E+nYS2Fr7$C)_j*lAn_#PlNZVwo&gUGDd z+CMf3l#S7~vWfXun(6_iDV3Q+4{o~rn;~p*Y$g|g&WZB`AZc;CYEZQr{70JF_XycU zn*9>cv0~7^87ukFObM2POv}FXEpLeG=8CBx?FT$%X`$_We7K^)n!oMr_gGl91RiM$ z2y6kcT%6x~8pC0Ui{*A??WEG|It_P=>RVXcA~wcH{scXGRzrk%b=4liY!f82acRzw z9;Ft>mcRn(w@Cj5yZsZ_&vAl@6k(wi^ga@;#dNUHCMniIe+s0?eeVTQ%SezWX!Rqd zY|_dQ-A*@C{DqB-K+CNglKHq=>$J5?F+Z<3_RL8gfNgZh0W4-DVWb0CiKmJh7^plf(;FVg$)}% zyc5k25L`BSVh^_0+0}`iFo`2S!OyfEo1ck*fXozyPV1 z?_qn^X;#u!=N1aypGkv-VPK4Xw2ztMmX+pqyw|+0K{4dg{3>crmX}RETud2F)egP| z`OS4bsnq#l9+uSR3}w52FPSlCD;v~YAt>cT)pDFciSk0ijm0d$5g#91(BfYBgN2wN zJcZi~*m+^9o}vO93OEOKzIj2Y;D`w5&D3H~i*jpUn^S{-##Fwp+s4$~E;Ire%X3uV zbwWHPiH~#abF~22%kjpVf5_W6z2AvU3wnDJbawWXIJ8}2x>_})<7~(M-1u4VhH2!`yVG5i6>!Zn|PHEWS#iL_?$=OCUom;-n9d}0EQBLd6-y$zipygQ z>TkoTWikAUGchX)QUwc)(%Hk~#8W=gI%zD`sMWt!H@~G5vA2YT&OavP%3yBT&uCR9Y8`Rc8BV9 z6@?~BEd$aMehF1s(EDfK^oW}-Il}w!!}0naarWd9nD4Glkro; z_CWf6V7TUmL1RMP96Ph=sj!@5q2;8?dvDSKR!WIy>KKmi@OOW-?HD95wkjS%M>@+O zd_?mT##%9k=r~|d(K})WKNTBa%>~pQkSe4+(AP0}KNSU~MVsylycho7JA_`vq4fWe zb(dXjZQ;U(ad)@k?i4Q&+}+)^xVyW%ySuwnptu)zcM8QFPP+F#=l$@G!4JqF$;w)D z&g;1q(3!(x^(JRg^Btsxa94kBgw)*=o#|w)vXJXL(g;+Sa&v<>a7oo3qFC3Ajr#K{ z(Fp3Bwg+BGAxx8N+uZ3k4MavnD)h!j8KU6c?Q4%)Ug$Za(=d2|mKh_z-Dtug|Lnfi_fpP`G_ayDV z{|-?4K~;i3PV6`<8-7VaQAJPr%9d^vzhVvSkAfzna{2$$AMJ=JpciVv{?mCvPW^Ci z$PY`(5lzxUIl-|W7U)!OVBOx)(Bok4@|SLjnY8c4AYj?ongp@-c;rVNLXKPen5hV( z%@XT#bpJLUal$4i^$(t3EhLO_;@~*M3n5PfHL(W`*0wFqE($NUl$xY4R9~C0seJ#! zi}2VUFf)A+FH0fb%eic7q|mGY9^P>hO3FI2L-&v|ABj+lYnQ}QLPIfNDh(JRRQU=o z%W*Qb_3L^o-3CW_#`x@cyd<}X#i^OmgsP-U%-MysTG9F_c_A0As)5O)^&_P7gaJ!^ z=o<`f6|&D>K#dgpXgCqIk}6Di3zpT(Q+j-3=2>+wy*-4vc1h^Lod;{VU&0%kalSPq zY-9Pg{O?cmE7`35_KfPet6MsZ4`(}S6OsUk_;mTSV(JJq3Pti3y}n%#G}uHe&L&CA zi1g17O0C425ZzYo_sPKwMkb@E%@`q7_2aRm3CXw;ca%m#@JFCGRkd77Q=$OJ%El1j zYqfPfRk^{yoidu+85-W-{B6$DMW+1k7s1PyWI6zm@dyw-67hYS$`w^YM}|WnYVxl) zl>>Uy1sk4+JEvtPSv^vF*=(qKP$4jfq2$s#VoCWgX&Q??$es9bij}Gs`TcJ~;SEP} zl6Tt%o>JU!rs5__%HAhF2nWSy6&MdRhuK!~p=vA=1xBkFD$4d-#qAn=zo%4t3i4uS z|7F|!HpN^s&LId9#cK0~6D4A`XVyg$L_V7N4(Sn4XOZaG^>gspH;YE2lAUh3MXDkh zF;L+>ha8E&z)Fv}*Ot1^f8`>MI;57G1X(D63_|W})owt4O9!muf>hAJN(34O#Y~-q z%8Y{s<)*jkjUgPsHK^1Yq%ztKKzFVw9a#)tg)h68>Qb zj;~C{Nw!nC;u4nJ7@-GPZOsU<6Mny>j8xKB8{@fWhyPDlVvloW2)TvFE+I+A;|vc;7&N?^1mHZ zCI1RF_+MF3te7q>P6&{J=BFeN8IwQM%1YNg;Qqs==F=HD;QJo=!{v{%Ra33ey(z>} z--R4lmh=1Wr#PFps`&ZCAwi`SW+nQu&f&SkYT`5uj&ssBIKh-Xx`l9+P}0E6sUq$9 zkW$lPa1B&$u-}AOp}i?xzT*BDGF|>RWJ(?hisa2$i+!|E9oJ1I8hR1aF%Ix!u-gdH6r!D~>$e z_jf8rUokTVca2cNmu78%QyN7J34#m<2hX|>AF9M{Yn6cvt+Y`ZU_&Sg_2u}=bzCl1 z##Az!obhB-=t9!uBG$bU+7HtIuQoN79sLm@!*(F$AgCnhia-r2sR?VYZ8@Qv78EFg zZDlG*H?hExCI#GmoeRWx5Sh|?J=P~%e42@L<~n2t|=R{-#E z4q97LMh}M^Wd&;~D{sYnN7mhDanLLoVjusIdE&VT&E$QH`B`|j;c zANIf2bn0JgI{Md|`lsrsN|YxTBG=-gV-T4^Csd<&9pVlolvB<-7i4xjA~v3-Bf*r? zviu3fP_TAcJx-RrkF@ETn}mjmXEjfn%I_4d0URTU$=pq4s-UlqDuPZN{a?p4RmIyZ z9xDo4*&DpP5jX~B850a!+rxR%{7QaCybxHk4o6t-F-JVYsfo{==n$c4Wlu=-IY9dd zn;s2VyF?{A-n<0X8pdEXsybgoCEhYT(hmv9R+bTXEo|pok=K%6T>6dYKqiARvb#2Q zZhZ)Z2I_bd$!1qO{Ys{=$JR|$K``6&pqV59VpC#^+7$wdWFR&jIuwRVDpV>HB^Aa^ zFzhEG590*;sGlQ9*u4skkN%XG{;N&FrdiYG6$Pr{vPf|?B9TGiOgJPr?X&+0nI_1% z79iU&W@yL4k#rP84Gje(s{C1kbWM-+4@#F&r9bsJtJOYO3|t2*3Bb43R8H#?;+RfW zlcnKPTfkdJaT+a+A4t3bE1Gs_YBd&3TM{;Rv}v6o(e3<7e(2b&;Sd#PVDIT_?`-dD zPm_d-H9QIQrtPsgaIUd(kOc%rz|r7)l`Y(`D*1(a03LiZb1b9WX|HO6s?N6z*laDg z<_%0KK757OBxfDJnLJ5pjidb9Oa^s3WW^XYTB=2hWTgNvnpo;{tN(7I|kDd zl+w7Jxp|ji5v~8zrt2?m2u82_*PqW$0eJwwZM9fe#%FVn$HS?zGKbQ(;E zQOL{1s^95(-Cb|JosPq^WH7$YPcyV1+WDvsxgD0>9FKEy#Ci-@^}TZSdarr_&eO1X z*O+Z`KKI6awU1wZpLz!!z03izDR;WB&{oLw{chJ;_{{R3b$s`er+I9hY~R)d*tczG z=H4}6$kczQyT?)bkFLZ6kqzwe>aUSj700nP_xsvvcK$}Xrv%-5jDc$1U7$J*My2;Q ze+OKic~w2hyP9tFS*UN%b^A5by$W~Tgqsc54)ocmH&9j8ZeeDAKIqC$1;SJAq-YC0 z6~xUnlmjE)Z$8{6>tvcvBW4m4wUeEN~tNiwTM1dt! zUkC_4=YLD4JXa5zl*t!;*S1$uo9b8N?~mKRHz9|7uV$keLaf>--X1p;J85n#cE)+e z#rWS=HCgMc{6E1IT3LYHGzwh1aaX^d!u$gaSTcox#qKM)nvc}K8b$QB1psT0kKgk3 zVm({tWPG2r%ZiO3OkdQw-2FsNLpg#CFQbaL4`8;p(TLh0Xy`5E)kCqS<+n!LNb2*> z#uNeRp{0aZ!01$~*XP*7@MTqu;Day<2gRd*kNQ^Lx1& zBt~Q;)2l9lv6!ntCsj&sSNj(l&&T=JY(leC{O94*RoDp=M`O=+e4?4(U87k9k53AH z?F>Y62VKYfSB~Oplzaw_F0S^;Gh0^=i>-hwM`oQzb^I;fT~1E9rrh(GpnZICM`ybk$2_^T(<=HWsWWUTzc<9!J8bpq`9Ple`&IyBTY8Nz zhc_o>H`D!I{ok}{5-@EVfas_9H*NaTyb%cS(S7uWtFml;5q%EO_0_RDpBIAP%=7iS zt17Zxj2ZIKn&l>fW8?= z?;V%7q&rFJ_P{i4rxH@egfNf1O0HYS)Rw-vncz6rw=$m@K-6J2AA;3X=H>w;50=fTs>&c(q~xnBv>?QV#SFTwwk)5kK+jNxa^ z%ifR;g{)~i&x~b#-+t-p)Q1v%ABv_uE9) zSvMc?X@Deo7Np z>)41-V_%ZEl|2lHCG8Ud&FS|IE1)^edpvkopH|rlvl`< z_uQC&FtM%g(aj(GP=Rw)^|Y$`JToII;3x8<7P#KpMZq;s)t6;=t;=|IzWna#Tv)sx z*I8Z@hcq73^^ZAavJ6#gZ;L#+74>~Ky%Of(?c>VC3ife($g7>kKJImMb-Z?AKRedm z-Jkh5_In@s`*(-^cI^Q)r!((m|CrM_^_#Mmo~RoAtGTm-kB5n{^P|Px+E1Onr}=(| z6t{O#@hdwY@3+&4v9TdsKTV3a`OinwmWyL9?|de(ZGIXtZ)K&2@9?@T{ZN)|q=j7} zh;KCjkPEf%{zFIcPgRz${Bkm}=OYqV*fUeKZ?CtFaPqxdKe6os@^;7DbbQ-xC-bI$ zjGd|*&gNmHo79C7eBQ=ojxy!dYF?{NoB!6II=;(15axb8i{QVitJ->aPBh6yySth; z7-#C^4)_?a(CwtPxj~n&nVT%DD^GlH6iUsm168tV;Xbk;ldgcxX6fKU(4R4S)%g;Y zF_e? z127yIhZKuUd3HqWm*uVN|7`x{l$9OAQl!`OnyGIiVJz!5Xg4({$?$=~OfIA*x-S67EcLa1*>l?xRrcNPc&mR4+^@am{%lKHukU#s&exs}Q!lTMm#6*q z;(hhyWvL3e&yL8Bcf(8F&hE-#!>g~&We?b2?sIXx<^m+#t0V8MP6R=Ft&69jZ}If> zJRc194`*@mT)ElxuKW7FIexNld9+_W$}MeqbCs_@0$*GpcAC}IcIgz4+w}5{*V>AX z_Ot!N&RCH5)!zNOId&S)&BM-3|7}doSk~b7so?6*Z6dz(i_7Zkm#!u+bVnvaK+{-X zuh$;(%!RG5?$fHapE_Z8*=>*RDv(^-AzzNkh0|3r@e^F8+=IKf9$oeBFOSeYeLSok z2{+1be?b}Udc5q}+S<&n=JRSpd>(pPrz)#=ygO*)S+CRcS@H5>S(Ra0yQ+eIB<$w# z?M;kB-unGPc$KZy)uDx~&+GYT_s+>%k+pRnpFa1~@3Hy&EGjCi zq1qR>DtSGdJfhZ-n;Yj_XNuhJW#JFs&p|$5>9hIT;N0EMWq)opY_pArZr9h*O8#wE zHgtrJrltPc^%l@#j(l#{CGIBYHnA1U$@zH6$FHZ)qc>8c%onVh4;a&?b924SyJi6@ z_h#Qu@59Ti?aitCm@GO*-}LO9-+EhaOs?BHfE8Yk##i5ajLCJk2hb}%{q^Zrx~C^= zW1BCxQ}0dUOjLB2k14PC$4m<_)k$v;*N8<;BQQPY0SC9L*vI)!P=U0TKEz<6-Z4Sq~aKAT?+^$c@ zUzVm)-cwq0i1>6`9`krt`Z_wD+>Rf^`hIuw`+3{l#}6*8o_0-yUEBYD&T%t6&h`4D z{;*8g`9CBoiAsb zb1(CcT||26@Am86tH)9A@6dIvOlz-2SINAsYPqDIP^nMO{i9b@EzxLGt zo@Z@q?P_ZG4;^~EulxJx+B|GNH~D&lr&1hm-~Jex-tJyoMMEb+#p&t!`Y*>JQCTrf zOx!Z0Za>aEVaQSKF21+Po8BKDy)0=(^=Z5LrZW=i5TrZWxm+ziz}=d5yL-5L&D1q# zJsezLuAXk$_WF2uzpS4fo*s>_i?_G+bh>n0clP-%ea5Nh+JBov#(&+uti9P^+;6jc zpGS7nyR^x(`+czdVSn|||7^k|kMyY5<@jdg^ZtDOLB_qU;p1ih=k2M!ItAPO{P)`h z!H%%c>z+HQoBoe^s{Wpkpa>qmKJc=c`7W=cx1+F$hl`8B)x%!0+t>9pCbitU9>mv# zOPgk|>-$~kcV?ym-=1f{YHM$+kK1Qk)N5^bw|LxKPPa~9U2wN=ySLgj#kNP=r}tyV zo2}2Q&nICw0v)uovoB}$mdA5{?`E$i|HZ}c-TASu!H8{0_ve!>*~Y8Wtt>B2Y40Z7 zUtK-!&e*P(dY6yVEFLbO4--M|e(y(1x17*b4{c7=ar%AhJ-|Rg*>-D>mp=c~dfP4x zA>errt(M-(5shFu>Bi*nL(BJqiOA3W0Sazn{+K8?C$;Tz zXKd(l%G@okHDLU`NxALO_j5WEIm`-kE6LBwZfo1)?c(?C`@5$dL+ap^YZGtZrZ0cr zhF>#u+|^s_Ft%6KpS!~Yn~eDG=id($)t5f)UVbjd#y7s_NAC|0wm!};yL;=l@wEEH zhgAM;krLbER}(CG3-S#5L`cZvlY|3ycrG7zti3f1=`SOZ8-2cu$+u20`dvDCo*p|^ zYTxcs?YcdVYh7D?`$o+*-R$Z6&Wy0bw%KcCdQSE4pUfS(?pb`_M|mynr^-OuJmm)% zFtF`P(w|bd`Wi6Qvptj4iEb*V}}(a^LpAl&OAft@ADj8$|S7<9*~8q`rO}HwFAh zflj{x|5;k9aGX3q^!{t=&AiHaF%%kAWmZ{5jw(bRwN zLTWi4J9g>Y4N!)6!A$$CPMq|4iol5CrqVaEo_o^yL6uLARabg&(zRtK9iBR>5j2NO zaVoP45i||KmR|ouMk+VOD{VoTf9{pGK(#0}Gs<9WEL5u2z%l{HhC#C!ZTZ*GjJHZ- zZe8ymKh#DTiyAHnqz03sS1j;WRB$u|%i z8J3k`_;{7v-I>W^g(9r!a1dpN>^)ny&rQiCMP{c2m>rr)*6apS=l%3@TxDzduml#G z1bZ@e!Y1=}o-5(|45_BcEoX+7y#lz$XDtFK=ldjIwB8{lOG$S1V^Ppi9`&wR{%0ti zpsIr~6ygA`&E{Tw;)svxn93}(M^fX9;$){!ri4SOBJ8chodRrM^i%w4K$3kvSqJ5qYA4Qc87zK8R?iI9t0Ti zIq#FjDD)7b%e_@4L!?cJ=cagtMgPNTpae(0_6hMYr=u%< z*mUe)a0*Z+*-;Z5;VdiZfg>SE>z?hs@9sWME~e%_5W$Kp9t79xs3IbYJ(Vqx)G zl8cOuF)}59quX(-?2uTDSpjnhQ-?Dr3f!ll!cEZ`^a`{DR;@9ZhnC}FFB^N=GB=Ex zGJ8IA%Z9`(1V%a>&f&Q-;qVmjbZ)tI);7^5hCf45@oPWR^*DjEYwzooK{*)8@#Tj^ zju+zn*L>#l^$vUeVoA9rO8mcTBKn}P_tiQI+Y6>i0gw!WBpygr9O+t}V@7^KJ9<3y zzg9jF!aq#@Fc4Z@K%yQBU7-b|`g$TnJ1+Huq9uA-LbPFwRcjjsAHTY`!M4Vsbs`k; zeJ@|LJo97jAaQ2cF#4bQu$u{>zX(PZ76hu;k(1lMs?u7DFNRYZXK86znUjKZt7uPz zU}97=k-QR+d4-oY!NN5q^wTbm7Eom@>T&wG^=k<#f<_s-JQjV$hBI{c_ky7TQBy_< zB25>aWG_*>>*3Z+O@x!WA0Uq?)F@k0G@`;Fko`#^3?&NLm(J4Tca%vr(6etC9Lh4t zY=%>-A4)PE1cgIgnU-fIiRI+4V5RuTPoWLIQnm3eZ(#riA~wPo&ZNe`VlOMPh$fL!69bYNPU6_v?K(m94cRUd$y}6{cO7rPl=6#_ zWG2Ok(1M1fFbRIn%oyylDgJ0WeE@ruESH^Kjm^~_3=|now1NHmk00sWmI^5f`F1TO z*;&9T>SuVK1fxQ*vF@&jmPE8^O>L7G^imI_KE=s+h9*|O1rRMksbmYN@GLV%N74x- z*r!E}qsw#Zbh4O&1j!`l9O1FFO_W23ah+GRV`5@x9#3PXlz#+BG7Kda--$&`jzJzO zPKY5E3eQg9V|@#}o=%s=`5W9j=dReCPS9!9=>{#+bAiNPtYMsTLXSZFxz2$PpDEIl zKTRd{8o?{WQHz>@M;Yg;}7Lql>HGQsvxi2kVn2o&i-JzbTBkPWl&`-2CYjT+W09cc|nq&kl=`CQ)Er2!k zXIG$5NNAOO6Z%l>k(64gk})Cx#f4!HOB>xxkj=W%3Q3qeh^1Jkp3Q>cC>eORbJQbz zTi)Q4VRk{GR=F~c(A<_KkHK7sC%B86+b!tF)xFs@;>yGF>M#Yd3(|u=Y}XMFfi^sitthABvzWU`s?aUnuTimOui2Un3RxoFtU&MH*wK4q?G_w_iX_I>p85{OCVrb?54XtPf^}vd z1kIj-k$u~*%Dft~`W?JtSiSkIAnBIUfK4vPzU5d?w)S3lf!K8>Pg7D-VTXnu1eDrP zTJf%&`*l_dFA$vl3e2d+EgVjWG8HGYZdzmn)ES(nG<(!@{dgk~dpAizujr;A*i<{)0$K`^eG7(>~4FIh-|8DW@;linz~RH&wg9Xa1(R`j{i2$nYN zL>FqwYcn<=H3k_p+u=Y+QO?Bj1hm|gj>~bpK?tE4s6)ezuTNnR$e49rKiJaA)^&`_ z8^XU`W^_e|2vnzXtIrlKRWCf5#M)5)*99UMtk>qFhn<)08fW|9BhOlC3YpdN=lm?K7^p;UC3CKxd z=}2`BmP{}kkZM#14-FTI8+#f;{B8905pztEd7afLkKm8mH(&*s+s5Zt4M%8mker4n5-K}3N)INrD{?Ida3Yk2g0PCo3Y&CTCH{k1NY{pRxh`| zFGS3s{pg3mJ8z+zU?AS^<P zK}D%FD(ciuuyWC6S#Ot|8G21>8VHrO`W3*DTi2^2IT>5@EVIy{OBfWZI5R8`Ny{ih zQ}S>MIWAQ}xGa=x_GTvviNM{kP=%)cIbvhJFupFl57e=>g#rXi4Y>+Dl>D4NM#@^w;pa6!vazj$0Bx*69Zb%R%l6d59}JhG%~gTPx} z=~g!=j;9tCTl)M=m-Ln#b|z5~_vvO8p-qQ73#gtzOAa^C`{rRCiG>9Z&2!#0(<+t` z_0P2>)*huOuZU~WNtRvY{!STfT`Mi#RjyM(hsIXo2&{+{7WeE28)R1NyLg0v{Da4=ZM-B$IqI%cIts<`?nFkzhJTmc5@H1tSX%@bM%I`BR zqAdky(xuTf5a)$pAy*{;aO1_y`ZZI3nBf#K%cUk{F|-UEE5Z}&A`=@KMk;elW-M9S zeyr;n-11(NUBKrL1jC?T@GbA-oG&QtN{#1ao7AHF3>-;?X&0ETco2}?0LlK5h4SX; z1JA{UMniCasvjY)t(%&DA13$x|HTh}^I#tdKt)V>-c0|5Y9S|6>?UT(97o--u2{${ z5JB%jEWJkwVf^KU#tyOP&&I4?wyKmPY%CO$s-QSlm4qn^B2?Ki?0bWY#C=WgyMf5R zC+r?pkGP>|gD)0Kj*`E+yKE%wfu)B+c8v#<^P}TNmRoIgCqm9AD#m4(tc;h>8p*P{ za(rDlD`Lp#p@~L?v9?d;#R8!P9CP zG~%;Q*G;TsG*@iWc5)iaVysD9!5rN3Qu5M;?#!xsENLW-i)!_VFVvVdGR&gkgozhS zZr`zYYf3;!PL%DmqhSoc)orR{A6yXCAXAmh@fWdBy(|7YQXMSVU-hdI*21lzDm)6O zEFal*>-XD@G@ugH@BOw4xS;#uQAe0fs3+r#2zW+ALGikkw&@#~`QxO*^@3Xn{dWI! zpy8|9Ep`={s914g1oQ{;c0_-bG^$apAp`pK9MZ_y3iJrjyRJc>;E-R#5t(@PD5mR9 zh~!!-C+>DU1(sORvL6=~nD~g{Na#t|OInh{g7v6&DkD-buJG(NlImSGRWTq)T^*VP zPRO3Zil-H|l+Z?%Th4tm@sv}6cT_&G>Zg4(X*?(tZ%})d)M`Cw@hz-CzSXf{NcuCh zn%+hDm!Mm5Ps~pzBvb2t7q6+Wh=gv4lTF78RjZERD_*t8zaXZz#Sj_A?0;P;th)%3 zq!?nGC6KLEvrQ(!pSIBb9*mNOofmnbQBKtPvmNy6>IdNXX?YJ;yZ^0fPWa2HG8+i@7 zcttrs#A=58CnA`kYb~3sL1>C|pL%ijYf%YFL$pH9AqqF>`C#~gVq(M#okWYq)g5-| zhmcze4c*L1jiY2Xz?NKeo9zoIiP&Rdetvy?N~1mcagHjvp|KI^pzW$kGA|8R=vCaK7MD0V^lYEj=x1biB^}SD6RY#U3K6p^ zBJs=P0X5{=TAe40=eejt+>hanFzK{|Zm#_l9e;X!!gdQ?ol*OlzHycF8V_ej?JZ3<|{1qDF9i?Q${8 zy6In#l`UB7#7pGWJIrAl-4pC9TULe`-y;=gBNzl|P8lG!j*Fqi^d|nnaGgS#E(ua2zaI!lu5ixd-XtHeP@L2S^2l0#)!IVa!t%C4$EStu{ z4;NaVbsj3pN)`dy@R5j&j>!WK90Dsl!CK#08Vwa6jJYtU^;Th1mm1gJ{TY84Sbf2= zlAr*AHmw0q!q zSc-8rEQVkH%67;%H7{3|`^|8)K|S=_dONw)qRO}u@pS5r1eCHR(U(7^-UTxeC!09E z&=F?}=%Uh!u#jrQVAEnmcx@Ih_44}Qp1O)@r2OGf9GJ;xo&hz~eGv_hiXys zl{ALLyz~!nJ z`dxot7%Vo5Z3ohD@r)VJf3wSiq4TR()8D|KgL_Z|w;J&0Rlb-P*7SzqI}u?~Cox6n zkVjwii!=aI+2vlS!66D^!5{TZB-9fA*wwPj2um1Y8qPr~DdGx@1$W!dzbQ*e8R@l! z@MY32wJj12ef*B!4y?s926smZhPi&>h&T|G1`Yqc5+xLLK)GdoUJ_JttLvR)EF8?mOSSM*)!gkA_g>@2>XKx<=0L$ONej* z@-FgpqcubRiPNX%{4ygnw8PG-(IC)9n1VE5KP|l%aVYwx-Me`Bv*IozuQXkYg@&zs zNYG_Uy557>`Jg%?hmBXUZog_(l-65B(CzTf@o6H`B^NK2$Mh+tcub$ zQH|?|Etp|f+u{eK}~!^J0LmYZLWYDEgFGf!Q|r@HOp)QE=G!mkf? z)ubhBN%gKCdB;5qv;^G>dTF8yQa<32tJ7-Kti5U!{fa485LPN=OjoKUp?Q@Ao?~rZ z$X`-8OH>R>M+gkuCGGd8;$6azG5EtzfbjMSV17#HmTqMbfEFkc?VH9mpWOAzFDlQKLz-stVa0^mEVE>#Tp^Rghqt1k$M4>PgnDt6<+Cd58$$ z&V8Wte&L9%XEsY487Q)1%3~4VRgA`vmHuhzSTketMZ6kVRlm`I8Xiy`Y{e8!#XuEe zK>>Tvgkyv?te} zGz6B?$$;pmqC)w1MR_uz8Say9WoETi$g)oBIkNDj;-Sh~xkFahRxt~lf?YrBUBx$f z=TAb5rz;~Q!T|!@BO&XU&R>D5y60E|KJE(88*UNBsb;Lub$VVuWj3f>mnuv3Rs}GN zFhDR0pcd3wnIn>j12sAzBK3N_FFL|Q3x9^7@svOelI|Bi|=%={}|xjpny?3S9= zRD!%E6HAxztaw?e``c-ZHRCMTBt#GZ$W>QPLg1e*Sq_Rzb#ne#EUwHzf&aX$7gL%w zw9GBCsexCxqcm~ME?LEh_$b^cU#3)@7LydLXiei&lwPC~Z0M(Tn?=khh7c6YcR!CZ z5~@X!K7=zn%}noyvct|a*a95>zO~{0#!W;fK}H%KZvRF6ev%atDXW;2yG%)O)7%tF zH<+jMQpU5CjmH85U&3h|B{6~$6WY>sw9_cs=EWlaU^HY>3R)ugg}U=7Giifapg>7` zV2R4Bl_MBtxNXh&Fgwx#vp$*7RjOKye;A1t%2>9xF;C92K0}&SgnYrs!FRQ^UlTu^ zmp+;Bf?)ZWDvXCme%QB##hUG*O83#Xg)5A>O>zAaMmKtzt3gxOhNy;901(Uzf|M)- zUU%6(xTbmur-gi02Ol52H{}mv6?n0rWcoF_RUN=?+W|>I-2ok2pOTpK#oF|8emm39 zP#&`f!=Z-UmD2yid93kKH)3` z(R&$T#xIWVRA}AsY+<>3)+pIZsjrh)uutN}sl7WO)^IUuhGGi4fREW7?7x@-Ffiw! zXD)@Is0w0Qu~eqT=AvazHV}4IonuHR+F7a|Q}M)SJO75;b?J&)F_)@F9F$l< zICsNm&Y;$zAfqB&Jq4}PnjARK1cs*tLVxiF3Li(fnJ|&kz~S=GK17d9WeImDmLs?o zfiPmq5BtbDN>lg*gb-xet-gpkMq<=H zV}0qQpi@CSNc1g@I?;MU$Jevw^}Vxz2xVzwKEkRswl$0mRFR~4N%!K(xP#5snnL`=AH`bq9|RzX~8UpTlAW+dOqCBh4v0b(j*dA4cgdH zXxz(``fbPCWEmMjG_T&HgQnnGFu)l_Eqaeh ztIe$#)*~0Qtd$uGI7VP}|FozVeifE0)EPCFpk&Be2x-d4wrw!ZS9j$cSr~wUHy(cO z42u&=Hy)RRf}O*;qkLMDcKvFG1gbrLac0fey|B=6oNE}%VnR>x72j}#@!V_hhfc_r zC|1bWG9bOtHJbNQ_3mXW#4Y&4xudUnOmPyxpDkcWQc zfd64KgU1O%+4IWXU1|-1B=|xT?QP|ssj^LvmN2yAz8^+9P z{)+<$CfM~OaS$Y-TVUcL3vO}!UYT;bgrjUp@T>?*=jBZO=DGzw@iszkqjw< zSp34YM>IpzsdwpP!|7`lT9}D)tXLcA7nn*VxOYey$N{o%$N6f@z|Fl%gKxO3?HZ>S zMc%Ht;uil3uP@3H!&8cG3r3A4@TqVDyXmx&0fnCq5j0dlS4F*|#qtt*;KVVk!hVT4 zYXENi#G;2(YSrNv<#TwD{Lhm@(%swpKjE zqWkD3@IAQ|Yq=#mI(Pds{g`2kq)fPY5T-ukSXgVTZ$`J%0mC_ITnn#A z=0L}5?A+}AhTb@0QfUMyS&arp(K2R3Y%OB))ypb5p`0O2X`xpfy$KPmveu$9Q0_-R z6eN~DE1o5_ltQro5P8T53Z^C3eeS76M?l;x1n#PHkA0rBgozD}^zuBy*6>hh3lEDzC~(Hv*_5W({bHpL1kK zdPh+vR_`K}zw8-N?y#A6sm{v0GAJt6U@3q8%Dhr1mQr}lKvmQ|z)lG@MEo9wEd!@A zoN9(gHAxwq=(CVyg{d<=F3Ze>PvA`s2mf2~|Cx(_p47kWi#g?kV$Srh2a9&{l@uSX zXadJ}><#-8N5!u!ft8BFYN91$f%{8iN{jF_J2AkV@^l-??rmfdhcmqVFzIX!MNX+q zW}{D)WoXBeeBA853aO?!+ydQ1-%P<}`HEeY#WICK!Biqijno8*fVTMymQe7fzqo#- zJ;B%c7`WAGSk$m~(y5L=6@=j99Z(2rsz|pULRxRg(BWvsz{A?b(vMA5(olsv`wcP? z@N8h29E5EF{%(o!(##HtHeY!=clNE{WB5pjs1n@ro#jX)G+wa5KUtP*|BHZhh;jsr z!%c*p>qb?4!3E{Ap;)smO^@b|hHs>U66j)?_FqP* zCliFjWmm)_*<4DjRM9iN?6)|s8c8x>p`=KDtO4@Ha&E0HEd+G)skLawjtk}{S=P-M zz7Z8u1@%7&ek-4Fkeb3SAp*4`$gMyhLQev5lU;_3@T60FNU=I1_yUot78y4zT7;ZY zdD-f5E_F4h$B_x5%Yps9K(I&>us5jqVf**Kyp{yVJ+nxhA;hf0#ip>`AlwEuFEMwk+bOMh%6Lc$@C@irEU{VK^ z8|yDjdm#fjM8WDkM|a36T8;(z+YGtk?=Y(zgW`D$6|Jumy`@f~tXSx9!W)d79EPL7 zbvI3!LGgvZ5>7QD$}w*x!PhHP+Ou(Ia{*^E|MTSSyCxP1{Yiiz6~#BTwqn9w10~W3 zKjk6FsPo&pFh5x+x`9A~z9Bes@o1@530pYE1q7i|U1?T2i#~}E<%iJZB*`i@vEZx# zx)oGdm7pkaFf9F&nmufp&&1*@L`hl$9{%dL8H#i6mIEiaUg#LKfU89X>7}A0B_<9n zYq5^?#VD2t=D>a!sAXnL6PawXB7#mqvG?6bcwA6#1|w#X@WME=KtYF+6g)l;^x!DY zYMvk2O)rnk(vvS_tO`d7)r-Ph(cIJ}@n8`>@rz_-d)7BBzYIJQgjrY)Gc3gtt1fl1qOFF}k5)mZ!DQb08E#prsl(L1HzR+VD%4u0e6dZ922lZg4Ah4> zFR~wvnzK^J1wS@l?WFHdEe#h!L4fK9Xf_v`SC$Y_Eb-JL4klSPSWJn4;Me#)9U0Wb z00h-UcnH4pZfhek0~$>YUc6`{v45{^9RX3d;kXf;AwIIQMxP_hhYIv<8+T!ojLf7$ z5c;$aTVIVuV>(wr#&Jfyj6;Lvas~uhEq@ev-4Q62K*bb@O`=93cbJ*GGZ$^N!OxNJ zF1Y#EXw8eit0W~9i$UTX$G}gC_~b$~*{c@silmyZY9+s(z#vDdRs(mi8gJbv@qm@; zz(bYn$a>|wpbX?)cDM>?!@ut_=%uH+AvnU?o0HvS_MQf7yA3sek zdL1uqf&0K&$XlK1pbg}<;i&l>w*Ar%K?^^q$V9TE+G21cb442Z)v^e<3=W|vU(LJ( zBrE(CPewEDeioamduwwr|KTHSU%4raY8nI%FaB>X7+xUg6p80%nf_XOnQA5pWb0mM zvv6vr2B;wi&K=8;94;sux&305qS&Zdj#JcD6w!(Bx$vT6Orp%K&yl7bjap%W#g4E7 z__kE*Fk&ROnuJp_e0OJ^e*!pL;kI7K+uiK=vGUoNOawK>EAO9};kJwZ{3 zKs**7gU$Z+%jJI`5k#j^;3vcpzU2|JOKLU2D!09&N?&%FHU`to9FaHP!KCtbdRRmE zrl*K|AzfyAY)nB=v0ly7dR*(AASAqpRsuv9_-l<=Qj8GfK&td6LA{|V!nX2Q_0i|~ zj_CtB@XL{;EY4U4DE;Wsgd}5%7`OKtRnvw+hTDgxrx%=ZT?=FEnOzB^Z$y{>2cJM- zzkRN0vV_; z%Gd~f4>t8)1wtssD=-)nF^V8tQu<+OFr!>->$BFZ@(f#Q%ZX}{>Xa?HK+VOP^rL6J zDo}b$ghB%OY#D%4HZ3h%Mi~)+;$jDBK40J7*?97JgocqRj7;Gg4ofq0ph3;1aGyZw zTk2h8PMvNMuD%uModL634{C}5t5ORut%hhzpW91bp~PG9156>M8r66kMGcA^QVCfx z1#NEBCwP`@5R`a?Av8#2V?kGQDZ(!0VwGVeL_;<8cos^tF$cnA9Cw`LV4^ac7?l)Z zk|jd}pPY5D*lN=k8;^H(S4J=x!C(Y~>o@@+%#l$RwaD0#5(EngN`jU$s<*zK8jLeK7@24k(7zGH#{QQ)E33LXcI+5-xK=qx^$D@pIB$+J8xGKrIC2uBhElm{ zRshVp#uyZ2sE23 z1ap+_1j+T@t7r*X9F10jE@OIS9g}M2NEtDbFJ`DiajlTXB&4Mkp_qp9wR(veG|!!> zT&vN9>XJ8mmn9hxL@qE&YP#C?NeYT_n1NM|gld4!JsXwK23*1g>QIJ6DGCcOHJkAA z_|!i66Gxa}VSvQ1>*}TEVt@t_3?wLNQ2iojmpT5J76*M zUAY-g;MS|AmManFG4r^F1oLA@#h3tuBA9xXFk0bSLJGzLsKty$%c++d2NO-0#7@sKO-N}0nlRdoTj$=ZIK9;Tm$_K)!PEk{pm!?3JKOOLIEaSW1?LiK@#r)*!i-m?Q!X zv7uyczstrM<_^hmfjy_-6iXTD@dU-lfP-FB9{m-ZunpzCtV-F}Y9z|Y1X7KdQ^k1U zgs@#O9QDf;JI!@(h*(UCg$Wv_2+}!+23TZd4nX5R<_(03488O*ho&(M1Mcf=XfV5u z=IwVDV-NxvN-;!`T2Z)2o(&D&F^V7dyl8bUr{KGtOQ;$3Q8V_0&bK&M2b;YYF=#QW z1Jr`yiTM04|Q;A9y(va^P zI;m$9-YAt=MlL*yZJRF~8bm(?@Ro@NPxp2=>~beGn9yL#HlM#v1(5}0u>}MQXlK`Z zXg(#0&8#f<qQUXW!P!T3f`bVTCO9~M#YYqu$RhMI23Yn!rYd8_oXsi^Rf}qlcZ+3q<64*C zRW&EBt!2m^nUy_sLZ4lm0|!yMS?3H2ZZs6Pj-&z6tT|R;DAfy^Z$Cd&R7&BR?Wi)^ z?0f+5A$f27VyrqQd>Zel1cJqo&alT&&!|Mh5UBf$R(#}Aj6N(^7yC*+xuYjjkHVBj zm@>@gU+;((P)5Zjz4tNdz&lcuRI~aBy>gE&((E1uv%o#B;HM7%1Czar7g23Wg9K5~d!-T;k|cF4SW| z%-9F#396_<)vnK%4i_!MEQZ)#mYPO*@^EW)^X8Odo~Xh^70##N(E?fJ;J&bncqAiU%Y_Svs6_1gs&$ZfJY1s~yHf9Du&;rrUZJWJt zBXlH@b8g9kM-Lx7+M3$dCaN%19G&}OR9=88h?&sFQVVyjSs>SFUb~BeMT2Xzi%}yG z^)W2jeDsm)O+$PL*dRia;me$gBebL35ZD$VHYA8Kwv>HvoJ#IsoS~GKLsjwFhQR!3f2WL8@47Yfgm&u*gND3IRNaB^RUW@q`K!Ntj5& zIh?w@5D--F%yy<=OBAV)Lgrqf#DbzJ&n5}c=TwIPHJKF`bJMGY;qOz>5ygpffWRrD z9YL-o@DA0!HpEUY8#xHIMuUOi=jRhZ(EE`)X2Jl`F|yGU?WI>c|LA8nt|QUwNMeI4 zX-t)-D$$V3sL(~rCrAS0NlR^JZf~Zt(+LSCBshht(Y79V7=HEGljKGtr$I&#GE&kaZ3w5*g+qd9*h@>zEFT{2 z_uV!nmM1ir(BNDq4;GoS*@v0HT0-l?I{Q$_C2#(E2!usvPfKusxpsq(1{AYo4z_`m zoXD7zIY;D(80s)j5aP%wJ49DnOf9rpjg6F6)M0M((Exfk)1RBKePodH81>whZBxcL zV03O*7b1`ymMFJ6hz}{#m=SHnxKz(6_>j5dftF+`H9wu|OCbYI1f3<4n8l?4N++*0>;rOnRETrZjy zb_|Z~t&(Me!Tm?mz~!l`Xlg+C-!O1_0hZ8I3!${Ee)JLaAzfOElkP|yl-bG^p_&OU zu8#g9lK*RH{KzNM(QQZRX>enXjBZp zq$37HfZSqnoE!Jz19^ci?3;Eq>?yrbU^|ZiV3lq^xM%~HF=F^eMe=t6!)twYk`E`E zFhRpqaC+{c!Q%qL*e#~QUTOl5Jt8P~-#wtF7D}1T8GNZ+Q*SPtH(pcjHJG;^ax*tR zNSf2PJS4R#k<0ASr3O7Zao#txVU;pruEl4@`NG&)d>&Wrz{rZdGIIrIR^Kc?dd-Df zfjGuG`xez8M154-rj!baf?TxTG>^z}xiS`8Z};nwZcorKMUehCN09J8wCXf2GA5y8 zv)9Io(cok>h{Y;}19Hw7sLURdkbEm6hE$Ug6rf~xw^vfff~ktvIoah9n^Z72UVM!P z16@ltD?WOPB{mldm)h)Ynui9?2tn;Jde>d=+7S$pl!M`jliGbu6h}Ln`fSita|Vh5 zLM}!n#Knu2PC(}6bSnQr6jtlFDb=ojQnHvJVM;2T$D{(v0_CTPOCeQF3YvqC*=&xv z5MsgD6lX$0j>aP@XbFYL5T%z;xv$RSZ){N@RiZ?1s&}+k( zLFPe1HYYz&vy(fJfUQCRKuV++Q!ZgjGoSNZ zf|^1CZ?zmDF_u61GJgr4-3mZ#2g_%G`uQ9pc`( zL}zTq5C}LL2zGbDr~)$@{4b^c=#N~&-L0DwOPF9`f`#**VwMHUQkB6q^RQj_A(C=! z392Nmqjk-)*f4uqzfZD-mIFnEmSQK<+$Pg!3D-@6xk!L2;=J&AUA6c+}02KCPwJz=EXNyO649bH>fyLo=eFI499u$&PZ; zhVq0&?=mz<(T_nq>I@VxR`!YJj@Pu)_gsQYJ}0DDTI;opVQ@i1mr{F!n0yM7TL&46 z9YaMM8;9nhUbJD$W4@B`awq7t7xl0nzp6Abg^4LlOyT@7g|tZ62(%iKGzg)YpRKWt z>Z2}37z`4!%4|F+W{{CP4y8JkEJFiz=ud;h8oHYoHjT(N1!Odeegt(3&MbE*Q>n26y_iepv`^f7!B(Lje=XhKjJ`$Zd*U^msL zv|Od5E&t0jGiL&W2@K9<*%2%tduLRD#`rS{DL5=XX;BO*nmuMHadv81U<|!CQ|lZ0 z7O1)yp)*7Xlnf+hgTYX!2HP-U63Rvj%yx&;LJxs^GXGvNs^+YgNh=L6n(W=U+jh&BN)C4H)jJayOktxbY;^v^ zMhhTAhoOekT_-9Odubh^GL~qD+Dz^2mbH!~ozIj_rBTw@tNGye%3=0d=P2M+P>0=& zmAUxcI074_jT|tjfkbS*8BP^X^AieVWG3q9O_P*TCaG12JS#de`T}MdM@~7YcRA(c z1hR0AqjxP26uWR?qre!KJ6!W)*l3CxO+;ZL3g>WcPFkQ{P0J8BY917N@?!u_z|3SW zHCB~2dv4BP2Mz6Lp(N5`OB!M}b6Z0IhjWUJeD&tDQu8%pA1-{d^99b0?5EhVM?;G4 z=N20c$y9PBC-TK(kr1Mh12gvl18N={fm)p%A{i2CNK|uBfU4T4kI@t1Qs?H> zBW=gW)9joH4JI@=hhZbPNVl3gcG`^yAau>lwYKPEB=e}V`S>&w4JczZk2_aakUen< zBQQbDX>u;kt2XLw3^eF%6gj2lq<5nQMi)}U&XRn{MI^Sl&C3OqQYcYMB(I4%NDeJ3 zN*RM<2ryAh26cul&BzDG5=*teYZXEA7cFcA%wu}aGOLYVY}do7b9ssyO|p0AzEy1z zMO0AdG?z1DuIN$pfv) z=Ss*U1w1UeA3e;Hu(~{Vye11MJEJF6hiFC2;-m&;0~^Rl0KSAiAVyQiXfR^cw=-ZK%k}eBrpynsM#HiIb(EM6)bto+!^yU)d)@!LIEzd8l+U$p#?1S zRV|_&V~itGsFB6^0v0KV5;eytsY0ia`D|=-!mNTuhNAe|P+PueGd96PiULa=qjP_C z+pc{Ag9!{KFgS;Wr;Bg{%GJjfptTzKFlM=EL8Ac44@JP`PD?nd2m4dtXbK!nmr_BD(`rQT^ymzox(5*!f)dsWJ@ z)1W3M2Lv56nlL#6eqK6dYt@2UEfnvYsa?iigI zBpIc+VBio%MrXQPGB`}IFwumGCY;AgqXlxyr06S^R(cD~78!yE;=RPuV#hSQUm2nu zleBas4v|oNQ)DP({Bg`WPsySPYhmZGD`D!1Z3Q2kQ3dcN5l1##E^}KFl8~_pZ}dci zZ@DOsQ94x>OEf~zT~4928mjHcyF5gfa1^K3#$@b)E*wq36e2H`CUkqqwY}XxIGzAu z;t5lN`P}maTx1q=Nh5PmnaMW_J-GlfqAm?3)Y%DUR!ksf%FSD^Bcz|qGPe-S^is-B z=42E~Gn1XYXK2Jj?;2VvQJ5eF?M<>oY}w5fy_0BU!;F3B+^QyHD!FD`x7w8$0;GXl z(e<2Mv+oCqaFrah7%Qoa7j70ak#k|`L8QaoSYHe zO)pwv0lg2r&Mrd5F+w>;`)Y_CLhn zplOMe8$ivGNmHs`9B1Saz?z2zK?$=4XB39Hm0+H42{OhYRPku&P_##9d?2+}Lo=M9 zY+yirbT*5Vi`J0f{0OBj6$^4bJj~lVp}~|{o-)hly>)q!ISDO7liHGWXV%?CO=34K ziJH+j8?Q5=p;D{O=mBUO&23{srZZg*Ln=!%L!jbyeQ2*YeJNN6s-b7q_}HNjXR zrCd3tGIS?m#v)V`&m{;^Db!j8qMc2GP-tqWuACx{wr2DYTZ8B|8f&RxC>;5QSeg%F z*L%V82w-;?{c`gNd&kp!&50vSoy+HaP=de$1xGHGE)GhdK+)`_WS^zC-W{hD{Op3G z+Mr-=jukt1?ZK%-Y_%p$1Tv>zE$VREn^`VbiM!eJsOIi>N@Ji}Y-c%!9{W64Fi=1v zC(wg0uDBGKI~mMmg`Nd+PoYTWv-Cuk3SvI86H3k&4=!G``I?bNl`$`Mp4!#*#}6KE zOvo^Cgoz`ZKaL=aj7eyW*(J)UMlR5sS>^0WG*#-p)9m4zKK59mxE=y#s%##A59mFb znQlqu2;Su&VwmBAdFxuaplT)3T312srh3P9E`zj#Rsanaba7@WoHWo4NkB{ zsf~cqrCELxz+0!0Xj$l5mi?xMkG&j$0nc=8!(pBQy1oD3&dhDP+c@=G9=(JcsbP|NhtK(jQJQH zF{p5*O6(U%9eX%M#*k>aqc%6URyS`>se}m?CR8}*0i;B6fdCQ|cUDOXn$3tt-?SrU zF{|B>VK!%=s+|SRE!UnarpT_7chU_J1nZpsgzSu6#M(1fFSWNkr1Q8q3S*#}wyGs* z*SV4wu8#_%R)*SLQ$le%RG1Or2(FB$neS}glmQcwMqxoEF5BZ|aT=s$7l9Ax`%j3E`C7CBMn84sX>Y&C2 z6tQz)v&0gD!#*&2&38C;u!NP%+3{S}^2IN3L|73tDJWkp!x-3j?z1hUL#Wro_&$BJ^fZ zSB)cfrzLo0zHq4oj}Bm|V6gsT>*U~Q#Ed39nDAi2gYze2u}EsU4`n0!GDcnW=GV$Qu&SBqe)0BiMgD_Dw57>a<3)}Ag;TW{t$@p|I=Z*9zPh$HA;ZKI z{#FBX2`e4Hy2$qL;tBL0$`f2#U_wIhQlK^}KBUUkK^l^wDR3&_?*GJP~y<#2+~I9b@0)cN77V!OCD?HaM9vM&XdINk+Rr)|4^@7v&YUL;pYB{ z9_{PN%KDqbUAwHKpMTy_d+^`9oxouNhY1|cBRDLOR4`W?t9klH6jWGT@FCh_A;enQ1|5q&5jXvpYjj>r*(lp<9-c&L;bB{1iHj0om23o<#)0UA56 z^ZOGrG$}#RU}TJ3@IB@j#TYZnU~#+1!bgSyl) zn>%_oUTs2yDTp)$kM( z=2OUB2&zKoJV*a74t2c(35;tbrEaW4k(k++iaH>oVE~-poM3dPhav3U2IUbY07ECL z;>=C1qaJ_!FocpzH%j6=J95o9O%0CXMGGR0&PKQ7GSrRLyVoaRm}tV3Yd(K80o(#K zq2!3UgjA)M=!P&5HP5w+x*oqNP4O|;Y#z7~iC%j{=8h!AUhQcFYQ)z$nii0JsF)J= z+*53+01vUc?4kw;F=JIDC_I0n+9<44Y6@7RbKNKc8yb!VHSB8Wk|8?}q2^F9_&f$m z#4^UOaZCUgY-9p6CKos^wO4ItFK_FM-NXNJIQaeh|M$lNKYaYO>4%`!Px|Il`(PJy zWbf1$Z=oHn_4Fi{-LuzzwxQow{NvpJ`gFaW@osse#-IN1<4^r3sT;el@xvdseuN+K zM-M-mA)+7%$^952Lde})m8g~RRdP?RufARpF zJ(IbOm;T?`=xcZM=)X%MpMBmDxdek{$Q7& z+ebSmZ-3dV=Uel;eyvZs3oM{ietJ3Tnb$1DBdXeF;49v##{`o9Vx=>DL%;}-Y4d#qpm{^Lfs z^yYpw-gm6`$GV#zcR4rY@MjyollSwsuH@6UbF#C)y^{Ca%CXVzaidngnHu@)+ui!G z&T@A8Fu&B5gV#o}k6-K@t{n80K1ya*?B*Vvyiogk7MuL88$8Z&@8cHhBcw&@6tt~6WRPV+sR9V=fwTV^>s-8?!NcXZ`_5NYL5kLt~!P#mb z)?Us=*Iwj(duHuT|G3vPEA!o(9IGt(R@z6({#wFE|HFz~XA5q=UvD{k{b*EHj_V6; zr@O-nm<2o-pWI~_t1I^3=7;r`^#0qrCpt{3nXYkHzGs{77u)=>(sDL5>f713k74>GC)EVd3TMa_hzE$x1V`|H;SwyFTf*-dJuq zySu98bbMOQa!TKI)6P~}5~Lrro&MI|*Q33WCt1<`S35@s`+Mf@t-Q*+r{DMPzBiTY zf2_HrkIdV{e0;oea+C)w>WbN-`f_9l=WO-l=ydKU`wS-T9-P?SSk5M|9UK{SAAfj+ zR{GJwo>`$IbM{V_@oYXgTWGmY=vecW-Ohu(!_yOUlFs(r4$kiF%1A(r>b7gWc0TT^XMLiS5K3kQH;IUw+qP``*uee75qEaC6T*q~nAA_fS-KcgE){ z_i>YdFKYPH+xsVv@F(Y3Ds*n|9+bTMS3KrF`;48fcl~U+CA%ZPGp3c-2S@K8S3OyV zL-OSPa$9<`ba!-kkSp&F_P@&`8Ko4@ZH=YAw^3mtc>JO*K?{l%MZEt6P=h%S7oRV*6i%<7= zemm7)-lvBHe&aXqfAwhw_S4MXr$3%|*5A+h@vuMMyC1fX4o*KW`T2PJ-v2$m{_DT~ z^+w1Px?nAoy;U@jCv)}a1 zIB4(fkMF<#@QdSvQvfKJep^dC9K@MG+N zKMFSgW9bl!&y*^CmQDY7VY=Vm2c|yx-K{v?vgfL$B?!*t5+Z%xZ~U<; zDdwu7(ORSPp``ZJ zt3S3kYlA9*Mycs|0ZYWva$#a<+I1-w_W6%TW(9|fT3NC47{I=29`#pO9jhlBC zruxbb9DiQ&@{RhPhwFDXfByMo@6et73GVlQc*ynhDw4CRAdu00_RXhZUVW53#fPH= zrTy~Zx%tBA|FCoX%O7zn=Y?t|NAi|;+#y#Dh3J-oF2 z%)h#__3T-D^8DJf>#x`EU9LAD-njGI%Qu_P_OD!dcFFPf$=d1tw7qqGXZsfJZf-ui z{)Kdiw=#AFRE6x6>Zn zczOL^JbktH_I290di7*2zm=OCYpd^$Zr!_;ub)1D{pj@7mcHJ3b?foX&EuE5zsaq# z5r4aL>-gc;T3vs0bp2SuliQDc!spixaQDbR%+E`G^ct_}t+#Tr{ZKa!*WUV_>$*j} zdgbZ6-R-iz1CQ45+MD`(e>J|nytZ*${QWmO68YNo>(3uN+&Er)^yUHNC+n~89m49~ zy0q z%e|YoHuqm#xq0X4-NV;gt8^oUwR^aGslwgWlsesfy>UbOqucG*hkI8KAC~PcbeFcT zKi*$o+h32Hhjt3TeY$y&H&?H2-8icI_3n+m^&2Ov*Ixb>F0J3Zv>N!`@zK%4S2x0w zhc92<+BmrP@a>gDaIfF^TXp;K+JpRJHQqhCxwanjr58tco*u7;-&SwjJb7Y9U|sar zd;Iiq&=;3)uRVMHW;gGxzh2wkklnlf^~3#>e)Qtm z?e?!*Z%^)Czp`6t^XTx+tJ}Q0_W0_XvUNQ?=hYW$cV54tZQXsny|KD`^7P8nTaO;z z@afk}k6`0Q+c|u5`TpTizum9zUvtM-4%?MyZ}!&jzkT@biF-kp-OCsC^u>!?&mNri zw|kd%;^W(Q4(hEt$Cq!v>IYB4gF4wge zZ?4x@u(4V$o$Q{jZrt8~9(m`u!=0zE-of)byT@x!%hQw1s=vKBs)ulROwVq-zOPrF zZme&vb^gtVlihTB>vYGJ>sPj)Jy@;v6`wvmy1b36{gOYp`|#*+`(eKPYX9)pE3XbW zR$t$V+Yhd6zPkB*96#&7yQ}wVI_1swf4u+Vj-K4S@_J|I@&0aED^HHr`^nJ>z`OSP$^Nlkdjj|GQFskI z$KmkgDjYseZ?3zOOYdIwM@R3DUcCt7etZ4&$?D^^*Ytwr`ptfwpYOi2H}jNUv`cT3 z@9S$1uD$s6^hPL8ugl#S4xX;xFt*y>y?RtmG+%x5;_<^r`kTl8+l%Y)lva0S@8lX? zx%%{-fBoQ6d$+Z{9q%8%**(UG08j5+za;*xTz`4}QsI{yl-_Lf-Zj{|_UgsB701tR zTzzynGq<;P$;wZsGda;cq{nYU%Ih%_tEReFJ83kYg~3W`la&ta{uk*)r&jZaQEu3YxQ*d3fzBs z{JI>AzWnv_E4Z@#?%ItjH*X%l-Mn<8zrNP)9KJjKvc$IOCrJ4L;JqQzmr69cUk}=c z>iKuOJ7s1&#uo+9A3e)M{W9Nq<^>ya|MFR}^G`&dyHp=)q~UWaHt!{0`0OEk+nM@S z5$$LGukIb5xhlWRahsA#PtfT{%mIIliSfsjTm6x|IeGT~{<)8MM#6q6yScvnP!#^b zzxm3WdU0_41w|M?`N)WGT>bI*c<)D7T=SGaJHyW58S`*IiLnogKYgaW@WWqN;NVLK z>4z^G*}ixqck{`Jpp65*)e`sV+d)5lqWu4_udexH%Ib4UF}qo3ZllhZT`Qv{XUh&< zSsQ-iN?2L51y{yTMwsWU738ZHmap4az_0YOQo{=2N((EX<_)iCT!~?Ybw%4s=N0A^ z)X~jiM}D>77tJhdZ*5`C#|Qf>H}~u857nQv>3n&ye|jB%wy!UL|E(sP*}MI^S?0?R z|K|-cU;K7X@5`qjU^85MdB2UL&Q|&PTiO<%+~8H?*sn$&v*^!1ukLNVs-q>~=g&U$ zf7E{5eYmn}9>l!|Hy=Lx^oY+J1Qt2tr>mXWmv7PD59}4XH_~dPl8WmUjX3%s8DR|H z;E3>T_FA)`kDY0%o30C8p+M5y6>SnT68Op&mxl8~p(2x>KT72x;#m@H9 z%tOI3Na$l)i3>Tq9>i<%j^I<>#(({Fc3*?pqTq@^3ftApAce3RY(C*2?8 zzrV*}7Nxy^t^4TPokz2~j^=b6{p+iE(w}sQ{2Tf+7cu?+i247U5U{k4&A)VQe`T+K zwZC$ae#$@Zn_PaIB!(Ehef}4i*YUT^)xsw0`_0xrX1e~<+axiNy-Uu%E=y9s{@Qd=6Lh401E#krJ*+=)cbI(w26A~noX z3==9k83`kVrZq_8N^_9Gj5A>8Qd&tZw}2Xm0g~F^ ztxFpUjI9x;F|5LN-+MQ-1dWxQVNPI`$R!$9xQjID)g|Z1$udN?o^3r`zcae$_fOjH z?xdtL0l}oCa{hoIzyhjT2?&exH4T+R%Bc`hlNLRA0f0GbyqSWhHbl{bi_#4OF#6WL z*>EJ6;Nv)SdjCVKq2@57Hn6ThHV!;9voI>Yb z09`DFL&hj#Za&mN=(>5+eI^#POk%biO4RNR2vWr~(1FafYs5GQ3n-CFC9~C?BDfe+ zQty;&!-&41nByMHTvaU(IY;Ky&9W<#2NneOwxxuT*a!Q@+mCWHuydt%yP{%Xlg3n# z!2N=$YLVwexLj4O+v^YRu5Vmf-CCajVFH8+5YFL9Kc5zm+^q#21V(M(8O^|VtX-8m zDEdA-O4OC@hK7(JQ*LG@;qx2MXve2Z25KB~hxNG-+avubIf6#LG{8YE}m4NdCs z?fYDE(7AbAgwX{qHA$yR31TRt2%DUJ4bY{adH{8~BN)aQ%8-m9wE1F1iH4f7k*H;& z!K1D92NN}zkYGZBb2*p8Es!rjND+JMDVw>ZtR*$-8M=o;=3mc70vMAnGWuF;@KKFb zR0a=y*mUpxoP0rnpgsA>PI?wW^Y8;`GgM(S;hJ1-wRJ3WC-`Y%Z_L8S&eb)QF>ETt z5=wC924@EqjVnL^mwMuo)Tj^lTt_DtW4vgByCH(z-lc-U^{Y20ESRQpOj9}j7fj^{ zi{uZ6Fu7o;U>-V*+^pe@frZ(T0+KcFyzn5}Q@8%eTPv4+lb@&^ehhpK|o z9UB$k5&O^8K~bzNQcT_UF=IIF$3$`~V+O4dHHWt6QfwEtPAb9`Te0s!xhBWPey}7- zSy@vrWFQJE7Y!K5h4{55?{@*i#^&t_7AA@?QG|0CED8%C0dVP&%-JrTs*J$Dm_aU# z1f%gN%tQj;&Higp4H&V7f>|04c9GR_A)GV1kIZo=arRO%$G&($&%n8Zx%Z+NN>nK_ zcXXf6K@B^4D7h;)ZiFN<`rbSDuC;26&bUM9Argy=OevRGI`qytrHht52so5s-E!ka zo8Tram?*+T5zaS7Ko{ii1A|m^tD(9+z(I<+)Pc;i`0eiaqtPHuSdar7clG{zp6(k6EaN5Fd@S^ z4<1okAiu1j>Kj8sX&%%mlrF-}9C6C#e$PY(YK9)om&VaBAw!ASopf*w*mLl6kRc`m zlb$k%>RbVoVdT;Hg1wkH$L=smo=+KC9oZ1-zQ!ybB$di7`(8`oma@|^#551jMsdVTtv_A8`gnD7N-Rv+Fk!>_XAO`RU=78bck}c~Qf*b56!Wpo z!A{P1^S-^GJ?=Y1^TTVYMi@L6%9xoe0=t13LbI{K8=zzw-D&2_cYAe-t${IySX?!u z&U%(Hn44H=M2R3aS7Ib%H$KMPQtHKCo0G3vQiYORz4Dfvd=zZDAlfCi2L zqWSux`ro)lN>E#h;vGo@?sH;D=G%vEPP}j0Mh97pqA+l%!I;o(-`DQ@{DI%eVD7uh{utu*su@vlodPoTDBn#D>MCY(@;Lr#RClBPnHjwX2=bKJJ8l zlaF7gvsZW9JlWCg)9AmkQ{wIopkvELz{oqM*k`gKc{`m^e!_vR{M^}V4M_Cp`$am zS;cHHlLZ}zZ(4w;g4`{8L`)u+(&R*%1U!9p{%67(%RVp z@Y#`nFEG4zaCCTZ^x2rQ^AiF8^d9)K64FZWD^W&5xcHTt#`isZ865ZJe=a!gF1t8_ z<6*`7|BmT9g5!TPFg}XV4#9t`KzRwcVJ0C(FT@LIc)EuN7=}SpsvYJR z+?VchE|^2btakOWP}J0h?n5)s$wo4W1!7}Oeq?dEBu>&tpgdl*_={t^LkX4|6Th?d zcy06BkMy5J#XmJ-6Lw74F=5A_V#m=xjU90T?2rzk-j5JUml6W$01{;iy=YCd^Qox{ zK{cb)nhY(mLKUOo1|}}dFsJg8d@Y1V5jd$g%iprATt-b#1tHrBjegta=3z%}WAL#n z1)3t(&_|_x6_(UdLN;rO+zm-$f><#~^_jDsDnu$qv+6~|j*+_%UOIL>n6P6iv6)J2 z&TolLSRkF-b8f!jka%-7Ckja&=a^I~wr^I%e=NqY zLqg6vN&q8^ALX49I+u_c34<@@_lIs|z+h&s*jt5W?r{{P%&vDo>S{*ZsSy=balt1v zj3ghc`cPtX9*n$%+|hqF#ri@(!q84abW2tLJlNH#5`V&i2@B3A7A&9y%^bTnNkmP_ zHM5nzwdB|h!8N7XjakumhdqhwKvA8Qh>3wCKr}|78M$sY`e2 z(mnrOx^aQ=VaTbY@5n<%AyeFZq>8N)=H?NAY>%jVEM`VaCpUVl z@`y1TX>jTaRP!ojb~l*j9(*lQ%?SsmkpW9=y(kM-?sGy$p}3(em(FUCMhh6FFed*t zbM;;7E;fcB;^*o$6vH3Ky=jX+hM+_V-IyU6dhVT?eQ^;P8+91vPhEo+(yBGKhV8=X zHGthvSt=52-Pm}tx;df2ga#8DoIf-$mv;eP(3@n+-bHE&*_&H0J(}If>JjRk*0Y$n zbZusKgW2JcbV$|gd__bto89J&l5B{jRX_@Cj0CiRr_QDNY;*(&GHCZWx2GYA(+rZ5 zPquF@fi&RAW*7)m8R==3HcD1KGZ<#rMdiwQ44<@f%SGb_VH9n}WuSq5v-M`{=b!Ul zqxj1oAB7KG`KRr+bGUnY{0m{iLJ?xD)$q9g0zbh|Y);2dz(xaq*+1CVUwrWq162kC z^}zY(pFg~Of|v#3z!x28OcB_r`Rr939FYdn%I|0IBss<*w`G5?C|zEh4`#C-jM7S+c( zFJav?y4=R7WTPHryO(C3DRuDd25)GPW1Ks#a!f?vlw4`K6>cbY4K)o>rD)fZz4lgP zRr6|XAuvAFjiAUV%%WbTTr~RONd`bHbr#K&n|DWMVnT)q875>n&&c2z7eR(Hk_4H! zU=fMKKqt)|IhNtg;v9`Ss4zyq2X^AK3tDqkf`E<;3A&m+r94aJ?qjDx z9nH(e7Lqr^9I6-W*|^3SLsKN7j6V!!*O}E=j38vQ`HeX$Rl0bM$ly4AN7vb3)TrCK zzhQU4Oc73cNR#_Mx$ozC+&nDMq-+j*<6=&;B*B=bqUNN}o<3h=fDr+zIYSk1T)-PRWv{t}C^^gq295qK z?_7ILB@N|^QVWwI3v^p;#Q%eu-#=f_sCBU`_R=abDw(l29+X3~WmwG+b_bn9NMu{{ zerVy96ww8YN#n&E7sg}S4=q>FXzk&(sWNB+hQD!1Ou+CDG6v!J_kn>t z|cKRxbG|aL8yQwcwnnp|t)1=P>L&B|SLOA{+n1gw+&iLx+h5Chl_`?P?o3q)S z&Ajk<$EfS$`R5x!JPd(PcM4NtGqXazvr`!xr{!o)?WDxYGpIvsGaA-)yyy(`&!HCs z2XhM9!=Q1WukKZuboCUv{GE7JmT@J?;w$GuYi)*rFL(uvY*)S#ihHwCK2as}Ps8DS zUn0s=^$yU|AW0sn*_{&JiXrb6x1b^o@~xi|sFnOnwg^Tyt3rKRMEyx*b#}yg3oc!#O&ty06u zSLr4Q+}U^{hiH295+Od7DH@@tbdGv;$_7YXo95$(aThpX(avfxuVK1(8 z#VUc}*KRid7P0XxZfhB`kOuUvL{7oIX81>61?9Y=-hmLB)bp-}Co7N{18+f=VQR3p z!cC5qYFEpJCqY9K)=neBE2lA{B2%A@h0$YJ%XQkqTQeXLrpI162B%u=l9T_-5=#XO zoBpZYqr}VMM)Ex}k>9xQ;k2?`Ryf(hm=@~2=z?iW|AN!R6DamT4*oK}f}(h5SugFFsR|8+fOiVD zM%RTJda;DH#OtFIS<(E=l922MvgX#6U4I%WGexmXi8VF6BsFC|bEIPsDke6L@dL4TqUh{*dd@){7--6Lcbq;GQm?x-x1(O?G{a5nnB2I^%dEIeFb$e zgjGF-Q5f7`pH=q*ldUZ$ZYvFO!8Nt#i&w?nArznD`ph6lMO2X4xBY)YnWYdhz+r9)Cs!4@ z@|^1Ra$JqdpcY_E$AL=I+Fs2xI#|tY#C2X!r#UUljf^Ax4h@e^Th^|q8eT^N`7~7> z-AKu`l98HEtviJbDI&)I(;*Ser9gJ7WVb_}d@-Cs*uhjkT8gHc=b7})v+?erY6HM% zvApC8bsyncWZ`K%Ac#L?>Y$I;1AK>m@#K}k_@XMWki~>qSu-ybv{@!=K?nyB7sVs6*W0eYM-BP6~lHE?j5Ej}HEqvInuluY$D9=C09N{Hf zJi|qPi1MD|dVEm)7W-0%=za=%mTz0P&AmU%p&?Lz?9J@*4WpTJ%8EsH`+iA9?NRk- zqgz;`r5(F6P*&I=7)!sApEN1m>OL>>LOd|b?iL=|;*ba?@>-M57RyhZktEjMvW0!e zO$<6;`imXSX3noU-#tSP>O><)xq_n!v#zA!al8rty7^9*qY3be9zRKl#n%LM-gl)z zb{XPY%(i|ZsD1TlNz=;J40SOSt*UW{siC125@LHIzt=o!_4DFj$`z{#$3m10$||5r zmv;xX23jqbu*@F;c@pucaLkKDv3+fe%7NMALNwg8Kc#5R(ExdEmXQh5w1*=*CG2{N z@{x6Y)m?*U#j5YXU&iD)CgKLzM*_~?Ll&T;| zIb$f$9~HIlAIH^cJL&`GXjZiYBb?n!HmR0J(&g?` zwP}s@pdMh!RopIr7XL2Ikt>6L60Wx?#rPmfkJ2&A>D!AAF{yp-P=)ub=^I5mhCpc2 z`sM2|3FdRkU}(=9VPsYH&S#o&s%j~UfSKY^_2*XYqn@aLI<5OE@)>vwK~PK(!n;90 zk}`w@zf!Z8q+n39FFp^I@;s){LCyf^FzFRs#+tCr;_&k*r?inv==i?S@zKZ+yYQL5ksefhUG z7*0-zXPQ7zWo{955FR>I8IeXW;5mw~*m7QsO4Wl+Anv{G-b9moK;QWCQrIt4`H>GR z4U?S$9>rk7NS3sMk!R9f&p~sbF&UA@wN-`KT6IYC&yqyOqP0`1JtqQ?^(*Yli-19v4JP6jvfF-0H=* z>d+&sfurUvnCk#UIcjMdwboDw2E;wCBbvqkZL790;X^5D+Yl zTpc&}jpd332Y0b2vqO0{^|`EYmB0`wO0x)SJ1xW(hbo+(q^fWg;VY^u?6Q2tEF0;E zTC3&~#;&K~%OJoqO+tFH4i%o4mo5buhZ6#E^t#WA`_^FM3@*{S(y#nJ1#9a`Lfn=n z4-pRe64jJkjWB*yc2;agQ}fa^r0b2KEAMZ~VrkS-!?i5^DqR)K2nbfW$0n;zpJ*~ucj8Pz+5Mjy1Iahvoi;2p_Ku>waWts{yn0_4px(m#DguOqAV3>l77iE~SHjCTNmb3fL*#4E-@&9~_j9=4!W4Dfn{ zU+qd>9Dr>qluKvn*@uYz9^E`HZ^&N0TK&D>6vv7M&3&T136%x1e9JD1KGcXCd0(m`p@u!#qmsqh4oGWN^h_N&I+8a0xX)8w=n18&u_2 z#mRKC9T|1XddVUce`(Jpbk|A(`f5LtbhRk1qr$4xg5DNY1=4G%ek!L`)R?D`=1^OI z^0h*k(c=0=fUizIrZhY?x6B;95db9Jt#`1?QMLUcQ*kaN`SCKJ;i@tY-Bqh>DQaE~miFk%-MX_hW3`G<@zL_OA_62lZtFPWbeC-bS< zS1StP`^Al&b zL*+EaAV`j7nO&M_@X>TiYG%Wt!lnCuL|VkQfDNlSU^6=*G~Y_fjYa!BDcc#mPi?Q`T%hRwX z=&^6h^b+auv7)H~Rtn6#G(wZHzu;W`Q;zmV;Seb4;{5lQ?!x(&kY=%Vt8IR+d-g}S zkc0bIjB|6a39S>;t=BMCBPPtl3EL8=S2{HF{s62g!y0T?f>_aGgfF!f@WbF=7^Aoh z#NWcrNF$PpVwtEl^wWvb2}+Iea=}Wgxuzqh#=Z9St_bJ~m{hIBg1@uSfN8AhP4BPI zkOF#b)M~_Wjdk9d!ZaKoKpl_m#yv; zxdHU6_=#m~4>NBEF20EP^(u@pc`dPJ-B=PWw#6NWK!jr}3j{TM%scTznYC-jhR;6< zL#CDplp38!iegHGMEt(&7BazO%yJVWG{-FdbswrH8#4*yT`3AfgLXNoTzIj_lkJy6 zfSfp_3Ci>XuvP?Pcm0T|QYgZr=PUvmCU%h_Jok&3o_ng)oA=FIGC=fUYkxt|l?ytBO?vXa-*~=}YoTF`DSC$G+39 z>MoRN-ZaE#aLk}V`oJN805VdN8Eob{rOrE+C74x1=Kv(W<_~@(Xo|KY}T>=jG$Ldzl@ue;C zlJ`@1I3Sh`Ct>V;??iE@@5sM(&Xh)sq>}gB{@5H(IAM{+Lc>(DiRI^56?d58l20;( zNgDFS`V{d0A(Eof(lBR(ztR4xpa;r8@1ECI@mQ1fseb1@UWQy5b7-5MH4fN zJ@Ns^trTI7V`3cToMn=&4wEPAVe-~RlQ4Zi1O5%-7G#TaA4MUPZh$+db;4@6Lz%}) zRK2n!7lNg-+|_qet_SM*)d5x9zESgDsc~c2%QX8qZLq_z7&4T^xO}NFht0vQJlf!h zz|X+m1eSEU%X4e;Z^31349N_ACB!T@q3AQhJ~%3D%&fb7PtQizw`}jQ|v{lRRWG zZ_`eMwa4eg0@O=_r>D*VRV6;rrpcy&%L92a$?}<$^VDot?y&s0(HvV}jDn-2FciN6 zu)$JPexH+FB~<<9M0SEE&H%0Y1~T7vkfS;{HXPXs)ff{4UeW2w zGeo_G-~t8IriAJA5A_|+$T0=X{NC#&rU&#;LL#Ws6}e1|dHi5d?q)?wGXIW8JYxOL zuSx2oS}aWrOP{|@&|*E+{D=ZwOwa8@{r`Q((U2Er*#nS$(JOc(i>T_)PuETXXE3U% zMDa6{VTQ$r>#;f#uB$pWhNLMAgIz58LaOmod-_avX(ez~O-{%L9Un{B*CQ~g8VwA@ z4q9~b)<|@f>sb>`)VV9`kAFq_32^P4M)?9Lx@~K&IaJ%5WU*7_9eN!~_$*ojo;Jk4 z!8cHYNd7Ogo#~2kLWDeo)V z<_laJ$HVWuoO^V1Mh+^DV~W>*O?#C;Qw(B-b9V$Iu=~b^ONxGE+Tkw<+tGI(iD5ir zH3xRa)^g`9bcrvh&*Xa)iP_o;%X?Dk*`4i^TL39x_tlM~<@>HYEkMlD8T z-l_(`e?Nn{4hFBXnD5Qm@Ne|U1pZ%Z?=l|VDZxX$X;K%|Em@7+m90A3q=HfU0}%}d zhWmony2g5ILl7IUx?S#JnJtar1vn8LWe9by0OYZvNmFV()o8N)Il_H{%!ZUn2u2s; z0-PeGP0-+tV6s3R!lSJ zNXOdrEy4G>Nm7@i$rkgB)u%7}Dy>*(tyG)rNGJAXx_kqBkTJNv^0MkUiyk`(ha-9t z08!0kfCk?qzGu#uh%)tevt&7$E^dO2V%Q3#7se;eI1)kshYZ+GlY$wZ(&w8kWWTU5 zuiY`hF13W~foyL>t|x`dftIX)t``%Mqj`Yk3)tm#V9F}FxDHbM1$~5sXE3B^M*ZAkQRunzKe(-dUe@HLXT9V4;#!#^*f5$G z*A8b0WnZDXapJH;12IyL&I)aoY3VvlvC#nIs4G6y#MY``61&_~aY_^=LZDZ`tP7)R zE5tZfgne?1Jj?PPlRtK=5=jhe0$NeIsL`ik5RIR64Vah&H;i}n2OfV&hOztKHxRG& zayA1wWuD;Nxfa1`f=EyV#YC$5H1m@AU;?YN8x3Q;=!{=pdoiqu2lY^GZ zQRT7|c5jGMC*J^Q3;fj?0gy$ugkMm_C7>fKr5i?Oe5xC(C-6!kbR_qy0O4P9>0z2P zQq|#>Wo}OQi`hdmQ3!lZotr3ddAL8K#T=7~M2N2*rV%2xD+c^O3?8e#J&xVI9gN2_Alf6p6O z#w%C_l*ZoxkbD;vb$11VK<5k10l_@h1w+<&jQQd1Gi-|cUl+qVE9j*2`XB#=iI%Ke82;EPZw3Z#cMfL(1`HOh+=ji3_Op+d2>muXLg8%o zI@bk2>>dc5{^mfCH@HpfpFoe>Q9|ex5q^RrT^kK+ebx{O-w1}4%eg~ZQ$eAa*tC6z`-_8QB zisV8+R9ePQB%*h~^J2eco)WV=2*|f16!5uA$(!D}zxa6>VSFdkdmG?#atBUG@SgX6 zv^=Tl967qM)lE-z>-D=Q*L_&dAi64}Naf_?7iMyE7u?xa8FwaqSm74Ac4Omz&>`I6Wn!h3kxTS!_G1HPz6~FCNW2OP z2@`Hun_OReB#$~cm%RsixxJW~r0Up2R-9Qbp(K6?4(+g&YwR-dg8P!N1m1C|6YT2+ba9=!spn1Iw=VXkr3*6anF%|u752I8hcA5ZK?!m zRWG;rdNr<*YM+J7$*qinE&4AAGtS%27-E5^$A8U4ib$_#qjzdvz#A&CxK#Q50jZ$F zNzx4C8R0eKQm8(QSKRYq?TU$8p~o|i?Eb0H`O?6m`v&Jml^|Cf5vEQdBj>v}w^-o0 z%rFlhJ!@(Hl_zFlrT6+k`)<>I;&lD_M=oiG!NSU#r%FX*wRKHF8fg8`Ya6!+Q|rRp zS%=I3|GBo3vT>IcW>^T3wihMY9wIt@$L!<3$BAq&hA>hX=ry7c`t(My9%A} zHcLts5AS(Bcg1P!mZztUv2TgBZDQIVQB=SVOy?K9K|kvK1hz!@1++Tqh)J(6cx<{C z<>osd)&j=60z4LQ4bV~syhCYDBK>S$InI#oHNA_47bTy^r$ODYJAONf6^yKKGmqF_ z$|$HiP?o^WD;|5hH>wXc?1#*X$A+Z0`FUMB)9Xv(gLk{@>S4 zEoIz2Y9XJ2jrKg2Es1O8tE27xp~p_SK8&j_mZpV^fLkvS((9`XxrUdQ_lv$avo2&K z$5mmG=e3VVy(}BAKeDLOeL^{bOJ|X)3aCB)?=dZ@kJ!|k^X;VdyM3J)$Csv$E7||N z?#TnahQ5Ic4pa)BTLTZ5cTJvrg8VlkH&W*hY;dV-gjcuzp?~S=Ts<~mG%i;O^WOG5pX_MgVv$vNET55jAGH>hCJH5a+&l96f0in%;Rg(bEd(yc% z+VOsO{~r%Ne^15@_TP5jPCnk}|9kFn|GD;IOO}tnFJoPO{CIu+_PpGd-ZH!EbaOsA zTUX(|I@{70`EKF5pwa`YwR4YqHSqTQc8IEyN0d*TsS@iJ^b#b@tQ-)e|I78CT;Lw< zXcQ|$r?5j2B9`v_)yW>w`z67`e8A4?d{@Xc_p`1rqtnOX;89_J;(g%lRxN*zh)PXb z>VMp+!JdfAzQNqUh7SYjtZ0Y7iRhvVf^zfnaKgYpwTP#)WiI;Tsk2%ORZM;%*6%6_ zB7O(+ewW1^0fNjy4yQGTS0RDhp+kybxa{Jl9m(V4E%CtIum2XtrN<`UL z!k8n1FY$8tzdrmSHpWvlGh64?iKuBzJNun^M&{wz=_(A8kkr~Ws(p)ljbyShS zVuiXgyq2_sxY2*%FiW&$mBtKM(kAZT-jG9x|Kzyce5vL%DCD^_yGfeVhh$eaf1ofe zP7}o?oPJC60u`t7#6$Ea!ht{}m-&?~HB8q>ch%#FF+3}pPVX-lXYa|`?_zi3BDG=n zK5x6NR9M}zsRK7ocnk?EJx`UmsH?leTRbLDAtG1#{~m0@_s6?`H<&yqd3G+_ogSX` zJ#CKjaAvav+-gl;-y_}|2-{!1!KbC?R=_6i-5k%#BpUAu`k-C!bhi6ltd`hcAJK^D z83nk%-rv}IAKol}bHBe_5Dv<6-sN^C6_@KuMW54w+HdKO-K%;`=7UV%H9}NKqtAcIu|PyI$+ep zx0~0EyF2fyEkmIV!Hpgra9nTgfb&{Mg>!(*nhO1@-vZuxs1e%BkgeU0&pWW>%ds2AM$+`C`>{U3MQ(2nA?4fN4y zaJousyz{cTOEM;v+z=G(!M&b-Y1zCvJ-fd8Rrhw6+U)M(dHCM5ZNO^cG!XFP&+O`9 zSOsf-&nH8;Ft@)k?cL*far{Z9ZUdh;HrHGaH`W#QX|L`Q?ed!WyPYJ*-~W3dzarj@Jo8~mG+y@X zddpDpCYc&r+%V|zlV}gn)eCrWa;9wn{Vw6^elHgk(RFohsCV2ld)=F5>2Y}*i$5_y zvw|TfTwcD0P7YAFpk7HuF1Iy}|;(D3y(xm2JX~T_QnaIoKX&l757>gxYQ0 zIzN@`oxl$759EOzlRk@%orTo5mH5q$cH@Hj%lE*Kp_laG;Wh`Iv)S`E8-ohJt9(JB z4PJftNM|sm$+o|@1d8$XZg-#0jX8LA`_LQJ#JS-q7k%w|c_$t6QQO?%ef1(fcZ+1Z zYCvRb!0Vn3Ju~EP#H}bptpN)svLpRmy?Jbi5pKiCeKa9Q2 zffrK<5#F@p;PLw&^akFTg8^-~G?0?ywIAZn*9&t9=$y^T z3k7-H-%L$S_RuzHU)1F8|BaZqI|TE1A8hamZghEG%^`pcnVo-!rGsY~8CkVAw7dOm zR(5)WUPsect}ZqkuK)GFJ>2iauk;=8Bqr|U?ZW%nCpPp=Zt~pt==wByJ%R}bDE%6| zxwRjZKNZ`3Z>Rf8gh2zhaNJI-+a)|Yq(sCW0#{>0p6<=QnmPr2K$D=Ghy5PfTdPEg({P zqO!A?>)%$}_rtv;Z+J|;->uubz1j6-uM4q<7WrCOC+Y5n+wMe7m+hAF7Q?V#D=Gq|56R5u}H~{V)2weSm)V|LAQHi?=4l*)fe$+-a9w>(e)eCI{`M0-} z=f69joL`?!YV!j(eG;DcCSP6-!*IR-+^?QrY;TXl`uQ-6@EJQ-j8{N_&M#RE)-iM6=IR8WK9`t-r-*T+a zu?c|Dxy13p-eAq-U!WJ}-7=y7{QmwjI9I;sqUTQLS#zn4hm}OcpQ?eWO^4NKP-CEZ z`n6*1?Yyl5ba_$72;P2}OYn2KwFdnpffVfXJ4D#*@IU+$&&b!ib@O*td3^w7b8X(_ zUc>eF@_419XaD#meRiDHTjvT?kpvP7y1SWDkQo_pM(?i!ot|s0M+!WO@P%KXZVXMf zcntT4rFQ%H35-;rw$D@0?HzxjjB86m`~#2IiwYA`B!YpDr*s2j+pjjL4T9bM1JHTS zB&7Ruo49MM6QDY+AJg|6#$8Z8qpRce+$%8H_wjTan8}QzB`h|D3gL{M+z)8Y40F>J zxmWAk+?@SJc-Ma#_V4`KoFUvr!D z;+@F(eCW59x9o_5ezTBa zR^rlv{!_!(1M%y!WfFu-*3L@U>*eYFkGn~itdFS5N?tx2_%h~MB zm!(PlM?zX&y=7?HHy$BlE=Tl_>g>N4($bBo8MM%}`83$HWar2#BT7Wdp^Bx-`dL5O z$j^+fU#1#x{uS5#jkV6rHmM%4UH^A$`fdA*wr6T9y8+~fdW0OmF;j!)^uNfo!SMQ z)~?gQ$iInW?G60>NB8kYiSmv0>aBfsId)UorXvrfHTNB)^S5;1^y(FsAAG|8CNlEx zLkX^vESk*(^v*-P*>MRr5V$%ytNpl`dmeq9c-)uK9{6yN0=+Z4b9GF<1h#;O71yLr z9tWyq`n`2^IbPhaVV*%ZNY?6U*;hc5ehaMCmj>)rx74^)X%k{gVlWPFI1(tl?Vn)F zTXon}nY7cG054QqlKX5^ zc?=Z_0{JQn)I0zySx~#2+%k%+GI!M*N^)_){?JY%R6ii<>(2SLfqhH{S^d|NtT3_l z@JlSlnOiamkOIdTp>c5a>Z^Wu70v7S?M*_iHfb_EY#dfnG_nOEhRZ#ALIVnM$~vi7sW4rkmxrCjM)d3Ua2#B=t-^J3Aot55y4o z&=qDWH(^}>taea(b?C3jx-)buXu@r3$_T66!xP7-{4H@Cu5G>D?vDPZ?&dyW$lq{q zlw^kD&z=I~dCmqL_=5|PhU=nsdxYsU7zFqG3N0m)N}>6xBXE-fVeC?fTFlO|)TKyJ z?){^9QC$2ssj~H1EyB(9WEGaV#d2r;0fbbr%$hZ^UpesHqPISe^ofp*e_qAEOWNki zF$HG<;IJ&PtOTL-ax)m^k0d%pNw0d^)@1D1D2AfGW}?Fb2Hyjy$f6ST9oeh8?&aKS z`>Ablnsq*WxiLK6PSYkb)ED^GwAH$O9WJ=H^#zhxCxVxXJ%?NrW=ctfLp7z+3uz3C z<=Oz!K5+28Bc|zkx@+R>T6o2-rySOt=P(s4NA-qZ&=eimkLctB#1*KEy~U!Z-PFQ@ zQSR?qu#lV#d$`Ppcq1(G4t&qXT_kztv2>yex$_%?eNPwMTVlQ;;MmD<0Qd#0E#o(W zs8GJvw)evr1QdiPhnXTmJ%_;wo1xP<(a>ST2|X0VgfMBo{3u`dAQj}@?Mb{sNdmsw z$v)<_T#K(oXG;|2fZ1i~7Qb4Fq*0DjiJ4Cui(y#;$6UTTFZ?yH=yY<}`5btb!cj_f z#wd zjzN=Zcy)={laE>v?w_kYFRfW{_kS~Pg|{9FO{R#$+IQ3V%E3GC;LLKaEx}$F24&+} zwOF&RTAy*GZ?V;2vz88G~gF6&5N-p|)9|-`+K!I1#YUgMBO6 z_I&KCPmZj7ependoK}Zg$4{r`DDsjuDKl7UjUKN_%dPI3k>g&6SHY&{VPD6jf&1If z^ptiyJ6!pEQ-qIoyn>SBeqkY)8?D8X z4Z|=EMcE``u3==wf^Fgj6tb{b1RCb@;L$9kk?o1pTj+om)JZOhz=5`H(3QZ$F$2P z0OhFZnUceFHRtujBjYg?b=%`wIA9RG(4)geaskSv9>m4y1Y<|PvkW`^C&SrL2`WKE zy_NK{=c=@*{i}K3Mr>PFVo zY-tqopErUFgB-do>&k6)vu$;ePLo5Xnz#fj;VkWwpq20~oy&iO4sNXb4%xp7+53xR zbm()l08wg9JF~5mN29a>9rUxQf!jiD#@);JZ!>B?1|=RtFmXz>JDbYZ@A|r`-Rp%t zuE8QifHIUYl5XEkNV}+&)yAkCcd?4&)p31wIUMj$({GC6cyX+YGBMnvw&IT5%tmLZ zrkqp11A7M-jypC^Kcqd27DW?bd>2HQiEf>dYwvt7I`dWrHINr;MrlY58jGHRx6UIl z;(M|YG2QcXFPBX}MYY_%2rTqlVeqrS^PMcckReJV? zCw`{V2As>X6<13kXrhD>U<9S9LZqd)t<~I({4{DN=UB5txRZ&yL8p5!(ol6lzetW- zxO2`H6%+r%O0SaQ^(%N~_Nn+QA$A~_DopPgQ$SgEQdSA z@%`aZIH?=spA4!dhpKaAsG`s_zQm^=PE&_9jAhLb_t7tkOUg*I8_rwUjQO;dQDfSPMJkZF<1P9iZfW=YcxxgS&#el!Bf@97N`VU(|arLqS$arK^r) zrDqIHvS>6CZ_(x2KF6E)0;Oa9&`8Qj9O5`CM&UD;rNFD5g%ax0dUMi=({RVh36)03 za!W|bBBF~xmyatOav2J6qA62^N2FdX@dgS+w_ONpLjNkI8is|@36tDx=_DUV>jH~* z8MHse!uv*0FmciZdVgAxjz>H0P5uX!QhLR$vzw2bn2-NW97ExO^>Ts2vG;>3bCted z3Xu#Q&nO!KJ_B^uCDckZ8NHdCE)n@gkz>dsA)wMTcQP*J=*6SVS8mrVd3ac3a44z@(& znl$QkCrd{EbVsS!l=Q-&XyA`LSUu4Yk)U9V#=;#seGtTyjG?dF3aFnqJRYYY9p-~7 z6e-lOK*c=T4B07}b?ge?byTLAFc7buYa0Z8d4CUmChmz0<-ZsBl!u34c@#mKJGMvH zz=spmoEWE+#{Lg0onuzB#WF(t9bJawga_HkxDF$^V>gff`1o?ENFnwRBgt+v`jxFO zFB)P3S!b6=amt8F?N<9rU^UM|mU-m2s-oMagU98hxCLfX`C?T}y3moR0uP?3N_D(z z(PA;}=0gWM(iqEjlfvVz_gOdJSfpB1yhF)?7FLS$tY%3>zD9}Nh7`veseNW12a-&k z)^5cc!g1}$@1q5xqckhg_hr2i^J*y4*rsr7cwY-Vx;r{-$D`lf2q?$sgBK)ny;(R& zFh(O!c)vPEeJL#b5wxl_qKiD+cn%Rq^KV?(U#&Bg?wQdjH%C`lwm18^e*d08mrihb z=7n4)(idi_!JnPY-7!e_jnk70Lr*QL)R}DQ8KUB9rFK`NC5r2WNHcQOgVca`B(wYp z^swsUtrI(EHWfB6_-C-P!qbGW14Y(C46vVw5us^iSka55+mYc2h@ff*wXie&G&2>f5)ZX zc)sfHZpV|N8_KcZdu%?TRGnj_DX^7_(p342RdU3x zb*4<1=NSFA`}P=3!-X%@L~dql9`JXk8JQ(3WC0VG=1ml&n6dL>s#qH*T_<9rQ!GOo zCT15_MB4x%Rq2wd0qJkUIZ zV*%D`L3$mC@IJKL@R%$u*FQ6eUa=|LY*jXpASx&@Y z&bnTUCExUSOVJB>OTZcJ=16OFidL)+&}>#mZRk0v&aZMd4Lj>C5_fZQF|;a(LNn*= zD$kLiUbUcWie=yv%CIb3If$v$sX+|6Eh_&S?q`}I_k!R=l3xnha}xcx9;d>RQt6>T*R#u?Z0R2|GAspLOvhx#s;Y`O#d6+d znDVrcFmoz}suh@#Eg7`Wm@{j3I+P`d$fwOpVnXzkcw{R_Jsz!^WzQ`WmR+92T>a-o zxMC9>pIIXFigoCH8Z*6u`Pw;0d@JlS_Qj?6v_4OVOg~!;Y5aiF)iC%D&63S z6n)^e?;QO>>+du~faMUy&1LR1uthNx$^_Q&`ap68qV-nImbZc zp=j2?XM*IRpHIX_HoKK-9dD)*^T9b31mGm;#{iFAR&b|JR*9S*@dH6K|7@PTVio*P zI|X>H=Fq5L#OrdCIKu&Uy|gn)ifsqJRyMZqp{x=vUz&7lXSf**qwJSph19=qMGg_l z*CU#yiPZ^)bAeYq%N&$aa+Dxc?<-aHnau4qE)VT;a^y-tlMxi9^{FB3=O~%=?6afw zEX@mrAKN{)-tdK)CL!V;Fl!0fSj1hRAIjte^)pmNKN(7 z-`ZWlS}yY1>eA!zpHdiJfmwk}ZSw@9XNpXsUJ67`qq^}AH2{bdhqF2!9L2nL02Qrc z(I7}?wqg}pN$vonFB)guVePo~dwMZh%uQ|UHXac%U?b6_ws3J{_`WcPw;38^zwe@p0n~^w8Ya0W^RrBNPeugIEv+oI!8C?uJ-j$% zr@_xpArU5)5&ri^B=iWUmwLc-d*(-@-YOge^g z{#~L}PNx-CqEI1IAyYctoEtK^a`y9WdL`N3{gSr+MM@1hsOiB(qikgCOAp(4RQs4( z9KosXWXvp{-3ek*GPJmc^+gf4tZ`?}O+_h6ua?3#1DyEvi;NlBl_3L7T!?O{qmj<$ zPgTY0rd3m<>@1{>oPT>%O6VfQUDoQdmu^j~h4Tls??c${Enb zYqk9uhK|B=NEO}yIko#6g#m_Zl!cMUrN1aLB^WS_nnJh+WT;xda!{TPn=IGH4Je>< z&YR5YQ-ZpLsDrQiIhI_`RkvdvznFYT(7ngd#YAVu_Qu4d<`dO|FBz&1Rb>?M+eLni zUn1ASOSzr z@bXD?seG#!{-UEsXwsCdnq4OqLJcV$jy^7QXE>>DJ{2;dIVWLSs7qcIUQJ_&%vGo& zFXh2CT2!BQBzYzu%7({qTbH8`xylq$$W!GLDOrzd;I!4;iIXZW>bfd62N;@*t+3N* z_!JV2BQFq+g(s}|yxm%U4Qu*tc4_^Jd%CtyB==R6p4qHfv9MnF@t00L^~3Kx#g{QS=ajEIA3Yb9J*=*YpxOw9URNVd*L05q zlU7t#z0t_ITeTpua9Y(3D-QJFYdRxdQhJ(Vbjqh1GgpyctzGKMq*th&w4jg~;R0Dj zvu)Q-RmS+EqHw&3@!6aqqWGuy(72DHX_IEO(wC@TO{36QN$nna4g|E|yVRUV0#XYn0o#Iy3rvgd!x zH!%EbOoJ%aP&jIj4F45uD@SkYB^(+G;yc5S+^z%Kc|gAPOtEE}nfThZ?*1`C+UGU{ z2KM2?+W3U2!X(R+N9pmOsyUA&zpX$N&3cYK`Bjsq9SN)8ejAjH0GIkiI%4CuD&^)V zoWfMP(pANd54w&)V7TH!l%!f&I&+=)I*ufKac-dSiX#i&6GS93B))Fo-RX@bTU0YW za(zdkqMHvKAVc_0HL`P$cklsH6sW$rnp%<&oXUlS^)ygWY93!J>`%{tbIqmUpi#=n zBu&0t>QMzIe0%F_Nzwu}3lI2-7u0UhB$%=le2{@!k-4wz>HdP+@=5W6!<34&8ZF3V z{t7?i%h^<#!%|QUEd{)6_dXRC8G|7j7lh&M54lWPUli}mT9zB`tg0ihsS4>d#!hdQ zOFr1bNG9TzBM}Nl#DGUJVbiO=zUa~yIO53cs|L3^Yy{$F9*UoBW$65!Q z*QAliw{N6Q4hMq=Rsicgu?KdJRv8u7Cf; zructDhD}12HGwZ<5OpMOLILE-<$XtLp}=%~b3>$Zyt~Lvloj*HDY^JkZuWIiMSN0m zjY*ARCO$WkMlkz33NM!#pi@wNpcn!#HPpD7_Ql}wqsT{vJz4K@F=ezVsJ|IwJbLK8 zbDgbbd%GIDQQ-T|e8no7m4w9b%WHRJd(!8P+0I}X5;7%Uv}_4G&ox({sf@&UR943x za<-!N5NyOIFlb8WUb|wX$Q8Dtlefec>A35_H&&p?$g37ST$o%T)fW{Gvyl=!eFUp^ z8Uh#nLlYYw1renJ*g&Wz+6iX~y7jCM2_|)=8ch7FY59mCO^y5FfIy|e2sq~#ZX&Lh zhXW{vxvdn{BNQi?9L`0fx_?C@2*)-uL+*vY>R!~>VOMv=P3Vw@0 zkJG@K!3WLx+G>2L8PvFTvPtxM`(;P0TLzUT-_>x_Cq`(k+#XRlJkLN>sm&RG8jG7s z)(VmoD{JpCrV+I*NH`4^yBTQ3!(cNGXDHm8S5mg8Yflcn;nVK_MABRHI zptdF2D3WB;YIe~8vV+MjY-9Wc5~0t;ZWN8Mtkyx2eh_mkj!@B~Tc(L4oqSavI|9Xi z>hZKDZG>zLv&~cJHxVn-20+EWo#pV21)b8WvmNGRm+>7a9UVN1v75Ab$amMSs~(9Q!tHThOg{ zmK*7OgUHvw2!>3mISkj^AgjpIa%9fvV;UytinLdZw#p|R=aL$1nA5Z3&(6ecLOx@PHR!s zB1#)9fVCx&RJeZpI_p#aa37i`TtJw9vP>T%6LNZ>#e=o2?YhQF^Yv_GWaQu14;Hz; z;g0akzPNd!*pT=HSn4#tIo(@yMF?9`&3Zn^sYJANp?dwLc$24>>wMveiFq*NGJqx1c#W81nL}gBSxFmVuvga zTXAgt<4*&Ot}Iy>Sl#i%d}Z=F033v6xqdiv$W=f^R~q~Lx$XyqYU`=^vBTlcU(dEpHC7bX~u9 za0>Q8BmB!>!8h6|WN+t(3;w=05hn9d?Cw7NQV50xa8qh)uNHe%Ese&;tLpn z2gWjLyLB>&rRAn>Yu!d5w@q-^vlpy4{j^l72lSoR&YWuY{zTTOu*+YlEqF`{tIzmp zW%LW9^6`Q~a5{L+g2s?Z;2T7(iBw4!(`g?v%h%XKBgyi(d`15`IK%qR5qGo*?6q*0 zaW+{JfVp3QYJwOx8fp4fA7WT)C;raicF+LaTs&k^Pa%x9huc#A*qNwIZ! z1#226FiUPEr|`Aq2Yo~}{L?d?WsT|?2e@`>(FfOsOdgjw)I`E?hUv*09%Ruu1OqYY zOQ1F)>Z#|A3`vrQd55^D`+s5#m5*bNNKL8K#aNF7s^`@K7XjXyi^MuQ*D5Ci%rIqc zl4!Mh+O4EXJ{kga&7Kbj{m&A|xyi8q_&l`?ni7~4Au&diQ|PH?3YgTT{?)+hTcTs_ z^krspH3u4Obs5JxNW)r^<)n^a&G=Xlw*tlX&QUv&#YF5133-y%Dh&`o9%%w?k0@UV z{Np9PG20!xNFjU6f+|Z}nnG)LlLNHfv?v8i0|*pER+zXlm})t^@p4g^;-TRyre=(? zUeb<(yTY@24wqjaG@=?I{{Eq%rB|AIcI1xNB6;S=nMD3&gFdDLm+4_gxWfAw``g;+ z&C=7`Oiq6o7UDWhbkLGihSf8?V~-CJjyU{Qw$>-};u)24LYpxqg}ijK8n8py@dt`G zdYthFA_($3&>0C~)HnU;2tt58RCz_o!*C5QyKWlW2dZv^{-AeX+PuBg?Kpl{T54J1 zhL&c0dMqZ*DY_w^Q4MKo=sY z)6(TCL?|dA@5o9)Y)~^qrbQGcZtMe#dUP*+Q%**HNP&gq4+;gfpJUc#FJ}aZ_szLu z3r5*82<*-4+R0$~d4ah6qaqyWshsX=rIQ(|Mm6J~#Rn6L5<-&bf8%?|kI=C$=WuvP z4S5(g8c6d*mmbh2yGITFm~M@!OsK-0o)0Y%_5DFp%7aib*txs>h;^LTq;7>#bNET+ z;He+1M3T)9g+soe3>n#yUjOj{JG(CJxT2HJK^U$wNVMnp+C=`1w8eaoe;F3yN8TVG zn*%2rw3b8XjqewCRg0Nq2V*cyd6v&FR%@p-rMomNX#;sZz~3w9Mnc<*KW|+ijXwSz z$OOf%FYbkn6lN}7tN#HLe%jqEH-Vk|w^cE`fahuB+Uuh-4%MqCVIIwBPb> z(G9Vr9KnJ7e8+t&-km_1irHq*vma7!k*vfGpRKzjCp482do2y`4KJiQlwSt>SWd2vT=8OKdNkk=P6u>_VEN22eiR>ct4%~@!6Cs9CarW!!ohNU>}eETD&zq+F3Dv^ zAg^;iK)Ur!2v!yPX|y(@sLMI$ z;sjRi)HyX$K#7^M3`U6xW20=rS`-IyA`8ekiq@_Bq}hXU1|uud_#A)3Ix&$VMd3Ig z-N(#$+zZXW2;?UzA7K;S=C?2F9NpV>kAW(2yD&_|Z@)q~Coq)-92sIl9-N8it`nfh z#|Xj%3b7aUDcR3>8Tg<}^&Jwkr!R-oKdK?*!RJlQlWx$Rx-Z)PFS>GaNnuII8+l5)b9}1i(U2|Cc=L0jdB=|tf2I7vE z&-SWn+z{D4O0k51>=Ae?5wX zGTm=dk!kh9$CF3^-{4aW*1V==MHAu0$B;n30P<2>@S-c%R5W2mY%dAwFgqT^q@+lk z=A7NhS;0?Gd&0*@N5k-g1y?D`osV2U9lx@QDZumRB-CQ<&lN<6sK=7TGAAz|L_>&C zB&=%QEZ^)iR~+)(;UEmODUbQwDM1NTFywJRa~d$}5g|K+A`TsYZj3S&MCFVZXFnzCorgJ1BQ@t8JtF1^uwnu<<5|+R_UzgaoI88J%5MyRJg?i!wvRY1y16 zH=W%_3dB*uuFR}ieU#QeGzy|hx8(S>LXN0avk7zYjJikh)kejE9^-2 za1=ouBa4m%+2R}!8jn*Dp^H8;6ZgSVHv;m|<4X&c7VyT0{eu%ESw`T?wB{sfD3}1C zY?gpXDJfOZ9eKgxPLn)+@qSpB;0bpl1ns8(& zeBfmU#l|&B_j_0^sx7GT9M%WOAAc7&8YW|*`y3Epv%ThmH;#hS$rfOAXgc;*Xe_=y z{wW!4nOhBmT?7?6a z2}l64j0)Y6+i{hautkq`(CP;$t%bS0>KOR6)v}S6p)gI_`QY97k&2pv_U;nL)rvFq z>B3w5H0AU&NAct;c!?H#M%C4A9&G&VQ-agXGo9fhXgEU?pfA-PkcHqDEB3Ry$}OFz z^PB&P4)M`Wm9Z=5w*C_wiOd1d0%}?7b174fri-bR8Z`y>RD*s6@=bgUxf~QvIo9KbKjo4ng-|Al^HO((tg~0>x<^`Wr^Lfc?+2KL1ylgHHGJh2LIA1Ew^*h^4r@gD zMa-&f7h-WE`6Htkwmd9C0MtJtr zy@B0-H?;G1F$v-Q@ZhDzxztI`HPv&EsYJRkln0 zDqimS6ywctMCA9DYqg##(<$%E-V?Bgmf6C$FhljaA;)KVR+*+MQ7jfr>t4O~?VIhZ z-BIZ0OopevyXaqJFAo|R8-;3nlZjL=h+`3I-<&vky_Pk&j*2mdHTbME-*!j5wTd72 zwmg0J-OUqR3D0Dzk#jG!i8{-o9$XQ-+I@q0zdib0?;x?yF@xolBRqu#8WiocG=u zbON&~T0PY!p0h73EHH1LPSy&w9DeB}PfmK|`N3GkWpq7X1wQa3Pxk+IfndHHiAX*V zi)@Q)+b(Y|zi6#~ZP9rNzsH#L!+T{wexA@dx~g}+wOv1}m!@9%c4>1Vxt4qZ`*v}0 zckb8feeo-T{x@wC#r?&qLMsiW>E;agC?syD^8);-B*Dvoe;tDN60th)pyiJG=1ZUZ z8!iE7HO|FxHdxnrww#Z#Ng+1K*5UTj^gQep=G&;Z^-k9k%H%qV-^He?K=k;P zpS_lJC%0FA03@VZsCdJ%Gi9l5v>@b6O`Sh+zkASL_?2jsKe)ywG`~E|fdN*$X zRjI+if2h*Pzf|dn!hfhzF7e>x0=IWnn&0%dDlHQFhbo==-%_RYjD=YjF7K*z?tfLK zlSThVl`6}~>J_2=S5^A^@-J1&J^fEr>iI{NI{k|(b@OKbud0;fcRNs(!d(7Cm1;RG z{V%FCzjg6ll{!qJd7^Q)FL85neL2)S3jh9%q4-}^=?+kpo|6BqO3QWqFaM}gq^OCT zcU9_X_chmpo9i<#pHfq0CO*O8U#ishFIDQf^bb{vCH8ax^{z^#|5l~IPuROEl`DEz zrAX+`veAeeKvlYN^0zAWzx`KLdQPOQbOIBoO1<7yDgEE7bb9Mu zm7bpj{!yimcf>?z7l{(pwg0Uu%@loCrCHuH%l}ZN*Rw!iv@+S`vT&iN>*C>YRjRoSRHcu9RHD3q&1T$^ny}-LF{cU`&v%<&Cm!iu3PgUyS@b%TLbnoA((!PJF(!NNs zgY>TT?fKait;zGs^n)kv*B$H6$JY0M<*-726zur7GVIN6` zrJ=KhcfQF-Jml#f_hGi;``oU2!%u8QSAo1N6>Ghu;5A#tNAJ}uUhyGHBc42czMz^M zFSB^M{w~S+;)#~s4&m)5wc&6%KcV#746=3a2{g=G-Y#y9(E0gybY7QSc9jIP+Jp&# zf7;ZMo5YjD)iT<*b;IP2vmNu_hC+G-LkY&-_SggvMGHqeB2TAnOgff#v&raw-kRW} z;`2fkmF#pBOY-E4&}P!3htCH)gS?nNt;*nzlA+QS?xsHWLEtP8)Mi~V1rJIMT;Hv7 zS<5&TEh#vEVCq=V52O^Lo6_wwq6hQRJl`nhGCiiHAK5~mQZFX>Bgq#o19z1m`Ugud zpoZ9^)?$&;B}xm@M#uHMIk`Wx z&+?hQK0p;bwxoLK`M~I)j_A2_z$fM%>v*n8-5ysHou@NCcN5*oetW6Ux-i7pSY&)E zDqA!^yBxXEeZJknOOsCKeJSI2euQ{r%Wk@R1s@$ftM41K`}%aZGgNJx%?o>PySCKk zcyNi};+~#eRn^(z;rz9|$^Pb{h11*HNbhvF&1HN=3>k5?!GHDysd0TIzIf;$I=jlc zdA9iJWRlT_ciY2-=r@!l_X#bX7ROY^I%n^At5;o9Ef#j)emU9daFgEB(^tE*0)cTMM|^xhAi*9+xhNJl@<9X)DWU!L8(9=G?ewW=41bQxWoZ8qLs z=F`Uyg3HS%t5a({8l7LM&uun-u5?H}rKeBY^3a|vdTZHV*cJAM*C!5na1eI!Xy|Qt zzMkJ#_Ho}kZ_J%&wNadQuC0B^TMUk6kDee32(Ej5X87XW=;GpXvbp{Jlu&QO^}*(1 zqFimo)}^Xr+1=scbPvvDXI<(ikEX}14KTmy?R1jM-KFmF#AUPEY~Pr)ew7*7kmy3? zLbNW^G@;k-?de@hUwzMT&f8M&_Gt0u(wWY&dU1b|b#7Iic*{Z6B#V>1?qNmN(d;Jt zMCDA?F}!za*-GQGakYFNWrbhe(csZ!v=W>+Z+da(a{Wm7MK?d)b~L;XC#ee2!BIA%fd2@p;8jrR0y*jVv=d$qa0{e2|r`O{l(t$XTlm3rJlM77olcD#gv0eakvoZYH>!MB_bV4RBU|PE+%6nQdR6N!z}*-Jw|8M(1omenXL_{1 z^eG1SFWT3e$ImW19)aT=kvo~~Z8G~m&nu~dPb`B^Y_8S$de5_L2@A&)@m8ATMh)ET zp7dYtmPg0cx^^0FxffNL+PQf+ms^@6@iR@XkeH(xv7V!xYGn`N&$pee0thN5zL zH>G!1yRY@L7|&jNcbWCY7T^mS-X7RlJOXZRFY7FZtKXEnqp zPge7>w=Ev6OLn+=wmVwy-K@=SsGVFi^~EE^Vo{ygo)0v@xwd;840d3wcj&GMh|!*; zFRJQReXsobwqDlp^6PxevV4W3>08(R%H2vmRFmp`_{JAbZ%2E^(`ufUOG?{~UMz#X zy`L|Ow$D|kUF&P=%X}VOSR*G4yf+m0w0B-OH>q+kp0^)XXWzd0Ck9gx9t}9Z=y9lx`Oo() zRv%5b;Y~U>O|Uo3!u{On=yY*zO_aTN(bMPkZ0&sA{k7-C*;fDPZhJAZ<*hp=C%3S& zJc85R_V{?TRl4d48%^l$iQrM}>gfy?mEF(L^kccf1q=9%*%lw3JiLFuIGI)TMZ@Dv z53sL(_EQZ9`=`<2UZE$luHK-kZM;mmjSQ*KXGac04JM2Gf(} zoC(J+l73z=+V*_vsvCkb<#;)cG<`RvmOxW_Ugh!i(c~?``9s!Pms8}KR_E>ULIb|8 z^}~Y+2mWfnSvnTuQ|V_f@2AK54m*#RpZoD@9_4pUpN5fi+m~DJMo}(pwE}EUxLdsm z5I5KR1FUVT?uuno6VVs%m)*TFcT4)+mq=%NzLs@w zzBX64Z&-w@57w0#7gfFarp49QG-Kr(ReIgW=WXdtY8R`VUTtn?&K_R%>wMlWuf{?` ziE=SlVBK0G1&kQGdo}p;NIFs%clTF6*qa&MWq93_hOUeudgkC%cVBPoJL9t3-&PAB zr=mc!9Vc^}Jh$q}bkC)A7R-O8zR^MrDXHx(f;7=MjvvD;5MhLjMNhE2r05h7P1n;` zs=(hWvH8=$Jh5FAUmXj*jYGZd)7l>IO&?*Q=f3Tek#%_O49(8^6Ung8Ki+6m_pM(h zxTR#PF9*Buc~OS_>f@lZyD9X)>BI5@=xGnXd|eRoeSt`J%J6dMe3r|O0Q}ylj{0rL z`|G`7D&bHga5ZMrvku!*$(UK;)Mf7%&!%HH^KEuVWj5%vS`(_v1`nLu+)dGL+g#Be zG;jTv@M`}S`LOVDL7)UQTHLx)RrRw)4`Uj1mzj0y@50CMyJ1G8JI3gp>bu*$>tr^@ ziS@HZnJ_)?-+Z?G&)dts?0s@w-4@M=GX`hXX;oKa8!(B_)Bd+(rh1QEbVaQNWG5Hi z+r{NFXJf|S@4-9*O%lI zAY-l)YR>#=nYQ>?I+W7QCrp>6iF&y;DZ)}d2!ZSI+;5|Z+bH_if^ zx1^S|6(g^%<;NlEMdNo;O4f1z=?^J&zWJM!j!yweX+rH|bz<#5N$EVoJ1I4;c>WT9 z^WTxuZtH)NQaHVLQi>$>-;vVRiT@v@6!Z@%4Vr%^rJ#=*Ya2uu6+lvY3tvt6PD;}b z{y|EkKm8%4vhSocEBF5_DfPekFQl~8t$KG?{%-njQmXb&N|mmGq!cdOdHL6WBBdkO z|Amx(B%Sfu++prp=RNvU!2COtSMv}zOj z$ZvfGBJ~%QGFWHIrXsNf46Con5!gxA7FkUs?hbI75npY+PI?{(k4Ntw-$7}Fj~&Fo z#2LO)gY}5f2O%OF1F%wGTjexyvnerx@hDU_7X`FQe6})d7N^sdgYHpZXStJ~3n+f`Va81Ob$5YPL%?E<%gxBsvVz_hQcf(Nl)JC61Yr?Zj2r; znT{EO1a0*amC0jR?e zG~s9%R=Sm=N0U1VEiN-J^JJLFFeA``ycIa09Mi)|Y3``dgd1i~fd9E%DpEJo8v<@N zM>lEZMI8`;>RlOLj}Lc%FAqCAk^Y%dPtfVRFo~;tbnUFHmrUw!*bwrU}&C}rEzL2@;aChALj(! zSK#U9NQ9FU@7*x~FUnni4G(c%je(LjLWcCu`(gX8rU$h|G5<;beAiV6+<^A!290%RM% zf~5SqDy#EA-C}E0!^_I4Ccjpu!`9Li0G6-B*S?z<(4%-4st6rOoDzj|3Vgh*!Y|S3 zQe4WoakI8O4?Bvj%`Ot@9%DYJ&r~bl0bFLtw#-?5I>?o55kY_Aq4ZtE;fL%;34>7l z{yg^yR4%Io{oXp`j6`Pnns8vLbh*I!W8n#MLR3s|Itq z{c70HAQ9E#SsD`*Ae!oS{ZQQLUHz(7g+i8qOQ1CiB@o1pETp(Wn9gCbLeALqi}4O4DMG4pPZF8)s~uzj+NASp8z z1ew&6HsD-lZCz!3)=UBAub^Y5jMchI*` z5PKIeRLW5X7YXUkI^_?UwjcA&Qa^K1YiO?mGRq=Fm!AFik{`nOWYRY>c4Sa77UelF z=LOSf3h=TxxFz2^`uHh(iDAy<1t<+B#Z7!czzMVKD4WTx4^#tz0|MJ_j2Akw({C@@ zaicm)2qu9W1*T1AQW#d2WA^a0lb`9DGS1#3@ZUpEr@X|V7CCUuUQSM_vzy*QsXObe zUYdEZ)g0FVCoI*p0E9f_*w^uZ&Cd||dgc`cS=Iu4+>NnTmBU zJN#QlA8|^WganGRo+EM(UunzAlLeA3tHPg}1rlYQErJx_=gw~z6TJL1ky8;=_rRv1 zSPP0a=F)BkR=LaIm(6aFa}9*6%{+~`nWqz`Xaa&;iPDD44)bY1fO9_4Sq3BV*onHf}8nx9BN$?G9t@&TjVq6Qp$h-;q-D|BIyb zZ0v7Rs`fuiN(pU%q;wtUJz<4{SXJ&_^*7DjybP^P~4?c%#ez1AUY!_mF!_9` z(Bro4>l*$}A9cTIqr%}w*pViaG6kW@QU$g%mekki1}Rybp!|ihi&<|7M^%7Kb~}DVkhY8V=H*0pJ-iu>#~YWSbZBFs}G)DP|84`O2uuLYj+5qmK*o7t&Yj(%?HAkc;N}i9{-z( z@!|(}LAPAsT$IPo(dhm=hKew=yPe|KS?6>WD9`Y$8~lw+qwaLl!r6c)K_`G?#^cDm zOQ|x>P)2Yr5v)Epfkg^vSa#A+FrpZ3_}~UVD$dWMz9GoKPD22K1XG}adukqHMGi7# zmVd6r;x2H!3=iSk%fmy^d>5yJ2TE;nC{T#1NW@#34NObI)nHk-h~)V4E_v6#0LP|t z-0x4a_5QR<*IHfLzj;5F7mF`*+f|_t?A*~lgY!W+ae4dYu>M-?%NP1RZ*l_d1(TB# zMFPB}4{nM^{v`MVnprK{uKP>f3?-J+T&&?;Ds{k2O@dKRqA=#{DXMCEiyUj|$YCe~ zj1byM_tAmz?jwIg|iKn=MfuT5f7fn4T4&5t?lNyc^*ND zt!Q6eGg9(17sL@rOT<9zSdQus$}3m^O>3(aMMY9AM=fK5-Rg3CN9{7s(EGeB;^6oG zl%(cfa~N*9UQIzY$11Zlk%K4J-_U{i)QP_a7e1$ZCz$no?b3x`-j9#}aeU(Poq8cL zH^52C2)OMgF45g}jYsWP+6xR%`TzkV&e4D8pTo1ycyt`c&y@%h?k34>5FNM1TFI?AFHV-#uUP{LvQn!04d zphuHv(jI>FNYX9?4(z?aMA-1>Bf{QHUtq(p7|Bb1+y)tO74f6Akn>6_bhxjb&AHh( zHinxnGZ+M1mi4?GTMU7x?7ukVdJ>InJrl!o zhnz#7E(vCBy~uy^E*u)~!K>atlczd*b-Pg$w|U8x^($wc~jYVk5favWl zJ(dU*H3T}k#SJs`6Vn%PU*S?2N=0GjMn5T3YN787YPIrZXBIeYzqbofpjOHh^FFL* zYzHcma;gfT!Mn&;^yv?3rS0k!|zmy0;IA3l{A3lLCl<%g<*J`g#D!87Ej-sJo(Wl;cxEP)3mUIdK(EL33Sdj9IvO zGWTrAw4`|lvFgs&PJ!|7n!i9hf1-2VhI|W?;qip7MYPCrze}XvjgeHVi%}IEi9&fC zInx)x{$o>^@Tr>CVD7 z^)kh`bg0DhJQ5wRb(cQj8!KTRzfUlg+?6y5ieg%F7J`>P+hW|YO z+E|R$b}{`zz#mE=k3Rp))bh=+EMe)hKGr_=^up&b1uz0yjanR`GfxuMI)1ZJE1o&X z5jYo&*MvFWCW}%n2!UapH){BTOsRnYW@M?F$`gxp6V{w0Hrnc%qB~n(bn; zMQPYj9fk$m8;y+ljoh9JY-K}mYK6}-ld>#fRAFK0o?5L6-0ZHTZ_)3i(aVSCqECNH zqg)UFsWe(l4Kct;9r$>^`WUdsN)N}D66U_cP*1`iZ>mNOagn!0Ii+|*53qgqI~6(x ziz+8b*&or4{K=3D3yID&1y!ZsKm@*6NK;^cRfQ;Le652|wzocRRTEQl87kF-KTM9* z)4asjtvR!%ycT!yC^jYXM*Y(`equoh&fOkMl7_J2q5`;t>hIDh#s6q&bno=p%J$pe zrP1>L>C$MHcEU@?-=)#f|KZXo7r{SDqhL2Dc2VS@ISENj8kF*C*&eTrQogOdsd(cy znjx|gxA@Yek`gjraMJ4TA_bwuV8b!mhGIGneZplGNh>ivpD3G&^9C~^(u{EggRIj1 zVw-CH#yg5rF~}^iC_qAi5qM!FfNy3u_I_!iezHGG(CB9{C|Lyno9)#XHr_f^@cy)v1E$W%sHw7Gxyy+ znk0l-yHXK?cH!9FqO*3K!Bj-7XmD7uP`rb`MAa{@$YZM8cn`bDRtiUwHING4ZV9d39!m zg^siCS=4N&`j-(LYXul0GYbM38nm?*O)VB0LFbW1OyOb#;ZzU6>gpo0uI+S&k(6Y3 za}BIA`ZlLBVId*`a%KaD_K{ZXgIWwF-LusE<3?Kbvl>VlQboJ9<@87K_?&cD4iDI1 zsnxeQSW);buija*qMO+7vC%j3&6Iq^g;33nEML1)VNxb#OQ}-g;IcVG_Pxzbi|8n} zs1C0QR2nCRZs3*8F1tL`SnS+s@oL*j91ZjWZg&0^0R<9Ce{bmRP>x+W^W27sqkIV5 zsDmQ(vakgOEf&CtNz%iip$JwDMG0U3IK$L<)5|DT8FJXI5p#Yvzsz9ljv>9PY+l&3_vsgkUuBd_osJw%8 z3|Eo}5rO(NnL5kI+?sO&PnWxGQ7);j=eQ_Ft7wiF&1=RkX`)*pJTf`MUGv|Ypc`UY zbg%FaL||A!R{B1i76oCEBw<*vkomZZMW=HZrcC2y;k+@Ys%Fq@PLl&^R$;~6$0z=e zcR8;fgxEMnk_%W;HR8gki8$1?`UaMQHL0E`cse-(Aa+{y3RecGZ1Nc;Y_(bblGE&K z7y#cH_e7?nZ;fem383XJI{0(ANzyTW_1C%a;oo?T?bQc!X8+Vi)#wk=4WFMj_3>{n za~sBLO;&DG>q1(0mW{@oiL)c=+0!*a3ryOFbfGOHs#OS{M(v5|Nk+J@q?z%Od0Z4O z6rJ#fJ6s#z{Aw_8t-javs8QE~Gw`J3iEc>t;rhX#R9+|Xcu44+O$B2UzaYqobnmJ6${`n_8h=)kdOj;H`ns z-BOI#JYJm}VrkS|H|}X+Sz^yu8a}*KPyN2mrj2o7NQER~#QN3;-o30wYU%{*pb)R5 z$qy{ZVG8;sgY(!ZxzM1^bH(E2TWXB!xZzA0j`HNd4Sla05Fi9JnA9uGx_*}>J}BrH zpG}Sf<)@|~L=Dl{EjmcRlITMM6sl<$5~#j(TyMUmuz9}o3}P5Ny`-F znUmCv&q0l-u+0V%PY{xrqCGJ*6>F2I?7^XH=4cM5rx=ESsZZfuOYVS=B(*>YGwiHgt7G&hNN70Od$wSox! z63iH4`a!Tt03l37C%^Qz>I+o_s-#s^hEfRh>c_yCvdSKH+M=c*`V~)e(C;M8frAl< zvU=HsiE3mV*#4r1Q-`Bak^983^p821I5Y}@_oIbt6~q$^$^$mhc$x<{X9Fq1 z3pwtuq0CSC2JEZ>hcOu-y{HbG48IUYMDp2rNkd5*PAl^WR4-4Cz7}uJNAOCDkkU5F z*EGU5V*69e4L{PZ#CW(6q;*?aIyN3`CCd&lLZX?00M~hcJ8sMB{6ahAF+|25u>{;- zIX?)AwS)gMB@kI}9xLUb^DVRz*GkPp%E$exWt`zlSmr*w#v}p#@l@nxK z1@1=8G^hHYM}<8P^BX#9OC3U;j?9E=M5Dd80>xI+$yg(%esLhq$VjF=Jj@GRb%7#m znFhZhvOep9#}`F_eEAWpxe1VAA+8ctONT;%i*&z49Ktj`X;CyrWUvP*c@&fB@Nqv8 zwNlH&mZT@ArlZ#FZ_%tXbuun@^s10|R1CAD8`g%p)uy0?^&#P~wYG?8%`4ZrLh8rN z$I^k3p`nRU`nW4qPpHH~jVe_#mZWJX?H-54jk3MVI?i3J96ce^9j=SoJLsfIl;UP0ZUM|B zbu@Y(4PWlBA)MVcu)^V$I&0oH_xkmvI1|oJsMXky{~+<3-XjCoI4s2F}BY)__aHtpyBYy5M#q6|BxL+Ghv zg}-2hj(z)2tJrpM9SXSRB<&E2kCwjj+S#h;oTgY(PBcL#)55kbuWzSb8je~`GiOit zwCZk76r%al*b}pfMs5k#8gWDES~NM+F&LI%lt?NET^o?rRD}Hm!6u!D`2T6U!Zd6W zFjy*qqZ9!bNwnr#(^2PU3hw`2ecTHB1i=R4cz9UoM*yN}r6HJWrg+r5_=x0GHGYa6 zx6>OzQf5A}pbx;SvmWp$VZ+0T5d+*kenk5#SQ-R7@*XUWN6*EFN`EG1IUH)zo?BYU zNcfqciI;q6A#en`F-p=+k)9wt2g&^32TS9kf8Y4M{CiSrpR-+KfIZV@wrdEt>M;zs zEd`R&=@V`#5HurxqeP5QWNV5Kl z_h9Ls5$SG;Ht6Srh^+Cyf~6ZEh<|@XF@}OZFIr`%wFRYdvE8^CT9p}NZY$H4G@qi6s}s>G#ZzAd$hvg27}V^xba+6 z#r|6MM!P=zLEMo7ui|JNOowhV7_}!++(P^dPT0Sg(xSgisklrFBoxgTANYm*epOBR zi5}7xT-m@+PK6yaML##zx9p?L-CJm2&j}~UdGdq4~K&M?*A#3GAnJ1SA zOjyVXDH~22H@*h89@5uVf?|5*9(!iHeo!eDW!i=eQ^o*Qtb{L$j=pRuDP=ew14x_Y z&QDRRd#%GC>lty3V^eG8`iRUu9Eet-gN7z$9Pq}7O-hbG&Zy^uz)?eFcsJTOA1Pm< z*Mp_wLodgQar+2$qJD ze^~4{|A5y`g-i!bvO-C?A2$b-op&s*2@@4)1_pip6D(c*N3b*$$B?!3-INA}DBjA$ zDoJu4{EI0aAxlO7cczp?q;&qfPs?2Q-=-AP?9?>Rw{<%fZi&B_La|}ufP9U6vgc#o z4^glK_c7}bNx0AKz&&YXr!!dyqz*|%Mr4BmAn-SkT2-rmo6>bdRMugZwG${4qhvXEs5Np`-k2m`&3PPvi z$iLV&+BA}*4(x09&b$Xphju+kzRDB1{jK`hpvlncSDJ<0B(K2e1} zr3Ci4argceEZyv8MmOa8QX78`2e#Xf5br-{6{<^jqQ@4(0$o(7H1>(oT`@wNoRnJX zTrceJ)ex|GAg!E5)dGy$=m$)8Q7Qy4X&GE=A1vbHV^huKKewc~Us~v!dN~c=lE5Hj zoaD`e&6l8POI3(+hQ{EYEYvtXG3so|S}{@Fm(BF3La6>BrA5*Vnsp+PUPNy@<@UKr zgFsR`Lh(*Y!(`}Gr1$5x>mv81NA9*P;l|0^lj>Yp-xsQqVQLRZWH_?2N`XW*XvVB- zXBaA|aYN~Kqe&svP8vZr=B3#b9R5v8Co?{g`H>L*-7BT%wipOk#MJ|Cp1*CHE8&zX zczq_ubfwl6Aam2AOALAMm3E7Z$32Pae~eZG1nok^A4KFqFYf5OEvNXxNxpueXLanR zQk0VuGhw1k94fe)U!2a$&*uyUd;s0^>tHH2@e)SIz+u60O!azIx9j(nvK+yhO&_Ys zyI(S8t#N6&0*cbH9%H1qkpuagKAkX&KA22Hza*v0zeK4-85xaYOK@<6!rMkpmY+#L zC20Vu4taOcFN1zEN-Ei5pbi;Yvl*sNmfGaHTkpT3Y7AH^@=6pS zaH$bgzy>UGn>5skXza}iAoc3YdS@L&F1LAya3~Q=BVElT3L?w9JP21hk5pB{)u{iI z!+h03R@OxrC1gUunq3e{J;nI>T#_@r+t(36lnTa_*Cc1n?fzX6a@QXKyfJrwxzg3& zT&d|3SITbqULv0b`eZufI0&`MS3;FM`UGhO%}DmKD2)V$noY0}qshEC6riR{pAJd@ z_T@$yYT2+-pppPLEi3U=>hfcOL;4*r%_p-HGm(j~$}LNEo_~L_9n_a`XnMMEPu<|!1I9&rj-tViF z+u74e3_NnB4C*C=lIcPWyBqH``FX0)PV5(rHWVf{hKZg}H1hQ8WW?wTOpzPFT* ze&F7oIfL(GREK_fek|;uD;bEd(i&XRmChiR5by%AaBuiuTxk*O7-xg!_oH!f)Y1vS zY+z#4mk++sWw(QjI5;FWWi}=J&Tli@@BrZOe{rPHb|fC{AFj0Si7Rd4zxVQD_|@KhG}qU5 z0sTN}0{~s0y^%X3@c4A>`4ji}T7&84t-@zF@Zxr|XT>^A+SLsG{Z>@)N&B&GOR;|D z%~{-$*B-!O(^F46?W!fsb8=RTtt3i597XL+x9Q=2@pfet^AoquMc@JHia7YVimq9@ ztdEpl{*dV8pP&@*A3^EX|5Z@>mK!Yguv$gz@bdXDiHlL6 zfPRh-CD&oHZI_mXTc{>heRmW|K}?_h%NUk!WIZ4@&5vBPhg?~Y&R_R^x%*C5k3A{- z#zTRue`-#nyYkSjjg7fE>QBNWriDn~qXtKl#W5@y1?BbIjVY$=>#~&5!)p#`+H;qX zIBPlrCu|PvvgO?7wNx-6$NBJr@+X|Gj-zMIM+-5f01M@ZlZtli-Jv{?Gt`nEqvyY6V(#o9NE1fFpn49$cg{k#mR|=C)9wSq{g{R0=gW3h? z4(tHBa{r}E^`hHJpm%BNHtv-F(xqc0I5WI6Jdit=6WBb7)QJl(=B5hShUmDc_tT_N z%096i%KGy5`oT}Yu-s5!?Mz$~zm74>oK`_gYFett^wfIYX;zgx_eXIWujJ(;t^y~N zhQRc7MLj1$!p*9$*2n5CxY1ecTyC_{Sw>vFrfz{v(bCqnEsm~E^$aFSm!}!Jr;>m& zx3QFsc5W_gz|m4fZ;p$P4S&%b>7>ShoYM(CpMM$ZMm9ahncb}Y$k^9KC~;TE^DS22 zQ=Ln}hmb&0enZ8jBJDiW^IO{%{^HTKqUgfly>9m@4u&bhvG+JtBZJXdoE?enrd65u|Idx-#$#g|`+Ui6C>N2@M80ml zyh->Zu!+S%sM*ws-oqRET2$Pj3^d_(xSnpxO#^hUa01#p|7;n>b$QU1Ya#tK`Jiqm zxU^Z6l-9`5f9&X>=p3?XW z($C)ro?VmkKYYI_JxEI-l__d&<_4phZbcg{@o{lKd|y9XOZjzwbbq?^aC-D`op$fD z#9U|C0~uhB_qjW=@$#bfs;_WszV0uncXf5!n*lkTx_i;gKiC#}PV*F>FnFIA<78}D8N57Ldh^#+Xz53gj^m9gJ&DNX$uBd*>7@2NQbPvj+Bi8Eir=>3cQ zwH8li&)c(|L~P)ObE71vx!eKlAE}JBZB(o$xOjc zEqYIZX@{pK5@BRvpo*4N50RxlE!#Pz023rIHJSq8{Ae8Tq1uw6eh+%r$|?K;+8v`> zPr~jNvI|GEqBYc9a-6_4urss2WFsc%4UbWUd&c)O$>+s!2t*@OqcUE?3exY*nc86U zM;U}|$U2rYB5Gb5CTFjTwokm(PDUrsoc^9gxP#Vmrk)S5F~bA`o>vNA5OfIoo+8urr^pm%kNGh&oqviC|Nlj%JOCYtTza{`?QFBQeQalUd)w1IP3v@&SQq|^sNMoL zZ;I3s6ip)^K1|B5GiRG8e>s(=H}8&hwBWH$T6|DkCNk6Ly?Hi-4v|ZvL7^Zt7RzSt zAECe-e~>)vR4T+(L@k}#8!p{T`-0kDX2Hy~_@No(`rYOGL;5bh%X_bdQk&sL@UnHP zVj=2_c}}JspY_H5`cGbW7iD=C90z+m2fg=`d^Me@X*P?l=i6jDa~{^rst}s7OdfI= zo_puu_C0sgt&6)QUC@lXXMH31HW9wb)M6`q^zfntw9r)D(r|q{`A)axV(&>V)lDwp zU2HnOI)HeGo2O1KR>X@9bvL=XOS2p0H;zuHUvx>SXL-53&`A2gr%k`EW)>F~N_>Nr z7x|i-kAE#Jrl^(GE*)ySRh_T@n(4;lDAyH#K8F6b^a-tA5bJ9$=ITsX|ue_FF- zYzcK@pHy8;nfGw!SmO3N1|MH{)_z}Xs=rwu+T1C+TUuSHT=8u3y0kZS3!Pd@p63p| zI$JbK+U^{rnB}kFxfWgNF5AhS_ki?uPR47_2PF$lRC9phVt`v+i`L}j@-e}Jdpk3V z+Wg#}1>t3;$C(LpqwVQr39c3oVV*_!lBJ+$<2`tVrI?8K_PlHIbnD1bFD=bFJMW-w z0;J`%Lt--=S;F(-b*GPLxT~W8bZcBxe%VqDZ zs%OJ0N%FjgmeciYfAr0;oZ7Ft*g2=6)IxOi@RPmvU;FTV{d<>_sV$yWX{eKWWe3(B zcd!@dLn|6QF4wnUqbj$Q!;=JKiXep6So>2r6Jll8pT z*QTj!S?B7?W*4iC4XL@l%cGLnIn<-(@3oB(0=Ukt#kz&h&DO#p?QXO8I4Ri8!0Vtl zl;gtJBQO zoH|-&66+S{lV5E^{kRaf)Zx@MJtfxk8ax|)@oN>|`T#IfZ?`7G&Q98TOih#mK)$I% zu}&*(xpg>SX>zpkuya_@A({-%JKC0Q7R}rVxX{UxRhSk^)iJNT=j;h=4OmUBv zJMZqsYD_m~W~lpZnB}kV!sPEx=gLTXcdJ6r2WxOVtDI}ohK^E?5`Y#CkOM|I73K7D z1bW1&&a%0k>2Iw&JJIO1aPr8(+-cCTY*>h9(Rz}{Wm~I)ARGi#pw3CO4ZcV z;<~Encb}ck&&S%88?LcP_|C2fF654{_F;(lC2gz|sw|F}X4j&fXmFWX5|?!O-5O7f z4{E&dS4(&fRGljxC^__C;5R zJx%yBc6Zk*LKN#C7lXlZcPhz%7LU6b-FlFx)oE`L=>5$eehe)0;=Z=q#+TKy|FJP$ z`rDZ9JT|5;5$ZP{8`IlAjVVHZ7R?a}Y1~x(x9^Fnq8R-P-f)=DP?Hh1xWp=gx-IzZA-I#7v-6#HO zOus>;DgS$8`sw&@V;To(OfMV@BYuh7oCQK9c@F5VhLB~OnY6I1S|#8kt+T=A^Gw09As@xLUd?eE9B&dM}jw^*k^64MVqIFDHiIG-!p zIFnni+F}@!JB3p8!y>FKj+!(NwPsL85bUzhnwc^--0TvsvQrA;d7j3!*D@gI*( z|l%*dNQ?;SUVqx}%>-|TzG~xSkr1}$E8Z#(! zL15<)5Z(KzmSSi{8S3ovaU(L(oxQO_E{o%68nU)0HUr*WLex_Jo!7UpXU{iT z?!1DpAA-?rB~c6jou6&EYi(xs>Mkya$A%xa?!duE14k5b#hwpa5w~~Jo95Qh=XWN1 zHt%%eQkEWahi(^l4SKhS8|F@0+TX=XDw?qSdtHYq4(+w54)x0-$PsurL^!CpXk)$o z9(Q_jDuY#wV!obe_%3%kb^2>pHkQAZJ>=saZ>wP(A5g z`1$@y=8|k`l%HDt)SIr{vva?!SBMb^1-$fW{OG|UfN|GUt8O)0Li&N@4Q#j8*zfIrU9sws}A^)tO#(L2+Gh00SD_!o|^3^MLc8;uO?ztF( z0)9Qi!6C!tu3iKwp*R@tXPKfe5U8Wn=Ftk+CU77h#HQ)-q#W4Tp+A#9Yfw6Xf+nsj zjL`SKQ+h7=Ws*mG`>a(B2z-5GCeDCYq2J+C^aa{8Y{#3idK6l}$=#J2H>>fw^$%OR zbGe^23w$k?`2LlIOaX)~r4t_ge8zLVPF4A*F_kh5eObERgA)X4OrruJjp>liTESCe z>L-C#Y)u<^+Lj3@2N!8$@5_9Y4bOi)z0E{ns9w9{y%@0G%V;k&4mvM^-6MQjg$pT6 z-@N#Njpb2iCxct3-SaE}pxF+i1hw=f>9H{d{B2AzjgOFWlNlZx(@#CnFuB3OED`3w zA(Kd@3M>y}Vxxf>c2Ug3e`iY(@}_xjUZO}d|F{tIBCl4LfUu?WPi(3C%Sv`;wV0kj z+pi*XPV~*;L^ZQYs&+e7F)AMYKN+yf?$0eLw+kn@qCc2a z%f-C6#Vxg3$knodJ%NT+(5z&Np9Y5fi!F`njkU;n>-SPusl1P&*uq;j7Ot1m9vYFr z!PhP>T&?sO9CZzr6h;mp2lC_V}xGC_WG(w67M&VTk%0lm|T1Zr$q@(%!*$ zJUAHnp)|${sKl<;s-MK#gbpOUHBGxiiWP6dv7iK1wDf#Sn&p>Y3zqwP-wM7+i=x8v{z25sXJ^`&MuUH5Nl<*H*8ie^`3m*zw>X9uS_^}G%u zMwYh5FwakQ4|$4A{WOx_^%0k6oRSgXy7zU)!j$+YLo$hC@eOIc@T;pK=Mn07$i~i~ zH%fj*vgkd_M3|ivMOw&~ny`>IBuA`FuEodyBP5AC@MK^SlF0eI8 zPB9)C34uC6#LCOM^BbTu^9+5hWBsf7>EL;_5J@uXwk&pFgF30EL#rgjEmi5EY0dua zmZI}W4>ojl(aMxtmmI%!Ao~s*;0a9D*miIA9YX~Cdt;jSr!kelDuQNtk<*D+$h`_E zy5YmbcYlADUpu~xh4~gse6Ry1R~`w~3^t;T3Of25P=G!6S*P{7;S$P^c8XF00DOaz$%>u>G7DfHDe17v70S|LvB} z{BcX0>L1-w`hbai*aQ8oAtK$%E_mF*2Q)Wx#L0295nq(N}rS@Ii-RG849-; zGTLEaF~2dc6^D5H=!h7ugj3fjuapY23bn^;<3%H?F*l%X3PPQy_~NqVh!XGaw@qnE zdB<3u>oX%ldk8?SJx>OML14WGF{xIz1~b{TNc>p=BuNi9%iWGSx*DelE?j7Cl=sip zi^CgcaA34Bqk2PUOl%@TYy%?%q^yak1n38=Ewfk&-2go7-*%-`UI=q#*bYJ(Q+6M= z-~*MpS?#&mPtqtbS&cvQnd}>6J;?^rPM2P3cGA3DyW*?PG%^HA3+!&aHE0 zshI(LO~@SoYD~N1DN&ra0UaTh;|O(TwCCbs5-89@<_W%fr6+yAgkwW9p)C9 zf85f%zJw}KKC)>UN;0G_yOXa`gR}_>NrTdAV5s1|AGmqwwyapkvJyxJ&*DsG4Oq=nMv45Rx6@zb$9-rt5wc~0{T-PyW~C9& z_0+;i6>{Ejv$em5 zF~0;`Fad-=bl^QkroDe6)AP=XN4KA5MS#I1moU8lNURnX(buSUz ziQZDoYq{<_L}{T~cfTz#@%a!nn?1RMxLl=nU(@<)cBJ=sq}SA_uT<{k?UjMFu2$Nt^8Hvz*sAg3tvDUW;vZVkx*RCI0R zD9hp1fGDA$64<_l%1%9*pYLMyGgyvq=Hw^YnOkxmDCzDC&OL-?y-2}?ydK2 z?exVh(K=^Igg#cha@`RiZ-b11eslz|eL8D3k1-F`kuG+o&Z`%sjX~2-KN;0xN{u0h zOm#7O4F(ABu<;>{?8&(w)s>jQ@c>0FQfQ$I(O7DAKMu2WjK4NiwUEr9jjDec22U|Z zROyMutruf*TxlRatkY3$yFX1(VZ=~@FKt$BHO{+lqJN{6w5e8`qyxkxb8#DmL1#748IlGPr3J)Y@$m`tUoT7Hd=BK0vrC~I9aB0ftc3|aW|Hs0Ll z9<2ke)q7pNfNK!1jqtBP~fgIx$}Rs_L}SVqxn5d+L^Y}&X&3bBK^Tb2LUszk$miGcrsy*&uz-pRqCaryauB;{ z*nfjdW0LDEA1hPHsQ6c9Go6D$=iG5j5+>}Wfy%GV&_Q_rtuiGWg}|ky`S^@aaH-o9 zT&nzeqA27MF6F4!CNFxbOzBE%$;mJRA1hNsNM)M%RGFrg|E^5OA(iPHF`oP>1uQQa zv-gEnD2m_ZjloEgmJMur=YgNF^1(2m+X8s0;~zi%sZ7@%;nIt)v47yw-M?_D(ZvkG zmPMxiL`nEy!9tHAymR{bK#oG93R_dYV?7NqMp23>dC(uYRD}-esWL@?RHg<=v0ckEq1y@2?FF1^caEMGR<4xnrXEAO>q7y??rz2Qc zD^fvqBQUrF0^77e%15^}^3g3VL=V+`P$!}Z2SEFd!wAdkJ`Ym3Wa8tuc4$`#Eui{T zB>CGdRf`~QcwydYNnQ5pTXa#s>JM{@-)<>SQr(kVTJeuts`lU9(zMS;7>{mgqRAMl z9FEN8UT1_AfQMG`(Ji$kMx`p&qK>v8jV&H;-#avVKRnJ+-e$k3K*qztSz0MC0!N#m zWXG7HG;Xv!E*hImB3(O5$Afcj?m(sh7>`Ns(2d{F`ubsJJMg^Xw_6H2P5;L&E&A=2 zD!4|yx>3mQ*lzTeiz0+pYvhox!klD-d7jasBU7ED4yjDBLyV_?SEl8W}VrV*8om8n$mI;E>+!=K7j$-abXOv3GrPQ?&Yb+Ln; z+d5*_)yQj4`vyKob5EfT7Yyil3i?iFonbDTWYu`FfJ8=hKhCB-na_Ly#wF=RBjU8$ zAlCR@d3_)hfkW$0@fM>uBPPB-5;~!xj)Pvxj;Dfor8f?Z@}6HlR;Im$24c05nyQbL zX-xd<3;yThrGc;d49Nvmlk|jbS7(^@DBi|LG-vJY6SD2rl3H!!D=3R(k&JFPhacX= zl5n8fvCk2F8ahb?*ad;~*+T|-@JyoVd-(>e6D^qXF-<4@U8ZT-aG-a*2QMKfs z%Cx@ou`+ekdFBgSbAmNFt~C`K#HL}+@?2mf>qTA1qgxt0!O9jbwxofG0U2&G-D;nJH`*V@??BN2G7FcW1b z*`{8dO$c_O?x@!nTHVdAPg{#QMiA z?cjXFRc!m@meN7o($M1VX9MZ!3eoa{nW*i;Xc95ASmdHuM)dUz-UyTy9@vQ5R%-qE z5SB`eWm+{B1NzG#t*(TBjx_WoUXqSkf`Xfe`_N6`+N<6QbNgZfP>_|mHA-shexsP9 z*jOWhAAw8F0h7PkgcWR>X*hQ7bXB1w<6CUCx4|E$mEj~aI@<)A1;5KG31cz;G?E}O zdP`d`hYbvEcyvn%*5P}d2N+dXKR5i#E$yJ4T&s>Mia&Zf3 z&H$*aj71xAx*iT5zKI`emXVrglMN5iACePYuh5i;$9d03)G`%>HcO4kLZNVR{}q{1 zl2A54BGb#q$W$Q;5}Ar-8~fuR+S7e5l;)O(} zAC(R$S1Cs*ui!oBZv7@eRdli_MaeR?b?o;zpQk<&n>f&C_o(yvj%NT(6=@ zY3lYlQlKa>ts#*q9t{zVEOm}-1huYfM?u%u;b<%x1?mWzGpnuT;fp#x(6mSRVc9dO z-Ori%0S}cI{JB!J1h6CiTw>KV@g4czaCLU5wvvLD*6~7r``_gpTHAF14w1M zDt!36GQ~GyGjH;v!&7J#AT^X#0>7$fk|kp_IokcD!oJkW0^C^`fJvYvNTYc7O@O-T zWmnGq^U0{g+}&^PQ~W+mVDVn2B>UP_&7Z+d3R1`V9;P2ohwuyt9yf5%!^3_GbN5XI z&e5nDu44&V=NKr9{d`kV;Q0)N7typEaM@g{QtXWRrY^B+8^PrDo#ikB2k8sW-Tq<0g$=+;8L6!=EOOu~P|M(Kj_XwAUsl13Rs6g`eHuPV| zDNM9w8~+TT#~zu$3T#x0!pxz^|Dm7XQ)f;GTP*rQ&_?ML<*PPn?YtrVs%9U;^ZjC9 zrF`EMT=|JjUHqiDFv4^WbX;!Lt@ENWh;^UqUy*dcFVKRrB|-iSp)O=b?1jU*(eRQZ ztwMK2hgek-P86n*2NE^rMsaSlzeEp+e3UZcxp7aa=woI|S*Z9gxzr8IjJ*%-E!G@X z$ah(6%N@Q!MV3rQMe;L`eJxqn9gSfGtR;VtFNt35{ONEX(`e<$%dKatK3g^bjiuS< z(_d}sajcV6j9NNT-g{^~6L6T(_aE-OnEv7q z7iqfs5>67Oc2D-*`88Z4(g*RjE9)}YE(X@VAf`_LRH&SF_rn5nQ3Bi?xN!sw*PT%` zxmOd#T8!WPntYs4T!|W^OqE&6F%Y0hw^)2dOQRBBDA;#ZBEEiQwX+-bY~V6P?*>x7 zDi8f!gxA_v@pMdRHyWmnX(7$2Ci2@OJqP7oj%X{o0-}T03>(O!|Nq z`%LRM|I(#LN9l8b9vV{))$Xo_3Ig-ufJSqQtai27UrQJO26mxc>`8BMQI zvXuyK_m99vCyz-K{a!O4l2vRk{Br;ETTFuPaZ7Wq#`I)LTJDJmSv7oUSlVynfr|A8 zem&Hmtj#Z?M5aW5L5zgPk}wQ;-*~Z>(w-^p8hC^>3Xf$D4%A!r$vmQ?n*X=xD1t1J zd{kOB_i-OVIX~P7B_$dxZ0ZRaI@#9CPka=yS6lfajVNRLqRDtyacmE?Dnbk9HY|Qz zpM@;n=aFbRdW0qA1eF*c_aTm_&>&W6?ONt%c%L9+=^?4uzy}$negA`wl0^lRAUQ+B z;KT{udG@koMqyB~^j^1RJMBX{Q}ujBvd7LeSe4R{Zkb52!W<8>RpnV+44D&yG=Qr- zQ@q?*MaW=*=jw33Gt~W?*F6`h-ZY5~IOkiMS1MpPkXr=k-Q53iSWZcN>$8-@Bn>;LlRN1A zbB-vv5zMZk+e)E@7&2$PPozg-#Zzcn1PM*2LjH!P7;+x4rSC1=H`Qew75@oM-BsR_ zYePcQpl=`k_t12WNQtzSs9R`ZHOIxF3I3Yrv zI1>NPj>^KLtE07U07NyBTU?JP)%{kIeaXKbBcDGo!EH-a2+V{XV}yu9hon2>DrY>g zqhHJ{yTnR3j9V+ABj4<>b^4$9^vq3xAyaw=U6A2p^vzx*Czx#gh>Z{Rcbx@!!}{0d_{^ zV|7|pnFa_uYRZr~0IdYyS-b5k{kfrPEFneDEd9xN2i`nK&Ir4`zmk zu%i->?C83J&_0A6)p={ahWX#w(SfMU-|VO~ErcD-gs`JVN2S7;hSfD(bEm(g^H$@0 z;H#f`Odar_>B#G)9v?3rKcb@{)3!AgZ8@ys{PqfKmYPAyI#YTroPASwaA>roS2 zlK1Vkv8xscyF0j|SV!ZcTM?awvb9kD;(b6VE1WhHv1lE&!=B!$){#ecG%NU{Et-fz z`w_nII|M_@#YmFRM(m5ms_ZM!S!!ZqJ|toa)T_dzB?qB{Y`{WkaY7$9*E2+B-q}T> z3hJ1X{<9rf>-G={LFz`yKh$M~ovpIRXcOdJK2 z%3W5jt^mk^qLy9}DF^4REfyB@s`kceR%7Kv13)#O%ivo)o>8%{YiZP5=vIZqI`+CR ze@fHJk>FCl04`Xdls_-W9*ZgD$1ki?JMI(wmmRJ8uk0xPMG5#zMB@-gr=bMMre-P^ zr!!#2C@0GT-$FRVkc$1OG)+heZTM4~4#BIFIu_-Gw7tB;&emkexc?zS8W52Y%--j zOWI~2!xR2-i+;M^WD~7z`vl#m#GzJTo?cMeRuCVG-~+O?<1AM+W9kg|S|pd@5!pMB z{iGstOBf)c24gd3XQ)C372<9i#~OnaTc`T#VZ|o>GgdH{P$3PH`mcnhG^vbuh zGU<*W!Zkrsl(nmc!JLb*qF)p)nd$k=i%~VDmY_c3Km}v*Rz;%JLiKZeHrxj1^g3*$ zAb;~lX4m3o_IU32Y`usYq7?3xD#~-FnQY2T_Ai3odE^)qpC{;qHEIhovB2>y{y3Bq zaqa_oxcl8NCeVq*Z0k>!--wfH?TvMSEs2hrsCQH%!=SJOk=r8{MJY(NmKTL_isU_B z%7^MMX&}VEf+8;}MiUscU$I_NSc1||rhjJWW}#Ik7SsvmeTkBwdDy-hlhYBSbP=iX z@E#!{KmWNo5t&I2IRYOo4JMiR21YBF>6zs>6e8O`!g~~3yox7yw3L&*qrv26e4cIm zJN%#+gdL5Pl4_3R)I%QXf;n#uwep+M)GD}M*LLU=egXV9cJxgnT%4qg^7QQN#bY>}U*Jsfd#BYOlg~ zOXs=nuq`GDEVOsBror5ACxy)W*f=Fto*S2wP}Pq508wyyCv54G3+NAG*(dHVPy*fN ze?nqn=3E#;ZJSbhvdl+zl&+Xiilu8^CkJ4s8QI3Z_KL7wmKL2+>xAn(Jxar@Qqbn& zTli&{WqZ6UiSn=-(|K}8LY6~@`pR#1l-e7^PSuSdlfaFs>YRC8)aI)dgdIivFYIW9 z`G+?i?jggXvJQ%RI7UMM#*Q}qW=9zy>?j8?2Th`So%iyI9i5EpB0yFbpj|$za;TEd zi^}UU!wH6wKjNL9as3W@_tyU@a4y`!{XsPSne5Vl_jN8ARo64cH1P0MeU=6mazJ>AaksaltUPAO1QjE3;$@X4V@rb3LIe&$!aJraBN9DXhSmBh+B{|>CfHX9R zp8Ld(zJLwOz#Cinnqseq_lm|ko+#Ty`pi({p-?bJ@C{>%W-7}_wBb5Ax}XN|K`F%S zO=jB{7&SEHpMxwO$gb#loPpkU#k<>6>*G5x3em|S10udZdOOF1)u4Fxir$r?N}4Te zGl}F)2A<(gZ0FFd4n(yCSk?Msa z*04ItrAaW&6gDBLSQ-`>zRkmlvtl)sszue)GNWFpi2-Fjnxl9X%XD(9$ypg12)4x& zK4+V&M8S=-Tvsnr)m^`MP`@k3p0KA7Eo1UX`;ji^v6+mIj&%H29i366*Nqvy@*z_z zYsnEC)F40Kf_%RcK1Lwuoii*Dc~nQC#e|~fIbJBce8+f4$sEsXiX~c40^8r;g`}-; zvh^_|0SXZ5>dO7rm!*K0I<~Ai?1G4RP!bCY?KSScKNs5`MP`0aL~nfm{%N-l1&X$& zbaVV7ZvZx^8<6D<>W_u34%b9sa*L1w1ZI*RDyb04Z4+TuCkN5!n4u9Q$}15|M)vXX z8i#-%V9v2vDJ-$cuy)9wv-_h`kg#xl5+W(wiiopbMp3spAcr}0&&>ik?f>b}ix%UT zHzjDw2Y;iZuOa9t6PQ78`VTrzW;8j7X_dN}xU-;gf zO|tZZsQNUQU<@T-ED(r7apSC1C`ioLzl^*usBu*PlE8)BXS!t)Z#6gq?c1z~sb^u{ zM+np}4gglc8@BFJB2F)MXw5u$T`ZOq6?||ZZC*+vZ`TU!FD(U>7V*D&5ft>f+vzSK z3w0ubijoEXRaiyKjTW&2*M~x~!_LKo(uy}x337v}c9Y8T#Jyb5ZH<+-vd8I@#6uH- ztWq}_Q(3<3chxxvjPL8$R0QMk%iCVoURAwP7&S1F=o!+oDu*+`BhBTBq-@AeFjc4= z`oN6990M{bU7;k*MMhRmz%yIHQ!wsI_eCYQ=&IE;%SFb6BZEd4F>(q{c7S{S622%H z3*bg$Rf(kjc766aFVwG~fmGm`V&F>^%W=v~re_H_gJ1n>gqPjlg}Z)q=EkcN$q)^| z!9R2zBp7(3*@lZmrWsU;m5Em^J5nC2kp%-icy@?00$XKqMmgt??e}aC9{CKf#02y(czAg^atT<8g$bbN~3q)E+b~`1jrUTJ(cB_@0yglxJz9cj38Y z_-y^!a`s{c1LcxfuN23-1pFfWOy6nCGHVpEXzhszCVY-1fmw{TZS3qBVFq7ay!F@W zB{V8BYbTXo3o%s=k?GX4Qf>mRn+F+(TJ_)TlQ?!S7!lNz{}jWS?fIcotP=4~g)RcI z3uiL%>lgs#d+Tq8&h_a>mW^TGXUX?&1Ytwt?Wi<2{| z!HxO3I!@Hr!Y=>`Au?9?WTaCv@V%IrG`zMLCC5hxG6AuJl5eBXxoDYT%PV7|WW`#X zX8B>DYxV~9IWP@Og@@an*Aj01<++O%_dJ)J*UznB4$`!)h_aE`V5e|YDe*Nl)O@n% zPWHL>Vrt*M{|b!@yP87A-B?W5Vy1`7W4b@tuiMRJxwK;RTzhD`(xJ~Q)}##qgQ%LP zQd1U^F0JRkj2O?j@t`hyd)m?lA9WR-cx()bG0Sp+XE*Adr#X@KCVf;#Wu&&4ziZg+ zMUo9szM)gICNBYcZ^RVr)YZz!?)7qWZ zRNdoDq3rJqd0#q^tc413WgKQI9HJmNB)RQg!aqi))&yPkbI+C-{Z}XQ;LlMPx5rrX zq95i%bqVd37_jcUZO+VX3tgA$X)zL-s3XDRht%J`u1L0qIz?AEUjL9}(RqE~1%)DQ zk;vw)GDa2ki;z<27|QHp6kN;=vYWB?X$hr+uL!Vef$xUbw9@9-`#L&Z{hryPcc4ibGsT_=!LIO-sa!gbspieh-GSqnWQOAIdGAjv!J znQQ6gSf2IWNh}X~f~WCc0;c5Zrns`(?|)TG4juo>mmFxEuj(Z~MYo}S@L(lK>z}x` zA14h|%sUHQ;<#c@Y8;WCfE8ulYqZ1Q4CP^1{hSso*J9swGrogrhS#;QsJj)AbTC!x z#L;>E<(lE_D$(hO;-MTRB4{38k-Jb{VyjD_ZTM(+=$iX9(w@V8osoBEq`a0g-%Znb zL^1Hl8*s$*knCq`?LazyS^P6rMuC+_vXwR&iU?pgsJELY0ehKR-fngF|ihDzMUdX4>0M*zEVc#!w^p| zD%Qg}CU^(7$+>xX$QV>owXsRDtJXP%pX1Rd4*MSZ&F=Z0ksG3S3scj;gG~xEM_$qJ zUKmYzpLvmWA7eJJmc^cXMnhk>JSso8rLu$Aje*3qY0TKL=#f0JU2;JlDaWN9$;D>{&H=iBZJyUJj2gO=QNDj~_Ff+?hyT`*{IQYYP6 zv$Yk;nxh!ny=2=uV@*SO@h#qFI#(wls6 zjm0t=`eFD1RD4IVyG49~TwiODhHydBEhFJU;M@&`@xwi_9rOUm*AofW&bPOw7id=- z*=%+0KGwS!5TJ&Bs|QCSOmkbDDzpZ2=Bnvq*{vjHJYup5LX1UAv+o=D+qm-cgdftHaFF1)QGfI@@TvE?rvXur@Mu z_=mTW+OCO*l}VC}sxc~HFJV(Qc2A4AP3&E5)$Ml&+ibN)NUwd|Y9+9*WM26k5Vv^c z8NP5J>d zgF_>yvvWC|osv<<#xOu4Gh2DLg#Rk$=S%buniw@#J9nEUE9sbsprMgHB_#zsszL>+ zUjQX3DTxp@O=g{*&ulSdT&!F;iv0R1qbz}Dq5d+W)cI_FX2>FpIWQPO?yMrOc&UnP zCSwEj)@V7b7CW9hZ=wPAFB&Oo9TGZ1nP{{YBi{8D0{6;Vx&onCu62kdZ27sz;hUvqqsl(9J=nI}wARhMFh;{XcpAGf zK_xyHt`Ncwu8(yJSQspIFslPxe0o>f5;uIda#zQ^3SMcy{dFLGzxK=j&TZrFI4)u` z4pz(8cPqhZ-RRzpCM`@p^nG~u?A8_z334X?G1zbm)@4&Osql03H z%hYY(k`gBio3Y)ymbh_T?Y>{0-_HtfwkLLM9US%+;^gN*p?Pj;r|kzI<4d{AS}-_! z>s<9=yTL=S=qRF}LWo+RltxoT9@vucLJoRu7bl(R# z8Q($opAP)Fxpletj+4SkLe+j0%uQ=+fZw{GtV*i$xO$!JZaW9cHFnGE+E|7HNZf() ztGVE_{a!OCQ>qeAlG0G3W*4xO>)rh)JyN6%YiH82BFww^)a1tFMJ6j0Rk;sNp^hOs znw~cs`pl({D-%JUw_Knj#)7dx`Xu=j_v?ne7?1C@7oKiTcGV}lr|f%sn^eAQ;IGvx9xiQ9x;p+n zj==sTdG=cQF6o69z3548{ zyg%uxT7i(|DO6Sehq`xct~C1EeLJ>o+qP}nUQs6<+qS)8XT|DR9jDVVJL=fBcK*+< zQ)fT5chz~ZU!8Ao*Ijeg7-Np>cU>1h_QQpL7HmJKJPteLIn;ICoY;Q&K3>h5@?4w) zegrz5yF0m;wO6-6zhSvt0%}OwGKkMXC>kt6CL)GLBrHN7PjHv@-~XD3zglq;UJ%#s z=58d8s&K!uc&KE;kSYsL(%4?!Pk5}DsQ-y1V5p)0yG0`GE1*B9qHs#E%L9VcCVGD# z?Ddat`Mf%w=t}(qv*UbkY2`FeB$!Fl)$;@IqR;n9{!C~=CG+OGX5iwzY&MgpAmg^e z{naP+=-v7LR-?}avHpRZSjfo57iHe&)y3BR^keQreHHmnKJ(-~j>^L&%cbDv^WEJg zaQ^zXbwAXyEh6;KsLJ`k#Hmcd?lgXHyTU8OA7$ZOA%5P~bwhsKKBIuwy~T^pyTGkL zsNB;Ifv2~teN)~1jMhyHHhto~ea`|E9h3Zv0B?$i-xAk9M2OBWMZDYnHI-2=Jr_?a z{=6KIH_r}LjFx>ull1zaFJkuuHr{^R#~yaQUiMYKJuXSqcxG-!L^9M*#_qQN?0NKY z-JMP1ZqFYwMR+OUc`!Y9_HXI@e7uQe+5b3Mx~b;B*x%(bxjTGftvw4gRv2yQz`RUE zNyy+Xc-UlEC&Kc2cz8nS4)kEv_a@j%Xh-*7BPj<%ls?#a8CTE`=<4WfRX?MN-h~Lf z+pA>ww|2AHbzYX1a6Y@fGbGfbc`^BMyRl>H#3Lwpf%KmsA_r!mpoZ`Iq`@e`<>~eO zM_}(A`LnQzgVyK07oU*H1u*X@(}cKZW1ZOPJnZqs^wP{za1FU6wC54m*GXH)mPe_zt71Z-du0& zf}1il!oY6-<~yJLUuOpGZE8zruc0h{Y>86=y@4lIdPb`O-Jg%M{3Gr57afBi>x=Hz z8_$#1HN53lN4FoR8#;G#CpWf%NSirjbpnJU+>?o$0m(G$kGGk?9-(`eyJyo~9d_ZkAGsPPcmh^4;_Y5tuO6)`uOwJUwUX zkdRUPJikoVhzSl{#FlKl))SL_4~;z?0=ocSi0IEAm{JW@&C}d`yiDKf(9}OZ-mb;O z!{qJ<_`Nsy;gej7tcM;Zei+Ni_)cEkoF7pp5c)&(lZoDmyx;vEnPNfrG?g$Vz@4Dg)0I ziR*As2QKgTTb-=lB{Ogf{QEt!phSg}d1k^-sHm8Zf@H0M&h1;Z5DG{OC|n8gMNOSR zAx%QAOFLR9n~0Ym6#f;OB%F^!4qWG1235U(9KlOf_B~I?E|Uo1#v_wN(Kd1JsL#rH zvYHY9Lm53AsuW>%kNo+FfpAxkFZ)=BIc3z51Y>3>6nr0)D}TvsjC?y9p3V8$>oILI z6r4#nd}lX1B0pPWmD)<}7Kw5W((Gys1!5UDXas6(Xr)fv*>j~WpVEkV$e&T3;ckqt zfSKF>l&CIgu&9#g&~O-CODNYj{3By*a3#;RpN?Npg|dipB3Yk*hVo}u#>L40vz&hV zc+R+fsr%*1r0!Su&3B2O{b86atYx#KeV+x(^uB;$t(#ih^Lho8cNEvE@3cysMo9BYyU37b{MO*dvq%oMh`FmkHDCT(etaq ziJf)2yKn3Ly5_Rd>uaB8j)}ccDfXM|LFb!+F0=;S#6tB|O#$H5`~AXZ z{Jt(Yjes}(;+?H04Q~y#T6SiHMm~YR@ zNuW8@&>Z{EI{cBz3{3%O$Qh%j$m|mYf6J3ZT7$1Z+J#n|7RH%epzh2WKy99=WBn!x z4y$*_uclg-f`?8?*{mvR3gm=8!6f*+_M$>12joSPoEOpPjk+|pCxB6yD{@>MBp?=HPqRO3nfl>DF@#~ zXJ2OZrB3w3lEA>0g)QRtrU$K#jUjrFXAIh4;yLKbM*?sh z{R)$p2x<@b$xn_?9&Q(Z@0S4=u~GF!0bo1G9{!meaX6WDc3^;02P9iAhNof;vL>jL zsfuIcV(|~&O;D^qZ4mo+T2 zZ1|OvR}?u>O5lkmt%)x3GOu>GGD15lkWCMe!6%&&vV1+eTI#yDEXwU|mi>No1VphM z&jjE~24g$EL~?A-T=yTIj$y(a=Z~D_6(=LBy~JXayru z-PNQ_3cnX2L$fR6kR~!*N;iT;=gx^>`!~|C^F41nk)Qjl#7$qnq3B!gV*;nN6f?hF z95E#2NJ0o3X49&5NxW<8MbC;lEtR@Ft7m`6gf2}Qm#`!jLYjG~Ny~U6bT*4o!SxS? zz*+35uhSbdqaN0!gx1oJCmqxE%bJT)jh^@C7&R9@_X{4QWU!xx!=rr+T1XqNktq*a$IX{1fsTp*_q+3N+xlS@tPe30uy)3iu0o$#1o#bgyk-f$$!^x zV%!R6b;KHC9YJs9CBucDn^)5zvLY*sRhCF;W?-#!ASMQHT5%M5JP2K}R@uU!_o|{~ z0xyfLk`|r8T_H6}%)*q6U>B*9u~Svg6bY7<(s;6G24&N}V%wl} z(;&0{uWY=~HW%XH@JlH>3i(zPH3TF_=OQHLzdhR_Kq#aYkG2TibZPF&P_R_jIJEA} z)u8TiEVl&c!Edx}_x2AWu1J?;R`q$9?y}`fNWzqD=Zy_$EFAm#V&!QRmAq+StWW{K z7{<0n&Vg7}^^^hFg%I^{)SB$SwC7+{SZX0|nx!?@4m#*oSVS1OM1txQX0tP*{7L4$ z>2~V|4C`HX0|SNU%nKekoq99{?l|hpE6*xNdpU!8xiaYRX7Ko$dNMl@3~azsH4XPB zZcFe${ZeyIkqha}oKB6W+i7nXB<#*cW>a)fcx>w0vX|48LtZlyk^M(vvxEA&Gy<^J z5nTHh$es|b##MayWa%kS93I_Uq5-x-t^|wPd$%=nz}L(**=$EW@LP{5_QNXyqT@R# z;lt#Nd4c{&Ta1SuASChH4z7;Z>#i9G+IDZ-Y#3P@!C`P@n_usz&jjzp)u;+(B(ys%ZXJ*dT{_D0w?z2a*e)@}y$&e3hRjh4&`?KH zQ$S;cRd}0#XFXEGz+_r+pw?dQz;2DHoC=`>>;T2xW8v!xG-uwHf0881*OVJ@ZB!rE z*y$HxfPim^(W#ZB5Dn>6c7Gsi3>!j7Y^QRV*2AnjohZg+W%YD=jwp}+mGKPwq~Yp{ za8oKrV2Ulf&_;Dai}WZl21;|^lV7<=EglG0H!4(UfFhD1_w4QuQI&%7P=Od(*(hEX zY5?tb^22_ZE`2qsmb(xYwwdB8TN}jA=Yvr~x81_U37kCc%!TVeK7nX`UA`9gJs#p! z(~dX-dTy*9e#d))eBYRfp6wHM(m$MMNR06{JUj)raUMlSkYA7|5?r`Q39V?JUplw7 z4u8gd@*V#4qSbUyu#lM$N$(4HeZwKz<$`nkc2f?y&$kU-16g0n;SoWcPY(ElEgU`u zTbvG|_qEO)ug*oIglH6}JH zf<7sUOP8EVL@56xl_N=)ZvV`Vr4f*#9Y?UX4q)Q6G{(;^o>fEx(TwMaz$80>_=Mo{ z%;Xen+kY3s35ZM6rAMK$+X5RF6kqp1w^9O#Af{HPILe7od3>Xk0q75UO=|Yv^05&_ zTpl}Te;X~jh7-7l%as~Cy6CuhC3xGzlB||mhjV2I2<|8yRPznzo=4)I>c^kPVcQNg z8sz2Z8>#R4%E`$ZU2u}hCB$JhHNK_0H5OB|CX@T^gUSnUv#CX=@*|j1;M(e?VGOOt=d6^*1&42+Io9 zv}4`vxSJ`-lms>{j4c~D4CakQUMTMcspe?r1BS+dL8W=gq{j|FYJf~{Crz~ z%MJwyzM2TaqJ3D;L<(LZ2^JD8z4#Gx$=X`@#nGu!v81S^m1?*7ngLqOG`h}T(!8+h z*lwB~l1<7q2Ka{3xKihghctY$t&me*pwvK)+?PR|q9!OeW$p+2s5p_q3`IS;aM=+r zrV~Ut#v;tr=SbDH69@Q(y9#mHS=HiFmnH9=7p`wkmAMS)XCS9uy*0bpLa9(}qzhvF zhH(K17TQ%Pj8au~!%$@5#(Wih`%!)Yp171L z{n0#8f|e=SAaYp^2Ss*PA}|QBO4$wF`E6j~w`t#Fz3(vqSoe5qR#-}%q4}l#oF@8O zs1Zcrsw9WXA)4o|jpA!?keq=XF`%EtL-_LTUWa!|+W+Z;HqUim#xutSaVA{ zHd|v+!n6!VYa2I~BAu)%9U$7w2fik*PMLFD>}q5!s4ax`ajR51QTa2Xecc&pNkIGc3&BJw?Hb&Cw zgwq>k+}oVqENm)(|6SHNq|!qOjwu!{rr5%uuUIODo(l@3Fhjn_PoG^CX?AR6J-L9H zq^-G`L`J*#MT#m*Hf+XbNhEOFj~*uZIaZfG8HSXmq{{!&W@3SyiiF3&)WK+0jAmxW ze@`0G3d%ZV%;6#UV{cjf9|eNG<8k2Nq446`n8lpsd5EP| zJ@7fE|A{hX_RtosibX|Iy8Jrp)8$^Et&<97-AW6k6QwtD5t#bP$viuj}sqC zIAc(AXl)9iQg=NRmKsHvb#PIVx*#i$HL=v8Kvebo(!9n z1Qhi<%}h-Mv3pWsLVyfI9wInhxFqz~y_8jry03zp@BHgu%PHIHmAx903Cd!Vt57hl zQyZO;JZ!BAWNa{Q&&V3)MGAHgXwy!Xv%ZE;7Sj!kt!^$jQ)|C3b#hKo;|u zCDtaw5A7EjE&@s;4xBn5mKp54}-DBw!!+| z>aje`Q%klY*1bsa+8!kB*20`z%6ijVdPHMqQF*NB?8=5{Obr zMEF$#r*XV>K}azSjoeBuikKukP0|_)FFGY^IJ(I-CJLBTM67cVV>Vqfln&-Dl+_o6 z<9y#Z-cb&ho;sk$f7BXExel7;w!dS}sH(#A5|^)j7(=F&KZhQW&v);-S(4*k9|$|P z2yd-X)B1z2CxazHuGSENDku>f65$1bcT8s>6H)k*gvig*t(8t6b|y|m+JU<@hSAN6 z8#BqThuEs%nNiNouhlvuPIKv^S+$oVre8$Edpu(&m14&5EEUUhg>|3t=vilFmzEIW z$P$ZgfOjA|7#U7|8q zttOx27FjMIF-gZ=QnwN!;0b}uNB`#oma?zezTs@p<#K3fxJ>AC8Kha=5V+q_;W41{ z7CfeoPE6Qc)(v!Nx%y+}y3;}lCh&W}po?c-l`6}8LvwS_v%xp>!#mbHuX!5yP7bx1 z`-MO5cTp;Rw}s8rfp#d6?&`;wi(<=ibsCiz3NY@Ys`tEB%WOrvMlj|u;xeCqiQi;< zf#btADQJ#$egoJ{VkNTkuSM9f z5r*f3B;W*BDO~R3qOgq*B27qUhiPnu?Q6;DWeiQeoDT6%_<3YuvyETx4Lv{Ka0uDv~|jZP*SBe~$t zKTG_a6M56a?WmsBm!DOS$xwe|mM?loOba>p)j0{jmWuVrP7ETQd3J;`O{SMd;WyAoogJb zJy&yo={OvQp*(IawwO2S#4<~gdNXIX6npC@+Cq8Y+T@oV$!`M$zaNM4bouoc%#MyN z#O2t?`n*3=owu!{cpB(4-Cd|U_iB--uoD}<))8(nLOPSaZmKs`0$MB6EnX6O5ukr$rC~N#v$zPzZWWsLC^(RBW$TNGOJvs#Ay8)QALcRbt#hOeLlBc4mNlh1VpN2O^%xW}ucMj_ z#sjyGj>Qg;K72Ym%!%j3C$0$njsX4D#+f=F_V?dD|4z!m*F}S&as$oBHN$PQHzxei z!GWSiIl_}pt4Tftl_4w3)U=KFrsv$u!~HCFiJBwpI^i#4;pnUI&wr(p8a48x2e+&FV$u;1OVd;iG8ChhO;U z-fksSXd9rY*7}v@$Rv^j673sZdXN}DlEX=r zck_C1QavZbTDn7)baki?&VjSm$8s!+?*wR87b)F~?A{M`_TvNac zX7X@=A)AtY?N?aHfD9fYDVxrCY)`rHy zW6+HtaPgh)Z=lM&kckaSCElDKSA!iFbS)K`VTK|WrQG;whA!Ft;|>B6gdgag0etQZYU@M=|a=2j7n z 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

=V3xYb^s;?`ZC$HXP1t zW_>)59LryQv1tV~?BKN~v33-IV_E25LR>KN@}@>QJk6Xj-jlEs4fUjB@U7SSSH1tW z0e*a*cBYknL$Y4Aw*ryw@UPmdEQJ5Xhbwe!3Q-%ZH?t(+6;#jAVVRI9-Mnul(^IEK%=&EYTi zmicwsOsIuI3p#Jtgtb@5VDXX z9s_^Pi8O|-edmW8@di77P0u*4JwC`>(!BEib*zA2XqzkHS;{p65TJ4z$mR>)O=Xfr zJ&!)I$AbbDAFfaW{PXQ+!F>0J-LP88fN9_W2<8xp%_p%}B$_a3`bn1wa6Po3b zi5rmcC=jBQqD#8n?_EQ@k+}*D7&tHXLQ|P~1Yf0rkOjP?Nv`e4BdKZ}Q*jbHl0%q+ z1e7GwiL6$h=539o1Wx7q80l#@zUv!g{kis!5N`A^=xIZ@l2RYHt?`r9%(pocT}F>? zpX@yHxX-TKylw{(G9>R~M%WH8Hr zcW1468x7y(t`B|p`_k}!LgZS(*AFUMP{taB-{s}<@V)Zb#!`^p+UI)g-MYLU@Nw&` zVy$wVjN#8PaPYC8f|~qJ$TPtWh&NMZ6PitBkNy4g+g{1|w7Xns@o7bPZex!cRTpN@ zwv}bb9d6S+-bjSXVKv4md=6gGqFEmE$_wN8F$3Fd2C?(Vcq@+B z6HMQBJ$yyHJlBkW%P4I)L&t2+(MYl&%taD!KM+QJ(eM$ytq~3TuOtDqxUse0{^G&f z0na_T$WQr05RgzM5R8G}iRFM)iS2^HmWy$@ivk;{P0jW20unN6(%_AC^5Jc8&qaR2 z{WZtQVUpUq)rvx}r8dhbq*0`aq1?yk!#jH_VBKCLmQo;dfY?g19HkqFl22(u>Oeax zzXP)8@5;BNqBJM3p<-c}j*B)PP(&}vSFDWkI-~O`cIuzqxX#MG^CwNvh_jGL1LA4= z0|%OfBoHy~^Rt6!JjoAx<(r){QeRGGNVz6M()XJx?bn|;Fr1>{=sXntm9P@t+v@Gq zA$*%3!IEm1gH^dfa&D86n(HMmhk;{OvoR}mB~phyEs`#bI|OA>Z<5Wr4QW}pC3@6s z2zUcKdz!U=o=59%nrGK5iwwF~dT6l-(CB=KU+)H!JEN;cl(vv_X#unFnrR6IyDusuv=IPXRV;RlP@$N+xF&*$Kc zYjn|l{E7bHK-t^AJFA;xpx*1}t%KjO0=Pr%?n(f5Mn|g*Uv2I2hOEl`m^llWE3E-t z1kwh6a&ZglF65mO{h(IW6nyj#CBUL@q;le)4weEffmdY@n=XkC)aXSDL`bCODua=J~W@Qm~ogUk#>$IKsBPTuF&;SlSMbl*pyxjKEdvSZtM zkNp?tbYn3=n3x}D?n#>u+eln0bZ0VWy(mkecLfIc-*jF{+bj-{oLlyt&$zB@ zD4$QO_AdK8Skf^g)&g@Mt17932vuZ}mr{O=dHZ~a{XHqa(r zgGJWq==U5Ot{oG(igxYz`y;qiW{blzCY_ol_p_#>M}@U@dHddr8sQ*c`ihicv7GoW zimL{k$M;jzf#ndb4`54l40Hfp0qNnPBVmYdHE%R{*j_%|^h~#Xk9(@7WA&yX>tV*r zb9r=A6!%nW22+q)($7bJnK`RlMa{;7Zc396r&pGk_RD;1OjuH85c|uV0rZ-;OtCrq z3G1);|A(ft4r{{w!v5%PDQQWiLmCE>N~5Htv~>3<0R`!jPU-GuNOws|cQbmx#(4Mr zz3=<~u4{dsbDsNi?mH3yM7tOp3;&|k%QTpnONTC|tYuBxC^~tOeZ<&XA*jqBVT2d)(rmiM!0HL*ru=5k&DS-e z&LuD;{MJ3u?4+r%obandJXvxMJ9_eZa>Y$4Fm#<1y*lBBjo-j8CD*m482 zJ*9`CJnt2T!uU@YQ&78In>Ux&3=5Dz`xz5ij-YmLI@%4Qju^(gqOvNLubEQu8~BDU z85zF=BUggNctMf^#>+yJe`xYWQlYgQTUE!JI{9hTqF?nC|OTrFnI@UeiW^;7xv$HaCS}+>As}kK8PfG z`UHA9iM$1okNO=LJBP6*zI?bJ0@hgIkS$cU$)9Y03C|o#amk0}KtcGayXDETK}*fH zQKR8_2V*7DzAdWR)?7ivt9R>AkWsVq#@Xy(dpf@6X68mfM)!v0?5Z*Dm7gj@uK#_CpzY8aw$eC@}vZ--W5eXp#$#196o zsqJjGVW?4uf{T!O|TA>S*X;HN5#Ev51Ko!)&PL+(d|SO!x}dUh~IUHTAIFVMVgjTQWM_xeP5 z%SLX@^2pSfr*^#@*U2N1m z3@|h-)?ogFJQy0u08+H>i-CV=O(K%x2=P$aoMsvi6h2SZ;Y>3#b@Mr^D|)xkxX?+` zb2e9EAK5szo<^h({^(uyusF5aAZ2oZ0=F%L46-s?uHYni@wR_v`m0m!O2!_3!Z7$- zB}jDoq-X0BaH9%%-@`zYdkTvye%8SY0X;QwOS)J+$@)!R&i^r`^*i>aN?u>?+ZEhN z2~rBGek5VL4@*IbVhn6HOcC4^vSwZnU5X(z!{+K5CGc>de8A9`Ibm{=8_TN#9$LI8 ziVRrrkxdP~0d%5)HRfD&c7TA*%kq0d0NF6XjhPWo9 zJQMGF6FNm6y;^GB81OIdj(X@7-1+IP0ANmFkIbQJm=;d$6PHneW2_8WGi5YoJU5cA zfEt1Zy}{sx*^9w@)KPUy4m5aU$QJU%Wjq7)kTt!%8pP^mVXgJJ>L3CY=ph?jzQDUS zPq(oN5fA$SNt;|Ih&A|9mq?HFSSI)D3{tJIwSlRqdA_mRYvg~R> z(@aidwWr(`!UqA3c27dlvo(C@#q1o$5>F;YGPQWSlFl8OgY*z?z8ah7$B=+eg+%AP z-boV>qT-I3$d`Da!5HQcq*Xd}Xb;@m=VW47SeVjfWURj>#Jn$ZV!DQIwn!o}Md#fq zdk%V*$O7r7sa>T{1t=ik2PHy8+(Us6W4V8<|GDX7!7Gt+pZ&`oOvVf$%Nf zW@UqBhq{1kV0RH77wEuR>%&P)R_-rvB|Kwmln9KML;A^jpFb~Fc;BQ-Y?L}qyOKD% zb7P_&>KliVDT|r|?X9oaK6s3!bp25^h%w)=Jsz-zVQU;S>AcJFn!ws?1Sm32?iRsXkNZO0UEB ze7amo9EfyT(9Ye{!2~N*j^|^NlHngJ^eQcSV(I9uOdp7j{1Kq-uIFCHo==s)R^5G( zmsuq&vxqH|XPF>iU`o$k4_f8~x+zTV;^`VzdhvSb*R$f`6ZMqXv>8F8K9bRx8v9$e zGf!^bzEbDtFIHJar%imXqgNeOi@Cb6z!V3(Oq}$lNegXAH95oAc4rGHS>XiKGp*oBt;^>+}?<5AHP;y=K?Z;M*soxoMvD_S0+;=ZH#u>7e1acfYT6jr$&H zD2#ges?Z*{K29>RN~i5w)PQ7T`|H<-Brijafwx{yl1oP)n-JqH56gk^wi_B3pAS!9 zCoyoYpudjsISZ==BXJ*ydJwC}=WUDCC`bH9b;UL?oYS9wbHlW64G4z`pv|Dv0U0SA z6i4*Z*L=xQq;R6(kb3aHWz22D$ zf8&PAAv7sM;D}!f8uu30kHe@err@)2n%+W;5*V9F#Eeywp<;X@;yg~5Yz8xw>{g1y z7VX9mGbFIlO<4}9cp9=@C3+)i!5#Ixr#2Z?fgj>Sdo=c5OyDVB$1T=!^jX3S*g*8u z$RY!*a5Vt&rtLt@ThZ!`2}{a`ch|8Edd~m%0)U|{eOlo)eYgsAo7YK58Y14L)bRW9 zJ0F?UhxX%0GNxb*Qji7!W=86HO`9l<5su=&IvrkS;y=U)@{qA$_~HLs4r?l8j~1E3 zcJDb#w^*Z@vGsVM7w0^WGMUrOcrVjSNG0U~2v*j)JjBPOJr%v@vy|N$mJIm$Nj<|u z!Z3qfu>LapBHcMkC}MpdD|}%`s)7Dm*EiCiQ2TqWN2N3s{2|OvymwPn=^Y(Qc8Jt3 z{sLWIts~~+xIe*ZT`SqYONd3=w4~ejqUd`&1M_Xl?w~s(ykZDBzq#jcS93(7Wf1Sy zfS|fykVB8LrDJ(8%|_cmd9p=-MzvqnZTCX4pEVT2{gETux_y~JBJg;wmJeDN7ie;F zZFPR>g=|Q!o*+R4xbhmy?o(2xZYUu1i$K_CQ(euKDG;LPD#jVEIYukt)fjNY3`zZ> zU+@UVg6KdK8}*^t&NPc%nZk}q-aQ99`j)>i)|(b96JR}VytbEg<^k0a;XN(gw_R>m zESeHO6-=Svo*-TBr^`0~T&F=$G0CR)qA^42M5gzJR$o<%3GZS}mtmDf;2y%c*YJJJ z;GExjVD1z4zI&RORe@z?*0^Y5c=NM9{o_=w#BcB{V{kOG*>3v|f#*kpA_9P}*FPD6 zx=2$JS$*b^F|+L4+Bm+Q>}Ddd3Dn7}@r_uS-u7xei0yjk@>LfkP^W4uPj0bYl;>il zfa|5%yt8T|g?=S!W=w{-XXtqF7@c9rCDvr2?Pb`4ae;yE&B58plWtb(fbY+5s6=#2 zWG%#;k)CZaolNXu#)82E?3r$}%h<>=F*<6>XE!;!&X zEvmwkYeDGSZ=Z4od_NSVbX;Fl{+eC^+Ndt26&2V2y3jv%i68MW#SbvxdM-NTZsqlI zOnB`8vsYTK5q(l-ctCn?%K5G2Ds`9mXdoaqjJr0AM2~BC+c2D?8P{9$r^Q8RF3*E| zr8C;EoIoM85I>6?6RTG~kg8LWx_Kc>(^1f<@9O`MQswt+cj0sOsUG8&OlNMd?g4%4!5X1Rm!P#O zYOTB7V4X(VOwIQ6%m8I}Nou%2Y;SzNCTgDys_}HDBs{Xj6S$ce-GS!l%NGwmTiI}# z;EPvW>Q_w!k0i}s{fW*L{D{~kr^?b^}IXjRxa)xR=j`pOOYCKwiN_3%{&!AU_XVL`|c`CjQ zIaps_g|7B%cbP+h%9eLMNOhk0;P`Ki-KvdS!Mqi3lr$FcOBB0RJZt(<1;GTzigek| zmlU&9!?b=crEEWBWA*yAdI=DX75+fF1irK0}C_3Hy3I!F((2Mr-K^bigDj`h_}y0WHV(5O<{0=O-mL1N);s*;4PsHjOzZ z^j&3efi=P{6&0K}gMa#C-n;g10|mby#XMOk$_H+n?Gh*phyCssjJhbsQx&oD6Pqx; z(KqF>b~%pGHLY|DWG#9U7SFY_VXox+??gps0f);e5U3hiXiv(p9#tJsZ_ZSId^Mrm z?$E0|w_z^oe_73|$UPql6P;{&OOw{>qgw5kKf!M5L@@Bv+Kj33;$<)B9{n zbFjEu^+j-ZAu~`F(sZ|;Lb%$%U-GU5urE4b=ib8`-FwbL*%S}m*K5zS{s=Khr-Iva z8YBUS48;r&|AiI`hzJ?Tly>lq8$jB9vc{l8%v>mX7l>gtP*L6aiSqksjUeULo9LaC ze386YAMH{D5ZBM^CEmLWLm1o?>w^J-X_clLzxA(hCEmov(MmBX$83ac`%8DUsEEv%sdD{QZX-sWz_|T?4i-Ty-%(&t4z;CMDkL5Og2Q;)*(g zVYisI3(I1#B6<(1M^y?@6Dhk~*)^&ag=7ge`9Em~HNE8$`R}9OVhR~-<|%XDCv3!V zAF>|v{WvZ;HaO6JKDhkTn)cpAY+~2PDTrMr_+Yo$stdAVF`sgNKZJmXPKH%?2tUy? z9Ev+)tsc0Y>wI1*rO2CS4Rp<)l(oyxW2Z#wio~bhh9Ojq9OHaWM%4S2722;xlSIMs zMA6IP;lA3MV7az6w2*Ic(#<>;C{}A?^zHof^S4*y4K$Xoz~%M;!-;+wXlJ9m?@Cp^ z|GH`bkV&IY4t0p%s}mg$gdV1JjbCd6Avwi3OKPh5T*VU*8Tsjtu5~E7twADV&u6FZ zSCV}3p_Etu294bgr(Jz_&KA)<{9bbe0HQ^;Io-s2!}5Bi-n1WP1DTYLKTnw8K^5hU zR{`DQDAnTS(qDpoadn-2PR*UCk2$#N3W*L1L)Qa#yFX7%*l=R`&!fYX#+nDyBxAZz z&wmZQ$ZJb~`w|?7g@?VL7o`|t*V;?^E8Ua3@}96uM4u=W#ek=3{x#h-XBYqIA2%xf zv`f|R9`@Q(c4n5JiH{olG!+q^%As#qOxgaH3N*dFp3$|eM@cLZX`EC7)1kTZ<)YsC zyd?qbnKNK0lu4NHvi^z_=R3}Q5tI)t24L`hHUCQ_?pbfSp2$6|uX{6S&W}u(w>4MR zMYY4aXC2D}K5snl^bB_g?zz}d(yb14BKs=dy7e{tjU$h^Q~if=^%bIv3WqQaSBe_C zq&d7TEfoLBLa$L}k@L^4R+5NAK(LQ@p3E{6IPTBQJCER8lvjrURD+D(K766%s!(zt zPep8#)6F7QLDZvrhMJgX{)->as^1H1I-5Iyc0tdsph3?;x6-#rhfbwpsTr<&gJ1^#i+>r057UuAPNd0?w#j|u zc@P8vmbj&}m7CCH+;}#5f&7);yZ&^$nr@m$z8G13ZyxWl4%+iLNC%`)TfF{-oHo=| zj`CA8Kr_2sk{fcrNOX5Z7kHfHUHE1))2Cnp?SW1_;GOlKH%iWEC`pYut}o1hZ&0bP zuHCKR_cQk*ilbw3Whvk~i?Pi&zOjSQ=4!^ZVqBilu(}^oFj>6-ope;LJWu)2#>PgD zx(NJjBbvB@jD#Qe8$_8)dSmKn80Upn6>~BBEF3HR?R+ZLS&I#~vioQDn~)t;hH9@o z%jre0Z#VyaFP1szhT`o-|LXoJofrQcPmH!ME^!`{w4;jk*$mN*ngj+VjA!qh1k8c? zdILXwaYq>7%P<_6Umr{*Kf&Tk$Ff6FQIByw=qa2*5F1YhTV$#udo;y_u6U54^La}i z*OdjD@7@+M>Jwa#o^*>T@vS|NOBIn}2BLk|Pk^Y3Rzml+#bEO2YMY?tSFnI*(0umD z-j$1B)vZgQ@6$gOS5FEN>OVqIyQ7>mp1MKV07SIR4LLOovMifhAxn!JvZ?1e^rVEw`BUlyA75MtCgTZO1@8lvW z_zMB1Y(rrw*=GO7R>Kh7Y%KdT&HgfP`Nksy9)pH&B_Dd%E1BS8Q5SA9SiwC zTg7Clhlj}7L~3D5Ooif>kt3Sk&_U`SA>6Ggzy;+k4r2BXUDdL0yKqt*zJYqm+YPcg z)Q}W@O_3MOd`gz}`Ii@Xn#;0r1CR6PIps+8)RWq`?g6{AFelDxCW>M4(a463@fXHP zpjfRU_A59u_t-b-cuD@aj%GQ0=HAfbLZ2yA>a1dURJaQ^UyoXn9A(#=hzkvT9LpC- zP5M##vCe<*3DSX=YP+vc8?bS3o~A_q6s^gmJ{H*Pktv3LZ}1+;{yr+rHPj~UyT1Ye z=`^$8mBzU<8VVTq`3KtJ{MQmlUr)O|Mqiub+8NLorph>xJ5(soCb<+cWm+tEZt}`@RsT6gu$5`lG%c<0 zfV8vos4aTZ#_yQW9*33q1EVWWqwvCqoui%Ef0~@xXVwL(E&CYEV?}w5s&05uzuh); z#e(+Uwf^FxSPcE&)Kt1DUHb>YD8Wt{D8zQ7|KcKj;qLtDM$br5DUK(J7qmsTR7*YQ zSQx(9%AOmb4!Y>eZF?xu$VH`Wd?wsn5WQ&#tuH`>D_>MOKbOFfP8n`?XA{bRweF`g z-myR7*Ns2d0r2xKXqa2yNlnZaVQN?sHO9aB(2dAfMmOyM;7?dG&f1nXTUFJ*l;-P4 zF~C)INQGHV8qmh*M*0OZD+~bxa{FplW|*n}mbw6Y?@{*LXFFD#JR_}yMmC<-od zf@zzlxqDhfR^|7;h#g*~op*ViOXgiS88j4^D)juJO8rb)wL)}mUoFLbR;8vb?8`RX zstTNzzyWJc#i@=;-f`Q8s2sxBfl z0tb5x;=%SBOHQ_A%aPv=b3H%Ko+oZhGMKD5LNrnH(dE~!6ob>E0VX+_2oQJD`hYut z*M;6=Y(no*cnp>+2W*Wy_a54kQ7HcdLEdw-Y0$6OT>K>*NAZS8a|qg~r_K~A9l;+Sd>M8Nzj4L`Kx>MX=24a?0Hiaa2DQf(0W~2j-x7XkYWdE?HuI?L;lgXe3)__J~9k2q#zUJ(2H;6I#V#Wt|C!!g>vZ-y_&GL9%5L!+j zv~A@hmd=hx=>n$T7Vt~=^N9l z=^%vs+BxXpGf^vJw|sA)gDv(&G_;*eWsY#+$iTrS3mY6K)i5!Y;h;2Dac6p(?NSql zI;xagGljH1C#B5{Kz1OBcu1$BMX4c_D9w2BRI^`)m>2GtD1sNi_}@XYeXdEzfAz`^ zidg0;(uv0p^uHlPAl1mZ)2{s4Rl{%G^ZoKg;^_`*=N3?!M2vr=>976T5`1T$Ev*s} z8GSG1aK4cuyQW)i<3#tnpIP?RX%xW-Lz-hgOix>W1AvYOFes+dKyvU5$~8QNoJV4t zT6`$(;I|FD!_+98EvGHn-KX?`A;eW$$(n;bPmg~0UDFf*d&yX9%mkUN{N%RSAziM! ztlaN*4m(xa9i%ZWvFb;=@46aQ)c?~_l1U0ljMf_sBU;CDF{$>d8$n*vUxq%oTkcmL z=9SVox2jinUJ2~gum>|3emjz(Ts;J-fUZ}Rk|TmBcyoA7pGIvgXLoUCXIEco0Ix&g zi$PEC2x&!6_n9;=bDtm7+m4DCN0#_4P8~1=IMd=lH_~Mn2JcyBir$m$&dyi-eS)M5 z+7y-JMh!9#?Fm(nrE(|o_PymBs@7P${w>{8ICX{e^{z_C+oGuh^kjDs9>0Ec-TB$1 z+`|95JO3)RdWW#@3!_Fdw}B+3`w_Jh_ovewQ3DKCdqGQ)59AfTzB3}Df3Ilv9b!_* zXIX-f+8M}JGlzAB`Bqp{fQruzK4$vB^AQ_Y2}iHrzDXjLkB^a#V9qu*;K;2Gd-Z4{tgSIh0sMgV& zYrr|2b+RPlU!ndY+Tk+b5=W+-ka0@&62 z_>sX-N9B{PdAG^?;7BZbUk^I2PWAZtG_DgJY9=iY9Qan;RJmTPk9+%JGHP^g6W}fz zy%zFfKQepinJ(mEOLWT|6_dWP6(37-mb&>*f?8yYT9W2`Z(zS&VIkx*+b8{BcEifx zF9ZS|vNIueJX1?HaoFc~`Tl59SXVxA=T*FKP`ydC=ouObuR{EZ6Jnu;Jadk+Y_ouy zELF@Qb6a1HFx99LW(~}tlEHNB?-uR*=F4C&TY^e5a*t!d+gEIHW9Uv?*?u9fh}8Km z??(8J>W=ps#0reh#7D;*&r5R}>^?+dAOEJZ*-nT{zxfj4Tf2a@M$eqy@1?b9;{u9^ z4OX~o$f&-T=`X}ThN&*+Dbh3%mIQ`|X~;(`St(hn?1ZJfe_4TFfs6bd=cSQiJ5g}uBs1&0jrqFl zEDs8K5yzj(!edHB7f(Ls$FRJGY9-GD0DVo9_#8`D74HpSi8QY&__uf01@X;<_W@V) zlLF2p9n*@9O;dSN*P-1Sy%~MhY5R{&dSjGkw{d}LLctqw40j=Cv}C*IJ7!pS`5X`Eb(N~!^TW=l7oUa{mUE$(`4?bmc~ z%jK=7a@g24at47An#On3V)gnVAd8{oEphF8_y=E3E@OJMR!A$VsXO49Gn)@%!?XLZ zE^Yi|v+iqJDRo7SY))SV*5=aE#bROoX#2a$fr;RzR=h`BZl13S@8z{G>l|Sq2M5Bn zHfy12{j$wS9X+wx>u75en5?{CP z(S?qa<65(+tm2|+P+9Vy41Mu;XqA&vPd63f&|(20o$6V5r}KKfUWil6y4&yFJ%f|K z2-Uq|D5OP-WrTylRSps>k`6zw!Bdv&HT(Y13iaS8#sMq-s~t=@c)L zrVB9&oG<@rnE;+vV)&fq73`>p%WR1hxPU5~=nJR3-L2GluK{1T=sQGu4R!w)4b%Gd zM`(pHhPyK^KJx9Nv((x{nSA0o(m1R2Uz1&AhckJS`k?d#8CDjnoXevTkg}BOMM^m>B2M(+siVm zW*WcKNHezL?DOxNMu*i>XW7s=-a`9%Z4;FF>@1_8wvr@%lYzp<*QD6rpTD14w6|~m z?o{Q<*{V$I?!N?Tr+>UIt1vAQ9sM+>I5PtP8FtUs8C4k%?l*0#vv|x@e8GP1kC*v} z0)lj&IA!gxzWRTv;(A_yPn=rGBjI;vv%IO__NWXajy6x9h2iGXF*QO;cmY5+Gc5U32&Uu`$_T!a(}#XFbT#>?z*>ehy*RbYYN@pC zJ+-Oql=psL@%}eH<+YGvx4UQQXRub-P^)P8YxI3J$Xvw2kOlPwv>9%rSRfPN7)tzX z-6T{%uod9QV$Y?V{x~1mbzF{~XOnF^9E(_l5pV1^U_XV|k2 z;*L8gtYAhLAxFCt1np4TtuTef+Pk`pCcg*ZcIzNuJwcqv>m7o>+fwRTq9)ys^HbpC z4OH$pJZ<`4c_$mDh%58uc1OxlAzf;z^5G7o+8Y*d_0c;lQfcqR^ciJcE86<-Nh0Gn z1$K#g=Ff0$%0I>c`(_onCu%!DDc2gs&M48R!(z^=LQOkKyIK9LB|6?h^Vh#$F6j8w z_Y@bar*!BFEZ1JxRvFAXdXC(eX$v?ds_7am>L#l^UG}{c`8ukK@pu_Hh&$ne^LfV| zN5b<{vymv8dj<;b>S~e7P6{O#EhFJ$%RgJ1QUrna0_bGc0brh4ME#^aO^SyS|07td zWrx^jWf|e9Qt%sVg|a42y>WbfKbq}%J(YYmoD`dtuak8XvLZUV-pqx5k0eYgZu1<( zyMJaF>Jy-YosYBun-r7BX>V}qCA=z0ojg^n=F5Kz;9_wXgoo7@G`r661n(# z2R=v0(Uz#sE9-dDRXR*fH`+GVZQIVo-ChH*dqd~y2ESA4L$^6(z&kE@@68yh=mf^I zCFq`u+hoRVa@O+PCl=AN-s6FK!A&7ehl@Yu__M-{+Wi#XxhI$zgk841yuP%_S)R7> z4tQGgGJL^od!13idkQK4b0vp^Z;x}z3uOD;e421l-66j;1r5^I>TGE*bcb1>d4fni<=xl70+Q_X~ z^3xE~-D;?tqhDynX$0b4^Vfb2o%y7P0WxSt99*aeGc>$}cB+cV{|(|p(DKuFezhz3 zMZ~>W^}?<+&P;S~<@Mso`RuZd+{x~((qL;z&d9>q6lrqq{Cko{+Yq1esb+y)QTi5T zB`(aaz&f0-<7lV_xZmoTTjMTqFXT)XYM$*dS4mzd`!W)t&0$|yNEz}nCrtWaCMKXs zBbiU~_xB}OI7M`uHftB_5Bnk`Ymgv4)jPxix;>V<-k@_j924 z$mer7@W1-i_h0?W$|e>6>ZKlaVU6YV$a!`uhU)^rMgb+{+IYaC*(ZxEbUz9@Vjgt7$ zEo11inwRhmHG;b%Nx91W2^Ju1EIvutU5=j{Uy=Xj z?riXx)$HnJr1njG$)1|nw!%|9F1f4F`+6hpuG*Xhd@C;V9tGqJxEGV@%6)96)v(4VqV>^o_EMTtm(O%ckT^b z;y(h|=2D0`b==;%Z26Zpr}QWZ>RR=^GtIP{vj4pHh9|;Gs(o&)O;8x@e0NIy?|j5o zgfhpYBLmO7As|gnZDQ%g29pNLsggk>YX7jWA_&xN_$^1=lN4+`w)ZD`GIAjC;i@4Q zVOYf~EK#p~N0%+CRn~b;x8^!Tvm1In<^FFOC)hO7qp_u8TOdRGucHTWO_RqHKo!fN zN6`?W&NaOVsY==xyw&zTCFatPjU4DM)7BLK7myk79D-=+YSa1}m!hI#+%)azOuc%S z%5vD8w($|R?5^#J`9%7TXJN!5N;2M2Rq4^5w=)gw3~h`{IJ;sw!i0poMww<%>#)=IbDe4FZwxJK<~hr~Efnxj0MI6C)>*A+Uf_*v8TdS|)_oC$ z)>iD0Ldt#LQolVjpAlb#R73;CR@vJ}WR2=6z7gmw0ByXl$CG4vIT*{`C+VGk<&B>D z<*skui90x+dGmKaDhwCzRm!N2j_1{>drjG&hwbRe=+7w_%|@u+L35jT&ZXgJ5~H_L zZs!Uo(VbTeYkFPho@s#1Wq&@6ps`Uy^o}QjMKd)q_+uU-)mb0Jfx?Lrns)~QzUsZ4 zEM|9?@+~*?LN2+vI1vV~KD?6=CVECfKsDC@6Aj8?cIuqI&M-ODMn357#}j7o5&Dm; z{@yTTWX(;m-~mPwTkJgM*|NVp5;9{` zRCuMwAA8CFTS^a8Q&Wc_pz96M6l#C89gR4+fv*Po>f(}*;`)7Y54lOu^U8BXc;Y=- zp3l3Zsm6TV3k&uMu=;S@JYjAZ-Hy0AZTV*!rG68Th^HV~lK=qf+OIRs2`zEb zPyWFreRi!KReBO8s)-nlw|xpYdfEBHkgtH1b$`nH7^L~ac)O(qG5Wh#J+3e6zmZ~!jtHabiR@)i3?}rpp?v{;&TwRtk!kuNCRXeYEx(qnEL@K??)HxhJr z;g@3>XS?@fCk)RwovVH-+dRT>tGk1z1+rIkK6LnWj@+}_rku=Mv5OHok3E7q?1^40 z_G8j$&@NADXjcPLaKC!Jj=H$7a+{Jj#H^$)OCt4lUV+Hg7b^r&JR^IF(?;-efAQr zW_#%SE>a!SYKr<-de5UwFQ{m!#vO57e*A$qB#)h;5p*d`9 z4<+4O_=J6@Iu-tn7o9$rwA2PK*ZlIhAE)z?we`d#`{VSeiJV*#J@Kyt{nNtm9{pZa zT|d-w1A8w{J)YG3-SV^rQq#3sx!$)~Ni$zwReil=fT%FR!ttyJNlg{|8U8>v-@@ss zT6JHQ&LNmNQa1nceM5G<)806p7uyuA2M)@kQZ@xmZmY{}*TL-(>}o-VrE19~d>fl7 z;JI39l^Wu))QO?qO~WQ^2Pmx=1G7&y3=ciG%CyHAQu9s4G)NgUZ@+|Q6q+T7gqUnB zk=OTc1YfFdfqwh%Az1HZ|G8{trou>3pjswMaXE>%HBLjlCpxY~fRcC3N@k^(9v`n* zU7yCJ{+8=PYLx{5JuXj@9*a}W&Oe|!1aO%5&7zqAZ)p(Wu~0j=K^d9=B(% z)9OOx*TY4bX__zXg+1<0`xSThkRX`2V8s&T9hM@r>-0NPzKo4F0TA1wrjorN1jt9l zf!*nMZF=eV6-2{G6wV#Ky01>7poKcy+t2%VQ>Uh7;+<$yiPnq0Z0qe{rz3qE4ryF- z-5PFhO;3xKT_8}GPNKGqU}9g!M?%)mNMFKZn~SfFWs~!%Kk$n|(-N+0$8p9{6pD|{ z3o=h21ey*OL(*@(Sr3$~gFYkQ$uL0z-yY+kIR8z07^?OrL-8 z3;9byFU-Dx3UVxx*>f2gr;BTy=@aZ9ZC9L^8^3ctvY~E@Vj41Lr5_e33J9 zCH+D`N=1`QxMO48XdN@BDgQe6VHvt}h)&Wgj$!?rSUIOQj@R{kzi%nDyXC8f5=h)x z?_(vcJ0%ca*rzA`sBvd&jlR4_apO?ST`Riy4!UWE7C$P@z5L^05H&$shZv!Yz|02l zdS1bGWsCsee$4Gh=8w9pSaR&o73AIlrA=Uswz=)9#ec(u-Hfa*c?F{@I&^x8oPt;7 zDLcNkvuRPpm2;-n1sid>gF(3*f$cra&FK;Llin`1M9yKinjU>3+?T-w<4GLP2w@mR z?$HI2HhCNUys{H`|3m4-e z*p8kGTWR`1nPv zidFzQZ1r4UPiCgQsI4q6MsfeQhAUoVMIQ=VeeEq@@rpqd`Z#84I_rCJYtO5r@ZOT} z`tS4-OB@hUABu74<->uF%2cLVGt|Kv?>4f%99D187~EwKl{F4?o4VuT^3Y6J_$#k+ zWPE(Z+juI%Vd^;S5%GSr<`B)!@#(nYaf;3hxo~y5WKhlM9P4S%0|fRJ5!VY+u}ot! z4o3ru+@uxbfjz8-r#rnUPJhnAQZ}AoL?={QpFZVncnB@lWeP)P9*hcPntB;CyRU3} zlcZ9TevVgWEgFGP*5`laM4f;1>kKT=$AB&7>QpVQc)l~xYEItu_rDdE_PL!Ctm;7U zDU&?V&Jw{NMb;5m8ycN_7Z44}CqbV*sK}q5RH7?q9TN4zUkKZW8HRQ%%JH7 zdfZ_c4#l`Gs7>{GQH8pGdrnk(+x;my&1YidfEH;J7$tbHN?@b&SE7KAu6}N)z+x}R zk^68Jg+-9fC}u?OO~CRmZG1hMLLj5bsk6C(f6o?sNpd^Hqj0o@z(#b; zH1r>acy#5rkbPU9{p|GaaeV}soSPtX|0Mqm;-EvlFnIeZ{9bv8w6}7G=cp?#7id!)jxUPKlzdlCvOnJAaK+ycq|#F8&^!9 z?r5TDoVd$HD=Gv#F^ZyCBbUPi=6AF7TK}KKIqHolWuyCUo4XBwZ?SUW3Q2aOIWz27 z2_#Q_QiP4Mi`w0t+Pxcd#WJso-IToo^Ld??CI@rdB1NQDWBXtXsW)Jo@n2k4g&#T$ z7Gf3_KJ}jk?-j2B>|*GpNU=01j#q`q_t>-}nrH=s5aYkxN$8h+Z)QB}ZD(i=+AY0a z4Oj={DA5O+tX=-Mk>2_*GwTx0Hnv$8^}%;9#c^pdmvwA1Gn32r7w|toH5eTPg_Uf* z^A0sahh{y|ReG-4*R<(FvmQITYvK9qDCbqvkC*qZR$4TR>mc2OPpStX{YqlPtLS7^ z<~xzh48uG;7EN?YGHHFq(fLh9hY6sPt!wBbno_)U_uj{j;E=O8Dt zFStn60vrs0508bJJ~zX+(|WXAHoUuUWsLN?_vX(PD15yspu>Glsm!;o` z2D|0Jxi3RZ%V2(8t`4-Vy5OXi6@sXNd_&!7go9epvHC?U?OIg~ znq7$PPO((&V^=MWMi~DW=Bj}Qs)N-dWvd2Doj)-zh0VkjCz5HV7|=w*IvRPm_NP|G zKDufSwYJ_RumyHpCoAJgiQfN_iDQt~^$Q#$sMtXP-0y191F|rN=z-#veI%&5s3|)6~858U>V8 z%vo8(1^gF;(gi%T=mUzz{t=GP9sRL^-wUjDws4nX5nl{Yim14|SNueEsYZiQXU)xB zz2)8`(I2wGe4}8Hno4B0LE9Q%NG?P3OVJE|zJ}#N4_c|xTP~6|w&T9oOKTbZZ&UI( z`7-bgC-s+R7)kH}c0ecY`7-9KPJBjv41l>_ufV)$Fk9Fb*PSNfrsRP9Lb+uiOlrD* zw=k}X<}Y%T^Tp!rZd6duDot#%*MlA&izQtBk<3Srs6ZF>lDa#foL#WF0CR9-&XONu z91z7cUH%^c8bRg0aQ$|MLc2qdU;n(tbb|Z#Rh^TDR&Ou1p|)CzN=l<1`n9bM?jI0n z)F>Wcw59os+<8fv1c8IG=xw~chWjr@e{baxyaweTOwSbg#oAxX4E_W9bKhQI4)GI? zmmF8N-cQ8r-@&+#kAzwfH)}5FssHx}zbv%4?M@6oe z3B>i{O>HE}h4CS_foY2AU?l$Og*4c6CjNtX5SC|3X9iY8fL@NlG_Zk;LLPzy8MI71 zTl|6*f^7rS6{HxHpHiDY1RW}VK{@gz;F%gWmA@lD>bu;a>;Qj&`iWmK%;7IGQU9jz z1BQ{vKk+Y2Cq{#1xSBf{j-bJ+4z>JejVmD)nJ6Dtr}T~`N75O6AuGo{%H#Xf_FMb| zD{y!V0e%o*7 zPWjE(4{!7E|NYno{ZuJe0{e&z&xKnScK$k8LSWY9D>tUI0hA=b&j|7y2<}-s1VnN4zNQ8?@Pl2HCAMxbV&5QT% z`MlR=C_TZ1Zv7@&X=rYj79CxB{SN5zgZ!H|x%Goi`S;P2FV^ogO69|W(WPe!_&4>F zw@Cg?`y=a*P4CDrYW*gX?}zk3`Ne8~a`i{&-?Trn{{CrySbwzdCzQVjda&PrrhR{I z|KAusD0ktXz3=Z>OATAPPXpddnBU)Tc;{()P>cY*^Xb&GE!O^YB9d&OJmgunYv_^Z~W$*p!@h)QFj(r&CHnZjlYJyh~Gb= z8c!XOrqjnYv1t5cDJYxBS%zBBUAv?_cMX-M=4O59fEOp8wdgQ+4$N_@?2+crf_WnP$g?ofXY+|88=p zZvGk0zXtdGEBg8&xc*7S`Xl=MYp~Zp(BFS_`SthwzXcYgOGl2_ zX#_aXI?3Y2bKx3yLQ?D!tU%Dh8*aN=PFK|_;Ex5+-61XU5r}l+WR+S*nFVWosc^lU z41?B+-iZwJmH+D1qKefXeP{ z?$aj`PM@xo=bqoF*8676n3M!%@3Ru1d+JoR+;a1k3ViQNanF+|*bnx1V1uhw4X2OQ&~8b)fg3GQ0lh z>(}({KSW=@CtiPddIGijd;RV0-$j?7zkUMCXr##Ozj&6|RR5&9ZF8WEd*HhNY4zXE zyg=!pfA{up9Q{4?+yv5D{WoV3R)25nC!Z1DAAuGKj3*$IS3~dYts|N7Du2{Zp3Xt< z&x4u7VW=l4(085dRQ-9E>h_^O2SAS&|5!Td!3e8SPzMi1)9WA)#L+__-TJa#;urup zQcp_+w6P1I13|?%C_v8SBmZ>k%RMl~G_Y92@jas;1-`K=6AVxK>jFbWE@9Z-83FamLxq1+uz&}_c#D8jP1N77jvVP+YkpMt| z8!0E^7aX}zjuy;G8EV5(ZgviVj>IomYl4&)-;smAfLu_O#t}?Nd9hs~z|Vby;Y}O~ z3>d(VJo!O>e17}e{z+(sue8*-2V-2cKss9g`{l2Gqh%1>_m%rU*CSoDveF$l)Bt{z zA3J1rN(P{X4it-6+o`kHWIC;cWM_{ssOXMX1&JBI>&VN_kY(VX1%~~@Eknm`T5rCw zpZ@6;bovH3Ni=ssK>JI^a2*Zm+g2%xWg)=gIU zi0b?H73BYZc;EN=SNHLkbI&|{SE&y5u!hwLt5^)tz3G6Do(U zVhaoNg{~L}GVH;jobB89$+BhhWx@OzQCYDT;b>`aTnx8=Q3*3FvI+pxXPEWTzv4XvS^TdbMCM+a8<9?Q^R?hh070f43ktPfKpzA88}#LCa^=-$Sp@djj{& z?+?5YF~$lISbqmB{tJ~|L~don|47J;lmHu zcTOG*e!(dN5tItk**1ND1Q?>3U7)9BdCH4+m7Ps9w#JOELFjWd;Q(v~$+PW5sC)VO4hg;+ z0W>)S%T|yfk?*+o2M&@n-)rkK!;Mpxj|ZN*XL){l4!E>17>(Z6VFo>*?g?^a+c^^Y zLa=@>$#P<1NKb@(xB3J8d-Rcaw*8c!4a$Fl^aL;PR?fVJkH?Z=H z_xt1Tli*?h#sPolR=Gkqz09-ec(%IdwS52qem0Md>(A@y({&2K@w*HQ)>ny>-X~91 z%i=||hUKa2c8q7$HT4;-Oya`&=+RR$Yu4o8>+ARDt;fzvZFRM@x3x&o$T3m?%Y6j7 zw!%6P!BMC7Zj}jhmtvmbjdgbXX~I;`TG-?GH@TDt1-$V;7W0ch82EBD0wxLPZYU1LorZ$IUmb>2>?7@Llbx>23uu`2JZzGV`ZI z>3J%A6x>RuGV}!QtF1YWxp|S)cX-OV(M4Huz%r?9ZNPxH@k{xGofhfw~Z z{O$PFU;S6Cek)%8*VJ?dooSa80i@44tUm-@i|3(Bx^YSW1Lplaq~e}d0BF5$B*5sg zEWGtp&r2BJj>8RZNl6jBgv^v_Qzt~7AJbyDwT4ZLfA$|03>ROtOeRbi-BVRbr*l5| z=fAw5mUJ%%5Gq|^fB7-EJl^91&C*qGta_e)W`oq>;K}uCFO7OYsqsv+JPu2YJcMw~ z)fdGoCgbB@+gl}vwr`OM^OsA}Xmh~DG97CTYSRbXm2R;A{FfK?cX#bIgZG^cHo1rV zW~Kz5diqs$4NqeS_4Q{WK>h^y8PFerevy~x`t-l# zmH((`Hx}}sfM;+n=E3_*{%PIK>W>M?BR%#1{C;V{FBtstAic4WhYbKnPE03ufNN`d z#O1Ro#TftLewU3?41lA5SFjpHO~9M#-=S|IfPnG*%XP9gg!L$&2JDuD1LX?tV@}co zuts|RewCh)47}LpXdLB7*SGjbpqpke`RMvqE#yUMKZ~+~a?7DBU>|;f)hNz{7WPO_ zq#=Uc6IVu@av5j$|A=EEcV@L+vhgc?{`OL4D{8%Q+Q2YZdFVeUbGnr!f{^?+SST=6j z5|def0{#z5Q;6@Xu5JFLOMROwj&APCI!1{DMFV`s#UF&mvLJ9Hfe z&~veqW(S2RrDI30=4??$2=Md1$e%s3UM)v)cv^rT%OGlwRWy1K;F)jF6db+%#@{X>oxVRWjp}DzL4jnonOP0*e=w`2fbte?YOVY+;TU&>` zu<5YmmX5)AI6{Gatej&87uoFpS{v)7x%RY-o<3LkvcLa!9M-5h;{op`m1eH7UW@#K10wQ_Nvtk+qd2jUt8_tn={OI0i8 z-LTw83w}9Mm&xsy#CK`9b=!W~x9_mJFpLKvj@Q1X=4PQanl|kDF!1}~{6F6Or?=ma zsUdRy$#05aRR+!gIsYsuC{*{qh}99vA^GV^WU)kft~-QWBn2D{SWr~ z`}+M3bo*1ue_Lw{T;3OA&F+D$o7=mjrpX(-rI!_iYoawK=U+@3&*B5n+CZH}80$nFR2g`Qz=g*Yo%jQL8Y2W^%vUTfT zxM`jvOBT0KFSj@ApWr_I4GU-#2Kqz%w-eq;+KpkXVWGbm==Ez~ z>+j9`kM{l08X@=d{2?9tUp=?KyZ+qe6Z|SYz41|hjsN^X`B(ip_3z%^rCQu`Vo2Ww zkXlfG$vXV)_t)vwLH#+c@xc`=E$&f%_@^HHpd(<&gI>%WY&7+gM`AhbUMc0?r5FNS zQ3khJwJv7CJ@kcFNI33Ai-=d|DQs{E^AAm%iL5oM4b{Id-G{j+>u zFzt^#n94YRPKpdD%g7 zKw#fY3w`X=G&^H0zz-3c3+Y5O8^7nqir<~r_wUJ)O#fbf`S@lm>~k?l8U%hcfS=za zEC)$zWgr`-a4CO+*8PK;-t)ciWguj!rA0H~aIoX+!n8vN7egO?6U|?yl_Tl-{*?|D z`w{b6u+13b%E=1956h!%OGI|0+Ysb|^!mB6ZT#P9qs`yb)zTYUqVSE3dZM%G@#qsN z%l>{eFX~Q&#@5YiNbh}r5MC(1B){L`{{3`dl76be*&V>|sU$y3u3OL@-0c6&rSqPk zy~&ftMzwAc`RrEU0STIs5qroljINk92%k+DXMZ5WUBoH!~ zuN`Z2&H>>R1_z#T0N2^yC<;wFFCmA6=22z&K@reRNySaU$J;VE8{h z@*H$+gn~e3?NzlF2az! z1bASD^Qen1S}HT98xMKOm(nxE?n;p+V`!?!%d`;uxo8u_1^f@Ba2PJt8n4fB7F^-ZbYtcMrCjP z!?TS#pdquq9$d3H;5vh?Cj;l@F+T^J7{Na{GK)vWYR!KhsXx_=jdmB2lMM?7UxpwL zURGZwFLJ={V)Hp*EQJ+^5(p*WlR(g=SuW=1H>Ck!>O@(_M8^^=;a`N8jaWD3<#(&??IQ zlkJiRH@Kq;&dI!SS@PuGPHAd8Clg?aZ?$8Ij~0}hYpbMm{3HPX&dJGo57h$DbnChvlzN8;Md=l2)@?_$~F?}f} zBWQV=kxH53;zD`db(bW>Qz`&{wjz6CdzE9Xg|5tFS-`V2iCoz~w?nyGK&@_u1}f~S zfTk;^ck<+M3O=Gz znF`NI6UTNd!dfBYm`X4pEyw5;_jI=yFK`Yg>hI!-spl&Ze)==ds~dJm zb#=Yaf+l|_Yt~#K!8Om(IvgZ|r}4gq!P>|5wcW#wK6tP!Ui+zkz|T#sXL7BH>A5tu zcIhFZ0tXDZ!e-2 z+Az*YV9(yevVHr0-5;Vm@cs&RFDRAe_cYG;N1dtUKP)Tt67b^>QeS#+OZ3(q{t}c| zPD=bCdRAW!F9YW^ezmxl;$;uYBjVYu+frs>enT9F6L@3u;OfzOU_g^@+Tdozq)GE~ z8G}ger#b&p!#}2M@~+08_^9ND#;XJI4kI?sy|Ud}jLWG$8D7k7LVx|jQvz~jFbjON zx_Wyxd}>BbGx6X7|0^AF7?v|e6Q_aylyBCBWgagUOW{?|NJDALH1gDYn~7Hwt(P3& zJ#0h>@H6iu{2N~aA;2%bd{Uk|d;xxTfH0l9>UN!hr}eMZmh$onnK5Hxk4l2SzI;$hMwQ8Bi%07#CnzgffNLTfYXoVv zbexk~$88|%m^3n5YAOy&eZ?V}xL}1$A9+?@JJ2LKW2Wn(I9n%*hG;g!=>FR}4JyB7EMd0{F3S9$TC(g?ZfM2tz1=Py(R@LJ1@y0d8Se z)Ow(O?j78kL37(^Z6L^jmcM4qm?Rfn*!u$;x-a6}N2sVcExX`~m!P{2xF@pi2k8NU z7L%d{g7CKQD3{vW26d^+yf$zi$3v|IFr5c?X9O@=&|mq1W3bw^$7aeaU!h?bn}YDBb_@PtO9- zdREsuD^@H5c-A{Wv*)zH>R#$vJKSWOI>`;5k~YCAHuVOn4E%0JV_i`kWnJO_rnp6Z z+p^y62XXxP{U4sjdViu^e9?KSWWV3b;@Cv@_6ruwl>T<-+3$@BE66AbaG!$v6*d$U z03qehkLwG8(;&}nh5Mr+QzHaE8j_cfG3Wjo}|B59!P!b2#~#QwgjUKL^*L1t9_JTN-X+&}Fw% zmKuISoGHnaMXPmQ`AVVbywd>M2;LECd2({#V#@NKd%7bBCMYkyy#dCmp57N{TW!-w zL$|pMuFN#f;RCczlNG0-4~S#A1_R*KPvcA=aj_aGjp-3QF#{qr&dJFrh7jOq3`!hSn9k9_9W?Oh-x#$6h`tQc(Hw6hXc7)l_NKokl1H*}etNeURcRVads ziev#ubX)t<%iEwd8~PS;*;cwzqji-`4&1Cf2TcW)!~Gfl^4FJT?dvXym;*$sud=dM zwrww$>#n^pT5`g1hhPDrx;Zj?b9)zDmYD@VU29D&&F*GJg^Kn+KC%un@f7D{W-XCx zR!)|e4tB!AhjGP}D#dIhhvw-NWUyz?A-VF3Nab?0yqO%gdCOiYFFz_b-MB^y3-c3V zHI)EA>o%AbbK~`|yE_%sNhR8Z61slQQuolwDC+DtG`a|ixcm^{m(WWMGldceB@jx$ zkpL}=o^JHU*RjP}vSvwWnZuon9=ti@ggaNmsS6K%1B=KAPk z>vXT;$}8eqOdT{03K<=62~bb?yWc;h^PTB%6I%vQ-*E6UGT?#-1CKxPvd*Ra^Q=_! zMHlKV30gHyrtYS;E~$lwgz=?0YKhg-Hnnvk{#@ue!3t!UT>aRC%xbbXpYZcVi*^wq zdbWrx)TVm@i&@{J@7B!{O(t#}7sDD1B_H*lTB1XOEfA5U;iI9o`8iv1f&=6;WjF;f z32Qax(tOs46EkV>0C0SyJlrask~OOnsdc-wrUd)fZ4)AF879p>**Z~=C1T!KxB|qx zX&|uKES`d8_%RVC-IPo^y;HA>7=A(w7_ptfaboXw0vwO)8zWR#5# z0e&jN@J|mC2myXQ2q@Lb!w=wxjt?i;*fFuAVy8^xHir&cbkU&zHt<7$U*wn86Tpvh zBa)nh0S5|>CB}juWy%-?T;c)zm;vLuJ7^dp{^grOe4Nd6Z(!1_4u!ebzbJy124kf9 zGIqZ;wIkk+X2C3O24->E8qA~5zKl`R(-#?^&-C#T))Y!0lt6R|WU`W=uI`K~2NMPD z*cR485qbFV2|0ho0vk1CuRP&<2$tBEES{CoZKPuN=+R18ZJC)cpCj^%)tYZl1hjyB zwyjCCt$%d~ECwWI{e~xc2_R+QDQf?`K_mP5&(Wi&^n~{5v!!xs&n6i;X}XM=u|V1} zH>_;%G=d`wvgDfi{R2$cUw%wVp`1TeStE0BI-K*U;$kC{er|rsivR25FR4rJYp=OD z;WASR@C&-o%EkoqNR9XY=8emirIYQv&|`7qF+1z@;_RL6mq!(5_eqgw%L}ie1VRaf z5*Th0u>GiQcP1TRu{`lg_k_#x65S>u77hyU=5f-&i;(i{MWw-4+mvONSUUU=aWIa@fP z+rbjswhqi6PxM(}RA z%O$zoU0?w$+yDa%#(Ue{Gwr=M`o5R-ss;qqZUcRhf+ArV3{Nk`T zzqr$H%mggPPkM)nbiY;8Mz7qGE`_CAb#wd8Z@iq*ntoKK#eVLC)!H}SIK9AH>SD{4 z@LyUQxQ#VPx~S$jhZgww$Ag_uA3tb#@FEH2(Eu&#(y}gfPTiL(q-(Pa;W>^2!@W2# ztk(P7yf_Aki+9r`_m7qaT##2~l`MW=x)6XLa}?N|leKf}7e7uXew;H1vbR7IV4HkC zBfyW@Gpz^QB$6GId?x(nU*))93{5=}nTN1>1 zbc~QV58%fqzFJ*x*F?5$Y?C=F55_TGWyGDI1$iam@zg*9@GEn@KVASoHb-cla9W3r z4;w0W5b*#%F5F>rI&sk}Ut}2I2RFS0^Enp$*cC(pel+VBbR)#f|j3^ zVgZ4ypCCx8MFaRz4l4m}!h%Ibl;@yR3trnhKbPo>vOlMmvFxHG3=<6`8i>(AC2tbY zMK4ddZo~#Jhm=+wSd}u+CmV!A3+_Y(}xISFnwnD&bAANigR{y#r{>0OVasq?ggd7A8@{op% zRdAigW^NBQ)oEq08=y%Bf*olUk-Dt3K$m@V3HkM}y(FS3z;Ex~?dIr_Jt@UaH-3l` zr2_mt0Ql^qk1h&WbHj$UGS6DRd|8M*7d|1vn1`kCJB$%K?{{HCLIJcIQ4H zBxslQR1eY}=nl@d&q+Ns)mIf{wa-d!|NW~Uy=~Z*y!7I6H+o6jU%GtTT)cS0yoP?4 z?&p(`XdqV&@W8`QfA*oQEphz8brk+BTh`=RP|p2#o2v{-daHrUSMHb#7p|Mypp_=TVgz7Ou%t&inv=q~tfxeQ}i6$=bPP zA_;Li@#7qQ*;|{#oVVldZ?|hY?`rA2v~<7XF;-w6jWvaMU}=}n{G;SrOHzI?Avxoi zz1;H#L9+Gk`7Grny(VO&6MUXdT)NxXeR#?s1-G*L^oX-k+4sC>GL@aes}Up{hi8_J ziMUn4t6Z$tMcxxAC;^!T*bGZ2@%rAosw%9nMy6oe1mGvSO8&{Hfdt@}QANc~@F)TN zv~hPES+PJXtr8nY`(Jv1ADS$joF(XwCv<0Lrp*k1e!u#KW5rec63dMMzuKBwQ&U?f z=Cm!quUa}By6B~LQv>|iiAb-7G(o|&bMreHc2(@8_@CGB*wnUL)6Of%A-L1Lf*9c# zJPLcs8F4nh;AQ4JpCT++Kk+|(Tj8+r?W*8C1IOrAkjcX1JO-_*LF=HMUWzin5T)iunKz8ofm{Xn|9X(&coI0^Uod0hrFybKltI> z<{MwP8=0vXH!fS@zv_JBBXj%D{?1Nx{n+pg`_Vm}bc?luX_8)h}Bv6X+EiwwdNtYeQ+cpfClug9`fN2F=Q* zD)ZdV8dFo>EY=RSzvcLpe^cYbp**sAARRZId7XwunOp(3+3+Yd zfDzf|TWo+I`KGeS=eoaI3wO;8^xK>wq}q%x=0moTAl()Jy9!KYgyWHdp1Uq-)$a!+Bqa<8r$W^S-Yh$`Y*1<>1gdcj-&Z zc{AOjA3eHHT+ElAV{ti9c3NBe%9md#ZpKM&kBtUsnU@D9Ux(FXdWT5D;%VTo|K=BR zxPx_3su0(17mF8x-3_&6Zp4cve3DO5HNg2)<%algwDJIc)S&gI$gz<~t)f%Eo{j@u z6KuyFeXD!LfG`&yv*z2Y}y92?2h?!^2nrhA*%phAmsRU<17PC)*U@SBnM5>KbfX!-5~wE1iazW2FYM z0Z%u$jAmyPSnw0AN`GiO9osQTB6c1=>JRrqs2zwZ#_LG@bT-~c-+LXGrq-*+#Y=2E zPe|iLE$d86OOyW%;lz^ypsM*rHp|k3YU7fbM7Ddg{i_``F-HiH*t|V!iLcfgNVY_S^t|_u+b#Zl@|4 zn3S(hqjYqAd-m)#bNs3OaI@Nv!veDaI;|8}UR+pY98XPcfK@xXjiO~b)=5Ksomth^ zY9?U;g>JfrhDYUeaU0Dv?+G-k%(;*BTR`JQ!GX#R9b`{E17Qd&}R!F})k#=nXd zHRJR1fAT;2Y4Qd6`5EAb?%l?rpIUrN1iH~8!I})4&n`VD?w1~74|T>Ho8TqKf1|K! zF*t5_Xz4y}11$4R4RxFLJ9lMhGBpZUcUxddaMLa~y9M{p?Txo|xFDeyk*iMV+T`tb zJ`q<%{C+Ai&;m|(_kdU|%0<3X0Q_i8=;o~sGv2zx7bVyJGuj@1^RPYX&+%S#1J!4e z<|bGE(X0~sN4x)z)_3$dssE(@m-75gzh?zC>2o@_rJ823uN;&8-QT@0mS1S8j~0dr z0Hbwkj^$iX`_JG~aA;^m#%d=|9>y3xv!&#G%EvLy5C7_I*|aAAYyxHDT;L0@pGujW zAjOY9z98}+ha0t>jte`Mm%u^-6|Y>qEv{;7us%e$yPT`=V8$2#8TapZV$9YjV7?b# zc+#w0voa;WN_p|=*{kNpje7#{Y^}(GxH)BoZz)})Dk+niJpcWvH9NBC3?cG)(Qazqx&`t8kuoC?ge#^V?n=VC2 zHy%sZe`h00LZ8gP-TAkI!m{~xn5KN+PyG0T{5cE`y$wC2E(!P1g&ygvu!o@`xYHPv zll#n(z&I&C;&uEKB=bOf>RwheB@O=ck@yTSmz;&xd!ZmdqB=BBt7|gD*q{6M49pJ~ zab?RZpGkl;#ExiC`87tKC9U`U`x4m{Hdkh-IYh3i4&h}H36T^OD$tAfQuV~gD(Gf@ zmY54L@o^E<4Rj}^Vl;F^UM!NAhC@~5Xv<0=$%}dN9(l;slFGe4dvaGnH;hu9at|wU z(F@fjA)^KofL}%x6*s}73-I$g2{xi$!^DP98b7S=&@$gN{@BRX)izl zk0xUIq!Y;w;D=MrIF(G@vID7aYL+Wn@b~B)hRQ3Hfjrnmr1$wlf2q?i z%z-h*pjZ7jEE504E`P$``~H*qUzFcprtdFqlYrotty|aU_29!0Q0;qh-I90`S9zC;AgwF&V(7FadnMeS;prZ@B>cW&q$Db^(6aXe9ka48Skn z{OPjf(xqG2$b30g;R^0M|G)nSGlb27e8cknJI&$W`bR>ZE1)eMPnMe&b!uyC%@c=q zrc6o~OWh;rJH7dR%7l19&_P{|?dvt&_)x!jc=?Q3v+Iy)SrZRzJ+-Gr0I^EL>!-i{ zZ_N1Un2c@M`?Ig-qQa>^`j(qa?sL^kH%_9D0!T`C#w`D#gF6=FxmXeZ`TK9kw|(l_ zqdAFC3V`2_{`wc@*s=X)^QJZCb|1e3TIa?X-y8pD8h;H=;CJW&KUtXl>#EJpl^BEK z+iPyN|A_K*pA-IzKmJbYFByNb-FY16UtFB$K|zK|bjaPqL8qLr zdqcN&H_4#4=V>tFijD+OEX6Q(Kt zp|wFC);ReLfP|PQqzhNC-8Gjl+wt7jzWP#Hxds7Hq{~>26}RJ1&&bF){zd^f3!`3E zt!jnE>L=v@P?R^vD(}7v%XCHp*C zqjAys-|M@k&BtdhiF;$#LDjm098AhOrEcIv^GNlq{eSNy);^t(D@e&9T{5?BJxxxG z!xDXizX6tQAyj{<+V5!Hm0PcF85?0xZWsrb-1&?P@Z&7!n@6&=I+v}29!q`pRjP8_0U(HO z<4ftzvsAJt`7XW&xVHA@n;)6=@ci&14jCk2aW%lhC0vK*_^K2k+Ge{vGWFkX+PHhA z=a^sikK+=hiBtMiGmY^N_wOxzqg?IIJa26-3*7YL4KW#fOZhp5vcDf5R3P31 ztLuD;tIEMc`x+GZ#`)*e6z~V&PrO211IGV6sKJCt@5_n^7wBhS+x%vMU*MrW@~2S`|qHu2Yx~5k(VF5d*<&30{bAo$WDxk$WMACV;)*YYZc$py0R&*V%p)~ z(AbPM45qbZQ=WWs=as5TYKppJ9-@Dge{JK8h`DWJo2(;<(I?8}%MU56IBs#0`^QWJ z3Ba$+75-=f{Hzk$AW36w+bwDQ*Z|T6@6^qVoI|=x|NDQxXgvN5E_!Qf=$^M0jXuDT*c^o!Kj{+cu&7;E zSD!V&j~xjY*0jN|_6NycCxiN8r=;&g9SLHLtC%TO$Om2t87YjG3)_;EY_%?4^3#%G;1Z30S zKLi(CZDKj2t}gq9=uqY{5ACqXw+t2q30TV}(1IVW_t7H8qaLh_-s{-#%njgFZoSab zAT0r|fEB!GP;lRk@BOWL2-hZshV`F&+U)+dFG)7Jg4r_hzID6PtcRPqW`J1TP%Mib z(-ULn!R1fPEXIzl>o%FTZTm3hu^9&6!UwWAo#PSQYX!Tcn%oaL;=d?s@Y$ovi@BJ$ts9odCx!Z(aCZ=2|QQ5~7w* zFL%Lu=~R#t=LXX_voZs4XW!@?HtmdQuB$T38>`IITNk!hTwo%2x?`lq3{91P{HBsu zYX7D3MX$vgziPfo`IGTuGJalK?a#>YplMxht+7o=`7`C$|K!-g4Q{t-qGYJ#I|3jH>Z4oS^XIS2{OP3^pNh@mO1Cj1ld-Sz ziX5AolQD=AZ&_LGk3rP3U_xV^Nf2kyZAN9-MuFg%^-u7dBt5ys*puK&zg4^3te;?W8?}A0< z(2mmULDw)Q3kV#4u2|M+Uf-X&A7Fac#rXI*@)(mkX{fJwFKtS2x;INFrIDSdO;%R_u)W3N5Q&>aZ z1#8GVi!MmIHNRr6Kj_-S{5-9(E?gsuD_Al4Gk=vKj#peHc>(X>5^5KQ(Fh-+3?JpR@lSmj%;lQ2z7Y0F?B#b#-{{QaWyW-Du=P zke}|KTmCp$2l<7Emp0CdAG2o~;m`elPo`>M8VJ<2r~_QQG%By93xps&%deIIxtHbZ z&nHTA1Nuo%e@sRC8r46ZEjTYsufRUWQf%_)c%E7n{s3v>4PSfXd@HYv`90Nh{eid& zDZht*Aqg=Z1SyhU=LlX#%uH_i5BV}ZV?y`|%;h)2(-A`g@Dnv8|D@1B0`N^8Xvu~SkvfS<-2lT+CfUN$r9=)opk)x*g411N9A|O z{97x3ap+wct^Nb~eTI>nV)A#hPWUhUeqH_OeWHImxUPiXkJbsVrTBiM?vvKGRGH^@ z)|lSjL1{mDf@lhVeK?uAX7wu5-q8iuP1{W;7EkB`maaQX4Wy&>u(#g+#C+w;&%5eK zdH*3c0e9}$ESBn~Vc~Auwhba{N`fW)g1RBl=@?udS8A9-9dvZ|!qxJI1tQkeH)G<; ziMKKNxaD1tp%( z|4IEX)Ijq6KRVz46c*W+uUrja)SMY`4zldPL6&2i7xujizlOz&dHbC+rmL&pyzrD0Pog&g)`=@3eRtL7gZSL+}Tg~Z@E}#!w zmX{?Pu9-zQA$YLp`+xbS*}Z$KdGgr4v}#ZQKY<$AfFsjpR>GIJZg-e7u$afNa%HQy zT~2j4D%)`;+pmf7F|2`2iscLfBkN%S%ndF$jH_UA*41v_YB$#&;LyUFO+uRM{Bv}2 zHgtGw*ZLN7Vq0bZ=3E_RbDyqGSO;#%Re!8UH$>^(I%K+XfG0U#rj@G3wvDELI(*1U zWhFSRV=ydxIb>7*OYwTOdma`L?bWgWvM@4a?07yECt!E@t_! zU%zM0es;B}^Qm%{=P!TobF+H&3iAT2za}BkK(-nf0~nY6B`q#L`Q!nNe>P`Jnxrd{ z26)JWAU|5~YiP)AeJGPim%HY1aMSJ|M$;C1{>XlxeQGrh`j#}Egj?K#hL?(@3u z6NH)MH}ygO>-Ij4F$YfEd+tubb++e0XQoCv7>3~sKpEf!M6BBMNzrij5Z(2{KD*<8 zW$RTdl6HOAzXDJ_%p*E%s-m4uWZUI9tL=4kvOVk<+W-bDwJq>HxYz`V#hGno+)>^~ zksSqvBM)Q~*^Rk#y6Hc4rsKc-F^_p|F-VnY;ktAEacr!Ot%k9cQaccfXlLK#5Vw*h zsX2WGSy?q&F?u*CWWK6@_Qc3;v`hJLH)fZ+68`~cW%;TZ?KJv6VoNhNnm*W5Xp0se z$8ulJ+FaSFq(~i__ld7<$cY{IZqTXdi)R8h8%1Dzdx3;{MbS&q!R2S;(}IT%>q%)K zo2CR;`ZeAjO3gAKucjtnn}32>nafszy{BfZ$A;~vT0>RSv@fmH^Mkk?;&$7*jbR0f zJlb_-7MiQ!R|#RSR#}{Pi*vBC31ok|*x?F_M(hzGkq-!bGb*pB%P{P1ts|aVx<)*L zxU4Dwa%i_MQC62OWUhTtbyd~-Jour#lW}pY4yQmMUZ80=`}6&hCU5fJsE$%3n)GyN z))ZcFdY8=`qTg+{Um*PKN=B9X4@e&{SPgbWe?znJqoA65{rNas&{-WjIq+02HCuEf zMN~K1TEne;Kp1A@lDgWlV5hVWyjl-q;m|Gy?Nz%xkyq+hw2g8LY~b#^{g3D9(~hAx_T zN@c}FHBQe%q3)Sh`vXiWA327X;scAHZI_H7|fdh--}vrEh~GnG~yHr*~LDmZ2tY8zv^#drGG@h7V^f} zE@a!^$&1Whr~Uy}-xZ@5T%&RpZ!{Z?EC`Nh|Hwnv<4#S=*{EL@BW`QES?l=c03Y?> zvnH`pEFO~&zOi^rGWvGr08{{T6$Wl1i~KJWN`c9+sZIF(e#V2Tj6F262VvzYiOA9K zyQJd#2wi;|W?9pP82|nCZAD0zb#~Hzhac@`Qc&H+(PG``3X!8G{%U8gKO#|%E*RBI z3A<20?F;LL!YZasm&>>JlLQVrrmVV787uEREw14Ux#Y$;#n=7+eh5kGY~%4kNwUi^ ziK42p>g66fR#wauiJfsN8mV&#VxsY)+`vi) zt|8@#S`xN&Re4}o`Nqke?70U$s3Mz^9NN)$_IUo@5mmT!WNzw8;aYkm7n5p8akKWD;JN;ss4~vdgCg(SZk6k=`IsbxW%xbYSpi1)k zXhv8yxmL9ZxB4B5>_f31c7~W6=mjeO7%&Jmad-G$RIa}%Xt#9(W8Aga+*?YeKI05Z zTfwN`fXq@NPd2Z1UyLYYQsisyXHs~<=2`J`fFa>_*0DMbSH{H5X$ZRIgm5vq2-!M! zv24_0UmMhOUUCGIK2#o2@*S?2CH`s63oI;gUNbf`XU!y*CA+xgnzF#7-x81MqF@25 zmi0oXu*6yq+n;>oGdtFD`X9toS9=U5n2Vn1@h`@nRnpMYyy}1qF~-&qtNp{oEK@1L z=hTS+$W#xC$lliOqhxvLs1*vAFD_^`!HPphjS3kd4s1Ff8-DoKmVyUh>%*#MGbTff z@+2eEQ~_Qj7^Y*lz?MF1Q?L3@C^r#*9&kB=gGBtJ%*N!4a!!A@S6;eNQH+Zu7dvWX zczavljBgdK8?BU_{8`MT`Nxp+mUWoR+jOYxDOu$+)InN2ttJM9-UYbG(E8 z^SJz_XKJsW2R$_f?d|CZiq<}6@X=L?i2uRTq3+%r>Qiv!E1~PRw>SM>6-CN*W`ly7 zP!SVZxDO|%kL8^+-sQpwwF&N=RHsgHVBf}6+xS61P6}DI_nYUGGX==P7SHKtdrSGc z6qdjTPmzznp`fp82UD}kcY44CaOx-?r#adh6}@%4*Rabb2)M3!N{iX}3HZl$i+YBz zM8IH+e}YHG`kD=l(pPnjV@7gn(ajWY?=PDkOUTF&g|4@@9?#vpskzpy0tVH1o}{2A z|J>Cw8N9zuPS)GOt>kfuPU%ylAc&lKxOtcdc=C6E3j#7S3F+{YHt#8E^u4YyZtnGq)z~_aNJcC5Wh)--oS_XWd^55>?alN>#{Qc+M8a7!zJ5;QJV=S?> zgZLyiE9>}`A9+xKM!CzblZA$%Xsc0YERro*X}GTQobto0fgmo64}Spuhaxt) zqZIOapLrMmy8*Isf!~O_5r|kat_Z0f& z{9QE|K)B-B6g&S49aAFQLB-6%LMyk>;V`~V5D&9KRWuVZDHsK18Jf93g3e8QkFTc7c zC*5$b&&9`jPQ5pWe7zh`B19I(w?-13%x3KW;#_UEs8%qwqg5z56fdoTh>WlnB#=EN{ zgC}fN#$CF9v-fa!6Rc@7h&8*<5Zq4D-?=rIYXN!ipyo?(e!fB_7yo6<*Om3;w|U3tnj=eZw;q%q(JCO}2n2oed|}KNIYRd*KCcTEv_zlA zjJ(zkpLo4@n!p<5gDkwH?A}aIogy2c(h)ehG-W0#uDzUpHJuFxO*$P{wt(EgfVAAh zTO_JphRl1h!vRim))3ivLBnNp3wz{F8p%s>zvmkh4xD z1gESl*c4()ZGeKUdvEYxV7-VnhnNw0+_ht6Z9vRWnt-8G+dBlqYyV4}*gB!coCMcJ z%(=K0oxwfmE*j+6ecN?PE2=$lgx%Y>FyW4xci*>tUkyS;P|i5v=1;~mv1oIOy|oL) ziJY9&QjO-tV!>+DLVp~k@jt&<`~3hl(tvM`n%S| zA{rhPAv1PD_^wB=khpa^KQGJxKwr2G?YMA$R{a4T3eNrHku>7^3Eq#GO0$4iwjv`_ z0r`SQ_o`QhPKeE@@g9v@j~+IkB7P2S4UKP+Qf>l|sj++(ZBN|@gT^rd~U*F z3H2kt_f+@jnovM-F`1UfvZpozQ-3kXCOPA-SOyZDNnQQSz@ zbedt4;1+5oxLKlfOdcM5Aabo*tAPv_7p1XT^AY)R`1Isd+jrRcH`uCs zWmIQZ6V@3($|rU|6NVOu-0qI+W!3%Ns1l?)Q(lLKp_W5Pn+g8q06-I^MII(RE)l#o z_boDX9snHYIfqFzf|t{*?eHS^?pV>>Ul!(Y|Jq$-@a~pY!bAJ zEQD_-JEzzk8C=FOfjy{vnnm^inTO{SpO@lfW~)qR94%JaaDLi6;hP!J0LS%)$w6n^ zS1iF0Uu197zqW(G&z~3x51}We~|6@TxSV z@yWIGf@R+7lGPg6)DEEoCQJDReq{9ccrWzb@T35gl${MfOv{Ch;X|ckSj^4!PG2Mw zUZ31&pPB)|6wn@d*az=@qFmG?+%3(xyMED>!>c0Q=C_kbQIG8dmRN&oNbe+P^zFm+ zDObwNDaritclc0=m-kO8+@`MuKncP2>;F#Y@NP`G*G$%cyEI06d}~ra#u$!om!`xw z)~j#QGUKP(fy4J^_n@M@nsT8WBf*vFH#mR#-sPJOfz-3QYvGpv?h_&}ra)+yUTrv( z{sLtO1{PR$cOBfSBjkaUTRYFFK<>uY)g3YA2>`@3!L;{V2OW!*51T-g1($ zON;zse*9$L;IqKm+crB} z2iYJVvwUM8e^P)0aIvReogC^|#BRsfKRc^!1F=;Iy(2SiaT_Gys@2u2ti%csQC)O7 zBJWRpX4D6y`?GDWr%Y4_ct0oa@ju>E3T2a~bxZHy`nWS~T~_q=Gkf982|9T zxob_Bgafhpg4^nar9}l+_$brQN1rqt-|fCRRuq#l`-Kl3ZpyD8;oJlnr4Oa2maw-8 z75~#>Gm}*|dwL+<6`x>?#n11HPFE^eFwaq-S&YL8X7yC*H2IV`dOQg}%qfZ)D~_8# z1yff)w6|=qFOr0h|NEJGpvLX&Ba&QlwM4)CE{OBPqfyZ1SPwOS^t`PH|C014an3e^ z`T)D8{q8$lzCZD*dCI?7s_s|87^+nF%<(XMY3mes9rT0R=^peCd2zNYV#5w|^N<}` zqv-OQnn=4;y332*-1#l;8ov{tOm7BGy_*`~HlcBrdWQcaOC5lWOg(ODz9Ifz>A$WD zx^W}(g~V&b`{J7l_XnGE<@Oo(o??w$5%<~$@!rGS<{-QYha8!aN?k^%Xl%rjhMW6! z@r&Dd!p$u9xmj=wTEK{-8uE>n9Pjc>+Ub)?s^9&nq~vwUCVf0t0U|Fwy+>SkF<%_d znfA{xj1xbMnr@od3RWyyx9QR(AWPt(NG^67#kL|uqljNjL%i0=nLj9%)k`ySiWfc_tQ{OWs}2#CWENrVkN~h zE?ns0e3Nya_4tZn5DwgS#YdjjsZdHu#8#gj`g=W?Wx9 z>xa^hPfvdhz@y8cJc3#8eQ%+67MJb9$CJqI33DJ9>OdlfB<>l!?L&eUK(np9h6s-|HS)UY4NSw3$}{Gq)#A>DN=iqd`LO3bK6&+aD6h z6w15KqvWDswTblrk2GjpT)@LMZPQZS{n8HZ^vr?L_ZJM*BQz4Z{}T|0t9o`dEYv>j zT>@LeuO|YwQY2W4TX4%RIOh8c#{5FN7UTL|=%3;AdN3=h!{1XRFni;LuYARX(yMI8 zRcvjHmcZ+gb1UElpPyt-1fcbCunQs*qYIohRrkLMVeZ;FP0^ti*0M{x2wD<}Ytq>> zb}U>^ot~9kmzy`&!CWTxZ?FyYb&O5b2W=<2Y_TyZ*A^8ypp0K&N5%z&jxTTk?*lHh zACf=A0YCoEZE#h9cXpVGlgS(-K0A$@$VD#wbBGrg=u%T?i-*maxTwSd;9;i!;4bdM z{grJ2{W5oEZ$d504jLcB(b7g|&OJ^H9N;z*6Gi&wR+}PqDSQc{A3M2HG}F(d^!7Ps zh&_a25j8atb8q*VtG?uG5s-X*L=i!NC*Zo!8xO(1BazkFtpwCu8tZ8N;g#n3ya+@E zeH*Eu=#lxXC1ymyQ9!SVe*NxfHmIgBwvhf0@FCjf{QY(`A9ZJAU*5JdaScnsPL<)T z^7ewCbzmI14axjHT}vT!4WGyIwl0X;vx&Gi=Y^9o zf`k}t%70R6F@47@<{s7!z-%3ee)o&ifS zK6uHemx0ggJO5X{_-d&eGgzds?~vs&ozIqff54PkgkcTzpxjK5Y6yf(E>@mgYh`@< z_P*7qL7>WFRq~rAek;XW!%331cDFgr#@$y1v}^vCoVa>2 zK^G7BII6s}zSXY|<7OCvHaF*8c^B;3hd+&{8nmxH`bsw|zMxSJwrlPW5ghI!hWtR4tne*o1qWc3U;xqA&j^-NpVb3==X?CXbSG}yFv$&VOfZ@x2LX+jB$|vRW#Kdp2-0|K4d)$$X?P_oOhkq^TT~n-tlobpIpO> zQ zwv@ekZtQH^WE@|F@Y$?sA3i?X3IaS`4RCT&8J!goSD%8> z@DnDHR-OD<^CBR_@o|$g0q$(pJ1{a{%|sZe)jSd6hZ-Rtd_1Fogy9b@TX3J{4vCpr zvBE?gsb^xTD_9iJe_5Vgsk_A|Qv zX|5f6f)w)`J(LKgpPRPaA2xF~=z7wu2=Y^5EJN+0YnB{-J=hkS$wQ&! zs$rDGe~t*HbzVd`Utv43j{ARp7T~ zpJ#6gyAO#6_z;jL#lxKSk|&&9TxM4~=iIbpLJ~O)eAb5q_{&P06snTn9B}G|HFbaA zw=fnrd#|~(I3(Gh+;vn_Qg<%9az9FdekU_gsxK9IBMlQ1tti*%M$AZ!)4r&Y>1IxYM+MDGX{cFSc=JJMy;c49^?$8fn_?=1WIxIS9 zMt_YqsJL@;<6MTZ5!XH#v>JOO^GftO&c55Vq|A-HXS6N;hxZR|RZ}x^jsBclOZ2+t z=+6%y_UoI|Lo+tiIwaa=OwuWF2-e-ndM+y@eyUExAB7@6pL$Vc#&Fv7&CTFoS9Dx0 zoHB$XKA)^`e7Gl3Vi~%7(|<6>i*sj6*aPEXETu(-{&hx?M2byu%?zMS&~+zE%q-wLo?+I}YB3GXS6 zMpC=j1PS*2n}@`{c9Y`){2nZbS&fb@Jm0zzCNn2+{*CN?CPV2^U4{=WN0Vp_oJ35M zrf}7$Ph8!>hyY=fK9*i!g4^X1#kAHtItwMb(bT~qWpMExaw!lM(_G#sSa>a*Lj z|1?Hjr{cHg30O18vV~LQs!~GSV~hGa>QFY^5dU0TTfVn@x;T3@uf=LSR@G`@H9#TU zyK{m$JgiFz#M8i-Q*-=!eS<6~sWeF~>LkRwKIt)r{frhWqH;YVo5x?9u&O4pD5b|Z z%AVabH5EtE{&ZlYx1`1F`TiRVHwvNKMA4t_8q}IpXE86v(iMOH+M6n~EEzshqL@HNR1mn5@mDVOoYAtY6AS3@I z=1*a5k`9>%$6MXIlcEjw%dFC8XR{6+OU5wl_!aqE25!c~a&Fa+C41?H%DnAAt+a>7 zY_icCE-Z4$|Ir;O!S1CJw!%_r&>i2_ZM(e_)}C4iIcJYhD!X%SVi|2;lT$q>y(ydb zrO>*+3r2=^-9GFcVj`xjPJ}8J|K~8Ak=J7U>h_bLu$F|MYvy95H=<)43k`eoxaWU! zzZ%a9`?iNrace7|+#NzpnB666UJg@21T<&3GeSX$x&) z8kT6R57}FH!=?c!Fq>TEXAOn~wb+dn^PNI*55DvFyj%gF_k4@0syGUxk#i9L(5u4N zxK<>&R51@85{QIlk1_fgSedSL*bJp8x<5R_vb?tTn?%m!>9R; zbSfpZZfeq81mA3cOBGraxFq3xZ=eTUa&JQL|-4sBRhg?;H|?$XT_jQ;mw)ad$G}YI$B%}eArpX@d@BQvh zi*LSXYEQ;;5=j8$Fcl6%_8_*xy0){7Mz`tLmusY1)bJ@MR>lJTUJ)nkg@5q8tr+?r zgI1D5-5HdP3-rkw&Xu3uSfp!?lisL(pN@m8Vr1hDc_Ov7_W4PW0}K?OpdN|RpU zx8Wk?*L@4E*UbsmmCrjTRi4jjspSQbw?Dn7DkNF^0&o4pebOubOY6swD%F_}RElI} zPk3z@VxWXe{oxxCHTl3NtB+ojWU+)yG94c_x6X^L^5s%XHGZ_5$|M&1-8YjHdh-z` zYT&92;>B;9s^qeRqbDY9aGqYKJT;XHf8_KnvRa2h?Y-c8W3~6%W>$K)s(FnN9W6c~ z?YOw~;%)1Ncb=p^)v*S1*Twl|qjADTUc*c_8?v>a;zOr+b#KB7qU&3htq&`8N}Mak zY?w6gQ?Ki5pA5SR58K$D(;VAst&rD0H3dQXj&y|FFsLL+2HvaP)|Idrt zMReiX0o^tE+p^*UJUkY0GEYiT3s;D$$ zlap}nS7R=68F82H@wGJYTHq2Q=*nyVD5-O-5SK91!C9zD!^Yq>({aIFhXk4U70D|v z&kEk!wU(7&3fn}V{|wZjV4#SosO?Svh6gpBAwFAP+ebIp$t&;$q=tXbL5<(|sa5+M zJMZDC@rt(Yv0!U3i}W_{g8VSQhzF*4>0*ntnC`>pWSurfDi6c$@4G5=vBWtl7%{W> zE0LJHY!??H9N=RfKJA{FH+Z$DC&uTtCIK<@nLHYh&K2bAlp#X9q9cZfcM6wvGAPG? zrK2BR;utg!i+Q#zh7Ue@PN_W^8S6Copb3!}V;mBCJB(fKJNr_0pW!u|YFL___zri^ zSS_$;f?BGPq-V-d)hk&Ei-Zftd8wWAVA&;nq`lRKZ>~IeAUrSlvp|nFa_RERs4dx9 zfo`~)z)sqJ=O2pK*<-3y!1wbd{!3##Z~FLVqlc$h^)i>reg0 zJq869^VZXQmsZ){y_Sst08L+vw1qF!(<;&bCGy~DF0Ni{tR^|I#uEq#QosnPoVa)>H{wV%g(@A>|tS^$R}^b?oA+zgv?3eXalQxbFpFYOL7b_vw8b z)`RD0fnI@nFwx6NBz`Y8I=>~33rNpWfEmq~-@^AvM1pQ@p|fTQo~Q=Gu>Jqkde4g6 zxtdM}h=}>K)$>Qe3Kc*C;*-^m)oj_I!R%n7c^qCVvZ~EdAG??H9eYFk56)(V)Xe0w!6)ndM)2F0w3YLmQ&fnKBx9wSa;(9WT)R&i7q_xE^rufF?(d0hCH5%BTsKzV`6xakbZr*JfL~| zotA%zS5~!ckMWoDmG~NRgc)@3YpKl}`Ww=qPq4So@_KjDJVi0?(8KEZK`4;duvvii zoQ+$O)&q{b)b6v{KTs}rNeHyAw&-%6%mLf~H#BYt4uDr$({+HSnsSvqalkOiP%t@N zYTjRJ=AJ3#?tJ1~4cKahJ@lW0W{CGJ<*o_WwuYsPmErzJZGgjrG)`2mPq3CkWhgRS zna!V`pQ);8m}vZ6--Sd*SSY(#Y#)6n^3QiRSo@V&7Zd#!*M2(t*Nc-Xik0AW!H5fb zYQf7^A2DAb262BbH!bk6x&e;ZH^OQ8>reT2T^71bz!<#%oR(1CzHEGUzAmTwq?ma1 zpk4Lba&w*LJY~7{*02`)4l>9HS>`sq-&Zl_sYmuHS^ zZP;x-H_6&HRtf>28602{&Qoq2Cv4c7V!!PU5`MS?-;Lk-z41;}Jq^$}zL)!5;JHfW zpX<%=fxm(wHuJ{=w|^Ip4#ieaA-9EICC`PbqD zEkbS~Q#Wfummw{hwzgdX*C`J5&7B#V#!0V>=H!(f5&}-U8g?XG#a6dk#rXLbl)3zl zhmASfzgjj|J^^WZi2uzFofy-ZID%oP*DZzMsgGSXWE;=;y#9nX14^`5M6<-JCVohP zw+2rRFMsqM160|>EyjGSoC-^zS1X;4V$8vRUpJ@TPV2}?`DZ(QCqLrJ5jggLWq|(Y zRR~Mg%1I8PA-wzHz^thj%0@EHMj#wnc0RWA)iI487w9$?YEjSm;|u#*@l9Svo&CD` za}Y#lG>5mAd`+71@t9~zJPt?#4M_HuiBZv+CQ>)YK2&SC$xW5fKqv`xnZb?vP6fDJg5Wl}`6~ z)+IgGC_;~K_?!ZEp|BE`p`OFq@iS#ayC&q5b4DVM8fLjX3Y&{rq)9~&JaGUQZTN|MH^&r7Pf2&+IQOrYuYAkO zVvS=b;GscYY5yfB{8!cAlY6}H3?VV0>hL?wm%JQ(9xLde>FnHqEqyUdgrsUmeg(b9 zL7%L*Hb1*tNj2lrIe@bx2bUak7ut6xrVCHh-oor}nF)mqZq3E@x{i0ajUsG}FGv8O zLtCS8)>ngGPevy&Wo1sxFQsr;+$WU_8($;QSf)E|;ycT-IHL)x3hhduMv6W6aDwJU zM)yol`_O#K+|J$nA4F+mJzWFvcPjbeSp)hY{{koBlJKrht~A2;6}n-rpEww^61!CY zDSu_g^RmI2ctUUu^{3LjgQp;CT&?1E*f=+VkcCsCI*Z-7G5mk}yBud0D_+?LzQ=%oItjuypw|gXfM`4B!kl%$@Az z08P+1mJCoAn04iIxQI;zL5onVmt=gzzsgF_O|BE?zpGmI8-HD6R>?oP(Y{VLgZ{^07eTd1)?~GCz)O;M`c_OaL}|ymR=ra^sX41i zWVR~b9Y1nf7$3P_m*yO%!^eN8ny2)<0Pw2`K;r+0BD&_vqMb}>ajY&U_4XqPyrxQ| z=zKGBQjXuBOCP8=%Hnfu zxn##Si~`g6I}2ltZHcb5Wc^aBd{p|phC91z^5(x%$KEh5HwIVb*;Pbn>=&0fjQ8|B z5Yyzryxv({{L%(nbH#eD59rkoOE2RR#;Y)Qwt(*GEHRgP*1J<6q3xFdy-&BDH2o20 z@}eIe!Zbt8Zsbh|+!)pgq23Z5_>dwF3`<*tuMJ^OjX0~ba)S7Pr67E{EK@t^wq_{WS5iWElZTlHt{=0+ztNEpT` z1@0HJrgTSFSobK^9{p~0olZyxlJ{Cp>bB7NZ;k%qib&4McXQ=U9N8PGU&ETb<>MmD zo!8?&;g8R%sj$j=b7Sz^(DUAFvAG1nsmwqtjKz{I#QU0Yg&%LP(RqRH@=x+T)Gnp7 zf{NVi|DtZN&KbdHsq`^ATt`rM*#6^%v%KgIM9MeF0f(b#2;G5w;Nd*^4pxpT)Xwg# zk|0M8f)E)?&93+q!E8KjE`ukqOIiuHqipUPeR;r+XhPRMT$(LC6QR@qKO5CBett@C zjBjnV!aG*y!dVfbS5xTt)l#o$E z9q@ftL>Ja^nm&jJ3DG!8v2#Lh&XPok3Ra>17 z^mCtOuy2|Zkr@2Dy4&i$Z`TJrL1W^Ep?N+WM+#Sh%At8=1o9Ouam$`gPr^@B%Kz?5 zygy}DNz6q)LTc&f<I9xMZc3i!9~;y-HB;SLlL(a6_WLmLi`d3Hn!E?Q2yDvU_p- zl&f~ps{h$S5^{I1URL^8kQybMiO9;%h(4^uNpA==P6_ZdbP}i44YuJfXsgvQe6idd z*g?pxHw4yUH{h-+EW&#_sIHG(936Fn&aJvP+yCpUx?Ayv{K(3tWWC`poznf2Jg>fs zy06dZv>hH=`7*)LBtS45XlZ-+P|ws*P@gl|+uka6Q;z9#vq4q?7Jz-n4?EZ72CFCd z4#gaNb1SYm%+v_!;#cH(6K@IfLZrfx-&kzE*<-u1uC56Cx$^nORFChtM+Fp%nAPZO zELy`gA-)y%y+)Gk+?UHHA~0K@oN4)bLrHw2k^lRg6ve{$yi` zF-Qe6*Xt>(-nH#~|`UbB`bTxdid%09F3i}xhCYF`e)#2CwC~#=125n8; z{&t5n09d={q}>ri$5KBoYQDgA2{fJzUAzOw?6s=->NqX%*1AY071=?| z4r;OyFKK%Ov)U01t_&b1ZM^jsCVB8P{br)ZxM%Fr6hFSG3pu; zrYy+abAh}sa+qt<-iL3o25_Hjfod59<&?2mz(}6R>H00rc>k(TAln2tA2{T&|4;V7 zWYtGIPdd_DSPErLQVZLoNrgJU@#ssoFmiv@^6MgP^-4w|R;@376&IK9FOvMD)7GR0 zbma!rbDa(?zscH@3hYA!efu_4|H;@;`mN*Ne*vroFnsyNO8=_ilWyRtCIN?) zaNx7s-?A_KcM}@gSx(3w-T9*z3!Uch6q60C;n%*H3qMdBt>bWDPu)d4mEkl(i5{6A zOK^5MBhcy2jJkr}(ZFTV2!X7MqT4Y`_7GdWhMF`Ne-TX~_~C6b|LGUdZ;Ueho+&e3 zL~#@MffMZSCvT4k!l&C8Ox$*VA!(=SqRt=I1p$XXML6;AAcuH`zfZ@`H4KOR{*Ad} zx?Q)e45=th)bqDf9Ye}#!8UC{t^*s#=O8$f@H~e{+z0#^@=zb~1^3`P?}qy=NVnSy zhaH^U!2vqkv`?|-W@j#v-Kv&}Wa0<8X|}U_i%;>(Fo*yg6u#iSB4Mv zDOlgeObOv0x_!Tn#t2+*qwm?+n1nPZ<`JJCclwl;L4$9W43ZNDW#Tz8JMJ)1O-*w9 z{wUF%Gn$Tq4TtOTVDy3V>DT4a|FBAIVj@2d7>mw8r>8@~QqV=61YXQRr*jw1^#%jh z!}%aIv>NA$n7aj+{J8I?RL*+8mIzrpb=uESE z$U0rK4YceTkR~j!+KSDfGy%=PRJfPRbn%hG6WnV^xN;P+uSFnH$g<(X@25E#9sznAA1|MAvY(F+*zSdgF)F$O6j{4Q%>&L7|j z!>o(MhTPj7ney1r$mJZ0uYgQruZiPh5X$z!{T$LBDtGCADiX^V+M1g1&0Aw;FAkM@ zr#Z$3p!;XK8gCZx+ikTy(kzUYHvbAB{y<{Y8-B$G7CgR;POQgFqMTn`_n3RucSufH zVb&}Gj_XM1Bq;%ovJF?AH}8@ck{fBQ9}0#clw!aS&fhW?H$2UZFbC73d&pmhg3lC% zP0nqNRB#jGaCSbOK`7Dfz`AMQS0efkcOSAs2Pg}Z0r8WgHbh{|lX1b#u_=jOj#{nX z3g2;%-wQB9#db;Bugl~v&rDv|qV!R7il9%0s)vC1COnasu<`L&7`h%k|HqVXqB+i0 z;`Il9Vq^v}^lvEjzN>!v7QAlee_4xu>8m{z<8y{$pC6u8R96r7G(Th^lXAejovwp6kz6|n1(KRyDd7VD!2fKu z!tS8qYUcRjPD}W|h%XV=`&(DIhR3f|0Ft@mJHvpQghiw1!p z3TT!=8PJ^<(6r z?!KVaA?!I4jv|Ix3Ss#fFbZ|gW}KO&3j%GgXsGCoH`eSWVeb_>Cae9b??q#U%vR<4 z?1lQmw9>!_Qc@ta)XGm=^f|5e7cu9-N) zTPAEKG@>nXbND0jk%8Wr!yNd9$`D&R_!%q#Nb#g*^foybCJAz4OaI~i4j1_MvjZ}e zhp%@EhFHA1B1;!#63Ihlg_@vKEkd?4DtGQ^?#wUbmkH4REP3m`Z%*3e%u2T>^y^=o zEA>1zTL7{M*d^;Qlbf~rlg`_^XF6!fJUvm4Np?oEg$>>0iGD#!f&~8Ii5^d0X=eHMhf$pgIfMuUt4+}=f8f0d(#)-rc5`vl<6#TMJ z7_q)iNWiuJ9UraNQ?saJ2VrYKj|f@6WJ(CX4Cw&HUa*JF<&}UErrt;?<8)?!Ul*Jg zY&gY^n}DxIMYaCZ;I(+4#|G)+0FM>Djm8_;$;CSFEa^5%rCh%*)i&U#XJ#jAg_1^Q zrpEbby2|F_lLG(KAkTtBEe+x_!kj68_hBLB_%Dcx;n7c@8RqT^&_#Z|DWnx-8pHH& z!Fs0`vHmZ%Lzhf!tOtceXVq&CWZ9Fp$e350bN(`Ll78^rVk1%GpIO5{%)34!I^N>f zzSX?T4GswG-=1<&Wh1@tCa?-nb$}m|1{t8O-AME3W|v<_&U*I>W+|wZ-O=-4Y2?)x z-n!Vk#L^Q87(}8|@p?`tSBdeq@{8hw-$?f8m&vQZN3tl%#idTHlYL-oRq({Llou=v z@2l=s;o9z*pN$+w#gFdYL4%b6h|sIBWLw1~a$I20jf-f-^7q|`!>cO=F>9&KP2D3R z66t4Fi%cr)snN^bp6OZUqQ#!ZF>RQelARMU=0_e-$nCd$mzhE!vxCg-FpO@-yJ(`g z(+&MT6ozH{VhNkfTOX!5^*=EyuG8|jvNcvmzG&c0UIt+Uj54B9#f*^#EfDAR$uc=Jci-!nWo<19ULj@FIPdS)Go_P+cO-S)X=s&dVf%9*3=p7nc8YQ*OE z-@b*Xv#!iqIP!{=4;dd^6xd1o9Ti~FQ0cv_Sm@-ftxo+4h!R}9XX4k>0+iW)x-bd`UUPQPdhs9CrsV*9#w=0cKOS^6~~UP z9$Ynm7^K&8aSGVuZ^d%G_)Oq zIb0FV+j}yhiSzuQIDpiSni{t1vIu+$&yAUl?V!^fT3&k}X@Os|l%2!P4#B}@8%L;* ze0!;v1e5qfLodeTS+d5V!odJu1RCCIfq%H6h=O#GFRZ7-z04V>zHlKo)*Py(16 zbzKpRaKCt2h%rR)`UPr2zV~=*3T)zBaGmAcPctehDNV#NvD~492EM~GbE0e6OiF4L z7i>nrk9TXzzo>Boc5B>T`XJ4v5bG_90rY!QS;~nZ{@W?e%ZDwo93VP& z!0aQl7gt(zePB73k*QS0J8w)Lri{#g`(js`5dL1t5I+^10xMBw%=eS`nn93{eZLl* zlF+A8j#W%)0iAex>n#RZ0#jCumOR z@CKwC9_dA8#s4GfE!>*?1GeuG5+a}?DKHQOr8}fW2`Oo$ySsCv5lQJrq@){0H56nWX%87dV!>Y zYX&+NC0KGLjj?oM0?0=0{D1ZIxnc6VHug-e6A3YC1ZQR~w!v^)+fh;UaLzgU?`yfp z&dye1yF=WuefaV&=EoD`xIl68bywi;{A1puuTe zOhuz_V$x)@oq2T*6Gi#Cs&p@85v|?BUw-dc>igct6h4p7TpDbl+yD`+1^orm&&US9 z%7-_wjeKE~?csCO0TnjV^*_0aeb$5465<0db`>}uSOas^UiC=isa&P{OWfS*RmOz= z+Ww0;85s4fd%*$8$jp|PCt7%Cebf%V$d>as1;-Q8|hFHJUGe7ImqhBBOZzl z-_GxqUrByLJvgoM!@3vO(UpTyUkHZ??qLW!`{>T!jTOts%51eze+)BS;K-Jhgbx&! zJFBIPp4_Vs>vo%;??qMtA4E>mG+#Fj^FFG?0$T=pGTZcjO`V=2zz=>DMWN(Q@R1?+ z{I2O+)c&b-it&_~_RYvH0(^sONkk^{gHjpMeVTT#-C+6;?8zcD_=R?*+MEx^E`F)W z>3PaN0Jl!)9S;xRdaLzF17i2%#1GA~Iu70UP?cA2wD0qSnXm5Sj7Sj7YepB3-|ikM zaeq{K_1#z=bf(hGxtaVgRMZXMw%-Yb zr15EeC}gAdBYP=+T-_P=t>x{P8e|_F78OZ+RBNL>d(Io{|Y*l5d>;t0~XFeb_E&i zL`r++7)pBLmlOxJ-qNN`6>~~fiR5VqwkCenARI3}NiJ&|ZTBO7yVma4l#Y08)Fv`+ z`%@U;&U<+Hn#ZZlXYn~+2SLQUAC$k%7AAh0U~KlC|D6VtFQQlx0Z060GcK`gosrkQ z_Lz@r-FYTgofzJ6lK1>&$5gW_tF5LuBBxl^Gv>1=Aj}AD?a*3HB=u%rm}|1c#%bVi z){j4m2wb<^`BUh9iY)}3gQ+uQI_CGdR&oe@yyZ$@v}r!4sZP<`2I?AliCeUSY2gC) zGC`HQ#-B4QE%4V#Xk(Ae=^n_Dv}RQ2F6Phg+YxT58keqzaTd`jZc_IvZS)D=JXb@U zn7*jHi=MjH zqvclPJnNi;E3L_SZmtfZ^Xa^+S6}%L!wB-RzqBCNo5w$8!{~Bswj~&M_DLtpjJz>! z@W)@KV7UZm1i5+CBcO+z6X31e+>2ZCs!sn- ziAKhid@}2?HDzgs6D=n$C%H<6-?v@`K2jseUI?#!-ney5h**}FFPV|F!mOAYY z8nrVcx$R{}RmjCq_B>ewkf5kEyC43g{I6G=i{!1k<9ucW8-AVkCyv|6TLMyu8S%6J7vi_Qa>PT?d<>?|#=TGs}bK)sM{$j5N zD4#qE8ndFY3B5zI?xVOf2Ozhz!t*bkGw~OO2;kz8`-KMUtYm%F#+XqYRJ3(&sCx<#|DASxV&}_Cu$X^bP z%U=awFO9RNkaU%gJhLwW0_6@%_6KwJf=0sj6@PsOhkcs`jTJe=zw7r{_a&_!0VV#I z1rWLY+d}Hq0$WIOFaN0K&fd_)=7!udvG3;d@=946wj2 z=!OX-r{6?@u)H%$Oeeo&OcceSq>mEj5w@Csb7Bv3;9Ublsm0sKGf$V2MuS<=Y~+r| zl0K(TYcQq9WLCZYU?V#_w|DLK?xy-}wwjh@qo?ht^!>d(GVQvq=w+JXCHsxX)7Ls##aRLI_m6RvK(!Q&hhpWS?MjFSpwr(y08P}gK?R)A zVgvxrwr%k*M{~i^KHY&nlv+6{J^n&K19qm-HN;i`sC|c^irLXO>KpMX{Ga;enMu|C zKk{7O3ZbL4(0|r}n<2z1xv3-bPSo?A(nL>QG2b$#x}v8B62W)cPOmZf;%FE2Ud>Xc zdc}m+9h`=QwK6@v)*m@1-^I1P&v~?5p^ukPzA1o&bdcStZD~g&rSHJo1Rsy01rmWDLFW0zZCM?pZ^9$T-K|ae8%wQ*FC1kvt@(n5ySS|ebHsX$I{gpic8B)6mTakzW)WRIOX6zK> zsKvI)5gRNIQD;>*XShj0cVX{PPp(!?BZpuY`PFLJh0MTYeETO>-L7}n5z~FzUpZ1c zr-3)W8M7czsTR+qGWU-$|q9Fo{inLQ;)DB82yJuQyvX zF)^pRIF(uEmm4WE1w_UXVGy6obh$4ED0tU33>#AM^*8&a9shgs;$W%_zN#=pGH!Q| zbV-=v_(4(>W0BY(*ouFB_BD;L0>#Wz+ z#?KP1Dn*dPbE8FbDqlb@DcsHTk0*Y+BR33CC6u?f=)mWqi4Cc5)P!+H7pI+*q-NM{ z-Z~7rH({H_@O$2>9;g#OO12Q?*(pn-l8SuXgcqNkce09{)}?lSMMfbIoE~USLgw$* znHM19Mufo=`0{0IunScuRA$7;=U?WneI5D|`s1$Zr{DTw8vMK0rxP;}Fl_Zy(N}X= zs2xMMqrO`jq_D1l2)mC{n^@vgcBzNH1l)LQJwN<4KS$=%2&uEs6lgY$JJ8J#N63ml z$Y5hV_%R2Jl&=}^KlF?ccH2qN+4R{-XYMntQ$t`%cHt8H*3}C2J6#r6D}SZ|AsZ5_ zU!~;sJ8x$nY7$59r6pV?q2UDNJDQQ3xWSZ}<}oncE#v0qiNe>i4-VhO2XIHj?}?^X zSNmlt%}5ySQP!Gjr-%Ji5Jr{_iTrs<*v%tM22~F!ndMkYzjnmB0b;N0o~@<05@jYp>dc9TPH zSI=>vDk>r}dYxcLCbQfUGY;)}G__#O)=+rBsF%bojbRTDyn1A)?m$%DwEkQ7==J2K z9CvTUs*l^P6j1aRe|pYguKcXsEo~y}@L{-XQZ9T*5XI?^G^wSv?46Z6PsP~AAGag4JB$(X>OQ)C`RH|#a8c=P zXkJ#JVS`hrMDWFQb>L2~5f(AsKC*Ki7lJH&meg>x#_$qO5xSZvd(WVz50bs-b%4Nc z1pj&?e|C<9IZKeRbV8}ga}Bkhw&l8TT#bb6uk@U!-{Bjf3=uUDT7nlJ??hhAx*E}; zK0Z`q_NplRbajq(tBmvRJXoZt{`)QX2esw+|I8^>j608KZh6nh9txzeQ>6t%C_Rw)tO!z^~b0xvHPcZEXrK*TOO_k9V zVPa42HVUtVGQ#7qL#xe7aD-Gu9A`u5mTMMZd?3y+T-}cR&k{1Vj&@Se82n%qUv)3Z z?R%ZTBxNNdJk2|)k$E*w+-KJNVgzyPFGhO@r8N2L z_oN0jo4nupSp_;jUJTDJ{tAY>V)R&G>NPfbWul=WWN$iDhWn*fjIFjLAJIzYlqX8W z0(I@o*Jd-emIjK7vgua2PKt6w1Q$2k*jx8SZbb6EuLT$K$OL6L5}`vz(KZVn%W?l8 z{_f^q$*dK)L1&c0g1yzx|D^oP+Dkjv=0T!`>%lu|C~$vA98Qz`?>5sPj7ADr8}y*D zteChL&zYE*3QjVpGO_hH#xDPW$HbbEKTD9!&7TjI`hTI&*^HNV%Ei@#nUPg`MgAw8 zJp{|%k%Yo-gvS2vjE!rm>FNlO_s0$@JBDL~6v8F)-|Gkm#QT6!)EV}~>Lag+dxibosi&XMAtX<4cu>Cn?Vrm%;3XZ!k4oL8+Uivb zDDM(PaO~EE#3gTd-TyG|nC5cxG|!CgE@sx0Qf+D8-eNfEL>2q4W&}OmkWMTv8qvJ^ zp;sW+SU8;ByYfo1izg_c{x1yabbUaIsaCYyw$>4lxKI;dw&*#+&Ols0EtI0Y;?=yW zUevU9|7rHCq2F~uq^{y9e|!S4W3rD#4uXk0{+tbn%eyQ9|;7JJ6;Odfn&f8O%&&VyE>Z#^;z zBUD~!k_>U^-AjKOll}-?0i)qVu!__n!%m$$1mqE#WU##pPu>jZ6EaeC9?rT${6&hf zkN8OKZP0g}7)9J}=l>EpSzBsH1sY0*11{c!q%XIVc}nQ%#NDVJ#o%H0T-j${H`nQg z(#hJ47nYReVWN*I7l|p7{Mop?92{sA69M=k$NRz?Md_V!*}8p&i?n6v^( zrQoRSeH{^>4jh|}ngy)l&Q35jG4&?o;`SU%&h9Xdj40$n!SrvT&tCGCe(~A<&-g35 zgW^y|jJrsx1hAU*e<`r9iY33%dY920_HzIDE0zyWgZuY1`l; zDg7Nu1(0nU%NiWqUz95)On}byvPZA#b?6fg$Bd_vFKLo6;RWYbxR`eC`hRu+Qp-24 z&MYlWJBB_9+A4s{WXG3ukWF-jONq)T##iTZi7`wtIpLPDs{&_t1$36O+Pkt4m zHt^vtb$5LLCty?T-CZR=5cBuLsv5oJK@IN6_E-SeKJgD(N?|9Q&t^tM-D2 zznai)u0rPG!h*wIk>~9RyXi;JVG3b5fh7rv`pzKpZKjCVhbMAAJ0lk9Sz?zX^!9wq z(4w9%ZW}#>S;3BEWfa8gGT|Gu6+{c>+e|~xwBqoV^INCUN1#cv$V^w_)`t-Rdq@$% z)6hdP@UZ^<30N*wW7Wo>S}BtX7^?(6^kinEFTaIi)kM}tGj=(-o9noLPN+dTPSv|M zD9YK4#vrWR%@P2er5QNFq+XY(#~PnACV{$P^f5#nt?vuWp^8yU?jB1qRi;0>;Q403 z`jVnH2D0>ux|&CEoZ?iyXRqw12u z&({YQ3pct_UU-Y!?4N6ukZY5c>^2s!GQ^5GZ7l7gv+b^aL|w^i%8;wfQs+{~alzHm zt^2qs6kc1~G}{gM^rko2V>eJx8&cD#L-P$NCXsGqu*=#NcikE4G>d*!myQA+U%u*T zL>)SbrOO8H91_d@cEJ*ktVhd-wbi$i&U)puTk+?)XvCQoE!!@8BPsBpEAq7bIBeuHu8Zgn)eEp|O8<<3= zt~wWp-j$Y!xlFsjC&t4WGs3&U5(+h@R1@C`Zz{h_6j^S(MUZs4Hqg`M+ z-(rRwl?=vRkX#5x4d4exIp0{?ubod#Cr4MIx2K@{v+0#k;rL6`?Tzrh@&1zdlXYg2 z7l~t`*!ow$rH!qIS2&(wU&}Lh6BG+>bh}ee!sObPshgdS%6|Yvc0Xb}wVC7H;LPV94TPbP70|6H30)9%>#H?cE) z{vQ6qVzGICcRJUc)pr)wnN91ZOnJFswR%64dv++5@d!8fL6IOvl@Onmg8SO5cz?>U z8W{P`)=egtJ;Pboem896Z-kd*`n`@PrL1k?%*7OfC6Y{l5js+&pV`=E`*R7F;ms>! zYisT7^_7^2s0_Edy4nqjBTeQra+Q;8ocHg}2;Q+p;>CHg;-p4U$};nVG-rG0Z_gBC z+TiCYB%!<4pC?hNEhJdxak^=|*DUo<+WFon)M9)jI}pQ58H8U}r2hPQn*jT2g!;wO z9Xq59DbvONwVzz(WsYID&jC5}z+MlQOidX ziI2tn#sjAd9TGBN-qGCC$J8qLeToDL+&=L&^`ROYP<{3w24PWKGqF79F3Vdp+D75c z2!YuTC_tSi(}{iV;pw^Zyt0nJ3$9ng!!2FrhP@pz8J|bfRnN?0o8Y$4x49Kdq0h+5 zT~gQ@<}b(iG28y^9`e$2;wdd7cH2mH<$69o=hDRT>Vlo(z1_KY zc)@LMs{=i}rVM9G+)542sbvsbA7%4X4?d0-{Mm|<60Q0zeuJRnr|h^d zbt=2J`}eF;%4W(^yWe_19#8d}4riL(=4J>0UJL7FdX~DCjN?^LUIQudw3y;yME)tw z^l>)s=W^QDJLK*!WW|T_F#`R`OQ$>9^^TAFJ~FZ2o`a@l_Vuen_sY7cTmJMGeQDHF zCsfRlW*O9-&h#Lj4kHi*#IFQ;f~{uZ_`M_6#@^na5L?ASxefa`qV5D&v4NxdE=AV% zXOGqQZnu@AKiAQNrn!!gj)vZUL*A02b1wVGXb!%l0HTSV7$%(Z0yJXkvT`yS!pHSe z+>rQUz#y}EP>3oqB@RBqV1)GV%-#I}{(wk7HFN6>hPuP09@afN;4&z0=W~e%#Q99G zZyz&YnxGP>Hz?(zUMW2GM&g|O{b?0%({uA$3+@ZQLzMD9S(V3urNuuyt!G13kt68Z z!bjUJb1pJ9a8taqvdBUcXv}pUWIh%C+?wQ(dqV2SLSBsp)(Z{L{Y& zBq6PV5f_@Yr=-{tOQB`FwcITy2+jr0-HY;mn!oO?wt^HJ{i88D9g=UoC+@m)1}o9+ z7=9xRP*EOKn(mm|<4rcvl6#*#1JkDsK&OjT-KKC)tamU1bUTAKQn1?raO2Na1%GST z$R5!tKYgQ5o9=vp6kt0zUfa!0gE0(8>);>o1~@W3qb6@?;44!|Jur^k zHr6FGJB|%?`BkHM+K<2;t=@7qVxvh(wQ95mzBPA#S#f>hq1oyfr32#^?KLAQZJ5in z)^GVGCstSSiS$C4&%(lW`3mmRaN=e7YEme`GC}(l;mTF4c2em?PRF~1d2ct)`|{;Z zH*%NXv@2%8Ge_%#(qMHYZ)HDo?IvG0Fd3h%z-;K(o;2lN~+&9ZZ7$qEi|{w6J0 z7vI@GzV(znrn`Z*|Ba96S>X0c^1FD)`EPUi|oH;wr7tfQ9 zK78=)`?u=DcF@%Ife$0y-NI*Yoe0RzE(=E9lj>B^YRQ@mI!z7CBq)=QEnm6(^M2qi z;q1lKXEaMYN=_SXV(o63t6X_uTnsttzx$ao=(GX~?6*0!cv~IG@fH8+;B3XI`&zI4 z0kC*Q9{|F>nV>4dNUJ$sZuetl8>@(7wUwE?Bb=C6$XCwo2)u38TE13Jr5gyQ7|xHq z8|}G%6JDr5jUIpa|;xE$L1_=S_POp8OERhwOtoq<3D_Vp^Q@oTN3hj@2Q zQ~K+XrsaLws4Z5f9$-~aa|nARm^t7YFJb6SM{$I4ZR$(Uq7s9vuuLmm zd$WwWOcJY&o^>dT-C~r%^1*=1$eNhCwKN?JXjrl&+?jmUN_jl#`lWb@zs}4W`-e{C zY17Z$X7zpiqmRjfLXCR!X3C}jlw6)c8op}|U;=x6*IEhaPX@OS%x!HQs9DGDH|-3Z z?VJ++u0S`zh1!daz`d2$G7@^##@wPP(Z#_V2ozrNcR4XHu~L7m8piciHv zTG3epJ9~`2+e^zeSppmN*%8CS4*kqe-corp@_+sFIk-g2aHRq#(C=xTw{f5*5PaE6 z6`GrWhTV{TH++icmDLZSu7hR7aJbsM4J6Q*dhumLJciC+#Q)(~g2b-n2Ca>FDho-R zBP6QjEf{*|ojW->4tgL57QPhkMgcuKj#(nwiC{gyCY^>nkIXMRg6pPSf^}y(REIc8 z=|SgoiFu!@bDt^~@EeL0YuT?B4zXPS#=CF6-!%~=E6V=*O{>6g#Q-xS?00HSqt^94 z>JFT-^tH9v?I!y0Ci`XppdV3y6^C;wMZcwT@qYjV|8@AT zsM1)?{{G2$zNbk%42l6fx+uf2Iet(5Bd=�i=ah>QP$nA9e+0V{+_5@}8N|@q&yW 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 >o}?VU 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