@jfvilas/plugin-kwirth-log 0.12.6 → 0.12.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -41,7 +41,7 @@ Following table shows version compatibility between this Kwirth Backstage plugin
41
41
 
42
42
  | Plugin Kwirth version | Kwirth version |
43
43
  |-|-|
44
- |0.11.3|0.3.155|
44
+ |0.11.3|0.3.160|
45
45
  |0.12.5|0.4.20|
46
46
 
47
47
 
@@ -162,7 +162,7 @@ When the log stream starts, and all along the life of the stream (until it gets
162
162
  The icons will light up in its corresponding color when a new message arrives.
163
163
 
164
164
  This is how it feels:
165
- ![status info](https://raw.githubusercontent.com/jfvilas/plugin-kwirth-log/master/images/status-info.png)
165
+ ![status info](https://raw.githubusercontent.com/jfvilas/plugin-kwirth-log/master/images/kwirthlog-status-info.png)
166
166
 
167
167
  If you click on one of the status icons when theyr are enableds (coloured), you will see the detail of the status.
168
- ![status detail](https://raw.githubusercontent.com/jfvilas/plugin-kwirth-log/master/images/status-detail.png)
168
+ ![status detail](https://raw.githubusercontent.com/jfvilas/plugin-kwirth-log/master/images/kwirthlog-status-detail.png)
@@ -1,4 +1,4 @@
1
- import { getVersion, requestAccess } from '@jfvilas/plugin-kwirth-common';
1
+ import { getVersion, getResources, requestAccess } from '@jfvilas/plugin-kwirth-common';
2
2
 
3
3
  class KwirthLogClient {
4
4
  discoveryApi;
@@ -31,20 +31,25 @@ class KwirthLogClient {
31
31
  // throw new Error(`getVersion error: ${err}`)
32
32
  // }
33
33
  // }
34
+ // move to common
35
+ // async getResources(entity:Entity): Promise<ClusterValidPods> {
36
+ // try {
37
+ // const baseUrl = await this.discoveryApi.getBaseUrl('kwirth')
38
+ // const targetUrl = `${baseUrl}/start`
39
+ // var payload=JSON.stringify(entity)
40
+ // const result = await this.fetchApi.fetch(targetUrl, {method:'POST', body:payload, headers:{'Content-Type':'application/json'}})
41
+ // const data = await result.json() as ClusterValidPods
42
+ // if (!result.ok) {
43
+ // throw new Error(`getResources error: not ok`)
44
+ // }
45
+ // return data
46
+ // }
47
+ // catch (err) {
48
+ // throw new Error(`getResources error: ${err}`)
49
+ // }
50
+ // }
34
51
  async getResources(entity) {
35
- try {
36
- const baseUrl = await this.discoveryApi.getBaseUrl("kwirth");
37
- const targetUrl = `${baseUrl}/start`;
38
- var payload = JSON.stringify(entity);
39
- const result = await this.fetchApi.fetch(targetUrl, { method: "POST", body: payload, headers: { "Content-Type": "application/json" } });
40
- const data = await result.json();
41
- if (!result.ok) {
42
- throw new Error(`getResources error: not ok`);
43
- }
44
- return data;
45
- } catch (err) {
46
- throw new Error(`getResources error: ${err}`);
47
- }
52
+ return getResources(this.discoveryApi, this.fetchApi, entity);
48
53
  }
49
54
  async requestAccess(entity, channel, scopes) {
50
55
  return requestAccess(this.discoveryApi, this.fetchApi, entity, channel, scopes);
@@ -1 +1 @@
1
- {"version":3,"file":"KwirthLogClient.esm.js","sources":["../../src/api/KwirthLogClient.ts"],"sourcesContent":["/*\r\nCopyright 2024 Julio Fernandez\r\n\r\nLicensed under the Apache License, Version 2.0 (the \"License\");\r\nyou may not use this file except in compliance with the License.\r\nYou may obtain a copy of the License at\r\n\r\n http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nUnless required by applicable law or agreed to in writing, software\r\ndistributed under the License is distributed on an \"AS IS\" BASIS,\r\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\nSee the License for the specific language governing permissions and\r\nlimitations under the License.\r\n*/\r\nimport { DiscoveryApi, FetchApi } from '@backstage/core-plugin-api'\r\nimport { KwirthLogApi } from './types'\r\nimport { Entity } from '@backstage/catalog-model'\r\nimport { ClusterValidPods, getVersion, requestAccess } from '@jfvilas/plugin-kwirth-common'\r\nimport { InstanceConfigScopeEnum } from '@jfvilas/kwirth-common'\r\n\r\nexport interface KwirthLogClientOptions {\r\n discoveryApi: DiscoveryApi\r\n fetchApi: FetchApi\r\n}\r\n\r\nexport class KwirthLogClient implements KwirthLogApi {\r\n private readonly discoveryApi: DiscoveryApi\r\n private readonly fetchApi: FetchApi\r\n\r\n constructor(options: KwirthLogClientOptions) {\r\n this.discoveryApi = options.discoveryApi\r\n this.fetchApi = options.fetchApi\r\n }\r\n\r\n /**\r\n * \r\n * @param entity \r\n * @returns an array of clusters (with their correpsonding info) and a pod list for each, where the entity has been dicovered\r\n */\r\n // +++ test\r\n async getVersion() : Promise<string> {\r\n return getVersion(this.discoveryApi, this.fetchApi)\r\n }\r\n // async getVersion(): Promise<string> {\r\n // try {\r\n // const baseUrl = await this.discoveryApi.getBaseUrl('kwirth')\r\n // const targetUrl = `${baseUrl}/version`\r\n\r\n // const result = await this.fetchApi.fetch(targetUrl)\r\n // const data = await result.json()\r\n\r\n // if (!result.ok) {\r\n // throw new Error(`getVersion error: not ok`)\r\n // }\r\n // return data.version\r\n // }\r\n // catch (err) {\r\n // throw new Error(`getVersion error: ${err}`)\r\n // }\r\n // }\r\n\r\n async getResources(entity:Entity): Promise<ClusterValidPods> {\r\n try {\r\n const baseUrl = await this.discoveryApi.getBaseUrl('kwirth')\r\n const targetUrl = `${baseUrl}/start`\r\n\r\n var payload=JSON.stringify(entity)\r\n const result = await this.fetchApi.fetch(targetUrl, {method:'POST', body:payload, headers:{'Content-Type':'application/json'}})\r\n const data = await result.json() as ClusterValidPods\r\n\r\n if (!result.ok) {\r\n throw new Error(`getResources error: not ok`)\r\n }\r\n return data\r\n }\r\n catch (err) {\r\n throw new Error(`getResources error: ${err}`)\r\n }\r\n }\r\n\r\n async requestAccess(entity:Entity, channel:string, scopes:InstanceConfigScopeEnum[]): Promise<ClusterValidPods[]> {\r\n return requestAccess(this.discoveryApi, this.fetchApi, entity, channel, scopes)\r\n }\r\n\r\n // async requestAccess(entity:Entity, channel:string, scopes:InstanceConfigScopeEnum[]): Promise<ClusterValidPods[]> {\r\n // try {\r\n // const baseUrl = await this.discoveryApi.getBaseUrl('kwirth')\r\n // var targetUrl:URL= new URL (`${baseUrl}/access`)\r\n // targetUrl.searchParams.append('scopes',scopes.join(','))\r\n // targetUrl.searchParams.append('channel',channel)\r\n\r\n // var payload=JSON.stringify(entity)\r\n // const result = await this.fetchApi.fetch(targetUrl, {method:'POST', body:payload, headers:{'Content-Type':'application/json'}})\r\n // const data = await result.json() as ClusterValidPods[]\r\n\r\n // // we reconstruct the 'Map' from string of arrays\r\n // for (var c of data) {\r\n // c.accessKeys = new Map(JSON.parse(((c as any).accessKeys)))\r\n // }\r\n // if (!result.ok) {\r\n // throw new Error(`requestAccess error: not ok`)\r\n // }\r\n // return data\r\n // }\r\n // catch (err) {\r\n // throw new Error(`requestAccess error: ${err}`)\r\n // }\r\n // }\r\n\r\n}\r\n"],"names":[],"mappings":";;AA0BO,MAAM,eAAwC,CAAA;AAAA,EAChC,YAAA;AAAA,EACA,QAAA;AAAA,EAEjB,YAAY,OAAiC,EAAA;AACzC,IAAA,IAAA,CAAK,eAAe,OAAQ,CAAA,YAAA;AAC5B,IAAA,IAAA,CAAK,WAAW,OAAQ,CAAA,QAAA;AAAA;AAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,UAA+B,GAAA;AACjC,IAAA,OAAO,UAAW,CAAA,IAAA,CAAK,YAAc,EAAA,IAAA,CAAK,QAAQ,CAAA;AAAA;AACtD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,MAAM,aAAa,MAA0C,EAAA;AACzD,IAAI,IAAA;AACA,MAAA,MAAM,OAAU,GAAA,MAAM,IAAK,CAAA,YAAA,CAAa,WAAW,QAAQ,CAAA;AAC3D,MAAM,MAAA,SAAA,GAAY,GAAG,OAAO,CAAA,MAAA,CAAA;AAE5B,MAAI,IAAA,OAAA,GAAQ,IAAK,CAAA,SAAA,CAAU,MAAM,CAAA;AACjC,MAAA,MAAM,SAAS,MAAM,IAAA,CAAK,QAAS,CAAA,KAAA,CAAM,WAAW,EAAC,MAAA,EAAO,MAAQ,EAAA,IAAA,EAAK,SAAS,OAAQ,EAAA,EAAC,cAAe,EAAA,kBAAA,IAAoB,CAAA;AAC9H,MAAM,MAAA,IAAA,GAAO,MAAM,MAAA,CAAO,IAAK,EAAA;AAE/B,MAAI,IAAA,CAAC,OAAO,EAAI,EAAA;AACZ,QAAM,MAAA,IAAI,MAAM,CAA4B,0BAAA,CAAA,CAAA;AAAA;AAEhD,MAAO,OAAA,IAAA;AAAA,aAEJ,GAAK,EAAA;AACR,MAAA,MAAM,IAAI,KAAA,CAAM,CAAuB,oBAAA,EAAA,GAAG,CAAE,CAAA,CAAA;AAAA;AAChD;AACJ,EAEA,MAAM,aAAA,CAAc,MAAe,EAAA,OAAA,EAAgB,MAA+D,EAAA;AAC9G,IAAA,OAAO,cAAc,IAAK,CAAA,YAAA,EAAc,KAAK,QAAU,EAAA,MAAA,EAAQ,SAAS,MAAM,CAAA;AAAA;AAClF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BJ;;;;"}
1
+ {"version":3,"file":"KwirthLogClient.esm.js","sources":["../../src/api/KwirthLogClient.ts"],"sourcesContent":["/*\r\nCopyright 2024 Julio Fernandez\r\n\r\nLicensed under the Apache License, Version 2.0 (the \"License\");\r\nyou may not use this file except in compliance with the License.\r\nYou may obtain a copy of the License at\r\n\r\n http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nUnless required by applicable law or agreed to in writing, software\r\ndistributed under the License is distributed on an \"AS IS\" BASIS,\r\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\nSee the License for the specific language governing permissions and\r\nlimitations under the License.\r\n*/\r\nimport { DiscoveryApi, FetchApi } from '@backstage/core-plugin-api'\r\nimport { KwirthLogApi } from './types'\r\nimport { Entity } from '@backstage/catalog-model'\r\nimport { ClusterValidPods, getResources, getVersion, requestAccess } from '@jfvilas/plugin-kwirth-common'\r\nimport { InstanceConfigScopeEnum } from '@jfvilas/kwirth-common'\r\n\r\nexport interface KwirthLogClientOptions {\r\n discoveryApi: DiscoveryApi\r\n fetchApi: FetchApi\r\n}\r\n\r\nexport class KwirthLogClient implements KwirthLogApi {\r\n private readonly discoveryApi: DiscoveryApi\r\n private readonly fetchApi: FetchApi\r\n\r\n constructor(options: KwirthLogClientOptions) {\r\n this.discoveryApi = options.discoveryApi\r\n this.fetchApi = options.fetchApi\r\n }\r\n\r\n /**\r\n * \r\n * @param entity \r\n * @returns an array of clusters (with their correpsonding info) and a pod list for each, where the entity has been dicovered\r\n */\r\n // +++ test\r\n async getVersion() : Promise<string> {\r\n return getVersion(this.discoveryApi, this.fetchApi)\r\n }\r\n // async getVersion(): Promise<string> {\r\n // try {\r\n // const baseUrl = await this.discoveryApi.getBaseUrl('kwirth')\r\n // const targetUrl = `${baseUrl}/version`\r\n\r\n // const result = await this.fetchApi.fetch(targetUrl)\r\n // const data = await result.json()\r\n\r\n // if (!result.ok) {\r\n // throw new Error(`getVersion error: not ok`)\r\n // }\r\n // return data.version\r\n // }\r\n // catch (err) {\r\n // throw new Error(`getVersion error: ${err}`)\r\n // }\r\n // }\r\n\r\n // move to common\r\n // async getResources(entity:Entity): Promise<ClusterValidPods> {\r\n // try {\r\n // const baseUrl = await this.discoveryApi.getBaseUrl('kwirth')\r\n // const targetUrl = `${baseUrl}/start`\r\n\r\n // var payload=JSON.stringify(entity)\r\n // const result = await this.fetchApi.fetch(targetUrl, {method:'POST', body:payload, headers:{'Content-Type':'application/json'}})\r\n // const data = await result.json() as ClusterValidPods\r\n\r\n // if (!result.ok) {\r\n // throw new Error(`getResources error: not ok`)\r\n // }\r\n // return data\r\n // }\r\n // catch (err) {\r\n // throw new Error(`getResources error: ${err}`)\r\n // }\r\n // }\r\n async getResources(entity:Entity): Promise<ClusterValidPods> {\r\n return getResources(this.discoveryApi, this.fetchApi, entity)\r\n }\r\n\r\n async requestAccess(entity:Entity, channel:string, scopes:InstanceConfigScopeEnum[]): Promise<ClusterValidPods[]> {\r\n return requestAccess(this.discoveryApi, this.fetchApi, entity, channel, scopes)\r\n }\r\n\r\n // async requestAccess(entity:Entity, channel:string, scopes:InstanceConfigScopeEnum[]): Promise<ClusterValidPods[]> {\r\n // try {\r\n // const baseUrl = await this.discoveryApi.getBaseUrl('kwirth')\r\n // var targetUrl:URL= new URL (`${baseUrl}/access`)\r\n // targetUrl.searchParams.append('scopes',scopes.join(','))\r\n // targetUrl.searchParams.append('channel',channel)\r\n\r\n // var payload=JSON.stringify(entity)\r\n // const result = await this.fetchApi.fetch(targetUrl, {method:'POST', body:payload, headers:{'Content-Type':'application/json'}})\r\n // const data = await result.json() as ClusterValidPods[]\r\n\r\n // // we reconstruct the 'Map' from string of arrays\r\n // for (var c of data) {\r\n // c.accessKeys = new Map(JSON.parse(((c as any).accessKeys)))\r\n // }\r\n // if (!result.ok) {\r\n // throw new Error(`requestAccess error: not ok`)\r\n // }\r\n // return data\r\n // }\r\n // catch (err) {\r\n // throw new Error(`requestAccess error: ${err}`)\r\n // }\r\n // }\r\n\r\n}\r\n"],"names":[],"mappings":";;AA0BO,MAAM,eAAwC,CAAA;AAAA,EAChC,YAAA;AAAA,EACA,QAAA;AAAA,EAEjB,YAAY,OAAiC,EAAA;AACzC,IAAA,IAAA,CAAK,eAAe,OAAQ,CAAA,YAAA;AAC5B,IAAA,IAAA,CAAK,WAAW,OAAQ,CAAA,QAAA;AAAA;AAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,UAA+B,GAAA;AACjC,IAAA,OAAO,UAAW,CAAA,IAAA,CAAK,YAAc,EAAA,IAAA,CAAK,QAAQ,CAAA;AAAA;AACtD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsCA,MAAM,aAAa,MAA0C,EAAA;AACzD,IAAA,OAAO,YAAa,CAAA,IAAA,CAAK,YAAc,EAAA,IAAA,CAAK,UAAU,MAAM,CAAA;AAAA;AAChE,EAEA,MAAM,aAAA,CAAc,MAAe,EAAA,OAAA,EAAgB,MAA+D,EAAA;AAC9G,IAAA,OAAO,cAAc,IAAK,CAAA,YAAA,EAAc,KAAK,QAAU,EAAA,MAAA,EAAQ,SAAS,MAAM,CAAA;AAAA;AAClF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BJ;;;;"}
@@ -2,7 +2,7 @@ import React from 'react';
2
2
  import { CodeSnippet } from '@backstage/core-components';
3
3
  import { Grid, Typography, Button } from '@material-ui/core';
4
4
  import KwirthComponentNotFound from '../../assets/kwirth-log-component-not-found.svg';
5
- import { ANNOTATION_KWIRTH_LOCATION } from '@jfvilas/plugin-kwirth-common';
5
+ import { ANNOTATION_BACKSTAGE_KUBERNETES_LABELID, ANNOTATION_BACKSTAGE_KUBERNETES_LABELSELECTOR } from '@jfvilas/plugin-kwirth-common';
6
6
 
7
7
  var ErrorType = /* @__PURE__ */ ((ErrorType2) => {
8
8
  ErrorType2[ErrorType2["NO_PODS"] = 0] = "NO_PODS";
@@ -15,7 +15,9 @@ metadata:
15
15
  name: '$entityName'
16
16
  description: '$entityDescription'
17
17
  labels:
18
- ${ANNOTATION_KWIRTH_LOCATION}: '$entityName'
18
+ ${ANNOTATION_BACKSTAGE_KUBERNETES_LABELID}: '$entityName'
19
+ # Or just don't add this label and use Backstage label selector this way:
20
+ # ${ANNOTATION_BACKSTAGE_KUBERNETES_LABELSELECTOR}: app=$entityName
19
21
  spec:
20
22
  selector:
21
23
  matchLabels:
@@ -25,7 +27,9 @@ spec:
25
27
  name: '$entityName'-pod
26
28
  labels:
27
29
  app: '$entityName'
28
- ${ANNOTATION_KWIRTH_LOCATION}: '$entityName'
30
+ ${ANNOTATION_BACKSTAGE_KUBERNETES_LABELID}: '$entityName'
31
+ # Or just don't add this label and use Backstage label selector this way:
32
+ # ${ANNOTATION_BACKSTAGE_KUBERNETES_LABELSELECTOR}: app=$entityName
29
33
  spec:
30
34
  containers:
31
35
  - name: '$entityName'
@@ -43,7 +47,7 @@ const ComponentNotFound = (props) => {
43
47
  customStyle: { background: "inherit" }
44
48
  }
45
49
  );
46
- var nopodsMsg = `Although this component is well tagged, and we have found some clusters configured in Backstage, we were unable to find "${props.entity.metadata.name}" running on any pod. Maybe you need to tag Kubernetes objects (deployment and pod templates).`;
50
+ var nopodsMsg = `Although this component is well tagged inside Backstage, and we have found some clusters configured in Backstage, we were unable to find "${props.entity.metadata.name}" running on any pod. Maybe you need to tag Kubernetes objects (deployment and pod templates).`;
47
51
  var noclustersMsg = `Although this component has a correct 'kubernetes-id' in the ${props.entity.metadata.name} Component YAML, we couldn't find any cluster. Maybe you need to tag Kubernetes objects (deployments and pod templates).`;
48
52
  switch (props.error) {
49
53
  case 0 /* NO_PODS */:
@@ -1 +1 @@
1
- {"version":3,"file":"ComponentNotFound.esm.js","sources":["../../../src/components/ComponentNotFound/ComponentNotFound.tsx"],"sourcesContent":["/*\r\nCopyright 2024 Julio Fernandez\r\n\r\nLicensed under the Apache License, Version 2.0 (the \"License\");\r\nyou may not use this file except in compliance with the License.\r\nYou may obtain a copy of the License at\r\n\r\n http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nUnless required by applicable law or agreed to in writing, software\r\ndistributed under the License is distributed on an \"AS IS\" BASIS,\r\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\nSee the License for the specific language governing permissions and\r\nlimitations under the License.\r\n*/\r\nimport React from 'react'\r\nimport { Entity } from '@backstage/catalog-model'\r\nimport { CodeSnippet } from '@backstage/core-components'\r\nimport { Button, Grid, Typography } from '@material-ui/core'\r\nimport KwirthComponentNotFound from '../../assets/kwirth-log-component-not-found.svg'\r\nimport { ANNOTATION_KWIRTH_LOCATION } from '@jfvilas/plugin-kwirth-common'\r\n\r\nenum ErrorType {\r\n NO_PODS,\r\n NO_CLUSTERS\r\n}\r\n\r\nconst KUBERNETES_YAML = `apiVersion: apps/v1\r\nkind: Deployment\r\nmetadata:\r\n name: '$entityName'\r\n description: '$entityDescription'\r\n labels:\r\n ${ANNOTATION_KWIRTH_LOCATION}: '$entityName'\r\nspec:\r\n selector:\r\n matchLabels:\r\n app: '$entityName'\r\n template:\r\n metadata:\r\n name: '$entityName'-pod\r\n labels:\r\n app: '$entityName'\r\n ${ANNOTATION_KWIRTH_LOCATION}: '$entityName'\r\n spec:\r\n containers:\r\n - name: '$entityName'\r\n image: your-OCI-image\r\n ...`;\r\n\r\nconst ComponentNotFound = (props: {error: ErrorType, entity:Entity}) => {\r\n var text:string='';\r\n var content:JSX.Element=<CodeSnippet\r\n text={KUBERNETES_YAML.replaceAll('$entityName', props.entity.metadata.name).replaceAll('$entityDescription',props.entity.metadata.description!)}\r\n language=\"yaml\"\r\n showLineNumbers\r\n highlightedNumbers={[7, 17]}\r\n customStyle={{ background: 'inherit' }}\r\n />;\r\n\r\n var nopodsMsg=`Although this component is well tagged, and we have found some clusters configured in Backstage, we were unable to find \"${props.entity.metadata.name}\" running on any pod. Maybe you need to tag Kubernetes objects (deployment and pod templates).`;\r\n var noclustersMsg=`Although this component has a correct 'kubernetes-id' in the ${props.entity.metadata.name} Component YAML, we couldn't find any cluster. Maybe you need to tag Kubernetes objects (deployments and pod templates).`;\r\n \r\n switch(props.error) {\r\n case ErrorType.NO_PODS:\r\n text=nopodsMsg;\r\n break;\r\n case ErrorType.NO_CLUSTERS:\r\n text=noclustersMsg;\r\n break;\r\n }\r\n\r\n return (<>\r\n <Grid container direction=\"row\" justifyContent=\"flex-start\" alignItems=\"flex-start\" spacing={2} >\r\n <Grid item xs={6} md={6}>\r\n <Grid container direction=\"column\">\r\n <Grid item xs>\r\n <Typography variant=\"h5\">{'Component not found'}</Typography>\r\n </Grid>\r\n <Grid item xs>\r\n <Typography variant=\"body1\">{text}</Typography>\r\n </Grid>\r\n <Grid item xs>\r\n {content}\r\n </Grid>\r\n </Grid>\r\n </Grid>\r\n <img src={KwirthComponentNotFound} style={{ left:'10%', marginTop:'10%', width:'30%', position:'relative' }} />\r\n </Grid>\r\n <Button variant=\"contained\" color=\"primary\" target=\"_blank\" href=\"https://backstage.io/docs/features/kubernetes/configuration#surfacing-your-kubernetes-components-as-part-of-an-entity\">\r\n READ MORE\r\n </Button>\r\n </>);\r\n}\r\n\r\nexport { ComponentNotFound, ErrorType }"],"names":["ErrorType"],"mappings":";;;;;;AAsBK,IAAA,SAAA,qBAAAA,UAAL,KAAA;AACE,EAAAA,UAAA,CAAA,UAAA,CAAA,SAAA,CAAA,GAAA,CAAA,CAAA,GAAA,SAAA;AACA,EAAAA,UAAA,CAAA,UAAA,CAAA,aAAA,CAAA,GAAA,CAAA,CAAA,GAAA,aAAA;AAFG,EAAAA,OAAAA,UAAAA;AAAA,CAAA,EAAA,SAAA,IAAA,EAAA;AAKL,MAAM,eAAkB,GAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,EAMlB,0BAA0B,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,EAUtB,0BAA0B,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAAA,CAAA;AAO9B,MAAA,iBAAA,GAAoB,CAAC,KAA6C,KAAA;AACpE,EAAA,IAAI,IAAY,GAAA,EAAA;AAChB,EAAA,IAAI,OAAoB,mBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACvB,IAAM,EAAA,eAAA,CAAgB,UAAW,CAAA,aAAA,EAAe,MAAM,MAAO,CAAA,QAAA,CAAS,IAAI,CAAA,CAAE,UAAW,CAAA,oBAAA,EAAqB,KAAM,CAAA,MAAA,CAAO,SAAS,WAAY,CAAA;AAAA,MAC9I,QAAS,EAAA,MAAA;AAAA,MACT,eAAe,EAAA,IAAA;AAAA,MACf,kBAAA,EAAoB,CAAC,CAAA,EAAG,EAAE,CAAA;AAAA,MAC1B,WAAA,EAAa,EAAE,UAAA,EAAY,SAAU;AAAA;AAAA,GACvC;AAEA,EAAA,IAAI,SAAU,GAAA,CAAA,yHAAA,EAA4H,KAAM,CAAA,MAAA,CAAO,SAAS,IAAI,CAAA,8FAAA,CAAA;AACpK,EAAA,IAAI,aAAc,GAAA,CAAA,6DAAA,EAAgE,KAAM,CAAA,MAAA,CAAO,SAAS,IAAI,CAAA,wHAAA,CAAA;AAE5G,EAAA,QAAO,MAAM,KAAO;AAAA,IAClB,KAAK,CAAA;AACH,MAAK,IAAA,GAAA,SAAA;AACL,MAAA;AAAA,IACF,KAAK,CAAA;AACH,MAAK,IAAA,GAAA,aAAA;AACL,MAAA;AAAA;AAGJ,EAAA,iFACK,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,WAAS,IAAC,EAAA,SAAA,EAAU,OAAM,cAAe,EAAA,YAAA,EAAa,YAAW,YAAa,EAAA,OAAA,EAAS,qBACxF,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,MAAI,IAAC,EAAA,EAAA,EAAI,GAAG,EAAI,EAAA,CAAA,EAAA,sCACjB,IAAK,EAAA,EAAA,SAAA,EAAS,MAAC,SAAU,EAAA,QAAA,EAAA,sCACrB,IAAK,EAAA,EAAA,IAAA,EAAI,MAAC,EAAE,EAAA,IAAA,EAAA,sCACZ,UAAW,EAAA,EAAA,OAAA,EAAQ,QAAM,qBAAsB,CAChD,mBACC,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,MAAI,IAAC,EAAA,EAAA,EAAE,wBACZ,KAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,SAAQ,OAAS,EAAA,EAAA,IAAK,CAClC,CACA,kBAAA,KAAA,CAAA,aAAA,CAAC,QAAK,IAAI,EAAA,IAAA,EAAC,IAAE,IACZ,EAAA,EAAA,OACD,CACJ,CACJ,CAAA,sCACC,KAAI,EAAA,EAAA,GAAA,EAAK,yBAAyB,KAAO,EAAA,EAAE,MAAK,KAAO,EAAA,SAAA,EAAU,OAAO,KAAM,EAAA,KAAA,EAAO,UAAS,UAAW,EAAA,EAAG,CACjH,CACA,kBAAA,KAAA,CAAA,aAAA,CAAC,UAAO,OAAQ,EAAA,WAAA,EAAY,OAAM,SAAU,EAAA,MAAA,EAAO,UAAS,IAAK,EAAA,uHAAA,EAAA,EAAwH,WAEzL,CACJ,CAAA;AACJ;;;;"}
1
+ {"version":3,"file":"ComponentNotFound.esm.js","sources":["../../../src/components/ComponentNotFound/ComponentNotFound.tsx"],"sourcesContent":["/*\r\nCopyright 2024 Julio Fernandez\r\n\r\nLicensed under the Apache License, Version 2.0 (the \"License\");\r\nyou may not use this file except in compliance with the License.\r\nYou may obtain a copy of the License at\r\n\r\n http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nUnless required by applicable law or agreed to in writing, software\r\ndistributed under the License is distributed on an \"AS IS\" BASIS,\r\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\nSee the License for the specific language governing permissions and\r\nlimitations under the License.\r\n*/\r\nimport React from 'react'\r\nimport { Entity } from '@backstage/catalog-model'\r\nimport { CodeSnippet } from '@backstage/core-components'\r\nimport { Button, Grid, Typography } from '@material-ui/core'\r\nimport KwirthComponentNotFound from '../../assets/kwirth-log-component-not-found.svg'\r\nimport { ANNOTATION_BACKSTAGE_KUBERNETES_LABELID, ANNOTATION_BACKSTAGE_KUBERNETES_LABELSELECTOR } from '@jfvilas/plugin-kwirth-common'\r\n\r\nenum ErrorType {\r\n NO_PODS,\r\n NO_CLUSTERS\r\n}\r\n\r\nconst KUBERNETES_YAML = `apiVersion: apps/v1\r\nkind: Deployment\r\nmetadata:\r\n name: '$entityName'\r\n description: '$entityDescription'\r\n labels:\r\n ${ANNOTATION_BACKSTAGE_KUBERNETES_LABELID}: '$entityName'\r\n # Or just don't add this label and use Backstage label selector this way:\r\n # ${ANNOTATION_BACKSTAGE_KUBERNETES_LABELSELECTOR}: app=$entityName\r\nspec:\r\n selector:\r\n matchLabels:\r\n app: '$entityName'\r\n template:\r\n metadata:\r\n name: '$entityName'-pod\r\n labels:\r\n app: '$entityName'\r\n ${ANNOTATION_BACKSTAGE_KUBERNETES_LABELID}: '$entityName'\r\n # Or just don't add this label and use Backstage label selector this way:\r\n # ${ANNOTATION_BACKSTAGE_KUBERNETES_LABELSELECTOR}: app=$entityName\r\n spec:\r\n containers:\r\n - name: '$entityName'\r\n image: your-OCI-image\r\n ...`;\r\n\r\nconst ComponentNotFound = (props: {error: ErrorType, entity:Entity}) => {\r\n var text:string='';\r\n var content:JSX.Element=<CodeSnippet\r\n text={KUBERNETES_YAML.replaceAll('$entityName', props.entity.metadata.name).replaceAll('$entityDescription',props.entity.metadata.description!)}\r\n language=\"yaml\"\r\n showLineNumbers\r\n highlightedNumbers={[7, 17]}\r\n customStyle={{ background: 'inherit' }}\r\n />;\r\n\r\n var nopodsMsg=`Although this component is well tagged inside Backstage, and we have found some clusters configured in Backstage, we were unable to find \"${props.entity.metadata.name}\" running on any pod. Maybe you need to tag Kubernetes objects (deployment and pod templates).`;\r\n var noclustersMsg=`Although this component has a correct 'kubernetes-id' in the ${props.entity.metadata.name} Component YAML, we couldn't find any cluster. Maybe you need to tag Kubernetes objects (deployments and pod templates).`;\r\n \r\n switch(props.error) {\r\n case ErrorType.NO_PODS:\r\n text=nopodsMsg;\r\n break;\r\n case ErrorType.NO_CLUSTERS:\r\n text=noclustersMsg;\r\n break;\r\n }\r\n\r\n return (<>\r\n <Grid container direction=\"row\" justifyContent=\"flex-start\" alignItems=\"flex-start\" spacing={2} >\r\n <Grid item xs={6} md={6}>\r\n <Grid container direction=\"column\">\r\n <Grid item xs>\r\n <Typography variant=\"h5\">{'Component not found'}</Typography>\r\n </Grid>\r\n <Grid item xs>\r\n <Typography variant=\"body1\">{text}</Typography>\r\n </Grid>\r\n <Grid item xs>\r\n {content}\r\n </Grid>\r\n </Grid>\r\n </Grid>\r\n <img src={KwirthComponentNotFound} style={{ left:'10%', marginTop:'10%', width:'30%', position:'relative' }} />\r\n </Grid>\r\n <Button variant=\"contained\" color=\"primary\" target=\"_blank\" href=\"https://backstage.io/docs/features/kubernetes/configuration#surfacing-your-kubernetes-components-as-part-of-an-entity\">\r\n READ MORE\r\n </Button>\r\n </>);\r\n}\r\n\r\nexport { ComponentNotFound, ErrorType }"],"names":["ErrorType"],"mappings":"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"}
@@ -2,7 +2,7 @@ import React, { useState, useRef } from 'react';
2
2
  import useAsync from 'react-use/esm/useAsync';
3
3
  import { Progress, WarningPanel } from '@backstage/core-components';
4
4
  import { useApi, alertApiRef } from '@backstage/core-plugin-api';
5
- import { isKwirthAvailable, ANNOTATION_KWIRTH_LOCATION } from '@jfvilas/plugin-kwirth-common';
5
+ import { isKwirthAvailable, ANNOTATION_BACKSTAGE_KUBERNETES_LABELID, ANNOTATION_BACKSTAGE_KUBERNETES_LABELSELECTOR } from '@jfvilas/plugin-kwirth-common';
6
6
  import { useEntity, MissingAnnotationEmptyState } from '@backstage/plugin-catalog-react';
7
7
  import { kwirthLogApiRef } from '../../api/types.esm.js';
8
8
  import { SignalMessageLevelEnum, InstanceConfigScopeEnum, InstanceMessageChannelEnum, InstanceMessageTypeEnum, OpsCommandEnum, accessKeySerialize, InstanceMessageFlowEnum, InstanceMessageActionEnum, InstanceConfigViewEnum, InstanceConfigObjectEnum } from '@jfvilas/kwirth-common';
@@ -398,7 +398,7 @@ const EntityKwirthLogContent = (props) => {
398
398
  }
399
399
  return /* @__PURE__ */ React.createElement(React.Fragment, null, podPrefix, containerPrefix, logLine.text + "\n");
400
400
  };
401
- return /* @__PURE__ */ React.createElement(React.Fragment, null, loading && /* @__PURE__ */ React.createElement(Progress, null), !isKwirthAvailable(entity) && !loading && error && /* @__PURE__ */ React.createElement(WarningPanel, { title: "An error has ocurred while obtaining data from kuebernetes clusters.", message: error?.message }), !isKwirthAvailable(entity) && !loading && /* @__PURE__ */ React.createElement(MissingAnnotationEmptyState, { readMoreUrl: "https://github.com/jfvilas/plugin-kwirth-log", annotation: ANNOTATION_KWIRTH_LOCATION }), isKwirthAvailable(entity) && !loading && resources && resources.length === 0 && /* @__PURE__ */ React.createElement(ComponentNotFound, { error: ErrorType.NO_CLUSTERS, entity }), isKwirthAvailable(entity) && !loading && resources && resources.length > 0 && resources.reduce((sum, cluster) => sum + cluster.data.length, 0) === 0 && /* @__PURE__ */ React.createElement(ComponentNotFound, { error: ErrorType.NO_PODS, entity }), isKwirthAvailable(entity) && !loading && resources && resources.length > 0 && resources.reduce((sum, cluster) => sum + cluster.data.length, 0) > 0 && /* @__PURE__ */ React.createElement(Box, { sx: { display: "flex", height: "70vh" } }, /* @__PURE__ */ React.createElement(Box, { sx: { width: "200px" } }, /* @__PURE__ */ React.createElement(Grid, { container: true, direction: "column" }, /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(Card, null, /* @__PURE__ */ React.createElement(ClusterList, { resources, selectedClusterName, onSelect: onSelectCluster }))), /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(Card, null, /* @__PURE__ */ React.createElement(Options, { options: kwirthLogOptionsRef.current, onChange: onChangeLogConfig, disabled: selectedContainerNames.length === 0 || started || paused.current }))))), /* @__PURE__ */ React.createElement(Box, { sx: { flexGrow: 1, flex: 1, overflow: "hidden", p: 1, maxWidth: "85%" } }, !selectedClusterName && /* @__PURE__ */ React.createElement("img", { src: KwirthLogLogo, alt: "No cluster selected", style: { left: "40%", marginTop: "10%", width: "20%", position: "relative" } }), selectedClusterName && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Card, { style: { marginTop: -8, height: "100%", display: "flex", flexDirection: "column" } }, /* @__PURE__ */ React.createElement(
401
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, loading && /* @__PURE__ */ React.createElement(Progress, null), !isKwirthAvailable(entity) && !loading && error && /* @__PURE__ */ React.createElement(WarningPanel, { title: "An error has ocurred while obtaining data from kuebernetes clusters.", message: error?.message }), !isKwirthAvailable(entity) && !loading && /* @__PURE__ */ React.createElement(MissingAnnotationEmptyState, { readMoreUrl: "https://github.com/jfvilas/plugin-kwirth-log", annotation: [ANNOTATION_BACKSTAGE_KUBERNETES_LABELID, ANNOTATION_BACKSTAGE_KUBERNETES_LABELSELECTOR] }), isKwirthAvailable(entity) && !loading && resources && resources.length === 0 && /* @__PURE__ */ React.createElement(ComponentNotFound, { error: ErrorType.NO_CLUSTERS, entity }), isKwirthAvailable(entity) && !loading && resources && resources.length > 0 && resources.reduce((sum, cluster) => sum + cluster.data.length, 0) === 0 && /* @__PURE__ */ React.createElement(ComponentNotFound, { error: ErrorType.NO_PODS, entity }), isKwirthAvailable(entity) && !loading && resources && resources.length > 0 && resources.reduce((sum, cluster) => sum + cluster.data.length, 0) > 0 && /* @__PURE__ */ React.createElement(Box, { sx: { display: "flex", height: "70vh" } }, /* @__PURE__ */ React.createElement(Box, { sx: { width: "200px" } }, /* @__PURE__ */ React.createElement(Grid, { container: true, direction: "column" }, /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(Card, null, /* @__PURE__ */ React.createElement(ClusterList, { resources, selectedClusterName, onSelect: onSelectCluster }))), /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(Card, null, /* @__PURE__ */ React.createElement(Options, { options: kwirthLogOptionsRef.current, onChange: onChangeLogConfig, disabled: selectedContainerNames.length === 0 || started || paused.current }))))), /* @__PURE__ */ React.createElement(Box, { sx: { flexGrow: 1, flex: 1, overflow: "hidden", p: 1, maxWidth: "85%" } }, !selectedClusterName && /* @__PURE__ */ React.createElement("img", { src: KwirthLogLogo, alt: "No cluster selected", style: { left: "40%", marginTop: "10%", width: "20%", position: "relative" } }), selectedClusterName && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Card, { style: { marginTop: -8, height: "100%", display: "flex", flexDirection: "column" } }, /* @__PURE__ */ React.createElement(
402
402
  CardHeader,
403
403
  {
404
404
  title: statusButtons(selectedClusterName),
@@ -1 +1 @@
1
- {"version":3,"file":"EntityKwirthLogContent.esm.js","sources":["../../../src/components/EntityKwirthLogContent/EntityKwirthLogContent.tsx"],"sourcesContent":["/*\r\nCopyright 2025 Julio Fernandez\r\n\r\nLicensed under the Apache License, Version 2.0 (the \"License\");\r\nyou may not use this file except in compliance with the License.\r\nYou may obtain a copy of the License at\r\n\r\n http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nUnless required by applicable law or agreed to in writing, software\r\ndistributed under the License is distributed on an \"AS IS\" BASIS,\r\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\nSee the License for the specific language governing permissions and\r\nlimitations under the License.\r\n*/\r\nimport React, { useRef, useState } from 'react'\r\nimport useAsync from 'react-use/esm/useAsync'\r\n\r\nimport { Progress, WarningPanel } from '@backstage/core-components'\r\nimport { alertApiRef, useApi } from '@backstage/core-plugin-api'\r\nimport { ANNOTATION_KWIRTH_LOCATION, isKwirthAvailable, ClusterValidPods, PodData, ILogLine, IStatusLine } from '@jfvilas/plugin-kwirth-common'\r\nimport { MissingAnnotationEmptyState, useEntity } from '@backstage/plugin-catalog-react'\r\n\r\n// kwirthlog\r\nimport { kwirthLogApiRef } from '../../api'\r\nimport { accessKeySerialize, ILogMessage, InstanceMessageActionEnum, InstanceConfigScopeEnum, InstanceConfigViewEnum, InstanceMessage, InstanceMessageTypeEnum, SignalMessage, SignalMessageLevelEnum, InstanceConfigObjectEnum, InstanceConfig, InstanceMessageFlowEnum, InstanceMessageChannelEnum, IOpsMessage, OpsCommandEnum, IRouteMessage, IOpsMessageResponse } from '@jfvilas/kwirth-common'\r\n\r\n// kwirthlog components\r\nimport { ComponentNotFound, ErrorType } from '../ComponentNotFound'\r\nimport { ObjectSelector } from '../ObjectSelector'\r\nimport { Options } from '../Options'\r\nimport { ClusterList } from '../ClusterList'\r\nimport { StatusLog } from '../StatusLog'\r\n\r\n\r\n// Material-UI\r\nimport { Grid, Card, CardHeader, CardContent, Box, Button } from '@material-ui/core'\r\nimport Divider from '@material-ui/core/Divider'\r\nimport IconButton from '@material-ui/core/IconButton'\r\nimport Typography from '@material-ui/core/Typography'\r\n\r\n// Icons\r\nimport PlayIcon from '@material-ui/icons/PlayArrow'\r\nimport PauseIcon from '@material-ui/icons/Pause'\r\nimport StopIcon from '@material-ui/icons/Stop'\r\nimport InfoIcon from '@material-ui/icons/Info'\r\nimport WarningIcon from '@material-ui/icons/Warning'\r\nimport ErrorIcon from '@material-ui/icons/Error'\r\nimport DownloadIcon from '@material-ui/icons/CloudDownload'\r\nimport KwirthLogLogo from '../../assets/kwirthlog-logo.svg'\r\nimport RefreshIcon from '@material-ui/icons/Refresh'\r\n\r\nconst LOG_MAX_MESSAGES=1000\r\n\r\nexport const EntityKwirthLogContent = (props:{ enableRestart: boolean }) => { \r\n const { entity } = useEntity()\r\n const kwirthLogApi = useApi(kwirthLogApiRef)\r\n const alertApi = useApi(alertApiRef)\r\n const [resources, setResources] = useState<ClusterValidPods[]>([])\r\n const [selectedClusterName, setSelectedClusterName] = useState('')\r\n const [selectedNamespaces, setSelectedNamespaces] = useState<string[]>([])\r\n const [selectedPodNames, setSelectedPodNames] = useState<string[]>([])\r\n const [selectedContainerNames, setSelectedContainerNames] = useState<string[]>([])\r\n const [started, setStarted] = useState(false)\r\n const [stopped, setStopped] = useState(true)\r\n const paused=useRef<boolean>(false)\r\n const [messages, setMessages] = useState<ILogLine[]>([])\r\n const [pendingMessages, setPendingMessages] = useState<ILogLine[]>([])\r\n const [statusMessages, setStatusMessages] = useState<IStatusLine[]>([])\r\n const [websocket, setWebsocket] = useState<WebSocket>()\r\n const [instance, setInstance] = useState<string>()\r\n const kwirthLogOptionsRef = useRef<any>({timestamp:false, follow:true, fromStart:false})\r\n const [showStatusDialog, setShowStatusDialog] = useState(false)\r\n const [statusLevel, setStatusLevel] = useState<SignalMessageLevelEnum>(SignalMessageLevelEnum.INFO)\r\n const preRef = useRef<HTMLPreElement|null>(null)\r\n const lastRef = useRef<HTMLPreElement|null>(null)\r\n const [ backendVersion, setBackendVersion ] = useState<string>('')\r\n const { loading, error } = useAsync ( async () => {\r\n if (backendVersion==='') setBackendVersion(await kwirthLogApi.getVersion())\r\n let reqScopes = [InstanceConfigScopeEnum.VIEW]\r\n if (props.enableRestart) reqScopes.push(InstanceConfigScopeEnum.RESTART)\r\n let data:ClusterValidPods[] = await kwirthLogApi.requestAccess(entity, InstanceMessageChannelEnum.LOG, reqScopes)\r\n setResources(data)\r\n })\r\n const buffer = useRef<Map<string,string>>(new Map())\r\n\r\n\r\n const clickStart = (options:any) => {\r\n if (!paused.current) {\r\n setStarted(true)\r\n paused.current=false\r\n setStopped(false)\r\n startLogViewer(options)\r\n }\r\n else {\r\n setMessages( (prev) => [ ...prev, ...pendingMessages])\r\n setPendingMessages([])\r\n paused.current=false\r\n setStarted(true)\r\n }\r\n }\r\n\r\n const onClickPause = () => {\r\n setStarted(false)\r\n paused.current=true\r\n }\r\n\r\n const onClickStop = () => {\r\n setStarted(false)\r\n setStopped(true)\r\n paused.current=false\r\n stopLogViewer()\r\n }\r\n\r\n const onSelectCluster = (name:string|undefined) => {\r\n if (name) {\r\n setSelectedClusterName(name)\r\n setMessages([{\r\n type: InstanceMessageTypeEnum.SIGNAL,\r\n text: 'Select namespace in order to decide which pod logs to view.',\r\n namespace: '',\r\n pod: '',\r\n container: ''\r\n }])\r\n setSelectedNamespaces([])\r\n setSelectedPodNames([])\r\n setSelectedContainerNames([])\r\n setStatusMessages([])\r\n onClickStop()\r\n }\r\n }\r\n\r\n const processLogMessage = (wsEvent:any) => {\r\n let instanceMessage = JSON.parse(wsEvent.data) as InstanceMessage\r\n switch (instanceMessage.type) {\r\n case InstanceMessageTypeEnum.DATA:\r\n let logMessage = instanceMessage as ILogMessage\r\n let bname = logMessage.namespace+'/'+logMessage.pod+'/'+logMessage.container\r\n let text = logMessage.text\r\n if (!buffer.current.has(bname)) buffer.current.set(bname,'')\r\n if (buffer.current.get(bname)) {\r\n text = buffer.current.get(bname) + text\r\n buffer.current.set(bname,'')\r\n }\r\n if (!text.endsWith('\\n')) {\r\n let i = text.lastIndexOf('\\n')\r\n buffer.current.set(bname,text.substring(i))\r\n text = text.substring(0,i)\r\n }\r\n\r\n for (let line of text.split('\\n')) {\r\n if (line.trim() === '') continue\r\n\r\n let logLine:ILogLine = {\r\n text: line,\r\n namespace: logMessage.namespace,\r\n pod: logMessage.pod,\r\n container: logMessage.container,\r\n type: logMessage.type\r\n }\r\n\r\n if (paused.current) {\r\n setPendingMessages((prev) => [ ...prev, logLine ])\r\n }\r\n else {\r\n setMessages((prev) => {\r\n while (prev.length>LOG_MAX_MESSAGES-1) {\r\n prev.splice(0,1)\r\n }\r\n if (kwirthLogOptionsRef.current.follow && lastRef.current) lastRef.current.scrollIntoView({ behavior: 'instant', block: 'start' })\r\n return [ ...prev, logLine ]\r\n })\r\n }\r\n }\r\n break\r\n case InstanceMessageTypeEnum.SIGNAL:\r\n if (instanceMessage.flow === InstanceMessageFlowEnum.RESPONSE && instanceMessage.action === InstanceMessageActionEnum.START) {\r\n if (instanceMessage.instance!=='')\r\n setInstance(instanceMessage.instance)\r\n else {\r\n let signalMessage = instanceMessage as SignalMessage\r\n alertApi.post({ message: signalMessage.text, severity:'error', display:'transient' })\r\n }\r\n }\r\n else {\r\n let signalMessage = instanceMessage as SignalMessage\r\n addMessage(signalMessage.level, signalMessage.text)\r\n switch(signalMessage.level) {\r\n case SignalMessageLevelEnum.INFO:\r\n alertApi.post({ message: signalMessage.text, severity:'info', display:'transient' })\r\n break\r\n case SignalMessageLevelEnum.WARNING:\r\n alertApi.post({ message: signalMessage.text, severity:'warning', display:'transient' })\r\n break\r\n case SignalMessageLevelEnum.ERROR:\r\n alertApi.post({ message: signalMessage.text, severity:'error', display:'transient' })\r\n break\r\n default:\r\n alertApi.post({ message: signalMessage.text, severity:'success', display:'transient' })\r\n break\r\n }\r\n }\r\n break\r\n default:\r\n addMessage(SignalMessageLevelEnum.ERROR, 'Invalid message type received: ' + instanceMessage.type)\r\n alertApi.post({ message: 'Invalid message type received: ' + instanceMessage.type, severity:'error', display:'transient' })\r\n break\r\n }\r\n }\r\n\r\n const addMessage = (level:SignalMessageLevelEnum, text:string) => {\r\n setStatusMessages ((prev) => [...prev, {\r\n level,\r\n text,\r\n type: InstanceMessageTypeEnum.SIGNAL,\r\n }])\r\n }\r\n\r\n const websocketOnMessage = (wsEvent:any) => {\r\n let instanceMessage:InstanceMessage\r\n try {\r\n instanceMessage = JSON.parse(wsEvent.data) as InstanceMessage\r\n }\r\n catch (err) {\r\n console.log(err)\r\n console.log(wsEvent.data)\r\n return\r\n }\r\n\r\n switch(instanceMessage.channel) {\r\n case InstanceMessageChannelEnum.LOG:\r\n processLogMessage(wsEvent)\r\n break\r\n case InstanceMessageChannelEnum.OPS:\r\n let opsMessage = instanceMessage as IOpsMessageResponse\r\n if (opsMessage.data?.data) \r\n addMessage (SignalMessageLevelEnum.WARNING, 'Operations message: '+opsMessage.data.data)\r\n else\r\n addMessage (SignalMessageLevelEnum.WARNING, 'Operations message: '+JSON.stringify(opsMessage))\r\n break\r\n default:\r\n addMessage (SignalMessageLevelEnum.ERROR, 'Invalid channel in message: '+instanceMessage.channel)\r\n addMessage (SignalMessageLevelEnum.ERROR, 'Invalid message: '+JSON.stringify(instanceMessage))\r\n break\r\n }\r\n }\r\n\r\n const websocketOnOpen = (ws:WebSocket, options:any) => {\r\n let cluster=resources.find(cluster => cluster.name === selectedClusterName)\r\n if (!cluster) {\r\n addMessage(SignalMessageLevelEnum.ERROR,'No cluster selected')\r\n return\r\n }\r\n let pods = cluster.data.filter(p => selectedNamespaces.includes(p.namespace))\r\n if (!pods) {\r\n addMessage(SignalMessageLevelEnum.ERROR,'No pods found')\r\n return\r\n }\r\n console.log(`WS connected`)\r\n let accessKey = cluster.accessKeys.get(InstanceConfigScopeEnum.VIEW)\r\n if (accessKey) {\r\n let containers:string[] = []\r\n if (selectedContainerNames.length>0) {\r\n for(var p of selectedPodNames) {\r\n for (var c of selectedContainerNames) {\r\n containers.push(p+'+'+c)\r\n }\r\n }\r\n }\r\n let iConfig:InstanceConfig = {\r\n channel: InstanceMessageChannelEnum.LOG,\r\n objects: InstanceConfigObjectEnum.PODS,\r\n action: InstanceMessageActionEnum.START,\r\n flow: InstanceMessageFlowEnum.REQUEST,\r\n instance: '',\r\n accessKey: accessKeySerialize(accessKey),\r\n scope: InstanceConfigScopeEnum.VIEW,\r\n view: (selectedContainerNames.length > 0 ? InstanceConfigViewEnum.CONTAINER : InstanceConfigViewEnum.POD),\r\n namespace: selectedNamespaces.join(','),\r\n group: '',\r\n pod: selectedPodNames.map(p => p).join(','),\r\n container: containers.join(','),\r\n data: {\r\n timestamp: options.timestamp,\r\n previous: false,\r\n maxMessages: LOG_MAX_MESSAGES,\r\n fromStart: options.fromStart\r\n },\r\n type: InstanceMessageTypeEnum.SIGNAL\r\n }\r\n ws.send(JSON.stringify(iConfig))\r\n }\r\n else {\r\n addMessage(SignalMessageLevelEnum.ERROR,'No accessKey for starting log streaming')\r\n return\r\n }\r\n }\r\n\r\n const startLogViewer = (options:any) => {\r\n let cluster=resources.find(cluster => cluster.name===selectedClusterName);\r\n if (!cluster) {\r\n addMessage(SignalMessageLevelEnum.ERROR,'No cluster selected')\r\n return\r\n }\r\n\r\n setMessages([])\r\n try {\r\n let ws = new WebSocket(cluster.url)\r\n ws.onopen = () => websocketOnOpen(ws, options)\r\n ws.onmessage = (event) => websocketOnMessage(event)\r\n ws.onclose = (event) => websocketOnClose(event)\r\n setWebsocket(ws)\r\n }\r\n catch (err) {\r\n setMessages([ {\r\n type: InstanceMessageTypeEnum.DATA,\r\n text: `Error opening log stream: ${err}`,\r\n namespace: '',\r\n pod: '',\r\n container: ''\r\n } ])\r\n }\r\n\r\n }\r\n\r\n const websocketOnClose = (_event:any) => {\r\n console.log(`WS disconnected`)\r\n setStarted(false)\r\n paused.current=false\r\n setStopped(true)\r\n }\r\n\r\n const stopLogViewer = () => {\r\n messages.push({\r\n type: InstanceMessageTypeEnum.DATA,\r\n text: '============================================================================================================================',\r\n namespace: '',\r\n pod: '',\r\n container: ''\r\n })\r\n websocket?.close()\r\n }\r\n\r\n const onChangeLogConfig = (options:any) => {\r\n kwirthLogOptionsRef.current=options\r\n if (started) {\r\n clickStart(options)\r\n }\r\n }\r\n\r\n const onClickDownload = () => {\r\n let content = preRef.current!.innerHTML.replaceAll('<pre>','').replaceAll('</pre>','\\n')\r\n content = content.replaceAll('<span style=\"color: green;\">','')\r\n content = content.replaceAll('<span style=\"color: blue;\">','')\r\n content = content.replaceAll('</span>','')\r\n let filename = selectedClusterName+'-'+selectedNamespaces+'-'+entity.metadata.name+'.txt'\r\n let mimeType:string = 'text/plain'\r\n \r\n const blob = new Blob([content], { type: mimeType })\r\n const url = URL.createObjectURL(blob)\r\n const link = document.createElement('a')\r\n link.href = url\r\n link.download = filename\r\n document.body.appendChild(link)\r\n link.click()\r\n document.body.removeChild(link)\r\n URL.revokeObjectURL(url)\r\n }\r\n\r\n const onClickRestart = () => {\r\n // we perform a route command from channel 'log' to channel 'ops'\r\n var cluster=resources.find(cluster => cluster.name===selectedClusterName);\r\n if (!cluster) {\r\n addMessage(SignalMessageLevelEnum.ERROR,'No cluster selected')\r\n return\r\n }\r\n let restartKey = cluster.accessKeys.get(InstanceConfigScopeEnum.RESTART)\r\n if (!restartKey) {\r\n addMessage(SignalMessageLevelEnum.ERROR,'No access key present')\r\n return\r\n }\r\n if (!instance) {\r\n addMessage(SignalMessageLevelEnum.ERROR,'No instance has been established')\r\n return\r\n }\r\n\r\n let pods:PodData[] = (cluster.data as PodData[]).filter(pod => selectedNamespaces.includes(pod.namespace))\r\n for (let pod of pods) {\r\n let opsMessage:IOpsMessage = {\r\n msgtype: 'opsmessage',\r\n action: InstanceMessageActionEnum.COMMAND,\r\n flow: InstanceMessageFlowEnum.IMMEDIATE,\r\n type: InstanceMessageTypeEnum.DATA,\r\n channel: InstanceMessageChannelEnum.OPS,\r\n instance: '',\r\n id: '1',\r\n accessKey: accessKeySerialize(restartKey),\r\n command: OpsCommandEnum.RESTARTPOD,\r\n namespace: pod.namespace,\r\n group: '',\r\n pod: pod.name,\r\n container: ''\r\n }\r\n let routeMessage: IRouteMessage = {\r\n msgtype: 'routemessage',\r\n accessKey: accessKeySerialize(restartKey),\r\n destChannel: InstanceMessageChannelEnum.OPS,\r\n action: InstanceMessageActionEnum.ROUTE,\r\n flow: InstanceMessageFlowEnum.IMMEDIATE,\r\n type: InstanceMessageTypeEnum.SIGNAL,\r\n channel: InstanceMessageChannelEnum.LOG,\r\n instance: instance,\r\n data: opsMessage\r\n }\r\n websocket?.send(JSON.stringify(routeMessage))\r\n }\r\n }\r\n\r\n const actionButtons = () => {\r\n let hasViewKey=false, hasRestartKey = false\r\n let cluster=resources.find(cluster => cluster.name===selectedClusterName)\r\n if (cluster) {\r\n hasViewKey = Boolean(cluster.accessKeys.get(InstanceConfigScopeEnum.VIEW))\r\n hasRestartKey = Boolean(cluster.accessKeys.get(InstanceConfigScopeEnum.RESTART))\r\n }\r\n\r\n return <>\r\n { props.enableRestart &&\r\n <IconButton title='Restart' onClick={onClickRestart} disabled={selectedPodNames.length === 0 || !hasRestartKey || !websocket || !started}>\r\n <RefreshIcon />\r\n </IconButton>\r\n }\r\n <IconButton title='Download' onClick={onClickDownload} disabled={messages.length<=1}>\r\n <DownloadIcon />\r\n </IconButton>\r\n <IconButton onClick={() => clickStart(kwirthLogOptionsRef.current)} title=\"Play\" disabled={started || !paused || selectedPodNames.length === 0 || !hasViewKey}>\r\n <PlayIcon />\r\n </IconButton>\r\n <IconButton onClick={onClickPause} title=\"Pause\" disabled={!((started && !paused.current) && selectedPodNames.length > 0)}>\r\n <PauseIcon />\r\n </IconButton>\r\n <IconButton onClick={onClickStop} title=\"Stop\" disabled={stopped || selectedPodNames.length === 0}>\r\n <StopIcon />\r\n </IconButton>\r\n </>\r\n }\r\n\r\n const statusButtons = (title:string) => {\r\n const show = (level:SignalMessageLevelEnum) => {\r\n setShowStatusDialog(true)\r\n setStatusLevel(level)\r\n }\r\n\r\n return (\r\n <Grid container direction='row' >\r\n <Grid item>\r\n <Typography variant='h5'>{title}</Typography>\r\n </Grid>\r\n <Grid item style={{marginTop:'-8px'}}>\r\n <IconButton title=\"info\" disabled={!statusMessages.some(m=>m.type === InstanceMessageTypeEnum.SIGNAL && m.level=== SignalMessageLevelEnum.INFO)} onClick={() => show(SignalMessageLevelEnum.INFO)}>\r\n <InfoIcon style={{ color:statusMessages.some(m=>m.type === InstanceMessageTypeEnum.SIGNAL && m.level=== SignalMessageLevelEnum.INFO)?'blue':'#BDBDBD'}}/>\r\n </IconButton>\r\n <IconButton title=\"warning\" disabled={!statusMessages.some(m=>m.type === InstanceMessageTypeEnum.SIGNAL && m.level=== SignalMessageLevelEnum.WARNING)} onClick={() => show(SignalMessageLevelEnum.WARNING)} style={{marginLeft:'-16px'}}>\r\n <WarningIcon style={{ color:statusMessages.some(m=>m.type === InstanceMessageTypeEnum.SIGNAL && m.level=== SignalMessageLevelEnum.WARNING)?'orange':'#BDBDBD'}}/>\r\n </IconButton>\r\n <IconButton title=\"error\" disabled={!statusMessages.some(m=>m.type === InstanceMessageTypeEnum.SIGNAL && m.level=== SignalMessageLevelEnum.ERROR)} onClick={() => show(SignalMessageLevelEnum.ERROR)} style={{marginLeft:'-16px'}}>\r\n <ErrorIcon style={{ color:statusMessages.some(m=>m.type === InstanceMessageTypeEnum.SIGNAL && m.level=== SignalMessageLevelEnum.ERROR)?'red':'#BDBDBD'}}/>\r\n </IconButton>\r\n </Grid>\r\n </Grid>\r\n )\r\n }\r\n\r\n const statusClear = (level: SignalMessageLevelEnum) => {\r\n setStatusMessages(statusMessages.filter(m=> m.level!==level))\r\n setShowStatusDialog(false)\r\n }\r\n \r\n const onSelectObject = (namespaces:string[], podNames:string[], containerNames:string[]) => {\r\n setSelectedNamespaces(namespaces)\r\n setSelectedPodNames(podNames)\r\n setSelectedContainerNames(containerNames)\r\n }\r\n\r\n const formatMessage = (logLine:ILogLine) => {\r\n if (!logLine.pod) {\r\n return <>{logLine.text+'\\n'}</>\r\n }\r\n\r\n let podPrefix = <></>\r\n if (selectedPodNames.length !== 1) {\r\n podPrefix = <span style={{color:\"green\"}}>{logLine.pod+' '}</span>\r\n }\r\n\r\n let containerPrefix = <></>\r\n if (selectedContainerNames.length !== 1){\r\n containerPrefix = <span style={{color:\"blue\"}}>{logLine.container+' '}</span>\r\n }\r\n return <>{podPrefix}{containerPrefix}{logLine.text+'\\n'}</>\r\n }\r\n\r\n return (<>\r\n\r\n { loading && <Progress/> }\r\n\r\n {!isKwirthAvailable(entity) && !loading && error && (\r\n <WarningPanel title={'An error has ocurred while obtaining data from kuebernetes clusters.'} message={error?.message} />\r\n )}\r\n\r\n {!isKwirthAvailable(entity) && !loading && (\r\n <MissingAnnotationEmptyState readMoreUrl='https://github.com/jfvilas/plugin-kwirth-log' annotation={ANNOTATION_KWIRTH_LOCATION}/>\r\n )}\r\n\r\n { isKwirthAvailable(entity) && !loading && resources && resources.length===0 &&\r\n <ComponentNotFound error={ErrorType.NO_CLUSTERS} entity={entity}/>\r\n }\r\n\r\n { isKwirthAvailable(entity) && !loading && resources && resources.length>0 && resources.reduce((sum,cluster) => sum+cluster.data.length, 0)===0 &&\r\n <ComponentNotFound error={ErrorType.NO_PODS} entity={entity}/>\r\n }\r\n\r\n { isKwirthAvailable(entity) && !loading && resources && resources.length>0 && resources.reduce((sum,cluster) => sum+cluster.data.length, 0)>0 &&\r\n <Box sx={{ display: 'flex', height:'70vh'}}>\r\n <Box sx={{ width: '200px'}}>\r\n <Grid container direction='column'>\r\n <Grid item> \r\n <Card>\r\n <ClusterList resources={resources} selectedClusterName={selectedClusterName} onSelect={onSelectCluster}/>\r\n </Card>\r\n </Grid>\r\n <Grid item>\r\n <Card>\r\n <Options options={kwirthLogOptionsRef.current} onChange={onChangeLogConfig} disabled={selectedContainerNames.length === 0 || started || paused.current}/>\r\n </Card>\r\n </Grid>\r\n </Grid>\r\n </Box>\r\n\r\n <Box sx={{ flexGrow: 1, flex:1, overflow:'hidden', p:1, maxWidth:'85%' }}>\r\n\r\n { !selectedClusterName && \r\n <img src={KwirthLogLogo} alt='No cluster selected' style={{ left:'40%', marginTop:'10%', width:'20%', position:'relative' }} />\r\n }\r\n\r\n { selectedClusterName && <>\r\n <Card style={{ marginTop:-8, height:'100%', display:'flex', flexDirection:'column' }}>\r\n <CardHeader\r\n title={statusButtons(selectedClusterName)}\r\n style={{marginTop:-4, marginBottom:4, flexShrink:0}}\r\n action={actionButtons()}\r\n />\r\n \r\n <Typography style={{marginLeft:16, marginBottom:4}}>\r\n <ObjectSelector cluster={resources.find(cluster => cluster.name === selectedClusterName)!} onSelect={onSelectObject} disabled={selectedClusterName === '' || started || paused.current} selectedNamespaces={selectedNamespaces} selectedPodNames={selectedPodNames} selectedContainerNames={selectedContainerNames}/>\r\n </Typography>\r\n <Divider/>\r\n {/* <CardContent>\r\n <Box style={{ display:'flex', flexDirection:'column', overflowY:'auto', overflowX:'auto', width:'100%', flexGrow:1, height:'55vh'}}> */}\r\n <CardContent style={{ flexGrow: 1, overflow: 'hidden', display: 'flex', flexDirection: 'column' }}>\r\n <Box style={{ overflowY: 'auto', overflowX: 'auto', width: '100%', flexGrow: 1 }}>\r\n\r\n <pre ref={preRef}>\r\n { messages.map (m => formatMessage(m)) }\r\n </pre>\r\n <span ref={lastRef}/>\r\n </Box> \r\n {/* <Box style={{ overflowY: 'auto', overflowX:'auto', whiteSpace: 'nowrap', maxHeight:'60vh' }}>\r\n <pre ref={preRef}>\r\n { messages.map (m => formatMessage(m)) }\r\n </pre>\r\n <span ref={lastRef}></span>\r\n </Box> */}\r\n </CardContent>\r\n </Card>\r\n </>}\r\n </Box>\r\n </Box>\r\n }\r\n { showStatusDialog && <StatusLog level={statusLevel} onClose={() => setShowStatusDialog(false)} statusMessages={statusMessages} onClear={statusClear}/>}\r\n </>)\r\n}\r\n"],"names":["cluster","p"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAoDA,MAAM,gBAAiB,GAAA,GAAA;AAEV,MAAA,sBAAA,GAAyB,CAAC,KAAqC,KAAA;AACxE,EAAM,MAAA,EAAE,MAAO,EAAA,GAAI,SAAU,EAAA;AAC7B,EAAM,MAAA,YAAA,GAAe,OAAO,eAAe,CAAA;AAC3C,EAAM,MAAA,QAAA,GAAW,OAAO,WAAW,CAAA;AACnC,EAAA,MAAM,CAAC,SAAW,EAAA,YAAY,CAAI,GAAA,QAAA,CAA6B,EAAE,CAAA;AACjE,EAAA,MAAM,CAAC,mBAAA,EAAqB,sBAAsB,CAAA,GAAI,SAAS,EAAE,CAAA;AACjE,EAAA,MAAM,CAAC,kBAAoB,EAAA,qBAAqB,CAAI,GAAA,QAAA,CAAmB,EAAE,CAAA;AACzE,EAAA,MAAM,CAAC,gBAAkB,EAAA,mBAAmB,CAAI,GAAA,QAAA,CAAmB,EAAE,CAAA;AACrE,EAAA,MAAM,CAAC,sBAAwB,EAAA,yBAAyB,CAAI,GAAA,QAAA,CAAmB,EAAE,CAAA;AACjF,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,IAAI,CAAA;AAC3C,EAAM,MAAA,MAAA,GAAO,OAAgB,KAAK,CAAA;AAClC,EAAA,MAAM,CAAC,QAAU,EAAA,WAAW,CAAI,GAAA,QAAA,CAAqB,EAAE,CAAA;AACvD,EAAA,MAAM,CAAC,eAAiB,EAAA,kBAAkB,CAAI,GAAA,QAAA,CAAqB,EAAE,CAAA;AACrE,EAAA,MAAM,CAAC,cAAgB,EAAA,iBAAiB,CAAI,GAAA,QAAA,CAAwB,EAAE,CAAA;AACtE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,QAAoB,EAAA;AACtD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,QAAiB,EAAA;AACjD,EAAM,MAAA,mBAAA,GAAsB,OAAY,EAAC,SAAA,EAAU,OAAO,MAAO,EAAA,IAAA,EAAM,SAAU,EAAA,KAAA,EAAM,CAAA;AACvF,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAI,SAAS,KAAK,CAAA;AAC9D,EAAA,MAAM,CAAC,WAAa,EAAA,cAAc,CAAI,GAAA,QAAA,CAAiC,uBAAuB,IAAI,CAAA;AAClG,EAAM,MAAA,MAAA,GAAS,OAA4B,IAAI,CAAA;AAC/C,EAAM,MAAA,OAAA,GAAU,OAA4B,IAAI,CAAA;AAChD,EAAA,MAAM,CAAE,cAAA,EAAgB,iBAAkB,CAAA,GAAI,SAAiB,EAAE,CAAA;AACjE,EAAA,MAAM,EAAE,OAAA,EAAS,KAAM,EAAA,GAAI,SAAW,YAAY;AAC9C,IAAA,IAAI,mBAAiB,EAAI,EAAA,iBAAA,CAAkB,MAAM,YAAA,CAAa,YAAY,CAAA;AAC1E,IAAI,IAAA,SAAA,GAAY,CAAC,uBAAA,CAAwB,IAAI,CAAA;AAC7C,IAAA,IAAI,KAAM,CAAA,aAAA,EAAyB,SAAA,CAAA,IAAA,CAAK,wBAAwB,OAAO,CAAA;AACvE,IAAA,IAAI,OAA0B,MAAM,YAAA,CAAa,cAAc,MAAQ,EAAA,0BAAA,CAA2B,KAAK,SAAS,CAAA;AAChH,IAAA,YAAA,CAAa,IAAI,CAAA;AAAA,GACpB,CAAA;AACD,EAAA,MAAM,MAAS,GAAA,MAAA,iBAA+B,IAAA,GAAA,EAAK,CAAA;AAGnD,EAAM,MAAA,UAAA,GAAa,CAAC,OAAgB,KAAA;AAChC,IAAI,IAAA,CAAC,OAAO,OAAS,EAAA;AACjB,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,MAAA,CAAO,OAAQ,GAAA,KAAA;AACf,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA,cAAA,CAAe,OAAO,CAAA;AAAA,KAErB,MAAA;AACD,MAAA,WAAA,CAAa,CAAC,IAAS,KAAA,CAAE,GAAG,IAAM,EAAA,GAAG,eAAe,CAAC,CAAA;AACrD,MAAA,kBAAA,CAAmB,EAAE,CAAA;AACrB,MAAA,MAAA,CAAO,OAAQ,GAAA,KAAA;AACf,MAAA,UAAA,CAAW,IAAI,CAAA;AAAA;AACnB,GACJ;AAEA,EAAA,MAAM,eAAe,MAAM;AACvB,IAAA,UAAA,CAAW,KAAK,CAAA;AAChB,IAAA,MAAA,CAAO,OAAQ,GAAA,IAAA;AAAA,GACnB;AAEA,EAAA,MAAM,cAAc,MAAM;AACtB,IAAA,UAAA,CAAW,KAAK,CAAA;AAChB,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,MAAA,CAAO,OAAQ,GAAA,KAAA;AACf,IAAc,aAAA,EAAA;AAAA,GAClB;AAEA,EAAM,MAAA,eAAA,GAAkB,CAAC,IAA0B,KAAA;AAC/C,IAAA,IAAI,IAAM,EAAA;AACN,MAAA,sBAAA,CAAuB,IAAI,CAAA;AAC3B,MAAA,WAAA,CAAY,CAAC;AAAA,QACT,MAAM,uBAAwB,CAAA,MAAA;AAAA,QAC9B,IAAM,EAAA,6DAAA;AAAA,QACN,SAAW,EAAA,EAAA;AAAA,QACX,GAAK,EAAA,EAAA;AAAA,QACL,SAAW,EAAA;AAAA,OACd,CAAC,CAAA;AACF,MAAA,qBAAA,CAAsB,EAAE,CAAA;AACxB,MAAA,mBAAA,CAAoB,EAAE,CAAA;AACtB,MAAA,yBAAA,CAA0B,EAAE,CAAA;AAC5B,MAAA,iBAAA,CAAkB,EAAE,CAAA;AACpB,MAAY,WAAA,EAAA;AAAA;AAChB,GACJ;AAEA,EAAM,MAAA,iBAAA,GAAoB,CAAC,OAAgB,KAAA;AACvC,IAAA,IAAI,eAAkB,GAAA,IAAA,CAAK,KAAM,CAAA,OAAA,CAAQ,IAAI,CAAA;AAC7C,IAAA,QAAQ,gBAAgB,IAAM;AAAA,MAC1B,KAAK,uBAAwB,CAAA,IAAA;AACzB,QAAA,IAAI,UAAa,GAAA,eAAA;AACjB,QAAA,IAAI,QAAQ,UAAW,CAAA,SAAA,GAAU,MAAI,UAAW,CAAA,GAAA,GAAI,MAAI,UAAW,CAAA,SAAA;AACnE,QAAA,IAAI,OAAO,UAAW,CAAA,IAAA;AACtB,QAAI,IAAA,CAAC,MAAO,CAAA,OAAA,CAAQ,GAAI,CAAA,KAAK,GAAU,MAAA,CAAA,OAAA,CAAQ,GAAI,CAAA,KAAA,EAAM,EAAE,CAAA;AAC3D,QAAA,IAAI,MAAO,CAAA,OAAA,CAAQ,GAAI,CAAA,KAAK,CAAG,EAAA;AAC3B,UAAA,IAAA,GAAO,MAAO,CAAA,OAAA,CAAQ,GAAI,CAAA,KAAK,CAAI,GAAA,IAAA;AACnC,UAAO,MAAA,CAAA,OAAA,CAAQ,GAAI,CAAA,KAAA,EAAM,EAAE,CAAA;AAAA;AAE/B,QAAA,IAAI,CAAC,IAAA,CAAK,QAAS,CAAA,IAAI,CAAG,EAAA;AACtB,UAAI,IAAA,CAAA,GAAI,IAAK,CAAA,WAAA,CAAY,IAAI,CAAA;AAC7B,UAAA,MAAA,CAAO,QAAQ,GAAI,CAAA,KAAA,EAAM,IAAK,CAAA,SAAA,CAAU,CAAC,CAAC,CAAA;AAC1C,UAAO,IAAA,GAAA,IAAA,CAAK,SAAU,CAAA,CAAA,EAAE,CAAC,CAAA;AAAA;AAG7B,QAAA,KAAA,IAAS,IAAQ,IAAA,IAAA,CAAK,KAAM,CAAA,IAAI,CAAG,EAAA;AAC/B,UAAI,IAAA,IAAA,CAAK,IAAK,EAAA,KAAM,EAAI,EAAA;AAExB,UAAA,IAAI,OAAmB,GAAA;AAAA,YACnB,IAAM,EAAA,IAAA;AAAA,YACN,WAAW,UAAW,CAAA,SAAA;AAAA,YACtB,KAAK,UAAW,CAAA,GAAA;AAAA,YAChB,WAAW,UAAW,CAAA,SAAA;AAAA,YACtB,MAAM,UAAW,CAAA;AAAA,WACrB;AAEA,UAAA,IAAI,OAAO,OAAS,EAAA;AAChB,YAAA,kBAAA,CAAmB,CAAC,IAAS,KAAA,CAAE,GAAG,IAAA,EAAM,OAAQ,CAAC,CAAA;AAAA,WAEhD,MAAA;AACD,YAAA,WAAA,CAAY,CAAC,IAAS,KAAA;AAClB,cAAO,OAAA,IAAA,CAAK,MAAO,GAAA,gBAAA,GAAiB,CAAG,EAAA;AACnC,gBAAK,IAAA,CAAA,MAAA,CAAO,GAAE,CAAC,CAAA;AAAA;AAEnB,cAAA,IAAI,mBAAoB,CAAA,OAAA,CAAQ,MAAU,IAAA,OAAA,CAAQ,OAAS,EAAA,OAAA,CAAQ,OAAQ,CAAA,cAAA,CAAe,EAAE,QAAA,EAAU,SAAW,EAAA,KAAA,EAAO,SAAS,CAAA;AACjI,cAAO,OAAA,CAAE,GAAG,IAAA,EAAM,OAAQ,CAAA;AAAA,aAC7B,CAAA;AAAA;AACL;AAEJ,QAAA;AAAA,MACJ,KAAK,uBAAwB,CAAA,MAAA;AACzB,QAAA,IAAI,gBAAgB,IAAS,KAAA,uBAAA,CAAwB,YAAY,eAAgB,CAAA,MAAA,KAAW,0BAA0B,KAAO,EAAA;AACzH,UAAA,IAAI,gBAAgB,QAAW,KAAA,EAAA;AAC3B,YAAA,WAAA,CAAY,gBAAgB,QAAQ,CAAA;AAAA,eACnC;AACD,YAAA,IAAI,aAAgB,GAAA,eAAA;AACpB,YAAS,QAAA,CAAA,IAAA,CAAK,EAAE,OAAS,EAAA,aAAA,CAAc,MAAM,QAAS,EAAA,OAAA,EAAS,OAAQ,EAAA,WAAA,EAAa,CAAA;AAAA;AACxF,SAEC,MAAA;AACD,UAAA,IAAI,aAAgB,GAAA,eAAA;AACpB,UAAW,UAAA,CAAA,aAAA,CAAc,KAAO,EAAA,aAAA,CAAc,IAAI,CAAA;AAClD,UAAA,QAAO,cAAc,KAAO;AAAA,YACxB,KAAK,sBAAuB,CAAA,IAAA;AACxB,cAAS,QAAA,CAAA,IAAA,CAAK,EAAE,OAAS,EAAA,aAAA,CAAc,MAAM,QAAS,EAAA,MAAA,EAAQ,OAAQ,EAAA,WAAA,EAAa,CAAA;AACnF,cAAA;AAAA,YACJ,KAAK,sBAAuB,CAAA,OAAA;AACxB,cAAS,QAAA,CAAA,IAAA,CAAK,EAAE,OAAS,EAAA,aAAA,CAAc,MAAM,QAAS,EAAA,SAAA,EAAW,OAAQ,EAAA,WAAA,EAAa,CAAA;AACtF,cAAA;AAAA,YACJ,KAAK,sBAAuB,CAAA,KAAA;AACxB,cAAS,QAAA,CAAA,IAAA,CAAK,EAAE,OAAS,EAAA,aAAA,CAAc,MAAM,QAAS,EAAA,OAAA,EAAS,OAAQ,EAAA,WAAA,EAAa,CAAA;AACpF,cAAA;AAAA,YACJ;AACI,cAAS,QAAA,CAAA,IAAA,CAAK,EAAE,OAAS,EAAA,aAAA,CAAc,MAAM,QAAS,EAAA,SAAA,EAAW,OAAQ,EAAA,WAAA,EAAa,CAAA;AACtF,cAAA;AAAA;AACR;AAEJ,QAAA;AAAA,MACJ;AACI,QAAA,UAAA,CAAW,sBAAuB,CAAA,KAAA,EAAO,iCAAoC,GAAA,eAAA,CAAgB,IAAI,CAAA;AACjG,QAAS,QAAA,CAAA,IAAA,CAAK,EAAE,OAAA,EAAS,iCAAoC,GAAA,eAAA,CAAgB,MAAM,QAAS,EAAA,OAAA,EAAS,OAAQ,EAAA,WAAA,EAAa,CAAA;AAC1H,QAAA;AAAA;AACR,GACJ;AAEA,EAAM,MAAA,UAAA,GAAa,CAAC,KAAA,EAA8B,IAAgB,KAAA;AAC9D,IAAA,iBAAA,CAAmB,CAAC,IAAA,KAAS,CAAC,GAAG,IAAM,EAAA;AAAA,MACnC,KAAA;AAAA,MACA,IAAA;AAAA,MACA,MAAM,uBAAwB,CAAA;AAAA,KACjC,CAAC,CAAA;AAAA,GACN;AAEA,EAAM,MAAA,kBAAA,GAAqB,CAAC,OAAgB,KAAA;AACxC,IAAI,IAAA,eAAA;AACJ,IAAI,IAAA;AACA,MAAkB,eAAA,GAAA,IAAA,CAAK,KAAM,CAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,aAEtC,GAAK,EAAA;AACR,MAAA,OAAA,CAAQ,IAAI,GAAG,CAAA;AACf,MAAQ,OAAA,CAAA,GAAA,CAAI,QAAQ,IAAI,CAAA;AACxB,MAAA;AAAA;AAGJ,IAAA,QAAO,gBAAgB,OAAS;AAAA,MAC5B,KAAK,0BAA2B,CAAA,GAAA;AAC5B,QAAA,iBAAA,CAAkB,OAAO,CAAA;AACzB,QAAA;AAAA,MACJ,KAAK,0BAA2B,CAAA,GAAA;AAC5B,QAAA,IAAI,UAAa,GAAA,eAAA;AACjB,QAAA,IAAI,WAAW,IAAM,EAAA,IAAA;AACjB,UAAA,UAAA,CAAY,sBAAuB,CAAA,OAAA,EAAS,sBAAuB,GAAA,UAAA,CAAW,KAAK,IAAI,CAAA;AAAA;AAEvF,UAAA,UAAA,CAAY,uBAAuB,OAAS,EAAA,sBAAA,GAAuB,IAAK,CAAA,SAAA,CAAU,UAAU,CAAC,CAAA;AACjG,QAAA;AAAA,MACJ;AACI,QAAA,UAAA,CAAY,sBAAuB,CAAA,KAAA,EAAO,8BAA+B,GAAA,eAAA,CAAgB,OAAO,CAAA;AAChG,QAAA,UAAA,CAAY,uBAAuB,KAAO,EAAA,mBAAA,GAAoB,IAAK,CAAA,SAAA,CAAU,eAAe,CAAC,CAAA;AAC7F,QAAA;AAAA;AACR,GACJ;AAEA,EAAM,MAAA,eAAA,GAAkB,CAAC,EAAA,EAAc,OAAgB,KAAA;AACnD,IAAA,IAAI,UAAQ,SAAU,CAAA,IAAA,CAAK,CAAAA,QAAWA,KAAAA,QAAAA,CAAQ,SAAS,mBAAmB,CAAA;AAC1E,IAAA,IAAI,CAAC,OAAS,EAAA;AACV,MAAW,UAAA,CAAA,sBAAA,CAAuB,OAAM,qBAAqB,CAAA;AAC7D,MAAA;AAAA;AAEJ,IAAI,IAAA,IAAA,GAAO,OAAQ,CAAA,IAAA,CAAK,MAAO,CAAA,CAAAC,OAAK,kBAAmB,CAAA,QAAA,CAASA,EAAE,CAAA,SAAS,CAAC,CAAA;AAC5E,IAAA,IAAI,CAAC,IAAM,EAAA;AACP,MAAW,UAAA,CAAA,sBAAA,CAAuB,OAAM,eAAe,CAAA;AACvD,MAAA;AAAA;AAEJ,IAAA,OAAA,CAAQ,IAAI,CAAc,YAAA,CAAA,CAAA;AAC1B,IAAA,IAAI,SAAY,GAAA,OAAA,CAAQ,UAAW,CAAA,GAAA,CAAI,wBAAwB,IAAI,CAAA;AACnE,IAAA,IAAI,SAAW,EAAA;AACX,MAAA,IAAI,aAAsB,EAAC;AAC3B,MAAI,IAAA,sBAAA,CAAuB,SAAO,CAAG,EAAA;AACjC,QAAA,KAAA,IAAQ,KAAK,gBAAkB,EAAA;AAC3B,UAAA,KAAA,IAAS,KAAK,sBAAwB,EAAA;AAClC,YAAW,UAAA,CAAA,IAAA,CAAK,CAAE,GAAA,GAAA,GAAI,CAAC,CAAA;AAAA;AAC3B;AACJ;AAEJ,MAAA,IAAI,OAAyB,GAAA;AAAA,QACzB,SAAS,0BAA2B,CAAA,GAAA;AAAA,QACpC,SAAS,wBAAyB,CAAA,IAAA;AAAA,QAClC,QAAQ,yBAA0B,CAAA,KAAA;AAAA,QAClC,MAAM,uBAAwB,CAAA,OAAA;AAAA,QAC9B,QAAU,EAAA,EAAA;AAAA,QACV,SAAA,EAAW,mBAAmB,SAAS,CAAA;AAAA,QACvC,OAAO,uBAAwB,CAAA,IAAA;AAAA,QAC/B,MAAO,sBAAuB,CAAA,MAAA,GAAS,CAAI,GAAA,sBAAA,CAAuB,YAAY,sBAAuB,CAAA,GAAA;AAAA,QACrG,SAAA,EAAW,kBAAmB,CAAA,IAAA,CAAK,GAAG,CAAA;AAAA,QACtC,KAAO,EAAA,EAAA;AAAA,QACP,GAAA,EAAK,iBAAiB,GAAI,CAAA,CAAAA,OAAKA,EAAC,CAAA,CAAE,KAAK,GAAG,CAAA;AAAA,QAC1C,SAAA,EAAW,UAAW,CAAA,IAAA,CAAK,GAAG,CAAA;AAAA,QAC9B,IAAM,EAAA;AAAA,UACF,WAAW,OAAQ,CAAA,SAAA;AAAA,UACnB,QAAU,EAAA,KAAA;AAAA,UACV,WAAa,EAAA,gBAAA;AAAA,UACb,WAAW,OAAQ,CAAA;AAAA,SACvB;AAAA,QACA,MAAM,uBAAwB,CAAA;AAAA,OAClC;AACA,MAAA,EAAA,CAAG,IAAK,CAAA,IAAA,CAAK,SAAU,CAAA,OAAO,CAAC,CAAA;AAAA,KAE9B,MAAA;AACD,MAAW,UAAA,CAAA,sBAAA,CAAuB,OAAM,yCAAyC,CAAA;AACjF,MAAA;AAAA;AACJ,GACJ;AAEA,EAAM,MAAA,cAAA,GAAiB,CAAC,OAAgB,KAAA;AACpC,IAAA,IAAI,UAAQ,SAAU,CAAA,IAAA,CAAK,CAAAD,QAAWA,KAAAA,QAAAA,CAAQ,SAAO,mBAAmB,CAAA;AACxE,IAAA,IAAI,CAAC,OAAS,EAAA;AACV,MAAW,UAAA,CAAA,sBAAA,CAAuB,OAAM,qBAAqB,CAAA;AAC7D,MAAA;AAAA;AAGJ,IAAA,WAAA,CAAY,EAAE,CAAA;AACd,IAAI,IAAA;AACA,MAAA,IAAI,EAAK,GAAA,IAAI,SAAU,CAAA,OAAA,CAAQ,GAAG,CAAA;AAClC,MAAA,EAAA,CAAG,MAAS,GAAA,MAAM,eAAgB,CAAA,EAAA,EAAI,OAAO,CAAA;AAC7C,MAAA,EAAA,CAAG,SAAY,GAAA,CAAC,KAAU,KAAA,kBAAA,CAAmB,KAAK,CAAA;AAClD,MAAA,EAAA,CAAG,OAAU,GAAA,CAAC,KAAU,KAAA,gBAAA,CAAiB,KAAK,CAAA;AAC9C,MAAA,YAAA,CAAa,EAAE,CAAA;AAAA,aAEZ,GAAK,EAAA;AACR,MAAA,WAAA,CAAY,CAAE;AAAA,QACV,MAAM,uBAAwB,CAAA,IAAA;AAAA,QAC9B,IAAA,EAAM,6BAA6B,GAAG,CAAA,CAAA;AAAA,QACtC,SAAW,EAAA,EAAA;AAAA,QACX,GAAK,EAAA,EAAA;AAAA,QACL,SAAW,EAAA;AAAA,OACb,CAAC,CAAA;AAAA;AACP,GAEJ;AAEA,EAAM,MAAA,gBAAA,GAAmB,CAAC,MAAe,KAAA;AACvC,IAAA,OAAA,CAAQ,IAAI,CAAiB,eAAA,CAAA,CAAA;AAC7B,IAAA,UAAA,CAAW,KAAK,CAAA;AAChB,IAAA,MAAA,CAAO,OAAQ,GAAA,KAAA;AACf,IAAA,UAAA,CAAW,IAAI,CAAA;AAAA,GACjB;AAEA,EAAA,MAAM,gBAAgB,MAAM;AACxB,IAAA,QAAA,CAAS,IAAK,CAAA;AAAA,MACV,MAAM,uBAAwB,CAAA,IAAA;AAAA,MAC9B,IAAM,EAAA,8HAAA;AAAA,MACN,SAAW,EAAA,EAAA;AAAA,MACX,GAAK,EAAA,EAAA;AAAA,MACL,SAAW,EAAA;AAAA,KACd,CAAA;AACD,IAAA,SAAA,EAAW,KAAM,EAAA;AAAA,GACrB;AAEA,EAAM,MAAA,iBAAA,GAAoB,CAAC,OAAgB,KAAA;AACvC,IAAA,mBAAA,CAAoB,OAAQ,GAAA,OAAA;AAC5B,IAAA,IAAI,OAAS,EAAA;AACT,MAAA,UAAA,CAAW,OAAO,CAAA;AAAA;AACtB,GACJ;AAEA,EAAA,MAAM,kBAAkB,MAAM;AAC5B,IAAI,IAAA,OAAA,GAAU,MAAO,CAAA,OAAA,CAAS,SAAU,CAAA,UAAA,CAAW,SAAQ,EAAE,CAAA,CAAE,UAAW,CAAA,QAAA,EAAS,IAAI,CAAA;AACvF,IAAU,OAAA,GAAA,OAAA,CAAQ,UAAW,CAAA,8BAAA,EAA+B,EAAE,CAAA;AAC9D,IAAU,OAAA,GAAA,OAAA,CAAQ,UAAW,CAAA,6BAAA,EAA8B,EAAE,CAAA;AAC7D,IAAU,OAAA,GAAA,OAAA,CAAQ,UAAW,CAAA,SAAA,EAAU,EAAE,CAAA;AACzC,IAAA,IAAI,WAAW,mBAAoB,GAAA,GAAA,GAAI,qBAAmB,GAAI,GAAA,MAAA,CAAO,SAAS,IAAK,GAAA,MAAA;AACnF,IAAA,IAAI,QAAkB,GAAA,YAAA;AAEtB,IAAM,MAAA,IAAA,GAAO,IAAI,IAAK,CAAA,CAAC,OAAO,CAAG,EAAA,EAAE,IAAM,EAAA,QAAA,EAAU,CAAA;AACnD,IAAM,MAAA,GAAA,GAAM,GAAI,CAAA,eAAA,CAAgB,IAAI,CAAA;AACpC,IAAM,MAAA,IAAA,GAAO,QAAS,CAAA,aAAA,CAAc,GAAG,CAAA;AACvC,IAAA,IAAA,CAAK,IAAO,GAAA,GAAA;AACZ,IAAA,IAAA,CAAK,QAAW,GAAA,QAAA;AAChB,IAAS,QAAA,CAAA,IAAA,CAAK,YAAY,IAAI,CAAA;AAC9B,IAAA,IAAA,CAAK,KAAM,EAAA;AACX,IAAS,QAAA,CAAA,IAAA,CAAK,YAAY,IAAI,CAAA;AAC9B,IAAA,GAAA,CAAI,gBAAgB,GAAG,CAAA;AAAA,GACzB;AAEA,EAAA,MAAM,iBAAiB,MAAM;AAEzB,IAAA,IAAI,UAAQ,SAAU,CAAA,IAAA,CAAK,CAAAA,QAAWA,KAAAA,QAAAA,CAAQ,SAAO,mBAAmB,CAAA;AACxE,IAAA,IAAI,CAAC,OAAS,EAAA;AACV,MAAW,UAAA,CAAA,sBAAA,CAAuB,OAAM,qBAAqB,CAAA;AAC7D,MAAA;AAAA;AAEJ,IAAA,IAAI,UAAa,GAAA,OAAA,CAAQ,UAAW,CAAA,GAAA,CAAI,wBAAwB,OAAO,CAAA;AACvE,IAAA,IAAI,CAAC,UAAY,EAAA;AACb,MAAW,UAAA,CAAA,sBAAA,CAAuB,OAAM,uBAAuB,CAAA;AAC/D,MAAA;AAAA;AAEJ,IAAA,IAAI,CAAC,QAAU,EAAA;AACX,MAAW,UAAA,CAAA,sBAAA,CAAuB,OAAM,kCAAkC,CAAA;AAC1E,MAAA;AAAA;AAGJ,IAAI,IAAA,IAAA,GAAkB,QAAQ,IAAmB,CAAA,MAAA,CAAO,SAAO,kBAAmB,CAAA,QAAA,CAAS,GAAI,CAAA,SAAS,CAAC,CAAA;AACzG,IAAA,KAAA,IAAS,OAAO,IAAM,EAAA;AAClB,MAAA,IAAI,UAAyB,GAAA;AAAA,QACzB,OAAS,EAAA,YAAA;AAAA,QACT,QAAQ,yBAA0B,CAAA,OAAA;AAAA,QAClC,MAAM,uBAAwB,CAAA,SAAA;AAAA,QAC9B,MAAM,uBAAwB,CAAA,IAAA;AAAA,QAC9B,SAAS,0BAA2B,CAAA,GAAA;AAAA,QACpC,QAAU,EAAA,EAAA;AAAA,QACV,EAAI,EAAA,GAAA;AAAA,QACJ,SAAA,EAAW,mBAAmB,UAAU,CAAA;AAAA,QACxC,SAAS,cAAe,CAAA,UAAA;AAAA,QACxB,WAAW,GAAI,CAAA,SAAA;AAAA,QACf,KAAO,EAAA,EAAA;AAAA,QACP,KAAK,GAAI,CAAA,IAAA;AAAA,QACT,SAAW,EAAA;AAAA,OACf;AACA,MAAA,IAAI,YAA8B,GAAA;AAAA,QAC9B,OAAS,EAAA,cAAA;AAAA,QACT,SAAA,EAAW,mBAAmB,UAAU,CAAA;AAAA,QACxC,aAAa,0BAA2B,CAAA,GAAA;AAAA,QACxC,QAAQ,yBAA0B,CAAA,KAAA;AAAA,QAClC,MAAM,uBAAwB,CAAA,SAAA;AAAA,QAC9B,MAAM,uBAAwB,CAAA,MAAA;AAAA,QAC9B,SAAS,0BAA2B,CAAA,GAAA;AAAA,QACpC,QAAA;AAAA,QACA,IAAM,EAAA;AAAA,OACV;AACA,MAAA,SAAA,EAAW,IAAK,CAAA,IAAA,CAAK,SAAU,CAAA,YAAY,CAAC,CAAA;AAAA;AAChD,GACJ;AAEA,EAAA,MAAM,gBAAgB,MAAM;AACxB,IAAI,IAAA,UAAA,GAAW,OAAO,aAAgB,GAAA,KAAA;AACtC,IAAA,IAAI,UAAQ,SAAU,CAAA,IAAA,CAAK,CAAAA,QAAWA,KAAAA,QAAAA,CAAQ,SAAO,mBAAmB,CAAA;AACxE,IAAA,IAAI,OAAS,EAAA;AACT,MAAA,UAAA,GAAa,QAAQ,OAAQ,CAAA,UAAA,CAAW,GAAI,CAAA,uBAAA,CAAwB,IAAI,CAAC,CAAA;AACzE,MAAA,aAAA,GAAgB,QAAQ,OAAQ,CAAA,UAAA,CAAW,GAAI,CAAA,uBAAA,CAAwB,OAAO,CAAC,CAAA;AAAA;AAGnF,IAAO,uBAAA,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,EACD,MAAM,aACJ,oBAAA,KAAA,CAAA,aAAA,CAAC,cAAW,KAAM,EAAA,SAAA,EAAU,SAAS,cAAgB,EAAA,QAAA,EAAU,iBAAiB,MAAW,KAAA,CAAA,IAAK,CAAC,aAAiB,IAAA,CAAC,aAAa,CAAC,OAAA,EAAA,sCAC5H,WAAY,EAAA,IAAA,CACjB,mBAEH,KAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,OAAM,UAAW,EAAA,OAAA,EAAS,iBAAiB,QAAU,EAAA,QAAA,CAAS,UAAQ,CAC9E,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,kBAAa,CAClB,CAAA,sCACC,UAAW,EAAA,EAAA,OAAA,EAAS,MAAM,UAAW,CAAA,mBAAA,CAAoB,OAAO,CAAG,EAAA,KAAA,EAAM,QAAO,QAAU,EAAA,OAAA,IAAW,CAAC,MAAU,IAAA,gBAAA,CAAiB,WAAW,CAAK,IAAA,CAAC,8BAC9I,KAAA,CAAA,aAAA,CAAA,QAAA,EAAA,IAAS,CACd,CACA,kBAAA,KAAA,CAAA,aAAA,CAAC,cAAW,OAAS,EAAA,YAAA,EAAc,OAAM,OAAQ,EAAA,QAAA,EAAU,EAAG,OAAW,IAAA,CAAC,OAAO,OAAY,IAAA,gBAAA,CAAiB,SAAS,CACnH,CAAA,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,eAAU,CACf,CAAA,sCACC,UAAW,EAAA,EAAA,OAAA,EAAS,aAAa,KAAM,EAAA,MAAA,EAAO,UAAU,OAAW,IAAA,gBAAA,CAAiB,WAAW,CAC5F,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,QAAS,EAAA,IAAA,CACd,CACJ,CAAA;AAAA,GACJ;AAEA,EAAM,MAAA,aAAA,GAAgB,CAAC,KAAiB,KAAA;AACpC,IAAM,MAAA,IAAA,GAAO,CAAC,KAAiC,KAAA;AAC3C,MAAA,mBAAA,CAAoB,IAAI,CAAA;AACxB,MAAA,cAAA,CAAe,KAAK,CAAA;AAAA,KACxB;AAEA,IAAA,2CACK,IAAK,EAAA,EAAA,SAAA,EAAS,MAAC,SAAU,EAAA,KAAA,EAAA,sCACrB,IAAK,EAAA,EAAA,IAAA,EAAI,IACN,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,cAAW,OAAQ,EAAA,IAAA,EAAA,EAAM,KAAM,CACpC,CAAA,sCACC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,KAAA,EAAO,EAAC,SAAU,EAAA,MAAA,sBACxB,KAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,OAAM,MAAO,EAAA,QAAA,EAAU,CAAC,cAAA,CAAe,KAAK,CAAG,CAAA,KAAA,CAAA,CAAE,SAAS,uBAAwB,CAAA,MAAA,IAAU,EAAE,KAAS,KAAA,sBAAA,CAAuB,IAAI,CAAA,EAAG,SAAS,MAAM,IAAA,CAAK,uBAAuB,IAAI,CAAA,EAAA,sCAC3L,QAAS,EAAA,EAAA,KAAA,EAAO,EAAE,KAAA,EAAM,eAAe,IAAK,CAAA,CAAA,CAAA,KAAG,EAAE,IAAS,KAAA,uBAAA,CAAwB,UAAU,CAAE,CAAA,KAAA,KAAS,sBAAuB,CAAA,IAAI,IAAE,MAAO,GAAA,SAAA,IAAW,CAC3J,CAAA,sCACC,UAAW,EAAA,EAAA,KAAA,EAAM,WAAU,QAAU,EAAA,CAAC,eAAe,IAAK,CAAA,CAAA,CAAA,KAAG,EAAE,IAAS,KAAA,uBAAA,CAAwB,UAAU,CAAE,CAAA,KAAA,KAAS,sBAAuB,CAAA,OAAO,GAAG,OAAS,EAAA,MAAM,KAAK,sBAAuB,CAAA,OAAO,GAAG,KAAO,EAAA,EAAC,UAAW,EAAA,OAAA,sBAC1N,KAAA,CAAA,aAAA,CAAA,WAAA,EAAA,EAAY,OAAO,EAAE,KAAA,EAAM,eAAe,IAAK,CAAA,CAAA,CAAA,KAAG,CAAE,CAAA,IAAA,KAAS,wBAAwB,MAAU,IAAA,CAAA,CAAE,UAAS,sBAAuB,CAAA,OAAO,IAAE,QAAS,GAAA,SAAA,EAAW,EAAA,CACnK,mBACC,KAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,OAAM,OAAQ,EAAA,QAAA,EAAU,CAAC,cAAe,CAAA,IAAA,CAAK,CAAG,CAAA,KAAA,CAAA,CAAE,SAAS,uBAAwB,CAAA,MAAA,IAAU,EAAE,KAAS,KAAA,sBAAA,CAAuB,KAAK,CAAG,EAAA,OAAA,EAAS,MAAM,IAAA,CAAK,uBAAuB,KAAK,CAAA,EAAG,OAAO,EAAC,UAAA,EAAW,SACrN,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,SAAU,EAAA,EAAA,KAAA,EAAO,EAAE,KAAM,EAAA,cAAA,CAAe,KAAK,CAAG,CAAA,KAAA,CAAA,CAAE,SAAS,uBAAwB,CAAA,MAAA,IAAU,EAAE,KAAS,KAAA,sBAAA,CAAuB,KAAK,CAAE,GAAA,KAAA,GAAM,WAAW,EAAA,CAC5J,CACJ,CACJ,CAAA;AAAA,GAER;AAEA,EAAM,MAAA,WAAA,GAAc,CAAC,KAAkC,KAAA;AACnD,IAAA,iBAAA,CAAkB,eAAe,MAAO,CAAA,CAAA,CAAA,KAAI,CAAE,CAAA,KAAA,KAAQ,KAAK,CAAC,CAAA;AAC5D,IAAA,mBAAA,CAAoB,KAAK,CAAA;AAAA,GAC7B;AAEA,EAAA,MAAM,cAAiB,GAAA,CAAC,UAAqB,EAAA,QAAA,EAAmB,cAA4B,KAAA;AACxF,IAAA,qBAAA,CAAsB,UAAU,CAAA;AAChC,IAAA,mBAAA,CAAoB,QAAQ,CAAA;AAC5B,IAAA,yBAAA,CAA0B,cAAc,CAAA;AAAA,GAC5C;AAEA,EAAM,MAAA,aAAA,GAAgB,CAAC,OAAqB,KAAA;AACxC,IAAI,IAAA,CAAC,QAAQ,GAAK,EAAA;AACd,MAAO,uBAAA,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,EAAG,OAAQ,CAAA,IAAA,GAAK,IAAK,CAAA;AAAA;AAGhC,IAAA,IAAI,4BAAc,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,CAAA;AAClB,IAAI,IAAA,gBAAA,CAAiB,WAAW,CAAG,EAAA;AAC/B,MAAa,SAAA,mBAAA,KAAA,CAAA,aAAA,CAAC,UAAK,KAAO,EAAA,EAAC,OAAM,OAAO,EAAA,EAAA,EAAI,OAAQ,CAAA,GAAA,GAAI,GAAI,CAAA;AAAA;AAGhE,IAAA,IAAI,kCAAoB,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,CAAA;AACxB,IAAI,IAAA,sBAAA,CAAuB,WAAW,CAAE,EAAA;AACpC,MAAkB,eAAA,mBAAA,KAAA,CAAA,aAAA,CAAC,UAAK,KAAO,EAAA,EAAC,OAAM,MAAM,EAAA,EAAA,EAAI,OAAQ,CAAA,SAAA,GAAU,GAAI,CAAA;AAAA;AAE1E,IAAA,uBAAU,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,EAAA,SAAA,EAAW,eAAiB,EAAA,OAAA,CAAQ,OAAK,IAAK,CAAA;AAAA,GAC5D;AAEA,EAAQ,uBAAA,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,EAEF,2BAAY,KAAA,CAAA,aAAA,CAAA,QAAA,EAAA,IAAQ,GAErB,CAAC,iBAAA,CAAkB,MAAM,CAAA,IAAK,CAAC,OAAA,IAAW,yBACtC,KAAA,CAAA,aAAA,CAAA,YAAA,EAAA,EAAa,OAAO,sEAAwE,EAAA,OAAA,EAAS,OAAO,OAAS,EAAA,CAAA,EAGzH,CAAC,iBAAA,CAAkB,MAAM,CAAA,IAAK,CAAC,OAC5B,oBAAA,KAAA,CAAA,aAAA,CAAC,+BAA4B,WAAY,EAAA,8CAAA,EAA+C,YAAY,0BAA2B,EAAA,CAAA,EAGjI,iBAAkB,CAAA,MAAM,CAAK,IAAA,CAAC,WAAW,SAAa,IAAA,SAAA,CAAU,MAAS,KAAA,CAAA,oBACtE,KAAA,CAAA,aAAA,CAAA,iBAAA,EAAA,EAAkB,OAAO,SAAU,CAAA,WAAA,EAAa,MAAe,EAAA,CAAA,EAGlE,iBAAkB,CAAA,MAAM,KAAK,CAAC,OAAA,IAAW,aAAa,SAAU,CAAA,MAAA,GAAO,KAAK,SAAU,CAAA,MAAA,CAAO,CAAC,GAAA,EAAI,OAAY,KAAA,GAAA,GAAI,QAAQ,IAAK,CAAA,MAAA,EAAQ,CAAC,CAAI,KAAA,CAAA,wCACzI,iBAAkB,EAAA,EAAA,KAAA,EAAO,SAAU,CAAA,OAAA,EAAS,MAAe,EAAA,CAAA,EAG9D,kBAAkB,MAAM,CAAA,IAAK,CAAC,OAAW,IAAA,SAAA,IAAa,UAAU,MAAO,GAAA,CAAA,IAAK,SAAU,CAAA,MAAA,CAAO,CAAC,GAAA,EAAI,YAAY,GAAI,GAAA,OAAA,CAAQ,IAAK,CAAA,MAAA,EAAQ,CAAC,CAAA,GAAE,qBACvI,KAAA,CAAA,aAAA,CAAA,GAAA,EAAA,EAAI,EAAI,EAAA,EAAE,OAAS,EAAA,MAAA,EAAQ,QAAO,MAAM,EAAA,EAAA,sCACpC,GAAI,EAAA,EAAA,EAAA,EAAI,EAAE,KAAO,EAAA,OAAA,EACd,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,SAAA,EAAS,MAAC,SAAU,EAAA,QAAA,EAAA,sCACrB,IAAK,EAAA,EAAA,IAAA,EAAI,wBACL,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA,kBACI,KAAA,CAAA,aAAA,CAAA,WAAA,EAAA,EAAY,SAAsB,EAAA,mBAAA,EAA0C,UAAU,eAAgB,EAAA,CAC3G,CACJ,CACA,kBAAA,KAAA,CAAA,aAAA,CAAC,QAAK,IAAI,EAAA,IAAA,EAAA,kBACL,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA,kBACI,KAAA,CAAA,aAAA,CAAA,OAAA,EAAA,EAAQ,SAAS,mBAAoB,CAAA,OAAA,EAAS,QAAU,EAAA,iBAAA,EAAmB,QAAU,EAAA,sBAAA,CAAuB,WAAW,CAAK,IAAA,OAAA,IAAW,MAAO,CAAA,OAAA,EAAQ,CAC3J,CACJ,CACJ,CACJ,CAAA,sCAEC,GAAI,EAAA,EAAA,EAAA,EAAI,EAAE,QAAU,EAAA,CAAA,EAAG,IAAK,EAAA,CAAA,EAAG,QAAS,EAAA,QAAA,EAAU,GAAE,CAAG,EAAA,QAAA,EAAS,KAAM,EAAA,EAAA,EAEjE,CAAC,mBAAA,wCACE,KAAI,EAAA,EAAA,GAAA,EAAK,aAAe,EAAA,GAAA,EAAI,qBAAsB,EAAA,KAAA,EAAO,EAAE,IAAK,EAAA,KAAA,EAAO,WAAU,KAAO,EAAA,KAAA,EAAM,OAAO,QAAS,EAAA,UAAA,EAAc,EAAA,CAAA,EAG/H,mBAAuB,oBAAA,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,sCACpB,IAAK,EAAA,EAAA,KAAA,EAAO,EAAE,SAAA,EAAU,EAAI,EAAA,MAAA,EAAO,QAAQ,OAAQ,EAAA,MAAA,EAAQ,aAAc,EAAA,QAAA,EACtE,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACG,KAAA,EAAO,cAAc,mBAAmB,CAAA;AAAA,MACxC,OAAO,EAAC,SAAA,EAAU,IAAI,YAAa,EAAA,CAAA,EAAG,YAAW,CAAC,EAAA;AAAA,MAClD,QAAQ,aAAc;AAAA;AAAA,GAC1B,sCAEC,UAAW,EAAA,EAAA,KAAA,EAAO,EAAC,UAAW,EAAA,EAAA,EAAI,cAAa,CAAC,EAAA,EAAA,sCAC5C,cAAe,EAAA,EAAA,OAAA,EAAS,UAAU,IAAK,CAAA,CAAA,OAAA,KAAW,QAAQ,IAAS,KAAA,mBAAmB,CAAI,EAAA,QAAA,EAAU,cAAgB,EAAA,QAAA,EAAU,wBAAwB,EAAM,IAAA,OAAA,IAAW,OAAO,OAAS,EAAA,kBAAA,EAAwC,kBAAoC,sBAA+C,EAAA,CACvT,CACA,kBAAA,KAAA,CAAA,aAAA,CAAC,OAAO,EAAA,IAAA,CAAA,sCAGP,WAAY,EAAA,EAAA,KAAA,EAAO,EAAE,QAAU,EAAA,CAAA,EAAG,UAAU,QAAU,EAAA,OAAA,EAAS,MAAQ,EAAA,aAAA,EAAe,QAAS,EAAA,EAAA,sCAC3F,GAAI,EAAA,EAAA,KAAA,EAAO,EAAE,SAAW,EAAA,MAAA,EAAQ,WAAW,MAAQ,EAAA,KAAA,EAAO,QAAQ,QAAU,EAAA,CAAA,sBAExE,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAI,KAAK,MACJ,EAAA,EAAA,QAAA,CAAS,IAAK,CAAK,CAAA,KAAA,aAAA,CAAc,CAAC,CAAC,CACzC,CAAA,sCACC,MAAK,EAAA,EAAA,GAAA,EAAK,SAAQ,CACvB,CAOJ,CACJ,CACJ,CACJ,CACJ,CAAA,EAEF,gBAAoB,oBAAA,KAAA,CAAA,aAAA,CAAC,aAAU,KAAO,EAAA,WAAA,EAAa,SAAS,MAAM,mBAAA,CAAoB,KAAK,CAAG,EAAA,cAAA,EAAgC,OAAS,EAAA,WAAA,EAAY,CACzJ,CAAA;AACJ;;;;"}
1
+ {"version":3,"file":"EntityKwirthLogContent.esm.js","sources":["../../../src/components/EntityKwirthLogContent/EntityKwirthLogContent.tsx"],"sourcesContent":["/*\r\nCopyright 2025 Julio Fernandez\r\n\r\nLicensed under the Apache License, Version 2.0 (the \"License\");\r\nyou may not use this file except in compliance with the License.\r\nYou may obtain a copy of the License at\r\n\r\n http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nUnless required by applicable law or agreed to in writing, software\r\ndistributed under the License is distributed on an \"AS IS\" BASIS,\r\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\nSee the License for the specific language governing permissions and\r\nlimitations under the License.\r\n*/\r\nimport React, { useRef, useState } from 'react'\r\nimport useAsync from 'react-use/esm/useAsync'\r\n\r\nimport { Progress, WarningPanel } from '@backstage/core-components'\r\nimport { alertApiRef, useApi } from '@backstage/core-plugin-api'\r\nimport { ANNOTATION_BACKSTAGE_KUBERNETES_LABELID, ANNOTATION_BACKSTAGE_KUBERNETES_LABELSELECTOR, isKwirthAvailable, ClusterValidPods, PodData, ILogLine, IStatusLine } from '@jfvilas/plugin-kwirth-common'\r\nimport { MissingAnnotationEmptyState, useEntity } from '@backstage/plugin-catalog-react'\r\n\r\n// kwirthlog\r\nimport { kwirthLogApiRef } from '../../api'\r\nimport { accessKeySerialize, ILogMessage, InstanceMessageActionEnum, InstanceConfigScopeEnum, InstanceConfigViewEnum, InstanceMessage, InstanceMessageTypeEnum, SignalMessage, SignalMessageLevelEnum, InstanceConfigObjectEnum, InstanceConfig, InstanceMessageFlowEnum, InstanceMessageChannelEnum, IOpsMessage, OpsCommandEnum, IRouteMessage, IOpsMessageResponse } from '@jfvilas/kwirth-common'\r\n\r\n// kwirthlog components\r\nimport { ComponentNotFound, ErrorType } from '../ComponentNotFound'\r\nimport { ObjectSelector } from '../ObjectSelector'\r\nimport { Options } from '../Options'\r\nimport { ClusterList } from '../ClusterList'\r\nimport { StatusLog } from '../StatusLog'\r\n\r\n\r\n// Material-UI\r\nimport { Grid, Card, CardHeader, CardContent, Box, Button } from '@material-ui/core'\r\nimport Divider from '@material-ui/core/Divider'\r\nimport IconButton from '@material-ui/core/IconButton'\r\nimport Typography from '@material-ui/core/Typography'\r\n\r\n// Icons\r\nimport PlayIcon from '@material-ui/icons/PlayArrow'\r\nimport PauseIcon from '@material-ui/icons/Pause'\r\nimport StopIcon from '@material-ui/icons/Stop'\r\nimport InfoIcon from '@material-ui/icons/Info'\r\nimport WarningIcon from '@material-ui/icons/Warning'\r\nimport ErrorIcon from '@material-ui/icons/Error'\r\nimport DownloadIcon from '@material-ui/icons/CloudDownload'\r\nimport KwirthLogLogo from '../../assets/kwirthlog-logo.svg'\r\nimport RefreshIcon from '@material-ui/icons/Refresh'\r\n\r\nconst LOG_MAX_MESSAGES=1000\r\n\r\nexport const EntityKwirthLogContent = (props:{ enableRestart: boolean }) => { \r\n const { entity } = useEntity()\r\n const kwirthLogApi = useApi(kwirthLogApiRef)\r\n const alertApi = useApi(alertApiRef)\r\n const [resources, setResources] = useState<ClusterValidPods[]>([])\r\n const [selectedClusterName, setSelectedClusterName] = useState('')\r\n const [selectedNamespaces, setSelectedNamespaces] = useState<string[]>([])\r\n const [selectedPodNames, setSelectedPodNames] = useState<string[]>([])\r\n const [selectedContainerNames, setSelectedContainerNames] = useState<string[]>([])\r\n const [started, setStarted] = useState(false)\r\n const [stopped, setStopped] = useState(true)\r\n const paused=useRef<boolean>(false)\r\n const [messages, setMessages] = useState<ILogLine[]>([])\r\n const [pendingMessages, setPendingMessages] = useState<ILogLine[]>([])\r\n const [statusMessages, setStatusMessages] = useState<IStatusLine[]>([])\r\n const [websocket, setWebsocket] = useState<WebSocket>()\r\n const [instance, setInstance] = useState<string>()\r\n const kwirthLogOptionsRef = useRef<any>({timestamp:false, follow:true, fromStart:false})\r\n const [showStatusDialog, setShowStatusDialog] = useState(false)\r\n const [statusLevel, setStatusLevel] = useState<SignalMessageLevelEnum>(SignalMessageLevelEnum.INFO)\r\n const preRef = useRef<HTMLPreElement|null>(null)\r\n const lastRef = useRef<HTMLPreElement|null>(null)\r\n const [ backendVersion, setBackendVersion ] = useState<string>('')\r\n const { loading, error } = useAsync ( async () => {\r\n if (backendVersion==='') setBackendVersion(await kwirthLogApi.getVersion())\r\n let reqScopes = [InstanceConfigScopeEnum.VIEW]\r\n if (props.enableRestart) reqScopes.push(InstanceConfigScopeEnum.RESTART)\r\n let data:ClusterValidPods[] = await kwirthLogApi.requestAccess(entity, InstanceMessageChannelEnum.LOG, reqScopes)\r\n setResources(data)\r\n })\r\n const buffer = useRef<Map<string,string>>(new Map())\r\n\r\n\r\n const clickStart = (options:any) => {\r\n if (!paused.current) {\r\n setStarted(true)\r\n paused.current=false\r\n setStopped(false)\r\n startLogViewer(options)\r\n }\r\n else {\r\n setMessages( (prev) => [ ...prev, ...pendingMessages])\r\n setPendingMessages([])\r\n paused.current=false\r\n setStarted(true)\r\n }\r\n }\r\n\r\n const onClickPause = () => {\r\n setStarted(false)\r\n paused.current=true\r\n }\r\n\r\n const onClickStop = () => {\r\n setStarted(false)\r\n setStopped(true)\r\n paused.current=false\r\n stopLogViewer()\r\n }\r\n\r\n const onSelectCluster = (name:string|undefined) => {\r\n if (name) {\r\n setSelectedClusterName(name)\r\n setMessages([{\r\n type: InstanceMessageTypeEnum.SIGNAL,\r\n text: 'Select namespace in order to decide which pod logs to view.',\r\n namespace: '',\r\n pod: '',\r\n container: ''\r\n }])\r\n setSelectedNamespaces([])\r\n setSelectedPodNames([])\r\n setSelectedContainerNames([])\r\n setStatusMessages([])\r\n onClickStop()\r\n }\r\n }\r\n\r\n const processLogMessage = (wsEvent:any) => {\r\n let instanceMessage = JSON.parse(wsEvent.data) as InstanceMessage\r\n switch (instanceMessage.type) {\r\n case InstanceMessageTypeEnum.DATA:\r\n let logMessage = instanceMessage as ILogMessage\r\n let bname = logMessage.namespace+'/'+logMessage.pod+'/'+logMessage.container\r\n let text = logMessage.text\r\n if (!buffer.current.has(bname)) buffer.current.set(bname,'')\r\n if (buffer.current.get(bname)) {\r\n text = buffer.current.get(bname) + text\r\n buffer.current.set(bname,'')\r\n }\r\n if (!text.endsWith('\\n')) {\r\n let i = text.lastIndexOf('\\n')\r\n buffer.current.set(bname,text.substring(i))\r\n text = text.substring(0,i)\r\n }\r\n\r\n for (let line of text.split('\\n')) {\r\n if (line.trim() === '') continue\r\n\r\n let logLine:ILogLine = {\r\n text: line,\r\n namespace: logMessage.namespace,\r\n pod: logMessage.pod,\r\n container: logMessage.container,\r\n type: logMessage.type\r\n }\r\n\r\n if (paused.current) {\r\n setPendingMessages((prev) => [ ...prev, logLine ])\r\n }\r\n else {\r\n setMessages((prev) => {\r\n while (prev.length>LOG_MAX_MESSAGES-1) {\r\n prev.splice(0,1)\r\n }\r\n if (kwirthLogOptionsRef.current.follow && lastRef.current) lastRef.current.scrollIntoView({ behavior: 'instant', block: 'start' })\r\n return [ ...prev, logLine ]\r\n })\r\n }\r\n }\r\n break\r\n case InstanceMessageTypeEnum.SIGNAL:\r\n if (instanceMessage.flow === InstanceMessageFlowEnum.RESPONSE && instanceMessage.action === InstanceMessageActionEnum.START) {\r\n if (instanceMessage.instance!=='')\r\n setInstance(instanceMessage.instance)\r\n else {\r\n let signalMessage = instanceMessage as SignalMessage\r\n alertApi.post({ message: signalMessage.text, severity:'error', display:'transient' })\r\n }\r\n }\r\n else {\r\n let signalMessage = instanceMessage as SignalMessage\r\n addMessage(signalMessage.level, signalMessage.text)\r\n switch(signalMessage.level) {\r\n case SignalMessageLevelEnum.INFO:\r\n alertApi.post({ message: signalMessage.text, severity:'info', display:'transient' })\r\n break\r\n case SignalMessageLevelEnum.WARNING:\r\n alertApi.post({ message: signalMessage.text, severity:'warning', display:'transient' })\r\n break\r\n case SignalMessageLevelEnum.ERROR:\r\n alertApi.post({ message: signalMessage.text, severity:'error', display:'transient' })\r\n break\r\n default:\r\n alertApi.post({ message: signalMessage.text, severity:'success', display:'transient' })\r\n break\r\n }\r\n }\r\n break\r\n default:\r\n addMessage(SignalMessageLevelEnum.ERROR, 'Invalid message type received: ' + instanceMessage.type)\r\n alertApi.post({ message: 'Invalid message type received: ' + instanceMessage.type, severity:'error', display:'transient' })\r\n break\r\n }\r\n }\r\n\r\n const addMessage = (level:SignalMessageLevelEnum, text:string) => {\r\n setStatusMessages ((prev) => [...prev, {\r\n level,\r\n text,\r\n type: InstanceMessageTypeEnum.SIGNAL,\r\n }])\r\n }\r\n\r\n const websocketOnMessage = (wsEvent:any) => {\r\n let instanceMessage:InstanceMessage\r\n try {\r\n instanceMessage = JSON.parse(wsEvent.data) as InstanceMessage\r\n }\r\n catch (err) {\r\n console.log(err)\r\n console.log(wsEvent.data)\r\n return\r\n }\r\n\r\n switch(instanceMessage.channel) {\r\n case InstanceMessageChannelEnum.LOG:\r\n processLogMessage(wsEvent)\r\n break\r\n case InstanceMessageChannelEnum.OPS:\r\n let opsMessage = instanceMessage as IOpsMessageResponse\r\n if (opsMessage.data?.data) \r\n addMessage (SignalMessageLevelEnum.WARNING, 'Operations message: '+opsMessage.data.data)\r\n else\r\n addMessage (SignalMessageLevelEnum.WARNING, 'Operations message: '+JSON.stringify(opsMessage))\r\n break\r\n default:\r\n addMessage (SignalMessageLevelEnum.ERROR, 'Invalid channel in message: '+instanceMessage.channel)\r\n addMessage (SignalMessageLevelEnum.ERROR, 'Invalid message: '+JSON.stringify(instanceMessage))\r\n break\r\n }\r\n }\r\n\r\n const websocketOnOpen = (ws:WebSocket, options:any) => {\r\n let cluster=resources.find(cluster => cluster.name === selectedClusterName)\r\n if (!cluster) {\r\n addMessage(SignalMessageLevelEnum.ERROR,'No cluster selected')\r\n return\r\n }\r\n let pods = cluster.data.filter(p => selectedNamespaces.includes(p.namespace))\r\n if (!pods) {\r\n addMessage(SignalMessageLevelEnum.ERROR,'No pods found')\r\n return\r\n }\r\n console.log(`WS connected`)\r\n let accessKey = cluster.accessKeys.get(InstanceConfigScopeEnum.VIEW)\r\n if (accessKey) {\r\n let containers:string[] = []\r\n if (selectedContainerNames.length>0) {\r\n for(var p of selectedPodNames) {\r\n for (var c of selectedContainerNames) {\r\n containers.push(p+'+'+c)\r\n }\r\n }\r\n }\r\n let iConfig:InstanceConfig = {\r\n channel: InstanceMessageChannelEnum.LOG,\r\n objects: InstanceConfigObjectEnum.PODS,\r\n action: InstanceMessageActionEnum.START,\r\n flow: InstanceMessageFlowEnum.REQUEST,\r\n instance: '',\r\n accessKey: accessKeySerialize(accessKey),\r\n scope: InstanceConfigScopeEnum.VIEW,\r\n view: (selectedContainerNames.length > 0 ? InstanceConfigViewEnum.CONTAINER : InstanceConfigViewEnum.POD),\r\n namespace: selectedNamespaces.join(','),\r\n group: '',\r\n pod: selectedPodNames.map(p => p).join(','),\r\n container: containers.join(','),\r\n data: {\r\n timestamp: options.timestamp,\r\n previous: false,\r\n maxMessages: LOG_MAX_MESSAGES,\r\n fromStart: options.fromStart\r\n },\r\n type: InstanceMessageTypeEnum.SIGNAL\r\n }\r\n ws.send(JSON.stringify(iConfig))\r\n }\r\n else {\r\n addMessage(SignalMessageLevelEnum.ERROR,'No accessKey for starting log streaming')\r\n return\r\n }\r\n }\r\n\r\n const startLogViewer = (options:any) => {\r\n let cluster=resources.find(cluster => cluster.name===selectedClusterName);\r\n if (!cluster) {\r\n addMessage(SignalMessageLevelEnum.ERROR,'No cluster selected')\r\n return\r\n }\r\n\r\n setMessages([])\r\n try {\r\n let ws = new WebSocket(cluster.url)\r\n ws.onopen = () => websocketOnOpen(ws, options)\r\n ws.onmessage = (event) => websocketOnMessage(event)\r\n ws.onclose = (event) => websocketOnClose(event)\r\n setWebsocket(ws)\r\n }\r\n catch (err) {\r\n setMessages([ {\r\n type: InstanceMessageTypeEnum.DATA,\r\n text: `Error opening log stream: ${err}`,\r\n namespace: '',\r\n pod: '',\r\n container: ''\r\n } ])\r\n }\r\n\r\n }\r\n\r\n const websocketOnClose = (_event:any) => {\r\n console.log(`WS disconnected`)\r\n setStarted(false)\r\n paused.current=false\r\n setStopped(true)\r\n }\r\n\r\n const stopLogViewer = () => {\r\n messages.push({\r\n type: InstanceMessageTypeEnum.DATA,\r\n text: '============================================================================================================================',\r\n namespace: '',\r\n pod: '',\r\n container: ''\r\n })\r\n websocket?.close()\r\n }\r\n\r\n const onChangeLogConfig = (options:any) => {\r\n kwirthLogOptionsRef.current=options\r\n if (started) {\r\n clickStart(options)\r\n }\r\n }\r\n\r\n const onClickDownload = () => {\r\n let content = preRef.current!.innerHTML.replaceAll('<pre>','').replaceAll('</pre>','\\n')\r\n content = content.replaceAll('<span style=\"color: green;\">','')\r\n content = content.replaceAll('<span style=\"color: blue;\">','')\r\n content = content.replaceAll('</span>','')\r\n let filename = selectedClusterName+'-'+selectedNamespaces+'-'+entity.metadata.name+'.txt'\r\n let mimeType:string = 'text/plain'\r\n \r\n const blob = new Blob([content], { type: mimeType })\r\n const url = URL.createObjectURL(blob)\r\n const link = document.createElement('a')\r\n link.href = url\r\n link.download = filename\r\n document.body.appendChild(link)\r\n link.click()\r\n document.body.removeChild(link)\r\n URL.revokeObjectURL(url)\r\n }\r\n\r\n const onClickRestart = () => {\r\n // we perform a route command from channel 'log' to channel 'ops'\r\n var cluster=resources.find(cluster => cluster.name===selectedClusterName);\r\n if (!cluster) {\r\n addMessage(SignalMessageLevelEnum.ERROR,'No cluster selected')\r\n return\r\n }\r\n let restartKey = cluster.accessKeys.get(InstanceConfigScopeEnum.RESTART)\r\n if (!restartKey) {\r\n addMessage(SignalMessageLevelEnum.ERROR,'No access key present')\r\n return\r\n }\r\n if (!instance) {\r\n addMessage(SignalMessageLevelEnum.ERROR,'No instance has been established')\r\n return\r\n }\r\n\r\n let pods:PodData[] = (cluster.data as PodData[]).filter(pod => selectedNamespaces.includes(pod.namespace))\r\n for (let pod of pods) {\r\n let opsMessage:IOpsMessage = {\r\n msgtype: 'opsmessage',\r\n action: InstanceMessageActionEnum.COMMAND,\r\n flow: InstanceMessageFlowEnum.IMMEDIATE,\r\n type: InstanceMessageTypeEnum.DATA,\r\n channel: InstanceMessageChannelEnum.OPS,\r\n instance: '',\r\n id: '1',\r\n accessKey: accessKeySerialize(restartKey),\r\n command: OpsCommandEnum.RESTARTPOD,\r\n namespace: pod.namespace,\r\n group: '',\r\n pod: pod.name,\r\n container: ''\r\n }\r\n let routeMessage: IRouteMessage = {\r\n msgtype: 'routemessage',\r\n accessKey: accessKeySerialize(restartKey),\r\n destChannel: InstanceMessageChannelEnum.OPS,\r\n action: InstanceMessageActionEnum.ROUTE,\r\n flow: InstanceMessageFlowEnum.IMMEDIATE,\r\n type: InstanceMessageTypeEnum.SIGNAL,\r\n channel: InstanceMessageChannelEnum.LOG,\r\n instance: instance,\r\n data: opsMessage\r\n }\r\n websocket?.send(JSON.stringify(routeMessage))\r\n }\r\n }\r\n\r\n const actionButtons = () => {\r\n let hasViewKey=false, hasRestartKey = false\r\n let cluster=resources.find(cluster => cluster.name===selectedClusterName)\r\n if (cluster) {\r\n hasViewKey = Boolean(cluster.accessKeys.get(InstanceConfigScopeEnum.VIEW))\r\n hasRestartKey = Boolean(cluster.accessKeys.get(InstanceConfigScopeEnum.RESTART))\r\n }\r\n\r\n return <>\r\n { props.enableRestart &&\r\n <IconButton title='Restart' onClick={onClickRestart} disabled={selectedPodNames.length === 0 || !hasRestartKey || !websocket || !started}>\r\n <RefreshIcon />\r\n </IconButton>\r\n }\r\n <IconButton title='Download' onClick={onClickDownload} disabled={messages.length<=1}>\r\n <DownloadIcon />\r\n </IconButton>\r\n <IconButton onClick={() => clickStart(kwirthLogOptionsRef.current)} title=\"Play\" disabled={started || !paused || selectedPodNames.length === 0 || !hasViewKey}>\r\n <PlayIcon />\r\n </IconButton>\r\n <IconButton onClick={onClickPause} title=\"Pause\" disabled={!((started && !paused.current) && selectedPodNames.length > 0)}>\r\n <PauseIcon />\r\n </IconButton>\r\n <IconButton onClick={onClickStop} title=\"Stop\" disabled={stopped || selectedPodNames.length === 0}>\r\n <StopIcon />\r\n </IconButton>\r\n </>\r\n }\r\n\r\n const statusButtons = (title:string) => {\r\n const show = (level:SignalMessageLevelEnum) => {\r\n setShowStatusDialog(true)\r\n setStatusLevel(level)\r\n }\r\n\r\n return (\r\n <Grid container direction='row' >\r\n <Grid item>\r\n <Typography variant='h5'>{title}</Typography>\r\n </Grid>\r\n <Grid item style={{marginTop:'-8px'}}>\r\n <IconButton title=\"info\" disabled={!statusMessages.some(m=>m.type === InstanceMessageTypeEnum.SIGNAL && m.level=== SignalMessageLevelEnum.INFO)} onClick={() => show(SignalMessageLevelEnum.INFO)}>\r\n <InfoIcon style={{ color:statusMessages.some(m=>m.type === InstanceMessageTypeEnum.SIGNAL && m.level=== SignalMessageLevelEnum.INFO)?'blue':'#BDBDBD'}}/>\r\n </IconButton>\r\n <IconButton title=\"warning\" disabled={!statusMessages.some(m=>m.type === InstanceMessageTypeEnum.SIGNAL && m.level=== SignalMessageLevelEnum.WARNING)} onClick={() => show(SignalMessageLevelEnum.WARNING)} style={{marginLeft:'-16px'}}>\r\n <WarningIcon style={{ color:statusMessages.some(m=>m.type === InstanceMessageTypeEnum.SIGNAL && m.level=== SignalMessageLevelEnum.WARNING)?'orange':'#BDBDBD'}}/>\r\n </IconButton>\r\n <IconButton title=\"error\" disabled={!statusMessages.some(m=>m.type === InstanceMessageTypeEnum.SIGNAL && m.level=== SignalMessageLevelEnum.ERROR)} onClick={() => show(SignalMessageLevelEnum.ERROR)} style={{marginLeft:'-16px'}}>\r\n <ErrorIcon style={{ color:statusMessages.some(m=>m.type === InstanceMessageTypeEnum.SIGNAL && m.level=== SignalMessageLevelEnum.ERROR)?'red':'#BDBDBD'}}/>\r\n </IconButton>\r\n </Grid>\r\n </Grid>\r\n )\r\n }\r\n\r\n const statusClear = (level: SignalMessageLevelEnum) => {\r\n setStatusMessages(statusMessages.filter(m=> m.level!==level))\r\n setShowStatusDialog(false)\r\n }\r\n \r\n const onSelectObject = (namespaces:string[], podNames:string[], containerNames:string[]) => {\r\n setSelectedNamespaces(namespaces)\r\n setSelectedPodNames(podNames)\r\n setSelectedContainerNames(containerNames)\r\n }\r\n\r\n const formatMessage = (logLine:ILogLine) => {\r\n if (!logLine.pod) {\r\n return <>{logLine.text+'\\n'}</>\r\n }\r\n\r\n let podPrefix = <></>\r\n if (selectedPodNames.length !== 1) {\r\n podPrefix = <span style={{color:\"green\"}}>{logLine.pod+' '}</span>\r\n }\r\n\r\n let containerPrefix = <></>\r\n if (selectedContainerNames.length !== 1){\r\n containerPrefix = <span style={{color:\"blue\"}}>{logLine.container+' '}</span>\r\n }\r\n return <>{podPrefix}{containerPrefix}{logLine.text+'\\n'}</>\r\n }\r\n\r\n return (<>\r\n\r\n { loading && <Progress/> }\r\n\r\n {!isKwirthAvailable(entity) && !loading && error && (\r\n <WarningPanel title={'An error has ocurred while obtaining data from kuebernetes clusters.'} message={error?.message} />\r\n )}\r\n\r\n {!isKwirthAvailable(entity) && !loading && (\r\n <MissingAnnotationEmptyState readMoreUrl='https://github.com/jfvilas/plugin-kwirth-log' annotation={[ANNOTATION_BACKSTAGE_KUBERNETES_LABELID, ANNOTATION_BACKSTAGE_KUBERNETES_LABELSELECTOR]}/>\r\n )}\r\n\r\n { isKwirthAvailable(entity) && !loading && resources && resources.length===0 &&\r\n <ComponentNotFound error={ErrorType.NO_CLUSTERS} entity={entity}/>\r\n }\r\n\r\n { isKwirthAvailable(entity) && !loading && resources && resources.length>0 && resources.reduce((sum,cluster) => sum+cluster.data.length, 0)===0 &&\r\n <ComponentNotFound error={ErrorType.NO_PODS} entity={entity}/>\r\n }\r\n\r\n { isKwirthAvailable(entity) && !loading && resources && resources.length>0 && resources.reduce((sum,cluster) => sum+cluster.data.length, 0)>0 &&\r\n <Box sx={{ display: 'flex', height:'70vh'}}>\r\n <Box sx={{ width: '200px'}}>\r\n <Grid container direction='column'>\r\n <Grid item> \r\n <Card>\r\n <ClusterList resources={resources} selectedClusterName={selectedClusterName} onSelect={onSelectCluster}/>\r\n </Card>\r\n </Grid>\r\n <Grid item>\r\n <Card>\r\n <Options options={kwirthLogOptionsRef.current} onChange={onChangeLogConfig} disabled={selectedContainerNames.length === 0 || started || paused.current}/>\r\n </Card>\r\n </Grid>\r\n </Grid>\r\n </Box>\r\n\r\n <Box sx={{ flexGrow: 1, flex:1, overflow:'hidden', p:1, maxWidth:'85%' }}>\r\n\r\n { !selectedClusterName && \r\n <img src={KwirthLogLogo} alt='No cluster selected' style={{ left:'40%', marginTop:'10%', width:'20%', position:'relative' }} />\r\n }\r\n\r\n { selectedClusterName && <>\r\n <Card style={{ marginTop:-8, height:'100%', display:'flex', flexDirection:'column' }}>\r\n <CardHeader\r\n title={statusButtons(selectedClusterName)}\r\n style={{marginTop:-4, marginBottom:4, flexShrink:0}}\r\n action={actionButtons()}\r\n />\r\n \r\n <Typography style={{marginLeft:16, marginBottom:4}}>\r\n <ObjectSelector cluster={resources.find(cluster => cluster.name === selectedClusterName)!} onSelect={onSelectObject} disabled={selectedClusterName === '' || started || paused.current} selectedNamespaces={selectedNamespaces} selectedPodNames={selectedPodNames} selectedContainerNames={selectedContainerNames}/>\r\n </Typography>\r\n <Divider/>\r\n {/* <CardContent>\r\n <Box style={{ display:'flex', flexDirection:'column', overflowY:'auto', overflowX:'auto', width:'100%', flexGrow:1, height:'55vh'}}> */}\r\n <CardContent style={{ flexGrow: 1, overflow: 'hidden', display: 'flex', flexDirection: 'column' }}>\r\n <Box style={{ overflowY: 'auto', overflowX: 'auto', width: '100%', flexGrow: 1 }}>\r\n\r\n <pre ref={preRef}>\r\n { messages.map (m => formatMessage(m)) }\r\n </pre>\r\n <span ref={lastRef}/>\r\n </Box> \r\n {/* <Box style={{ overflowY: 'auto', overflowX:'auto', whiteSpace: 'nowrap', maxHeight:'60vh' }}>\r\n <pre ref={preRef}>\r\n { messages.map (m => formatMessage(m)) }\r\n </pre>\r\n <span ref={lastRef}></span>\r\n </Box> */}\r\n </CardContent>\r\n </Card>\r\n </>}\r\n </Box>\r\n </Box>\r\n }\r\n { showStatusDialog && <StatusLog level={statusLevel} onClose={() => setShowStatusDialog(false)} statusMessages={statusMessages} onClear={statusClear}/>}\r\n </>)\r\n}\r\n"],"names":["cluster","p"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAoDA,MAAM,gBAAiB,GAAA,GAAA;AAEV,MAAA,sBAAA,GAAyB,CAAC,KAAqC,KAAA;AACxE,EAAM,MAAA,EAAE,MAAO,EAAA,GAAI,SAAU,EAAA;AAC7B,EAAM,MAAA,YAAA,GAAe,OAAO,eAAe,CAAA;AAC3C,EAAM,MAAA,QAAA,GAAW,OAAO,WAAW,CAAA;AACnC,EAAA,MAAM,CAAC,SAAW,EAAA,YAAY,CAAI,GAAA,QAAA,CAA6B,EAAE,CAAA;AACjE,EAAA,MAAM,CAAC,mBAAA,EAAqB,sBAAsB,CAAA,GAAI,SAAS,EAAE,CAAA;AACjE,EAAA,MAAM,CAAC,kBAAoB,EAAA,qBAAqB,CAAI,GAAA,QAAA,CAAmB,EAAE,CAAA;AACzE,EAAA,MAAM,CAAC,gBAAkB,EAAA,mBAAmB,CAAI,GAAA,QAAA,CAAmB,EAAE,CAAA;AACrE,EAAA,MAAM,CAAC,sBAAwB,EAAA,yBAAyB,CAAI,GAAA,QAAA,CAAmB,EAAE,CAAA;AACjF,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,IAAI,CAAA;AAC3C,EAAM,MAAA,MAAA,GAAO,OAAgB,KAAK,CAAA;AAClC,EAAA,MAAM,CAAC,QAAU,EAAA,WAAW,CAAI,GAAA,QAAA,CAAqB,EAAE,CAAA;AACvD,EAAA,MAAM,CAAC,eAAiB,EAAA,kBAAkB,CAAI,GAAA,QAAA,CAAqB,EAAE,CAAA;AACrE,EAAA,MAAM,CAAC,cAAgB,EAAA,iBAAiB,CAAI,GAAA,QAAA,CAAwB,EAAE,CAAA;AACtE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,QAAoB,EAAA;AACtD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,QAAiB,EAAA;AACjD,EAAM,MAAA,mBAAA,GAAsB,OAAY,EAAC,SAAA,EAAU,OAAO,MAAO,EAAA,IAAA,EAAM,SAAU,EAAA,KAAA,EAAM,CAAA;AACvF,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAI,SAAS,KAAK,CAAA;AAC9D,EAAA,MAAM,CAAC,WAAa,EAAA,cAAc,CAAI,GAAA,QAAA,CAAiC,uBAAuB,IAAI,CAAA;AAClG,EAAM,MAAA,MAAA,GAAS,OAA4B,IAAI,CAAA;AAC/C,EAAM,MAAA,OAAA,GAAU,OAA4B,IAAI,CAAA;AAChD,EAAA,MAAM,CAAE,cAAA,EAAgB,iBAAkB,CAAA,GAAI,SAAiB,EAAE,CAAA;AACjE,EAAA,MAAM,EAAE,OAAA,EAAS,KAAM,EAAA,GAAI,SAAW,YAAY;AAC9C,IAAA,IAAI,mBAAiB,EAAI,EAAA,iBAAA,CAAkB,MAAM,YAAA,CAAa,YAAY,CAAA;AAC1E,IAAI,IAAA,SAAA,GAAY,CAAC,uBAAA,CAAwB,IAAI,CAAA;AAC7C,IAAA,IAAI,KAAM,CAAA,aAAA,EAAyB,SAAA,CAAA,IAAA,CAAK,wBAAwB,OAAO,CAAA;AACvE,IAAA,IAAI,OAA0B,MAAM,YAAA,CAAa,cAAc,MAAQ,EAAA,0BAAA,CAA2B,KAAK,SAAS,CAAA;AAChH,IAAA,YAAA,CAAa,IAAI,CAAA;AAAA,GACpB,CAAA;AACD,EAAA,MAAM,MAAS,GAAA,MAAA,iBAA+B,IAAA,GAAA,EAAK,CAAA;AAGnD,EAAM,MAAA,UAAA,GAAa,CAAC,OAAgB,KAAA;AAChC,IAAI,IAAA,CAAC,OAAO,OAAS,EAAA;AACjB,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,MAAA,CAAO,OAAQ,GAAA,KAAA;AACf,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA,cAAA,CAAe,OAAO,CAAA;AAAA,KAErB,MAAA;AACD,MAAA,WAAA,CAAa,CAAC,IAAS,KAAA,CAAE,GAAG,IAAM,EAAA,GAAG,eAAe,CAAC,CAAA;AACrD,MAAA,kBAAA,CAAmB,EAAE,CAAA;AACrB,MAAA,MAAA,CAAO,OAAQ,GAAA,KAAA;AACf,MAAA,UAAA,CAAW,IAAI,CAAA;AAAA;AACnB,GACJ;AAEA,EAAA,MAAM,eAAe,MAAM;AACvB,IAAA,UAAA,CAAW,KAAK,CAAA;AAChB,IAAA,MAAA,CAAO,OAAQ,GAAA,IAAA;AAAA,GACnB;AAEA,EAAA,MAAM,cAAc,MAAM;AACtB,IAAA,UAAA,CAAW,KAAK,CAAA;AAChB,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,MAAA,CAAO,OAAQ,GAAA,KAAA;AACf,IAAc,aAAA,EAAA;AAAA,GAClB;AAEA,EAAM,MAAA,eAAA,GAAkB,CAAC,IAA0B,KAAA;AAC/C,IAAA,IAAI,IAAM,EAAA;AACN,MAAA,sBAAA,CAAuB,IAAI,CAAA;AAC3B,MAAA,WAAA,CAAY,CAAC;AAAA,QACT,MAAM,uBAAwB,CAAA,MAAA;AAAA,QAC9B,IAAM,EAAA,6DAAA;AAAA,QACN,SAAW,EAAA,EAAA;AAAA,QACX,GAAK,EAAA,EAAA;AAAA,QACL,SAAW,EAAA;AAAA,OACd,CAAC,CAAA;AACF,MAAA,qBAAA,CAAsB,EAAE,CAAA;AACxB,MAAA,mBAAA,CAAoB,EAAE,CAAA;AACtB,MAAA,yBAAA,CAA0B,EAAE,CAAA;AAC5B,MAAA,iBAAA,CAAkB,EAAE,CAAA;AACpB,MAAY,WAAA,EAAA;AAAA;AAChB,GACJ;AAEA,EAAM,MAAA,iBAAA,GAAoB,CAAC,OAAgB,KAAA;AACvC,IAAA,IAAI,eAAkB,GAAA,IAAA,CAAK,KAAM,CAAA,OAAA,CAAQ,IAAI,CAAA;AAC7C,IAAA,QAAQ,gBAAgB,IAAM;AAAA,MAC1B,KAAK,uBAAwB,CAAA,IAAA;AACzB,QAAA,IAAI,UAAa,GAAA,eAAA;AACjB,QAAA,IAAI,QAAQ,UAAW,CAAA,SAAA,GAAU,MAAI,UAAW,CAAA,GAAA,GAAI,MAAI,UAAW,CAAA,SAAA;AACnE,QAAA,IAAI,OAAO,UAAW,CAAA,IAAA;AACtB,QAAI,IAAA,CAAC,MAAO,CAAA,OAAA,CAAQ,GAAI,CAAA,KAAK,GAAU,MAAA,CAAA,OAAA,CAAQ,GAAI,CAAA,KAAA,EAAM,EAAE,CAAA;AAC3D,QAAA,IAAI,MAAO,CAAA,OAAA,CAAQ,GAAI,CAAA,KAAK,CAAG,EAAA;AAC3B,UAAA,IAAA,GAAO,MAAO,CAAA,OAAA,CAAQ,GAAI,CAAA,KAAK,CAAI,GAAA,IAAA;AACnC,UAAO,MAAA,CAAA,OAAA,CAAQ,GAAI,CAAA,KAAA,EAAM,EAAE,CAAA;AAAA;AAE/B,QAAA,IAAI,CAAC,IAAA,CAAK,QAAS,CAAA,IAAI,CAAG,EAAA;AACtB,UAAI,IAAA,CAAA,GAAI,IAAK,CAAA,WAAA,CAAY,IAAI,CAAA;AAC7B,UAAA,MAAA,CAAO,QAAQ,GAAI,CAAA,KAAA,EAAM,IAAK,CAAA,SAAA,CAAU,CAAC,CAAC,CAAA;AAC1C,UAAO,IAAA,GAAA,IAAA,CAAK,SAAU,CAAA,CAAA,EAAE,CAAC,CAAA;AAAA;AAG7B,QAAA,KAAA,IAAS,IAAQ,IAAA,IAAA,CAAK,KAAM,CAAA,IAAI,CAAG,EAAA;AAC/B,UAAI,IAAA,IAAA,CAAK,IAAK,EAAA,KAAM,EAAI,EAAA;AAExB,UAAA,IAAI,OAAmB,GAAA;AAAA,YACnB,IAAM,EAAA,IAAA;AAAA,YACN,WAAW,UAAW,CAAA,SAAA;AAAA,YACtB,KAAK,UAAW,CAAA,GAAA;AAAA,YAChB,WAAW,UAAW,CAAA,SAAA;AAAA,YACtB,MAAM,UAAW,CAAA;AAAA,WACrB;AAEA,UAAA,IAAI,OAAO,OAAS,EAAA;AAChB,YAAA,kBAAA,CAAmB,CAAC,IAAS,KAAA,CAAE,GAAG,IAAA,EAAM,OAAQ,CAAC,CAAA;AAAA,WAEhD,MAAA;AACD,YAAA,WAAA,CAAY,CAAC,IAAS,KAAA;AAClB,cAAO,OAAA,IAAA,CAAK,MAAO,GAAA,gBAAA,GAAiB,CAAG,EAAA;AACnC,gBAAK,IAAA,CAAA,MAAA,CAAO,GAAE,CAAC,CAAA;AAAA;AAEnB,cAAA,IAAI,mBAAoB,CAAA,OAAA,CAAQ,MAAU,IAAA,OAAA,CAAQ,OAAS,EAAA,OAAA,CAAQ,OAAQ,CAAA,cAAA,CAAe,EAAE,QAAA,EAAU,SAAW,EAAA,KAAA,EAAO,SAAS,CAAA;AACjI,cAAO,OAAA,CAAE,GAAG,IAAA,EAAM,OAAQ,CAAA;AAAA,aAC7B,CAAA;AAAA;AACL;AAEJ,QAAA;AAAA,MACJ,KAAK,uBAAwB,CAAA,MAAA;AACzB,QAAA,IAAI,gBAAgB,IAAS,KAAA,uBAAA,CAAwB,YAAY,eAAgB,CAAA,MAAA,KAAW,0BAA0B,KAAO,EAAA;AACzH,UAAA,IAAI,gBAAgB,QAAW,KAAA,EAAA;AAC3B,YAAA,WAAA,CAAY,gBAAgB,QAAQ,CAAA;AAAA,eACnC;AACD,YAAA,IAAI,aAAgB,GAAA,eAAA;AACpB,YAAS,QAAA,CAAA,IAAA,CAAK,EAAE,OAAS,EAAA,aAAA,CAAc,MAAM,QAAS,EAAA,OAAA,EAAS,OAAQ,EAAA,WAAA,EAAa,CAAA;AAAA;AACxF,SAEC,MAAA;AACD,UAAA,IAAI,aAAgB,GAAA,eAAA;AACpB,UAAW,UAAA,CAAA,aAAA,CAAc,KAAO,EAAA,aAAA,CAAc,IAAI,CAAA;AAClD,UAAA,QAAO,cAAc,KAAO;AAAA,YACxB,KAAK,sBAAuB,CAAA,IAAA;AACxB,cAAS,QAAA,CAAA,IAAA,CAAK,EAAE,OAAS,EAAA,aAAA,CAAc,MAAM,QAAS,EAAA,MAAA,EAAQ,OAAQ,EAAA,WAAA,EAAa,CAAA;AACnF,cAAA;AAAA,YACJ,KAAK,sBAAuB,CAAA,OAAA;AACxB,cAAS,QAAA,CAAA,IAAA,CAAK,EAAE,OAAS,EAAA,aAAA,CAAc,MAAM,QAAS,EAAA,SAAA,EAAW,OAAQ,EAAA,WAAA,EAAa,CAAA;AACtF,cAAA;AAAA,YACJ,KAAK,sBAAuB,CAAA,KAAA;AACxB,cAAS,QAAA,CAAA,IAAA,CAAK,EAAE,OAAS,EAAA,aAAA,CAAc,MAAM,QAAS,EAAA,OAAA,EAAS,OAAQ,EAAA,WAAA,EAAa,CAAA;AACpF,cAAA;AAAA,YACJ;AACI,cAAS,QAAA,CAAA,IAAA,CAAK,EAAE,OAAS,EAAA,aAAA,CAAc,MAAM,QAAS,EAAA,SAAA,EAAW,OAAQ,EAAA,WAAA,EAAa,CAAA;AACtF,cAAA;AAAA;AACR;AAEJ,QAAA;AAAA,MACJ;AACI,QAAA,UAAA,CAAW,sBAAuB,CAAA,KAAA,EAAO,iCAAoC,GAAA,eAAA,CAAgB,IAAI,CAAA;AACjG,QAAS,QAAA,CAAA,IAAA,CAAK,EAAE,OAAA,EAAS,iCAAoC,GAAA,eAAA,CAAgB,MAAM,QAAS,EAAA,OAAA,EAAS,OAAQ,EAAA,WAAA,EAAa,CAAA;AAC1H,QAAA;AAAA;AACR,GACJ;AAEA,EAAM,MAAA,UAAA,GAAa,CAAC,KAAA,EAA8B,IAAgB,KAAA;AAC9D,IAAA,iBAAA,CAAmB,CAAC,IAAA,KAAS,CAAC,GAAG,IAAM,EAAA;AAAA,MACnC,KAAA;AAAA,MACA,IAAA;AAAA,MACA,MAAM,uBAAwB,CAAA;AAAA,KACjC,CAAC,CAAA;AAAA,GACN;AAEA,EAAM,MAAA,kBAAA,GAAqB,CAAC,OAAgB,KAAA;AACxC,IAAI,IAAA,eAAA;AACJ,IAAI,IAAA;AACA,MAAkB,eAAA,GAAA,IAAA,CAAK,KAAM,CAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,aAEtC,GAAK,EAAA;AACR,MAAA,OAAA,CAAQ,IAAI,GAAG,CAAA;AACf,MAAQ,OAAA,CAAA,GAAA,CAAI,QAAQ,IAAI,CAAA;AACxB,MAAA;AAAA;AAGJ,IAAA,QAAO,gBAAgB,OAAS;AAAA,MAC5B,KAAK,0BAA2B,CAAA,GAAA;AAC5B,QAAA,iBAAA,CAAkB,OAAO,CAAA;AACzB,QAAA;AAAA,MACJ,KAAK,0BAA2B,CAAA,GAAA;AAC5B,QAAA,IAAI,UAAa,GAAA,eAAA;AACjB,QAAA,IAAI,WAAW,IAAM,EAAA,IAAA;AACjB,UAAA,UAAA,CAAY,sBAAuB,CAAA,OAAA,EAAS,sBAAuB,GAAA,UAAA,CAAW,KAAK,IAAI,CAAA;AAAA;AAEvF,UAAA,UAAA,CAAY,uBAAuB,OAAS,EAAA,sBAAA,GAAuB,IAAK,CAAA,SAAA,CAAU,UAAU,CAAC,CAAA;AACjG,QAAA;AAAA,MACJ;AACI,QAAA,UAAA,CAAY,sBAAuB,CAAA,KAAA,EAAO,8BAA+B,GAAA,eAAA,CAAgB,OAAO,CAAA;AAChG,QAAA,UAAA,CAAY,uBAAuB,KAAO,EAAA,mBAAA,GAAoB,IAAK,CAAA,SAAA,CAAU,eAAe,CAAC,CAAA;AAC7F,QAAA;AAAA;AACR,GACJ;AAEA,EAAM,MAAA,eAAA,GAAkB,CAAC,EAAA,EAAc,OAAgB,KAAA;AACnD,IAAA,IAAI,UAAQ,SAAU,CAAA,IAAA,CAAK,CAAAA,QAAWA,KAAAA,QAAAA,CAAQ,SAAS,mBAAmB,CAAA;AAC1E,IAAA,IAAI,CAAC,OAAS,EAAA;AACV,MAAW,UAAA,CAAA,sBAAA,CAAuB,OAAM,qBAAqB,CAAA;AAC7D,MAAA;AAAA;AAEJ,IAAI,IAAA,IAAA,GAAO,OAAQ,CAAA,IAAA,CAAK,MAAO,CAAA,CAAAC,OAAK,kBAAmB,CAAA,QAAA,CAASA,EAAE,CAAA,SAAS,CAAC,CAAA;AAC5E,IAAA,IAAI,CAAC,IAAM,EAAA;AACP,MAAW,UAAA,CAAA,sBAAA,CAAuB,OAAM,eAAe,CAAA;AACvD,MAAA;AAAA;AAEJ,IAAA,OAAA,CAAQ,IAAI,CAAc,YAAA,CAAA,CAAA;AAC1B,IAAA,IAAI,SAAY,GAAA,OAAA,CAAQ,UAAW,CAAA,GAAA,CAAI,wBAAwB,IAAI,CAAA;AACnE,IAAA,IAAI,SAAW,EAAA;AACX,MAAA,IAAI,aAAsB,EAAC;AAC3B,MAAI,IAAA,sBAAA,CAAuB,SAAO,CAAG,EAAA;AACjC,QAAA,KAAA,IAAQ,KAAK,gBAAkB,EAAA;AAC3B,UAAA,KAAA,IAAS,KAAK,sBAAwB,EAAA;AAClC,YAAW,UAAA,CAAA,IAAA,CAAK,CAAE,GAAA,GAAA,GAAI,CAAC,CAAA;AAAA;AAC3B;AACJ;AAEJ,MAAA,IAAI,OAAyB,GAAA;AAAA,QACzB,SAAS,0BAA2B,CAAA,GAAA;AAAA,QACpC,SAAS,wBAAyB,CAAA,IAAA;AAAA,QAClC,QAAQ,yBAA0B,CAAA,KAAA;AAAA,QAClC,MAAM,uBAAwB,CAAA,OAAA;AAAA,QAC9B,QAAU,EAAA,EAAA;AAAA,QACV,SAAA,EAAW,mBAAmB,SAAS,CAAA;AAAA,QACvC,OAAO,uBAAwB,CAAA,IAAA;AAAA,QAC/B,MAAO,sBAAuB,CAAA,MAAA,GAAS,CAAI,GAAA,sBAAA,CAAuB,YAAY,sBAAuB,CAAA,GAAA;AAAA,QACrG,SAAA,EAAW,kBAAmB,CAAA,IAAA,CAAK,GAAG,CAAA;AAAA,QACtC,KAAO,EAAA,EAAA;AAAA,QACP,GAAA,EAAK,iBAAiB,GAAI,CAAA,CAAAA,OAAKA,EAAC,CAAA,CAAE,KAAK,GAAG,CAAA;AAAA,QAC1C,SAAA,EAAW,UAAW,CAAA,IAAA,CAAK,GAAG,CAAA;AAAA,QAC9B,IAAM,EAAA;AAAA,UACF,WAAW,OAAQ,CAAA,SAAA;AAAA,UACnB,QAAU,EAAA,KAAA;AAAA,UACV,WAAa,EAAA,gBAAA;AAAA,UACb,WAAW,OAAQ,CAAA;AAAA,SACvB;AAAA,QACA,MAAM,uBAAwB,CAAA;AAAA,OAClC;AACA,MAAA,EAAA,CAAG,IAAK,CAAA,IAAA,CAAK,SAAU,CAAA,OAAO,CAAC,CAAA;AAAA,KAE9B,MAAA;AACD,MAAW,UAAA,CAAA,sBAAA,CAAuB,OAAM,yCAAyC,CAAA;AACjF,MAAA;AAAA;AACJ,GACJ;AAEA,EAAM,MAAA,cAAA,GAAiB,CAAC,OAAgB,KAAA;AACpC,IAAA,IAAI,UAAQ,SAAU,CAAA,IAAA,CAAK,CAAAD,QAAWA,KAAAA,QAAAA,CAAQ,SAAO,mBAAmB,CAAA;AACxE,IAAA,IAAI,CAAC,OAAS,EAAA;AACV,MAAW,UAAA,CAAA,sBAAA,CAAuB,OAAM,qBAAqB,CAAA;AAC7D,MAAA;AAAA;AAGJ,IAAA,WAAA,CAAY,EAAE,CAAA;AACd,IAAI,IAAA;AACA,MAAA,IAAI,EAAK,GAAA,IAAI,SAAU,CAAA,OAAA,CAAQ,GAAG,CAAA;AAClC,MAAA,EAAA,CAAG,MAAS,GAAA,MAAM,eAAgB,CAAA,EAAA,EAAI,OAAO,CAAA;AAC7C,MAAA,EAAA,CAAG,SAAY,GAAA,CAAC,KAAU,KAAA,kBAAA,CAAmB,KAAK,CAAA;AAClD,MAAA,EAAA,CAAG,OAAU,GAAA,CAAC,KAAU,KAAA,gBAAA,CAAiB,KAAK,CAAA;AAC9C,MAAA,YAAA,CAAa,EAAE,CAAA;AAAA,aAEZ,GAAK,EAAA;AACR,MAAA,WAAA,CAAY,CAAE;AAAA,QACV,MAAM,uBAAwB,CAAA,IAAA;AAAA,QAC9B,IAAA,EAAM,6BAA6B,GAAG,CAAA,CAAA;AAAA,QACtC,SAAW,EAAA,EAAA;AAAA,QACX,GAAK,EAAA,EAAA;AAAA,QACL,SAAW,EAAA;AAAA,OACb,CAAC,CAAA;AAAA;AACP,GAEJ;AAEA,EAAM,MAAA,gBAAA,GAAmB,CAAC,MAAe,KAAA;AACvC,IAAA,OAAA,CAAQ,IAAI,CAAiB,eAAA,CAAA,CAAA;AAC7B,IAAA,UAAA,CAAW,KAAK,CAAA;AAChB,IAAA,MAAA,CAAO,OAAQ,GAAA,KAAA;AACf,IAAA,UAAA,CAAW,IAAI,CAAA;AAAA,GACjB;AAEA,EAAA,MAAM,gBAAgB,MAAM;AACxB,IAAA,QAAA,CAAS,IAAK,CAAA;AAAA,MACV,MAAM,uBAAwB,CAAA,IAAA;AAAA,MAC9B,IAAM,EAAA,8HAAA;AAAA,MACN,SAAW,EAAA,EAAA;AAAA,MACX,GAAK,EAAA,EAAA;AAAA,MACL,SAAW,EAAA;AAAA,KACd,CAAA;AACD,IAAA,SAAA,EAAW,KAAM,EAAA;AAAA,GACrB;AAEA,EAAM,MAAA,iBAAA,GAAoB,CAAC,OAAgB,KAAA;AACvC,IAAA,mBAAA,CAAoB,OAAQ,GAAA,OAAA;AAC5B,IAAA,IAAI,OAAS,EAAA;AACT,MAAA,UAAA,CAAW,OAAO,CAAA;AAAA;AACtB,GACJ;AAEA,EAAA,MAAM,kBAAkB,MAAM;AAC5B,IAAI,IAAA,OAAA,GAAU,MAAO,CAAA,OAAA,CAAS,SAAU,CAAA,UAAA,CAAW,SAAQ,EAAE,CAAA,CAAE,UAAW,CAAA,QAAA,EAAS,IAAI,CAAA;AACvF,IAAU,OAAA,GAAA,OAAA,CAAQ,UAAW,CAAA,8BAAA,EAA+B,EAAE,CAAA;AAC9D,IAAU,OAAA,GAAA,OAAA,CAAQ,UAAW,CAAA,6BAAA,EAA8B,EAAE,CAAA;AAC7D,IAAU,OAAA,GAAA,OAAA,CAAQ,UAAW,CAAA,SAAA,EAAU,EAAE,CAAA;AACzC,IAAA,IAAI,WAAW,mBAAoB,GAAA,GAAA,GAAI,qBAAmB,GAAI,GAAA,MAAA,CAAO,SAAS,IAAK,GAAA,MAAA;AACnF,IAAA,IAAI,QAAkB,GAAA,YAAA;AAEtB,IAAM,MAAA,IAAA,GAAO,IAAI,IAAK,CAAA,CAAC,OAAO,CAAG,EAAA,EAAE,IAAM,EAAA,QAAA,EAAU,CAAA;AACnD,IAAM,MAAA,GAAA,GAAM,GAAI,CAAA,eAAA,CAAgB,IAAI,CAAA;AACpC,IAAM,MAAA,IAAA,GAAO,QAAS,CAAA,aAAA,CAAc,GAAG,CAAA;AACvC,IAAA,IAAA,CAAK,IAAO,GAAA,GAAA;AACZ,IAAA,IAAA,CAAK,QAAW,GAAA,QAAA;AAChB,IAAS,QAAA,CAAA,IAAA,CAAK,YAAY,IAAI,CAAA;AAC9B,IAAA,IAAA,CAAK,KAAM,EAAA;AACX,IAAS,QAAA,CAAA,IAAA,CAAK,YAAY,IAAI,CAAA;AAC9B,IAAA,GAAA,CAAI,gBAAgB,GAAG,CAAA;AAAA,GACzB;AAEA,EAAA,MAAM,iBAAiB,MAAM;AAEzB,IAAA,IAAI,UAAQ,SAAU,CAAA,IAAA,CAAK,CAAAA,QAAWA,KAAAA,QAAAA,CAAQ,SAAO,mBAAmB,CAAA;AACxE,IAAA,IAAI,CAAC,OAAS,EAAA;AACV,MAAW,UAAA,CAAA,sBAAA,CAAuB,OAAM,qBAAqB,CAAA;AAC7D,MAAA;AAAA;AAEJ,IAAA,IAAI,UAAa,GAAA,OAAA,CAAQ,UAAW,CAAA,GAAA,CAAI,wBAAwB,OAAO,CAAA;AACvE,IAAA,IAAI,CAAC,UAAY,EAAA;AACb,MAAW,UAAA,CAAA,sBAAA,CAAuB,OAAM,uBAAuB,CAAA;AAC/D,MAAA;AAAA;AAEJ,IAAA,IAAI,CAAC,QAAU,EAAA;AACX,MAAW,UAAA,CAAA,sBAAA,CAAuB,OAAM,kCAAkC,CAAA;AAC1E,MAAA;AAAA;AAGJ,IAAI,IAAA,IAAA,GAAkB,QAAQ,IAAmB,CAAA,MAAA,CAAO,SAAO,kBAAmB,CAAA,QAAA,CAAS,GAAI,CAAA,SAAS,CAAC,CAAA;AACzG,IAAA,KAAA,IAAS,OAAO,IAAM,EAAA;AAClB,MAAA,IAAI,UAAyB,GAAA;AAAA,QACzB,OAAS,EAAA,YAAA;AAAA,QACT,QAAQ,yBAA0B,CAAA,OAAA;AAAA,QAClC,MAAM,uBAAwB,CAAA,SAAA;AAAA,QAC9B,MAAM,uBAAwB,CAAA,IAAA;AAAA,QAC9B,SAAS,0BAA2B,CAAA,GAAA;AAAA,QACpC,QAAU,EAAA,EAAA;AAAA,QACV,EAAI,EAAA,GAAA;AAAA,QACJ,SAAA,EAAW,mBAAmB,UAAU,CAAA;AAAA,QACxC,SAAS,cAAe,CAAA,UAAA;AAAA,QACxB,WAAW,GAAI,CAAA,SAAA;AAAA,QACf,KAAO,EAAA,EAAA;AAAA,QACP,KAAK,GAAI,CAAA,IAAA;AAAA,QACT,SAAW,EAAA;AAAA,OACf;AACA,MAAA,IAAI,YAA8B,GAAA;AAAA,QAC9B,OAAS,EAAA,cAAA;AAAA,QACT,SAAA,EAAW,mBAAmB,UAAU,CAAA;AAAA,QACxC,aAAa,0BAA2B,CAAA,GAAA;AAAA,QACxC,QAAQ,yBAA0B,CAAA,KAAA;AAAA,QAClC,MAAM,uBAAwB,CAAA,SAAA;AAAA,QAC9B,MAAM,uBAAwB,CAAA,MAAA;AAAA,QAC9B,SAAS,0BAA2B,CAAA,GAAA;AAAA,QACpC,QAAA;AAAA,QACA,IAAM,EAAA;AAAA,OACV;AACA,MAAA,SAAA,EAAW,IAAK,CAAA,IAAA,CAAK,SAAU,CAAA,YAAY,CAAC,CAAA;AAAA;AAChD,GACJ;AAEA,EAAA,MAAM,gBAAgB,MAAM;AACxB,IAAI,IAAA,UAAA,GAAW,OAAO,aAAgB,GAAA,KAAA;AACtC,IAAA,IAAI,UAAQ,SAAU,CAAA,IAAA,CAAK,CAAAA,QAAWA,KAAAA,QAAAA,CAAQ,SAAO,mBAAmB,CAAA;AACxE,IAAA,IAAI,OAAS,EAAA;AACT,MAAA,UAAA,GAAa,QAAQ,OAAQ,CAAA,UAAA,CAAW,GAAI,CAAA,uBAAA,CAAwB,IAAI,CAAC,CAAA;AACzE,MAAA,aAAA,GAAgB,QAAQ,OAAQ,CAAA,UAAA,CAAW,GAAI,CAAA,uBAAA,CAAwB,OAAO,CAAC,CAAA;AAAA;AAGnF,IAAO,uBAAA,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,EACD,MAAM,aACJ,oBAAA,KAAA,CAAA,aAAA,CAAC,cAAW,KAAM,EAAA,SAAA,EAAU,SAAS,cAAgB,EAAA,QAAA,EAAU,iBAAiB,MAAW,KAAA,CAAA,IAAK,CAAC,aAAiB,IAAA,CAAC,aAAa,CAAC,OAAA,EAAA,sCAC5H,WAAY,EAAA,IAAA,CACjB,mBAEH,KAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,OAAM,UAAW,EAAA,OAAA,EAAS,iBAAiB,QAAU,EAAA,QAAA,CAAS,UAAQ,CAC9E,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,kBAAa,CAClB,CAAA,sCACC,UAAW,EAAA,EAAA,OAAA,EAAS,MAAM,UAAW,CAAA,mBAAA,CAAoB,OAAO,CAAG,EAAA,KAAA,EAAM,QAAO,QAAU,EAAA,OAAA,IAAW,CAAC,MAAU,IAAA,gBAAA,CAAiB,WAAW,CAAK,IAAA,CAAC,8BAC9I,KAAA,CAAA,aAAA,CAAA,QAAA,EAAA,IAAS,CACd,CACA,kBAAA,KAAA,CAAA,aAAA,CAAC,cAAW,OAAS,EAAA,YAAA,EAAc,OAAM,OAAQ,EAAA,QAAA,EAAU,EAAG,OAAW,IAAA,CAAC,OAAO,OAAY,IAAA,gBAAA,CAAiB,SAAS,CACnH,CAAA,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,eAAU,CACf,CAAA,sCACC,UAAW,EAAA,EAAA,OAAA,EAAS,aAAa,KAAM,EAAA,MAAA,EAAO,UAAU,OAAW,IAAA,gBAAA,CAAiB,WAAW,CAC5F,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,QAAS,EAAA,IAAA,CACd,CACJ,CAAA;AAAA,GACJ;AAEA,EAAM,MAAA,aAAA,GAAgB,CAAC,KAAiB,KAAA;AACpC,IAAM,MAAA,IAAA,GAAO,CAAC,KAAiC,KAAA;AAC3C,MAAA,mBAAA,CAAoB,IAAI,CAAA;AACxB,MAAA,cAAA,CAAe,KAAK,CAAA;AAAA,KACxB;AAEA,IAAA,2CACK,IAAK,EAAA,EAAA,SAAA,EAAS,MAAC,SAAU,EAAA,KAAA,EAAA,sCACrB,IAAK,EAAA,EAAA,IAAA,EAAI,IACN,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,cAAW,OAAQ,EAAA,IAAA,EAAA,EAAM,KAAM,CACpC,CAAA,sCACC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,KAAA,EAAO,EAAC,SAAU,EAAA,MAAA,sBACxB,KAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,OAAM,MAAO,EAAA,QAAA,EAAU,CAAC,cAAA,CAAe,KAAK,CAAG,CAAA,KAAA,CAAA,CAAE,SAAS,uBAAwB,CAAA,MAAA,IAAU,EAAE,KAAS,KAAA,sBAAA,CAAuB,IAAI,CAAA,EAAG,SAAS,MAAM,IAAA,CAAK,uBAAuB,IAAI,CAAA,EAAA,sCAC3L,QAAS,EAAA,EAAA,KAAA,EAAO,EAAE,KAAA,EAAM,eAAe,IAAK,CAAA,CAAA,CAAA,KAAG,EAAE,IAAS,KAAA,uBAAA,CAAwB,UAAU,CAAE,CAAA,KAAA,KAAS,sBAAuB,CAAA,IAAI,IAAE,MAAO,GAAA,SAAA,IAAW,CAC3J,CAAA,sCACC,UAAW,EAAA,EAAA,KAAA,EAAM,WAAU,QAAU,EAAA,CAAC,eAAe,IAAK,CAAA,CAAA,CAAA,KAAG,EAAE,IAAS,KAAA,uBAAA,CAAwB,UAAU,CAAE,CAAA,KAAA,KAAS,sBAAuB,CAAA,OAAO,GAAG,OAAS,EAAA,MAAM,KAAK,sBAAuB,CAAA,OAAO,GAAG,KAAO,EAAA,EAAC,UAAW,EAAA,OAAA,sBAC1N,KAAA,CAAA,aAAA,CAAA,WAAA,EAAA,EAAY,OAAO,EAAE,KAAA,EAAM,eAAe,IAAK,CAAA,CAAA,CAAA,KAAG,CAAE,CAAA,IAAA,KAAS,wBAAwB,MAAU,IAAA,CAAA,CAAE,UAAS,sBAAuB,CAAA,OAAO,IAAE,QAAS,GAAA,SAAA,EAAW,EAAA,CACnK,mBACC,KAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,OAAM,OAAQ,EAAA,QAAA,EAAU,CAAC,cAAe,CAAA,IAAA,CAAK,CAAG,CAAA,KAAA,CAAA,CAAE,SAAS,uBAAwB,CAAA,MAAA,IAAU,EAAE,KAAS,KAAA,sBAAA,CAAuB,KAAK,CAAG,EAAA,OAAA,EAAS,MAAM,IAAA,CAAK,uBAAuB,KAAK,CAAA,EAAG,OAAO,EAAC,UAAA,EAAW,SACrN,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,SAAU,EAAA,EAAA,KAAA,EAAO,EAAE,KAAM,EAAA,cAAA,CAAe,KAAK,CAAG,CAAA,KAAA,CAAA,CAAE,SAAS,uBAAwB,CAAA,MAAA,IAAU,EAAE,KAAS,KAAA,sBAAA,CAAuB,KAAK,CAAE,GAAA,KAAA,GAAM,WAAW,EAAA,CAC5J,CACJ,CACJ,CAAA;AAAA,GAER;AAEA,EAAM,MAAA,WAAA,GAAc,CAAC,KAAkC,KAAA;AACnD,IAAA,iBAAA,CAAkB,eAAe,MAAO,CAAA,CAAA,CAAA,KAAI,CAAE,CAAA,KAAA,KAAQ,KAAK,CAAC,CAAA;AAC5D,IAAA,mBAAA,CAAoB,KAAK,CAAA;AAAA,GAC7B;AAEA,EAAA,MAAM,cAAiB,GAAA,CAAC,UAAqB,EAAA,QAAA,EAAmB,cAA4B,KAAA;AACxF,IAAA,qBAAA,CAAsB,UAAU,CAAA;AAChC,IAAA,mBAAA,CAAoB,QAAQ,CAAA;AAC5B,IAAA,yBAAA,CAA0B,cAAc,CAAA;AAAA,GAC5C;AAEA,EAAM,MAAA,aAAA,GAAgB,CAAC,OAAqB,KAAA;AACxC,IAAI,IAAA,CAAC,QAAQ,GAAK,EAAA;AACd,MAAO,uBAAA,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,EAAG,OAAQ,CAAA,IAAA,GAAK,IAAK,CAAA;AAAA;AAGhC,IAAA,IAAI,4BAAc,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,CAAA;AAClB,IAAI,IAAA,gBAAA,CAAiB,WAAW,CAAG,EAAA;AAC/B,MAAa,SAAA,mBAAA,KAAA,CAAA,aAAA,CAAC,UAAK,KAAO,EAAA,EAAC,OAAM,OAAO,EAAA,EAAA,EAAI,OAAQ,CAAA,GAAA,GAAI,GAAI,CAAA;AAAA;AAGhE,IAAA,IAAI,kCAAoB,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,CAAA;AACxB,IAAI,IAAA,sBAAA,CAAuB,WAAW,CAAE,EAAA;AACpC,MAAkB,eAAA,mBAAA,KAAA,CAAA,aAAA,CAAC,UAAK,KAAO,EAAA,EAAC,OAAM,MAAM,EAAA,EAAA,EAAI,OAAQ,CAAA,SAAA,GAAU,GAAI,CAAA;AAAA;AAE1E,IAAA,uBAAU,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,EAAA,SAAA,EAAW,eAAiB,EAAA,OAAA,CAAQ,OAAK,IAAK,CAAA;AAAA,GAC5D;AAEA,EAAQ,uBAAA,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,EAEF,2BAAY,KAAA,CAAA,aAAA,CAAA,QAAA,EAAA,IAAQ,GAErB,CAAC,iBAAA,CAAkB,MAAM,CAAA,IAAK,CAAC,OAAA,IAAW,yBACtC,KAAA,CAAA,aAAA,CAAA,YAAA,EAAA,EAAa,KAAO,EAAA,sEAAA,EAAwE,OAAS,EAAA,KAAA,EAAO,SAAS,CAGzH,EAAA,CAAC,iBAAkB,CAAA,MAAM,CAAK,IAAA,CAAC,2BAC3B,KAAA,CAAA,aAAA,CAAA,2BAAA,EAAA,EAA4B,aAAY,8CAA+C,EAAA,UAAA,EAAY,CAAC,uCAAyC,EAAA,6CAA6C,CAAE,EAAA,CAAA,EAG/L,iBAAkB,CAAA,MAAM,KAAK,CAAC,OAAA,IAAW,SAAa,IAAA,SAAA,CAAU,MAAS,KAAA,CAAA,wCACtE,iBAAkB,EAAA,EAAA,KAAA,EAAO,SAAU,CAAA,WAAA,EAAa,MAAe,EAAA,CAAA,EAGlE,kBAAkB,MAAM,CAAA,IAAK,CAAC,OAAW,IAAA,SAAA,IAAa,UAAU,MAAO,GAAA,CAAA,IAAK,SAAU,CAAA,MAAA,CAAO,CAAC,GAAA,EAAI,YAAY,GAAI,GAAA,OAAA,CAAQ,IAAK,CAAA,MAAA,EAAQ,CAAC,CAAA,KAAI,qBACzI,KAAA,CAAA,aAAA,CAAA,iBAAA,EAAA,EAAkB,KAAO,EAAA,SAAA,CAAU,OAAS,EAAA,MAAA,EAAe,GAG9D,iBAAkB,CAAA,MAAM,KAAK,CAAC,OAAA,IAAW,aAAa,SAAU,CAAA,MAAA,GAAO,CAAK,IAAA,SAAA,CAAU,MAAO,CAAA,CAAC,KAAI,OAAY,KAAA,GAAA,GAAI,OAAQ,CAAA,IAAA,CAAK,MAAQ,EAAA,CAAC,IAAE,CACxI,oBAAA,KAAA,CAAA,aAAA,CAAC,GAAI,EAAA,EAAA,EAAA,EAAI,EAAE,OAAA,EAAS,QAAQ,MAAO,EAAA,MAAA,sBAC9B,KAAA,CAAA,aAAA,CAAA,GAAA,EAAA,EAAI,IAAI,EAAE,KAAA,EAAO,OAAO,EAAA,EAAA,kBACpB,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,WAAS,IAAC,EAAA,SAAA,EAAU,QACtB,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,wBACL,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA,kBACI,KAAA,CAAA,aAAA,CAAA,WAAA,EAAA,EAAY,SAAsB,EAAA,mBAAA,EAA0C,UAAU,eAAgB,EAAA,CAC3G,CACJ,CACA,kBAAA,KAAA,CAAA,aAAA,CAAC,QAAK,IAAI,EAAA,IAAA,EAAA,kBACL,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA,kBACI,KAAA,CAAA,aAAA,CAAA,OAAA,EAAA,EAAQ,SAAS,mBAAoB,CAAA,OAAA,EAAS,QAAU,EAAA,iBAAA,EAAmB,QAAU,EAAA,sBAAA,CAAuB,WAAW,CAAK,IAAA,OAAA,IAAW,MAAO,CAAA,OAAA,EAAQ,CAC3J,CACJ,CACJ,CACJ,CAAA,sCAEC,GAAI,EAAA,EAAA,EAAA,EAAI,EAAE,QAAU,EAAA,CAAA,EAAG,IAAK,EAAA,CAAA,EAAG,QAAS,EAAA,QAAA,EAAU,GAAE,CAAG,EAAA,QAAA,EAAS,KAAM,EAAA,EAAA,EAEjE,CAAC,mBAAA,wCACE,KAAI,EAAA,EAAA,GAAA,EAAK,aAAe,EAAA,GAAA,EAAI,qBAAsB,EAAA,KAAA,EAAO,EAAE,IAAK,EAAA,KAAA,EAAO,WAAU,KAAO,EAAA,KAAA,EAAM,OAAO,QAAS,EAAA,UAAA,EAAc,EAAA,CAAA,EAG/H,mBAAuB,oBAAA,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,sCACpB,IAAK,EAAA,EAAA,KAAA,EAAO,EAAE,SAAA,EAAU,EAAI,EAAA,MAAA,EAAO,QAAQ,OAAQ,EAAA,MAAA,EAAQ,aAAc,EAAA,QAAA,EACtE,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACG,KAAA,EAAO,cAAc,mBAAmB,CAAA;AAAA,MACxC,OAAO,EAAC,SAAA,EAAU,IAAI,YAAa,EAAA,CAAA,EAAG,YAAW,CAAC,EAAA;AAAA,MAClD,QAAQ,aAAc;AAAA;AAAA,GAC1B,sCAEC,UAAW,EAAA,EAAA,KAAA,EAAO,EAAC,UAAW,EAAA,EAAA,EAAI,cAAa,CAAC,EAAA,EAAA,sCAC5C,cAAe,EAAA,EAAA,OAAA,EAAS,UAAU,IAAK,CAAA,CAAA,OAAA,KAAW,QAAQ,IAAS,KAAA,mBAAmB,CAAI,EAAA,QAAA,EAAU,cAAgB,EAAA,QAAA,EAAU,wBAAwB,EAAM,IAAA,OAAA,IAAW,OAAO,OAAS,EAAA,kBAAA,EAAwC,kBAAoC,sBAA+C,EAAA,CACvT,CACA,kBAAA,KAAA,CAAA,aAAA,CAAC,OAAO,EAAA,IAAA,CAAA,sCAGP,WAAY,EAAA,EAAA,KAAA,EAAO,EAAE,QAAU,EAAA,CAAA,EAAG,UAAU,QAAU,EAAA,OAAA,EAAS,MAAQ,EAAA,aAAA,EAAe,QAAS,EAAA,EAAA,sCAC3F,GAAI,EAAA,EAAA,KAAA,EAAO,EAAE,SAAW,EAAA,MAAA,EAAQ,WAAW,MAAQ,EAAA,KAAA,EAAO,QAAQ,QAAU,EAAA,CAAA,sBAExE,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAI,KAAK,MACJ,EAAA,EAAA,QAAA,CAAS,IAAK,CAAK,CAAA,KAAA,aAAA,CAAc,CAAC,CAAC,CACzC,CAAA,sCACC,MAAK,EAAA,EAAA,GAAA,EAAK,SAAQ,CACvB,CAOJ,CACJ,CACJ,CACJ,CACJ,CAAA,EAEF,gBAAoB,oBAAA,KAAA,CAAA,aAAA,CAAC,aAAU,KAAO,EAAA,WAAA,EAAa,SAAS,MAAM,mBAAA,CAAoB,KAAK,CAAG,EAAA,cAAA,EAAgC,OAAS,EAAA,WAAA,EAAY,CACzJ,CAAA;AACJ;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jfvilas/plugin-kwirth-log",
3
- "version": "0.12.6",
3
+ "version": "0.12.7",
4
4
  "description": "Frontend plugin for viewing real-time Kubernetes logs in Backstage",
5
5
  "keywords": [
6
6
  "Backstage",